{
  "version": 3,
  "sources": ["../../../node_modules/jquery/dist/jquery.js", "../../../node_modules/@rails/actioncable/src/adapters.js", "../../../node_modules/@rails/actioncable/src/logger.js", "../../../node_modules/@rails/actioncable/src/connection_monitor.js", "../../../node_modules/@rails/actioncable/src/internal.js", "../../../node_modules/@rails/actioncable/src/connection.js", "../../../node_modules/@rails/actioncable/src/subscription.js", "../../../node_modules/@rails/actioncable/src/subscription_guarantor.js", "../../../node_modules/@rails/actioncable/src/subscriptions.js", "../../../node_modules/@rails/actioncable/src/consumer.js", "../../../node_modules/@rails/actioncable/src/index.js", "../../../node_modules/howler/dist/howler.js", "../../../node_modules/toggle-selection/index.js", "../../../node_modules/copy-to-clipboard/index.js", "../../../node_modules/toastr/toastr.js", "../../../node_modules/fast-deep-equal/index.js", "../../../node_modules/base64-js/index.js", "../../../node_modules/tiny-inflate/index.js", "../../../node_modules/unicode-trie/swap.js", "../../../node_modules/unicode-trie/index.js", "../../../node_modules/dfa/src/StateMachine.js", "../../../node_modules/clone/clone.js", "../../../node_modules/brotli/dec/streams.js", "../../../node_modules/brotli/dec/bit_reader.js", "../../../node_modules/brotli/dec/dictionary.bin.js", "../../../node_modules/brotli/dec/dictionary-browser.js", "../../../node_modules/brotli/dec/dictionary.js", "../../../node_modules/brotli/dec/huffman.js", "../../../node_modules/brotli/dec/context.js", "../../../node_modules/brotli/dec/prefix.js", "../../../node_modules/brotli/dec/transform.js", "../../../node_modules/brotli/dec/decode.js", "../../../node_modules/brotli/decompress.js", "../../../node_modules/ieee754/index.js", "../../../node_modules/buffer/index.js", "../../../node_modules/select2/dist/js/select2.js", "../../../node_modules/dom-to-image-more/src/dom-to-image-more.js", "../../javascript/libs/jquery.js", "../../../node_modules/@hotwired/turbo/dist/turbo.es2017-esm.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/snakeize.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable_stream_source_element.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/fetch_requests.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/index.js", "../../../node_modules/trix/src/trix/config/attachments.js", "../../../node_modules/trix/src/trix/config/block_attributes.js", "../../../node_modules/trix/src/trix/config/browser.js", "../../../node_modules/trix/src/trix/config/dompurify.js", "../../../node_modules/trix/src/trix/config/lang.js", "../../../node_modules/trix/src/trix/config/file_size_formatting.js", "../../../node_modules/trix/src/trix/constants.js", "../../../node_modules/trix/src/trix/core/helpers/extend.js", "../../../node_modules/trix/src/trix/core/helpers/dom.js", "../../../node_modules/trix/src/trix/config/input.js", "../../../node_modules/trix/src/trix/config/key_names.js", "../../../node_modules/trix/src/trix/config/parser.js", "../../../node_modules/trix/src/trix/config/text_attributes.js", "../../../node_modules/trix/src/trix/config/toolbar.js", "../../../node_modules/trix/src/trix/config/undo.js", "../../../node_modules/trix/src/trix/config/css.js", "../../../node_modules/trix/src/trix/core/basic_object.js", "../../../node_modules/trix/src/trix/core/utilities/utf16_string.js", "../../../node_modules/trix/src/trix/core/object.js", "../../../node_modules/trix/src/trix/core/helpers/arrays.js", "../../../node_modules/trix/src/trix/core/helpers/bidi.js", "../../../node_modules/trix/src/trix/core/helpers/config.js", "../../../node_modules/trix/src/trix/core/helpers/custom_elements.js", "../../../node_modules/trix/src/trix/core/helpers/events.js", "../../../node_modules/trix/src/trix/core/helpers/functions.js", "../../../node_modules/trix/src/trix/core/helpers/objects.js", "../../../node_modules/trix/src/trix/core/helpers/ranges.js", "../../../node_modules/trix/src/trix/observers/selection_change_observer.js", "../../../node_modules/trix/src/trix/core/helpers/strings.js", "../../../node_modules/trix/src/trix/core/collections/hash.js", "../../../node_modules/trix/src/trix/core/collections/object_group.js", "../../../node_modules/trix/src/trix/core/collections/object_map.js", "../../../node_modules/trix/src/trix/core/collections/element_store.js", "../../../node_modules/trix/src/trix/core/utilities/operation.js", "../../../node_modules/trix/src/trix/views/object_view.js", "../../../node_modules/trix/node_modules/dompurify/dist/purify.es.mjs", "../../../node_modules/trix/src/trix/models/html_sanitizer.js", "../../../node_modules/trix/src/trix/views/attachment_view.js", "../../../node_modules/trix/src/trix/views/previewable_attachment_view.js", "../../../node_modules/trix/src/trix/views/piece_view.js", "../../../node_modules/trix/src/trix/views/text_view.js", "../../../node_modules/trix/src/trix/views/block_view.js", "../../../node_modules/trix/src/trix/views/document_view.js", "../../../node_modules/trix/src/trix/models/piece.js", "../../../node_modules/trix/src/trix/operations/image_preload_operation.js", "../../../node_modules/trix/src/trix/models/attachment.js", "../../../node_modules/trix/src/trix/models/attachment_piece.js", "../../../node_modules/trix/src/trix/models/string_piece.js", "../../../node_modules/trix/src/trix/models/splittable_list.js", "../../../node_modules/trix/src/trix/models/text.js", "../../../node_modules/trix/src/trix/models/block.js", "../../../node_modules/trix/src/trix/models/document.js", "../../../node_modules/trix/src/trix/models/html_parser.js", "../../../node_modules/trix/src/trix/core/serialization.js", "../../../node_modules/trix/src/trix/models/managed_attachment.js", "../../../node_modules/trix/src/trix/models/attachment_manager.js", "../../../node_modules/trix/src/trix/models/line_break_insertion.js", "../../../node_modules/trix/src/trix/models/composition.js", "../../../node_modules/trix/src/trix/models/undo_manager.js", "../../../node_modules/trix/src/trix/filters/filter.js", "../../../node_modules/trix/src/trix/filters/attachment_gallery_filter.js", "../../../node_modules/trix/src/trix/models/editor.js", "../../../node_modules/trix/src/trix/models/location_mapper.js", "../../../node_modules/trix/src/trix/models/point_mapper.js", "../../../node_modules/trix/src/trix/models/selection_manager.js", "../../../node_modules/trix/src/trix/controllers/attachment_editor_controller.js", "../../../node_modules/trix/src/trix/controllers/composition_controller.js", "../../../node_modules/trix/src/trix/controllers/controller.js", "../../../node_modules/trix/src/trix/observers/mutation_observer.js", "../../../node_modules/trix/src/trix/operations/file_verification_operation.js", "../../../node_modules/trix/src/trix/models/flaky_android_keyboard_detector.js", "../../../node_modules/trix/src/trix/controllers/input_controller.js", "../../../node_modules/trix/src/trix/controllers/level_0_input_controller.js", "../../../node_modules/trix/src/trix/controllers/level_2_input_controller.js", "../../../node_modules/trix/src/trix/controllers/toolbar_controller.js", "../../../node_modules/trix/src/trix/controllers/editor_controller.js", "../../../node_modules/trix/src/trix/elements/trix_toolbar_element.js", "../../../node_modules/trix/src/trix/elements/trix_editor_element.js", "../../../node_modules/trix/src/trix/trix.js", "../../../node_modules/@rails/actiontext/app/assets/javascripts/actiontext.esm.js", "../../../node_modules/@hotwired/stimulus/dist/stimulus.js", "../../javascript/controllers/application.js", "../../javascript/controllers/account_form_controller.js", "../../javascript/controllers/activities/activity_controller.js", "../../javascript/utils/script_loader.js", "../../javascript/controllers/activities/ayah_mastery_controller.js", "../../javascript/controllers/activities/fill_the_blanks_controller.js", "../../../node_modules/sortablejs/modular/sortable.esm.js", "../../javascript/controllers/activities/surah_order_controller.js", "../../javascript/controllers/activities/word_match_controller.js", "../../javascript/controllers/admin_page_controller.js", "../../javascript/controllers/ajax_modal_controller.js", "../../javascript/controllers/alert_controller.js", "../../javascript/controllers/align_player_controller.js", "../../javascript/controllers/arabic_keyboard_controller.js", "../../javascript/controllers/ayah_boundary_controller.js", "../../javascript/controllers/ayah_filter_controller.js", "../../javascript/controllers/ayah_jump_controller.js", "../../javascript/controllers/ayah_player_controller.js", "../../javascript/controllers/ayah_recitation_selector_controller.js", "../../javascript/lib/ayah_modal_store.js", "../../javascript/controllers/ayah_script_selector_controller.js", "../../javascript/controllers/ayah_segment_player_controller.js", "../../javascript/controllers/segment_player_controller.js", "../../javascript/utils/quran.js", "../../javascript/controllers/ayah_tafsir_selector_controller.js", "../../javascript/controllers/ayah_translation_selector_controller.js", "../../javascript/controllers/ayah_transliteration_selector_controller.js", "../../javascript/controllers/ayah_word_translation_selector_controller.js", "../../javascript/controllers/chapter_verses_filter_controller.js", "../../javascript/controllers/chars_info_controller.js", "../../javascript/controllers/clipboard_controller.js", "../../javascript/controllers/collapse_controller.js", "../../javascript/controllers/confirm_leave_controller.js", "../../javascript/controllers/copy_to_clipboard_controller.js", "../../javascript/controllers/datepicker_controller.js", "../../javascript/controllers/delivery_audio_compare_controller.js", "../../javascript/controllers/docs_code_controller.js", "../../javascript/controllers/docs_copy_controller.js", "../../javascript/controllers/draggable_scroll_controller.js", "../../javascript/controllers/dropdown_controller.js", "../../javascript/controllers/event_tracker_controller.js", "../../javascript/controllers/facet_list_controller.js", "../../javascript/controllers/faq_controller.js", "../../javascript/controllers/filter_ayah_controller.js", "../../javascript/controllers/fix_filter_controller.js", "../../javascript/controllers/flash_message_controller.js", "../../javascript/controllers/font_preview_controller.js", "../../../node_modules/restructure/src/DecodeStream.js", "../../../node_modules/restructure/src/EncodeStream.js", "../../../node_modules/restructure/src/Base.js", "../../../node_modules/restructure/src/Number.js", "../../../node_modules/restructure/src/utils.js", "../../../node_modules/restructure/src/Array.js", "../../../node_modules/restructure/src/LazyArray.js", "../../../node_modules/restructure/src/Bitfield.js", "../../../node_modules/restructure/src/Buffer.js", "../../../node_modules/restructure/src/Optional.js", "../../../node_modules/restructure/src/Reserved.js", "../../../node_modules/restructure/src/String.js", "../../../node_modules/restructure/src/Struct.js", "../../../node_modules/restructure/src/VersionedStruct.js", "../../../node_modules/restructure/src/Pointer.js", "../../../node_modules/@swc/helpers/esm/_define_property.js", "../../../node_modules/tslib/tslib.es6.mjs", "../../../node_modules/unicode-properties/dist/index.js", "../../../node_modules/unicode-properties/dist/data.json", "../../../node_modules/fontkit/dist/src/index.js", "../../../node_modules/fontkit/dist/src/base.js", "../../../node_modules/fontkit/dist/src/TTFFont.js", "../../../node_modules/fontkit/dist/src/decorators.js", "../../../node_modules/fontkit/dist/src/tables/directory.js", "../../../node_modules/fontkit/dist/src/tables/index.js", "../../../node_modules/fontkit/dist/src/tables/cmap.js", "../../../node_modules/fontkit/dist/src/tables/head.js", "../../../node_modules/fontkit/dist/src/tables/hhea.js", "../../../node_modules/fontkit/dist/src/tables/hmtx.js", "../../../node_modules/fontkit/dist/src/tables/maxp.js", "../../../node_modules/fontkit/dist/src/tables/name.js", "../../../node_modules/fontkit/dist/src/encodings.js", "../../../node_modules/fontkit/dist/src/tables/OS2.js", "../../../node_modules/fontkit/dist/src/tables/post.js", "../../../node_modules/fontkit/dist/src/tables/cvt.js", "../../../node_modules/fontkit/dist/src/tables/fpgm.js", "../../../node_modules/fontkit/dist/src/tables/loca.js", "../../../node_modules/fontkit/dist/src/tables/prep.js", "../../../node_modules/fontkit/dist/src/tables/glyf.js", "../../../node_modules/fontkit/dist/src/cff/CFFFont.js", "../../../node_modules/fontkit/dist/src/cff/CFFIndex.js", "../../../node_modules/fontkit/dist/src/cff/CFFTop.js", "../../../node_modules/fontkit/dist/src/cff/CFFDict.js", "../../../node_modules/fontkit/dist/src/cff/CFFOperand.js", "../../../node_modules/fontkit/dist/src/cff/CFFPointer.js", "../../../node_modules/fontkit/dist/src/cff/CFFPrivateDict.js", "../../../node_modules/fontkit/dist/src/cff/CFFStandardStrings.js", "../../../node_modules/fontkit/dist/src/cff/CFFEncodings.js", "../../../node_modules/fontkit/dist/src/cff/CFFCharsets.js", "../../../node_modules/fontkit/dist/src/tables/variations.js", "../../../node_modules/fontkit/dist/src/tables/opentype.js", "../../../node_modules/fontkit/dist/src/tables/VORG.js", "../../../node_modules/fontkit/dist/src/tables/EBLC.js", "../../../node_modules/fontkit/dist/src/tables/EBDT.js", "../../../node_modules/fontkit/dist/src/tables/sbix.js", "../../../node_modules/fontkit/dist/src/tables/COLR.js", "../../../node_modules/fontkit/dist/src/tables/CPAL.js", "../../../node_modules/fontkit/dist/src/tables/BASE.js", "../../../node_modules/fontkit/dist/src/tables/GDEF.js", "../../../node_modules/fontkit/dist/src/tables/GPOS.js", "../../../node_modules/fontkit/dist/src/tables/GSUB.js", "../../../node_modules/fontkit/dist/src/tables/JSTF.js", "../../../node_modules/fontkit/dist/src/tables/HVAR.js", "../../../node_modules/fontkit/dist/src/tables/DSIG.js", "../../../node_modules/fontkit/dist/src/tables/gasp.js", "../../../node_modules/fontkit/dist/src/tables/hdmx.js", "../../../node_modules/fontkit/dist/src/tables/kern.js", "../../../node_modules/fontkit/dist/src/tables/LTSH.js", "../../../node_modules/fontkit/dist/src/tables/PCLT.js", "../../../node_modules/fontkit/dist/src/tables/VDMX.js", "../../../node_modules/fontkit/dist/src/tables/vhea.js", "../../../node_modules/fontkit/dist/src/tables/vmtx.js", "../../../node_modules/fontkit/dist/src/tables/avar.js", "../../../node_modules/fontkit/dist/src/tables/bsln.js", "../../../node_modules/fontkit/dist/src/tables/aat.js", "../../../node_modules/fontkit/dist/src/tables/feat.js", "../../../node_modules/fontkit/dist/src/tables/fvar.js", "../../../node_modules/fontkit/dist/src/tables/gvar.js", "../../../node_modules/fontkit/dist/src/tables/just.js", "../../../node_modules/fontkit/dist/src/tables/morx.js", "../../../node_modules/fontkit/dist/src/tables/opbd.js", "../../../node_modules/fontkit/dist/src/CmapProcessor.js", "../../../node_modules/fontkit/dist/src/utils.js", "../../../node_modules/fontkit/dist/src/layout/LayoutEngine.js", "../../../node_modules/fontkit/dist/src/layout/KernProcessor.js", "../../../node_modules/fontkit/dist/src/layout/UnicodeLayoutEngine.js", "../../../node_modules/fontkit/dist/src/layout/GlyphRun.js", "../../../node_modules/fontkit/dist/src/glyph/BBox.js", "../../../node_modules/fontkit/dist/src/layout/Script.js", "../../../node_modules/fontkit/dist/src/layout/GlyphPosition.js", "../../../node_modules/fontkit/dist/src/aat/AATLayoutEngine.js", "../../../node_modules/fontkit/dist/src/aat/AATFeatureMap.js", "../../../node_modules/fontkit/dist/src/aat/AATMorxProcessor.js", "../../../node_modules/fontkit/dist/src/aat/AATStateMachine.js", "../../../node_modules/fontkit/dist/src/aat/AATLookupTable.js", "../../../node_modules/fontkit/dist/src/opentype/OTLayoutEngine.js", "../../../node_modules/fontkit/dist/src/opentype/ShapingPlan.js", "../../../node_modules/fontkit/dist/src/opentype/shapers/index.js", "../../../node_modules/fontkit/dist/src/opentype/shapers/DefaultShaper.js", "../../../node_modules/fontkit/dist/src/opentype/shapers/ArabicShaper.js", "../../../node_modules/fontkit/dist/src/opentype/shapers/HangulShaper.js", "../../../node_modules/fontkit/dist/src/opentype/GlyphInfo.js", "../../../node_modules/fontkit/dist/src/opentype/OTProcessor.js", "../../../node_modules/fontkit/dist/src/opentype/GlyphIterator.js", "../../../node_modules/fontkit/dist/src/opentype/shapers/IndicShaper.js", "../../../node_modules/fontkit/dist/src/opentype/shapers/indic.json", "../../../node_modules/fontkit/dist/src/opentype/shapers/use.json", "../../../node_modules/fontkit/dist/src/opentype/shapers/indic-data.js", "../../../node_modules/fontkit/dist/src/opentype/shapers/UniversalShaper.js", "../../../node_modules/fontkit/dist/src/opentype/GSUBProcessor.js", "../../../node_modules/fontkit/dist/src/opentype/GPOSProcessor.js", "../../../node_modules/fontkit/dist/src/glyph/TTFGlyph.js", "../../../node_modules/fontkit/dist/src/glyph/Glyph.js", "../../../node_modules/fontkit/dist/src/glyph/Path.js", "../../../node_modules/fontkit/dist/src/glyph/StandardNames.js", "../../../node_modules/fontkit/dist/src/glyph/CFFGlyph.js", "../../../node_modules/fontkit/dist/src/glyph/SBIXGlyph.js", "../../../node_modules/fontkit/dist/src/glyph/COLRGlyph.js", "../../../node_modules/fontkit/dist/src/glyph/GlyphVariationProcessor.js", "../../../node_modules/fontkit/dist/src/subset/TTFSubset.js", "../../../node_modules/fontkit/dist/src/subset/Subset.js", "../../../node_modules/fontkit/dist/src/glyph/TTFGlyphEncoder.js", "../../../node_modules/fontkit/dist/src/subset/CFFSubset.js", "../../../node_modules/fontkit/dist/src/WOFFFont.js", "../../../node_modules/fontkit/dist/src/tables/WOFFDirectory.js", "../../../node_modules/fontkit/dist/src/WOFF2Font.js", "../../../node_modules/fontkit/dist/src/glyph/WOFF2Glyph.js", "../../../node_modules/fontkit/dist/src/tables/WOFF2Directory.js", "../../../node_modules/fontkit/dist/src/TrueTypeCollection.js", "../../../node_modules/fontkit/dist/src/DFont.js", "../../javascript/controllers/generate_dialog_controller.js", "../../javascript/controllers/graph_bulk_edit_controller.js", "../../javascript/controllers/graph_settings_controller.js", "../../javascript/controllers/graph_splitter_controller.js", "../../javascript/controllers/header_nav_controller.js", "../../javascript/controllers/json_editor_controller.js", "../../javascript/controllers/json_viewer_controller.js", "../../javascript/controllers/lazy_load_controller.js", "../../javascript/controllers/mistake_heatmap_controller.js", "../../javascript/controllers/mushaf_page_builder_controller.js", "../../javascript/controllers/mushaf_page_controller.js", "../../javascript/controllers/mutashabihat_ayah_controller.js", "../../javascript/utils/LocalStore.js", "../../javascript/controllers/mutashabihat_builder_controller.js", "../../javascript/controllers/mutashabihat_proofread_controller.js", "../../javascript/controllers/offcanvas_controller.js", "../../javascript/controllers/offcanvas_reset_controller.js", "../../javascript/controllers/page_search_controller.js", "../../javascript/controllers/page_title_controller.js", "../../javascript/controllers/pdf_viewer_controller.js", "../../javascript/utils/pdf_viewer.js", "../../javascript/controllers/peity_controller.js", "../../javascript/controllers/phrase_ayah_bookmark_controller.js", "../../javascript/controllers/popover_controller.js", "../../javascript/controllers/proofreading_view_switcher_controller.js", "../../javascript/controllers/recitation_picker_controller.js", "../../javascript/controllers/remote_form_controller.js", "../../javascript/controllers/remote_select2_controller.js", "../../javascript/controllers/remote_tab_controller.js", "../../javascript/controllers/resizeable_controller.js", "../../javascript/controllers/resource_search_controller.js", "../../javascript/controllers/resource_tabs_controller.js", "../../javascript/controllers/runable_widget_controller.js", "../../javascript/controllers/segment_compare_controller.js", "../../javascript/lib/letter_slices.js", "../../javascript/lib/segment_repeats.js", "../../javascript/controllers/segment_issue_tabs_controller.js", "../../javascript/controllers/segment_pipeline_controller.js", "../../javascript/controllers/segment_timeline_controller.js", "../../javascript/controllers/select2_controller.js", "../../javascript/controllers/show_footnote_controller.js", "../../javascript/controllers/step_flow_controller.js", "../../javascript/controllers/surah_segment_player_controller.js", "../../javascript/controllers/surah_timeline_controller.js", "../../javascript/controllers/svg_mushaf_controller.js", "../../javascript/controllers/svg_preview_controller.js", "../../javascript/controllers/syntax_graph_controller.js", "../../javascript/controllers/syntax_graph_download_controller.js", "../../javascript/controllers/tabs_controller.js", "../../javascript/controllers/tafsir_range_controller.js", "../../javascript/controllers/tafsir_text_popup_controller.js", "../../javascript/controllers/tajweed_annotator_controller.js", "../../javascript/controllers/tajweed_font_controller.js", "../../javascript/controllers/tajweed_highlight_controller.js", "../../javascript/controllers/tinymce_controller.js", "../../javascript/controllers/toggle_password_controller.js", "../../javascript/controllers/tooltip_controller.js", "../../javascript/controllers/translation_controller.js", "../../javascript/controllers/translation_footnote_controller.js", "../../javascript/controllers/translation_footnote_toggle_controller.js", "../../javascript/controllers/translation_footnotes_controller.js", "../../javascript/controllers/treebank_controller.js", "../../javascript/controllers/turbo_frame_loading_controller.js", "../../javascript/controllers/update_mushaf_page_controller.js", "../../javascript/controllers/user_menu_controller.js", "../../javascript/controllers/verse_controller.js", "../../javascript/controllers/zoom_image_controller.js", "rails:/home/app/qul/app/javascript/controllers/**/*_controller.js", "../../javascript/controllers/index.js", "../../javascript/utils/ayah-player.js"],
  "sourcesContent": ["/*!\n * jQuery JavaScript Library v3.7.1\n * https://jquery.com/\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2023-08-28T13:37Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket trac-14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar flat = arr.flat ? function( array ) {\n\treturn arr.flat.call( array );\n} : function( array ) {\n\treturn arr.concat.apply( [], array );\n};\n\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n\t\t// Support: Chrome <=57, Firefox <=52\n\t\t// In some browsers, typeof returns \"function\" for HTML <object> elements\n\t\t// (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n\t\t// We don't want to classify *any* DOM node as a function.\n\t\t// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5\n\t\t// Plus for old WebKit, typeof returns \"function\" for HTML collections\n\t\t// (e.g., `typeof document.getElementsByTagName(\"div\") === \"function\"`). (gh-4756)\n\t\treturn typeof obj === \"function\" && typeof obj.nodeType !== \"number\" &&\n\t\t\ttypeof obj.item !== \"function\";\n\t};\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\nvar document = window.document;\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar version = \"3.7.1\",\n\n\trhtmlSuffix = /HTML$/i,\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teven: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn ( i + 1 ) % 2;\n\t\t} ) );\n\t},\n\n\todd: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn i % 2;\n\t\t} ) );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a provided context; falls back to the global one\n\t// if not specified.\n\tglobalEval: function( code, options, doc ) {\n\t\tDOMEval( code, { nonce: options && options.nonce }, doc );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\n\t// Retrieve the text value of an array of DOM nodes\n\ttext: function( elem ) {\n\t\tvar node,\n\t\t\tret = \"\",\n\t\t\ti = 0,\n\t\t\tnodeType = elem.nodeType;\n\n\t\tif ( !nodeType ) {\n\n\t\t\t// If no nodeType, this is expected to be an array\n\t\t\twhile ( ( node = elem[ i++ ] ) ) {\n\n\t\t\t\t// Do not traverse comment nodes\n\t\t\t\tret += jQuery.text( node );\n\t\t\t}\n\t\t}\n\t\tif ( nodeType === 1 || nodeType === 11 ) {\n\t\t\treturn elem.textContent;\n\t\t}\n\t\tif ( nodeType === 9 ) {\n\t\t\treturn elem.documentElement.textContent;\n\t\t}\n\t\tif ( nodeType === 3 || nodeType === 4 ) {\n\t\t\treturn elem.nodeValue;\n\t\t}\n\n\t\t// Do not include comment or processing instruction nodes\n\n\t\treturn ret;\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\tisXMLDoc: function( elem ) {\n\t\tvar namespace = elem && elem.namespaceURI,\n\t\t\tdocElem = elem && ( elem.ownerDocument || elem ).documentElement;\n\n\t\t// Assume HTML when documentElement doesn't yet exist, such as inside\n\t\t// document fragments.\n\t\treturn !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn flat( ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\n\tfunction( _i, name ) {\n\t\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n\t} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\n\n\nfunction nodeName( elem, name ) {\n\n\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n}\nvar pop = arr.pop;\n\n\nvar sort = arr.sort;\n\n\nvar splice = arr.splice;\n\n\nvar whitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\";\n\n\nvar rtrimCSS = new RegExp(\n\t\"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\",\n\t\"g\"\n);\n\n\n\n\n// Note: an element does not contain itself\njQuery.contains = function( a, b ) {\n\tvar bup = b && b.parentNode;\n\n\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\n\t\t// Support: IE 9 - 11+\n\t\t// IE doesn't have `contains` on SVG.\n\t\ta.contains ?\n\t\t\ta.contains( bup ) :\n\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t) );\n};\n\n\n\n\n// CSS string/identifier serialization\n// https://drafts.csswg.org/cssom/#common-serializing-idioms\nvar rcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\x80-\\uFFFF\\w-]/g;\n\nfunction fcssescape( ch, asCodePoint ) {\n\tif ( asCodePoint ) {\n\n\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\tif ( ch === \"\\0\" ) {\n\t\t\treturn \"\\uFFFD\";\n\t\t}\n\n\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\treturn ch.slice( 0, -1 ) + \"\\\\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t}\n\n\t// Other potentially-special ASCII characters get backslash-escaped\n\treturn \"\\\\\" + ch;\n}\n\njQuery.escapeSelector = function( sel ) {\n\treturn ( sel + \"\" ).replace( rcssescape, fcssescape );\n};\n\n\n\n\nvar preferredDoc = document,\n\tpushNative = push;\n\n( function() {\n\nvar i,\n\tExpr,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\tpush = pushNative,\n\n\t// Local document vars\n\tdocument,\n\tdocumentElement,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\tmatches,\n\n\t// Instance-specific data\n\texpando = jQuery.expando,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|\" +\n\t\t\"loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n\tidentifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n\n\t// Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" +\n\t\twhitespace + \"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trleadingCombinator = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" +\n\t\twhitespace + \"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\tID: new RegExp( \"^#(\" + identifier + \")\" ),\n\t\tCLASS: new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\tTAG: new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\tATTR: new RegExp( \"^\" + attributes ),\n\t\tPSEUDO: new RegExp( \"^\" + pseudos ),\n\t\tCHILD: new RegExp(\n\t\t\t\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" +\n\t\t\t\twhitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" +\n\t\t\t\twhitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\tbool: new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\tneedsContext: new RegExp( \"^\" + whitespace +\n\t\t\t\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// https://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\" ),\n\tfunescape = function( escape, nonHex ) {\n\t\tvar high = \"0x\" + escape.slice( 1 ) - 0x10000;\n\n\t\tif ( nonHex ) {\n\n\t\t\t// Strip the backslash prefix from a non-hex escape sequence\n\t\t\treturn nonHex;\n\t\t}\n\n\t\t// Replace a hexadecimal escape sequence with the encoded Unicode code point\n\t\t// Support: IE <=11+\n\t\t// For values outside the Basic Multilingual Plane (BMP), manually construct a\n\t\t// surrogate pair\n\t\treturn high < 0 ?\n\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// Used for iframes; see `setDocument`.\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE/Edge.\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && nodeName( elem, \"fieldset\" );\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t( arr = slice.call( preferredDoc.childNodes ) ),\n\t\tpreferredDoc.childNodes\n\t);\n\n\t// Support: Android <=4.0\n\t// Detect silently failing push.apply\n\t// eslint-disable-next-line no-unused-expressions\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = {\n\t\tapply: function( target, els ) {\n\t\t\tpushNative.apply( target, slice.call( els ) );\n\t\t},\n\t\tcall: function( target ) {\n\t\t\tpushNative.apply( target, slice.call( arguments, 1 ) );\n\t\t}\n\t};\n}\n\nfunction find( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\t\tsetDocument( context );\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( ( m = match[ 1 ] ) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( ( elem = context.getElementById( m ) ) ) {\n\n\t\t\t\t\t\t\t// Support: IE 9 only\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tpush.call( results, elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE 9 only\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && ( elem = newContext.getElementById( m ) ) &&\n\t\t\t\t\t\t\tfind.contains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tpush.call( results, elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[ 2 ] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( !nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// The technique has to be used as well when a leading combinator is used\n\t\t\t\t// as such selectors are not recognized by querySelectorAll.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 &&\n\t\t\t\t\t( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) {\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\n\t\t\t\t\t// We can use :scope instead of the ID hack if the browser\n\t\t\t\t\t// supports it & if we're not changing the context.\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when\n\t\t\t\t\t// strict-comparing two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( newContext != context || !support.scope ) {\n\n\t\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\t\tif ( ( nid = context.getAttribute( \"id\" ) ) ) {\n\t\t\t\t\t\t\tnid = jQuery.escapeSelector( nid );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.setAttribute( \"id\", ( nid = expando ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[ i ] = ( nid ? \"#\" + nid : \":scope\" ) + \" \" +\n\t\t\t\t\t\t\ttoSelector( groups[ i ] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrimCSS, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\n\t\t// Use (key + \" \") to avoid collision with native prototype properties\n\t\t// (see https://github.com/jquery/sizzle/issues/157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn ( cache[ key + \" \" ] = value );\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by jQuery selector module\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement( \"fieldset\" );\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch ( e ) {\n\t\treturn false;\n\t} finally {\n\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\treturn nodeName( elem, \"input\" ) && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\treturn ( nodeName( elem, \"input\" ) || nodeName( elem, \"button\" ) ) &&\n\t\t\telem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11+\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction( function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction( function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ ( j = matchIndexes[ i ] ) ] ) {\n\t\t\t\t\tseed[ j ] = !( matches[ j ] = seed[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Checks a node for validity as a jQuery selector context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [node] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nfunction setDocument( node ) {\n\tvar subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocumentElement = document.documentElement;\n\tdocumentIsHTML = !jQuery.isXMLDoc( document );\n\n\t// Support: iOS 7 only, IE 9 - 11+\n\t// Older browsers didn't support unprefixed `matches`.\n\tmatches = documentElement.matches ||\n\t\tdocumentElement.webkitMatchesSelector ||\n\t\tdocumentElement.msMatchesSelector;\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Accessing iframe documents after unload throws \"permission denied\" errors\n\t// (see trac-13936).\n\t// Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`,\n\t// all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well.\n\tif ( documentElement.msMatchesSelector &&\n\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tpreferredDoc != document &&\n\t\t( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t\tsubWindow.addEventListener( \"unload\", unloadHandler );\n\t}\n\n\t// Support: IE <10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert( function( el ) {\n\t\tdocumentElement.appendChild( el ).id = jQuery.expando;\n\t\treturn !document.getElementsByName ||\n\t\t\t!document.getElementsByName( jQuery.expando ).length;\n\t} );\n\n\t// Support: IE 9 only\n\t// Check to see if it's possible to do matchesSelector\n\t// on a disconnected node.\n\tsupport.disconnectedMatch = assert( function( el ) {\n\t\treturn matches.call( el, \"*\" );\n\t} );\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// IE/Edge don't support the :scope pseudo-class.\n\tsupport.scope = assert( function() {\n\t\treturn document.querySelectorAll( \":scope\" );\n\t} );\n\n\t// Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only\n\t// Make sure the `:has()` argument is parsed unforgivingly.\n\t// We include `*` in the test to detect buggy implementations that are\n\t// _selectively_ forgiving (specifically when the list includes at least\n\t// one valid selector).\n\t// Note that we treat complete lack of support for `:has()` as if it were\n\t// spec-compliant support, which is fine because use of `:has()` in such\n\t// environments will fail in the qSA path and fall back to jQuery traversal\n\t// anyway.\n\tsupport.cssHas = assert( function() {\n\t\ttry {\n\t\t\tdocument.querySelector( \":has(*,:jqfake)\" );\n\t\t\treturn false;\n\t\t} catch ( e ) {\n\t\t\treturn true;\n\t\t}\n\t} );\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter.ID = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"id\" ) === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find.ID = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter.ID =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode( \"id\" );\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find.ID = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( ( elem = elems[ i++ ] ) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find.TAG = function( tag, context ) {\n\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t// DocumentFragment nodes don't have gEBTN\n\t\t} else {\n\t\t\treturn context.querySelectorAll( tag );\n\t\t}\n\t};\n\n\t// Class\n\tExpr.find.CLASS = function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\trbuggyQSA = [];\n\n\t// Build QSA regex\n\t// Regex strategy adopted from Diego Perini\n\tassert( function( el ) {\n\n\t\tvar input;\n\n\t\tdocumentElement.appendChild( el ).innerHTML =\n\t\t\t\"<a id='\" + expando + \"' href='' disabled='disabled'></a>\" +\n\t\t\t\"<select id='\" + expando + \"-\\r\\\\' disabled='disabled'>\" +\n\t\t\t\"<option selected=''></option></select>\";\n\n\t\t// Support: iOS <=7 - 8 only\n\t\t// Boolean attributes and \"value\" are not treated correctly in some XML documents\n\t\tif ( !el.querySelectorAll( \"[selected]\" ).length ) {\n\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t}\n\n\t\t// Support: iOS <=7 - 8 only\n\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\trbuggyQSA.push( \"~=\" );\n\t\t}\n\n\t\t// Support: iOS 8 only\n\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\trbuggyQSA.push( \".#.+[+~]\" );\n\t\t}\n\n\t\t// Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+\n\t\t// In some of the document kinds, these selectors wouldn't work natively.\n\t\t// This is probably OK but for backwards compatibility we want to maintain\n\t\t// handling them through jQuery traversal in jQuery 3.x.\n\t\tif ( !el.querySelectorAll( \":checked\" ).length ) {\n\t\t\trbuggyQSA.push( \":checked\" );\n\t\t}\n\n\t\t// Support: Windows 8 Native Apps\n\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\tinput = document.createElement( \"input\" );\n\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t// Support: IE 9 - 11+\n\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t// Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+\n\t\t// In some of the document kinds, these selectors wouldn't work natively.\n\t\t// This is probably OK but for backwards compatibility we want to maintain\n\t\t// handling them through jQuery traversal in jQuery 3.x.\n\t\tdocumentElement.appendChild( el ).disabled = true;\n\t\tif ( el.querySelectorAll( \":disabled\" ).length !== 2 ) {\n\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t}\n\n\t\t// Support: IE 11+, Edge 15 - 18+\n\t\t// IE 11/Edge don't find elements on a `[name='']` query in some cases.\n\t\t// Adding a temporary attribute to the document before the selection works\n\t\t// around the issue.\n\t\t// Interestingly, IE 10 & older don't seem to have the issue.\n\t\tinput = document.createElement( \"input\" );\n\t\tinput.setAttribute( \"name\", \"\" );\n\t\tel.appendChild( input );\n\t\tif ( !el.querySelectorAll( \"[name='']\" ).length ) {\n\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" +\n\t\t\t\twhitespace + \"*(?:''|\\\"\\\")\" );\n\t\t}\n\t} );\n\n\tif ( !support.cssHas ) {\n\n\t\t// Support: Chrome 105 - 110+, Safari 15.4 - 16.3+\n\t\t// Our regular `try-catch` mechanism fails to detect natively-unsupported\n\t\t// pseudo-classes inside `:has()` (such as `:has(:contains(\"Foo\"))`)\n\t\t// in browsers that parse the `:has()` argument as a forgiving selector list.\n\t\t// https://drafts.csswg.org/selectors/#relational now requires the argument\n\t\t// to be parsed unforgivingly, but browsers have not yet fully adjusted.\n\t\trbuggyQSA.push( \":has\" );\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( \"|\" ) );\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = function( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tcompare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( a === document || a.ownerDocument == preferredDoc &&\n\t\t\t\tfind.contains( preferredDoc, a ) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( b === document || b.ownerDocument == preferredDoc &&\n\t\t\t\tfind.contains( preferredDoc, b ) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t};\n\n\treturn document;\n}\n\nfind.matches = function( expr, elements ) {\n\treturn find( expr, null, null, elements );\n};\n\nfind.matchesSelector = function( elem, expr ) {\n\tsetDocument( elem );\n\n\tif ( documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn find( expr, document, null, [ elem ] ).length > 0;\n};\n\nfind.contains = function( context, elem ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( context.ownerDocument || context ) != document ) {\n\t\tsetDocument( context );\n\t}\n\treturn jQuery.contains( context, elem );\n};\n\n\nfind.attr = function( elem, name ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( elem.ownerDocument || elem ) != document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\n\t\t// Don't get fooled by Object.prototype properties (see trac-13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\tif ( val !== undefined ) {\n\t\treturn val;\n\t}\n\n\treturn elem.getAttribute( name );\n};\n\nfind.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\njQuery.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\t//\n\t// Support: Android <=4.0+\n\t// Testing for detecting duplicates is unpredictable so instead assume we can't\n\t// depend on duplicate detection in all browsers without a stable sort.\n\thasDuplicate = !support.sortStable;\n\tsortInput = !support.sortStable && slice.call( results, 0 );\n\tsort.call( results, sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tsplice.call( results, duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\njQuery.fn.uniqueSort = function() {\n\treturn this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) );\n};\n\nExpr = jQuery.expr = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\tATTR: function( match ) {\n\t\t\tmatch[ 1 ] = match[ 1 ].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || \"\" )\n\t\t\t\t.replace( runescape, funescape );\n\n\t\t\tif ( match[ 2 ] === \"~=\" ) {\n\t\t\t\tmatch[ 3 ] = \" \" + match[ 3 ] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\tCHILD: function( match ) {\n\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[ 1 ] = match[ 1 ].toLowerCase();\n\n\t\t\tif ( match[ 1 ].slice( 0, 3 ) === \"nth\" ) {\n\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[ 3 ] ) {\n\t\t\t\t\tfind.error( match[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[ 4 ] = +( match[ 4 ] ?\n\t\t\t\t\tmatch[ 5 ] + ( match[ 6 ] || 1 ) :\n\t\t\t\t\t2 * ( match[ 3 ] === \"even\" || match[ 3 ] === \"odd\" )\n\t\t\t\t);\n\t\t\t\tmatch[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[ 3 ] ) {\n\t\t\t\tfind.error( match[ 0 ] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\tPSEUDO: function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[ 6 ] && match[ 2 ];\n\n\t\t\tif ( matchExpr.CHILD.test( match[ 0 ] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[ 3 ] ) {\n\t\t\t\tmatch[ 2 ] = match[ 4 ] || match[ 5 ] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t( excess = tokenize( unquoted, true ) ) &&\n\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t( excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length ) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[ 0 ] = match[ 0 ].slice( 0, excess );\n\t\t\t\tmatch[ 2 ] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\tTAG: function( nodeNameSelector ) {\n\t\t\tvar expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() {\n\t\t\t\t\treturn true;\n\t\t\t\t} :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn nodeName( elem, expectedNodeName );\n\t\t\t\t};\n\t\t},\n\n\t\tCLASS: function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t( pattern = new RegExp( \"(^|\" + whitespace + \")\" + className +\n\t\t\t\t\t\"(\" + whitespace + \"|$)\" ) ) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test(\n\t\t\t\t\t\ttypeof elem.className === \"string\" && elem.className ||\n\t\t\t\t\t\t\ttypeof elem.getAttribute !== \"undefined\" &&\n\t\t\t\t\t\t\t\telem.getAttribute( \"class\" ) ||\n\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t);\n\t\t\t\t} );\n\t\t},\n\n\t\tATTR: function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = find.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\tif ( operator === \"=\" ) {\n\t\t\t\t\treturn result === check;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"!=\" ) {\n\t\t\t\t\treturn result !== check;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"^=\" ) {\n\t\t\t\t\treturn check && result.indexOf( check ) === 0;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"*=\" ) {\n\t\t\t\t\treturn check && result.indexOf( check ) > -1;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"$=\" ) {\n\t\t\t\t\treturn check && result.slice( -check.length ) === check;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"~=\" ) {\n\t\t\t\t\treturn ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" )\n\t\t\t\t\t\t.indexOf( check ) > -1;\n\t\t\t\t}\n\t\t\t\tif ( operator === \"|=\" ) {\n\t\t\t\t\treturn result === check || result.slice( 0, check.length + 1 ) === check + \"-\";\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t};\n\t\t},\n\n\t\tCHILD: function( type, what, _argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( ( node = node[ dir ] ) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnodeName( node, name ) :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || ( parent[ expando ] = {} );\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\t\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnodeName( node, name ) :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( node[ expando ] = {} );\n\t\t\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\tPSEUDO: function( pseudo, argument ) {\n\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// https://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tfind.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as jQuery does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction( function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[ i ] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\n\t\t// Potentially complex pseudos\n\t\tnot: markFunction( function( selector ) {\n\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrimCSS, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction( function( seed, matches, _context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\t\t\t\t\tseed[ i ] = !( matches[ i ] = elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} ) :\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tinput[ 0 ] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\n\t\t\t\t\t// Don't keep the element\n\t\t\t\t\t// (see https://github.com/jquery/sizzle/issues/299)\n\t\t\t\t\tinput[ 0 ] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t} ),\n\n\t\thas: markFunction( function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn find( selector, elem ).length > 0;\n\t\t\t};\n\t\t} ),\n\n\t\tcontains: markFunction( function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t} ),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// https://www.w3.org/TR/selectors/#lang-pseudo\n\t\tlang: markFunction( function( lang ) {\n\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test( lang || \"\" ) ) {\n\t\t\t\tfind.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( ( elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute( \"xml:lang\" ) || elem.getAttribute( \"lang\" ) ) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t} ),\n\n\t\t// Miscellaneous\n\t\ttarget: function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\troot: function( elem ) {\n\t\t\treturn elem === documentElement;\n\t\t},\n\n\t\tfocus: function( elem ) {\n\t\t\treturn elem === safeActiveElement() &&\n\t\t\t\tdocument.hasFocus() &&\n\t\t\t\t!!( elem.type || elem.href || ~elem.tabIndex );\n\t\t},\n\n\t\t// Boolean properties\n\t\tenabled: createDisabledPseudo( false ),\n\t\tdisabled: createDisabledPseudo( true ),\n\n\t\tchecked: function( elem ) {\n\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\treturn ( nodeName( elem, \"input\" ) && !!elem.checked ) ||\n\t\t\t\t( nodeName( elem, \"option\" ) && !!elem.selected );\n\t\t},\n\n\t\tselected: function( elem ) {\n\n\t\t\t// Support: IE <=11+\n\t\t\t// Accessing the selectedIndex property\n\t\t\t// forces the browser to treat the default option as\n\t\t\t// selected when in an optgroup.\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\tempty: function( elem ) {\n\n\t\t\t// https://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\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\tparent: function( elem ) {\n\t\t\treturn !Expr.pseudos.empty( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\theader: function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\tinput: function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\tbutton: function( elem ) {\n\t\t\treturn nodeName( elem, \"input\" ) && elem.type === \"button\" ||\n\t\t\t\tnodeName( elem, \"button\" );\n\t\t},\n\n\t\ttext: function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn nodeName( elem, \"input\" ) && elem.type === \"text\" &&\n\n\t\t\t\t// Support: IE <10 only\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear\n\t\t\t\t// with elem.type === \"text\"\n\t\t\t\t( ( attr = elem.getAttribute( \"type\" ) ) == null ||\n\t\t\t\t\tattr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\tfirst: createPositionalPseudo( function() {\n\t\t\treturn [ 0 ];\n\t\t} ),\n\n\t\tlast: createPositionalPseudo( function( _matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t} ),\n\n\t\teq: createPositionalPseudo( function( _matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t} ),\n\n\t\teven: createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\todd: createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\tlt: createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i;\n\n\t\t\tif ( argument < 0 ) {\n\t\t\t\ti = argument + length;\n\t\t\t} else if ( argument > length ) {\n\t\t\t\ti = length;\n\t\t\t} else {\n\t\t\t\ti = argument;\n\t\t\t}\n\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\tgt: createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} )\n\t}\n};\n\nExpr.pseudos.nth = Expr.pseudos.eq;\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\nfunction tokenize( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || ( match = rcomma.exec( soFar ) ) ) {\n\t\t\tif ( match ) {\n\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[ 0 ].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( ( tokens = [] ) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( ( match = rleadingCombinator.exec( soFar ) ) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[ 0 ].replace( rtrimCSS, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||\n\t\t\t\t( match = preFilters[ type ]( match ) ) ) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\tif ( parseOnly ) {\n\t\treturn soFar.length;\n\t}\n\n\treturn soFar ?\n\t\tfind.error( selector ) :\n\n\t\t// Cache the tokens\n\t\ttokenCache( selector, groups ).slice( 0 );\n}\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[ i ].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\n\t\t\t\t\t\tif ( skip && nodeName( elem, skip ) ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( ( oldCache = outerCache[ key ] ) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn ( newCache[ 2 ] = oldCache[ 2 ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\touterCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {\n\t\t\t\t\t\t\t\treturn true;\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}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[ i ]( elem, context, xml ) ) {\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\t\tmatchers[ 0 ];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tfind( selector, contexts[ i ], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction( function( seed, results, context, xml ) {\n\t\tvar temp, i, elem, matcherOut,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed ||\n\t\t\t\tmultipleContexts( selector || \"*\",\n\t\t\t\t\tcontext.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems;\n\n\t\tif ( matcher ) {\n\n\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter\n\t\t\t// or preexisting results,\n\t\t\tmatcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t[] :\n\n\t\t\t\t// ...otherwise use results directly\n\t\t\t\tresults;\n\n\t\t\t// Find primary matches\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t} else {\n\t\t\tmatcherOut = matcherIn;\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( ( elem = temp[ i ] ) ) {\n\t\t\t\t\tmatcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) ) {\n\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( ( matcherIn[ i ] = elem ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, ( matcherOut = [] ), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) &&\n\t\t\t\t\t\t( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) {\n\n\t\t\t\t\t\tseed[ temp ] = !( results[ temp ] = elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[ 0 ].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[ \" \" ],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tvar ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || (\n\t\t\t\t( checkContext = context ).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\n\t\t\t// Avoid hanging onto element\n\t\t\t// (see https://github.com/jquery/sizzle/issues/299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {\n\t\t\tmatchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[ j ].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 )\n\t\t\t\t\t\t\t.concat( { value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" } )\n\t\t\t\t\t).replace( rtrimCSS, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find.TAG( \"*\", outermost ),\n\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\n\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\toutermostContext = context == document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: iOS <=7 - 9 only\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching\n\t\t\t// elements by id. (see trac-14142)\n\t\t\tfor ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( !context && elem.ownerDocument != document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( ( matcher = elementMatchers[ j++ ] ) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml ) ) {\n\t\t\t\t\t\t\tpush.call( results, elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( ( elem = !matcher && elem ) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( ( matcher = setMatchers[ j++ ] ) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !( unmatched[ i ] || setMatched[ i ] ) ) {\n\t\t\t\t\t\t\t\tsetMatched[ i ] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tjQuery.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\nfunction compile( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[ i ] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector,\n\t\t\tmatcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n}\n\n/**\n * A low-level selection function that works with jQuery's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with jQuery selector compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nfunction select( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( ( selector = compiled.selector || selector ) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[ 0 ] = match[ 0 ].slice( 0 );\n\t\tif ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === \"ID\" &&\n\t\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {\n\n\t\t\tcontext = ( Expr.find.ID(\n\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\tcontext\n\t\t\t) || [] )[ 0 ];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr.needsContext.test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[ i ];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ ( type = token.type ) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( ( find = Expr.find[ type ] ) ) {\n\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( ( seed = find(\n\t\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[ 0 ].type ) &&\n\t\t\t\t\t\ttestContext( context.parentNode ) || context\n\t\t\t\t) ) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n}\n\n// One-time assignments\n\n// Support: Android <=4.0 - 4.1+\n// Sort stability\nsupport.sortStable = expando.split( \"\" ).sort( sortOrder ).join( \"\" ) === expando;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Android <=4.0 - 4.1+\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert( function( el ) {\n\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement( \"fieldset\" ) ) & 1;\n} );\n\njQuery.find = find;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.unique = jQuery.uniqueSort;\n\n// These have always been private, but they used to be documented as part of\n// Sizzle so let's maintain them for now for backwards compatibility purposes.\nfind.compile = compile;\nfind.select = select;\nfind.setDocument = setDocument;\nfind.tokenize = tokenize;\n\nfind.escape = jQuery.escapeSelector;\nfind.getText = jQuery.text;\nfind.isXML = jQuery.isXMLDoc;\nfind.selectors = jQuery.expr;\nfind.support = jQuery.support;\nfind.uniqueSort = jQuery.uniqueSort;\n\n\t/* eslint-enable */\n\n} )();\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521)\n\t// Strict HTML recognition (trac-11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to jQuery#find\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: 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\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( elem.contentDocument != null &&\n\n\t\t\t// Support: IE 11+\n\t\t\t// <object> elements with no `data` attribute has an object\n\t\t\t// `contentDocument` with a `null` prototype.\n\t\t\tgetProto( elem.contentDocument ) ) {\n\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( _i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.error );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the error, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getErrorHook ) {\n\t\t\t\t\t\t\t\t\tprocess.error = jQuery.Deferred.getErrorHook();\n\n\t\t\t\t\t\t\t\t// The deprecated alias of the above. While the name suggests\n\t\t\t\t\t\t\t\t// returning the stack, not an error instance, jQuery just passes\n\t\t\t\t\t\t\t\t// it directly to `console.warn` so both will work; an instance\n\t\t\t\t\t\t\t\t// just better cooperates with source maps.\n\t\t\t\t\t\t\t\t} else if ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.error = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the primary Deferred\n\t\t\tprimary = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tprimary.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( primary.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn primary.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );\n\t\t}\n\n\t\treturn primary.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\n// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error\n// captured before the async barrier to get the original error cause\n// which may otherwise be hidden.\njQuery.Deferred.exceptionHook = function( error, asyncError ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message,\n\t\t\terror.stack, asyncError );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See trac-6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, _key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\t\tvalue :\n\t\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( _all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (trac-9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see trac-8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (trac-14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\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\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (trac-11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (trac-14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces <option> tags with their contents when inserted outside of\n\t// the select element.\n\tdiv.innerHTML = \"<option></option>\";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (trac-13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, \"<select multiple='multiple'>\", \"</select>\" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (trac-15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (trac-12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar rtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\t\t)[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\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\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (trac-13208)\n\t\t\t\t// Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (trac-13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", true );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, isSetup ) {\n\n\t// Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !isSetup ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\tif ( !saved ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tdataPriv.set( this, type, false );\n\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering\n\t\t\t\t// the native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, jQuery.event.trigger(\n\t\t\t\t\tsaved[ 0 ],\n\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\tthis\n\t\t\t\t) );\n\n\t\t\t\t// Abort handling of the native event by all jQuery handlers while allowing\n\t\t\t\t// native handlers on the same element to run. On target, this is achieved\n\t\t\t\t// by stopping immediate propagation just on the jQuery event. However,\n\t\t\t\t// the native event is re-wrapped by a jQuery one on each level of the\n\t\t\t\t// propagation so the only way to stop it for jQuery is to stop it for\n\t\t\t\t// everyone via native `stopPropagation()`. This is not a problem for\n\t\t\t\t// focus/blur which don't bubble, but it does also stop click on checkboxes\n\t\t\t\t// and radios. We accept this limitation.\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tevent.isImmediatePropagationStopped = returnTrue;\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (trac-504, trac-13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\twhich: true\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\n\tfunction focusMappedHandler( nativeEvent ) {\n\t\tif ( document.documentMode ) {\n\n\t\t\t// Support: IE 11+\n\t\t\t// Attach a single focusin/focusout handler on the document while someone wants\n\t\t\t// focus/blur. This is because the former are synchronous in IE while the latter\n\t\t\t// are async. In other browsers, all those handlers are invoked synchronously.\n\n\t\t\t// `handle` from private data would already wrap the event, but we need\n\t\t\t// to change the `type` here.\n\t\t\tvar handle = dataPriv.get( this, \"handle\" ),\n\t\t\t\tevent = jQuery.event.fix( nativeEvent );\n\t\t\tevent.type = nativeEvent.type === \"focusin\" ? \"focus\" : \"blur\";\n\t\t\tevent.isSimulated = true;\n\n\t\t\t// First, handle focusin/focusout\n\t\t\thandle( nativeEvent );\n\n\t\t\t// ...then, handle focus/blur\n\t\t\t//\n\t\t\t// focus/blur don't bubble while focusin/focusout do; simulate the former by only\n\t\t\t// invoking the handler at the lower level.\n\t\t\tif ( event.target === event.currentTarget ) {\n\n\t\t\t\t// The setup part calls `leverageNative`, which, in turn, calls\n\t\t\t\t// `jQuery.event.add`, so event handle will already have been set\n\t\t\t\t// by this point.\n\t\t\t\thandle( event );\n\t\t\t}\n\t\t} else {\n\n\t\t\t// For non-IE browsers, attach a single capturing handler on the document\n\t\t\t// while someone wants focusin/focusout.\n\t\t\tjQuery.event.simulate( delegateType, nativeEvent.target,\n\t\t\t\tjQuery.event.fix( nativeEvent ) );\n\t\t}\n\t}\n\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\tvar attaches;\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, true );\n\n\t\t\tif ( document.documentMode ) {\n\n\t\t\t\t// Support: IE 9 - 11+\n\t\t\t\t// We use the same native handler for focusin & focus (and focusout & blur)\n\t\t\t\t// so we need to coordinate setup & teardown parts between those events.\n\t\t\t\t// Use `delegateType` as the key as `type` is already used by `leverageNative`.\n\t\t\t\tattaches = dataPriv.get( this, delegateType );\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tthis.addEventListener( delegateType, focusMappedHandler );\n\t\t\t\t}\n\t\t\t\tdataPriv.set( this, delegateType, ( attaches || 0 ) + 1 );\n\t\t\t} else {\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tvar attaches;\n\n\t\t\tif ( document.documentMode ) {\n\t\t\t\tattaches = dataPriv.get( this, delegateType ) - 1;\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tthis.removeEventListener( delegateType, focusMappedHandler );\n\t\t\t\t\tdataPriv.remove( this, delegateType );\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.set( this, delegateType, attaches );\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Return false to indicate standard teardown should be applied\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\n\t\t// Suppress native focus or blur if we're currently inside\n\t\t// a leveraged native-event stack\n\t\t_default: function( event ) {\n\t\t\treturn dataPriv.get( event.target, type );\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n\n\t// Support: Firefox <=44\n\t// Firefox doesn't have focus(in | out) events\n\t// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n\t//\n\t// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n\t// focus(in | out) events fire after focus & blur events,\n\t// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n\t// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\n\t//\n\t// Support: IE 9 - 11+\n\t// To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch,\n\t// attach a single handler for both events in IE.\n\tjQuery.event.special[ delegateType ] = {\n\t\tsetup: function() {\n\n\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\tdataHolder = document.documentMode ? this : doc,\n\t\t\t\tattaches = dataPriv.get( dataHolder, delegateType );\n\n\t\t\t// Support: IE 9 - 11+\n\t\t\t// We use the same native handler for focusin & focus (and focusout & blur)\n\t\t\t// so we need to coordinate setup & teardown parts between those events.\n\t\t\t// Use `delegateType` as the key as `type` is already used by `leverageNative`.\n\t\t\tif ( !attaches ) {\n\t\t\t\tif ( document.documentMode ) {\n\t\t\t\t\tthis.addEventListener( delegateType, focusMappedHandler );\n\t\t\t\t} else {\n\t\t\t\t\tdoc.addEventListener( type, focusMappedHandler, true );\n\t\t\t\t}\n\t\t\t}\n\t\t\tdataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 );\n\t\t},\n\t\tteardown: function() {\n\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\tdataHolder = document.documentMode ? this : doc,\n\t\t\t\tattaches = dataPriv.get( dataHolder, delegateType ) - 1;\n\n\t\t\tif ( !attaches ) {\n\t\t\t\tif ( document.documentMode ) {\n\t\t\t\t\tthis.removeEventListener( delegateType, focusMappedHandler );\n\t\t\t\t} else {\n\t\t\t\t\tdoc.removeEventListener( type, focusMappedHandler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( dataHolder, delegateType );\n\t\t\t} else {\n\t\t\t\tdataPriv.set( dataHolder, delegateType, attaches );\n\t\t\t}\n\t\t}\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\n\trcleanScript = /^\\s*<!\\[CDATA\\[|\\]\\]>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, \"handle events\" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (trac-8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Re-enable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase()  !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Unwrap a CDATA section containing script contents. This shouldn't be\n\t\t\t\t\t\t\t// needed as in XML documents they're already not visible when\n\t\t\t\t\t\t\t// inspecting element contents and in HTML documents they have no\n\t\t\t\t\t\t\t// meaning but we're preserving that logic for backwards compatibility.\n\t\t\t\t\t\t\t// This will be removed completely in 4.0. See gh-4904.\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\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\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew jQuery#find here for performance reasons:\n\t\t\t// https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar rcustomProp = /^--/;\n\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (trac-8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\t//\n\t\t// Support: Firefox 70+\n\t\t// Only Firefox includes border widths\n\t\t// in computed dimensions. (gh-4529)\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( \"table\" );\n\t\t\t\ttr = document.createElement( \"tr\" );\n\t\t\t\ttrChild = document.createElement( \"div\" );\n\n\t\t\t\ttable.style.cssText = \"position:absolute;left:-11111px;border-collapse:separate\";\n\t\t\t\ttr.style.cssText = \"box-sizing:content-box;border:1px solid\";\n\n\t\t\t\t// Support: Chrome 86+\n\t\t\t\t// Height set through cssText does not get applied.\n\t\t\t\t// Computed height then comes back as 0.\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\n\n\t\t\t\t// Support: Android 8 Chrome 86+\n\t\t\t\t// In our bodyBackground.html iframe,\n\t\t\t\t// display for all div elements is set to \"inline\",\n\t\t\t\t// which causes a problem only in Android 8 Chrome 86.\n\t\t\t\t// Ensuring the div is `display: block`\n\t\t\t\t// gets around this issue.\n\t\t\t\ttrChild.style.display = \"block\";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderTopWidth, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\t\tisCustomProp = rcustomProp.test( name ),\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t//   .css('filter') (IE 9 only, trac-12537)\n\t//   .css('--customProperty) (gh-3144)\n\tif ( computed ) {\n\n\t\t// Support: IE <=9 - 11+\n\t\t// IE only supports `\"float\"` in `getPropertyValue`; in computed styles\n\t\t// it's only available as `\"cssFloat\"`. We no longer modify properties\n\t\t// sent to `.css()` apart from camelCasing, so we need to check both.\n\t\t// Normally, this would create difference in behavior: if\n\t\t// `getPropertyValue` returns an empty string, the value returned\n\t\t// by `.css()` would be `undefined`. This is usually the case for\n\t\t// disconnected elements. However, in IE even disconnected elements\n\t\t// with no styles return `\"none\"` for `getPropertyValue( \"float\" )`\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( isCustomProp && ret ) {\n\n\t\t\t// Support: Firefox 105+, Chrome <=105+\n\t\t\t// Spec requires trimming whitespace for custom properties (gh-4926).\n\t\t\t// Firefox only trims leading whitespace. Chrome just collapses\n\t\t\t// both leading & trailing whitespace to a single space.\n\t\t\t//\n\t\t\t// Fall back to `undefined` if empty string returned.\n\t\t\t// This collapses a missing definition with property defined\n\t\t\t// and set to an empty string but there's no standard API\n\t\t\t// allowing us to differentiate them without a performance penalty\n\t\t\t// and returning `undefined` aligns with older jQuery.\n\t\t\t//\n\t\t\t// rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED\n\t\t\t// as whitespace while CSS does not, but this is not a problem\n\t\t\t// because CSS preprocessing replaces them with U+000A LINE FEED\n\t\t\t// (which *is* CSS whitespace)\n\t\t\t// https://www.w3.org/TR/css-syntax-3/#input-preprocessing\n\t\t\tret = ret.replace( rtrimCSS, \"$1\" ) || undefined;\n\t\t}\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0,\n\t\tmarginDelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\t// Count margin delta separately to only add it after scroll gutter adjustment.\n\t\t// This is needed to make negative margins work with `outerHeight( true )` (gh-3982).\n\t\tif ( box === \"margin\" ) {\n\t\t\tmarginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta + marginDelta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn't suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, \"tr\" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === \"auto\" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\tanimationIterationCount: true,\n\t\taspectRatio: true,\n\t\tborderImageSlice: true,\n\t\tcolumnCount: true,\n\t\tflexGrow: true,\n\t\tflexShrink: true,\n\t\tfontWeight: true,\n\t\tgridArea: true,\n\t\tgridColumn: true,\n\t\tgridColumnEnd: true,\n\t\tgridColumnStart: true,\n\t\tgridRow: true,\n\t\tgridRowEnd: true,\n\t\tgridRowStart: true,\n\t\tlineHeight: true,\n\t\topacity: true,\n\t\torder: true,\n\t\torphans: true,\n\t\tscale: true,\n\t\twidows: true,\n\t\tzIndex: true,\n\t\tzoom: true,\n\n\t\t// SVG-related\n\t\tfillOpacity: true,\n\t\tfloodOpacity: true,\n\t\tstopOpacity: true,\n\t\tstrokeMiterlimit: true,\n\t\tstrokeOpacity: true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (trac-7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug trac-9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (trac-7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t} ) :\n\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\n\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( _i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// Use proper attribute retrieval (trac-12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classNames, cur, curValue, className, i, finalValue;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\tif ( classNames.length ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tcurValue = getClass( this );\n\t\t\t\tcur = this.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\t\tclassName = classNames[ i ];\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + className + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += className + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tthis.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classNames, cur, curValue, className, i, finalValue;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\tif ( classNames.length ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tcurValue = getClass( this );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = this.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\t\tclassName = classNames[ i ];\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + className + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + className + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tthis.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar classNames, className, i, self,\n\t\t\ttype = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\treturn this.each( function() {\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\tself = jQuery( this );\n\n\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\tclassName = classNames[ i ];\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (trac-14686, trac-14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (trac-2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, parserErrorElem;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {}\n\n\tparserErrorElem = xml && xml.getElementsByTagName( \"parsererror\" )[ 0 ];\n\tif ( !xml || parserErrorElem ) {\n\t\tjQuery.error( \"Invalid XML: \" + (\n\t\t\tparserErrorElem ?\n\t\t\t\tjQuery.map( parserErrorElem.childNodes, function( el ) {\n\t\t\t\t\treturn el.textContent;\n\t\t\t\t} ).join( \"\\n\" ) :\n\t\t\t\tdata\n\t\t) );\n\t}\n\treturn xml;\n};\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (trac-9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || Object.create( null ) )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (trac-6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} ).filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} ).map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// trac-7653, trac-8125, trac-8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\noriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes trac-9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\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\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\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}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\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\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (trac-10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket trac-12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// trac-9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Use a noop converter for missing script but not if jsonp\n\t\t\tif ( !isSuccess &&\n\t\t\t\tjQuery.inArray( \"script\", s.dataTypes ) > -1 &&\n\t\t\t\tjQuery.inArray( \"json\", s.dataTypes ) < 0 ) {\n\t\t\t\ts.converters[ \"text script\" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === \"content-type\" ) {\n\t\t\ts.contentType = s.headers[ i ] || \"\";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (trac-11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// trac-1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see trac-8605, trac-14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\"  ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\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\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\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\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// trac-14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" )\n\t\t\t\t\t.attr( s.scriptAttrs || {} )\n\t\t\t\t\t.prop( { charset: s.scriptCharset, src: s.url } )\n\t\t\t\t\t.on( \"load error\", callback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce.guid++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t//    documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( _i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( {\n\t\tpadding: \"inner\" + name,\n\t\tcontent: type,\n\t\t\"\": \"outer\" + name\n\t}, function( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( _i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this\n\t\t\t.on( \"mouseenter\", fnOver )\n\t\t\t.on( \"mouseleave\", fnOut || fnOver );\n\t}\n} );\n\njQuery.each(\n\t( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( _i, name ) {\n\n\t\t// Handle event binding\n\t\tjQuery.fn[ name ] = function( data, fn ) {\n\t\t\treturn arguments.length > 0 ?\n\t\t\t\tthis.on( name, null, data, fn ) :\n\t\t\t\tthis.trigger( name );\n\t\t};\n\t}\n);\n\n\n\n\n// Support: Android <=4.0 only\n// Make sure we trim BOM and NBSP\n// Require that the \"whitespace run\" starts from a non-whitespace\n// to avoid O(N^2) behavior when the engine would try matching \"\\s+$\" at each space position.\nvar rtrim = /^[\\s\\uFEFF\\xA0]+|([^\\s\\uFEFF\\xA0])[\\s\\uFEFF\\xA0]+$/g;\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\njQuery.trim = function( text ) {\n\treturn text == null ?\n\t\t\"\" :\n\t\t( text + \"\" ).replace( rtrim, \"$1\" );\n};\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (trac-13566)\nif ( typeof noGlobal === \"undefined\" ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n", "export default {\n  logger: typeof console !== \"undefined\" ? console : undefined,\n  WebSocket: typeof WebSocket !== \"undefined\" ? WebSocket : undefined,\n}\n", "import adapters from \"./adapters\"\n\n// The logger is disabled by default. You can enable it with:\n//\n//   ActionCable.logger.enabled = true\n//\n//   Example:\n//\n//   import * as ActionCable from '@rails/actioncable'\n//\n//   ActionCable.logger.enabled = true\n//   ActionCable.logger.log('Connection Established.')\n//\n\nexport default {\n  log(...messages) {\n    if (this.enabled) {\n      messages.push(Date.now())\n      adapters.logger.log(\"[ActionCable]\", ...messages)\n    }\n  },\n}\n", "import logger from \"./logger\"\n\n// Responsible for ensuring the cable connection is in good health by validating the heartbeat pings sent from the server, and attempting\n// revival reconnections if things go astray. Internal class, not intended for direct user manipulation.\n\nconst now = () => new Date().getTime()\n\nconst secondsSince = time => (now() - time) / 1000\n\nclass ConnectionMonitor {\n  constructor(connection) {\n    this.visibilityDidChange = this.visibilityDidChange.bind(this)\n    this.connection = connection\n    this.reconnectAttempts = 0\n  }\n\n  start() {\n    if (!this.isRunning()) {\n      this.startedAt = now()\n      delete this.stoppedAt\n      this.startPolling()\n      addEventListener(\"visibilitychange\", this.visibilityDidChange)\n      logger.log(`ConnectionMonitor started. stale threshold = ${this.constructor.staleThreshold} s`)\n    }\n  }\n\n  stop() {\n    if (this.isRunning()) {\n      this.stoppedAt = now()\n      this.stopPolling()\n      removeEventListener(\"visibilitychange\", this.visibilityDidChange)\n      logger.log(\"ConnectionMonitor stopped\")\n    }\n  }\n\n  isRunning() {\n    return this.startedAt && !this.stoppedAt\n  }\n\n  recordMessage() {\n    this.pingedAt = now()\n  }\n\n  recordConnect() {\n    this.reconnectAttempts = 0\n    delete this.disconnectedAt\n    logger.log(\"ConnectionMonitor recorded connect\")\n  }\n\n  recordDisconnect() {\n    this.disconnectedAt = now()\n    logger.log(\"ConnectionMonitor recorded disconnect\")\n  }\n\n  // Private\n\n  startPolling() {\n    this.stopPolling()\n    this.poll()\n  }\n\n  stopPolling() {\n    clearTimeout(this.pollTimeout)\n  }\n\n  poll() {\n    this.pollTimeout = setTimeout(() => {\n      this.reconnectIfStale()\n      this.poll()\n    }\n    , this.getPollInterval())\n  }\n\n  getPollInterval() {\n    const { staleThreshold, reconnectionBackoffRate } = this.constructor\n    const backoff = Math.pow(1 + reconnectionBackoffRate, Math.min(this.reconnectAttempts, 10))\n    const jitterMax = this.reconnectAttempts === 0 ? 1.0 : reconnectionBackoffRate\n    const jitter = jitterMax * Math.random()\n    return staleThreshold * 1000 * backoff * (1 + jitter)\n  }\n\n  reconnectIfStale() {\n    if (this.connectionIsStale()) {\n      logger.log(`ConnectionMonitor detected stale connection. reconnectAttempts = ${this.reconnectAttempts}, time stale = ${secondsSince(this.refreshedAt)} s, stale threshold = ${this.constructor.staleThreshold} s`)\n      this.reconnectAttempts++\n      if (this.disconnectedRecently()) {\n        logger.log(`ConnectionMonitor skipping reopening recent disconnect. time disconnected = ${secondsSince(this.disconnectedAt)} s`)\n      } else {\n        logger.log(\"ConnectionMonitor reopening\")\n        this.connection.reopen()\n      }\n    }\n  }\n\n  get refreshedAt() {\n    return this.pingedAt ? this.pingedAt : this.startedAt\n  }\n\n  connectionIsStale() {\n    return secondsSince(this.refreshedAt) > this.constructor.staleThreshold\n  }\n\n  disconnectedRecently() {\n    return this.disconnectedAt && (secondsSince(this.disconnectedAt) < this.constructor.staleThreshold)\n  }\n\n  visibilityDidChange() {\n    if (document.visibilityState === \"visible\") {\n      setTimeout(() => {\n        if (this.connectionIsStale() || !this.connection.isOpen()) {\n          logger.log(`ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = ${document.visibilityState}`)\n          this.connection.reopen()\n        }\n      }\n      , 200)\n    }\n  }\n\n}\n\nConnectionMonitor.staleThreshold = 6 // Server::Connections::BEAT_INTERVAL * 2 (missed two pings)\nConnectionMonitor.reconnectionBackoffRate = 0.15\n\nexport default ConnectionMonitor\n", "export default {\n  \"message_types\": {\n    \"welcome\": \"welcome\",\n    \"disconnect\": \"disconnect\",\n    \"ping\": \"ping\",\n    \"confirmation\": \"confirm_subscription\",\n    \"rejection\": \"reject_subscription\"\n  },\n  \"disconnect_reasons\": {\n    \"unauthorized\": \"unauthorized\",\n    \"invalid_request\": \"invalid_request\",\n    \"server_restart\": \"server_restart\",\n    \"remote\": \"remote\"\n  },\n  \"default_mount_path\": \"/cable\",\n  \"protocols\": [\n    \"actioncable-v1-json\",\n    \"actioncable-unsupported\"\n  ]\n}\n", "import adapters from \"./adapters\"\nimport ConnectionMonitor from \"./connection_monitor\"\nimport INTERNAL from \"./internal\"\nimport logger from \"./logger\"\n\n// Encapsulate the cable connection held by the consumer. This is an internal class not intended for direct user manipulation.\n\nconst {message_types, protocols} = INTERNAL\nconst supportedProtocols = protocols.slice(0, protocols.length - 1)\n\nconst indexOf = [].indexOf\n\nclass Connection {\n  constructor(consumer) {\n    this.open = this.open.bind(this)\n    this.consumer = consumer\n    this.subscriptions = this.consumer.subscriptions\n    this.monitor = new ConnectionMonitor(this)\n    this.disconnected = true\n  }\n\n  send(data) {\n    if (this.isOpen()) {\n      this.webSocket.send(JSON.stringify(data))\n      return true\n    } else {\n      return false\n    }\n  }\n\n  open() {\n    if (this.isActive()) {\n      logger.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`)\n      return false\n    } else {\n      const socketProtocols = [...protocols, ...this.consumer.subprotocols || []]\n      logger.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${socketProtocols}`)\n      if (this.webSocket) { this.uninstallEventHandlers() }\n      this.webSocket = new adapters.WebSocket(this.consumer.url, socketProtocols)\n      this.installEventHandlers()\n      this.monitor.start()\n      return true\n    }\n  }\n\n  close({allowReconnect} = {allowReconnect: true}) {\n    if (!allowReconnect) { this.monitor.stop() }\n    // Avoid closing websockets in a \"connecting\" state due to Safari 15.1+ bug. See: https://github.com/rails/rails/issues/43835#issuecomment-1002288478\n    if (this.isOpen()) {\n      return this.webSocket.close()\n    }\n  }\n\n  reopen() {\n    logger.log(`Reopening WebSocket, current state is ${this.getState()}`)\n    if (this.isActive()) {\n      try {\n        return this.close()\n      } catch (error) {\n        logger.log(\"Failed to reopen WebSocket\", error)\n      }\n      finally {\n        logger.log(`Reopening WebSocket in ${this.constructor.reopenDelay}ms`)\n        setTimeout(this.open, this.constructor.reopenDelay)\n      }\n    } else {\n      return this.open()\n    }\n  }\n\n  getProtocol() {\n    if (this.webSocket) {\n      return this.webSocket.protocol\n    }\n  }\n\n  isOpen() {\n    return this.isState(\"open\")\n  }\n\n  isActive() {\n    return this.isState(\"open\", \"connecting\")\n  }\n\n  triedToReconnect() {\n    return this.monitor.reconnectAttempts > 0\n  }\n\n  // Private\n\n  isProtocolSupported() {\n    return indexOf.call(supportedProtocols, this.getProtocol()) >= 0\n  }\n\n  isState(...states) {\n    return indexOf.call(states, this.getState()) >= 0\n  }\n\n  getState() {\n    if (this.webSocket) {\n      for (let state in adapters.WebSocket) {\n        if (adapters.WebSocket[state] === this.webSocket.readyState) {\n          return state.toLowerCase()\n        }\n      }\n    }\n    return null\n  }\n\n  installEventHandlers() {\n    for (let eventName in this.events) {\n      const handler = this.events[eventName].bind(this)\n      this.webSocket[`on${eventName}`] = handler\n    }\n  }\n\n  uninstallEventHandlers() {\n    for (let eventName in this.events) {\n      this.webSocket[`on${eventName}`] = function() {}\n    }\n  }\n\n}\n\nConnection.reopenDelay = 500\n\nConnection.prototype.events = {\n  message(event) {\n    if (!this.isProtocolSupported()) { return }\n    const {identifier, message, reason, reconnect, type} = JSON.parse(event.data)\n    this.monitor.recordMessage()\n    switch (type) {\n      case message_types.welcome:\n        if (this.triedToReconnect()) {\n          this.reconnectAttempted = true\n        }\n        this.monitor.recordConnect()\n        return this.subscriptions.reload()\n      case message_types.disconnect:\n        logger.log(`Disconnecting. Reason: ${reason}`)\n        return this.close({allowReconnect: reconnect})\n      case message_types.ping:\n        return null\n      case message_types.confirmation:\n        this.subscriptions.confirmSubscription(identifier)\n        if (this.reconnectAttempted) {\n          this.reconnectAttempted = false\n          return this.subscriptions.notify(identifier, \"connected\", {reconnected: true})\n        } else {\n          return this.subscriptions.notify(identifier, \"connected\", {reconnected: false})\n        }\n      case message_types.rejection:\n        return this.subscriptions.reject(identifier)\n      default:\n        return this.subscriptions.notify(identifier, \"received\", message)\n    }\n  },\n\n  open() {\n    logger.log(`WebSocket onopen event, using '${this.getProtocol()}' subprotocol`)\n    this.disconnected = false\n    if (!this.isProtocolSupported()) {\n      logger.log(\"Protocol is unsupported. Stopping monitor and disconnecting.\")\n      return this.close({allowReconnect: false})\n    }\n  },\n\n  close(event) {\n    logger.log(\"WebSocket onclose event\")\n    if (this.disconnected) { return }\n    this.disconnected = true\n    this.monitor.recordDisconnect()\n    return this.subscriptions.notifyAll(\"disconnected\", {willAttemptReconnect: this.monitor.isRunning()})\n  },\n\n  error() {\n    logger.log(\"WebSocket onerror event\")\n  }\n}\n\nexport default Connection\n", "// A new subscription is created through the ActionCable.Subscriptions instance available on the consumer.\n// It provides a number of callbacks and a method for calling remote procedure calls on the corresponding\n// Channel instance on the server side.\n//\n// An example demonstrates the basic functionality:\n//\n//   App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\", {\n//     connected() {\n//       // Called once the subscription has been successfully completed\n//     },\n//\n//     disconnected({ willAttemptReconnect: boolean }) {\n//       // Called when the client has disconnected with the server.\n//       // The object will have an `willAttemptReconnect` property which\n//       // says whether the client has the intention of attempting\n//       // to reconnect.\n//     },\n//\n//     appear() {\n//       this.perform('appear', {appearing_on: this.appearingOn()})\n//     },\n//\n//     away() {\n//       this.perform('away')\n//     },\n//\n//     appearingOn() {\n//       $('main').data('appearing-on')\n//     }\n//   })\n//\n// The methods #appear and #away forward their intent to the remote AppearanceChannel instance on the server\n// by calling the `perform` method with the first parameter being the action (which maps to AppearanceChannel#appear/away).\n// The second parameter is a hash that'll get JSON encoded and made available on the server in the data parameter.\n//\n// This is how the server component would look:\n//\n//   class AppearanceChannel < ApplicationActionCable::Channel\n//     def subscribed\n//       current_user.appear\n//     end\n//\n//     def unsubscribed\n//       current_user.disappear\n//     end\n//\n//     def appear(data)\n//       current_user.appear on: data['appearing_on']\n//     end\n//\n//     def away\n//       current_user.away\n//     end\n//   end\n//\n// The \"AppearanceChannel\" name is automatically mapped between the client-side subscription creation and the server-side Ruby class name.\n// The AppearanceChannel#appear/away public methods are exposed automatically to client-side invocation through the perform method.\n\nconst extend = function(object, properties) {\n  if (properties != null) {\n    for (let key in properties) {\n      const value = properties[key]\n      object[key] = value\n    }\n  }\n  return object\n}\n\nexport default class Subscription {\n  constructor(consumer, params = {}, mixin) {\n    this.consumer = consumer\n    this.identifier = JSON.stringify(params)\n    extend(this, mixin)\n  }\n\n  // Perform a channel action with the optional data passed as an attribute\n  perform(action, data = {}) {\n    data.action = action\n    return this.send(data)\n  }\n\n  send(data) {\n    return this.consumer.send({command: \"message\", identifier: this.identifier, data: JSON.stringify(data)})\n  }\n\n  unsubscribe() {\n    return this.consumer.subscriptions.remove(this)\n  }\n}\n", "import logger from \"./logger\"\n\n// Responsible for ensuring channel subscribe command is confirmed, retrying until confirmation is received.\n// Internal class, not intended for direct user manipulation.\n\nclass SubscriptionGuarantor {\n  constructor(subscriptions) {\n    this.subscriptions = subscriptions\n    this.pendingSubscriptions = []\n  }\n\n  guarantee(subscription) {\n    if(this.pendingSubscriptions.indexOf(subscription) == -1){ \n      logger.log(`SubscriptionGuarantor guaranteeing ${subscription.identifier}`)\n      this.pendingSubscriptions.push(subscription) \n    }\n    else {\n      logger.log(`SubscriptionGuarantor already guaranteeing ${subscription.identifier}`)\n    }\n    this.startGuaranteeing()\n  }\n\n  forget(subscription) {\n    logger.log(`SubscriptionGuarantor forgetting ${subscription.identifier}`)\n    this.pendingSubscriptions = (this.pendingSubscriptions.filter((s) => s !== subscription))\n  }\n\n  startGuaranteeing() {\n    this.stopGuaranteeing()\n    this.retrySubscribing()\n  }\n  \n  stopGuaranteeing() {\n    clearTimeout(this.retryTimeout)\n  }\n\n  retrySubscribing() {\n    this.retryTimeout = setTimeout(() => {\n      if (this.subscriptions && typeof(this.subscriptions.subscribe) === \"function\") {\n        this.pendingSubscriptions.map((subscription) => {\n          logger.log(`SubscriptionGuarantor resubscribing ${subscription.identifier}`)\n          this.subscriptions.subscribe(subscription)\n        })\n      }\n    }\n    , 500)\n  }\n}\n\nexport default SubscriptionGuarantor", "import logger from \"./logger\"\nimport Subscription from \"./subscription\"\nimport SubscriptionGuarantor from \"./subscription_guarantor\"\n\n// Collection class for creating (and internally managing) channel subscriptions.\n// The only method intended to be triggered by the user is ActionCable.Subscriptions#create,\n// and it should be called through the consumer like so:\n//\n//   App = {}\n//   App.cable = ActionCable.createConsumer(\"ws://example.com/accounts/1\")\n//   App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\")\n//\n// For more details on how you'd configure an actual channel subscription, see ActionCable.Subscription.\n\nexport default class Subscriptions {\n  constructor(consumer) {\n    this.consumer = consumer\n    this.guarantor = new SubscriptionGuarantor(this)\n    this.subscriptions = []\n  }\n\n  create(channelName, mixin) {\n    const channel = channelName\n    const params = typeof channel === \"object\" ? channel : {channel}\n    const subscription = new Subscription(this.consumer, params, mixin)\n    return this.add(subscription)\n  }\n\n  // Private\n\n  add(subscription) {\n    this.subscriptions.push(subscription)\n    this.consumer.ensureActiveConnection()\n    this.notify(subscription, \"initialized\")\n    this.subscribe(subscription)\n    return subscription\n  }\n\n  remove(subscription) {\n    this.forget(subscription)\n    if (!this.findAll(subscription.identifier).length) {\n      this.sendCommand(subscription, \"unsubscribe\")\n    }\n    return subscription\n  }\n\n  reject(identifier) {\n    return this.findAll(identifier).map((subscription) => {\n      this.forget(subscription)\n      this.notify(subscription, \"rejected\")\n      return subscription\n    })\n  }\n\n  forget(subscription) {\n    this.guarantor.forget(subscription)\n    this.subscriptions = (this.subscriptions.filter((s) => s !== subscription))\n    return subscription\n  }\n\n  findAll(identifier) {\n    return this.subscriptions.filter((s) => s.identifier === identifier)\n  }\n\n  reload() {\n    return this.subscriptions.map((subscription) =>\n      this.subscribe(subscription))\n  }\n\n  notifyAll(callbackName, ...args) {\n    return this.subscriptions.map((subscription) =>\n      this.notify(subscription, callbackName, ...args))\n  }\n\n  notify(subscription, callbackName, ...args) {\n    let subscriptions\n    if (typeof subscription === \"string\") {\n      subscriptions = this.findAll(subscription)\n    } else {\n      subscriptions = [subscription]\n    }\n\n    return subscriptions.map((subscription) =>\n      (typeof subscription[callbackName] === \"function\" ? subscription[callbackName](...args) : undefined))\n  }\n\n  subscribe(subscription) {\n    if (this.sendCommand(subscription, \"subscribe\")) {\n      this.guarantor.guarantee(subscription)\n    }\n  }\n\n  confirmSubscription(identifier) {\n    logger.log(`Subscription confirmed ${identifier}`)\n    this.findAll(identifier).map((subscription) =>\n      this.guarantor.forget(subscription))\n  }\n\n  sendCommand(subscription, command) {\n    const {identifier} = subscription\n    return this.consumer.send({command, identifier})\n  }\n}\n", "import Connection from \"./connection\"\nimport Subscriptions from \"./subscriptions\"\n\n// The ActionCable.Consumer establishes the connection to a server-side Ruby Connection object. Once established,\n// the ActionCable.ConnectionMonitor will ensure that its properly maintained through heartbeats and checking for stale updates.\n// The Consumer instance is also the gateway to establishing subscriptions to desired channels through the #createSubscription\n// method.\n//\n// The following example shows how this can be set up:\n//\n//   App = {}\n//   App.cable = ActionCable.createConsumer(\"ws://example.com/accounts/1\")\n//   App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\")\n//\n// For more details on how you'd configure an actual channel subscription, see ActionCable.Subscription.\n//\n// When a consumer is created, it automatically connects with the server.\n//\n// To disconnect from the server, call\n//\n//   App.cable.disconnect()\n//\n// and to restart the connection:\n//\n//   App.cable.connect()\n//\n// Any channel subscriptions which existed prior to disconnecting will\n// automatically resubscribe.\n\nexport default class Consumer {\n  constructor(url) {\n    this._url = url\n    this.subscriptions = new Subscriptions(this)\n    this.connection = new Connection(this)\n    this.subprotocols = []\n  }\n\n  get url() {\n    return createWebSocketURL(this._url)\n  }\n\n  send(data) {\n    return this.connection.send(data)\n  }\n\n  connect() {\n    return this.connection.open()\n  }\n\n  disconnect() {\n    return this.connection.close({allowReconnect: false})\n  }\n\n  ensureActiveConnection() {\n    if (!this.connection.isActive()) {\n      return this.connection.open()\n    }\n  }\n\n  addSubProtocol(subprotocol) {\n    this.subprotocols = [...this.subprotocols, subprotocol]\n  }\n}\n\nexport function createWebSocketURL(url) {\n  if (typeof url === \"function\") {\n    url = url()\n  }\n\n  if (url && !/^wss?:/i.test(url)) {\n    const a = document.createElement(\"a\")\n    a.href = url\n    // Fix populating Location properties in IE. Otherwise, protocol will be blank.\n    a.href = a.href // eslint-disable-line\n    a.protocol = a.protocol.replace(\"http\", \"ws\")\n    return a.href\n  } else {\n    return url\n  }\n}\n", "import adapters from \"./adapters\"\nimport Connection from \"./connection\"\nimport ConnectionMonitor from \"./connection_monitor\"\nimport Consumer, { createWebSocketURL } from \"./consumer\"\nimport INTERNAL from \"./internal\"\nimport logger from \"./logger\"\nimport Subscription from \"./subscription\"\nimport SubscriptionGuarantor from \"./subscription_guarantor\"\nimport Subscriptions from \"./subscriptions\"\n\nexport {\n  Connection,\n  ConnectionMonitor,\n  Consumer,\n  INTERNAL,\n  Subscription,\n  Subscriptions,\n  SubscriptionGuarantor,\n  adapters,\n  createWebSocketURL,\n  logger,\n}\n\nexport function createConsumer(url = getConfig(\"url\") || INTERNAL.default_mount_path) {\n  return new Consumer(url)\n}\n\nexport function getConfig(name) {\n  const element = document.head.querySelector(`meta[name='action-cable-${name}']`)\n  if (element) {\n    return element.getAttribute(\"content\")\n  }\n}\n", "/*!\n *  howler.js v2.2.4\n *  howlerjs.com\n *\n *  (c) 2013-2020, James Simpson of GoldFire Studios\n *  goldfirestudios.com\n *\n *  MIT License\n */\n\n(function() {\n\n  'use strict';\n\n  /** Global Methods **/\n  /***************************************************************************/\n\n  /**\n   * Create the global controller. All contained methods and properties apply\n   * to all sounds that are currently playing or will be in the future.\n   */\n  var HowlerGlobal = function() {\n    this.init();\n  };\n  HowlerGlobal.prototype = {\n    /**\n     * Initialize the global Howler object.\n     * @return {Howler}\n     */\n    init: function() {\n      var self = this || Howler;\n\n      // Create a global ID counter.\n      self._counter = 1000;\n\n      // Pool of unlocked HTML5 Audio objects.\n      self._html5AudioPool = [];\n      self.html5PoolSize = 10;\n\n      // Internal properties.\n      self._codecs = {};\n      self._howls = [];\n      self._muted = false;\n      self._volume = 1;\n      self._canPlayEvent = 'canplaythrough';\n      self._navigator = (typeof window !== 'undefined' && window.navigator) ? window.navigator : null;\n\n      // Public properties.\n      self.masterGain = null;\n      self.noAudio = false;\n      self.usingWebAudio = true;\n      self.autoSuspend = true;\n      self.ctx = null;\n\n      // Set to false to disable the auto audio unlocker.\n      self.autoUnlock = true;\n\n      // Setup the various state values for global tracking.\n      self._setup();\n\n      return self;\n    },\n\n    /**\n     * Get/set the global volume for all sounds.\n     * @param  {Float} vol Volume from 0.0 to 1.0.\n     * @return {Howler/Float}     Returns self or current volume.\n     */\n    volume: function(vol) {\n      var self = this || Howler;\n      vol = parseFloat(vol);\n\n      // If we don't have an AudioContext created yet, run the setup.\n      if (!self.ctx) {\n        setupAudioContext();\n      }\n\n      if (typeof vol !== 'undefined' && vol >= 0 && vol <= 1) {\n        self._volume = vol;\n\n        // Don't update any of the nodes if we are muted.\n        if (self._muted) {\n          return self;\n        }\n\n        // When using Web Audio, we just need to adjust the master gain.\n        if (self.usingWebAudio) {\n          self.masterGain.gain.setValueAtTime(vol, Howler.ctx.currentTime);\n        }\n\n        // Loop through and change volume for all HTML5 audio nodes.\n        for (var i=0; i<self._howls.length; i++) {\n          if (!self._howls[i]._webAudio) {\n            // Get all of the sounds in this Howl group.\n            var ids = self._howls[i]._getSoundIds();\n\n            // Loop through all sounds and change the volumes.\n            for (var j=0; j<ids.length; j++) {\n              var sound = self._howls[i]._soundById(ids[j]);\n\n              if (sound && sound._node) {\n                sound._node.volume = sound._volume * vol;\n              }\n            }\n          }\n        }\n\n        return self;\n      }\n\n      return self._volume;\n    },\n\n    /**\n     * Handle muting and unmuting globally.\n     * @param  {Boolean} muted Is muted or not.\n     */\n    mute: function(muted) {\n      var self = this || Howler;\n\n      // If we don't have an AudioContext created yet, run the setup.\n      if (!self.ctx) {\n        setupAudioContext();\n      }\n\n      self._muted = muted;\n\n      // With Web Audio, we just need to mute the master gain.\n      if (self.usingWebAudio) {\n        self.masterGain.gain.setValueAtTime(muted ? 0 : self._volume, Howler.ctx.currentTime);\n      }\n\n      // Loop through and mute all HTML5 Audio nodes.\n      for (var i=0; i<self._howls.length; i++) {\n        if (!self._howls[i]._webAudio) {\n          // Get all of the sounds in this Howl group.\n          var ids = self._howls[i]._getSoundIds();\n\n          // Loop through all sounds and mark the audio node as muted.\n          for (var j=0; j<ids.length; j++) {\n            var sound = self._howls[i]._soundById(ids[j]);\n\n            if (sound && sound._node) {\n              sound._node.muted = (muted) ? true : sound._muted;\n            }\n          }\n        }\n      }\n\n      return self;\n    },\n\n    /**\n     * Handle stopping all sounds globally.\n     */\n    stop: function() {\n      var self = this || Howler;\n\n      // Loop through all Howls and stop them.\n      for (var i=0; i<self._howls.length; i++) {\n        self._howls[i].stop();\n      }\n\n      return self;\n    },\n\n    /**\n     * Unload and destroy all currently loaded Howl objects.\n     * @return {Howler}\n     */\n    unload: function() {\n      var self = this || Howler;\n\n      for (var i=self._howls.length-1; i>=0; i--) {\n        self._howls[i].unload();\n      }\n\n      // Create a new AudioContext to make sure it is fully reset.\n      if (self.usingWebAudio && self.ctx && typeof self.ctx.close !== 'undefined') {\n        self.ctx.close();\n        self.ctx = null;\n        setupAudioContext();\n      }\n\n      return self;\n    },\n\n    /**\n     * Check for codec support of specific extension.\n     * @param  {String} ext Audio file extention.\n     * @return {Boolean}\n     */\n    codecs: function(ext) {\n      return (this || Howler)._codecs[ext.replace(/^x-/, '')];\n    },\n\n    /**\n     * Setup various state values for global tracking.\n     * @return {Howler}\n     */\n    _setup: function() {\n      var self = this || Howler;\n\n      // Keeps track of the suspend/resume state of the AudioContext.\n      self.state = self.ctx ? self.ctx.state || 'suspended' : 'suspended';\n\n      // Automatically begin the 30-second suspend process\n      self._autoSuspend();\n\n      // Check if audio is available.\n      if (!self.usingWebAudio) {\n        // No audio is available on this system if noAudio is set to true.\n        if (typeof Audio !== 'undefined') {\n          try {\n            var test = new Audio();\n\n            // Check if the canplaythrough event is available.\n            if (typeof test.oncanplaythrough === 'undefined') {\n              self._canPlayEvent = 'canplay';\n            }\n          } catch(e) {\n            self.noAudio = true;\n          }\n        } else {\n          self.noAudio = true;\n        }\n      }\n\n      // Test to make sure audio isn't disabled in Internet Explorer.\n      try {\n        var test = new Audio();\n        if (test.muted) {\n          self.noAudio = true;\n        }\n      } catch (e) {}\n\n      // Check for supported codecs.\n      if (!self.noAudio) {\n        self._setupCodecs();\n      }\n\n      return self;\n    },\n\n    /**\n     * Check for browser support for various codecs and cache the results.\n     * @return {Howler}\n     */\n    _setupCodecs: function() {\n      var self = this || Howler;\n      var audioTest = null;\n\n      // Must wrap in a try/catch because IE11 in server mode throws an error.\n      try {\n        audioTest = (typeof Audio !== 'undefined') ? new Audio() : null;\n      } catch (err) {\n        return self;\n      }\n\n      if (!audioTest || typeof audioTest.canPlayType !== 'function') {\n        return self;\n      }\n\n      var mpegTest = audioTest.canPlayType('audio/mpeg;').replace(/^no$/, '');\n\n      // Opera version <33 has mixed MP3 support, so we need to check for and block it.\n      var ua = self._navigator ? self._navigator.userAgent : '';\n      var checkOpera = ua.match(/OPR\\/(\\d+)/g);\n      var isOldOpera = (checkOpera && parseInt(checkOpera[0].split('/')[1], 10) < 33);\n      var checkSafari = ua.indexOf('Safari') !== -1 && ua.indexOf('Chrome') === -1;\n      var safariVersion = ua.match(/Version\\/(.*?) /);\n      var isOldSafari = (checkSafari && safariVersion && parseInt(safariVersion[1], 10) < 15);\n\n      self._codecs = {\n        mp3: !!(!isOldOpera && (mpegTest || audioTest.canPlayType('audio/mp3;').replace(/^no$/, ''))),\n        mpeg: !!mpegTest,\n        opus: !!audioTest.canPlayType('audio/ogg; codecs=\"opus\"').replace(/^no$/, ''),\n        ogg: !!audioTest.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/, ''),\n        oga: !!audioTest.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/, ''),\n        wav: !!(audioTest.canPlayType('audio/wav; codecs=\"1\"') || audioTest.canPlayType('audio/wav')).replace(/^no$/, ''),\n        aac: !!audioTest.canPlayType('audio/aac;').replace(/^no$/, ''),\n        caf: !!audioTest.canPlayType('audio/x-caf;').replace(/^no$/, ''),\n        m4a: !!(audioTest.canPlayType('audio/x-m4a;') || audioTest.canPlayType('audio/m4a;') || audioTest.canPlayType('audio/aac;')).replace(/^no$/, ''),\n        m4b: !!(audioTest.canPlayType('audio/x-m4b;') || audioTest.canPlayType('audio/m4b;') || audioTest.canPlayType('audio/aac;')).replace(/^no$/, ''),\n        mp4: !!(audioTest.canPlayType('audio/x-mp4;') || audioTest.canPlayType('audio/mp4;') || audioTest.canPlayType('audio/aac;')).replace(/^no$/, ''),\n        weba: !!(!isOldSafari && audioTest.canPlayType('audio/webm; codecs=\"vorbis\"').replace(/^no$/, '')),\n        webm: !!(!isOldSafari && audioTest.canPlayType('audio/webm; codecs=\"vorbis\"').replace(/^no$/, '')),\n        dolby: !!audioTest.canPlayType('audio/mp4; codecs=\"ec-3\"').replace(/^no$/, ''),\n        flac: !!(audioTest.canPlayType('audio/x-flac;') || audioTest.canPlayType('audio/flac;')).replace(/^no$/, '')\n      };\n\n      return self;\n    },\n\n    /**\n     * Some browsers/devices will only allow audio to be played after a user interaction.\n     * Attempt to automatically unlock audio on the first user interaction.\n     * Concept from: http://paulbakaus.com/tutorials/html5/web-audio-on-ios/\n     * @return {Howler}\n     */\n    _unlockAudio: function() {\n      var self = this || Howler;\n\n      // Only run this if Web Audio is supported and it hasn't already been unlocked.\n      if (self._audioUnlocked || !self.ctx) {\n        return;\n      }\n\n      self._audioUnlocked = false;\n      self.autoUnlock = false;\n\n      // Some mobile devices/platforms have distortion issues when opening/closing tabs and/or web views.\n      // Bugs in the browser (especially Mobile Safari) can cause the sampleRate to change from 44100 to 48000.\n      // By calling Howler.unload(), we create a new AudioContext with the correct sampleRate.\n      if (!self._mobileUnloaded && self.ctx.sampleRate !== 44100) {\n        self._mobileUnloaded = true;\n        self.unload();\n      }\n\n      // Scratch buffer for enabling iOS to dispose of web audio buffers correctly, as per:\n      // http://stackoverflow.com/questions/24119684\n      self._scratchBuffer = self.ctx.createBuffer(1, 1, 22050);\n\n      // Call this method on touch start to create and play a buffer,\n      // then check if the audio actually played to determine if\n      // audio has now been unlocked on iOS, Android, etc.\n      var unlock = function(e) {\n        // Create a pool of unlocked HTML5 Audio objects that can\n        // be used for playing sounds without user interaction. HTML5\n        // Audio objects must be individually unlocked, as opposed\n        // to the WebAudio API which only needs a single activation.\n        // This must occur before WebAudio setup or the source.onended\n        // event will not fire.\n        while (self._html5AudioPool.length < self.html5PoolSize) {\n          try {\n            var audioNode = new Audio();\n\n            // Mark this Audio object as unlocked to ensure it can get returned\n            // to the unlocked pool when released.\n            audioNode._unlocked = true;\n\n            // Add the audio node to the pool.\n            self._releaseHtml5Audio(audioNode);\n          } catch (e) {\n            self.noAudio = true;\n            break;\n          }\n        }\n\n        // Loop through any assigned audio nodes and unlock them.\n        for (var i=0; i<self._howls.length; i++) {\n          if (!self._howls[i]._webAudio) {\n            // Get all of the sounds in this Howl group.\n            var ids = self._howls[i]._getSoundIds();\n\n            // Loop through all sounds and unlock the audio nodes.\n            for (var j=0; j<ids.length; j++) {\n              var sound = self._howls[i]._soundById(ids[j]);\n\n              if (sound && sound._node && !sound._node._unlocked) {\n                sound._node._unlocked = true;\n                sound._node.load();\n              }\n            }\n          }\n        }\n\n        // Fix Android can not play in suspend state.\n        self._autoResume();\n\n        // Create an empty buffer.\n        var source = self.ctx.createBufferSource();\n        source.buffer = self._scratchBuffer;\n        source.connect(self.ctx.destination);\n\n        // Play the empty buffer.\n        if (typeof source.start === 'undefined') {\n          source.noteOn(0);\n        } else {\n          source.start(0);\n        }\n\n        // Calling resume() on a stack initiated by user gesture is what actually unlocks the audio on Android Chrome >= 55.\n        if (typeof self.ctx.resume === 'function') {\n          self.ctx.resume();\n        }\n\n        // Setup a timeout to check that we are unlocked on the next event loop.\n        source.onended = function() {\n          source.disconnect(0);\n\n          // Update the unlocked state and prevent this check from happening again.\n          self._audioUnlocked = true;\n\n          // Remove the touch start listener.\n          document.removeEventListener('touchstart', unlock, true);\n          document.removeEventListener('touchend', unlock, true);\n          document.removeEventListener('click', unlock, true);\n          document.removeEventListener('keydown', unlock, true);\n\n          // Let all sounds know that audio has been unlocked.\n          for (var i=0; i<self._howls.length; i++) {\n            self._howls[i]._emit('unlock');\n          }\n        };\n      };\n\n      // Setup a touch start listener to attempt an unlock in.\n      document.addEventListener('touchstart', unlock, true);\n      document.addEventListener('touchend', unlock, true);\n      document.addEventListener('click', unlock, true);\n      document.addEventListener('keydown', unlock, true);\n\n      return self;\n    },\n\n    /**\n     * Get an unlocked HTML5 Audio object from the pool. If none are left,\n     * return a new Audio object and throw a warning.\n     * @return {Audio} HTML5 Audio object.\n     */\n    _obtainHtml5Audio: function() {\n      var self = this || Howler;\n\n      // Return the next object from the pool if one exists.\n      if (self._html5AudioPool.length) {\n        return self._html5AudioPool.pop();\n      }\n\n      //.Check if the audio is locked and throw a warning.\n      var testPlay = new Audio().play();\n      if (testPlay && typeof Promise !== 'undefined' && (testPlay instanceof Promise || typeof testPlay.then === 'function')) {\n        testPlay.catch(function() {\n          console.warn('HTML5 Audio pool exhausted, returning potentially locked audio object.');\n        });\n      }\n\n      return new Audio();\n    },\n\n    /**\n     * Return an activated HTML5 Audio object to the pool.\n     * @return {Howler}\n     */\n    _releaseHtml5Audio: function(audio) {\n      var self = this || Howler;\n\n      // Don't add audio to the pool if we don't know if it has been unlocked.\n      if (audio._unlocked) {\n        self._html5AudioPool.push(audio);\n      }\n\n      return self;\n    },\n\n    /**\n     * Automatically suspend the Web Audio AudioContext after no sound has played for 30 seconds.\n     * This saves processing/energy and fixes various browser-specific bugs with audio getting stuck.\n     * @return {Howler}\n     */\n    _autoSuspend: function() {\n      var self = this;\n\n      if (!self.autoSuspend || !self.ctx || typeof self.ctx.suspend === 'undefined' || !Howler.usingWebAudio) {\n        return;\n      }\n\n      // Check if any sounds are playing.\n      for (var i=0; i<self._howls.length; i++) {\n        if (self._howls[i]._webAudio) {\n          for (var j=0; j<self._howls[i]._sounds.length; j++) {\n            if (!self._howls[i]._sounds[j]._paused) {\n              return self;\n            }\n          }\n        }\n      }\n\n      if (self._suspendTimer) {\n        clearTimeout(self._suspendTimer);\n      }\n\n      // If no sound has played after 30 seconds, suspend the context.\n      self._suspendTimer = setTimeout(function() {\n        if (!self.autoSuspend) {\n          return;\n        }\n\n        self._suspendTimer = null;\n        self.state = 'suspending';\n\n        // Handle updating the state of the audio context after suspending.\n        var handleSuspension = function() {\n          self.state = 'suspended';\n\n          if (self._resumeAfterSuspend) {\n            delete self._resumeAfterSuspend;\n            self._autoResume();\n          }\n        };\n\n        // Either the state gets suspended or it is interrupted.\n        // Either way, we need to update the state to suspended.\n        self.ctx.suspend().then(handleSuspension, handleSuspension);\n      }, 30000);\n\n      return self;\n    },\n\n    /**\n     * Automatically resume the Web Audio AudioContext when a new sound is played.\n     * @return {Howler}\n     */\n    _autoResume: function() {\n      var self = this;\n\n      if (!self.ctx || typeof self.ctx.resume === 'undefined' || !Howler.usingWebAudio) {\n        return;\n      }\n\n      if (self.state === 'running' && self.ctx.state !== 'interrupted' && self._suspendTimer) {\n        clearTimeout(self._suspendTimer);\n        self._suspendTimer = null;\n      } else if (self.state === 'suspended' || self.state === 'running' && self.ctx.state === 'interrupted') {\n        self.ctx.resume().then(function() {\n          self.state = 'running';\n\n          // Emit to all Howls that the audio has resumed.\n          for (var i=0; i<self._howls.length; i++) {\n            self._howls[i]._emit('resume');\n          }\n        });\n\n        if (self._suspendTimer) {\n          clearTimeout(self._suspendTimer);\n          self._suspendTimer = null;\n        }\n      } else if (self.state === 'suspending') {\n        self._resumeAfterSuspend = true;\n      }\n\n      return self;\n    }\n  };\n\n  // Setup the global audio controller.\n  var Howler = new HowlerGlobal();\n\n  /** Group Methods **/\n  /***************************************************************************/\n\n  /**\n   * Create an audio group controller.\n   * @param {Object} o Passed in properties for this group.\n   */\n  var Howl = function(o) {\n    var self = this;\n\n    // Throw an error if no source is provided.\n    if (!o.src || o.src.length === 0) {\n      console.error('An array of source files must be passed with any new Howl.');\n      return;\n    }\n\n    self.init(o);\n  };\n  Howl.prototype = {\n    /**\n     * Initialize a new Howl group object.\n     * @param  {Object} o Passed in properties for this group.\n     * @return {Howl}\n     */\n    init: function(o) {\n      var self = this;\n\n      // If we don't have an AudioContext created yet, run the setup.\n      if (!Howler.ctx) {\n        setupAudioContext();\n      }\n\n      // Setup user-defined default properties.\n      self._autoplay = o.autoplay || false;\n      self._format = (typeof o.format !== 'string') ? o.format : [o.format];\n      self._html5 = o.html5 || false;\n      self._muted = o.mute || false;\n      self._loop = o.loop || false;\n      self._pool = o.pool || 5;\n      self._preload = (typeof o.preload === 'boolean' || o.preload === 'metadata') ? o.preload : true;\n      self._rate = o.rate || 1;\n      self._sprite = o.sprite || {};\n      self._src = (typeof o.src !== 'string') ? o.src : [o.src];\n      self._volume = o.volume !== undefined ? o.volume : 1;\n      self._xhr = {\n        method: o.xhr && o.xhr.method ? o.xhr.method : 'GET',\n        headers: o.xhr && o.xhr.headers ? o.xhr.headers : null,\n        withCredentials: o.xhr && o.xhr.withCredentials ? o.xhr.withCredentials : false,\n      };\n\n      // Setup all other default properties.\n      self._duration = 0;\n      self._state = 'unloaded';\n      self._sounds = [];\n      self._endTimers = {};\n      self._queue = [];\n      self._playLock = false;\n\n      // Setup event listeners.\n      self._onend = o.onend ? [{fn: o.onend}] : [];\n      self._onfade = o.onfade ? [{fn: o.onfade}] : [];\n      self._onload = o.onload ? [{fn: o.onload}] : [];\n      self._onloaderror = o.onloaderror ? [{fn: o.onloaderror}] : [];\n      self._onplayerror = o.onplayerror ? [{fn: o.onplayerror}] : [];\n      self._onpause = o.onpause ? [{fn: o.onpause}] : [];\n      self._onplay = o.onplay ? [{fn: o.onplay}] : [];\n      self._onstop = o.onstop ? [{fn: o.onstop}] : [];\n      self._onmute = o.onmute ? [{fn: o.onmute}] : [];\n      self._onvolume = o.onvolume ? [{fn: o.onvolume}] : [];\n      self._onrate = o.onrate ? [{fn: o.onrate}] : [];\n      self._onseek = o.onseek ? [{fn: o.onseek}] : [];\n      self._onunlock = o.onunlock ? [{fn: o.onunlock}] : [];\n      self._onresume = [];\n\n      // Web Audio or HTML5 Audio?\n      self._webAudio = Howler.usingWebAudio && !self._html5;\n\n      // Automatically try to enable audio.\n      if (typeof Howler.ctx !== 'undefined' && Howler.ctx && Howler.autoUnlock) {\n        Howler._unlockAudio();\n      }\n\n      // Keep track of this Howl group in the global controller.\n      Howler._howls.push(self);\n\n      // If they selected autoplay, add a play event to the load queue.\n      if (self._autoplay) {\n        self._queue.push({\n          event: 'play',\n          action: function() {\n            self.play();\n          }\n        });\n      }\n\n      // Load the source file unless otherwise specified.\n      if (self._preload && self._preload !== 'none') {\n        self.load();\n      }\n\n      return self;\n    },\n\n    /**\n     * Load the audio file.\n     * @return {Howler}\n     */\n    load: function() {\n      var self = this;\n      var url = null;\n\n      // If no audio is available, quit immediately.\n      if (Howler.noAudio) {\n        self._emit('loaderror', null, 'No audio support.');\n        return;\n      }\n\n      // Make sure our source is in an array.\n      if (typeof self._src === 'string') {\n        self._src = [self._src];\n      }\n\n      // Loop through the sources and pick the first one that is compatible.\n      for (var i=0; i<self._src.length; i++) {\n        var ext, str;\n\n        if (self._format && self._format[i]) {\n          // If an extension was specified, use that instead.\n          ext = self._format[i];\n        } else {\n          // Make sure the source is a string.\n          str = self._src[i];\n          if (typeof str !== 'string') {\n            self._emit('loaderror', null, 'Non-string found in selected audio sources - ignoring.');\n            continue;\n          }\n\n          // Extract the file extension from the URL or base64 data URI.\n          ext = /^data:audio\\/([^;,]+);/i.exec(str);\n          if (!ext) {\n            ext = /\\.([^.]+)$/.exec(str.split('?', 1)[0]);\n          }\n\n          if (ext) {\n            ext = ext[1].toLowerCase();\n          }\n        }\n\n        // Log a warning if no extension was found.\n        if (!ext) {\n          console.warn('No file extension was found. Consider using the \"format\" property or specify an extension.');\n        }\n\n        // Check if this extension is available.\n        if (ext && Howler.codecs(ext)) {\n          url = self._src[i];\n          break;\n        }\n      }\n\n      if (!url) {\n        self._emit('loaderror', null, 'No codec support for selected audio sources.');\n        return;\n      }\n\n      self._src = url;\n      self._state = 'loading';\n\n      // If the hosting page is HTTPS and the source isn't,\n      // drop down to HTML5 Audio to avoid Mixed Content errors.\n      if (window.location.protocol === 'https:' && url.slice(0, 5) === 'http:') {\n        self._html5 = true;\n        self._webAudio = false;\n      }\n\n      // Create a new sound object and add it to the pool.\n      new Sound(self);\n\n      // Load and decode the audio data for playback.\n      if (self._webAudio) {\n        loadBuffer(self);\n      }\n\n      return self;\n    },\n\n    /**\n     * Play a sound or resume previous playback.\n     * @param  {String/Number} sprite   Sprite name for sprite playback or sound id to continue previous.\n     * @param  {Boolean} internal Internal Use: true prevents event firing.\n     * @return {Number}          Sound ID.\n     */\n    play: function(sprite, internal) {\n      var self = this;\n      var id = null;\n\n      // Determine if a sprite, sound id or nothing was passed\n      if (typeof sprite === 'number') {\n        id = sprite;\n        sprite = null;\n      } else if (typeof sprite === 'string' && self._state === 'loaded' && !self._sprite[sprite]) {\n        // If the passed sprite doesn't exist, do nothing.\n        return null;\n      } else if (typeof sprite === 'undefined') {\n        // Use the default sound sprite (plays the full audio length).\n        sprite = '__default';\n\n        // Check if there is a single paused sound that isn't ended.\n        // If there is, play that sound. If not, continue as usual.\n        if (!self._playLock) {\n          var num = 0;\n          for (var i=0; i<self._sounds.length; i++) {\n            if (self._sounds[i]._paused && !self._sounds[i]._ended) {\n              num++;\n              id = self._sounds[i]._id;\n            }\n          }\n\n          if (num === 1) {\n            sprite = null;\n          } else {\n            id = null;\n          }\n        }\n      }\n\n      // Get the selected node, or get one from the pool.\n      var sound = id ? self._soundById(id) : self._inactiveSound();\n\n      // If the sound doesn't exist, do nothing.\n      if (!sound) {\n        return null;\n      }\n\n      // Select the sprite definition.\n      if (id && !sprite) {\n        sprite = sound._sprite || '__default';\n      }\n\n      // If the sound hasn't loaded, we must wait to get the audio's duration.\n      // We also need to wait to make sure we don't run into race conditions with\n      // the order of function calls.\n      if (self._state !== 'loaded') {\n        // Set the sprite value on this sound.\n        sound._sprite = sprite;\n\n        // Mark this sound as not ended in case another sound is played before this one loads.\n        sound._ended = false;\n\n        // Add the sound to the queue to be played on load.\n        var soundId = sound._id;\n        self._queue.push({\n          event: 'play',\n          action: function() {\n            self.play(soundId);\n          }\n        });\n\n        return soundId;\n      }\n\n      // Don't play the sound if an id was passed and it is already playing.\n      if (id && !sound._paused) {\n        // Trigger the play event, in order to keep iterating through queue.\n        if (!internal) {\n          self._loadQueue('play');\n        }\n\n        return sound._id;\n      }\n\n      // Make sure the AudioContext isn't suspended, and resume it if it is.\n      if (self._webAudio) {\n        Howler._autoResume();\n      }\n\n      // Determine how long to play for and where to start playing.\n      var seek = Math.max(0, sound._seek > 0 ? sound._seek : self._sprite[sprite][0] / 1000);\n      var duration = Math.max(0, ((self._sprite[sprite][0] + self._sprite[sprite][1]) / 1000) - seek);\n      var timeout = (duration * 1000) / Math.abs(sound._rate);\n      var start = self._sprite[sprite][0] / 1000;\n      var stop = (self._sprite[sprite][0] + self._sprite[sprite][1]) / 1000;\n      sound._sprite = sprite;\n\n      // Mark the sound as ended instantly so that this async playback\n      // doesn't get grabbed by another call to play while this one waits to start.\n      sound._ended = false;\n\n      // Update the parameters of the sound.\n      var setParams = function() {\n        sound._paused = false;\n        sound._seek = seek;\n        sound._start = start;\n        sound._stop = stop;\n        sound._loop = !!(sound._loop || self._sprite[sprite][2]);\n      };\n\n      // End the sound instantly if seek is at the end.\n      if (seek >= stop) {\n        self._ended(sound);\n        return;\n      }\n\n      // Begin the actual playback.\n      var node = sound._node;\n      if (self._webAudio) {\n        // Fire this when the sound is ready to play to begin Web Audio playback.\n        var playWebAudio = function() {\n          self._playLock = false;\n          setParams();\n          self._refreshBuffer(sound);\n\n          // Setup the playback params.\n          var vol = (sound._muted || self._muted) ? 0 : sound._volume;\n          node.gain.setValueAtTime(vol, Howler.ctx.currentTime);\n          sound._playStart = Howler.ctx.currentTime;\n\n          // Play the sound using the supported method.\n          if (typeof node.bufferSource.start === 'undefined') {\n            sound._loop ? node.bufferSource.noteGrainOn(0, seek, 86400) : node.bufferSource.noteGrainOn(0, seek, duration);\n          } else {\n            sound._loop ? node.bufferSource.start(0, seek, 86400) : node.bufferSource.start(0, seek, duration);\n          }\n\n          // Start a new timer if none is present.\n          if (timeout !== Infinity) {\n            self._endTimers[sound._id] = setTimeout(self._ended.bind(self, sound), timeout);\n          }\n\n          if (!internal) {\n            setTimeout(function() {\n              self._emit('play', sound._id);\n              self._loadQueue();\n            }, 0);\n          }\n        };\n\n        if (Howler.state === 'running' && Howler.ctx.state !== 'interrupted') {\n          playWebAudio();\n        } else {\n          self._playLock = true;\n\n          // Wait for the audio context to resume before playing.\n          self.once('resume', playWebAudio);\n\n          // Cancel the end timer.\n          self._clearTimer(sound._id);\n        }\n      } else {\n        // Fire this when the sound is ready to play to begin HTML5 Audio playback.\n        var playHtml5 = function() {\n          node.currentTime = seek;\n          node.muted = sound._muted || self._muted || Howler._muted || node.muted;\n          node.volume = sound._volume * Howler.volume();\n          node.playbackRate = sound._rate;\n\n          // Some browsers will throw an error if this is called without user interaction.\n          try {\n            var play = node.play();\n\n            // Support older browsers that don't support promises, and thus don't have this issue.\n            if (play && typeof Promise !== 'undefined' && (play instanceof Promise || typeof play.then === 'function')) {\n              // Implements a lock to prevent DOMException: The play() request was interrupted by a call to pause().\n              self._playLock = true;\n\n              // Set param values immediately.\n              setParams();\n\n              // Releases the lock and executes queued actions.\n              play\n                .then(function() {\n                  self._playLock = false;\n                  node._unlocked = true;\n                  if (!internal) {\n                    self._emit('play', sound._id);\n                  } else {\n                    self._loadQueue();\n                  }\n                })\n                .catch(function() {\n                  self._playLock = false;\n                  self._emit('playerror', sound._id, 'Playback was unable to start. This is most commonly an issue ' +\n                    'on mobile devices and Chrome where playback was not within a user interaction.');\n\n                  // Reset the ended and paused values.\n                  sound._ended = true;\n                  sound._paused = true;\n                });\n            } else if (!internal) {\n              self._playLock = false;\n              setParams();\n              self._emit('play', sound._id);\n            }\n\n            // Setting rate before playing won't work in IE, so we set it again here.\n            node.playbackRate = sound._rate;\n\n            // If the node is still paused, then we can assume there was a playback issue.\n            if (node.paused) {\n              self._emit('playerror', sound._id, 'Playback was unable to start. This is most commonly an issue ' +\n                'on mobile devices and Chrome where playback was not within a user interaction.');\n              return;\n            }\n\n            // Setup the end timer on sprites or listen for the ended event.\n            if (sprite !== '__default' || sound._loop) {\n              self._endTimers[sound._id] = setTimeout(self._ended.bind(self, sound), timeout);\n            } else {\n              self._endTimers[sound._id] = function() {\n                // Fire ended on this audio node.\n                self._ended(sound);\n\n                // Clear this listener.\n                node.removeEventListener('ended', self._endTimers[sound._id], false);\n              };\n              node.addEventListener('ended', self._endTimers[sound._id], false);\n            }\n          } catch (err) {\n            self._emit('playerror', sound._id, err);\n          }\n        };\n\n        // If this is streaming audio, make sure the src is set and load again.\n        if (node.src === 'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA') {\n          node.src = self._src;\n          node.load();\n        }\n\n        // Play immediately if ready, or wait for the 'canplaythrough'e vent.\n        var loadedNoReadyState = (window && window.ejecta) || (!node.readyState && Howler._navigator.isCocoonJS);\n        if (node.readyState >= 3 || loadedNoReadyState) {\n          playHtml5();\n        } else {\n          self._playLock = true;\n          self._state = 'loading';\n\n          var listener = function() {\n            self._state = 'loaded';\n            \n            // Begin playback.\n            playHtml5();\n\n            // Clear this listener.\n            node.removeEventListener(Howler._canPlayEvent, listener, false);\n          };\n          node.addEventListener(Howler._canPlayEvent, listener, false);\n\n          // Cancel the end timer.\n          self._clearTimer(sound._id);\n        }\n      }\n\n      return sound._id;\n    },\n\n    /**\n     * Pause playback and save current position.\n     * @param  {Number} id The sound ID (empty to pause all in group).\n     * @return {Howl}\n     */\n    pause: function(id) {\n      var self = this;\n\n      // If the sound hasn't loaded or a play() promise is pending, add it to the load queue to pause when capable.\n      if (self._state !== 'loaded' || self._playLock) {\n        self._queue.push({\n          event: 'pause',\n          action: function() {\n            self.pause(id);\n          }\n        });\n\n        return self;\n      }\n\n      // If no id is passed, get all ID's to be paused.\n      var ids = self._getSoundIds(id);\n\n      for (var i=0; i<ids.length; i++) {\n        // Clear the end timer.\n        self._clearTimer(ids[i]);\n\n        // Get the sound.\n        var sound = self._soundById(ids[i]);\n\n        if (sound && !sound._paused) {\n          // Reset the seek position.\n          sound._seek = self.seek(ids[i]);\n          sound._rateSeek = 0;\n          sound._paused = true;\n\n          // Stop currently running fades.\n          self._stopFade(ids[i]);\n\n          if (sound._node) {\n            if (self._webAudio) {\n              // Make sure the sound has been created.\n              if (!sound._node.bufferSource) {\n                continue;\n              }\n\n              if (typeof sound._node.bufferSource.stop === 'undefined') {\n                sound._node.bufferSource.noteOff(0);\n              } else {\n                sound._node.bufferSource.stop(0);\n              }\n\n              // Clean up the buffer source.\n              self._cleanBuffer(sound._node);\n            } else if (!isNaN(sound._node.duration) || sound._node.duration === Infinity) {\n              sound._node.pause();\n            }\n          }\n        }\n\n        // Fire the pause event, unless `true` is passed as the 2nd argument.\n        if (!arguments[1]) {\n          self._emit('pause', sound ? sound._id : null);\n        }\n      }\n\n      return self;\n    },\n\n    /**\n     * Stop playback and reset to start.\n     * @param  {Number} id The sound ID (empty to stop all in group).\n     * @param  {Boolean} internal Internal Use: true prevents event firing.\n     * @return {Howl}\n     */\n    stop: function(id, internal) {\n      var self = this;\n\n      // If the sound hasn't loaded, add it to the load queue to stop when capable.\n      if (self._state !== 'loaded' || self._playLock) {\n        self._queue.push({\n          event: 'stop',\n          action: function() {\n            self.stop(id);\n          }\n        });\n\n        return self;\n      }\n\n      // If no id is passed, get all ID's to be stopped.\n      var ids = self._getSoundIds(id);\n\n      for (var i=0; i<ids.length; i++) {\n        // Clear the end timer.\n        self._clearTimer(ids[i]);\n\n        // Get the sound.\n        var sound = self._soundById(ids[i]);\n\n        if (sound) {\n          // Reset the seek position.\n          sound._seek = sound._start || 0;\n          sound._rateSeek = 0;\n          sound._paused = true;\n          sound._ended = true;\n\n          // Stop currently running fades.\n          self._stopFade(ids[i]);\n\n          if (sound._node) {\n            if (self._webAudio) {\n              // Make sure the sound's AudioBufferSourceNode has been created.\n              if (sound._node.bufferSource) {\n                if (typeof sound._node.bufferSource.stop === 'undefined') {\n                  sound._node.bufferSource.noteOff(0);\n                } else {\n                  sound._node.bufferSource.stop(0);\n                }\n\n                // Clean up the buffer source.\n                self._cleanBuffer(sound._node);\n              }\n            } else if (!isNaN(sound._node.duration) || sound._node.duration === Infinity) {\n              sound._node.currentTime = sound._start || 0;\n              sound._node.pause();\n\n              // If this is a live stream, stop download once the audio is stopped.\n              if (sound._node.duration === Infinity) {\n                self._clearSound(sound._node);\n              }\n            }\n          }\n\n          if (!internal) {\n            self._emit('stop', sound._id);\n          }\n        }\n      }\n\n      return self;\n    },\n\n    /**\n     * Mute/unmute a single sound or all sounds in this Howl group.\n     * @param  {Boolean} muted Set to true to mute and false to unmute.\n     * @param  {Number} id    The sound ID to update (omit to mute/unmute all).\n     * @return {Howl}\n     */\n    mute: function(muted, id) {\n      var self = this;\n\n      // If the sound hasn't loaded, add it to the load queue to mute when capable.\n      if (self._state !== 'loaded'|| self._playLock) {\n        self._queue.push({\n          event: 'mute',\n          action: function() {\n            self.mute(muted, id);\n          }\n        });\n\n        return self;\n      }\n\n      // If applying mute/unmute to all sounds, update the group's value.\n      if (typeof id === 'undefined') {\n        if (typeof muted === 'boolean') {\n          self._muted = muted;\n        } else {\n          return self._muted;\n        }\n      }\n\n      // If no id is passed, get all ID's to be muted.\n      var ids = self._getSoundIds(id);\n\n      for (var i=0; i<ids.length; i++) {\n        // Get the sound.\n        var sound = self._soundById(ids[i]);\n\n        if (sound) {\n          sound._muted = muted;\n\n          // Cancel active fade and set the volume to the end value.\n          if (sound._interval) {\n            self._stopFade(sound._id);\n          }\n\n          if (self._webAudio && sound._node) {\n            sound._node.gain.setValueAtTime(muted ? 0 : sound._volume, Howler.ctx.currentTime);\n          } else if (sound._node) {\n            sound._node.muted = Howler._muted ? true : muted;\n          }\n\n          self._emit('mute', sound._id);\n        }\n      }\n\n      return self;\n    },\n\n    /**\n     * Get/set the volume of this sound or of the Howl group. This method can optionally take 0, 1 or 2 arguments.\n     *   volume() -> Returns the group's volume value.\n     *   volume(id) -> Returns the sound id's current volume.\n     *   volume(vol) -> Sets the volume of all sounds in this Howl group.\n     *   volume(vol, id) -> Sets the volume of passed sound id.\n     * @return {Howl/Number} Returns self or current volume.\n     */\n    volume: function() {\n      var self = this;\n      var args = arguments;\n      var vol, id;\n\n      // Determine the values based on arguments.\n      if (args.length === 0) {\n        // Return the value of the groups' volume.\n        return self._volume;\n      } else if (args.length === 1 || args.length === 2 && typeof args[1] === 'undefined') {\n        // First check if this is an ID, and if not, assume it is a new volume.\n        var ids = self._getSoundIds();\n        var index = ids.indexOf(args[0]);\n        if (index >= 0) {\n          id = parseInt(args[0], 10);\n        } else {\n          vol = parseFloat(args[0]);\n        }\n      } else if (args.length >= 2) {\n        vol = parseFloat(args[0]);\n        id = parseInt(args[1], 10);\n      }\n\n      // Update the volume or return the current volume.\n      var sound;\n      if (typeof vol !== 'undefined' && vol >= 0 && vol <= 1) {\n        // If the sound hasn't loaded, add it to the load queue to change volume when capable.\n        if (self._state !== 'loaded'|| self._playLock) {\n          self._queue.push({\n            event: 'volume',\n            action: function() {\n              self.volume.apply(self, args);\n            }\n          });\n\n          return self;\n        }\n\n        // Set the group volume.\n        if (typeof id === 'undefined') {\n          self._volume = vol;\n        }\n\n        // Update one or all volumes.\n        id = self._getSoundIds(id);\n        for (var i=0; i<id.length; i++) {\n          // Get the sound.\n          sound = self._soundById(id[i]);\n\n          if (sound) {\n            sound._volume = vol;\n\n            // Stop currently running fades.\n            if (!args[2]) {\n              self._stopFade(id[i]);\n            }\n\n            if (self._webAudio && sound._node && !sound._muted) {\n              sound._node.gain.setValueAtTime(vol, Howler.ctx.currentTime);\n            } else if (sound._node && !sound._muted) {\n              sound._node.volume = vol * Howler.volume();\n            }\n\n            self._emit('volume', sound._id);\n          }\n        }\n      } else {\n        sound = id ? self._soundById(id) : self._sounds[0];\n        return sound ? sound._volume : 0;\n      }\n\n      return self;\n    },\n\n    /**\n     * Fade a currently playing sound between two volumes (if no id is passed, all sounds will fade).\n     * @param  {Number} from The value to fade from (0.0 to 1.0).\n     * @param  {Number} to   The volume to fade to (0.0 to 1.0).\n     * @param  {Number} len  Time in milliseconds to fade.\n     * @param  {Number} id   The sound id (omit to fade all sounds).\n     * @return {Howl}\n     */\n    fade: function(from, to, len, id) {\n      var self = this;\n\n      // If the sound hasn't loaded, add it to the load queue to fade when capable.\n      if (self._state !== 'loaded' || self._playLock) {\n        self._queue.push({\n          event: 'fade',\n          action: function() {\n            self.fade(from, to, len, id);\n          }\n        });\n\n        return self;\n      }\n\n      // Make sure the to/from/len values are numbers.\n      from = Math.min(Math.max(0, parseFloat(from)), 1);\n      to = Math.min(Math.max(0, parseFloat(to)), 1);\n      len = parseFloat(len);\n\n      // Set the volume to the start position.\n      self.volume(from, id);\n\n      // Fade the volume of one or all sounds.\n      var ids = self._getSoundIds(id);\n      for (var i=0; i<ids.length; i++) {\n        // Get the sound.\n        var sound = self._soundById(ids[i]);\n\n        // Create a linear fade or fall back to timeouts with HTML5 Audio.\n        if (sound) {\n          // Stop the previous fade if no sprite is being used (otherwise, volume handles this).\n          if (!id) {\n            self._stopFade(ids[i]);\n          }\n\n          // If we are using Web Audio, let the native methods do the actual fade.\n          if (self._webAudio && !sound._muted) {\n            var currentTime = Howler.ctx.currentTime;\n            var end = currentTime + (len / 1000);\n            sound._volume = from;\n            sound._node.gain.setValueAtTime(from, currentTime);\n            sound._node.gain.linearRampToValueAtTime(to, end);\n          }\n\n          self._startFadeInterval(sound, from, to, len, ids[i], typeof id === 'undefined');\n        }\n      }\n\n      return self;\n    },\n\n    /**\n     * Starts the internal interval to fade a sound.\n     * @param  {Object} sound Reference to sound to fade.\n     * @param  {Number} from The value to fade from (0.0 to 1.0).\n     * @param  {Number} to   The volume to fade to (0.0 to 1.0).\n     * @param  {Number} len  Time in milliseconds to fade.\n     * @param  {Number} id   The sound id to fade.\n     * @param  {Boolean} isGroup   If true, set the volume on the group.\n     */\n    _startFadeInterval: function(sound, from, to, len, id, isGroup) {\n      var self = this;\n      var vol = from;\n      var diff = to - from;\n      var steps = Math.abs(diff / 0.01);\n      var stepLen = Math.max(4, (steps > 0) ? len / steps : len);\n      var lastTick = Date.now();\n\n      // Store the value being faded to.\n      sound._fadeTo = to;\n\n      // Update the volume value on each interval tick.\n      sound._interval = setInterval(function() {\n        // Update the volume based on the time since the last tick.\n        var tick = (Date.now() - lastTick) / len;\n        lastTick = Date.now();\n        vol += diff * tick;\n\n        // Round to within 2 decimal points.\n        vol = Math.round(vol * 100) / 100;\n\n        // Make sure the volume is in the right bounds.\n        if (diff < 0) {\n          vol = Math.max(to, vol);\n        } else {\n          vol = Math.min(to, vol);\n        }\n\n        // Change the volume.\n        if (self._webAudio) {\n          sound._volume = vol;\n        } else {\n          self.volume(vol, sound._id, true);\n        }\n\n        // Set the group's volume.\n        if (isGroup) {\n          self._volume = vol;\n        }\n\n        // When the fade is complete, stop it and fire event.\n        if ((to < from && vol <= to) || (to > from && vol >= to)) {\n          clearInterval(sound._interval);\n          sound._interval = null;\n          sound._fadeTo = null;\n          self.volume(to, sound._id);\n          self._emit('fade', sound._id);\n        }\n      }, stepLen);\n    },\n\n    /**\n     * Internal method that stops the currently playing fade when\n     * a new fade starts, volume is changed or the sound is stopped.\n     * @param  {Number} id The sound id.\n     * @return {Howl}\n     */\n    _stopFade: function(id) {\n      var self = this;\n      var sound = self._soundById(id);\n\n      if (sound && sound._interval) {\n        if (self._webAudio) {\n          sound._node.gain.cancelScheduledValues(Howler.ctx.currentTime);\n        }\n\n        clearInterval(sound._interval);\n        sound._interval = null;\n        self.volume(sound._fadeTo, id);\n        sound._fadeTo = null;\n        self._emit('fade', id);\n      }\n\n      return self;\n    },\n\n    /**\n     * Get/set the loop parameter on a sound. This method can optionally take 0, 1 or 2 arguments.\n     *   loop() -> Returns the group's loop value.\n     *   loop(id) -> Returns the sound id's loop value.\n     *   loop(loop) -> Sets the loop value for all sounds in this Howl group.\n     *   loop(loop, id) -> Sets the loop value of passed sound id.\n     * @return {Howl/Boolean} Returns self or current loop value.\n     */\n    loop: function() {\n      var self = this;\n      var args = arguments;\n      var loop, id, sound;\n\n      // Determine the values for loop and id.\n      if (args.length === 0) {\n        // Return the grou's loop value.\n        return self._loop;\n      } else if (args.length === 1) {\n        if (typeof args[0] === 'boolean') {\n          loop = args[0];\n          self._loop = loop;\n        } else {\n          // Return this sound's loop value.\n          sound = self._soundById(parseInt(args[0], 10));\n          return sound ? sound._loop : false;\n        }\n      } else if (args.length === 2) {\n        loop = args[0];\n        id = parseInt(args[1], 10);\n      }\n\n      // If no id is passed, get all ID's to be looped.\n      var ids = self._getSoundIds(id);\n      for (var i=0; i<ids.length; i++) {\n        sound = self._soundById(ids[i]);\n\n        if (sound) {\n          sound._loop = loop;\n          if (self._webAudio && sound._node && sound._node.bufferSource) {\n            sound._node.bufferSource.loop = loop;\n            if (loop) {\n              sound._node.bufferSource.loopStart = sound._start || 0;\n              sound._node.bufferSource.loopEnd = sound._stop;\n\n              // If playing, restart playback to ensure looping updates.\n              if (self.playing(ids[i])) {\n                self.pause(ids[i], true);\n                self.play(ids[i], true);\n              }\n            }\n          }\n        }\n      }\n\n      return self;\n    },\n\n    /**\n     * Get/set the playback rate of a sound. This method can optionally take 0, 1 or 2 arguments.\n     *   rate() -> Returns the first sound node's current playback rate.\n     *   rate(id) -> Returns the sound id's current playback rate.\n     *   rate(rate) -> Sets the playback rate of all sounds in this Howl group.\n     *   rate(rate, id) -> Sets the playback rate of passed sound id.\n     * @return {Howl/Number} Returns self or the current playback rate.\n     */\n    rate: function() {\n      var self = this;\n      var args = arguments;\n      var rate, id;\n\n      // Determine the values based on arguments.\n      if (args.length === 0) {\n        // We will simply return the current rate of the first node.\n        id = self._sounds[0]._id;\n      } else if (args.length === 1) {\n        // First check if this is an ID, and if not, assume it is a new rate value.\n        var ids = self._getSoundIds();\n        var index = ids.indexOf(args[0]);\n        if (index >= 0) {\n          id = parseInt(args[0], 10);\n        } else {\n          rate = parseFloat(args[0]);\n        }\n      } else if (args.length === 2) {\n        rate = parseFloat(args[0]);\n        id = parseInt(args[1], 10);\n      }\n\n      // Update the playback rate or return the current value.\n      var sound;\n      if (typeof rate === 'number') {\n        // If the sound hasn't loaded, add it to the load queue to change playback rate when capable.\n        if (self._state !== 'loaded' || self._playLock) {\n          self._queue.push({\n            event: 'rate',\n            action: function() {\n              self.rate.apply(self, args);\n            }\n          });\n\n          return self;\n        }\n\n        // Set the group rate.\n        if (typeof id === 'undefined') {\n          self._rate = rate;\n        }\n\n        // Update one or all volumes.\n        id = self._getSoundIds(id);\n        for (var i=0; i<id.length; i++) {\n          // Get the sound.\n          sound = self._soundById(id[i]);\n\n          if (sound) {\n            // Keep track of our position when the rate changed and update the playback\n            // start position so we can properly adjust the seek position for time elapsed.\n            if (self.playing(id[i])) {\n              sound._rateSeek = self.seek(id[i]);\n              sound._playStart = self._webAudio ? Howler.ctx.currentTime : sound._playStart;\n            }\n            sound._rate = rate;\n\n            // Change the playback rate.\n            if (self._webAudio && sound._node && sound._node.bufferSource) {\n              sound._node.bufferSource.playbackRate.setValueAtTime(rate, Howler.ctx.currentTime);\n            } else if (sound._node) {\n              sound._node.playbackRate = rate;\n            }\n\n            // Reset the timers.\n            var seek = self.seek(id[i]);\n            var duration = ((self._sprite[sound._sprite][0] + self._sprite[sound._sprite][1]) / 1000) - seek;\n            var timeout = (duration * 1000) / Math.abs(sound._rate);\n\n            // Start a new end timer if sound is already playing.\n            if (self._endTimers[id[i]] || !sound._paused) {\n              self._clearTimer(id[i]);\n              self._endTimers[id[i]] = setTimeout(self._ended.bind(self, sound), timeout);\n            }\n\n            self._emit('rate', sound._id);\n          }\n        }\n      } else {\n        sound = self._soundById(id);\n        return sound ? sound._rate : self._rate;\n      }\n\n      return self;\n    },\n\n    /**\n     * Get/set the seek position of a sound. This method can optionally take 0, 1 or 2 arguments.\n     *   seek() -> Returns the first sound node's current seek position.\n     *   seek(id) -> Returns the sound id's current seek position.\n     *   seek(seek) -> Sets the seek position of the first sound node.\n     *   seek(seek, id) -> Sets the seek position of passed sound id.\n     * @return {Howl/Number} Returns self or the current seek position.\n     */\n    seek: function() {\n      var self = this;\n      var args = arguments;\n      var seek, id;\n\n      // Determine the values based on arguments.\n      if (args.length === 0) {\n        // We will simply return the current position of the first node.\n        if (self._sounds.length) {\n          id = self._sounds[0]._id;\n        }\n      } else if (args.length === 1) {\n        // First check if this is an ID, and if not, assume it is a new seek position.\n        var ids = self._getSoundIds();\n        var index = ids.indexOf(args[0]);\n        if (index >= 0) {\n          id = parseInt(args[0], 10);\n        } else if (self._sounds.length) {\n          id = self._sounds[0]._id;\n          seek = parseFloat(args[0]);\n        }\n      } else if (args.length === 2) {\n        seek = parseFloat(args[0]);\n        id = parseInt(args[1], 10);\n      }\n\n      // If there is no ID, bail out.\n      if (typeof id === 'undefined') {\n        return 0;\n      }\n\n      // If the sound hasn't loaded, add it to the load queue to seek when capable.\n      if (typeof seek === 'number' && (self._state !== 'loaded' || self._playLock)) {\n        self._queue.push({\n          event: 'seek',\n          action: function() {\n            self.seek.apply(self, args);\n          }\n        });\n\n        return self;\n      }\n\n      // Get the sound.\n      var sound = self._soundById(id);\n\n      if (sound) {\n        if (typeof seek === 'number' && seek >= 0) {\n          // Pause the sound and update position for restarting playback.\n          var playing = self.playing(id);\n          if (playing) {\n            self.pause(id, true);\n          }\n\n          // Move the position of the track and cancel timer.\n          sound._seek = seek;\n          sound._ended = false;\n          self._clearTimer(id);\n\n          // Update the seek position for HTML5 Audio.\n          if (!self._webAudio && sound._node && !isNaN(sound._node.duration)) {\n            sound._node.currentTime = seek;\n          }\n\n          // Seek and emit when ready.\n          var seekAndEmit = function() {\n            // Restart the playback if the sound was playing.\n            if (playing) {\n              self.play(id, true);\n            }\n\n            self._emit('seek', id);\n          };\n\n          // Wait for the play lock to be unset before emitting (HTML5 Audio).\n          if (playing && !self._webAudio) {\n            var emitSeek = function() {\n              if (!self._playLock) {\n                seekAndEmit();\n              } else {\n                setTimeout(emitSeek, 0);\n              }\n            };\n            setTimeout(emitSeek, 0);\n          } else {\n            seekAndEmit();\n          }\n        } else {\n          if (self._webAudio) {\n            var realTime = self.playing(id) ? Howler.ctx.currentTime - sound._playStart : 0;\n            var rateSeek = sound._rateSeek ? sound._rateSeek - sound._seek : 0;\n            return sound._seek + (rateSeek + realTime * Math.abs(sound._rate));\n          } else {\n            return sound._node.currentTime;\n          }\n        }\n      }\n\n      return self;\n    },\n\n    /**\n     * Check if a specific sound is currently playing or not (if id is provided), or check if at least one of the sounds in the group is playing or not.\n     * @param  {Number}  id The sound id to check. If none is passed, the whole sound group is checked.\n     * @return {Boolean} True if playing and false if not.\n     */\n    playing: function(id) {\n      var self = this;\n\n      // Check the passed sound ID (if any).\n      if (typeof id === 'number') {\n        var sound = self._soundById(id);\n        return sound ? !sound._paused : false;\n      }\n\n      // Otherwise, loop through all sounds and check if any are playing.\n      for (var i=0; i<self._sounds.length; i++) {\n        if (!self._sounds[i]._paused) {\n          return true;\n        }\n      }\n\n      return false;\n    },\n\n    /**\n     * Get the duration of this sound. Passing a sound id will return the sprite duration.\n     * @param  {Number} id The sound id to check. If none is passed, return full source duration.\n     * @return {Number} Audio duration in seconds.\n     */\n    duration: function(id) {\n      var self = this;\n      var duration = self._duration;\n\n      // If we pass an ID, get the sound and return the sprite length.\n      var sound = self._soundById(id);\n      if (sound) {\n        duration = self._sprite[sound._sprite][1] / 1000;\n      }\n\n      return duration;\n    },\n\n    /**\n     * Returns the current loaded state of this Howl.\n     * @return {String} 'unloaded', 'loading', 'loaded'\n     */\n    state: function() {\n      return this._state;\n    },\n\n    /**\n     * Unload and destroy the current Howl object.\n     * This will immediately stop all sound instances attached to this group.\n     */\n    unload: function() {\n      var self = this;\n\n      // Stop playing any active sounds.\n      var sounds = self._sounds;\n      for (var i=0; i<sounds.length; i++) {\n        // Stop the sound if it is currently playing.\n        if (!sounds[i]._paused) {\n          self.stop(sounds[i]._id);\n        }\n\n        // Remove the source or disconnect.\n        if (!self._webAudio) {\n          // Set the source to 0-second silence to stop any downloading (except in IE).\n          self._clearSound(sounds[i]._node);\n\n          // Remove any event listeners.\n          sounds[i]._node.removeEventListener('error', sounds[i]._errorFn, false);\n          sounds[i]._node.removeEventListener(Howler._canPlayEvent, sounds[i]._loadFn, false);\n          sounds[i]._node.removeEventListener('ended', sounds[i]._endFn, false);\n\n          // Release the Audio object back to the pool.\n          Howler._releaseHtml5Audio(sounds[i]._node);\n        }\n\n        // Empty out all of the nodes.\n        delete sounds[i]._node;\n\n        // Make sure all timers are cleared out.\n        self._clearTimer(sounds[i]._id);\n      }\n\n      // Remove the references in the global Howler object.\n      var index = Howler._howls.indexOf(self);\n      if (index >= 0) {\n        Howler._howls.splice(index, 1);\n      }\n\n      // Delete this sound from the cache (if no other Howl is using it).\n      var remCache = true;\n      for (i=0; i<Howler._howls.length; i++) {\n        if (Howler._howls[i]._src === self._src || self._src.indexOf(Howler._howls[i]._src) >= 0) {\n          remCache = false;\n          break;\n        }\n      }\n\n      if (cache && remCache) {\n        delete cache[self._src];\n      }\n\n      // Clear global errors.\n      Howler.noAudio = false;\n\n      // Clear out `self`.\n      self._state = 'unloaded';\n      self._sounds = [];\n      self = null;\n\n      return null;\n    },\n\n    /**\n     * Listen to a custom event.\n     * @param  {String}   event Event name.\n     * @param  {Function} fn    Listener to call.\n     * @param  {Number}   id    (optional) Only listen to events for this sound.\n     * @param  {Number}   once  (INTERNAL) Marks event to fire only once.\n     * @return {Howl}\n     */\n    on: function(event, fn, id, once) {\n      var self = this;\n      var events = self['_on' + event];\n\n      if (typeof fn === 'function') {\n        events.push(once ? {id: id, fn: fn, once: once} : {id: id, fn: fn});\n      }\n\n      return self;\n    },\n\n    /**\n     * Remove a custom event. Call without parameters to remove all events.\n     * @param  {String}   event Event name.\n     * @param  {Function} fn    Listener to remove. Leave empty to remove all.\n     * @param  {Number}   id    (optional) Only remove events for this sound.\n     * @return {Howl}\n     */\n    off: function(event, fn, id) {\n      var self = this;\n      var events = self['_on' + event];\n      var i = 0;\n\n      // Allow passing just an event and ID.\n      if (typeof fn === 'number') {\n        id = fn;\n        fn = null;\n      }\n\n      if (fn || id) {\n        // Loop through event store and remove the passed function.\n        for (i=0; i<events.length; i++) {\n          var isId = (id === events[i].id);\n          if (fn === events[i].fn && isId || !fn && isId) {\n            events.splice(i, 1);\n            break;\n          }\n        }\n      } else if (event) {\n        // Clear out all events of this type.\n        self['_on' + event] = [];\n      } else {\n        // Clear out all events of every type.\n        var keys = Object.keys(self);\n        for (i=0; i<keys.length; i++) {\n          if ((keys[i].indexOf('_on') === 0) && Array.isArray(self[keys[i]])) {\n            self[keys[i]] = [];\n          }\n        }\n      }\n\n      return self;\n    },\n\n    /**\n     * Listen to a custom event and remove it once fired.\n     * @param  {String}   event Event name.\n     * @param  {Function} fn    Listener to call.\n     * @param  {Number}   id    (optional) Only listen to events for this sound.\n     * @return {Howl}\n     */\n    once: function(event, fn, id) {\n      var self = this;\n\n      // Setup the event listener.\n      self.on(event, fn, id, 1);\n\n      return self;\n    },\n\n    /**\n     * Emit all events of a specific type and pass the sound id.\n     * @param  {String} event Event name.\n     * @param  {Number} id    Sound ID.\n     * @param  {Number} msg   Message to go with event.\n     * @return {Howl}\n     */\n    _emit: function(event, id, msg) {\n      var self = this;\n      var events = self['_on' + event];\n\n      // Loop through event store and fire all functions.\n      for (var i=events.length-1; i>=0; i--) {\n        // Only fire the listener if the correct ID is used.\n        if (!events[i].id || events[i].id === id || event === 'load') {\n          setTimeout(function(fn) {\n            fn.call(this, id, msg);\n          }.bind(self, events[i].fn), 0);\n\n          // If this event was setup with `once`, remove it.\n          if (events[i].once) {\n            self.off(event, events[i].fn, events[i].id);\n          }\n        }\n      }\n\n      // Pass the event type into load queue so that it can continue stepping.\n      self._loadQueue(event);\n\n      return self;\n    },\n\n    /**\n     * Queue of actions initiated before the sound has loaded.\n     * These will be called in sequence, with the next only firing\n     * after the previous has finished executing (even if async like play).\n     * @return {Howl}\n     */\n    _loadQueue: function(event) {\n      var self = this;\n\n      if (self._queue.length > 0) {\n        var task = self._queue[0];\n\n        // Remove this task if a matching event was passed.\n        if (task.event === event) {\n          self._queue.shift();\n          self._loadQueue();\n        }\n\n        // Run the task if no event type is passed.\n        if (!event) {\n          task.action();\n        }\n      }\n\n      return self;\n    },\n\n    /**\n     * Fired when playback ends at the end of the duration.\n     * @param  {Sound} sound The sound object to work with.\n     * @return {Howl}\n     */\n    _ended: function(sound) {\n      var self = this;\n      var sprite = sound._sprite;\n\n      // If we are using IE and there was network latency we may be clipping\n      // audio before it completes playing. Lets check the node to make sure it\n      // believes it has completed, before ending the playback.\n      if (!self._webAudio && sound._node && !sound._node.paused && !sound._node.ended && sound._node.currentTime < sound._stop) {\n        setTimeout(self._ended.bind(self, sound), 100);\n        return self;\n      }\n\n      // Should this sound loop?\n      var loop = !!(sound._loop || self._sprite[sprite][2]);\n\n      // Fire the ended event.\n      self._emit('end', sound._id);\n\n      // Restart the playback for HTML5 Audio loop.\n      if (!self._webAudio && loop) {\n        self.stop(sound._id, true).play(sound._id);\n      }\n\n      // Restart this timer if on a Web Audio loop.\n      if (self._webAudio && loop) {\n        self._emit('play', sound._id);\n        sound._seek = sound._start || 0;\n        sound._rateSeek = 0;\n        sound._playStart = Howler.ctx.currentTime;\n\n        var timeout = ((sound._stop - sound._start) * 1000) / Math.abs(sound._rate);\n        self._endTimers[sound._id] = setTimeout(self._ended.bind(self, sound), timeout);\n      }\n\n      // Mark the node as paused.\n      if (self._webAudio && !loop) {\n        sound._paused = true;\n        sound._ended = true;\n        sound._seek = sound._start || 0;\n        sound._rateSeek = 0;\n        self._clearTimer(sound._id);\n\n        // Clean up the buffer source.\n        self._cleanBuffer(sound._node);\n\n        // Attempt to auto-suspend AudioContext if no sounds are still playing.\n        Howler._autoSuspend();\n      }\n\n      // When using a sprite, end the track.\n      if (!self._webAudio && !loop) {\n        self.stop(sound._id, true);\n      }\n\n      return self;\n    },\n\n    /**\n     * Clear the end timer for a sound playback.\n     * @param  {Number} id The sound ID.\n     * @return {Howl}\n     */\n    _clearTimer: function(id) {\n      var self = this;\n\n      if (self._endTimers[id]) {\n        // Clear the timeout or remove the ended listener.\n        if (typeof self._endTimers[id] !== 'function') {\n          clearTimeout(self._endTimers[id]);\n        } else {\n          var sound = self._soundById(id);\n          if (sound && sound._node) {\n            sound._node.removeEventListener('ended', self._endTimers[id], false);\n          }\n        }\n\n        delete self._endTimers[id];\n      }\n\n      return self;\n    },\n\n    /**\n     * Return the sound identified by this ID, or return null.\n     * @param  {Number} id Sound ID\n     * @return {Object}    Sound object or null.\n     */\n    _soundById: function(id) {\n      var self = this;\n\n      // Loop through all sounds and find the one with this ID.\n      for (var i=0; i<self._sounds.length; i++) {\n        if (id === self._sounds[i]._id) {\n          return self._sounds[i];\n        }\n      }\n\n      return null;\n    },\n\n    /**\n     * Return an inactive sound from the pool or create a new one.\n     * @return {Sound} Sound playback object.\n     */\n    _inactiveSound: function() {\n      var self = this;\n\n      self._drain();\n\n      // Find the first inactive node to recycle.\n      for (var i=0; i<self._sounds.length; i++) {\n        if (self._sounds[i]._ended) {\n          return self._sounds[i].reset();\n        }\n      }\n\n      // If no inactive node was found, create a new one.\n      return new Sound(self);\n    },\n\n    /**\n     * Drain excess inactive sounds from the pool.\n     */\n    _drain: function() {\n      var self = this;\n      var limit = self._pool;\n      var cnt = 0;\n      var i = 0;\n\n      // If there are less sounds than the max pool size, we are done.\n      if (self._sounds.length < limit) {\n        return;\n      }\n\n      // Count the number of inactive sounds.\n      for (i=0; i<self._sounds.length; i++) {\n        if (self._sounds[i]._ended) {\n          cnt++;\n        }\n      }\n\n      // Remove excess inactive sounds, going in reverse order.\n      for (i=self._sounds.length - 1; i>=0; i--) {\n        if (cnt <= limit) {\n          return;\n        }\n\n        if (self._sounds[i]._ended) {\n          // Disconnect the audio source when using Web Audio.\n          if (self._webAudio && self._sounds[i]._node) {\n            self._sounds[i]._node.disconnect(0);\n          }\n\n          // Remove sounds until we have the pool size.\n          self._sounds.splice(i, 1);\n          cnt--;\n        }\n      }\n    },\n\n    /**\n     * Get all ID's from the sounds pool.\n     * @param  {Number} id Only return one ID if one is passed.\n     * @return {Array}    Array of IDs.\n     */\n    _getSoundIds: function(id) {\n      var self = this;\n\n      if (typeof id === 'undefined') {\n        var ids = [];\n        for (var i=0; i<self._sounds.length; i++) {\n          ids.push(self._sounds[i]._id);\n        }\n\n        return ids;\n      } else {\n        return [id];\n      }\n    },\n\n    /**\n     * Load the sound back into the buffer source.\n     * @param  {Sound} sound The sound object to work with.\n     * @return {Howl}\n     */\n    _refreshBuffer: function(sound) {\n      var self = this;\n\n      // Setup the buffer source for playback.\n      sound._node.bufferSource = Howler.ctx.createBufferSource();\n      sound._node.bufferSource.buffer = cache[self._src];\n\n      // Connect to the correct node.\n      if (sound._panner) {\n        sound._node.bufferSource.connect(sound._panner);\n      } else {\n        sound._node.bufferSource.connect(sound._node);\n      }\n\n      // Setup looping and playback rate.\n      sound._node.bufferSource.loop = sound._loop;\n      if (sound._loop) {\n        sound._node.bufferSource.loopStart = sound._start || 0;\n        sound._node.bufferSource.loopEnd = sound._stop || 0;\n      }\n      sound._node.bufferSource.playbackRate.setValueAtTime(sound._rate, Howler.ctx.currentTime);\n\n      return self;\n    },\n\n    /**\n     * Prevent memory leaks by cleaning up the buffer source after playback.\n     * @param  {Object} node Sound's audio node containing the buffer source.\n     * @return {Howl}\n     */\n    _cleanBuffer: function(node) {\n      var self = this;\n      var isIOS = Howler._navigator && Howler._navigator.vendor.indexOf('Apple') >= 0;\n\n      if (!node.bufferSource) {\n        return self;\n      }\n\n      if (Howler._scratchBuffer && node.bufferSource) {\n        node.bufferSource.onended = null;\n        node.bufferSource.disconnect(0);\n        if (isIOS) {\n          try { node.bufferSource.buffer = Howler._scratchBuffer; } catch(e) {}\n        }\n      }\n      node.bufferSource = null;\n\n      return self;\n    },\n\n    /**\n     * Set the source to a 0-second silence to stop any downloading (except in IE).\n     * @param  {Object} node Audio node to clear.\n     */\n    _clearSound: function(node) {\n      var checkIE = /MSIE |Trident\\//.test(Howler._navigator && Howler._navigator.userAgent);\n      if (!checkIE) {\n        node.src = 'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA';\n      }\n    }\n  };\n\n  /** Single Sound Methods **/\n  /***************************************************************************/\n\n  /**\n   * Setup the sound object, which each node attached to a Howl group is contained in.\n   * @param {Object} howl The Howl parent group.\n   */\n  var Sound = function(howl) {\n    this._parent = howl;\n    this.init();\n  };\n  Sound.prototype = {\n    /**\n     * Initialize a new Sound object.\n     * @return {Sound}\n     */\n    init: function() {\n      var self = this;\n      var parent = self._parent;\n\n      // Setup the default parameters.\n      self._muted = parent._muted;\n      self._loop = parent._loop;\n      self._volume = parent._volume;\n      self._rate = parent._rate;\n      self._seek = 0;\n      self._paused = true;\n      self._ended = true;\n      self._sprite = '__default';\n\n      // Generate a unique ID for this sound.\n      self._id = ++Howler._counter;\n\n      // Add itself to the parent's pool.\n      parent._sounds.push(self);\n\n      // Create the new node.\n      self.create();\n\n      return self;\n    },\n\n    /**\n     * Create and setup a new sound object, whether HTML5 Audio or Web Audio.\n     * @return {Sound}\n     */\n    create: function() {\n      var self = this;\n      var parent = self._parent;\n      var volume = (Howler._muted || self._muted || self._parent._muted) ? 0 : self._volume;\n\n      if (parent._webAudio) {\n        // Create the gain node for controlling volume (the source will connect to this).\n        self._node = (typeof Howler.ctx.createGain === 'undefined') ? Howler.ctx.createGainNode() : Howler.ctx.createGain();\n        self._node.gain.setValueAtTime(volume, Howler.ctx.currentTime);\n        self._node.paused = true;\n        self._node.connect(Howler.masterGain);\n      } else if (!Howler.noAudio) {\n        // Get an unlocked Audio object from the pool.\n        self._node = Howler._obtainHtml5Audio();\n\n        // Listen for errors (http://dev.w3.org/html5/spec-author-view/spec.html#mediaerror).\n        self._errorFn = self._errorListener.bind(self);\n        self._node.addEventListener('error', self._errorFn, false);\n\n        // Listen for 'canplaythrough' event to let us know the sound is ready.\n        self._loadFn = self._loadListener.bind(self);\n        self._node.addEventListener(Howler._canPlayEvent, self._loadFn, false);\n\n        // Listen for the 'ended' event on the sound to account for edge-case where\n        // a finite sound has a duration of Infinity.\n        self._endFn = self._endListener.bind(self);\n        self._node.addEventListener('ended', self._endFn, false);\n\n        // Setup the new audio node.\n        self._node.src = parent._src;\n        self._node.preload = parent._preload === true ? 'auto' : parent._preload;\n        self._node.volume = volume * Howler.volume();\n\n        // Begin loading the source.\n        self._node.load();\n      }\n\n      return self;\n    },\n\n    /**\n     * Reset the parameters of this sound to the original state (for recycle).\n     * @return {Sound}\n     */\n    reset: function() {\n      var self = this;\n      var parent = self._parent;\n\n      // Reset all of the parameters of this sound.\n      self._muted = parent._muted;\n      self._loop = parent._loop;\n      self._volume = parent._volume;\n      self._rate = parent._rate;\n      self._seek = 0;\n      self._rateSeek = 0;\n      self._paused = true;\n      self._ended = true;\n      self._sprite = '__default';\n\n      // Generate a new ID so that it isn't confused with the previous sound.\n      self._id = ++Howler._counter;\n\n      return self;\n    },\n\n    /**\n     * HTML5 Audio error listener callback.\n     */\n    _errorListener: function() {\n      var self = this;\n\n      // Fire an error event and pass back the code.\n      self._parent._emit('loaderror', self._id, self._node.error ? self._node.error.code : 0);\n\n      // Clear the event listener.\n      self._node.removeEventListener('error', self._errorFn, false);\n    },\n\n    /**\n     * HTML5 Audio canplaythrough listener callback.\n     */\n    _loadListener: function() {\n      var self = this;\n      var parent = self._parent;\n\n      // Round up the duration to account for the lower precision in HTML5 Audio.\n      parent._duration = Math.ceil(self._node.duration * 10) / 10;\n\n      // Setup a sprite if none is defined.\n      if (Object.keys(parent._sprite).length === 0) {\n        parent._sprite = {__default: [0, parent._duration * 1000]};\n      }\n\n      if (parent._state !== 'loaded') {\n        parent._state = 'loaded';\n        parent._emit('load');\n        parent._loadQueue();\n      }\n\n      // Clear the event listener.\n      self._node.removeEventListener(Howler._canPlayEvent, self._loadFn, false);\n    },\n\n    /**\n     * HTML5 Audio ended listener callback.\n     */\n    _endListener: function() {\n      var self = this;\n      var parent = self._parent;\n\n      // Only handle the `ended`` event if the duration is Infinity.\n      if (parent._duration === Infinity) {\n        // Update the parent duration to match the real audio duration.\n        // Round up the duration to account for the lower precision in HTML5 Audio.\n        parent._duration = Math.ceil(self._node.duration * 10) / 10;\n\n        // Update the sprite that corresponds to the real duration.\n        if (parent._sprite.__default[1] === Infinity) {\n          parent._sprite.__default[1] = parent._duration * 1000;\n        }\n\n        // Run the regular ended method.\n        parent._ended(self);\n      }\n\n      // Clear the event listener since the duration is now correct.\n      self._node.removeEventListener('ended', self._endFn, false);\n    }\n  };\n\n  /** Helper Methods **/\n  /***************************************************************************/\n\n  var cache = {};\n\n  /**\n   * Buffer a sound from URL, Data URI or cache and decode to audio source (Web Audio API).\n   * @param  {Howl} self\n   */\n  var loadBuffer = function(self) {\n    var url = self._src;\n\n    // Check if the buffer has already been cached and use it instead.\n    if (cache[url]) {\n      // Set the duration from the cache.\n      self._duration = cache[url].duration;\n\n      // Load the sound into this Howl.\n      loadSound(self);\n\n      return;\n    }\n\n    if (/^data:[^;]+;base64,/.test(url)) {\n      // Decode the base64 data URI without XHR, since some browsers don't support it.\n      var data = atob(url.split(',')[1]);\n      var dataView = new Uint8Array(data.length);\n      for (var i=0; i<data.length; ++i) {\n        dataView[i] = data.charCodeAt(i);\n      }\n\n      decodeAudioData(dataView.buffer, self);\n    } else {\n      // Load the buffer from the URL.\n      var xhr = new XMLHttpRequest();\n      xhr.open(self._xhr.method, url, true);\n      xhr.withCredentials = self._xhr.withCredentials;\n      xhr.responseType = 'arraybuffer';\n\n      // Apply any custom headers to the request.\n      if (self._xhr.headers) {\n        Object.keys(self._xhr.headers).forEach(function(key) {\n          xhr.setRequestHeader(key, self._xhr.headers[key]);\n        });\n      }\n\n      xhr.onload = function() {\n        // Make sure we get a successful response back.\n        var code = (xhr.status + '')[0];\n        if (code !== '0' && code !== '2' && code !== '3') {\n          self._emit('loaderror', null, 'Failed loading audio file with status: ' + xhr.status + '.');\n          return;\n        }\n\n        decodeAudioData(xhr.response, self);\n      };\n      xhr.onerror = function() {\n        // If there is an error, switch to HTML5 Audio.\n        if (self._webAudio) {\n          self._html5 = true;\n          self._webAudio = false;\n          self._sounds = [];\n          delete cache[url];\n          self.load();\n        }\n      };\n      safeXhrSend(xhr);\n    }\n  };\n\n  /**\n   * Send the XHR request wrapped in a try/catch.\n   * @param  {Object} xhr XHR to send.\n   */\n  var safeXhrSend = function(xhr) {\n    try {\n      xhr.send();\n    } catch (e) {\n      xhr.onerror();\n    }\n  };\n\n  /**\n   * Decode audio data from an array buffer.\n   * @param  {ArrayBuffer} arraybuffer The audio data.\n   * @param  {Howl}        self\n   */\n  var decodeAudioData = function(arraybuffer, self) {\n    // Fire a load error if something broke.\n    var error = function() {\n      self._emit('loaderror', null, 'Decoding audio data failed.');\n    };\n\n    // Load the sound on success.\n    var success = function(buffer) {\n      if (buffer && self._sounds.length > 0) {\n        cache[self._src] = buffer;\n        loadSound(self, buffer);\n      } else {\n        error();\n      }\n    };\n\n    // Decode the buffer into an audio source.\n    if (typeof Promise !== 'undefined' && Howler.ctx.decodeAudioData.length === 1) {\n      Howler.ctx.decodeAudioData(arraybuffer).then(success).catch(error);\n    } else {\n      Howler.ctx.decodeAudioData(arraybuffer, success, error);\n    }\n  }\n\n  /**\n   * Sound is now loaded, so finish setting everything up and fire the loaded event.\n   * @param  {Howl} self\n   * @param  {Object} buffer The decoded buffer sound source.\n   */\n  var loadSound = function(self, buffer) {\n    // Set the duration.\n    if (buffer && !self._duration) {\n      self._duration = buffer.duration;\n    }\n\n    // Setup a sprite if none is defined.\n    if (Object.keys(self._sprite).length === 0) {\n      self._sprite = {__default: [0, self._duration * 1000]};\n    }\n\n    // Fire the loaded event.\n    if (self._state !== 'loaded') {\n      self._state = 'loaded';\n      self._emit('load');\n      self._loadQueue();\n    }\n  };\n\n  /**\n   * Setup the audio context when available, or switch to HTML5 Audio mode.\n   */\n  var setupAudioContext = function() {\n    // If we have already detected that Web Audio isn't supported, don't run this step again.\n    if (!Howler.usingWebAudio) {\n      return;\n    }\n\n    // Check if we are using Web Audio and setup the AudioContext if we are.\n    try {\n      if (typeof AudioContext !== 'undefined') {\n        Howler.ctx = new AudioContext();\n      } else if (typeof webkitAudioContext !== 'undefined') {\n        Howler.ctx = new webkitAudioContext();\n      } else {\n        Howler.usingWebAudio = false;\n      }\n    } catch(e) {\n      Howler.usingWebAudio = false;\n    }\n\n    // If the audio context creation still failed, set using web audio to false.\n    if (!Howler.ctx) {\n      Howler.usingWebAudio = false;\n    }\n\n    // Check if a webview is being used on iOS8 or earlier (rather than the browser).\n    // If it is, disable Web Audio as it causes crashing.\n    var iOS = (/iP(hone|od|ad)/.test(Howler._navigator && Howler._navigator.platform));\n    var appVersion = Howler._navigator && Howler._navigator.appVersion.match(/OS (\\d+)_(\\d+)_?(\\d+)?/);\n    var version = appVersion ? parseInt(appVersion[1], 10) : null;\n    if (iOS && version && version < 9) {\n      var safari = /safari/.test(Howler._navigator && Howler._navigator.userAgent.toLowerCase());\n      if (Howler._navigator && !safari) {\n        Howler.usingWebAudio = false;\n      }\n    }\n\n    // Create and expose the master GainNode when using Web Audio (useful for plugins or advanced usage).\n    if (Howler.usingWebAudio) {\n      Howler.masterGain = (typeof Howler.ctx.createGain === 'undefined') ? Howler.ctx.createGainNode() : Howler.ctx.createGain();\n      Howler.masterGain.gain.setValueAtTime(Howler._muted ? 0 : Howler._volume, Howler.ctx.currentTime);\n      Howler.masterGain.connect(Howler.ctx.destination);\n    }\n\n    // Re-run the setup on Howler.\n    Howler._setup();\n  };\n\n  // Add support for AMD (Asynchronous Module Definition) libraries such as require.js.\n  if (typeof define === 'function' && define.amd) {\n    define([], function() {\n      return {\n        Howler: Howler,\n        Howl: Howl\n      };\n    });\n  }\n\n  // Add support for CommonJS libraries such as browserify.\n  if (typeof exports !== 'undefined') {\n    exports.Howler = Howler;\n    exports.Howl = Howl;\n  }\n\n  // Add to global in Node.js (for testing, etc).\n  if (typeof global !== 'undefined') {\n    global.HowlerGlobal = HowlerGlobal;\n    global.Howler = Howler;\n    global.Howl = Howl;\n    global.Sound = Sound;\n  } else if (typeof window !== 'undefined') {  // Define globally in case AMD is not available or unused.\n    window.HowlerGlobal = HowlerGlobal;\n    window.Howler = Howler;\n    window.Howl = Howl;\n    window.Sound = Sound;\n  }\n})();\n\n\n/*!\n *  Spatial Plugin - Adds support for stereo and 3D audio where Web Audio is supported.\n *  \n *  howler.js v2.2.4\n *  howlerjs.com\n *\n *  (c) 2013-2020, James Simpson of GoldFire Studios\n *  goldfirestudios.com\n *\n *  MIT License\n */\n\n(function() {\n\n  'use strict';\n\n  // Setup default properties.\n  HowlerGlobal.prototype._pos = [0, 0, 0];\n  HowlerGlobal.prototype._orientation = [0, 0, -1, 0, 1, 0];\n\n  /** Global Methods **/\n  /***************************************************************************/\n\n  /**\n   * Helper method to update the stereo panning position of all current Howls.\n   * Future Howls will not use this value unless explicitly set.\n   * @param  {Number} pan A value of -1.0 is all the way left and 1.0 is all the way right.\n   * @return {Howler/Number}     Self or current stereo panning value.\n   */\n  HowlerGlobal.prototype.stereo = function(pan) {\n    var self = this;\n\n    // Stop right here if not using Web Audio.\n    if (!self.ctx || !self.ctx.listener) {\n      return self;\n    }\n\n    // Loop through all Howls and update their stereo panning.\n    for (var i=self._howls.length-1; i>=0; i--) {\n      self._howls[i].stereo(pan);\n    }\n\n    return self;\n  };\n\n  /**\n   * Get/set the position of the listener in 3D cartesian space. Sounds using\n   * 3D position will be relative to the listener's position.\n   * @param  {Number} x The x-position of the listener.\n   * @param  {Number} y The y-position of the listener.\n   * @param  {Number} z The z-position of the listener.\n   * @return {Howler/Array}   Self or current listener position.\n   */\n  HowlerGlobal.prototype.pos = function(x, y, z) {\n    var self = this;\n\n    // Stop right here if not using Web Audio.\n    if (!self.ctx || !self.ctx.listener) {\n      return self;\n    }\n\n    // Set the defaults for optional 'y' & 'z'.\n    y = (typeof y !== 'number') ? self._pos[1] : y;\n    z = (typeof z !== 'number') ? self._pos[2] : z;\n\n    if (typeof x === 'number') {\n      self._pos = [x, y, z];\n\n      if (typeof self.ctx.listener.positionX !== 'undefined') {\n        self.ctx.listener.positionX.setTargetAtTime(self._pos[0], Howler.ctx.currentTime, 0.1);\n        self.ctx.listener.positionY.setTargetAtTime(self._pos[1], Howler.ctx.currentTime, 0.1);\n        self.ctx.listener.positionZ.setTargetAtTime(self._pos[2], Howler.ctx.currentTime, 0.1);\n      } else {\n        self.ctx.listener.setPosition(self._pos[0], self._pos[1], self._pos[2]);\n      }\n    } else {\n      return self._pos;\n    }\n\n    return self;\n  };\n\n  /**\n   * Get/set the direction the listener is pointing in the 3D cartesian space.\n   * A front and up vector must be provided. The front is the direction the\n   * face of the listener is pointing, and up is the direction the top of the\n   * listener is pointing. Thus, these values are expected to be at right angles\n   * from each other.\n   * @param  {Number} x   The x-orientation of the listener.\n   * @param  {Number} y   The y-orientation of the listener.\n   * @param  {Number} z   The z-orientation of the listener.\n   * @param  {Number} xUp The x-orientation of the top of the listener.\n   * @param  {Number} yUp The y-orientation of the top of the listener.\n   * @param  {Number} zUp The z-orientation of the top of the listener.\n   * @return {Howler/Array}     Returns self or the current orientation vectors.\n   */\n  HowlerGlobal.prototype.orientation = function(x, y, z, xUp, yUp, zUp) {\n    var self = this;\n\n    // Stop right here if not using Web Audio.\n    if (!self.ctx || !self.ctx.listener) {\n      return self;\n    }\n\n    // Set the defaults for optional 'y' & 'z'.\n    var or = self._orientation;\n    y = (typeof y !== 'number') ? or[1] : y;\n    z = (typeof z !== 'number') ? or[2] : z;\n    xUp = (typeof xUp !== 'number') ? or[3] : xUp;\n    yUp = (typeof yUp !== 'number') ? or[4] : yUp;\n    zUp = (typeof zUp !== 'number') ? or[5] : zUp;\n\n    if (typeof x === 'number') {\n      self._orientation = [x, y, z, xUp, yUp, zUp];\n\n      if (typeof self.ctx.listener.forwardX !== 'undefined') {\n        self.ctx.listener.forwardX.setTargetAtTime(x, Howler.ctx.currentTime, 0.1);\n        self.ctx.listener.forwardY.setTargetAtTime(y, Howler.ctx.currentTime, 0.1);\n        self.ctx.listener.forwardZ.setTargetAtTime(z, Howler.ctx.currentTime, 0.1);\n        self.ctx.listener.upX.setTargetAtTime(xUp, Howler.ctx.currentTime, 0.1);\n        self.ctx.listener.upY.setTargetAtTime(yUp, Howler.ctx.currentTime, 0.1);\n        self.ctx.listener.upZ.setTargetAtTime(zUp, Howler.ctx.currentTime, 0.1);\n      } else {\n        self.ctx.listener.setOrientation(x, y, z, xUp, yUp, zUp);\n      }\n    } else {\n      return or;\n    }\n\n    return self;\n  };\n\n  /** Group Methods **/\n  /***************************************************************************/\n\n  /**\n   * Add new properties to the core init.\n   * @param  {Function} _super Core init method.\n   * @return {Howl}\n   */\n  Howl.prototype.init = (function(_super) {\n    return function(o) {\n      var self = this;\n\n      // Setup user-defined default properties.\n      self._orientation = o.orientation || [1, 0, 0];\n      self._stereo = o.stereo || null;\n      self._pos = o.pos || null;\n      self._pannerAttr = {\n        coneInnerAngle: typeof o.coneInnerAngle !== 'undefined' ? o.coneInnerAngle : 360,\n        coneOuterAngle: typeof o.coneOuterAngle !== 'undefined' ? o.coneOuterAngle : 360,\n        coneOuterGain: typeof o.coneOuterGain !== 'undefined' ? o.coneOuterGain : 0,\n        distanceModel: typeof o.distanceModel !== 'undefined' ? o.distanceModel : 'inverse',\n        maxDistance: typeof o.maxDistance !== 'undefined' ? o.maxDistance : 10000,\n        panningModel: typeof o.panningModel !== 'undefined' ? o.panningModel : 'HRTF',\n        refDistance: typeof o.refDistance !== 'undefined' ? o.refDistance : 1,\n        rolloffFactor: typeof o.rolloffFactor !== 'undefined' ? o.rolloffFactor : 1\n      };\n\n      // Setup event listeners.\n      self._onstereo = o.onstereo ? [{fn: o.onstereo}] : [];\n      self._onpos = o.onpos ? [{fn: o.onpos}] : [];\n      self._onorientation = o.onorientation ? [{fn: o.onorientation}] : [];\n\n      // Complete initilization with howler.js core's init function.\n      return _super.call(this, o);\n    };\n  })(Howl.prototype.init);\n\n  /**\n   * Get/set the stereo panning of the audio source for this sound or all in the group.\n   * @param  {Number} pan  A value of -1.0 is all the way left and 1.0 is all the way right.\n   * @param  {Number} id (optional) The sound ID. If none is passed, all in group will be updated.\n   * @return {Howl/Number}    Returns self or the current stereo panning value.\n   */\n  Howl.prototype.stereo = function(pan, id) {\n    var self = this;\n\n    // Stop right here if not using Web Audio.\n    if (!self._webAudio) {\n      return self;\n    }\n\n    // If the sound hasn't loaded, add it to the load queue to change stereo pan when capable.\n    if (self._state !== 'loaded') {\n      self._queue.push({\n        event: 'stereo',\n        action: function() {\n          self.stereo(pan, id);\n        }\n      });\n\n      return self;\n    }\n\n    // Check for PannerStereoNode support and fallback to PannerNode if it doesn't exist.\n    var pannerType = (typeof Howler.ctx.createStereoPanner === 'undefined') ? 'spatial' : 'stereo';\n\n    // Setup the group's stereo panning if no ID is passed.\n    if (typeof id === 'undefined') {\n      // Return the group's stereo panning if no parameters are passed.\n      if (typeof pan === 'number') {\n        self._stereo = pan;\n        self._pos = [pan, 0, 0];\n      } else {\n        return self._stereo;\n      }\n    }\n\n    // Change the streo panning of one or all sounds in group.\n    var ids = self._getSoundIds(id);\n    for (var i=0; i<ids.length; i++) {\n      // Get the sound.\n      var sound = self._soundById(ids[i]);\n\n      if (sound) {\n        if (typeof pan === 'number') {\n          sound._stereo = pan;\n          sound._pos = [pan, 0, 0];\n\n          if (sound._node) {\n            // If we are falling back, make sure the panningModel is equalpower.\n            sound._pannerAttr.panningModel = 'equalpower';\n\n            // Check if there is a panner setup and create a new one if not.\n            if (!sound._panner || !sound._panner.pan) {\n              setupPanner(sound, pannerType);\n            }\n\n            if (pannerType === 'spatial') {\n              if (typeof sound._panner.positionX !== 'undefined') {\n                sound._panner.positionX.setValueAtTime(pan, Howler.ctx.currentTime);\n                sound._panner.positionY.setValueAtTime(0, Howler.ctx.currentTime);\n                sound._panner.positionZ.setValueAtTime(0, Howler.ctx.currentTime);\n              } else {\n                sound._panner.setPosition(pan, 0, 0);\n              }\n            } else {\n              sound._panner.pan.setValueAtTime(pan, Howler.ctx.currentTime);\n            }\n          }\n\n          self._emit('stereo', sound._id);\n        } else {\n          return sound._stereo;\n        }\n      }\n    }\n\n    return self;\n  };\n\n  /**\n   * Get/set the 3D spatial position of the audio source for this sound or group relative to the global listener.\n   * @param  {Number} x  The x-position of the audio source.\n   * @param  {Number} y  The y-position of the audio source.\n   * @param  {Number} z  The z-position of the audio source.\n   * @param  {Number} id (optional) The sound ID. If none is passed, all in group will be updated.\n   * @return {Howl/Array}    Returns self or the current 3D spatial position: [x, y, z].\n   */\n  Howl.prototype.pos = function(x, y, z, id) {\n    var self = this;\n\n    // Stop right here if not using Web Audio.\n    if (!self._webAudio) {\n      return self;\n    }\n\n    // If the sound hasn't loaded, add it to the load queue to change position when capable.\n    if (self._state !== 'loaded') {\n      self._queue.push({\n        event: 'pos',\n        action: function() {\n          self.pos(x, y, z, id);\n        }\n      });\n\n      return self;\n    }\n\n    // Set the defaults for optional 'y' & 'z'.\n    y = (typeof y !== 'number') ? 0 : y;\n    z = (typeof z !== 'number') ? -0.5 : z;\n\n    // Setup the group's spatial position if no ID is passed.\n    if (typeof id === 'undefined') {\n      // Return the group's spatial position if no parameters are passed.\n      if (typeof x === 'number') {\n        self._pos = [x, y, z];\n      } else {\n        return self._pos;\n      }\n    }\n\n    // Change the spatial position of one or all sounds in group.\n    var ids = self._getSoundIds(id);\n    for (var i=0; i<ids.length; i++) {\n      // Get the sound.\n      var sound = self._soundById(ids[i]);\n\n      if (sound) {\n        if (typeof x === 'number') {\n          sound._pos = [x, y, z];\n\n          if (sound._node) {\n            // Check if there is a panner setup and create a new one if not.\n            if (!sound._panner || sound._panner.pan) {\n              setupPanner(sound, 'spatial');\n            }\n\n            if (typeof sound._panner.positionX !== 'undefined') {\n              sound._panner.positionX.setValueAtTime(x, Howler.ctx.currentTime);\n              sound._panner.positionY.setValueAtTime(y, Howler.ctx.currentTime);\n              sound._panner.positionZ.setValueAtTime(z, Howler.ctx.currentTime);\n            } else {\n              sound._panner.setPosition(x, y, z);\n            }\n          }\n\n          self._emit('pos', sound._id);\n        } else {\n          return sound._pos;\n        }\n      }\n    }\n\n    return self;\n  };\n\n  /**\n   * Get/set the direction the audio source is pointing in the 3D cartesian coordinate\n   * space. Depending on how direction the sound is, based on the `cone` attributes,\n   * a sound pointing away from the listener can be quiet or silent.\n   * @param  {Number} x  The x-orientation of the source.\n   * @param  {Number} y  The y-orientation of the source.\n   * @param  {Number} z  The z-orientation of the source.\n   * @param  {Number} id (optional) The sound ID. If none is passed, all in group will be updated.\n   * @return {Howl/Array}    Returns self or the current 3D spatial orientation: [x, y, z].\n   */\n  Howl.prototype.orientation = function(x, y, z, id) {\n    var self = this;\n\n    // Stop right here if not using Web Audio.\n    if (!self._webAudio) {\n      return self;\n    }\n\n    // If the sound hasn't loaded, add it to the load queue to change orientation when capable.\n    if (self._state !== 'loaded') {\n      self._queue.push({\n        event: 'orientation',\n        action: function() {\n          self.orientation(x, y, z, id);\n        }\n      });\n\n      return self;\n    }\n\n    // Set the defaults for optional 'y' & 'z'.\n    y = (typeof y !== 'number') ? self._orientation[1] : y;\n    z = (typeof z !== 'number') ? self._orientation[2] : z;\n\n    // Setup the group's spatial orientation if no ID is passed.\n    if (typeof id === 'undefined') {\n      // Return the group's spatial orientation if no parameters are passed.\n      if (typeof x === 'number') {\n        self._orientation = [x, y, z];\n      } else {\n        return self._orientation;\n      }\n    }\n\n    // Change the spatial orientation of one or all sounds in group.\n    var ids = self._getSoundIds(id);\n    for (var i=0; i<ids.length; i++) {\n      // Get the sound.\n      var sound = self._soundById(ids[i]);\n\n      if (sound) {\n        if (typeof x === 'number') {\n          sound._orientation = [x, y, z];\n\n          if (sound._node) {\n            // Check if there is a panner setup and create a new one if not.\n            if (!sound._panner) {\n              // Make sure we have a position to setup the node with.\n              if (!sound._pos) {\n                sound._pos = self._pos || [0, 0, -0.5];\n              }\n\n              setupPanner(sound, 'spatial');\n            }\n\n            if (typeof sound._panner.orientationX !== 'undefined') {\n              sound._panner.orientationX.setValueAtTime(x, Howler.ctx.currentTime);\n              sound._panner.orientationY.setValueAtTime(y, Howler.ctx.currentTime);\n              sound._panner.orientationZ.setValueAtTime(z, Howler.ctx.currentTime);\n            } else {\n              sound._panner.setOrientation(x, y, z);\n            }\n          }\n\n          self._emit('orientation', sound._id);\n        } else {\n          return sound._orientation;\n        }\n      }\n    }\n\n    return self;\n  };\n\n  /**\n   * Get/set the panner node's attributes for a sound or group of sounds.\n   * This method can optionall take 0, 1 or 2 arguments.\n   *   pannerAttr() -> Returns the group's values.\n   *   pannerAttr(id) -> Returns the sound id's values.\n   *   pannerAttr(o) -> Set's the values of all sounds in this Howl group.\n   *   pannerAttr(o, id) -> Set's the values of passed sound id.\n   *\n   *   Attributes:\n   *     coneInnerAngle - (360 by default) A parameter for directional audio sources, this is an angle, in degrees,\n   *                      inside of which there will be no volume reduction.\n   *     coneOuterAngle - (360 by default) A parameter for directional audio sources, this is an angle, in degrees,\n   *                      outside of which the volume will be reduced to a constant value of `coneOuterGain`.\n   *     coneOuterGain - (0 by default) A parameter for directional audio sources, this is the gain outside of the\n   *                     `coneOuterAngle`. It is a linear value in the range `[0, 1]`.\n   *     distanceModel - ('inverse' by default) Determines algorithm used to reduce volume as audio moves away from\n   *                     listener. Can be `linear`, `inverse` or `exponential.\n   *     maxDistance - (10000 by default) The maximum distance between source and listener, after which the volume\n   *                   will not be reduced any further.\n   *     refDistance - (1 by default) A reference distance for reducing volume as source moves further from the listener.\n   *                   This is simply a variable of the distance model and has a different effect depending on which model\n   *                   is used and the scale of your coordinates. Generally, volume will be equal to 1 at this distance.\n   *     rolloffFactor - (1 by default) How quickly the volume reduces as source moves from listener. This is simply a\n   *                     variable of the distance model and can be in the range of `[0, 1]` with `linear` and `[0, \u221E]`\n   *                     with `inverse` and `exponential`.\n   *     panningModel - ('HRTF' by default) Determines which spatialization algorithm is used to position audio.\n   *                     Can be `HRTF` or `equalpower`.\n   *\n   * @return {Howl/Object} Returns self or current panner attributes.\n   */\n  Howl.prototype.pannerAttr = function() {\n    var self = this;\n    var args = arguments;\n    var o, id, sound;\n\n    // Stop right here if not using Web Audio.\n    if (!self._webAudio) {\n      return self;\n    }\n\n    // Determine the values based on arguments.\n    if (args.length === 0) {\n      // Return the group's panner attribute values.\n      return self._pannerAttr;\n    } else if (args.length === 1) {\n      if (typeof args[0] === 'object') {\n        o = args[0];\n\n        // Set the grou's panner attribute values.\n        if (typeof id === 'undefined') {\n          if (!o.pannerAttr) {\n            o.pannerAttr = {\n              coneInnerAngle: o.coneInnerAngle,\n              coneOuterAngle: o.coneOuterAngle,\n              coneOuterGain: o.coneOuterGain,\n              distanceModel: o.distanceModel,\n              maxDistance: o.maxDistance,\n              refDistance: o.refDistance,\n              rolloffFactor: o.rolloffFactor,\n              panningModel: o.panningModel\n            };\n          }\n\n          self._pannerAttr = {\n            coneInnerAngle: typeof o.pannerAttr.coneInnerAngle !== 'undefined' ? o.pannerAttr.coneInnerAngle : self._coneInnerAngle,\n            coneOuterAngle: typeof o.pannerAttr.coneOuterAngle !== 'undefined' ? o.pannerAttr.coneOuterAngle : self._coneOuterAngle,\n            coneOuterGain: typeof o.pannerAttr.coneOuterGain !== 'undefined' ? o.pannerAttr.coneOuterGain : self._coneOuterGain,\n            distanceModel: typeof o.pannerAttr.distanceModel !== 'undefined' ? o.pannerAttr.distanceModel : self._distanceModel,\n            maxDistance: typeof o.pannerAttr.maxDistance !== 'undefined' ? o.pannerAttr.maxDistance : self._maxDistance,\n            refDistance: typeof o.pannerAttr.refDistance !== 'undefined' ? o.pannerAttr.refDistance : self._refDistance,\n            rolloffFactor: typeof o.pannerAttr.rolloffFactor !== 'undefined' ? o.pannerAttr.rolloffFactor : self._rolloffFactor,\n            panningModel: typeof o.pannerAttr.panningModel !== 'undefined' ? o.pannerAttr.panningModel : self._panningModel\n          };\n        }\n      } else {\n        // Return this sound's panner attribute values.\n        sound = self._soundById(parseInt(args[0], 10));\n        return sound ? sound._pannerAttr : self._pannerAttr;\n      }\n    } else if (args.length === 2) {\n      o = args[0];\n      id = parseInt(args[1], 10);\n    }\n\n    // Update the values of the specified sounds.\n    var ids = self._getSoundIds(id);\n    for (var i=0; i<ids.length; i++) {\n      sound = self._soundById(ids[i]);\n\n      if (sound) {\n        // Merge the new values into the sound.\n        var pa = sound._pannerAttr;\n        pa = {\n          coneInnerAngle: typeof o.coneInnerAngle !== 'undefined' ? o.coneInnerAngle : pa.coneInnerAngle,\n          coneOuterAngle: typeof o.coneOuterAngle !== 'undefined' ? o.coneOuterAngle : pa.coneOuterAngle,\n          coneOuterGain: typeof o.coneOuterGain !== 'undefined' ? o.coneOuterGain : pa.coneOuterGain,\n          distanceModel: typeof o.distanceModel !== 'undefined' ? o.distanceModel : pa.distanceModel,\n          maxDistance: typeof o.maxDistance !== 'undefined' ? o.maxDistance : pa.maxDistance,\n          refDistance: typeof o.refDistance !== 'undefined' ? o.refDistance : pa.refDistance,\n          rolloffFactor: typeof o.rolloffFactor !== 'undefined' ? o.rolloffFactor : pa.rolloffFactor,\n          panningModel: typeof o.panningModel !== 'undefined' ? o.panningModel : pa.panningModel\n        };\n\n        // Create a new panner node if one doesn't already exist.\n        var panner = sound._panner;\n        if (!panner) {\n          // Make sure we have a position to setup the node with.\n          if (!sound._pos) {\n            sound._pos = self._pos || [0, 0, -0.5];\n          }\n\n          // Create a new panner node.\n          setupPanner(sound, 'spatial');\n          panner = sound._panner\n        }\n\n        // Update the panner values or create a new panner if none exists.\n        panner.coneInnerAngle = pa.coneInnerAngle;\n        panner.coneOuterAngle = pa.coneOuterAngle;\n        panner.coneOuterGain = pa.coneOuterGain;\n        panner.distanceModel = pa.distanceModel;\n        panner.maxDistance = pa.maxDistance;\n        panner.refDistance = pa.refDistance;\n        panner.rolloffFactor = pa.rolloffFactor;\n        panner.panningModel = pa.panningModel;\n      }\n    }\n\n    return self;\n  };\n\n  /** Single Sound Methods **/\n  /***************************************************************************/\n\n  /**\n   * Add new properties to the core Sound init.\n   * @param  {Function} _super Core Sound init method.\n   * @return {Sound}\n   */\n  Sound.prototype.init = (function(_super) {\n    return function() {\n      var self = this;\n      var parent = self._parent;\n\n      // Setup user-defined default properties.\n      self._orientation = parent._orientation;\n      self._stereo = parent._stereo;\n      self._pos = parent._pos;\n      self._pannerAttr = parent._pannerAttr;\n\n      // Complete initilization with howler.js core Sound's init function.\n      _super.call(this);\n\n      // If a stereo or position was specified, set it up.\n      if (self._stereo) {\n        parent.stereo(self._stereo);\n      } else if (self._pos) {\n        parent.pos(self._pos[0], self._pos[1], self._pos[2], self._id);\n      }\n    };\n  })(Sound.prototype.init);\n\n  /**\n   * Override the Sound.reset method to clean up properties from the spatial plugin.\n   * @param  {Function} _super Sound reset method.\n   * @return {Sound}\n   */\n  Sound.prototype.reset = (function(_super) {\n    return function() {\n      var self = this;\n      var parent = self._parent;\n\n      // Reset all spatial plugin properties on this sound.\n      self._orientation = parent._orientation;\n      self._stereo = parent._stereo;\n      self._pos = parent._pos;\n      self._pannerAttr = parent._pannerAttr;\n\n      // If a stereo or position was specified, set it up.\n      if (self._stereo) {\n        parent.stereo(self._stereo);\n      } else if (self._pos) {\n        parent.pos(self._pos[0], self._pos[1], self._pos[2], self._id);\n      } else if (self._panner) {\n        // Disconnect the panner.\n        self._panner.disconnect(0);\n        self._panner = undefined;\n        parent._refreshBuffer(self);\n      }\n\n      // Complete resetting of the sound.\n      return _super.call(this);\n    };\n  })(Sound.prototype.reset);\n\n  /** Helper Methods **/\n  /***************************************************************************/\n\n  /**\n   * Create a new panner node and save it on the sound.\n   * @param  {Sound} sound Specific sound to setup panning on.\n   * @param {String} type Type of panner to create: 'stereo' or 'spatial'.\n   */\n  var setupPanner = function(sound, type) {\n    type = type || 'spatial';\n\n    // Create the new panner node.\n    if (type === 'spatial') {\n      sound._panner = Howler.ctx.createPanner();\n      sound._panner.coneInnerAngle = sound._pannerAttr.coneInnerAngle;\n      sound._panner.coneOuterAngle = sound._pannerAttr.coneOuterAngle;\n      sound._panner.coneOuterGain = sound._pannerAttr.coneOuterGain;\n      sound._panner.distanceModel = sound._pannerAttr.distanceModel;\n      sound._panner.maxDistance = sound._pannerAttr.maxDistance;\n      sound._panner.refDistance = sound._pannerAttr.refDistance;\n      sound._panner.rolloffFactor = sound._pannerAttr.rolloffFactor;\n      sound._panner.panningModel = sound._pannerAttr.panningModel;\n\n      if (typeof sound._panner.positionX !== 'undefined') {\n        sound._panner.positionX.setValueAtTime(sound._pos[0], Howler.ctx.currentTime);\n        sound._panner.positionY.setValueAtTime(sound._pos[1], Howler.ctx.currentTime);\n        sound._panner.positionZ.setValueAtTime(sound._pos[2], Howler.ctx.currentTime);\n      } else {\n        sound._panner.setPosition(sound._pos[0], sound._pos[1], sound._pos[2]);\n      }\n\n      if (typeof sound._panner.orientationX !== 'undefined') {\n        sound._panner.orientationX.setValueAtTime(sound._orientation[0], Howler.ctx.currentTime);\n        sound._panner.orientationY.setValueAtTime(sound._orientation[1], Howler.ctx.currentTime);\n        sound._panner.orientationZ.setValueAtTime(sound._orientation[2], Howler.ctx.currentTime);\n      } else {\n        sound._panner.setOrientation(sound._orientation[0], sound._orientation[1], sound._orientation[2]);\n      }\n    } else {\n      sound._panner = Howler.ctx.createStereoPanner();\n      sound._panner.pan.setValueAtTime(sound._stereo, Howler.ctx.currentTime);\n    }\n\n    sound._panner.connect(sound._node);\n\n    // Update the connections.\n    if (!sound._paused) {\n      sound._parent.pause(sound._id, true).play(sound._id, true);\n    }\n  };\n})();\n", "\nmodule.exports = function () {\n  var selection = document.getSelection();\n  if (!selection.rangeCount) {\n    return function () {};\n  }\n  var active = document.activeElement;\n\n  var ranges = [];\n  for (var i = 0; i < selection.rangeCount; i++) {\n    ranges.push(selection.getRangeAt(i));\n  }\n\n  switch (active.tagName.toUpperCase()) { // .toUpperCase handles XHTML\n    case 'INPUT':\n    case 'TEXTAREA':\n      active.blur();\n      break;\n\n    default:\n      active = null;\n      break;\n  }\n\n  selection.removeAllRanges();\n  return function () {\n    selection.type === 'Caret' &&\n    selection.removeAllRanges();\n\n    if (!selection.rangeCount) {\n      ranges.forEach(function(range) {\n        selection.addRange(range);\n      });\n    }\n\n    active &&\n    active.focus();\n  };\n};\n", "\"use strict\";\n\nvar deselectCurrent = require(\"toggle-selection\");\n\nvar clipboardToIE11Formatting = {\n  \"text/plain\": \"Text\",\n  \"text/html\": \"Url\",\n  \"default\": \"Text\"\n}\n\nvar defaultMessage = \"Copy to clipboard: #{key}, Enter\";\n\nfunction format(message) {\n  var copyKey = (/mac os x/i.test(navigator.userAgent) ? \"\u2318\" : \"Ctrl\") + \"+C\";\n  return message.replace(/#{\\s*key\\s*}/g, copyKey);\n}\n\nfunction copy(text, options) {\n  var debug,\n    message,\n    reselectPrevious,\n    range,\n    selection,\n    mark,\n    success = false;\n  if (!options) {\n    options = {};\n  }\n  debug = options.debug || false;\n  try {\n    reselectPrevious = deselectCurrent();\n\n    range = document.createRange();\n    selection = document.getSelection();\n\n    mark = document.createElement(\"span\");\n    mark.textContent = text;\n    // avoid screen readers from reading out loud the text\n    mark.ariaHidden = \"true\"\n    // reset user styles for span element\n    mark.style.all = \"unset\";\n    // prevents scrolling to the end of the page\n    mark.style.position = \"fixed\";\n    mark.style.top = 0;\n    mark.style.clip = \"rect(0, 0, 0, 0)\";\n    // used to preserve spaces and line breaks\n    mark.style.whiteSpace = \"pre\";\n    // do not inherit user-select (it may be `none`)\n    mark.style.webkitUserSelect = \"text\";\n    mark.style.MozUserSelect = \"text\";\n    mark.style.msUserSelect = \"text\";\n    mark.style.userSelect = \"text\";\n    mark.addEventListener(\"copy\", function(e) {\n      e.stopPropagation();\n      if (options.format) {\n        e.preventDefault();\n        if (typeof e.clipboardData === \"undefined\") { // IE 11\n          debug && console.warn(\"unable to use e.clipboardData\");\n          debug && console.warn(\"trying IE specific stuff\");\n          window.clipboardData.clearData();\n          var format = clipboardToIE11Formatting[options.format] || clipboardToIE11Formatting[\"default\"]\n          window.clipboardData.setData(format, text);\n        } else { // all other browsers\n          e.clipboardData.clearData();\n          e.clipboardData.setData(options.format, text);\n        }\n      }\n      if (options.onCopy) {\n        e.preventDefault();\n        options.onCopy(e.clipboardData);\n      }\n    });\n\n    document.body.appendChild(mark);\n\n    range.selectNodeContents(mark);\n    selection.addRange(range);\n\n    var successful = document.execCommand(\"copy\");\n    if (!successful) {\n      throw new Error(\"copy command was unsuccessful\");\n    }\n    success = true;\n  } catch (err) {\n    debug && console.error(\"unable to copy using execCommand: \", err);\n    debug && console.warn(\"trying IE specific stuff\");\n    try {\n      window.clipboardData.setData(options.format || \"text\", text);\n      options.onCopy && options.onCopy(window.clipboardData);\n      success = true;\n    } catch (err) {\n      debug && console.error(\"unable to copy using clipboardData: \", err);\n      debug && console.error(\"falling back to prompt\");\n      message = format(\"message\" in options ? options.message : defaultMessage);\n      window.prompt(message, text);\n    }\n  } finally {\n    if (selection) {\n      if (typeof selection.removeRange == \"function\") {\n        selection.removeRange(range);\n      } else {\n        selection.removeAllRanges();\n      }\n    }\n\n    if (mark) {\n      document.body.removeChild(mark);\n    }\n    reselectPrevious();\n  }\n\n  return success;\n}\n\nmodule.exports = copy;\n", "/*\n * Toastr\n * Copyright 2012-2015\n * Authors: John Papa, Hans Fj\u00E4llemark, and Tim Ferrell.\n * All Rights Reserved.\n * Use, reproduction, distribution, and modification of this code is subject to the terms and\n * conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php\n *\n * ARIA Support: Greta Krafsig\n *\n * Project: https://github.com/CodeSeven/toastr\n */\n/* global define */\n(function (define) {\n    define(['jquery'], function ($) {\n        return (function () {\n            var $container;\n            var listener;\n            var toastId = 0;\n            var toastType = {\n                error: 'error',\n                info: 'info',\n                success: 'success',\n                warning: 'warning'\n            };\n\n            var toastr = {\n                clear: clear,\n                remove: remove,\n                error: error,\n                getContainer: getContainer,\n                info: info,\n                options: {},\n                subscribe: subscribe,\n                success: success,\n                version: '2.1.4',\n                warning: warning\n            };\n\n            var previousToast;\n\n            return toastr;\n\n            ////////////////\n\n            function error(message, title, optionsOverride) {\n                return notify({\n                    type: toastType.error,\n                    iconClass: getOptions().iconClasses.error,\n                    message: message,\n                    optionsOverride: optionsOverride,\n                    title: title\n                });\n            }\n\n            function getContainer(options, create) {\n                if (!options) { options = getOptions(); }\n                $container = $('#' + options.containerId);\n                if ($container.length) {\n                    return $container;\n                }\n                if (create) {\n                    $container = createContainer(options);\n                }\n                return $container;\n            }\n\n            function info(message, title, optionsOverride) {\n                return notify({\n                    type: toastType.info,\n                    iconClass: getOptions().iconClasses.info,\n                    message: message,\n                    optionsOverride: optionsOverride,\n                    title: title\n                });\n            }\n\n            function subscribe(callback) {\n                listener = callback;\n            }\n\n            function success(message, title, optionsOverride) {\n                return notify({\n                    type: toastType.success,\n                    iconClass: getOptions().iconClasses.success,\n                    message: message,\n                    optionsOverride: optionsOverride,\n                    title: title\n                });\n            }\n\n            function warning(message, title, optionsOverride) {\n                return notify({\n                    type: toastType.warning,\n                    iconClass: getOptions().iconClasses.warning,\n                    message: message,\n                    optionsOverride: optionsOverride,\n                    title: title\n                });\n            }\n\n            function clear($toastElement, clearOptions) {\n                var options = getOptions();\n                if (!$container) { getContainer(options); }\n                if (!clearToast($toastElement, options, clearOptions)) {\n                    clearContainer(options);\n                }\n            }\n\n            function remove($toastElement) {\n                var options = getOptions();\n                if (!$container) { getContainer(options); }\n                if ($toastElement && $(':focus', $toastElement).length === 0) {\n                    removeToast($toastElement);\n                    return;\n                }\n                if ($container.children().length) {\n                    $container.remove();\n                }\n            }\n\n            // internal functions\n\n            function clearContainer (options) {\n                var toastsToClear = $container.children();\n                for (var i = toastsToClear.length - 1; i >= 0; i--) {\n                    clearToast($(toastsToClear[i]), options);\n                }\n            }\n\n            function clearToast ($toastElement, options, clearOptions) {\n                var force = clearOptions && clearOptions.force ? clearOptions.force : false;\n                if ($toastElement && (force || $(':focus', $toastElement).length === 0)) {\n                    $toastElement[options.hideMethod]({\n                        duration: options.hideDuration,\n                        easing: options.hideEasing,\n                        complete: function () { removeToast($toastElement); }\n                    });\n                    return true;\n                }\n                return false;\n            }\n\n            function createContainer(options) {\n                $container = $('<div/>')\n                    .attr('id', options.containerId)\n                    .addClass(options.positionClass);\n\n                $container.appendTo($(options.target));\n                return $container;\n            }\n\n            function getDefaults() {\n                return {\n                    tapToDismiss: true,\n                    toastClass: 'toast',\n                    containerId: 'toast-container',\n                    debug: false,\n\n                    showMethod: 'fadeIn', //fadeIn, slideDown, and show are built into jQuery\n                    showDuration: 300,\n                    showEasing: 'swing', //swing and linear are built into jQuery\n                    onShown: undefined,\n                    hideMethod: 'fadeOut',\n                    hideDuration: 1000,\n                    hideEasing: 'swing',\n                    onHidden: undefined,\n                    closeMethod: false,\n                    closeDuration: false,\n                    closeEasing: false,\n                    closeOnHover: true,\n\n                    extendedTimeOut: 1000,\n                    iconClasses: {\n                        error: 'toast-error',\n                        info: 'toast-info',\n                        success: 'toast-success',\n                        warning: 'toast-warning'\n                    },\n                    iconClass: 'toast-info',\n                    positionClass: 'toast-top-right',\n                    timeOut: 5000, // Set timeOut and extendedTimeOut to 0 to make it sticky\n                    titleClass: 'toast-title',\n                    messageClass: 'toast-message',\n                    escapeHtml: false,\n                    target: 'body',\n                    closeHtml: '<button type=\"button\">&times;</button>',\n                    closeClass: 'toast-close-button',\n                    newestOnTop: true,\n                    preventDuplicates: false,\n                    progressBar: false,\n                    progressClass: 'toast-progress',\n                    rtl: false\n                };\n            }\n\n            function publish(args) {\n                if (!listener) { return; }\n                listener(args);\n            }\n\n            function notify(map) {\n                var options = getOptions();\n                var iconClass = map.iconClass || options.iconClass;\n\n                if (typeof (map.optionsOverride) !== 'undefined') {\n                    options = $.extend(options, map.optionsOverride);\n                    iconClass = map.optionsOverride.iconClass || iconClass;\n                }\n\n                if (shouldExit(options, map)) { return; }\n\n                toastId++;\n\n                $container = getContainer(options, true);\n\n                var intervalId = null;\n                var $toastElement = $('<div/>');\n                var $titleElement = $('<div/>');\n                var $messageElement = $('<div/>');\n                var $progressElement = $('<div/>');\n                var $closeElement = $(options.closeHtml);\n                var progressBar = {\n                    intervalId: null,\n                    hideEta: null,\n                    maxHideTime: null\n                };\n                var response = {\n                    toastId: toastId,\n                    state: 'visible',\n                    startTime: new Date(),\n                    options: options,\n                    map: map\n                };\n\n                personalizeToast();\n\n                displayToast();\n\n                handleEvents();\n\n                publish(response);\n\n                if (options.debug && console) {\n                    console.log(response);\n                }\n\n                return $toastElement;\n\n                function escapeHtml(source) {\n                    if (source == null) {\n                        source = '';\n                    }\n\n                    return source\n                        .replace(/&/g, '&amp;')\n                        .replace(/\"/g, '&quot;')\n                        .replace(/'/g, '&#39;')\n                        .replace(/</g, '&lt;')\n                        .replace(/>/g, '&gt;');\n                }\n\n                function personalizeToast() {\n                    setIcon();\n                    setTitle();\n                    setMessage();\n                    setCloseButton();\n                    setProgressBar();\n                    setRTL();\n                    setSequence();\n                    setAria();\n                }\n\n                function setAria() {\n                    var ariaValue = '';\n                    switch (map.iconClass) {\n                        case 'toast-success':\n                        case 'toast-info':\n                            ariaValue =  'polite';\n                            break;\n                        default:\n                            ariaValue = 'assertive';\n                    }\n                    $toastElement.attr('aria-live', ariaValue);\n                }\n\n                function handleEvents() {\n                    if (options.closeOnHover) {\n                        $toastElement.hover(stickAround, delayedHideToast);\n                    }\n\n                    if (!options.onclick && options.tapToDismiss) {\n                        $toastElement.click(hideToast);\n                    }\n\n                    if (options.closeButton && $closeElement) {\n                        $closeElement.click(function (event) {\n                            if (event.stopPropagation) {\n                                event.stopPropagation();\n                            } else if (event.cancelBubble !== undefined && event.cancelBubble !== true) {\n                                event.cancelBubble = true;\n                            }\n\n                            if (options.onCloseClick) {\n                                options.onCloseClick(event);\n                            }\n\n                            hideToast(true);\n                        });\n                    }\n\n                    if (options.onclick) {\n                        $toastElement.click(function (event) {\n                            options.onclick(event);\n                            hideToast();\n                        });\n                    }\n                }\n\n                function displayToast() {\n                    $toastElement.hide();\n\n                    $toastElement[options.showMethod](\n                        {duration: options.showDuration, easing: options.showEasing, complete: options.onShown}\n                    );\n\n                    if (options.timeOut > 0) {\n                        intervalId = setTimeout(hideToast, options.timeOut);\n                        progressBar.maxHideTime = parseFloat(options.timeOut);\n                        progressBar.hideEta = new Date().getTime() + progressBar.maxHideTime;\n                        if (options.progressBar) {\n                            progressBar.intervalId = setInterval(updateProgress, 10);\n                        }\n                    }\n                }\n\n                function setIcon() {\n                    if (map.iconClass) {\n                        $toastElement.addClass(options.toastClass).addClass(iconClass);\n                    }\n                }\n\n                function setSequence() {\n                    if (options.newestOnTop) {\n                        $container.prepend($toastElement);\n                    } else {\n                        $container.append($toastElement);\n                    }\n                }\n\n                function setTitle() {\n                    if (map.title) {\n                        var suffix = map.title;\n                        if (options.escapeHtml) {\n                            suffix = escapeHtml(map.title);\n                        }\n                        $titleElement.append(suffix).addClass(options.titleClass);\n                        $toastElement.append($titleElement);\n                    }\n                }\n\n                function setMessage() {\n                    if (map.message) {\n                        var suffix = map.message;\n                        if (options.escapeHtml) {\n                            suffix = escapeHtml(map.message);\n                        }\n                        $messageElement.append(suffix).addClass(options.messageClass);\n                        $toastElement.append($messageElement);\n                    }\n                }\n\n                function setCloseButton() {\n                    if (options.closeButton) {\n                        $closeElement.addClass(options.closeClass).attr('role', 'button');\n                        $toastElement.prepend($closeElement);\n                    }\n                }\n\n                function setProgressBar() {\n                    if (options.progressBar) {\n                        $progressElement.addClass(options.progressClass);\n                        $toastElement.prepend($progressElement);\n                    }\n                }\n\n                function setRTL() {\n                    if (options.rtl) {\n                        $toastElement.addClass('rtl');\n                    }\n                }\n\n                function shouldExit(options, map) {\n                    if (options.preventDuplicates) {\n                        if (map.message === previousToast) {\n                            return true;\n                        } else {\n                            previousToast = map.message;\n                        }\n                    }\n                    return false;\n                }\n\n                function hideToast(override) {\n                    var method = override && options.closeMethod !== false ? options.closeMethod : options.hideMethod;\n                    var duration = override && options.closeDuration !== false ?\n                        options.closeDuration : options.hideDuration;\n                    var easing = override && options.closeEasing !== false ? options.closeEasing : options.hideEasing;\n                    if ($(':focus', $toastElement).length && !override) {\n                        return;\n                    }\n                    clearTimeout(progressBar.intervalId);\n                    return $toastElement[method]({\n                        duration: duration,\n                        easing: easing,\n                        complete: function () {\n                            removeToast($toastElement);\n                            clearTimeout(intervalId);\n                            if (options.onHidden && response.state !== 'hidden') {\n                                options.onHidden();\n                            }\n                            response.state = 'hidden';\n                            response.endTime = new Date();\n                            publish(response);\n                        }\n                    });\n                }\n\n                function delayedHideToast() {\n                    if (options.timeOut > 0 || options.extendedTimeOut > 0) {\n                        intervalId = setTimeout(hideToast, options.extendedTimeOut);\n                        progressBar.maxHideTime = parseFloat(options.extendedTimeOut);\n                        progressBar.hideEta = new Date().getTime() + progressBar.maxHideTime;\n                    }\n                }\n\n                function stickAround() {\n                    clearTimeout(intervalId);\n                    progressBar.hideEta = 0;\n                    $toastElement.stop(true, true)[options.showMethod](\n                        {duration: options.showDuration, easing: options.showEasing}\n                    );\n                }\n\n                function updateProgress() {\n                    var percentage = ((progressBar.hideEta - (new Date().getTime())) / progressBar.maxHideTime) * 100;\n                    $progressElement.width(percentage + '%');\n                }\n            }\n\n            function getOptions() {\n                return $.extend({}, getDefaults(), toastr.options);\n            }\n\n            function removeToast($toastElement) {\n                if (!$container) { $container = getContainer(); }\n                if ($toastElement.is(':visible')) {\n                    return;\n                }\n                $toastElement.remove();\n                $toastElement = null;\n                if ($container.children().length === 0) {\n                    $container.remove();\n                    previousToast = undefined;\n                }\n            }\n\n        })();\n    });\n}(typeof define === 'function' && define.amd ? define : function (deps, factory) {\n    if (typeof module !== 'undefined' && module.exports) { //Node\n        module.exports = factory(require('jquery'));\n    } else {\n        window.toastr = factory(window.jQuery);\n    }\n}));\n", "'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nmodule.exports = function equal(a, b) {\n  if (a === b) return true;\n\n  if (a && b && typeof a == 'object' && typeof b == 'object') {\n    if (a.constructor !== b.constructor) return false;\n\n    var length, i, keys;\n    if (Array.isArray(a)) {\n      length = a.length;\n      if (length != b.length) return false;\n      for (i = length; i-- !== 0;)\n        if (!equal(a[i], b[i])) return false;\n      return true;\n    }\n\n\n\n    if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n    if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n    if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n    keys = Object.keys(a);\n    length = keys.length;\n    if (length !== Object.keys(b).length) return false;\n\n    for (i = length; i-- !== 0;)\n      if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n    for (i = length; i-- !== 0;) {\n      var key = keys[i];\n\n      if (!equal(a[key], b[key])) return false;\n    }\n\n    return true;\n  }\n\n  // true if both NaN, false otherwise\n  return a!==a && b!==b;\n};\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\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n  var len = b64.length\n\n  if (len % 4 > 0) {\n    throw new Error('Invalid string. Length must be a multiple of 4')\n  }\n\n  // Trim off extra bytes after placeholder bytes are found\n  // See: https://github.com/beatgammit/base64-js/issues/42\n  var validLen = b64.indexOf('=')\n  if (validLen === -1) validLen = len\n\n  var placeHoldersLen = validLen === len\n    ? 0\n    : 4 - (validLen % 4)\n\n  return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n  var tmp\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n\n  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n  var curByte = 0\n\n  // if there are placeholders, only get up to the last complete 4 chars\n  var len = placeHoldersLen > 0\n    ? validLen - 4\n    : validLen\n\n  var i\n  for (i = 0; i < len; i += 4) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 18) |\n      (revLookup[b64.charCodeAt(i + 1)] << 12) |\n      (revLookup[b64.charCodeAt(i + 2)] << 6) |\n      revLookup[b64.charCodeAt(i + 3)]\n    arr[curByte++] = (tmp >> 16) & 0xFF\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 2) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 2) |\n      (revLookup[b64.charCodeAt(i + 1)] >> 4)\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 1) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 10) |\n      (revLookup[b64.charCodeAt(i + 1)] << 4) |\n      (revLookup[b64.charCodeAt(i + 2)] >> 2)\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  return arr\n}\n\nfunction tripletToBase64 (num) {\n  return lookup[num >> 18 & 0x3F] +\n    lookup[num >> 12 & 0x3F] +\n    lookup[num >> 6 & 0x3F] +\n    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 =\n      ((uint8[i] << 16) & 0xFF0000) +\n      ((uint8[i + 1] << 8) & 0xFF00) +\n      (uint8[i + 2] & 0xFF)\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 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    parts.push(\n      lookup[tmp >> 2] +\n      lookup[(tmp << 4) & 0x3F] +\n      '=='\n    )\n  } else if (extraBytes === 2) {\n    tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 10] +\n      lookup[(tmp >> 4) & 0x3F] +\n      lookup[(tmp << 2) & 0x3F] +\n      '='\n    )\n  }\n\n  return parts.join('')\n}\n", "var TINF_OK = 0;\nvar TINF_DATA_ERROR = -3;\n\nfunction Tree() {\n  this.table = new Uint16Array(16);   /* table of code length counts */\n  this.trans = new Uint16Array(288);  /* code -> symbol translation table */\n}\n\nfunction Data(source, dest) {\n  this.source = source;\n  this.sourceIndex = 0;\n  this.tag = 0;\n  this.bitcount = 0;\n  \n  this.dest = dest;\n  this.destLen = 0;\n  \n  this.ltree = new Tree();  /* dynamic length/symbol tree */\n  this.dtree = new Tree();  /* dynamic distance tree */\n}\n\n/* --------------------------------------------------- *\n * -- uninitialized global data (static structures) -- *\n * --------------------------------------------------- */\n\nvar sltree = new Tree();\nvar sdtree = new Tree();\n\n/* extra bits and base tables for length codes */\nvar length_bits = new Uint8Array(30);\nvar length_base = new Uint16Array(30);\n\n/* extra bits and base tables for distance codes */\nvar dist_bits = new Uint8Array(30);\nvar dist_base = new Uint16Array(30);\n\n/* special ordering of code length codes */\nvar clcidx = new Uint8Array([\n  16, 17, 18, 0, 8, 7, 9, 6,\n  10, 5, 11, 4, 12, 3, 13, 2,\n  14, 1, 15\n]);\n\n/* used by tinf_decode_trees, avoids allocations every call */\nvar code_tree = new Tree();\nvar lengths = new Uint8Array(288 + 32);\n\n/* ----------------------- *\n * -- utility functions -- *\n * ----------------------- */\n\n/* build extra bits and base tables */\nfunction tinf_build_bits_base(bits, base, delta, first) {\n  var i, sum;\n\n  /* build bits table */\n  for (i = 0; i < delta; ++i) bits[i] = 0;\n  for (i = 0; i < 30 - delta; ++i) bits[i + delta] = i / delta | 0;\n\n  /* build base table */\n  for (sum = first, i = 0; i < 30; ++i) {\n    base[i] = sum;\n    sum += 1 << bits[i];\n  }\n}\n\n/* build the fixed huffman trees */\nfunction tinf_build_fixed_trees(lt, dt) {\n  var i;\n\n  /* build fixed length tree */\n  for (i = 0; i < 7; ++i) lt.table[i] = 0;\n\n  lt.table[7] = 24;\n  lt.table[8] = 152;\n  lt.table[9] = 112;\n\n  for (i = 0; i < 24; ++i) lt.trans[i] = 256 + i;\n  for (i = 0; i < 144; ++i) lt.trans[24 + i] = i;\n  for (i = 0; i < 8; ++i) lt.trans[24 + 144 + i] = 280 + i;\n  for (i = 0; i < 112; ++i) lt.trans[24 + 144 + 8 + i] = 144 + i;\n\n  /* build fixed distance tree */\n  for (i = 0; i < 5; ++i) dt.table[i] = 0;\n\n  dt.table[5] = 32;\n\n  for (i = 0; i < 32; ++i) dt.trans[i] = i;\n}\n\n/* given an array of code lengths, build a tree */\nvar offs = new Uint16Array(16);\n\nfunction tinf_build_tree(t, lengths, off, num) {\n  var i, sum;\n\n  /* clear code length count table */\n  for (i = 0; i < 16; ++i) t.table[i] = 0;\n\n  /* scan symbol lengths, and sum code length counts */\n  for (i = 0; i < num; ++i) t.table[lengths[off + i]]++;\n\n  t.table[0] = 0;\n\n  /* compute offset table for distribution sort */\n  for (sum = 0, i = 0; i < 16; ++i) {\n    offs[i] = sum;\n    sum += t.table[i];\n  }\n\n  /* create code->symbol translation table (symbols sorted by code) */\n  for (i = 0; i < num; ++i) {\n    if (lengths[off + i]) t.trans[offs[lengths[off + i]]++] = i;\n  }\n}\n\n/* ---------------------- *\n * -- decode functions -- *\n * ---------------------- */\n\n/* get one bit from source stream */\nfunction tinf_getbit(d) {\n  /* check if tag is empty */\n  if (!d.bitcount--) {\n    /* load next tag */\n    d.tag = d.source[d.sourceIndex++];\n    d.bitcount = 7;\n  }\n\n  /* shift bit out of tag */\n  var bit = d.tag & 1;\n  d.tag >>>= 1;\n\n  return bit;\n}\n\n/* read a num bit value from a stream and add base */\nfunction tinf_read_bits(d, num, base) {\n  if (!num)\n    return base;\n\n  while (d.bitcount < 24) {\n    d.tag |= d.source[d.sourceIndex++] << d.bitcount;\n    d.bitcount += 8;\n  }\n\n  var val = d.tag & (0xffff >>> (16 - num));\n  d.tag >>>= num;\n  d.bitcount -= num;\n  return val + base;\n}\n\n/* given a data stream and a tree, decode a symbol */\nfunction tinf_decode_symbol(d, t) {\n  while (d.bitcount < 24) {\n    d.tag |= d.source[d.sourceIndex++] << d.bitcount;\n    d.bitcount += 8;\n  }\n  \n  var sum = 0, cur = 0, len = 0;\n  var tag = d.tag;\n\n  /* get more bits while code value is above sum */\n  do {\n    cur = 2 * cur + (tag & 1);\n    tag >>>= 1;\n    ++len;\n\n    sum += t.table[len];\n    cur -= t.table[len];\n  } while (cur >= 0);\n  \n  d.tag = tag;\n  d.bitcount -= len;\n\n  return t.trans[sum + cur];\n}\n\n/* given a data stream, decode dynamic trees from it */\nfunction tinf_decode_trees(d, lt, dt) {\n  var hlit, hdist, hclen;\n  var i, num, length;\n\n  /* get 5 bits HLIT (257-286) */\n  hlit = tinf_read_bits(d, 5, 257);\n\n  /* get 5 bits HDIST (1-32) */\n  hdist = tinf_read_bits(d, 5, 1);\n\n  /* get 4 bits HCLEN (4-19) */\n  hclen = tinf_read_bits(d, 4, 4);\n\n  for (i = 0; i < 19; ++i) lengths[i] = 0;\n\n  /* read code lengths for code length alphabet */\n  for (i = 0; i < hclen; ++i) {\n    /* get 3 bits code length (0-7) */\n    var clen = tinf_read_bits(d, 3, 0);\n    lengths[clcidx[i]] = clen;\n  }\n\n  /* build code length tree */\n  tinf_build_tree(code_tree, lengths, 0, 19);\n\n  /* decode code lengths for the dynamic trees */\n  for (num = 0; num < hlit + hdist;) {\n    var sym = tinf_decode_symbol(d, code_tree);\n\n    switch (sym) {\n      case 16:\n        /* copy previous code length 3-6 times (read 2 bits) */\n        var prev = lengths[num - 1];\n        for (length = tinf_read_bits(d, 2, 3); length; --length) {\n          lengths[num++] = prev;\n        }\n        break;\n      case 17:\n        /* repeat code length 0 for 3-10 times (read 3 bits) */\n        for (length = tinf_read_bits(d, 3, 3); length; --length) {\n          lengths[num++] = 0;\n        }\n        break;\n      case 18:\n        /* repeat code length 0 for 11-138 times (read 7 bits) */\n        for (length = tinf_read_bits(d, 7, 11); length; --length) {\n          lengths[num++] = 0;\n        }\n        break;\n      default:\n        /* values 0-15 represent the actual code lengths */\n        lengths[num++] = sym;\n        break;\n    }\n  }\n\n  /* build dynamic trees */\n  tinf_build_tree(lt, lengths, 0, hlit);\n  tinf_build_tree(dt, lengths, hlit, hdist);\n}\n\n/* ----------------------------- *\n * -- block inflate functions -- *\n * ----------------------------- */\n\n/* given a stream and two trees, inflate a block of data */\nfunction tinf_inflate_block_data(d, lt, dt) {\n  while (1) {\n    var sym = tinf_decode_symbol(d, lt);\n\n    /* check for end of block */\n    if (sym === 256) {\n      return TINF_OK;\n    }\n\n    if (sym < 256) {\n      d.dest[d.destLen++] = sym;\n    } else {\n      var length, dist, offs;\n      var i;\n\n      sym -= 257;\n\n      /* possibly get more bits from length code */\n      length = tinf_read_bits(d, length_bits[sym], length_base[sym]);\n\n      dist = tinf_decode_symbol(d, dt);\n\n      /* possibly get more bits from distance code */\n      offs = d.destLen - tinf_read_bits(d, dist_bits[dist], dist_base[dist]);\n\n      /* copy match */\n      for (i = offs; i < offs + length; ++i) {\n        d.dest[d.destLen++] = d.dest[i];\n      }\n    }\n  }\n}\n\n/* inflate an uncompressed block of data */\nfunction tinf_inflate_uncompressed_block(d) {\n  var length, invlength;\n  var i;\n  \n  /* unread from bitbuffer */\n  while (d.bitcount > 8) {\n    d.sourceIndex--;\n    d.bitcount -= 8;\n  }\n\n  /* get length */\n  length = d.source[d.sourceIndex + 1];\n  length = 256 * length + d.source[d.sourceIndex];\n\n  /* get one's complement of length */\n  invlength = d.source[d.sourceIndex + 3];\n  invlength = 256 * invlength + d.source[d.sourceIndex + 2];\n\n  /* check length */\n  if (length !== (~invlength & 0x0000ffff))\n    return TINF_DATA_ERROR;\n\n  d.sourceIndex += 4;\n\n  /* copy block */\n  for (i = length; i; --i)\n    d.dest[d.destLen++] = d.source[d.sourceIndex++];\n\n  /* make sure we start next block on a byte boundary */\n  d.bitcount = 0;\n\n  return TINF_OK;\n}\n\n/* inflate stream from source to dest */\nfunction tinf_uncompress(source, dest) {\n  var d = new Data(source, dest);\n  var bfinal, btype, res;\n\n  do {\n    /* read final block flag */\n    bfinal = tinf_getbit(d);\n\n    /* read block type (2 bits) */\n    btype = tinf_read_bits(d, 2, 0);\n\n    /* decompress block */\n    switch (btype) {\n      case 0:\n        /* decompress uncompressed block */\n        res = tinf_inflate_uncompressed_block(d);\n        break;\n      case 1:\n        /* decompress block with fixed huffman trees */\n        res = tinf_inflate_block_data(d, sltree, sdtree);\n        break;\n      case 2:\n        /* decompress block with dynamic huffman trees */\n        tinf_decode_trees(d, d.ltree, d.dtree);\n        res = tinf_inflate_block_data(d, d.ltree, d.dtree);\n        break;\n      default:\n        res = TINF_DATA_ERROR;\n    }\n\n    if (res !== TINF_OK)\n      throw new Error('Data error');\n\n  } while (!bfinal);\n\n  if (d.destLen < d.dest.length) {\n    if (typeof d.dest.slice === 'function')\n      return d.dest.slice(0, d.destLen);\n    else\n      return d.dest.subarray(0, d.destLen);\n  }\n  \n  return d.dest;\n}\n\n/* -------------------- *\n * -- initialization -- *\n * -------------------- */\n\n/* build fixed huffman trees */\ntinf_build_fixed_trees(sltree, sdtree);\n\n/* build extra bits and base tables */\ntinf_build_bits_base(length_bits, length_base, 4, 3);\ntinf_build_bits_base(dist_bits, dist_base, 2, 1);\n\n/* fix a special case */\nlength_bits[28] = 0;\nlength_base[28] = 258;\n\nmodule.exports = tinf_uncompress;\n", "const isBigEndian = (new Uint8Array(new Uint32Array([0x12345678]).buffer)[0] === 0x12);\n\nconst swap = (b, n, m) => {\n  let i = b[n];\n  b[n] = b[m];\n  b[m] = i;\n};\n\nconst swap32 = array => {\n  const len = array.length;\n  for (let i = 0; i < len; i += 4) {\n    swap(array, i, i + 3);\n    swap(array, i + 1, i + 2);\n  }\n};\n\nconst swap32LE = array => {\n  if (isBigEndian) {\n    swap32(array);\n  }\n};\n\nmodule.exports = {\n  swap32LE: swap32LE\n};\n", "const inflate = require('tiny-inflate');\nconst { swap32LE } = require('./swap');\n\n// Shift size for getting the index-1 table offset.\nconst SHIFT_1 = 6 + 5;\n\n// Shift size for getting the index-2 table offset.\nconst SHIFT_2 = 5;\n\n// Difference between the two shift sizes,\n// for getting an index-1 offset from an index-2 offset. 6=11-5\nconst SHIFT_1_2 = SHIFT_1 - SHIFT_2;\n\n// Number of index-1 entries for the BMP. 32=0x20\n// This part of the index-1 table is omitted from the serialized form.\nconst OMITTED_BMP_INDEX_1_LENGTH = 0x10000 >> SHIFT_1;\n\n// Number of entries in an index-2 block. 64=0x40\nconst INDEX_2_BLOCK_LENGTH = 1 << SHIFT_1_2;\n\n// Mask for getting the lower bits for the in-index-2-block offset. */\nconst INDEX_2_MASK = INDEX_2_BLOCK_LENGTH - 1;\n\n// Shift size for shifting left the index array values.\n// Increases possible data size with 16-bit index values at the cost\n// of compactability.\n// This requires data blocks to be aligned by DATA_GRANULARITY.\nconst INDEX_SHIFT = 2;\n\n// Number of entries in a data block. 32=0x20\nconst DATA_BLOCK_LENGTH = 1 << SHIFT_2;\n\n// Mask for getting the lower bits for the in-data-block offset.\nconst DATA_MASK = DATA_BLOCK_LENGTH - 1;\n\n// The part of the index-2 table for U+D800..U+DBFF stores values for\n// lead surrogate code _units_ not code _points_.\n// Values for lead surrogate code _points_ are indexed with this portion of the table.\n// Length=32=0x20=0x400>>SHIFT_2. (There are 1024=0x400 lead surrogates.)\nconst LSCP_INDEX_2_OFFSET = 0x10000 >> SHIFT_2;\nconst LSCP_INDEX_2_LENGTH = 0x400 >> SHIFT_2;\n\n// Count the lengths of both BMP pieces. 2080=0x820\nconst INDEX_2_BMP_LENGTH = LSCP_INDEX_2_OFFSET + LSCP_INDEX_2_LENGTH;\n\n// The 2-byte UTF-8 version of the index-2 table follows at offset 2080=0x820.\n// Length 32=0x20 for lead bytes C0..DF, regardless of SHIFT_2.\nconst UTF8_2B_INDEX_2_OFFSET = INDEX_2_BMP_LENGTH;\nconst UTF8_2B_INDEX_2_LENGTH = 0x800 >> 6;  // U+0800 is the first code point after 2-byte UTF-8\n\n// The index-1 table, only used for supplementary code points, at offset 2112=0x840.\n// Variable length, for code points up to highStart, where the last single-value range starts.\n// Maximum length 512=0x200=0x100000>>SHIFT_1.\n// (For 0x100000 supplementary code points U+10000..U+10ffff.)\n//\n// The part of the index-2 table for supplementary code points starts\n// after this index-1 table.\n//\n// Both the index-1 table and the following part of the index-2 table\n// are omitted completely if there is only BMP data.\nconst INDEX_1_OFFSET = UTF8_2B_INDEX_2_OFFSET + UTF8_2B_INDEX_2_LENGTH;\n\n// The alignment size of a data block. Also the granularity for compaction.\nconst DATA_GRANULARITY = 1 << INDEX_SHIFT;\n\nclass UnicodeTrie {\n  constructor(data) {\n    const isBuffer = (typeof data.readUInt32BE === 'function') && (typeof data.slice === 'function');\n\n    if (isBuffer || data instanceof Uint8Array) {\n      // read binary format\n      let uncompressedLength;\n      if (isBuffer) {\n        this.highStart = data.readUInt32LE(0);\n        this.errorValue = data.readUInt32LE(4);\n        uncompressedLength = data.readUInt32LE(8);\n        data = data.slice(12);\n      } else {\n        const view = new DataView(data.buffer);\n        this.highStart = view.getUint32(0, true);\n        this.errorValue = view.getUint32(4, true);\n        uncompressedLength = view.getUint32(8, true);\n        data = data.subarray(12);\n      }\n\n      // double inflate the actual trie data\n      data = inflate(data, new Uint8Array(uncompressedLength));\n      data = inflate(data, new Uint8Array(uncompressedLength));\n\n      // swap bytes from little-endian\n      swap32LE(data);\n\n      this.data = new Uint32Array(data.buffer);\n\n    } else {\n      // pre-parsed data\n      ({ data: this.data, highStart: this.highStart, errorValue: this.errorValue } = data);\n    }\n  }\n\n  get(codePoint) {\n    let index;\n    if ((codePoint < 0) || (codePoint > 0x10ffff)) {\n      return this.errorValue;\n    }\n\n    if ((codePoint < 0xd800) || ((codePoint > 0xdbff) && (codePoint <= 0xffff))) {\n      // Ordinary BMP code point, excluding leading surrogates.\n      // BMP uses a single level lookup.  BMP index starts at offset 0 in the index.\n      // data is stored in the index array itself.\n      index = (this.data[codePoint >> SHIFT_2] << INDEX_SHIFT) + (codePoint & DATA_MASK);\n      return this.data[index];\n    }\n\n    if (codePoint <= 0xffff) {\n      // Lead Surrogate Code Point.  A Separate index section is stored for\n      // lead surrogate code units and code points.\n      //   The main index has the code unit data.\n      //   For this function, we need the code point data.\n      index = (this.data[LSCP_INDEX_2_OFFSET + ((codePoint - 0xd800) >> SHIFT_2)] << INDEX_SHIFT) + (codePoint & DATA_MASK);\n      return this.data[index];\n    }\n\n    if (codePoint < this.highStart) {\n      // Supplemental code point, use two-level lookup.\n      index = this.data[(INDEX_1_OFFSET - OMITTED_BMP_INDEX_1_LENGTH) + (codePoint >> SHIFT_1)];\n      index = this.data[index + ((codePoint >> SHIFT_2) & INDEX_2_MASK)];\n      index = (index << INDEX_SHIFT) + (codePoint & DATA_MASK);\n      return this.data[index];\n    }\n\n    return this.data[this.data.length - DATA_GRANULARITY];\n  }\n}\n\nmodule.exports = UnicodeTrie;", "const INITIAL_STATE = 1;\nconst FAIL_STATE = 0;\n\n/**\n * A StateMachine represents a deterministic finite automaton.\n * It can perform matches over a sequence of values, similar to a regular expression.\n */\nexport default class StateMachine {\n  constructor(dfa) {\n    this.stateTable = dfa.stateTable;\n    this.accepting = dfa.accepting;\n    this.tags = dfa.tags;\n  }\n\n  /**\n   * Returns an iterable object that yields pattern matches over the input sequence.\n   * Matches are of the form [startIndex, endIndex, tags].\n   */\n  match(str) {\n    let self = this;\n    return {\n      *[Symbol.iterator]() {\n        let state = INITIAL_STATE;\n        let startRun = null;\n        let lastAccepting = null;\n        let lastState = null;\n\n        for (let p = 0; p < str.length; p++) {\n          let c = str[p];\n\n          lastState = state;\n          state = self.stateTable[state][c];\n\n          if (state === FAIL_STATE) {\n            // yield the last match if any\n            if (startRun != null && lastAccepting != null && lastAccepting >= startRun) {\n              yield [startRun, lastAccepting, self.tags[lastState]];\n            }\n\n            // reset the state as if we started over from the initial state\n            state = self.stateTable[INITIAL_STATE][c];\n            startRun = null;\n          }\n\n          // start a run if not in the failure state\n          if (state !== FAIL_STATE && startRun == null) {\n            startRun = p;\n          }\n\n          // if accepting, mark the potential match end\n          if (self.accepting[state]) {\n            lastAccepting = p;\n          }\n\n          // reset the state to the initial state if we get into the failure state\n          if (state === FAIL_STATE) {\n            state = INITIAL_STATE;\n          }\n        }\n\n        // yield the last match if any\n        if (startRun != null && lastAccepting != null && lastAccepting >= startRun) {\n          yield [startRun, lastAccepting, self.tags[state]];\n        }\n      }\n    };\n  }\n\n  /**\n   * For each match over the input sequence, action functions matching\n   * the tag definitions in the input pattern are called with the startIndex,\n   * endIndex, and sub-match sequence.\n   */\n  apply(str, actions) {\n    for (let [start, end, tags] of this.match(str)) {\n      for (let tag of tags) {\n        if (typeof actions[tag] === 'function') {\n          actions[tag](start, end, str.slice(start, end + 1));\n        }\n      }\n    }\n  }\n}\n", "var clone = (function() {\n'use strict';\n\nfunction _instanceof(obj, type) {\n  return type != null && obj instanceof type;\n}\n\nvar nativeMap;\ntry {\n  nativeMap = Map;\n} catch(_) {\n  // maybe a reference error because no `Map`. Give it a dummy value that no\n  // value will ever be an instanceof.\n  nativeMap = function() {};\n}\n\nvar nativeSet;\ntry {\n  nativeSet = Set;\n} catch(_) {\n  nativeSet = function() {};\n}\n\nvar nativePromise;\ntry {\n  nativePromise = Promise;\n} catch(_) {\n  nativePromise = function() {};\n}\n\n/**\n * Clones (copies) an Object using deep copying.\n *\n * This function supports circular references by default, but if you are certain\n * there are no circular references in your object, you can save some CPU time\n * by calling clone(obj, false).\n *\n * Caution: if `circular` is false and `parent` contains circular references,\n * your program may enter an infinite loop and crash.\n *\n * @param `parent` - the object to be cloned\n * @param `circular` - set to true if the object to be cloned may contain\n *    circular references. (optional - true by default)\n * @param `depth` - set to a number if the object is only to be cloned to\n *    a particular depth. (optional - defaults to Infinity)\n * @param `prototype` - sets the prototype to be used when cloning an object.\n *    (optional - defaults to parent prototype).\n * @param `includeNonEnumerable` - set to true if the non-enumerable properties\n *    should be cloned as well. Non-enumerable properties on the prototype\n *    chain will be ignored. (optional - false by default)\n*/\nfunction clone(parent, circular, depth, prototype, includeNonEnumerable) {\n  if (typeof circular === 'object') {\n    depth = circular.depth;\n    prototype = circular.prototype;\n    includeNonEnumerable = circular.includeNonEnumerable;\n    circular = circular.circular;\n  }\n  // maintain two arrays for circular references, where corresponding parents\n  // and children have the same index\n  var allParents = [];\n  var allChildren = [];\n\n  var useBuffer = typeof Buffer != 'undefined';\n\n  if (typeof circular == 'undefined')\n    circular = true;\n\n  if (typeof depth == 'undefined')\n    depth = Infinity;\n\n  // recurse this function so we don't reset allParents and allChildren\n  function _clone(parent, depth) {\n    // cloning null always returns null\n    if (parent === null)\n      return null;\n\n    if (depth === 0)\n      return parent;\n\n    var child;\n    var proto;\n    if (typeof parent != 'object') {\n      return parent;\n    }\n\n    if (_instanceof(parent, nativeMap)) {\n      child = new nativeMap();\n    } else if (_instanceof(parent, nativeSet)) {\n      child = new nativeSet();\n    } else if (_instanceof(parent, nativePromise)) {\n      child = new nativePromise(function (resolve, reject) {\n        parent.then(function(value) {\n          resolve(_clone(value, depth - 1));\n        }, function(err) {\n          reject(_clone(err, depth - 1));\n        });\n      });\n    } else if (clone.__isArray(parent)) {\n      child = [];\n    } else if (clone.__isRegExp(parent)) {\n      child = new RegExp(parent.source, __getRegExpFlags(parent));\n      if (parent.lastIndex) child.lastIndex = parent.lastIndex;\n    } else if (clone.__isDate(parent)) {\n      child = new Date(parent.getTime());\n    } else if (useBuffer && Buffer.isBuffer(parent)) {\n      if (Buffer.allocUnsafe) {\n        // Node.js >= 4.5.0\n        child = Buffer.allocUnsafe(parent.length);\n      } else {\n        // Older Node.js versions\n        child = new Buffer(parent.length);\n      }\n      parent.copy(child);\n      return child;\n    } else if (_instanceof(parent, Error)) {\n      child = Object.create(parent);\n    } else {\n      if (typeof prototype == 'undefined') {\n        proto = Object.getPrototypeOf(parent);\n        child = Object.create(proto);\n      }\n      else {\n        child = Object.create(prototype);\n        proto = prototype;\n      }\n    }\n\n    if (circular) {\n      var index = allParents.indexOf(parent);\n\n      if (index != -1) {\n        return allChildren[index];\n      }\n      allParents.push(parent);\n      allChildren.push(child);\n    }\n\n    if (_instanceof(parent, nativeMap)) {\n      parent.forEach(function(value, key) {\n        var keyChild = _clone(key, depth - 1);\n        var valueChild = _clone(value, depth - 1);\n        child.set(keyChild, valueChild);\n      });\n    }\n    if (_instanceof(parent, nativeSet)) {\n      parent.forEach(function(value) {\n        var entryChild = _clone(value, depth - 1);\n        child.add(entryChild);\n      });\n    }\n\n    for (var i in parent) {\n      var attrs;\n      if (proto) {\n        attrs = Object.getOwnPropertyDescriptor(proto, i);\n      }\n\n      if (attrs && attrs.set == null) {\n        continue;\n      }\n      child[i] = _clone(parent[i], depth - 1);\n    }\n\n    if (Object.getOwnPropertySymbols) {\n      var symbols = Object.getOwnPropertySymbols(parent);\n      for (var i = 0; i < symbols.length; i++) {\n        // Don't need to worry about cloning a symbol because it is a primitive,\n        // like a number or string.\n        var symbol = symbols[i];\n        var descriptor = Object.getOwnPropertyDescriptor(parent, symbol);\n        if (descriptor && !descriptor.enumerable && !includeNonEnumerable) {\n          continue;\n        }\n        child[symbol] = _clone(parent[symbol], depth - 1);\n        if (!descriptor.enumerable) {\n          Object.defineProperty(child, symbol, {\n            enumerable: false\n          });\n        }\n      }\n    }\n\n    if (includeNonEnumerable) {\n      var allPropertyNames = Object.getOwnPropertyNames(parent);\n      for (var i = 0; i < allPropertyNames.length; i++) {\n        var propertyName = allPropertyNames[i];\n        var descriptor = Object.getOwnPropertyDescriptor(parent, propertyName);\n        if (descriptor && descriptor.enumerable) {\n          continue;\n        }\n        child[propertyName] = _clone(parent[propertyName], depth - 1);\n        Object.defineProperty(child, propertyName, {\n          enumerable: false\n        });\n      }\n    }\n\n    return child;\n  }\n\n  return _clone(parent, depth);\n}\n\n/**\n * Simple flat clone using prototype, accepts only objects, usefull for property\n * override on FLAT configuration object (no nested props).\n *\n * USE WITH CAUTION! This may not behave as you wish if you do not know how this\n * works.\n */\nclone.clonePrototype = function clonePrototype(parent) {\n  if (parent === null)\n    return null;\n\n  var c = function () {};\n  c.prototype = parent;\n  return new c();\n};\n\n// private utility functions\n\nfunction __objToStr(o) {\n  return Object.prototype.toString.call(o);\n}\nclone.__objToStr = __objToStr;\n\nfunction __isDate(o) {\n  return typeof o === 'object' && __objToStr(o) === '[object Date]';\n}\nclone.__isDate = __isDate;\n\nfunction __isArray(o) {\n  return typeof o === 'object' && __objToStr(o) === '[object Array]';\n}\nclone.__isArray = __isArray;\n\nfunction __isRegExp(o) {\n  return typeof o === 'object' && __objToStr(o) === '[object RegExp]';\n}\nclone.__isRegExp = __isRegExp;\n\nfunction __getRegExpFlags(re) {\n  var flags = '';\n  if (re.global) flags += 'g';\n  if (re.ignoreCase) flags += 'i';\n  if (re.multiline) flags += 'm';\n  return flags;\n}\nclone.__getRegExpFlags = __getRegExpFlags;\n\nreturn clone;\n})();\n\nif (typeof module === 'object' && module.exports) {\n  module.exports = clone;\n}\n", "function BrotliInput(buffer) {\n  this.buffer = buffer;\n  this.pos = 0;\n}\n\nBrotliInput.prototype.read = function(buf, i, count) {\n  if (this.pos + count > this.buffer.length) {\n    count = this.buffer.length - this.pos;\n  }\n  \n  for (var p = 0; p < count; p++)\n    buf[i + p] = this.buffer[this.pos + p];\n  \n  this.pos += count;\n  return count;\n}\n\nexports.BrotliInput = BrotliInput;\n\nfunction BrotliOutput(buf) {\n  this.buffer = buf;\n  this.pos = 0;\n}\n\nBrotliOutput.prototype.write = function(buf, count) {\n  if (this.pos + count > this.buffer.length)\n    throw new Error('Output buffer is not large enough');\n  \n  this.buffer.set(buf.subarray(0, count), this.pos);\n  this.pos += count;\n  return count;\n};\n\nexports.BrotliOutput = BrotliOutput;\n", "/* Copyright 2013 Google Inc. All Rights Reserved.\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   Bit reading helpers\n*/\n\nvar BROTLI_READ_SIZE = 4096;\nvar BROTLI_IBUF_SIZE =  (2 * BROTLI_READ_SIZE + 32);\nvar BROTLI_IBUF_MASK =  (2 * BROTLI_READ_SIZE - 1);\n\nvar kBitMask = new Uint32Array([\n  0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767,\n  65535, 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215\n]);\n\n/* Input byte buffer, consist of a ringbuffer and a \"slack\" region where */\n/* bytes from the start of the ringbuffer are copied. */\nfunction BrotliBitReader(input) {\n  this.buf_ = new Uint8Array(BROTLI_IBUF_SIZE);\n  this.input_ = input;    /* input callback */\n  \n  this.reset();\n}\n\nBrotliBitReader.READ_SIZE = BROTLI_READ_SIZE;\nBrotliBitReader.IBUF_MASK = BROTLI_IBUF_MASK;\n\nBrotliBitReader.prototype.reset = function() {\n  this.buf_ptr_ = 0;      /* next input will write here */\n  this.val_ = 0;          /* pre-fetched bits */\n  this.pos_ = 0;          /* byte position in stream */\n  this.bit_pos_ = 0;      /* current bit-reading position in val_ */\n  this.bit_end_pos_ = 0;  /* bit-reading end position from LSB of val_ */\n  this.eos_ = 0;          /* input stream is finished */\n  \n  this.readMoreInput();\n  for (var i = 0; i < 4; i++) {\n    this.val_ |= this.buf_[this.pos_] << (8 * i);\n    ++this.pos_;\n  }\n  \n  return this.bit_end_pos_ > 0;\n};\n\n/* Fills up the input ringbuffer by calling the input callback.\n\n   Does nothing if there are at least 32 bytes present after current position.\n\n   Returns 0 if either:\n    - the input callback returned an error, or\n    - there is no more input and the position is past the end of the stream.\n\n   After encountering the end of the input stream, 32 additional zero bytes are\n   copied to the ringbuffer, therefore it is safe to call this function after\n   every 32 bytes of input is read.\n*/\nBrotliBitReader.prototype.readMoreInput = function() {\n  if (this.bit_end_pos_ > 256) {\n    return;\n  } else if (this.eos_) {\n    if (this.bit_pos_ > this.bit_end_pos_)\n      throw new Error('Unexpected end of input ' + this.bit_pos_ + ' ' + this.bit_end_pos_);\n  } else {\n    var dst = this.buf_ptr_;\n    var bytes_read = this.input_.read(this.buf_, dst, BROTLI_READ_SIZE);\n    if (bytes_read < 0) {\n      throw new Error('Unexpected end of input');\n    }\n    \n    if (bytes_read < BROTLI_READ_SIZE) {\n      this.eos_ = 1;\n      /* Store 32 bytes of zero after the stream end. */\n      for (var p = 0; p < 32; p++)\n        this.buf_[dst + bytes_read + p] = 0;\n    }\n    \n    if (dst === 0) {\n      /* Copy the head of the ringbuffer to the slack region. */\n      for (var p = 0; p < 32; p++)\n        this.buf_[(BROTLI_READ_SIZE << 1) + p] = this.buf_[p];\n\n      this.buf_ptr_ = BROTLI_READ_SIZE;\n    } else {\n      this.buf_ptr_ = 0;\n    }\n    \n    this.bit_end_pos_ += bytes_read << 3;\n  }\n};\n\n/* Guarantees that there are at least 24 bits in the buffer. */\nBrotliBitReader.prototype.fillBitWindow = function() {    \n  while (this.bit_pos_ >= 8) {\n    this.val_ >>>= 8;\n    this.val_ |= this.buf_[this.pos_ & BROTLI_IBUF_MASK] << 24;\n    ++this.pos_;\n    this.bit_pos_ = this.bit_pos_ - 8 >>> 0;\n    this.bit_end_pos_ = this.bit_end_pos_ - 8 >>> 0;\n  }\n};\n\n/* Reads the specified number of bits from Read Buffer. */\nBrotliBitReader.prototype.readBits = function(n_bits) {\n  if (32 - this.bit_pos_ < n_bits) {\n    this.fillBitWindow();\n  }\n  \n  var val = ((this.val_ >>> this.bit_pos_) & kBitMask[n_bits]);\n  this.bit_pos_ += n_bits;\n  return val;\n};\n\nmodule.exports = BrotliBitReader;\n", "module.exports=\"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\";\n", "var base64 = require('base64-js');\n\n/**\n * The normal dictionary-data.js is quite large, which makes it \n * unsuitable for browser usage. In order to make it smaller, \n * we read dictionary.bin, which is a compressed version of\n * the dictionary, and on initial load, Brotli decompresses \n * it's own dictionary. \uD83D\uDE1C\n */\nexports.init = function() {\n  var BrotliDecompressBuffer = require('./decode').BrotliDecompressBuffer;\n  var compressed = base64.toByteArray(require('./dictionary.bin.js'));\n  return BrotliDecompressBuffer(compressed);\n};\n", "/* Copyright 2013 Google Inc. All Rights Reserved.\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   Collection of static dictionary words.\n*/\n\nvar data = require('./dictionary-data');\nexports.init = function() {\n  exports.dictionary = data.init();\n};\n\nexports.offsetsByLength = new Uint32Array([\n     0,     0,     0,     0,     0,  4096,  9216, 21504, 35840, 44032,\n 53248, 63488, 74752, 87040, 93696, 100864, 104704, 106752, 108928, 113536,\n 115968, 118528, 119872, 121280, 122016,\n]);\n\nexports.sizeBitsByLength = new Uint8Array([\n  0,  0,  0,  0, 10, 10, 11, 11, 10, 10,\n 10, 10, 10,  9,  9,  8,  7,  7,  8,  7,\n  7,  6,  6,  5,  5,\n]);\n\nexports.minDictionaryWordLength = 4;\nexports.maxDictionaryWordLength = 24;\n", "function HuffmanCode(bits, value) {\n  this.bits = bits;   /* number of bits used for this symbol */\n  this.value = value; /* symbol value or table offset */\n}\n\nexports.HuffmanCode = HuffmanCode;\n\nvar MAX_LENGTH = 15;\n\n/* Returns reverse(reverse(key, len) + 1, len), where reverse(key, len) is the\n   bit-wise reversal of the len least significant bits of key. */\nfunction GetNextKey(key, len) {\n  var step = 1 << (len - 1);\n  while (key & step) {\n    step >>= 1;\n  }\n  return (key & (step - 1)) + step;\n}\n\n/* Stores code in table[0], table[step], table[2*step], ..., table[end] */\n/* Assumes that end is an integer multiple of step */\nfunction ReplicateValue(table, i, step, end, code) {\n  do {\n    end -= step;\n    table[i + end] = new HuffmanCode(code.bits, code.value);\n  } while (end > 0);\n}\n\n/* Returns the table width of the next 2nd level table. count is the histogram\n   of bit lengths for the remaining symbols, len is the code length of the next\n   processed symbol */\nfunction NextTableBitSize(count, len, root_bits) {\n  var left = 1 << (len - root_bits);\n  while (len < MAX_LENGTH) {\n    left -= count[len];\n    if (left <= 0) break;\n    ++len;\n    left <<= 1;\n  }\n  return len - root_bits;\n}\n\nexports.BrotliBuildHuffmanTable = function(root_table, table, root_bits, code_lengths, code_lengths_size) {\n  var start_table = table;\n  var code;            /* current table entry */\n  var len;             /* current code length */\n  var symbol;          /* symbol index in original or sorted table */\n  var key;             /* reversed prefix code */\n  var step;            /* step size to replicate values in current table */\n  var low;             /* low bits for current root entry */\n  var mask;            /* mask for low bits */\n  var table_bits;      /* key length of current table */\n  var table_size;      /* size of current table */\n  var total_size;      /* sum of root table size and 2nd level table sizes */\n  var sorted;          /* symbols sorted by code length */\n  var count = new Int32Array(MAX_LENGTH + 1);  /* number of codes of each length */\n  var offset = new Int32Array(MAX_LENGTH + 1);  /* offsets in sorted table for each length */\n\n  sorted = new Int32Array(code_lengths_size);\n\n  /* build histogram of code lengths */\n  for (symbol = 0; symbol < code_lengths_size; symbol++) {\n    count[code_lengths[symbol]]++;\n  }\n\n  /* generate offsets into sorted symbol table by code length */\n  offset[1] = 0;\n  for (len = 1; len < MAX_LENGTH; len++) {\n    offset[len + 1] = offset[len] + count[len];\n  }\n\n  /* sort symbols by length, by symbol order within each length */\n  for (symbol = 0; symbol < code_lengths_size; symbol++) {\n    if (code_lengths[symbol] !== 0) {\n      sorted[offset[code_lengths[symbol]]++] = symbol;\n    }\n  }\n  \n  table_bits = root_bits;\n  table_size = 1 << table_bits;\n  total_size = table_size;\n\n  /* special case code with only one value */\n  if (offset[MAX_LENGTH] === 1) {\n    for (key = 0; key < total_size; ++key) {\n      root_table[table + key] = new HuffmanCode(0, sorted[0] & 0xffff);\n    }\n    \n    return total_size;\n  }\n\n  /* fill in root table */\n  key = 0;\n  symbol = 0;\n  for (len = 1, step = 2; len <= root_bits; ++len, step <<= 1) {\n    for (; count[len] > 0; --count[len]) {\n      code = new HuffmanCode(len & 0xff, sorted[symbol++] & 0xffff);\n      ReplicateValue(root_table, table + key, step, table_size, code);\n      key = GetNextKey(key, len);\n    }\n  }\n\n  /* fill in 2nd level tables and add pointers to root table */\n  mask = total_size - 1;\n  low = -1;\n  for (len = root_bits + 1, step = 2; len <= MAX_LENGTH; ++len, step <<= 1) {\n    for (; count[len] > 0; --count[len]) {\n      if ((key & mask) !== low) {\n        table += table_size;\n        table_bits = NextTableBitSize(count, len, root_bits);\n        table_size = 1 << table_bits;\n        total_size += table_size;\n        low = key & mask;\n        root_table[start_table + low] = new HuffmanCode((table_bits + root_bits) & 0xff, ((table - start_table) - low) & 0xffff);\n      }\n      code = new HuffmanCode((len - root_bits) & 0xff, sorted[symbol++] & 0xffff);\n      ReplicateValue(root_table, table + (key >> root_bits), step, table_size, code);\n      key = GetNextKey(key, len);\n    }\n  }\n  \n  return total_size;\n}\n", "/* Copyright 2013 Google Inc. All Rights Reserved.\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   Lookup table to map the previous two bytes to a context id.\n\n   There are four different context modeling modes defined here:\n     CONTEXT_LSB6: context id is the least significant 6 bits of the last byte,\n     CONTEXT_MSB6: context id is the most significant 6 bits of the last byte,\n     CONTEXT_UTF8: second-order context model tuned for UTF8-encoded text,\n     CONTEXT_SIGNED: second-order context model tuned for signed integers.\n\n   The context id for the UTF8 context model is calculated as follows. If p1\n   and p2 are the previous two bytes, we calcualte the context as\n\n     context = kContextLookup[p1] | kContextLookup[p2 + 256].\n\n   If the previous two bytes are ASCII characters (i.e. < 128), this will be\n   equivalent to\n\n     context = 4 * context1(p1) + context2(p2),\n\n   where context1 is based on the previous byte in the following way:\n\n     0  : non-ASCII control\n     1  : \\t, \\n, \\r\n     2  : space\n     3  : other punctuation\n     4  : \" '\n     5  : %\n     6  : ( < [ {\n     7  : ) > ] }\n     8  : , ; :\n     9  : .\n     10 : =\n     11 : number\n     12 : upper-case vowel\n     13 : upper-case consonant\n     14 : lower-case vowel\n     15 : lower-case consonant\n\n   and context2 is based on the second last byte:\n\n     0 : control, space\n     1 : punctuation\n     2 : upper-case letter, number\n     3 : lower-case letter\n\n   If the last byte is ASCII, and the second last byte is not (in a valid UTF8\n   stream it will be a continuation byte, value between 128 and 191), the\n   context is the same as if the second last byte was an ASCII control or space.\n\n   If the last byte is a UTF8 lead byte (value >= 192), then the next byte will\n   be a continuation byte and the context id is 2 or 3 depending on the LSB of\n   the last byte and to a lesser extent on the second last byte if it is ASCII.\n\n   If the last byte is a UTF8 continuation byte, the second last byte can be:\n     - continuation byte: the next byte is probably ASCII or lead byte (assuming\n       4-byte UTF8 characters are rare) and the context id is 0 or 1.\n     - lead byte (192 - 207): next byte is ASCII or lead byte, context is 0 or 1\n     - lead byte (208 - 255): next byte is continuation byte, context is 2 or 3\n\n   The possible value combinations of the previous two bytes, the range of\n   context ids and the type of the next byte is summarized in the table below:\n\n   |--------\\-----------------------------------------------------------------|\n   |         \\                         Last byte                              |\n   | Second   \\---------------------------------------------------------------|\n   | last byte \\    ASCII            |   cont. byte        |   lead byte      |\n   |            \\   (0-127)          |   (128-191)         |   (192-)         |\n   |=============|===================|=====================|==================|\n   |  ASCII      | next: ASCII/lead  |  not valid          |  next: cont.     |\n   |  (0-127)    | context: 4 - 63   |                     |  context: 2 - 3  |\n   |-------------|-------------------|---------------------|------------------|\n   |  cont. byte | next: ASCII/lead  |  next: ASCII/lead   |  next: cont.     |\n   |  (128-191)  | context: 4 - 63   |  context: 0 - 1     |  context: 2 - 3  |\n   |-------------|-------------------|---------------------|------------------|\n   |  lead byte  | not valid         |  next: ASCII/lead   |  not valid       |\n   |  (192-207)  |                   |  context: 0 - 1     |                  |\n   |-------------|-------------------|---------------------|------------------|\n   |  lead byte  | not valid         |  next: cont.        |  not valid       |\n   |  (208-)     |                   |  context: 2 - 3     |                  |\n   |-------------|-------------------|---------------------|------------------|\n\n   The context id for the signed context mode is calculated as:\n\n     context = (kContextLookup[512 + p1] << 3) | kContextLookup[512 + p2].\n\n   For any context modeling modes, the context ids can be calculated by |-ing\n   together two lookups from one table using context model dependent offsets:\n\n     context = kContextLookup[offset1 + p1] | kContextLookup[offset2 + p2].\n\n   where offset1 and offset2 are dependent on the context mode.\n*/\n\nvar CONTEXT_LSB6         = 0;\nvar CONTEXT_MSB6         = 1;\nvar CONTEXT_UTF8         = 2;\nvar CONTEXT_SIGNED       = 3;\n\n/* Common context lookup table for all context modes. */\nexports.lookup = new Uint8Array([\n  /* CONTEXT_UTF8, last byte. */\n  /* ASCII range. */\n   0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  0,  0,  4,  0,  0,\n   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n   8, 12, 16, 12, 12, 20, 12, 16, 24, 28, 12, 12, 32, 12, 36, 12,\n  44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 32, 32, 24, 40, 28, 12,\n  12, 48, 52, 52, 52, 48, 52, 52, 52, 48, 52, 52, 52, 52, 52, 48,\n  52, 52, 52, 52, 52, 48, 52, 52, 52, 52, 52, 24, 12, 28, 12, 12,\n  12, 56, 60, 60, 60, 56, 60, 60, 60, 56, 60, 60, 60, 60, 60, 56,\n  60, 60, 60, 60, 60, 56, 60, 60, 60, 60, 60, 24, 12, 28, 12,  0,\n  /* UTF8 continuation byte range. */\n  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n  /* UTF8 lead byte range. */\n  2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,\n  2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,\n  2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,\n  2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,\n  /* CONTEXT_UTF8 second last byte. */\n  /* ASCII range. */\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1,\n  1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1,\n  1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 0,\n  /* UTF8 continuation byte range. */\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  /* UTF8 lead byte range. */\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  /* CONTEXT_SIGNED, second last byte. */\n  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7,\n  /* CONTEXT_SIGNED, last byte, same as the above values shifted by 3 bits. */\n   0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,\n  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n  24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\n  24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\n  24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\n  24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\n  32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,\n  32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,\n  32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,\n  32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,\n  40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,\n  40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,\n  40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,\n  48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 56,\n  /* CONTEXT_LSB6, last byte. */\n   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,\n  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,\n  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,\n   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,\n  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,\n  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,\n   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,\n  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,\n  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,\n   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,\n  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,\n  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,\n  /* CONTEXT_MSB6, last byte. */\n   0,  0,  0,  0,  1,  1,  1,  1,  2,  2,  2,  2,  3,  3,  3,  3,\n   4,  4,  4,  4,  5,  5,  5,  5,  6,  6,  6,  6,  7,  7,  7,  7,\n   8,  8,  8,  8,  9,  9,  9,  9, 10, 10, 10, 10, 11, 11, 11, 11,\n  12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15,\n  16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19,\n  20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23,\n  24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27,\n  28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31,\n  32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35,\n  36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39,\n  40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43,\n  44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47,\n  48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51,\n  52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55,\n  56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59,\n  60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 63,\n  /* CONTEXT_{M,L}SB6, second last byte, */\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n]);\n\nexports.lookupOffsets = new Uint16Array([\n  /* CONTEXT_LSB6 */\n  1024, 1536,\n  /* CONTEXT_MSB6 */\n  1280, 1536,\n  /* CONTEXT_UTF8 */\n  0, 256,\n  /* CONTEXT_SIGNED */\n  768, 512,\n]);\n", "/* Copyright 2013 Google Inc. All Rights Reserved.\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   Lookup tables to map prefix codes to value ranges. This is used during\n   decoding of the block lengths, literal insertion lengths and copy lengths.\n*/\n\n/* Represents the range of values belonging to a prefix code: */\n/* [offset, offset + 2^nbits) */\nfunction PrefixCodeRange(offset, nbits) {\n  this.offset = offset;\n  this.nbits = nbits;\n}\n\nexports.kBlockLengthPrefixCode = [\n  new PrefixCodeRange(1, 2), new PrefixCodeRange(5, 2), new PrefixCodeRange(9, 2), new PrefixCodeRange(13, 2),\n  new PrefixCodeRange(17, 3), new PrefixCodeRange(25, 3), new PrefixCodeRange(33, 3), new PrefixCodeRange(41, 3),\n  new PrefixCodeRange(49, 4), new PrefixCodeRange(65, 4), new PrefixCodeRange(81, 4), new PrefixCodeRange(97, 4),\n  new PrefixCodeRange(113, 5), new PrefixCodeRange(145, 5), new PrefixCodeRange(177, 5), new PrefixCodeRange(209, 5),\n  new PrefixCodeRange(241, 6), new PrefixCodeRange(305, 6), new PrefixCodeRange(369, 7), new PrefixCodeRange(497, 8),\n  new PrefixCodeRange(753, 9), new PrefixCodeRange(1265, 10), new PrefixCodeRange(2289, 11), new PrefixCodeRange(4337, 12),\n  new PrefixCodeRange(8433, 13), new PrefixCodeRange(16625, 24)\n];\n\nexports.kInsertLengthPrefixCode = [\n  new PrefixCodeRange(0, 0), new PrefixCodeRange(1, 0), new PrefixCodeRange(2, 0), new PrefixCodeRange(3, 0),\n  new PrefixCodeRange(4, 0), new PrefixCodeRange(5, 0), new PrefixCodeRange(6, 1), new PrefixCodeRange(8, 1),\n  new PrefixCodeRange(10, 2), new PrefixCodeRange(14, 2), new PrefixCodeRange(18, 3), new PrefixCodeRange(26, 3),\n  new PrefixCodeRange(34, 4), new PrefixCodeRange(50, 4), new PrefixCodeRange(66, 5), new PrefixCodeRange(98, 5),\n  new PrefixCodeRange(130, 6), new PrefixCodeRange(194, 7), new PrefixCodeRange(322, 8), new PrefixCodeRange(578, 9),\n  new PrefixCodeRange(1090, 10), new PrefixCodeRange(2114, 12), new PrefixCodeRange(6210, 14), new PrefixCodeRange(22594, 24),\n];\n\nexports.kCopyLengthPrefixCode = [\n  new PrefixCodeRange(2, 0), new PrefixCodeRange(3, 0), new PrefixCodeRange(4, 0), new PrefixCodeRange(5, 0),\n  new PrefixCodeRange(6, 0), new PrefixCodeRange(7, 0), new PrefixCodeRange(8, 0), new PrefixCodeRange(9, 0),\n  new PrefixCodeRange(10, 1), new PrefixCodeRange(12, 1), new PrefixCodeRange(14, 2), new PrefixCodeRange(18, 2),\n  new PrefixCodeRange(22, 3), new PrefixCodeRange(30, 3), new PrefixCodeRange(38, 4), new PrefixCodeRange(54, 4),\n  new PrefixCodeRange(70, 5), new PrefixCodeRange(102, 5), new PrefixCodeRange(134, 6), new PrefixCodeRange(198, 7),\n  new PrefixCodeRange(326, 8), new PrefixCodeRange(582, 9), new PrefixCodeRange(1094, 10), new PrefixCodeRange(2118, 24),\n];\n\nexports.kInsertRangeLut = [\n  0, 0, 8, 8, 0, 16, 8, 16, 16,\n];\n\nexports.kCopyRangeLut = [\n  0, 8, 0, 8, 16, 0, 16, 8, 16,\n];\n", "/* Copyright 2013 Google Inc. All Rights Reserved.\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   Transformations on dictionary words.\n*/\n\nvar BrotliDictionary = require('./dictionary');\n\nvar kIdentity       = 0;\nvar kOmitLast1      = 1;\nvar kOmitLast2      = 2;\nvar kOmitLast3      = 3;\nvar kOmitLast4      = 4;\nvar kOmitLast5      = 5;\nvar kOmitLast6      = 6;\nvar kOmitLast7      = 7;\nvar kOmitLast8      = 8;\nvar kOmitLast9      = 9;\nvar kUppercaseFirst = 10;\nvar kUppercaseAll   = 11;\nvar kOmitFirst1     = 12;\nvar kOmitFirst2     = 13;\nvar kOmitFirst3     = 14;\nvar kOmitFirst4     = 15;\nvar kOmitFirst5     = 16;\nvar kOmitFirst6     = 17;\nvar kOmitFirst7     = 18;\nvar kOmitFirst8     = 19;\nvar kOmitFirst9     = 20;\n\nfunction Transform(prefix, transform, suffix) {\n  this.prefix = new Uint8Array(prefix.length);\n  this.transform = transform;\n  this.suffix = new Uint8Array(suffix.length);\n  \n  for (var i = 0; i < prefix.length; i++)\n    this.prefix[i] = prefix.charCodeAt(i);\n  \n  for (var i = 0; i < suffix.length; i++)\n    this.suffix[i] = suffix.charCodeAt(i);\n}\n\nvar kTransforms = [\n     new Transform(         \"\", kIdentity,       \"\"           ),\n     new Transform(         \"\", kIdentity,       \" \"          ),\n     new Transform(        \" \", kIdentity,       \" \"          ),\n     new Transform(         \"\", kOmitFirst1,     \"\"           ),\n     new Transform(         \"\", kUppercaseFirst, \" \"          ),\n     new Transform(         \"\", kIdentity,       \" the \"      ),\n     new Transform(        \" \", kIdentity,       \"\"           ),\n     new Transform(       \"s \", kIdentity,       \" \"          ),\n     new Transform(         \"\", kIdentity,       \" of \"       ),\n     new Transform(         \"\", kUppercaseFirst, \"\"           ),\n     new Transform(         \"\", kIdentity,       \" and \"      ),\n     new Transform(         \"\", kOmitFirst2,     \"\"           ),\n     new Transform(         \"\", kOmitLast1,      \"\"           ),\n     new Transform(       \", \", kIdentity,       \" \"          ),\n     new Transform(         \"\", kIdentity,       \", \"         ),\n     new Transform(        \" \", kUppercaseFirst, \" \"          ),\n     new Transform(         \"\", kIdentity,       \" in \"       ),\n     new Transform(         \"\", kIdentity,       \" to \"       ),\n     new Transform(       \"e \", kIdentity,       \" \"          ),\n     new Transform(         \"\", kIdentity,       \"\\\"\"         ),\n     new Transform(         \"\", kIdentity,       \".\"          ),\n     new Transform(         \"\", kIdentity,       \"\\\">\"        ),\n     new Transform(         \"\", kIdentity,       \"\\n\"         ),\n     new Transform(         \"\", kOmitLast3,      \"\"           ),\n     new Transform(         \"\", kIdentity,       \"]\"          ),\n     new Transform(         \"\", kIdentity,       \" for \"      ),\n     new Transform(         \"\", kOmitFirst3,     \"\"           ),\n     new Transform(         \"\", kOmitLast2,      \"\"           ),\n     new Transform(         \"\", kIdentity,       \" a \"        ),\n     new Transform(         \"\", kIdentity,       \" that \"     ),\n     new Transform(        \" \", kUppercaseFirst, \"\"           ),\n     new Transform(         \"\", kIdentity,       \". \"         ),\n     new Transform(        \".\", kIdentity,       \"\"           ),\n     new Transform(        \" \", kIdentity,       \", \"         ),\n     new Transform(         \"\", kOmitFirst4,     \"\"           ),\n     new Transform(         \"\", kIdentity,       \" with \"     ),\n     new Transform(         \"\", kIdentity,       \"'\"          ),\n     new Transform(         \"\", kIdentity,       \" from \"     ),\n     new Transform(         \"\", kIdentity,       \" by \"       ),\n     new Transform(         \"\", kOmitFirst5,     \"\"           ),\n     new Transform(         \"\", kOmitFirst6,     \"\"           ),\n     new Transform(    \" the \", kIdentity,       \"\"           ),\n     new Transform(         \"\", kOmitLast4,      \"\"           ),\n     new Transform(         \"\", kIdentity,       \". The \"     ),\n     new Transform(         \"\", kUppercaseAll,   \"\"           ),\n     new Transform(         \"\", kIdentity,       \" on \"       ),\n     new Transform(         \"\", kIdentity,       \" as \"       ),\n     new Transform(         \"\", kIdentity,       \" is \"       ),\n     new Transform(         \"\", kOmitLast7,      \"\"           ),\n     new Transform(         \"\", kOmitLast1,      \"ing \"       ),\n     new Transform(         \"\", kIdentity,       \"\\n\\t\"       ),\n     new Transform(         \"\", kIdentity,       \":\"          ),\n     new Transform(        \" \", kIdentity,       \". \"         ),\n     new Transform(         \"\", kIdentity,       \"ed \"        ),\n     new Transform(         \"\", kOmitFirst9,     \"\"           ),\n     new Transform(         \"\", kOmitFirst7,     \"\"           ),\n     new Transform(         \"\", kOmitLast6,      \"\"           ),\n     new Transform(         \"\", kIdentity,       \"(\"          ),\n     new Transform(         \"\", kUppercaseFirst, \", \"         ),\n     new Transform(         \"\", kOmitLast8,      \"\"           ),\n     new Transform(         \"\", kIdentity,       \" at \"       ),\n     new Transform(         \"\", kIdentity,       \"ly \"        ),\n     new Transform(    \" the \", kIdentity,       \" of \"       ),\n     new Transform(         \"\", kOmitLast5,      \"\"           ),\n     new Transform(         \"\", kOmitLast9,      \"\"           ),\n     new Transform(        \" \", kUppercaseFirst, \", \"         ),\n     new Transform(         \"\", kUppercaseFirst, \"\\\"\"         ),\n     new Transform(        \".\", kIdentity,       \"(\"          ),\n     new Transform(         \"\", kUppercaseAll,   \" \"          ),\n     new Transform(         \"\", kUppercaseFirst, \"\\\">\"        ),\n     new Transform(         \"\", kIdentity,       \"=\\\"\"        ),\n     new Transform(        \" \", kIdentity,       \".\"          ),\n     new Transform(    \".com/\", kIdentity,       \"\"           ),\n     new Transform(    \" the \", kIdentity,       \" of the \"   ),\n     new Transform(         \"\", kUppercaseFirst, \"'\"          ),\n     new Transform(         \"\", kIdentity,       \". This \"    ),\n     new Transform(         \"\", kIdentity,       \",\"          ),\n     new Transform(        \".\", kIdentity,       \" \"          ),\n     new Transform(         \"\", kUppercaseFirst, \"(\"          ),\n     new Transform(         \"\", kUppercaseFirst, \".\"          ),\n     new Transform(         \"\", kIdentity,       \" not \"      ),\n     new Transform(        \" \", kIdentity,       \"=\\\"\"        ),\n     new Transform(         \"\", kIdentity,       \"er \"        ),\n     new Transform(        \" \", kUppercaseAll,   \" \"          ),\n     new Transform(         \"\", kIdentity,       \"al \"        ),\n     new Transform(        \" \", kUppercaseAll,   \"\"           ),\n     new Transform(         \"\", kIdentity,       \"='\"         ),\n     new Transform(         \"\", kUppercaseAll,   \"\\\"\"         ),\n     new Transform(         \"\", kUppercaseFirst, \". \"         ),\n     new Transform(        \" \", kIdentity,       \"(\"          ),\n     new Transform(         \"\", kIdentity,       \"ful \"       ),\n     new Transform(        \" \", kUppercaseFirst, \". \"         ),\n     new Transform(         \"\", kIdentity,       \"ive \"       ),\n     new Transform(         \"\", kIdentity,       \"less \"      ),\n     new Transform(         \"\", kUppercaseAll,   \"'\"          ),\n     new Transform(         \"\", kIdentity,       \"est \"       ),\n     new Transform(        \" \", kUppercaseFirst, \".\"          ),\n     new Transform(         \"\", kUppercaseAll,   \"\\\">\"        ),\n     new Transform(        \" \", kIdentity,       \"='\"         ),\n     new Transform(         \"\", kUppercaseFirst, \",\"          ),\n     new Transform(         \"\", kIdentity,       \"ize \"       ),\n     new Transform(         \"\", kUppercaseAll,   \".\"          ),\n     new Transform( \"\\xc2\\xa0\", kIdentity,       \"\"           ),\n     new Transform(        \" \", kIdentity,       \",\"          ),\n     new Transform(         \"\", kUppercaseFirst, \"=\\\"\"        ),\n     new Transform(         \"\", kUppercaseAll,   \"=\\\"\"        ),\n     new Transform(         \"\", kIdentity,       \"ous \"       ),\n     new Transform(         \"\", kUppercaseAll,   \", \"         ),\n     new Transform(         \"\", kUppercaseFirst, \"='\"         ),\n     new Transform(        \" \", kUppercaseFirst, \",\"          ),\n     new Transform(        \" \", kUppercaseAll,   \"=\\\"\"        ),\n     new Transform(        \" \", kUppercaseAll,   \", \"         ),\n     new Transform(         \"\", kUppercaseAll,   \",\"          ),\n     new Transform(         \"\", kUppercaseAll,   \"(\"          ),\n     new Transform(         \"\", kUppercaseAll,   \". \"         ),\n     new Transform(        \" \", kUppercaseAll,   \".\"          ),\n     new Transform(         \"\", kUppercaseAll,   \"='\"         ),\n     new Transform(        \" \", kUppercaseAll,   \". \"         ),\n     new Transform(        \" \", kUppercaseFirst, \"=\\\"\"        ),\n     new Transform(        \" \", kUppercaseAll,   \"='\"         ),\n     new Transform(        \" \", kUppercaseFirst, \"='\"         )\n];\n\nexports.kTransforms = kTransforms;\nexports.kNumTransforms = kTransforms.length;\n\nfunction ToUpperCase(p, i) {\n  if (p[i] < 0xc0) {\n    if (p[i] >= 97 && p[i] <= 122) {\n      p[i] ^= 32;\n    }\n    return 1;\n  }\n  \n  /* An overly simplified uppercasing model for utf-8. */\n  if (p[i] < 0xe0) {\n    p[i + 1] ^= 32;\n    return 2;\n  }\n  \n  /* An arbitrary transform for three byte characters. */\n  p[i + 2] ^= 5;\n  return 3;\n}\n\nexports.transformDictionaryWord = function(dst, idx, word, len, transform) {\n  var prefix = kTransforms[transform].prefix;\n  var suffix = kTransforms[transform].suffix;\n  var t = kTransforms[transform].transform;\n  var skip = t < kOmitFirst1 ? 0 : t - (kOmitFirst1 - 1);\n  var i = 0;\n  var start_idx = idx;\n  var uppercase;\n  \n  if (skip > len) {\n    skip = len;\n  }\n  \n  var prefix_pos = 0;\n  while (prefix_pos < prefix.length) {\n    dst[idx++] = prefix[prefix_pos++];\n  }\n  \n  word += skip;\n  len -= skip;\n  \n  if (t <= kOmitLast9) {\n    len -= t;\n  }\n  \n  for (i = 0; i < len; i++) {\n    dst[idx++] = BrotliDictionary.dictionary[word + i];\n  }\n  \n  uppercase = idx - len;\n  \n  if (t === kUppercaseFirst) {\n    ToUpperCase(dst, uppercase);\n  } else if (t === kUppercaseAll) {\n    while (len > 0) {\n      var step = ToUpperCase(dst, uppercase);\n      uppercase += step;\n      len -= step;\n    }\n  }\n  \n  var suffix_pos = 0;\n  while (suffix_pos < suffix.length) {\n    dst[idx++] = suffix[suffix_pos++];\n  }\n  \n  return idx - start_idx;\n}\n", "/* Copyright 2013 Google Inc. All Rights Reserved.\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\nvar BrotliInput = require('./streams').BrotliInput;\nvar BrotliOutput = require('./streams').BrotliOutput;\nvar BrotliBitReader = require('./bit_reader');\nvar BrotliDictionary = require('./dictionary');\nvar HuffmanCode = require('./huffman').HuffmanCode;\nvar BrotliBuildHuffmanTable = require('./huffman').BrotliBuildHuffmanTable;\nvar Context = require('./context');\nvar Prefix = require('./prefix');\nvar Transform = require('./transform');\n\nvar kDefaultCodeLength = 8;\nvar kCodeLengthRepeatCode = 16;\nvar kNumLiteralCodes = 256;\nvar kNumInsertAndCopyCodes = 704;\nvar kNumBlockLengthCodes = 26;\nvar kLiteralContextBits = 6;\nvar kDistanceContextBits = 2;\n\nvar HUFFMAN_TABLE_BITS = 8;\nvar HUFFMAN_TABLE_MASK = 0xff;\n/* Maximum possible Huffman table size for an alphabet size of 704, max code\n * length 15 and root table bits 8. */\nvar HUFFMAN_MAX_TABLE_SIZE = 1080;\n\nvar CODE_LENGTH_CODES = 18;\nvar kCodeLengthCodeOrder = new Uint8Array([\n  1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n]);\n\nvar NUM_DISTANCE_SHORT_CODES = 16;\nvar kDistanceShortCodeIndexOffset = new Uint8Array([\n  3, 2, 1, 0, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2\n]);\n\nvar kDistanceShortCodeValueOffset = new Int8Array([\n  0, 0, 0, 0, -1, 1, -2, 2, -3, 3, -1, 1, -2, 2, -3, 3\n]);\n\nvar kMaxHuffmanTableSize = new Uint16Array([\n  256, 402, 436, 468, 500, 534, 566, 598, 630, 662, 694, 726, 758, 790, 822,\n  854, 886, 920, 952, 984, 1016, 1048, 1080\n]);\n\nfunction DecodeWindowBits(br) {\n  var n;\n  if (br.readBits(1) === 0) {\n    return 16;\n  }\n  \n  n = br.readBits(3);\n  if (n > 0) {\n    return 17 + n;\n  }\n  \n  n = br.readBits(3);\n  if (n > 0) {\n    return 8 + n;\n  }\n  \n  return 17;\n}\n\n/* Decodes a number in the range [0..255], by reading 1 - 11 bits. */\nfunction DecodeVarLenUint8(br) {\n  if (br.readBits(1)) {\n    var nbits = br.readBits(3);\n    if (nbits === 0) {\n      return 1;\n    } else {\n      return br.readBits(nbits) + (1 << nbits);\n    }\n  }\n  return 0;\n}\n\nfunction MetaBlockLength() {\n  this.meta_block_length = 0;\n  this.input_end = 0;\n  this.is_uncompressed = 0;\n  this.is_metadata = false;\n}\n\nfunction DecodeMetaBlockLength(br) {\n  var out = new MetaBlockLength;  \n  var size_nibbles;\n  var size_bytes;\n  var i;\n  \n  out.input_end = br.readBits(1);\n  if (out.input_end && br.readBits(1)) {\n    return out;\n  }\n  \n  size_nibbles = br.readBits(2) + 4;\n  if (size_nibbles === 7) {\n    out.is_metadata = true;\n    \n    if (br.readBits(1) !== 0)\n      throw new Error('Invalid reserved bit');\n    \n    size_bytes = br.readBits(2);\n    if (size_bytes === 0)\n      return out;\n    \n    for (i = 0; i < size_bytes; i++) {\n      var next_byte = br.readBits(8);\n      if (i + 1 === size_bytes && size_bytes > 1 && next_byte === 0)\n        throw new Error('Invalid size byte');\n      \n      out.meta_block_length |= next_byte << (i * 8);\n    }\n  } else {\n    for (i = 0; i < size_nibbles; ++i) {\n      var next_nibble = br.readBits(4);\n      if (i + 1 === size_nibbles && size_nibbles > 4 && next_nibble === 0)\n        throw new Error('Invalid size nibble');\n      \n      out.meta_block_length |= next_nibble << (i * 4);\n    }\n  }\n  \n  ++out.meta_block_length;\n  \n  if (!out.input_end && !out.is_metadata) {\n    out.is_uncompressed = br.readBits(1);\n  }\n  \n  return out;\n}\n\n/* Decodes the next Huffman code from bit-stream. */\nfunction ReadSymbol(table, index, br) {\n  var start_index = index;\n  \n  var nbits;\n  br.fillBitWindow();\n  index += (br.val_ >>> br.bit_pos_) & HUFFMAN_TABLE_MASK;\n  nbits = table[index].bits - HUFFMAN_TABLE_BITS;\n  if (nbits > 0) {\n    br.bit_pos_ += HUFFMAN_TABLE_BITS;\n    index += table[index].value;\n    index += (br.val_ >>> br.bit_pos_) & ((1 << nbits) - 1);\n  }\n  br.bit_pos_ += table[index].bits;\n  return table[index].value;\n}\n\nfunction ReadHuffmanCodeLengths(code_length_code_lengths, num_symbols, code_lengths, br) {\n  var symbol = 0;\n  var prev_code_len = kDefaultCodeLength;\n  var repeat = 0;\n  var repeat_code_len = 0;\n  var space = 32768;\n  \n  var table = [];\n  for (var i = 0; i < 32; i++)\n    table.push(new HuffmanCode(0, 0));\n  \n  BrotliBuildHuffmanTable(table, 0, 5, code_length_code_lengths, CODE_LENGTH_CODES);\n\n  while (symbol < num_symbols && space > 0) {\n    var p = 0;\n    var code_len;\n    \n    br.readMoreInput();\n    br.fillBitWindow();\n    p += (br.val_ >>> br.bit_pos_) & 31;\n    br.bit_pos_ += table[p].bits;\n    code_len = table[p].value & 0xff;\n    if (code_len < kCodeLengthRepeatCode) {\n      repeat = 0;\n      code_lengths[symbol++] = code_len;\n      if (code_len !== 0) {\n        prev_code_len = code_len;\n        space -= 32768 >> code_len;\n      }\n    } else {\n      var extra_bits = code_len - 14;\n      var old_repeat;\n      var repeat_delta;\n      var new_len = 0;\n      if (code_len === kCodeLengthRepeatCode) {\n        new_len = prev_code_len;\n      }\n      if (repeat_code_len !== new_len) {\n        repeat = 0;\n        repeat_code_len = new_len;\n      }\n      old_repeat = repeat;\n      if (repeat > 0) {\n        repeat -= 2;\n        repeat <<= extra_bits;\n      }\n      repeat += br.readBits(extra_bits) + 3;\n      repeat_delta = repeat - old_repeat;\n      if (symbol + repeat_delta > num_symbols) {\n        throw new Error('[ReadHuffmanCodeLengths] symbol + repeat_delta > num_symbols');\n      }\n      \n      for (var x = 0; x < repeat_delta; x++)\n        code_lengths[symbol + x] = repeat_code_len;\n      \n      symbol += repeat_delta;\n      \n      if (repeat_code_len !== 0) {\n        space -= repeat_delta << (15 - repeat_code_len);\n      }\n    }\n  }\n  if (space !== 0) {\n    throw new Error(\"[ReadHuffmanCodeLengths] space = \" + space);\n  }\n  \n  for (; symbol < num_symbols; symbol++)\n    code_lengths[symbol] = 0;\n}\n\nfunction ReadHuffmanCode(alphabet_size, tables, table, br) {\n  var table_size = 0;\n  var simple_code_or_skip;\n  var code_lengths = new Uint8Array(alphabet_size);\n  \n  br.readMoreInput();\n  \n  /* simple_code_or_skip is used as follows:\n     1 for simple code;\n     0 for no skipping, 2 skips 2 code lengths, 3 skips 3 code lengths */\n  simple_code_or_skip = br.readBits(2);\n  if (simple_code_or_skip === 1) {\n    /* Read symbols, codes & code lengths directly. */\n    var i;\n    var max_bits_counter = alphabet_size - 1;\n    var max_bits = 0;\n    var symbols = new Int32Array(4);\n    var num_symbols = br.readBits(2) + 1;\n    while (max_bits_counter) {\n      max_bits_counter >>= 1;\n      ++max_bits;\n    }\n\n    for (i = 0; i < num_symbols; ++i) {\n      symbols[i] = br.readBits(max_bits) % alphabet_size;\n      code_lengths[symbols[i]] = 2;\n    }\n    code_lengths[symbols[0]] = 1;\n    switch (num_symbols) {\n      case 1:\n        break;\n      case 3:\n        if ((symbols[0] === symbols[1]) ||\n            (symbols[0] === symbols[2]) ||\n            (symbols[1] === symbols[2])) {\n          throw new Error('[ReadHuffmanCode] invalid symbols');\n        }\n        break;\n      case 2:\n        if (symbols[0] === symbols[1]) {\n          throw new Error('[ReadHuffmanCode] invalid symbols');\n        }\n        \n        code_lengths[symbols[1]] = 1;\n        break;\n      case 4:\n        if ((symbols[0] === symbols[1]) ||\n            (symbols[0] === symbols[2]) ||\n            (symbols[0] === symbols[3]) ||\n            (symbols[1] === symbols[2]) ||\n            (symbols[1] === symbols[3]) ||\n            (symbols[2] === symbols[3])) {\n          throw new Error('[ReadHuffmanCode] invalid symbols');\n        }\n        \n        if (br.readBits(1)) {\n          code_lengths[symbols[2]] = 3;\n          code_lengths[symbols[3]] = 3;\n        } else {\n          code_lengths[symbols[0]] = 2;\n        }\n        break;\n    }\n  } else {  /* Decode Huffman-coded code lengths. */\n    var i;\n    var code_length_code_lengths = new Uint8Array(CODE_LENGTH_CODES);\n    var space = 32;\n    var num_codes = 0;\n    /* Static Huffman code for the code length code lengths */\n    var huff = [\n      new HuffmanCode(2, 0), new HuffmanCode(2, 4), new HuffmanCode(2, 3), new HuffmanCode(3, 2), \n      new HuffmanCode(2, 0), new HuffmanCode(2, 4), new HuffmanCode(2, 3), new HuffmanCode(4, 1),\n      new HuffmanCode(2, 0), new HuffmanCode(2, 4), new HuffmanCode(2, 3), new HuffmanCode(3, 2), \n      new HuffmanCode(2, 0), new HuffmanCode(2, 4), new HuffmanCode(2, 3), new HuffmanCode(4, 5)\n    ];\n    for (i = simple_code_or_skip; i < CODE_LENGTH_CODES && space > 0; ++i) {\n      var code_len_idx = kCodeLengthCodeOrder[i];\n      var p = 0;\n      var v;\n      br.fillBitWindow();\n      p += (br.val_ >>> br.bit_pos_) & 15;\n      br.bit_pos_ += huff[p].bits;\n      v = huff[p].value;\n      code_length_code_lengths[code_len_idx] = v;\n      if (v !== 0) {\n        space -= (32 >> v);\n        ++num_codes;\n      }\n    }\n    \n    if (!(num_codes === 1 || space === 0))\n      throw new Error('[ReadHuffmanCode] invalid num_codes or space');\n    \n    ReadHuffmanCodeLengths(code_length_code_lengths, alphabet_size, code_lengths, br);\n  }\n  \n  table_size = BrotliBuildHuffmanTable(tables, table, HUFFMAN_TABLE_BITS, code_lengths, alphabet_size);\n  \n  if (table_size === 0) {\n    throw new Error(\"[ReadHuffmanCode] BuildHuffmanTable failed: \");\n  }\n  \n  return table_size;\n}\n\nfunction ReadBlockLength(table, index, br) {\n  var code;\n  var nbits;\n  code = ReadSymbol(table, index, br);\n  nbits = Prefix.kBlockLengthPrefixCode[code].nbits;\n  return Prefix.kBlockLengthPrefixCode[code].offset + br.readBits(nbits);\n}\n\nfunction TranslateShortCodes(code, ringbuffer, index) {\n  var val;\n  if (code < NUM_DISTANCE_SHORT_CODES) {\n    index += kDistanceShortCodeIndexOffset[code];\n    index &= 3;\n    val = ringbuffer[index] + kDistanceShortCodeValueOffset[code];\n  } else {\n    val = code - NUM_DISTANCE_SHORT_CODES + 1;\n  }\n  return val;\n}\n\nfunction MoveToFront(v, index) {\n  var value = v[index];\n  var i = index;\n  for (; i; --i) v[i] = v[i - 1];\n  v[0] = value;\n}\n\nfunction InverseMoveToFrontTransform(v, v_len) {\n  var mtf = new Uint8Array(256);\n  var i;\n  for (i = 0; i < 256; ++i) {\n    mtf[i] = i;\n  }\n  for (i = 0; i < v_len; ++i) {\n    var index = v[i];\n    v[i] = mtf[index];\n    if (index) MoveToFront(mtf, index);\n  }\n}\n\n/* Contains a collection of huffman trees with the same alphabet size. */\nfunction HuffmanTreeGroup(alphabet_size, num_htrees) {\n  this.alphabet_size = alphabet_size;\n  this.num_htrees = num_htrees;\n  this.codes = new Array(num_htrees + num_htrees * kMaxHuffmanTableSize[(alphabet_size + 31) >>> 5]);  \n  this.htrees = new Uint32Array(num_htrees);\n}\n\nHuffmanTreeGroup.prototype.decode = function(br) {\n  var i;\n  var table_size;\n  var next = 0;\n  for (i = 0; i < this.num_htrees; ++i) {\n    this.htrees[i] = next;\n    table_size = ReadHuffmanCode(this.alphabet_size, this.codes, next, br);\n    next += table_size;\n  }\n};\n\nfunction DecodeContextMap(context_map_size, br) {\n  var out = { num_htrees: null, context_map: null };\n  var use_rle_for_zeros;\n  var max_run_length_prefix = 0;\n  var table;\n  var i;\n  \n  br.readMoreInput();\n  var num_htrees = out.num_htrees = DecodeVarLenUint8(br) + 1;\n\n  var context_map = out.context_map = new Uint8Array(context_map_size);\n  if (num_htrees <= 1) {\n    return out;\n  }\n\n  use_rle_for_zeros = br.readBits(1);\n  if (use_rle_for_zeros) {\n    max_run_length_prefix = br.readBits(4) + 1;\n  }\n  \n  table = [];\n  for (i = 0; i < HUFFMAN_MAX_TABLE_SIZE; i++) {\n    table[i] = new HuffmanCode(0, 0);\n  }\n  \n  ReadHuffmanCode(num_htrees + max_run_length_prefix, table, 0, br);\n  \n  for (i = 0; i < context_map_size;) {\n    var code;\n\n    br.readMoreInput();\n    code = ReadSymbol(table, 0, br);\n    if (code === 0) {\n      context_map[i] = 0;\n      ++i;\n    } else if (code <= max_run_length_prefix) {\n      var reps = 1 + (1 << code) + br.readBits(code);\n      while (--reps) {\n        if (i >= context_map_size) {\n          throw new Error(\"[DecodeContextMap] i >= context_map_size\");\n        }\n        context_map[i] = 0;\n        ++i;\n      }\n    } else {\n      context_map[i] = code - max_run_length_prefix;\n      ++i;\n    }\n  }\n  if (br.readBits(1)) {\n    InverseMoveToFrontTransform(context_map, context_map_size);\n  }\n  \n  return out;\n}\n\nfunction DecodeBlockType(max_block_type, trees, tree_type, block_types, ringbuffers, indexes, br) {\n  var ringbuffer = tree_type * 2;\n  var index = tree_type;\n  var type_code = ReadSymbol(trees, tree_type * HUFFMAN_MAX_TABLE_SIZE, br);\n  var block_type;\n  if (type_code === 0) {\n    block_type = ringbuffers[ringbuffer + (indexes[index] & 1)];\n  } else if (type_code === 1) {\n    block_type = ringbuffers[ringbuffer + ((indexes[index] - 1) & 1)] + 1;\n  } else {\n    block_type = type_code - 2;\n  }\n  if (block_type >= max_block_type) {\n    block_type -= max_block_type;\n  }\n  block_types[tree_type] = block_type;\n  ringbuffers[ringbuffer + (indexes[index] & 1)] = block_type;\n  ++indexes[index];\n}\n\nfunction CopyUncompressedBlockToOutput(output, len, pos, ringbuffer, ringbuffer_mask, br) {\n  var rb_size = ringbuffer_mask + 1;\n  var rb_pos = pos & ringbuffer_mask;\n  var br_pos = br.pos_ & BrotliBitReader.IBUF_MASK;\n  var nbytes;\n\n  /* For short lengths copy byte-by-byte */\n  if (len < 8 || br.bit_pos_ + (len << 3) < br.bit_end_pos_) {\n    while (len-- > 0) {\n      br.readMoreInput();\n      ringbuffer[rb_pos++] = br.readBits(8);\n      if (rb_pos === rb_size) {\n        output.write(ringbuffer, rb_size);\n        rb_pos = 0;\n      }\n    }\n    return;\n  }\n\n  if (br.bit_end_pos_ < 32) {\n    throw new Error('[CopyUncompressedBlockToOutput] br.bit_end_pos_ < 32');\n  }\n\n  /* Copy remaining 0-4 bytes from br.val_ to ringbuffer. */\n  while (br.bit_pos_ < 32) {\n    ringbuffer[rb_pos] = (br.val_ >>> br.bit_pos_);\n    br.bit_pos_ += 8;\n    ++rb_pos;\n    --len;\n  }\n\n  /* Copy remaining bytes from br.buf_ to ringbuffer. */\n  nbytes = (br.bit_end_pos_ - br.bit_pos_) >> 3;\n  if (br_pos + nbytes > BrotliBitReader.IBUF_MASK) {\n    var tail = BrotliBitReader.IBUF_MASK + 1 - br_pos;\n    for (var x = 0; x < tail; x++)\n      ringbuffer[rb_pos + x] = br.buf_[br_pos + x];\n    \n    nbytes -= tail;\n    rb_pos += tail;\n    len -= tail;\n    br_pos = 0;\n  }\n\n  for (var x = 0; x < nbytes; x++)\n    ringbuffer[rb_pos + x] = br.buf_[br_pos + x];\n  \n  rb_pos += nbytes;\n  len -= nbytes;\n\n  /* If we wrote past the logical end of the ringbuffer, copy the tail of the\n     ringbuffer to its beginning and flush the ringbuffer to the output. */\n  if (rb_pos >= rb_size) {\n    output.write(ringbuffer, rb_size);\n    rb_pos -= rb_size;    \n    for (var x = 0; x < rb_pos; x++)\n      ringbuffer[x] = ringbuffer[rb_size + x];\n  }\n\n  /* If we have more to copy than the remaining size of the ringbuffer, then we\n     first fill the ringbuffer from the input and then flush the ringbuffer to\n     the output */\n  while (rb_pos + len >= rb_size) {\n    nbytes = rb_size - rb_pos;\n    if (br.input_.read(ringbuffer, rb_pos, nbytes) < nbytes) {\n      throw new Error('[CopyUncompressedBlockToOutput] not enough bytes');\n    }\n    output.write(ringbuffer, rb_size);\n    len -= nbytes;\n    rb_pos = 0;\n  }\n\n  /* Copy straight from the input onto the ringbuffer. The ringbuffer will be\n     flushed to the output at a later time. */\n  if (br.input_.read(ringbuffer, rb_pos, len) < len) {\n    throw new Error('[CopyUncompressedBlockToOutput] not enough bytes');\n  }\n\n  /* Restore the state of the bit reader. */\n  br.reset();\n}\n\n/* Advances the bit reader position to the next byte boundary and verifies\n   that any skipped bits are set to zero. */\nfunction JumpToByteBoundary(br) {\n  var new_bit_pos = (br.bit_pos_ + 7) & ~7;\n  var pad_bits = br.readBits(new_bit_pos - br.bit_pos_);\n  return pad_bits == 0;\n}\n\nfunction BrotliDecompressedSize(buffer) {\n  var input = new BrotliInput(buffer);\n  var br = new BrotliBitReader(input);\n  DecodeWindowBits(br);\n  var out = DecodeMetaBlockLength(br);\n  return out.meta_block_length;\n}\n\nexports.BrotliDecompressedSize = BrotliDecompressedSize;\n\nfunction BrotliDecompressBuffer(buffer, output_size) {\n  var input = new BrotliInput(buffer);\n  \n  if (output_size == null) {\n    output_size = BrotliDecompressedSize(buffer);\n  }\n  \n  var output_buffer = new Uint8Array(output_size);\n  var output = new BrotliOutput(output_buffer);\n  \n  BrotliDecompress(input, output);\n  \n  if (output.pos < output.buffer.length) {\n    output.buffer = output.buffer.subarray(0, output.pos);\n  }\n  \n  return output.buffer;\n}\n\nexports.BrotliDecompressBuffer = BrotliDecompressBuffer;\n\nfunction BrotliDecompress(input, output) {\n  var i;\n  var pos = 0;\n  var input_end = 0;\n  var window_bits = 0;\n  var max_backward_distance;\n  var max_distance = 0;\n  var ringbuffer_size;\n  var ringbuffer_mask;\n  var ringbuffer;\n  var ringbuffer_end;\n  /* This ring buffer holds a few past copy distances that will be used by */\n  /* some special distance codes. */\n  var dist_rb = [ 16, 15, 11, 4 ];\n  var dist_rb_idx = 0;\n  /* The previous 2 bytes used for context. */\n  var prev_byte1 = 0;\n  var prev_byte2 = 0;\n  var hgroup = [new HuffmanTreeGroup(0, 0), new HuffmanTreeGroup(0, 0), new HuffmanTreeGroup(0, 0)];\n  var block_type_trees;\n  var block_len_trees;\n  var br;\n\n  /* We need the slack region for the following reasons:\n       - always doing two 8-byte copies for fast backward copying\n       - transforms\n       - flushing the input ringbuffer when decoding uncompressed blocks */\n  var kRingBufferWriteAheadSlack = 128 + BrotliBitReader.READ_SIZE;\n\n  br = new BrotliBitReader(input);\n\n  /* Decode window size. */\n  window_bits = DecodeWindowBits(br);\n  max_backward_distance = (1 << window_bits) - 16;\n\n  ringbuffer_size = 1 << window_bits;\n  ringbuffer_mask = ringbuffer_size - 1;\n  ringbuffer = new Uint8Array(ringbuffer_size + kRingBufferWriteAheadSlack + BrotliDictionary.maxDictionaryWordLength);\n  ringbuffer_end = ringbuffer_size;\n\n  block_type_trees = [];\n  block_len_trees = [];\n  for (var x = 0; x < 3 * HUFFMAN_MAX_TABLE_SIZE; x++) {\n    block_type_trees[x] = new HuffmanCode(0, 0);\n    block_len_trees[x] = new HuffmanCode(0, 0);\n  }\n\n  while (!input_end) {\n    var meta_block_remaining_len = 0;\n    var is_uncompressed;\n    var block_length = [ 1 << 28, 1 << 28, 1 << 28 ];\n    var block_type = [ 0 ];\n    var num_block_types = [ 1, 1, 1 ];\n    var block_type_rb = [ 0, 1, 0, 1, 0, 1 ];\n    var block_type_rb_index = [ 0 ];\n    var distance_postfix_bits;\n    var num_direct_distance_codes;\n    var distance_postfix_mask;\n    var num_distance_codes;\n    var context_map = null;\n    var context_modes = null;\n    var num_literal_htrees;\n    var dist_context_map = null;\n    var num_dist_htrees;\n    var context_offset = 0;\n    var context_map_slice = null;\n    var literal_htree_index = 0;\n    var dist_context_offset = 0;\n    var dist_context_map_slice = null;\n    var dist_htree_index = 0;\n    var context_lookup_offset1 = 0;\n    var context_lookup_offset2 = 0;\n    var context_mode;\n    var htree_command;\n\n    for (i = 0; i < 3; ++i) {\n      hgroup[i].codes = null;\n      hgroup[i].htrees = null;\n    }\n\n    br.readMoreInput();\n    \n    var _out = DecodeMetaBlockLength(br);\n    meta_block_remaining_len = _out.meta_block_length;\n    if (pos + meta_block_remaining_len > output.buffer.length) {\n      /* We need to grow the output buffer to fit the additional data. */\n      var tmp = new Uint8Array( pos + meta_block_remaining_len );\n      tmp.set( output.buffer );\n      output.buffer = tmp;\n    }    \n    input_end = _out.input_end;\n    is_uncompressed = _out.is_uncompressed;\n    \n    if (_out.is_metadata) {\n      JumpToByteBoundary(br);\n      \n      for (; meta_block_remaining_len > 0; --meta_block_remaining_len) {\n        br.readMoreInput();\n        /* Read one byte and ignore it. */\n        br.readBits(8);\n      }\n      \n      continue;\n    }\n    \n    if (meta_block_remaining_len === 0) {\n      continue;\n    }\n    \n    if (is_uncompressed) {\n      br.bit_pos_ = (br.bit_pos_ + 7) & ~7;\n      CopyUncompressedBlockToOutput(output, meta_block_remaining_len, pos,\n                                    ringbuffer, ringbuffer_mask, br);\n      pos += meta_block_remaining_len;\n      continue;\n    }\n    \n    for (i = 0; i < 3; ++i) {\n      num_block_types[i] = DecodeVarLenUint8(br) + 1;\n      if (num_block_types[i] >= 2) {\n        ReadHuffmanCode(num_block_types[i] + 2, block_type_trees, i * HUFFMAN_MAX_TABLE_SIZE, br);\n        ReadHuffmanCode(kNumBlockLengthCodes, block_len_trees, i * HUFFMAN_MAX_TABLE_SIZE, br);\n        block_length[i] = ReadBlockLength(block_len_trees, i * HUFFMAN_MAX_TABLE_SIZE, br);\n        block_type_rb_index[i] = 1;\n      }\n    }\n    \n    br.readMoreInput();\n    \n    distance_postfix_bits = br.readBits(2);\n    num_direct_distance_codes = NUM_DISTANCE_SHORT_CODES + (br.readBits(4) << distance_postfix_bits);\n    distance_postfix_mask = (1 << distance_postfix_bits) - 1;\n    num_distance_codes = (num_direct_distance_codes + (48 << distance_postfix_bits));\n    context_modes = new Uint8Array(num_block_types[0]);\n\n    for (i = 0; i < num_block_types[0]; ++i) {\n       br.readMoreInput();\n       context_modes[i] = (br.readBits(2) << 1);\n    }\n    \n    var _o1 = DecodeContextMap(num_block_types[0] << kLiteralContextBits, br);\n    num_literal_htrees = _o1.num_htrees;\n    context_map = _o1.context_map;\n    \n    var _o2 = DecodeContextMap(num_block_types[2] << kDistanceContextBits, br);\n    num_dist_htrees = _o2.num_htrees;\n    dist_context_map = _o2.context_map;\n    \n    hgroup[0] = new HuffmanTreeGroup(kNumLiteralCodes, num_literal_htrees);\n    hgroup[1] = new HuffmanTreeGroup(kNumInsertAndCopyCodes, num_block_types[1]);\n    hgroup[2] = new HuffmanTreeGroup(num_distance_codes, num_dist_htrees);\n\n    for (i = 0; i < 3; ++i) {\n      hgroup[i].decode(br);\n    }\n\n    context_map_slice = 0;\n    dist_context_map_slice = 0;\n    context_mode = context_modes[block_type[0]];\n    context_lookup_offset1 = Context.lookupOffsets[context_mode];\n    context_lookup_offset2 = Context.lookupOffsets[context_mode + 1];\n    htree_command = hgroup[1].htrees[0];\n\n    while (meta_block_remaining_len > 0) {\n      var cmd_code;\n      var range_idx;\n      var insert_code;\n      var copy_code;\n      var insert_length;\n      var copy_length;\n      var distance_code;\n      var distance;\n      var context;\n      var j;\n      var copy_dst;\n\n      br.readMoreInput();\n      \n      if (block_length[1] === 0) {\n        DecodeBlockType(num_block_types[1],\n                        block_type_trees, 1, block_type, block_type_rb,\n                        block_type_rb_index, br);\n        block_length[1] = ReadBlockLength(block_len_trees, HUFFMAN_MAX_TABLE_SIZE, br);\n        htree_command = hgroup[1].htrees[block_type[1]];\n      }\n      --block_length[1];\n      cmd_code = ReadSymbol(hgroup[1].codes, htree_command, br);\n      range_idx = cmd_code >> 6;\n      if (range_idx >= 2) {\n        range_idx -= 2;\n        distance_code = -1;\n      } else {\n        distance_code = 0;\n      }\n      insert_code = Prefix.kInsertRangeLut[range_idx] + ((cmd_code >> 3) & 7);\n      copy_code = Prefix.kCopyRangeLut[range_idx] + (cmd_code & 7);\n      insert_length = Prefix.kInsertLengthPrefixCode[insert_code].offset +\n          br.readBits(Prefix.kInsertLengthPrefixCode[insert_code].nbits);\n      copy_length = Prefix.kCopyLengthPrefixCode[copy_code].offset +\n          br.readBits(Prefix.kCopyLengthPrefixCode[copy_code].nbits);\n      prev_byte1 = ringbuffer[pos-1 & ringbuffer_mask];\n      prev_byte2 = ringbuffer[pos-2 & ringbuffer_mask];\n      for (j = 0; j < insert_length; ++j) {\n        br.readMoreInput();\n\n        if (block_length[0] === 0) {\n          DecodeBlockType(num_block_types[0],\n                          block_type_trees, 0, block_type, block_type_rb,\n                          block_type_rb_index, br);\n          block_length[0] = ReadBlockLength(block_len_trees, 0, br);\n          context_offset = block_type[0] << kLiteralContextBits;\n          context_map_slice = context_offset;\n          context_mode = context_modes[block_type[0]];\n          context_lookup_offset1 = Context.lookupOffsets[context_mode];\n          context_lookup_offset2 = Context.lookupOffsets[context_mode + 1];\n        }\n        context = (Context.lookup[context_lookup_offset1 + prev_byte1] |\n                   Context.lookup[context_lookup_offset2 + prev_byte2]);\n        literal_htree_index = context_map[context_map_slice + context];\n        --block_length[0];\n        prev_byte2 = prev_byte1;\n        prev_byte1 = ReadSymbol(hgroup[0].codes, hgroup[0].htrees[literal_htree_index], br);\n        ringbuffer[pos & ringbuffer_mask] = prev_byte1;\n        if ((pos & ringbuffer_mask) === ringbuffer_mask) {\n          output.write(ringbuffer, ringbuffer_size);\n        }\n        ++pos;\n      }\n      meta_block_remaining_len -= insert_length;\n      if (meta_block_remaining_len <= 0) break;\n\n      if (distance_code < 0) {\n        var context;\n        \n        br.readMoreInput();\n        if (block_length[2] === 0) {\n          DecodeBlockType(num_block_types[2],\n                          block_type_trees, 2, block_type, block_type_rb,\n                          block_type_rb_index, br);\n          block_length[2] = ReadBlockLength(block_len_trees, 2 * HUFFMAN_MAX_TABLE_SIZE, br);\n          dist_context_offset = block_type[2] << kDistanceContextBits;\n          dist_context_map_slice = dist_context_offset;\n        }\n        --block_length[2];\n        context = (copy_length > 4 ? 3 : copy_length - 2) & 0xff;\n        dist_htree_index = dist_context_map[dist_context_map_slice + context];\n        distance_code = ReadSymbol(hgroup[2].codes, hgroup[2].htrees[dist_htree_index], br);\n        if (distance_code >= num_direct_distance_codes) {\n          var nbits;\n          var postfix;\n          var offset;\n          distance_code -= num_direct_distance_codes;\n          postfix = distance_code & distance_postfix_mask;\n          distance_code >>= distance_postfix_bits;\n          nbits = (distance_code >> 1) + 1;\n          offset = ((2 + (distance_code & 1)) << nbits) - 4;\n          distance_code = num_direct_distance_codes +\n              ((offset + br.readBits(nbits)) <<\n               distance_postfix_bits) + postfix;\n        }\n      }\n\n      /* Convert the distance code to the actual distance by possibly looking */\n      /* up past distnaces from the ringbuffer. */\n      distance = TranslateShortCodes(distance_code, dist_rb, dist_rb_idx);\n      if (distance < 0) {\n        throw new Error('[BrotliDecompress] invalid distance');\n      }\n\n      if (pos < max_backward_distance &&\n          max_distance !== max_backward_distance) {\n        max_distance = pos;\n      } else {\n        max_distance = max_backward_distance;\n      }\n\n      copy_dst = pos & ringbuffer_mask;\n\n      if (distance > max_distance) {\n        if (copy_length >= BrotliDictionary.minDictionaryWordLength &&\n            copy_length <= BrotliDictionary.maxDictionaryWordLength) {\n          var offset = BrotliDictionary.offsetsByLength[copy_length];\n          var word_id = distance - max_distance - 1;\n          var shift = BrotliDictionary.sizeBitsByLength[copy_length];\n          var mask = (1 << shift) - 1;\n          var word_idx = word_id & mask;\n          var transform_idx = word_id >> shift;\n          offset += word_idx * copy_length;\n          if (transform_idx < Transform.kNumTransforms) {\n            var len = Transform.transformDictionaryWord(ringbuffer, copy_dst, offset, copy_length, transform_idx);\n            copy_dst += len;\n            pos += len;\n            meta_block_remaining_len -= len;\n            if (copy_dst >= ringbuffer_end) {\n              output.write(ringbuffer, ringbuffer_size);\n              \n              for (var _x = 0; _x < (copy_dst - ringbuffer_end); _x++)\n                ringbuffer[_x] = ringbuffer[ringbuffer_end + _x];\n            }\n          } else {\n            throw new Error(\"Invalid backward reference. pos: \" + pos + \" distance: \" + distance +\n              \" len: \" + copy_length + \" bytes left: \" + meta_block_remaining_len);\n          }\n        } else {\n          throw new Error(\"Invalid backward reference. pos: \" + pos + \" distance: \" + distance +\n            \" len: \" + copy_length + \" bytes left: \" + meta_block_remaining_len);\n        }\n      } else {\n        if (distance_code > 0) {\n          dist_rb[dist_rb_idx & 3] = distance;\n          ++dist_rb_idx;\n        }\n\n        if (copy_length > meta_block_remaining_len) {\n          throw new Error(\"Invalid backward reference. pos: \" + pos + \" distance: \" + distance +\n            \" len: \" + copy_length + \" bytes left: \" + meta_block_remaining_len);\n        }\n\n        for (j = 0; j < copy_length; ++j) {\n          ringbuffer[pos & ringbuffer_mask] = ringbuffer[(pos - distance) & ringbuffer_mask];\n          if ((pos & ringbuffer_mask) === ringbuffer_mask) {\n            output.write(ringbuffer, ringbuffer_size);\n          }\n          ++pos;\n          --meta_block_remaining_len;\n        }\n      }\n\n      /* When we get here, we must have inserted at least one literal and */\n      /* made a copy of at least length two, therefore accessing the last 2 */\n      /* bytes is valid. */\n      prev_byte1 = ringbuffer[(pos - 1) & ringbuffer_mask];\n      prev_byte2 = ringbuffer[(pos - 2) & ringbuffer_mask];\n    }\n\n    /* Protect pos from overflow, wrap it around at every GB of input data */\n    pos &= 0x3fffffff;\n  }\n\n  output.write(ringbuffer, pos & ringbuffer_mask);\n}\n\nexports.BrotliDecompress = BrotliDecompress;\n\nBrotliDictionary.init();\n", "module.exports = require('./dec/decode').BrotliDecompressBuffer;\n", "/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\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 * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <https://feross.org>\n * @license  MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nconst base64 = require('base64-js')\nconst ieee754 = require('ieee754')\nconst customInspectSymbol =\n  (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation\n    ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation\n    : null\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nconst K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Print warning and recommend using `buffer` v4.x which has an Object\n *               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 * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n    typeof console.error === 'function') {\n  console.error(\n    'This browser lacks typed array (Uint8Array) support which is required by ' +\n    '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n  )\n}\n\nfunction typedArraySupport () {\n  // Can typed array instances can be augmented?\n  try {\n    const arr = new Uint8Array(1)\n    const proto = { foo: function () { return 42 } }\n    Object.setPrototypeOf(proto, Uint8Array.prototype)\n    Object.setPrototypeOf(arr, proto)\n    return arr.foo() === 42\n  } catch (e) {\n    return false\n  }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n  enumerable: true,\n  get: function () {\n    if (!Buffer.isBuffer(this)) return undefined\n    return this.buffer\n  }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n  enumerable: true,\n  get: function () {\n    if (!Buffer.isBuffer(this)) return undefined\n    return this.byteOffset\n  }\n})\n\nfunction createBuffer (length) {\n  if (length > K_MAX_LENGTH) {\n    throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n  }\n  // Return an augmented `Uint8Array` instance\n  const buf = new Uint8Array(length)\n  Object.setPrototypeOf(buf, Buffer.prototype)\n  return buf\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  // Common case.\n  if (typeof arg === 'number') {\n    if (typeof encodingOrOffset === 'string') {\n      throw new TypeError(\n        'The \"string\" argument must be of type string. Received type number'\n      )\n    }\n    return allocUnsafe(arg)\n  }\n  return from(arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n  if (typeof value === 'string') {\n    return fromString(value, encodingOrOffset)\n  }\n\n  if (ArrayBuffer.isView(value)) {\n    return fromArrayView(value)\n  }\n\n  if (value == null) {\n    throw new TypeError(\n      'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n      'or Array-like Object. Received type ' + (typeof value)\n    )\n  }\n\n  if (isInstance(value, ArrayBuffer) ||\n      (value && isInstance(value.buffer, ArrayBuffer))) {\n    return fromArrayBuffer(value, encodingOrOffset, length)\n  }\n\n  if (typeof SharedArrayBuffer !== 'undefined' &&\n      (isInstance(value, SharedArrayBuffer) ||\n      (value && isInstance(value.buffer, SharedArrayBuffer)))) {\n    return fromArrayBuffer(value, encodingOrOffset, length)\n  }\n\n  if (typeof value === 'number') {\n    throw new TypeError(\n      'The \"value\" argument must not be of type number. Received type number'\n    )\n  }\n\n  const valueOf = value.valueOf && value.valueOf()\n  if (valueOf != null && valueOf !== value) {\n    return Buffer.from(valueOf, encodingOrOffset, length)\n  }\n\n  const b = fromObject(value)\n  if (b) return b\n\n  if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n      typeof value[Symbol.toPrimitive] === 'function') {\n    return Buffer.from(value[Symbol.toPrimitive]('string'), encodingOrOffset, length)\n  }\n\n  throw new TypeError(\n    'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n    'or Array-like Object. Received type ' + (typeof value)\n  )\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(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)\nObject.setPrototypeOf(Buffer, Uint8Array)\n\nfunction assertSize (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('\"size\" argument must be of type number')\n  } else if (size < 0) {\n    throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n  }\n}\n\nfunction alloc (size, fill, encoding) {\n  assertSize(size)\n  if (size <= 0) {\n    return createBuffer(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 interpreted as a start offset.\n    return typeof encoding === 'string'\n      ? createBuffer(size).fill(fill, encoding)\n      : createBuffer(size).fill(fill)\n  }\n  return createBuffer(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(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n  assertSize(size)\n  return createBuffer(size < 0 ? 0 : checked(size) | 0)\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(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(size)\n}\n\nfunction fromString (string, encoding) {\n  if (typeof encoding !== 'string' || encoding === '') {\n    encoding = 'utf8'\n  }\n\n  if (!Buffer.isEncoding(encoding)) {\n    throw new TypeError('Unknown encoding: ' + encoding)\n  }\n\n  const length = byteLength(string, encoding) | 0\n  let buf = createBuffer(length)\n\n  const actual = buf.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    buf = buf.slice(0, actual)\n  }\n\n  return buf\n}\n\nfunction fromArrayLike (array) {\n  const length = array.length < 0 ? 0 : checked(array.length) | 0\n  const buf = createBuffer(length)\n  for (let i = 0; i < length; i += 1) {\n    buf[i] = array[i] & 255\n  }\n  return buf\n}\n\nfunction fromArrayView (arrayView) {\n  if (isInstance(arrayView, Uint8Array)) {\n    const copy = new Uint8Array(arrayView)\n    return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)\n  }\n  return fromArrayLike(arrayView)\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n  if (byteOffset < 0 || array.byteLength < byteOffset) {\n    throw new RangeError('\"offset\" is outside of buffer bounds')\n  }\n\n  if (array.byteLength < byteOffset + (length || 0)) {\n    throw new RangeError('\"length\" is outside of buffer bounds')\n  }\n\n  let buf\n  if (byteOffset === undefined && length === undefined) {\n    buf = new Uint8Array(array)\n  } else if (length === undefined) {\n    buf = new Uint8Array(array, byteOffset)\n  } else {\n    buf = new Uint8Array(array, byteOffset, length)\n  }\n\n  // Return an augmented `Uint8Array` instance\n  Object.setPrototypeOf(buf, Buffer.prototype)\n\n  return buf\n}\n\nfunction fromObject (obj) {\n  if (Buffer.isBuffer(obj)) {\n    const len = checked(obj.length) | 0\n    const buf = createBuffer(len)\n\n    if (buf.length === 0) {\n      return buf\n    }\n\n    obj.copy(buf, 0, 0, len)\n    return buf\n  }\n\n  if (obj.length !== undefined) {\n    if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n      return createBuffer(0)\n    }\n    return fromArrayLike(obj)\n  }\n\n  if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n    return fromArrayLike(obj.data)\n  }\n}\n\nfunction checked (length) {\n  // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n  // length is NaN (which is otherwise coerced to zero.)\n  if (length >= K_MAX_LENGTH) {\n    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n                         'size: 0x' + K_MAX_LENGTH.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 === true &&\n    b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n  if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n  if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n    throw new TypeError(\n      'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n    )\n  }\n\n  if (a === b) return 0\n\n  let x = a.length\n  let y = b.length\n\n  for (let 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 (!Array.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  let 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  const buffer = Buffer.allocUnsafe(length)\n  let pos = 0\n  for (i = 0; i < list.length; ++i) {\n    let buf = list[i]\n    if (isInstance(buf, Uint8Array)) {\n      if (pos + buf.length > buffer.length) {\n        if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf)\n        buf.copy(buffer, pos)\n      } else {\n        Uint8Array.prototype.set.call(\n          buffer,\n          buf,\n          pos\n        )\n      }\n    } else if (!Buffer.isBuffer(buf)) {\n      throw new TypeError('\"list\" argument must be an Array of Buffers')\n    } else {\n      buf.copy(buffer, pos)\n    }\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 (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n    return string.byteLength\n  }\n  if (typeof string !== 'string') {\n    throw new TypeError(\n      'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n      'Received type ' + typeof string\n    )\n  }\n\n  const len = string.length\n  const mustMatch = (arguments.length > 2 && arguments[2] === true)\n  if (!mustMatch && len === 0) return 0\n\n  // Use a for loop to avoid recursion\n  let 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        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) {\n          return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n        }\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n  let 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 coercion 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// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n  const i = b[n]\n  b[n] = b[m]\n  b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n  const len = this.length\n  if (len % 2 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 16-bits')\n  }\n  for (let i = 0; i < len; i += 2) {\n    swap(this, i, i + 1)\n  }\n  return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n  const len = this.length\n  if (len % 4 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 32-bits')\n  }\n  for (let 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  const len = this.length\n  if (len % 8 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 64-bits')\n  }\n  for (let 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  const length = this.length\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.toLocaleString = Buffer.prototype.toString\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  let str = ''\n  const max = exports.INSPECT_MAX_BYTES\n  str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n  if (this.length > max) str += ' ... '\n  return '<Buffer ' + str + '>'\n}\nif (customInspectSymbol) {\n  Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n  if (isInstance(target, Uint8Array)) {\n    target = Buffer.from(target, target.offset, target.byteLength)\n  }\n  if (!Buffer.isBuffer(target)) {\n    throw new TypeError(\n      'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n      'Received type ' + (typeof target)\n    )\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  let x = thisEnd - thisStart\n  let y = end - start\n  const len = Math.min(x, y)\n\n  const thisCopy = this.slice(thisStart, thisEnd)\n  const targetCopy = target.slice(start, end)\n\n  for (let 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 (numberIsNaN(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 (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  let indexSize = 1\n  let arrLength = arr.length\n  let 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  let i\n  if (dir) {\n    let 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      let found = true\n      for (let 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  const 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  const strLen = string.length\n\n  if (length > strLen / 2) {\n    length = strLen / 2\n  }\n  let i\n  for (i = 0; i < length; ++i) {\n    const parsed = parseInt(string.substr(i * 2, 2), 16)\n    if (numberIsNaN(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 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  } else {\n    throw new Error(\n      'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n    )\n  }\n\n  const 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  let 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      case 'latin1':\n      case 'binary':\n        return asciiWrite(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  const res = []\n\n  let i = start\n  while (i < end) {\n    const firstByte = buf[i]\n    let codePoint = null\n    let bytesPerSequence = (firstByte > 0xEF)\n      ? 4\n      : (firstByte > 0xDF)\n          ? 3\n          : (firstByte > 0xBF)\n              ? 2\n              : 1\n\n    if (i + bytesPerSequence <= end) {\n      let 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\nconst MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n  const 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  let res = ''\n  let 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  let ret = ''\n  end = Math.min(buf.length, end)\n\n  for (let i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i] & 0x7F)\n  }\n  return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n  let ret = ''\n  end = Math.min(buf.length, end)\n\n  for (let i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i])\n  }\n  return ret\n}\n\nfunction hexSlice (buf, start, end) {\n  const len = buf.length\n\n  if (!start || start < 0) start = 0\n  if (!end || end < 0 || end > len) end = len\n\n  let out = ''\n  for (let i = start; i < end; ++i) {\n    out += hexSliceLookupTable[buf[i]]\n  }\n  return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n  const bytes = buf.slice(start, end)\n  let res = ''\n  // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n  for (let i = 0; i < bytes.length - 1; 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  const 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  const newBuf = this.subarray(start, end)\n  // Return an augmented `Uint8Array` instance\n  Object.setPrototypeOf(newBuf, Buffer.prototype)\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 =\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  let val = this[offset]\n  let mul = 1\n  let i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUintBE =\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  let val = this[offset + --byteLength]\n  let mul = 1\n  while (byteLength > 0 && (mul *= 0x100)) {\n    val += this[offset + --byteLength] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUint8 =\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  return this[offset]\n}\n\nBuffer.prototype.readUint16LE =\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUint16BE =\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUint32LE =\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n  offset = offset >>> 0\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 =\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n  offset = offset >>> 0\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.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE (offset) {\n  offset = offset >>> 0\n  validateNumber(offset, 'offset')\n  const first = this[offset]\n  const last = this[offset + 7]\n  if (first === undefined || last === undefined) {\n    boundsError(offset, this.length - 8)\n  }\n\n  const lo = first +\n    this[++offset] * 2 ** 8 +\n    this[++offset] * 2 ** 16 +\n    this[++offset] * 2 ** 24\n\n  const hi = this[++offset] +\n    this[++offset] * 2 ** 8 +\n    this[++offset] * 2 ** 16 +\n    last * 2 ** 24\n\n  return BigInt(lo) + (BigInt(hi) << BigInt(32))\n})\n\nBuffer.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE (offset) {\n  offset = offset >>> 0\n  validateNumber(offset, 'offset')\n  const first = this[offset]\n  const last = this[offset + 7]\n  if (first === undefined || last === undefined) {\n    boundsError(offset, this.length - 8)\n  }\n\n  const hi = first * 2 ** 24 +\n    this[++offset] * 2 ** 16 +\n    this[++offset] * 2 ** 8 +\n    this[++offset]\n\n  const lo = this[++offset] * 2 ** 24 +\n    this[++offset] * 2 ** 16 +\n    this[++offset] * 2 ** 8 +\n    last\n\n  return (BigInt(hi) << BigInt(32)) + BigInt(lo)\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  let val = this[offset]\n  let mul = 1\n  let 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  let i = byteLength\n  let mul = 1\n  let 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  offset = offset >>> 0\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  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  const val = this[offset] | (this[offset + 1] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  const val = this[offset + 1] | (this[offset] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n  offset = offset >>> 0\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  offset = offset >>> 0\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.readBigInt64LE = defineBigIntMethod(function readBigInt64LE (offset) {\n  offset = offset >>> 0\n  validateNumber(offset, 'offset')\n  const first = this[offset]\n  const last = this[offset + 7]\n  if (first === undefined || last === undefined) {\n    boundsError(offset, this.length - 8)\n  }\n\n  const val = this[offset + 4] +\n    this[offset + 5] * 2 ** 8 +\n    this[offset + 6] * 2 ** 16 +\n    (last << 24) // Overflow\n\n  return (BigInt(val) << BigInt(32)) +\n    BigInt(first +\n    this[++offset] * 2 ** 8 +\n    this[++offset] * 2 ** 16 +\n    this[++offset] * 2 ** 24)\n})\n\nBuffer.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE (offset) {\n  offset = offset >>> 0\n  validateNumber(offset, 'offset')\n  const first = this[offset]\n  const last = this[offset + 7]\n  if (first === undefined || last === undefined) {\n    boundsError(offset, this.length - 8)\n  }\n\n  const val = (first << 24) + // Overflow\n    this[++offset] * 2 ** 16 +\n    this[++offset] * 2 ** 8 +\n    this[++offset]\n\n  return (BigInt(val) << BigInt(32)) +\n    BigInt(this[++offset] * 2 ** 24 +\n    this[++offset] * 2 ** 16 +\n    this[++offset] * 2 ** 8 +\n    last)\n})\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n  offset = offset >>> 0\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  offset = offset >>> 0\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  offset = offset >>> 0\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  offset = offset >>> 0\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 =\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) {\n    const maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  let mul = 1\n  let 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 =\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) {\n    const maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  let i = byteLength - 1\n  let 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 =\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  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeUint16LE =\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  this[offset] = (value & 0xff)\n  this[offset + 1] = (value >>> 8)\n  return offset + 2\n}\n\nBuffer.prototype.writeUint16BE =\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  this[offset] = (value >>> 8)\n  this[offset + 1] = (value & 0xff)\n  return offset + 2\n}\n\nBuffer.prototype.writeUint32LE =\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  this[offset + 3] = (value >>> 24)\n  this[offset + 2] = (value >>> 16)\n  this[offset + 1] = (value >>> 8)\n  this[offset] = (value & 0xff)\n  return offset + 4\n}\n\nBuffer.prototype.writeUint32BE =\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  this[offset] = (value >>> 24)\n  this[offset + 1] = (value >>> 16)\n  this[offset + 2] = (value >>> 8)\n  this[offset + 3] = (value & 0xff)\n  return offset + 4\n}\n\nfunction wrtBigUInt64LE (buf, value, offset, min, max) {\n  checkIntBI(value, min, max, buf, offset, 7)\n\n  let lo = Number(value & BigInt(0xffffffff))\n  buf[offset++] = lo\n  lo = lo >> 8\n  buf[offset++] = lo\n  lo = lo >> 8\n  buf[offset++] = lo\n  lo = lo >> 8\n  buf[offset++] = lo\n  let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n  buf[offset++] = hi\n  hi = hi >> 8\n  buf[offset++] = hi\n  hi = hi >> 8\n  buf[offset++] = hi\n  hi = hi >> 8\n  buf[offset++] = hi\n  return offset\n}\n\nfunction wrtBigUInt64BE (buf, value, offset, min, max) {\n  checkIntBI(value, min, max, buf, offset, 7)\n\n  let lo = Number(value & BigInt(0xffffffff))\n  buf[offset + 7] = lo\n  lo = lo >> 8\n  buf[offset + 6] = lo\n  lo = lo >> 8\n  buf[offset + 5] = lo\n  lo = lo >> 8\n  buf[offset + 4] = lo\n  let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n  buf[offset + 3] = hi\n  hi = hi >> 8\n  buf[offset + 2] = hi\n  hi = hi >> 8\n  buf[offset + 1] = hi\n  hi = hi >> 8\n  buf[offset] = hi\n  return offset + 8\n}\n\nBuffer.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE (value, offset = 0) {\n  return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE (value, offset = 0) {\n  return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) {\n    const limit = Math.pow(2, (8 * byteLength) - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  let i = 0\n  let mul = 1\n  let 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    const limit = Math.pow(2, (8 * byteLength) - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  let i = byteLength - 1\n  let mul = 1\n  let 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 (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  this[offset] = (value & 0xff)\n  this[offset + 1] = (value >>> 8)\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  this[offset] = (value >>> 8)\n  this[offset + 1] = (value & 0xff)\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  this[offset] = (value & 0xff)\n  this[offset + 1] = (value >>> 8)\n  this[offset + 2] = (value >>> 16)\n  this[offset + 3] = (value >>> 24)\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  this[offset] = (value >>> 24)\n  this[offset + 1] = (value >>> 16)\n  this[offset + 2] = (value >>> 8)\n  this[offset + 3] = (value & 0xff)\n  return offset + 4\n}\n\nBuffer.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE (value, offset = 0) {\n  return wrtBigUInt64LE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nBuffer.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE (value, offset = 0) {\n  return wrtBigUInt64BE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\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  value = +value\n  offset = offset >>> 0\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  value = +value\n  offset = offset >>> 0\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 (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\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('Index out of range')\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  const len = end - start\n\n  if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n    // Use built-in when available, missing from IE11\n    this.copyWithin(targetStart, start, end)\n  } else {\n    Uint8Array.prototype.set.call(\n      target,\n      this.subarray(start, end),\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 (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    if (val.length === 1) {\n      const code = val.charCodeAt(0)\n      if ((encoding === 'utf8' && code < 128) ||\n          encoding === 'latin1') {\n        // Fast path: If `val` fits into a single byte, use that numeric value.\n        val = code\n      }\n    }\n  } else if (typeof val === 'number') {\n    val = val & 255\n  } else if (typeof val === 'boolean') {\n    val = Number(val)\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  let i\n  if (typeof val === 'number') {\n    for (i = start; i < end; ++i) {\n      this[i] = val\n    }\n  } else {\n    const bytes = Buffer.isBuffer(val)\n      ? val\n      : Buffer.from(val, encoding)\n    const len = bytes.length\n    if (len === 0) {\n      throw new TypeError('The value \"' + val +\n        '\" is invalid for argument \"value\"')\n    }\n    for (i = 0; i < end - start; ++i) {\n      this[i + start] = bytes[i % len]\n    }\n  }\n\n  return this\n}\n\n// CUSTOM ERRORS\n// =============\n\n// Simplified versions from Node, changed for Buffer-only usage\nconst errors = {}\nfunction E (sym, getMessage, Base) {\n  errors[sym] = class NodeError extends Base {\n    constructor () {\n      super()\n\n      Object.defineProperty(this, 'message', {\n        value: getMessage.apply(this, arguments),\n        writable: true,\n        configurable: true\n      })\n\n      // Add the error code to the name to include it in the stack trace.\n      this.name = `${this.name} [${sym}]`\n      // Access the stack to generate the error message including the error code\n      // from the name.\n      this.stack // eslint-disable-line no-unused-expressions\n      // Reset the name to the actual name.\n      delete this.name\n    }\n\n    get code () {\n      return sym\n    }\n\n    set code (value) {\n      Object.defineProperty(this, 'code', {\n        configurable: true,\n        enumerable: true,\n        value,\n        writable: true\n      })\n    }\n\n    toString () {\n      return `${this.name} [${sym}]: ${this.message}`\n    }\n  }\n}\n\nE('ERR_BUFFER_OUT_OF_BOUNDS',\n  function (name) {\n    if (name) {\n      return `${name} is outside of buffer bounds`\n    }\n\n    return 'Attempt to access memory outside buffer bounds'\n  }, RangeError)\nE('ERR_INVALID_ARG_TYPE',\n  function (name, actual) {\n    return `The \"${name}\" argument must be of type number. Received type ${typeof actual}`\n  }, TypeError)\nE('ERR_OUT_OF_RANGE',\n  function (str, range, input) {\n    let msg = `The value of \"${str}\" is out of range.`\n    let received = input\n    if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {\n      received = addNumericalSeparator(String(input))\n    } else if (typeof input === 'bigint') {\n      received = String(input)\n      if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) {\n        received = addNumericalSeparator(received)\n      }\n      received += 'n'\n    }\n    msg += ` It must be ${range}. Received ${received}`\n    return msg\n  }, RangeError)\n\nfunction addNumericalSeparator (val) {\n  let res = ''\n  let i = val.length\n  const start = val[0] === '-' ? 1 : 0\n  for (; i >= start + 4; i -= 3) {\n    res = `_${val.slice(i - 3, i)}${res}`\n  }\n  return `${val.slice(0, i)}${res}`\n}\n\n// CHECK FUNCTIONS\n// ===============\n\nfunction checkBounds (buf, offset, byteLength) {\n  validateNumber(offset, 'offset')\n  if (buf[offset] === undefined || buf[offset + byteLength] === undefined) {\n    boundsError(offset, buf.length - (byteLength + 1))\n  }\n}\n\nfunction checkIntBI (value, min, max, buf, offset, byteLength) {\n  if (value > max || value < min) {\n    const n = typeof min === 'bigint' ? 'n' : ''\n    let range\n    if (byteLength > 3) {\n      if (min === 0 || min === BigInt(0)) {\n        range = `>= 0${n} and < 2${n} ** ${(byteLength + 1) * 8}${n}`\n      } else {\n        range = `>= -(2${n} ** ${(byteLength + 1) * 8 - 1}${n}) and < 2 ** ` +\n                `${(byteLength + 1) * 8 - 1}${n}`\n      }\n    } else {\n      range = `>= ${min}${n} and <= ${max}${n}`\n    }\n    throw new errors.ERR_OUT_OF_RANGE('value', range, value)\n  }\n  checkBounds(buf, offset, byteLength)\n}\n\nfunction validateNumber (value, name) {\n  if (typeof value !== 'number') {\n    throw new errors.ERR_INVALID_ARG_TYPE(name, 'number', value)\n  }\n}\n\nfunction boundsError (value, length, type) {\n  if (Math.floor(value) !== value) {\n    validateNumber(value, type)\n    throw new errors.ERR_OUT_OF_RANGE(type || 'offset', 'an integer', value)\n  }\n\n  if (length < 0) {\n    throw new errors.ERR_BUFFER_OUT_OF_BOUNDS()\n  }\n\n  throw new errors.ERR_OUT_OF_RANGE(type || 'offset',\n                                    `>= ${type ? 1 : 0} and <= ${length}`,\n                                    value)\n}\n\n// HELPER FUNCTIONS\n// ================\n\nconst INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n  // Node takes equal signs as end of the Base64 encoding\n  str = str.split('=')[0]\n  // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n  str = str.trim().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 utf8ToBytes (string, units) {\n  units = units || Infinity\n  let codePoint\n  const length = string.length\n  let leadSurrogate = null\n  const bytes = []\n\n  for (let 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  const byteArray = []\n  for (let 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  let c, hi, lo\n  const byteArray = []\n  for (let 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  let i\n  for (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\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n  return obj instanceof type ||\n    (obj != null && obj.constructor != null && obj.constructor.name != null &&\n      obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n  // For IE11 support\n  return obj !== obj // eslint-disable-line no-self-compare\n}\n\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nconst hexSliceLookupTable = (function () {\n  const alphabet = '0123456789abcdef'\n  const table = new Array(256)\n  for (let i = 0; i < 16; ++i) {\n    const i16 = i * 16\n    for (let j = 0; j < 16; ++j) {\n      table[i16 + j] = alphabet[i] + alphabet[j]\n    }\n  }\n  return table\n})()\n\n// Return not function with Error if BigInt not supported\nfunction defineBigIntMethod (fn) {\n  return typeof BigInt === 'undefined' ? BufferBigIntNotDefined : fn\n}\n\nfunction BufferBigIntNotDefined () {\n  throw new Error('BigInt not supported')\n}\n", "/*!\n * Select2 4.1.0-rc.0\n * https://select2.github.io\n *\n * Released under the MIT license\n * https://github.com/select2/select2/blob/master/LICENSE.md\n */\n;(function (factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module.\n    define(['jquery'], factory);\n  } else if (typeof module === 'object' && module.exports) {\n    // Node/CommonJS\n    module.exports = function (root, jQuery) {\n      if (jQuery === undefined) {\n        // require('jQuery') returns a factory that requires window to\n        // build a jQuery instance, we normalize how we use modules\n        // that require this pattern but the window provided is a noop\n        // if it's defined (how jquery works)\n        if (typeof window !== 'undefined') {\n          jQuery = require('jquery');\n        }\n        else {\n          jQuery = require('jquery')(root);\n        }\n      }\n      factory(jQuery);\n      return jQuery;\n    };\n  } else {\n    // Browser globals\n    factory(jQuery);\n  }\n} (function (jQuery) {\n  // This is needed so we can catch the AMD loader configuration and use it\n  // The inner file should be wrapped (by `banner.start.js`) in a function that\n  // returns the AMD loader references.\n  var S2 =(function () {\n  // Restore the Select2 AMD loader so it can be used\n  // Needed mostly in the language files, where the loader is not inserted\n  if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) {\n    var S2 = jQuery.fn.select2.amd;\n  }\nvar S2;(function () { if (!S2 || !S2.requirejs) {\nif (!S2) { S2 = {}; } else { require = S2; }\n/**\n * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.\n * Released under MIT license, http://github.com/requirejs/almond/LICENSE\n */\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\n//be followed.\n/*global setTimeout: false */\n\nvar requirejs, require, define;\n(function (undef) {\n    var main, req, makeMap, handlers,\n        defined = {},\n        waiting = {},\n        config = {},\n        defining = {},\n        hasOwn = Object.prototype.hasOwnProperty,\n        aps = [].slice,\n        jsSuffixRegExp = /\\.js$/;\n\n    function hasProp(obj, prop) {\n        return hasOwn.call(obj, prop);\n    }\n\n    /**\n     * Given a relative module name, like ./something, normalize it to\n     * a real name that can be mapped to a path.\n     * @param {String} name the relative name\n     * @param {String} baseName a real name that the name arg is relative\n     * to.\n     * @returns {String} normalized name\n     */\n    function normalize(name, baseName) {\n        var nameParts, nameSegment, mapValue, foundMap, lastIndex,\n            foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,\n            baseParts = baseName && baseName.split(\"/\"),\n            map = config.map,\n            starMap = (map && map['*']) || {};\n\n        //Adjust any relative paths.\n        if (name) {\n            name = name.split('/');\n            lastIndex = name.length - 1;\n\n            // If wanting node ID compatibility, strip .js from end\n            // of IDs. Have to do this here, and not in nameToUrl\n            // because node allows either .js or non .js to map\n            // to same file.\n            if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\n                name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\n            }\n\n            // Starts with a '.' so need the baseName\n            if (name[0].charAt(0) === '.' && baseParts) {\n                //Convert baseName to array, and lop off the last part,\n                //so that . matches that 'directory' and not name of the baseName's\n                //module. For instance, baseName of 'one/two/three', maps to\n                //'one/two/three.js', but we want the directory, 'one/two' for\n                //this normalization.\n                normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\n                name = normalizedBaseParts.concat(name);\n            }\n\n            //start trimDots\n            for (i = 0; i < name.length; i++) {\n                part = name[i];\n                if (part === '.') {\n                    name.splice(i, 1);\n                    i -= 1;\n                } else if (part === '..') {\n                    // If at the start, or previous value is still ..,\n                    // keep them so that when converted to a path it may\n                    // still work when converted to a path, even though\n                    // as an ID it is less than ideal. In larger point\n                    // releases, may be better to just kick out an error.\n                    if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {\n                        continue;\n                    } else if (i > 0) {\n                        name.splice(i - 1, 2);\n                        i -= 2;\n                    }\n                }\n            }\n            //end trimDots\n\n            name = name.join('/');\n        }\n\n        //Apply map config if available.\n        if ((baseParts || starMap) && map) {\n            nameParts = name.split('/');\n\n            for (i = nameParts.length; i > 0; i -= 1) {\n                nameSegment = nameParts.slice(0, i).join(\"/\");\n\n                if (baseParts) {\n                    //Find the longest baseName segment match in the config.\n                    //So, do joins on the biggest to smallest lengths of baseParts.\n                    for (j = baseParts.length; j > 0; j -= 1) {\n                        mapValue = map[baseParts.slice(0, j).join('/')];\n\n                        //baseName segment has  config, find if it has one for\n                        //this name.\n                        if (mapValue) {\n                            mapValue = mapValue[nameSegment];\n                            if (mapValue) {\n                                //Match, update name to the new value.\n                                foundMap = mapValue;\n                                foundI = i;\n                                break;\n                            }\n                        }\n                    }\n                }\n\n                if (foundMap) {\n                    break;\n                }\n\n                //Check for a star map match, but just hold on to it,\n                //if there is a shorter segment match later in a matching\n                //config, then favor over this star map.\n                if (!foundStarMap && starMap && starMap[nameSegment]) {\n                    foundStarMap = starMap[nameSegment];\n                    starI = i;\n                }\n            }\n\n            if (!foundMap && foundStarMap) {\n                foundMap = foundStarMap;\n                foundI = starI;\n            }\n\n            if (foundMap) {\n                nameParts.splice(0, foundI, foundMap);\n                name = nameParts.join('/');\n            }\n        }\n\n        return name;\n    }\n\n    function makeRequire(relName, forceSync) {\n        return function () {\n            //A version of a require function that passes a moduleName\n            //value for items that may need to\n            //look up paths relative to the moduleName\n            var args = aps.call(arguments, 0);\n\n            //If first arg is not require('string'), and there is only\n            //one arg, it is the array form without a callback. Insert\n            //a null so that the following concat is correct.\n            if (typeof args[0] !== 'string' && args.length === 1) {\n                args.push(null);\n            }\n            return req.apply(undef, args.concat([relName, forceSync]));\n        };\n    }\n\n    function makeNormalize(relName) {\n        return function (name) {\n            return normalize(name, relName);\n        };\n    }\n\n    function makeLoad(depName) {\n        return function (value) {\n            defined[depName] = value;\n        };\n    }\n\n    function callDep(name) {\n        if (hasProp(waiting, name)) {\n            var args = waiting[name];\n            delete waiting[name];\n            defining[name] = true;\n            main.apply(undef, args);\n        }\n\n        if (!hasProp(defined, name) && !hasProp(defining, name)) {\n            throw new Error('No ' + name);\n        }\n        return defined[name];\n    }\n\n    //Turns a plugin!resource to [plugin, resource]\n    //with the plugin being undefined if the name\n    //did not have a plugin prefix.\n    function splitPrefix(name) {\n        var prefix,\n            index = name ? name.indexOf('!') : -1;\n        if (index > -1) {\n            prefix = name.substring(0, index);\n            name = name.substring(index + 1, name.length);\n        }\n        return [prefix, name];\n    }\n\n    //Creates a parts array for a relName where first part is plugin ID,\n    //second part is resource ID. Assumes relName has already been normalized.\n    function makeRelParts(relName) {\n        return relName ? splitPrefix(relName) : [];\n    }\n\n    /**\n     * Makes a name map, normalizing the name, and using a plugin\n     * for normalization if necessary. Grabs a ref to plugin\n     * too, as an optimization.\n     */\n    makeMap = function (name, relParts) {\n        var plugin,\n            parts = splitPrefix(name),\n            prefix = parts[0],\n            relResourceName = relParts[1];\n\n        name = parts[1];\n\n        if (prefix) {\n            prefix = normalize(prefix, relResourceName);\n            plugin = callDep(prefix);\n        }\n\n        //Normalize according\n        if (prefix) {\n            if (plugin && plugin.normalize) {\n                name = plugin.normalize(name, makeNormalize(relResourceName));\n            } else {\n                name = normalize(name, relResourceName);\n            }\n        } else {\n            name = normalize(name, relResourceName);\n            parts = splitPrefix(name);\n            prefix = parts[0];\n            name = parts[1];\n            if (prefix) {\n                plugin = callDep(prefix);\n            }\n        }\n\n        //Using ridiculous property names for space reasons\n        return {\n            f: prefix ? prefix + '!' + name : name, //fullName\n            n: name,\n            pr: prefix,\n            p: plugin\n        };\n    };\n\n    function makeConfig(name) {\n        return function () {\n            return (config && config.config && config.config[name]) || {};\n        };\n    }\n\n    handlers = {\n        require: function (name) {\n            return makeRequire(name);\n        },\n        exports: function (name) {\n            var e = defined[name];\n            if (typeof e !== 'undefined') {\n                return e;\n            } else {\n                return (defined[name] = {});\n            }\n        },\n        module: function (name) {\n            return {\n                id: name,\n                uri: '',\n                exports: defined[name],\n                config: makeConfig(name)\n            };\n        }\n    };\n\n    main = function (name, deps, callback, relName) {\n        var cjsModule, depName, ret, map, i, relParts,\n            args = [],\n            callbackType = typeof callback,\n            usingExports;\n\n        //Use name if no relName\n        relName = relName || name;\n        relParts = makeRelParts(relName);\n\n        //Call the callback to define the module, if necessary.\n        if (callbackType === 'undefined' || callbackType === 'function') {\n            //Pull out the defined dependencies and pass the ordered\n            //values to the callback.\n            //Default to [require, exports, module] if no deps\n            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\n            for (i = 0; i < deps.length; i += 1) {\n                map = makeMap(deps[i], relParts);\n                depName = map.f;\n\n                //Fast path CommonJS standard dependencies.\n                if (depName === \"require\") {\n                    args[i] = handlers.require(name);\n                } else if (depName === \"exports\") {\n                    //CommonJS module spec 1.1\n                    args[i] = handlers.exports(name);\n                    usingExports = true;\n                } else if (depName === \"module\") {\n                    //CommonJS module spec 1.1\n                    cjsModule = args[i] = handlers.module(name);\n                } else if (hasProp(defined, depName) ||\n                           hasProp(waiting, depName) ||\n                           hasProp(defining, depName)) {\n                    args[i] = callDep(depName);\n                } else if (map.p) {\n                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\n                    args[i] = defined[depName];\n                } else {\n                    throw new Error(name + ' missing ' + depName);\n                }\n            }\n\n            ret = callback ? callback.apply(defined[name], args) : undefined;\n\n            if (name) {\n                //If setting exports via \"module\" is in play,\n                //favor that over return value and exports. After that,\n                //favor a non-undefined return value over exports use.\n                if (cjsModule && cjsModule.exports !== undef &&\n                        cjsModule.exports !== defined[name]) {\n                    defined[name] = cjsModule.exports;\n                } else if (ret !== undef || !usingExports) {\n                    //Use the return value from the function.\n                    defined[name] = ret;\n                }\n            }\n        } else if (name) {\n            //May just be an object definition for the module. Only\n            //worry about defining if have a module name.\n            defined[name] = callback;\n        }\n    };\n\n    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\n        if (typeof deps === \"string\") {\n            if (handlers[deps]) {\n                //callback in this case is really relName\n                return handlers[deps](callback);\n            }\n            //Just return the module wanted. In this scenario, the\n            //deps arg is the module name, and second arg (if passed)\n            //is just the relName.\n            //Normalize module name, if it contains . or ..\n            return callDep(makeMap(deps, makeRelParts(callback)).f);\n        } else if (!deps.splice) {\n            //deps is a config object, not an array.\n            config = deps;\n            if (config.deps) {\n                req(config.deps, config.callback);\n            }\n            if (!callback) {\n                return;\n            }\n\n            if (callback.splice) {\n                //callback is an array, which means it is a dependency list.\n                //Adjust args if there are dependencies\n                deps = callback;\n                callback = relName;\n                relName = null;\n            } else {\n                deps = undef;\n            }\n        }\n\n        //Support require(['a'])\n        callback = callback || function () {};\n\n        //If relName is a function, it is an errback handler,\n        //so remove it.\n        if (typeof relName === 'function') {\n            relName = forceSync;\n            forceSync = alt;\n        }\n\n        //Simulate async callback;\n        if (forceSync) {\n            main(undef, deps, callback, relName);\n        } else {\n            //Using a non-zero value because of concern for what old browsers\n            //do, and latest browsers \"upgrade\" to 4 if lower value is used:\n            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\n            //If want a value immediately, use require('id') instead -- something\n            //that works in almond on the global level, but not guaranteed and\n            //unlikely to work in other AMD implementations.\n            setTimeout(function () {\n                main(undef, deps, callback, relName);\n            }, 4);\n        }\n\n        return req;\n    };\n\n    /**\n     * Just drops the config on the floor, but returns req in case\n     * the config return value is used.\n     */\n    req.config = function (cfg) {\n        return req(cfg);\n    };\n\n    /**\n     * Expose module registry for debugging and tooling\n     */\n    requirejs._defined = defined;\n\n    define = function (name, deps, callback) {\n        if (typeof name !== 'string') {\n            throw new Error('See almond README: incorrect module build, no module name');\n        }\n\n        //This module may not have dependencies\n        if (!deps.splice) {\n            //deps is not an array, so probably means\n            //an object literal or factory function for\n            //the value. Adjust args.\n            callback = deps;\n            deps = [];\n        }\n\n        if (!hasProp(defined, name) && !hasProp(waiting, name)) {\n            waiting[name] = [name, deps, callback];\n        }\n    };\n\n    define.amd = {\n        jQuery: true\n    };\n}());\n\nS2.requirejs = requirejs;S2.require = require;S2.define = define;\n}\n}());\nS2.define(\"almond\", function(){});\n\n/* global jQuery:false, $:false */\nS2.define('jquery',[],function () {\n  var _$ = jQuery || $;\n\n  if (_$ == null && console && console.error) {\n    console.error(\n      'Select2: An instance of jQuery or a jQuery-compatible library was not ' +\n      'found. Make sure that you are including jQuery before Select2 on your ' +\n      'web page.'\n    );\n  }\n\n  return _$;\n});\n\nS2.define('select2/utils',[\n  'jquery'\n], function ($) {\n  var Utils = {};\n\n  Utils.Extend = function (ChildClass, SuperClass) {\n    var __hasProp = {}.hasOwnProperty;\n\n    function BaseConstructor () {\n      this.constructor = ChildClass;\n    }\n\n    for (var key in SuperClass) {\n      if (__hasProp.call(SuperClass, key)) {\n        ChildClass[key] = SuperClass[key];\n      }\n    }\n\n    BaseConstructor.prototype = SuperClass.prototype;\n    ChildClass.prototype = new BaseConstructor();\n    ChildClass.__super__ = SuperClass.prototype;\n\n    return ChildClass;\n  };\n\n  function getMethods (theClass) {\n    var proto = theClass.prototype;\n\n    var methods = [];\n\n    for (var methodName in proto) {\n      var m = proto[methodName];\n\n      if (typeof m !== 'function') {\n        continue;\n      }\n\n      if (methodName === 'constructor') {\n        continue;\n      }\n\n      methods.push(methodName);\n    }\n\n    return methods;\n  }\n\n  Utils.Decorate = function (SuperClass, DecoratorClass) {\n    var decoratedMethods = getMethods(DecoratorClass);\n    var superMethods = getMethods(SuperClass);\n\n    function DecoratedClass () {\n      var unshift = Array.prototype.unshift;\n\n      var argCount = DecoratorClass.prototype.constructor.length;\n\n      var calledConstructor = SuperClass.prototype.constructor;\n\n      if (argCount > 0) {\n        unshift.call(arguments, SuperClass.prototype.constructor);\n\n        calledConstructor = DecoratorClass.prototype.constructor;\n      }\n\n      calledConstructor.apply(this, arguments);\n    }\n\n    DecoratorClass.displayName = SuperClass.displayName;\n\n    function ctr () {\n      this.constructor = DecoratedClass;\n    }\n\n    DecoratedClass.prototype = new ctr();\n\n    for (var m = 0; m < superMethods.length; m++) {\n      var superMethod = superMethods[m];\n\n      DecoratedClass.prototype[superMethod] =\n        SuperClass.prototype[superMethod];\n    }\n\n    var calledMethod = function (methodName) {\n      // Stub out the original method if it's not decorating an actual method\n      var originalMethod = function () {};\n\n      if (methodName in DecoratedClass.prototype) {\n        originalMethod = DecoratedClass.prototype[methodName];\n      }\n\n      var decoratedMethod = DecoratorClass.prototype[methodName];\n\n      return function () {\n        var unshift = Array.prototype.unshift;\n\n        unshift.call(arguments, originalMethod);\n\n        return decoratedMethod.apply(this, arguments);\n      };\n    };\n\n    for (var d = 0; d < decoratedMethods.length; d++) {\n      var decoratedMethod = decoratedMethods[d];\n\n      DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod);\n    }\n\n    return DecoratedClass;\n  };\n\n  var Observable = function () {\n    this.listeners = {};\n  };\n\n  Observable.prototype.on = function (event, callback) {\n    this.listeners = this.listeners || {};\n\n    if (event in this.listeners) {\n      this.listeners[event].push(callback);\n    } else {\n      this.listeners[event] = [callback];\n    }\n  };\n\n  Observable.prototype.trigger = function (event) {\n    var slice = Array.prototype.slice;\n    var params = slice.call(arguments, 1);\n\n    this.listeners = this.listeners || {};\n\n    // Params should always come in as an array\n    if (params == null) {\n      params = [];\n    }\n\n    // If there are no arguments to the event, use a temporary object\n    if (params.length === 0) {\n      params.push({});\n    }\n\n    // Set the `_type` of the first object to the event\n    params[0]._type = event;\n\n    if (event in this.listeners) {\n      this.invoke(this.listeners[event], slice.call(arguments, 1));\n    }\n\n    if ('*' in this.listeners) {\n      this.invoke(this.listeners['*'], arguments);\n    }\n  };\n\n  Observable.prototype.invoke = function (listeners, params) {\n    for (var i = 0, len = listeners.length; i < len; i++) {\n      listeners[i].apply(this, params);\n    }\n  };\n\n  Utils.Observable = Observable;\n\n  Utils.generateChars = function (length) {\n    var chars = '';\n\n    for (var i = 0; i < length; i++) {\n      var randomChar = Math.floor(Math.random() * 36);\n      chars += randomChar.toString(36);\n    }\n\n    return chars;\n  };\n\n  Utils.bind = function (func, context) {\n    return function () {\n      func.apply(context, arguments);\n    };\n  };\n\n  Utils._convertData = function (data) {\n    for (var originalKey in data) {\n      var keys = originalKey.split('-');\n\n      var dataLevel = data;\n\n      if (keys.length === 1) {\n        continue;\n      }\n\n      for (var k = 0; k < keys.length; k++) {\n        var key = keys[k];\n\n        // Lowercase the first letter\n        // By default, dash-separated becomes camelCase\n        key = key.substring(0, 1).toLowerCase() + key.substring(1);\n\n        if (!(key in dataLevel)) {\n          dataLevel[key] = {};\n        }\n\n        if (k == keys.length - 1) {\n          dataLevel[key] = data[originalKey];\n        }\n\n        dataLevel = dataLevel[key];\n      }\n\n      delete data[originalKey];\n    }\n\n    return data;\n  };\n\n  Utils.hasScroll = function (index, el) {\n    // Adapted from the function created by @ShadowScripter\n    // and adapted by @BillBarry on the Stack Exchange Code Review website.\n    // The original code can be found at\n    // http://codereview.stackexchange.com/q/13338\n    // and was designed to be used with the Sizzle selector engine.\n\n    var $el = $(el);\n    var overflowX = el.style.overflowX;\n    var overflowY = el.style.overflowY;\n\n    //Check both x and y declarations\n    if (overflowX === overflowY &&\n        (overflowY === 'hidden' || overflowY === 'visible')) {\n      return false;\n    }\n\n    if (overflowX === 'scroll' || overflowY === 'scroll') {\n      return true;\n    }\n\n    return ($el.innerHeight() < el.scrollHeight ||\n      $el.innerWidth() < el.scrollWidth);\n  };\n\n  Utils.escapeMarkup = function (markup) {\n    var replaceMap = {\n      '\\\\': '&#92;',\n      '&': '&amp;',\n      '<': '&lt;',\n      '>': '&gt;',\n      '\"': '&quot;',\n      '\\'': '&#39;',\n      '/': '&#47;'\n    };\n\n    // Do not try to escape the markup if it's not a string\n    if (typeof markup !== 'string') {\n      return markup;\n    }\n\n    return String(markup).replace(/[&<>\"'\\/\\\\]/g, function (match) {\n      return replaceMap[match];\n    });\n  };\n\n  // Cache objects in Utils.__cache instead of $.data (see #4346)\n  Utils.__cache = {};\n\n  var id = 0;\n  Utils.GetUniqueElementId = function (element) {\n    // Get a unique element Id. If element has no id,\n    // creates a new unique number, stores it in the id\n    // attribute and returns the new id with a prefix.\n    // If an id already exists, it simply returns it with a prefix.\n\n    var select2Id = element.getAttribute('data-select2-id');\n\n    if (select2Id != null) {\n      return select2Id;\n    }\n\n    // If element has id, use it.\n    if (element.id) {\n      select2Id = 'select2-data-' + element.id;\n    } else {\n      select2Id = 'select2-data-' + (++id).toString() +\n        '-' + Utils.generateChars(4);\n    }\n\n    element.setAttribute('data-select2-id', select2Id);\n\n    return select2Id;\n  };\n\n  Utils.StoreData = function (element, name, value) {\n    // Stores an item in the cache for a specified element.\n    // name is the cache key.\n    var id = Utils.GetUniqueElementId(element);\n    if (!Utils.__cache[id]) {\n      Utils.__cache[id] = {};\n    }\n\n    Utils.__cache[id][name] = value;\n  };\n\n  Utils.GetData = function (element, name) {\n    // Retrieves a value from the cache by its key (name)\n    // name is optional. If no name specified, return\n    // all cache items for the specified element.\n    // and for a specified element.\n    var id = Utils.GetUniqueElementId(element);\n    if (name) {\n      if (Utils.__cache[id]) {\n        if (Utils.__cache[id][name] != null) {\n          return Utils.__cache[id][name];\n        }\n        return $(element).data(name); // Fallback to HTML5 data attribs.\n      }\n      return $(element).data(name); // Fallback to HTML5 data attribs.\n    } else {\n      return Utils.__cache[id];\n    }\n  };\n\n  Utils.RemoveData = function (element) {\n    // Removes all cached items for a specified element.\n    var id = Utils.GetUniqueElementId(element);\n    if (Utils.__cache[id] != null) {\n      delete Utils.__cache[id];\n    }\n\n    element.removeAttribute('data-select2-id');\n  };\n\n  Utils.copyNonInternalCssClasses = function (dest, src) {\n    var classes;\n\n    var destinationClasses = dest.getAttribute('class').trim().split(/\\s+/);\n\n    destinationClasses = destinationClasses.filter(function (clazz) {\n      // Save all Select2 classes\n      return clazz.indexOf('select2-') === 0;\n    });\n\n    var sourceClasses = src.getAttribute('class').trim().split(/\\s+/);\n\n    sourceClasses = sourceClasses.filter(function (clazz) {\n      // Only copy non-Select2 classes\n      return clazz.indexOf('select2-') !== 0;\n    });\n\n    var replacements = destinationClasses.concat(sourceClasses);\n\n    dest.setAttribute('class', replacements.join(' '));\n  };\n\n  return Utils;\n});\n\nS2.define('select2/results',[\n  'jquery',\n  './utils'\n], function ($, Utils) {\n  function Results ($element, options, dataAdapter) {\n    this.$element = $element;\n    this.data = dataAdapter;\n    this.options = options;\n\n    Results.__super__.constructor.call(this);\n  }\n\n  Utils.Extend(Results, Utils.Observable);\n\n  Results.prototype.render = function () {\n    var $results = $(\n      '<ul class=\"select2-results__options\" role=\"listbox\"></ul>'\n    );\n\n    if (this.options.get('multiple')) {\n      $results.attr('aria-multiselectable', 'true');\n    }\n\n    this.$results = $results;\n\n    return $results;\n  };\n\n  Results.prototype.clear = function () {\n    this.$results.empty();\n  };\n\n  Results.prototype.displayMessage = function (params) {\n    var escapeMarkup = this.options.get('escapeMarkup');\n\n    this.clear();\n    this.hideLoading();\n\n    var $message = $(\n      '<li role=\"alert\" aria-live=\"assertive\"' +\n      ' class=\"select2-results__option\"></li>'\n    );\n\n    var message = this.options.get('translations').get(params.message);\n\n    $message.append(\n      escapeMarkup(\n        message(params.args)\n      )\n    );\n\n    $message[0].className += ' select2-results__message';\n\n    this.$results.append($message);\n  };\n\n  Results.prototype.hideMessages = function () {\n    this.$results.find('.select2-results__message').remove();\n  };\n\n  Results.prototype.append = function (data) {\n    this.hideLoading();\n\n    var $options = [];\n\n    if (data.results == null || data.results.length === 0) {\n      if (this.$results.children().length === 0) {\n        this.trigger('results:message', {\n          message: 'noResults'\n        });\n      }\n\n      return;\n    }\n\n    data.results = this.sort(data.results);\n\n    for (var d = 0; d < data.results.length; d++) {\n      var item = data.results[d];\n\n      var $option = this.option(item);\n\n      $options.push($option);\n    }\n\n    this.$results.append($options);\n  };\n\n  Results.prototype.position = function ($results, $dropdown) {\n    var $resultsContainer = $dropdown.find('.select2-results');\n    $resultsContainer.append($results);\n  };\n\n  Results.prototype.sort = function (data) {\n    var sorter = this.options.get('sorter');\n\n    return sorter(data);\n  };\n\n  Results.prototype.highlightFirstItem = function () {\n    var $options = this.$results\n      .find('.select2-results__option--selectable');\n\n    var $selected = $options.filter('.select2-results__option--selected');\n\n    // Check if there are any selected options\n    if ($selected.length > 0) {\n      // If there are selected options, highlight the first\n      $selected.first().trigger('mouseenter');\n    } else {\n      // If there are no selected options, highlight the first option\n      // in the dropdown\n      $options.first().trigger('mouseenter');\n    }\n\n    this.ensureHighlightVisible();\n  };\n\n  Results.prototype.setClasses = function () {\n    var self = this;\n\n    this.data.current(function (selected) {\n      var selectedIds = selected.map(function (s) {\n        return s.id.toString();\n      });\n\n      var $options = self.$results\n        .find('.select2-results__option--selectable');\n\n      $options.each(function () {\n        var $option = $(this);\n\n        var item = Utils.GetData(this, 'data');\n\n        // id needs to be converted to a string when comparing\n        var id = '' + item.id;\n\n        if ((item.element != null && item.element.selected) ||\n            (item.element == null && selectedIds.indexOf(id) > -1)) {\n          this.classList.add('select2-results__option--selected');\n          $option.attr('aria-selected', 'true');\n        } else {\n          this.classList.remove('select2-results__option--selected');\n          $option.attr('aria-selected', 'false');\n        }\n      });\n\n    });\n  };\n\n  Results.prototype.showLoading = function (params) {\n    this.hideLoading();\n\n    var loadingMore = this.options.get('translations').get('searching');\n\n    var loading = {\n      disabled: true,\n      loading: true,\n      text: loadingMore(params)\n    };\n    var $loading = this.option(loading);\n    $loading.className += ' loading-results';\n\n    this.$results.prepend($loading);\n  };\n\n  Results.prototype.hideLoading = function () {\n    this.$results.find('.loading-results').remove();\n  };\n\n  Results.prototype.option = function (data) {\n    var option = document.createElement('li');\n    option.classList.add('select2-results__option');\n    option.classList.add('select2-results__option--selectable');\n\n    var attrs = {\n      'role': 'option'\n    };\n\n    var matches = window.Element.prototype.matches ||\n      window.Element.prototype.msMatchesSelector ||\n      window.Element.prototype.webkitMatchesSelector;\n\n    if ((data.element != null && matches.call(data.element, ':disabled')) ||\n        (data.element == null && data.disabled)) {\n      attrs['aria-disabled'] = 'true';\n\n      option.classList.remove('select2-results__option--selectable');\n      option.classList.add('select2-results__option--disabled');\n    }\n\n    if (data.id == null) {\n      option.classList.remove('select2-results__option--selectable');\n    }\n\n    if (data._resultId != null) {\n      option.id = data._resultId;\n    }\n\n    if (data.title) {\n      option.title = data.title;\n    }\n\n    if (data.children) {\n      attrs.role = 'group';\n      attrs['aria-label'] = data.text;\n\n      option.classList.remove('select2-results__option--selectable');\n      option.classList.add('select2-results__option--group');\n    }\n\n    for (var attr in attrs) {\n      var val = attrs[attr];\n\n      option.setAttribute(attr, val);\n    }\n\n    if (data.children) {\n      var $option = $(option);\n\n      var label = document.createElement('strong');\n      label.className = 'select2-results__group';\n\n      this.template(data, label);\n\n      var $children = [];\n\n      for (var c = 0; c < data.children.length; c++) {\n        var child = data.children[c];\n\n        var $child = this.option(child);\n\n        $children.push($child);\n      }\n\n      var $childrenContainer = $('<ul></ul>', {\n        'class': 'select2-results__options select2-results__options--nested',\n        'role': 'none'\n      });\n\n      $childrenContainer.append($children);\n\n      $option.append(label);\n      $option.append($childrenContainer);\n    } else {\n      this.template(data, option);\n    }\n\n    Utils.StoreData(option, 'data', data);\n\n    return option;\n  };\n\n  Results.prototype.bind = function (container, $container) {\n    var self = this;\n\n    var id = container.id + '-results';\n\n    this.$results.attr('id', id);\n\n    container.on('results:all', function (params) {\n      self.clear();\n      self.append(params.data);\n\n      if (container.isOpen()) {\n        self.setClasses();\n        self.highlightFirstItem();\n      }\n    });\n\n    container.on('results:append', function (params) {\n      self.append(params.data);\n\n      if (container.isOpen()) {\n        self.setClasses();\n      }\n    });\n\n    container.on('query', function (params) {\n      self.hideMessages();\n      self.showLoading(params);\n    });\n\n    container.on('select', function () {\n      if (!container.isOpen()) {\n        return;\n      }\n\n      self.setClasses();\n\n      if (self.options.get('scrollAfterSelect')) {\n        self.highlightFirstItem();\n      }\n    });\n\n    container.on('unselect', function () {\n      if (!container.isOpen()) {\n        return;\n      }\n\n      self.setClasses();\n\n      if (self.options.get('scrollAfterSelect')) {\n        self.highlightFirstItem();\n      }\n    });\n\n    container.on('open', function () {\n      // When the dropdown is open, aria-expended=\"true\"\n      self.$results.attr('aria-expanded', 'true');\n      self.$results.attr('aria-hidden', 'false');\n\n      self.setClasses();\n      self.ensureHighlightVisible();\n    });\n\n    container.on('close', function () {\n      // When the dropdown is closed, aria-expended=\"false\"\n      self.$results.attr('aria-expanded', 'false');\n      self.$results.attr('aria-hidden', 'true');\n      self.$results.removeAttr('aria-activedescendant');\n    });\n\n    container.on('results:toggle', function () {\n      var $highlighted = self.getHighlightedResults();\n\n      if ($highlighted.length === 0) {\n        return;\n      }\n\n      $highlighted.trigger('mouseup');\n    });\n\n    container.on('results:select', function () {\n      var $highlighted = self.getHighlightedResults();\n\n      if ($highlighted.length === 0) {\n        return;\n      }\n\n      var data = Utils.GetData($highlighted[0], 'data');\n\n      if ($highlighted.hasClass('select2-results__option--selected')) {\n        self.trigger('close', {});\n      } else {\n        self.trigger('select', {\n          data: data\n        });\n      }\n    });\n\n    container.on('results:previous', function () {\n      var $highlighted = self.getHighlightedResults();\n\n      var $options = self.$results.find('.select2-results__option--selectable');\n\n      var currentIndex = $options.index($highlighted);\n\n      // If we are already at the top, don't move further\n      // If no options, currentIndex will be -1\n      if (currentIndex <= 0) {\n        return;\n      }\n\n      var nextIndex = currentIndex - 1;\n\n      // If none are highlighted, highlight the first\n      if ($highlighted.length === 0) {\n        nextIndex = 0;\n      }\n\n      var $next = $options.eq(nextIndex);\n\n      $next.trigger('mouseenter');\n\n      var currentOffset = self.$results.offset().top;\n      var nextTop = $next.offset().top;\n      var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset);\n\n      if (nextIndex === 0) {\n        self.$results.scrollTop(0);\n      } else if (nextTop - currentOffset < 0) {\n        self.$results.scrollTop(nextOffset);\n      }\n    });\n\n    container.on('results:next', function () {\n      var $highlighted = self.getHighlightedResults();\n\n      var $options = self.$results.find('.select2-results__option--selectable');\n\n      var currentIndex = $options.index($highlighted);\n\n      var nextIndex = currentIndex + 1;\n\n      // If we are at the last option, stay there\n      if (nextIndex >= $options.length) {\n        return;\n      }\n\n      var $next = $options.eq(nextIndex);\n\n      $next.trigger('mouseenter');\n\n      var currentOffset = self.$results.offset().top +\n        self.$results.outerHeight(false);\n      var nextBottom = $next.offset().top + $next.outerHeight(false);\n      var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset;\n\n      if (nextIndex === 0) {\n        self.$results.scrollTop(0);\n      } else if (nextBottom > currentOffset) {\n        self.$results.scrollTop(nextOffset);\n      }\n    });\n\n    container.on('results:focus', function (params) {\n      params.element[0].classList.add('select2-results__option--highlighted');\n      params.element[0].setAttribute('aria-selected', 'true');\n    });\n\n    container.on('results:message', function (params) {\n      self.displayMessage(params);\n    });\n\n    if ($.fn.mousewheel) {\n      this.$results.on('mousewheel', function (e) {\n        var top = self.$results.scrollTop();\n\n        var bottom = self.$results.get(0).scrollHeight - top + e.deltaY;\n\n        var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0;\n        var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height();\n\n        if (isAtTop) {\n          self.$results.scrollTop(0);\n\n          e.preventDefault();\n          e.stopPropagation();\n        } else if (isAtBottom) {\n          self.$results.scrollTop(\n            self.$results.get(0).scrollHeight - self.$results.height()\n          );\n\n          e.preventDefault();\n          e.stopPropagation();\n        }\n      });\n    }\n\n    this.$results.on('mouseup', '.select2-results__option--selectable',\n      function (evt) {\n      var $this = $(this);\n\n      var data = Utils.GetData(this, 'data');\n\n      if ($this.hasClass('select2-results__option--selected')) {\n        if (self.options.get('multiple')) {\n          self.trigger('unselect', {\n            originalEvent: evt,\n            data: data\n          });\n        } else {\n          self.trigger('close', {});\n        }\n\n        return;\n      }\n\n      self.trigger('select', {\n        originalEvent: evt,\n        data: data\n      });\n    });\n\n    this.$results.on('mouseenter', '.select2-results__option--selectable',\n      function (evt) {\n      var data = Utils.GetData(this, 'data');\n\n      self.getHighlightedResults()\n          .removeClass('select2-results__option--highlighted')\n          .attr('aria-selected', 'false');\n\n      self.trigger('results:focus', {\n        data: data,\n        element: $(this)\n      });\n    });\n  };\n\n  Results.prototype.getHighlightedResults = function () {\n    var $highlighted = this.$results\n    .find('.select2-results__option--highlighted');\n\n    return $highlighted;\n  };\n\n  Results.prototype.destroy = function () {\n    this.$results.remove();\n  };\n\n  Results.prototype.ensureHighlightVisible = function () {\n    var $highlighted = this.getHighlightedResults();\n\n    if ($highlighted.length === 0) {\n      return;\n    }\n\n    var $options = this.$results.find('.select2-results__option--selectable');\n\n    var currentIndex = $options.index($highlighted);\n\n    var currentOffset = this.$results.offset().top;\n    var nextTop = $highlighted.offset().top;\n    var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset);\n\n    var offsetDelta = nextTop - currentOffset;\n    nextOffset -= $highlighted.outerHeight(false) * 2;\n\n    if (currentIndex <= 2) {\n      this.$results.scrollTop(0);\n    } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) {\n      this.$results.scrollTop(nextOffset);\n    }\n  };\n\n  Results.prototype.template = function (result, container) {\n    var template = this.options.get('templateResult');\n    var escapeMarkup = this.options.get('escapeMarkup');\n\n    var content = template(result, container);\n\n    if (content == null) {\n      container.style.display = 'none';\n    } else if (typeof content === 'string') {\n      container.innerHTML = escapeMarkup(content);\n    } else {\n      $(container).append(content);\n    }\n  };\n\n  return Results;\n});\n\nS2.define('select2/keys',[\n\n], function () {\n  var KEYS = {\n    BACKSPACE: 8,\n    TAB: 9,\n    ENTER: 13,\n    SHIFT: 16,\n    CTRL: 17,\n    ALT: 18,\n    ESC: 27,\n    SPACE: 32,\n    PAGE_UP: 33,\n    PAGE_DOWN: 34,\n    END: 35,\n    HOME: 36,\n    LEFT: 37,\n    UP: 38,\n    RIGHT: 39,\n    DOWN: 40,\n    DELETE: 46\n  };\n\n  return KEYS;\n});\n\nS2.define('select2/selection/base',[\n  'jquery',\n  '../utils',\n  '../keys'\n], function ($, Utils, KEYS) {\n  function BaseSelection ($element, options) {\n    this.$element = $element;\n    this.options = options;\n\n    BaseSelection.__super__.constructor.call(this);\n  }\n\n  Utils.Extend(BaseSelection, Utils.Observable);\n\n  BaseSelection.prototype.render = function () {\n    var $selection = $(\n      '<span class=\"select2-selection\" role=\"combobox\" ' +\n      ' aria-haspopup=\"true\" aria-expanded=\"false\">' +\n      '</span>'\n    );\n\n    this._tabindex = 0;\n\n    if (Utils.GetData(this.$element[0], 'old-tabindex') != null) {\n      this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex');\n    } else if (this.$element.attr('tabindex') != null) {\n      this._tabindex = this.$element.attr('tabindex');\n    }\n\n    $selection.attr('title', this.$element.attr('title'));\n    $selection.attr('tabindex', this._tabindex);\n    $selection.attr('aria-disabled', 'false');\n\n    this.$selection = $selection;\n\n    return $selection;\n  };\n\n  BaseSelection.prototype.bind = function (container, $container) {\n    var self = this;\n\n    var resultsId = container.id + '-results';\n\n    this.container = container;\n\n    this.$selection.on('focus', function (evt) {\n      self.trigger('focus', evt);\n    });\n\n    this.$selection.on('blur', function (evt) {\n      self._handleBlur(evt);\n    });\n\n    this.$selection.on('keydown', function (evt) {\n      self.trigger('keypress', evt);\n\n      if (evt.which === KEYS.SPACE) {\n        evt.preventDefault();\n      }\n    });\n\n    container.on('results:focus', function (params) {\n      self.$selection.attr('aria-activedescendant', params.data._resultId);\n    });\n\n    container.on('selection:update', function (params) {\n      self.update(params.data);\n    });\n\n    container.on('open', function () {\n      // When the dropdown is open, aria-expanded=\"true\"\n      self.$selection.attr('aria-expanded', 'true');\n      self.$selection.attr('aria-owns', resultsId);\n\n      self._attachCloseHandler(container);\n    });\n\n    container.on('close', function () {\n      // When the dropdown is closed, aria-expanded=\"false\"\n      self.$selection.attr('aria-expanded', 'false');\n      self.$selection.removeAttr('aria-activedescendant');\n      self.$selection.removeAttr('aria-owns');\n\n      self.$selection.trigger('focus');\n\n      self._detachCloseHandler(container);\n    });\n\n    container.on('enable', function () {\n      self.$selection.attr('tabindex', self._tabindex);\n      self.$selection.attr('aria-disabled', 'false');\n    });\n\n    container.on('disable', function () {\n      self.$selection.attr('tabindex', '-1');\n      self.$selection.attr('aria-disabled', 'true');\n    });\n  };\n\n  BaseSelection.prototype._handleBlur = function (evt) {\n    var self = this;\n\n    // This needs to be delayed as the active element is the body when the tab\n    // key is pressed, possibly along with others.\n    window.setTimeout(function () {\n      // Don't trigger `blur` if the focus is still in the selection\n      if (\n        (document.activeElement == self.$selection[0]) ||\n        ($.contains(self.$selection[0], document.activeElement))\n      ) {\n        return;\n      }\n\n      self.trigger('blur', evt);\n    }, 1);\n  };\n\n  BaseSelection.prototype._attachCloseHandler = function (container) {\n\n    $(document.body).on('mousedown.select2.' + container.id, function (e) {\n      var $target = $(e.target);\n\n      var $select = $target.closest('.select2');\n\n      var $all = $('.select2.select2-container--open');\n\n      $all.each(function () {\n        if (this == $select[0]) {\n          return;\n        }\n\n        var $element = Utils.GetData(this, 'element');\n\n        $element.select2('close');\n      });\n    });\n  };\n\n  BaseSelection.prototype._detachCloseHandler = function (container) {\n    $(document.body).off('mousedown.select2.' + container.id);\n  };\n\n  BaseSelection.prototype.position = function ($selection, $container) {\n    var $selectionContainer = $container.find('.selection');\n    $selectionContainer.append($selection);\n  };\n\n  BaseSelection.prototype.destroy = function () {\n    this._detachCloseHandler(this.container);\n  };\n\n  BaseSelection.prototype.update = function (data) {\n    throw new Error('The `update` method must be defined in child classes.');\n  };\n\n  /**\n   * Helper method to abstract the \"enabled\" (not \"disabled\") state of this\n   * object.\n   *\n   * @return {true} if the instance is not disabled.\n   * @return {false} if the instance is disabled.\n   */\n  BaseSelection.prototype.isEnabled = function () {\n    return !this.isDisabled();\n  };\n\n  /**\n   * Helper method to abstract the \"disabled\" state of this object.\n   *\n   * @return {true} if the disabled option is true.\n   * @return {false} if the disabled option is false.\n   */\n  BaseSelection.prototype.isDisabled = function () {\n    return this.options.get('disabled');\n  };\n\n  return BaseSelection;\n});\n\nS2.define('select2/selection/single',[\n  'jquery',\n  './base',\n  '../utils',\n  '../keys'\n], function ($, BaseSelection, Utils, KEYS) {\n  function SingleSelection () {\n    SingleSelection.__super__.constructor.apply(this, arguments);\n  }\n\n  Utils.Extend(SingleSelection, BaseSelection);\n\n  SingleSelection.prototype.render = function () {\n    var $selection = SingleSelection.__super__.render.call(this);\n\n    $selection[0].classList.add('select2-selection--single');\n\n    $selection.html(\n      '<span class=\"select2-selection__rendered\"></span>' +\n      '<span class=\"select2-selection__arrow\" role=\"presentation\">' +\n        '<b role=\"presentation\"></b>' +\n      '</span>'\n    );\n\n    return $selection;\n  };\n\n  SingleSelection.prototype.bind = function (container, $container) {\n    var self = this;\n\n    SingleSelection.__super__.bind.apply(this, arguments);\n\n    var id = container.id + '-container';\n\n    this.$selection.find('.select2-selection__rendered')\n      .attr('id', id)\n      .attr('role', 'textbox')\n      .attr('aria-readonly', 'true');\n    this.$selection.attr('aria-labelledby', id);\n    this.$selection.attr('aria-controls', id);\n\n    this.$selection.on('mousedown', function (evt) {\n      // Only respond to left clicks\n      if (evt.which !== 1) {\n        return;\n      }\n\n      self.trigger('toggle', {\n        originalEvent: evt\n      });\n    });\n\n    this.$selection.on('focus', function (evt) {\n      // User focuses on the container\n    });\n\n    this.$selection.on('blur', function (evt) {\n      // User exits the container\n    });\n\n    container.on('focus', function (evt) {\n      if (!container.isOpen()) {\n        self.$selection.trigger('focus');\n      }\n    });\n  };\n\n  SingleSelection.prototype.clear = function () {\n    var $rendered = this.$selection.find('.select2-selection__rendered');\n    $rendered.empty();\n    $rendered.removeAttr('title'); // clear tooltip on empty\n  };\n\n  SingleSelection.prototype.display = function (data, container) {\n    var template = this.options.get('templateSelection');\n    var escapeMarkup = this.options.get('escapeMarkup');\n\n    return escapeMarkup(template(data, container));\n  };\n\n  SingleSelection.prototype.selectionContainer = function () {\n    return $('<span></span>');\n  };\n\n  SingleSelection.prototype.update = function (data) {\n    if (data.length === 0) {\n      this.clear();\n      return;\n    }\n\n    var selection = data[0];\n\n    var $rendered = this.$selection.find('.select2-selection__rendered');\n    var formatted = this.display(selection, $rendered);\n\n    $rendered.empty().append(formatted);\n\n    var title = selection.title || selection.text;\n\n    if (title) {\n      $rendered.attr('title', title);\n    } else {\n      $rendered.removeAttr('title');\n    }\n  };\n\n  return SingleSelection;\n});\n\nS2.define('select2/selection/multiple',[\n  'jquery',\n  './base',\n  '../utils'\n], function ($, BaseSelection, Utils) {\n  function MultipleSelection ($element, options) {\n    MultipleSelection.__super__.constructor.apply(this, arguments);\n  }\n\n  Utils.Extend(MultipleSelection, BaseSelection);\n\n  MultipleSelection.prototype.render = function () {\n    var $selection = MultipleSelection.__super__.render.call(this);\n\n    $selection[0].classList.add('select2-selection--multiple');\n\n    $selection.html(\n      '<ul class=\"select2-selection__rendered\"></ul>'\n    );\n\n    return $selection;\n  };\n\n  MultipleSelection.prototype.bind = function (container, $container) {\n    var self = this;\n\n    MultipleSelection.__super__.bind.apply(this, arguments);\n\n    var id = container.id + '-container';\n    this.$selection.find('.select2-selection__rendered').attr('id', id);\n\n    this.$selection.on('click', function (evt) {\n      self.trigger('toggle', {\n        originalEvent: evt\n      });\n    });\n\n    this.$selection.on(\n      'click',\n      '.select2-selection__choice__remove',\n      function (evt) {\n        // Ignore the event if it is disabled\n        if (self.isDisabled()) {\n          return;\n        }\n\n        var $remove = $(this);\n        var $selection = $remove.parent();\n\n        var data = Utils.GetData($selection[0], 'data');\n\n        self.trigger('unselect', {\n          originalEvent: evt,\n          data: data\n        });\n      }\n    );\n\n    this.$selection.on(\n      'keydown',\n      '.select2-selection__choice__remove',\n      function (evt) {\n        // Ignore the event if it is disabled\n        if (self.isDisabled()) {\n          return;\n        }\n\n        evt.stopPropagation();\n      }\n    );\n  };\n\n  MultipleSelection.prototype.clear = function () {\n    var $rendered = this.$selection.find('.select2-selection__rendered');\n    $rendered.empty();\n    $rendered.removeAttr('title');\n  };\n\n  MultipleSelection.prototype.display = function (data, container) {\n    var template = this.options.get('templateSelection');\n    var escapeMarkup = this.options.get('escapeMarkup');\n\n    return escapeMarkup(template(data, container));\n  };\n\n  MultipleSelection.prototype.selectionContainer = function () {\n    var $container = $(\n      '<li class=\"select2-selection__choice\">' +\n        '<button type=\"button\" class=\"select2-selection__choice__remove\" ' +\n        'tabindex=\"-1\">' +\n          '<span aria-hidden=\"true\">&times;</span>' +\n        '</button>' +\n        '<span class=\"select2-selection__choice__display\"></span>' +\n      '</li>'\n    );\n\n    return $container;\n  };\n\n  MultipleSelection.prototype.update = function (data) {\n    this.clear();\n\n    if (data.length === 0) {\n      return;\n    }\n\n    var $selections = [];\n\n    var selectionIdPrefix = this.$selection.find('.select2-selection__rendered')\n      .attr('id') + '-choice-';\n\n    for (var d = 0; d < data.length; d++) {\n      var selection = data[d];\n\n      var $selection = this.selectionContainer();\n      var formatted = this.display(selection, $selection);\n\n      var selectionId = selectionIdPrefix + Utils.generateChars(4) + '-';\n\n      if (selection.id) {\n        selectionId += selection.id;\n      } else {\n        selectionId += Utils.generateChars(4);\n      }\n\n      $selection.find('.select2-selection__choice__display')\n        .append(formatted)\n        .attr('id', selectionId);\n\n      var title = selection.title || selection.text;\n\n      if (title) {\n        $selection.attr('title', title);\n      }\n\n      var removeItem = this.options.get('translations').get('removeItem');\n\n      var $remove = $selection.find('.select2-selection__choice__remove');\n\n      $remove.attr('title', removeItem());\n      $remove.attr('aria-label', removeItem());\n      $remove.attr('aria-describedby', selectionId);\n\n      Utils.StoreData($selection[0], 'data', selection);\n\n      $selections.push($selection);\n    }\n\n    var $rendered = this.$selection.find('.select2-selection__rendered');\n\n    $rendered.append($selections);\n  };\n\n  return MultipleSelection;\n});\n\nS2.define('select2/selection/placeholder',[\n\n], function () {\n  function Placeholder (decorated, $element, options) {\n    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));\n\n    decorated.call(this, $element, options);\n  }\n\n  Placeholder.prototype.normalizePlaceholder = function (_, placeholder) {\n    if (typeof placeholder === 'string') {\n      placeholder = {\n        id: '',\n        text: placeholder\n      };\n    }\n\n    return placeholder;\n  };\n\n  Placeholder.prototype.createPlaceholder = function (decorated, placeholder) {\n    var $placeholder = this.selectionContainer();\n\n    $placeholder.html(this.display(placeholder));\n    $placeholder[0].classList.add('select2-selection__placeholder');\n    $placeholder[0].classList.remove('select2-selection__choice');\n\n    var placeholderTitle = placeholder.title ||\n      placeholder.text ||\n      $placeholder.text();\n\n    this.$selection.find('.select2-selection__rendered').attr(\n      'title',\n      placeholderTitle\n    );\n\n    return $placeholder;\n  };\n\n  Placeholder.prototype.update = function (decorated, data) {\n    var singlePlaceholder = (\n      data.length == 1 && data[0].id != this.placeholder.id\n    );\n    var multipleSelections = data.length > 1;\n\n    if (multipleSelections || singlePlaceholder) {\n      return decorated.call(this, data);\n    }\n\n    this.clear();\n\n    var $placeholder = this.createPlaceholder(this.placeholder);\n\n    this.$selection.find('.select2-selection__rendered').append($placeholder);\n  };\n\n  return Placeholder;\n});\n\nS2.define('select2/selection/allowClear',[\n  'jquery',\n  '../keys',\n  '../utils'\n], function ($, KEYS, Utils) {\n  function AllowClear () { }\n\n  AllowClear.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    if (this.placeholder == null) {\n      if (this.options.get('debug') && window.console && console.error) {\n        console.error(\n          'Select2: The `allowClear` option should be used in combination ' +\n          'with the `placeholder` option.'\n        );\n      }\n    }\n\n    this.$selection.on('mousedown', '.select2-selection__clear',\n      function (evt) {\n        self._handleClear(evt);\n    });\n\n    container.on('keypress', function (evt) {\n      self._handleKeyboardClear(evt, container);\n    });\n  };\n\n  AllowClear.prototype._handleClear = function (_, evt) {\n    // Ignore the event if it is disabled\n    if (this.isDisabled()) {\n      return;\n    }\n\n    var $clear = this.$selection.find('.select2-selection__clear');\n\n    // Ignore the event if nothing has been selected\n    if ($clear.length === 0) {\n      return;\n    }\n\n    evt.stopPropagation();\n\n    var data = Utils.GetData($clear[0], 'data');\n\n    var previousVal = this.$element.val();\n    this.$element.val(this.placeholder.id);\n\n    var unselectData = {\n      data: data\n    };\n    this.trigger('clear', unselectData);\n    if (unselectData.prevented) {\n      this.$element.val(previousVal);\n      return;\n    }\n\n    for (var d = 0; d < data.length; d++) {\n      unselectData = {\n        data: data[d]\n      };\n\n      // Trigger the `unselect` event, so people can prevent it from being\n      // cleared.\n      this.trigger('unselect', unselectData);\n\n      // If the event was prevented, don't clear it out.\n      if (unselectData.prevented) {\n        this.$element.val(previousVal);\n        return;\n      }\n    }\n\n    this.$element.trigger('input').trigger('change');\n\n    this.trigger('toggle', {});\n  };\n\n  AllowClear.prototype._handleKeyboardClear = function (_, evt, container) {\n    if (container.isOpen()) {\n      return;\n    }\n\n    if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) {\n      this._handleClear(evt);\n    }\n  };\n\n  AllowClear.prototype.update = function (decorated, data) {\n    decorated.call(this, data);\n\n    this.$selection.find('.select2-selection__clear').remove();\n    this.$selection[0].classList.remove('select2-selection--clearable');\n\n    if (this.$selection.find('.select2-selection__placeholder').length > 0 ||\n        data.length === 0) {\n      return;\n    }\n\n    var selectionId = this.$selection.find('.select2-selection__rendered')\n      .attr('id');\n\n    var removeAll = this.options.get('translations').get('removeAllItems');\n\n    var $remove = $(\n      '<button type=\"button\" class=\"select2-selection__clear\" tabindex=\"-1\">' +\n        '<span aria-hidden=\"true\">&times;</span>' +\n      '</button>'\n    );\n    $remove.attr('title', removeAll());\n    $remove.attr('aria-label', removeAll());\n    $remove.attr('aria-describedby', selectionId);\n    Utils.StoreData($remove[0], 'data', data);\n\n    this.$selection.prepend($remove);\n    this.$selection[0].classList.add('select2-selection--clearable');\n  };\n\n  return AllowClear;\n});\n\nS2.define('select2/selection/search',[\n  'jquery',\n  '../utils',\n  '../keys'\n], function ($, Utils, KEYS) {\n  function Search (decorated, $element, options) {\n    decorated.call(this, $element, options);\n  }\n\n  Search.prototype.render = function (decorated) {\n    var searchLabel = this.options.get('translations').get('search');\n    var $search = $(\n      '<span class=\"select2-search select2-search--inline\">' +\n        '<textarea class=\"select2-search__field\"'+\n        ' type=\"search\" tabindex=\"-1\"' +\n        ' autocorrect=\"off\" autocapitalize=\"none\"' +\n        ' spellcheck=\"false\" role=\"searchbox\" aria-autocomplete=\"list\" >' +\n        '</textarea>' +\n      '</span>'\n    );\n\n    this.$searchContainer = $search;\n    this.$search = $search.find('textarea');\n\n    this.$search.prop('autocomplete', this.options.get('autocomplete'));\n    this.$search.attr('aria-label', searchLabel());\n\n    var $rendered = decorated.call(this);\n\n    this._transferTabIndex();\n    $rendered.append(this.$searchContainer);\n\n    return $rendered;\n  };\n\n  Search.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    var resultsId = container.id + '-results';\n    var selectionId = container.id + '-container';\n\n    decorated.call(this, container, $container);\n\n    self.$search.attr('aria-describedby', selectionId);\n\n    container.on('open', function () {\n      self.$search.attr('aria-controls', resultsId);\n      self.$search.trigger('focus');\n    });\n\n    container.on('close', function () {\n      self.$search.val('');\n      self.resizeSearch();\n      self.$search.removeAttr('aria-controls');\n      self.$search.removeAttr('aria-activedescendant');\n      self.$search.trigger('focus');\n    });\n\n    container.on('enable', function () {\n      self.$search.prop('disabled', false);\n\n      self._transferTabIndex();\n    });\n\n    container.on('disable', function () {\n      self.$search.prop('disabled', true);\n    });\n\n    container.on('focus', function (evt) {\n      self.$search.trigger('focus');\n    });\n\n    container.on('results:focus', function (params) {\n      if (params.data._resultId) {\n        self.$search.attr('aria-activedescendant', params.data._resultId);\n      } else {\n        self.$search.removeAttr('aria-activedescendant');\n      }\n    });\n\n    this.$selection.on('focusin', '.select2-search--inline', function (evt) {\n      self.trigger('focus', evt);\n    });\n\n    this.$selection.on('focusout', '.select2-search--inline', function (evt) {\n      self._handleBlur(evt);\n    });\n\n    this.$selection.on('keydown', '.select2-search--inline', function (evt) {\n      evt.stopPropagation();\n\n      self.trigger('keypress', evt);\n\n      self._keyUpPrevented = evt.isDefaultPrevented();\n\n      var key = evt.which;\n\n      if (key === KEYS.BACKSPACE && self.$search.val() === '') {\n        var $previousChoice = self.$selection\n          .find('.select2-selection__choice').last();\n\n        if ($previousChoice.length > 0) {\n          var item = Utils.GetData($previousChoice[0], 'data');\n\n          self.searchRemoveChoice(item);\n\n          evt.preventDefault();\n        }\n      }\n    });\n\n    this.$selection.on('click', '.select2-search--inline', function (evt) {\n      if (self.$search.val()) {\n        evt.stopPropagation();\n      }\n    });\n\n    // Try to detect the IE version should the `documentMode` property that\n    // is stored on the document. This is only implemented in IE and is\n    // slightly cleaner than doing a user agent check.\n    // This property is not available in Edge, but Edge also doesn't have\n    // this bug.\n    var msie = document.documentMode;\n    var disableInputEvents = msie && msie <= 11;\n\n    // Workaround for browsers which do not support the `input` event\n    // This will prevent double-triggering of events for browsers which support\n    // both the `keyup` and `input` events.\n    this.$selection.on(\n      'input.searchcheck',\n      '.select2-search--inline',\n      function (evt) {\n        // IE will trigger the `input` event when a placeholder is used on a\n        // search box. To get around this issue, we are forced to ignore all\n        // `input` events in IE and keep using `keyup`.\n        if (disableInputEvents) {\n          self.$selection.off('input.search input.searchcheck');\n          return;\n        }\n\n        // Unbind the duplicated `keyup` event\n        self.$selection.off('keyup.search');\n      }\n    );\n\n    this.$selection.on(\n      'keyup.search input.search',\n      '.select2-search--inline',\n      function (evt) {\n        // IE will trigger the `input` event when a placeholder is used on a\n        // search box. To get around this issue, we are forced to ignore all\n        // `input` events in IE and keep using `keyup`.\n        if (disableInputEvents && evt.type === 'input') {\n          self.$selection.off('input.search input.searchcheck');\n          return;\n        }\n\n        var key = evt.which;\n\n        // We can freely ignore events from modifier keys\n        if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) {\n          return;\n        }\n\n        // Tabbing will be handled during the `keydown` phase\n        if (key == KEYS.TAB) {\n          return;\n        }\n\n        self.handleSearch(evt);\n      }\n    );\n  };\n\n  /**\n   * This method will transfer the tabindex attribute from the rendered\n   * selection to the search box. This allows for the search box to be used as\n   * the primary focus instead of the selection container.\n   *\n   * @private\n   */\n  Search.prototype._transferTabIndex = function (decorated) {\n    this.$search.attr('tabindex', this.$selection.attr('tabindex'));\n    this.$selection.attr('tabindex', '-1');\n  };\n\n  Search.prototype.createPlaceholder = function (decorated, placeholder) {\n    this.$search.attr('placeholder', placeholder.text);\n  };\n\n  Search.prototype.update = function (decorated, data) {\n    var searchHadFocus = this.$search[0] == document.activeElement;\n\n    this.$search.attr('placeholder', '');\n\n    decorated.call(this, data);\n\n    this.resizeSearch();\n    if (searchHadFocus) {\n      this.$search.trigger('focus');\n    }\n  };\n\n  Search.prototype.handleSearch = function () {\n    this.resizeSearch();\n\n    if (!this._keyUpPrevented) {\n      var input = this.$search.val();\n\n      this.trigger('query', {\n        term: input\n      });\n    }\n\n    this._keyUpPrevented = false;\n  };\n\n  Search.prototype.searchRemoveChoice = function (decorated, item) {\n    this.trigger('unselect', {\n      data: item\n    });\n\n    this.$search.val(item.text);\n    this.handleSearch();\n  };\n\n  Search.prototype.resizeSearch = function () {\n    this.$search.css('width', '25px');\n\n    var width = '100%';\n\n    if (this.$search.attr('placeholder') === '') {\n      var minimumWidth = this.$search.val().length + 1;\n\n      width = (minimumWidth * 0.75) + 'em';\n    }\n\n    this.$search.css('width', width);\n  };\n\n  return Search;\n});\n\nS2.define('select2/selection/selectionCss',[\n  '../utils'\n], function (Utils) {\n  function SelectionCSS () { }\n\n  SelectionCSS.prototype.render = function (decorated) {\n    var $selection = decorated.call(this);\n\n    var selectionCssClass = this.options.get('selectionCssClass') || '';\n\n    if (selectionCssClass.indexOf(':all:') !== -1) {\n      selectionCssClass = selectionCssClass.replace(':all:', '');\n\n      Utils.copyNonInternalCssClasses($selection[0], this.$element[0]);\n    }\n\n    $selection.addClass(selectionCssClass);\n\n    return $selection;\n  };\n\n  return SelectionCSS;\n});\n\nS2.define('select2/selection/eventRelay',[\n  'jquery'\n], function ($) {\n  function EventRelay () { }\n\n  EventRelay.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n    var relayEvents = [\n      'open', 'opening',\n      'close', 'closing',\n      'select', 'selecting',\n      'unselect', 'unselecting',\n      'clear', 'clearing'\n    ];\n\n    var preventableEvents = [\n      'opening', 'closing', 'selecting', 'unselecting', 'clearing'\n    ];\n\n    decorated.call(this, container, $container);\n\n    container.on('*', function (name, params) {\n      // Ignore events that should not be relayed\n      if (relayEvents.indexOf(name) === -1) {\n        return;\n      }\n\n      // The parameters should always be an object\n      params = params || {};\n\n      // Generate the jQuery event for the Select2 event\n      var evt = $.Event('select2:' + name, {\n        params: params\n      });\n\n      self.$element.trigger(evt);\n\n      // Only handle preventable events if it was one\n      if (preventableEvents.indexOf(name) === -1) {\n        return;\n      }\n\n      params.prevented = evt.isDefaultPrevented();\n    });\n  };\n\n  return EventRelay;\n});\n\nS2.define('select2/translation',[\n  'jquery',\n  'require'\n], function ($, require) {\n  function Translation (dict) {\n    this.dict = dict || {};\n  }\n\n  Translation.prototype.all = function () {\n    return this.dict;\n  };\n\n  Translation.prototype.get = function (key) {\n    return this.dict[key];\n  };\n\n  Translation.prototype.extend = function (translation) {\n    this.dict = $.extend({}, translation.all(), this.dict);\n  };\n\n  // Static functions\n\n  Translation._cache = {};\n\n  Translation.loadPath = function (path) {\n    if (!(path in Translation._cache)) {\n      var translations = require(path);\n\n      Translation._cache[path] = translations;\n    }\n\n    return new Translation(Translation._cache[path]);\n  };\n\n  return Translation;\n});\n\nS2.define('select2/diacritics',[\n\n], function () {\n  var diacritics = {\n    '\\u24B6': 'A',\n    '\\uFF21': 'A',\n    '\\u00C0': 'A',\n    '\\u00C1': 'A',\n    '\\u00C2': 'A',\n    '\\u1EA6': 'A',\n    '\\u1EA4': 'A',\n    '\\u1EAA': 'A',\n    '\\u1EA8': 'A',\n    '\\u00C3': 'A',\n    '\\u0100': 'A',\n    '\\u0102': 'A',\n    '\\u1EB0': 'A',\n    '\\u1EAE': 'A',\n    '\\u1EB4': 'A',\n    '\\u1EB2': 'A',\n    '\\u0226': 'A',\n    '\\u01E0': 'A',\n    '\\u00C4': 'A',\n    '\\u01DE': 'A',\n    '\\u1EA2': 'A',\n    '\\u00C5': 'A',\n    '\\u01FA': 'A',\n    '\\u01CD': 'A',\n    '\\u0200': 'A',\n    '\\u0202': 'A',\n    '\\u1EA0': 'A',\n    '\\u1EAC': 'A',\n    '\\u1EB6': 'A',\n    '\\u1E00': 'A',\n    '\\u0104': 'A',\n    '\\u023A': 'A',\n    '\\u2C6F': 'A',\n    '\\uA732': 'AA',\n    '\\u00C6': 'AE',\n    '\\u01FC': 'AE',\n    '\\u01E2': 'AE',\n    '\\uA734': 'AO',\n    '\\uA736': 'AU',\n    '\\uA738': 'AV',\n    '\\uA73A': 'AV',\n    '\\uA73C': 'AY',\n    '\\u24B7': 'B',\n    '\\uFF22': 'B',\n    '\\u1E02': 'B',\n    '\\u1E04': 'B',\n    '\\u1E06': 'B',\n    '\\u0243': 'B',\n    '\\u0182': 'B',\n    '\\u0181': 'B',\n    '\\u24B8': 'C',\n    '\\uFF23': 'C',\n    '\\u0106': 'C',\n    '\\u0108': 'C',\n    '\\u010A': 'C',\n    '\\u010C': 'C',\n    '\\u00C7': 'C',\n    '\\u1E08': 'C',\n    '\\u0187': 'C',\n    '\\u023B': 'C',\n    '\\uA73E': 'C',\n    '\\u24B9': 'D',\n    '\\uFF24': 'D',\n    '\\u1E0A': 'D',\n    '\\u010E': 'D',\n    '\\u1E0C': 'D',\n    '\\u1E10': 'D',\n    '\\u1E12': 'D',\n    '\\u1E0E': 'D',\n    '\\u0110': 'D',\n    '\\u018B': 'D',\n    '\\u018A': 'D',\n    '\\u0189': 'D',\n    '\\uA779': 'D',\n    '\\u01F1': 'DZ',\n    '\\u01C4': 'DZ',\n    '\\u01F2': 'Dz',\n    '\\u01C5': 'Dz',\n    '\\u24BA': 'E',\n    '\\uFF25': 'E',\n    '\\u00C8': 'E',\n    '\\u00C9': 'E',\n    '\\u00CA': 'E',\n    '\\u1EC0': 'E',\n    '\\u1EBE': 'E',\n    '\\u1EC4': 'E',\n    '\\u1EC2': 'E',\n    '\\u1EBC': 'E',\n    '\\u0112': 'E',\n    '\\u1E14': 'E',\n    '\\u1E16': 'E',\n    '\\u0114': 'E',\n    '\\u0116': 'E',\n    '\\u00CB': 'E',\n    '\\u1EBA': 'E',\n    '\\u011A': 'E',\n    '\\u0204': 'E',\n    '\\u0206': 'E',\n    '\\u1EB8': 'E',\n    '\\u1EC6': 'E',\n    '\\u0228': 'E',\n    '\\u1E1C': 'E',\n    '\\u0118': 'E',\n    '\\u1E18': 'E',\n    '\\u1E1A': 'E',\n    '\\u0190': 'E',\n    '\\u018E': 'E',\n    '\\u24BB': 'F',\n    '\\uFF26': 'F',\n    '\\u1E1E': 'F',\n    '\\u0191': 'F',\n    '\\uA77B': 'F',\n    '\\u24BC': 'G',\n    '\\uFF27': 'G',\n    '\\u01F4': 'G',\n    '\\u011C': 'G',\n    '\\u1E20': 'G',\n    '\\u011E': 'G',\n    '\\u0120': 'G',\n    '\\u01E6': 'G',\n    '\\u0122': 'G',\n    '\\u01E4': 'G',\n    '\\u0193': 'G',\n    '\\uA7A0': 'G',\n    '\\uA77D': 'G',\n    '\\uA77E': 'G',\n    '\\u24BD': 'H',\n    '\\uFF28': 'H',\n    '\\u0124': 'H',\n    '\\u1E22': 'H',\n    '\\u1E26': 'H',\n    '\\u021E': 'H',\n    '\\u1E24': 'H',\n    '\\u1E28': 'H',\n    '\\u1E2A': 'H',\n    '\\u0126': 'H',\n    '\\u2C67': 'H',\n    '\\u2C75': 'H',\n    '\\uA78D': 'H',\n    '\\u24BE': 'I',\n    '\\uFF29': 'I',\n    '\\u00CC': 'I',\n    '\\u00CD': 'I',\n    '\\u00CE': 'I',\n    '\\u0128': 'I',\n    '\\u012A': 'I',\n    '\\u012C': 'I',\n    '\\u0130': 'I',\n    '\\u00CF': 'I',\n    '\\u1E2E': 'I',\n    '\\u1EC8': 'I',\n    '\\u01CF': 'I',\n    '\\u0208': 'I',\n    '\\u020A': 'I',\n    '\\u1ECA': 'I',\n    '\\u012E': 'I',\n    '\\u1E2C': 'I',\n    '\\u0197': 'I',\n    '\\u24BF': 'J',\n    '\\uFF2A': 'J',\n    '\\u0134': 'J',\n    '\\u0248': 'J',\n    '\\u24C0': 'K',\n    '\\uFF2B': 'K',\n    '\\u1E30': 'K',\n    '\\u01E8': 'K',\n    '\\u1E32': 'K',\n    '\\u0136': 'K',\n    '\\u1E34': 'K',\n    '\\u0198': 'K',\n    '\\u2C69': 'K',\n    '\\uA740': 'K',\n    '\\uA742': 'K',\n    '\\uA744': 'K',\n    '\\uA7A2': 'K',\n    '\\u24C1': 'L',\n    '\\uFF2C': 'L',\n    '\\u013F': 'L',\n    '\\u0139': 'L',\n    '\\u013D': 'L',\n    '\\u1E36': 'L',\n    '\\u1E38': 'L',\n    '\\u013B': 'L',\n    '\\u1E3C': 'L',\n    '\\u1E3A': 'L',\n    '\\u0141': 'L',\n    '\\u023D': 'L',\n    '\\u2C62': 'L',\n    '\\u2C60': 'L',\n    '\\uA748': 'L',\n    '\\uA746': 'L',\n    '\\uA780': 'L',\n    '\\u01C7': 'LJ',\n    '\\u01C8': 'Lj',\n    '\\u24C2': 'M',\n    '\\uFF2D': 'M',\n    '\\u1E3E': 'M',\n    '\\u1E40': 'M',\n    '\\u1E42': 'M',\n    '\\u2C6E': 'M',\n    '\\u019C': 'M',\n    '\\u24C3': 'N',\n    '\\uFF2E': 'N',\n    '\\u01F8': 'N',\n    '\\u0143': 'N',\n    '\\u00D1': 'N',\n    '\\u1E44': 'N',\n    '\\u0147': 'N',\n    '\\u1E46': 'N',\n    '\\u0145': 'N',\n    '\\u1E4A': 'N',\n    '\\u1E48': 'N',\n    '\\u0220': 'N',\n    '\\u019D': 'N',\n    '\\uA790': 'N',\n    '\\uA7A4': 'N',\n    '\\u01CA': 'NJ',\n    '\\u01CB': 'Nj',\n    '\\u24C4': 'O',\n    '\\uFF2F': 'O',\n    '\\u00D2': 'O',\n    '\\u00D3': 'O',\n    '\\u00D4': 'O',\n    '\\u1ED2': 'O',\n    '\\u1ED0': 'O',\n    '\\u1ED6': 'O',\n    '\\u1ED4': 'O',\n    '\\u00D5': 'O',\n    '\\u1E4C': 'O',\n    '\\u022C': 'O',\n    '\\u1E4E': 'O',\n    '\\u014C': 'O',\n    '\\u1E50': 'O',\n    '\\u1E52': 'O',\n    '\\u014E': 'O',\n    '\\u022E': 'O',\n    '\\u0230': 'O',\n    '\\u00D6': 'O',\n    '\\u022A': 'O',\n    '\\u1ECE': 'O',\n    '\\u0150': 'O',\n    '\\u01D1': 'O',\n    '\\u020C': 'O',\n    '\\u020E': 'O',\n    '\\u01A0': 'O',\n    '\\u1EDC': 'O',\n    '\\u1EDA': 'O',\n    '\\u1EE0': 'O',\n    '\\u1EDE': 'O',\n    '\\u1EE2': 'O',\n    '\\u1ECC': 'O',\n    '\\u1ED8': 'O',\n    '\\u01EA': 'O',\n    '\\u01EC': 'O',\n    '\\u00D8': 'O',\n    '\\u01FE': 'O',\n    '\\u0186': 'O',\n    '\\u019F': 'O',\n    '\\uA74A': 'O',\n    '\\uA74C': 'O',\n    '\\u0152': 'OE',\n    '\\u01A2': 'OI',\n    '\\uA74E': 'OO',\n    '\\u0222': 'OU',\n    '\\u24C5': 'P',\n    '\\uFF30': 'P',\n    '\\u1E54': 'P',\n    '\\u1E56': 'P',\n    '\\u01A4': 'P',\n    '\\u2C63': 'P',\n    '\\uA750': 'P',\n    '\\uA752': 'P',\n    '\\uA754': 'P',\n    '\\u24C6': 'Q',\n    '\\uFF31': 'Q',\n    '\\uA756': 'Q',\n    '\\uA758': 'Q',\n    '\\u024A': 'Q',\n    '\\u24C7': 'R',\n    '\\uFF32': 'R',\n    '\\u0154': 'R',\n    '\\u1E58': 'R',\n    '\\u0158': 'R',\n    '\\u0210': 'R',\n    '\\u0212': 'R',\n    '\\u1E5A': 'R',\n    '\\u1E5C': 'R',\n    '\\u0156': 'R',\n    '\\u1E5E': 'R',\n    '\\u024C': 'R',\n    '\\u2C64': 'R',\n    '\\uA75A': 'R',\n    '\\uA7A6': 'R',\n    '\\uA782': 'R',\n    '\\u24C8': 'S',\n    '\\uFF33': 'S',\n    '\\u1E9E': 'S',\n    '\\u015A': 'S',\n    '\\u1E64': 'S',\n    '\\u015C': 'S',\n    '\\u1E60': 'S',\n    '\\u0160': 'S',\n    '\\u1E66': 'S',\n    '\\u1E62': 'S',\n    '\\u1E68': 'S',\n    '\\u0218': 'S',\n    '\\u015E': 'S',\n    '\\u2C7E': 'S',\n    '\\uA7A8': 'S',\n    '\\uA784': 'S',\n    '\\u24C9': 'T',\n    '\\uFF34': 'T',\n    '\\u1E6A': 'T',\n    '\\u0164': 'T',\n    '\\u1E6C': 'T',\n    '\\u021A': 'T',\n    '\\u0162': 'T',\n    '\\u1E70': 'T',\n    '\\u1E6E': 'T',\n    '\\u0166': 'T',\n    '\\u01AC': 'T',\n    '\\u01AE': 'T',\n    '\\u023E': 'T',\n    '\\uA786': 'T',\n    '\\uA728': 'TZ',\n    '\\u24CA': 'U',\n    '\\uFF35': 'U',\n    '\\u00D9': 'U',\n    '\\u00DA': 'U',\n    '\\u00DB': 'U',\n    '\\u0168': 'U',\n    '\\u1E78': 'U',\n    '\\u016A': 'U',\n    '\\u1E7A': 'U',\n    '\\u016C': 'U',\n    '\\u00DC': 'U',\n    '\\u01DB': 'U',\n    '\\u01D7': 'U',\n    '\\u01D5': 'U',\n    '\\u01D9': 'U',\n    '\\u1EE6': 'U',\n    '\\u016E': 'U',\n    '\\u0170': 'U',\n    '\\u01D3': 'U',\n    '\\u0214': 'U',\n    '\\u0216': 'U',\n    '\\u01AF': 'U',\n    '\\u1EEA': 'U',\n    '\\u1EE8': 'U',\n    '\\u1EEE': 'U',\n    '\\u1EEC': 'U',\n    '\\u1EF0': 'U',\n    '\\u1EE4': 'U',\n    '\\u1E72': 'U',\n    '\\u0172': 'U',\n    '\\u1E76': 'U',\n    '\\u1E74': 'U',\n    '\\u0244': 'U',\n    '\\u24CB': 'V',\n    '\\uFF36': 'V',\n    '\\u1E7C': 'V',\n    '\\u1E7E': 'V',\n    '\\u01B2': 'V',\n    '\\uA75E': 'V',\n    '\\u0245': 'V',\n    '\\uA760': 'VY',\n    '\\u24CC': 'W',\n    '\\uFF37': 'W',\n    '\\u1E80': 'W',\n    '\\u1E82': 'W',\n    '\\u0174': 'W',\n    '\\u1E86': 'W',\n    '\\u1E84': 'W',\n    '\\u1E88': 'W',\n    '\\u2C72': 'W',\n    '\\u24CD': 'X',\n    '\\uFF38': 'X',\n    '\\u1E8A': 'X',\n    '\\u1E8C': 'X',\n    '\\u24CE': 'Y',\n    '\\uFF39': 'Y',\n    '\\u1EF2': 'Y',\n    '\\u00DD': 'Y',\n    '\\u0176': 'Y',\n    '\\u1EF8': 'Y',\n    '\\u0232': 'Y',\n    '\\u1E8E': 'Y',\n    '\\u0178': 'Y',\n    '\\u1EF6': 'Y',\n    '\\u1EF4': 'Y',\n    '\\u01B3': 'Y',\n    '\\u024E': 'Y',\n    '\\u1EFE': 'Y',\n    '\\u24CF': 'Z',\n    '\\uFF3A': 'Z',\n    '\\u0179': 'Z',\n    '\\u1E90': 'Z',\n    '\\u017B': 'Z',\n    '\\u017D': 'Z',\n    '\\u1E92': 'Z',\n    '\\u1E94': 'Z',\n    '\\u01B5': 'Z',\n    '\\u0224': 'Z',\n    '\\u2C7F': 'Z',\n    '\\u2C6B': 'Z',\n    '\\uA762': 'Z',\n    '\\u24D0': 'a',\n    '\\uFF41': 'a',\n    '\\u1E9A': 'a',\n    '\\u00E0': 'a',\n    '\\u00E1': 'a',\n    '\\u00E2': 'a',\n    '\\u1EA7': 'a',\n    '\\u1EA5': 'a',\n    '\\u1EAB': 'a',\n    '\\u1EA9': 'a',\n    '\\u00E3': 'a',\n    '\\u0101': 'a',\n    '\\u0103': 'a',\n    '\\u1EB1': 'a',\n    '\\u1EAF': 'a',\n    '\\u1EB5': 'a',\n    '\\u1EB3': 'a',\n    '\\u0227': 'a',\n    '\\u01E1': 'a',\n    '\\u00E4': 'a',\n    '\\u01DF': 'a',\n    '\\u1EA3': 'a',\n    '\\u00E5': 'a',\n    '\\u01FB': 'a',\n    '\\u01CE': 'a',\n    '\\u0201': 'a',\n    '\\u0203': 'a',\n    '\\u1EA1': 'a',\n    '\\u1EAD': 'a',\n    '\\u1EB7': 'a',\n    '\\u1E01': 'a',\n    '\\u0105': 'a',\n    '\\u2C65': 'a',\n    '\\u0250': 'a',\n    '\\uA733': 'aa',\n    '\\u00E6': 'ae',\n    '\\u01FD': 'ae',\n    '\\u01E3': 'ae',\n    '\\uA735': 'ao',\n    '\\uA737': 'au',\n    '\\uA739': 'av',\n    '\\uA73B': 'av',\n    '\\uA73D': 'ay',\n    '\\u24D1': 'b',\n    '\\uFF42': 'b',\n    '\\u1E03': 'b',\n    '\\u1E05': 'b',\n    '\\u1E07': 'b',\n    '\\u0180': 'b',\n    '\\u0183': 'b',\n    '\\u0253': 'b',\n    '\\u24D2': 'c',\n    '\\uFF43': 'c',\n    '\\u0107': 'c',\n    '\\u0109': 'c',\n    '\\u010B': 'c',\n    '\\u010D': 'c',\n    '\\u00E7': 'c',\n    '\\u1E09': 'c',\n    '\\u0188': 'c',\n    '\\u023C': 'c',\n    '\\uA73F': 'c',\n    '\\u2184': 'c',\n    '\\u24D3': 'd',\n    '\\uFF44': 'd',\n    '\\u1E0B': 'd',\n    '\\u010F': 'd',\n    '\\u1E0D': 'd',\n    '\\u1E11': 'd',\n    '\\u1E13': 'd',\n    '\\u1E0F': 'd',\n    '\\u0111': 'd',\n    '\\u018C': 'd',\n    '\\u0256': 'd',\n    '\\u0257': 'd',\n    '\\uA77A': 'd',\n    '\\u01F3': 'dz',\n    '\\u01C6': 'dz',\n    '\\u24D4': 'e',\n    '\\uFF45': 'e',\n    '\\u00E8': 'e',\n    '\\u00E9': 'e',\n    '\\u00EA': 'e',\n    '\\u1EC1': 'e',\n    '\\u1EBF': 'e',\n    '\\u1EC5': 'e',\n    '\\u1EC3': 'e',\n    '\\u1EBD': 'e',\n    '\\u0113': 'e',\n    '\\u1E15': 'e',\n    '\\u1E17': 'e',\n    '\\u0115': 'e',\n    '\\u0117': 'e',\n    '\\u00EB': 'e',\n    '\\u1EBB': 'e',\n    '\\u011B': 'e',\n    '\\u0205': 'e',\n    '\\u0207': 'e',\n    '\\u1EB9': 'e',\n    '\\u1EC7': 'e',\n    '\\u0229': 'e',\n    '\\u1E1D': 'e',\n    '\\u0119': 'e',\n    '\\u1E19': 'e',\n    '\\u1E1B': 'e',\n    '\\u0247': 'e',\n    '\\u025B': 'e',\n    '\\u01DD': 'e',\n    '\\u24D5': 'f',\n    '\\uFF46': 'f',\n    '\\u1E1F': 'f',\n    '\\u0192': 'f',\n    '\\uA77C': 'f',\n    '\\u24D6': 'g',\n    '\\uFF47': 'g',\n    '\\u01F5': 'g',\n    '\\u011D': 'g',\n    '\\u1E21': 'g',\n    '\\u011F': 'g',\n    '\\u0121': 'g',\n    '\\u01E7': 'g',\n    '\\u0123': 'g',\n    '\\u01E5': 'g',\n    '\\u0260': 'g',\n    '\\uA7A1': 'g',\n    '\\u1D79': 'g',\n    '\\uA77F': 'g',\n    '\\u24D7': 'h',\n    '\\uFF48': 'h',\n    '\\u0125': 'h',\n    '\\u1E23': 'h',\n    '\\u1E27': 'h',\n    '\\u021F': 'h',\n    '\\u1E25': 'h',\n    '\\u1E29': 'h',\n    '\\u1E2B': 'h',\n    '\\u1E96': 'h',\n    '\\u0127': 'h',\n    '\\u2C68': 'h',\n    '\\u2C76': 'h',\n    '\\u0265': 'h',\n    '\\u0195': 'hv',\n    '\\u24D8': 'i',\n    '\\uFF49': 'i',\n    '\\u00EC': 'i',\n    '\\u00ED': 'i',\n    '\\u00EE': 'i',\n    '\\u0129': 'i',\n    '\\u012B': 'i',\n    '\\u012D': 'i',\n    '\\u00EF': 'i',\n    '\\u1E2F': 'i',\n    '\\u1EC9': 'i',\n    '\\u01D0': 'i',\n    '\\u0209': 'i',\n    '\\u020B': 'i',\n    '\\u1ECB': 'i',\n    '\\u012F': 'i',\n    '\\u1E2D': 'i',\n    '\\u0268': 'i',\n    '\\u0131': 'i',\n    '\\u24D9': 'j',\n    '\\uFF4A': 'j',\n    '\\u0135': 'j',\n    '\\u01F0': 'j',\n    '\\u0249': 'j',\n    '\\u24DA': 'k',\n    '\\uFF4B': 'k',\n    '\\u1E31': 'k',\n    '\\u01E9': 'k',\n    '\\u1E33': 'k',\n    '\\u0137': 'k',\n    '\\u1E35': 'k',\n    '\\u0199': 'k',\n    '\\u2C6A': 'k',\n    '\\uA741': 'k',\n    '\\uA743': 'k',\n    '\\uA745': 'k',\n    '\\uA7A3': 'k',\n    '\\u24DB': 'l',\n    '\\uFF4C': 'l',\n    '\\u0140': 'l',\n    '\\u013A': 'l',\n    '\\u013E': 'l',\n    '\\u1E37': 'l',\n    '\\u1E39': 'l',\n    '\\u013C': 'l',\n    '\\u1E3D': 'l',\n    '\\u1E3B': 'l',\n    '\\u017F': 'l',\n    '\\u0142': 'l',\n    '\\u019A': 'l',\n    '\\u026B': 'l',\n    '\\u2C61': 'l',\n    '\\uA749': 'l',\n    '\\uA781': 'l',\n    '\\uA747': 'l',\n    '\\u01C9': 'lj',\n    '\\u24DC': 'm',\n    '\\uFF4D': 'm',\n    '\\u1E3F': 'm',\n    '\\u1E41': 'm',\n    '\\u1E43': 'm',\n    '\\u0271': 'm',\n    '\\u026F': 'm',\n    '\\u24DD': 'n',\n    '\\uFF4E': 'n',\n    '\\u01F9': 'n',\n    '\\u0144': 'n',\n    '\\u00F1': 'n',\n    '\\u1E45': 'n',\n    '\\u0148': 'n',\n    '\\u1E47': 'n',\n    '\\u0146': 'n',\n    '\\u1E4B': 'n',\n    '\\u1E49': 'n',\n    '\\u019E': 'n',\n    '\\u0272': 'n',\n    '\\u0149': 'n',\n    '\\uA791': 'n',\n    '\\uA7A5': 'n',\n    '\\u01CC': 'nj',\n    '\\u24DE': 'o',\n    '\\uFF4F': 'o',\n    '\\u00F2': 'o',\n    '\\u00F3': 'o',\n    '\\u00F4': 'o',\n    '\\u1ED3': 'o',\n    '\\u1ED1': 'o',\n    '\\u1ED7': 'o',\n    '\\u1ED5': 'o',\n    '\\u00F5': 'o',\n    '\\u1E4D': 'o',\n    '\\u022D': 'o',\n    '\\u1E4F': 'o',\n    '\\u014D': 'o',\n    '\\u1E51': 'o',\n    '\\u1E53': 'o',\n    '\\u014F': 'o',\n    '\\u022F': 'o',\n    '\\u0231': 'o',\n    '\\u00F6': 'o',\n    '\\u022B': 'o',\n    '\\u1ECF': 'o',\n    '\\u0151': 'o',\n    '\\u01D2': 'o',\n    '\\u020D': 'o',\n    '\\u020F': 'o',\n    '\\u01A1': 'o',\n    '\\u1EDD': 'o',\n    '\\u1EDB': 'o',\n    '\\u1EE1': 'o',\n    '\\u1EDF': 'o',\n    '\\u1EE3': 'o',\n    '\\u1ECD': 'o',\n    '\\u1ED9': 'o',\n    '\\u01EB': 'o',\n    '\\u01ED': 'o',\n    '\\u00F8': 'o',\n    '\\u01FF': 'o',\n    '\\u0254': 'o',\n    '\\uA74B': 'o',\n    '\\uA74D': 'o',\n    '\\u0275': 'o',\n    '\\u0153': 'oe',\n    '\\u01A3': 'oi',\n    '\\u0223': 'ou',\n    '\\uA74F': 'oo',\n    '\\u24DF': 'p',\n    '\\uFF50': 'p',\n    '\\u1E55': 'p',\n    '\\u1E57': 'p',\n    '\\u01A5': 'p',\n    '\\u1D7D': 'p',\n    '\\uA751': 'p',\n    '\\uA753': 'p',\n    '\\uA755': 'p',\n    '\\u24E0': 'q',\n    '\\uFF51': 'q',\n    '\\u024B': 'q',\n    '\\uA757': 'q',\n    '\\uA759': 'q',\n    '\\u24E1': 'r',\n    '\\uFF52': 'r',\n    '\\u0155': 'r',\n    '\\u1E59': 'r',\n    '\\u0159': 'r',\n    '\\u0211': 'r',\n    '\\u0213': 'r',\n    '\\u1E5B': 'r',\n    '\\u1E5D': 'r',\n    '\\u0157': 'r',\n    '\\u1E5F': 'r',\n    '\\u024D': 'r',\n    '\\u027D': 'r',\n    '\\uA75B': 'r',\n    '\\uA7A7': 'r',\n    '\\uA783': 'r',\n    '\\u24E2': 's',\n    '\\uFF53': 's',\n    '\\u00DF': 's',\n    '\\u015B': 's',\n    '\\u1E65': 's',\n    '\\u015D': 's',\n    '\\u1E61': 's',\n    '\\u0161': 's',\n    '\\u1E67': 's',\n    '\\u1E63': 's',\n    '\\u1E69': 's',\n    '\\u0219': 's',\n    '\\u015F': 's',\n    '\\u023F': 's',\n    '\\uA7A9': 's',\n    '\\uA785': 's',\n    '\\u1E9B': 's',\n    '\\u24E3': 't',\n    '\\uFF54': 't',\n    '\\u1E6B': 't',\n    '\\u1E97': 't',\n    '\\u0165': 't',\n    '\\u1E6D': 't',\n    '\\u021B': 't',\n    '\\u0163': 't',\n    '\\u1E71': 't',\n    '\\u1E6F': 't',\n    '\\u0167': 't',\n    '\\u01AD': 't',\n    '\\u0288': 't',\n    '\\u2C66': 't',\n    '\\uA787': 't',\n    '\\uA729': 'tz',\n    '\\u24E4': 'u',\n    '\\uFF55': 'u',\n    '\\u00F9': 'u',\n    '\\u00FA': 'u',\n    '\\u00FB': 'u',\n    '\\u0169': 'u',\n    '\\u1E79': 'u',\n    '\\u016B': 'u',\n    '\\u1E7B': 'u',\n    '\\u016D': 'u',\n    '\\u00FC': 'u',\n    '\\u01DC': 'u',\n    '\\u01D8': 'u',\n    '\\u01D6': 'u',\n    '\\u01DA': 'u',\n    '\\u1EE7': 'u',\n    '\\u016F': 'u',\n    '\\u0171': 'u',\n    '\\u01D4': 'u',\n    '\\u0215': 'u',\n    '\\u0217': 'u',\n    '\\u01B0': 'u',\n    '\\u1EEB': 'u',\n    '\\u1EE9': 'u',\n    '\\u1EEF': 'u',\n    '\\u1EED': 'u',\n    '\\u1EF1': 'u',\n    '\\u1EE5': 'u',\n    '\\u1E73': 'u',\n    '\\u0173': 'u',\n    '\\u1E77': 'u',\n    '\\u1E75': 'u',\n    '\\u0289': 'u',\n    '\\u24E5': 'v',\n    '\\uFF56': 'v',\n    '\\u1E7D': 'v',\n    '\\u1E7F': 'v',\n    '\\u028B': 'v',\n    '\\uA75F': 'v',\n    '\\u028C': 'v',\n    '\\uA761': 'vy',\n    '\\u24E6': 'w',\n    '\\uFF57': 'w',\n    '\\u1E81': 'w',\n    '\\u1E83': 'w',\n    '\\u0175': 'w',\n    '\\u1E87': 'w',\n    '\\u1E85': 'w',\n    '\\u1E98': 'w',\n    '\\u1E89': 'w',\n    '\\u2C73': 'w',\n    '\\u24E7': 'x',\n    '\\uFF58': 'x',\n    '\\u1E8B': 'x',\n    '\\u1E8D': 'x',\n    '\\u24E8': 'y',\n    '\\uFF59': 'y',\n    '\\u1EF3': 'y',\n    '\\u00FD': 'y',\n    '\\u0177': 'y',\n    '\\u1EF9': 'y',\n    '\\u0233': 'y',\n    '\\u1E8F': 'y',\n    '\\u00FF': 'y',\n    '\\u1EF7': 'y',\n    '\\u1E99': 'y',\n    '\\u1EF5': 'y',\n    '\\u01B4': 'y',\n    '\\u024F': 'y',\n    '\\u1EFF': 'y',\n    '\\u24E9': 'z',\n    '\\uFF5A': 'z',\n    '\\u017A': 'z',\n    '\\u1E91': 'z',\n    '\\u017C': 'z',\n    '\\u017E': 'z',\n    '\\u1E93': 'z',\n    '\\u1E95': 'z',\n    '\\u01B6': 'z',\n    '\\u0225': 'z',\n    '\\u0240': 'z',\n    '\\u2C6C': 'z',\n    '\\uA763': 'z',\n    '\\u0386': '\\u0391',\n    '\\u0388': '\\u0395',\n    '\\u0389': '\\u0397',\n    '\\u038A': '\\u0399',\n    '\\u03AA': '\\u0399',\n    '\\u038C': '\\u039F',\n    '\\u038E': '\\u03A5',\n    '\\u03AB': '\\u03A5',\n    '\\u038F': '\\u03A9',\n    '\\u03AC': '\\u03B1',\n    '\\u03AD': '\\u03B5',\n    '\\u03AE': '\\u03B7',\n    '\\u03AF': '\\u03B9',\n    '\\u03CA': '\\u03B9',\n    '\\u0390': '\\u03B9',\n    '\\u03CC': '\\u03BF',\n    '\\u03CD': '\\u03C5',\n    '\\u03CB': '\\u03C5',\n    '\\u03B0': '\\u03C5',\n    '\\u03CE': '\\u03C9',\n    '\\u03C2': '\\u03C3',\n    '\\u2019': '\\''\n  };\n\n  return diacritics;\n});\n\nS2.define('select2/data/base',[\n  '../utils'\n], function (Utils) {\n  function BaseAdapter ($element, options) {\n    BaseAdapter.__super__.constructor.call(this);\n  }\n\n  Utils.Extend(BaseAdapter, Utils.Observable);\n\n  BaseAdapter.prototype.current = function (callback) {\n    throw new Error('The `current` method must be defined in child classes.');\n  };\n\n  BaseAdapter.prototype.query = function (params, callback) {\n    throw new Error('The `query` method must be defined in child classes.');\n  };\n\n  BaseAdapter.prototype.bind = function (container, $container) {\n    // Can be implemented in subclasses\n  };\n\n  BaseAdapter.prototype.destroy = function () {\n    // Can be implemented in subclasses\n  };\n\n  BaseAdapter.prototype.generateResultId = function (container, data) {\n    var id = container.id + '-result-';\n\n    id += Utils.generateChars(4);\n\n    if (data.id != null) {\n      id += '-' + data.id.toString();\n    } else {\n      id += '-' + Utils.generateChars(4);\n    }\n    return id;\n  };\n\n  return BaseAdapter;\n});\n\nS2.define('select2/data/select',[\n  './base',\n  '../utils',\n  'jquery'\n], function (BaseAdapter, Utils, $) {\n  function SelectAdapter ($element, options) {\n    this.$element = $element;\n    this.options = options;\n\n    SelectAdapter.__super__.constructor.call(this);\n  }\n\n  Utils.Extend(SelectAdapter, BaseAdapter);\n\n  SelectAdapter.prototype.current = function (callback) {\n    var self = this;\n\n    var data = Array.prototype.map.call(\n      this.$element[0].querySelectorAll(':checked'),\n      function (selectedElement) {\n        return self.item($(selectedElement));\n      }\n    );\n\n    callback(data);\n  };\n\n  SelectAdapter.prototype.select = function (data) {\n    var self = this;\n\n    data.selected = true;\n\n    // If data.element is a DOM node, use it instead\n    if (\n      data.element != null && data.element.tagName.toLowerCase() === 'option'\n    ) {\n      data.element.selected = true;\n\n      this.$element.trigger('input').trigger('change');\n\n      return;\n    }\n\n    if (this.$element.prop('multiple')) {\n      this.current(function (currentData) {\n        var val = [];\n\n        data = [data];\n        data.push.apply(data, currentData);\n\n        for (var d = 0; d < data.length; d++) {\n          var id = data[d].id;\n\n          if (val.indexOf(id) === -1) {\n            val.push(id);\n          }\n        }\n\n        self.$element.val(val);\n        self.$element.trigger('input').trigger('change');\n      });\n    } else {\n      var val = data.id;\n\n      this.$element.val(val);\n      this.$element.trigger('input').trigger('change');\n    }\n  };\n\n  SelectAdapter.prototype.unselect = function (data) {\n    var self = this;\n\n    if (!this.$element.prop('multiple')) {\n      return;\n    }\n\n    data.selected = false;\n\n    if (\n      data.element != null &&\n      data.element.tagName.toLowerCase() === 'option'\n    ) {\n      data.element.selected = false;\n\n      this.$element.trigger('input').trigger('change');\n\n      return;\n    }\n\n    this.current(function (currentData) {\n      var val = [];\n\n      for (var d = 0; d < currentData.length; d++) {\n        var id = currentData[d].id;\n\n        if (id !== data.id && val.indexOf(id) === -1) {\n          val.push(id);\n        }\n      }\n\n      self.$element.val(val);\n\n      self.$element.trigger('input').trigger('change');\n    });\n  };\n\n  SelectAdapter.prototype.bind = function (container, $container) {\n    var self = this;\n\n    this.container = container;\n\n    container.on('select', function (params) {\n      self.select(params.data);\n    });\n\n    container.on('unselect', function (params) {\n      self.unselect(params.data);\n    });\n  };\n\n  SelectAdapter.prototype.destroy = function () {\n    // Remove anything added to child elements\n    this.$element.find('*').each(function () {\n      // Remove any custom data set by Select2\n      Utils.RemoveData(this);\n    });\n  };\n\n  SelectAdapter.prototype.query = function (params, callback) {\n    var data = [];\n    var self = this;\n\n    var $options = this.$element.children();\n\n    $options.each(function () {\n      if (\n        this.tagName.toLowerCase() !== 'option' &&\n        this.tagName.toLowerCase() !== 'optgroup'\n      ) {\n        return;\n      }\n\n      var $option = $(this);\n\n      var option = self.item($option);\n\n      var matches = self.matches(params, option);\n\n      if (matches !== null) {\n        data.push(matches);\n      }\n    });\n\n    callback({\n      results: data\n    });\n  };\n\n  SelectAdapter.prototype.addOptions = function ($options) {\n    this.$element.append($options);\n  };\n\n  SelectAdapter.prototype.option = function (data) {\n    var option;\n\n    if (data.children) {\n      option = document.createElement('optgroup');\n      option.label = data.text;\n    } else {\n      option = document.createElement('option');\n\n      if (option.textContent !== undefined) {\n        option.textContent = data.text;\n      } else {\n        option.innerText = data.text;\n      }\n    }\n\n    if (data.id !== undefined) {\n      option.value = data.id;\n    }\n\n    if (data.disabled) {\n      option.disabled = true;\n    }\n\n    if (data.selected) {\n      option.selected = true;\n    }\n\n    if (data.title) {\n      option.title = data.title;\n    }\n\n    var normalizedData = this._normalizeItem(data);\n    normalizedData.element = option;\n\n    // Override the option's data with the combined data\n    Utils.StoreData(option, 'data', normalizedData);\n\n    return $(option);\n  };\n\n  SelectAdapter.prototype.item = function ($option) {\n    var data = {};\n\n    data = Utils.GetData($option[0], 'data');\n\n    if (data != null) {\n      return data;\n    }\n\n    var option = $option[0];\n\n    if (option.tagName.toLowerCase() === 'option') {\n      data = {\n        id: $option.val(),\n        text: $option.text(),\n        disabled: $option.prop('disabled'),\n        selected: $option.prop('selected'),\n        title: $option.prop('title')\n      };\n    } else if (option.tagName.toLowerCase() === 'optgroup') {\n      data = {\n        text: $option.prop('label'),\n        children: [],\n        title: $option.prop('title')\n      };\n\n      var $children = $option.children('option');\n      var children = [];\n\n      for (var c = 0; c < $children.length; c++) {\n        var $child = $($children[c]);\n\n        var child = this.item($child);\n\n        children.push(child);\n      }\n\n      data.children = children;\n    }\n\n    data = this._normalizeItem(data);\n    data.element = $option[0];\n\n    Utils.StoreData($option[0], 'data', data);\n\n    return data;\n  };\n\n  SelectAdapter.prototype._normalizeItem = function (item) {\n    if (item !== Object(item)) {\n      item = {\n        id: item,\n        text: item\n      };\n    }\n\n    item = $.extend({}, {\n      text: ''\n    }, item);\n\n    var defaults = {\n      selected: false,\n      disabled: false\n    };\n\n    if (item.id != null) {\n      item.id = item.id.toString();\n    }\n\n    if (item.text != null) {\n      item.text = item.text.toString();\n    }\n\n    if (item._resultId == null && item.id && this.container != null) {\n      item._resultId = this.generateResultId(this.container, item);\n    }\n\n    return $.extend({}, defaults, item);\n  };\n\n  SelectAdapter.prototype.matches = function (params, data) {\n    var matcher = this.options.get('matcher');\n\n    return matcher(params, data);\n  };\n\n  return SelectAdapter;\n});\n\nS2.define('select2/data/array',[\n  './select',\n  '../utils',\n  'jquery'\n], function (SelectAdapter, Utils, $) {\n  function ArrayAdapter ($element, options) {\n    this._dataToConvert = options.get('data') || [];\n\n    ArrayAdapter.__super__.constructor.call(this, $element, options);\n  }\n\n  Utils.Extend(ArrayAdapter, SelectAdapter);\n\n  ArrayAdapter.prototype.bind = function (container, $container) {\n    ArrayAdapter.__super__.bind.call(this, container, $container);\n\n    this.addOptions(this.convertToOptions(this._dataToConvert));\n  };\n\n  ArrayAdapter.prototype.select = function (data) {\n    var $option = this.$element.find('option').filter(function (i, elm) {\n      return elm.value == data.id.toString();\n    });\n\n    if ($option.length === 0) {\n      $option = this.option(data);\n\n      this.addOptions($option);\n    }\n\n    ArrayAdapter.__super__.select.call(this, data);\n  };\n\n  ArrayAdapter.prototype.convertToOptions = function (data) {\n    var self = this;\n\n    var $existing = this.$element.find('option');\n    var existingIds = $existing.map(function () {\n      return self.item($(this)).id;\n    }).get();\n\n    var $options = [];\n\n    // Filter out all items except for the one passed in the argument\n    function onlyItem (item) {\n      return function () {\n        return $(this).val() == item.id;\n      };\n    }\n\n    for (var d = 0; d < data.length; d++) {\n      var item = this._normalizeItem(data[d]);\n\n      // Skip items which were pre-loaded, only merge the data\n      if (existingIds.indexOf(item.id) >= 0) {\n        var $existingOption = $existing.filter(onlyItem(item));\n\n        var existingData = this.item($existingOption);\n        var newData = $.extend(true, {}, item, existingData);\n\n        var $newOption = this.option(newData);\n\n        $existingOption.replaceWith($newOption);\n\n        continue;\n      }\n\n      var $option = this.option(item);\n\n      if (item.children) {\n        var $children = this.convertToOptions(item.children);\n\n        $option.append($children);\n      }\n\n      $options.push($option);\n    }\n\n    return $options;\n  };\n\n  return ArrayAdapter;\n});\n\nS2.define('select2/data/ajax',[\n  './array',\n  '../utils',\n  'jquery'\n], function (ArrayAdapter, Utils, $) {\n  function AjaxAdapter ($element, options) {\n    this.ajaxOptions = this._applyDefaults(options.get('ajax'));\n\n    if (this.ajaxOptions.processResults != null) {\n      this.processResults = this.ajaxOptions.processResults;\n    }\n\n    AjaxAdapter.__super__.constructor.call(this, $element, options);\n  }\n\n  Utils.Extend(AjaxAdapter, ArrayAdapter);\n\n  AjaxAdapter.prototype._applyDefaults = function (options) {\n    var defaults = {\n      data: function (params) {\n        return $.extend({}, params, {\n          q: params.term\n        });\n      },\n      transport: function (params, success, failure) {\n        var $request = $.ajax(params);\n\n        $request.then(success);\n        $request.fail(failure);\n\n        return $request;\n      }\n    };\n\n    return $.extend({}, defaults, options, true);\n  };\n\n  AjaxAdapter.prototype.processResults = function (results) {\n    return results;\n  };\n\n  AjaxAdapter.prototype.query = function (params, callback) {\n    var matches = [];\n    var self = this;\n\n    if (this._request != null) {\n      // JSONP requests cannot always be aborted\n      if (typeof this._request.abort === 'function') {\n        this._request.abort();\n      }\n\n      this._request = null;\n    }\n\n    var options = $.extend({\n      type: 'GET'\n    }, this.ajaxOptions);\n\n    if (typeof options.url === 'function') {\n      options.url = options.url.call(this.$element, params);\n    }\n\n    if (typeof options.data === 'function') {\n      options.data = options.data.call(this.$element, params);\n    }\n\n    function request () {\n      var $request = options.transport(options, function (data) {\n        var results = self.processResults(data, params);\n\n        if (self.options.get('debug') && window.console && console.error) {\n          // Check to make sure that the response included a `results` key.\n          if (!results || !results.results || !Array.isArray(results.results)) {\n            console.error(\n              'Select2: The AJAX results did not return an array in the ' +\n              '`results` key of the response.'\n            );\n          }\n        }\n\n        callback(results);\n      }, function () {\n        // Attempt to detect if a request was aborted\n        // Only works if the transport exposes a status property\n        if ('status' in $request &&\n            ($request.status === 0 || $request.status === '0')) {\n          return;\n        }\n\n        self.trigger('results:message', {\n          message: 'errorLoading'\n        });\n      });\n\n      self._request = $request;\n    }\n\n    if (this.ajaxOptions.delay && params.term != null) {\n      if (this._queryTimeout) {\n        window.clearTimeout(this._queryTimeout);\n      }\n\n      this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);\n    } else {\n      request();\n    }\n  };\n\n  return AjaxAdapter;\n});\n\nS2.define('select2/data/tags',[\n  'jquery'\n], function ($) {\n  function Tags (decorated, $element, options) {\n    var tags = options.get('tags');\n\n    var createTag = options.get('createTag');\n\n    if (createTag !== undefined) {\n      this.createTag = createTag;\n    }\n\n    var insertTag = options.get('insertTag');\n\n    if (insertTag !== undefined) {\n        this.insertTag = insertTag;\n    }\n\n    decorated.call(this, $element, options);\n\n    if (Array.isArray(tags)) {\n      for (var t = 0; t < tags.length; t++) {\n        var tag = tags[t];\n        var item = this._normalizeItem(tag);\n\n        var $option = this.option(item);\n\n        this.$element.append($option);\n      }\n    }\n  }\n\n  Tags.prototype.query = function (decorated, params, callback) {\n    var self = this;\n\n    this._removeOldTags();\n\n    if (params.term == null || params.page != null) {\n      decorated.call(this, params, callback);\n      return;\n    }\n\n    function wrapper (obj, child) {\n      var data = obj.results;\n\n      for (var i = 0; i < data.length; i++) {\n        var option = data[i];\n\n        var checkChildren = (\n          option.children != null &&\n          !wrapper({\n            results: option.children\n          }, true)\n        );\n\n        var optionText = (option.text || '').toUpperCase();\n        var paramsTerm = (params.term || '').toUpperCase();\n\n        var checkText = optionText === paramsTerm;\n\n        if (checkText || checkChildren) {\n          if (child) {\n            return false;\n          }\n\n          obj.data = data;\n          callback(obj);\n\n          return;\n        }\n      }\n\n      if (child) {\n        return true;\n      }\n\n      var tag = self.createTag(params);\n\n      if (tag != null) {\n        var $option = self.option(tag);\n        $option.attr('data-select2-tag', 'true');\n\n        self.addOptions([$option]);\n\n        self.insertTag(data, tag);\n      }\n\n      obj.results = data;\n\n      callback(obj);\n    }\n\n    decorated.call(this, params, wrapper);\n  };\n\n  Tags.prototype.createTag = function (decorated, params) {\n    if (params.term == null) {\n      return null;\n    }\n\n    var term = params.term.trim();\n\n    if (term === '') {\n      return null;\n    }\n\n    return {\n      id: term,\n      text: term\n    };\n  };\n\n  Tags.prototype.insertTag = function (_, data, tag) {\n    data.unshift(tag);\n  };\n\n  Tags.prototype._removeOldTags = function (_) {\n    var $options = this.$element.find('option[data-select2-tag]');\n\n    $options.each(function () {\n      if (this.selected) {\n        return;\n      }\n\n      $(this).remove();\n    });\n  };\n\n  return Tags;\n});\n\nS2.define('select2/data/tokenizer',[\n  'jquery'\n], function ($) {\n  function Tokenizer (decorated, $element, options) {\n    var tokenizer = options.get('tokenizer');\n\n    if (tokenizer !== undefined) {\n      this.tokenizer = tokenizer;\n    }\n\n    decorated.call(this, $element, options);\n  }\n\n  Tokenizer.prototype.bind = function (decorated, container, $container) {\n    decorated.call(this, container, $container);\n\n    this.$search =  container.dropdown.$search || container.selection.$search ||\n      $container.find('.select2-search__field');\n  };\n\n  Tokenizer.prototype.query = function (decorated, params, callback) {\n    var self = this;\n\n    function createAndSelect (data) {\n      // Normalize the data object so we can use it for checks\n      var item = self._normalizeItem(data);\n\n      // Check if the data object already exists as a tag\n      // Select it if it doesn't\n      var $existingOptions = self.$element.find('option').filter(function () {\n        return $(this).val() === item.id;\n      });\n\n      // If an existing option wasn't found for it, create the option\n      if (!$existingOptions.length) {\n        var $option = self.option(item);\n        $option.attr('data-select2-tag', true);\n\n        self._removeOldTags();\n        self.addOptions([$option]);\n      }\n\n      // Select the item, now that we know there is an option for it\n      select(item);\n    }\n\n    function select (data) {\n      self.trigger('select', {\n        data: data\n      });\n    }\n\n    params.term = params.term || '';\n\n    var tokenData = this.tokenizer(params, this.options, createAndSelect);\n\n    if (tokenData.term !== params.term) {\n      // Replace the search term if we have the search box\n      if (this.$search.length) {\n        this.$search.val(tokenData.term);\n        this.$search.trigger('focus');\n      }\n\n      params.term = tokenData.term;\n    }\n\n    decorated.call(this, params, callback);\n  };\n\n  Tokenizer.prototype.tokenizer = function (_, params, options, callback) {\n    var separators = options.get('tokenSeparators') || [];\n    var term = params.term;\n    var i = 0;\n\n    var createTag = this.createTag || function (params) {\n      return {\n        id: params.term,\n        text: params.term\n      };\n    };\n\n    while (i < term.length) {\n      var termChar = term[i];\n\n      if (separators.indexOf(termChar) === -1) {\n        i++;\n\n        continue;\n      }\n\n      var part = term.substr(0, i);\n      var partParams = $.extend({}, params, {\n        term: part\n      });\n\n      var data = createTag(partParams);\n\n      if (data == null) {\n        i++;\n        continue;\n      }\n\n      callback(data);\n\n      // Reset the term to not include the tokenized portion\n      term = term.substr(i + 1) || '';\n      i = 0;\n    }\n\n    return {\n      term: term\n    };\n  };\n\n  return Tokenizer;\n});\n\nS2.define('select2/data/minimumInputLength',[\n\n], function () {\n  function MinimumInputLength (decorated, $e, options) {\n    this.minimumInputLength = options.get('minimumInputLength');\n\n    decorated.call(this, $e, options);\n  }\n\n  MinimumInputLength.prototype.query = function (decorated, params, callback) {\n    params.term = params.term || '';\n\n    if (params.term.length < this.minimumInputLength) {\n      this.trigger('results:message', {\n        message: 'inputTooShort',\n        args: {\n          minimum: this.minimumInputLength,\n          input: params.term,\n          params: params\n        }\n      });\n\n      return;\n    }\n\n    decorated.call(this, params, callback);\n  };\n\n  return MinimumInputLength;\n});\n\nS2.define('select2/data/maximumInputLength',[\n\n], function () {\n  function MaximumInputLength (decorated, $e, options) {\n    this.maximumInputLength = options.get('maximumInputLength');\n\n    decorated.call(this, $e, options);\n  }\n\n  MaximumInputLength.prototype.query = function (decorated, params, callback) {\n    params.term = params.term || '';\n\n    if (this.maximumInputLength > 0 &&\n        params.term.length > this.maximumInputLength) {\n      this.trigger('results:message', {\n        message: 'inputTooLong',\n        args: {\n          maximum: this.maximumInputLength,\n          input: params.term,\n          params: params\n        }\n      });\n\n      return;\n    }\n\n    decorated.call(this, params, callback);\n  };\n\n  return MaximumInputLength;\n});\n\nS2.define('select2/data/maximumSelectionLength',[\n\n], function (){\n  function MaximumSelectionLength (decorated, $e, options) {\n    this.maximumSelectionLength = options.get('maximumSelectionLength');\n\n    decorated.call(this, $e, options);\n  }\n\n  MaximumSelectionLength.prototype.bind =\n    function (decorated, container, $container) {\n      var self = this;\n\n      decorated.call(this, container, $container);\n\n      container.on('select', function () {\n        self._checkIfMaximumSelected();\n      });\n  };\n\n  MaximumSelectionLength.prototype.query =\n    function (decorated, params, callback) {\n      var self = this;\n\n      this._checkIfMaximumSelected(function () {\n        decorated.call(self, params, callback);\n      });\n  };\n\n  MaximumSelectionLength.prototype._checkIfMaximumSelected =\n    function (_, successCallback) {\n      var self = this;\n\n      this.current(function (currentData) {\n        var count = currentData != null ? currentData.length : 0;\n        if (self.maximumSelectionLength > 0 &&\n          count >= self.maximumSelectionLength) {\n          self.trigger('results:message', {\n            message: 'maximumSelected',\n            args: {\n              maximum: self.maximumSelectionLength\n            }\n          });\n          return;\n        }\n\n        if (successCallback) {\n          successCallback();\n        }\n      });\n  };\n\n  return MaximumSelectionLength;\n});\n\nS2.define('select2/dropdown',[\n  'jquery',\n  './utils'\n], function ($, Utils) {\n  function Dropdown ($element, options) {\n    this.$element = $element;\n    this.options = options;\n\n    Dropdown.__super__.constructor.call(this);\n  }\n\n  Utils.Extend(Dropdown, Utils.Observable);\n\n  Dropdown.prototype.render = function () {\n    var $dropdown = $(\n      '<span class=\"select2-dropdown\">' +\n        '<span class=\"select2-results\"></span>' +\n      '</span>'\n    );\n\n    $dropdown.attr('dir', this.options.get('dir'));\n\n    this.$dropdown = $dropdown;\n\n    return $dropdown;\n  };\n\n  Dropdown.prototype.bind = function () {\n    // Should be implemented in subclasses\n  };\n\n  Dropdown.prototype.position = function ($dropdown, $container) {\n    // Should be implemented in subclasses\n  };\n\n  Dropdown.prototype.destroy = function () {\n    // Remove the dropdown from the DOM\n    this.$dropdown.remove();\n  };\n\n  return Dropdown;\n});\n\nS2.define('select2/dropdown/search',[\n  'jquery'\n], function ($) {\n  function Search () { }\n\n  Search.prototype.render = function (decorated) {\n    var $rendered = decorated.call(this);\n    var searchLabel = this.options.get('translations').get('search');\n\n    var $search = $(\n      '<span class=\"select2-search select2-search--dropdown\">' +\n        '<input class=\"select2-search__field\" type=\"search\" tabindex=\"-1\"' +\n        ' autocorrect=\"off\" autocapitalize=\"none\"' +\n        ' spellcheck=\"false\" role=\"searchbox\" aria-autocomplete=\"list\" />' +\n      '</span>'\n    );\n\n    this.$searchContainer = $search;\n    this.$search = $search.find('input');\n\n    this.$search.prop('autocomplete', this.options.get('autocomplete'));\n    this.$search.attr('aria-label', searchLabel());\n\n    $rendered.prepend($search);\n\n    return $rendered;\n  };\n\n  Search.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    var resultsId = container.id + '-results';\n\n    decorated.call(this, container, $container);\n\n    this.$search.on('keydown', function (evt) {\n      self.trigger('keypress', evt);\n\n      self._keyUpPrevented = evt.isDefaultPrevented();\n    });\n\n    // Workaround for browsers which do not support the `input` event\n    // This will prevent double-triggering of events for browsers which support\n    // both the `keyup` and `input` events.\n    this.$search.on('input', function (evt) {\n      // Unbind the duplicated `keyup` event\n      $(this).off('keyup');\n    });\n\n    this.$search.on('keyup input', function (evt) {\n      self.handleSearch(evt);\n    });\n\n    container.on('open', function () {\n      self.$search.attr('tabindex', 0);\n      self.$search.attr('aria-controls', resultsId);\n\n      self.$search.trigger('focus');\n\n      window.setTimeout(function () {\n        self.$search.trigger('focus');\n      }, 0);\n    });\n\n    container.on('close', function () {\n      self.$search.attr('tabindex', -1);\n      self.$search.removeAttr('aria-controls');\n      self.$search.removeAttr('aria-activedescendant');\n\n      self.$search.val('');\n      self.$search.trigger('blur');\n    });\n\n    container.on('focus', function () {\n      if (!container.isOpen()) {\n        self.$search.trigger('focus');\n      }\n    });\n\n    container.on('results:all', function (params) {\n      if (params.query.term == null || params.query.term === '') {\n        var showSearch = self.showSearch(params);\n\n        if (showSearch) {\n          self.$searchContainer[0].classList.remove('select2-search--hide');\n        } else {\n          self.$searchContainer[0].classList.add('select2-search--hide');\n        }\n      }\n    });\n\n    container.on('results:focus', function (params) {\n      if (params.data._resultId) {\n        self.$search.attr('aria-activedescendant', params.data._resultId);\n      } else {\n        self.$search.removeAttr('aria-activedescendant');\n      }\n    });\n  };\n\n  Search.prototype.handleSearch = function (evt) {\n    if (!this._keyUpPrevented) {\n      var input = this.$search.val();\n\n      this.trigger('query', {\n        term: input\n      });\n    }\n\n    this._keyUpPrevented = false;\n  };\n\n  Search.prototype.showSearch = function (_, params) {\n    return true;\n  };\n\n  return Search;\n});\n\nS2.define('select2/dropdown/hidePlaceholder',[\n\n], function () {\n  function HidePlaceholder (decorated, $element, options, dataAdapter) {\n    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));\n\n    decorated.call(this, $element, options, dataAdapter);\n  }\n\n  HidePlaceholder.prototype.append = function (decorated, data) {\n    data.results = this.removePlaceholder(data.results);\n\n    decorated.call(this, data);\n  };\n\n  HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) {\n    if (typeof placeholder === 'string') {\n      placeholder = {\n        id: '',\n        text: placeholder\n      };\n    }\n\n    return placeholder;\n  };\n\n  HidePlaceholder.prototype.removePlaceholder = function (_, data) {\n    var modifiedData = data.slice(0);\n\n    for (var d = data.length - 1; d >= 0; d--) {\n      var item = data[d];\n\n      if (this.placeholder.id === item.id) {\n        modifiedData.splice(d, 1);\n      }\n    }\n\n    return modifiedData;\n  };\n\n  return HidePlaceholder;\n});\n\nS2.define('select2/dropdown/infiniteScroll',[\n  'jquery'\n], function ($) {\n  function InfiniteScroll (decorated, $element, options, dataAdapter) {\n    this.lastParams = {};\n\n    decorated.call(this, $element, options, dataAdapter);\n\n    this.$loadingMore = this.createLoadingMore();\n    this.loading = false;\n  }\n\n  InfiniteScroll.prototype.append = function (decorated, data) {\n    this.$loadingMore.remove();\n    this.loading = false;\n\n    decorated.call(this, data);\n\n    if (this.showLoadingMore(data)) {\n      this.$results.append(this.$loadingMore);\n      this.loadMoreIfNeeded();\n    }\n  };\n\n  InfiniteScroll.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    container.on('query', function (params) {\n      self.lastParams = params;\n      self.loading = true;\n    });\n\n    container.on('query:append', function (params) {\n      self.lastParams = params;\n      self.loading = true;\n    });\n\n    this.$results.on('scroll', this.loadMoreIfNeeded.bind(this));\n  };\n\n  InfiniteScroll.prototype.loadMoreIfNeeded = function () {\n    var isLoadMoreVisible = $.contains(\n      document.documentElement,\n      this.$loadingMore[0]\n    );\n\n    if (this.loading || !isLoadMoreVisible) {\n      return;\n    }\n\n    var currentOffset = this.$results.offset().top +\n      this.$results.outerHeight(false);\n    var loadingMoreOffset = this.$loadingMore.offset().top +\n      this.$loadingMore.outerHeight(false);\n\n    if (currentOffset + 50 >= loadingMoreOffset) {\n      this.loadMore();\n    }\n  };\n\n  InfiniteScroll.prototype.loadMore = function () {\n    this.loading = true;\n\n    var params = $.extend({}, {page: 1}, this.lastParams);\n\n    params.page++;\n\n    this.trigger('query:append', params);\n  };\n\n  InfiniteScroll.prototype.showLoadingMore = function (_, data) {\n    return data.pagination && data.pagination.more;\n  };\n\n  InfiniteScroll.prototype.createLoadingMore = function () {\n    var $option = $(\n      '<li ' +\n      'class=\"select2-results__option select2-results__option--load-more\"' +\n      'role=\"option\" aria-disabled=\"true\"></li>'\n    );\n\n    var message = this.options.get('translations').get('loadingMore');\n\n    $option.html(message(this.lastParams));\n\n    return $option;\n  };\n\n  return InfiniteScroll;\n});\n\nS2.define('select2/dropdown/attachBody',[\n  'jquery',\n  '../utils'\n], function ($, Utils) {\n  function AttachBody (decorated, $element, options) {\n    this.$dropdownParent = $(options.get('dropdownParent') || document.body);\n\n    decorated.call(this, $element, options);\n  }\n\n  AttachBody.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    container.on('open', function () {\n      self._showDropdown();\n      self._attachPositioningHandler(container);\n\n      // Must bind after the results handlers to ensure correct sizing\n      self._bindContainerResultHandlers(container);\n    });\n\n    container.on('close', function () {\n      self._hideDropdown();\n      self._detachPositioningHandler(container);\n    });\n\n    this.$dropdownContainer.on('mousedown', function (evt) {\n      evt.stopPropagation();\n    });\n  };\n\n  AttachBody.prototype.destroy = function (decorated) {\n    decorated.call(this);\n\n    this.$dropdownContainer.remove();\n  };\n\n  AttachBody.prototype.position = function (decorated, $dropdown, $container) {\n    // Clone all of the container classes\n    $dropdown.attr('class', $container.attr('class'));\n\n    $dropdown[0].classList.remove('select2');\n    $dropdown[0].classList.add('select2-container--open');\n\n    $dropdown.css({\n      position: 'absolute',\n      top: -999999\n    });\n\n    this.$container = $container;\n  };\n\n  AttachBody.prototype.render = function (decorated) {\n    var $container = $('<span></span>');\n\n    var $dropdown = decorated.call(this);\n    $container.append($dropdown);\n\n    this.$dropdownContainer = $container;\n\n    return $container;\n  };\n\n  AttachBody.prototype._hideDropdown = function (decorated) {\n    this.$dropdownContainer.detach();\n  };\n\n  AttachBody.prototype._bindContainerResultHandlers =\n      function (decorated, container) {\n\n    // These should only be bound once\n    if (this._containerResultsHandlersBound) {\n      return;\n    }\n\n    var self = this;\n\n    container.on('results:all', function () {\n      self._positionDropdown();\n      self._resizeDropdown();\n    });\n\n    container.on('results:append', function () {\n      self._positionDropdown();\n      self._resizeDropdown();\n    });\n\n    container.on('results:message', function () {\n      self._positionDropdown();\n      self._resizeDropdown();\n    });\n\n    container.on('select', function () {\n      self._positionDropdown();\n      self._resizeDropdown();\n    });\n\n    container.on('unselect', function () {\n      self._positionDropdown();\n      self._resizeDropdown();\n    });\n\n    this._containerResultsHandlersBound = true;\n  };\n\n  AttachBody.prototype._attachPositioningHandler =\n      function (decorated, container) {\n    var self = this;\n\n    var scrollEvent = 'scroll.select2.' + container.id;\n    var resizeEvent = 'resize.select2.' + container.id;\n    var orientationEvent = 'orientationchange.select2.' + container.id;\n\n    var $watchers = this.$container.parents().filter(Utils.hasScroll);\n    $watchers.each(function () {\n      Utils.StoreData(this, 'select2-scroll-position', {\n        x: $(this).scrollLeft(),\n        y: $(this).scrollTop()\n      });\n    });\n\n    $watchers.on(scrollEvent, function (ev) {\n      var position = Utils.GetData(this, 'select2-scroll-position');\n      $(this).scrollTop(position.y);\n    });\n\n    $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent,\n      function (e) {\n      self._positionDropdown();\n      self._resizeDropdown();\n    });\n  };\n\n  AttachBody.prototype._detachPositioningHandler =\n      function (decorated, container) {\n    var scrollEvent = 'scroll.select2.' + container.id;\n    var resizeEvent = 'resize.select2.' + container.id;\n    var orientationEvent = 'orientationchange.select2.' + container.id;\n\n    var $watchers = this.$container.parents().filter(Utils.hasScroll);\n    $watchers.off(scrollEvent);\n\n    $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent);\n  };\n\n  AttachBody.prototype._positionDropdown = function () {\n    var $window = $(window);\n\n    var isCurrentlyAbove = this.$dropdown[0].classList\n      .contains('select2-dropdown--above');\n    var isCurrentlyBelow = this.$dropdown[0].classList\n      .contains('select2-dropdown--below');\n\n    var newDirection = null;\n\n    var offset = this.$container.offset();\n\n    offset.bottom = offset.top + this.$container.outerHeight(false);\n\n    var container = {\n      height: this.$container.outerHeight(false)\n    };\n\n    container.top = offset.top;\n    container.bottom = offset.top + container.height;\n\n    var dropdown = {\n      height: this.$dropdown.outerHeight(false)\n    };\n\n    var viewport = {\n      top: $window.scrollTop(),\n      bottom: $window.scrollTop() + $window.height()\n    };\n\n    var enoughRoomAbove = viewport.top < (offset.top - dropdown.height);\n    var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height);\n\n    var css = {\n      left: offset.left,\n      top: container.bottom\n    };\n\n    // Determine what the parent element is to use for calculating the offset\n    var $offsetParent = this.$dropdownParent;\n\n    // For statically positioned elements, we need to get the element\n    // that is determining the offset\n    if ($offsetParent.css('position') === 'static') {\n      $offsetParent = $offsetParent.offsetParent();\n    }\n\n    var parentOffset = {\n      top: 0,\n      left: 0\n    };\n\n    if (\n      $.contains(document.body, $offsetParent[0]) ||\n      $offsetParent[0].isConnected\n      ) {\n      parentOffset = $offsetParent.offset();\n    }\n\n    css.top -= parentOffset.top;\n    css.left -= parentOffset.left;\n\n    if (!isCurrentlyAbove && !isCurrentlyBelow) {\n      newDirection = 'below';\n    }\n\n    if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) {\n      newDirection = 'above';\n    } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) {\n      newDirection = 'below';\n    }\n\n    if (newDirection == 'above' ||\n      (isCurrentlyAbove && newDirection !== 'below')) {\n      css.top = container.top - parentOffset.top - dropdown.height;\n    }\n\n    if (newDirection != null) {\n      this.$dropdown[0].classList.remove('select2-dropdown--below');\n      this.$dropdown[0].classList.remove('select2-dropdown--above');\n      this.$dropdown[0].classList.add('select2-dropdown--' + newDirection);\n\n      this.$container[0].classList.remove('select2-container--below');\n      this.$container[0].classList.remove('select2-container--above');\n      this.$container[0].classList.add('select2-container--' + newDirection);\n    }\n\n    this.$dropdownContainer.css(css);\n  };\n\n  AttachBody.prototype._resizeDropdown = function () {\n    var css = {\n      width: this.$container.outerWidth(false) + 'px'\n    };\n\n    if (this.options.get('dropdownAutoWidth')) {\n      css.minWidth = css.width;\n      css.position = 'relative';\n      css.width = 'auto';\n    }\n\n    this.$dropdown.css(css);\n  };\n\n  AttachBody.prototype._showDropdown = function (decorated) {\n    this.$dropdownContainer.appendTo(this.$dropdownParent);\n\n    this._positionDropdown();\n    this._resizeDropdown();\n  };\n\n  return AttachBody;\n});\n\nS2.define('select2/dropdown/minimumResultsForSearch',[\n\n], function () {\n  function countResults (data) {\n    var count = 0;\n\n    for (var d = 0; d < data.length; d++) {\n      var item = data[d];\n\n      if (item.children) {\n        count += countResults(item.children);\n      } else {\n        count++;\n      }\n    }\n\n    return count;\n  }\n\n  function MinimumResultsForSearch (decorated, $element, options, dataAdapter) {\n    this.minimumResultsForSearch = options.get('minimumResultsForSearch');\n\n    if (this.minimumResultsForSearch < 0) {\n      this.minimumResultsForSearch = Infinity;\n    }\n\n    decorated.call(this, $element, options, dataAdapter);\n  }\n\n  MinimumResultsForSearch.prototype.showSearch = function (decorated, params) {\n    if (countResults(params.data.results) < this.minimumResultsForSearch) {\n      return false;\n    }\n\n    return decorated.call(this, params);\n  };\n\n  return MinimumResultsForSearch;\n});\n\nS2.define('select2/dropdown/selectOnClose',[\n  '../utils'\n], function (Utils) {\n  function SelectOnClose () { }\n\n  SelectOnClose.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    container.on('close', function (params) {\n      self._handleSelectOnClose(params);\n    });\n  };\n\n  SelectOnClose.prototype._handleSelectOnClose = function (_, params) {\n    if (params && params.originalSelect2Event != null) {\n      var event = params.originalSelect2Event;\n\n      // Don't select an item if the close event was triggered from a select or\n      // unselect event\n      if (event._type === 'select' || event._type === 'unselect') {\n        return;\n      }\n    }\n\n    var $highlightedResults = this.getHighlightedResults();\n\n    // Only select highlighted results\n    if ($highlightedResults.length < 1) {\n      return;\n    }\n\n    var data = Utils.GetData($highlightedResults[0], 'data');\n\n    // Don't re-select already selected resulte\n    if (\n      (data.element != null && data.element.selected) ||\n      (data.element == null && data.selected)\n    ) {\n      return;\n    }\n\n    this.trigger('select', {\n        data: data\n    });\n  };\n\n  return SelectOnClose;\n});\n\nS2.define('select2/dropdown/closeOnSelect',[\n\n], function () {\n  function CloseOnSelect () { }\n\n  CloseOnSelect.prototype.bind = function (decorated, container, $container) {\n    var self = this;\n\n    decorated.call(this, container, $container);\n\n    container.on('select', function (evt) {\n      self._selectTriggered(evt);\n    });\n\n    container.on('unselect', function (evt) {\n      self._selectTriggered(evt);\n    });\n  };\n\n  CloseOnSelect.prototype._selectTriggered = function (_, evt) {\n    var originalEvent = evt.originalEvent;\n\n    // Don't close if the control key is being held\n    if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) {\n      return;\n    }\n\n    this.trigger('close', {\n      originalEvent: originalEvent,\n      originalSelect2Event: evt\n    });\n  };\n\n  return CloseOnSelect;\n});\n\nS2.define('select2/dropdown/dropdownCss',[\n  '../utils'\n], function (Utils) {\n  function DropdownCSS () { }\n\n  DropdownCSS.prototype.render = function (decorated) {\n    var $dropdown = decorated.call(this);\n\n    var dropdownCssClass = this.options.get('dropdownCssClass') || '';\n\n    if (dropdownCssClass.indexOf(':all:') !== -1) {\n      dropdownCssClass = dropdownCssClass.replace(':all:', '');\n\n      Utils.copyNonInternalCssClasses($dropdown[0], this.$element[0]);\n    }\n\n    $dropdown.addClass(dropdownCssClass);\n\n    return $dropdown;\n  };\n\n  return DropdownCSS;\n});\n\nS2.define('select2/dropdown/tagsSearchHighlight',[\n  '../utils'\n], function (Utils) {\n  function TagsSearchHighlight () { }\n\n  TagsSearchHighlight.prototype.highlightFirstItem = function (decorated) {\n    var $options = this.$results\n    .find(\n      '.select2-results__option--selectable' +\n      ':not(.select2-results__option--selected)'\n    );\n\n    if ($options.length > 0) {\n      var $firstOption = $options.first();\n      var data = Utils.GetData($firstOption[0], 'data');\n      var firstElement = data.element;\n\n      if (firstElement && firstElement.getAttribute) {\n        if (firstElement.getAttribute('data-select2-tag') === 'true') {\n          $firstOption.trigger('mouseenter');\n\n          return;\n        }\n      }\n    }\n\n    decorated.call(this);\n  };\n\n  return TagsSearchHighlight;\n});\n\nS2.define('select2/i18n/en',[],function () {\n  // English\n  return {\n    errorLoading: function () {\n      return 'The results could not be loaded.';\n    },\n    inputTooLong: function (args) {\n      var overChars = args.input.length - args.maximum;\n\n      var message = 'Please delete ' + overChars + ' character';\n\n      if (overChars != 1) {\n        message += 's';\n      }\n\n      return message;\n    },\n    inputTooShort: function (args) {\n      var remainingChars = args.minimum - args.input.length;\n\n      var message = 'Please enter ' + remainingChars + ' or more characters';\n\n      return message;\n    },\n    loadingMore: function () {\n      return 'Loading more results\u2026';\n    },\n    maximumSelected: function (args) {\n      var message = 'You can only select ' + args.maximum + ' item';\n\n      if (args.maximum != 1) {\n        message += 's';\n      }\n\n      return message;\n    },\n    noResults: function () {\n      return 'No results found';\n    },\n    searching: function () {\n      return 'Searching\u2026';\n    },\n    removeAllItems: function () {\n      return 'Remove all items';\n    },\n    removeItem: function () {\n      return 'Remove item';\n    },\n    search: function() {\n      return 'Search';\n    }\n  };\n});\n\nS2.define('select2/defaults',[\n  'jquery',\n\n  './results',\n\n  './selection/single',\n  './selection/multiple',\n  './selection/placeholder',\n  './selection/allowClear',\n  './selection/search',\n  './selection/selectionCss',\n  './selection/eventRelay',\n\n  './utils',\n  './translation',\n  './diacritics',\n\n  './data/select',\n  './data/array',\n  './data/ajax',\n  './data/tags',\n  './data/tokenizer',\n  './data/minimumInputLength',\n  './data/maximumInputLength',\n  './data/maximumSelectionLength',\n\n  './dropdown',\n  './dropdown/search',\n  './dropdown/hidePlaceholder',\n  './dropdown/infiniteScroll',\n  './dropdown/attachBody',\n  './dropdown/minimumResultsForSearch',\n  './dropdown/selectOnClose',\n  './dropdown/closeOnSelect',\n  './dropdown/dropdownCss',\n  './dropdown/tagsSearchHighlight',\n\n  './i18n/en'\n], function ($,\n\n             ResultsList,\n\n             SingleSelection, MultipleSelection, Placeholder, AllowClear,\n             SelectionSearch, SelectionCSS, EventRelay,\n\n             Utils, Translation, DIACRITICS,\n\n             SelectData, ArrayData, AjaxData, Tags, Tokenizer,\n             MinimumInputLength, MaximumInputLength, MaximumSelectionLength,\n\n             Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll,\n             AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect,\n             DropdownCSS, TagsSearchHighlight,\n\n             EnglishTranslation) {\n  function Defaults () {\n    this.reset();\n  }\n\n  Defaults.prototype.apply = function (options) {\n    options = $.extend(true, {}, this.defaults, options);\n\n    if (options.dataAdapter == null) {\n      if (options.ajax != null) {\n        options.dataAdapter = AjaxData;\n      } else if (options.data != null) {\n        options.dataAdapter = ArrayData;\n      } else {\n        options.dataAdapter = SelectData;\n      }\n\n      if (options.minimumInputLength > 0) {\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          MinimumInputLength\n        );\n      }\n\n      if (options.maximumInputLength > 0) {\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          MaximumInputLength\n        );\n      }\n\n      if (options.maximumSelectionLength > 0) {\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          MaximumSelectionLength\n        );\n      }\n\n      if (options.tags) {\n        options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags);\n      }\n\n      if (options.tokenSeparators != null || options.tokenizer != null) {\n        options.dataAdapter = Utils.Decorate(\n          options.dataAdapter,\n          Tokenizer\n        );\n      }\n    }\n\n    if (options.resultsAdapter == null) {\n      options.resultsAdapter = ResultsList;\n\n      if (options.ajax != null) {\n        options.resultsAdapter = Utils.Decorate(\n          options.resultsAdapter,\n          InfiniteScroll\n        );\n      }\n\n      if (options.placeholder != null) {\n        options.resultsAdapter = Utils.Decorate(\n          options.resultsAdapter,\n          HidePlaceholder\n        );\n      }\n\n      if (options.selectOnClose) {\n        options.resultsAdapter = Utils.Decorate(\n          options.resultsAdapter,\n          SelectOnClose\n        );\n      }\n\n      if (options.tags) {\n        options.resultsAdapter = Utils.Decorate(\n          options.resultsAdapter,\n          TagsSearchHighlight\n        );\n      }\n    }\n\n    if (options.dropdownAdapter == null) {\n      if (options.multiple) {\n        options.dropdownAdapter = Dropdown;\n      } else {\n        var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch);\n\n        options.dropdownAdapter = SearchableDropdown;\n      }\n\n      if (options.minimumResultsForSearch !== 0) {\n        options.dropdownAdapter = Utils.Decorate(\n          options.dropdownAdapter,\n          MinimumResultsForSearch\n        );\n      }\n\n      if (options.closeOnSelect) {\n        options.dropdownAdapter = Utils.Decorate(\n          options.dropdownAdapter,\n          CloseOnSelect\n        );\n      }\n\n      if (options.dropdownCssClass != null) {\n        options.dropdownAdapter = Utils.Decorate(\n          options.dropdownAdapter,\n          DropdownCSS\n        );\n      }\n\n      options.dropdownAdapter = Utils.Decorate(\n        options.dropdownAdapter,\n        AttachBody\n      );\n    }\n\n    if (options.selectionAdapter == null) {\n      if (options.multiple) {\n        options.selectionAdapter = MultipleSelection;\n      } else {\n        options.selectionAdapter = SingleSelection;\n      }\n\n      // Add the placeholder mixin if a placeholder was specified\n      if (options.placeholder != null) {\n        options.selectionAdapter = Utils.Decorate(\n          options.selectionAdapter,\n          Placeholder\n        );\n      }\n\n      if (options.allowClear) {\n        options.selectionAdapter = Utils.Decorate(\n          options.selectionAdapter,\n          AllowClear\n        );\n      }\n\n      if (options.multiple) {\n        options.selectionAdapter = Utils.Decorate(\n          options.selectionAdapter,\n          SelectionSearch\n        );\n      }\n\n      if (options.selectionCssClass != null) {\n        options.selectionAdapter = Utils.Decorate(\n          options.selectionAdapter,\n          SelectionCSS\n        );\n      }\n\n      options.selectionAdapter = Utils.Decorate(\n        options.selectionAdapter,\n        EventRelay\n      );\n    }\n\n    // If the defaults were not previously applied from an element, it is\n    // possible for the language option to have not been resolved\n    options.language = this._resolveLanguage(options.language);\n\n    // Always fall back to English since it will always be complete\n    options.language.push('en');\n\n    var uniqueLanguages = [];\n\n    for (var l = 0; l < options.language.length; l++) {\n      var language = options.language[l];\n\n      if (uniqueLanguages.indexOf(language) === -1) {\n        uniqueLanguages.push(language);\n      }\n    }\n\n    options.language = uniqueLanguages;\n\n    options.translations = this._processTranslations(\n      options.language,\n      options.debug\n    );\n\n    return options;\n  };\n\n  Defaults.prototype.reset = function () {\n    function stripDiacritics (text) {\n      // Used 'uni range + named function' from http://jsperf.com/diacritics/18\n      function match(a) {\n        return DIACRITICS[a] || a;\n      }\n\n      return text.replace(/[^\\u0000-\\u007E]/g, match);\n    }\n\n    function matcher (params, data) {\n      // Always return the object if there is nothing to compare\n      if (params.term == null || params.term.trim() === '') {\n        return data;\n      }\n\n      // Do a recursive check for options with children\n      if (data.children && data.children.length > 0) {\n        // Clone the data object if there are children\n        // This is required as we modify the object to remove any non-matches\n        var match = $.extend(true, {}, data);\n\n        // Check each child of the option\n        for (var c = data.children.length - 1; c >= 0; c--) {\n          var child = data.children[c];\n\n          var matches = matcher(params, child);\n\n          // If there wasn't a match, remove the object in the array\n          if (matches == null) {\n            match.children.splice(c, 1);\n          }\n        }\n\n        // If any children matched, return the new object\n        if (match.children.length > 0) {\n          return match;\n        }\n\n        // If there were no matching children, check just the plain object\n        return matcher(params, match);\n      }\n\n      var original = stripDiacritics(data.text).toUpperCase();\n      var term = stripDiacritics(params.term).toUpperCase();\n\n      // Check if the text contains the term\n      if (original.indexOf(term) > -1) {\n        return data;\n      }\n\n      // If it doesn't contain the term, don't return anything\n      return null;\n    }\n\n    this.defaults = {\n      amdLanguageBase: './i18n/',\n      autocomplete: 'off',\n      closeOnSelect: true,\n      debug: false,\n      dropdownAutoWidth: false,\n      escapeMarkup: Utils.escapeMarkup,\n      language: {},\n      matcher: matcher,\n      minimumInputLength: 0,\n      maximumInputLength: 0,\n      maximumSelectionLength: 0,\n      minimumResultsForSearch: 0,\n      selectOnClose: false,\n      scrollAfterSelect: false,\n      sorter: function (data) {\n        return data;\n      },\n      templateResult: function (result) {\n        return result.text;\n      },\n      templateSelection: function (selection) {\n        return selection.text;\n      },\n      theme: 'default',\n      width: 'resolve'\n    };\n  };\n\n  Defaults.prototype.applyFromElement = function (options, $element) {\n    var optionLanguage = options.language;\n    var defaultLanguage = this.defaults.language;\n    var elementLanguage = $element.prop('lang');\n    var parentLanguage = $element.closest('[lang]').prop('lang');\n\n    var languages = Array.prototype.concat.call(\n      this._resolveLanguage(elementLanguage),\n      this._resolveLanguage(optionLanguage),\n      this._resolveLanguage(defaultLanguage),\n      this._resolveLanguage(parentLanguage)\n    );\n\n    options.language = languages;\n\n    return options;\n  };\n\n  Defaults.prototype._resolveLanguage = function (language) {\n    if (!language) {\n      return [];\n    }\n\n    if ($.isEmptyObject(language)) {\n      return [];\n    }\n\n    if ($.isPlainObject(language)) {\n      return [language];\n    }\n\n    var languages;\n\n    if (!Array.isArray(language)) {\n      languages = [language];\n    } else {\n      languages = language;\n    }\n\n    var resolvedLanguages = [];\n\n    for (var l = 0; l < languages.length; l++) {\n      resolvedLanguages.push(languages[l]);\n\n      if (typeof languages[l] === 'string' && languages[l].indexOf('-') > 0) {\n        // Extract the region information if it is included\n        var languageParts = languages[l].split('-');\n        var baseLanguage = languageParts[0];\n\n        resolvedLanguages.push(baseLanguage);\n      }\n    }\n\n    return resolvedLanguages;\n  };\n\n  Defaults.prototype._processTranslations = function (languages, debug) {\n    var translations = new Translation();\n\n    for (var l = 0; l < languages.length; l++) {\n      var languageData = new Translation();\n\n      var language = languages[l];\n\n      if (typeof language === 'string') {\n        try {\n          // Try to load it with the original name\n          languageData = Translation.loadPath(language);\n        } catch (e) {\n          try {\n            // If we couldn't load it, check if it wasn't the full path\n            language = this.defaults.amdLanguageBase + language;\n            languageData = Translation.loadPath(language);\n          } catch (ex) {\n            // The translation could not be loaded at all. Sometimes this is\n            // because of a configuration problem, other times this can be\n            // because of how Select2 helps load all possible translation files\n            if (debug && window.console && console.warn) {\n              console.warn(\n                'Select2: The language file for \"' + language + '\" could ' +\n                'not be automatically loaded. A fallback will be used instead.'\n              );\n            }\n          }\n        }\n      } else if ($.isPlainObject(language)) {\n        languageData = new Translation(language);\n      } else {\n        languageData = language;\n      }\n\n      translations.extend(languageData);\n    }\n\n    return translations;\n  };\n\n  Defaults.prototype.set = function (key, value) {\n    var camelKey = $.camelCase(key);\n\n    var data = {};\n    data[camelKey] = value;\n\n    var convertedData = Utils._convertData(data);\n\n    $.extend(true, this.defaults, convertedData);\n  };\n\n  var defaults = new Defaults();\n\n  return defaults;\n});\n\nS2.define('select2/options',[\n  'jquery',\n  './defaults',\n  './utils'\n], function ($, Defaults, Utils) {\n  function Options (options, $element) {\n    this.options = options;\n\n    if ($element != null) {\n      this.fromElement($element);\n    }\n\n    if ($element != null) {\n      this.options = Defaults.applyFromElement(this.options, $element);\n    }\n\n    this.options = Defaults.apply(this.options);\n  }\n\n  Options.prototype.fromElement = function ($e) {\n    var excludedData = ['select2'];\n\n    if (this.options.multiple == null) {\n      this.options.multiple = $e.prop('multiple');\n    }\n\n    if (this.options.disabled == null) {\n      this.options.disabled = $e.prop('disabled');\n    }\n\n    if (this.options.autocomplete == null && $e.prop('autocomplete')) {\n      this.options.autocomplete = $e.prop('autocomplete');\n    }\n\n    if (this.options.dir == null) {\n      if ($e.prop('dir')) {\n        this.options.dir = $e.prop('dir');\n      } else if ($e.closest('[dir]').prop('dir')) {\n        this.options.dir = $e.closest('[dir]').prop('dir');\n      } else {\n        this.options.dir = 'ltr';\n      }\n    }\n\n    $e.prop('disabled', this.options.disabled);\n    $e.prop('multiple', this.options.multiple);\n\n    if (Utils.GetData($e[0], 'select2Tags')) {\n      if (this.options.debug && window.console && console.warn) {\n        console.warn(\n          'Select2: The `data-select2-tags` attribute has been changed to ' +\n          'use the `data-data` and `data-tags=\"true\"` attributes and will be ' +\n          'removed in future versions of Select2.'\n        );\n      }\n\n      Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags'));\n      Utils.StoreData($e[0], 'tags', true);\n    }\n\n    if (Utils.GetData($e[0], 'ajaxUrl')) {\n      if (this.options.debug && window.console && console.warn) {\n        console.warn(\n          'Select2: The `data-ajax-url` attribute has been changed to ' +\n          '`data-ajax--url` and support for the old attribute will be removed' +\n          ' in future versions of Select2.'\n        );\n      }\n\n      $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl'));\n      Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl'));\n    }\n\n    var dataset = {};\n\n    function upperCaseLetter(_, letter) {\n      return letter.toUpperCase();\n    }\n\n    // Pre-load all of the attributes which are prefixed with `data-`\n    for (var attr = 0; attr < $e[0].attributes.length; attr++) {\n      var attributeName = $e[0].attributes[attr].name;\n      var prefix = 'data-';\n\n      if (attributeName.substr(0, prefix.length) == prefix) {\n        // Get the contents of the attribute after `data-`\n        var dataName = attributeName.substring(prefix.length);\n\n        // Get the data contents from the consistent source\n        // This is more than likely the jQuery data helper\n        var dataValue = Utils.GetData($e[0], dataName);\n\n        // camelCase the attribute name to match the spec\n        var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter);\n\n        // Store the data attribute contents into the dataset since\n        dataset[camelDataName] = dataValue;\n      }\n    }\n\n    // Prefer the element's `dataset` attribute if it exists\n    // jQuery 1.x does not correctly handle data attributes with multiple dashes\n    if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {\n      dataset = $.extend(true, {}, $e[0].dataset, dataset);\n    }\n\n    // Prefer our internal data cache if it exists\n    var data = $.extend(true, {}, Utils.GetData($e[0]), dataset);\n\n    data = Utils._convertData(data);\n\n    for (var key in data) {\n      if (excludedData.indexOf(key) > -1) {\n        continue;\n      }\n\n      if ($.isPlainObject(this.options[key])) {\n        $.extend(this.options[key], data[key]);\n      } else {\n        this.options[key] = data[key];\n      }\n    }\n\n    return this;\n  };\n\n  Options.prototype.get = function (key) {\n    return this.options[key];\n  };\n\n  Options.prototype.set = function (key, val) {\n    this.options[key] = val;\n  };\n\n  return Options;\n});\n\nS2.define('select2/core',[\n  'jquery',\n  './options',\n  './utils',\n  './keys'\n], function ($, Options, Utils, KEYS) {\n  var Select2 = function ($element, options) {\n    if (Utils.GetData($element[0], 'select2') != null) {\n      Utils.GetData($element[0], 'select2').destroy();\n    }\n\n    this.$element = $element;\n\n    this.id = this._generateId($element);\n\n    options = options || {};\n\n    this.options = new Options(options, $element);\n\n    Select2.__super__.constructor.call(this);\n\n    // Set up the tabindex\n\n    var tabindex = $element.attr('tabindex') || 0;\n    Utils.StoreData($element[0], 'old-tabindex', tabindex);\n    $element.attr('tabindex', '-1');\n\n    // Set up containers and adapters\n\n    var DataAdapter = this.options.get('dataAdapter');\n    this.dataAdapter = new DataAdapter($element, this.options);\n\n    var $container = this.render();\n\n    this._placeContainer($container);\n\n    var SelectionAdapter = this.options.get('selectionAdapter');\n    this.selection = new SelectionAdapter($element, this.options);\n    this.$selection = this.selection.render();\n\n    this.selection.position(this.$selection, $container);\n\n    var DropdownAdapter = this.options.get('dropdownAdapter');\n    this.dropdown = new DropdownAdapter($element, this.options);\n    this.$dropdown = this.dropdown.render();\n\n    this.dropdown.position(this.$dropdown, $container);\n\n    var ResultsAdapter = this.options.get('resultsAdapter');\n    this.results = new ResultsAdapter($element, this.options, this.dataAdapter);\n    this.$results = this.results.render();\n\n    this.results.position(this.$results, this.$dropdown);\n\n    // Bind events\n\n    var self = this;\n\n    // Bind the container to all of the adapters\n    this._bindAdapters();\n\n    // Register any DOM event handlers\n    this._registerDomEvents();\n\n    // Register any internal event handlers\n    this._registerDataEvents();\n    this._registerSelectionEvents();\n    this._registerDropdownEvents();\n    this._registerResultsEvents();\n    this._registerEvents();\n\n    // Set the initial state\n    this.dataAdapter.current(function (initialData) {\n      self.trigger('selection:update', {\n        data: initialData\n      });\n    });\n\n    // Hide the original select\n    $element[0].classList.add('select2-hidden-accessible');\n    $element.attr('aria-hidden', 'true');\n\n    // Synchronize any monitored attributes\n    this._syncAttributes();\n\n    Utils.StoreData($element[0], 'select2', this);\n\n    // Ensure backwards compatibility with $element.data('select2').\n    $element.data('select2', this);\n  };\n\n  Utils.Extend(Select2, Utils.Observable);\n\n  Select2.prototype._generateId = function ($element) {\n    var id = '';\n\n    if ($element.attr('id') != null) {\n      id = $element.attr('id');\n    } else if ($element.attr('name') != null) {\n      id = $element.attr('name') + '-' + Utils.generateChars(2);\n    } else {\n      id = Utils.generateChars(4);\n    }\n\n    id = id.replace(/(:|\\.|\\[|\\]|,)/g, '');\n    id = 'select2-' + id;\n\n    return id;\n  };\n\n  Select2.prototype._placeContainer = function ($container) {\n    $container.insertAfter(this.$element);\n\n    var width = this._resolveWidth(this.$element, this.options.get('width'));\n\n    if (width != null) {\n      $container.css('width', width);\n    }\n  };\n\n  Select2.prototype._resolveWidth = function ($element, method) {\n    var WIDTH = /^width:(([-+]?([0-9]*\\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;\n\n    if (method == 'resolve') {\n      var styleWidth = this._resolveWidth($element, 'style');\n\n      if (styleWidth != null) {\n        return styleWidth;\n      }\n\n      return this._resolveWidth($element, 'element');\n    }\n\n    if (method == 'element') {\n      var elementWidth = $element.outerWidth(false);\n\n      if (elementWidth <= 0) {\n        return 'auto';\n      }\n\n      return elementWidth + 'px';\n    }\n\n    if (method == 'style') {\n      var style = $element.attr('style');\n\n      if (typeof(style) !== 'string') {\n        return null;\n      }\n\n      var attrs = style.split(';');\n\n      for (var i = 0, l = attrs.length; i < l; i = i + 1) {\n        var attr = attrs[i].replace(/\\s/g, '');\n        var matches = attr.match(WIDTH);\n\n        if (matches !== null && matches.length >= 1) {\n          return matches[1];\n        }\n      }\n\n      return null;\n    }\n\n    if (method == 'computedstyle') {\n      var computedStyle = window.getComputedStyle($element[0]);\n\n      return computedStyle.width;\n    }\n\n    return method;\n  };\n\n  Select2.prototype._bindAdapters = function () {\n    this.dataAdapter.bind(this, this.$container);\n    this.selection.bind(this, this.$container);\n\n    this.dropdown.bind(this, this.$container);\n    this.results.bind(this, this.$container);\n  };\n\n  Select2.prototype._registerDomEvents = function () {\n    var self = this;\n\n    this.$element.on('change.select2', function () {\n      self.dataAdapter.current(function (data) {\n        self.trigger('selection:update', {\n          data: data\n        });\n      });\n    });\n\n    this.$element.on('focus.select2', function (evt) {\n      self.trigger('focus', evt);\n    });\n\n    this._syncA = Utils.bind(this._syncAttributes, this);\n    this._syncS = Utils.bind(this._syncSubtree, this);\n\n    this._observer = new window.MutationObserver(function (mutations) {\n      self._syncA();\n      self._syncS(mutations);\n    });\n    this._observer.observe(this.$element[0], {\n      attributes: true,\n      childList: true,\n      subtree: false\n    });\n  };\n\n  Select2.prototype._registerDataEvents = function () {\n    var self = this;\n\n    this.dataAdapter.on('*', function (name, params) {\n      self.trigger(name, params);\n    });\n  };\n\n  Select2.prototype._registerSelectionEvents = function () {\n    var self = this;\n    var nonRelayEvents = ['toggle', 'focus'];\n\n    this.selection.on('toggle', function () {\n      self.toggleDropdown();\n    });\n\n    this.selection.on('focus', function (params) {\n      self.focus(params);\n    });\n\n    this.selection.on('*', function (name, params) {\n      if (nonRelayEvents.indexOf(name) !== -1) {\n        return;\n      }\n\n      self.trigger(name, params);\n    });\n  };\n\n  Select2.prototype._registerDropdownEvents = function () {\n    var self = this;\n\n    this.dropdown.on('*', function (name, params) {\n      self.trigger(name, params);\n    });\n  };\n\n  Select2.prototype._registerResultsEvents = function () {\n    var self = this;\n\n    this.results.on('*', function (name, params) {\n      self.trigger(name, params);\n    });\n  };\n\n  Select2.prototype._registerEvents = function () {\n    var self = this;\n\n    this.on('open', function () {\n      self.$container[0].classList.add('select2-container--open');\n    });\n\n    this.on('close', function () {\n      self.$container[0].classList.remove('select2-container--open');\n    });\n\n    this.on('enable', function () {\n      self.$container[0].classList.remove('select2-container--disabled');\n    });\n\n    this.on('disable', function () {\n      self.$container[0].classList.add('select2-container--disabled');\n    });\n\n    this.on('blur', function () {\n      self.$container[0].classList.remove('select2-container--focus');\n    });\n\n    this.on('query', function (params) {\n      if (!self.isOpen()) {\n        self.trigger('open', {});\n      }\n\n      this.dataAdapter.query(params, function (data) {\n        self.trigger('results:all', {\n          data: data,\n          query: params\n        });\n      });\n    });\n\n    this.on('query:append', function (params) {\n      this.dataAdapter.query(params, function (data) {\n        self.trigger('results:append', {\n          data: data,\n          query: params\n        });\n      });\n    });\n\n    this.on('keypress', function (evt) {\n      var key = evt.which;\n\n      if (self.isOpen()) {\n        if (key === KEYS.ESC || (key === KEYS.UP && evt.altKey)) {\n          self.close(evt);\n\n          evt.preventDefault();\n        } else if (key === KEYS.ENTER || key === KEYS.TAB) {\n          self.trigger('results:select', {});\n\n          evt.preventDefault();\n        } else if ((key === KEYS.SPACE && evt.ctrlKey)) {\n          self.trigger('results:toggle', {});\n\n          evt.preventDefault();\n        } else if (key === KEYS.UP) {\n          self.trigger('results:previous', {});\n\n          evt.preventDefault();\n        } else if (key === KEYS.DOWN) {\n          self.trigger('results:next', {});\n\n          evt.preventDefault();\n        }\n      } else {\n        if (key === KEYS.ENTER || key === KEYS.SPACE ||\n            (key === KEYS.DOWN && evt.altKey)) {\n          self.open();\n\n          evt.preventDefault();\n        }\n      }\n    });\n  };\n\n  Select2.prototype._syncAttributes = function () {\n    this.options.set('disabled', this.$element.prop('disabled'));\n\n    if (this.isDisabled()) {\n      if (this.isOpen()) {\n        this.close();\n      }\n\n      this.trigger('disable', {});\n    } else {\n      this.trigger('enable', {});\n    }\n  };\n\n  Select2.prototype._isChangeMutation = function (mutations) {\n    var self = this;\n\n    if (mutations.addedNodes && mutations.addedNodes.length > 0) {\n      for (var n = 0; n < mutations.addedNodes.length; n++) {\n        var node = mutations.addedNodes[n];\n\n        if (node.selected) {\n          return true;\n        }\n      }\n    } else if (mutations.removedNodes && mutations.removedNodes.length > 0) {\n      return true;\n    } else if (Array.isArray(mutations)) {\n      return mutations.some(function (mutation) {\n        return self._isChangeMutation(mutation);\n      });\n    }\n\n    return false;\n  };\n\n  Select2.prototype._syncSubtree = function (mutations) {\n    var changed = this._isChangeMutation(mutations);\n    var self = this;\n\n    // Only re-pull the data if we think there is a change\n    if (changed) {\n      this.dataAdapter.current(function (currentData) {\n        self.trigger('selection:update', {\n          data: currentData\n        });\n      });\n    }\n  };\n\n  /**\n   * Override the trigger method to automatically trigger pre-events when\n   * there are events that can be prevented.\n   */\n  Select2.prototype.trigger = function (name, args) {\n    var actualTrigger = Select2.__super__.trigger;\n    var preTriggerMap = {\n      'open': 'opening',\n      'close': 'closing',\n      'select': 'selecting',\n      'unselect': 'unselecting',\n      'clear': 'clearing'\n    };\n\n    if (args === undefined) {\n      args = {};\n    }\n\n    if (name in preTriggerMap) {\n      var preTriggerName = preTriggerMap[name];\n      var preTriggerArgs = {\n        prevented: false,\n        name: name,\n        args: args\n      };\n\n      actualTrigger.call(this, preTriggerName, preTriggerArgs);\n\n      if (preTriggerArgs.prevented) {\n        args.prevented = true;\n\n        return;\n      }\n    }\n\n    actualTrigger.call(this, name, args);\n  };\n\n  Select2.prototype.toggleDropdown = function () {\n    if (this.isDisabled()) {\n      return;\n    }\n\n    if (this.isOpen()) {\n      this.close();\n    } else {\n      this.open();\n    }\n  };\n\n  Select2.prototype.open = function () {\n    if (this.isOpen()) {\n      return;\n    }\n\n    if (this.isDisabled()) {\n      return;\n    }\n\n    this.trigger('query', {});\n  };\n\n  Select2.prototype.close = function (evt) {\n    if (!this.isOpen()) {\n      return;\n    }\n\n    this.trigger('close', { originalEvent : evt });\n  };\n\n  /**\n   * Helper method to abstract the \"enabled\" (not \"disabled\") state of this\n   * object.\n   *\n   * @return {true} if the instance is not disabled.\n   * @return {false} if the instance is disabled.\n   */\n  Select2.prototype.isEnabled = function () {\n    return !this.isDisabled();\n  };\n\n  /**\n   * Helper method to abstract the \"disabled\" state of this object.\n   *\n   * @return {true} if the disabled option is true.\n   * @return {false} if the disabled option is false.\n   */\n  Select2.prototype.isDisabled = function () {\n    return this.options.get('disabled');\n  };\n\n  Select2.prototype.isOpen = function () {\n    return this.$container[0].classList.contains('select2-container--open');\n  };\n\n  Select2.prototype.hasFocus = function () {\n    return this.$container[0].classList.contains('select2-container--focus');\n  };\n\n  Select2.prototype.focus = function (data) {\n    // No need to re-trigger focus events if we are already focused\n    if (this.hasFocus()) {\n      return;\n    }\n\n    this.$container[0].classList.add('select2-container--focus');\n    this.trigger('focus', {});\n  };\n\n  Select2.prototype.enable = function (args) {\n    if (this.options.get('debug') && window.console && console.warn) {\n      console.warn(\n        'Select2: The `select2(\"enable\")` method has been deprecated and will' +\n        ' be removed in later Select2 versions. Use $element.prop(\"disabled\")' +\n        ' instead.'\n      );\n    }\n\n    if (args == null || args.length === 0) {\n      args = [true];\n    }\n\n    var disabled = !args[0];\n\n    this.$element.prop('disabled', disabled);\n  };\n\n  Select2.prototype.data = function () {\n    if (this.options.get('debug') &&\n        arguments.length > 0 && window.console && console.warn) {\n      console.warn(\n        'Select2: Data can no longer be set using `select2(\"data\")`. You ' +\n        'should consider setting the value instead using `$element.val()`.'\n      );\n    }\n\n    var data = [];\n\n    this.dataAdapter.current(function (currentData) {\n      data = currentData;\n    });\n\n    return data;\n  };\n\n  Select2.prototype.val = function (args) {\n    if (this.options.get('debug') && window.console && console.warn) {\n      console.warn(\n        'Select2: The `select2(\"val\")` method has been deprecated and will be' +\n        ' removed in later Select2 versions. Use $element.val() instead.'\n      );\n    }\n\n    if (args == null || args.length === 0) {\n      return this.$element.val();\n    }\n\n    var newVal = args[0];\n\n    if (Array.isArray(newVal)) {\n      newVal = newVal.map(function (obj) {\n        return obj.toString();\n      });\n    }\n\n    this.$element.val(newVal).trigger('input').trigger('change');\n  };\n\n  Select2.prototype.destroy = function () {\n    Utils.RemoveData(this.$container[0]);\n    this.$container.remove();\n\n    this._observer.disconnect();\n    this._observer = null;\n\n    this._syncA = null;\n    this._syncS = null;\n\n    this.$element.off('.select2');\n    this.$element.attr('tabindex',\n    Utils.GetData(this.$element[0], 'old-tabindex'));\n\n    this.$element[0].classList.remove('select2-hidden-accessible');\n    this.$element.attr('aria-hidden', 'false');\n    Utils.RemoveData(this.$element[0]);\n    this.$element.removeData('select2');\n\n    this.dataAdapter.destroy();\n    this.selection.destroy();\n    this.dropdown.destroy();\n    this.results.destroy();\n\n    this.dataAdapter = null;\n    this.selection = null;\n    this.dropdown = null;\n    this.results = null;\n  };\n\n  Select2.prototype.render = function () {\n    var $container = $(\n      '<span class=\"select2 select2-container\">' +\n        '<span class=\"selection\"></span>' +\n        '<span class=\"dropdown-wrapper\" aria-hidden=\"true\"></span>' +\n      '</span>'\n    );\n\n    $container.attr('dir', this.options.get('dir'));\n\n    this.$container = $container;\n\n    this.$container[0].classList\n      .add('select2-container--' + this.options.get('theme'));\n\n    Utils.StoreData($container[0], 'element', this.$element);\n\n    return $container;\n  };\n\n  return Select2;\n});\n\nS2.define('jquery-mousewheel',[\n  'jquery'\n], function ($) {\n  // Used to shim jQuery.mousewheel for non-full builds.\n  return $;\n});\n\nS2.define('jquery.select2',[\n  'jquery',\n  'jquery-mousewheel',\n\n  './select2/core',\n  './select2/defaults',\n  './select2/utils'\n], function ($, _, Select2, Defaults, Utils) {\n  if ($.fn.select2 == null) {\n    // All methods that should return the element\n    var thisMethods = ['open', 'close', 'destroy'];\n\n    $.fn.select2 = function (options) {\n      options = options || {};\n\n      if (typeof options === 'object') {\n        this.each(function () {\n          var instanceOptions = $.extend(true, {}, options);\n\n          var instance = new Select2($(this), instanceOptions);\n        });\n\n        return this;\n      } else if (typeof options === 'string') {\n        var ret;\n        var args = Array.prototype.slice.call(arguments, 1);\n\n        this.each(function () {\n          var instance = Utils.GetData(this, 'select2');\n\n          if (instance == null && window.console && console.error) {\n            console.error(\n              'The select2(\\'' + options + '\\') method was called on an ' +\n              'element that is not using Select2.'\n            );\n          }\n\n          ret = instance[options].apply(instance, args);\n        });\n\n        // Check if we should be returning `this`\n        if (thisMethods.indexOf(options) > -1) {\n          return this;\n        }\n\n        return ret;\n      } else {\n        throw new Error('Invalid arguments for Select2: ' + options);\n      }\n    };\n  }\n\n  if ($.fn.select2.defaults == null) {\n    $.fn.select2.defaults = Defaults;\n  }\n\n  return Select2;\n});\n\n  // Return the AMD loader configuration so it can be used outside of this file\n  return {\n    define: S2.define,\n    require: S2.require\n  };\n}());\n\n  // Autoload the jQuery bindings\n  // We know that all of the modules exist above this, so we're safe\n  var select2 = S2.require('jquery.select2');\n\n  // Hold the AMD module references on the jQuery function that was just loaded\n  // This allows Select2 to use the internal loader outside of this file, such\n  // as in the language files.\n  jQuery.fn.select2.amd = S2;\n\n  // Return the Select2 instance for anyone who is importing it.\n  return select2;\n}));\n", "(function (global) {\n    'use strict';\n\n    const util = newUtil();\n    const inliner = newInliner();\n    const fontFaces = newFontFaces();\n    const images = newImages();\n\n    // Default impl options\n    const defaultOptions = {\n        // Default is to copy default styles of elements\n        copyDefaultStyles: true,\n        // Default is to fail on error, no placeholder\n        imagePlaceholder: undefined,\n        // Default cache bust is false, it will use the cache\n        cacheBust: false,\n        // Use (existing) authentication credentials for external URIs (CORS requests)\n        useCredentials: false,\n        // Use (existing) authentication credentials for external URIs (CORS requests) on some filtered requests only\n        useCredentialsFilters: [],\n        // Default resolve timeout\n        httpTimeout: 30000,\n        // Style computation cache tag rules (options are strict, relaxed)\n        styleCaching: 'strict',\n        // Default cors config is to request the image address directly\n        corsImg: undefined,\n        // Callback for adjustClonedNode eventing (to allow adjusting clone's properties)\n        adjustClonedNode: undefined,\n        // Callback to filter style properties to be included in the output\n        filterStyles: undefined,\n    };\n\n    const domtoimage = {\n        toSvg: toSvg,\n        toPng: toPng,\n        toJpeg: toJpeg,\n        toBlob: toBlob,\n        toPixelData: toPixelData,\n        toCanvas: toCanvas,\n        impl: {\n            fontFaces: fontFaces,\n            images: images,\n            util: util,\n            inliner: inliner,\n            urlCache: [],\n            options: {},\n            copyOptions: copyOptions\n        },\n    };\n\n    if (typeof exports === 'object' && typeof module === 'object') {\n        module.exports = domtoimage; // eslint-disable-line no-undef\n    } else {\n        global.domtoimage = domtoimage;\n    }\n\n    // support node and browsers\n    const ELEMENT_NODE =\n        ( Node === undefined ? undefined : Node.ELEMENT_NODE) || 1;\n    const getComputedStyle =\n        ( global === undefined ? undefined : global.getComputedStyle) ||\n        ( window === undefined ? undefined : window.getComputedStyle) ||\n        globalThis.getComputedStyle;\n    const atob =\n        ( global === undefined ? undefined : global.atob) ||\n        ( window === undefined ? undefined : window.atob) ||\n        globalThis.atob;\n\n    /**\n     * @param {Node} node - The DOM Node object to render\n     * @param {Object} options - Rendering options\n     * @param {Function} options.filter - Should return true if passed node should be included in the output\n     *          (excluding node means excluding it's children as well). Not called on the root node.\n     * @param {Function} options.onclone - Callback function which is called when the Document has been cloned for\n     *         rendering, can be used to modify the contents that will be rendered without affecting the original\n     *         source document.\n     * @param {String} options.bgcolor - color for the background, any valid CSS color value.\n     * @param {Number} options.width - width to be applied to node before rendering.\n     * @param {Number} options.height - height to be applied to node before rendering.\n     * @param {Object} options.style - an object whose properties to be copied to node's style before rendering.\n     * @param {Number} options.quality - a Number between 0 and 1 indicating image quality (applicable to JPEG only),\n                defaults to 1.0.\n     * @param {Number} options.scale - a Number multiplier to scale up the canvas before rendering to reduce fuzzy images, defaults to 1.0.\n     * @param {String} options.imagePlaceholder - dataURL to use as a placeholder for failed images, default behaviour is to fail fast on images we can't fetch\n     * @param {Boolean} options.cacheBust - set to true to cache bust by appending the time to the request url\n     * @param {String} options.styleCaching - set to 'strict', 'relaxed' to select style caching rules\n     * @param {Boolean} options.copyDefaultStyles - set to false to disable use of default styles of elements\n     * @param {Boolean} options.disableEmbedFonts - set to true to disable font embedding into the SVG output.\n     * @param {Boolean} options.disableInlineImages - set to true to disable inlining images into the SVG output.\n     * @param {Object} options.corsImg - When the image is restricted by the server from cross-domain requests, the proxy address is passed in to get the image\n     *         - @param {String} url - eg: https://cors-anywhere.herokuapp.com/\n     *         - @param {Enumerator} method - get, post\n     *         - @param {Object} headers - eg: { \"Content-Type\", \"application/json;charset=UTF-8\" }\n     *         - @param {Object} data - post payload\n     * @param {Function} options.adjustClonedNode - callback for adjustClonedNode eventing (to allow adjusting clone's properties)\n     * @param {Function} options.filterStyles - Should return true if passed propertyName should be included in the output\n     * @return {Promise} - A promise that is fulfilled with a SVG image data URL\n     * */\n    function toSvg(node, options) {\n        const ownerWindow = domtoimage.impl.util.getWindow(node);\n        options = options || {};\n        domtoimage.impl.copyOptions(options);\n        const restorations = [];\n\n        return Promise.resolve(node)\n            .then(ensureElement)\n            .then(function (clonee) {\n                return cloneNode(clonee, options, null, ownerWindow);\n            })\n            .then(options.disableEmbedFonts ? Promise.resolve(node) : embedFonts)\n            .then(options.disableInlineImages ? Promise.resolve(node) : inlineImages)\n            .then(applyOptions)\n            .then(makeSvgDataUri)\n            .then(restoreWrappers)\n            .then(clearCache);\n\n        function ensureElement(node) {\n            if (node.nodeType === ELEMENT_NODE) return node;\n\n            const originalChild = node;\n            const wrappingSpan = document.createElement('span');\n            originalChild.replaceWith(wrappingSpan);\n            wrappingSpan.append(node);\n            restorations.push({\n                child: originalChild,\n                wrapper: wrappingSpan,\n            });\n            return wrappingSpan;\n        }\n\n        function restoreWrappers(result) {\n            // put the original children back where the wrappers were inserted\n            while (restorations.length > 0) {\n                const restoration = restorations.pop();\n                restoration.wrapper.replaceWith(restoration.child);\n            }\n\n            return result;\n        }\n\n        function clearCache(result) {\n            domtoimage.impl.urlCache = [];\n            removeSandbox();\n            return result;\n        }\n\n        function applyOptions(clone) {\n            if (options.bgcolor) {\n                clone.style.backgroundColor = options.bgcolor;\n            }\n            if (options.width) {\n                clone.style.width = `${options.width}px`;\n            }\n            if (options.height) {\n                clone.style.height = `${options.height}px`;\n            }\n            if (options.style) {\n                Object.keys(options.style).forEach(function (property) {\n                    clone.style[property] = options.style[property];\n                });\n            }\n\n            let onCloneResult = null;\n\n            if (typeof options.onclone === 'function') {\n                onCloneResult = options.onclone(clone);\n            }\n\n            return Promise.resolve(onCloneResult).then(function () {\n                return clone;\n            });\n        }\n\n        function makeSvgDataUri(clone) {\n            const width = options.width || util.width(node);\n            const height = options.height || util.height(node);\n\n            return Promise.resolve(clone)\n                .then(function (svg) {\n                    svg.setAttribute('xmlns', 'http://www.w3.org/1999/xhtml');\n                    return new XMLSerializer().serializeToString(svg);\n                })\n                .then(util.escapeXhtml)\n                .then(function (xhtml) {\n                    const foreignObjectSizing =\n                        (util.isDimensionMissing(width)\n                            ? ' width=\"100%\"'\n                            : ` width=\"${width}\"`) +\n                        (util.isDimensionMissing(height)\n                            ? ' height=\"100%\"'\n                            : ` height=\"${height}\"`);\n                    const svgSizing =\n                        (util.isDimensionMissing(width) ? '' : ` width=\"${width}\"`) +\n                        (util.isDimensionMissing(height) ? '' : ` height=\"${height}\"`);\n                    return `<svg xmlns=\"http://www.w3.org/2000/svg\"${svgSizing}><foreignObject${foreignObjectSizing}>${xhtml}</foreignObject></svg>`;\n                })\n                .then(function (svg) {\n                    return `data:image/svg+xml;charset=utf-8,${svg}`;\n                });\n        }\n    }\n\n    /**\n     * @param {Node} node - The DOM Node object to render\n     * @param {Object} options - Rendering options, @see {@link toSvg}\n     * @return {Promise} - A promise that is fulfilled with a Uint8Array containing RGBA pixel data.\n     * */\n    function toPixelData(node, options) {\n        return draw(node, options).then(function (canvas) {\n            return canvas\n                .getContext('2d')\n                .getImageData(0, 0, util.width(node), util.height(node)).data;\n        });\n    }\n\n    /**\n     * @param {Node} node - The DOM Node object to render\n     * @param {Object} options - Rendering options, @see {@link toSvg}\n     * @return {Promise} - A promise that is fulfilled with a PNG image data URL\n     * */\n    function toPng(node, options) {\n        return draw(node, options).then(function (canvas) {\n            return canvas.toDataURL();\n        });\n    }\n\n    /**\n     * @param {Node} node - The DOM Node object to render\n     * @param {Object} options - Rendering options, @see {@link toSvg}\n     * @return {Promise} - A promise that is fulfilled with a JPEG image data URL\n     * */\n    function toJpeg(node, options) {\n        return draw(node, options).then(function (canvas) {\n            return canvas.toDataURL(\n                'image/jpeg',\n                (options ? options.quality : undefined) || 1.0\n            );\n        });\n    }\n\n    /**\n     * @param {Node} node - The DOM Node object to render\n     * @param {Object} options - Rendering options, @see {@link toSvg}\n     * @return {Promise} - A promise that is fulfilled with a PNG image blob\n     * */\n    function toBlob(node, options) {\n        return draw(node, options).then(util.canvasToBlob);\n    }\n\n    /**\n     * @param {Node} node - The DOM Node object to render\n     * @param {Object} options - Rendering options, @see {@link toSvg}\n     * @return {Promise} - A promise that is fulfilled with a canvas object\n     * */\n    function toCanvas(node, options) {\n        return draw(node, options);\n    }\n\n    function copyOptions(options) {\n        // Copy options to impl options for use in impl\n        if (options.copyDefaultStyles === undefined) {\n            domtoimage.impl.options.copyDefaultStyles = defaultOptions.copyDefaultStyles;\n        } else {\n            domtoimage.impl.options.copyDefaultStyles = options.copyDefaultStyles;\n        }\n\n        if (options.imagePlaceholder === undefined) {\n            domtoimage.impl.options.imagePlaceholder = defaultOptions.imagePlaceholder;\n        } else {\n            domtoimage.impl.options.imagePlaceholder = options.imagePlaceholder;\n        }\n\n        if (options.cacheBust === undefined) {\n            domtoimage.impl.options.cacheBust = defaultOptions.cacheBust;\n        } else {\n            domtoimage.impl.options.cacheBust = options.cacheBust;\n        }\n\n        if (options.corsImg === undefined) {\n            domtoimage.impl.options.corsImg = defaultOptions.corsImg;\n        } else {\n            domtoimage.impl.options.corsImg = options.corsImg;\n        }\n\n        if (options.useCredentials === undefined) {\n            domtoimage.impl.options.useCredentials = defaultOptions.useCredentials;\n        } else {\n            domtoimage.impl.options.useCredentials = options.useCredentials;\n        }\n\n        if (options.useCredentialsFilters === undefined) {\n            domtoimage.impl.options.useCredentialsFilters =\n                defaultOptions.useCredentialsFilters;\n        } else {\n            domtoimage.impl.options.useCredentialsFilters = options.useCredentialsFilters;\n        }\n\n        if (options.httpTimeout === undefined) {\n            domtoimage.impl.options.httpTimeout = defaultOptions.httpTimeout;\n        } else {\n            domtoimage.impl.options.httpTimeout = options.httpTimeout;\n        }\n\n        if (options.styleCaching === undefined) {\n            domtoimage.impl.options.styleCaching = defaultOptions.styleCaching;\n        } else {\n            domtoimage.impl.options.styleCaching = options.styleCaching;\n        }\n    }\n\n    function draw(domNode, options) {\n        options = options || {};\n        return toSvg(domNode, options)\n            .then(util.makeImage)\n            .then(function (image) {\n                const scale = typeof options.scale !== 'number' ? 1 : options.scale;\n                const canvas = newCanvas(domNode, scale);\n                const ctx = canvas.getContext('2d');\n                ctx.msImageSmoothingEnabled = false;\n                ctx.imageSmoothingEnabled = false;\n                if (image) {\n                    ctx.scale(scale, scale);\n                    ctx.drawImage(image, 0, 0);\n                }\n                return canvas;\n            });\n\n        function newCanvas(node, scale) {\n            let width = options.width || util.width(node);\n            let height = options.height || util.height(node);\n\n            // per https://www.w3.org/TR/CSS2/visudet.html#inline-replaced-width the default width should be 300px if height\n            // not set, otherwise should be 2:1 aspect ratio for whatever height is specified\n            if (util.isDimensionMissing(width)) {\n                width = util.isDimensionMissing(height) ? 300 : height * 2.0;\n            }\n\n            if (util.isDimensionMissing(height)) {\n                height = width / 2.0;\n            }\n\n            const canvas = document.createElement('canvas');\n            canvas.width = width * scale;\n            canvas.height = height * scale;\n\n            if (options.bgcolor) {\n                const ctx = canvas.getContext('2d');\n                ctx.fillStyle = options.bgcolor;\n                ctx.fillRect(0, 0, canvas.width, canvas.height);\n            }\n\n            return canvas;\n        }\n    }\n\n    let sandbox = null;\n\n    function cloneNode(node, options, parentComputedStyles, ownerWindow) {\n        const filter = options.filter;\n        if (\n            node === sandbox ||\n            util.isHTMLScriptElement(node) ||\n            util.isHTMLStyleElement(node) ||\n            util.isHTMLLinkElement(node) ||\n            (parentComputedStyles !== null && filter && !filter(node))\n        ) {\n            return Promise.resolve();\n        }\n\n        return Promise.resolve(node)\n            .then(makeNodeCopy)\n            .then(adjustCloneBefore)\n            .then(function (clone) {\n                return cloneChildren(clone, getParentOfChildren(node));\n            })\n            .then(adjustCloneAfter)\n            .then(function (clone) {\n                return processClone(clone, node);\n            });\n\n        function makeNodeCopy(original) {\n            if (util.isHTMLCanvasElement(original)) {\n                return util.makeImage(original.toDataURL());\n            }\n            return original.cloneNode(false);\n        }\n\n        function adjustCloneBefore(clone) {\n            if (options.adjustClonedNode) {\n                options.adjustClonedNode(node, clone, false);\n            }\n            return Promise.resolve(clone);\n        }\n\n        function adjustCloneAfter(clone) {\n            if (options.adjustClonedNode) {\n                options.adjustClonedNode(node, clone, true);\n            }\n            return Promise.resolve(clone);\n        }\n\n        function getParentOfChildren(original) {\n            if (util.isElementHostForOpenShadowRoot(original)) {\n                return original.shadowRoot; // jump \"down\" to #shadow-root\n            }\n            return original;\n        }\n\n        function cloneChildren(clone, original) {\n            const originalChildren = getRenderedChildren(original);\n            let done = Promise.resolve();\n\n            if (originalChildren.length !== 0) {\n                const originalComputedStyles = getComputedStyle(\n                    getRenderedParent(original)\n                );\n\n                util.asArray(originalChildren).forEach(function (originalChild) {\n                    done = done.then(function () {\n                        return cloneNode(\n                            originalChild,\n                            options,\n                            originalComputedStyles,\n                            ownerWindow\n                        ).then(function (clonedChild) {\n                            if (clonedChild) {\n                                clone.appendChild(clonedChild);\n                            }\n                        });\n                    });\n                });\n            }\n\n            return done.then(function () {\n                return clone;\n            });\n\n            function getRenderedParent(original) {\n                if (util.isShadowRoot(original)) {\n                    return original.host; // jump up from #shadow-root to its parent <element>\n                }\n                return original;\n            }\n\n            function getRenderedChildren(original) {\n                if (util.isShadowSlotElement(original)) {\n                    const assignedNodes = original.assignedNodes();\n\n                    if (assignedNodes && assignedNodes.length > 0) return assignedNodes; // shadow DOM <slot> has \"assigned nodes\" as rendered children\n                }\n                return original.childNodes;\n            }\n        }\n\n        function processClone(clone, original) {\n            if (!util.isElement(clone) || util.isShadowSlotElement(original)) {\n                return Promise.resolve(clone);\n            }\n\n            return Promise.resolve()\n                .then(cloneStyle)\n                .then(clonePseudoElements)\n                .then(copyUserInput)\n                .then(fixSvg)\n                .then(fixResponsiveImages)\n                .then(function () {\n                    return clone;\n                });\n\n            function fixResponsiveImages() {\n                if (util.isHTMLImageElement(clone))\n                {\n                    // Remove lazy-loading and responsive attributes\n                    clone.removeAttribute('loading');\n\n                    // If the original had srcset or sizes, set src to the resolved image\n                    if (original.srcset || original.sizes) {\n                        clone.removeAttribute('srcset');\n                        clone.removeAttribute('sizes');\n\n                        // Use currentSrc if available, otherwise fallback to src\n                        clone.src = original.currentSrc || original.src;\n                    }\n                }\n            }\n\n            function cloneStyle() {\n                copyStyle(original, clone);\n\n                function copyFont(source, target) {\n                    target.font = source.font;\n                    target.fontFamily = source.fontFamily;\n                    target.fontFeatureSettings = source.fontFeatureSettings;\n                    target.fontKerning = source.fontKerning;\n                    target.fontSize = source.fontSize;\n                    target.fontStretch = source.fontStretch;\n                    target.fontStyle = source.fontStyle;\n                    target.fontVariant = source.fontVariant;\n                    target.fontVariantCaps = source.fontVariantCaps;\n                    target.fontVariantEastAsian = source.fontVariantEastAsian;\n                    target.fontVariantLigatures = source.fontVariantLigatures;\n                    target.fontVariantNumeric = source.fontVariantNumeric;\n                    target.fontVariationSettings = source.fontVariationSettings;\n                    target.fontWeight = source.fontWeight;\n                }\n\n                function copyStyle(sourceElement, targetElement) {\n                    const sourceComputedStyles = getComputedStyle(sourceElement);\n                    if (sourceComputedStyles.cssText) {\n                        targetElement.style.cssText = sourceComputedStyles.cssText;\n                        copyFont(sourceComputedStyles, targetElement.style); // here we re-assign the font props.\n                    } else {\n                        copyUserComputedStyleFast(\n                            options,\n                            sourceElement,\n                            sourceComputedStyles,\n                            parentComputedStyles,\n                            targetElement\n                        );\n\n                        // Remove positioning of initial element, which stops them from being captured correctly\n                        if (parentComputedStyles === null) {\n                            [\n                                'inset-block',\n                                'inset-block-start',\n                                'inset-block-end',\n                            ].forEach((prop) => targetElement.style.removeProperty(prop));\n                            ['left', 'right', 'top', 'bottom'].forEach((prop) => {\n                                if (targetElement.style.getPropertyValue(prop)) {\n                                    targetElement.style.setProperty(prop, '0px');\n                                }\n                            });\n                        }\n                    }\n                }\n            }\n\n            function clonePseudoElements() {\n                const cloneClassName = util.uid();\n\n                [':before', ':after'].forEach(function (element) {\n                    clonePseudoElement(element);\n                });\n\n                function clonePseudoElement(element) {\n                    const style = getComputedStyle(original, element);\n                    const content = style.getPropertyValue('content');\n\n                    if (content === '' || content === 'none') {\n                        return;\n                    }\n\n                    const currentClass = clone.getAttribute('class') || '';\n                    clone.setAttribute('class', `${currentClass} ${cloneClassName}`);\n\n                    const styleElement = document.createElement('style');\n                    styleElement.appendChild(formatPseudoElementStyle());\n                    clone.appendChild(styleElement);\n\n                    function formatPseudoElementStyle() {\n                        const selector = `.${cloneClassName}:${element}`;\n                        const cssText = style.cssText\n                            ? formatCssText()\n                            : formatCssProperties();\n\n                        return document.createTextNode(`${selector}{${cssText}}`);\n\n                        function formatCssText() {\n                            return `${style.cssText} content: ${content};`;\n                        }\n\n                        function formatCssProperties() {\n                            const styleText = util\n                                .asArray(style)\n                                .map(formatProperty)\n                                .join('; ');\n                            return `${styleText};`;\n\n                            function formatProperty(name) {\n                                const propertyValue = style.getPropertyValue(name);\n                                const propertyPriority = style.getPropertyPriority(name)\n                                    ? ' !important'\n                                    : '';\n                                return `${name}: ${propertyValue}${propertyPriority}`;\n                            }\n                        }\n                    }\n                }\n            }\n\n            function copyUserInput() {\n                if (util.isHTMLTextAreaElement(original)) {\n                    clone.innerHTML = original.value;\n                }\n                if (util.isHTMLInputElement(original)) {\n                    clone.setAttribute('value', original.value);\n                }\n            }\n\n            function fixSvg() {\n                if (util.isSVGElement(clone)) {\n                    clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n\n                    if (util.isSVGRectElement(clone)) {\n                        ['width', 'height'].forEach(function (attribute) {\n                            const value = clone.getAttribute(attribute);\n                            if (value) {\n                                clone.style.setProperty(attribute, value);\n                            }\n                        });\n                    }\n                }\n            }\n        }\n    }\n\n    function embedFonts(node) {\n        return fontFaces.resolveAll().then(function (cssText) {\n            if (cssText !== '') {\n                const styleNode = document.createElement('style');\n                node.appendChild(styleNode);\n                styleNode.appendChild(document.createTextNode(cssText));\n            }\n            return node;\n        });\n    }\n\n    function inlineImages(node) {\n        return images.inlineAll(node).then(function () {\n            return node;\n        });\n    }\n\n    function newUtil() {\n        let uid_index = 0;\n\n        return {\n            escape: escapeRegEx,\n            isDataUrl: isDataUrl,\n            canvasToBlob: canvasToBlob,\n            resolveUrl: resolveUrl,\n            getAndEncode: getAndEncode,\n            uid: uid,\n            asArray: asArray,\n            escapeXhtml: escapeXhtml,\n            makeImage: makeImage,\n            width: width,\n            height: height,\n            getWindow: getWindow,\n            isElement: isElement,\n            isElementHostForOpenShadowRoot: isElementHostForOpenShadowRoot,\n            isShadowRoot: isShadowRoot,\n            isInShadowRoot: isInShadowRoot,\n            isHTMLElement: isHTMLElement,\n            isHTMLCanvasElement: isHTMLCanvasElement,\n            isHTMLInputElement: isHTMLInputElement,\n            isHTMLImageElement: isHTMLImageElement,\n            isHTMLLinkElement: isHTMLLinkElement,\n            isHTMLScriptElement: isHTMLScriptElement,\n            isHTMLStyleElement: isHTMLStyleElement,\n            isHTMLTextAreaElement: isHTMLTextAreaElement,\n            isShadowSlotElement: isShadowSlotElement,\n            isSVGElement: isSVGElement,\n            isSVGRectElement: isSVGRectElement,\n            isDimensionMissing: isDimensionMissing,\n        };\n\n        function getWindow(node) {\n            const ownerDocument = node ? node.ownerDocument : undefined;\n            return (\n                (ownerDocument ? ownerDocument.defaultView : undefined) ||\n                window ||\n                global\n            );\n        }\n\n        function isElementHostForOpenShadowRoot(value) {\n            return isElement(value) && value.shadowRoot !== null;\n        }\n\n        function isShadowRoot(value) {\n            return value instanceof getWindow(value).ShadowRoot;\n        }\n\n        function isInShadowRoot(value) {\n            // not calling the method, getting the method\n            if (value === null || value === undefined || value.getRootNode === undefined)\n                return false;\n            return isShadowRoot(value.getRootNode());\n        }\n\n        function isElement(value) {\n            return value instanceof getWindow(value).Element;\n        }\n\n        function isHTMLCanvasElement(value) {\n            return value instanceof getWindow(value).HTMLCanvasElement;\n        }\n\n        function isHTMLElement(value) {\n            return value instanceof getWindow(value).HTMLElement;\n        }\n\n        function isHTMLImageElement(value) {\n            return value instanceof getWindow(value).HTMLImageElement;\n        }\n\n        function isHTMLInputElement(value) {\n            return value instanceof getWindow(value).HTMLInputElement;\n        }\n\n        function isHTMLLinkElement(value) {\n            return value instanceof getWindow(value).HTMLLinkElement;\n        }\n\n        function isHTMLScriptElement(value) {\n            return value instanceof getWindow(value).HTMLScriptElement;\n        }\n\n        function isHTMLStyleElement(value) {\n            return value instanceof getWindow(value).HTMLStyleElement;\n        }\n\n        function isHTMLTextAreaElement(value) {\n            return value instanceof getWindow(value).HTMLTextAreaElement;\n        }\n\n        function isShadowSlotElement(value) {\n            return (\n                isInShadowRoot(value) && value instanceof getWindow(value).HTMLSlotElement\n            );\n        }\n\n        function isSVGElement(value) {\n            return value instanceof getWindow(value).SVGElement;\n        }\n\n        function isSVGRectElement(value) {\n            return value instanceof getWindow(value).SVGRectElement;\n        }\n\n        function isDataUrl(url) {\n            return url.search(/^(data:)/) !== -1;\n        }\n\n        function isDimensionMissing(value) {\n            return isNaN(value) || value <= 0;\n        }\n\n        function asBlob(canvas) {\n            return new Promise(function (resolve) {\n                const binaryString = atob(canvas.toDataURL().split(',')[1]);\n                const length = binaryString.length;\n                const binaryArray = new Uint8Array(length);\n\n                for (let i = 0; i < length; i++) {\n                    binaryArray[i] = binaryString.charCodeAt(i);\n                }\n\n                resolve(\n                    new Blob([binaryArray], {\n                        type: 'image/png',\n                    })\n                );\n            });\n        }\n\n        function canvasToBlob(canvas) {\n            if (canvas.toBlob) {\n                return new Promise(function (resolve) {\n                    canvas.toBlob(resolve);\n                });\n            }\n\n            return asBlob(canvas);\n        }\n\n        function resolveUrl(url, baseUrl) {\n            const doc = document.implementation.createHTMLDocument();\n            const base = doc.createElement('base');\n            doc.head.appendChild(base);\n            const a = doc.createElement('a');\n            doc.body.appendChild(a);\n            base.href = baseUrl;\n            a.href = url;\n            return a.href;\n        }\n\n        function uid() {\n            return `u${fourRandomChars()}${uid_index++}`;\n\n            function fourRandomChars() {\n                /* see https://stackoverflow.com/a/6248722/2519373 */\n                return `0000${((Math.random() * Math.pow(36, 4)) << 0).toString(\n                    36\n                )}`.slice(-4);\n            }\n        }\n\n        function makeImage(uri) {\n            if (uri === 'data:,') {\n                return Promise.resolve();\n            }\n\n            return new Promise(function (resolve, reject) {\n                // Create an SVG element to house the image\n                const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n\n                // and create the Image element to insert into that wrapper\n                const image = new Image();\n\n                if (domtoimage.impl.options.useCredentials) {\n                    image.crossOrigin = 'use-credentials';\n                }\n\n                image.onload = function () {\n                    // Cleanup: remove theimage from the document\n                    document.body.removeChild(svg);\n\n                    if (window && window.requestAnimationFrame) {\n                        // In order to work around a Firefox bug (webcompat/web-bugs#119834) we\n                        // need to wait one extra frame before it's safe to read the image data.\n                        window.requestAnimationFrame(function () {\n                            resolve(image);\n                        });\n                    } else {\n                        // If we don't have a window or requestAnimationFrame function proceed immediately.\n                        resolve(image);\n                    }\n                };\n\n                image.onerror = (error) => {\n                    // Cleanup: remove the image from the document\n                    document.body.removeChild(svg);\n\n                    reject(error);\n                };\n\n                svg.appendChild(image);\n                image.src = uri;\n\n                // Add the SVG to the document body (invisible)\n                document.body.appendChild(svg);\n            });\n        }\n\n        function getAndEncode(url) {\n            let cacheEntry = domtoimage.impl.urlCache.find(function (el) {\n                return el.url === url;\n            });\n\n            if (!cacheEntry) {\n                cacheEntry = {\n                    url: url,\n                    promise: null,\n                };\n                domtoimage.impl.urlCache.push(cacheEntry);\n            }\n\n            if (cacheEntry.promise === null) {\n                if (domtoimage.impl.options.cacheBust) {\n                    // Cache bypass so we don't have CORS issues with cached images\n                    // Source: https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Bypassing_the_cache\n                    url += (/\\?/.test(url) ? '&' : '?') + new Date().getTime();\n                }\n\n                cacheEntry.promise = new Promise(function (resolve) {\n                    const xhr = new XMLHttpRequest();\n                    xhr.timeout = domtoimage.impl.options.httpTimeout;\n                    xhr.onerror = placehold;\n                    xhr.ontimeout = placehold;\n                    xhr.onloadend = function () {\n                        if (xhr.readyState === XMLHttpRequest.DONE) {\n                            const status = xhr.status;\n                            // In local files, status is 0 upon success in Mozilla Firefox\n                            if (\n                                (status === 0 && url.toLowerCase().startsWith('file://')) ||\n                                (status >= 200 && status <= 300 && xhr.response !== null)\n                            ) {\n                                const response = xhr.response;\n                                if (!(response instanceof Blob)) {\n                                    fail(\n                                        'Expected response to be a Blob, but got: ' +\n                                            typeof response\n                                    );\n                                }\n                                const reader = new FileReader();\n                                reader.onloadend = function () {\n                                    const result = reader.result;\n                                    resolve(result);\n                                };\n                                try {\n                                    reader.readAsDataURL(response);\n                                } catch (ex) {\n                                    fail(\n                                        'Failed to read the response as Data URL: ' +\n                                            ex.toString()\n                                    );\n                                }\n                            } else {\n                                placehold();\n                            }\n                        }\n                    };\n\n                    function fail(message) {\n                        console.error(message);\n                        resolve('');\n                    }\n\n                    function placehold() {\n                        const placeholder = domtoimage.impl.options.imagePlaceholder;\n\n                        if (placeholder) {\n                            resolve(placeholder);\n                        } else {\n                            fail('Status:' + xhr.status + ' while fetching resource: ' + url);\n                        }\n                    }\n\n                    function handleJson(data) {\n                        try {\n                            return JSON.parse(JSON.stringify(data));\n                        } catch (e) {\n                            fail('corsImg.data is missing or invalid:' + e.toString());\n                        }\n                    }\n\n                    if (domtoimage.impl.options.useCredentialsFilters.length > 0) {\n                        domtoimage.impl.options.useCredentials =\n                            domtoimage.impl.options.useCredentialsFilters.filter(\n                                (credentialsFilter) => url.search(credentialsFilter) >= 0\n                            ).length > 0;\n                    }\n\n                    if (domtoimage.impl.options.useCredentials) {\n                        xhr.withCredentials = true;\n                    }\n\n                    if (\n                        domtoimage.impl.options.corsImg &&\n                        url.indexOf('http') === 0 &&\n                        url.indexOf(window.location.origin) === -1\n                    ) {\n                        const method =\n                            (\n                                domtoimage.impl.options.corsImg.method || 'GET'\n                            ).toUpperCase() === 'POST'\n                                ? 'POST'\n                                : 'GET';\n                        xhr.open(\n                            method,\n                            (domtoimage.impl.options.corsImg.url || '').replace(\n                                '#{cors}',\n                                url\n                            ),\n                            true\n                        );\n\n                        let isJson = false;\n                        const headers = domtoimage.impl.options.corsImg.headers || {};\n                        Object.keys(headers).forEach(function (key) {\n                            if (headers[key].indexOf('application/json') !== -1) {\n                                isJson = true;\n                            }\n                            xhr.setRequestHeader(key, headers[key]);\n                        });\n\n                        const corsData = handleJson(\n                            domtoimage.impl.options.corsImg.data || ''\n                        );\n\n                        Object.keys(corsData).forEach(function (key) {\n                            if (typeof corsData[key] === 'string') {\n                                corsData[key] = corsData[key].replace('#{cors}', url);\n                            }\n                        });\n\n                        xhr.responseType = 'blob';\n                        xhr.send(isJson ? JSON.stringify(corsData) : corsData);\n                    } else {\n                        xhr.open('GET', url, true);\n                        xhr.responseType = 'blob';\n                        xhr.send();\n                    }\n                });\n            }\n            return cacheEntry.promise;\n        }\n\n        function escapeRegEx(string) {\n            return string.replace(/([.*+?^${}()|[\\]/\\\\])/g, '\\\\$1');\n        }\n\n        function asArray(arrayLike) {\n            const array = [];\n            const length = arrayLike.length;\n            for (let i = 0; i < length; i++) {\n                array.push(arrayLike[i]);\n            }\n\n            return array;\n        }\n\n        function escapeXhtml(string) {\n            return string.replace(/%/g, '%25').replace(/#/g, '%23').replace(/\\n/g, '%0A');\n        }\n\n        function width(node) {\n            const width = px(node, 'width');\n\n            if (!isNaN(width)) return width;\n\n            const leftBorder = px(node, 'border-left-width');\n            const rightBorder = px(node, 'border-right-width');\n            return node.scrollWidth + leftBorder + rightBorder;\n        }\n\n        function height(node) {\n            const height = px(node, 'height');\n\n            if (!isNaN(height)) return height;\n\n            const topBorder = px(node, 'border-top-width');\n            const bottomBorder = px(node, 'border-bottom-width');\n            return node.scrollHeight + topBorder + bottomBorder;\n        }\n\n        function px(node, styleProperty) {\n            if (node.nodeType === ELEMENT_NODE) {\n                let value = getComputedStyle(node).getPropertyValue(styleProperty);\n                if (value.slice(-2) === 'px') {\n                    value = value.slice(0, -2);\n                    return parseFloat(value);\n                }\n            }\n\n            return NaN;\n        }\n    }\n\n    function newInliner() {\n        const URL_REGEX = /url\\(\\s*([\"']?)((?:\\\\.|[^\\\\)])+)\\1\\s*\\)/gm;\n\n        return {\n            inlineAll: inlineAll,\n            shouldProcess: shouldProcess,\n            impl: {\n                readUrls: readUrls,\n                inline: inline,\n                urlAsRegex: urlAsRegex,\n            },\n        };\n\n        function shouldProcess(string) {\n            return string.search(URL_REGEX) !== -1;\n        }\n\n        function readUrls(string) {\n            const result = [];\n            let match;\n            while ((match = URL_REGEX.exec(string)) !== null) {\n                result.push(match[2]);\n            }\n            return result.filter(function (url) {\n                return !util.isDataUrl(url);\n            });\n        }\n\n        function urlAsRegex(urlValue) {\n            return new RegExp(`url\\\\(([\"']?)(${util.escape(urlValue)})\\\\1\\\\)`, 'gm');\n        }\n\n        function inline(string, url, baseUrl, get) {\n            return Promise.resolve(url)\n                .then(function (urlValue) {\n                    return baseUrl ? util.resolveUrl(urlValue, baseUrl) : urlValue;\n                })\n                .then(get || util.getAndEncode)\n                .then(function (dataUrl) {\n                    const pattern = urlAsRegex(url);\n                    return string.replace(pattern, `url($1${dataUrl}$1)`);\n                });\n        }\n\n        function inlineAll(string, baseUrl, get) {\n            if (nothingToInline()) {\n                return Promise.resolve(string);\n            }\n\n            return Promise.resolve(string)\n                .then(readUrls)\n                .then(function (urls) {\n                    let done = Promise.resolve(string);\n                    urls.forEach(function (url) {\n                        done = done.then(function (prefix) {\n                            return inline(prefix, url, baseUrl, get);\n                        });\n                    });\n                    return done;\n                });\n\n            function nothingToInline() {\n                return !shouldProcess(string);\n            }\n        }\n    }\n\n    function newFontFaces() {\n        return {\n            resolveAll: resolveAll,\n            impl: {\n                readAll: readAll,\n            },\n        };\n\n        function resolveAll() {\n            return readAll()\n                .then(function (webFonts) {\n                    return Promise.all(\n                        webFonts.map(function (webFont) {\n                            return webFont.resolve();\n                        })\n                    );\n                })\n                .then(function (cssStrings) {\n                    return cssStrings.join('\\n');\n                });\n        }\n\n        function readAll() {\n            return Promise.resolve(util.asArray(document.styleSheets))\n                .then(getCssRules)\n                .then(selectWebFontRules)\n                .then(function (rules) {\n                    return rules.map(newWebFont);\n                });\n\n            function selectWebFontRules(cssRules) {\n                return cssRules\n                    .filter(function (rule) {\n                        return rule.type === CSSRule.FONT_FACE_RULE;\n                    })\n                    .filter(function (rule) {\n                        return inliner.shouldProcess(rule.style.getPropertyValue('src'));\n                    });\n            }\n\n            function getCssRules(styleSheets) {\n                const cssRules = [];\n                styleSheets.forEach(function (sheet) {\n                    const sheetProto = Object.getPrototypeOf(sheet);\n                    // NOSONAR\n                    if (Object.prototype.hasOwnProperty.call(sheetProto, 'cssRules')) {\n                        try {\n                            util.asArray(sheet.cssRules || []).forEach(\n                                cssRules.push.bind(cssRules)\n                            );\n                        } catch (e) {\n                            console.error(\n                                'domtoimage: Error while reading CSS rules from: ' +\n                                    sheet.href,\n                                e.toString()\n                            );\n                        }\n                    }\n                });\n                return cssRules;\n            }\n\n            function newWebFont(webFontRule) {\n                return {\n                    resolve: function resolve() {\n                        // NOSONAR\n                        const baseUrl = (webFontRule.parentStyleSheet || {}).href;\n                        return inliner.inlineAll(webFontRule.cssText, baseUrl);\n                    },\n                    src: function () {\n                        return webFontRule.style.getPropertyValue('src');\n                    },\n                };\n            }\n        }\n    }\n\n    function newImages() {\n        return {\n            inlineAll: inlineAll,\n            impl: {\n                newImage: newImage,\n            },\n        };\n\n        function newImage(element) {\n            return {\n                inline: inline,\n            };\n\n            function inline(get) {\n                if (util.isDataUrl(element.src)) {\n                    return Promise.resolve();\n                }\n\n                return Promise.resolve(element.src)\n                    .then(get || util.getAndEncode)\n                    .then(function (dataUrl) {\n                        return new Promise(function (resolve) {\n                            element.onload = resolve;\n                            // for any image with invalid src(such as <img src />), just ignore it\n                            element.onerror = resolve;\n                            element.src = dataUrl;\n                        });\n                    });\n            }\n        }\n\n        function inlineAll(node) {\n            if (!util.isElement(node)) {\n                return Promise.resolve(node);\n            }\n\n            return inlineCSSProperty(node).then(function () {\n                if (util.isHTMLImageElement(node)) {\n                    return newImage(node).inline();\n                } else {\n                    return Promise.all(\n                        util.asArray(node.childNodes).map(function (child) {\n                            return inlineAll(child);\n                        })\n                    );\n                }\n            });\n\n            function inlineCSSProperty(node) {\n                const properties = ['background', 'background-image'];\n\n                const inliningTasks = properties.map(function (propertyName) {\n                    const value = node.style.getPropertyValue(propertyName);\n                    const priority = node.style.getPropertyPriority(propertyName);\n\n                    if (!value) {\n                        return Promise.resolve();\n                    }\n\n                    return inliner.inlineAll(value).then(function (inlinedValue) {\n                        node.style.setProperty(propertyName, inlinedValue, priority);\n                    });\n                });\n\n                return Promise.all(inliningTasks).then(function () {\n                    return node;\n                });\n            }\n        }\n    }\n\n    function setStyleProperty(targetStyle, name, value, priority) {\n        const needs_prefixing = ['background-clip'].indexOf(name) >= 0;\n        if (priority) {\n            targetStyle.setProperty(name, value, priority);\n            if (needs_prefixing) {\n                targetStyle.setProperty(`-webkit-${name}`, value, priority);\n            }\n        } else {\n            targetStyle.setProperty(name, value);\n            if (needs_prefixing) {\n                targetStyle.setProperty(`-webkit-${name}`, value);\n            }\n        }\n    }\n\n    function copyUserComputedStyleFast(\n        options,\n        sourceElement,\n        sourceComputedStyles,\n        parentComputedStyles,\n        targetElement\n    ) {\n        const defaultStyle = domtoimage.impl.options.copyDefaultStyles\n            ? getDefaultStyle(options, sourceElement)\n            : {};\n        const targetStyle = targetElement.style;\n\n        util.asArray(sourceComputedStyles).forEach(function (name) {\n            if (options.filterStyles) {\n                if (!options.filterStyles(sourceElement, name)) {\n                    return;\n                }\n            }\n\n            const sourceValue = sourceComputedStyles.getPropertyValue(name);\n            const defaultValue = defaultStyle[name];\n            const parentValue = parentComputedStyles\n                ? parentComputedStyles.getPropertyValue(name)\n                : undefined;\n\n            // Ignore setting style property on clone node, if already it has a style (through adjustCloneNode)\n            const targetValue = targetStyle.getPropertyValue(name);\n            if (targetValue) return;\n\n            // If the style does not match the default, or it does not match the parent's, set it. We don't know which\n            // styles are inherited from the parent and which aren't, so we have to always check both.\n            if (\n                sourceValue !== defaultValue ||\n                (parentComputedStyles && sourceValue !== parentValue)\n            ) {\n                const priority = sourceComputedStyles.getPropertyPriority(name);\n                setStyleProperty(targetStyle, name, sourceValue, priority);\n            }\n        });\n    }\n\n    let removeDefaultStylesTimeoutId = null;\n    let tagNameDefaultStyles = {};\n\n    const ascentStoppers = [\n        // these come from https://developer.mozilla.org/en-US/docs/Web/HTML/Block-level_elements\n        'ADDRESS',\n        'ARTICLE',\n        'ASIDE',\n        'BLOCKQUOTE',\n        'DETAILS',\n        'DIALOG',\n        'DD',\n        'DIV',\n        'DL',\n        'DT',\n        'FIELDSET',\n        'FIGCAPTION',\n        'FIGURE',\n        'FOOTER',\n        'FORM',\n        'H1',\n        'H2',\n        'H3',\n        'H4',\n        'H5',\n        'H6',\n        'HEADER',\n        'HGROUP',\n        'HR',\n        'LI',\n        'MAIN',\n        'NAV',\n        'OL',\n        'P',\n        'PRE',\n        'SECTION',\n        'SVG',\n        'TABLE',\n        'UL',\n        // this is some non-standard ones\n        'math', // intentionally lowercase, thanks Safari\n        'svg', // in case we have an svg embedded element\n        // these are ultimate stoppers in case something drastic changes in how the DOM works\n        'BODY',\n        'HEAD',\n        'HTML',\n    ];\n\n    function getDefaultStyle(options, sourceElement) {\n        const tagHierarchy = computeTagHierarchy(sourceElement);\n        const tagKey = computeTagKey(tagHierarchy);\n        if (tagNameDefaultStyles[tagKey]) {\n            return tagNameDefaultStyles[tagKey];\n        }\n\n        // We haven't cached the answer for that hierachy yet, build a\n        // sandbox (if not yet created), fill it with the hierarchy that\n        // matters, and grab the default styles associated\n        const sandboxWindow = ensureSandboxWindow();\n        const defaultElement = constructElementHierachy(\n            sandboxWindow.document,\n            tagHierarchy\n        );\n        const defaultStyle = computeStyleForDefaults(sandboxWindow, defaultElement);\n        destroyElementHierarchy(defaultElement);\n\n        tagNameDefaultStyles[tagKey] = defaultStyle;\n        return defaultStyle;\n\n        function computeTagHierarchy(sourceNode) {\n            const tagNames = [];\n\n            do {\n                if (sourceNode.nodeType === ELEMENT_NODE) {\n                    const tagName = sourceNode.tagName;\n                    tagNames.push(tagName);\n\n                    if (ascentStoppers.includes(tagName)) {\n                        break;\n                    }\n                }\n\n                sourceNode = sourceNode.parentNode;\n            } while (sourceNode);\n\n            return tagNames;\n        }\n\n        function computeTagKey(tagHierarchy) {\n            if (options.styleCaching === 'relaxed') {\n                // pick up only the ascent-stopping element tag and the element tag itself\n                /* jshint unused:true */\n                return tagHierarchy\n                    .filter((_, i, a) => i === 0 || i === a.length - 1)\n                    .join('>');\n            }\n            // for all other cases, fall back the the entire path\n            return tagHierarchy.join('>'); // it's like CSS\n        }\n\n        function constructElementHierachy(sandboxDocument, tagHierarchy) {\n            let element = sandboxDocument.body;\n            do {\n                const childTagName = tagHierarchy.pop();\n                const childElement = sandboxDocument.createElement(childTagName);\n                element.appendChild(childElement);\n                element = childElement;\n            } while (tagHierarchy.length > 0);\n\n            // Ensure that there is some content, so that properties like margin are applied.\n            // we use zero-width space to handle FireFox adding a pixel\n            element.textContent = '\\u200b';\n            return element;\n        }\n\n        function computeStyleForDefaults(sandboxWindow, defaultElement) {\n            const defaultStyle = {};\n            const defaultComputedStyle = sandboxWindow.getComputedStyle(defaultElement);\n\n            // Copy styles to an object, making sure that 'width' and 'height' are given the default value of 'auto', since\n            // their initial value is always 'auto' despite that the default computed value is sometimes an absolute length.\n            util.asArray(defaultComputedStyle).forEach(function (name) {\n                defaultStyle[name] =\n                    name === 'width' || name === 'height'\n                        ? 'auto'\n                        : defaultComputedStyle.getPropertyValue(name);\n            });\n            return defaultStyle;\n        }\n\n        function destroyElementHierarchy(element) {\n            do {\n                const parentElement = element.parentElement;\n                if (parentElement !== null) {\n                    parentElement.removeChild(element);\n                }\n                element = parentElement;\n            } while (element && element.tagName !== 'BODY');\n        }\n    }\n\n    function ensureSandboxWindow() {\n        if (sandbox) {\n            return sandbox.contentWindow;\n        }\n\n        // figure out how this document is defined (doctype and charset)\n        const charsetToUse = document.characterSet || 'UTF-8';\n        const docType = document.doctype;\n        const docTypeDeclaration = docType\n            ? `<!DOCTYPE ${escapeHTML(docType.name)} ${escapeHTML(\n                docType.publicId\n            )} ${escapeHTML(docType.systemId)}`.trim() + '>'\n            : '';\n\n        // Create a hidden sandbox <iframe> element within we can create default HTML elements and query their\n        // computed styles. Elements must be rendered in order to query their computed styles. The <iframe> won't\n        // render at all with `display: none`, so we have to use `visibility: hidden` with `position: fixed`.\n        sandbox = document.createElement('iframe');\n        sandbox.id = 'domtoimage-sandbox-' + util.uid();\n        sandbox.style.top = '-9999px';\n        sandbox.style.visibility = 'hidden';\n        sandbox.style.position = 'fixed';\n        document.body.appendChild(sandbox);\n\n        return tryTechniques(\n            sandbox,\n            docTypeDeclaration,\n            charsetToUse,\n            'domtoimage-sandbox'\n        );\n\n        function escapeHTML(unsafeText) {\n            if (unsafeText) {\n                const div = document.createElement('div');\n                div.innerText = unsafeText;\n                return div.innerHTML;\n            } else {\n                return '';\n            }\n        }\n\n        function tryTechniques(sandbox, doctype, charset, title) {\n            // try the good old-fashioned document write with all the correct attributes set\n            try {\n                sandbox.contentWindow.document.write(\n                    `${doctype}<html><head><meta charset='${charset}'><title>${title}</title></head><body></body></html>`\n                );\n                return sandbox.contentWindow;\n            } catch (_) {\n                // swallow exception and fall through to next technique\n            }\n\n            const metaCharset = document.createElement('meta');\n            metaCharset.setAttribute('charset', charset);\n\n            // let's attempt it using srcdoc, so we can still set the doctype and charset\n            try {\n                const sandboxDocument = document.implementation.createHTMLDocument(title);\n                sandboxDocument.head.appendChild(metaCharset);\n                const sandboxHTML = doctype + sandboxDocument.documentElement.outerHTML;\n                sandbox.setAttribute('srcdoc', sandboxHTML);\n                return sandbox.contentWindow;\n            } catch (_) {\n                // NOSONAR\n                // swallow exception and fall through to the simplest path\n            }\n\n            // let's attempt it using contentDocument... here we're not able to set the doctype\n            sandbox.contentDocument.head.appendChild(metaCharset);\n            sandbox.contentDocument.title = title;\n            return sandbox.contentWindow;\n        }\n    }\n\n    function removeSandbox() {\n        if (sandbox) {\n            document.body.removeChild(sandbox);\n            sandbox = null;\n        }\n\n        if (removeDefaultStylesTimeoutId) {\n            clearTimeout(removeDefaultStylesTimeoutId);\n        }\n\n        removeDefaultStylesTimeoutId = setTimeout(() => {\n            removeDefaultStylesTimeoutId = null;\n            tagNameDefaultStyles = {};\n        }, 20 * 1000);\n    }\n})(this);\n", "import jquery from \"jquery\"\nwindow.jQuery = jquery\nwindow.$ = jquery\n", "/*!\nTurbo 8.0.23\nCopyright \u00A9 2026 37signals LLC\n */\nconst FrameLoadingStyle = {\n  eager: \"eager\",\n  lazy: \"lazy\"\n};\n\n/**\n * Contains a fragment of HTML which is updated based on navigation within\n * it (e.g. via links or form submissions).\n *\n * @customElement turbo-frame\n * @example\n *   <turbo-frame id=\"messages\">\n *     <a href=\"/messages/expanded\">\n *       Show all expanded messages in this frame.\n *     </a>\n *\n *     <form action=\"/messages\">\n *       Show response from this form within this frame.\n *     </form>\n *   </turbo-frame>\n */\nclass FrameElement extends HTMLElement {\n  static delegateConstructor = undefined\n\n  loaded = Promise.resolve()\n\n  static get observedAttributes() {\n    return [\"disabled\", \"loading\", \"src\"]\n  }\n\n  constructor() {\n    super();\n    this.delegate = new FrameElement.delegateConstructor(this);\n  }\n\n  connectedCallback() {\n    this.delegate.connect();\n  }\n\n  disconnectedCallback() {\n    this.delegate.disconnect();\n  }\n\n  reload() {\n    return this.delegate.sourceURLReloaded()\n  }\n\n  attributeChangedCallback(name) {\n    if (name == \"loading\") {\n      this.delegate.loadingStyleChanged();\n    } else if (name == \"src\") {\n      this.delegate.sourceURLChanged();\n    } else if (name == \"disabled\") {\n      this.delegate.disabledChanged();\n    }\n  }\n\n  /**\n   * Gets the URL to lazily load source HTML from\n   */\n  get src() {\n    return this.getAttribute(\"src\")\n  }\n\n  /**\n   * Sets the URL to lazily load source HTML from\n   */\n  set src(value) {\n    if (value) {\n      this.setAttribute(\"src\", value);\n    } else {\n      this.removeAttribute(\"src\");\n    }\n  }\n\n  /**\n   * Gets the refresh mode for the frame.\n   */\n  get refresh() {\n    return this.getAttribute(\"refresh\")\n  }\n\n  /**\n   * Sets the refresh mode for the frame.\n   */\n  set refresh(value) {\n    if (value) {\n      this.setAttribute(\"refresh\", value);\n    } else {\n      this.removeAttribute(\"refresh\");\n    }\n  }\n\n  get shouldReloadWithMorph() {\n    return this.src && this.refresh === \"morph\"\n  }\n\n  /**\n   * Determines if the element is loading\n   */\n  get loading() {\n    return frameLoadingStyleFromString(this.getAttribute(\"loading\") || \"\")\n  }\n\n  /**\n   * Sets the value of if the element is loading\n   */\n  set loading(value) {\n    if (value) {\n      this.setAttribute(\"loading\", value);\n    } else {\n      this.removeAttribute(\"loading\");\n    }\n  }\n\n  /**\n   * Gets the disabled state of the frame.\n   *\n   * If disabled, no requests will be intercepted by the frame.\n   */\n  get disabled() {\n    return this.hasAttribute(\"disabled\")\n  }\n\n  /**\n   * Sets the disabled state of the frame.\n   *\n   * If disabled, no requests will be intercepted by the frame.\n   */\n  set disabled(value) {\n    if (value) {\n      this.setAttribute(\"disabled\", \"\");\n    } else {\n      this.removeAttribute(\"disabled\");\n    }\n  }\n\n  /**\n   * Gets the autoscroll state of the frame.\n   *\n   * If true, the frame will be scrolled into view automatically on update.\n   */\n  get autoscroll() {\n    return this.hasAttribute(\"autoscroll\")\n  }\n\n  /**\n   * Sets the autoscroll state of the frame.\n   *\n   * If true, the frame will be scrolled into view automatically on update.\n   */\n  set autoscroll(value) {\n    if (value) {\n      this.setAttribute(\"autoscroll\", \"\");\n    } else {\n      this.removeAttribute(\"autoscroll\");\n    }\n  }\n\n  /**\n   * Determines if the element has finished loading\n   */\n  get complete() {\n    return !this.delegate.isLoading\n  }\n\n  /**\n   * Gets the active state of the frame.\n   *\n   * If inactive, source changes will not be observed.\n   */\n  get isActive() {\n    return this.ownerDocument === document && !this.isPreview\n  }\n\n  /**\n   * Sets the active state of the frame.\n   *\n   * If inactive, source changes will not be observed.\n   */\n  get isPreview() {\n    return this.ownerDocument?.documentElement?.hasAttribute(\"data-turbo-preview\")\n  }\n}\n\nfunction frameLoadingStyleFromString(style) {\n  switch (style.toLowerCase()) {\n    case \"lazy\":\n      return FrameLoadingStyle.lazy\n    default:\n      return FrameLoadingStyle.eager\n  }\n}\n\nconst drive = {\n  enabled: true,\n  progressBarDelay: 500,\n  unvisitableExtensions: new Set(\n    [\n      \".7z\", \".aac\", \".apk\", \".avi\", \".bmp\", \".bz2\", \".css\", \".csv\", \".deb\", \".dmg\", \".doc\",\n      \".docx\", \".exe\", \".gif\", \".gz\", \".heic\", \".heif\", \".ico\", \".iso\", \".jpeg\", \".jpg\",\n      \".js\", \".json\", \".m4a\", \".mkv\", \".mov\", \".mp3\", \".mp4\", \".mpeg\", \".mpg\", \".msi\",\n      \".ogg\", \".ogv\", \".pdf\", \".pkg\", \".png\", \".ppt\", \".pptx\", \".rar\", \".rtf\",\n      \".svg\", \".tar\", \".tif\", \".tiff\", \".txt\", \".wav\", \".webm\", \".webp\", \".wma\", \".wmv\",\n      \".xls\", \".xlsx\", \".xml\", \".zip\"\n    ]\n  )\n};\n\nfunction activateScriptElement(element) {\n  if (element.getAttribute(\"data-turbo-eval\") == \"false\") {\n    return element\n  } else {\n    const createdScriptElement = document.createElement(\"script\");\n    const cspNonce = getCspNonce();\n    if (cspNonce) {\n      createdScriptElement.nonce = cspNonce;\n    }\n    createdScriptElement.textContent = element.textContent;\n    createdScriptElement.async = false;\n    copyElementAttributes(createdScriptElement, element);\n    return createdScriptElement\n  }\n}\n\nfunction copyElementAttributes(destinationElement, sourceElement) {\n  for (const { name, value } of sourceElement.attributes) {\n    destinationElement.setAttribute(name, value);\n  }\n}\n\nfunction createDocumentFragment(html) {\n  const template = document.createElement(\"template\");\n  template.innerHTML = html;\n  return template.content\n}\n\nfunction dispatch(eventName, { target, cancelable, detail } = {}) {\n  const event = new CustomEvent(eventName, {\n    cancelable,\n    bubbles: true,\n    composed: true,\n    detail\n  });\n\n  if (target && target.isConnected) {\n    target.dispatchEvent(event);\n  } else {\n    document.documentElement.dispatchEvent(event);\n  }\n\n  return event\n}\n\nfunction cancelEvent(event) {\n  event.preventDefault();\n  event.stopImmediatePropagation();\n}\n\nfunction nextRepaint() {\n  if (document.visibilityState === \"hidden\") {\n    return nextEventLoopTick()\n  } else {\n    return nextAnimationFrame()\n  }\n}\n\nfunction nextAnimationFrame() {\n  return new Promise((resolve) => requestAnimationFrame(() => resolve()))\n}\n\nfunction nextEventLoopTick() {\n  return new Promise((resolve) => setTimeout(() => resolve(), 0))\n}\n\nfunction parseHTMLDocument(html = \"\") {\n  return new DOMParser().parseFromString(html, \"text/html\")\n}\n\nfunction unindent(strings, ...values) {\n  const lines = interpolate(strings, values).replace(/^\\n/, \"\").split(\"\\n\");\n  const match = lines[0].match(/^\\s+/);\n  const indent = match ? match[0].length : 0;\n  return lines.map((line) => line.slice(indent)).join(\"\\n\")\n}\n\nfunction interpolate(strings, values) {\n  return strings.reduce((result, string, i) => {\n    const value = values[i] == undefined ? \"\" : values[i];\n    return result + string + value\n  }, \"\")\n}\n\nfunction uuid() {\n  return Array.from({ length: 36 })\n    .map((_, i) => {\n      if (i == 8 || i == 13 || i == 18 || i == 23) {\n        return \"-\"\n      } else if (i == 14) {\n        return \"4\"\n      } else if (i == 19) {\n        return (Math.floor(Math.random() * 4) + 8).toString(16)\n      } else {\n        return Math.floor(Math.random() * 16).toString(16)\n      }\n    })\n    .join(\"\")\n}\n\nfunction getAttribute(attributeName, ...elements) {\n  for (const value of elements.map((element) => element?.getAttribute(attributeName))) {\n    if (typeof value == \"string\") return value\n  }\n\n  return null\n}\n\nfunction hasAttribute(attributeName, ...elements) {\n  return elements.some((element) => element && element.hasAttribute(attributeName))\n}\n\nfunction markAsBusy(...elements) {\n  for (const element of elements) {\n    if (element.localName == \"turbo-frame\") {\n      element.setAttribute(\"busy\", \"\");\n    }\n    element.setAttribute(\"aria-busy\", \"true\");\n  }\n}\n\nfunction clearBusyState(...elements) {\n  for (const element of elements) {\n    if (element.localName == \"turbo-frame\") {\n      element.removeAttribute(\"busy\");\n    }\n\n    element.removeAttribute(\"aria-busy\");\n  }\n}\n\nfunction waitForLoad(element, timeoutInMilliseconds = 2000) {\n  return new Promise((resolve) => {\n    const onComplete = () => {\n      element.removeEventListener(\"error\", onComplete);\n      element.removeEventListener(\"load\", onComplete);\n      resolve();\n    };\n\n    element.addEventListener(\"load\", onComplete, { once: true });\n    element.addEventListener(\"error\", onComplete, { once: true });\n    setTimeout(resolve, timeoutInMilliseconds);\n  })\n}\n\nfunction getHistoryMethodForAction(action) {\n  switch (action) {\n    case \"replace\":\n      return history.replaceState\n    case \"advance\":\n    case \"restore\":\n      return history.pushState\n  }\n}\n\nfunction isAction(action) {\n  return action == \"advance\" || action == \"replace\" || action == \"restore\"\n}\n\nfunction getVisitAction(...elements) {\n  const action = getAttribute(\"data-turbo-action\", ...elements);\n\n  return isAction(action) ? action : null\n}\n\nfunction getMetaElement(name) {\n  return document.querySelector(`meta[name=\"${name}\"]`)\n}\n\nfunction getMetaContent(name) {\n  const element = getMetaElement(name);\n  return element && element.content\n}\n\nfunction getCspNonce() {\n  const element = getMetaElement(\"csp-nonce\");\n\n  if (element) {\n    const { nonce, content } = element;\n    return nonce == \"\" ? content : nonce\n  }\n}\n\nfunction setMetaContent(name, content) {\n  let element = getMetaElement(name);\n\n  if (!element) {\n    element = document.createElement(\"meta\");\n    element.setAttribute(\"name\", name);\n\n    document.head.appendChild(element);\n  }\n\n  element.setAttribute(\"content\", content);\n\n  return element\n}\n\nfunction findClosestRecursively(element, selector) {\n  if (element instanceof Element) {\n    return (\n      element.closest(selector) || findClosestRecursively(element.assignedSlot || element.getRootNode()?.host, selector)\n    )\n  }\n}\n\nfunction elementIsFocusable(element) {\n  const inertDisabledOrHidden = \"[inert], :disabled, [hidden], details:not([open]), dialog:not([open])\";\n\n  return !!element && element.closest(inertDisabledOrHidden) == null && typeof element.focus == \"function\"\n}\n\nfunction queryAutofocusableElement(elementOrDocumentFragment) {\n  return Array.from(elementOrDocumentFragment.querySelectorAll(\"[autofocus]\")).find(elementIsFocusable)\n}\n\nasync function around(callback, reader) {\n  const before = reader();\n\n  callback();\n\n  await nextAnimationFrame();\n\n  const after = reader();\n\n  return [before, after]\n}\n\nfunction doesNotTargetIFrame(name) {\n  if (name === \"_blank\") {\n    return false\n  } else if (name) {\n    for (const element of document.getElementsByName(name)) {\n      if (element instanceof HTMLIFrameElement) return false\n    }\n\n    return true\n  } else {\n    return true\n  }\n}\n\nfunction findLinkFromClickTarget(target) {\n  const link = findClosestRecursively(target, \"a[href], a[xlink\\\\:href]\");\n\n  if (!link) return null\n  if (link.href.startsWith(\"#\")) return null\n  if (link.hasAttribute(\"download\")) return null\n\n  const linkTarget = link.getAttribute(\"target\");\n  if (linkTarget && linkTarget !== \"_self\") return null\n\n  return link\n}\n\nfunction debounce(fn, delay) {\n  let timeoutId = null;\n\n  return (...args) => {\n    const callback = () => fn.apply(this, args);\n    clearTimeout(timeoutId);\n    timeoutId = setTimeout(callback, delay);\n  }\n}\n\nconst submitter = {\n  \"aria-disabled\": {\n    beforeSubmit: submitter => {\n      submitter.setAttribute(\"aria-disabled\", \"true\");\n      submitter.addEventListener(\"click\", cancelEvent);\n    },\n\n    afterSubmit: submitter => {\n      submitter.removeAttribute(\"aria-disabled\");\n      submitter.removeEventListener(\"click\", cancelEvent);\n    }\n  },\n\n  \"disabled\": {\n    beforeSubmit: submitter => submitter.disabled = true,\n    afterSubmit: submitter => submitter.disabled = false\n  }\n};\n\nclass Config {\n  #submitter = null\n\n  constructor(config) {\n    Object.assign(this, config);\n  }\n\n  get submitter() {\n    return this.#submitter\n  }\n\n  set submitter(value) {\n    this.#submitter = submitter[value] || value;\n  }\n}\n\nconst forms = new Config({\n  mode: \"on\",\n  submitter: \"disabled\"\n});\n\nconst config = {\n  drive,\n  forms\n};\n\nfunction expandURL(locatable) {\n  return new URL(locatable.toString(), document.baseURI)\n}\n\nfunction getAnchor(url) {\n  let anchorMatch;\n  if (url.hash) {\n    return url.hash.slice(1)\n    // eslint-disable-next-line no-cond-assign\n  } else if ((anchorMatch = url.href.match(/#(.*)$/))) {\n    return anchorMatch[1]\n  }\n}\n\nfunction getAction$1(form, submitter) {\n  const action = submitter?.getAttribute(\"formaction\") || form.getAttribute(\"action\") || form.action;\n\n  return expandURL(action)\n}\n\nfunction getExtension(url) {\n  return (getLastPathComponent(url).match(/\\.[^.]*$/) || [])[0] || \"\"\n}\n\nfunction isPrefixedBy(baseURL, url) {\n  const prefix = addTrailingSlash(url.origin + url.pathname);\n  return addTrailingSlash(baseURL.href) === prefix || baseURL.href.startsWith(prefix)\n}\n\nfunction locationIsVisitable(location, rootLocation) {\n  return isPrefixedBy(location, rootLocation) && !config.drive.unvisitableExtensions.has(getExtension(location))\n}\n\nfunction getLocationForLink(link) {\n  return expandURL(link.getAttribute(\"href\") || \"\")\n}\n\nfunction getRequestURL(url) {\n  const anchor = getAnchor(url);\n  return anchor != null ? url.href.slice(0, -(anchor.length + 1)) : url.href\n}\n\nfunction toCacheKey(url) {\n  return getRequestURL(url)\n}\n\nfunction urlsAreEqual(left, right) {\n  return expandURL(left).href == expandURL(right).href\n}\n\nfunction getPathComponents(url) {\n  return url.pathname.split(\"/\").slice(1)\n}\n\nfunction getLastPathComponent(url) {\n  return getPathComponents(url).slice(-1)[0]\n}\n\nfunction addTrailingSlash(value) {\n  return value.endsWith(\"/\") ? value : value + \"/\"\n}\n\nclass FetchResponse {\n  constructor(response) {\n    this.response = response;\n  }\n\n  get succeeded() {\n    return this.response.ok\n  }\n\n  get failed() {\n    return !this.succeeded\n  }\n\n  get clientError() {\n    return this.statusCode >= 400 && this.statusCode <= 499\n  }\n\n  get serverError() {\n    return this.statusCode >= 500 && this.statusCode <= 599\n  }\n\n  get redirected() {\n    return this.response.redirected\n  }\n\n  get location() {\n    return expandURL(this.response.url)\n  }\n\n  get isHTML() {\n    return this.contentType && this.contentType.match(/^(?:text\\/([^\\s;,]+\\b)?html|application\\/xhtml\\+xml)\\b/)\n  }\n\n  get statusCode() {\n    return this.response.status\n  }\n\n  get contentType() {\n    return this.header(\"Content-Type\")\n  }\n\n  get responseText() {\n    return this.response.clone().text()\n  }\n\n  get responseHTML() {\n    if (this.isHTML) {\n      return this.response.clone().text()\n    } else {\n      return Promise.resolve(undefined)\n    }\n  }\n\n  header(name) {\n    return this.response.headers.get(name)\n  }\n}\n\nclass LimitedSet extends Set {\n  constructor(maxSize) {\n    super();\n    this.maxSize = maxSize;\n  }\n\n  add(value) {\n    if (this.size >= this.maxSize) {\n      const iterator = this.values();\n      const oldestValue = iterator.next().value;\n      this.delete(oldestValue);\n    }\n    super.add(value);\n  }\n}\n\nconst recentRequests = new LimitedSet(20);\n\nfunction fetchWithTurboHeaders(url, options = {}) {\n  const modifiedHeaders = new Headers(options.headers || {});\n  const requestUID = uuid();\n  recentRequests.add(requestUID);\n  modifiedHeaders.append(\"X-Turbo-Request-Id\", requestUID);\n\n  return window.fetch(url, {\n    ...options,\n    headers: modifiedHeaders\n  })\n}\n\nfunction fetchMethodFromString(method) {\n  switch (method.toLowerCase()) {\n    case \"get\":\n      return FetchMethod.get\n    case \"post\":\n      return FetchMethod.post\n    case \"put\":\n      return FetchMethod.put\n    case \"patch\":\n      return FetchMethod.patch\n    case \"delete\":\n      return FetchMethod.delete\n  }\n}\n\nconst FetchMethod = {\n  get: \"get\",\n  post: \"post\",\n  put: \"put\",\n  patch: \"patch\",\n  delete: \"delete\"\n};\n\nfunction fetchEnctypeFromString(encoding) {\n  switch (encoding.toLowerCase()) {\n    case FetchEnctype.multipart:\n      return FetchEnctype.multipart\n    case FetchEnctype.plain:\n      return FetchEnctype.plain\n    default:\n      return FetchEnctype.urlEncoded\n  }\n}\n\nconst FetchEnctype = {\n  urlEncoded: \"application/x-www-form-urlencoded\",\n  multipart: \"multipart/form-data\",\n  plain: \"text/plain\"\n};\n\nclass FetchRequest {\n  abortController = new AbortController()\n  #resolveRequestPromise = (_value) => {}\n\n  constructor(delegate, method, location, requestBody = new URLSearchParams(), target = null, enctype = FetchEnctype.urlEncoded) {\n    const [url, body] = buildResourceAndBody(expandURL(location), method, requestBody, enctype);\n\n    this.delegate = delegate;\n    this.url = url;\n    this.target = target;\n    this.fetchOptions = {\n      credentials: \"same-origin\",\n      redirect: \"follow\",\n      method: method.toUpperCase(),\n      headers: { ...this.defaultHeaders },\n      body: body,\n      signal: this.abortSignal,\n      referrer: this.delegate.referrer?.href\n    };\n    this.enctype = enctype;\n  }\n\n  get method() {\n    return this.fetchOptions.method\n  }\n\n  set method(value) {\n    const fetchBody = this.isSafe ? this.url.searchParams : this.fetchOptions.body || new FormData();\n    const fetchMethod = fetchMethodFromString(value) || FetchMethod.get;\n\n    this.url.search = \"\";\n\n    const [url, body] = buildResourceAndBody(this.url, fetchMethod, fetchBody, this.enctype);\n\n    this.url = url;\n    this.fetchOptions.body = body;\n    this.fetchOptions.method = fetchMethod.toUpperCase();\n  }\n\n  get headers() {\n    return this.fetchOptions.headers\n  }\n\n  set headers(value) {\n    this.fetchOptions.headers = value;\n  }\n\n  get body() {\n    if (this.isSafe) {\n      return this.url.searchParams\n    } else {\n      return this.fetchOptions.body\n    }\n  }\n\n  set body(value) {\n    this.fetchOptions.body = value;\n  }\n\n  get location() {\n    return this.url\n  }\n\n  get params() {\n    return this.url.searchParams\n  }\n\n  get entries() {\n    return this.body ? Array.from(this.body.entries()) : []\n  }\n\n  cancel() {\n    this.abortController.abort();\n  }\n\n  async perform() {\n    const { fetchOptions } = this;\n    this.delegate.prepareRequest(this);\n    const event = await this.#allowRequestToBeIntercepted(fetchOptions);\n    try {\n      this.delegate.requestStarted(this);\n\n      if (event.detail.fetchRequest) {\n        this.response = event.detail.fetchRequest.response;\n      } else {\n        this.response = fetchWithTurboHeaders(this.url.href, fetchOptions);\n      }\n\n      const response = await this.response;\n      return await this.receive(response)\n    } catch (error) {\n      if (error.name !== \"AbortError\") {\n        if (this.#willDelegateErrorHandling(error)) {\n          this.delegate.requestErrored(this, error);\n        }\n        throw error\n      }\n    } finally {\n      this.delegate.requestFinished(this);\n    }\n  }\n\n  async receive(response) {\n    const fetchResponse = new FetchResponse(response);\n    const event = dispatch(\"turbo:before-fetch-response\", {\n      cancelable: true,\n      detail: { fetchResponse },\n      target: this.target\n    });\n    if (event.defaultPrevented) {\n      this.delegate.requestPreventedHandlingResponse(this, fetchResponse);\n    } else if (fetchResponse.succeeded) {\n      this.delegate.requestSucceededWithResponse(this, fetchResponse);\n    } else {\n      this.delegate.requestFailedWithResponse(this, fetchResponse);\n    }\n    return fetchResponse\n  }\n\n  get defaultHeaders() {\n    return {\n      Accept: \"text/html, application/xhtml+xml\"\n    }\n  }\n\n  get isSafe() {\n    return isSafe(this.method)\n  }\n\n  get abortSignal() {\n    return this.abortController.signal\n  }\n\n  acceptResponseType(mimeType) {\n    this.headers[\"Accept\"] = [mimeType, this.headers[\"Accept\"]].join(\", \");\n  }\n\n  async #allowRequestToBeIntercepted(fetchOptions) {\n    const requestInterception = new Promise((resolve) => (this.#resolveRequestPromise = resolve));\n    const event = dispatch(\"turbo:before-fetch-request\", {\n      cancelable: true,\n      detail: {\n        fetchOptions,\n        url: this.url,\n        resume: this.#resolveRequestPromise\n      },\n      target: this.target\n    });\n    this.url = event.detail.url;\n    if (event.defaultPrevented) await requestInterception;\n\n    return event\n  }\n\n  #willDelegateErrorHandling(error) {\n    const event = dispatch(\"turbo:fetch-request-error\", {\n      target: this.target,\n      cancelable: true,\n      detail: { request: this, error: error }\n    });\n\n    return !event.defaultPrevented\n  }\n}\n\nfunction isSafe(fetchMethod) {\n  return fetchMethodFromString(fetchMethod) == FetchMethod.get\n}\n\nfunction buildResourceAndBody(resource, method, requestBody, enctype) {\n  const searchParams =\n    Array.from(requestBody).length > 0 ? new URLSearchParams(entriesExcludingFiles(requestBody)) : resource.searchParams;\n\n  if (isSafe(method)) {\n    return [mergeIntoURLSearchParams(resource, searchParams), null]\n  } else if (enctype == FetchEnctype.urlEncoded) {\n    return [resource, searchParams]\n  } else {\n    return [resource, requestBody]\n  }\n}\n\nfunction entriesExcludingFiles(requestBody) {\n  const entries = [];\n\n  for (const [name, value] of requestBody) {\n    if (value instanceof File) continue\n    else entries.push([name, value]);\n  }\n\n  return entries\n}\n\nfunction mergeIntoURLSearchParams(url, requestBody) {\n  const searchParams = new URLSearchParams(entriesExcludingFiles(requestBody));\n\n  url.search = searchParams.toString();\n\n  return url\n}\n\nclass AppearanceObserver {\n  started = false\n\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.element = element;\n    this.intersectionObserver = new IntersectionObserver(this.intersect);\n  }\n\n  start() {\n    if (!this.started) {\n      this.started = true;\n      this.intersectionObserver.observe(this.element);\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.started = false;\n      this.intersectionObserver.unobserve(this.element);\n    }\n  }\n\n  intersect = (entries) => {\n    const lastEntry = entries.slice(-1)[0];\n    if (lastEntry?.isIntersecting) {\n      this.delegate.elementAppearedInViewport(this.element);\n    }\n  }\n}\n\nclass StreamMessage {\n  static contentType = \"text/vnd.turbo-stream.html\"\n\n  static wrap(message) {\n    if (typeof message == \"string\") {\n      return new this(createDocumentFragment(message))\n    } else {\n      return message\n    }\n  }\n\n  constructor(fragment) {\n    this.fragment = importStreamElements(fragment);\n  }\n}\n\nfunction importStreamElements(fragment) {\n  for (const element of fragment.querySelectorAll(\"turbo-stream\")) {\n    const streamElement = document.importNode(element, true);\n\n    for (const inertScriptElement of streamElement.templateElement.content.querySelectorAll(\"script\")) {\n      inertScriptElement.replaceWith(activateScriptElement(inertScriptElement));\n    }\n\n    element.replaceWith(streamElement);\n  }\n\n  return fragment\n}\n\nconst identity = key => key;\n\nclass LRUCache {\n  keys = []\n  entries = {}\n  #toCacheKey\n\n  constructor(size, toCacheKey = identity) {\n    this.size = size;\n    this.#toCacheKey = toCacheKey;\n  }\n\n  has(key) {\n    return this.#toCacheKey(key) in this.entries\n  }\n\n  get(key) {\n    if (this.has(key)) {\n      const entry = this.read(key);\n      this.touch(key);\n      return entry\n    }\n  }\n\n  put(key, entry) {\n    this.write(key, entry);\n    this.touch(key);\n    return entry\n  }\n\n  clear() {\n    for (const key of Object.keys(this.entries)) {\n      this.evict(key);\n    }\n  }\n\n  // Private\n\n  read(key) {\n    return this.entries[this.#toCacheKey(key)]\n  }\n\n  write(key, entry) {\n    this.entries[this.#toCacheKey(key)] = entry;\n  }\n\n  touch(key) {\n    key = this.#toCacheKey(key);\n    const index = this.keys.indexOf(key);\n    if (index > -1) this.keys.splice(index, 1);\n    this.keys.unshift(key);\n    this.trim();\n  }\n\n  trim() {\n    for (const key of this.keys.splice(this.size)) {\n      this.evict(key);\n    }\n  }\n\n  evict(key) {\n    delete this.entries[key];\n  }\n}\n\nconst PREFETCH_DELAY = 100;\n\nclass PrefetchCache extends LRUCache {\n  #prefetchTimeout = null\n  #maxAges = {}\n\n  constructor(size = 1, prefetchDelay = PREFETCH_DELAY) {\n    super(size, toCacheKey);\n    this.prefetchDelay = prefetchDelay;\n  }\n\n  putLater(url, request, ttl) {\n    this.#prefetchTimeout = setTimeout(() => {\n      request.perform();\n      this.put(url, request, ttl);\n      this.#prefetchTimeout = null;\n    }, this.prefetchDelay);\n  }\n\n  put(url, request, ttl = cacheTtl) {\n    super.put(url, request);\n    this.#maxAges[toCacheKey(url)] = new Date(new Date().getTime() + ttl);\n  }\n\n  clear() {\n    super.clear();\n    if (this.#prefetchTimeout) clearTimeout(this.#prefetchTimeout);\n  }\n\n  evict(key) {\n    super.evict(key);\n    delete this.#maxAges[key];\n  }\n\n  has(key) {\n    if (super.has(key)) {\n      const maxAge = this.#maxAges[toCacheKey(key)];\n\n      return maxAge && maxAge > Date.now()\n    } else {\n      return false\n    }\n  }\n}\n\nconst cacheTtl = 10 * 1000;\nconst prefetchCache = new PrefetchCache();\n\nconst FormSubmissionState = {\n  initialized: \"initialized\",\n  requesting: \"requesting\",\n  waiting: \"waiting\",\n  receiving: \"receiving\",\n  stopping: \"stopping\",\n  stopped: \"stopped\"\n};\n\nclass FormSubmission {\n  state = FormSubmissionState.initialized\n\n  static confirmMethod(message) {\n    return Promise.resolve(confirm(message))\n  }\n\n  constructor(delegate, formElement, submitter, mustRedirect = false) {\n    const method = getMethod(formElement, submitter);\n    const action = getAction(getFormAction(formElement, submitter), method);\n    const body = buildFormData(formElement, submitter);\n    const enctype = getEnctype(formElement, submitter);\n\n    this.delegate = delegate;\n    this.formElement = formElement;\n    this.submitter = submitter;\n    this.fetchRequest = new FetchRequest(this, method, action, body, formElement, enctype);\n    this.mustRedirect = mustRedirect;\n  }\n\n  get method() {\n    return this.fetchRequest.method\n  }\n\n  set method(value) {\n    this.fetchRequest.method = value;\n  }\n\n  get action() {\n    return this.fetchRequest.url.toString()\n  }\n\n  set action(value) {\n    this.fetchRequest.url = expandURL(value);\n  }\n\n  get body() {\n    return this.fetchRequest.body\n  }\n\n  get enctype() {\n    return this.fetchRequest.enctype\n  }\n\n  get isSafe() {\n    return this.fetchRequest.isSafe\n  }\n\n  get location() {\n    return this.fetchRequest.url\n  }\n\n  // The submission process\n\n  async start() {\n    const { initialized, requesting } = FormSubmissionState;\n    const confirmationMessage = getAttribute(\"data-turbo-confirm\", this.submitter, this.formElement);\n\n    if (typeof confirmationMessage === \"string\") {\n      const confirmMethod = typeof config.forms.confirm === \"function\" ?\n        config.forms.confirm :\n        FormSubmission.confirmMethod;\n\n      const answer = await confirmMethod(confirmationMessage, this.formElement, this.submitter);\n      if (!answer) {\n        return\n      }\n    }\n\n    if (this.state == initialized) {\n      this.state = requesting;\n      return this.fetchRequest.perform()\n    }\n  }\n\n  stop() {\n    const { stopping, stopped } = FormSubmissionState;\n    if (this.state != stopping && this.state != stopped) {\n      this.state = stopping;\n      this.fetchRequest.cancel();\n      return true\n    }\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(request) {\n    if (!request.isSafe) {\n      const token = getCookieValue(getMetaContent(\"csrf-param\")) || getMetaContent(\"csrf-token\");\n      if (token) {\n        request.headers[\"X-CSRF-Token\"] = token;\n      }\n    }\n\n    if (this.requestAcceptsTurboStreamResponse(request)) {\n      request.acceptResponseType(StreamMessage.contentType);\n    }\n  }\n\n  requestStarted(_request) {\n    this.state = FormSubmissionState.waiting;\n    if (this.submitter) config.forms.submitter.beforeSubmit(this.submitter);\n    this.setSubmitsWith();\n    markAsBusy(this.formElement);\n    dispatch(\"turbo:submit-start\", {\n      target: this.formElement,\n      detail: { formSubmission: this }\n    });\n    this.delegate.formSubmissionStarted(this);\n  }\n\n  requestPreventedHandlingResponse(request, response) {\n    prefetchCache.clear();\n\n    this.result = { success: response.succeeded, fetchResponse: response };\n  }\n\n  requestSucceededWithResponse(request, response) {\n    if (response.clientError || response.serverError) {\n      this.delegate.formSubmissionFailedWithResponse(this, response);\n      return\n    }\n\n    prefetchCache.clear();\n\n    if (this.requestMustRedirect(request) && responseSucceededWithoutRedirect(response)) {\n      const error = new Error(\"Form responses must redirect to another location\");\n      this.delegate.formSubmissionErrored(this, error);\n    } else {\n      this.state = FormSubmissionState.receiving;\n      this.result = { success: true, fetchResponse: response };\n      this.delegate.formSubmissionSucceededWithResponse(this, response);\n    }\n  }\n\n  requestFailedWithResponse(request, response) {\n    this.result = { success: false, fetchResponse: response };\n    this.delegate.formSubmissionFailedWithResponse(this, response);\n  }\n\n  requestErrored(request, error) {\n    this.result = { success: false, error };\n    this.delegate.formSubmissionErrored(this, error);\n  }\n\n  requestFinished(_request) {\n    this.state = FormSubmissionState.stopped;\n    if (this.submitter) config.forms.submitter.afterSubmit(this.submitter);\n    this.resetSubmitterText();\n    clearBusyState(this.formElement);\n    dispatch(\"turbo:submit-end\", {\n      target: this.formElement,\n      detail: { formSubmission: this, ...this.result }\n    });\n    this.delegate.formSubmissionFinished(this);\n  }\n\n  // Private\n\n  setSubmitsWith() {\n    if (!this.submitter || !this.submitsWith) return\n\n    if (this.submitter.matches(\"button\")) {\n      this.originalSubmitText = this.submitter.innerHTML;\n      this.submitter.innerHTML = this.submitsWith;\n    } else if (this.submitter.matches(\"input\")) {\n      const input = this.submitter;\n      this.originalSubmitText = input.value;\n      input.value = this.submitsWith;\n    }\n  }\n\n  resetSubmitterText() {\n    if (!this.submitter || !this.originalSubmitText) return\n\n    if (this.submitter.matches(\"button\")) {\n      this.submitter.innerHTML = this.originalSubmitText;\n    } else if (this.submitter.matches(\"input\")) {\n      const input = this.submitter;\n      input.value = this.originalSubmitText;\n    }\n  }\n\n  requestMustRedirect(request) {\n    return !request.isSafe && this.mustRedirect\n  }\n\n  requestAcceptsTurboStreamResponse(request) {\n    return !request.isSafe || hasAttribute(\"data-turbo-stream\", this.submitter, this.formElement)\n  }\n\n  get submitsWith() {\n    return this.submitter?.getAttribute(\"data-turbo-submits-with\")\n  }\n}\n\nfunction buildFormData(formElement, submitter) {\n  const formData = new FormData(formElement);\n  const name = submitter?.getAttribute(\"name\");\n  const value = submitter?.getAttribute(\"value\");\n\n  if (name) {\n    formData.append(name, value || \"\");\n  }\n\n  return formData\n}\n\nfunction getCookieValue(cookieName) {\n  if (cookieName != null) {\n    const cookies = document.cookie ? document.cookie.split(\"; \") : [];\n    const cookie = cookies.find((cookie) => cookie.startsWith(cookieName));\n    if (cookie) {\n      const value = cookie.split(\"=\").slice(1).join(\"=\");\n      return value ? decodeURIComponent(value) : undefined\n    }\n  }\n}\n\nfunction responseSucceededWithoutRedirect(response) {\n  return response.statusCode == 200 && !response.redirected\n}\n\nfunction getFormAction(formElement, submitter) {\n  const formElementAction = typeof formElement.action === \"string\" ? formElement.action : null;\n\n  if (submitter?.hasAttribute(\"formaction\")) {\n    return submitter.getAttribute(\"formaction\") || \"\"\n  } else {\n    return formElement.getAttribute(\"action\") || formElementAction || \"\"\n  }\n}\n\nfunction getAction(formAction, fetchMethod) {\n  const action = expandURL(formAction);\n\n  if (isSafe(fetchMethod)) {\n    action.search = \"\";\n  }\n\n  return action\n}\n\nfunction getMethod(formElement, submitter) {\n  const method = submitter?.getAttribute(\"formmethod\") || formElement.getAttribute(\"method\") || \"\";\n  return fetchMethodFromString(method.toLowerCase()) || FetchMethod.get\n}\n\nfunction getEnctype(formElement, submitter) {\n  return fetchEnctypeFromString(submitter?.getAttribute(\"formenctype\") || formElement.enctype)\n}\n\nclass Snapshot {\n  constructor(element) {\n    this.element = element;\n  }\n\n  get activeElement() {\n    return this.element.ownerDocument.activeElement\n  }\n\n  get children() {\n    return [...this.element.children]\n  }\n\n  hasAnchor(anchor) {\n    return this.getElementForAnchor(anchor) != null\n  }\n\n  getElementForAnchor(anchor) {\n    return anchor ? this.element.querySelector(`[id='${anchor}'], a[name='${anchor}']`) : null\n  }\n\n  get isConnected() {\n    return this.element.isConnected\n  }\n\n  get firstAutofocusableElement() {\n    return queryAutofocusableElement(this.element)\n  }\n\n  get permanentElements() {\n    return queryPermanentElementsAll(this.element)\n  }\n\n  getPermanentElementById(id) {\n    return getPermanentElementById(this.element, id)\n  }\n\n  getPermanentElementMapForSnapshot(snapshot) {\n    const permanentElementMap = {};\n\n    for (const currentPermanentElement of this.permanentElements) {\n      const { id } = currentPermanentElement;\n      const newPermanentElement = snapshot.getPermanentElementById(id);\n      if (newPermanentElement) {\n        permanentElementMap[id] = [currentPermanentElement, newPermanentElement];\n      }\n    }\n\n    return permanentElementMap\n  }\n}\n\nfunction getPermanentElementById(node, id) {\n  return node.querySelector(`#${id}[data-turbo-permanent]`)\n}\n\nfunction queryPermanentElementsAll(node) {\n  return node.querySelectorAll(\"[id][data-turbo-permanent]\")\n}\n\nclass FormSubmitObserver {\n  started = false\n\n  constructor(delegate, eventTarget) {\n    this.delegate = delegate;\n    this.eventTarget = eventTarget;\n  }\n\n  start() {\n    if (!this.started) {\n      this.eventTarget.addEventListener(\"submit\", this.submitCaptured, true);\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.eventTarget.removeEventListener(\"submit\", this.submitCaptured, true);\n      this.started = false;\n    }\n  }\n\n  submitCaptured = () => {\n    this.eventTarget.removeEventListener(\"submit\", this.submitBubbled, false);\n    this.eventTarget.addEventListener(\"submit\", this.submitBubbled, false);\n  }\n\n  submitBubbled = (event) => {\n    if (!event.defaultPrevented) {\n      const form = event.target instanceof HTMLFormElement ? event.target : undefined;\n      const submitter = event.submitter || undefined;\n\n      if (\n        form &&\n        submissionDoesNotDismissDialog(form, submitter) &&\n        submissionDoesNotTargetIFrame(form, submitter) &&\n        this.delegate.willSubmitForm(form, submitter)\n      ) {\n        event.preventDefault();\n        event.stopImmediatePropagation();\n        this.delegate.formSubmitted(form, submitter);\n      }\n    }\n  }\n}\n\nfunction submissionDoesNotDismissDialog(form, submitter) {\n  const method = submitter?.getAttribute(\"formmethod\") || form.getAttribute(\"method\");\n\n  return method != \"dialog\"\n}\n\nfunction submissionDoesNotTargetIFrame(form, submitter) {\n  const target = submitter?.getAttribute(\"formtarget\") || form.getAttribute(\"target\");\n\n  return doesNotTargetIFrame(target)\n}\n\nclass View {\n  #resolveRenderPromise = (_value) => {}\n  #resolveInterceptionPromise = (_value) => {}\n\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.element = element;\n  }\n\n  // Scrolling\n\n  scrollToAnchor(anchor) {\n    const element = this.snapshot.getElementForAnchor(anchor);\n    if (element) {\n      this.focusElement(element);\n      this.scrollToElement(element);\n    } else {\n      this.scrollToPosition({ x: 0, y: 0 });\n    }\n  }\n\n  scrollToAnchorFromLocation(location) {\n    this.scrollToAnchor(getAnchor(location));\n  }\n\n  scrollToElement(element) {\n    element.scrollIntoView();\n  }\n\n  focusElement(element) {\n    if (element instanceof HTMLElement) {\n      if (element.hasAttribute(\"tabindex\")) {\n        element.focus();\n      } else {\n        element.setAttribute(\"tabindex\", \"-1\");\n        element.focus();\n        element.removeAttribute(\"tabindex\");\n      }\n    }\n  }\n\n  scrollToPosition({ x, y }) {\n    this.scrollRoot.scrollTo(x, y);\n  }\n\n  scrollToTop() {\n    this.scrollToPosition({ x: 0, y: 0 });\n  }\n\n  get scrollRoot() {\n    return window\n  }\n\n  // Rendering\n\n  async render(renderer) {\n    const { isPreview, shouldRender, willRender, newSnapshot: snapshot } = renderer;\n\n    // A workaround to ignore tracked element mismatch reloads when performing\n    // a promoted Visit from a frame navigation\n    const shouldInvalidate = willRender;\n\n    if (shouldRender) {\n      try {\n        this.renderPromise = new Promise((resolve) => (this.#resolveRenderPromise = resolve));\n        this.renderer = renderer;\n        await this.prepareToRenderSnapshot(renderer);\n\n        const renderInterception = new Promise((resolve) => (this.#resolveInterceptionPromise = resolve));\n        const options = { resume: this.#resolveInterceptionPromise, render: this.renderer.renderElement, renderMethod: this.renderer.renderMethod };\n        const immediateRender = this.delegate.allowsImmediateRender(snapshot, options);\n        if (!immediateRender) await renderInterception;\n\n        await this.renderSnapshot(renderer);\n        this.delegate.viewRenderedSnapshot(snapshot, isPreview, this.renderer.renderMethod);\n        this.delegate.preloadOnLoadLinksForView(this.element);\n        this.finishRenderingSnapshot(renderer);\n      } finally {\n        delete this.renderer;\n        this.#resolveRenderPromise(undefined);\n        delete this.renderPromise;\n      }\n    } else if (shouldInvalidate) {\n      this.invalidate(renderer.reloadReason);\n    }\n  }\n\n  invalidate(reason) {\n    this.delegate.viewInvalidated(reason);\n  }\n\n  async prepareToRenderSnapshot(renderer) {\n    this.markAsPreview(renderer.isPreview);\n    await renderer.prepareToRender();\n  }\n\n  markAsPreview(isPreview) {\n    if (isPreview) {\n      this.element.setAttribute(\"data-turbo-preview\", \"\");\n    } else {\n      this.element.removeAttribute(\"data-turbo-preview\");\n    }\n  }\n\n  markVisitDirection(direction) {\n    this.element.setAttribute(\"data-turbo-visit-direction\", direction);\n  }\n\n  unmarkVisitDirection() {\n    this.element.removeAttribute(\"data-turbo-visit-direction\");\n  }\n\n  async renderSnapshot(renderer) {\n    await renderer.render();\n  }\n\n  finishRenderingSnapshot(renderer) {\n    renderer.finishRendering();\n  }\n}\n\nclass FrameView extends View {\n  missing() {\n    this.element.innerHTML = `<strong class=\"turbo-frame-error\">Content missing</strong>`;\n  }\n\n  get snapshot() {\n    return new Snapshot(this.element)\n  }\n}\n\nclass LinkInterceptor {\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.element = element;\n  }\n\n  start() {\n    this.element.addEventListener(\"click\", this.clickBubbled);\n    document.addEventListener(\"turbo:click\", this.linkClicked);\n    document.addEventListener(\"turbo:before-visit\", this.willVisit);\n  }\n\n  stop() {\n    this.element.removeEventListener(\"click\", this.clickBubbled);\n    document.removeEventListener(\"turbo:click\", this.linkClicked);\n    document.removeEventListener(\"turbo:before-visit\", this.willVisit);\n  }\n\n  clickBubbled = (event) => {\n    if (this.clickEventIsSignificant(event)) {\n      this.clickEvent = event;\n    } else {\n      delete this.clickEvent;\n    }\n  }\n\n  linkClicked = (event) => {\n    if (this.clickEvent && this.clickEventIsSignificant(event)) {\n      if (this.delegate.shouldInterceptLinkClick(event.target, event.detail.url, event.detail.originalEvent)) {\n        this.clickEvent.preventDefault();\n        event.preventDefault();\n        this.delegate.linkClickIntercepted(event.target, event.detail.url, event.detail.originalEvent);\n      }\n    }\n    delete this.clickEvent;\n  }\n\n  willVisit = (_event) => {\n    delete this.clickEvent;\n  }\n\n  clickEventIsSignificant(event) {\n    const target = event.composed ? event.target?.parentElement : event.target;\n    const element = findLinkFromClickTarget(target) || target;\n\n    return element instanceof Element && element.closest(\"turbo-frame, html\") == this.element\n  }\n}\n\nclass LinkClickObserver {\n  started = false\n\n  constructor(delegate, eventTarget) {\n    this.delegate = delegate;\n    this.eventTarget = eventTarget;\n  }\n\n  start() {\n    if (!this.started) {\n      this.eventTarget.addEventListener(\"click\", this.clickCaptured, true);\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.eventTarget.removeEventListener(\"click\", this.clickCaptured, true);\n      this.started = false;\n    }\n  }\n\n  clickCaptured = () => {\n    this.eventTarget.removeEventListener(\"click\", this.clickBubbled, false);\n    this.eventTarget.addEventListener(\"click\", this.clickBubbled, false);\n  }\n\n  clickBubbled = (event) => {\n    if (event instanceof MouseEvent && this.clickEventIsSignificant(event)) {\n      const target = (event.composedPath && event.composedPath()[0]) || event.target;\n      const link = findLinkFromClickTarget(target);\n      if (link && doesNotTargetIFrame(link.target)) {\n        const location = getLocationForLink(link);\n        if (this.delegate.willFollowLinkToLocation(link, location, event)) {\n          event.preventDefault();\n          this.delegate.followedLinkToLocation(link, location);\n        }\n      }\n    }\n  }\n\n  clickEventIsSignificant(event) {\n    return !(\n      (event.target && event.target.isContentEditable) ||\n      event.defaultPrevented ||\n      event.which > 1 ||\n      event.altKey ||\n      event.ctrlKey ||\n      event.metaKey ||\n      event.shiftKey\n    )\n  }\n}\n\nclass FormLinkClickObserver {\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.linkInterceptor = new LinkClickObserver(this, element);\n  }\n\n  start() {\n    this.linkInterceptor.start();\n  }\n\n  stop() {\n    this.linkInterceptor.stop();\n  }\n\n  // Link hover observer delegate\n\n  canPrefetchRequestToLocation(link, location) {\n    return false\n  }\n\n  prefetchAndCacheRequestToLocation(link, location) {\n    return\n  }\n\n  // Link click observer delegate\n\n  willFollowLinkToLocation(link, location, originalEvent) {\n    return (\n      this.delegate.willSubmitFormLinkToLocation(link, location, originalEvent) &&\n      (link.hasAttribute(\"data-turbo-method\") || link.hasAttribute(\"data-turbo-stream\"))\n    )\n  }\n\n  followedLinkToLocation(link, location) {\n    const form = document.createElement(\"form\");\n\n    const type = \"hidden\";\n    for (const [name, value] of location.searchParams) {\n      form.append(Object.assign(document.createElement(\"input\"), { type, name, value }));\n    }\n\n    const action = Object.assign(location, { search: \"\" });\n    form.setAttribute(\"data-turbo\", \"true\");\n    form.setAttribute(\"action\", action.href);\n    form.setAttribute(\"hidden\", \"\");\n\n    const method = link.getAttribute(\"data-turbo-method\");\n    if (method) form.setAttribute(\"method\", method);\n\n    const turboFrame = link.getAttribute(\"data-turbo-frame\");\n    if (turboFrame) form.setAttribute(\"data-turbo-frame\", turboFrame);\n\n    const turboAction = getVisitAction(link);\n    if (turboAction) form.setAttribute(\"data-turbo-action\", turboAction);\n\n    const turboConfirm = link.getAttribute(\"data-turbo-confirm\");\n    if (turboConfirm) form.setAttribute(\"data-turbo-confirm\", turboConfirm);\n\n    const turboStream = link.hasAttribute(\"data-turbo-stream\");\n    if (turboStream) form.setAttribute(\"data-turbo-stream\", \"\");\n\n    this.delegate.submittedFormLinkToLocation(link, location, form);\n\n    document.body.appendChild(form);\n    form.addEventListener(\"turbo:submit-end\", () => form.remove(), { once: true });\n    requestAnimationFrame(() => form.requestSubmit());\n  }\n}\n\nclass Bardo {\n  static async preservingPermanentElements(delegate, permanentElementMap, callback) {\n    const bardo = new this(delegate, permanentElementMap);\n    bardo.enter();\n    await callback();\n    bardo.leave();\n  }\n\n  constructor(delegate, permanentElementMap) {\n    this.delegate = delegate;\n    this.permanentElementMap = permanentElementMap;\n  }\n\n  enter() {\n    for (const id in this.permanentElementMap) {\n      const [currentPermanentElement, newPermanentElement] = this.permanentElementMap[id];\n      this.delegate.enteringBardo(currentPermanentElement, newPermanentElement);\n      this.replaceNewPermanentElementWithPlaceholder(newPermanentElement);\n    }\n  }\n\n  leave() {\n    for (const id in this.permanentElementMap) {\n      const [currentPermanentElement] = this.permanentElementMap[id];\n      this.replaceCurrentPermanentElementWithClone(currentPermanentElement);\n      this.replacePlaceholderWithPermanentElement(currentPermanentElement);\n      this.delegate.leavingBardo(currentPermanentElement);\n    }\n  }\n\n  replaceNewPermanentElementWithPlaceholder(permanentElement) {\n    const placeholder = createPlaceholderForPermanentElement(permanentElement);\n    permanentElement.replaceWith(placeholder);\n  }\n\n  replaceCurrentPermanentElementWithClone(permanentElement) {\n    const clone = permanentElement.cloneNode(true);\n    permanentElement.replaceWith(clone);\n  }\n\n  replacePlaceholderWithPermanentElement(permanentElement) {\n    const placeholder = this.getPlaceholderById(permanentElement.id);\n    placeholder?.replaceWith(permanentElement);\n  }\n\n  getPlaceholderById(id) {\n    return this.placeholders.find((element) => element.content == id)\n  }\n\n  get placeholders() {\n    return [...document.querySelectorAll(\"meta[name=turbo-permanent-placeholder][content]\")]\n  }\n}\n\nfunction createPlaceholderForPermanentElement(permanentElement) {\n  const element = document.createElement(\"meta\");\n  element.setAttribute(\"name\", \"turbo-permanent-placeholder\");\n  element.setAttribute(\"content\", permanentElement.id);\n  return element\n}\n\nclass Renderer {\n  #activeElement = null\n\n  static renderElement(currentElement, newElement) {\n    // Abstract method\n  }\n\n  constructor(currentSnapshot, newSnapshot, isPreview, willRender = true) {\n    this.currentSnapshot = currentSnapshot;\n    this.newSnapshot = newSnapshot;\n    this.isPreview = isPreview;\n    this.willRender = willRender;\n    this.renderElement = this.constructor.renderElement;\n    this.promise = new Promise((resolve, reject) => (this.resolvingFunctions = { resolve, reject }));\n  }\n\n  get shouldRender() {\n    return true\n  }\n\n  get shouldAutofocus() {\n    return true\n  }\n\n  get reloadReason() {\n    return\n  }\n\n  prepareToRender() {\n    return\n  }\n\n  render() {\n    // Abstract method\n  }\n\n  finishRendering() {\n    if (this.resolvingFunctions) {\n      this.resolvingFunctions.resolve();\n      delete this.resolvingFunctions;\n    }\n  }\n\n  async preservingPermanentElements(callback) {\n    await Bardo.preservingPermanentElements(this, this.permanentElementMap, callback);\n  }\n\n  focusFirstAutofocusableElement() {\n    if (this.shouldAutofocus) {\n      const element = this.connectedSnapshot.firstAutofocusableElement;\n      if (element) {\n        element.focus();\n      }\n    }\n  }\n\n  // Bardo delegate\n\n  enteringBardo(currentPermanentElement) {\n    if (this.#activeElement) return\n\n    if (currentPermanentElement.contains(this.currentSnapshot.activeElement)) {\n      this.#activeElement = this.currentSnapshot.activeElement;\n    }\n  }\n\n  leavingBardo(currentPermanentElement) {\n    if (currentPermanentElement.contains(this.#activeElement) && this.#activeElement instanceof HTMLElement) {\n      this.#activeElement.focus();\n\n      this.#activeElement = null;\n    }\n  }\n\n  get connectedSnapshot() {\n    return this.newSnapshot.isConnected ? this.newSnapshot : this.currentSnapshot\n  }\n\n  get currentElement() {\n    return this.currentSnapshot.element\n  }\n\n  get newElement() {\n    return this.newSnapshot.element\n  }\n\n  get permanentElementMap() {\n    return this.currentSnapshot.getPermanentElementMapForSnapshot(this.newSnapshot)\n  }\n\n  get renderMethod() {\n    return \"replace\"\n  }\n}\n\nclass FrameRenderer extends Renderer {\n  static renderElement(currentElement, newElement) {\n    const destinationRange = document.createRange();\n    destinationRange.selectNodeContents(currentElement);\n    destinationRange.deleteContents();\n\n    const frameElement = newElement;\n    const sourceRange = frameElement.ownerDocument?.createRange();\n    if (sourceRange) {\n      sourceRange.selectNodeContents(frameElement);\n      currentElement.appendChild(sourceRange.extractContents());\n    }\n  }\n\n  constructor(delegate, currentSnapshot, newSnapshot, renderElement, isPreview, willRender = true) {\n    super(currentSnapshot, newSnapshot, renderElement, isPreview, willRender);\n    this.delegate = delegate;\n  }\n\n  get shouldRender() {\n    return true\n  }\n\n  async render() {\n    await nextRepaint();\n    this.preservingPermanentElements(() => {\n      this.loadFrameElement();\n    });\n    this.scrollFrameIntoView();\n    await nextRepaint();\n    this.focusFirstAutofocusableElement();\n    await nextRepaint();\n    this.activateScriptElements();\n  }\n\n  loadFrameElement() {\n    this.delegate.willRenderFrame(this.currentElement, this.newElement);\n    this.renderElement(this.currentElement, this.newElement);\n  }\n\n  scrollFrameIntoView() {\n    if (this.currentElement.autoscroll || this.newElement.autoscroll) {\n      const element = this.currentElement.firstElementChild;\n      const block = readScrollLogicalPosition(this.currentElement.getAttribute(\"data-autoscroll-block\"), \"end\");\n      const behavior = readScrollBehavior(this.currentElement.getAttribute(\"data-autoscroll-behavior\"), \"auto\");\n\n      if (element) {\n        element.scrollIntoView({ block, behavior });\n        return true\n      }\n    }\n    return false\n  }\n\n  activateScriptElements() {\n    for (const inertScriptElement of this.newScriptElements) {\n      const activatedScriptElement = activateScriptElement(inertScriptElement);\n      inertScriptElement.replaceWith(activatedScriptElement);\n    }\n  }\n\n  get newScriptElements() {\n    return this.currentElement.querySelectorAll(\"script\")\n  }\n}\n\nfunction readScrollLogicalPosition(value, defaultValue) {\n  if (value == \"end\" || value == \"start\" || value == \"center\" || value == \"nearest\") {\n    return value\n  } else {\n    return defaultValue\n  }\n}\n\nfunction readScrollBehavior(value, defaultValue) {\n  if (value == \"auto\" || value == \"smooth\") {\n    return value\n  } else {\n    return defaultValue\n  }\n}\n\n/**\n * @typedef {object} ConfigHead\n *\n * @property {'merge' | 'append' | 'morph' | 'none'} [style]\n * @property {boolean} [block]\n * @property {boolean} [ignore]\n * @property {function(Element): boolean} [shouldPreserve]\n * @property {function(Element): boolean} [shouldReAppend]\n * @property {function(Element): boolean} [shouldRemove]\n * @property {function(Element, {added: Node[], kept: Element[], removed: Element[]}): void} [afterHeadMorphed]\n */\n\n/**\n * @typedef {object} ConfigCallbacks\n *\n * @property {function(Node): boolean} [beforeNodeAdded]\n * @property {function(Node): void} [afterNodeAdded]\n * @property {function(Element, Node): boolean} [beforeNodeMorphed]\n * @property {function(Element, Node): void} [afterNodeMorphed]\n * @property {function(Element): boolean} [beforeNodeRemoved]\n * @property {function(Element): void} [afterNodeRemoved]\n * @property {function(string, Element, \"update\" | \"remove\"): boolean} [beforeAttributeUpdated]\n */\n\n/**\n * @typedef {object} Config\n *\n * @property {'outerHTML' | 'innerHTML'} [morphStyle]\n * @property {boolean} [ignoreActive]\n * @property {boolean} [ignoreActiveValue]\n * @property {boolean} [restoreFocus]\n * @property {ConfigCallbacks} [callbacks]\n * @property {ConfigHead} [head]\n */\n\n/**\n * @typedef {function} NoOp\n *\n * @returns {void}\n */\n\n/**\n * @typedef {object} ConfigHeadInternal\n *\n * @property {'merge' | 'append' | 'morph' | 'none'} style\n * @property {boolean} [block]\n * @property {boolean} [ignore]\n * @property {(function(Element): boolean) | NoOp} shouldPreserve\n * @property {(function(Element): boolean) | NoOp} shouldReAppend\n * @property {(function(Element): boolean) | NoOp} shouldRemove\n * @property {(function(Element, {added: Node[], kept: Element[], removed: Element[]}): void) | NoOp} afterHeadMorphed\n */\n\n/**\n * @typedef {object} ConfigCallbacksInternal\n *\n * @property {(function(Node): boolean) | NoOp} beforeNodeAdded\n * @property {(function(Node): void) | NoOp} afterNodeAdded\n * @property {(function(Node, Node): boolean) | NoOp} beforeNodeMorphed\n * @property {(function(Node, Node): void) | NoOp} afterNodeMorphed\n * @property {(function(Node): boolean) | NoOp} beforeNodeRemoved\n * @property {(function(Node): void) | NoOp} afterNodeRemoved\n * @property {(function(string, Element, \"update\" | \"remove\"): boolean) | NoOp} beforeAttributeUpdated\n */\n\n/**\n * @typedef {object} ConfigInternal\n *\n * @property {'outerHTML' | 'innerHTML'} morphStyle\n * @property {boolean} [ignoreActive]\n * @property {boolean} [ignoreActiveValue]\n * @property {boolean} [restoreFocus]\n * @property {ConfigCallbacksInternal} callbacks\n * @property {ConfigHeadInternal} head\n */\n\n/**\n * @typedef {Object} IdSets\n * @property {Set<string>} persistentIds\n * @property {Map<Node, Set<string>>} idMap\n */\n\n/**\n * @typedef {Function} Morph\n *\n * @param {Element | Document} oldNode\n * @param {Element | Node | HTMLCollection | Node[] | string | null} newContent\n * @param {Config} [config]\n * @returns {undefined | Node[]}\n */\n\n// base IIFE to define idiomorph\n/**\n *\n * @type {{defaults: ConfigInternal, morph: Morph}}\n */\nvar Idiomorph = (function () {\n\n  /**\n   * @typedef {object} MorphContext\n   *\n   * @property {Element} target\n   * @property {Element} newContent\n   * @property {ConfigInternal} config\n   * @property {ConfigInternal['morphStyle']} morphStyle\n   * @property {ConfigInternal['ignoreActive']} ignoreActive\n   * @property {ConfigInternal['ignoreActiveValue']} ignoreActiveValue\n   * @property {ConfigInternal['restoreFocus']} restoreFocus\n   * @property {Map<Node, Set<string>>} idMap\n   * @property {Set<string>} persistentIds\n   * @property {ConfigInternal['callbacks']} callbacks\n   * @property {ConfigInternal['head']} head\n   * @property {HTMLDivElement} pantry\n   * @property {Element[]} activeElementAndParents\n   */\n\n  //=============================================================================\n  // AND NOW IT BEGINS...\n  //=============================================================================\n\n  const noOp = () => {};\n  /**\n   * Default configuration values, updatable by users now\n   * @type {ConfigInternal}\n   */\n  const defaults = {\n    morphStyle: \"outerHTML\",\n    callbacks: {\n      beforeNodeAdded: noOp,\n      afterNodeAdded: noOp,\n      beforeNodeMorphed: noOp,\n      afterNodeMorphed: noOp,\n      beforeNodeRemoved: noOp,\n      afterNodeRemoved: noOp,\n      beforeAttributeUpdated: noOp,\n    },\n    head: {\n      style: \"merge\",\n      shouldPreserve: (elt) => elt.getAttribute(\"im-preserve\") === \"true\",\n      shouldReAppend: (elt) => elt.getAttribute(\"im-re-append\") === \"true\",\n      shouldRemove: noOp,\n      afterHeadMorphed: noOp,\n    },\n    restoreFocus: true,\n  };\n\n  /**\n   * Core idiomorph function for morphing one DOM tree to another\n   *\n   * @param {Element | Document} oldNode\n   * @param {Element | Node | HTMLCollection | Node[] | string | null} newContent\n   * @param {Config} [config]\n   * @returns {Promise<Node[]> | Node[]}\n   */\n  function morph(oldNode, newContent, config = {}) {\n    oldNode = normalizeElement(oldNode);\n    const newNode = normalizeParent(newContent);\n    const ctx = createMorphContext(oldNode, newNode, config);\n\n    const morphedNodes = saveAndRestoreFocus(ctx, () => {\n      return withHeadBlocking(\n        ctx,\n        oldNode,\n        newNode,\n        /** @param {MorphContext} ctx */ (ctx) => {\n          if (ctx.morphStyle === \"innerHTML\") {\n            morphChildren(ctx, oldNode, newNode);\n            return Array.from(oldNode.childNodes);\n          } else {\n            return morphOuterHTML(ctx, oldNode, newNode);\n          }\n        },\n      );\n    });\n\n    ctx.pantry.remove();\n    return morphedNodes;\n  }\n\n  /**\n   * Morph just the outerHTML of the oldNode to the newContent\n   * We have to be careful because the oldNode could have siblings which need to be untouched\n   * @param {MorphContext} ctx\n   * @param {Element} oldNode\n   * @param {Element} newNode\n   * @returns {Node[]}\n   */\n  function morphOuterHTML(ctx, oldNode, newNode) {\n    const oldParent = normalizeParent(oldNode);\n    morphChildren(\n      ctx,\n      oldParent,\n      newNode,\n      // these two optional params are the secret sauce\n      oldNode, // start point for iteration\n      oldNode.nextSibling, // end point for iteration\n    );\n    // this is safe even with siblings, because normalizeParent returns a SlicedParentNode if needed.\n    return Array.from(oldParent.childNodes);\n  }\n\n  /**\n   * @param {MorphContext} ctx\n   * @param {Function} fn\n   * @returns {Promise<Node[]> | Node[]}\n   */\n  function saveAndRestoreFocus(ctx, fn) {\n    if (!ctx.config.restoreFocus) return fn();\n    let activeElement =\n      /** @type {HTMLInputElement|HTMLTextAreaElement|null} */ (\n        document.activeElement\n      );\n\n    // don't bother if the active element is not an input or textarea\n    if (\n      !(\n        activeElement instanceof HTMLInputElement ||\n        activeElement instanceof HTMLTextAreaElement\n      )\n    ) {\n      return fn();\n    }\n\n    const { id: activeElementId, selectionStart, selectionEnd } = activeElement;\n\n    const results = fn();\n\n    if (\n      activeElementId &&\n      activeElementId !== document.activeElement?.getAttribute(\"id\")\n    ) {\n      activeElement = ctx.target.querySelector(`[id=\"${activeElementId}\"]`);\n      activeElement?.focus();\n    }\n    if (activeElement && !activeElement.selectionEnd && selectionEnd) {\n      activeElement.setSelectionRange(selectionStart, selectionEnd);\n    }\n\n    return results;\n  }\n\n  const morphChildren = (function () {\n    /**\n     * This is the core algorithm for matching up children.  The idea is to use id sets to try to match up\n     * nodes as faithfully as possible.  We greedily match, which allows us to keep the algorithm fast, but\n     * by using id sets, we are able to better match up with content deeper in the DOM.\n     *\n     * Basic algorithm:\n     * - for each node in the new content:\n     *   - search self and siblings for an id set match, falling back to a soft match\n     *   - if match found\n     *     - remove any nodes up to the match:\n     *       - pantry persistent nodes\n     *       - delete the rest\n     *     - morph the match\n     *   - elsif no match found, and node is persistent\n     *     - find its match by querying the old root (future) and pantry (past)\n     *     - move it and its children here\n     *     - morph it\n     *   - else\n     *     - create a new node from scratch as a last result\n     *\n     * @param {MorphContext} ctx the merge context\n     * @param {Element} oldParent the old content that we are merging the new content into\n     * @param {Element} newParent the parent element of the new content\n     * @param {Node|null} [insertionPoint] the point in the DOM we start morphing at (defaults to first child)\n     * @param {Node|null} [endPoint] the point in the DOM we stop morphing at (defaults to after last child)\n     */\n    function morphChildren(\n      ctx,\n      oldParent,\n      newParent,\n      insertionPoint = null,\n      endPoint = null,\n    ) {\n      // normalize\n      if (\n        oldParent instanceof HTMLTemplateElement &&\n        newParent instanceof HTMLTemplateElement\n      ) {\n        // @ts-ignore we can pretend the DocumentFragment is an Element\n        oldParent = oldParent.content;\n        // @ts-ignore ditto\n        newParent = newParent.content;\n      }\n      insertionPoint ||= oldParent.firstChild;\n\n      // run through all the new content\n      for (const newChild of newParent.childNodes) {\n        // once we reach the end of the old parent content skip to the end and insert the rest\n        if (insertionPoint && insertionPoint != endPoint) {\n          const bestMatch = findBestMatch(\n            ctx,\n            newChild,\n            insertionPoint,\n            endPoint,\n          );\n          if (bestMatch) {\n            // if the node to morph is not at the insertion point then remove/move up to it\n            if (bestMatch !== insertionPoint) {\n              removeNodesBetween(ctx, insertionPoint, bestMatch);\n            }\n            morphNode(bestMatch, newChild, ctx);\n            insertionPoint = bestMatch.nextSibling;\n            continue;\n          }\n        }\n\n        // if the matching node is elsewhere in the original content\n        if (newChild instanceof Element) {\n          // we can pretend the id is non-null because the next `.has` line will reject it if not\n          const newChildId = /** @type {String} */ (\n            newChild.getAttribute(\"id\")\n          );\n          if (ctx.persistentIds.has(newChildId)) {\n            // move it and all its children here and morph\n            const movedChild = moveBeforeById(\n              oldParent,\n              newChildId,\n              insertionPoint,\n              ctx,\n            );\n            morphNode(movedChild, newChild, ctx);\n            insertionPoint = movedChild.nextSibling;\n            continue;\n          }\n        }\n\n        // last resort: insert the new node from scratch\n        const insertedNode = createNode(\n          oldParent,\n          newChild,\n          insertionPoint,\n          ctx,\n        );\n        // could be null if beforeNodeAdded prevented insertion\n        if (insertedNode) {\n          insertionPoint = insertedNode.nextSibling;\n        }\n      }\n\n      // remove any remaining old nodes that didn't match up with new content\n      while (insertionPoint && insertionPoint != endPoint) {\n        const tempNode = insertionPoint;\n        insertionPoint = insertionPoint.nextSibling;\n        removeNode(ctx, tempNode);\n      }\n    }\n\n    /**\n     * This performs the action of inserting a new node while handling situations where the node contains\n     * elements with persistent ids and possible state info we can still preserve by moving in and then morphing\n     *\n     * @param {Element} oldParent\n     * @param {Node} newChild\n     * @param {Node|null} insertionPoint\n     * @param {MorphContext} ctx\n     * @returns {Node|null}\n     */\n    function createNode(oldParent, newChild, insertionPoint, ctx) {\n      if (ctx.callbacks.beforeNodeAdded(newChild) === false) return null;\n      if (ctx.idMap.has(newChild)) {\n        // node has children with ids with possible state so create a dummy elt of same type and apply full morph algorithm\n        const newEmptyChild = document.createElement(\n          /** @type {Element} */ (newChild).tagName,\n        );\n        oldParent.insertBefore(newEmptyChild, insertionPoint);\n        morphNode(newEmptyChild, newChild, ctx);\n        ctx.callbacks.afterNodeAdded(newEmptyChild);\n        return newEmptyChild;\n      } else {\n        // optimisation: no id state to preserve so we can just insert a clone of the newChild and its descendants\n        const newClonedChild = document.importNode(newChild, true); // importNode to not mutate newParent\n        oldParent.insertBefore(newClonedChild, insertionPoint);\n        ctx.callbacks.afterNodeAdded(newClonedChild);\n        return newClonedChild;\n      }\n    }\n\n    //=============================================================================\n    // Matching Functions\n    //=============================================================================\n    const findBestMatch = (function () {\n      /**\n       * Scans forward from the startPoint to the endPoint looking for a match\n       * for the node. It looks for an id set match first, then a soft match.\n       * We abort softmatching if we find two future soft matches, to reduce churn.\n       * @param {Node} node\n       * @param {MorphContext} ctx\n       * @param {Node | null} startPoint\n       * @param {Node | null} endPoint\n       * @returns {Node | null}\n       */\n      function findBestMatch(ctx, node, startPoint, endPoint) {\n        let softMatch = null;\n        let nextSibling = node.nextSibling;\n        let siblingSoftMatchCount = 0;\n\n        let cursor = startPoint;\n        while (cursor && cursor != endPoint) {\n          // soft matching is a prerequisite for id set matching\n          if (isSoftMatch(cursor, node)) {\n            if (isIdSetMatch(ctx, cursor, node)) {\n              return cursor; // found an id set match, we're done!\n            }\n\n            // we haven't yet saved a soft match fallback\n            if (softMatch === null) {\n              // the current soft match will hard match something else in the future, leave it\n              if (!ctx.idMap.has(cursor)) {\n                // save this as the fallback if we get through the loop without finding a hard match\n                softMatch = cursor;\n              }\n            }\n          }\n          if (\n            softMatch === null &&\n            nextSibling &&\n            isSoftMatch(cursor, nextSibling)\n          ) {\n            // The next new node has a soft match with this node, so\n            // increment the count of future soft matches\n            siblingSoftMatchCount++;\n            nextSibling = nextSibling.nextSibling;\n\n            // If there are two future soft matches, block soft matching for this node to allow\n            // future siblings to soft match. This is to reduce churn in the DOM when an element\n            // is prepended.\n            if (siblingSoftMatchCount >= 2) {\n              softMatch = undefined;\n            }\n          }\n\n          // if the current node contains active element, stop looking for better future matches,\n          // because if one is found, this node will be moved to the pantry, reparenting it and thus losing focus\n          // @ts-ignore pretend cursor is Element rather than Node, we're just testing for array inclusion\n          if (ctx.activeElementAndParents.includes(cursor)) break;\n\n          cursor = cursor.nextSibling;\n        }\n\n        return softMatch || null;\n      }\n\n      /**\n       *\n       * @param {MorphContext} ctx\n       * @param {Node} oldNode\n       * @param {Node} newNode\n       * @returns {boolean}\n       */\n      function isIdSetMatch(ctx, oldNode, newNode) {\n        let oldSet = ctx.idMap.get(oldNode);\n        let newSet = ctx.idMap.get(newNode);\n\n        if (!newSet || !oldSet) return false;\n\n        for (const id of oldSet) {\n          // a potential match is an id in the new and old nodes that\n          // has not already been merged into the DOM\n          // But the newNode content we call this on has not been\n          // merged yet and we don't allow duplicate IDs so it is simple\n          if (newSet.has(id)) {\n            return true;\n          }\n        }\n        return false;\n      }\n\n      /**\n       *\n       * @param {Node} oldNode\n       * @param {Node} newNode\n       * @returns {boolean}\n       */\n      function isSoftMatch(oldNode, newNode) {\n        // ok to cast: if one is not element, `id` and `tagName` will be undefined and we'll just compare that.\n        const oldElt = /** @type {Element} */ (oldNode);\n        const newElt = /** @type {Element} */ (newNode);\n\n        return (\n          oldElt.nodeType === newElt.nodeType &&\n          oldElt.tagName === newElt.tagName &&\n          // If oldElt has an `id` with possible state and it doesn't match newElt.id then avoid morphing.\n          // We'll still match an anonymous node with an IDed newElt, though, because if it got this far,\n          // its not persistent, and new nodes can't have any hidden state.\n          // We can't use .id because of form input shadowing, and we can't count on .getAttribute's presence because it could be a document-fragment\n          (!oldElt.getAttribute?.(\"id\") ||\n            oldElt.getAttribute?.(\"id\") === newElt.getAttribute?.(\"id\"))\n        );\n      }\n\n      return findBestMatch;\n    })();\n\n    //=============================================================================\n    // DOM Manipulation Functions\n    //=============================================================================\n\n    /**\n     * Gets rid of an unwanted DOM node; strategy depends on nature of its reuse:\n     * - Persistent nodes will be moved to the pantry for later reuse\n     * - Other nodes will have their hooks called, and then are removed\n     * @param {MorphContext} ctx\n     * @param {Node} node\n     */\n    function removeNode(ctx, node) {\n      // are we going to id set match this later?\n      if (ctx.idMap.has(node)) {\n        // skip callbacks and move to pantry\n        moveBefore(ctx.pantry, node, null);\n      } else {\n        // remove for realsies\n        if (ctx.callbacks.beforeNodeRemoved(node) === false) return;\n        node.parentNode?.removeChild(node);\n        ctx.callbacks.afterNodeRemoved(node);\n      }\n    }\n\n    /**\n     * Remove nodes between the start and end nodes\n     * @param {MorphContext} ctx\n     * @param {Node} startInclusive\n     * @param {Node} endExclusive\n     * @returns {Node|null}\n     */\n    function removeNodesBetween(ctx, startInclusive, endExclusive) {\n      /** @type {Node | null} */\n      let cursor = startInclusive;\n      // remove nodes until the endExclusive node\n      while (cursor && cursor !== endExclusive) {\n        let tempNode = /** @type {Node} */ (cursor);\n        cursor = cursor.nextSibling;\n        removeNode(ctx, tempNode);\n      }\n      return cursor;\n    }\n\n    /**\n     * Search for an element by id within the document and pantry, and move it using moveBefore.\n     *\n     * @param {Element} parentNode - The parent node to which the element will be moved.\n     * @param {string} id - The ID of the element to be moved.\n     * @param {Node | null} after - The reference node to insert the element before.\n     *                              If `null`, the element is appended as the last child.\n     * @param {MorphContext} ctx\n     * @returns {Element} The found element\n     */\n    function moveBeforeById(parentNode, id, after, ctx) {\n      const target =\n        /** @type {Element} - will always be found */\n        (\n          // ctx.target.id unsafe because of form input shadowing\n          // ctx.target could be a document fragment which doesn't have `getAttribute`\n          (ctx.target.getAttribute?.(\"id\") === id && ctx.target) ||\n            ctx.target.querySelector(`[id=\"${id}\"]`) ||\n            ctx.pantry.querySelector(`[id=\"${id}\"]`)\n        );\n      removeElementFromAncestorsIdMaps(target, ctx);\n      moveBefore(parentNode, target, after);\n      return target;\n    }\n\n    /**\n     * Removes an element from its ancestors' id maps. This is needed when an element is moved from the\n     * \"future\" via `moveBeforeId`. Otherwise, its erstwhile ancestors could be mistakenly moved to the\n     * pantry rather than being deleted, preventing their removal hooks from being called.\n     *\n     * @param {Element} element - element to remove from its ancestors' id maps\n     * @param {MorphContext} ctx\n     */\n    function removeElementFromAncestorsIdMaps(element, ctx) {\n      // we know id is non-null String, because this function is only called on elements with ids\n      const id = /** @type {String} */ (element.getAttribute(\"id\"));\n      /** @ts-ignore - safe to loop in this way **/\n      while ((element = element.parentNode)) {\n        let idSet = ctx.idMap.get(element);\n        if (idSet) {\n          idSet.delete(id);\n          if (!idSet.size) {\n            ctx.idMap.delete(element);\n          }\n        }\n      }\n    }\n\n    /**\n     * Moves an element before another element within the same parent.\n     * Uses the proposed `moveBefore` API if available (and working), otherwise falls back to `insertBefore`.\n     * This is essentialy a forward-compat wrapper.\n     *\n     * @param {Element} parentNode - The parent node containing the after element.\n     * @param {Node} element - The element to be moved.\n     * @param {Node | null} after - The reference node to insert `element` before.\n     *                              If `null`, `element` is appended as the last child.\n     */\n    function moveBefore(parentNode, element, after) {\n      // @ts-ignore - use proposed moveBefore feature\n      if (parentNode.moveBefore) {\n        try {\n          // @ts-ignore - use proposed moveBefore feature\n          parentNode.moveBefore(element, after);\n        } catch (e) {\n          // fall back to insertBefore as some browsers may fail on moveBefore when trying to move Dom disconnected nodes to pantry\n          parentNode.insertBefore(element, after);\n        }\n      } else {\n        parentNode.insertBefore(element, after);\n      }\n    }\n\n    return morphChildren;\n  })();\n\n  //=============================================================================\n  // Single Node Morphing Code\n  //=============================================================================\n  const morphNode = (function () {\n    /**\n     * @param {Node} oldNode root node to merge content into\n     * @param {Node} newContent new content to merge\n     * @param {MorphContext} ctx the merge context\n     * @returns {Node | null} the element that ended up in the DOM\n     */\n    function morphNode(oldNode, newContent, ctx) {\n      if (ctx.ignoreActive && oldNode === document.activeElement) {\n        // don't morph focused element\n        return null;\n      }\n\n      if (ctx.callbacks.beforeNodeMorphed(oldNode, newContent) === false) {\n        return oldNode;\n      }\n\n      if (oldNode instanceof HTMLHeadElement && ctx.head.ignore) ; else if (\n        oldNode instanceof HTMLHeadElement &&\n        ctx.head.style !== \"morph\"\n      ) {\n        // ok to cast: if newContent wasn't also a <head>, it would've got caught in the `!isSoftMatch` branch above\n        handleHeadElement(\n          oldNode,\n          /** @type {HTMLHeadElement} */ (newContent),\n          ctx,\n        );\n      } else {\n        morphAttributes(oldNode, newContent, ctx);\n        if (!ignoreValueOfActiveElement(oldNode, ctx)) {\n          // @ts-ignore newContent can be a node here because .firstChild will be null\n          morphChildren(ctx, oldNode, newContent);\n        }\n      }\n      ctx.callbacks.afterNodeMorphed(oldNode, newContent);\n      return oldNode;\n    }\n\n    /**\n     * syncs the oldNode to the newNode, copying over all attributes and\n     * inner element state from the newNode to the oldNode\n     *\n     * @param {Node} oldNode the node to copy attributes & state to\n     * @param {Node} newNode the node to copy attributes & state from\n     * @param {MorphContext} ctx the merge context\n     */\n    function morphAttributes(oldNode, newNode, ctx) {\n      let type = newNode.nodeType;\n\n      // if is an element type, sync the attributes from the\n      // new node into the new node\n      if (type === 1 /* element type */) {\n        const oldElt = /** @type {Element} */ (oldNode);\n        const newElt = /** @type {Element} */ (newNode);\n\n        const oldAttributes = oldElt.attributes;\n        const newAttributes = newElt.attributes;\n        for (const newAttribute of newAttributes) {\n          if (ignoreAttribute(newAttribute.name, oldElt, \"update\", ctx)) {\n            continue;\n          }\n          if (oldElt.getAttribute(newAttribute.name) !== newAttribute.value) {\n            oldElt.setAttribute(newAttribute.name, newAttribute.value);\n          }\n        }\n        // iterate backwards to avoid skipping over items when a delete occurs\n        for (let i = oldAttributes.length - 1; 0 <= i; i--) {\n          const oldAttribute = oldAttributes[i];\n\n          // toAttributes is a live NamedNodeMap, so iteration+mutation is unsafe\n          // e.g. custom element attribute callbacks can remove other attributes\n          if (!oldAttribute) continue;\n\n          if (!newElt.hasAttribute(oldAttribute.name)) {\n            if (ignoreAttribute(oldAttribute.name, oldElt, \"remove\", ctx)) {\n              continue;\n            }\n            oldElt.removeAttribute(oldAttribute.name);\n          }\n        }\n\n        if (!ignoreValueOfActiveElement(oldElt, ctx)) {\n          syncInputValue(oldElt, newElt, ctx);\n        }\n      }\n\n      // sync text nodes\n      if (type === 8 /* comment */ || type === 3 /* text */) {\n        if (oldNode.nodeValue !== newNode.nodeValue) {\n          oldNode.nodeValue = newNode.nodeValue;\n        }\n      }\n    }\n\n    /**\n     * NB: many bothans died to bring us information:\n     *\n     *  https://github.com/patrick-steele-idem/morphdom/blob/master/src/specialElHandlers.js\n     *  https://github.com/choojs/nanomorph/blob/master/lib/morph.jsL113\n     *\n     * @param {Element} oldElement the element to sync the input value to\n     * @param {Element} newElement the element to sync the input value from\n     * @param {MorphContext} ctx the merge context\n     */\n    function syncInputValue(oldElement, newElement, ctx) {\n      if (\n        oldElement instanceof HTMLInputElement &&\n        newElement instanceof HTMLInputElement &&\n        newElement.type !== \"file\"\n      ) {\n        let newValue = newElement.value;\n        let oldValue = oldElement.value;\n\n        // sync boolean attributes\n        syncBooleanAttribute(oldElement, newElement, \"checked\", ctx);\n        syncBooleanAttribute(oldElement, newElement, \"disabled\", ctx);\n\n        if (!newElement.hasAttribute(\"value\")) {\n          if (!ignoreAttribute(\"value\", oldElement, \"remove\", ctx)) {\n            oldElement.value = \"\";\n            oldElement.removeAttribute(\"value\");\n          }\n        } else if (oldValue !== newValue) {\n          if (!ignoreAttribute(\"value\", oldElement, \"update\", ctx)) {\n            oldElement.setAttribute(\"value\", newValue);\n            oldElement.value = newValue;\n          }\n        }\n        // TODO: QUESTION(1cg): this used to only check `newElement` unlike the other branches -- why?\n        // did I break something?\n      } else if (\n        oldElement instanceof HTMLOptionElement &&\n        newElement instanceof HTMLOptionElement\n      ) {\n        syncBooleanAttribute(oldElement, newElement, \"selected\", ctx);\n      } else if (\n        oldElement instanceof HTMLTextAreaElement &&\n        newElement instanceof HTMLTextAreaElement\n      ) {\n        let newValue = newElement.value;\n        let oldValue = oldElement.value;\n        if (ignoreAttribute(\"value\", oldElement, \"update\", ctx)) {\n          return;\n        }\n        if (newValue !== oldValue) {\n          oldElement.value = newValue;\n        }\n        if (\n          oldElement.firstChild &&\n          oldElement.firstChild.nodeValue !== newValue\n        ) {\n          oldElement.firstChild.nodeValue = newValue;\n        }\n      }\n    }\n\n    /**\n     * @param {Element} oldElement element to write the value to\n     * @param {Element} newElement element to read the value from\n     * @param {string} attributeName the attribute name\n     * @param {MorphContext} ctx the merge context\n     */\n    function syncBooleanAttribute(oldElement, newElement, attributeName, ctx) {\n      // @ts-ignore this function is only used on boolean attrs that are reflected as dom properties\n      const newLiveValue = newElement[attributeName],\n        // @ts-ignore ditto\n        oldLiveValue = oldElement[attributeName];\n      if (newLiveValue !== oldLiveValue) {\n        const ignoreUpdate = ignoreAttribute(\n          attributeName,\n          oldElement,\n          \"update\",\n          ctx,\n        );\n        if (!ignoreUpdate) {\n          // update attribute's associated DOM property\n          // @ts-ignore this function is only used on boolean attrs that are reflected as dom properties\n          oldElement[attributeName] = newElement[attributeName];\n        }\n        if (newLiveValue) {\n          if (!ignoreUpdate) {\n            // https://developer.mozilla.org/en-US/docs/Glossary/Boolean/HTML\n            // this is the correct way to set a boolean attribute to \"true\"\n            oldElement.setAttribute(attributeName, \"\");\n          }\n        } else {\n          if (!ignoreAttribute(attributeName, oldElement, \"remove\", ctx)) {\n            oldElement.removeAttribute(attributeName);\n          }\n        }\n      }\n    }\n\n    /**\n     * @param {string} attr the attribute to be mutated\n     * @param {Element} element the element that is going to be updated\n     * @param {\"update\" | \"remove\"} updateType\n     * @param {MorphContext} ctx the merge context\n     * @returns {boolean} true if the attribute should be ignored, false otherwise\n     */\n    function ignoreAttribute(attr, element, updateType, ctx) {\n      if (\n        attr === \"value\" &&\n        ctx.ignoreActiveValue &&\n        element === document.activeElement\n      ) {\n        return true;\n      }\n      return (\n        ctx.callbacks.beforeAttributeUpdated(attr, element, updateType) ===\n        false\n      );\n    }\n\n    /**\n     * @param {Node} possibleActiveElement\n     * @param {MorphContext} ctx\n     * @returns {boolean}\n     */\n    function ignoreValueOfActiveElement(possibleActiveElement, ctx) {\n      return (\n        !!ctx.ignoreActiveValue &&\n        possibleActiveElement === document.activeElement &&\n        possibleActiveElement !== document.body\n      );\n    }\n\n    return morphNode;\n  })();\n\n  //=============================================================================\n  // Head Management Functions\n  //=============================================================================\n  /**\n   * @param {MorphContext} ctx\n   * @param {Element} oldNode\n   * @param {Element} newNode\n   * @param {function} callback\n   * @returns {Node[] | Promise<Node[]>}\n   */\n  function withHeadBlocking(ctx, oldNode, newNode, callback) {\n    if (ctx.head.block) {\n      const oldHead = oldNode.querySelector(\"head\");\n      const newHead = newNode.querySelector(\"head\");\n      if (oldHead && newHead) {\n        const promises = handleHeadElement(oldHead, newHead, ctx);\n        // when head promises resolve, proceed ignoring the head tag\n        return Promise.all(promises).then(() => {\n          const newCtx = Object.assign(ctx, {\n            head: {\n              block: false,\n              ignore: true,\n            },\n          });\n          return callback(newCtx);\n        });\n      }\n    }\n    // just proceed if we not head blocking\n    return callback(ctx);\n  }\n\n  /**\n   *  The HEAD tag can be handled specially, either w/ a 'merge' or 'append' style\n   *\n   * @param {Element} oldHead\n   * @param {Element} newHead\n   * @param {MorphContext} ctx\n   * @returns {Promise<void>[]}\n   */\n  function handleHeadElement(oldHead, newHead, ctx) {\n    let added = [];\n    let removed = [];\n    let preserved = [];\n    let nodesToAppend = [];\n\n    // put all new head elements into a Map, by their outerHTML\n    let srcToNewHeadNodes = new Map();\n    for (const newHeadChild of newHead.children) {\n      srcToNewHeadNodes.set(newHeadChild.outerHTML, newHeadChild);\n    }\n\n    // for each elt in the current head\n    for (const currentHeadElt of oldHead.children) {\n      // If the current head element is in the map\n      let inNewContent = srcToNewHeadNodes.has(currentHeadElt.outerHTML);\n      let isReAppended = ctx.head.shouldReAppend(currentHeadElt);\n      let isPreserved = ctx.head.shouldPreserve(currentHeadElt);\n      if (inNewContent || isPreserved) {\n        if (isReAppended) {\n          // remove the current version and let the new version replace it and re-execute\n          removed.push(currentHeadElt);\n        } else {\n          // this element already exists and should not be re-appended, so remove it from\n          // the new content map, preserving it in the DOM\n          srcToNewHeadNodes.delete(currentHeadElt.outerHTML);\n          preserved.push(currentHeadElt);\n        }\n      } else {\n        if (ctx.head.style === \"append\") {\n          // we are appending and this existing element is not new content\n          // so if and only if it is marked for re-append do we do anything\n          if (isReAppended) {\n            removed.push(currentHeadElt);\n            nodesToAppend.push(currentHeadElt);\n          }\n        } else {\n          // if this is a merge, we remove this content since it is not in the new head\n          if (ctx.head.shouldRemove(currentHeadElt) !== false) {\n            removed.push(currentHeadElt);\n          }\n        }\n      }\n    }\n\n    // Push the remaining new head elements in the Map into the\n    // nodes to append to the head tag\n    nodesToAppend.push(...srcToNewHeadNodes.values());\n\n    let promises = [];\n    for (const newNode of nodesToAppend) {\n      // TODO: This could theoretically be null, based on type\n      let newElt = /** @type {ChildNode} */ (\n        document.createRange().createContextualFragment(newNode.outerHTML)\n          .firstChild\n      );\n      if (ctx.callbacks.beforeNodeAdded(newElt) !== false) {\n        if (\n          (\"href\" in newElt && newElt.href) ||\n          (\"src\" in newElt && newElt.src)\n        ) {\n          /** @type {(result?: any) => void} */ let resolve;\n          let promise = new Promise(function (_resolve) {\n            resolve = _resolve;\n          });\n          newElt.addEventListener(\"load\", function () {\n            resolve();\n          });\n          promises.push(promise);\n        }\n        oldHead.appendChild(newElt);\n        ctx.callbacks.afterNodeAdded(newElt);\n        added.push(newElt);\n      }\n    }\n\n    // remove all removed elements, after we have appended the new elements to avoid\n    // additional network requests for things like style sheets\n    for (const removedElement of removed) {\n      if (ctx.callbacks.beforeNodeRemoved(removedElement) !== false) {\n        oldHead.removeChild(removedElement);\n        ctx.callbacks.afterNodeRemoved(removedElement);\n      }\n    }\n\n    ctx.head.afterHeadMorphed(oldHead, {\n      added: added,\n      kept: preserved,\n      removed: removed,\n    });\n    return promises;\n  }\n\n  //=============================================================================\n  // Create Morph Context Functions\n  //=============================================================================\n  const createMorphContext = (function () {\n    /**\n     *\n     * @param {Element} oldNode\n     * @param {Element} newContent\n     * @param {Config} config\n     * @returns {MorphContext}\n     */\n    function createMorphContext(oldNode, newContent, config) {\n      const { persistentIds, idMap } = createIdMaps(oldNode, newContent);\n\n      const mergedConfig = mergeDefaults(config);\n      const morphStyle = mergedConfig.morphStyle || \"outerHTML\";\n      if (![\"innerHTML\", \"outerHTML\"].includes(morphStyle)) {\n        throw `Do not understand how to morph style ${morphStyle}`;\n      }\n\n      return {\n        target: oldNode,\n        newContent: newContent,\n        config: mergedConfig,\n        morphStyle: morphStyle,\n        ignoreActive: mergedConfig.ignoreActive,\n        ignoreActiveValue: mergedConfig.ignoreActiveValue,\n        restoreFocus: mergedConfig.restoreFocus,\n        idMap: idMap,\n        persistentIds: persistentIds,\n        pantry: createPantry(),\n        activeElementAndParents: createActiveElementAndParents(oldNode),\n        callbacks: mergedConfig.callbacks,\n        head: mergedConfig.head,\n      };\n    }\n\n    /**\n     * Deep merges the config object and the Idiomorph.defaults object to\n     * produce a final configuration object\n     * @param {Config} config\n     * @returns {ConfigInternal}\n     */\n    function mergeDefaults(config) {\n      let finalConfig = Object.assign({}, defaults);\n\n      // copy top level stuff into final config\n      Object.assign(finalConfig, config);\n\n      // copy callbacks into final config (do this to deep merge the callbacks)\n      finalConfig.callbacks = Object.assign(\n        {},\n        defaults.callbacks,\n        config.callbacks,\n      );\n\n      // copy head config into final config  (do this to deep merge the head)\n      finalConfig.head = Object.assign({}, defaults.head, config.head);\n\n      return finalConfig;\n    }\n\n    /**\n     * @returns {HTMLDivElement}\n     */\n    function createPantry() {\n      const pantry = document.createElement(\"div\");\n      pantry.hidden = true;\n      document.body.insertAdjacentElement(\"afterend\", pantry);\n      return pantry;\n    }\n\n    /**\n     * @param {Element} oldNode\n     * @returns {Element[]}\n     */\n    function createActiveElementAndParents(oldNode) {\n      /** @type {Element[]} */\n      let activeElementAndParents = [];\n      let elt = document.activeElement;\n      if (elt?.tagName !== \"BODY\" && oldNode.contains(elt)) {\n        while (elt) {\n          activeElementAndParents.push(elt);\n          if (elt === oldNode) break;\n          elt = elt.parentElement;\n        }\n      }\n      return activeElementAndParents;\n    }\n\n    /**\n     * Returns all elements with an ID contained within the root element and its descendants\n     *\n     * @param {Element} root\n     * @returns {Element[]}\n     */\n    function findIdElements(root) {\n      let elements = Array.from(root.querySelectorAll(\"[id]\"));\n      // root could be a document fragment which doesn't have `getAttribute`\n      if (root.getAttribute?.(\"id\")) {\n        elements.push(root);\n      }\n      return elements;\n    }\n\n    /**\n     * A bottom-up algorithm that populates a map of Element -> IdSet.\n     * The idSet for a given element is the set of all IDs contained within its subtree.\n     * As an optimzation, we filter these IDs through the given list of persistent IDs,\n     * because we don't need to bother considering IDed elements that won't be in the new content.\n     *\n     * @param {Map<Node, Set<string>>} idMap\n     * @param {Set<string>} persistentIds\n     * @param {Element} root\n     * @param {Element[]} elements\n     */\n    function populateIdMapWithTree(idMap, persistentIds, root, elements) {\n      for (const elt of elements) {\n        // we can pretend id is non-null String, because the .has line will reject it immediately if not\n        const id = /** @type {String} */ (elt.getAttribute(\"id\"));\n        if (persistentIds.has(id)) {\n          /** @type {Element|null} */\n          let current = elt;\n          // walk up the parent hierarchy of that element, adding the id\n          // of element to the parent's id set\n          while (current) {\n            let idSet = idMap.get(current);\n            // if the id set doesn't exist, create it and insert it in the map\n            if (idSet == null) {\n              idSet = new Set();\n              idMap.set(current, idSet);\n            }\n            idSet.add(id);\n\n            if (current === root) break;\n            current = current.parentElement;\n          }\n        }\n      }\n    }\n\n    /**\n     * This function computes a map of nodes to all ids contained within that node (inclusive of the\n     * node).  This map can be used to ask if two nodes have intersecting sets of ids, which allows\n     * for a looser definition of \"matching\" than tradition id matching, and allows child nodes\n     * to contribute to a parent nodes matching.\n     *\n     * @param {Element} oldContent  the old content that will be morphed\n     * @param {Element} newContent  the new content to morph to\n     * @returns {IdSets}\n     */\n    function createIdMaps(oldContent, newContent) {\n      const oldIdElements = findIdElements(oldContent);\n      const newIdElements = findIdElements(newContent);\n\n      const persistentIds = createPersistentIds(oldIdElements, newIdElements);\n\n      /** @type {Map<Node, Set<string>>} */\n      let idMap = new Map();\n      populateIdMapWithTree(idMap, persistentIds, oldContent, oldIdElements);\n\n      /** @ts-ignore - if newContent is a duck-typed parent, pass its single child node as the root to halt upwards iteration */\n      const newRoot = newContent.__idiomorphRoot || newContent;\n      populateIdMapWithTree(idMap, persistentIds, newRoot, newIdElements);\n\n      return { persistentIds, idMap };\n    }\n\n    /**\n     * This function computes the set of ids that persist between the two contents excluding duplicates\n     *\n     * @param {Element[]} oldIdElements\n     * @param {Element[]} newIdElements\n     * @returns {Set<string>}\n     */\n    function createPersistentIds(oldIdElements, newIdElements) {\n      let duplicateIds = new Set();\n\n      /** @type {Map<string, string>} */\n      let oldIdTagNameMap = new Map();\n      for (const { id, tagName } of oldIdElements) {\n        if (oldIdTagNameMap.has(id)) {\n          duplicateIds.add(id);\n        } else {\n          oldIdTagNameMap.set(id, tagName);\n        }\n      }\n\n      let persistentIds = new Set();\n      for (const { id, tagName } of newIdElements) {\n        if (persistentIds.has(id)) {\n          duplicateIds.add(id);\n        } else if (oldIdTagNameMap.get(id) === tagName) {\n          persistentIds.add(id);\n        }\n        // skip if tag types mismatch because its not possible to morph one tag into another\n      }\n\n      for (const id of duplicateIds) {\n        persistentIds.delete(id);\n      }\n      return persistentIds;\n    }\n\n    return createMorphContext;\n  })();\n\n  //=============================================================================\n  // HTML Normalization Functions\n  //=============================================================================\n  const { normalizeElement, normalizeParent } = (function () {\n    /** @type {WeakSet<Node>} */\n    const generatedByIdiomorph = new WeakSet();\n\n    /**\n     *\n     * @param {Element | Document} content\n     * @returns {Element}\n     */\n    function normalizeElement(content) {\n      if (content instanceof Document) {\n        return content.documentElement;\n      } else {\n        return content;\n      }\n    }\n\n    /**\n     *\n     * @param {null | string | Node | HTMLCollection | Node[] | Document & {generatedByIdiomorph:boolean}} newContent\n     * @returns {Element}\n     */\n    function normalizeParent(newContent) {\n      if (newContent == null) {\n        return document.createElement(\"div\"); // dummy parent element\n      } else if (typeof newContent === \"string\") {\n        return normalizeParent(parseContent(newContent));\n      } else if (\n        generatedByIdiomorph.has(/** @type {Element} */ (newContent))\n      ) {\n        // the template tag created by idiomorph parsing can serve as a dummy parent\n        return /** @type {Element} */ (newContent);\n      } else if (newContent instanceof Node) {\n        if (newContent.parentNode) {\n          // we can't use the parent directly because newContent may have siblings\n          // that we don't want in the morph, and reparenting might be expensive (TODO is it?),\n          // so instead we create a fake parent node that only sees a slice of its children.\n          /** @type {Element} */\n          return /** @type {any} */ (new SlicedParentNode(newContent));\n        } else {\n          // a single node is added as a child to a dummy parent\n          const dummyParent = document.createElement(\"div\");\n          dummyParent.append(newContent);\n          return dummyParent;\n        }\n      } else {\n        // all nodes in the array or HTMLElement collection are consolidated under\n        // a single dummy parent element\n        const dummyParent = document.createElement(\"div\");\n        for (const elt of [...newContent]) {\n          dummyParent.append(elt);\n        }\n        return dummyParent;\n      }\n    }\n\n    /**\n     * A fake duck-typed parent element to wrap a single node, without actually reparenting it.\n     * This is useful because the node may have siblings that we don't want in the morph, and it may also be moved\n     * or replaced with one or more elements during the morph. This class effectively allows us a window into\n     * a slice of a node's children.\n     * \"If it walks like a duck, and quacks like a duck, then it must be a duck!\" -- James Whitcomb Riley (1849\u20131916)\n     */\n    class SlicedParentNode {\n      /** @param {Node} node */\n      constructor(node) {\n        this.originalNode = node;\n        this.realParentNode = /** @type {Element} */ (node.parentNode);\n        this.previousSibling = node.previousSibling;\n        this.nextSibling = node.nextSibling;\n      }\n\n      /** @returns {Node[]} */\n      get childNodes() {\n        // return slice of realParent's current childNodes, based on previousSibling and nextSibling\n        const nodes = [];\n        let cursor = this.previousSibling\n          ? this.previousSibling.nextSibling\n          : this.realParentNode.firstChild;\n        while (cursor && cursor != this.nextSibling) {\n          nodes.push(cursor);\n          cursor = cursor.nextSibling;\n        }\n        return nodes;\n      }\n\n      /**\n       * @param {string} selector\n       * @returns {Element[]}\n       */\n      querySelectorAll(selector) {\n        return this.childNodes.reduce((results, node) => {\n          if (node instanceof Element) {\n            if (node.matches(selector)) results.push(node);\n            const nodeList = node.querySelectorAll(selector);\n            for (let i = 0; i < nodeList.length; i++) {\n              results.push(nodeList[i]);\n            }\n          }\n          return results;\n        }, /** @type {Element[]} */ ([]));\n      }\n\n      /**\n       * @param {Node} node\n       * @param {Node} referenceNode\n       * @returns {Node}\n       */\n      insertBefore(node, referenceNode) {\n        return this.realParentNode.insertBefore(node, referenceNode);\n      }\n\n      /**\n       * @param {Node} node\n       * @param {Node} referenceNode\n       * @returns {Node}\n       */\n      moveBefore(node, referenceNode) {\n        // @ts-ignore - use new moveBefore feature\n        return this.realParentNode.moveBefore(node, referenceNode);\n      }\n\n      /**\n       * for later use with populateIdMapWithTree to halt upwards iteration\n       * @returns {Node}\n       */\n      get __idiomorphRoot() {\n        return this.originalNode;\n      }\n    }\n\n    /**\n     *\n     * @param {string} newContent\n     * @returns {Node | null | DocumentFragment}\n     */\n    function parseContent(newContent) {\n      let parser = new DOMParser();\n\n      // remove svgs to avoid false-positive matches on head, etc.\n      let contentWithSvgsRemoved = newContent.replace(\n        /<svg(\\s[^>]*>|>)([\\s\\S]*?)<\\/svg>/gim,\n        \"\",\n      );\n\n      // if the newContent contains a html, head or body tag, we can simply parse it w/o wrapping\n      if (\n        contentWithSvgsRemoved.match(/<\\/html>/) ||\n        contentWithSvgsRemoved.match(/<\\/head>/) ||\n        contentWithSvgsRemoved.match(/<\\/body>/)\n      ) {\n        let content = parser.parseFromString(newContent, \"text/html\");\n        // if it is a full HTML document, return the document itself as the parent container\n        if (contentWithSvgsRemoved.match(/<\\/html>/)) {\n          generatedByIdiomorph.add(content);\n          return content;\n        } else {\n          // otherwise return the html element as the parent container\n          let htmlElement = content.firstChild;\n          if (htmlElement) {\n            generatedByIdiomorph.add(htmlElement);\n          }\n          return htmlElement;\n        }\n      } else {\n        // if it is partial HTML, wrap it in a template tag to provide a parent element and also to help\n        // deal with touchy tags like tr, tbody, etc.\n        let responseDoc = parser.parseFromString(\n          \"<body><template>\" + newContent + \"</template></body>\",\n          \"text/html\",\n        );\n        let content = /** @type {HTMLTemplateElement} */ (\n          responseDoc.body.querySelector(\"template\")\n        ).content;\n        generatedByIdiomorph.add(content);\n        return content;\n      }\n    }\n\n    return { normalizeElement, normalizeParent };\n  })();\n\n  //=============================================================================\n  // This is what ends up becoming the Idiomorph global object\n  //=============================================================================\n  return {\n    morph,\n    defaults,\n  };\n})();\n\n/**\n * Morph the state of the currentElement based on the attributes and contents of\n * the newElement. Morphing may dispatch turbo:before-morph-element,\n * turbo:before-morph-attribute, and turbo:morph-element events.\n *\n * @param currentElement Element destination of morphing changes\n * @param newElement Element source of morphing changes\n */\nfunction morphElements(currentElement, newElement, { callbacks, ...options } = {}) {\n  Idiomorph.morph(currentElement, newElement, {\n    ...options,\n    callbacks: new DefaultIdiomorphCallbacks(callbacks)\n  });\n}\n\n/**\n * Morph the child elements of the currentElement based on the child elements of\n * the newElement. Morphing children may dispatch turbo:before-morph-element,\n * turbo:before-morph-attribute, and turbo:morph-element events.\n *\n * @param currentElement Element destination of morphing children changes\n * @param newElement Element source of morphing children changes\n */\nfunction morphChildren(currentElement, newElement, options = {}) {\n  morphElements(currentElement, newElement.childNodes, {\n    ...options,\n    morphStyle: \"innerHTML\"\n  });\n}\n\nfunction shouldRefreshFrameWithMorphing(currentFrame, newFrame) {\n  return currentFrame instanceof FrameElement &&\n    currentFrame.shouldReloadWithMorph && (!newFrame || areFramesCompatibleForRefreshing(currentFrame, newFrame)) &&\n    !currentFrame.closest(\"[data-turbo-permanent]\")\n}\n\nfunction areFramesCompatibleForRefreshing(currentFrame, newFrame) {\n  // newFrame cannot yet be an instance of FrameElement because custom\n  // elements don't get initialized until they're attached to the DOM, so\n  // test its Element#nodeName instead\n  return newFrame instanceof Element && newFrame.nodeName === \"TURBO-FRAME\" && currentFrame.id === newFrame.id &&\n  (!newFrame.getAttribute(\"src\") || urlsAreEqual(currentFrame.src, newFrame.getAttribute(\"src\")))\n}\n\nfunction closestFrameReloadableWithMorphing(node) {\n  return node.parentElement.closest(\"turbo-frame[src][refresh=morph]\")\n}\n\nclass DefaultIdiomorphCallbacks {\n  #beforeNodeMorphed\n\n  constructor({ beforeNodeMorphed } = {}) {\n    this.#beforeNodeMorphed = beforeNodeMorphed || (() => true);\n  }\n\n  beforeNodeAdded = (node) => {\n    return !(node.id && node.hasAttribute(\"data-turbo-permanent\") && document.getElementById(node.id))\n  }\n\n  beforeNodeMorphed = (currentElement, newElement) => {\n    if (currentElement instanceof Element) {\n      if (!currentElement.hasAttribute(\"data-turbo-permanent\") && this.#beforeNodeMorphed(currentElement, newElement)) {\n        const event = dispatch(\"turbo:before-morph-element\", {\n          cancelable: true,\n          target: currentElement,\n          detail: { currentElement, newElement }\n        });\n\n        return !event.defaultPrevented\n      } else {\n        return false\n      }\n    }\n  }\n\n  beforeAttributeUpdated = (attributeName, target, mutationType) => {\n    const event = dispatch(\"turbo:before-morph-attribute\", {\n      cancelable: true,\n      target,\n      detail: { attributeName, mutationType }\n    });\n\n    return !event.defaultPrevented\n  }\n\n  beforeNodeRemoved = (node) => {\n    return this.beforeNodeMorphed(node)\n  }\n\n  afterNodeMorphed = (currentElement, newElement) => {\n    if (currentElement instanceof Element) {\n      dispatch(\"turbo:morph-element\", {\n        target: currentElement,\n        detail: { currentElement, newElement }\n      });\n    }\n  }\n}\n\nclass MorphingFrameRenderer extends FrameRenderer {\n  static renderElement(currentElement, newElement) {\n    dispatch(\"turbo:before-frame-morph\", {\n      target: currentElement,\n      detail: { currentElement, newElement }\n    });\n\n    morphChildren(currentElement, newElement, {\n      callbacks: {\n        beforeNodeMorphed: (node, newNode) => {\n          if (\n            shouldRefreshFrameWithMorphing(node, newNode) &&\n              closestFrameReloadableWithMorphing(node) === currentElement\n          ) {\n            node.reload();\n            return false\n          }\n          return true\n        }\n      }\n    });\n  }\n\n  async preservingPermanentElements(callback) {\n    return await callback()\n  }\n}\n\nclass ProgressBar {\n  static animationDuration = 300 /*ms*/\n\n  static get defaultCSS() {\n    return unindent`\n      .turbo-progress-bar {\n        position: fixed;\n        display: block;\n        top: 0;\n        left: 0;\n        height: 3px;\n        background: #0076ff;\n        z-index: 2147483647;\n        transition:\n          width ${ProgressBar.animationDuration}ms ease-out,\n          opacity ${ProgressBar.animationDuration / 2}ms ${ProgressBar.animationDuration / 2}ms ease-in;\n        transform: translate3d(0, 0, 0);\n      }\n    `\n  }\n\n  hiding = false\n  value = 0\n  visible = false\n\n  constructor() {\n    this.stylesheetElement = this.createStylesheetElement();\n    this.progressElement = this.createProgressElement();\n    this.installStylesheetElement();\n    this.setValue(0);\n  }\n\n  show() {\n    if (!this.visible) {\n      this.visible = true;\n      this.installProgressElement();\n      this.startTrickling();\n    }\n  }\n\n  hide() {\n    if (this.visible && !this.hiding) {\n      this.hiding = true;\n      this.fadeProgressElement(() => {\n        this.uninstallProgressElement();\n        this.stopTrickling();\n        this.visible = false;\n        this.hiding = false;\n      });\n    }\n  }\n\n  setValue(value) {\n    this.value = value;\n    this.refresh();\n  }\n\n  // Private\n\n  installStylesheetElement() {\n    document.head.insertBefore(this.stylesheetElement, document.head.firstChild);\n  }\n\n  installProgressElement() {\n    this.progressElement.style.width = \"0\";\n    this.progressElement.style.opacity = \"1\";\n    document.documentElement.insertBefore(this.progressElement, document.body);\n    this.refresh();\n  }\n\n  fadeProgressElement(callback) {\n    this.progressElement.style.opacity = \"0\";\n    setTimeout(callback, ProgressBar.animationDuration * 1.5);\n  }\n\n  uninstallProgressElement() {\n    if (this.progressElement.parentNode) {\n      document.documentElement.removeChild(this.progressElement);\n    }\n  }\n\n  startTrickling() {\n    if (!this.trickleInterval) {\n      this.trickleInterval = window.setInterval(this.trickle, ProgressBar.animationDuration);\n    }\n  }\n\n  stopTrickling() {\n    window.clearInterval(this.trickleInterval);\n    delete this.trickleInterval;\n  }\n\n  trickle = () => {\n    this.setValue(this.value + Math.random() / 100);\n  }\n\n  refresh() {\n    requestAnimationFrame(() => {\n      this.progressElement.style.width = `${10 + this.value * 90}%`;\n    });\n  }\n\n  createStylesheetElement() {\n    const element = document.createElement(\"style\");\n    element.type = \"text/css\";\n    element.textContent = ProgressBar.defaultCSS;\n    const cspNonce = getCspNonce();\n    if (cspNonce) {\n      element.nonce = cspNonce;\n    }\n    return element\n  }\n\n  createProgressElement() {\n    const element = document.createElement(\"div\");\n    element.className = \"turbo-progress-bar\";\n    return element\n  }\n}\n\nclass HeadSnapshot extends Snapshot {\n  detailsByOuterHTML = this.children\n    .filter((element) => !elementIsNoscript(element))\n    .map((element) => elementWithoutNonce(element))\n    .reduce((result, element) => {\n      const { outerHTML } = element;\n      const details =\n        outerHTML in result\n          ? result[outerHTML]\n          : {\n              type: elementType(element),\n              tracked: elementIsTracked(element),\n              elements: []\n            };\n      return {\n        ...result,\n        [outerHTML]: {\n          ...details,\n          elements: [...details.elements, element]\n        }\n      }\n    }, {})\n\n  get trackedElementSignature() {\n    return Object.keys(this.detailsByOuterHTML)\n      .filter((outerHTML) => this.detailsByOuterHTML[outerHTML].tracked)\n      .join(\"\")\n  }\n\n  getScriptElementsNotInSnapshot(snapshot) {\n    return this.getElementsMatchingTypeNotInSnapshot(\"script\", snapshot)\n  }\n\n  getStylesheetElementsNotInSnapshot(snapshot) {\n    return this.getElementsMatchingTypeNotInSnapshot(\"stylesheet\", snapshot)\n  }\n\n  getElementsMatchingTypeNotInSnapshot(matchedType, snapshot) {\n    return Object.keys(this.detailsByOuterHTML)\n      .filter((outerHTML) => !(outerHTML in snapshot.detailsByOuterHTML))\n      .map((outerHTML) => this.detailsByOuterHTML[outerHTML])\n      .filter(({ type }) => type == matchedType)\n      .map(({ elements: [element] }) => element)\n  }\n\n  get provisionalElements() {\n    return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => {\n      const { type, tracked, elements } = this.detailsByOuterHTML[outerHTML];\n      if (type == null && !tracked) {\n        return [...result, ...elements]\n      } else if (elements.length > 1) {\n        return [...result, ...elements.slice(1)]\n      } else {\n        return result\n      }\n    }, [])\n  }\n\n  getMetaValue(name) {\n    const element = this.findMetaElementByName(name);\n    return element ? element.getAttribute(\"content\") : null\n  }\n\n  findMetaElementByName(name) {\n    return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => {\n      const {\n        elements: [element]\n      } = this.detailsByOuterHTML[outerHTML];\n      return elementIsMetaElementWithName(element, name) ? element : result\n    }, undefined | undefined)\n  }\n}\n\nfunction elementType(element) {\n  if (elementIsScript(element)) {\n    return \"script\"\n  } else if (elementIsStylesheet(element)) {\n    return \"stylesheet\"\n  }\n}\n\nfunction elementIsTracked(element) {\n  return element.getAttribute(\"data-turbo-track\") == \"reload\"\n}\n\nfunction elementIsScript(element) {\n  const tagName = element.localName;\n  return tagName == \"script\"\n}\n\nfunction elementIsNoscript(element) {\n  const tagName = element.localName;\n  return tagName == \"noscript\"\n}\n\nfunction elementIsStylesheet(element) {\n  const tagName = element.localName;\n  return tagName == \"style\" || (tagName == \"link\" && element.getAttribute(\"rel\") == \"stylesheet\")\n}\n\nfunction elementIsMetaElementWithName(element, name) {\n  const tagName = element.localName;\n  return tagName == \"meta\" && element.getAttribute(\"name\") == name\n}\n\nfunction elementWithoutNonce(element) {\n  if (element.hasAttribute(\"nonce\")) {\n    element.setAttribute(\"nonce\", \"\");\n  }\n\n  return element\n}\n\nclass PageSnapshot extends Snapshot {\n  static fromHTMLString(html = \"\") {\n    return this.fromDocument(parseHTMLDocument(html))\n  }\n\n  static fromElement(element) {\n    return this.fromDocument(element.ownerDocument)\n  }\n\n  static fromDocument({ documentElement, body, head }) {\n    return new this(documentElement, body, new HeadSnapshot(head))\n  }\n\n  constructor(documentElement, body, headSnapshot) {\n    super(body);\n    this.documentElement = documentElement;\n    this.headSnapshot = headSnapshot;\n  }\n\n  clone() {\n    const clonedElement = this.element.cloneNode(true);\n\n    const selectElements = this.element.querySelectorAll(\"select\");\n    const clonedSelectElements = clonedElement.querySelectorAll(\"select\");\n\n    for (const [index, source] of selectElements.entries()) {\n      const clone = clonedSelectElements[index];\n      for (const option of clone.selectedOptions) option.selected = false;\n      for (const option of source.selectedOptions) clone.options[option.index].selected = true;\n    }\n\n    for (const clonedPasswordInput of clonedElement.querySelectorAll('input[type=\"password\"]')) {\n      clonedPasswordInput.value = \"\";\n    }\n\n    for (const clonedNoscriptElement of clonedElement.querySelectorAll(\"noscript\")) {\n      clonedNoscriptElement.remove();\n    }\n\n    return new PageSnapshot(this.documentElement, clonedElement, this.headSnapshot)\n  }\n\n  get lang() {\n    return this.documentElement.getAttribute(\"lang\")\n  }\n\n  get dir() {\n    return this.documentElement.getAttribute(\"dir\")\n  }\n\n  get headElement() {\n    return this.headSnapshot.element\n  }\n\n  get rootLocation() {\n    const root = this.getSetting(\"root\") ?? \"/\";\n    return expandURL(root)\n  }\n\n  get cacheControlValue() {\n    return this.getSetting(\"cache-control\")\n  }\n\n  get isPreviewable() {\n    return this.cacheControlValue != \"no-preview\"\n  }\n\n  get isCacheable() {\n    return this.cacheControlValue != \"no-cache\"\n  }\n\n  get isVisitable() {\n    return this.getSetting(\"visit-control\") != \"reload\"\n  }\n\n  get prefersViewTransitions() {\n    const viewTransitionEnabled = this.getSetting(\"view-transition\") === \"true\" || this.headSnapshot.getMetaValue(\"view-transition\") === \"same-origin\";\n    return viewTransitionEnabled && !window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n  }\n\n  get refreshMethod() {\n    return this.getSetting(\"refresh-method\")\n  }\n\n  get refreshScroll() {\n    return this.getSetting(\"refresh-scroll\")\n  }\n\n  // Private\n\n  getSetting(name) {\n    return this.headSnapshot.getMetaValue(`turbo-${name}`)\n  }\n}\n\nclass ViewTransitioner {\n  #viewTransitionStarted = false\n  #lastOperation = Promise.resolve()\n\n  renderChange(useViewTransition, render) {\n    if (useViewTransition && this.viewTransitionsAvailable && !this.#viewTransitionStarted) {\n      this.#viewTransitionStarted = true;\n      this.#lastOperation = this.#lastOperation.then(async () => {\n        await document.startViewTransition(render).finished;\n      });\n    } else {\n      this.#lastOperation = this.#lastOperation.then(render);\n    }\n\n    return this.#lastOperation\n  }\n\n  get viewTransitionsAvailable() {\n    return document.startViewTransition\n  }\n}\n\nconst defaultOptions = {\n  action: \"advance\",\n  historyChanged: false,\n  visitCachedSnapshot: () => {},\n  willRender: true,\n  updateHistory: true,\n  shouldCacheSnapshot: true,\n  acceptsStreamResponse: false,\n  refresh: {}\n};\n\nconst TimingMetric = {\n  visitStart: \"visitStart\",\n  requestStart: \"requestStart\",\n  requestEnd: \"requestEnd\",\n  visitEnd: \"visitEnd\"\n};\n\nconst VisitState = {\n  initialized: \"initialized\",\n  started: \"started\",\n  canceled: \"canceled\",\n  failed: \"failed\",\n  completed: \"completed\"\n};\n\nconst SystemStatusCode = {\n  networkFailure: 0,\n  timeoutFailure: -1,\n  contentTypeMismatch: -2\n};\n\nconst Direction = {\n  advance: \"forward\",\n  restore: \"back\",\n  replace: \"none\"\n};\n\nclass Visit {\n  identifier = uuid() // Required by turbo-ios\n  timingMetrics = {}\n\n  followedRedirect = false\n  historyChanged = false\n  scrolled = false\n  shouldCacheSnapshot = true\n  acceptsStreamResponse = false\n  snapshotCached = false\n  state = VisitState.initialized\n  viewTransitioner = new ViewTransitioner()\n\n  constructor(delegate, location, restorationIdentifier, options = {}) {\n    this.delegate = delegate;\n    this.location = location;\n    this.restorationIdentifier = restorationIdentifier || uuid();\n\n    const {\n      action,\n      historyChanged,\n      referrer,\n      snapshot,\n      snapshotHTML,\n      response,\n      visitCachedSnapshot,\n      willRender,\n      updateHistory,\n      shouldCacheSnapshot,\n      acceptsStreamResponse,\n      direction,\n      refresh\n    } = {\n      ...defaultOptions,\n      ...options\n    };\n    this.action = action;\n    this.historyChanged = historyChanged;\n    this.referrer = referrer;\n    this.snapshot = snapshot;\n    this.snapshotHTML = snapshotHTML;\n    this.response = response;\n    this.isPageRefresh = this.view.isPageRefresh(this);\n    this.visitCachedSnapshot = visitCachedSnapshot;\n    this.willRender = willRender;\n    this.updateHistory = updateHistory;\n    this.scrolled = !willRender;\n    this.shouldCacheSnapshot = shouldCacheSnapshot;\n    this.acceptsStreamResponse = acceptsStreamResponse;\n    this.direction = direction || Direction[action];\n    this.refresh = refresh;\n  }\n\n  get adapter() {\n    return this.delegate.adapter\n  }\n\n  get view() {\n    return this.delegate.view\n  }\n\n  get history() {\n    return this.delegate.history\n  }\n\n  get restorationData() {\n    return this.history.getRestorationDataForIdentifier(this.restorationIdentifier)\n  }\n\n  start() {\n    if (this.state == VisitState.initialized) {\n      this.recordTimingMetric(TimingMetric.visitStart);\n      this.state = VisitState.started;\n      this.adapter.visitStarted(this);\n      this.delegate.visitStarted(this);\n    }\n  }\n\n  cancel() {\n    if (this.state == VisitState.started) {\n      if (this.request) {\n        this.request.cancel();\n      }\n      this.cancelRender();\n      this.state = VisitState.canceled;\n    }\n  }\n\n  complete() {\n    if (this.state == VisitState.started) {\n      this.recordTimingMetric(TimingMetric.visitEnd);\n      this.adapter.visitCompleted(this);\n      this.state = VisitState.completed;\n      this.followRedirect();\n\n      if (!this.followedRedirect) {\n        this.delegate.visitCompleted(this);\n      }\n    }\n  }\n\n  fail() {\n    if (this.state == VisitState.started) {\n      this.state = VisitState.failed;\n      this.adapter.visitFailed(this);\n      this.delegate.visitCompleted(this);\n    }\n  }\n\n  changeHistory() {\n    if (!this.historyChanged && this.updateHistory) {\n      const actionForHistory = this.location.href === this.referrer?.href ? \"replace\" : this.action;\n      const method = getHistoryMethodForAction(actionForHistory);\n      this.history.update(method, this.location, this.restorationIdentifier);\n      this.historyChanged = true;\n    }\n  }\n\n  issueRequest() {\n    if (this.hasPreloadedResponse()) {\n      this.simulateRequest();\n    } else if (this.shouldIssueRequest() && !this.request) {\n      this.request = new FetchRequest(this, FetchMethod.get, this.location);\n      this.request.perform();\n    }\n  }\n\n  simulateRequest() {\n    if (this.response) {\n      this.startRequest();\n      this.recordResponse();\n      this.finishRequest();\n    }\n  }\n\n  startRequest() {\n    this.recordTimingMetric(TimingMetric.requestStart);\n    this.adapter.visitRequestStarted(this);\n  }\n\n  recordResponse(response = this.response) {\n    this.response = response;\n    if (response) {\n      const { statusCode } = response;\n      if (isSuccessful(statusCode)) {\n        this.adapter.visitRequestCompleted(this);\n      } else {\n        this.adapter.visitRequestFailedWithStatusCode(this, statusCode);\n      }\n    }\n  }\n\n  finishRequest() {\n    this.recordTimingMetric(TimingMetric.requestEnd);\n    this.adapter.visitRequestFinished(this);\n  }\n\n  loadResponse() {\n    if (this.response) {\n      const { statusCode, responseHTML } = this.response;\n      this.render(async () => {\n        if (this.shouldCacheSnapshot) this.cacheSnapshot();\n        if (this.view.renderPromise) await this.view.renderPromise;\n\n        if (isSuccessful(statusCode) && responseHTML != null) {\n          const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n          await this.renderPageSnapshot(snapshot, false);\n\n          this.adapter.visitRendered(this);\n          this.complete();\n        } else {\n          await this.view.renderError(PageSnapshot.fromHTMLString(responseHTML), this);\n          this.adapter.visitRendered(this);\n          this.fail();\n        }\n      });\n    }\n  }\n\n  getCachedSnapshot() {\n    const snapshot = this.view.getCachedSnapshotForLocation(this.location) || this.getPreloadedSnapshot();\n\n    if (snapshot && (!getAnchor(this.location) || snapshot.hasAnchor(getAnchor(this.location)))) {\n      if (this.action == \"restore\" || snapshot.isPreviewable) {\n        return snapshot\n      }\n    }\n  }\n\n  getPreloadedSnapshot() {\n    if (this.snapshotHTML) {\n      return PageSnapshot.fromHTMLString(this.snapshotHTML)\n    }\n  }\n\n  hasCachedSnapshot() {\n    return this.getCachedSnapshot() != null\n  }\n\n  loadCachedSnapshot() {\n    const snapshot = this.getCachedSnapshot();\n    if (snapshot) {\n      const isPreview = this.shouldIssueRequest();\n      this.render(async () => {\n        this.cacheSnapshot();\n        if (this.isPageRefresh) {\n          this.adapter.visitRendered(this);\n        } else {\n          if (this.view.renderPromise) await this.view.renderPromise;\n\n          await this.renderPageSnapshot(snapshot, isPreview);\n\n          this.adapter.visitRendered(this);\n          if (!isPreview) {\n            this.complete();\n          }\n        }\n      });\n    }\n  }\n\n  followRedirect() {\n    if (this.redirectedToLocation && !this.followedRedirect && this.response?.redirected) {\n      this.adapter.visitProposedToLocation(this.redirectedToLocation, {\n        action: \"replace\",\n        response: this.response,\n        shouldCacheSnapshot: false,\n        willRender: false\n      });\n      this.followedRedirect = true;\n    }\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(request) {\n    if (this.acceptsStreamResponse) {\n      request.acceptResponseType(StreamMessage.contentType);\n    }\n  }\n\n  requestStarted() {\n    this.startRequest();\n  }\n\n  requestPreventedHandlingResponse(_request, _response) {}\n\n  async requestSucceededWithResponse(request, response) {\n    const responseHTML = await response.responseHTML;\n    const { redirected, statusCode } = response;\n    if (responseHTML == undefined) {\n      this.recordResponse({\n        statusCode: SystemStatusCode.contentTypeMismatch,\n        redirected\n      });\n    } else {\n      this.redirectedToLocation = response.redirected ? response.location : undefined;\n      this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\n    }\n  }\n\n  async requestFailedWithResponse(request, response) {\n    const responseHTML = await response.responseHTML;\n    const { redirected, statusCode } = response;\n    if (responseHTML == undefined) {\n      this.recordResponse({\n        statusCode: SystemStatusCode.contentTypeMismatch,\n        redirected\n      });\n    } else {\n      this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\n    }\n  }\n\n  requestErrored(_request, _error) {\n    this.recordResponse({\n      statusCode: SystemStatusCode.networkFailure,\n      redirected: false\n    });\n  }\n\n  requestFinished() {\n    this.finishRequest();\n  }\n\n  // Scrolling\n\n  performScroll() {\n    if (!this.scrolled && !this.view.forceReloaded && !this.view.shouldPreserveScrollPosition(this)) {\n      if (this.action == \"restore\") {\n        this.scrollToRestoredPosition() || this.scrollToAnchor() || this.view.scrollToTop();\n      } else {\n        this.scrollToAnchor() || this.view.scrollToTop();\n      }\n\n      this.scrolled = true;\n    }\n  }\n\n  scrollToRestoredPosition() {\n    const { scrollPosition } = this.restorationData;\n    if (scrollPosition) {\n      this.view.scrollToPosition(scrollPosition);\n      return true\n    }\n  }\n\n  scrollToAnchor() {\n    const anchor = getAnchor(this.location);\n    if (anchor != null) {\n      this.view.scrollToAnchor(anchor);\n      return true\n    }\n  }\n\n  // Instrumentation\n\n  recordTimingMetric(metric) {\n    this.timingMetrics[metric] = new Date().getTime();\n  }\n\n  getTimingMetrics() {\n    return { ...this.timingMetrics }\n  }\n\n  // Private\n\n  hasPreloadedResponse() {\n    return typeof this.response == \"object\"\n  }\n\n  shouldIssueRequest() {\n    if (this.action == \"restore\") {\n      return !this.hasCachedSnapshot()\n    } else {\n      return this.willRender\n    }\n  }\n\n  cacheSnapshot() {\n    if (!this.snapshotCached) {\n      this.view.cacheSnapshot(this.snapshot).then((snapshot) => snapshot && this.visitCachedSnapshot(snapshot));\n      this.snapshotCached = true;\n    }\n  }\n\n  async render(callback) {\n    this.cancelRender();\n    await new Promise((resolve) => {\n      this.frame =\n        document.visibilityState === \"hidden\" ? setTimeout(() => resolve(), 0) : requestAnimationFrame(() => resolve());\n    });\n    await callback();\n    delete this.frame;\n  }\n\n  async renderPageSnapshot(snapshot, isPreview) {\n    await this.viewTransitioner.renderChange(this.view.shouldTransitionTo(snapshot), async () => {\n      await this.view.renderPage(snapshot, isPreview, this.willRender, this);\n      this.performScroll();\n    });\n  }\n\n  cancelRender() {\n    if (this.frame) {\n      cancelAnimationFrame(this.frame);\n      delete this.frame;\n    }\n  }\n}\n\nfunction isSuccessful(statusCode) {\n  return statusCode >= 200 && statusCode < 300\n}\n\nclass BrowserAdapter {\n  progressBar = new ProgressBar()\n\n  constructor(session) {\n    this.session = session;\n  }\n\n  visitProposedToLocation(location, options) {\n    if (locationIsVisitable(location, this.navigator.rootLocation)) {\n      this.navigator.startVisit(location, options?.restorationIdentifier || uuid(), options);\n    } else {\n      window.location.href = location.toString();\n    }\n  }\n\n  visitStarted(visit) {\n    this.location = visit.location;\n    this.redirectedToLocation = null;\n\n    visit.loadCachedSnapshot();\n    visit.issueRequest();\n  }\n\n  visitRequestStarted(visit) {\n    this.progressBar.setValue(0);\n    if (visit.hasCachedSnapshot() || visit.action != \"restore\") {\n      this.showVisitProgressBarAfterDelay();\n    } else {\n      this.showProgressBar();\n    }\n  }\n\n  visitRequestCompleted(visit) {\n    visit.loadResponse();\n\n    if (visit.response.redirected) {\n      this.redirectedToLocation = visit.redirectedToLocation;\n    }\n  }\n\n  visitRequestFailedWithStatusCode(visit, statusCode) {\n    switch (statusCode) {\n      case SystemStatusCode.networkFailure:\n      case SystemStatusCode.timeoutFailure:\n      case SystemStatusCode.contentTypeMismatch:\n        return this.reload({\n          reason: \"request_failed\",\n          context: {\n            statusCode\n          }\n        })\n      default:\n        return visit.loadResponse()\n    }\n  }\n\n  visitRequestFinished(_visit) {}\n\n  visitCompleted(_visit) {\n    this.progressBar.setValue(1);\n    this.hideVisitProgressBar();\n  }\n\n  pageInvalidated(reason) {\n    this.reload(reason);\n  }\n\n  visitFailed(_visit) {\n    this.progressBar.setValue(1);\n    this.hideVisitProgressBar();\n  }\n\n  visitRendered(_visit) {}\n\n  // Link prefetching\n\n  linkPrefetchingIsEnabledForLocation(location) {\n    return true\n  }\n\n  // Form Submission Delegate\n\n  formSubmissionStarted(_formSubmission) {\n    this.progressBar.setValue(0);\n    this.showFormProgressBarAfterDelay();\n  }\n\n  formSubmissionFinished(_formSubmission) {\n    this.progressBar.setValue(1);\n    this.hideFormProgressBar();\n  }\n\n  // Private\n\n  showVisitProgressBarAfterDelay() {\n    this.visitProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\n  }\n\n  hideVisitProgressBar() {\n    this.progressBar.hide();\n    if (this.visitProgressBarTimeout != null) {\n      window.clearTimeout(this.visitProgressBarTimeout);\n      delete this.visitProgressBarTimeout;\n    }\n  }\n\n  showFormProgressBarAfterDelay() {\n    if (this.formProgressBarTimeout == null) {\n      this.formProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\n    }\n  }\n\n  hideFormProgressBar() {\n    this.progressBar.hide();\n    if (this.formProgressBarTimeout != null) {\n      window.clearTimeout(this.formProgressBarTimeout);\n      delete this.formProgressBarTimeout;\n    }\n  }\n\n  showProgressBar = () => {\n    this.progressBar.show();\n  }\n\n  reload(reason) {\n    dispatch(\"turbo:reload\", { detail: reason });\n\n    window.location.href = (this.redirectedToLocation || this.location)?.toString() || window.location.href;\n  }\n\n  get navigator() {\n    return this.session.navigator\n  }\n}\n\nclass CacheObserver {\n  selector = \"[data-turbo-temporary]\"\n\n  started = false\n\n  start() {\n    if (!this.started) {\n      this.started = true;\n      addEventListener(\"turbo:before-cache\", this.removeTemporaryElements, false);\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.started = false;\n      removeEventListener(\"turbo:before-cache\", this.removeTemporaryElements, false);\n    }\n  }\n\n  removeTemporaryElements = (_event) => {\n    for (const element of this.temporaryElements) {\n      element.remove();\n    }\n  }\n\n  get temporaryElements() {\n    return [...document.querySelectorAll(this.selector)]\n  }\n}\n\nclass FrameRedirector {\n  constructor(session, element) {\n    this.session = session;\n    this.element = element;\n    this.linkInterceptor = new LinkInterceptor(this, element);\n    this.formSubmitObserver = new FormSubmitObserver(this, element);\n  }\n\n  start() {\n    this.linkInterceptor.start();\n    this.formSubmitObserver.start();\n  }\n\n  stop() {\n    this.linkInterceptor.stop();\n    this.formSubmitObserver.stop();\n  }\n\n  // Link interceptor delegate\n\n  shouldInterceptLinkClick(element, _location, _event) {\n    return this.#shouldRedirect(element)\n  }\n\n  linkClickIntercepted(element, url, event) {\n    const frame = this.#findFrameElement(element);\n    if (frame) {\n      frame.delegate.linkClickIntercepted(element, url, event);\n    }\n  }\n\n  // Form submit observer delegate\n\n  willSubmitForm(element, submitter) {\n    return (\n      element.closest(\"turbo-frame\") == null &&\n      this.#shouldSubmit(element, submitter) &&\n      this.#shouldRedirect(element, submitter)\n    )\n  }\n\n  formSubmitted(element, submitter) {\n    const frame = this.#findFrameElement(element, submitter);\n    if (frame) {\n      frame.delegate.formSubmitted(element, submitter);\n    }\n  }\n\n  #shouldSubmit(form, submitter) {\n    const action = getAction$1(form, submitter);\n    const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n    const rootLocation = expandURL(meta?.content ?? \"/\");\n\n    return this.#shouldRedirect(form, submitter) && locationIsVisitable(action, rootLocation)\n  }\n\n  #shouldRedirect(element, submitter) {\n    const isNavigatable =\n      element instanceof HTMLFormElement\n        ? this.session.submissionIsNavigatable(element, submitter)\n        : this.session.elementIsNavigatable(element);\n\n    if (isNavigatable) {\n      const frame = this.#findFrameElement(element, submitter);\n      return frame ? frame != element.closest(\"turbo-frame\") : false\n    } else {\n      return false\n    }\n  }\n\n  #findFrameElement(element, submitter) {\n    const id = submitter?.getAttribute(\"data-turbo-frame\") || element.getAttribute(\"data-turbo-frame\");\n    if (id && id != \"_top\") {\n      const frame = this.element.querySelector(`#${id}:not([disabled])`);\n      if (frame instanceof FrameElement) {\n        return frame\n      }\n    }\n  }\n}\n\nclass History {\n  location\n  restorationIdentifier = uuid()\n  restorationData = {}\n  started = false\n  currentIndex = 0\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.started) {\n      addEventListener(\"popstate\", this.onPopState, false);\n      this.currentIndex = history.state?.turbo?.restorationIndex || 0;\n      this.started = true;\n      this.replace(new URL(window.location.href));\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      removeEventListener(\"popstate\", this.onPopState, false);\n      this.started = false;\n    }\n  }\n\n  push(location, restorationIdentifier) {\n    this.update(history.pushState, location, restorationIdentifier);\n  }\n\n  replace(location, restorationIdentifier) {\n    this.update(history.replaceState, location, restorationIdentifier);\n  }\n\n  update(method, location, restorationIdentifier = uuid()) {\n    if (method === history.pushState) ++this.currentIndex;\n\n    const state = { turbo: { restorationIdentifier, restorationIndex: this.currentIndex } };\n    method.call(history, state, \"\", location.href);\n    this.location = location;\n    this.restorationIdentifier = restorationIdentifier;\n  }\n\n  // Restoration data\n\n  getRestorationDataForIdentifier(restorationIdentifier) {\n    return this.restorationData[restorationIdentifier] || {}\n  }\n\n  updateRestorationData(additionalData) {\n    const { restorationIdentifier } = this;\n    const restorationData = this.restorationData[restorationIdentifier];\n    this.restorationData[restorationIdentifier] = {\n      ...restorationData,\n      ...additionalData\n    };\n  }\n\n  // Scroll restoration\n\n  assumeControlOfScrollRestoration() {\n    if (!this.previousScrollRestoration) {\n      this.previousScrollRestoration = history.scrollRestoration ?? \"auto\";\n      history.scrollRestoration = \"manual\";\n    }\n  }\n\n  relinquishControlOfScrollRestoration() {\n    if (this.previousScrollRestoration) {\n      history.scrollRestoration = this.previousScrollRestoration;\n      delete this.previousScrollRestoration;\n    }\n  }\n\n  // Event handlers\n\n  onPopState = (event) => {\n    const { turbo } = event.state || {};\n    this.location = new URL(window.location.href);\n\n    if (turbo) {\n      const { restorationIdentifier, restorationIndex } = turbo;\n      this.restorationIdentifier = restorationIdentifier;\n      const direction = restorationIndex > this.currentIndex ? \"forward\" : \"back\";\n      this.delegate.historyPoppedToLocationWithRestorationIdentifierAndDirection(this.location, restorationIdentifier, direction);\n      this.currentIndex = restorationIndex;\n    } else {\n      this.currentIndex++;\n      this.delegate.historyPoppedWithEmptyState(this.location);\n    }\n  }\n}\n\nclass LinkPrefetchObserver {\n  started = false\n  #prefetchedLink = null\n\n  constructor(delegate, eventTarget) {\n    this.delegate = delegate;\n    this.eventTarget = eventTarget;\n  }\n\n  start() {\n    if (this.started) return\n\n    if (this.eventTarget.readyState === \"loading\") {\n      this.eventTarget.addEventListener(\"DOMContentLoaded\", this.#enable, { once: true });\n    } else {\n      this.#enable();\n    }\n  }\n\n  stop() {\n    if (!this.started) return\n\n    this.eventTarget.removeEventListener(\"mouseenter\", this.#tryToPrefetchRequest, {\n      capture: true,\n      passive: true\n    });\n    this.eventTarget.removeEventListener(\"mouseleave\", this.#cancelRequestIfObsolete, {\n      capture: true,\n      passive: true\n    });\n\n    this.eventTarget.removeEventListener(\"turbo:before-fetch-request\", this.#tryToUsePrefetchedRequest, true);\n    this.started = false;\n  }\n\n  #enable = () => {\n    this.eventTarget.addEventListener(\"mouseenter\", this.#tryToPrefetchRequest, {\n      capture: true,\n      passive: true\n    });\n    this.eventTarget.addEventListener(\"mouseleave\", this.#cancelRequestIfObsolete, {\n      capture: true,\n      passive: true\n    });\n\n    this.eventTarget.addEventListener(\"turbo:before-fetch-request\", this.#tryToUsePrefetchedRequest, true);\n    this.started = true;\n  }\n\n  #tryToPrefetchRequest = (event) => {\n    if (getMetaContent(\"turbo-prefetch\") === \"false\") return\n\n    const target = event.target;\n    const isLink = target.matches && target.matches(\"a[href]:not([target^=_]):not([download])\");\n\n    if (isLink && this.#isPrefetchable(target)) {\n      const link = target;\n      const location = getLocationForLink(link);\n\n      if (this.delegate.canPrefetchRequestToLocation(link, location)) {\n        this.#prefetchedLink = link;\n\n        const fetchRequest = new FetchRequest(\n          this,\n          FetchMethod.get,\n          location,\n          new URLSearchParams(),\n          target\n        );\n\n        fetchRequest.fetchOptions.priority = \"low\";\n\n        prefetchCache.putLater(location, fetchRequest, this.#cacheTtl);\n      }\n    }\n  }\n\n  #cancelRequestIfObsolete = (event) => {\n    if (event.target === this.#prefetchedLink) this.#cancelPrefetchRequest();\n  }\n\n  #cancelPrefetchRequest = () => {\n    prefetchCache.clear();\n    this.#prefetchedLink = null;\n  }\n\n  #tryToUsePrefetchedRequest = (event) => {\n    if (event.target.tagName !== \"FORM\" && event.detail.fetchOptions.method === \"GET\") {\n      const cached = prefetchCache.get(event.detail.url);\n\n      if (cached) {\n        // User clicked link, use cache response\n        event.detail.fetchRequest = cached;\n      }\n\n      prefetchCache.clear();\n    }\n  }\n\n  prepareRequest(request) {\n    const link = request.target;\n\n    request.headers[\"X-Sec-Purpose\"] = \"prefetch\";\n\n    const turboFrame = link.closest(\"turbo-frame\");\n    const turboFrameTarget = link.getAttribute(\"data-turbo-frame\") || turboFrame?.getAttribute(\"target\") || turboFrame?.id;\n\n    if (turboFrameTarget && turboFrameTarget !== \"_top\") {\n      request.headers[\"Turbo-Frame\"] = turboFrameTarget;\n    }\n  }\n\n  // Fetch request interface\n\n  requestSucceededWithResponse() {}\n\n  requestStarted(fetchRequest) {}\n\n  requestErrored(fetchRequest) {}\n\n  requestFinished(fetchRequest) {}\n\n  requestPreventedHandlingResponse(fetchRequest, fetchResponse) {}\n\n  requestFailedWithResponse(fetchRequest, fetchResponse) {}\n\n  get #cacheTtl() {\n    return Number(getMetaContent(\"turbo-prefetch-cache-time\")) || cacheTtl\n  }\n\n  #isPrefetchable(link) {\n    const href = link.getAttribute(\"href\");\n\n    if (!href) return false\n\n    if (unfetchableLink(link)) return false\n    if (linkToTheSamePage(link)) return false\n    if (linkOptsOut(link)) return false\n    if (nonSafeLink(link)) return false\n    if (eventPrevented(link)) return false\n\n    return true\n  }\n}\n\nconst unfetchableLink = (link) => {\n  return link.origin !== document.location.origin || ![\"http:\", \"https:\"].includes(link.protocol) || link.hasAttribute(\"target\")\n};\n\nconst linkToTheSamePage = (link) => {\n  return (link.pathname + link.search === document.location.pathname + document.location.search) || link.href.startsWith(\"#\")\n};\n\nconst linkOptsOut = (link) => {\n  if (link.getAttribute(\"data-turbo-prefetch\") === \"false\") return true\n  if (link.getAttribute(\"data-turbo\") === \"false\") return true\n\n  const turboPrefetchParent = findClosestRecursively(link, \"[data-turbo-prefetch]\");\n  if (turboPrefetchParent && turboPrefetchParent.getAttribute(\"data-turbo-prefetch\") === \"false\") return true\n\n  return false\n};\n\nconst nonSafeLink = (link) => {\n  const turboMethod = link.getAttribute(\"data-turbo-method\");\n  if (turboMethod && turboMethod.toLowerCase() !== \"get\") return true\n\n  if (isUJS(link)) return true\n  if (link.hasAttribute(\"data-turbo-confirm\")) return true\n  if (link.hasAttribute(\"data-turbo-stream\")) return true\n\n  return false\n};\n\nconst isUJS = (link) => {\n  return link.hasAttribute(\"data-remote\") || link.hasAttribute(\"data-behavior\") || link.hasAttribute(\"data-confirm\") || link.hasAttribute(\"data-method\")\n};\n\nconst eventPrevented = (link) => {\n  const event = dispatch(\"turbo:before-prefetch\", { target: link, cancelable: true });\n  return event.defaultPrevented\n};\n\nclass Navigator {\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  proposeVisit(location, options = {}) {\n    if (this.delegate.allowsVisitingLocationWithAction(location, options.action)) {\n      this.delegate.visitProposedToLocation(location, options);\n    }\n  }\n\n  startVisit(locatable, restorationIdentifier, options = {}) {\n    this.stop();\n    this.currentVisit = new Visit(this, expandURL(locatable), restorationIdentifier, {\n      referrer: this.location,\n      ...options\n    });\n    this.currentVisit.start();\n  }\n\n  submitForm(form, submitter) {\n    this.stop();\n    this.formSubmission = new FormSubmission(this, form, submitter, true);\n\n    this.formSubmission.start();\n  }\n\n  stop() {\n    if (this.formSubmission) {\n      this.formSubmission.stop();\n      delete this.formSubmission;\n    }\n\n    if (this.currentVisit) {\n      this.currentVisit.cancel();\n      delete this.currentVisit;\n    }\n  }\n\n  get adapter() {\n    return this.delegate.adapter\n  }\n\n  get view() {\n    return this.delegate.view\n  }\n\n  get rootLocation() {\n    return this.view.snapshot.rootLocation\n  }\n\n  get history() {\n    return this.delegate.history\n  }\n\n  // Form submission delegate\n\n  formSubmissionStarted(formSubmission) {\n    // Not all adapters implement formSubmissionStarted\n    if (typeof this.adapter.formSubmissionStarted === \"function\") {\n      this.adapter.formSubmissionStarted(formSubmission);\n    }\n  }\n\n  async formSubmissionSucceededWithResponse(formSubmission, fetchResponse) {\n    if (formSubmission == this.formSubmission) {\n      const responseHTML = await fetchResponse.responseHTML;\n      if (responseHTML) {\n        const shouldCacheSnapshot = formSubmission.isSafe;\n        if (!shouldCacheSnapshot) {\n          this.view.clearSnapshotCache();\n        }\n\n        const { statusCode, redirected } = fetchResponse;\n        const action = this.#getActionForFormSubmission(formSubmission, fetchResponse);\n        const visitOptions = {\n          action,\n          shouldCacheSnapshot,\n          response: { statusCode, responseHTML, redirected }\n        };\n        this.proposeVisit(fetchResponse.location, visitOptions);\n      }\n    }\n  }\n\n  async formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n    const responseHTML = await fetchResponse.responseHTML;\n\n    if (responseHTML) {\n      const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n      if (fetchResponse.serverError) {\n        await this.view.renderError(snapshot, this.currentVisit);\n      } else {\n        await this.view.renderPage(snapshot, false, true, this.currentVisit);\n      }\n      if (snapshot.refreshScroll !== \"preserve\") {\n        this.view.scrollToTop();\n      }\n      this.view.clearSnapshotCache();\n    }\n  }\n\n  formSubmissionErrored(formSubmission, error) {\n    console.error(error);\n  }\n\n  formSubmissionFinished(formSubmission) {\n    // Not all adapters implement formSubmissionFinished\n    if (typeof this.adapter.formSubmissionFinished === \"function\") {\n      this.adapter.formSubmissionFinished(formSubmission);\n    }\n  }\n\n  // Link prefetching\n\n  linkPrefetchingIsEnabledForLocation(location) {\n    // Not all adapters implement linkPrefetchingIsEnabledForLocation\n    if (typeof this.adapter.linkPrefetchingIsEnabledForLocation === \"function\") {\n      return this.adapter.linkPrefetchingIsEnabledForLocation(location)\n    }\n\n    return true\n  }\n\n  // Visit delegate\n\n  visitStarted(visit) {\n    this.delegate.visitStarted(visit);\n  }\n\n  visitCompleted(visit) {\n    this.delegate.visitCompleted(visit);\n    delete this.currentVisit;\n  }\n\n  // Same-page links are no longer handled with a Visit.\n  // This method is still needed for Turbo Native adapters.\n  locationWithActionIsSamePage(location, action) {\n    return false\n  }\n\n  // Visits\n\n  get location() {\n    return this.history.location\n  }\n\n  get restorationIdentifier() {\n    return this.history.restorationIdentifier\n  }\n\n  #getActionForFormSubmission(formSubmission, fetchResponse) {\n    const { submitter, formElement } = formSubmission;\n    return getVisitAction(submitter, formElement) || this.#getDefaultAction(fetchResponse)\n  }\n\n  #getDefaultAction(fetchResponse) {\n    const sameLocationRedirect = fetchResponse.redirected && fetchResponse.location.href === this.location?.href;\n    return sameLocationRedirect ? \"replace\" : \"advance\"\n  }\n}\n\nconst PageStage = {\n  initial: 0,\n  loading: 1,\n  interactive: 2,\n  complete: 3\n};\n\nclass PageObserver {\n  stage = PageStage.initial\n  started = false\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.started) {\n      if (this.stage == PageStage.initial) {\n        this.stage = PageStage.loading;\n      }\n      document.addEventListener(\"readystatechange\", this.interpretReadyState, false);\n      addEventListener(\"pagehide\", this.pageWillUnload, false);\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      document.removeEventListener(\"readystatechange\", this.interpretReadyState, false);\n      removeEventListener(\"pagehide\", this.pageWillUnload, false);\n      this.started = false;\n    }\n  }\n\n  interpretReadyState = () => {\n    const { readyState } = this;\n    if (readyState == \"interactive\") {\n      this.pageIsInteractive();\n    } else if (readyState == \"complete\") {\n      this.pageIsComplete();\n    }\n  }\n\n  pageIsInteractive() {\n    if (this.stage == PageStage.loading) {\n      this.stage = PageStage.interactive;\n      this.delegate.pageBecameInteractive();\n    }\n  }\n\n  pageIsComplete() {\n    this.pageIsInteractive();\n    if (this.stage == PageStage.interactive) {\n      this.stage = PageStage.complete;\n      this.delegate.pageLoaded();\n    }\n  }\n\n  pageWillUnload = () => {\n    this.delegate.pageWillUnload();\n  }\n\n  get readyState() {\n    return document.readyState\n  }\n}\n\nclass ScrollObserver {\n  started = false\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.started) {\n      addEventListener(\"scroll\", this.onScroll, false);\n      this.onScroll();\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      removeEventListener(\"scroll\", this.onScroll, false);\n      this.started = false;\n    }\n  }\n\n  onScroll = () => {\n    this.updatePosition({ x: window.pageXOffset, y: window.pageYOffset });\n  }\n\n  // Private\n\n  updatePosition(position) {\n    this.delegate.scrollPositionChanged(position);\n  }\n}\n\nclass StreamMessageRenderer {\n  render({ fragment }) {\n    Bardo.preservingPermanentElements(this, getPermanentElementMapForFragment(fragment), () => {\n      withAutofocusFromFragment(fragment, () => {\n        withPreservedFocus(() => {\n          document.documentElement.appendChild(fragment);\n        });\n      });\n    });\n  }\n\n  // Bardo delegate\n\n  enteringBardo(currentPermanentElement, newPermanentElement) {\n    newPermanentElement.replaceWith(currentPermanentElement.cloneNode(true));\n  }\n\n  leavingBardo() {}\n}\n\nfunction getPermanentElementMapForFragment(fragment) {\n  const permanentElementsInDocument = queryPermanentElementsAll(document.documentElement);\n  const permanentElementMap = {};\n  for (const permanentElementInDocument of permanentElementsInDocument) {\n    const { id } = permanentElementInDocument;\n\n    for (const streamElement of fragment.querySelectorAll(\"turbo-stream\")) {\n      const elementInStream = getPermanentElementById(streamElement.templateElement.content, id);\n\n      if (elementInStream) {\n        permanentElementMap[id] = [permanentElementInDocument, elementInStream];\n      }\n    }\n  }\n\n  return permanentElementMap\n}\n\nasync function withAutofocusFromFragment(fragment, callback) {\n  const generatedID = `turbo-stream-autofocus-${uuid()}`;\n  const turboStreams = fragment.querySelectorAll(\"turbo-stream\");\n  const elementWithAutofocus = firstAutofocusableElementInStreams(turboStreams);\n  let willAutofocusId = null;\n\n  if (elementWithAutofocus) {\n    if (elementWithAutofocus.id) {\n      willAutofocusId = elementWithAutofocus.id;\n    } else {\n      willAutofocusId = generatedID;\n    }\n\n    elementWithAutofocus.id = willAutofocusId;\n  }\n\n  callback();\n  await nextRepaint();\n\n  const hasNoActiveElement = document.activeElement == null || document.activeElement == document.body;\n\n  if (hasNoActiveElement && willAutofocusId) {\n    const elementToAutofocus = document.getElementById(willAutofocusId);\n\n    if (elementIsFocusable(elementToAutofocus)) {\n      elementToAutofocus.focus();\n    }\n    if (elementToAutofocus && elementToAutofocus.id == generatedID) {\n      elementToAutofocus.removeAttribute(\"id\");\n    }\n  }\n}\n\nasync function withPreservedFocus(callback) {\n  const [activeElementBeforeRender, activeElementAfterRender] = await around(callback, () => document.activeElement);\n\n  const restoreFocusTo = activeElementBeforeRender && activeElementBeforeRender.id;\n\n  if (restoreFocusTo) {\n    const elementToFocus = document.getElementById(restoreFocusTo);\n\n    if (elementIsFocusable(elementToFocus) && elementToFocus != activeElementAfterRender) {\n      elementToFocus.focus();\n    }\n  }\n}\n\nfunction firstAutofocusableElementInStreams(nodeListOfStreamElements) {\n  for (const streamElement of nodeListOfStreamElements) {\n    const elementWithAutofocus = queryAutofocusableElement(streamElement.templateElement.content);\n\n    if (elementWithAutofocus) return elementWithAutofocus\n  }\n\n  return null\n}\n\nclass StreamObserver {\n  sources = new Set()\n  #started = false\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.#started) {\n      this.#started = true;\n      addEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\n    }\n  }\n\n  stop() {\n    if (this.#started) {\n      this.#started = false;\n      removeEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\n    }\n  }\n\n  connectStreamSource(source) {\n    if (!this.streamSourceIsConnected(source)) {\n      this.sources.add(source);\n      source.addEventListener(\"message\", this.receiveMessageEvent, false);\n    }\n  }\n\n  disconnectStreamSource(source) {\n    if (this.streamSourceIsConnected(source)) {\n      this.sources.delete(source);\n      source.removeEventListener(\"message\", this.receiveMessageEvent, false);\n    }\n  }\n\n  streamSourceIsConnected(source) {\n    return this.sources.has(source)\n  }\n\n  inspectFetchResponse = (event) => {\n    const response = fetchResponseFromEvent(event);\n    if (response && fetchResponseIsStream(response)) {\n      event.preventDefault();\n      this.receiveMessageResponse(response);\n    }\n  }\n\n  receiveMessageEvent = (event) => {\n    if (this.#started && typeof event.data == \"string\") {\n      this.receiveMessageHTML(event.data);\n    }\n  }\n\n  async receiveMessageResponse(response) {\n    const html = await response.responseHTML;\n    if (html) {\n      this.receiveMessageHTML(html);\n    }\n  }\n\n  receiveMessageHTML(html) {\n    this.delegate.receivedMessageFromStream(StreamMessage.wrap(html));\n  }\n}\n\nfunction fetchResponseFromEvent(event) {\n  const fetchResponse = event.detail?.fetchResponse;\n  if (fetchResponse instanceof FetchResponse) {\n    return fetchResponse\n  }\n}\n\nfunction fetchResponseIsStream(response) {\n  const contentType = response.contentType ?? \"\";\n  return contentType.startsWith(StreamMessage.contentType)\n}\n\nclass ErrorRenderer extends Renderer {\n  static renderElement(currentElement, newElement) {\n    const { documentElement, body } = document;\n\n    documentElement.replaceChild(newElement, body);\n  }\n\n  async render() {\n    this.replaceHeadAndBody();\n    this.activateScriptElements();\n  }\n\n  replaceHeadAndBody() {\n    const { documentElement, head } = document;\n    documentElement.replaceChild(this.newHead, head);\n    this.renderElement(this.currentElement, this.newElement);\n  }\n\n  activateScriptElements() {\n    for (const replaceableElement of this.scriptElements) {\n      const parentNode = replaceableElement.parentNode;\n      if (parentNode) {\n        const element = activateScriptElement(replaceableElement);\n        parentNode.replaceChild(element, replaceableElement);\n      }\n    }\n  }\n\n  get newHead() {\n    return this.newSnapshot.headSnapshot.element\n  }\n\n  get scriptElements() {\n    return document.documentElement.querySelectorAll(\"script\")\n  }\n}\n\nclass PageRenderer extends Renderer {\n  static renderElement(currentElement, newElement) {\n    if (document.body && newElement instanceof HTMLBodyElement) {\n      document.body.replaceWith(newElement);\n    } else {\n      document.documentElement.appendChild(newElement);\n    }\n  }\n\n  get shouldRender() {\n    return this.newSnapshot.isVisitable && this.trackedElementsAreIdentical\n  }\n\n  get reloadReason() {\n    if (!this.newSnapshot.isVisitable) {\n      return {\n        reason: \"turbo_visit_control_is_reload\"\n      }\n    }\n\n    if (!this.trackedElementsAreIdentical) {\n      return {\n        reason: \"tracked_element_mismatch\"\n      }\n    }\n  }\n\n  async prepareToRender() {\n    this.#setLanguage();\n    await this.mergeHead();\n  }\n\n  async render() {\n    if (this.willRender) {\n      await this.replaceBody();\n    }\n  }\n\n  finishRendering() {\n    super.finishRendering();\n    if (!this.isPreview) {\n      this.focusFirstAutofocusableElement();\n    }\n  }\n\n  get currentHeadSnapshot() {\n    return this.currentSnapshot.headSnapshot\n  }\n\n  get newHeadSnapshot() {\n    return this.newSnapshot.headSnapshot\n  }\n\n  get newElement() {\n    return this.newSnapshot.element\n  }\n\n  #setLanguage() {\n    const { documentElement } = this.currentSnapshot;\n    const { dir, lang } = this.newSnapshot;\n\n    if (lang) {\n      documentElement.setAttribute(\"lang\", lang);\n    } else {\n      documentElement.removeAttribute(\"lang\");\n    }\n    if (dir) {\n      documentElement.setAttribute(\"dir\", dir);\n    } else {\n      documentElement.removeAttribute(\"dir\");\n    }\n  }\n\n  async mergeHead() {\n    const mergedHeadElements = this.mergeProvisionalElements();\n    const newStylesheetElements = this.copyNewHeadStylesheetElements();\n    this.copyNewHeadScriptElements();\n\n    await mergedHeadElements;\n    await newStylesheetElements;\n\n    if (this.willRender) {\n      this.removeUnusedDynamicStylesheetElements();\n    }\n  }\n\n  async replaceBody() {\n    await this.preservingPermanentElements(async () => {\n      this.activateNewBody();\n      await this.assignNewBody();\n    });\n  }\n\n  get trackedElementsAreIdentical() {\n    return this.currentHeadSnapshot.trackedElementSignature == this.newHeadSnapshot.trackedElementSignature\n  }\n\n  async copyNewHeadStylesheetElements() {\n    const loadingElements = [];\n\n    for (const element of this.newHeadStylesheetElements) {\n      loadingElements.push(waitForLoad(element));\n\n      document.head.appendChild(element);\n    }\n\n    await Promise.all(loadingElements);\n  }\n\n  copyNewHeadScriptElements() {\n    for (const element of this.newHeadScriptElements) {\n      document.head.appendChild(activateScriptElement(element));\n    }\n  }\n\n  removeUnusedDynamicStylesheetElements() {\n    for (const element of this.unusedDynamicStylesheetElements) {\n      document.head.removeChild(element);\n    }\n  }\n\n  async mergeProvisionalElements() {\n    const newHeadElements = [...this.newHeadProvisionalElements];\n\n    for (const element of this.currentHeadProvisionalElements) {\n      if (!this.isCurrentElementInElementList(element, newHeadElements)) {\n        document.head.removeChild(element);\n      }\n    }\n\n    for (const element of newHeadElements) {\n      document.head.appendChild(element);\n    }\n  }\n\n  isCurrentElementInElementList(element, elementList) {\n    for (const [index, newElement] of elementList.entries()) {\n      // if title element...\n      if (element.tagName == \"TITLE\") {\n        if (newElement.tagName != \"TITLE\") {\n          continue\n        }\n        if (element.innerHTML == newElement.innerHTML) {\n          elementList.splice(index, 1);\n          return true\n        }\n      }\n\n      // if any other element...\n      if (newElement.isEqualNode(element)) {\n        elementList.splice(index, 1);\n        return true\n      }\n    }\n\n    return false\n  }\n\n  removeCurrentHeadProvisionalElements() {\n    for (const element of this.currentHeadProvisionalElements) {\n      document.head.removeChild(element);\n    }\n  }\n\n  copyNewHeadProvisionalElements() {\n    for (const element of this.newHeadProvisionalElements) {\n      document.head.appendChild(element);\n    }\n  }\n\n  activateNewBody() {\n    document.adoptNode(this.newElement);\n    this.removeNoscriptElements();\n    this.activateNewBodyScriptElements();\n  }\n\n  removeNoscriptElements() {\n    for (const noscriptElement of this.newElement.querySelectorAll(\"noscript\")) {\n      noscriptElement.remove();\n    }\n  }\n\n  activateNewBodyScriptElements() {\n    for (const inertScriptElement of this.newBodyScriptElements) {\n      const activatedScriptElement = activateScriptElement(inertScriptElement);\n      inertScriptElement.replaceWith(activatedScriptElement);\n    }\n  }\n\n  async assignNewBody() {\n    await this.renderElement(this.currentElement, this.newElement);\n  }\n\n  get unusedDynamicStylesheetElements() {\n    return this.oldHeadStylesheetElements.filter((element) => {\n      return element.getAttribute(\"data-turbo-track\") === \"dynamic\"\n    })\n  }\n\n  get oldHeadStylesheetElements() {\n    return this.currentHeadSnapshot.getStylesheetElementsNotInSnapshot(this.newHeadSnapshot)\n  }\n\n  get newHeadStylesheetElements() {\n    return this.newHeadSnapshot.getStylesheetElementsNotInSnapshot(this.currentHeadSnapshot)\n  }\n\n  get newHeadScriptElements() {\n    return this.newHeadSnapshot.getScriptElementsNotInSnapshot(this.currentHeadSnapshot)\n  }\n\n  get currentHeadProvisionalElements() {\n    return this.currentHeadSnapshot.provisionalElements\n  }\n\n  get newHeadProvisionalElements() {\n    return this.newHeadSnapshot.provisionalElements\n  }\n\n  get newBodyScriptElements() {\n    return this.newElement.querySelectorAll(\"script\")\n  }\n}\n\nclass MorphingPageRenderer extends PageRenderer {\n  static renderElement(currentElement, newElement) {\n    morphElements(currentElement, newElement, {\n      callbacks: {\n        beforeNodeMorphed: (node, newNode) => {\n          if (\n            shouldRefreshFrameWithMorphing(node, newNode) &&\n              !closestFrameReloadableWithMorphing(node)\n          ) {\n            node.reload();\n            return false\n          }\n          return true\n        }\n      }\n    });\n\n    dispatch(\"turbo:morph\", { detail: { currentElement, newElement } });\n  }\n\n  async preservingPermanentElements(callback) {\n    return await callback()\n  }\n\n  get renderMethod() {\n    return \"morph\"\n  }\n\n  get shouldAutofocus() {\n    return false\n  }\n}\n\nclass SnapshotCache extends LRUCache {\n  constructor(size) {\n    super(size, toCacheKey);\n  }\n\n  get snapshots() {\n    return this.entries\n  }\n}\n\nclass PageView extends View {\n  snapshotCache = new SnapshotCache(10)\n  lastRenderedLocation = new URL(location.href)\n  forceReloaded = false\n\n  shouldTransitionTo(newSnapshot) {\n    return this.snapshot.prefersViewTransitions && newSnapshot.prefersViewTransitions\n  }\n\n  renderPage(snapshot, isPreview = false, willRender = true, visit) {\n    const shouldMorphPage = this.isPageRefresh(visit) && (visit?.refresh?.method || this.snapshot.refreshMethod) === \"morph\";\n    const rendererClass = shouldMorphPage ? MorphingPageRenderer : PageRenderer;\n\n    const renderer = new rendererClass(this.snapshot, snapshot, isPreview, willRender);\n\n    if (!renderer.shouldRender) {\n      this.forceReloaded = true;\n    } else {\n      visit?.changeHistory();\n    }\n\n    return this.render(renderer)\n  }\n\n  renderError(snapshot, visit) {\n    visit?.changeHistory();\n    const renderer = new ErrorRenderer(this.snapshot, snapshot, false);\n    return this.render(renderer)\n  }\n\n  clearSnapshotCache() {\n    this.snapshotCache.clear();\n  }\n\n  async cacheSnapshot(snapshot = this.snapshot) {\n    if (snapshot.isCacheable) {\n      this.delegate.viewWillCacheSnapshot();\n      const { lastRenderedLocation: location } = this;\n      await nextEventLoopTick();\n      const cachedSnapshot = snapshot.clone();\n      this.snapshotCache.put(location, cachedSnapshot);\n      return cachedSnapshot\n    }\n  }\n\n  getCachedSnapshotForLocation(location) {\n    return this.snapshotCache.get(location)\n  }\n\n  isPageRefresh(visit) {\n    return !visit || (this.lastRenderedLocation.pathname === visit.location.pathname && visit.action === \"replace\")\n  }\n\n  shouldPreserveScrollPosition(visit) {\n    return this.isPageRefresh(visit) && (visit?.refresh?.scroll || this.snapshot.refreshScroll) === \"preserve\"\n  }\n\n  get snapshot() {\n    return PageSnapshot.fromElement(this.element)\n  }\n}\n\nclass Preloader {\n  selector = \"a[data-turbo-preload]\"\n\n  constructor(delegate, snapshotCache) {\n    this.delegate = delegate;\n    this.snapshotCache = snapshotCache;\n  }\n\n  start() {\n    if (document.readyState === \"loading\") {\n      document.addEventListener(\"DOMContentLoaded\", this.#preloadAll);\n    } else {\n      this.preloadOnLoadLinksForView(document.body);\n    }\n  }\n\n  stop() {\n    document.removeEventListener(\"DOMContentLoaded\", this.#preloadAll);\n  }\n\n  preloadOnLoadLinksForView(element) {\n    for (const link of element.querySelectorAll(this.selector)) {\n      if (this.delegate.shouldPreloadLink(link)) {\n        this.preloadURL(link);\n      }\n    }\n  }\n\n  async preloadURL(link) {\n    const location = new URL(link.href);\n\n    if (this.snapshotCache.has(location)) {\n      return\n    }\n\n    const fetchRequest = new FetchRequest(this, FetchMethod.get, location, new URLSearchParams(), link);\n    await fetchRequest.perform();\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(fetchRequest) {\n    fetchRequest.headers[\"X-Sec-Purpose\"] = \"prefetch\";\n  }\n\n  async requestSucceededWithResponse(fetchRequest, fetchResponse) {\n    try {\n      const responseHTML = await fetchResponse.responseHTML;\n      const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n\n      this.snapshotCache.put(fetchRequest.url, snapshot);\n    } catch (_) {\n      // If we cannot preload that is ok!\n    }\n  }\n\n  requestStarted(fetchRequest) {}\n\n  requestErrored(fetchRequest) {}\n\n  requestFinished(fetchRequest) {}\n\n  requestPreventedHandlingResponse(fetchRequest, fetchResponse) {}\n\n  requestFailedWithResponse(fetchRequest, fetchResponse) {}\n\n  #preloadAll = () => {\n    this.preloadOnLoadLinksForView(document.body);\n  }\n}\n\nclass Cache {\n  constructor(session) {\n    this.session = session;\n  }\n\n  clear() {\n    this.session.clearCache();\n  }\n\n  resetCacheControl() {\n    this.#setCacheControl(\"\");\n  }\n\n  exemptPageFromCache() {\n    this.#setCacheControl(\"no-cache\");\n  }\n\n  exemptPageFromPreview() {\n    this.#setCacheControl(\"no-preview\");\n  }\n\n  #setCacheControl(value) {\n    setMetaContent(\"turbo-cache-control\", value);\n  }\n}\n\nclass Session {\n  navigator = new Navigator(this)\n  history = new History(this)\n  view = new PageView(this, document.documentElement)\n  adapter = new BrowserAdapter(this)\n\n  pageObserver = new PageObserver(this)\n  cacheObserver = new CacheObserver()\n  linkPrefetchObserver = new LinkPrefetchObserver(this, document)\n  linkClickObserver = new LinkClickObserver(this, window)\n  formSubmitObserver = new FormSubmitObserver(this, document)\n  scrollObserver = new ScrollObserver(this)\n  streamObserver = new StreamObserver(this)\n  formLinkClickObserver = new FormLinkClickObserver(this, document.documentElement)\n  frameRedirector = new FrameRedirector(this, document.documentElement)\n  streamMessageRenderer = new StreamMessageRenderer()\n  cache = new Cache(this)\n\n  enabled = true\n  started = false\n  #pageRefreshDebouncePeriod = 150\n\n  constructor(recentRequests) {\n    this.recentRequests = recentRequests;\n    this.preloader = new Preloader(this, this.view.snapshotCache);\n    this.debouncedRefresh = this.refresh;\n    this.pageRefreshDebouncePeriod = this.pageRefreshDebouncePeriod;\n  }\n\n  start() {\n    if (!this.started) {\n      this.pageObserver.start();\n      this.cacheObserver.start();\n      this.linkPrefetchObserver.start();\n      this.formLinkClickObserver.start();\n      this.linkClickObserver.start();\n      this.formSubmitObserver.start();\n      this.scrollObserver.start();\n      this.streamObserver.start();\n      this.frameRedirector.start();\n      this.history.start();\n      this.preloader.start();\n      this.started = true;\n      this.enabled = true;\n    }\n  }\n\n  disable() {\n    this.enabled = false;\n  }\n\n  stop() {\n    if (this.started) {\n      this.pageObserver.stop();\n      this.cacheObserver.stop();\n      this.linkPrefetchObserver.stop();\n      this.formLinkClickObserver.stop();\n      this.linkClickObserver.stop();\n      this.formSubmitObserver.stop();\n      this.scrollObserver.stop();\n      this.streamObserver.stop();\n      this.frameRedirector.stop();\n      this.history.stop();\n      this.preloader.stop();\n      this.started = false;\n    }\n  }\n\n  registerAdapter(adapter) {\n    this.adapter = adapter;\n  }\n\n  visit(location, options = {}) {\n    const frameElement = options.frame ? document.getElementById(options.frame) : null;\n\n    if (frameElement instanceof FrameElement) {\n      const action = options.action || getVisitAction(frameElement);\n\n      frameElement.delegate.proposeVisitIfNavigatedWithAction(frameElement, action);\n      frameElement.src = location.toString();\n    } else {\n      this.navigator.proposeVisit(expandURL(location), options);\n    }\n  }\n\n  refresh(url, options = {}) {\n    options = typeof options === \"string\" ? { requestId: options } : options;\n\n    const { method, requestId, scroll } = options;\n    const isRecentRequest = requestId && this.recentRequests.has(requestId);\n    const isCurrentUrl = url === document.baseURI;\n    if (!isRecentRequest && !this.navigator.currentVisit && isCurrentUrl) {\n      this.visit(url, { action: \"replace\", shouldCacheSnapshot: false, refresh: { method, scroll } });\n    }\n  }\n\n  connectStreamSource(source) {\n    this.streamObserver.connectStreamSource(source);\n  }\n\n  disconnectStreamSource(source) {\n    this.streamObserver.disconnectStreamSource(source);\n  }\n\n  renderStreamMessage(message) {\n    this.streamMessageRenderer.render(StreamMessage.wrap(message));\n  }\n\n  clearCache() {\n    this.view.clearSnapshotCache();\n  }\n\n  setProgressBarDelay(delay) {\n    console.warn(\n      \"Please replace `session.setProgressBarDelay(delay)` with `session.progressBarDelay = delay`. The function is deprecated and will be removed in a future version of Turbo.`\"\n    );\n\n    this.progressBarDelay = delay;\n  }\n\n  set progressBarDelay(delay) {\n    config.drive.progressBarDelay = delay;\n  }\n\n  get progressBarDelay() {\n    return config.drive.progressBarDelay\n  }\n\n  set drive(value) {\n    config.drive.enabled = value;\n  }\n\n  get drive() {\n    return config.drive.enabled\n  }\n\n  set formMode(value) {\n    config.forms.mode = value;\n  }\n\n  get formMode() {\n    return config.forms.mode\n  }\n\n  get location() {\n    return this.history.location\n  }\n\n  get restorationIdentifier() {\n    return this.history.restorationIdentifier\n  }\n\n  get pageRefreshDebouncePeriod() {\n    return this.#pageRefreshDebouncePeriod\n  }\n\n  set pageRefreshDebouncePeriod(value) {\n    this.refresh = debounce(this.debouncedRefresh.bind(this), value);\n    this.#pageRefreshDebouncePeriod = value;\n  }\n\n  // Preloader delegate\n\n  shouldPreloadLink(element) {\n    const isUnsafe = element.hasAttribute(\"data-turbo-method\");\n    const isStream = element.hasAttribute(\"data-turbo-stream\");\n    const frameTarget = element.getAttribute(\"data-turbo-frame\");\n    const frame = frameTarget == \"_top\" ?\n      null :\n      document.getElementById(frameTarget) || findClosestRecursively(element, \"turbo-frame:not([disabled])\");\n\n    if (isUnsafe || isStream || frame instanceof FrameElement) {\n      return false\n    } else {\n      const location = new URL(element.href);\n\n      return this.elementIsNavigatable(element) && locationIsVisitable(location, this.snapshot.rootLocation)\n    }\n  }\n\n  // History delegate\n\n  historyPoppedToLocationWithRestorationIdentifierAndDirection(location, restorationIdentifier, direction) {\n    if (this.enabled) {\n      this.navigator.startVisit(location, restorationIdentifier, {\n        action: \"restore\",\n        historyChanged: true,\n        direction\n      });\n    } else {\n      this.adapter.pageInvalidated({\n        reason: \"turbo_disabled\"\n      });\n    }\n  }\n\n  historyPoppedWithEmptyState(location) {\n    this.history.replace(location);\n    this.view.lastRenderedLocation = location;\n    this.view.cacheSnapshot();\n  }\n\n  // Scroll observer delegate\n\n  scrollPositionChanged(position) {\n    this.history.updateRestorationData({ scrollPosition: position });\n  }\n\n  // Form click observer delegate\n\n  willSubmitFormLinkToLocation(link, location) {\n    return this.elementIsNavigatable(link) && locationIsVisitable(location, this.snapshot.rootLocation)\n  }\n\n  submittedFormLinkToLocation() {}\n\n  // Link hover observer delegate\n\n  canPrefetchRequestToLocation(link, location) {\n    return (\n      this.elementIsNavigatable(link) &&\n      locationIsVisitable(location, this.snapshot.rootLocation) &&\n      this.navigator.linkPrefetchingIsEnabledForLocation(location)\n    )\n  }\n\n  // Link click observer delegate\n\n  willFollowLinkToLocation(link, location, event) {\n    return (\n      this.elementIsNavigatable(link) &&\n      locationIsVisitable(location, this.snapshot.rootLocation) &&\n      this.applicationAllowsFollowingLinkToLocation(link, location, event)\n    )\n  }\n\n  followedLinkToLocation(link, location) {\n    const action = this.getActionForLink(link);\n    const acceptsStreamResponse = link.hasAttribute(\"data-turbo-stream\");\n\n    this.visit(location.href, { action, acceptsStreamResponse });\n  }\n\n  // Navigator delegate\n\n  allowsVisitingLocationWithAction(location, action) {\n    return this.applicationAllowsVisitingLocation(location)\n  }\n\n  visitProposedToLocation(location, options) {\n    extendURLWithDeprecatedProperties(location);\n    this.adapter.visitProposedToLocation(location, options);\n  }\n\n  // Visit delegate\n\n  visitStarted(visit) {\n    if (!visit.acceptsStreamResponse) {\n      markAsBusy(document.documentElement);\n      this.view.markVisitDirection(visit.direction);\n    }\n    extendURLWithDeprecatedProperties(visit.location);\n    this.notifyApplicationAfterVisitingLocation(visit.location, visit.action);\n  }\n\n  visitCompleted(visit) {\n    this.view.unmarkVisitDirection();\n    clearBusyState(document.documentElement);\n    this.notifyApplicationAfterPageLoad(visit.getTimingMetrics());\n  }\n\n  // Form submit observer delegate\n\n  willSubmitForm(form, submitter) {\n    const action = getAction$1(form, submitter);\n\n    return (\n      this.submissionIsNavigatable(form, submitter) &&\n      locationIsVisitable(expandURL(action), this.snapshot.rootLocation)\n    )\n  }\n\n  formSubmitted(form, submitter) {\n    this.navigator.submitForm(form, submitter);\n  }\n\n  // Page observer delegate\n\n  pageBecameInteractive() {\n    this.view.lastRenderedLocation = this.location;\n    this.notifyApplicationAfterPageLoad();\n  }\n\n  pageLoaded() {\n    this.history.assumeControlOfScrollRestoration();\n  }\n\n  pageWillUnload() {\n    this.history.relinquishControlOfScrollRestoration();\n  }\n\n  // Stream observer delegate\n\n  receivedMessageFromStream(message) {\n    this.renderStreamMessage(message);\n  }\n\n  // Page view delegate\n\n  viewWillCacheSnapshot() {\n    this.notifyApplicationBeforeCachingSnapshot();\n  }\n\n  allowsImmediateRender({ element }, options) {\n    const event = this.notifyApplicationBeforeRender(element, options);\n    const {\n      defaultPrevented,\n      detail: { render }\n    } = event;\n\n    if (this.view.renderer && render) {\n      this.view.renderer.renderElement = render;\n    }\n\n    return !defaultPrevented\n  }\n\n  viewRenderedSnapshot(_snapshot, _isPreview, renderMethod) {\n    this.view.lastRenderedLocation = this.history.location;\n    this.notifyApplicationAfterRender(renderMethod);\n  }\n\n  preloadOnLoadLinksForView(element) {\n    this.preloader.preloadOnLoadLinksForView(element);\n  }\n\n  viewInvalidated(reason) {\n    this.adapter.pageInvalidated(reason);\n  }\n\n  // Frame element\n\n  frameLoaded(frame) {\n    this.notifyApplicationAfterFrameLoad(frame);\n  }\n\n  frameRendered(fetchResponse, frame) {\n    this.notifyApplicationAfterFrameRender(fetchResponse, frame);\n  }\n\n  // Application events\n\n  applicationAllowsFollowingLinkToLocation(link, location, ev) {\n    const event = this.notifyApplicationAfterClickingLinkToLocation(link, location, ev);\n    return !event.defaultPrevented\n  }\n\n  applicationAllowsVisitingLocation(location) {\n    const event = this.notifyApplicationBeforeVisitingLocation(location);\n    return !event.defaultPrevented\n  }\n\n  notifyApplicationAfterClickingLinkToLocation(link, location, event) {\n    return dispatch(\"turbo:click\", {\n      target: link,\n      detail: { url: location.href, originalEvent: event },\n      cancelable: true\n    })\n  }\n\n  notifyApplicationBeforeVisitingLocation(location) {\n    return dispatch(\"turbo:before-visit\", {\n      detail: { url: location.href },\n      cancelable: true\n    })\n  }\n\n  notifyApplicationAfterVisitingLocation(location, action) {\n    return dispatch(\"turbo:visit\", { detail: { url: location.href, action } })\n  }\n\n  notifyApplicationBeforeCachingSnapshot() {\n    return dispatch(\"turbo:before-cache\")\n  }\n\n  notifyApplicationBeforeRender(newBody, options) {\n    return dispatch(\"turbo:before-render\", {\n      detail: { newBody, ...options },\n      cancelable: true\n    })\n  }\n\n  notifyApplicationAfterRender(renderMethod) {\n    return dispatch(\"turbo:render\", { detail: { renderMethod } })\n  }\n\n  notifyApplicationAfterPageLoad(timing = {}) {\n    return dispatch(\"turbo:load\", {\n      detail: { url: this.location.href, timing }\n    })\n  }\n\n  notifyApplicationAfterFrameLoad(frame) {\n    return dispatch(\"turbo:frame-load\", { target: frame })\n  }\n\n  notifyApplicationAfterFrameRender(fetchResponse, frame) {\n    return dispatch(\"turbo:frame-render\", {\n      detail: { fetchResponse },\n      target: frame,\n      cancelable: true\n    })\n  }\n\n  // Helpers\n\n  submissionIsNavigatable(form, submitter) {\n    if (config.forms.mode == \"off\") {\n      return false\n    } else {\n      const submitterIsNavigatable = submitter ? this.elementIsNavigatable(submitter) : true;\n\n      if (config.forms.mode == \"optin\") {\n        return submitterIsNavigatable && form.closest('[data-turbo=\"true\"]') != null\n      } else {\n        return submitterIsNavigatable && this.elementIsNavigatable(form)\n      }\n    }\n  }\n\n  elementIsNavigatable(element) {\n    const container = findClosestRecursively(element, \"[data-turbo]\");\n    const withinFrame = findClosestRecursively(element, \"turbo-frame\");\n\n    // Check if Drive is enabled on the session or we're within a Frame.\n    if (config.drive.enabled || withinFrame) {\n      // Element is navigatable by default, unless `data-turbo=\"false\"`.\n      if (container) {\n        return container.getAttribute(\"data-turbo\") != \"false\"\n      } else {\n        return true\n      }\n    } else {\n      // Element isn't navigatable by default, unless `data-turbo=\"true\"`.\n      if (container) {\n        return container.getAttribute(\"data-turbo\") == \"true\"\n      } else {\n        return false\n      }\n    }\n  }\n\n  // Private\n\n  getActionForLink(link) {\n    return getVisitAction(link) || \"advance\"\n  }\n\n  get snapshot() {\n    return this.view.snapshot\n  }\n}\n\n// Older versions of the Turbo Native adapters referenced the\n// `Location#absoluteURL` property in their implementations of\n// the `Adapter#visitProposedToLocation()` and `#visitStarted()`\n// methods. The Location class has since been removed in favor\n// of the DOM URL API, and accordingly all Adapter methods now\n// receive URL objects.\n//\n// We alias #absoluteURL to #toString() here to avoid crashing\n// older adapters which do not expect URL objects. We should\n// consider removing this support at some point in the future.\n\nfunction extendURLWithDeprecatedProperties(url) {\n  Object.defineProperties(url, deprecatedLocationPropertyDescriptors);\n}\n\nconst deprecatedLocationPropertyDescriptors = {\n  absoluteURL: {\n    get() {\n      return this.toString()\n    }\n  }\n};\n\nconst session = new Session(recentRequests);\n\n// Rename `navigator` to avoid shadowing `window.navigator`\nconst { cache, navigator: sessionNavigator } = session;\n\n/**\n * Starts the main session.\n * This initialises any necessary observers such as those to monitor\n * link interactions.\n */\nfunction start() {\n  session.start();\n}\n\n/**\n * Registers an adapter for the main session.\n *\n * @param adapter Adapter to register\n */\nfunction registerAdapter(adapter) {\n  session.registerAdapter(adapter);\n}\n\n/**\n * Performs an application visit to the given location.\n *\n * @param location Location to visit (a URL or path)\n * @param options Options to apply\n * @param options.action Type of history navigation to apply (\"restore\",\n * \"replace\" or \"advance\")\n * @param options.historyChanged Specifies whether the browser history has\n * already been changed for this visit or not\n * @param options.referrer Specifies the referrer of this visit such that\n * navigations to the same page will not result in a new history entry.\n * @param options.snapshotHTML Cached snapshot to render\n * @param options.response Response of the specified location\n */\nfunction visit(location, options) {\n  session.visit(location, options);\n}\n\n/**\n * Connects a stream source to the main session.\n *\n * @param source Stream source to connect\n */\nfunction connectStreamSource(source) {\n  session.connectStreamSource(source);\n}\n\n/**\n * Disconnects a stream source from the main session.\n *\n * @param source Stream source to disconnect\n */\nfunction disconnectStreamSource(source) {\n  session.disconnectStreamSource(source);\n}\n\n/**\n * Renders a stream message to the main session by appending it to the\n * current document.\n *\n * @param message Message to render\n */\nfunction renderStreamMessage(message) {\n  session.renderStreamMessage(message);\n}\n\n/**\n * Sets the delay after which the progress bar will appear during navigation.\n *\n * The progress bar appears after 500ms by default.\n *\n * Note that this method has no effect when used with the iOS or Android\n * adapters.\n *\n * @param delay Time to delay in milliseconds\n */\nfunction setProgressBarDelay(delay) {\n  console.warn(\n    \"Please replace `Turbo.setProgressBarDelay(delay)` with `Turbo.config.drive.progressBarDelay = delay`. The top-level function is deprecated and will be removed in a future version of Turbo.`\"\n  );\n  config.drive.progressBarDelay = delay;\n}\n\nfunction setConfirmMethod(confirmMethod) {\n  console.warn(\n    \"Please replace `Turbo.setConfirmMethod(confirmMethod)` with `Turbo.config.forms.confirm = confirmMethod`. The top-level function is deprecated and will be removed in a future version of Turbo.`\"\n  );\n  config.forms.confirm = confirmMethod;\n}\n\nfunction setFormMode(mode) {\n  console.warn(\n    \"Please replace `Turbo.setFormMode(mode)` with `Turbo.config.forms.mode = mode`. The top-level function is deprecated and will be removed in a future version of Turbo.`\"\n  );\n  config.forms.mode = mode;\n}\n\n/**\n * Morph the state of the currentBody based on the attributes and contents of\n * the newBody. Morphing body elements may dispatch turbo:morph,\n * turbo:before-morph-element, turbo:before-morph-attribute, and\n * turbo:morph-element events.\n *\n * @param currentBody HTMLBodyElement destination of morphing changes\n * @param newBody HTMLBodyElement source of morphing changes\n */\nfunction morphBodyElements(currentBody, newBody) {\n  MorphingPageRenderer.renderElement(currentBody, newBody);\n}\n\n/**\n * Morph the child elements of the currentFrame based on the child elements of\n * the newFrame. Morphing turbo-frame elements may dispatch turbo:before-frame-morph,\n * turbo:before-morph-element, turbo:before-morph-attribute, and\n * turbo:morph-element events.\n *\n * @param currentFrame FrameElement destination of morphing children changes\n * @param newFrame FrameElement source of morphing children changes\n */\nfunction morphTurboFrameElements(currentFrame, newFrame) {\n  MorphingFrameRenderer.renderElement(currentFrame, newFrame);\n}\n\nvar Turbo = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  PageRenderer: PageRenderer,\n  PageSnapshot: PageSnapshot,\n  FrameRenderer: FrameRenderer,\n  fetch: fetchWithTurboHeaders,\n  config: config,\n  session: session,\n  cache: cache,\n  navigator: sessionNavigator,\n  start: start,\n  registerAdapter: registerAdapter,\n  visit: visit,\n  connectStreamSource: connectStreamSource,\n  disconnectStreamSource: disconnectStreamSource,\n  renderStreamMessage: renderStreamMessage,\n  setProgressBarDelay: setProgressBarDelay,\n  setConfirmMethod: setConfirmMethod,\n  setFormMode: setFormMode,\n  morphBodyElements: morphBodyElements,\n  morphTurboFrameElements: morphTurboFrameElements,\n  morphChildren: morphChildren,\n  morphElements: morphElements\n});\n\nclass TurboFrameMissingError extends Error {}\n\nclass FrameController {\n  fetchResponseLoaded = (_fetchResponse) => Promise.resolve()\n  #currentFetchRequest = null\n  #resolveVisitPromise = () => {}\n  #connected = false\n  #hasBeenLoaded = false\n  #ignoredAttributes = new Set()\n  #shouldMorphFrame = false\n  action = null\n\n  constructor(element) {\n    this.element = element;\n    this.view = new FrameView(this, this.element);\n    this.appearanceObserver = new AppearanceObserver(this, this.element);\n    this.formLinkClickObserver = new FormLinkClickObserver(this, this.element);\n    this.linkInterceptor = new LinkInterceptor(this, this.element);\n    this.restorationIdentifier = uuid();\n    this.formSubmitObserver = new FormSubmitObserver(this, this.element);\n  }\n\n  // Frame delegate\n\n  connect() {\n    if (!this.#connected) {\n      this.#connected = true;\n      if (this.loadingStyle == FrameLoadingStyle.lazy) {\n        this.appearanceObserver.start();\n      } else {\n        this.#loadSourceURL();\n      }\n      this.formLinkClickObserver.start();\n      this.linkInterceptor.start();\n      this.formSubmitObserver.start();\n    }\n  }\n\n  disconnect() {\n    if (this.#connected) {\n      this.#connected = false;\n      this.appearanceObserver.stop();\n      this.formLinkClickObserver.stop();\n      this.linkInterceptor.stop();\n      this.formSubmitObserver.stop();\n\n      if (!this.element.hasAttribute(\"recurse\")) {\n        this.#currentFetchRequest?.cancel();\n      }\n    }\n  }\n\n  disabledChanged() {\n    if (this.disabled) {\n      this.#currentFetchRequest?.cancel();\n    } else if (this.loadingStyle == FrameLoadingStyle.eager) {\n      this.#loadSourceURL();\n    }\n  }\n\n  sourceURLChanged() {\n    if (this.#isIgnoringChangesTo(\"src\")) return\n\n    if (!this.sourceURL) {\n      this.#currentFetchRequest?.cancel();\n    }\n\n    if (this.element.isConnected) {\n      this.complete = false;\n    }\n\n    if (this.loadingStyle == FrameLoadingStyle.eager || this.#hasBeenLoaded) {\n      this.#loadSourceURL();\n    }\n  }\n\n  sourceURLReloaded() {\n    const { refresh, src } = this.element;\n\n    this.#shouldMorphFrame = src && refresh === \"morph\";\n\n    this.element.removeAttribute(\"complete\");\n    this.element.src = null;\n    this.element.src = src;\n    return this.element.loaded\n  }\n\n  loadingStyleChanged() {\n    if (this.loadingStyle == FrameLoadingStyle.lazy) {\n      this.appearanceObserver.start();\n    } else {\n      this.appearanceObserver.stop();\n      this.#loadSourceURL();\n    }\n  }\n\n  async #loadSourceURL() {\n    if (this.enabled && this.isActive && !this.complete && this.sourceURL) {\n      this.element.loaded = this.#visit(expandURL(this.sourceURL));\n      this.appearanceObserver.stop();\n      await this.element.loaded;\n      this.#hasBeenLoaded = true;\n    }\n  }\n\n  async loadResponse(fetchResponse) {\n    if (fetchResponse.redirected || (fetchResponse.succeeded && fetchResponse.isHTML)) {\n      this.sourceURL = fetchResponse.response.url;\n    }\n\n    try {\n      const html = await fetchResponse.responseHTML;\n      if (html) {\n        const document = parseHTMLDocument(html);\n        const pageSnapshot = PageSnapshot.fromDocument(document);\n\n        if (pageSnapshot.isVisitable) {\n          await this.#loadFrameResponse(fetchResponse, document);\n        } else {\n          await this.#handleUnvisitableFrameResponse(fetchResponse);\n        }\n      }\n    } finally {\n      this.#shouldMorphFrame = false;\n      this.fetchResponseLoaded = () => Promise.resolve();\n    }\n  }\n\n  // Appearance observer delegate\n\n  elementAppearedInViewport(element) {\n    this.proposeVisitIfNavigatedWithAction(element, getVisitAction(element));\n    this.#loadSourceURL();\n  }\n\n  // Form link click observer delegate\n\n  willSubmitFormLinkToLocation(link) {\n    return this.#shouldInterceptNavigation(link)\n  }\n\n  submittedFormLinkToLocation(link, _location, form) {\n    const frame = this.#findFrameElement(link);\n    if (frame) form.setAttribute(\"data-turbo-frame\", frame.id);\n  }\n\n  // Link interceptor delegate\n\n  shouldInterceptLinkClick(element, _location, _event) {\n    return this.#shouldInterceptNavigation(element)\n  }\n\n  linkClickIntercepted(element, location) {\n    this.#navigateFrame(element, location);\n  }\n\n  // Form submit observer delegate\n\n  willSubmitForm(element, submitter) {\n    return element.closest(\"turbo-frame\") == this.element && this.#shouldInterceptNavigation(element, submitter)\n  }\n\n  formSubmitted(element, submitter) {\n    if (this.formSubmission) {\n      this.formSubmission.stop();\n    }\n\n    this.formSubmission = new FormSubmission(this, element, submitter);\n\n    const { fetchRequest } = this.formSubmission;\n    const frame = this.#findFrameElement(element, submitter);\n\n    this.prepareRequest(fetchRequest, frame);\n    this.formSubmission.start();\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(request, frame = this) {\n    request.headers[\"Turbo-Frame\"] = frame.id;\n\n    if (this.currentNavigationElement?.hasAttribute(\"data-turbo-stream\")) {\n      request.acceptResponseType(StreamMessage.contentType);\n    }\n  }\n\n  requestStarted(_request) {\n    markAsBusy(this.element);\n  }\n\n  requestPreventedHandlingResponse(_request, _response) {\n    this.#resolveVisitPromise();\n  }\n\n  async requestSucceededWithResponse(request, response) {\n    await this.loadResponse(response);\n    this.#resolveVisitPromise();\n  }\n\n  async requestFailedWithResponse(request, response) {\n    await this.loadResponse(response);\n    this.#resolveVisitPromise();\n  }\n\n  requestErrored(request, error) {\n    console.error(error);\n    this.#resolveVisitPromise();\n  }\n\n  requestFinished(_request) {\n    clearBusyState(this.element);\n  }\n\n  // Form submission delegate\n\n  formSubmissionStarted({ formElement }) {\n    markAsBusy(formElement, this.#findFrameElement(formElement));\n  }\n\n  formSubmissionSucceededWithResponse(formSubmission, response) {\n    const frame = this.#findFrameElement(formSubmission.formElement, formSubmission.submitter);\n\n    frame.delegate.proposeVisitIfNavigatedWithAction(frame, getVisitAction(formSubmission.submitter, formSubmission.formElement, frame));\n    frame.delegate.loadResponse(response);\n\n    if (!formSubmission.isSafe) {\n      session.clearCache();\n    }\n  }\n\n  formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n    this.element.delegate.loadResponse(fetchResponse);\n    session.clearCache();\n  }\n\n  formSubmissionErrored(formSubmission, error) {\n    console.error(error);\n  }\n\n  formSubmissionFinished({ formElement }) {\n    clearBusyState(formElement, this.#findFrameElement(formElement));\n  }\n\n  // View delegate\n\n  allowsImmediateRender({ element: newFrame }, options) {\n    const event = dispatch(\"turbo:before-frame-render\", {\n      target: this.element,\n      detail: { newFrame, ...options },\n      cancelable: true\n    });\n\n    const {\n      defaultPrevented,\n      detail: { render }\n    } = event;\n\n    if (this.view.renderer && render) {\n      this.view.renderer.renderElement = render;\n    }\n\n    return !defaultPrevented\n  }\n\n  viewRenderedSnapshot(_snapshot, _isPreview, _renderMethod) {}\n\n  preloadOnLoadLinksForView(element) {\n    session.preloadOnLoadLinksForView(element);\n  }\n\n  viewInvalidated() {}\n\n  // Frame renderer delegate\n\n  willRenderFrame(currentElement, _newElement) {\n    this.previousFrameElement = currentElement.cloneNode(true);\n  }\n\n  visitCachedSnapshot = ({ element }) => {\n    const frame = element.querySelector(\"#\" + this.element.id);\n\n    if (frame && this.previousFrameElement) {\n      frame.replaceChildren(...this.previousFrameElement.children);\n    }\n\n    delete this.previousFrameElement;\n  }\n\n  // Private\n\n  async #loadFrameResponse(fetchResponse, document) {\n    const newFrameElement = await this.extractForeignFrameElement(document.body);\n    const rendererClass = this.#shouldMorphFrame ? MorphingFrameRenderer : FrameRenderer;\n\n    if (newFrameElement) {\n      const snapshot = new Snapshot(newFrameElement);\n      const renderer = new rendererClass(this, this.view.snapshot, snapshot, false, false);\n      if (this.view.renderPromise) await this.view.renderPromise;\n      this.changeHistory();\n\n      await this.view.render(renderer);\n      this.complete = true;\n      session.frameRendered(fetchResponse, this.element);\n      session.frameLoaded(this.element);\n      await this.fetchResponseLoaded(fetchResponse);\n    } else if (this.#willHandleFrameMissingFromResponse(fetchResponse)) {\n      this.#handleFrameMissingFromResponse(fetchResponse);\n    }\n  }\n\n  async #visit(url) {\n    const request = new FetchRequest(this, FetchMethod.get, url, new URLSearchParams(), this.element);\n\n    this.#currentFetchRequest?.cancel();\n    this.#currentFetchRequest = request;\n\n    return new Promise((resolve) => {\n      this.#resolveVisitPromise = () => {\n        this.#resolveVisitPromise = () => {};\n        this.#currentFetchRequest = null;\n        resolve();\n      };\n      request.perform();\n    })\n  }\n\n  #navigateFrame(element, url, submitter) {\n    const frame = this.#findFrameElement(element, submitter);\n\n    frame.delegate.proposeVisitIfNavigatedWithAction(frame, getVisitAction(submitter, element, frame));\n\n    this.#withCurrentNavigationElement(element, () => {\n      frame.src = url;\n    });\n  }\n\n  proposeVisitIfNavigatedWithAction(frame, action = null) {\n    this.action = action;\n\n    if (this.action) {\n      const pageSnapshot = PageSnapshot.fromElement(frame).clone();\n      const { visitCachedSnapshot } = frame.delegate;\n\n      frame.delegate.fetchResponseLoaded = async (fetchResponse) => {\n        if (frame.src) {\n          const { statusCode, redirected } = fetchResponse;\n          const responseHTML = await fetchResponse.responseHTML;\n          const response = { statusCode, redirected, responseHTML };\n          const options = {\n            response,\n            visitCachedSnapshot,\n            willRender: false,\n            updateHistory: false,\n            restorationIdentifier: this.restorationIdentifier,\n            snapshot: pageSnapshot\n          };\n\n          if (this.action) options.action = this.action;\n\n          session.visit(frame.src, options);\n        }\n      };\n    }\n  }\n\n  changeHistory() {\n    if (this.action) {\n      const method = getHistoryMethodForAction(this.action);\n      session.history.update(method, expandURL(this.element.src || \"\"), this.restorationIdentifier);\n    }\n  }\n\n  async #handleUnvisitableFrameResponse(fetchResponse) {\n    console.warn(\n      `The response (${fetchResponse.statusCode}) from <turbo-frame id=\"${this.element.id}\"> is performing a full page visit due to turbo-visit-control.`\n    );\n\n    await this.#visitResponse(fetchResponse.response);\n  }\n\n  #willHandleFrameMissingFromResponse(fetchResponse) {\n    this.element.setAttribute(\"complete\", \"\");\n\n    const response = fetchResponse.response;\n    const visit = async (url, options) => {\n      if (url instanceof Response) {\n        this.#visitResponse(url);\n      } else {\n        session.visit(url, options);\n      }\n    };\n\n    const event = dispatch(\"turbo:frame-missing\", {\n      target: this.element,\n      detail: { response, visit },\n      cancelable: true\n    });\n\n    return !event.defaultPrevented\n  }\n\n  #handleFrameMissingFromResponse(fetchResponse) {\n    this.view.missing();\n    this.#throwFrameMissingError(fetchResponse);\n  }\n\n  #throwFrameMissingError(fetchResponse) {\n    const message = `The response (${fetchResponse.statusCode}) did not contain the expected <turbo-frame id=\"${this.element.id}\"> and will be ignored. To perform a full page visit instead, set turbo-visit-control to reload.`;\n    throw new TurboFrameMissingError(message)\n  }\n\n  async #visitResponse(response) {\n    const wrapped = new FetchResponse(response);\n    const responseHTML = await wrapped.responseHTML;\n    const { location, redirected, statusCode } = wrapped;\n\n    return session.visit(location, { response: { redirected, statusCode, responseHTML } })\n  }\n\n  #findFrameElement(element, submitter) {\n    const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n    const target = this.#getFrameElementById(id);\n\n    return target instanceof FrameElement ? target : this.element\n  }\n\n  async extractForeignFrameElement(container) {\n    let element;\n    const id = CSS.escape(this.id);\n\n    try {\n      element = activateElement(container.querySelector(`turbo-frame#${id}`), this.sourceURL);\n      if (element) {\n        return element\n      }\n\n      element = activateElement(container.querySelector(`turbo-frame[src][recurse~=${id}]`), this.sourceURL);\n      if (element) {\n        await element.loaded;\n        return await this.extractForeignFrameElement(element)\n      }\n    } catch (error) {\n      console.error(error);\n      return new FrameElement()\n    }\n\n    return null\n  }\n\n  #formActionIsVisitable(form, submitter) {\n    const action = getAction$1(form, submitter);\n\n    return locationIsVisitable(expandURL(action), this.rootLocation)\n  }\n\n  #shouldInterceptNavigation(element, submitter) {\n    const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n\n    if (element instanceof HTMLFormElement && !this.#formActionIsVisitable(element, submitter)) {\n      return false\n    }\n\n    if (!this.enabled || id == \"_top\") {\n      return false\n    }\n\n    if (id) {\n      const frameElement = this.#getFrameElementById(id);\n      if (frameElement) {\n        return !frameElement.disabled\n      } else if (id == \"_parent\") {\n        return false\n      }\n    }\n\n    if (!session.elementIsNavigatable(element)) {\n      return false\n    }\n\n    if (submitter && !session.elementIsNavigatable(submitter)) {\n      return false\n    }\n\n    return true\n  }\n\n  // Computed properties\n\n  get id() {\n    return this.element.id\n  }\n\n  get disabled() {\n    return this.element.disabled\n  }\n\n  get enabled() {\n    return !this.disabled\n  }\n\n  get sourceURL() {\n    if (this.element.src) {\n      return this.element.src\n    }\n  }\n\n  set sourceURL(sourceURL) {\n    this.#ignoringChangesToAttribute(\"src\", () => {\n      this.element.src = sourceURL ?? null;\n    });\n  }\n\n  get loadingStyle() {\n    return this.element.loading\n  }\n\n  get isLoading() {\n    return this.formSubmission !== undefined || this.#resolveVisitPromise() !== undefined\n  }\n\n  get complete() {\n    return this.element.hasAttribute(\"complete\")\n  }\n\n  set complete(value) {\n    if (value) {\n      this.element.setAttribute(\"complete\", \"\");\n    } else {\n      this.element.removeAttribute(\"complete\");\n    }\n  }\n\n  get isActive() {\n    return this.element.isActive && this.#connected\n  }\n\n  get rootLocation() {\n    const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n    const root = meta?.content ?? \"/\";\n    return expandURL(root)\n  }\n\n  #isIgnoringChangesTo(attributeName) {\n    return this.#ignoredAttributes.has(attributeName)\n  }\n\n  #ignoringChangesToAttribute(attributeName, callback) {\n    this.#ignoredAttributes.add(attributeName);\n    callback();\n    this.#ignoredAttributes.delete(attributeName);\n  }\n\n  #withCurrentNavigationElement(element, callback) {\n    this.currentNavigationElement = element;\n    callback();\n    delete this.currentNavigationElement;\n  }\n\n  #getFrameElementById(id) {\n    if (id != null) {\n      const element = id === \"_parent\" ?\n        this.element.parentElement.closest(\"turbo-frame\") :\n        document.getElementById(id);\n      if (element instanceof FrameElement) {\n        return element\n      }\n    }\n  }\n}\n\nfunction activateElement(element, currentURL) {\n  if (element) {\n    const src = element.getAttribute(\"src\");\n    if (src != null && currentURL != null && urlsAreEqual(src, currentURL)) {\n      throw new Error(`Matching <turbo-frame id=\"${element.id}\"> element has a source URL which references itself`)\n    }\n    if (element.ownerDocument !== document) {\n      element = document.importNode(element, true);\n    }\n\n    if (element instanceof FrameElement) {\n      element.connectedCallback();\n      element.disconnectedCallback();\n      return element\n    }\n  }\n}\n\nconst StreamActions = {\n  after() {\n    this.removeDuplicateTargetSiblings();\n    this.targetElements.forEach((e) => e.parentElement?.insertBefore(this.templateContent, e.nextSibling));\n  },\n\n  append() {\n    this.removeDuplicateTargetChildren();\n    this.targetElements.forEach((e) => e.append(this.templateContent));\n  },\n\n  before() {\n    this.removeDuplicateTargetSiblings();\n    this.targetElements.forEach((e) => e.parentElement?.insertBefore(this.templateContent, e));\n  },\n\n  prepend() {\n    this.removeDuplicateTargetChildren();\n    this.targetElements.forEach((e) => e.prepend(this.templateContent));\n  },\n\n  remove() {\n    this.targetElements.forEach((e) => e.remove());\n  },\n\n  replace() {\n    const method = this.getAttribute(\"method\");\n\n    this.targetElements.forEach((targetElement) => {\n      if (method === \"morph\") {\n        morphElements(targetElement, this.templateContent);\n      } else {\n        targetElement.replaceWith(this.templateContent);\n      }\n    });\n  },\n\n  update() {\n    const method = this.getAttribute(\"method\");\n\n    this.targetElements.forEach((targetElement) => {\n      if (method === \"morph\") {\n        morphChildren(targetElement, this.templateContent);\n      } else {\n        targetElement.innerHTML = \"\";\n        targetElement.append(this.templateContent);\n      }\n    });\n  },\n\n  refresh() {\n    const method = this.getAttribute(\"method\");\n    const requestId = this.requestId;\n    const scroll = this.getAttribute(\"scroll\");\n\n    session.refresh(this.baseURI, { method, requestId, scroll });\n  }\n};\n\n// <turbo-stream action=replace target=id><template>...\n\n/**\n * Renders updates to the page from a stream of messages.\n *\n * Using the `action` attribute, this can be configured one of eight ways:\n *\n * - `after` - inserts the result after the target\n * - `append` - appends the result to the target\n * - `before` - inserts the result before the target\n * - `prepend` - prepends the result to the target\n * - `refresh` - initiates a page refresh\n * - `remove` - removes the target\n * - `replace` - replaces the outer HTML of the target\n * - `update` - replaces the inner HTML of the target\n *\n * @customElement turbo-stream\n * @example\n *   <turbo-stream action=\"append\" target=\"dom_id\">\n *     <template>\n *       Content to append to target designated with the dom_id.\n *     </template>\n *   </turbo-stream>\n */\nclass StreamElement extends HTMLElement {\n  static async renderElement(newElement) {\n    await newElement.performAction();\n  }\n\n  async connectedCallback() {\n    try {\n      await this.render();\n    } catch (error) {\n      console.error(error);\n    } finally {\n      this.disconnect();\n    }\n  }\n\n  async render() {\n    return (this.renderPromise ??= (async () => {\n      const event = this.beforeRenderEvent;\n\n      if (this.dispatchEvent(event)) {\n        await nextRepaint();\n        await event.detail.render(this);\n      }\n    })())\n  }\n\n  disconnect() {\n    try {\n      this.remove();\n      // eslint-disable-next-line no-empty\n    } catch {}\n  }\n\n  /**\n   * Removes duplicate children (by ID)\n   */\n  removeDuplicateTargetChildren() {\n    this.duplicateChildren.forEach((c) => c.remove());\n  }\n\n  /**\n   * Gets the list of duplicate children (i.e. those with the same ID)\n   */\n  get duplicateChildren() {\n    const existingChildren = this.targetElements.flatMap((e) => [...e.children]).filter((c) => !!c.getAttribute(\"id\"));\n    const newChildrenIds = [...(this.templateContent?.children || [])].filter((c) => !!c.getAttribute(\"id\")).map((c) => c.getAttribute(\"id\"));\n\n    return existingChildren.filter((c) => newChildrenIds.includes(c.getAttribute(\"id\")))\n  }\n\n  /**\n  * Removes duplicate siblings (by ID)\n  */\n  removeDuplicateTargetSiblings() {\n    this.duplicateSiblings.forEach((c) => c.remove());\n  }\n\n  /**\n  * Gets the list of duplicate siblings (i.e. those with the same ID)\n  */\n  get duplicateSiblings() {\n    const existingChildren = this.targetElements.flatMap((e) => [...e.parentElement.children]).filter((c) => !!c.id);\n    const newChildrenIds = [...(this.templateContent?.children || [])].filter((c) => !!c.id).map((c) => c.id);\n\n    return existingChildren.filter((c) => newChildrenIds.includes(c.id))\n  }\n\n  /**\n   * Gets the action function to be performed.\n   */\n  get performAction() {\n    if (this.action) {\n      const actionFunction = StreamActions[this.action];\n      if (actionFunction) {\n        return actionFunction\n      }\n      this.#raise(\"unknown action\");\n    }\n    this.#raise(\"action attribute is missing\");\n  }\n\n  /**\n   * Gets the target elements which the template will be rendered to.\n   */\n  get targetElements() {\n    if (this.target) {\n      return this.targetElementsById\n    } else if (this.targets) {\n      return this.targetElementsByQuery\n    } else {\n      this.#raise(\"target or targets attribute is missing\");\n    }\n  }\n\n  /**\n   * Gets the contents of the main `<template>`.\n   */\n  get templateContent() {\n    return this.templateElement.content.cloneNode(true)\n  }\n\n  /**\n   * Gets the main `<template>` used for rendering\n   */\n  get templateElement() {\n    if (this.firstElementChild === null) {\n      const template = this.ownerDocument.createElement(\"template\");\n      this.appendChild(template);\n      return template\n    } else if (this.firstElementChild instanceof HTMLTemplateElement) {\n      return this.firstElementChild\n    }\n    this.#raise(\"first child element must be a <template> element\");\n  }\n\n  /**\n   * Gets the current action.\n   */\n  get action() {\n    return this.getAttribute(\"action\")\n  }\n\n  /**\n   * Gets the current target (an element ID) to which the result will\n   * be rendered.\n   */\n  get target() {\n    return this.getAttribute(\"target\")\n  }\n\n  /**\n   * Gets the current \"targets\" selector (a CSS selector)\n   */\n  get targets() {\n    return this.getAttribute(\"targets\")\n  }\n\n  /**\n   * Reads the request-id attribute\n   */\n  get requestId() {\n    return this.getAttribute(\"request-id\")\n  }\n\n  #raise(message) {\n    throw new Error(`${this.description}: ${message}`)\n  }\n\n  get description() {\n    return (this.outerHTML.match(/<[^>]+>/) ?? [])[0] ?? \"<turbo-stream>\"\n  }\n\n  get beforeRenderEvent() {\n    return new CustomEvent(\"turbo:before-stream-render\", {\n      bubbles: true,\n      cancelable: true,\n      detail: { newStream: this, render: StreamElement.renderElement }\n    })\n  }\n\n  get targetElementsById() {\n    const element = this.ownerDocument?.getElementById(this.target);\n\n    if (element !== null) {\n      return [element]\n    } else {\n      return []\n    }\n  }\n\n  get targetElementsByQuery() {\n    const elements = this.ownerDocument?.querySelectorAll(this.targets);\n\n    if (elements.length !== 0) {\n      return Array.prototype.slice.call(elements)\n    } else {\n      return []\n    }\n  }\n}\n\nclass StreamSourceElement extends HTMLElement {\n  streamSource = null\n\n  connectedCallback() {\n    this.streamSource = this.src.match(/^ws{1,2}:/) ? new WebSocket(this.src) : new EventSource(this.src);\n\n    connectStreamSource(this.streamSource);\n  }\n\n  disconnectedCallback() {\n    if (this.streamSource) {\n      this.streamSource.close();\n\n      disconnectStreamSource(this.streamSource);\n    }\n  }\n\n  get src() {\n    return this.getAttribute(\"src\") || \"\"\n  }\n}\n\nFrameElement.delegateConstructor = FrameController;\n\nif (customElements.get(\"turbo-frame\") === undefined) {\n  customElements.define(\"turbo-frame\", FrameElement);\n}\n\nif (customElements.get(\"turbo-stream\") === undefined) {\n  customElements.define(\"turbo-stream\", StreamElement);\n}\n\nif (customElements.get(\"turbo-stream-source\") === undefined) {\n  customElements.define(\"turbo-stream-source\", StreamSourceElement);\n}\n\n(() => {\n  const scriptElement = document.currentScript;\n  if (!scriptElement) return\n  if (scriptElement.hasAttribute(\"data-turbo-suppress-warning\")) return\n\n  let element = scriptElement.parentElement;\n  while (element) {\n    if (element == document.body) {\n      return console.warn(\n        unindent`\n        You are loading Turbo from a <script> element inside the <body> element. This is probably not what you meant to do!\n\n        Load your application\u2019s JavaScript bundle inside the <head> element instead. <script> elements in <body> are evaluated with each page change.\n\n        For more information, see: https://turbo.hotwired.dev/handbook/building#working-with-script-elements\n\n        \u2014\u2014\n        Suppress this warning by adding a \"data-turbo-suppress-warning\" attribute to: %s\n      `,\n        scriptElement.outerHTML\n      )\n    }\n\n    element = element.parentElement;\n  }\n})();\n\nwindow.Turbo = { ...Turbo, StreamActions };\nstart();\n\nexport { FetchEnctype, FetchMethod, FetchRequest, FetchResponse, FrameElement, FrameLoadingStyle, FrameRenderer, PageRenderer, PageSnapshot, StreamActions, StreamElement, StreamSourceElement, cache, config, connectStreamSource, disconnectStreamSource, fetchWithTurboHeaders as fetch, fetchEnctypeFromString, fetchMethodFromString, isSafe, morphBodyElements, morphChildren, morphElements, morphTurboFrameElements, sessionNavigator as navigator, registerAdapter, renderStreamMessage, session, setConfirmMethod, setFormMode, setProgressBarDelay, start, visit };\n", "let consumer\n\nexport async function getConsumer() {\n  return consumer || setConsumer(createConsumer().then(setConsumer))\n}\n\nexport function setConsumer(newConsumer) {\n  return consumer = newConsumer\n}\n\nexport async function createConsumer() {\n  const { createConsumer } = await import(/* webpackChunkName: \"actioncable\" */ \"@rails/actioncable/src\")\n  return createConsumer()\n}\n\nexport async function subscribeTo(channel, mixin) {\n  const { subscriptions } = await getConsumer()\n  return subscriptions.create(channel, mixin)\n}\n", "// Based on https://github.com/nathan7/snakeize\n//\n// This software is released under the MIT license:\n// Permission is hereby granted, free of charge, to any person obtaining a copy of\n// this software and associated documentation files (the \"Software\"), to deal in\n// the Software without restriction, including without limitation the rights to\n// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n// the Software, and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\nexport default function walk (obj) {\n    if (!obj || typeof obj !== 'object') return obj;\n    if (obj instanceof Date || obj instanceof RegExp) return obj;\n    if (Array.isArray(obj)) return obj.map(walk);\n    return Object.keys(obj).reduce(function (acc, key) {\n        var camel = key[0].toLowerCase() + key.slice(1).replace(/([A-Z]+)/g, function (m, x) {\n            return '_' + x.toLowerCase();\n        });\n        acc[camel] = walk(obj[key]);\n        return acc;\n    }, {});\n};", "import { connectStreamSource, disconnectStreamSource } from \"@hotwired/turbo\"\nimport { subscribeTo } from \"./cable\"\nimport snakeize from \"./snakeize\"\n\nclass TurboCableStreamSourceElement extends HTMLElement {\n  static observedAttributes = [\"channel\", \"signed-stream-name\"]\n\n  async connectedCallback() {\n    connectStreamSource(this)\n    this.subscription = await subscribeTo(this.channel, {\n      received: this.dispatchMessageEvent.bind(this),\n      connected: this.subscriptionConnected.bind(this),\n      disconnected: this.subscriptionDisconnected.bind(this)\n    })\n  }\n\n  disconnectedCallback() {\n    disconnectStreamSource(this)\n    if (this.subscription) this.subscription.unsubscribe()\n    this.subscriptionDisconnected()\n  }\n\n  attributeChangedCallback() {\n    if (this.subscription) {\n      this.disconnectedCallback()\n      this.connectedCallback()\n    }\n  }\n\n  dispatchMessageEvent(data) {\n    const event = new MessageEvent(\"message\", { data })\n    return this.dispatchEvent(event)\n  }\n\n  subscriptionConnected() {\n    this.setAttribute(\"connected\", \"\")\n  }\n\n  subscriptionDisconnected() {\n    this.removeAttribute(\"connected\")\n  }\n\n  get channel() {\n    const channel = this.getAttribute(\"channel\")\n    const signed_stream_name = this.getAttribute(\"signed-stream-name\")\n    return { channel, signed_stream_name, ...snakeize({ ...this.dataset }) }\n  }\n}\n\n\nif (customElements.get(\"turbo-cable-stream-source\") === undefined) {\n  customElements.define(\"turbo-cable-stream-source\", TurboCableStreamSourceElement)\n}\n", "export function encodeMethodIntoRequestBody(event) {\n  if (event.target instanceof HTMLFormElement) {\n    const { target: form, detail: { fetchOptions } } = event\n\n    form.addEventListener(\"turbo:submit-start\", ({ detail: { formSubmission: { submitter } } }) => {\n      const body = isBodyInit(fetchOptions.body) ? fetchOptions.body : new URLSearchParams()\n      const method = determineFetchMethod(submitter, body, form)\n\n      if (!/get/i.test(method)) {\n        if (/post/i.test(method)) {\n          body.delete(\"_method\")\n        } else {\n          body.set(\"_method\", method)\n        }\n\n        fetchOptions.method = \"post\"\n      }\n    }, { once: true })\n  }\n}\n\nfunction determineFetchMethod(submitter, body, form) {\n  const formMethod = determineFormMethod(submitter)\n  const overrideMethod = body.get(\"_method\")\n  const method = form.getAttribute(\"method\") || \"get\"\n\n  if (typeof formMethod == \"string\") {\n    return formMethod\n  } else if (typeof overrideMethod == \"string\") {\n    return overrideMethod\n  } else {\n    return method\n  }\n}\n\nfunction determineFormMethod(submitter) {\n  if (submitter instanceof HTMLButtonElement || submitter instanceof HTMLInputElement) {\n    // Rails 7 ActionView::Helpers::FormBuilder#button method has an override\n    // for formmethod if the button does not have name or value attributes\n    // set, which is the default. This means that if you use <%= f.button\n    // formmethod: :delete %>, it will generate a <button name=\"_method\"\n    // value=\"delete\" formmethod=\"post\">. Therefore, if the submitter's name\n    // is already _method, it's value attribute already contains the desired\n    // method.\n    if (submitter.name === '_method') {\n      return submitter.value\n    } else if (submitter.hasAttribute(\"formmethod\")) {\n      return submitter.formMethod\n    } else {\n      return null\n    }\n  } else {\n    return null\n  }\n}\n\nfunction isBodyInit(body) {\n  return body instanceof FormData || body instanceof URLSearchParams\n}\n", "import \"./cable_stream_source_element\"\n\nimport * as Turbo from \"@hotwired/turbo\"\nexport { Turbo }\n\nimport * as cable from \"./cable\"\nexport { cable }\n\nimport { encodeMethodIntoRequestBody } from \"./fetch_requests\"\n\nwindow.Turbo = Turbo\n\naddEventListener(\"turbo:before-fetch-request\", encodeMethodIntoRequestBody)\n", "export const attachmentSelector = \"[data-trix-attachment]\"\n\nconst attachments = {\n  preview: {\n    presentation: \"gallery\",\n    caption: {\n      name: true,\n      size: true,\n    },\n  },\n  file: {\n    caption: {\n      size: true,\n    },\n  },\n}\nexport default attachments\n", "const attributes = {\n  default: {\n    tagName: \"div\",\n    parse: false,\n  },\n  quote: {\n    tagName: \"blockquote\",\n    nestable: true,\n  },\n  heading1: {\n    tagName: \"h1\",\n    terminal: true,\n    breakOnReturn: true,\n    group: false,\n  },\n  code: {\n    tagName: \"pre\",\n    terminal: true,\n    htmlAttributes: [ \"language\" ],\n    text: {\n      plaintext: true,\n    },\n  },\n  bulletList: {\n    tagName: \"ul\",\n    parse: false,\n  },\n  bullet: {\n    tagName: \"li\",\n    listAttribute: \"bulletList\",\n    group: false,\n    nestable: true,\n    test(element) {\n      return tagName(element.parentNode) === attributes[this.listAttribute].tagName\n    },\n  },\n  numberList: {\n    tagName: \"ol\",\n    parse: false,\n  },\n  number: {\n    tagName: \"li\",\n    listAttribute: \"numberList\",\n    group: false,\n    nestable: true,\n    test(element) {\n      return tagName(element.parentNode) === attributes[this.listAttribute].tagName\n    },\n  },\n  attachmentGallery: {\n    tagName: \"div\",\n    exclusive: true,\n    terminal: true,\n    parse: false,\n    group: false,\n  },\n}\n\nconst tagName = (element) => element?.tagName?.toLowerCase()\n\nexport default attributes\n", "const androidVersionMatch = navigator.userAgent.match(/android\\s([0-9]+.*Chrome)/i)\nconst androidVersion = androidVersionMatch && parseInt(androidVersionMatch[1])\n\nexport default {\n  // Android emits composition events when moving the cursor through existing text\n  // Introduced in Chrome 65: https://bugs.chromium.org/p/chromium/issues/detail?id=764439#c9\n  composesExistingText: /Android.*Chrome/.test(navigator.userAgent),\n\n  // Android 13, especially on Samsung keyboards, emits extra compositionend and beforeinput events\n  // that can make the input handler lose the current selection or enter an infinite input -> render -> input\n  // loop.\n  recentAndroid: androidVersion && androidVersion > 12,\n  samsungAndroid: androidVersion && navigator.userAgent.match(/Android.*SM-/),\n\n  // IE 11 activates resizing handles on editable elements that have \"layout\"\n  forcesObjectResizing: /Trident.*rv:11/.test(navigator.userAgent),\n  // https://www.w3.org/TR/input-events-1/ + https://www.w3.org/TR/input-events-2/\n  supportsInputEvents: typeof InputEvent !== \"undefined\" &&\n    [ \"data\", \"getTargetRanges\", \"inputType\" ].every(prop => prop in InputEvent.prototype),\n}\n", "export default {\n  ADD_ATTR: [ \"language\" ],\n  SAFE_FOR_XML: false,\n  RETURN_DOM: true\n}\n", "export default {\n  attachFiles: \"Attach Files\",\n  bold: \"Bold\",\n  bullets: \"Bullets\",\n  byte: \"Byte\",\n  bytes: \"Bytes\",\n  captionPlaceholder: \"Add a caption…\",\n  code: \"Code\",\n  heading1: \"Heading\",\n  indent: \"Increase Level\",\n  italic: \"Italic\",\n  link: \"Link\",\n  numbers: \"Numbers\",\n  outdent: \"Decrease Level\",\n  quote: \"Quote\",\n  redo: \"Redo\",\n  remove: \"Remove\",\n  strike: \"Strikethrough\",\n  undo: \"Undo\",\n  unlink: \"Unlink\",\n  url: \"URL\",\n  urlPlaceholder: \"Enter a URL…\",\n  GB: \"GB\",\n  KB: \"KB\",\n  MB: \"MB\",\n  PB: \"PB\",\n  TB: \"TB\",\n}\n", "/* eslint-disable\n    no-case-declarations,\n*/\nimport lang from \"trix/config/lang\"\n\nconst sizes = [ lang.bytes, lang.KB, lang.MB, lang.GB, lang.TB, lang.PB ]\n\nexport default {\n  prefix: \"IEC\",\n  precision: 2,\n\n  formatter(number) {\n    switch (number) {\n      case 0:\n        return `0 ${lang.bytes}`\n      case 1:\n        return `1 ${lang.byte}`\n      default:\n        let base\n\n        if (this.prefix === \"SI\") {\n          base = 1000\n        } else if (this.prefix === \"IEC\") {\n          base = 1024\n        }\n\n        const exp = Math.floor(Math.log(number) / Math.log(base))\n        const humanSize = number / Math.pow(base, exp)\n        const string = humanSize.toFixed(this.precision)\n        const withoutInsignificantZeros = string.replace(/0*$/, \"\").replace(/\\.$/, \"\")\n        return `${withoutInsignificantZeros} ${sizes[exp]}`\n    }\n  },\n}\n", "export const ZERO_WIDTH_SPACE = \"\\uFEFF\"\nexport const NON_BREAKING_SPACE = \"\\u00A0\"\nexport const OBJECT_REPLACEMENT_CHARACTER = \"\\uFFFC\"\n", "export const extend = function(properties) {\n  for (const key in properties) {\n    const value = properties[key]\n    this[key] = value\n  }\n  return this\n}\n", "import blockAttributes from \"trix/config/block_attributes\"\nimport { ZERO_WIDTH_SPACE } from \"trix/constants\"\nimport { extend } from \"./extend\"\nimport { attachmentSelector } from \"trix/config/attachments\"\n\nconst html = document.documentElement\nconst match = html.matches\n\nexport const handleEvent = function(eventName, { onElement, matchingSelector, withCallback, inPhase, preventDefault, times } = {}) {\n  const element = onElement ? onElement : html\n  const selector = matchingSelector\n  const useCapture = inPhase === \"capturing\"\n\n  const handler = function(event) {\n    if (times != null && --times === 0) {\n      handler.destroy()\n    }\n    const target = findClosestElementFromNode(event.target, { matchingSelector: selector })\n    if (target != null) {\n      withCallback?.call(target, event, target)\n      if (preventDefault) {\n        event.preventDefault()\n      }\n    }\n  }\n\n  handler.destroy = () => element.removeEventListener(eventName, handler, useCapture)\n\n  element.addEventListener(eventName, handler, useCapture)\n  return handler\n}\n\nexport const handleEventOnce = function(eventName, options = {}) {\n  options.times = 1\n  return handleEvent(eventName, options)\n}\n\nexport const createEvent = function(eventName, { bubbles, cancelable, attributes } = {}) {\n  bubbles = bubbles !== false\n  cancelable = cancelable !== false\n\n  const event = document.createEvent(\"Events\")\n  event.initEvent(eventName, bubbles, cancelable)\n  if (attributes != null) {\n    extend.call(event, attributes)\n  }\n  return event\n}\n\nexport const triggerEvent = function(eventName, { onElement, bubbles, cancelable, attributes } = {}) {\n  const element = onElement != null ? onElement : html\n  const event = createEvent(eventName, { bubbles, cancelable, attributes })\n  return element.dispatchEvent(event)\n}\n\nexport const elementMatchesSelector = function(element, selector) {\n  if (element?.nodeType === 1) {\n    return match.call(element, selector)\n  }\n}\n\nexport const findClosestElementFromNode = function(node, { matchingSelector, untilNode } = {}) {\n  while (node && node.nodeType !== Node.ELEMENT_NODE) {\n    node = node.parentNode\n  }\n  if (node == null) {\n    return\n  }\n\n  if (matchingSelector != null) {\n    if (node.closest && untilNode == null) {\n      return node.closest(matchingSelector)\n    } else {\n      while (node && node !== untilNode) {\n        if (elementMatchesSelector(node, matchingSelector)) {\n          return node\n        }\n        node = node.parentNode\n      }\n    }\n  } else {\n    return node\n  }\n}\n\nexport const findInnerElement = function(element) {\n  while (element?.firstElementChild) {\n    element = element.firstElementChild\n  }\n  return element\n}\n\nexport const innerElementIsActive = (element) =>\n  document.activeElement !== element && elementContainsNode(element, document.activeElement)\n\nexport const elementContainsNode = function(element, node) {\n  if (!element || !node) {\n    return\n  }\n  while (node) {\n    if (node === element) {\n      return true\n    }\n    node = node.parentNode\n  }\n}\n\nexport const findNodeFromContainerAndOffset = function(container, offset) {\n  if (!container) {\n    return\n  }\n  if (container.nodeType === Node.TEXT_NODE) {\n    return container\n  } else if (offset === 0) {\n    return container.firstChild != null ? container.firstChild : container\n  } else {\n    return container.childNodes.item(offset - 1)\n  }\n}\n\nexport const findElementFromContainerAndOffset = function(container, offset) {\n  const node = findNodeFromContainerAndOffset(container, offset)\n  return findClosestElementFromNode(node)\n}\n\nexport const findChildIndexOfNode = function(node) {\n  if (!node?.parentNode) {\n    return\n  }\n  let childIndex = 0\n  node = node.previousSibling\n  while (node) {\n    childIndex++\n    node = node.previousSibling\n  }\n  return childIndex\n}\n\nexport const removeNode = (node) => node?.parentNode?.removeChild(node)\n\nexport const walkTree = function(tree, { onlyNodesOfType, usingFilter, expandEntityReferences } = {}) {\n  const whatToShow = (() => {\n    switch (onlyNodesOfType) {\n      case \"element\":\n        return NodeFilter.SHOW_ELEMENT\n      case \"text\":\n        return NodeFilter.SHOW_TEXT\n      case \"comment\":\n        return NodeFilter.SHOW_COMMENT\n      default:\n        return NodeFilter.SHOW_ALL\n    }\n  })()\n\n  return document.createTreeWalker(\n    tree,\n    whatToShow,\n    usingFilter != null ? usingFilter : null,\n    expandEntityReferences === true\n  )\n}\n\nexport const tagName = (element) => element?.tagName?.toLowerCase()\n\nexport const makeElement = function(tag, options = {}) {\n  let key, value\n  if (typeof tag === \"object\") {\n    options = tag\n    tag = options.tagName\n  } else {\n    options = { attributes: options }\n  }\n\n  const element = document.createElement(tag)\n\n  if (options.editable != null) {\n    if (options.attributes == null) {\n      options.attributes = {}\n    }\n    options.attributes.contenteditable = options.editable\n  }\n\n  if (options.attributes) {\n    for (key in options.attributes) {\n      value = options.attributes[key]\n      element.setAttribute(key, value)\n    }\n  }\n\n  if (options.style) {\n    for (key in options.style) {\n      value = options.style[key]\n      element.style[key] = value\n    }\n  }\n\n  if (options.data) {\n    for (key in options.data) {\n      value = options.data[key]\n      element.dataset[key] = value\n    }\n  }\n\n  if (options.className) {\n    options.className.split(\" \").forEach((className) => {\n      element.classList.add(className)\n    })\n  }\n\n  if (options.textContent) {\n    element.textContent = options.textContent\n  }\n\n  if (options.childNodes) {\n    [].concat(options.childNodes).forEach((childNode) => {\n      element.appendChild(childNode)\n    })\n  }\n\n  return element\n}\n\nlet blockTagNames = undefined\n\nexport const getBlockTagNames = function() {\n  if (blockTagNames != null) {\n    return blockTagNames\n  }\n\n  blockTagNames = []\n  for (const key in blockAttributes) {\n    const attributes = blockAttributes[key]\n    if (attributes.tagName) {\n      blockTagNames.push(attributes.tagName)\n    }\n  }\n\n  return blockTagNames\n}\n\nexport const nodeIsBlockContainer = (node) => nodeIsBlockStartComment(node?.firstChild)\n\nexport const nodeProbablyIsBlockContainer = function(node) {\n  return getBlockTagNames().includes(tagName(node)) && !getBlockTagNames().includes(tagName(node.firstChild))\n}\n\nexport const nodeIsBlockStart = function(node, { strict } = { strict: true }) {\n  if (strict) {\n    return nodeIsBlockStartComment(node)\n  } else {\n    return (\n      nodeIsBlockStartComment(node) || !nodeIsBlockStartComment(node.firstChild) && nodeProbablyIsBlockContainer(node)\n    )\n  }\n}\n\nexport const nodeIsBlockStartComment = (node) => nodeIsCommentNode(node) && node?.data === \"block\"\n\nexport const nodeIsCommentNode = (node) => node?.nodeType === Node.COMMENT_NODE\n\nexport const nodeIsCursorTarget = function(node, { name } = {}) {\n  if (!node) {\n    return\n  }\n  if (nodeIsTextNode(node)) {\n    if (node.data === ZERO_WIDTH_SPACE) {\n      if (name) {\n        return node.parentNode.dataset.trixCursorTarget === name\n      } else {\n        return true\n      }\n    }\n  } else {\n    return nodeIsCursorTarget(node.firstChild)\n  }\n}\n\nexport const nodeIsAttachmentElement = (node) => elementMatchesSelector(node, attachmentSelector)\n\nexport const nodeIsEmptyTextNode = (node) => nodeIsTextNode(node) && node?.data === \"\"\n\nexport const nodeIsTextNode = (node) => node?.nodeType === Node.TEXT_NODE\n", "import browser from \"trix/config/browser\"\nimport { makeElement, removeNode } from \"trix/core/helpers/dom\"\n\nconst input = {\n  level2Enabled: true,\n\n  getLevel() {\n    if (this.level2Enabled && browser.supportsInputEvents) {\n      return 2\n    } else {\n      return 0\n    }\n  },\n  pickFiles(callback) {\n    const input = makeElement(\"input\", { type: \"file\", multiple: true, hidden: true, id: this.fileInputId })\n\n    input.addEventListener(\"change\", () => {\n      callback(input.files)\n      removeNode(input)\n    })\n\n    removeNode(document.getElementById(this.fileInputId))\n    document.body.appendChild(input)\n    input.click()\n  }\n}\n\nexport default input\n", "export default {\n  8: \"backspace\",\n  9: \"tab\",\n  13: \"return\",\n  27: \"escape\",\n  37: \"left\",\n  39: \"right\",\n  46: \"delete\",\n  68: \"d\",\n  72: \"h\",\n  79: \"o\",\n}\n", "export default {\n  removeBlankTableCells: false,\n  tableCellSeparator: \" | \",\n  tableRowSeparator: \"\\n\",\n}\n", "import { attachmentSelector } from \"trix/config/attachments\"\n\nexport default {\n  bold: {\n    tagName: \"strong\",\n    inheritable: true,\n    parser(element) {\n      const style = window.getComputedStyle(element)\n      return style.fontWeight === \"bold\" || style.fontWeight >= 600\n    },\n  },\n  italic: {\n    tagName: \"em\",\n    inheritable: true,\n    parser(element) {\n      const style = window.getComputedStyle(element)\n      return style.fontStyle === \"italic\"\n    },\n  },\n  href: {\n    groupTagName: \"a\",\n    parser(element) {\n      const matchingSelector = `a:not(${attachmentSelector})`\n      const link = element.closest(matchingSelector)\n      if (link) {\n        return link.getAttribute(\"href\")\n      }\n    },\n  },\n  strike: {\n    tagName: \"del\",\n    inheritable: true,\n  },\n  frozen: {\n    style: { backgroundColor: \"highlight\" },\n  },\n}\n", "import lang from \"trix/config/lang\"\n\nexport default {\n  getDefaultHTML() {\n    return `<div class=\"trix-button-row\">\n      <span class=\"trix-button-group trix-button-group--text-tools\" data-trix-button-group=\"text-tools\">\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-bold\" data-trix-attribute=\"bold\" data-trix-key=\"b\" title=\"${lang.bold}\" tabindex=\"-1\">${lang.bold}</button>\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-italic\" data-trix-attribute=\"italic\" data-trix-key=\"i\" title=\"${lang.italic}\" tabindex=\"-1\">${lang.italic}</button>\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-strike\" data-trix-attribute=\"strike\" title=\"${lang.strike}\" tabindex=\"-1\">${lang.strike}</button>\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-link\" data-trix-attribute=\"href\" data-trix-action=\"link\" data-trix-key=\"k\" title=\"${lang.link}\" tabindex=\"-1\">${lang.link}</button>\n      </span>\n\n      <span class=\"trix-button-group trix-button-group--block-tools\" data-trix-button-group=\"block-tools\">\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-heading-1\" data-trix-attribute=\"heading1\" title=\"${lang.heading1}\" tabindex=\"-1\">${lang.heading1}</button>\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-quote\" data-trix-attribute=\"quote\" title=\"${lang.quote}\" tabindex=\"-1\">${lang.quote}</button>\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-code\" data-trix-attribute=\"code\" title=\"${lang.code}\" tabindex=\"-1\">${lang.code}</button>\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-bullet-list\" data-trix-attribute=\"bullet\" title=\"${lang.bullets}\" tabindex=\"-1\">${lang.bullets}</button>\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-number-list\" data-trix-attribute=\"number\" title=\"${lang.numbers}\" tabindex=\"-1\">${lang.numbers}</button>\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-decrease-nesting-level\" data-trix-action=\"decreaseNestingLevel\" title=\"${lang.outdent}\" tabindex=\"-1\">${lang.outdent}</button>\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-increase-nesting-level\" data-trix-action=\"increaseNestingLevel\" title=\"${lang.indent}\" tabindex=\"-1\">${lang.indent}</button>\n      </span>\n\n      <span class=\"trix-button-group trix-button-group--file-tools\" data-trix-button-group=\"file-tools\">\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-attach\" data-trix-action=\"attachFiles\" title=\"${lang.attachFiles}\" tabindex=\"-1\">${lang.attachFiles}</button>\n      </span>\n\n      <span class=\"trix-button-group-spacer\"></span>\n\n      <span class=\"trix-button-group trix-button-group--history-tools\" data-trix-button-group=\"history-tools\">\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-undo\" data-trix-action=\"undo\" data-trix-key=\"z\" title=\"${lang.undo}\" tabindex=\"-1\">${lang.undo}</button>\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-redo\" data-trix-action=\"redo\" data-trix-key=\"shift+z\" title=\"${lang.redo}\" tabindex=\"-1\">${lang.redo}</button>\n      </span>\n    </div>\n\n    <div class=\"trix-dialogs\" data-trix-dialogs>\n      <div class=\"trix-dialog trix-dialog--link\" data-trix-dialog=\"href\" data-trix-dialog-attribute=\"href\">\n        <div class=\"trix-dialog__link-fields\">\n          <input type=\"url\" name=\"href\" class=\"trix-input trix-input--dialog\" placeholder=\"${lang.urlPlaceholder}\" aria-label=\"${lang.url}\" data-trix-validate-href required data-trix-input>\n          <div class=\"trix-button-group\">\n            <input type=\"button\" class=\"trix-button trix-button--dialog\" value=\"${lang.link}\" data-trix-method=\"setAttribute\">\n            <input type=\"button\" class=\"trix-button trix-button--dialog\" value=\"${lang.unlink}\" data-trix-method=\"removeAttribute\">\n          </div>\n        </div>\n      </div>\n    </div>`\n  },\n}\n", "const undo = { interval: 5000 }\nexport default undo\n", "export default {\n  attachment: \"attachment\",\n  attachmentCaption: \"attachment__caption\",\n  attachmentCaptionEditor: \"attachment__caption-editor\",\n  attachmentMetadata: \"attachment__metadata\",\n  attachmentMetadataContainer: \"attachment__metadata-container\",\n  attachmentName: \"attachment__name\",\n  attachmentProgress: \"attachment__progress\",\n  attachmentSize: \"attachment__size\",\n  attachmentToolbar: \"attachment__toolbar\",\n  attachmentGallery: \"attachment-gallery\",\n}\n", "export default class BasicObject {\n  static proxyMethod(expression) {\n    const { name, toMethod, toProperty, optional } = parseProxyMethodExpression(expression)\n\n    this.prototype[name] = function() {\n      let subject\n      let object\n\n      if (toMethod) {\n        if (optional) {\n          object = this[toMethod]?.()\n        } else {\n          object = this[toMethod]()\n        }\n      } else if (toProperty) {\n        object = this[toProperty]\n      }\n\n      if (optional) {\n        subject = object?.[name]\n        if (subject) {\n          return apply.call(subject, object, arguments)\n        }\n      } else {\n        subject = object[name]\n        return apply.call(subject, object, arguments)\n      }\n    }\n  }\n}\n\nconst parseProxyMethodExpression = function(expression) {\n  const match = expression.match(proxyMethodExpressionPattern)\n  if (!match) {\n    throw new Error(`can't parse @proxyMethod expression: ${expression}`)\n  }\n\n  const args = { name: match[4] }\n\n  if (match[2] != null) {\n    args.toMethod = match[1]\n  } else {\n    args.toProperty = match[1]\n  }\n\n  if (match[3] != null) {\n    args.optional = true\n  }\n\n  return args\n}\n\nconst { apply } = Function.prototype\n\nconst proxyMethodExpressionPattern = new RegExp(\"\\\n^\\\n(.+?)\\\n(\\\\(\\\\))?\\\n(\\\\?)?\\\n\\\\.\\\n(.+?)\\\n$\\\n\")\n", "import BasicObject from \"trix/core/basic_object\"\n\nexport default class UTF16String extends BasicObject {\n  static box(value = \"\") {\n    if (value instanceof this) {\n      return value\n    } else {\n      return this.fromUCS2String(value?.toString())\n    }\n  }\n\n  static fromUCS2String(ucs2String) {\n    return new this(ucs2String, ucs2decode(ucs2String))\n  }\n\n  static fromCodepoints(codepoints) {\n    return new this(ucs2encode(codepoints), codepoints)\n  }\n\n  constructor(ucs2String, codepoints) {\n    super(...arguments)\n    this.ucs2String = ucs2String\n    this.codepoints = codepoints\n    this.length = this.codepoints.length\n    this.ucs2Length = this.ucs2String.length\n  }\n\n  offsetToUCS2Offset(offset) {\n    return ucs2encode(this.codepoints.slice(0, Math.max(0, offset))).length\n  }\n\n  offsetFromUCS2Offset(ucs2Offset) {\n    return ucs2decode(this.ucs2String.slice(0, Math.max(0, ucs2Offset))).length\n  }\n\n  slice() {\n    return this.constructor.fromCodepoints(this.codepoints.slice(...arguments))\n  }\n\n  charAt(offset) {\n    return this.slice(offset, offset + 1)\n  }\n\n  isEqualTo(value) {\n    return this.constructor.box(value).ucs2String === this.ucs2String\n  }\n\n  toJSON() {\n    return this.ucs2String\n  }\n\n  getCacheKey() {\n    return this.ucs2String\n  }\n\n  toString() {\n    return this.ucs2String\n  }\n}\n\nconst hasArrayFrom = Array.from?.(\"\\ud83d\\udc7c\").length === 1\nconst hasStringCodePointAt = \" \".codePointAt?.(0) != null\nconst hasStringFromCodePoint = String.fromCodePoint?.(32, 128124) === \" \\ud83d\\udc7c\"\n\n// UCS-2 conversion helpers ported from Mathias Bynens' Punycode.js:\n// https://github.com/bestiejs/punycode.js#punycodeucs2\n\nlet ucs2decode, ucs2encode\n\n// Creates an array containing the numeric code points of each Unicode\n// character in the string. While JavaScript uses UCS-2 internally,\n// this function will convert a pair of surrogate halves (each of which\n// UCS-2 exposes as separate characters) into a single code point,\n// matching UTF-16.\nif (hasArrayFrom && hasStringCodePointAt) {\n  ucs2decode = (string) => Array.from(string).map((char) => char.codePointAt(0))\n} else {\n  ucs2decode = function(string) {\n    const output = []\n    let counter = 0\n    const { length } = string\n\n    while (counter < length) {\n      let value = string.charCodeAt(counter++)\n      if (0xd800 <= value && value <= 0xdbff && counter < length) {\n        // high surrogate, and there is a next character\n        const extra = string.charCodeAt(counter++)\n        if ((extra & 0xfc00) === 0xdc00) {\n          // low surrogate\n          value = ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000\n        } else {\n          // unmatched surrogate; only append this code unit, in case the\n          // next code unit is the high surrogate of a surrogate pair\n          counter--\n        }\n      }\n      output.push(value)\n    }\n\n    return output\n  }\n}\n\n// Creates a string based on an array of numeric code points.\nif (hasStringFromCodePoint) {\n  ucs2encode = (array) => String.fromCodePoint(...Array.from(array || []))\n} else {\n  ucs2encode = function(array) {\n    const characters = (() => {\n      const result = []\n\n      Array.from(array).forEach((value) => {\n        let output = \"\"\n        if (value > 0xffff) {\n          value -= 0x10000\n          output += String.fromCharCode(value >>> 10 & 0x3ff | 0xd800)\n          value = 0xdc00 | value & 0x3ff\n        }\n        result.push(output + String.fromCharCode(value))\n      })\n\n      return result\n    })()\n\n    return characters.join(\"\")\n  }\n}\n", "import BasicObject from \"trix/core/basic_object\"\nimport UTF16String from \"trix/core/utilities/utf16_string\"\n\nlet id = 0\n\nexport default class TrixObject extends BasicObject {\n  static fromJSONString(jsonString) {\n    return this.fromJSON(JSON.parse(jsonString))\n  }\n\n  constructor() {\n    super(...arguments)\n    this.id = ++id\n  }\n\n  hasSameConstructorAs(object) {\n    return this.constructor === object?.constructor\n  }\n\n  isEqualTo(object) {\n    return this === object\n  }\n\n  inspect() {\n    const parts = []\n    const contents = this.contentsForInspection() || {}\n\n    for (const key in contents) {\n      const value = contents[key]\n      parts.push(`${key}=${value}`)\n    }\n\n    return `#<${this.constructor.name}:${this.id}${parts.length ? ` ${parts.join(\", \")}` : \"\"}>`\n  }\n\n  contentsForInspection() {}\n\n  toJSONString() {\n    return JSON.stringify(this)\n  }\n\n  toUTF16String() {\n    return UTF16String.box(this)\n  }\n\n  getCacheKey() {\n    return this.id.toString()\n  }\n}\n", "/* eslint-disable\n    id-length,\n*/\nexport const arraysAreEqual = function(a = [], b = []) {\n  if (a.length !== b.length) {\n    return false\n  }\n  for (let index = 0; index < a.length; index++) {\n    const value = a[index]\n    if (value !== b[index]) {\n      return false\n    }\n  }\n  return true\n}\n\nexport const arrayStartsWith = (a = [], b = []) => arraysAreEqual(a.slice(0, b.length), b)\n\nexport const spliceArray = function(array, ...args) {\n  const result = array.slice(0)\n  result.splice(...args)\n  return result\n}\n\nexport const summarizeArrayChange = function(oldArray = [], newArray = []) {\n  const added = []\n  const removed = []\n\n  const existingValues = new Set()\n\n  oldArray.forEach((value) => {\n    existingValues.add(value)\n  })\n\n  const currentValues = new Set()\n\n  newArray.forEach((value) => {\n    currentValues.add(value)\n    if (!existingValues.has(value)) {\n      added.push(value)\n    }\n  })\n\n  oldArray.forEach((value) => {\n    if (!currentValues.has(value)) {\n      removed.push(value)\n    }\n  })\n\n  return { added, removed }\n}\n", "import { makeElement } from \"trix/core/helpers/dom\"\n\n// https://github.com/mathiasbynens/unicode-2.1.8/blob/master/Bidi_Class/Right_To_Left/regex.js\nconst RTL_PATTERN =\n  /[\\u05BE\\u05C0\\u05C3\\u05D0-\\u05EA\\u05F0-\\u05F4\\u061B\\u061F\\u0621-\\u063A\\u0640-\\u064A\\u066D\\u0671-\\u06B7\\u06BA-\\u06BE\\u06C0-\\u06CE\\u06D0-\\u06D5\\u06E5\\u06E6\\u200F\\u202B\\u202E\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE72\\uFE74\\uFE76-\\uFEFC]/\n\nexport const getDirection = (function() {\n  const input = makeElement(\"input\", { dir: \"auto\", name: \"x\", dirName: \"x.dir\" })\n  const textArea = makeElement(\"textarea\", { dir: \"auto\", name: \"y\", dirName: \"y.dir\" })\n  const form = makeElement(\"form\")\n  form.appendChild(input)\n  form.appendChild(textArea)\n\n  const supportsDirName = (function() {\n    try {\n      return new FormData(form).has(textArea.dirName)\n    } catch (error) {\n      return false\n    }\n  })()\n\n  const supportsDirSelector = (function() {\n    try {\n      return input.matches(\":dir(ltr),:dir(rtl)\")\n    } catch (error) {\n      return false\n    }\n  })()\n\n  if (supportsDirName) {\n    return function(string) {\n      textArea.value = string\n      return new FormData(form).get(textArea.dirName)\n    }\n  } else if (supportsDirSelector) {\n    return function(string) {\n      input.value = string\n      if (input.matches(\":dir(rtl)\")) {\n        return \"rtl\"\n      } else {\n        return \"ltr\"\n      }\n    }\n  } else {\n    return function(string) {\n      const char = string.trim().charAt(0)\n      if (RTL_PATTERN.test(char)) {\n        return \"rtl\"\n      } else {\n        return \"ltr\"\n      }\n    }\n  }\n})()\n", "import * as config from \"trix/config\"\n\nlet allAttributeNames = null\nlet blockAttributeNames = null\nlet textAttributeNames = null\nlet listAttributeNames = null\n\nexport const getAllAttributeNames = () => {\n  if (!allAttributeNames) {\n    allAttributeNames = getTextAttributeNames().concat(getBlockAttributeNames())\n  }\n  return allAttributeNames\n}\n\nexport const getBlockConfig = (attributeName) => config.blockAttributes[attributeName]\n\nexport const getBlockAttributeNames = () => {\n  if (!blockAttributeNames) {\n    blockAttributeNames = Object.keys(config.blockAttributes)\n  }\n  return blockAttributeNames\n}\n\nexport const getTextConfig = (attributeName) => config.textAttributes[attributeName]\n\nexport const getTextAttributeNames = () => {\n  if (!textAttributeNames) {\n    textAttributeNames = Object.keys(config.textAttributes)\n  }\n  return textAttributeNames\n}\n\nexport const getListAttributeNames = () => {\n  if (!listAttributeNames) {\n    listAttributeNames = []\n    for (const key in config.blockAttributes) {\n      const { listAttribute } = config.blockAttributes[key]\n      if (listAttribute != null) {\n        listAttributeNames.push(listAttribute)\n      }\n    }\n  }\n  return listAttributeNames\n}\n", "/* eslint-disable\n*/\nexport const installDefaultCSSForTagName = function(tagName, defaultCSS) {\n  const styleElement = insertStyleElementForTagName(tagName)\n  styleElement.textContent = defaultCSS.replace(/%t/g, tagName)\n}\n\nconst insertStyleElementForTagName = function(tagName) {\n  const element = document.createElement(\"style\")\n  element.setAttribute(\"type\", \"text/css\")\n  element.setAttribute(\"data-tag-name\", tagName.toLowerCase())\n  const nonce = getCSPNonce()\n  if (nonce) {\n    element.setAttribute(\"nonce\", nonce)\n  }\n  document.head.insertBefore(element, document.head.firstChild)\n  return element\n}\n\nconst getCSPNonce = function() {\n  const element = getMetaElement(\"trix-csp-nonce\") || getMetaElement(\"csp-nonce\")\n  if (element) {\n    const { nonce, content } = element\n    return nonce == \"\" ? content : nonce\n  }\n}\n\nconst getMetaElement = (name) => document.head.querySelector(`meta[name=${name}]`)\n", "const testTransferData = { \"application/x-trix-feature-detection\": \"test\" }\n\nexport const dataTransferIsPlainText = function(dataTransfer) {\n  const text = dataTransfer.getData(\"text/plain\")\n  const html = dataTransfer.getData(\"text/html\")\n\n  if (text && html) {\n    const { body } = new DOMParser().parseFromString(html, \"text/html\")\n    if (body.textContent === text) {\n      return !body.querySelector(\"*\")\n    }\n  } else {\n    return text?.length\n  }\n}\n\nexport const dataTransferIsMsOfficePaste = ({ dataTransfer }) => {\n  return dataTransfer.types.includes(\"Files\") &&\n    dataTransfer.types.includes(\"text/html\") &&\n    dataTransfer.getData(\"text/html\").includes(\"urn:schemas-microsoft-com:office:office\")\n}\n\nexport const dataTransferIsWritable = function(dataTransfer) {\n  if (!dataTransfer?.setData) return false\n\n  for (const key in testTransferData) {\n    const value = testTransferData[key]\n\n    try {\n      dataTransfer.setData(key, value)\n      if (!dataTransfer.getData(key) === value) return false\n    } catch (error) {\n      return false\n    }\n  }\n  return true\n}\n\nexport const keyEventIsKeyboardCommand = (function() {\n  if (/Mac|^iP/.test(navigator.platform)) {\n    return (event) => event.metaKey\n  } else {\n    return (event) => event.ctrlKey\n  }\n})()\n\nexport function shouldRenderInmmediatelyToDealWithIOSDictation(inputEvent) {\n  if (/iPhone|iPad/.test(navigator.userAgent)) {\n    // Handle garbled content and duplicated newlines when using dictation on iOS 18+. Upon dictation completion, iOS sends\n    // the list of insertText / insertParagraph events in a quick sequence. If we don't render\n    // the editor synchronously, the internal range fails to update and results in garbled content or duplicated newlines.\n    //\n    // This workaround is necessary because iOS doesn't send composing events as expected while dictating:\n    // https://bugs.webkit.org/show_bug.cgi?id=261764\n    return !inputEvent.inputType || inputEvent.inputType === \"insertParagraph\"\n  } else {\n    return false\n  }\n}\n", "export const defer = (fn) => setTimeout(fn, 1)\n", "/* eslint-disable\n    id-length,\n*/\nexport const copyObject = function(object = {}) {\n  const result = {}\n  for (const key in object) {\n    const value = object[key]\n    result[key] = value\n  }\n  return result\n}\n\nexport const objectsAreEqual = function(a = {}, b = {}) {\n  if (Object.keys(a).length !== Object.keys(b).length) {\n    return false\n  }\n  for (const key in a) {\n    const value = a[key]\n    if (value !== b[key]) {\n      return false\n    }\n  }\n  return true\n}\n", "import { copyObject, objectsAreEqual } from \"trix/core/helpers/objects\"\n\nexport const normalizeRange = function(range) {\n  if (range == null) return\n\n  if (!Array.isArray(range)) {\n    range = [ range, range ]\n  }\n  return [ copyValue(range[0]), copyValue(range[1] != null ? range[1] : range[0]) ]\n}\n\nexport const rangeIsCollapsed = function(range) {\n  if (range == null) return\n\n  const [ start, end ] = normalizeRange(range)\n  return rangeValuesAreEqual(start, end)\n}\n\nexport const rangesAreEqual = function(leftRange, rightRange) {\n  if (leftRange == null || rightRange == null) return\n\n  const [ leftStart, leftEnd ] = normalizeRange(leftRange)\n  const [ rightStart, rightEnd ] = normalizeRange(rightRange)\n  return rangeValuesAreEqual(leftStart, rightStart) && rangeValuesAreEqual(leftEnd, rightEnd)\n}\n\nconst copyValue = function(value) {\n  if (typeof value === \"number\") {\n    return value\n  } else {\n    return copyObject(value)\n  }\n}\n\nconst rangeValuesAreEqual = function(left, right) {\n  if (typeof left === \"number\") {\n    return left === right\n  } else {\n    return objectsAreEqual(left, right)\n  }\n}\n", "import BasicObject from \"trix/core/basic_object\"\n\nexport default class SelectionChangeObserver extends BasicObject {\n  constructor() {\n    super(...arguments)\n    this.update = this.update.bind(this)\n    this.selectionManagers = []\n  }\n\n  start() {\n    if (!this.started) {\n      this.started = true\n      document.addEventListener(\"selectionchange\", this.update, true)\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.started = false\n      return document.removeEventListener(\"selectionchange\", this.update, true)\n    }\n  }\n\n  registerSelectionManager(selectionManager) {\n    if (!this.selectionManagers.includes(selectionManager)) {\n      this.selectionManagers.push(selectionManager)\n      return this.start()\n    }\n  }\n\n  unregisterSelectionManager(selectionManager) {\n    this.selectionManagers = this.selectionManagers.filter((sm) => sm !== selectionManager)\n    if (this.selectionManagers.length === 0) {\n      return this.stop()\n    }\n  }\n\n  notifySelectionManagersOfSelectionChange() {\n    return this.selectionManagers.map((selectionManager) => selectionManager.selectionDidChange())\n  }\n\n  update() {\n    this.notifySelectionManagersOfSelectionChange()\n  }\n\n  reset() {\n    this.update()\n  }\n}\n\nexport const selectionChangeObserver = new SelectionChangeObserver()\n\nexport const getDOMSelection = function() {\n  const selection = window.getSelection()\n  if (selection.rangeCount > 0) {\n    return selection\n  }\n}\n\nexport const getDOMRange = function() {\n  const domRange = getDOMSelection()?.getRangeAt(0)\n  if (domRange) {\n    if (!domRangeIsPrivate(domRange)) {\n      return domRange\n    }\n  }\n}\n\nexport const setDOMRange = function(domRange) {\n  const selection = window.getSelection()\n  selection.removeAllRanges()\n  selection.addRange(domRange)\n  return selectionChangeObserver.update()\n}\n\n// In Firefox, clicking certain <input> elements changes the selection to a\n// private element used to draw its UI. Attempting to access properties of those\n// elements throws an error.\n// https://bugzilla.mozilla.org/show_bug.cgi?id=208427\nconst domRangeIsPrivate = (domRange) => nodeIsPrivate(domRange.startContainer) || nodeIsPrivate(domRange.endContainer)\n\nconst nodeIsPrivate = (node) => !Object.getPrototypeOf(node)\n", "/* eslint-disable\n    id-length,\n    no-useless-escape,\n*/\nimport { NON_BREAKING_SPACE, ZERO_WIDTH_SPACE } from \"trix/constants\"\nimport UTF16String from \"trix/core/utilities/utf16_string\"\n\nexport const normalizeSpaces = (string) =>\n  string.replace(new RegExp(`${ZERO_WIDTH_SPACE}`, \"g\"), \"\").replace(new RegExp(`${NON_BREAKING_SPACE}`, \"g\"), \" \")\n\nexport const normalizeNewlines = (string) => string.replace(/\\r\\n?/g, \"\\n\")\n\nexport const breakableWhitespacePattern = new RegExp(`[^\\\\S${NON_BREAKING_SPACE}]`)\n\nexport const squishBreakableWhitespace = (string) =>\n  string\n    // Replace all breakable whitespace characters with a space\n    .replace(new RegExp(`${breakableWhitespacePattern.source}`, \"g\"), \" \")\n    // Replace two or more spaces with a single space\n    .replace(/\\ {2,}/g, \" \")\n\nexport const summarizeStringChange = function(oldString, newString) {\n  let added, removed\n  oldString = UTF16String.box(oldString)\n  newString = UTF16String.box(newString)\n\n  if (newString.length < oldString.length) {\n    [ removed, added ] = utf16StringDifferences(oldString, newString)\n  } else {\n    [ added, removed ] = utf16StringDifferences(newString, oldString)\n  }\n\n  return { added, removed }\n}\n\nconst utf16StringDifferences = function(a, b) {\n  if (a.isEqualTo(b)) {\n    return [ \"\", \"\" ]\n  }\n\n  const diffA = utf16StringDifference(a, b)\n  const { length } = diffA.utf16String\n\n  let diffB\n\n  if (length) {\n    const { offset } = diffA\n    const codepoints = a.codepoints.slice(0, offset).concat(a.codepoints.slice(offset + length))\n    diffB = utf16StringDifference(b, UTF16String.fromCodepoints(codepoints))\n  } else {\n    diffB = utf16StringDifference(b, a)\n  }\n\n  return [ diffA.utf16String.toString(), diffB.utf16String.toString() ]\n}\n\nconst utf16StringDifference = function(a, b) {\n  let leftIndex = 0\n  let rightIndexA = a.length\n  let rightIndexB = b.length\n\n  while (leftIndex < rightIndexA && a.charAt(leftIndex).isEqualTo(b.charAt(leftIndex))) {\n    leftIndex++\n  }\n\n  while (rightIndexA > leftIndex + 1 && a.charAt(rightIndexA - 1).isEqualTo(b.charAt(rightIndexB - 1))) {\n    rightIndexA--\n    rightIndexB--\n  }\n\n  return {\n    utf16String: a.slice(leftIndex, rightIndexA),\n    offset: leftIndex,\n  }\n}\n", "import TrixObject from \"trix/core/object\" // Don't override window.Object\nimport { arraysAreEqual } from \"trix/core/helpers\"\n\nexport default class Hash extends TrixObject {\n  static fromCommonAttributesOfObjects(objects = []) {\n    if (!objects.length) {\n      return new this()\n    }\n    let hash = box(objects[0])\n    let keys = hash.getKeys()\n\n    objects.slice(1).forEach((object) => {\n      keys = hash.getKeysCommonToHash(box(object))\n      hash = hash.slice(keys)\n    })\n\n    return hash\n  }\n\n  static box(values) {\n    return box(values)\n  }\n\n  constructor(values = {}) {\n    super(...arguments)\n    this.values = copy(values)\n  }\n\n  add(key, value) {\n    return this.merge(object(key, value))\n  }\n\n  remove(key) {\n    return new Hash(copy(this.values, key))\n  }\n\n  get(key) {\n    return this.values[key]\n  }\n\n  has(key) {\n    return key in this.values\n  }\n\n  merge(values) {\n    return new Hash(merge(this.values, unbox(values)))\n  }\n\n  slice(keys) {\n    const values = {}\n\n    Array.from(keys).forEach((key) => {\n      if (this.has(key)) {\n        values[key] = this.values[key]\n      }\n    })\n\n    return new Hash(values)\n  }\n\n  getKeys() {\n    return Object.keys(this.values)\n  }\n\n  getKeysCommonToHash(hash) {\n    hash = box(hash)\n    return this.getKeys().filter((key) => this.values[key] === hash.values[key])\n  }\n\n  isEqualTo(values) {\n    return arraysAreEqual(this.toArray(), box(values).toArray())\n  }\n\n  isEmpty() {\n    return this.getKeys().length === 0\n  }\n\n  toArray() {\n    if (!this.array) {\n      const result = []\n      for (const key in this.values) {\n        const value = this.values[key]\n        result.push(result.push(key, value))\n      }\n      this.array = result.slice(0)\n    }\n\n    return this.array\n  }\n\n  toObject() {\n    return copy(this.values)\n  }\n\n  toJSON() {\n    return this.toObject()\n  }\n\n  contentsForInspection() {\n    return { values: JSON.stringify(this.values) }\n  }\n}\n\nconst object = function(key, value) {\n  const result = {}\n  result[key] = value\n  return result\n}\n\nconst merge = function(object, values) {\n  const result = copy(object)\n  for (const key in values) {\n    const value = values[key]\n    result[key] = value\n  }\n  return result\n}\n\nconst copy = function(object, keyToRemove) {\n  const result = {}\n  const sortedKeys = Object.keys(object).sort()\n\n  sortedKeys.forEach((key) => {\n    if (key !== keyToRemove) {\n      result[key] = object[key]\n    }\n  })\n\n  return result\n}\n\nconst box = function(object) {\n  if (object instanceof Hash) {\n    return object\n  } else {\n    return new Hash(object)\n  }\n}\n\nconst unbox = function(object) {\n  if (object instanceof Hash) {\n    return object.values\n  } else {\n    return object\n  }\n}\n", "export default class ObjectGroup {\n  static groupObjects(ungroupedObjects = [], { depth, asTree } = {}) {\n    let group\n    if (asTree) {\n      if (depth == null) {\n        depth = 0\n      }\n    }\n    const objects = []\n\n    Array.from(ungroupedObjects).forEach((object) => {\n      if (group) {\n        if (object.canBeGrouped?.(depth) && group[group.length - 1].canBeGroupedWith?.(object, depth)) {\n          group.push(object)\n          return\n        } else {\n          objects.push(new this(group, { depth, asTree }))\n          group = null\n        }\n      }\n\n      if (object.canBeGrouped?.(depth)) {\n        group = [ object ]\n      } else {\n        objects.push(object)\n      }\n    })\n\n    if (group) {\n      objects.push(new this(group, { depth, asTree }))\n    }\n    return objects\n  }\n\n  constructor(objects = [], { depth, asTree }) {\n    this.objects = objects\n    if (asTree) {\n      this.depth = depth\n      this.objects = this.constructor.groupObjects(this.objects, { asTree, depth: this.depth + 1 })\n    }\n  }\n\n  getObjects() {\n    return this.objects\n  }\n\n  getDepth() {\n    return this.depth\n  }\n\n  getCacheKey() {\n    const keys = [ \"objectGroup\" ]\n    Array.from(this.getObjects()).forEach((object) => {\n      keys.push(object.getCacheKey())\n    })\n    return keys.join(\"/\")\n  }\n}\n", "import BasicObject from \"trix/core/basic_object\"\n\nexport default class ObjectMap extends BasicObject {\n  constructor(objects = []) {\n    super(...arguments)\n    this.objects = {}\n\n    Array.from(objects).forEach((object) => {\n      const hash = JSON.stringify(object)\n      if (this.objects[hash] == null) {\n        this.objects[hash] = object\n      }\n    })\n  }\n\n  find(object) {\n    const hash = JSON.stringify(object)\n    return this.objects[hash]\n  }\n}\n", "export default class ElementStore {\n  constructor(elements) {\n    this.reset(elements)\n  }\n\n  add(element) {\n    const key = getKey(element)\n    this.elements[key] = element\n  }\n\n  remove(element) {\n    const key = getKey(element)\n    const value = this.elements[key]\n    if (value) {\n      delete this.elements[key]\n      return value\n    }\n  }\n\n  reset(elements = []) {\n    this.elements = {}\n    Array.from(elements).forEach((element) => {\n      this.add(element)\n    })\n    return elements\n  }\n}\n\nconst getKey = (element) => element.dataset.trixStoreKey\n", "import BasicObject from \"trix/core/basic_object\"\n\nexport default class Operation extends BasicObject {\n  isPerforming() {\n    return this.performing === true\n  }\n\n  hasPerformed() {\n    return this.performed === true\n  }\n\n  hasSucceeded() {\n    return this.performed && this.succeeded\n  }\n\n  hasFailed() {\n    return this.performed && !this.succeeded\n  }\n\n  getPromise() {\n    if (!this.promise) {\n      this.promise = new Promise((resolve, reject) => {\n        this.performing = true\n        return this.perform((succeeded, result) => {\n          this.succeeded = succeeded\n          this.performing = false\n          this.performed = true\n\n          if (this.succeeded) {\n            resolve(result)\n          } else {\n            reject(result)\n          }\n        })\n      })\n    }\n\n    return this.promise\n  }\n\n  perform(callback) {\n    return callback(false)\n  }\n\n  release() {\n    this.promise?.cancel?.()\n    this.promise = null\n    this.performing = null\n    this.performed = null\n    this.succeeded = null\n  }\n}\n\nOperation.proxyMethod(\"getPromise().then\")\nOperation.proxyMethod(\"getPromise().catch\")\n", "import BasicObject from \"trix/core/basic_object\"\nimport ObjectGroup from \"trix/core/collections/object_group\"\n\nexport default class ObjectView extends BasicObject {\n  constructor(object, options = {}) {\n    super(...arguments)\n    this.object = object\n    this.options = options\n    this.childViews = []\n    this.rootView = this\n  }\n\n  getNodes() {\n    if (!this.nodes) { this.nodes = this.createNodes() }\n    return this.nodes.map((node) => node.cloneNode(true))\n  }\n\n  invalidate() {\n    this.nodes = null\n    this.childViews = []\n    return this.parentView?.invalidate()\n  }\n\n  invalidateViewForObject(object) {\n    return this.findViewForObject(object)?.invalidate()\n  }\n\n  findOrCreateCachedChildView(viewClass, object, options) {\n    let view = this.getCachedViewForObject(object)\n    if (view) {\n      this.recordChildView(view)\n    } else {\n      view = this.createChildView(...arguments)\n      this.cacheViewForObject(view, object)\n    }\n    return view\n  }\n\n  createChildView(viewClass, object, options = {}) {\n    if (object instanceof ObjectGroup) {\n      options.viewClass = viewClass\n      viewClass = ObjectGroupView\n    }\n\n    const view = new viewClass(object, options)\n    return this.recordChildView(view)\n  }\n\n  recordChildView(view) {\n    view.parentView = this\n    view.rootView = this.rootView\n    this.childViews.push(view)\n    return view\n  }\n\n  getAllChildViews() {\n    let views = []\n\n    this.childViews.forEach((childView) => {\n      views.push(childView)\n      views = views.concat(childView.getAllChildViews())\n    })\n\n    return views\n  }\n\n  findElement() {\n    return this.findElementForObject(this.object)\n  }\n\n  findElementForObject(object) {\n    const id = object?.id\n    if (id) {\n      return this.rootView.element.querySelector(`[data-trix-id='${id}']`)\n    }\n  }\n\n  findViewForObject(object) {\n    for (const view of this.getAllChildViews()) {\n      if (view.object === object) {\n        return view\n      }\n    }\n  }\n\n  getViewCache() {\n    if (this.rootView === this) {\n      if (this.isViewCachingEnabled()) {\n        if (!this.viewCache) { this.viewCache = {} }\n        return this.viewCache\n      }\n    } else {\n      return this.rootView.getViewCache()\n    }\n  }\n\n  isViewCachingEnabled() {\n    return this.shouldCacheViews !== false\n  }\n\n  enableViewCaching() {\n    this.shouldCacheViews = true\n  }\n\n  disableViewCaching() {\n    this.shouldCacheViews = false\n  }\n\n  getCachedViewForObject(object) {\n    return this.getViewCache()?.[object.getCacheKey()]\n  }\n\n  cacheViewForObject(view, object) {\n    const cache = this.getViewCache()\n    if (cache) {\n      cache[object.getCacheKey()] = view\n    }\n  }\n\n  garbageCollectCachedViews() {\n    const cache = this.getViewCache()\n    if (cache) {\n      const views = this.getAllChildViews().concat(this)\n      const objectKeys = views.map((view) => view.object.getCacheKey())\n      for (const key in cache) {\n        if (!objectKeys.includes(key)) {\n          delete cache[key]\n        }\n      }\n    }\n  }\n}\n\nexport class ObjectGroupView extends ObjectView {\n  constructor() {\n    super(...arguments)\n    this.objectGroup = this.object\n    this.viewClass = this.options.viewClass\n    delete this.options.viewClass\n  }\n\n  getChildViews() {\n    if (!this.childViews.length) {\n      Array.from(this.objectGroup.getObjects()).forEach((object) => {\n        this.findOrCreateCachedChildView(this.viewClass, object, this.options)\n      })\n    }\n    return this.childViews\n  }\n\n  createNodes() {\n    const element = this.createContainerElement()\n\n    this.getChildViews().forEach((view) => {\n      Array.from(view.getNodes()).forEach((node) => {\n        element.appendChild(node)\n      })\n    })\n\n    return [ element ]\n  }\n\n  createContainerElement(depth = this.objectGroup.getDepth()) {\n    return this.getChildViews()[0].createContainerElement(depth)\n  }\n}\n", "/*! @license DOMPurify 3.4.2 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.2/LICENSE */\n\nconst {\n  entries,\n  setPrototypeOf,\n  isFrozen,\n  getPrototypeOf,\n  getOwnPropertyDescriptor\n} = Object;\nlet {\n  freeze,\n  seal,\n  create\n} = Object; // eslint-disable-line import/no-mutable-exports\nlet {\n  apply,\n  construct\n} = typeof Reflect !== 'undefined' && Reflect;\nif (!freeze) {\n  freeze = function freeze(x) {\n    return x;\n  };\n}\nif (!seal) {\n  seal = function seal(x) {\n    return x;\n  };\n}\nif (!apply) {\n  apply = function apply(func, thisArg) {\n    for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n      args[_key - 2] = arguments[_key];\n    }\n    return func.apply(thisArg, args);\n  };\n}\nif (!construct) {\n  construct = function construct(Func) {\n    for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n      args[_key2 - 1] = arguments[_key2];\n    }\n    return new Func(...args);\n  };\n}\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySplice = unapply(Array.prototype.splice);\nconst arrayIsArray = Array.isArray;\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\nconst numberToString = unapply(Number.prototype.toString);\nconst booleanToString = unapply(Boolean.prototype.toString);\nconst bigintToString = typeof BigInt === 'undefined' ? null : unapply(BigInt.prototype.toString);\nconst symbolToString = typeof Symbol === 'undefined' ? null : unapply(Symbol.prototype.toString);\nconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\nconst objectToString = unapply(Object.prototype.toString);\nconst regExpTest = unapply(RegExp.prototype.test);\nconst typeErrorCreate = unconstruct(TypeError);\n/**\n * Creates a new function that calls the given function with a specified thisArg and arguments.\n *\n * @param func - The function to be wrapped and called.\n * @returns A new function that calls the given function with a specified thisArg and arguments.\n */\nfunction unapply(func) {\n  return function (thisArg) {\n    if (thisArg instanceof RegExp) {\n      thisArg.lastIndex = 0;\n    }\n    for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n      args[_key3 - 1] = arguments[_key3];\n    }\n    return apply(func, thisArg, args);\n  };\n}\n/**\n * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n *\n * @param func - The constructor function to be wrapped and called.\n * @returns A new function that constructs an instance of the given constructor function with the provided arguments.\n */\nfunction unconstruct(Func) {\n  return function () {\n    for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n      args[_key4] = arguments[_key4];\n    }\n    return construct(Func, args);\n  };\n}\n/**\n * Add properties to a lookup table\n *\n * @param set - The set to which elements will be added.\n * @param array - The array containing elements to be added to the set.\n * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n * @returns The modified set with added elements.\n */\nfunction addToSet(set, array) {\n  let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase;\n  if (setPrototypeOf) {\n    // Make 'in' and truthy checks like Boolean(set.constructor)\n    // independent of any properties defined on Object.prototype.\n    // Prevent prototype setters from intercepting set as a this value.\n    setPrototypeOf(set, null);\n  }\n  if (!arrayIsArray(array)) {\n    return set;\n  }\n  let l = array.length;\n  while (l--) {\n    let element = array[l];\n    if (typeof element === 'string') {\n      const lcElement = transformCaseFunc(element);\n      if (lcElement !== element) {\n        // Config presets (e.g. tags.js, attrs.js) are immutable.\n        if (!isFrozen(array)) {\n          array[l] = lcElement;\n        }\n        element = lcElement;\n      }\n    }\n    set[element] = true;\n  }\n  return set;\n}\n/**\n * Clean up an array to harden against CSPP\n *\n * @param array - The array to be cleaned.\n * @returns The cleaned version of the array\n */\nfunction cleanArray(array) {\n  for (let index = 0; index < array.length; index++) {\n    const isPropertyExist = objectHasOwnProperty(array, index);\n    if (!isPropertyExist) {\n      array[index] = null;\n    }\n  }\n  return array;\n}\n/**\n * Shallow clone an object\n *\n * @param object - The object to be cloned.\n * @returns A new object that copies the original.\n */\nfunction clone(object) {\n  const newObject = create(null);\n  for (const [property, value] of entries(object)) {\n    const isPropertyExist = objectHasOwnProperty(object, property);\n    if (isPropertyExist) {\n      if (arrayIsArray(value)) {\n        newObject[property] = cleanArray(value);\n      } else if (value && typeof value === 'object' && value.constructor === Object) {\n        newObject[property] = clone(value);\n      } else {\n        newObject[property] = value;\n      }\n    }\n  }\n  return newObject;\n}\n/**\n * Convert non-node values into strings without depending on direct property access.\n *\n * @param value - The value to stringify.\n * @returns A string representation of the provided value.\n */\nfunction stringifyValue(value) {\n  switch (typeof value) {\n    case 'string':\n      {\n        return value;\n      }\n    case 'number':\n      {\n        return numberToString(value);\n      }\n    case 'boolean':\n      {\n        return booleanToString(value);\n      }\n    case 'bigint':\n      {\n        return bigintToString ? bigintToString(value) : '0';\n      }\n    case 'symbol':\n      {\n        return symbolToString ? symbolToString(value) : 'Symbol()';\n      }\n    case 'undefined':\n      {\n        return objectToString(value);\n      }\n    case 'function':\n    case 'object':\n      {\n        if (value === null) {\n          return objectToString(value);\n        }\n        const valueAsRecord = value;\n        const valueToString = lookupGetter(valueAsRecord, 'toString');\n        if (typeof valueToString === 'function') {\n          const stringified = valueToString(valueAsRecord);\n          return typeof stringified === 'string' ? stringified : objectToString(stringified);\n        }\n        return objectToString(value);\n      }\n    default:\n      {\n        return objectToString(value);\n      }\n  }\n}\n/**\n * This method automatically checks if the prop is function or getter and behaves accordingly.\n *\n * @param object - The object to look up the getter function in its prototype chain.\n * @param prop - The property name for which to find the getter function.\n * @returns The getter function found in the prototype chain or a fallback function.\n */\nfunction lookupGetter(object, prop) {\n  while (object !== null) {\n    const desc = getOwnPropertyDescriptor(object, prop);\n    if (desc) {\n      if (desc.get) {\n        return unapply(desc.get);\n      }\n      if (typeof desc.value === 'function') {\n        return unapply(desc.value);\n      }\n    }\n    object = getPrototypeOf(object);\n  }\n  function fallbackValue() {\n    return null;\n  }\n  return fallbackValue;\n}\nfunction isRegex(value) {\n  try {\n    regExpTest(value, '');\n    return true;\n  } catch (_unused) {\n    return false;\n  }\n}\n\nconst html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'search', 'section', 'select', 'shadow', 'slot', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);\nconst svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'enterkeyhint', 'exportparts', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'inputmode', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'part', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\nconst svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nconst svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\nconst mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'mprescripts']);\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nconst mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\nconst text = freeze(['#text']);\n\nconst html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'exportparts', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inert', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'part', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'slot', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns']);\nconst svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'amplitude', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'exponent', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'intercept', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'mask-type', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'slope', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'tablevalues', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\nconst mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnalign', 'columnlines', 'columnspacing', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lquote', 'lspace', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\nconst xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\n// eslint-disable-next-line unicorn/better-regex\nconst MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\nconst ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\nconst TMPLIT_EXPR = seal(/\\$\\{[\\w\\W]*/gm); // eslint-disable-line unicorn/better-regex\nconst DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/); // eslint-disable-line no-useless-escape\nconst ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nconst IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nconst IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nconst ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\nconst DOCTYPE_NAME = seal(/^html$/i);\nconst CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n\nvar EXPRESSIONS = /*#__PURE__*/Object.freeze({\n    __proto__: null,\n    ARIA_ATTR: ARIA_ATTR,\n    ATTR_WHITESPACE: ATTR_WHITESPACE,\n    CUSTOM_ELEMENT: CUSTOM_ELEMENT,\n    DATA_ATTR: DATA_ATTR,\n    DOCTYPE_NAME: DOCTYPE_NAME,\n    ERB_EXPR: ERB_EXPR,\n    IS_ALLOWED_URI: IS_ALLOWED_URI,\n    IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA,\n    MUSTACHE_EXPR: MUSTACHE_EXPR,\n    TMPLIT_EXPR: TMPLIT_EXPR\n});\n\n/* eslint-disable @typescript-eslint/indent */\n// https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst NODE_TYPE = {\n  element: 1,\n  text: 3,\n  // Deprecated\n  progressingInstruction: 7,\n  comment: 8,\n  document: 9};\nconst getGlobal = function getGlobal() {\n  return typeof window === 'undefined' ? null : window;\n};\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param trustedTypes The policy factory.\n * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n * @return The policy created (or null, if Trusted Types\n * are not supported or creating the policy failed).\n */\nconst _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {\n  if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n    return null;\n  }\n  // Allow the callers to control the unique policy name\n  // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n  // Policy creation with duplicate names throws in Trusted Types.\n  let suffix = null;\n  const ATTR_NAME = 'data-tt-policy-suffix';\n  if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\n    suffix = purifyHostElement.getAttribute(ATTR_NAME);\n  }\n  const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n  try {\n    return trustedTypes.createPolicy(policyName, {\n      createHTML(html) {\n        return html;\n      },\n      createScriptURL(scriptUrl) {\n        return scriptUrl;\n      }\n    });\n  } catch (_) {\n    // Policy creation failed (most likely another DOMPurify script has\n    // already run). Skip creating the policy, as this will only cause errors\n    // if TT are enforced.\n    console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n    return null;\n  }\n};\nconst _createHooksMap = function _createHooksMap() {\n  return {\n    afterSanitizeAttributes: [],\n    afterSanitizeElements: [],\n    afterSanitizeShadowDOM: [],\n    beforeSanitizeAttributes: [],\n    beforeSanitizeElements: [],\n    beforeSanitizeShadowDOM: [],\n    uponSanitizeAttribute: [],\n    uponSanitizeElement: [],\n    uponSanitizeShadowNode: []\n  };\n};\nfunction createDOMPurify() {\n  let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n  const DOMPurify = root => createDOMPurify(root);\n  DOMPurify.version = '3.4.2';\n  DOMPurify.removed = [];\n  if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {\n    // Not running in a browser, provide a factory function\n    // so that you can pass your own Window\n    DOMPurify.isSupported = false;\n    return DOMPurify;\n  }\n  let {\n    document\n  } = window;\n  const originalDocument = document;\n  const currentScript = originalDocument.currentScript;\n  const {\n    DocumentFragment,\n    HTMLTemplateElement,\n    Node,\n    Element,\n    NodeFilter,\n    NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,\n    HTMLFormElement,\n    DOMParser,\n    trustedTypes\n  } = window;\n  const ElementPrototype = Element.prototype;\n  const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n  const remove = lookupGetter(ElementPrototype, 'remove');\n  const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n  const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n  const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n  // As per issue #47, the web-components registry is inherited by a\n  // new document created via createHTMLDocument. As per the spec\n  // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n  // a new empty registry is used when creating a template contents owner\n  // document, so we use that as our parent document to ensure nothing\n  // is inherited.\n  if (typeof HTMLTemplateElement === 'function') {\n    const template = document.createElement('template');\n    if (template.content && template.content.ownerDocument) {\n      document = template.content.ownerDocument;\n    }\n  }\n  let trustedTypesPolicy;\n  let emptyHTML = '';\n  const {\n    implementation,\n    createNodeIterator,\n    createDocumentFragment,\n    getElementsByTagName\n  } = document;\n  const {\n    importNode\n  } = originalDocument;\n  let hooks = _createHooksMap();\n  /**\n   * Expose whether this browser supports running the full DOMPurify.\n   */\n  DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined;\n  const {\n    MUSTACHE_EXPR,\n    ERB_EXPR,\n    TMPLIT_EXPR,\n    DATA_ATTR,\n    ARIA_ATTR,\n    IS_SCRIPT_OR_DATA,\n    ATTR_WHITESPACE,\n    CUSTOM_ELEMENT\n  } = EXPRESSIONS;\n  let {\n    IS_ALLOWED_URI: IS_ALLOWED_URI$1\n  } = EXPRESSIONS;\n  /**\n   * We consider the elements and attributes below to be safe. Ideally\n   * don't add any new ones but feel free to remove unwanted ones.\n   */\n  /* allowed element names */\n  let ALLOWED_TAGS = null;\n  const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);\n  /* Allowed attribute names */\n  let ALLOWED_ATTR = null;\n  const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);\n  /*\n   * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements.\n   * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n   * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n   * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n   */\n  let CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, {\n    tagNameCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    },\n    attributeNameCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    },\n    allowCustomizedBuiltInElements: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: false\n    }\n  }));\n  /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n  let FORBID_TAGS = null;\n  /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n  let FORBID_ATTR = null;\n  /* Config object to store ADD_TAGS/ADD_ATTR functions (when used as functions) */\n  const EXTRA_ELEMENT_HANDLING = Object.seal(create(null, {\n    tagCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    },\n    attributeCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    }\n  }));\n  /* Decide if ARIA attributes are okay */\n  let ALLOW_ARIA_ATTR = true;\n  /* Decide if custom data attributes are okay */\n  let ALLOW_DATA_ATTR = true;\n  /* Decide if unknown protocols are okay */\n  let ALLOW_UNKNOWN_PROTOCOLS = false;\n  /* Decide if self-closing tags in attributes are allowed.\n   * Usually removed due to a mXSS issue in jQuery 3.0 */\n  let ALLOW_SELF_CLOSE_IN_ATTR = true;\n  /* Output should be safe for common template engines.\n   * This means, DOMPurify removes data attributes, mustaches and ERB\n   */\n  let SAFE_FOR_TEMPLATES = false;\n  /* Output should be safe even for XML used within HTML and alike.\n   * This means, DOMPurify removes comments when containing risky content.\n   */\n  let SAFE_FOR_XML = true;\n  /* Decide if document with <html>... should be returned */\n  let WHOLE_DOCUMENT = false;\n  /* Track whether config is already set on this instance of DOMPurify. */\n  let SET_CONFIG = false;\n  /* Decide if all elements (e.g. style, script) must be children of\n   * document.body. By default, browsers might move them to document.head */\n  let FORCE_BODY = false;\n  /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n   * string (or a TrustedHTML object if Trusted Types are supported).\n   * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n   */\n  let RETURN_DOM = false;\n  /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n   * string  (or a TrustedHTML object if Trusted Types are supported) */\n  let RETURN_DOM_FRAGMENT = false;\n  /* Try to return a Trusted Type object instead of a string, return a string in\n   * case Trusted Types are not supported  */\n  let RETURN_TRUSTED_TYPE = false;\n  /* Output should be free from DOM clobbering attacks?\n   * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n   */\n  let SANITIZE_DOM = true;\n  /* Achieve full DOM Clobbering protection by isolating the namespace of named\n   * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n   *\n   * HTML/DOM spec rules that enable DOM Clobbering:\n   *   - Named Access on Window (§7.3.3)\n   *   - DOM Tree Accessors (§3.1.5)\n   *   - Form Element Parent-Child Relations (§4.10.3)\n   *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n   *   - HTMLCollection (§4.2.10.2)\n   *\n   * Namespace isolation is implemented by prefixing `id` and `name` attributes\n   * with a constant string, i.e., `user-content-`\n   */\n  let SANITIZE_NAMED_PROPS = false;\n  const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n  /* Keep element content when removing element? */\n  let KEEP_CONTENT = true;\n  /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n   * of importing it into a new Document and returning a sanitized copy */\n  let IN_PLACE = false;\n  /* Allow usage of profiles like html, svg and mathMl */\n  let USE_PROFILES = {};\n  /* Tags to ignore content of when KEEP_CONTENT is true */\n  let FORBID_CONTENTS = null;\n  const DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\n  /* Tags that are safe for data: URIs */\n  let DATA_URI_TAGS = null;\n  const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n  /* Attributes safe for values like \"javascript:\" */\n  let URI_SAFE_ATTRIBUTES = null;\n  const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\n  const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n  const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n  const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  /* Document namespace */\n  let NAMESPACE = HTML_NAMESPACE;\n  let IS_EMPTY_INPUT = false;\n  /* Allowed XHTML+XML namespaces */\n  let ALLOWED_NAMESPACES = null;\n  const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);\n  let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);\n  let HTML_INTEGRATION_POINTS = addToSet({}, ['annotation-xml']);\n  // Certain elements are allowed in both SVG and HTML\n  // namespace. We need to specify them explicitly\n  // so that they don't get erroneously deleted from\n  // HTML namespace.\n  const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n  /* Parsing of strict XHTML documents */\n  let PARSER_MEDIA_TYPE = null;\n  const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n  const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n  let transformCaseFunc = null;\n  /* Keep a reference to config to pass to hooks */\n  let CONFIG = null;\n  /* Ideally, do not touch anything below this line */\n  /* ______________________________________________ */\n  const formElement = document.createElement('form');\n  const isRegexOrFunction = function isRegexOrFunction(testValue) {\n    return testValue instanceof RegExp || testValue instanceof Function;\n  };\n  /**\n   * _parseConfig\n   *\n   * @param cfg optional config literal\n   */\n  // eslint-disable-next-line complexity\n  const _parseConfig = function _parseConfig() {\n    let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    if (CONFIG && CONFIG === cfg) {\n      return;\n    }\n    /* Shield configuration object from tampering */\n    if (!cfg || typeof cfg !== 'object') {\n      cfg = {};\n    }\n    /* Shield configuration object from prototype pollution */\n    cfg = clone(cfg);\n    PARSER_MEDIA_TYPE =\n    // eslint-disable-next-line unicorn/prefer-includes\n    SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;\n    // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n    transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;\n    /* Set configuration parameters */\n    ALLOWED_TAGS = objectHasOwnProperty(cfg, 'ALLOWED_TAGS') && arrayIsArray(cfg.ALLOWED_TAGS) ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;\n    ALLOWED_ATTR = objectHasOwnProperty(cfg, 'ALLOWED_ATTR') && arrayIsArray(cfg.ALLOWED_ATTR) ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;\n    ALLOWED_NAMESPACES = objectHasOwnProperty(cfg, 'ALLOWED_NAMESPACES') && arrayIsArray(cfg.ALLOWED_NAMESPACES) ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;\n    URI_SAFE_ATTRIBUTES = objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') && arrayIsArray(cfg.ADD_URI_SAFE_ATTR) ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR, transformCaseFunc) : DEFAULT_URI_SAFE_ATTRIBUTES;\n    DATA_URI_TAGS = objectHasOwnProperty(cfg, 'ADD_DATA_URI_TAGS') && arrayIsArray(cfg.ADD_DATA_URI_TAGS) ? addToSet(clone(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS, transformCaseFunc) : DEFAULT_DATA_URI_TAGS;\n    FORBID_CONTENTS = objectHasOwnProperty(cfg, 'FORBID_CONTENTS') && arrayIsArray(cfg.FORBID_CONTENTS) ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;\n    FORBID_TAGS = objectHasOwnProperty(cfg, 'FORBID_TAGS') && arrayIsArray(cfg.FORBID_TAGS) ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : clone({});\n    FORBID_ATTR = objectHasOwnProperty(cfg, 'FORBID_ATTR') && arrayIsArray(cfg.FORBID_ATTR) ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : clone({});\n    USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES && typeof cfg.USE_PROFILES === 'object' ? clone(cfg.USE_PROFILES) : cfg.USE_PROFILES : false;\n    ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n    ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n    ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n    ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n    SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n    SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n    WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n    RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n    RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n    RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n    FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n    SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n    SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n    KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n    IN_PLACE = cfg.IN_PLACE || false; // Default false\n    IS_ALLOWED_URI$1 = isRegex(cfg.ALLOWED_URI_REGEXP) ? cfg.ALLOWED_URI_REGEXP : IS_ALLOWED_URI; // Default regexp\n    NAMESPACE = typeof cfg.NAMESPACE === 'string' ? cfg.NAMESPACE : HTML_NAMESPACE; // Default HTML namespace\n    MATHML_TEXT_INTEGRATION_POINTS = objectHasOwnProperty(cfg, 'MATHML_TEXT_INTEGRATION_POINTS') && cfg.MATHML_TEXT_INTEGRATION_POINTS && typeof cfg.MATHML_TEXT_INTEGRATION_POINTS === 'object' ? clone(cfg.MATHML_TEXT_INTEGRATION_POINTS) : addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']); // Default built-in map\n    HTML_INTEGRATION_POINTS = objectHasOwnProperty(cfg, 'HTML_INTEGRATION_POINTS') && cfg.HTML_INTEGRATION_POINTS && typeof cfg.HTML_INTEGRATION_POINTS === 'object' ? clone(cfg.HTML_INTEGRATION_POINTS) : addToSet({}, ['annotation-xml']); // Default built-in map\n    const customElementHandling = objectHasOwnProperty(cfg, 'CUSTOM_ELEMENT_HANDLING') && cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING === 'object' ? clone(cfg.CUSTOM_ELEMENT_HANDLING) : create(null);\n    CUSTOM_ELEMENT_HANDLING = create(null);\n    if (objectHasOwnProperty(customElementHandling, 'tagNameCheck') && isRegexOrFunction(customElementHandling.tagNameCheck)) {\n      CUSTOM_ELEMENT_HANDLING.tagNameCheck = customElementHandling.tagNameCheck; // Default undefined\n    }\n    if (objectHasOwnProperty(customElementHandling, 'attributeNameCheck') && isRegexOrFunction(customElementHandling.attributeNameCheck)) {\n      CUSTOM_ELEMENT_HANDLING.attributeNameCheck = customElementHandling.attributeNameCheck; // Default undefined\n    }\n    if (objectHasOwnProperty(customElementHandling, 'allowCustomizedBuiltInElements') && typeof customElementHandling.allowCustomizedBuiltInElements === 'boolean') {\n      CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = customElementHandling.allowCustomizedBuiltInElements; // Default undefined\n    }\n    if (SAFE_FOR_TEMPLATES) {\n      ALLOW_DATA_ATTR = false;\n    }\n    if (RETURN_DOM_FRAGMENT) {\n      RETURN_DOM = true;\n    }\n    /* Parse profile info */\n    if (USE_PROFILES) {\n      ALLOWED_TAGS = addToSet({}, text);\n      ALLOWED_ATTR = create(null);\n      if (USE_PROFILES.html === true) {\n        addToSet(ALLOWED_TAGS, html$1);\n        addToSet(ALLOWED_ATTR, html);\n      }\n      if (USE_PROFILES.svg === true) {\n        addToSet(ALLOWED_TAGS, svg$1);\n        addToSet(ALLOWED_ATTR, svg);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n      if (USE_PROFILES.svgFilters === true) {\n        addToSet(ALLOWED_TAGS, svgFilters);\n        addToSet(ALLOWED_ATTR, svg);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n      if (USE_PROFILES.mathMl === true) {\n        addToSet(ALLOWED_TAGS, mathMl$1);\n        addToSet(ALLOWED_ATTR, mathMl);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n    }\n    /* Always reset function-based ADD_TAGS / ADD_ATTR checks to prevent\n     * leaking across calls when switching from function to array config */\n    EXTRA_ELEMENT_HANDLING.tagCheck = null;\n    EXTRA_ELEMENT_HANDLING.attributeCheck = null;\n    /* Merge configuration parameters */\n    if (objectHasOwnProperty(cfg, 'ADD_TAGS')) {\n      if (typeof cfg.ADD_TAGS === 'function') {\n        EXTRA_ELEMENT_HANDLING.tagCheck = cfg.ADD_TAGS;\n      } else if (arrayIsArray(cfg.ADD_TAGS)) {\n        if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n          ALLOWED_TAGS = clone(ALLOWED_TAGS);\n        }\n        addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n      }\n    }\n    if (objectHasOwnProperty(cfg, 'ADD_ATTR')) {\n      if (typeof cfg.ADD_ATTR === 'function') {\n        EXTRA_ELEMENT_HANDLING.attributeCheck = cfg.ADD_ATTR;\n      } else if (arrayIsArray(cfg.ADD_ATTR)) {\n        if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n          ALLOWED_ATTR = clone(ALLOWED_ATTR);\n        }\n        addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n      }\n    }\n    if (objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') && arrayIsArray(cfg.ADD_URI_SAFE_ATTR)) {\n      addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n    }\n    if (objectHasOwnProperty(cfg, 'FORBID_CONTENTS') && arrayIsArray(cfg.FORBID_CONTENTS)) {\n      if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n        FORBID_CONTENTS = clone(FORBID_CONTENTS);\n      }\n      addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n    }\n    if (objectHasOwnProperty(cfg, 'ADD_FORBID_CONTENTS') && arrayIsArray(cfg.ADD_FORBID_CONTENTS)) {\n      if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n        FORBID_CONTENTS = clone(FORBID_CONTENTS);\n      }\n      addToSet(FORBID_CONTENTS, cfg.ADD_FORBID_CONTENTS, transformCaseFunc);\n    }\n    /* Add #text in case KEEP_CONTENT is set to true */\n    if (KEEP_CONTENT) {\n      ALLOWED_TAGS['#text'] = true;\n    }\n    /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n    if (WHOLE_DOCUMENT) {\n      addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n    }\n    /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n    if (ALLOWED_TAGS.table) {\n      addToSet(ALLOWED_TAGS, ['tbody']);\n      delete FORBID_TAGS.tbody;\n    }\n    if (cfg.TRUSTED_TYPES_POLICY) {\n      if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') {\n        throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.');\n      }\n      if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') {\n        throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.');\n      }\n      // Overwrite existing TrustedTypes policy.\n      trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;\n      // Sign local variables required by `sanitize`.\n      emptyHTML = trustedTypesPolicy.createHTML('');\n    } else {\n      // Uninitialized policy, attempt to initialize the internal dompurify policy.\n      if (trustedTypesPolicy === undefined) {\n        trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);\n      }\n      // If creating the internal policy succeeded sign internal variables.\n      if (trustedTypesPolicy !== null && typeof emptyHTML === 'string') {\n        emptyHTML = trustedTypesPolicy.createHTML('');\n      }\n    }\n    // Prevent further manipulation of configuration.\n    // Not available in IE8, Safari 5, etc.\n    if (freeze) {\n      freeze(cfg);\n    }\n    CONFIG = cfg;\n  };\n  /* Keep track of all possible SVG and MathML tags\n   * so that we can perform the namespace checks\n   * correctly. */\n  const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]);\n  const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);\n  /**\n   * @param element a DOM element whose namespace is being checked\n   * @returns Return false if the element has a\n   *  namespace that a spec-compliant parser would never\n   *  return. Return true otherwise.\n   */\n  const _checkValidNamespace = function _checkValidNamespace(element) {\n    let parent = getParentNode(element);\n    // In JSDOM, if we're inside shadow DOM, then parentNode\n    // can be null. We just simulate parent in this case.\n    if (!parent || !parent.tagName) {\n      parent = {\n        namespaceURI: NAMESPACE,\n        tagName: 'template'\n      };\n    }\n    const tagName = stringToLowerCase(element.tagName);\n    const parentTagName = stringToLowerCase(parent.tagName);\n    if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n      return false;\n    }\n    if (element.namespaceURI === SVG_NAMESPACE) {\n      // The only way to switch from HTML namespace to SVG\n      // is via <svg>. If it happens via any other tag, then\n      // it should be killed.\n      if (parent.namespaceURI === HTML_NAMESPACE) {\n        return tagName === 'svg';\n      }\n      // The only way to switch from MathML to SVG is via`\n      // svg if parent is either <annotation-xml> or MathML\n      // text integration points.\n      if (parent.namespaceURI === MATHML_NAMESPACE) {\n        return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n      }\n      // We only allow elements that are defined in SVG\n      // spec. All others are disallowed in SVG namespace.\n      return Boolean(ALL_SVG_TAGS[tagName]);\n    }\n    if (element.namespaceURI === MATHML_NAMESPACE) {\n      // The only way to switch from HTML namespace to MathML\n      // is via <math>. If it happens via any other tag, then\n      // it should be killed.\n      if (parent.namespaceURI === HTML_NAMESPACE) {\n        return tagName === 'math';\n      }\n      // The only way to switch from SVG to MathML is via\n      // <math> and HTML integration points\n      if (parent.namespaceURI === SVG_NAMESPACE) {\n        return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n      }\n      // We only allow elements that are defined in MathML\n      // spec. All others are disallowed in MathML namespace.\n      return Boolean(ALL_MATHML_TAGS[tagName]);\n    }\n    if (element.namespaceURI === HTML_NAMESPACE) {\n      // The only way to switch from SVG to HTML is via\n      // HTML integration points, and from MathML to HTML\n      // is via MathML text integration points\n      if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n        return false;\n      }\n      if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n        return false;\n      }\n      // We disallow tags that are specific for MathML\n      // or SVG and should never appear in HTML namespace\n      return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n    }\n    // For XHTML and XML documents that support custom namespaces\n    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {\n      return true;\n    }\n    // The code should never reach this place (this means\n    // that the element somehow got namespace that is not\n    // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n    // Return false just in case.\n    return false;\n  };\n  /**\n   * _forceRemove\n   *\n   * @param node a DOM node\n   */\n  const _forceRemove = function _forceRemove(node) {\n    arrayPush(DOMPurify.removed, {\n      element: node\n    });\n    try {\n      // eslint-disable-next-line unicorn/prefer-dom-node-remove\n      getParentNode(node).removeChild(node);\n    } catch (_) {\n      remove(node);\n    }\n  };\n  /**\n   * _removeAttribute\n   *\n   * @param name an Attribute name\n   * @param element a DOM node\n   */\n  const _removeAttribute = function _removeAttribute(name, element) {\n    try {\n      arrayPush(DOMPurify.removed, {\n        attribute: element.getAttributeNode(name),\n        from: element\n      });\n    } catch (_) {\n      arrayPush(DOMPurify.removed, {\n        attribute: null,\n        from: element\n      });\n    }\n    element.removeAttribute(name);\n    // We void attribute values for unremovable \"is\" attributes\n    if (name === 'is') {\n      if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n        try {\n          _forceRemove(element);\n        } catch (_) {}\n      } else {\n        try {\n          element.setAttribute(name, '');\n        } catch (_) {}\n      }\n    }\n  };\n  /**\n   * _initDocument\n   *\n   * @param dirty - a string of dirty markup\n   * @return a DOM, filled with the dirty markup\n   */\n  const _initDocument = function _initDocument(dirty) {\n    /* Create a HTML document */\n    let doc = null;\n    let leadingWhitespace = null;\n    if (FORCE_BODY) {\n      dirty = '<remove></remove>' + dirty;\n    } else {\n      /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n      const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n      leadingWhitespace = matches && matches[0];\n    }\n    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {\n      // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n      dirty = '<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>' + dirty + '</body></html>';\n    }\n    const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\n    /*\n     * Use the DOMParser API by default, fallback later if needs be\n     * DOMParser not work for svg when has multiple root element.\n     */\n    if (NAMESPACE === HTML_NAMESPACE) {\n      try {\n        doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n      } catch (_) {}\n    }\n    /* Use createHTMLDocument in case DOMParser is not available */\n    if (!doc || !doc.documentElement) {\n      doc = implementation.createDocument(NAMESPACE, 'template', null);\n      try {\n        doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;\n      } catch (_) {\n        // Syntax error if dirtyPayload is invalid xml\n      }\n    }\n    const body = doc.body || doc.documentElement;\n    if (dirty && leadingWhitespace) {\n      body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n    }\n    /* Work on whole document or just its body */\n    if (NAMESPACE === HTML_NAMESPACE) {\n      return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n    }\n    return WHOLE_DOCUMENT ? doc.documentElement : body;\n  };\n  /**\n   * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n   *\n   * @param root The root element or node to start traversing on.\n   * @return The created NodeIterator\n   */\n  const _createNodeIterator = function _createNodeIterator(root) {\n    return createNodeIterator.call(root.ownerDocument || root, root,\n    // eslint-disable-next-line no-bitwise\n    NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);\n  };\n  /**\n   * _isClobbered\n   *\n   * @param element element to check for clobbering attacks\n   * @return true if clobbered, false if safe\n   */\n  const _isClobbered = function _isClobbered(element) {\n    return element instanceof HTMLFormElement && (typeof element.nodeName !== 'string' || typeof element.textContent !== 'string' || typeof element.removeChild !== 'function' || !(element.attributes instanceof NamedNodeMap) || typeof element.removeAttribute !== 'function' || typeof element.setAttribute !== 'function' || typeof element.namespaceURI !== 'string' || typeof element.insertBefore !== 'function' || typeof element.hasChildNodes !== 'function');\n  };\n  /**\n   * Checks whether the given object is a DOM node.\n   *\n   * @param value object to check whether it's a DOM node\n   * @return true is object is a DOM node\n   */\n  const _isNode = function _isNode(value) {\n    return typeof Node === 'function' && value instanceof Node;\n  };\n  function _executeHooks(hooks, currentNode, data) {\n    arrayForEach(hooks, hook => {\n      hook.call(DOMPurify, currentNode, data, CONFIG);\n    });\n  }\n  /**\n   * _sanitizeElements\n   *\n   * @protect nodeName\n   * @protect textContent\n   * @protect removeChild\n   * @param currentNode to check for permission to exist\n   * @return true if node was killed, false if left alive\n   */\n  const _sanitizeElements = function _sanitizeElements(currentNode) {\n    let content = null;\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeElements, currentNode, null);\n    /* Check if element is clobbered or can clobber */\n    if (_isClobbered(currentNode)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Now let's check the element's type and name */\n    const tagName = transformCaseFunc(currentNode.nodeName);\n    /* Execute a hook if present */\n    _executeHooks(hooks.uponSanitizeElement, currentNode, {\n      tagName,\n      allowedTags: ALLOWED_TAGS\n    });\n    /* Detect mXSS attempts abusing namespace confusion */\n    if (SAFE_FOR_XML && currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(/<[/\\w!]/g, currentNode.innerHTML) && regExpTest(/<[/\\w!]/g, currentNode.textContent)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove risky CSS construction leading to mXSS */\n    if (SAFE_FOR_XML && currentNode.namespaceURI === HTML_NAMESPACE && tagName === 'style' && _isNode(currentNode.firstElementChild)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove any occurrence of processing instructions */\n    if (currentNode.nodeType === NODE_TYPE.progressingInstruction) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove any kind of possibly harmful comments */\n    if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(/<[/\\w]/g, currentNode.data)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove element if anything forbids its presence */\n    if (FORBID_TAGS[tagName] || !(EXTRA_ELEMENT_HANDLING.tagCheck instanceof Function && EXTRA_ELEMENT_HANDLING.tagCheck(tagName)) && !ALLOWED_TAGS[tagName]) {\n      /* Check if we have a custom element to handle */\n      if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {\n        if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) {\n          return false;\n        }\n        if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) {\n          return false;\n        }\n      }\n      /* Keep content except for bad-listed elements */\n      if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n        const parentNode = getParentNode(currentNode) || currentNode.parentNode;\n        const childNodes = getChildNodes(currentNode) || currentNode.childNodes;\n        if (childNodes && parentNode) {\n          const childCount = childNodes.length;\n          for (let i = childCount - 1; i >= 0; --i) {\n            const childClone = cloneNode(childNodes[i], true);\n            parentNode.insertBefore(childClone, getNextSibling(currentNode));\n          }\n        }\n      }\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Check whether element has a valid namespace */\n    if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Make sure that older browsers don't get fallback-tag mXSS */\n    if ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(/<\\/no(script|embed|frames)/i, currentNode.innerHTML)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Sanitize element content to be template-safe */\n    if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {\n      /* Get the element's text content */\n      content = currentNode.textContent;\n      arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n        content = stringReplace(content, expr, ' ');\n      });\n      if (currentNode.textContent !== content) {\n        arrayPush(DOMPurify.removed, {\n          element: currentNode.cloneNode()\n        });\n        currentNode.textContent = content;\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeElements, currentNode, null);\n    return false;\n  };\n  /**\n   * _isValidAttribute\n   *\n   * @param lcTag Lowercase tag name of containing element.\n   * @param lcName Lowercase attribute name.\n   * @param value Attribute value.\n   * @return Returns true if `value` is valid, otherwise false.\n   */\n  // eslint-disable-next-line complexity\n  const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n    /* FORBID_ATTR must always win, even if ADD_ATTR predicate would allow it */\n    if (FORBID_ATTR[lcName]) {\n      return false;\n    }\n    /* Make sure attribute cannot clobber */\n    if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n      return false;\n    }\n    const nameIsPermitted = ALLOWED_ATTR[lcName] || EXTRA_ELEMENT_HANDLING.attributeCheck instanceof Function && EXTRA_ELEMENT_HANDLING.attributeCheck(lcName, lcTag);\n    /* Allow valid data-* attributes: At least one character after \"-\"\n        (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n        XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n        We don't need to check the value; it's always URI safe. */\n    if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR, lcName)) ; else if (!nameIsPermitted || FORBID_ATTR[lcName]) {\n      if (\n      // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n      // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n      // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n      _isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName, lcTag)) ||\n      // Alternative, second condition checks if it's an `is`-attribute, AND\n      // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n      lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {\n        return false;\n      }\n      /* Check value is safe. First, is attr inert? If so, is safe */\n    } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if (value) {\n      return false;\n    } else ;\n    return true;\n  };\n  /* Names the HTML spec reserves from valid-custom-element-name; these must\n   * never be treated as basic custom elements even when a permissive\n   * CUSTOM_ELEMENT_HANDLING.tagNameCheck is configured. */\n  const RESERVED_CUSTOM_ELEMENT_NAMES = addToSet({}, ['annotation-xml', 'color-profile', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'missing-glyph']);\n  /**\n   * _isBasicCustomElement\n   * checks if at least one dash is included in tagName, and it's not the first char\n   * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n   *\n   * @param tagName name of the tag of the node to sanitize\n   * @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false.\n   */\n  const _isBasicCustomElement = function _isBasicCustomElement(tagName) {\n    return !RESERVED_CUSTOM_ELEMENT_NAMES[stringToLowerCase(tagName)] && regExpTest(CUSTOM_ELEMENT, tagName);\n  };\n  /**\n   * _sanitizeAttributes\n   *\n   * @protect attributes\n   * @protect nodeName\n   * @protect removeAttribute\n   * @protect setAttribute\n   *\n   * @param currentNode to sanitize\n   */\n  const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);\n    const {\n      attributes\n    } = currentNode;\n    /* Check if we have attributes; if not we might have a text node */\n    if (!attributes || _isClobbered(currentNode)) {\n      return;\n    }\n    const hookEvent = {\n      attrName: '',\n      attrValue: '',\n      keepAttr: true,\n      allowedAttributes: ALLOWED_ATTR,\n      forceKeepAttr: undefined\n    };\n    let l = attributes.length;\n    /* Go backwards over all attributes; safely remove bad ones */\n    while (l--) {\n      const attr = attributes[l];\n      const {\n        name,\n        namespaceURI,\n        value: attrValue\n      } = attr;\n      const lcName = transformCaseFunc(name);\n      const initValue = attrValue;\n      let value = name === 'value' ? initValue : stringTrim(initValue);\n      /* Execute a hook if present */\n      hookEvent.attrName = lcName;\n      hookEvent.attrValue = value;\n      hookEvent.keepAttr = true;\n      hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n      _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);\n      value = hookEvent.attrValue;\n      /* Full DOM Clobbering protection via namespace isolation,\n       * Prefix id and name attributes with `user-content-`\n       */\n      if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name') && stringIndexOf(value, SANITIZE_NAMED_PROPS_PREFIX) !== 0) {\n        // Remove the attribute with this value\n        _removeAttribute(name, currentNode);\n        // Prefix the value and later re-create the attribute with the sanitized value\n        value = SANITIZE_NAMED_PROPS_PREFIX + value;\n      }\n      // Else: already prefixed, leave the attribute alone — the prefix is\n      // itself the clobbering protection, and re-applying it is incorrect.\n      /* Work around a security issue with comments inside attributes */\n      if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Make sure we cannot easily use animated hrefs, even if animations are allowed */\n      if (lcName === 'attributename' && stringMatch(value, 'href')) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Did the hooks approve of the attribute? */\n      if (hookEvent.forceKeepAttr) {\n        continue;\n      }\n      /* Did the hooks approve of the attribute? */\n      if (!hookEvent.keepAttr) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Work around a security issue in jQuery 3.0 */\n      if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\\/>/i, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Sanitize attribute content to be template-safe */\n      if (SAFE_FOR_TEMPLATES) {\n        arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n          value = stringReplace(value, expr, ' ');\n        });\n      }\n      /* Is `value` valid for this attribute? */\n      const lcTag = transformCaseFunc(currentNode.nodeName);\n      if (!_isValidAttribute(lcTag, lcName, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Handle attributes that require Trusted Types */\n      if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') {\n        if (namespaceURI) ; else {\n          switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n            case 'TrustedHTML':\n              {\n                value = trustedTypesPolicy.createHTML(value);\n                break;\n              }\n            case 'TrustedScriptURL':\n              {\n                value = trustedTypesPolicy.createScriptURL(value);\n                break;\n              }\n          }\n        }\n      }\n      /* Handle invalid data-* attribute set by try-catching it */\n      if (value !== initValue) {\n        try {\n          if (namespaceURI) {\n            currentNode.setAttributeNS(namespaceURI, name, value);\n          } else {\n            /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n            currentNode.setAttribute(name, value);\n          }\n          if (_isClobbered(currentNode)) {\n            _forceRemove(currentNode);\n          } else {\n            arrayPop(DOMPurify.removed);\n          }\n        } catch (_) {\n          _removeAttribute(name, currentNode);\n        }\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeAttributes, currentNode, null);\n  };\n  /**\n   * _sanitizeShadowDOM\n   *\n   * @param fragment to iterate over recursively\n   */\n  const _sanitizeShadowDOM2 = function _sanitizeShadowDOM(fragment) {\n    let shadowNode = null;\n    const shadowIterator = _createNodeIterator(fragment);\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);\n    while (shadowNode = shadowIterator.nextNode()) {\n      /* Execute a hook if present */\n      _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);\n      /* Sanitize tags and elements */\n      _sanitizeElements(shadowNode);\n      /* Check attributes next */\n      _sanitizeAttributes(shadowNode);\n      /* Deep shadow DOM detected */\n      if (shadowNode.content instanceof DocumentFragment) {\n        _sanitizeShadowDOM2(shadowNode.content);\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);\n  };\n  // eslint-disable-next-line complexity\n  DOMPurify.sanitize = function (dirty) {\n    let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    let body = null;\n    let importedNode = null;\n    let currentNode = null;\n    let returnNode = null;\n    /* Make sure we have a string to sanitize.\n      DO NOT return early, as this will return the wrong type if\n      the user has requested a DOM object rather than a string */\n    IS_EMPTY_INPUT = !dirty;\n    if (IS_EMPTY_INPUT) {\n      dirty = '<!-->';\n    }\n    /* Stringify, in case dirty is an object */\n    if (typeof dirty !== 'string' && !_isNode(dirty)) {\n      dirty = stringifyValue(dirty);\n      if (typeof dirty !== 'string') {\n        throw typeErrorCreate('dirty is not a string, aborting');\n      }\n    }\n    /* Return dirty HTML if DOMPurify cannot run */\n    if (!DOMPurify.isSupported) {\n      return dirty;\n    }\n    /* Assign config vars */\n    if (!SET_CONFIG) {\n      _parseConfig(cfg);\n    }\n    /* Clean up removed elements */\n    DOMPurify.removed = [];\n    /* Check if dirty is correctly typed for IN_PLACE */\n    if (typeof dirty === 'string') {\n      IN_PLACE = false;\n    }\n    if (IN_PLACE) {\n      /* Do some early pre-sanitization to avoid unsafe root nodes */\n      const nn = dirty.nodeName;\n      if (typeof nn === 'string') {\n        const tagName = transformCaseFunc(nn);\n        if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n          throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n        }\n      }\n    } else if (dirty instanceof Node) {\n      /* If dirty is a DOM element, append to an empty document to avoid\n         elements being stripped by the parser */\n      body = _initDocument('<!---->');\n      importedNode = body.ownerDocument.importNode(dirty, true);\n      if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === 'BODY') {\n        /* Node is already a body, use as is */\n        body = importedNode;\n      } else if (importedNode.nodeName === 'HTML') {\n        body = importedNode;\n      } else {\n        // eslint-disable-next-line unicorn/prefer-dom-node-append\n        body.appendChild(importedNode);\n      }\n    } else {\n      /* Exit directly if we have nothing to do */\n      if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT &&\n      // eslint-disable-next-line unicorn/prefer-includes\n      dirty.indexOf('<') === -1) {\n        return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;\n      }\n      /* Initialize the document to work on */\n      body = _initDocument(dirty);\n      /* Check we have a DOM node from the data */\n      if (!body) {\n        return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n      }\n    }\n    /* Remove first element node (ours) if FORCE_BODY is set */\n    if (body && FORCE_BODY) {\n      _forceRemove(body.firstChild);\n    }\n    /* Get node iterator */\n    const nodeIterator = _createNodeIterator(IN_PLACE ? dirty : body);\n    /* Now start iterating over the created document */\n    while (currentNode = nodeIterator.nextNode()) {\n      /* Sanitize tags and elements */\n      _sanitizeElements(currentNode);\n      /* Check attributes next */\n      _sanitizeAttributes(currentNode);\n      /* Shadow DOM detected, sanitize it */\n      if (currentNode.content instanceof DocumentFragment) {\n        _sanitizeShadowDOM2(currentNode.content);\n      }\n    }\n    /* If we sanitized `dirty` in-place, return it. */\n    if (IN_PLACE) {\n      return dirty;\n    }\n    /* Return sanitized string or DOM */\n    if (RETURN_DOM) {\n      if (SAFE_FOR_TEMPLATES) {\n        body.normalize();\n        let html = body.innerHTML;\n        arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n          html = stringReplace(html, expr, ' ');\n        });\n        body.innerHTML = html;\n      }\n      if (RETURN_DOM_FRAGMENT) {\n        returnNode = createDocumentFragment.call(body.ownerDocument);\n        while (body.firstChild) {\n          // eslint-disable-next-line unicorn/prefer-dom-node-append\n          returnNode.appendChild(body.firstChild);\n        }\n      } else {\n        returnNode = body;\n      }\n      if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) {\n        /*\n          AdoptNode() is not used because internal state is not reset\n          (e.g. the past names map of a HTMLFormElement), this is safe\n          in theory but we would rather not risk another attack vector.\n          The state that is cloned by importNode() is explicitly defined\n          by the specs.\n        */\n        returnNode = importNode.call(originalDocument, returnNode, true);\n      }\n      return returnNode;\n    }\n    let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n    /* Serialize doctype if allowed */\n    if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\n      serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\\n' + serializedHTML;\n    }\n    /* Sanitize final string template-safe */\n    if (SAFE_FOR_TEMPLATES) {\n      arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n        serializedHTML = stringReplace(serializedHTML, expr, ' ');\n      });\n    }\n    return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;\n  };\n  DOMPurify.setConfig = function () {\n    let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    _parseConfig(cfg);\n    SET_CONFIG = true;\n  };\n  DOMPurify.clearConfig = function () {\n    CONFIG = null;\n    SET_CONFIG = false;\n  };\n  DOMPurify.isValidAttribute = function (tag, attr, value) {\n    /* Initialize shared config vars if necessary. */\n    if (!CONFIG) {\n      _parseConfig({});\n    }\n    const lcTag = transformCaseFunc(tag);\n    const lcName = transformCaseFunc(attr);\n    return _isValidAttribute(lcTag, lcName, value);\n  };\n  DOMPurify.addHook = function (entryPoint, hookFunction) {\n    if (typeof hookFunction !== 'function') {\n      return;\n    }\n    arrayPush(hooks[entryPoint], hookFunction);\n  };\n  DOMPurify.removeHook = function (entryPoint, hookFunction) {\n    if (hookFunction !== undefined) {\n      const index = arrayLastIndexOf(hooks[entryPoint], hookFunction);\n      return index === -1 ? undefined : arraySplice(hooks[entryPoint], index, 1)[0];\n    }\n    return arrayPop(hooks[entryPoint]);\n  };\n  DOMPurify.removeHooks = function (entryPoint) {\n    hooks[entryPoint] = [];\n  };\n  DOMPurify.removeAllHooks = function () {\n    hooks = _createHooksMap();\n  };\n  return DOMPurify;\n}\nvar purify = createDOMPurify();\n\nexport { purify as default };\n//# sourceMappingURL=purify.es.mjs.map\n", "import BasicObject from \"trix/core/basic_object\"\n\nimport { nodeIsAttachmentElement, removeNode, tagName, walkTree } from \"trix/core/helpers\"\nimport DOMPurify from \"dompurify\"\nimport * as config from \"trix/config\"\n\nDOMPurify.addHook(\"uponSanitizeAttribute\", function (node, data) {\n  if (data.attrName === \"data-trix-serialized-attributes\") {\n    data.keepAttr = false\n    return\n  }\n\n  const allowedAttributePattern = /^data-trix-/\n  if (allowedAttributePattern.test(data.attrName)) {\n    data.forceKeepAttr = true\n  }\n})\n\nconst DEFAULT_ALLOWED_ATTRIBUTES = \"style href src width height language class\".split(\" \")\nconst DEFAULT_FORBIDDEN_PROTOCOLS = \"javascript:\".split(\" \")\nconst DEFAULT_FORBIDDEN_ELEMENTS = \"script iframe form noscript\".split(\" \")\n\nexport default class HTMLSanitizer extends BasicObject {\n  static setHTML(element, html, options) {\n    const sanitizedElement = new this(html, options).sanitize()\n    const sanitizedHtml = sanitizedElement.getHTML ? sanitizedElement.getHTML() : sanitizedElement.outerHTML\n    element.innerHTML = sanitizedHtml\n  }\n\n  static sanitize(html, options) {\n    const sanitizer = new this(html, options)\n    sanitizer.sanitize()\n    return sanitizer\n  }\n\n  constructor(html, { allowedAttributes, forbiddenProtocols, forbiddenElements, purifyOptions } = {}) {\n    super(...arguments)\n    this.allowedAttributes = allowedAttributes || DEFAULT_ALLOWED_ATTRIBUTES\n    this.forbiddenProtocols = forbiddenProtocols || DEFAULT_FORBIDDEN_PROTOCOLS\n    this.forbiddenElements = forbiddenElements || DEFAULT_FORBIDDEN_ELEMENTS\n    this.purifyOptions = purifyOptions || {}\n    this.body = createBodyElementForHTML(html)\n  }\n\n  sanitize() {\n    this.sanitizeElements()\n    this.normalizeListElementNesting()\n    const purifyConfig = Object.assign({}, config.dompurify, this.purifyOptions)\n    DOMPurify.setConfig(purifyConfig)\n    this.body = DOMPurify.sanitize(this.body)\n\n    return this.body\n  }\n\n  getHTML() {\n    return this.body.innerHTML\n  }\n\n  getBody() {\n    return this.body\n  }\n\n  // Private\n\n  sanitizeElements() {\n    const walker = walkTree(this.body)\n    const nodesToRemove = []\n\n    while (walker.nextNode()) {\n      const node = walker.currentNode\n      switch (node.nodeType) {\n        case Node.ELEMENT_NODE:\n          if (this.elementIsRemovable(node)) {\n            nodesToRemove.push(node)\n          } else {\n            this.sanitizeElement(node)\n          }\n          break\n        case Node.COMMENT_NODE:\n          nodesToRemove.push(node)\n          break\n      }\n    }\n\n    nodesToRemove.forEach((node) => removeNode(node))\n\n    return this.body\n  }\n\n  sanitizeElement(element) {\n    if (element.hasAttribute(\"href\")) {\n      if (this.forbiddenProtocols.includes(element.protocol)) {\n        element.removeAttribute(\"href\")\n      }\n    }\n\n    Array.from(element.attributes).forEach(({ name }) => {\n      if (!this.allowedAttributes.includes(name) && name.indexOf(\"data-trix\") !== 0) {\n        element.removeAttribute(name)\n      }\n    })\n\n    return element\n  }\n\n  normalizeListElementNesting() {\n    Array.from(this.body.querySelectorAll(\"ul,ol\")).forEach((listElement) => {\n      const previousElement = listElement.previousElementSibling\n      if (previousElement) {\n        if (tagName(previousElement) === \"li\") {\n          previousElement.appendChild(listElement)\n        }\n      }\n    })\n\n    return this.body\n  }\n\n  elementIsRemovable(element) {\n    if (element?.nodeType !== Node.ELEMENT_NODE) return\n    return this.elementIsForbidden(element) || this.elementIsntSerializable(element)\n  }\n\n  elementIsForbidden(element) {\n    return this.forbiddenElements.includes(tagName(element))\n  }\n\n  elementIsntSerializable(element) {\n    return element.getAttribute(\"data-trix-serialize\") === \"false\" && !nodeIsAttachmentElement(element)\n  }\n}\n\nconst createBodyElementForHTML = function(html = \"\") {\n  // Remove everything after </html>\n  html = html.replace(/<\\/html[^>]*>[^]*$/i, \"</html>\")\n  const doc = document.implementation.createHTMLDocument(\"\")\n  doc.documentElement.innerHTML = html\n\n  Array.from(doc.head.querySelectorAll(\"style\")).forEach((element) => {\n    doc.body.appendChild(element)\n  })\n\n  return doc.body\n}\n", "import * as config from \"trix/config\"\nimport { ZERO_WIDTH_SPACE } from \"trix/constants\"\nimport { copyObject, makeElement } from \"trix/core/helpers\"\nimport ObjectView from \"trix/views/object_view\"\nimport HTMLSanitizer from \"trix/models/html_sanitizer\"\nimport DOMPurify from \"dompurify\"\n\nconst { css } = config\n\nexport default class AttachmentView extends ObjectView {\n  constructor() {\n    super(...arguments)\n    this.attachment = this.object\n    this.attachment.uploadProgressDelegate = this\n    this.attachmentPiece = this.options.piece\n  }\n\n  createContentNodes() {\n    return []\n  }\n\n  createNodes() {\n    let innerElement\n    const figure = innerElement = makeElement({\n      tagName: \"figure\",\n      className: this.getClassName(),\n      data: this.getData(),\n      editable: false,\n    })\n\n    const href = this.getHref()\n    if (href) {\n      innerElement = makeElement({ tagName: \"a\", editable: false, attributes: { href, tabindex: -1 } })\n      figure.appendChild(innerElement)\n    }\n\n    if (this.attachment.hasContent()) {\n      HTMLSanitizer.setHTML(innerElement, this.attachment.getContent())\n    } else {\n      this.createContentNodes().forEach((node) => {\n        innerElement.appendChild(node)\n      })\n    }\n\n    innerElement.appendChild(this.createCaptionElement())\n\n    if (this.attachment.isPending()) {\n      this.progressElement = makeElement({\n        tagName: \"progress\",\n        attributes: {\n          class: css.attachmentProgress,\n          value: this.attachment.getUploadProgress(),\n          max: 100,\n        },\n        data: {\n          trixMutable: true,\n          trixStoreKey: [ \"progressElement\", this.attachment.id ].join(\"/\"),\n        },\n      })\n\n      figure.appendChild(this.progressElement)\n    }\n\n    return [ createCursorTarget(\"left\"), figure, createCursorTarget(\"right\") ]\n  }\n\n  createCaptionElement() {\n    const figcaption = makeElement({ tagName: \"figcaption\", className: css.attachmentCaption })\n    const caption = this.attachmentPiece.getCaption()\n    if (caption) {\n      figcaption.classList.add(`${css.attachmentCaption}--edited`)\n      figcaption.textContent = caption\n    } else {\n      let name, size\n      const captionConfig = this.getCaptionConfig()\n      if (captionConfig.name) {\n        name = this.attachment.getFilename()\n      }\n      if (captionConfig.size) {\n        size = this.attachment.getFormattedFilesize()\n      }\n\n      if (name) {\n        const nameElement = makeElement({ tagName: \"span\", className: css.attachmentName, textContent: name })\n        figcaption.appendChild(nameElement)\n      }\n\n      if (size) {\n        if (name) {\n          figcaption.appendChild(document.createTextNode(\" \"))\n        }\n        const sizeElement = makeElement({ tagName: \"span\", className: css.attachmentSize, textContent: size })\n        figcaption.appendChild(sizeElement)\n      }\n    }\n\n    return figcaption\n  }\n\n  getClassName() {\n    const names = [ css.attachment, `${css.attachment}--${this.attachment.getType()}` ]\n    const extension = this.attachment.getExtension()\n    if (extension) {\n      names.push(`${css.attachment}--${extension}`)\n    }\n    return names.join(\" \")\n  }\n\n  getData() {\n    const data = {\n      trixAttachment: JSON.stringify(this.attachment),\n      trixContentType: this.attachment.getContentType(),\n      trixId: this.attachment.id,\n    }\n\n    const { attributes } = this.attachmentPiece\n    if (!attributes.isEmpty()) {\n      data.trixAttributes = JSON.stringify(attributes)\n    }\n\n    if (this.attachment.isPending()) {\n      data.trixSerialize = false\n    }\n\n    return data\n  }\n\n  getHref() {\n    if (!htmlContainsTagName(this.attachment.getContent(), \"a\")) {\n      const href = this.attachment.getHref()\n      if (href && DOMPurify.isValidAttribute(\"a\", \"href\", href)) {\n        return href\n      }\n    }\n  }\n\n  getCaptionConfig() {\n    const type = this.attachment.getType()\n    const captionConfig = copyObject(config.attachments[type]?.caption)\n    if (type === \"file\") {\n      captionConfig.name = true\n    }\n    return captionConfig\n  }\n\n  findProgressElement() {\n    return this.findElement()?.querySelector(\"progress\")\n  }\n\n  // Attachment delegate\n\n  attachmentDidChangeUploadProgress() {\n    const value = this.attachment.getUploadProgress()\n    const progressElement = this.findProgressElement()\n    if (progressElement) {\n      progressElement.value = value\n    }\n  }\n}\n\nconst createCursorTarget = (name) =>\n  makeElement({\n    tagName: \"span\",\n    textContent: ZERO_WIDTH_SPACE,\n    data: {\n      trixCursorTarget: name,\n      trixSerialize: false,\n    },\n  })\n\nconst htmlContainsTagName = function(html, tagName) {\n  const div = makeElement(\"div\")\n  HTMLSanitizer.setHTML(div, html || \"\")\n  return div.querySelector(tagName)\n}\n", "import * as config from \"trix/config\"\nimport { makeElement } from \"trix/core/helpers\"\n\nimport AttachmentView from \"trix/views/attachment_view\"\n\nexport default class PreviewableAttachmentView extends AttachmentView {\n  constructor() {\n    super(...arguments)\n    this.attachment.previewDelegate = this\n  }\n\n  createContentNodes() {\n    this.image = makeElement({\n      tagName: \"img\",\n      attributes: {\n        src: \"\",\n      },\n      data: {\n        trixMutable: true,\n      },\n    })\n\n    this.refresh(this.image)\n    return [ this.image ]\n  }\n\n  createCaptionElement() {\n    const figcaption = super.createCaptionElement(...arguments)\n    if (!figcaption.textContent) {\n      figcaption.setAttribute(\"data-trix-placeholder\", config.lang.captionPlaceholder)\n    }\n    return figcaption\n  }\n\n  refresh(image) {\n    if (!image) { image = this.findElement()?.querySelector(\"img\") }\n    if (image) {\n      return this.updateAttributesForImage(image)\n    }\n  }\n\n  updateAttributesForImage(image) {\n    const url = this.attachment.getURL()\n    const previewURL = this.attachment.getPreviewURL()\n    image.src = previewURL || url\n\n    if (previewURL === url) {\n      image.removeAttribute(\"data-trix-serialized-attributes\")\n    } else {\n      const serializedAttributes = JSON.stringify({ src: url })\n      image.setAttribute(\"data-trix-serialized-attributes\", serializedAttributes)\n    }\n\n    const width = this.attachment.getWidth()\n    const height = this.attachment.getHeight()\n    const alt = this.attachment.getAttribute(\"alt\")\n\n    if (width != null) {\n      image.width = width\n    }\n    if (height != null) {\n      image.height = height\n    }\n    if (alt != null) {\n      image.alt = alt\n    }\n\n    const storeKey = [ \"imageElement\", this.attachment.id, image.src, image.width, image.height ].join(\"/\")\n    image.dataset.trixStoreKey = storeKey\n  }\n\n  // Attachment delegate\n\n  attachmentDidChangeAttributes() {\n    this.refresh(this.image)\n    return this.refresh()\n  }\n}\n", "/* eslint-disable\n    no-useless-escape,\n    no-var,\n*/\nimport { NON_BREAKING_SPACE } from \"trix/constants\"\n\nimport ObjectView from \"trix/views/object_view\"\nimport AttachmentView from \"trix/views/attachment_view\"\nimport PreviewableAttachmentView from \"trix/views/previewable_attachment_view\"\n\nimport { findInnerElement, getTextConfig, makeElement } from \"trix/core/helpers\"\n\nexport default class PieceView extends ObjectView {\n  constructor() {\n    super(...arguments)\n    this.piece = this.object\n    this.attributes = this.piece.getAttributes()\n    this.textConfig = this.options.textConfig\n    this.context = this.options.context\n\n    if (this.piece.attachment) {\n      this.attachment = this.piece.attachment\n    } else {\n      this.string = this.piece.toString()\n    }\n  }\n\n  createNodes() {\n    let nodes = this.attachment ? this.createAttachmentNodes() : this.createStringNodes()\n    const element = this.createElement()\n    if (element) {\n      const innerElement = findInnerElement(element)\n      Array.from(nodes).forEach((node) => {\n        innerElement.appendChild(node)\n      })\n      nodes = [ element ]\n    }\n    return nodes\n  }\n\n  createAttachmentNodes() {\n    const constructor = this.attachment.isPreviewable() ? PreviewableAttachmentView : AttachmentView\n\n    const view = this.createChildView(constructor, this.piece.attachment, { piece: this.piece })\n    return view.getNodes()\n  }\n\n  createStringNodes() {\n    if (this.textConfig?.plaintext) {\n      return [ document.createTextNode(this.string) ]\n    } else {\n      const nodes = []\n      const iterable = this.string.split(\"\\n\")\n      for (let index = 0; index < iterable.length; index++) {\n        const substring = iterable[index]\n        if (index > 0) {\n          const element = makeElement(\"br\")\n          nodes.push(element)\n        }\n\n        if (substring.length) {\n          const node = document.createTextNode(this.preserveSpaces(substring))\n          nodes.push(node)\n        }\n      }\n      return nodes\n    }\n  }\n\n  createElement() {\n    let element, key, value\n    const styles = {}\n\n    for (key in this.attributes) {\n      value = this.attributes[key]\n      const config = getTextConfig(key)\n      if (config) {\n        if (config.tagName) {\n          var innerElement\n          const pendingElement = makeElement(config.tagName)\n\n          if (innerElement) {\n            innerElement.appendChild(pendingElement)\n            innerElement = pendingElement\n          } else {\n            element = innerElement = pendingElement\n          }\n        }\n\n        if (config.styleProperty) {\n          styles[config.styleProperty] = value\n        }\n\n        if (config.style) {\n          for (key in config.style) {\n            value = config.style[key]\n            styles[key] = value\n          }\n        }\n      }\n    }\n\n    if (Object.keys(styles).length) {\n      if (!element) { element = makeElement(\"span\") }\n      for (key in styles) {\n        value = styles[key]\n        element.style[key] = value\n      }\n    }\n    return element\n  }\n\n  createContainerElement() {\n    for (const key in this.attributes) {\n      const value = this.attributes[key]\n      const config = getTextConfig(key)\n      if (config) {\n        if (config.groupTagName) {\n          const attributes = {}\n          attributes[key] = value\n          return makeElement(config.groupTagName, attributes)\n        }\n      }\n    }\n  }\n\n  preserveSpaces(string) {\n    if (this.context.isLast) {\n      string = string.replace(/\\ $/, NON_BREAKING_SPACE)\n    }\n\n    string = string\n      .replace(/(\\S)\\ {3}(\\S)/g, `$1 ${NON_BREAKING_SPACE} $2`)\n      .replace(/\\ {2}/g, `${NON_BREAKING_SPACE} `)\n      .replace(/\\ {2}/g, ` ${NON_BREAKING_SPACE}`)\n\n    if (this.context.isFirst || this.context.followsWhitespace) {\n      string = string.replace(/^\\ /, NON_BREAKING_SPACE)\n    }\n\n    return string\n  }\n}\n", "/* eslint-disable\n    no-var,\n*/\nimport ObjectView from \"trix/views/object_view\"\nimport ObjectGroup from \"trix/core/collections/object_group\"\nimport PieceView from \"trix/views/piece_view\"\n\nexport default class TextView extends ObjectView {\n  constructor() {\n    super(...arguments)\n    this.text = this.object\n    this.textConfig = this.options.textConfig\n  }\n\n  createNodes() {\n    const nodes = []\n    const pieces = ObjectGroup.groupObjects(this.getPieces())\n    const lastIndex = pieces.length - 1\n\n    for (let index = 0; index < pieces.length; index++) {\n      const piece = pieces[index]\n      const context = {}\n      if (index === 0) {\n        context.isFirst = true\n      }\n      if (index === lastIndex) {\n        context.isLast = true\n      }\n      if (endsWithWhitespace(previousPiece)) {\n        context.followsWhitespace = true\n      }\n\n      const view = this.findOrCreateCachedChildView(PieceView, piece, { textConfig: this.textConfig, context })\n      nodes.push(...Array.from(view.getNodes() || []))\n\n      var previousPiece = piece\n    }\n    return nodes\n  }\n\n  getPieces() {\n    return Array.from(this.text.getPieces()).filter((piece) => !piece.hasAttribute(\"blockBreak\"))\n  }\n}\n\nconst endsWithWhitespace = (piece) => /\\s$/.test(piece?.toString())\n", "import * as config from \"trix/config\"\nimport ObjectView from \"trix/views/object_view\"\nimport TextView from \"trix/views/text_view\"\n\nimport { getBlockConfig, makeElement } from \"trix/core/helpers\"\nconst { css } = config\n\nexport default class BlockView extends ObjectView {\n  constructor() {\n    super(...arguments)\n    this.block = this.object\n    this.attributes = this.block.getAttributes()\n  }\n\n  createNodes() {\n    const comment = document.createComment(\"block\")\n    const nodes = [ comment ]\n    if (this.block.isEmpty()) {\n      nodes.push(makeElement(\"br\"))\n    } else {\n      const textConfig = getBlockConfig(this.block.getLastAttribute())?.text\n      const textView = this.findOrCreateCachedChildView(TextView, this.block.text, { textConfig })\n      nodes.push(...Array.from(textView.getNodes() || []))\n      if (this.shouldAddExtraNewlineElement()) {\n        nodes.push(makeElement(\"br\"))\n      }\n    }\n\n    if (this.attributes.length) {\n      return nodes\n    } else {\n      let attributes\n      const { tagName } = config.blockAttributes.default\n      if (this.block.isRTL()) {\n        attributes = { dir: \"rtl\" }\n      }\n\n      const element = makeElement({ tagName, attributes })\n      nodes.forEach((node) => element.appendChild(node))\n      return [ element ]\n    }\n  }\n\n  createContainerElement(depth) {\n    const attributes = {}\n    let className\n    const attributeName = this.attributes[depth]\n\n    const { tagName, htmlAttributes = [] } = getBlockConfig(attributeName)\n\n    if (depth === 0 && this.block.isRTL()) {\n      Object.assign(attributes, { dir: \"rtl\" })\n    }\n\n    if (attributeName === \"attachmentGallery\") {\n      const size = this.block.getBlockBreakPosition()\n      className = `${css.attachmentGallery} ${css.attachmentGallery}--${size}`\n    }\n\n    Object.entries(this.block.htmlAttributes).forEach(([ name, value ]) => {\n      if (htmlAttributes.includes(name)) {\n        attributes[name] = value\n      }\n    })\n\n    return makeElement({ tagName, className, attributes })\n  }\n\n  // A single <br> at the end of a block element has no visual representation\n  // so add an extra one.\n  shouldAddExtraNewlineElement() {\n    return /\\n\\n$/.test(this.block.toString())\n  }\n}\n", "import { createEvent, makeElement } from \"trix/core/helpers\"\n\nimport ElementStore from \"trix/core/collections/element_store\"\nimport ObjectGroup from \"trix/core/collections/object_group\"\nimport ObjectView from \"trix/views/object_view\"\nimport BlockView from \"trix/views/block_view\"\n\nimport { defer } from \"trix/core/helpers\"\n\nexport default class DocumentView extends ObjectView {\n  static render(document) {\n    const element = makeElement(\"div\")\n    const view = new this(document, { element })\n    view.render()\n    view.sync()\n    return element\n  }\n\n  constructor() {\n    super(...arguments)\n    this.element = this.options.element\n    this.elementStore = new ElementStore()\n    this.setDocument(this.object)\n  }\n\n  setDocument(document) {\n    if (!document.isEqualTo(this.document)) {\n      this.document = this.object = document\n    }\n  }\n\n  render() {\n    this.childViews = []\n\n    this.shadowElement = makeElement(\"div\")\n\n    if (!this.document.isEmpty()) {\n      const objects = ObjectGroup.groupObjects(this.document.getBlocks(), { asTree: true })\n\n      Array.from(objects).forEach((object) => {\n        const view = this.findOrCreateCachedChildView(BlockView, object)\n        Array.from(view.getNodes()).map((node) => this.shadowElement.appendChild(node))\n      })\n    }\n  }\n\n  isSynced() {\n    return elementsHaveEqualHTML(this.shadowElement, this.element)\n  }\n\n  sync() {\n    const render = (element, documentFragment) => {\n      while (element.lastChild) {\n        element.removeChild(element.lastChild)\n      }\n      element.appendChild(documentFragment)\n    }\n\n    const event = createEvent(\"trix-before-render\", { cancelable: false, attributes: { render } })\n    this.element.dispatchEvent(event)\n\n    const fragment = this.createDocumentFragmentForSync()\n    event.render(this.element, fragment)\n    return this.didSync()\n  }\n\n  // Private\n\n  didSync() {\n    this.elementStore.reset(findStoredElements(this.element))\n    return defer(() => this.garbageCollectCachedViews())\n  }\n\n  createDocumentFragmentForSync() {\n    const fragment = document.createDocumentFragment()\n\n    Array.from(this.shadowElement.childNodes).forEach((node) => {\n      fragment.appendChild(node.cloneNode(true))\n    })\n\n    Array.from(findStoredElements(fragment)).forEach((element) => {\n      const storedElement = this.elementStore.remove(element)\n      if (storedElement) {\n        element.parentNode.replaceChild(storedElement, element)\n      }\n    })\n\n    return fragment\n  }\n}\n\nconst findStoredElements = (element) => element.querySelectorAll(\"[data-trix-store-key]\")\n\nconst elementsHaveEqualHTML = (element, otherElement) =>\n  ignoreSpaces(element.innerHTML) === ignoreSpaces(otherElement.innerHTML)\n\nconst ignoreSpaces = (html) => html.replace(/&nbsp;/g, \" \")\n", "import TrixObject from \"trix/core/object\" // Don't override window.Object\nimport Hash from \"trix/core/collections/hash\"\n\nexport default class Piece extends TrixObject {\n  static types = {}\n\n  static registerType(type, constructor) {\n    constructor.type = type\n    this.types[type] = constructor\n  }\n\n  static fromJSON(pieceJSON) {\n    const constructor = this.types[pieceJSON.type]\n    if (constructor) {\n      return constructor.fromJSON(pieceJSON)\n    }\n  }\n\n  constructor(value, attributes = {}) {\n    super(...arguments)\n    this.attributes = Hash.box(attributes)\n  }\n\n  copyWithAttributes(attributes) {\n    return new this.constructor(this.getValue(), attributes)\n  }\n\n  copyWithAdditionalAttributes(attributes) {\n    return this.copyWithAttributes(this.attributes.merge(attributes))\n  }\n\n  copyWithoutAttribute(attribute) {\n    return this.copyWithAttributes(this.attributes.remove(attribute))\n  }\n\n  copy() {\n    return this.copyWithAttributes(this.attributes)\n  }\n\n  getAttribute(attribute) {\n    return this.attributes.get(attribute)\n  }\n\n  getAttributesHash() {\n    return this.attributes\n  }\n\n  getAttributes() {\n    return this.attributes.toObject()\n  }\n\n  hasAttribute(attribute) {\n    return this.attributes.has(attribute)\n  }\n\n  hasSameStringValueAsPiece(piece) {\n    return piece && this.toString() === piece.toString()\n  }\n\n  hasSameAttributesAsPiece(piece) {\n    return piece && (this.attributes === piece.attributes || this.attributes.isEqualTo(piece.attributes))\n  }\n\n  isBlockBreak() {\n    return false\n  }\n\n  isEqualTo(piece) {\n    return (\n      super.isEqualTo(...arguments) ||\n      this.hasSameConstructorAs(piece) &&\n        this.hasSameStringValueAsPiece(piece) &&\n        this.hasSameAttributesAsPiece(piece)\n    )\n  }\n\n  isEmpty() {\n    return this.length === 0\n  }\n\n  isSerializable() {\n    return true\n  }\n\n  toJSON() {\n    return {\n      type: this.constructor.type,\n      attributes: this.getAttributes(),\n    }\n  }\n\n  contentsForInspection() {\n    return {\n      type: this.constructor.type,\n      attributes: this.attributes.inspect(),\n    }\n  }\n\n  // Grouping\n\n  canBeGrouped() {\n    return this.hasAttribute(\"href\")\n  }\n\n  canBeGroupedWith(piece) {\n    return this.getAttribute(\"href\") === piece.getAttribute(\"href\")\n  }\n\n  // Splittable\n\n  getLength() {\n    return this.length\n  }\n\n  canBeConsolidatedWith(piece) {\n    return false\n  }\n}\n", "import Operation from \"trix/core/utilities/operation\"\n\nexport default class ImagePreloadOperation extends Operation {\n  constructor(url) {\n    super(...arguments)\n    this.url = url\n  }\n\n  perform(callback) {\n    const image = new Image()\n\n    image.onload = () => {\n      image.width = this.width = image.naturalWidth\n      image.height = this.height = image.naturalHeight\n      return callback(true, image)\n    }\n\n    image.onerror = () => callback(false)\n\n    image.src = this.url\n  }\n}\n", "import * as config from \"trix/config\"\nimport TrixObject from \"trix/core/object\" // Don't override window.Object\nimport Hash from \"trix/core/collections/hash\"\nimport ImagePreloadOperation from \"trix/operations/image_preload_operation\"\n\nexport default class Attachment extends TrixObject {\n  static previewablePattern = /^image(\\/(gif|png|webp|jpe?g)|$)/\n\n  static attachmentForFile(file) {\n    const attributes = this.attributesForFile(file)\n    const attachment = new this(attributes)\n    attachment.setFile(file)\n    return attachment\n  }\n\n  static attributesForFile(file) {\n    return new Hash({\n      filename: file.name,\n      filesize: file.size,\n      contentType: file.type,\n    })\n  }\n\n  static fromJSON(attachmentJSON) {\n    return new this(attachmentJSON)\n  }\n\n  constructor(attributes = {}) {\n    super(attributes)\n    this.releaseFile = this.releaseFile.bind(this)\n    this.attributes = Hash.box(attributes)\n    this.didChangeAttributes()\n  }\n\n  setAttribute(attribute, value) {\n    this.setAttributes({ [attribute]: value })\n  }\n\n  getAttribute(attribute) {\n    return this.attributes.get(attribute)\n  }\n\n  hasAttribute(attribute) {\n    return this.attributes.has(attribute)\n  }\n\n  getAttributes() {\n    return this.attributes.toObject()\n  }\n\n  setAttributes(attributes = {}) {\n    const newAttributes = this.attributes.merge(attributes)\n    if (!this.attributes.isEqualTo(newAttributes)) {\n      this.attributes = newAttributes\n      this.didChangeAttributes()\n      this.previewDelegate?.attachmentDidChangeAttributes?.(this)\n      return this.delegate?.attachmentDidChangeAttributes?.(this)\n    }\n  }\n\n  didChangeAttributes() {\n    if (this.isPreviewable()) {\n      return this.preloadURL()\n    }\n  }\n\n  isPending() {\n    return this.file != null && !(this.getURL() || this.getHref())\n  }\n\n  isPreviewable() {\n    if (this.attributes.has(\"previewable\")) {\n      return this.attributes.get(\"previewable\")\n    } else {\n      return Attachment.previewablePattern.test(this.getContentType())\n    }\n  }\n\n  getType() {\n    if (this.hasContent()) {\n      return \"content\"\n    } else if (this.isPreviewable()) {\n      return \"preview\"\n    } else {\n      return \"file\"\n    }\n  }\n\n  getURL() {\n    return this.attributes.get(\"url\")\n  }\n\n  getHref() {\n    return this.attributes.get(\"href\")\n  }\n\n  getFilename() {\n    return this.attributes.get(\"filename\") || \"\"\n  }\n\n  getFilesize() {\n    return this.attributes.get(\"filesize\")\n  }\n\n  getFormattedFilesize() {\n    const filesize = this.attributes.get(\"filesize\")\n    if (typeof filesize === \"number\") {\n      return config.fileSize.formatter(filesize)\n    } else {\n      return \"\"\n    }\n  }\n\n  getExtension() {\n    return this.getFilename()\n      .match(/\\.(\\w+)$/)?.[1]\n      .toLowerCase()\n  }\n\n  getContentType() {\n    return this.attributes.get(\"contentType\")\n  }\n\n  hasContent() {\n    return this.attributes.has(\"content\")\n  }\n\n  getContent() {\n    return this.attributes.get(\"content\")\n  }\n\n  getWidth() {\n    return this.attributes.get(\"width\")\n  }\n\n  getHeight() {\n    return this.attributes.get(\"height\")\n  }\n\n  getFile() {\n    return this.file\n  }\n\n  setFile(file) {\n    this.file = file\n    if (this.isPreviewable()) {\n      return this.preloadFile()\n    }\n  }\n\n  releaseFile() {\n    this.releasePreloadedFile()\n    this.file = null\n  }\n\n  getUploadProgress() {\n    return this.uploadProgress != null ? this.uploadProgress : 0\n  }\n\n  setUploadProgress(value) {\n    if (this.uploadProgress !== value) {\n      this.uploadProgress = value\n      return this.uploadProgressDelegate?.attachmentDidChangeUploadProgress?.(this)\n    }\n  }\n\n  toJSON() {\n    return this.getAttributes()\n  }\n\n  getCacheKey() {\n    return [ super.getCacheKey(...arguments), this.attributes.getCacheKey(), this.getPreviewURL() ].join(\"/\")\n  }\n\n  // Previewable\n\n  getPreviewURL() {\n    return this.previewURL || this.preloadingURL\n  }\n\n  setPreviewURL(url) {\n    if (url !== this.getPreviewURL()) {\n      this.previewURL = url\n      this.previewDelegate?.attachmentDidChangeAttributes?.(this)\n      return this.delegate?.attachmentDidChangePreviewURL?.(this)\n    }\n  }\n\n  preloadURL() {\n    return this.preload(this.getURL(), this.releaseFile)\n  }\n\n  preloadFile() {\n    if (this.file) {\n      this.fileObjectURL = URL.createObjectURL(this.file)\n      return this.preload(this.fileObjectURL)\n    }\n  }\n\n  releasePreloadedFile() {\n    if (this.fileObjectURL) {\n      URL.revokeObjectURL(this.fileObjectURL)\n      this.fileObjectURL = null\n    }\n  }\n\n  preload(url, callback) {\n    if (url && url !== this.getPreviewURL()) {\n      this.preloadingURL = url\n      const operation = new ImagePreloadOperation(url)\n      return operation\n        .then(({ width, height }) => {\n          if (!this.getWidth() || !this.getHeight()) {\n            this.setAttributes({ width, height })\n          }\n          this.preloadingURL = null\n          this.setPreviewURL(url)\n          return callback?.()\n        })\n        .catch(() => {\n          this.preloadingURL = null\n          return callback?.()\n        })\n    }\n  }\n}\n", "import { OBJECT_REPLACEMENT_CHARACTER } from \"trix/constants\"\n\nimport Attachment from \"trix/models/attachment\"\nimport Piece from \"trix/models/piece\"\n\nexport default class AttachmentPiece extends Piece {\n  static permittedAttributes = [ \"caption\", \"presentation\" ]\n\n  static fromJSON(pieceJSON) {\n    return new this(Attachment.fromJSON(pieceJSON.attachment), pieceJSON.attributes)\n  }\n\n  constructor(attachment) {\n    super(...arguments)\n    this.attachment = attachment\n    this.length = 1\n    this.ensureAttachmentExclusivelyHasAttribute(\"href\")\n    if (!this.attachment.hasContent()) {\n      this.removeProhibitedAttributes()\n    }\n  }\n\n  ensureAttachmentExclusivelyHasAttribute(attribute) {\n    if (this.hasAttribute(attribute)) {\n      if (!this.attachment.hasAttribute(attribute)) {\n        this.attachment.setAttributes(this.attributes.slice([ attribute ]))\n      }\n      this.attributes = this.attributes.remove(attribute)\n    }\n  }\n\n  removeProhibitedAttributes() {\n    const attributes = this.attributes.slice(AttachmentPiece.permittedAttributes)\n    if (!attributes.isEqualTo(this.attributes)) {\n      this.attributes = attributes\n    }\n  }\n\n  getValue() {\n    return this.attachment\n  }\n\n  isSerializable() {\n    return !this.attachment.isPending()\n  }\n\n  getCaption() {\n    return this.attributes.get(\"caption\") || \"\"\n  }\n\n  isEqualTo(piece) {\n    return super.isEqualTo(piece) && this.attachment.id === piece?.attachment?.id\n  }\n\n  toString() {\n    return OBJECT_REPLACEMENT_CHARACTER\n  }\n\n  toJSON() {\n    const json = super.toJSON(...arguments)\n    json.attachment = this.attachment\n    return json\n  }\n\n  getCacheKey() {\n    return [ super.getCacheKey(...arguments), this.attachment.getCacheKey() ].join(\"/\")\n  }\n\n  toConsole() {\n    return JSON.stringify(this.toString())\n  }\n}\n\nPiece.registerType(\"attachment\", AttachmentPiece)\n", "import DOMPurify from \"dompurify\"\n\nimport Piece from \"trix/models/piece\"\n\nimport { normalizeNewlines } from \"trix/core/helpers\"\n\nexport default class StringPiece extends Piece {\n  static fromJSON(pieceJSON) {\n    const attributes = { ...pieceJSON.attributes }\n    if (attributes.href && !DOMPurify.isValidAttribute(\"a\", \"href\", attributes.href)) {\n      delete attributes.href\n    }\n    return new this(pieceJSON.string, attributes)\n  }\n\n  constructor(string) {\n    super(...arguments)\n    this.string = normalizeNewlines(string)\n    this.length = this.string.length\n  }\n\n  getValue() {\n    return this.string\n  }\n\n  toString() {\n    return this.string.toString()\n  }\n\n  isBlockBreak() {\n    return this.toString() === \"\\n\" && this.getAttribute(\"blockBreak\") === true\n  }\n\n  toJSON() {\n    const result = super.toJSON(...arguments)\n    result.string = this.string\n    return result\n  }\n\n  // Splittable\n\n  canBeConsolidatedWith(piece) {\n    return piece && this.hasSameConstructorAs(piece) && this.hasSameAttributesAsPiece(piece)\n  }\n\n  consolidateWith(piece) {\n    return new this.constructor(this.toString() + piece.toString(), this.attributes)\n  }\n\n  splitAtOffset(offset) {\n    let left, right\n    if (offset === 0) {\n      left = null\n      right = this\n    } else if (offset === this.length) {\n      left = this\n      right = null\n    } else {\n      left = new this.constructor(this.string.slice(0, offset), this.attributes)\n      right = new this.constructor(this.string.slice(offset), this.attributes)\n    }\n    return [ left, right ]\n  }\n\n  toConsole() {\n    let { string } = this\n    if (string.length > 15) {\n      string = string.slice(0, 14) + \"…\"\n    }\n    return JSON.stringify(string.toString())\n  }\n}\n\nPiece.registerType(\"string\", StringPiece)\n", "/* eslint-disable\n    prefer-const,\n*/\nimport TrixObject from \"trix/core/object\" // Don't override window.Object\n\nimport { spliceArray } from \"trix/core/helpers\"\n\nexport default class SplittableList extends TrixObject {\n  static box(objects) {\n    if (objects instanceof this) {\n      return objects\n    } else {\n      return new this(objects)\n    }\n  }\n\n  constructor(objects = []) {\n    super(...arguments)\n    this.objects = objects.slice(0)\n    this.length = this.objects.length\n  }\n\n  indexOf(object) {\n    return this.objects.indexOf(object)\n  }\n\n  splice(...args) {\n    return new this.constructor(spliceArray(this.objects, ...args))\n  }\n\n  eachObject(callback) {\n    return this.objects.map((object, index) => callback(object, index))\n  }\n\n  insertObjectAtIndex(object, index) {\n    return this.splice(index, 0, object)\n  }\n\n  insertSplittableListAtIndex(splittableList, index) {\n    return this.splice(index, 0, ...splittableList.objects)\n  }\n\n  insertSplittableListAtPosition(splittableList, position) {\n    const [ objects, index ] = this.splitObjectAtPosition(position)\n    return new this.constructor(objects).insertSplittableListAtIndex(splittableList, index)\n  }\n\n  editObjectAtIndex(index, callback) {\n    return this.replaceObjectAtIndex(callback(this.objects[index]), index)\n  }\n\n  replaceObjectAtIndex(object, index) {\n    return this.splice(index, 1, object)\n  }\n\n  removeObjectAtIndex(index) {\n    return this.splice(index, 1)\n  }\n\n  getObjectAtIndex(index) {\n    return this.objects[index]\n  }\n\n  getSplittableListInRange(range) {\n    const [ objects, leftIndex, rightIndex ] = this.splitObjectsAtRange(range)\n    return new this.constructor(objects.slice(leftIndex, rightIndex + 1))\n  }\n\n  selectSplittableList(test) {\n    const objects = this.objects.filter((object) => test(object))\n    return new this.constructor(objects)\n  }\n\n  removeObjectsInRange(range) {\n    const [ objects, leftIndex, rightIndex ] = this.splitObjectsAtRange(range)\n    return new this.constructor(objects).splice(leftIndex, rightIndex - leftIndex + 1)\n  }\n\n  transformObjectsInRange(range, transform) {\n    const [ objects, leftIndex, rightIndex ] = this.splitObjectsAtRange(range)\n    const transformedObjects = objects.map((object, index) =>\n      leftIndex <= index && index <= rightIndex ? transform(object) : object\n    )\n    return new this.constructor(transformedObjects)\n  }\n\n  splitObjectsAtRange(range) {\n    let rightOuterIndex\n    let [ objects, leftInnerIndex, offset ] = this.splitObjectAtPosition(startOfRange(range))\n    ;[ objects, rightOuterIndex ] = new this.constructor(objects).splitObjectAtPosition(endOfRange(range) + offset)\n\n    return [ objects, leftInnerIndex, rightOuterIndex - 1 ]\n  }\n\n  getObjectAtPosition(position) {\n    const { index } = this.findIndexAndOffsetAtPosition(position)\n    return this.objects[index]\n  }\n\n  splitObjectAtPosition(position) {\n    let splitIndex, splitOffset\n    const { index, offset } = this.findIndexAndOffsetAtPosition(position)\n    const objects = this.objects.slice(0)\n    if (index != null) {\n      if (offset === 0) {\n        splitIndex = index\n        splitOffset = 0\n      } else {\n        const object = this.getObjectAtIndex(index)\n        const [ leftObject, rightObject ] = object.splitAtOffset(offset)\n        objects.splice(index, 1, leftObject, rightObject)\n        splitIndex = index + 1\n        splitOffset = leftObject.getLength() - offset\n      }\n    } else {\n      splitIndex = objects.length\n      splitOffset = 0\n    }\n\n    return [ objects, splitIndex, splitOffset ]\n  }\n\n  consolidate() {\n    const objects = []\n    let pendingObject = this.objects[0]\n\n    this.objects.slice(1).forEach((object) => {\n      if (pendingObject.canBeConsolidatedWith?.(object)) {\n        pendingObject = pendingObject.consolidateWith(object)\n      } else {\n        objects.push(pendingObject)\n        pendingObject = object\n      }\n    })\n\n    if (pendingObject) {\n      objects.push(pendingObject)\n    }\n\n    return new this.constructor(objects)\n  }\n\n  consolidateFromIndexToIndex(startIndex, endIndex) {\n    const objects = this.objects.slice(0)\n    const objectsInRange = objects.slice(startIndex, endIndex + 1)\n    const consolidatedInRange = new this.constructor(objectsInRange).consolidate().toArray()\n    return this.splice(startIndex, objectsInRange.length, ...consolidatedInRange)\n  }\n\n  findIndexAndOffsetAtPosition(position) {\n    let index\n    let currentPosition = 0\n    for (index = 0; index < this.objects.length; index++) {\n      const object = this.objects[index]\n      const nextPosition = currentPosition + object.getLength()\n      if (currentPosition <= position && position < nextPosition) {\n        return { index, offset: position - currentPosition }\n      }\n      currentPosition = nextPosition\n    }\n    return { index: null, offset: null }\n  }\n\n  findPositionAtIndexAndOffset(index, offset) {\n    let position = 0\n    for (let currentIndex = 0; currentIndex < this.objects.length; currentIndex++) {\n      const object = this.objects[currentIndex]\n      if (currentIndex < index) {\n        position += object.getLength()\n      } else if (currentIndex === index) {\n        position += offset\n        break\n      }\n    }\n    return position\n  }\n\n  getEndPosition() {\n    if (this.endPosition == null) {\n      this.endPosition = 0\n      this.objects.forEach((object) => this.endPosition += object.getLength())\n    }\n\n    return this.endPosition\n  }\n\n  toString() {\n    return this.objects.join(\"\")\n  }\n\n  toArray() {\n    return this.objects.slice(0)\n  }\n\n  toJSON() {\n    return this.toArray()\n  }\n\n  isEqualTo(splittableList) {\n    return super.isEqualTo(...arguments) || objectArraysAreEqual(this.objects, splittableList?.objects)\n  }\n\n  contentsForInspection() {\n    return {\n      objects: `[${this.objects.map((object) => object.inspect()).join(\", \")}]`,\n    }\n  }\n}\n\nconst objectArraysAreEqual = function(left, right = []) {\n  if (left.length !== right.length) {\n    return false\n  }\n  let result = true\n  for (let index = 0; index < left.length; index++) {\n    const object = left[index]\n    if (result && !object.isEqualTo(right[index])) {\n      result = false\n    }\n  }\n  return result\n}\n\nconst startOfRange = (range) => range[0]\n\nconst endOfRange = (range) => range[1]\n", "import TrixObject from \"trix/core/object\" // Don't override window.Object\n\nimport { getDirection } from \"trix/core/helpers\"\n\nimport Piece from \"trix/models/piece\"\nimport AttachmentPiece from \"trix/models/attachment_piece\"\nimport StringPiece from \"trix/models/string_piece\"\nimport SplittableList from \"trix/models/splittable_list\"\n\nimport Hash from \"trix/core/collections/hash\"\n\nexport default class Text extends TrixObject {\n  static textForAttachmentWithAttributes(attachment, attributes) {\n    const piece = new AttachmentPiece(attachment, attributes)\n    return new this([ piece ])\n  }\n\n  static textForStringWithAttributes(string, attributes) {\n    const piece = new StringPiece(string, attributes)\n    return new this([ piece ])\n  }\n\n  static fromJSON(textJSON) {\n    const pieces = Array.from(textJSON).map((pieceJSON) => Piece.fromJSON(pieceJSON))\n    return new this(pieces)\n  }\n\n  constructor(pieces = []) {\n    super(...arguments)\n    const notEmpty = pieces.filter((piece) => !piece.isEmpty())\n    this.pieceList = new SplittableList(notEmpty)\n  }\n\n  copy() {\n    return this.copyWithPieceList(this.pieceList)\n  }\n\n  copyWithPieceList(pieceList) {\n    return new this.constructor(pieceList.consolidate().toArray())\n  }\n\n  copyUsingObjectMap(objectMap) {\n    const pieces = this.getPieces().map((piece) => objectMap.find(piece) || piece)\n    return new this.constructor(pieces)\n  }\n\n  appendText(text) {\n    return this.insertTextAtPosition(text, this.getLength())\n  }\n\n  insertTextAtPosition(text, position) {\n    return this.copyWithPieceList(this.pieceList.insertSplittableListAtPosition(text.pieceList, position))\n  }\n\n  removeTextAtRange(range) {\n    return this.copyWithPieceList(this.pieceList.removeObjectsInRange(range))\n  }\n\n  replaceTextAtRange(text, range) {\n    return this.removeTextAtRange(range).insertTextAtPosition(text, range[0])\n  }\n\n  moveTextFromRangeToPosition(range, position) {\n    if (range[0] <= position && position <= range[1]) return\n    const text = this.getTextAtRange(range)\n    const length = text.getLength()\n    if (range[0] < position) {\n      position -= length\n    }\n    return this.removeTextAtRange(range).insertTextAtPosition(text, position)\n  }\n\n  addAttributeAtRange(attribute, value, range) {\n    const attributes = {}\n    attributes[attribute] = value\n    return this.addAttributesAtRange(attributes, range)\n  }\n\n  addAttributesAtRange(attributes, range) {\n    return this.copyWithPieceList(\n      this.pieceList.transformObjectsInRange(range, (piece) => piece.copyWithAdditionalAttributes(attributes))\n    )\n  }\n\n  removeAttributeAtRange(attribute, range) {\n    return this.copyWithPieceList(\n      this.pieceList.transformObjectsInRange(range, (piece) => piece.copyWithoutAttribute(attribute))\n    )\n  }\n\n  setAttributesAtRange(attributes, range) {\n    return this.copyWithPieceList(\n      this.pieceList.transformObjectsInRange(range, (piece) => piece.copyWithAttributes(attributes))\n    )\n  }\n\n  getAttributesAtPosition(position) {\n    return this.pieceList.getObjectAtPosition(position)?.getAttributes() || {}\n  }\n\n  getCommonAttributes() {\n    const objects = Array.from(this.pieceList.toArray()).map((piece) => piece.getAttributes())\n    return Hash.fromCommonAttributesOfObjects(objects).toObject()\n  }\n\n  getCommonAttributesAtRange(range) {\n    return this.getTextAtRange(range).getCommonAttributes() || {}\n  }\n\n  getExpandedRangeForAttributeAtOffset(attributeName, offset) {\n    let right\n    let left = right = offset\n    const length = this.getLength()\n\n    while (left > 0 && this.getCommonAttributesAtRange([ left - 1, right ])[attributeName]) {\n      left--\n    }\n    while (right < length && this.getCommonAttributesAtRange([ offset, right + 1 ])[attributeName]) {\n      right++\n    }\n\n    return [ left, right ]\n  }\n\n  getTextAtRange(range) {\n    return this.copyWithPieceList(this.pieceList.getSplittableListInRange(range))\n  }\n\n  getStringAtRange(range) {\n    return this.pieceList.getSplittableListInRange(range).toString()\n  }\n\n  getStringAtPosition(position) {\n    return this.getStringAtRange([ position, position + 1 ])\n  }\n\n  startsWithString(string) {\n    return this.getStringAtRange([ 0, string.length ]) === string\n  }\n\n  endsWithString(string) {\n    const length = this.getLength()\n    return this.getStringAtRange([ length - string.length, length ]) === string\n  }\n\n  getAttachmentPieces() {\n    return this.pieceList.toArray().filter((piece) => !!piece.attachment)\n  }\n\n  getAttachments() {\n    return this.getAttachmentPieces().map((piece) => piece.attachment)\n  }\n\n  getAttachmentAndPositionById(attachmentId) {\n    let position = 0\n    for (const piece of this.pieceList.toArray()) {\n      if (piece.attachment?.id === attachmentId) {\n        return { attachment: piece.attachment, position }\n      }\n      position += piece.length\n    }\n    return { attachment: null, position: null }\n  }\n\n  getAttachmentById(attachmentId) {\n    const { attachment } = this.getAttachmentAndPositionById(attachmentId)\n    return attachment\n  }\n\n  getRangeOfAttachment(attachment) {\n    const attachmentAndPosition = this.getAttachmentAndPositionById(attachment.id)\n    const position = attachmentAndPosition.position\n    attachment = attachmentAndPosition.attachment\n    if (attachment) {\n      return [ position, position + 1 ]\n    }\n  }\n\n  updateAttributesForAttachment(attributes, attachment) {\n    const range = this.getRangeOfAttachment(attachment)\n    if (range) {\n      return this.addAttributesAtRange(attributes, range)\n    } else {\n      return this\n    }\n  }\n\n  getLength() {\n    return this.pieceList.getEndPosition()\n  }\n\n  isEmpty() {\n    return this.getLength() === 0\n  }\n\n  isEqualTo(text) {\n    return super.isEqualTo(text) || text?.pieceList?.isEqualTo(this.pieceList)\n  }\n\n  isBlockBreak() {\n    return this.getLength() === 1 && this.pieceList.getObjectAtIndex(0).isBlockBreak()\n  }\n\n  eachPiece(callback) {\n    return this.pieceList.eachObject(callback)\n  }\n\n  getPieces() {\n    return this.pieceList.toArray()\n  }\n\n  getPieceAtPosition(position) {\n    return this.pieceList.getObjectAtPosition(position)\n  }\n\n  contentsForInspection() {\n    return { pieceList: this.pieceList.inspect() }\n  }\n\n  toSerializableText() {\n    const pieceList = this.pieceList.selectSplittableList((piece) => piece.isSerializable())\n    return this.copyWithPieceList(pieceList)\n  }\n\n  toString() {\n    return this.pieceList.toString()\n  }\n\n  toJSON() {\n    return this.pieceList.toJSON()\n  }\n\n  toConsole() {\n    return JSON.stringify(this.pieceList.toArray().map((piece) => JSON.parse(piece.toConsole())))\n  }\n\n  // BIDI\n\n  getDirection() {\n    return getDirection(this.toString())\n  }\n\n  isRTL() {\n    return this.getDirection() === \"rtl\"\n  }\n}\n", "import TrixObject from \"trix/core/object\" // Don't override window.Object\nimport Text from \"trix/models/text\"\n\nimport {\n  arraysAreEqual,\n  getBlockConfig,\n  getListAttributeNames,\n  objectsAreEqual,\n  spliceArray,\n} from \"trix/core/helpers\"\n\nexport default class Block extends TrixObject {\n  static fromJSON(blockJSON) {\n    const text = Text.fromJSON(blockJSON.text)\n    return new this(text, blockJSON.attributes, blockJSON.htmlAttributes)\n  }\n\n  constructor(text, attributes, htmlAttributes) {\n    super(...arguments)\n    this.text = applyBlockBreakToText(text || new Text())\n    this.attributes = attributes || []\n    this.htmlAttributes = htmlAttributes || {}\n  }\n\n  isEmpty() {\n    return this.text.isBlockBreak()\n  }\n\n  isEqualTo(block) {\n    if (super.isEqualTo(block)) return true\n\n    return this.text.isEqualTo(block?.text) && arraysAreEqual(this.attributes, block?.attributes) && objectsAreEqual(this.htmlAttributes, block?.htmlAttributes)\n  }\n\n  copyWithText(text) {\n    return new Block(text, this.attributes, this.htmlAttributes)\n  }\n\n  copyWithoutText() {\n    return this.copyWithText(null)\n  }\n\n  copyWithAttributes(attributes) {\n    return new Block(this.text, attributes, this.htmlAttributes)\n  }\n\n  copyWithoutAttributes() {\n    return this.copyWithAttributes(null)\n  }\n\n  copyUsingObjectMap(objectMap) {\n    const mappedText = objectMap.find(this.text)\n    if (mappedText) {\n      return this.copyWithText(mappedText)\n    } else {\n      return this.copyWithText(this.text.copyUsingObjectMap(objectMap))\n    }\n  }\n\n  addAttribute(attribute) {\n    const attributes = this.attributes.concat(expandAttribute(attribute))\n    return this.copyWithAttributes(attributes)\n  }\n\n  addHTMLAttribute(attribute, value) {\n    const htmlAttributes = Object.assign({}, this.htmlAttributes, { [attribute]: value })\n    return new Block(this.text, this.attributes, htmlAttributes)\n  }\n\n  removeAttribute(attribute) {\n    const { listAttribute } = getBlockConfig(attribute)\n    const attributes = removeLastValue(removeLastValue(this.attributes, attribute), listAttribute)\n    return this.copyWithAttributes(attributes)\n  }\n\n  removeLastAttribute() {\n    return this.removeAttribute(this.getLastAttribute())\n  }\n\n  getLastAttribute() {\n    return getLastElement(this.attributes)\n  }\n\n  getAttributes() {\n    return this.attributes.slice(0)\n  }\n\n  getAttributeLevel() {\n    return this.attributes.length\n  }\n\n  getAttributeAtLevel(level) {\n    return this.attributes[level - 1]\n  }\n\n  hasAttribute(attributeName) {\n    return this.attributes.includes(attributeName)\n  }\n\n  hasAttributes() {\n    return this.getAttributeLevel() > 0\n  }\n\n  getLastNestableAttribute() {\n    return getLastElement(this.getNestableAttributes())\n  }\n\n  getNestableAttributes() {\n    return this.attributes.filter((attribute) => getBlockConfig(attribute).nestable)\n  }\n\n  getNestingLevel() {\n    return this.getNestableAttributes().length\n  }\n\n  decreaseNestingLevel() {\n    const attribute = this.getLastNestableAttribute()\n    if (attribute) {\n      return this.removeAttribute(attribute)\n    } else {\n      return this\n    }\n  }\n\n  increaseNestingLevel() {\n    const attribute = this.getLastNestableAttribute()\n    if (attribute) {\n      const index = this.attributes.lastIndexOf(attribute)\n      const attributes = spliceArray(this.attributes, index + 1, 0, ...expandAttribute(attribute))\n      return this.copyWithAttributes(attributes)\n    } else {\n      return this\n    }\n  }\n\n  getListItemAttributes() {\n    return this.attributes.filter((attribute) => getBlockConfig(attribute).listAttribute)\n  }\n\n  isListItem() {\n    return getBlockConfig(this.getLastAttribute())?.listAttribute\n  }\n\n  isTerminalBlock() {\n    return getBlockConfig(this.getLastAttribute())?.terminal\n  }\n\n  breaksOnReturn() {\n    return getBlockConfig(this.getLastAttribute())?.breakOnReturn\n  }\n\n  findLineBreakInDirectionFromPosition(direction, position) {\n    const string = this.toString()\n    let result\n    switch (direction) {\n      case \"forward\":\n        result = string.indexOf(\"\\n\", position)\n        break\n      case \"backward\":\n        result = string.slice(0, position).lastIndexOf(\"\\n\")\n    }\n\n    if (result !== -1) {\n      return result\n    }\n  }\n\n  contentsForInspection() {\n    return {\n      text: this.text.inspect(),\n      attributes: this.attributes,\n    }\n  }\n\n  toString() {\n    return this.text.toString()\n  }\n\n  toJSON() {\n    return {\n      text: this.text,\n      attributes: this.attributes,\n      htmlAttributes: this.htmlAttributes,\n    }\n  }\n\n  // BIDI\n\n  getDirection() {\n    return this.text.getDirection()\n  }\n\n  isRTL() {\n    return this.text.isRTL()\n  }\n\n  // Splittable\n\n  getLength() {\n    return this.text.getLength()\n  }\n\n  canBeConsolidatedWith(block) {\n    return !this.hasAttributes() && !block.hasAttributes() && this.getDirection() === block.getDirection()\n  }\n\n  consolidateWith(block) {\n    const newlineText = Text.textForStringWithAttributes(\"\\n\")\n    const text = this.getTextWithoutBlockBreak().appendText(newlineText)\n    return this.copyWithText(text.appendText(block.text))\n  }\n\n  splitAtOffset(offset) {\n    let left, right\n    if (offset === 0) {\n      left = null\n      right = this\n    } else if (offset === this.getLength()) {\n      left = this\n      right = null\n    } else {\n      left = this.copyWithText(this.text.getTextAtRange([ 0, offset ]))\n      right = this.copyWithText(this.text.getTextAtRange([ offset, this.getLength() ]))\n    }\n    return [ left, right ]\n  }\n\n  getBlockBreakPosition() {\n    return this.text.getLength() - 1\n  }\n\n  getTextWithoutBlockBreak() {\n    if (textEndsInBlockBreak(this.text)) {\n      return this.text.getTextAtRange([ 0, this.getBlockBreakPosition() ])\n    } else {\n      return this.text.copy()\n    }\n  }\n\n  // Grouping\n\n  canBeGrouped(depth) {\n    return this.attributes[depth]\n  }\n\n  canBeGroupedWith(otherBlock, depth) {\n    const otherAttributes = otherBlock.getAttributes()\n    const otherAttribute = otherAttributes[depth]\n    const attribute = this.attributes[depth]\n\n    return (\n      attribute === otherAttribute &&\n      !(getBlockConfig(attribute).group === false && !getListAttributeNames().includes(otherAttributes[depth + 1])) &&\n      (this.getDirection() === otherBlock.getDirection() || otherBlock.isEmpty())\n    )\n  }\n}\n\n// Block breaks\n\nconst applyBlockBreakToText = function(text) {\n  text = unmarkExistingInnerBlockBreaksInText(text)\n  text = addBlockBreakToText(text)\n  return text\n}\n\nconst unmarkExistingInnerBlockBreaksInText = function(text) {\n  let modified = false\n  const pieces = text.getPieces()\n\n  let innerPieces = pieces.slice(0, pieces.length - 1)\n  const lastPiece = pieces[pieces.length - 1]\n\n  if (!lastPiece) return text\n\n  innerPieces = innerPieces.map((piece) => {\n    if (piece.isBlockBreak()) {\n      modified = true\n      return unmarkBlockBreakPiece(piece)\n    } else {\n      return piece\n    }\n  })\n\n  if (modified) {\n    return new Text([ ...innerPieces, lastPiece ])\n  } else {\n    return text\n  }\n}\n\nconst blockBreakText = Text.textForStringWithAttributes(\"\\n\", { blockBreak: true })\n\nconst addBlockBreakToText = function(text) {\n  if (textEndsInBlockBreak(text)) {\n    return text\n  } else {\n    return text.appendText(blockBreakText)\n  }\n}\n\nconst textEndsInBlockBreak = function(text) {\n  const length = text.getLength()\n  if (length === 0) {\n    return false\n  }\n  const endText = text.getTextAtRange([ length - 1, length ])\n  return endText.isBlockBreak()\n}\n\nconst unmarkBlockBreakPiece = (piece) => piece.copyWithoutAttribute(\"blockBreak\")\n\n// Attributes\n\nconst expandAttribute = function(attribute) {\n  const { listAttribute } = getBlockConfig(attribute)\n  if (listAttribute) {\n    return [ listAttribute, attribute ]\n  } else {\n    return [ attribute ]\n  }\n}\n\n// Array helpers\n\nconst getLastElement = (array) => array.slice(-1)[0]\n\nconst removeLastValue = function(array, value) {\n  const index = array.lastIndexOf(value)\n  if (index === -1) {\n    return array\n  } else {\n    return spliceArray(array, index, 1)\n  }\n}\n", "import * as config from \"trix/config\"\nimport TrixObject from \"trix/core/object\" // Don't override window.Object\n\nimport Text from \"trix/models/text\"\nimport Block from \"trix/models/block\"\nimport SplittableList from \"trix/models/splittable_list\"\nimport Hash from \"trix/core/collections/hash\"\nimport ObjectMap from \"trix/core/collections/object_map\"\n\nimport { arraysAreEqual, getBlockConfig, normalizeRange, rangeIsCollapsed } from \"trix/core/helpers\"\n\nexport default class Document extends TrixObject {\n  static fromJSON(documentJSON) {\n    const blocks = Array.from(documentJSON).map((blockJSON) => Block.fromJSON(blockJSON))\n    return new this(blocks)\n  }\n\n  static fromString(string, textAttributes) {\n    const text = Text.textForStringWithAttributes(string, textAttributes)\n    return new this([ new Block(text) ])\n  }\n\n  constructor(blocks = []) {\n    super(...arguments)\n    if (blocks.length === 0) {\n      blocks = [ new Block() ]\n    }\n    this.blockList = SplittableList.box(blocks)\n  }\n\n  isEmpty() {\n    const block = this.getBlockAtIndex(0)\n    return this.blockList.length === 1 && block.isEmpty() && !block.hasAttributes()\n  }\n\n  copy(options = {}) {\n    const blocks = options.consolidateBlocks ? this.blockList.consolidate().toArray() : this.blockList.toArray()\n\n    return new this.constructor(blocks)\n  }\n\n  copyUsingObjectsFromDocument(sourceDocument) {\n    const objectMap = new ObjectMap(sourceDocument.getObjects())\n    return this.copyUsingObjectMap(objectMap)\n  }\n\n  copyUsingObjectMap(objectMap) {\n    const blocks = this.getBlocks().map((block) => {\n      const mappedBlock = objectMap.find(block)\n      return mappedBlock || block.copyUsingObjectMap(objectMap)\n    })\n    return new this.constructor(blocks)\n  }\n\n  copyWithBaseBlockAttributes(blockAttributes = []) {\n    const blocks = this.getBlocks().map((block) => {\n      const attributes = blockAttributes.concat(block.getAttributes())\n      return block.copyWithAttributes(attributes)\n    })\n\n    return new this.constructor(blocks)\n  }\n\n  replaceBlock(oldBlock, newBlock) {\n    const index = this.blockList.indexOf(oldBlock)\n    if (index === -1) {\n      return this\n    }\n    return new this.constructor(this.blockList.replaceObjectAtIndex(newBlock, index))\n  }\n\n  insertDocumentAtRange(document, range) {\n    const { blockList } = document\n    range = normalizeRange(range)\n    let [ position ] = range\n    const { index, offset } = this.locationFromPosition(position)\n\n    let result = this\n    const block = this.getBlockAtPosition(position)\n\n    if (rangeIsCollapsed(range) && block.isEmpty() && !block.hasAttributes()) {\n      result = new this.constructor(result.blockList.removeObjectAtIndex(index))\n    } else if (block.getBlockBreakPosition() === offset) {\n      position++\n    }\n\n    result = result.removeTextAtRange(range)\n    return new this.constructor(result.blockList.insertSplittableListAtPosition(blockList, position))\n  }\n\n  mergeDocumentAtRange(document, range) {\n    let formattedDocument, result\n    range = normalizeRange(range)\n    const [ startPosition ] = range\n    const startLocation = this.locationFromPosition(startPosition)\n    const blockAttributes = this.getBlockAtIndex(startLocation.index).getAttributes()\n    const baseBlockAttributes = document.getBaseBlockAttributes()\n    const trailingBlockAttributes = blockAttributes.slice(-baseBlockAttributes.length)\n\n    if (arraysAreEqual(baseBlockAttributes, trailingBlockAttributes)) {\n      const leadingBlockAttributes = blockAttributes.slice(0, -baseBlockAttributes.length)\n      formattedDocument = document.copyWithBaseBlockAttributes(leadingBlockAttributes)\n    } else {\n      formattedDocument = document.copy({ consolidateBlocks: true }).copyWithBaseBlockAttributes(blockAttributes)\n    }\n\n    const blockCount = formattedDocument.getBlockCount()\n    const firstBlock = formattedDocument.getBlockAtIndex(0)\n\n    if (arraysAreEqual(blockAttributes, firstBlock.getAttributes())) {\n      const firstText = firstBlock.getTextWithoutBlockBreak()\n      result = this.insertTextAtRange(firstText, range)\n\n      if (blockCount > 1) {\n        formattedDocument = new this.constructor(formattedDocument.getBlocks().slice(1))\n        const position = startPosition + firstText.getLength()\n        result = result.insertDocumentAtRange(formattedDocument, position)\n      }\n    } else {\n      result = this.insertDocumentAtRange(formattedDocument, range)\n    }\n\n    return result\n  }\n\n  insertTextAtRange(text, range) {\n    range = normalizeRange(range)\n    const [ startPosition ] = range\n    const { index, offset } = this.locationFromPosition(startPosition)\n\n    const document = this.removeTextAtRange(range)\n    return new this.constructor(\n      document.blockList.editObjectAtIndex(index, (block) =>\n        block.copyWithText(block.text.insertTextAtPosition(text, offset))\n      )\n    )\n  }\n\n  removeTextAtRange(range) {\n    let blocks\n    range = normalizeRange(range)\n    const [ leftPosition, rightPosition ] = range\n    if (rangeIsCollapsed(range)) {\n      return this\n    }\n    const [ leftLocation, rightLocation ] = Array.from(this.locationRangeFromRange(range))\n\n    const leftIndex = leftLocation.index\n    const leftOffset = leftLocation.offset\n    const leftBlock = this.getBlockAtIndex(leftIndex)\n\n    const rightIndex = rightLocation.index\n    const rightOffset = rightLocation.offset\n    const rightBlock = this.getBlockAtIndex(rightIndex)\n\n    const removeRightNewline =\n      rightPosition - leftPosition === 1 &&\n      leftBlock.getBlockBreakPosition() === leftOffset &&\n      rightBlock.getBlockBreakPosition() !== rightOffset &&\n      rightBlock.text.getStringAtPosition(rightOffset) === \"\\n\"\n\n    if (removeRightNewline) {\n      blocks = this.blockList.editObjectAtIndex(rightIndex, (block) =>\n        block.copyWithText(block.text.removeTextAtRange([ rightOffset, rightOffset + 1 ]))\n      )\n    } else {\n      let block\n      const leftText = leftBlock.text.getTextAtRange([ 0, leftOffset ])\n      const rightText = rightBlock.text.getTextAtRange([ rightOffset, rightBlock.getLength() ])\n      const text = leftText.appendText(rightText)\n\n      const removingLeftBlock = leftIndex !== rightIndex && leftOffset === 0\n      const useRightBlock = removingLeftBlock && leftBlock.getAttributeLevel() >= rightBlock.getAttributeLevel()\n\n      if (useRightBlock) {\n        block = rightBlock.copyWithText(text)\n      } else {\n        block = leftBlock.copyWithText(text)\n      }\n\n      const affectedBlockCount = rightIndex + 1 - leftIndex\n      blocks = this.blockList.splice(leftIndex, affectedBlockCount, block)\n    }\n\n    return new this.constructor(blocks)\n  }\n\n  moveTextFromRangeToPosition(range, position) {\n    let text\n    range = normalizeRange(range)\n    const [ startPosition, endPosition ] = range\n    if (startPosition <= position && position <= endPosition) {\n      return this\n    }\n\n    let document = this.getDocumentAtRange(range)\n    let result = this.removeTextAtRange(range)\n\n    const movingRightward = startPosition < position\n    if (movingRightward) {\n      position -= document.getLength()\n    }\n\n    const [ firstBlock, ...blocks ] = document.getBlocks()\n    if (blocks.length === 0) {\n      text = firstBlock.getTextWithoutBlockBreak()\n      if (movingRightward) {\n        position += 1\n      }\n    } else {\n      text = firstBlock.text\n    }\n\n    result = result.insertTextAtRange(text, position)\n    if (blocks.length === 0) {\n      return result\n    }\n\n    document = new this.constructor(blocks)\n    position += text.getLength()\n\n    return result.insertDocumentAtRange(document, position)\n  }\n\n  addAttributeAtRange(attribute, value, range) {\n    let { blockList } = this\n    this.eachBlockAtRange(\n      range,\n      (block, textRange, index) =>\n        blockList = blockList.editObjectAtIndex(index, function() {\n          if (getBlockConfig(attribute)) {\n            return block.addAttribute(attribute, value)\n          } else {\n            if (textRange[0] === textRange[1]) {\n              return block\n            } else {\n              return block.copyWithText(block.text.addAttributeAtRange(attribute, value, textRange))\n            }\n          }\n        })\n    )\n    return new this.constructor(blockList)\n  }\n\n  addAttribute(attribute, value) {\n    let { blockList } = this\n    this.eachBlock(\n      (block, index) => blockList = blockList.editObjectAtIndex(index, () => block.addAttribute(attribute, value))\n    )\n    return new this.constructor(blockList)\n  }\n\n  removeAttributeAtRange(attribute, range) {\n    let { blockList } = this\n    this.eachBlockAtRange(range, function(block, textRange, index) {\n      if (getBlockConfig(attribute)) {\n        blockList = blockList.editObjectAtIndex(index, () => block.removeAttribute(attribute))\n      } else if (textRange[0] !== textRange[1]) {\n        blockList = blockList.editObjectAtIndex(index, () =>\n          block.copyWithText(block.text.removeAttributeAtRange(attribute, textRange))\n        )\n      }\n    })\n    return new this.constructor(blockList)\n  }\n\n  updateAttributesForAttachment(attributes, attachment) {\n    const range = this.getRangeOfAttachment(attachment)\n    const [ startPosition ] = Array.from(range)\n    const { index } = this.locationFromPosition(startPosition)\n    const text = this.getTextAtIndex(index)\n\n    return new this.constructor(\n      this.blockList.editObjectAtIndex(index, (block) =>\n        block.copyWithText(text.updateAttributesForAttachment(attributes, attachment))\n      )\n    )\n  }\n\n  removeAttributeForAttachment(attribute, attachment) {\n    const range = this.getRangeOfAttachment(attachment)\n    return this.removeAttributeAtRange(attribute, range)\n  }\n\n  setHTMLAttributeAtPosition(position, name, value) {\n    const block = this.getBlockAtPosition(position)\n    const updatedBlock = block.addHTMLAttribute(name, value)\n    return this.replaceBlock(block, updatedBlock)\n  }\n\n  insertBlockBreakAtRange(range) {\n    let blocks\n    range = normalizeRange(range)\n    const [ startPosition ] = range\n    const { offset } = this.locationFromPosition(startPosition)\n\n    const document = this.removeTextAtRange(range)\n    if (offset === 0) {\n      blocks = [ new Block() ]\n    }\n    return new this.constructor(\n      document.blockList.insertSplittableListAtPosition(new SplittableList(blocks), startPosition)\n    )\n  }\n\n  applyBlockAttributeAtRange(attributeName, value, range) {\n    const expanded = this.expandRangeToLineBreaksAndSplitBlocks(range)\n    let document = expanded.document\n    range = expanded.range\n    const blockConfig = getBlockConfig(attributeName)\n\n    if (blockConfig.listAttribute) {\n      document = document.removeLastListAttributeAtRange(range, { exceptAttributeName: attributeName })\n      const converted = document.convertLineBreaksToBlockBreaksInRange(range)\n      document = converted.document\n      range = converted.range\n    } else if (blockConfig.exclusive) {\n      document = document.removeBlockAttributesAtRange(range)\n    } else if (blockConfig.terminal) {\n      document = document.removeLastTerminalAttributeAtRange(range)\n    } else {\n      document = document.consolidateBlocksAtRange(range)\n    }\n\n    return document.addAttributeAtRange(attributeName, value, range)\n  }\n\n  removeLastListAttributeAtRange(range, options = {}) {\n    let { blockList } = this\n    this.eachBlockAtRange(range, function(block, textRange, index) {\n      const lastAttributeName = block.getLastAttribute()\n      if (!lastAttributeName) {\n        return\n      }\n      if (!getBlockConfig(lastAttributeName).listAttribute) {\n        return\n      }\n      if (lastAttributeName === options.exceptAttributeName) {\n        return\n      }\n      blockList = blockList.editObjectAtIndex(index, () => block.removeAttribute(lastAttributeName))\n    })\n    return new this.constructor(blockList)\n  }\n\n  removeLastTerminalAttributeAtRange(range) {\n    let { blockList } = this\n    this.eachBlockAtRange(range, function(block, textRange, index) {\n      const lastAttributeName = block.getLastAttribute()\n      if (!lastAttributeName) {\n        return\n      }\n      if (!getBlockConfig(lastAttributeName).terminal) {\n        return\n      }\n      blockList = blockList.editObjectAtIndex(index, () => block.removeAttribute(lastAttributeName))\n    })\n    return new this.constructor(blockList)\n  }\n\n  removeBlockAttributesAtRange(range) {\n    let { blockList } = this\n    this.eachBlockAtRange(range, function(block, textRange, index) {\n      if (block.hasAttributes()) {\n        blockList = blockList.editObjectAtIndex(index, () => block.copyWithoutAttributes())\n      }\n    })\n    return new this.constructor(blockList)\n  }\n\n  expandRangeToLineBreaksAndSplitBlocks(range) {\n    let position\n    range = normalizeRange(range)\n    let [ startPosition, endPosition ] = range\n    const startLocation = this.locationFromPosition(startPosition)\n    const endLocation = this.locationFromPosition(endPosition)\n    let document = this\n\n    const startBlock = document.getBlockAtIndex(startLocation.index)\n    startLocation.offset = startBlock.findLineBreakInDirectionFromPosition(\"backward\", startLocation.offset)\n    if (startLocation.offset != null) {\n      position = document.positionFromLocation(startLocation)\n      document = document.insertBlockBreakAtRange([ position, position + 1 ])\n      endLocation.index += 1\n      endLocation.offset -= document.getBlockAtIndex(startLocation.index).getLength()\n      startLocation.index += 1\n    }\n    startLocation.offset = 0\n\n    if (endLocation.offset === 0 && endLocation.index > startLocation.index) {\n      endLocation.index -= 1\n      endLocation.offset = document.getBlockAtIndex(endLocation.index).getBlockBreakPosition()\n    } else {\n      const endBlock = document.getBlockAtIndex(endLocation.index)\n      if (endBlock.text.getStringAtRange([ endLocation.offset - 1, endLocation.offset ]) === \"\\n\") {\n        endLocation.offset -= 1\n      } else {\n        endLocation.offset = endBlock.findLineBreakInDirectionFromPosition(\"forward\", endLocation.offset)\n      }\n      if (endLocation.offset !== endBlock.getBlockBreakPosition()) {\n        position = document.positionFromLocation(endLocation)\n        document = document.insertBlockBreakAtRange([ position, position + 1 ])\n      }\n    }\n\n    startPosition = document.positionFromLocation(startLocation)\n    endPosition = document.positionFromLocation(endLocation)\n    range = normalizeRange([ startPosition, endPosition ])\n\n    return { document, range }\n  }\n\n  convertLineBreaksToBlockBreaksInRange(range) {\n    range = normalizeRange(range)\n    let [ position ] = range\n    const string = this.getStringAtRange(range).slice(0, -1)\n    let document = this\n\n    string.replace(/.*?\\n/g, function(match) {\n      position += match.length\n      document = document.insertBlockBreakAtRange([ position - 1, position ])\n    })\n\n    return { document, range }\n  }\n\n  consolidateBlocksAtRange(range) {\n    range = normalizeRange(range)\n    const [ startPosition, endPosition ] = range\n    const startIndex = this.locationFromPosition(startPosition).index\n    const endIndex = this.locationFromPosition(endPosition).index\n    return new this.constructor(this.blockList.consolidateFromIndexToIndex(startIndex, endIndex))\n  }\n\n  getDocumentAtRange(range) {\n    range = normalizeRange(range)\n    const blocks = this.blockList.getSplittableListInRange(range).toArray()\n    return new this.constructor(blocks)\n  }\n\n  getStringAtRange(range) {\n    let endIndex\n    const array = range = normalizeRange(range),\n      endPosition = array[array.length - 1]\n    if (endPosition !== this.getLength()) {\n      endIndex = -1\n    }\n    return this.getDocumentAtRange(range).toString().slice(0, endIndex)\n  }\n\n  getBlockAtIndex(index) {\n    return this.blockList.getObjectAtIndex(index)\n  }\n\n  getBlockAtPosition(position) {\n    const { index } = this.locationFromPosition(position)\n    return this.getBlockAtIndex(index)\n  }\n\n  getTextAtIndex(index) {\n    return this.getBlockAtIndex(index)?.text\n  }\n\n  getTextAtPosition(position) {\n    const { index } = this.locationFromPosition(position)\n    return this.getTextAtIndex(index)\n  }\n\n  getPieceAtPosition(position) {\n    const { index, offset } = this.locationFromPosition(position)\n    return this.getTextAtIndex(index).getPieceAtPosition(offset)\n  }\n\n  getCharacterAtPosition(position) {\n    const { index, offset } = this.locationFromPosition(position)\n    return this.getTextAtIndex(index).getStringAtRange([ offset, offset + 1 ])\n  }\n\n  getLength() {\n    return this.blockList.getEndPosition()\n  }\n\n  getBlocks() {\n    return this.blockList.toArray()\n  }\n\n  getBlockCount() {\n    return this.blockList.length\n  }\n\n  getEditCount() {\n    return this.editCount\n  }\n\n  eachBlock(callback) {\n    return this.blockList.eachObject(callback)\n  }\n\n  eachBlockAtRange(range, callback) {\n    let block, textRange\n    range = normalizeRange(range)\n    const [ startPosition, endPosition ] = range\n    const startLocation = this.locationFromPosition(startPosition)\n    const endLocation = this.locationFromPosition(endPosition)\n\n    if (startLocation.index === endLocation.index) {\n      block = this.getBlockAtIndex(startLocation.index)\n      textRange = [ startLocation.offset, endLocation.offset ]\n      return callback(block, textRange, startLocation.index)\n    } else {\n      for (let index = startLocation.index; index <= endLocation.index; index++) {\n        block = this.getBlockAtIndex(index)\n        if (block) {\n          switch (index) {\n            case startLocation.index:\n              textRange = [ startLocation.offset, block.text.getLength() ]\n              break\n            case endLocation.index:\n              textRange = [ 0, endLocation.offset ]\n              break\n            default:\n              textRange = [ 0, block.text.getLength() ]\n          }\n          callback(block, textRange, index)\n        }\n      }\n    }\n  }\n\n  getCommonAttributesAtRange(range) {\n    range = normalizeRange(range)\n    const [ startPosition ] = range\n    if (rangeIsCollapsed(range)) {\n      return this.getCommonAttributesAtPosition(startPosition)\n    } else {\n      const textAttributes = []\n      const blockAttributes = []\n\n      this.eachBlockAtRange(range, function(block, textRange) {\n        if (textRange[0] !== textRange[1]) {\n          textAttributes.push(block.text.getCommonAttributesAtRange(textRange))\n          return blockAttributes.push(attributesForBlock(block))\n        }\n      })\n\n      return Hash.fromCommonAttributesOfObjects(textAttributes)\n        .merge(Hash.fromCommonAttributesOfObjects(blockAttributes))\n        .toObject()\n    }\n  }\n\n  getCommonAttributesAtPosition(position) {\n    let key, value\n    const { index, offset } = this.locationFromPosition(position)\n    const block = this.getBlockAtIndex(index)\n    if (!block) {\n      return {}\n    }\n\n    const commonAttributes = attributesForBlock(block)\n    const attributes = block.text.getAttributesAtPosition(offset)\n    const attributesLeft = block.text.getAttributesAtPosition(offset - 1)\n    const inheritableAttributes = Object.keys(config.textAttributes).filter((key) => {\n      return config.textAttributes[key].inheritable\n    })\n\n    for (key in attributesLeft) {\n      value = attributesLeft[key]\n      if (value === attributes[key] || inheritableAttributes.includes(key)) {\n        commonAttributes[key] = value\n      }\n    }\n\n    return commonAttributes\n  }\n\n  getRangeOfCommonAttributeAtPosition(attributeName, position) {\n    const { index, offset } = this.locationFromPosition(position)\n    const text = this.getTextAtIndex(index)\n    const [ startOffset, endOffset ] = Array.from(text.getExpandedRangeForAttributeAtOffset(attributeName, offset))\n\n    const start = this.positionFromLocation({ index, offset: startOffset })\n    const end = this.positionFromLocation({ index, offset: endOffset })\n    return normalizeRange([ start, end ])\n  }\n\n  getBaseBlockAttributes() {\n    let baseBlockAttributes = this.getBlockAtIndex(0).getAttributes()\n\n    for (let blockIndex = 1; blockIndex < this.getBlockCount(); blockIndex++) {\n      const blockAttributes = this.getBlockAtIndex(blockIndex).getAttributes()\n      const lastAttributeIndex = Math.min(baseBlockAttributes.length, blockAttributes.length)\n\n      baseBlockAttributes = (() => {\n        const result = []\n        for (let index = 0; index < lastAttributeIndex; index++) {\n          if (blockAttributes[index] !== baseBlockAttributes[index]) {\n            break\n          }\n          result.push(blockAttributes[index])\n        }\n        return result\n      })()\n    }\n\n    return baseBlockAttributes\n  }\n\n  getAttachmentById(attachmentId) {\n    for (const attachment of this.getAttachments()) {\n      if (attachment.id === attachmentId) {\n        return attachment\n      }\n    }\n  }\n\n  getAttachmentPieces() {\n    let attachmentPieces = []\n    this.blockList.eachObject(({ text }) => attachmentPieces = attachmentPieces.concat(text.getAttachmentPieces()))\n    return attachmentPieces\n  }\n\n  getAttachments() {\n    return this.getAttachmentPieces().map((piece) => piece.attachment)\n  }\n\n  getRangeOfAttachment(attachment) {\n    let position = 0\n    const iterable = this.blockList.toArray()\n    for (let index = 0; index < iterable.length; index++) {\n      const { text } = iterable[index]\n      const textRange = text.getRangeOfAttachment(attachment)\n      if (textRange) {\n        return normalizeRange([ position + textRange[0], position + textRange[1] ])\n      }\n      position += text.getLength()\n    }\n  }\n\n  getLocationRangeOfAttachment(attachment) {\n    const range = this.getRangeOfAttachment(attachment)\n    return this.locationRangeFromRange(range)\n  }\n\n  getAttachmentPieceForAttachment(attachment) {\n    for (const piece of this.getAttachmentPieces()) {\n      if (piece.attachment === attachment) {\n        return piece\n      }\n    }\n  }\n\n  findRangesForBlockAttribute(attributeName) {\n    let position = 0\n    const ranges = []\n\n    this.getBlocks().forEach((block) => {\n      const length = block.getLength()\n      if (block.hasAttribute(attributeName)) {\n        ranges.push([ position, position + length ])\n      }\n      position += length\n    })\n\n    return ranges\n  }\n\n  findRangesForTextAttribute(attributeName, { withValue } = {}) {\n    let position = 0\n    let range = []\n    const ranges = []\n\n    const match = function(piece) {\n      if (withValue) {\n        return piece.getAttribute(attributeName) === withValue\n      } else {\n        return piece.hasAttribute(attributeName)\n      }\n    }\n\n    this.getPieces().forEach((piece) => {\n      const length = piece.getLength()\n      if (match(piece)) {\n        if (range[1] === position) {\n          range[1] = position + length\n        } else {\n          ranges.push(range = [ position, position + length ])\n        }\n      }\n      position += length\n    })\n\n    return ranges\n  }\n\n  locationFromPosition(position) {\n    const location = this.blockList.findIndexAndOffsetAtPosition(Math.max(0, position))\n    if (location.index != null) {\n      return location\n    } else {\n      const blocks = this.getBlocks()\n      return { index: blocks.length - 1, offset: blocks[blocks.length - 1].getLength() }\n    }\n  }\n\n  positionFromLocation(location) {\n    return this.blockList.findPositionAtIndexAndOffset(location.index, location.offset)\n  }\n\n  locationRangeFromPosition(position) {\n    return normalizeRange(this.locationFromPosition(position))\n  }\n\n  locationRangeFromRange(range) {\n    range = normalizeRange(range)\n    if (!range) return\n\n    const [ startPosition, endPosition ] = Array.from(range)\n    const startLocation = this.locationFromPosition(startPosition)\n    const endLocation = this.locationFromPosition(endPosition)\n    return normalizeRange([ startLocation, endLocation ])\n  }\n\n  rangeFromLocationRange(locationRange) {\n    let rightPosition\n    locationRange = normalizeRange(locationRange)\n    const leftPosition = this.positionFromLocation(locationRange[0])\n    if (!rangeIsCollapsed(locationRange)) {\n      rightPosition = this.positionFromLocation(locationRange[1])\n    }\n    return normalizeRange([ leftPosition, rightPosition ])\n  }\n\n  isEqualTo(document) {\n    return this.blockList.isEqualTo(document?.blockList)\n  }\n\n  getTexts() {\n    return this.getBlocks().map((block) => block.text)\n  }\n\n  getPieces() {\n    const pieces = []\n\n    Array.from(this.getTexts()).forEach((text) => {\n      pieces.push(...Array.from(text.getPieces() || []))\n    })\n\n    return pieces\n  }\n\n  getObjects() {\n    return this.getBlocks().concat(this.getTexts()).concat(this.getPieces())\n  }\n\n  toSerializableDocument() {\n    const blocks = []\n    this.blockList.eachObject((block) => blocks.push(block.copyWithText(block.text.toSerializableText())))\n    return new this.constructor(blocks)\n  }\n\n  toString() {\n    return this.blockList.toString()\n  }\n\n  toJSON() {\n    return this.blockList.toJSON()\n  }\n\n  toConsole() {\n    return JSON.stringify(this.blockList.toArray().map((block) => JSON.parse(block.text.toConsole())))\n  }\n}\n\nconst attributesForBlock = function(block) {\n  const attributes = {}\n  const attributeName = block.getLastAttribute()\n  if (attributeName) {\n    attributes[attributeName] = true\n  }\n  return attributes\n}\n", "/* eslint-disable\n    no-case-declarations,\n    no-irregular-whitespace,\n*/\nimport * as config from \"trix/config\"\nimport BasicObject from \"trix/core/basic_object\"\nimport Document from \"trix/models/document\"\nimport HTMLSanitizer from \"trix/models/html_sanitizer\"\n\nimport {\n  arraysAreEqual,\n  breakableWhitespacePattern,\n  elementContainsNode,\n  findClosestElementFromNode,\n  getBlockTagNames,\n  makeElement,\n  nodeIsAttachmentElement,\n  normalizeSpaces,\n  removeNode,\n  squishBreakableWhitespace,\n  tagName,\n  walkTree,\n} from \"trix/core/helpers\"\n\nconst pieceForString = (string, attributes = {}) => {\n  const type = \"string\"\n  string = normalizeSpaces(string)\n  return { string, attributes, type }\n}\n\nconst pieceForAttachment = (attachment, attributes = {}) => {\n  const type = \"attachment\"\n  return { attachment, attributes, type }\n}\n\nconst blockForAttributes = (attributes = {}, htmlAttributes = {}) => {\n  const text = []\n  return { text, attributes, htmlAttributes }\n}\n\nconst parseTrixDataAttribute = (element, name) => {\n  try {\n    return JSON.parse(element.getAttribute(`data-trix-${name}`))\n  } catch (error) {\n    return {}\n  }\n}\n\nconst getImageDimensions = (element) => {\n  const width = element.getAttribute(\"width\")\n  const height = element.getAttribute(\"height\")\n  const dimensions = {}\n  if (width) {\n    dimensions.width = parseInt(width, 10)\n  }\n  if (height) {\n    dimensions.height = parseInt(height, 10)\n  }\n  return dimensions\n}\n\nexport default class HTMLParser extends BasicObject {\n  static parse(html, options) {\n    const parser = new this(html, options)\n    parser.parse()\n    return parser\n  }\n\n  constructor(html, { referenceElement, purifyOptions } = {}) {\n    super(...arguments)\n    this.html = html\n    this.referenceElement = referenceElement\n    this.purifyOptions = purifyOptions\n    this.blocks = []\n    this.blockElements = []\n    this.processedElements = []\n  }\n\n  getDocument() {\n    return Document.fromJSON(this.blocks)\n  }\n\n  // HTML parsing\n\n  parse() {\n    try {\n      this.createHiddenContainer()\n      HTMLSanitizer.setHTML(this.containerElement, this.html, { purifyOptions: this.purifyOptions })\n      const walker = walkTree(this.containerElement, { usingFilter: nodeFilter })\n      while (walker.nextNode()) {\n        this.processNode(walker.currentNode)\n      }\n      return this.translateBlockElementMarginsToNewlines()\n    } finally {\n      this.removeHiddenContainer()\n    }\n  }\n\n  createHiddenContainer() {\n    if (this.referenceElement) {\n      this.containerElement = this.referenceElement.cloneNode(false)\n      this.containerElement.removeAttribute(\"id\")\n      this.containerElement.setAttribute(\"data-trix-internal\", \"\")\n      this.containerElement.style.display = \"none\"\n      return this.referenceElement.parentNode.insertBefore(this.containerElement, this.referenceElement.nextSibling)\n    } else {\n      this.containerElement = makeElement({ tagName: \"div\", style: { display: \"none\" } })\n      return document.body.appendChild(this.containerElement)\n    }\n  }\n\n  removeHiddenContainer() {\n    return removeNode(this.containerElement)\n  }\n\n  processNode(node) {\n    switch (node.nodeType) {\n      case Node.TEXT_NODE:\n        if (!this.isInsignificantTextNode(node)) {\n          this.appendBlockForTextNode(node)\n          return this.processTextNode(node)\n        }\n        break\n      case Node.ELEMENT_NODE:\n        this.appendBlockForElement(node)\n        return this.processElement(node)\n    }\n  }\n\n  appendBlockForTextNode(node) {\n    const element = node.parentNode\n    if (element === this.currentBlockElement && this.isBlockElement(node.previousSibling)) {\n      return this.appendStringWithAttributes(\"\\n\")\n    } else if (element === this.containerElement || this.isBlockElement(element)) {\n      const attributes = this.getBlockAttributes(element)\n      const htmlAttributes = this.getBlockHTMLAttributes(element)\n      if (!arraysAreEqual(attributes, this.currentBlock?.attributes)) {\n        this.currentBlock = this.appendBlockForAttributesWithElement(attributes, element, htmlAttributes)\n        this.currentBlockElement = element\n      }\n    }\n  }\n\n  appendBlockForElement(element) {\n    const elementIsBlockElement = this.isBlockElement(element)\n    const currentBlockContainsElement = elementContainsNode(this.currentBlockElement, element)\n\n    if (elementIsBlockElement && !this.isBlockElement(element.firstChild)) {\n      if (!this.isInsignificantTextNode(element.firstChild) || !this.isBlockElement(element.firstElementChild)) {\n        const attributes = this.getBlockAttributes(element)\n        const htmlAttributes = this.getBlockHTMLAttributes(element)\n        if (element.firstChild) {\n          if (!(currentBlockContainsElement && arraysAreEqual(attributes, this.currentBlock.attributes))) {\n            this.currentBlock = this.appendBlockForAttributesWithElement(attributes, element, htmlAttributes)\n            this.currentBlockElement = element\n          } else {\n            return this.appendStringWithAttributes(\"\\n\")\n          }\n        }\n      }\n    } else if (this.currentBlockElement && !currentBlockContainsElement && !elementIsBlockElement) {\n      const parentBlockElement = this.findParentBlockElement(element)\n      if (parentBlockElement) {\n        return this.appendBlockForElement(parentBlockElement)\n      } else {\n        this.currentBlock = this.appendEmptyBlock()\n        this.currentBlockElement = null\n      }\n    }\n  }\n\n  findParentBlockElement(element) {\n    let { parentElement } = element\n    while (parentElement && parentElement !== this.containerElement) {\n      if (this.isBlockElement(parentElement) && this.blockElements.includes(parentElement)) {\n        return parentElement\n      } else {\n        parentElement = parentElement.parentElement\n      }\n    }\n    return null\n  }\n\n  processTextNode(node) {\n    let string = node.data\n    if (!elementCanDisplayPreformattedText(node.parentNode)) {\n      string = squishBreakableWhitespace(string)\n      if (stringEndsWithWhitespace(node.previousSibling?.textContent)) {\n        string = leftTrimBreakableWhitespace(string)\n      }\n    }\n    return this.appendStringWithAttributes(string, this.getTextAttributes(node.parentNode))\n  }\n\n  processElement(element) {\n    let attributes\n    if (nodeIsAttachmentElement(element)) {\n      attributes = parseTrixDataAttribute(element, \"attachment\")\n      if (Object.keys(attributes).length) {\n        const textAttributes = this.getTextAttributes(element)\n        this.appendAttachmentWithAttributes(attributes, textAttributes)\n        // We have everything we need so avoid processing inner nodes\n        element.innerHTML = \"\"\n      }\n      return this.processedElements.push(element)\n    } else {\n      switch (tagName(element)) {\n        case \"br\":\n          if (!this.isExtraBR(element) && !this.isBlockElement(element.nextSibling)) {\n            this.appendStringWithAttributes(\"\\n\", this.getTextAttributes(element))\n          }\n          return this.processedElements.push(element)\n        case \"img\":\n          attributes = { url: element.getAttribute(\"src\"), contentType: \"image\" }\n          const object = getImageDimensions(element)\n          for (const key in object) {\n            const value = object[key]\n            attributes[key] = value\n          }\n          this.appendAttachmentWithAttributes(attributes, this.getTextAttributes(element))\n          return this.processedElements.push(element)\n        case \"tr\":\n          if (this.needsTableSeparator(element)) {\n            return this.appendStringWithAttributes(config.parser.tableRowSeparator)\n          }\n          break\n        case \"td\":\n          if (this.needsTableSeparator(element)) {\n            return this.appendStringWithAttributes(config.parser.tableCellSeparator)\n          }\n          break\n      }\n    }\n  }\n\n  // Document construction\n\n  appendBlockForAttributesWithElement(attributes, element, htmlAttributes = {}) {\n    this.blockElements.push(element)\n    const block = blockForAttributes(attributes, htmlAttributes)\n    this.blocks.push(block)\n    return block\n  }\n\n  appendEmptyBlock() {\n    return this.appendBlockForAttributesWithElement([], null)\n  }\n\n  appendStringWithAttributes(string, attributes) {\n    return this.appendPiece(pieceForString(string, attributes))\n  }\n\n  appendAttachmentWithAttributes(attachment, attributes) {\n    return this.appendPiece(pieceForAttachment(attachment, attributes))\n  }\n\n  appendPiece(piece) {\n    if (this.blocks.length === 0) {\n      this.appendEmptyBlock()\n    }\n    return this.blocks[this.blocks.length - 1].text.push(piece)\n  }\n\n  appendStringToTextAtIndex(string, index) {\n    const { text } = this.blocks[index]\n    const piece = text[text.length - 1]\n\n    if (piece?.type === \"string\") {\n      piece.string += string\n    } else {\n      return text.push(pieceForString(string))\n    }\n  }\n\n  prependStringToTextAtIndex(string, index) {\n    const { text } = this.blocks[index]\n    const piece = text[0]\n\n    if (piece?.type === \"string\") {\n      piece.string = string + piece.string\n    } else {\n      return text.unshift(pieceForString(string))\n    }\n  }\n\n  // Attribute parsing\n\n  getTextAttributes(element) {\n    let value\n    const attributes = {}\n    for (const attribute in config.textAttributes) {\n      const configAttr = config.textAttributes[attribute]\n      if (\n        configAttr.tagName &&\n        findClosestElementFromNode(element, {\n          matchingSelector: configAttr.tagName,\n          untilNode: this.containerElement,\n        })\n      ) {\n        attributes[attribute] = true\n      } else if (configAttr.parser) {\n        value = configAttr.parser(element)\n        if (value) {\n          let attributeInheritedFromBlock = false\n          for (const blockElement of this.findBlockElementAncestors(element)) {\n            if (configAttr.parser(blockElement) === value) {\n              attributeInheritedFromBlock = true\n              break\n            }\n          }\n          if (!attributeInheritedFromBlock) {\n            attributes[attribute] = value\n          }\n        }\n      } else if (configAttr.styleProperty) {\n        value = element.style[configAttr.styleProperty]\n        if (value) {\n          attributes[attribute] = value\n        }\n      }\n    }\n\n    if (nodeIsAttachmentElement(element)) {\n      const object = parseTrixDataAttribute(element, \"attributes\")\n      for (const key in object) {\n        value = object[key]\n        attributes[key] = value\n      }\n    }\n\n    return attributes\n  }\n\n  getBlockAttributes(element) {\n    const attributes = []\n    while (element && element !== this.containerElement) {\n      for (const attribute in config.blockAttributes) {\n        const attrConfig = config.blockAttributes[attribute]\n        if (attrConfig.parse !== false) {\n          if (tagName(element) === attrConfig.tagName) {\n            if (attrConfig.test?.(element) || !attrConfig.test) {\n              attributes.push(attribute)\n              if (attrConfig.listAttribute) {\n                attributes.push(attrConfig.listAttribute)\n              }\n            }\n          }\n        }\n      }\n      element = element.parentNode\n    }\n    return attributes.reverse()\n  }\n\n  getBlockHTMLAttributes(element) {\n    const attributes = {}\n    const blockConfig = Object.values(config.blockAttributes).find(settings => settings.tagName === tagName(element))\n    const allowedAttributes = blockConfig?.htmlAttributes || []\n\n    allowedAttributes.forEach((attribute) => {\n      if (element.hasAttribute(attribute)) {\n        attributes[attribute] = element.getAttribute(attribute)\n      }\n    })\n\n    return attributes\n  }\n\n  findBlockElementAncestors(element) {\n    const ancestors = []\n    while (element && element !== this.containerElement) {\n      const tag = tagName(element)\n      if (getBlockTagNames().includes(tag)) {\n        ancestors.push(element)\n      }\n      element = element.parentNode\n    }\n    return ancestors\n  }\n\n  // Element inspection\n\n  isBlockElement(element) {\n    if (element?.nodeType !== Node.ELEMENT_NODE) return\n    if (nodeIsAttachmentElement(element)) return\n    if (findClosestElementFromNode(element, { matchingSelector: \"td\", untilNode: this.containerElement })) return\n\n    return getBlockTagNames().includes(tagName(element)) ||\n      window.getComputedStyle(element).display === \"block\"\n  }\n\n  isInsignificantTextNode(node) {\n    if (node?.nodeType !== Node.TEXT_NODE) return\n    if (!stringIsAllBreakableWhitespace(node.data)) return\n    const { parentNode, previousSibling, nextSibling } = node\n    if (nodeEndsWithNonWhitespace(parentNode.previousSibling) && !this.isBlockElement(parentNode.previousSibling)) return\n    if (elementCanDisplayPreformattedText(parentNode)) return\n    return !previousSibling || this.isBlockElement(previousSibling) || !nextSibling || this.isBlockElement(nextSibling)\n  }\n\n  isExtraBR(element) {\n    return tagName(element) === \"br\" && this.isBlockElement(element.parentNode) && element.parentNode.lastChild === element\n  }\n\n  needsTableSeparator(element) {\n    if (config.parser.removeBlankTableCells) {\n      const content = element.previousSibling?.textContent\n      return content && /\\S/.test(content)\n    } else {\n      return element.previousSibling\n    }\n  }\n\n  // Margin translation\n\n  translateBlockElementMarginsToNewlines() {\n    const defaultMargin = this.getMarginOfDefaultBlockElement()\n\n    for (let index = 0; index < this.blocks.length; index++) {\n      const margin = this.getMarginOfBlockElementAtIndex(index)\n      if (margin) {\n        if (margin.top > defaultMargin.top * 2) {\n          this.prependStringToTextAtIndex(\"\\n\", index)\n        }\n\n        if (margin.bottom > defaultMargin.bottom * 2) {\n          this.appendStringToTextAtIndex(\"\\n\", index)\n        }\n      }\n    }\n  }\n\n  getMarginOfBlockElementAtIndex(index) {\n    const element = this.blockElements[index]\n    if (element) {\n      if (element.textContent) {\n        if (!getBlockTagNames().includes(tagName(element)) && !this.processedElements.includes(element)) {\n          return getBlockElementMargin(element)\n        }\n      }\n    }\n  }\n\n  getMarginOfDefaultBlockElement() {\n    const element = makeElement(config.blockAttributes.default.tagName)\n    this.containerElement.appendChild(element)\n    return getBlockElementMargin(element)\n  }\n}\n\n// Helpers\n\nconst elementCanDisplayPreformattedText = function(element) {\n  const { whiteSpace } = window.getComputedStyle(element)\n  return [ \"pre\", \"pre-wrap\", \"pre-line\" ].includes(whiteSpace)\n}\n\nconst nodeEndsWithNonWhitespace = (node) => node && !stringEndsWithWhitespace(node.textContent)\n\nconst getBlockElementMargin = function(element) {\n  const style = window.getComputedStyle(element)\n  if (style.display === \"block\") {\n    return { top: parseInt(style.marginTop), bottom: parseInt(style.marginBottom) }\n  }\n}\n\nconst nodeFilter = function(node) {\n  if (tagName(node) === \"style\") {\n    return NodeFilter.FILTER_REJECT\n  } else {\n    return NodeFilter.FILTER_ACCEPT\n  }\n}\n\n// Whitespace\n\nconst leftTrimBreakableWhitespace = (string) => string.replace(new RegExp(`^${breakableWhitespacePattern.source}+`), \"\")\n\nconst stringIsAllBreakableWhitespace = (string) => new RegExp(`^${breakableWhitespacePattern.source}*$`).test(string)\n\nconst stringEndsWithWhitespace = (string) => /\\s$/.test(string)\n", "/* eslint-disable\n    no-empty,\n*/\nimport { removeNode } from \"trix/core/helpers\"\n\nimport DocumentView from \"trix/views/document_view\"\nimport Document from \"trix/models/document\"\nimport HTMLParser from \"trix/models/html_parser\"\n\nconst unserializableElementSelector = \"[data-trix-serialize=false]\"\nconst unserializableAttributeNames = [\n  \"contenteditable\",\n  \"data-trix-id\",\n  \"data-trix-store-key\",\n  \"data-trix-mutable\",\n  \"data-trix-placeholder\",\n  \"tabindex\",\n]\nconst serializedAttributesAttribute = \"data-trix-serialized-attributes\"\nconst serializedAttributesSelector = `[${serializedAttributesAttribute}]`\n\nconst blockCommentPattern = new RegExp(\"<!--block-->\", \"g\")\n\nconst serializers = {\n  \"application/json\": function(serializable) {\n    let document\n    if (serializable instanceof Document) {\n      document = serializable\n    } else if (serializable instanceof HTMLElement) {\n      document = HTMLParser.parse(serializable.innerHTML).getDocument()\n    } else {\n      throw new Error(\"unserializable object\")\n    }\n\n    return document.toSerializableDocument().toJSONString()\n  },\n\n  \"text/html\": function(serializable) {\n    let element\n    if (serializable instanceof Document) {\n      element = DocumentView.render(serializable)\n    } else if (serializable instanceof HTMLElement) {\n      element = serializable.cloneNode(true)\n    } else {\n      throw new Error(\"unserializable object\")\n    }\n\n    // Remove unserializable elements\n    Array.from(element.querySelectorAll(unserializableElementSelector)).forEach((el) => {\n      removeNode(el)\n    })\n\n    // Remove unserializable attributes\n    unserializableAttributeNames.forEach((attribute) => {\n      Array.from(element.querySelectorAll(`[${attribute}]`)).forEach((el) => {\n        el.removeAttribute(attribute)\n      })\n    })\n\n    // Rewrite elements with serialized attribute overrides\n    Array.from(element.querySelectorAll(serializedAttributesSelector)).forEach((el) => {\n      try {\n        const attributes = JSON.parse(el.getAttribute(serializedAttributesAttribute))\n        el.removeAttribute(serializedAttributesAttribute)\n        for (const name in attributes) {\n          const value = attributes[name]\n          el.setAttribute(name, value)\n        }\n      } catch (error) {}\n    })\n\n    return element.innerHTML.replace(blockCommentPattern, \"\")\n  },\n}\n\nconst deserializers = {\n  \"application/json\": function(string) {\n    return Document.fromJSONString(string)\n  },\n\n  \"text/html\": function(string) {\n    return HTMLParser.parse(string).getDocument()\n  },\n}\n\nexport const serializeToContentType = function(serializable, contentType) {\n  const serializer = serializers[contentType]\n  if (serializer) {\n    return serializer(serializable)\n  } else {\n    throw new Error(`unknown content type: ${contentType}`)\n  }\n}\n\nexport const deserializeFromContentType = function(string, contentType) {\n  const deserializer = deserializers[contentType]\n  if (deserializer) {\n    return deserializer(string)\n  } else {\n    throw new Error(`unknown content type: ${contentType}`)\n  }\n}\n", "import \"trix/models/attachment\"\nimport BasicObject from \"trix/core/basic_object\"\n\nexport default class ManagedAttachment extends BasicObject {\n  constructor(attachmentManager, attachment) {\n    super(...arguments)\n    this.attachmentManager = attachmentManager\n    this.attachment = attachment\n    this.id = this.attachment.id\n    this.file = this.attachment.file\n  }\n\n  remove() {\n    return this.attachmentManager.requestRemovalOfAttachment(this.attachment)\n  }\n}\n\nManagedAttachment.proxyMethod(\"attachment.getAttribute\")\nManagedAttachment.proxyMethod(\"attachment.hasAttribute\")\nManagedAttachment.proxyMethod(\"attachment.setAttribute\")\nManagedAttachment.proxyMethod(\"attachment.getAttributes\")\nManagedAttachment.proxyMethod(\"attachment.setAttributes\")\nManagedAttachment.proxyMethod(\"attachment.isPending\")\nManagedAttachment.proxyMethod(\"attachment.isPreviewable\")\nManagedAttachment.proxyMethod(\"attachment.getURL\")\nManagedAttachment.proxyMethod(\"attachment.getPreviewURL\")\nManagedAttachment.proxyMethod(\"attachment.setPreviewURL\")\nManagedAttachment.proxyMethod(\"attachment.getHref\")\nManagedAttachment.proxyMethod(\"attachment.getFilename\")\nManagedAttachment.proxyMethod(\"attachment.getFilesize\")\nManagedAttachment.proxyMethod(\"attachment.getFormattedFilesize\")\nManagedAttachment.proxyMethod(\"attachment.getExtension\")\nManagedAttachment.proxyMethod(\"attachment.getContentType\")\nManagedAttachment.proxyMethod(\"attachment.getFile\")\nManagedAttachment.proxyMethod(\"attachment.setFile\")\nManagedAttachment.proxyMethod(\"attachment.releaseFile\")\nManagedAttachment.proxyMethod(\"attachment.getUploadProgress\")\nManagedAttachment.proxyMethod(\"attachment.setUploadProgress\")\n\n", "import ManagedAttachment from \"trix/models/managed_attachment\"\nimport BasicObject from \"trix/core/basic_object\"\n\nexport default class AttachmentManager extends BasicObject {\n  constructor(attachments = []) {\n    super(...arguments)\n    this.managedAttachments = {}\n    Array.from(attachments).forEach((attachment) => {\n      this.manageAttachment(attachment)\n    })\n  }\n\n  getAttachments() {\n    const result = []\n    for (const id in this.managedAttachments) {\n      const attachment = this.managedAttachments[id]\n      result.push(attachment)\n    }\n    return result\n  }\n\n  manageAttachment(attachment) {\n    if (!this.managedAttachments[attachment.id]) {\n      this.managedAttachments[attachment.id] = new ManagedAttachment(this, attachment)\n    }\n    return this.managedAttachments[attachment.id]\n  }\n\n  attachmentIsManaged(attachment) {\n    return attachment.id in this.managedAttachments\n  }\n\n  requestRemovalOfAttachment(attachment) {\n    if (this.attachmentIsManaged(attachment)) {\n      return this.delegate?.attachmentManagerDidRequestRemovalOfAttachment?.(attachment)\n    }\n  }\n\n  unmanageAttachment(attachment) {\n    const managedAttachment = this.managedAttachments[attachment.id]\n    delete this.managedAttachments[attachment.id]\n    return managedAttachment\n  }\n}\n", "export default class LineBreakInsertion {\n  constructor(composition) {\n    this.composition = composition\n    this.document = this.composition.document\n    const selectedRange = this.composition.getSelectedRange()\n    this.startPosition = selectedRange[0]\n    this.endPosition = selectedRange[1]\n\n    this.startLocation = this.document.locationFromPosition(this.startPosition)\n    this.endLocation = this.document.locationFromPosition(this.endPosition)\n\n    this.block = this.document.getBlockAtIndex(this.endLocation.index)\n    this.breaksOnReturn = this.block.breaksOnReturn()\n    this.previousCharacter = this.block.text.getStringAtPosition(this.endLocation.offset - 1)\n    this.nextCharacter = this.block.text.getStringAtPosition(this.endLocation.offset)\n  }\n\n  shouldInsertBlockBreak() {\n    if (this.block.hasAttributes() && this.block.isListItem() && !this.block.isEmpty()) {\n      return this.startLocation.offset !== 0\n    } else {\n      return this.breaksOnReturn && this.nextCharacter !== \"\\n\"\n    }\n  }\n\n  shouldBreakFormattedBlock() {\n    return (\n      this.block.hasAttributes() &&\n      !this.block.isListItem() &&\n      (this.breaksOnReturn && this.nextCharacter === \"\\n\" || this.previousCharacter === \"\\n\")\n    )\n  }\n\n  shouldDecreaseListLevel() {\n    return this.block.hasAttributes() && this.block.isListItem() && this.block.isEmpty()\n  }\n\n  shouldPrependListItem() {\n    return this.block.isListItem() && this.startLocation.offset === 0 && !this.block.isEmpty()\n  }\n\n  shouldRemoveLastBlockAttribute() {\n    return this.block.hasAttributes() && !this.block.isListItem() && this.block.isEmpty()\n  }\n}\n", "import * as config from \"trix/config\"\nimport { OBJECT_REPLACEMENT_CHARACTER } from \"trix/constants\"\n\nimport BasicObject from \"trix/core/basic_object\"\nimport Text from \"trix/models/text\"\nimport Block from \"trix/models/block\"\nimport Attachment from \"trix/models/attachment\"\nimport Document from \"trix/models/document\"\nimport HTMLParser from \"trix/models/html_parser\"\nimport LineBreakInsertion from \"trix/models/line_break_insertion\"\n\nimport {\n  arrayStartsWith,\n  extend,\n  getAllAttributeNames,\n  getBlockConfig,\n  getTextConfig,\n  normalizeRange,\n  objectsAreEqual,\n  rangeIsCollapsed,\n  rangesAreEqual,\n  summarizeArrayChange,\n} from \"trix/core/helpers\"\n\nconst PLACEHOLDER = \" \"\n\nexport default class Composition extends BasicObject {\n  constructor() {\n    super(...arguments)\n    this.document = new Document()\n    this.attachments = []\n    this.currentAttributes = {}\n    this.revision = 0\n  }\n\n  setDocument(document) {\n    if (!document.isEqualTo(this.document)) {\n      this.document = document\n      this.refreshAttachments()\n      this.revision++\n      return this.delegate?.compositionDidChangeDocument?.(document)\n    }\n  }\n\n  // Snapshots\n\n  getSnapshot() {\n    return {\n      document: this.document,\n      selectedRange: this.getSelectedRange(),\n    }\n  }\n\n  loadSnapshot({ document, selectedRange }) {\n    this.delegate?.compositionWillLoadSnapshot?.()\n    this.setDocument(document != null ? document : new Document())\n    this.setSelection(selectedRange != null ? selectedRange : [ 0, 0 ])\n    return this.delegate?.compositionDidLoadSnapshot?.()\n  }\n\n  // Responder protocol\n\n  insertText(text, { updatePosition } = { updatePosition: true }) {\n    const selectedRange = this.getSelectedRange()\n    this.setDocument(this.document.insertTextAtRange(text, selectedRange))\n\n    const startPosition = selectedRange[0]\n    const endPosition = startPosition + text.getLength()\n\n    if (updatePosition) {\n      this.setSelection(endPosition)\n    }\n    return this.notifyDelegateOfInsertionAtRange([ startPosition, endPosition ])\n  }\n\n  insertBlock(block = new Block()) {\n    const document = new Document([ block ])\n    return this.insertDocument(document)\n  }\n\n  insertDocument(document = new Document()) {\n    const selectedRange = this.getSelectedRange()\n    this.setDocument(this.document.insertDocumentAtRange(document, selectedRange))\n\n    const startPosition = selectedRange[0]\n    const endPosition = startPosition + document.getLength()\n\n    this.setSelection(endPosition)\n    return this.notifyDelegateOfInsertionAtRange([ startPosition, endPosition ])\n  }\n\n  insertString(string, options) {\n    const attributes = this.getCurrentTextAttributes()\n    const text = Text.textForStringWithAttributes(string, attributes)\n    return this.insertText(text, options)\n  }\n\n  insertBlockBreak() {\n    const selectedRange = this.getSelectedRange()\n    this.setDocument(this.document.insertBlockBreakAtRange(selectedRange))\n\n    const startPosition = selectedRange[0]\n    const endPosition = startPosition + 1\n\n    this.setSelection(endPosition)\n    return this.notifyDelegateOfInsertionAtRange([ startPosition, endPosition ])\n  }\n\n  insertLineBreak() {\n    const insertion = new LineBreakInsertion(this)\n\n    if (insertion.shouldDecreaseListLevel()) {\n      this.decreaseListLevel()\n      return this.setSelection(insertion.startPosition)\n    } else if (insertion.shouldPrependListItem()) {\n      const document = new Document([ insertion.block.copyWithoutText() ])\n      return this.insertDocument(document)\n    } else if (insertion.shouldInsertBlockBreak()) {\n      return this.insertBlockBreak()\n    } else if (insertion.shouldRemoveLastBlockAttribute()) {\n      return this.removeLastBlockAttribute()\n    } else if (insertion.shouldBreakFormattedBlock()) {\n      return this.breakFormattedBlock(insertion)\n    } else {\n      return this.insertString(\"\\n\")\n    }\n  }\n\n  insertHTML(html) {\n    const document = HTMLParser.parse(html, { purifyOptions: { SAFE_FOR_XML: true } }).getDocument()\n    const selectedRange = this.getSelectedRange()\n\n    this.setDocument(this.document.mergeDocumentAtRange(document, selectedRange))\n\n    const startPosition = selectedRange[0]\n    const endPosition = startPosition + document.getLength() - 1\n\n    this.setSelection(endPosition)\n    return this.notifyDelegateOfInsertionAtRange([ startPosition, endPosition ])\n  }\n\n  replaceHTML(html) {\n    const document = HTMLParser.parse(html).getDocument().copyUsingObjectsFromDocument(this.document)\n    const locationRange = this.getLocationRange({ strict: false })\n    const selectedRange = this.document.rangeFromLocationRange(locationRange)\n    this.setDocument(document)\n    return this.setSelection(selectedRange)\n  }\n\n  insertFile(file) {\n    return this.insertFiles([ file ])\n  }\n\n  insertFiles(files) {\n    const attachments = []\n\n    Array.from(files).forEach((file) => {\n      if (this.delegate?.compositionShouldAcceptFile(file)) {\n        const attachment = Attachment.attachmentForFile(file)\n        attachments.push(attachment)\n      }\n    })\n\n    return this.insertAttachments(attachments)\n  }\n\n  insertAttachment(attachment) {\n    return this.insertAttachments([ attachment ])\n  }\n\n  insertAttachments(attachments) {\n    let text = new Text()\n\n    Array.from(attachments).forEach((attachment) => {\n      const type = attachment.getType()\n      const presentation = config.attachments[type]?.presentation\n\n      const attributes = this.getCurrentTextAttributes()\n      if (presentation) {\n        attributes.presentation = presentation\n      }\n\n      const attachmentText = Text.textForAttachmentWithAttributes(attachment, attributes)\n      text = text.appendText(attachmentText)\n    })\n\n    return this.insertText(text)\n  }\n\n  shouldManageDeletingInDirection(direction) {\n    const locationRange = this.getLocationRange()\n    if (rangeIsCollapsed(locationRange)) {\n      if (direction === \"backward\" && locationRange[0].offset === 0) {\n        return true\n      }\n      if (this.shouldManageMovingCursorInDirection(direction)) {\n        return true\n      }\n    } else {\n      if (locationRange[0].index !== locationRange[1].index) {\n        return true\n      }\n    }\n    return false\n  }\n\n  deleteInDirection(direction, { length } = {}) {\n    let attachment, deletingIntoPreviousBlock, selectionSpansBlocks\n    const locationRange = this.getLocationRange()\n    let range = this.getSelectedRange()\n    const selectionIsCollapsed = rangeIsCollapsed(range)\n\n    if (selectionIsCollapsed) {\n      deletingIntoPreviousBlock = direction === \"backward\" && locationRange[0].offset === 0\n    } else {\n      selectionSpansBlocks = locationRange[0].index !== locationRange[1].index\n    }\n\n    if (deletingIntoPreviousBlock) {\n      if (this.canDecreaseBlockAttributeLevel()) {\n        const block = this.getBlock()\n\n        if (block.isListItem()) {\n          this.decreaseListLevel()\n        } else {\n          this.decreaseBlockAttributeLevel()\n        }\n\n        this.setSelection(range[0])\n        if (block.isEmpty()) {\n          return false\n        }\n      }\n    }\n\n    if (selectionIsCollapsed) {\n      range = this.getExpandedRangeInDirection(direction, { length })\n      if (direction === \"backward\") {\n        attachment = this.getAttachmentAtRange(range)\n      }\n    }\n\n    if (attachment) {\n      this.editAttachment(attachment)\n      return false\n    } else {\n      this.setDocument(this.document.removeTextAtRange(range))\n      this.setSelection(range[0])\n      if (deletingIntoPreviousBlock || selectionSpansBlocks) {\n        return false\n      }\n    }\n  }\n\n  moveTextFromRange(range) {\n    const [ position ] = Array.from(this.getSelectedRange())\n    this.setDocument(this.document.moveTextFromRangeToPosition(range, position))\n    return this.setSelection(position)\n  }\n\n  removeAttachment(attachment) {\n    const range = this.document.getRangeOfAttachment(attachment)\n    if (range) {\n      this.stopEditingAttachment()\n      this.setDocument(this.document.removeTextAtRange(range))\n      return this.setSelection(range[0])\n    }\n  }\n\n  removeLastBlockAttribute() {\n    const [ startPosition, endPosition ] = Array.from(this.getSelectedRange())\n    const block = this.document.getBlockAtPosition(endPosition)\n    this.removeCurrentAttribute(block.getLastAttribute())\n    return this.setSelection(startPosition)\n  }\n\n  insertPlaceholder() {\n    this.placeholderPosition = this.getPosition()\n    return this.insertString(PLACEHOLDER)\n  }\n\n  selectPlaceholder() {\n    if (this.placeholderPosition != null) {\n      this.setSelectedRange([ this.placeholderPosition, this.placeholderPosition + PLACEHOLDER.length ])\n      return this.getSelectedRange()\n    }\n  }\n\n  forgetPlaceholder() {\n    this.placeholderPosition = null\n  }\n\n  // Current attributes\n\n  hasCurrentAttribute(attributeName) {\n    const value = this.currentAttributes[attributeName]\n    return value != null && value !== false\n  }\n\n  toggleCurrentAttribute(attributeName) {\n    const value = !this.currentAttributes[attributeName]\n    if (value) {\n      return this.setCurrentAttribute(attributeName, value)\n    } else {\n      return this.removeCurrentAttribute(attributeName)\n    }\n  }\n\n  canSetCurrentAttribute(attributeName) {\n    if (getBlockConfig(attributeName)) {\n      return this.canSetCurrentBlockAttribute(attributeName)\n    } else {\n      return this.canSetCurrentTextAttribute(attributeName)\n    }\n  }\n\n  canSetCurrentTextAttribute(attributeName) {\n    const document = this.getSelectedDocument()\n    if (!document) return\n    for (const attachment of Array.from(document.getAttachments())) {\n      if (!attachment.hasContent()) {\n        return false\n      }\n    }\n    return true\n  }\n\n  canSetCurrentBlockAttribute(attributeName) {\n    const block = this.getBlock()\n    if (!block) return\n    return !block.isTerminalBlock()\n  }\n\n  setCurrentAttribute(attributeName, value) {\n    if (getBlockConfig(attributeName)) {\n      return this.setBlockAttribute(attributeName, value)\n    } else {\n      this.setTextAttribute(attributeName, value)\n      this.currentAttributes[attributeName] = value\n      return this.notifyDelegateOfCurrentAttributesChange()\n    }\n  }\n\n  setHTMLAtributeAtPosition(position, attributeName, value) {\n    const block = this.document.getBlockAtPosition(position)\n    const allowedHTMLAttributes = getBlockConfig(block.getLastAttribute())?.htmlAttributes\n\n    if (block && allowedHTMLAttributes?.includes(attributeName)) {\n      const newDocument = this.document.setHTMLAttributeAtPosition(position, attributeName, value)\n      this.setDocument(newDocument)\n    }\n  }\n\n  setTextAttribute(attributeName, value) {\n    const selectedRange = this.getSelectedRange()\n    if (!selectedRange) return\n\n    const [ startPosition, endPosition ] = Array.from(selectedRange)\n    if (startPosition === endPosition) {\n      if (attributeName === \"href\") {\n        const text = Text.textForStringWithAttributes(value, { href: value })\n        return this.insertText(text)\n      }\n    } else {\n      return this.setDocument(this.document.addAttributeAtRange(attributeName, value, selectedRange))\n    }\n  }\n\n  setBlockAttribute(attributeName, value) {\n    const selectedRange = this.getSelectedRange()\n    if (this.canSetCurrentAttribute(attributeName)) {\n      this.setDocument(this.document.applyBlockAttributeAtRange(attributeName, value, selectedRange))\n      return this.setSelection(selectedRange)\n    }\n  }\n\n  removeCurrentAttribute(attributeName) {\n    if (getBlockConfig(attributeName)) {\n      this.removeBlockAttribute(attributeName)\n      return this.updateCurrentAttributes()\n    } else {\n      this.removeTextAttribute(attributeName)\n      delete this.currentAttributes[attributeName]\n      return this.notifyDelegateOfCurrentAttributesChange()\n    }\n  }\n\n  removeTextAttribute(attributeName) {\n    const selectedRange = this.getSelectedRange()\n    if (!selectedRange) return\n    return this.setDocument(this.document.removeAttributeAtRange(attributeName, selectedRange))\n  }\n\n  removeBlockAttribute(attributeName) {\n    const selectedRange = this.getSelectedRange()\n    if (!selectedRange) return\n    return this.setDocument(this.document.removeAttributeAtRange(attributeName, selectedRange))\n  }\n\n  canDecreaseNestingLevel() {\n    return this.getBlock()?.getNestingLevel() > 0\n  }\n\n  canIncreaseNestingLevel() {\n    const block = this.getBlock()\n    if (!block) return\n    if (getBlockConfig(block.getLastNestableAttribute())?.listAttribute) {\n      const previousBlock = this.getPreviousBlock()\n      if (previousBlock) {\n        return arrayStartsWith(previousBlock.getListItemAttributes(), block.getListItemAttributes())\n      }\n    } else {\n      return block.getNestingLevel() > 0\n    }\n  }\n\n  decreaseNestingLevel() {\n    const block = this.getBlock()\n    if (!block) return\n    return this.setDocument(this.document.replaceBlock(block, block.decreaseNestingLevel()))\n  }\n\n  increaseNestingLevel() {\n    const block = this.getBlock()\n    if (!block) return\n    return this.setDocument(this.document.replaceBlock(block, block.increaseNestingLevel()))\n  }\n\n  canDecreaseBlockAttributeLevel() {\n    return this.getBlock()?.getAttributeLevel() > 0\n  }\n\n  decreaseBlockAttributeLevel() {\n    const attribute = this.getBlock()?.getLastAttribute()\n    if (attribute) {\n      return this.removeCurrentAttribute(attribute)\n    }\n  }\n\n  decreaseListLevel() {\n    let [ startPosition ] = Array.from(this.getSelectedRange())\n    const { index } = this.document.locationFromPosition(startPosition)\n    let endIndex = index\n    const attributeLevel = this.getBlock().getAttributeLevel()\n\n    let block = this.document.getBlockAtIndex(endIndex + 1)\n    while (block) {\n      if (!block.isListItem() || block.getAttributeLevel() <= attributeLevel) {\n        break\n      }\n      endIndex++\n      block = this.document.getBlockAtIndex(endIndex + 1)\n    }\n\n    startPosition = this.document.positionFromLocation({ index, offset: 0 })\n    const endPosition = this.document.positionFromLocation({ index: endIndex, offset: 0 })\n    return this.setDocument(this.document.removeLastListAttributeAtRange([ startPosition, endPosition ]))\n  }\n\n  updateCurrentAttributes() {\n    const selectedRange = this.getSelectedRange({ ignoreLock: true })\n    if (selectedRange) {\n      const currentAttributes = this.document.getCommonAttributesAtRange(selectedRange)\n\n      Array.from(getAllAttributeNames()).forEach((attributeName) => {\n        if (!currentAttributes[attributeName]) {\n          if (!this.canSetCurrentAttribute(attributeName)) {\n            currentAttributes[attributeName] = false\n          }\n        }\n      })\n\n      if (!objectsAreEqual(currentAttributes, this.currentAttributes)) {\n        this.currentAttributes = currentAttributes\n        return this.notifyDelegateOfCurrentAttributesChange()\n      }\n    }\n  }\n\n  getCurrentAttributes() {\n    return extend.call({}, this.currentAttributes)\n  }\n\n  getCurrentTextAttributes() {\n    const attributes = {}\n    for (const key in this.currentAttributes) {\n      const value = this.currentAttributes[key]\n      if (value !== false) {\n        if (getTextConfig(key)) {\n          attributes[key] = value\n        }\n      }\n    }\n    return attributes\n  }\n\n  // Selection freezing\n\n  freezeSelection() {\n    return this.setCurrentAttribute(\"frozen\", true)\n  }\n\n  thawSelection() {\n    return this.removeCurrentAttribute(\"frozen\")\n  }\n\n  hasFrozenSelection() {\n    return this.hasCurrentAttribute(\"frozen\")\n  }\n\n  setSelection(selectedRange) {\n    const locationRange = this.document.locationRangeFromRange(selectedRange)\n    return this.delegate?.compositionDidRequestChangingSelectionToLocationRange(locationRange)\n  }\n\n  getSelectedRange() {\n    const locationRange = this.getLocationRange()\n    if (locationRange) {\n      return this.document.rangeFromLocationRange(locationRange)\n    }\n  }\n\n  setSelectedRange(selectedRange) {\n    const locationRange = this.document.locationRangeFromRange(selectedRange)\n    return this.getSelectionManager().setLocationRange(locationRange)\n  }\n\n  getPosition() {\n    const locationRange = this.getLocationRange()\n    if (locationRange) {\n      return this.document.positionFromLocation(locationRange[0])\n    }\n  }\n\n  getLocationRange(options) {\n    if (this.targetLocationRange) {\n      return this.targetLocationRange\n    } else {\n      return this.getSelectionManager().getLocationRange(options) || normalizeRange({ index: 0, offset: 0 })\n    }\n  }\n\n  withTargetLocationRange(locationRange, fn) {\n    let result\n    this.targetLocationRange = locationRange\n    try {\n      result = fn()\n    } finally {\n      this.targetLocationRange = null\n    }\n    return result\n  }\n\n  withTargetRange(range, fn) {\n    const locationRange = this.document.locationRangeFromRange(range)\n    return this.withTargetLocationRange(locationRange, fn)\n  }\n\n  withTargetDOMRange(domRange, fn) {\n    const locationRange = this.createLocationRangeFromDOMRange(domRange, { strict: false })\n    return this.withTargetLocationRange(locationRange, fn)\n  }\n\n  getExpandedRangeInDirection(direction, { length } = {}) {\n    let [ startPosition, endPosition ] = Array.from(this.getSelectedRange())\n    if (direction === \"backward\") {\n      if (length) {\n        startPosition -= length\n      } else {\n        startPosition = this.translateUTF16PositionFromOffset(startPosition, -1)\n      }\n    } else {\n      if (length) {\n        endPosition += length\n      } else {\n        endPosition = this.translateUTF16PositionFromOffset(endPosition, 1)\n      }\n    }\n    return normalizeRange([ startPosition, endPosition ])\n  }\n\n  shouldManageMovingCursorInDirection(direction) {\n    if (this.editingAttachment) {\n      return true\n    }\n    const range = this.getExpandedRangeInDirection(direction)\n    return this.getAttachmentAtRange(range) != null\n  }\n\n  moveCursorInDirection(direction) {\n    let canEditAttachment, range\n    if (this.editingAttachment) {\n      range = this.document.getRangeOfAttachment(this.editingAttachment)\n    } else {\n      const selectedRange = this.getSelectedRange()\n      range = this.getExpandedRangeInDirection(direction)\n      canEditAttachment = !rangesAreEqual(selectedRange, range)\n    }\n\n    if (direction === \"backward\") {\n      this.setSelectedRange(range[0])\n    } else {\n      this.setSelectedRange(range[1])\n    }\n\n    if (canEditAttachment) {\n      const attachment = this.getAttachmentAtRange(range)\n      if (attachment) {\n        return this.editAttachment(attachment)\n      }\n    }\n  }\n\n  expandSelectionInDirection(direction, { length } = {}) {\n    const range = this.getExpandedRangeInDirection(direction, { length })\n    return this.setSelectedRange(range)\n  }\n\n  expandSelectionForEditing() {\n    if (this.hasCurrentAttribute(\"href\")) {\n      return this.expandSelectionAroundCommonAttribute(\"href\")\n    }\n  }\n\n  expandSelectionAroundCommonAttribute(attributeName) {\n    const position = this.getPosition()\n    const range = this.document.getRangeOfCommonAttributeAtPosition(attributeName, position)\n    return this.setSelectedRange(range)\n  }\n\n  selectionContainsAttachments() {\n    return this.getSelectedAttachments()?.length > 0\n  }\n\n  selectionIsInCursorTarget() {\n    return this.editingAttachment || this.positionIsCursorTarget(this.getPosition())\n  }\n\n  positionIsCursorTarget(position) {\n    const location = this.document.locationFromPosition(position)\n    if (location) {\n      return this.locationIsCursorTarget(location)\n    }\n  }\n\n  positionIsBlockBreak(position) {\n    return this.document.getPieceAtPosition(position)?.isBlockBreak()\n  }\n\n  getSelectedDocument() {\n    const selectedRange = this.getSelectedRange()\n    if (selectedRange) {\n      return this.document.getDocumentAtRange(selectedRange)\n    }\n  }\n\n  getSelectedAttachments() {\n    return this.getSelectedDocument()?.getAttachments()\n  }\n\n  // Attachments\n\n  getAttachments() {\n    return this.attachments.slice(0)\n  }\n\n  refreshAttachments() {\n    const attachments = this.document.getAttachments()\n    const { added, removed } = summarizeArrayChange(this.attachments, attachments)\n    this.attachments = attachments\n\n    Array.from(removed).forEach((attachment) => {\n      attachment.delegate = null\n      this.delegate?.compositionDidRemoveAttachment?.(attachment)\n    })\n\n    return (() => {\n      const result = []\n\n      Array.from(added).forEach((attachment) => {\n        attachment.delegate = this\n        result.push(this.delegate?.compositionDidAddAttachment?.(attachment))\n      })\n\n      return result\n    })()\n  }\n\n  // Attachment delegate\n\n  attachmentDidChangeAttributes(attachment) {\n    this.revision++\n    return this.delegate?.compositionDidEditAttachment?.(attachment)\n  }\n\n  attachmentDidChangePreviewURL(attachment) {\n    this.revision++\n    return this.delegate?.compositionDidChangeAttachmentPreviewURL?.(attachment)\n  }\n\n  // Attachment editing\n\n  editAttachment(attachment, options) {\n    if (attachment === this.editingAttachment) return\n    this.stopEditingAttachment()\n    this.editingAttachment = attachment\n    return this.delegate?.compositionDidStartEditingAttachment?.(this.editingAttachment, options)\n  }\n\n  stopEditingAttachment() {\n    if (!this.editingAttachment) return\n    this.delegate?.compositionDidStopEditingAttachment?.(this.editingAttachment)\n    this.editingAttachment = null\n  }\n\n  updateAttributesForAttachment(attributes, attachment) {\n    return this.setDocument(this.document.updateAttributesForAttachment(attributes, attachment))\n  }\n\n  removeAttributeForAttachment(attribute, attachment) {\n    return this.setDocument(this.document.removeAttributeForAttachment(attribute, attachment))\n  }\n\n  // Private\n\n  breakFormattedBlock(insertion) {\n    let { document } = insertion\n    const { block } = insertion\n    let position = insertion.startPosition\n    let range = [ position - 1, position ]\n\n    if (block.getBlockBreakPosition() === insertion.startLocation.offset) {\n      if (block.breaksOnReturn() && insertion.nextCharacter === \"\\n\") {\n        position += 1\n      } else {\n        document = document.removeTextAtRange(range)\n      }\n      range = [ position, position ]\n    } else if (insertion.nextCharacter === \"\\n\") {\n      if (insertion.previousCharacter === \"\\n\") {\n        range = [ position - 1, position + 1 ]\n      } else {\n        range = [ position, position + 1 ]\n        position += 1\n      }\n    } else if (insertion.startLocation.offset - 1 !== 0) {\n      position += 1\n    }\n\n    const newDocument = new Document([ block.removeLastAttribute().copyWithoutText() ])\n    this.setDocument(document.insertDocumentAtRange(newDocument, range))\n    return this.setSelection(position)\n  }\n\n  getPreviousBlock() {\n    const locationRange = this.getLocationRange()\n    if (locationRange) {\n      const { index } = locationRange[0]\n      if (index > 0) {\n        return this.document.getBlockAtIndex(index - 1)\n      }\n    }\n  }\n\n  getBlock() {\n    const locationRange = this.getLocationRange()\n    if (locationRange) {\n      return this.document.getBlockAtIndex(locationRange[0].index)\n    }\n  }\n\n  getAttachmentAtRange(range) {\n    const document = this.document.getDocumentAtRange(range)\n    if (document.toString() === `${OBJECT_REPLACEMENT_CHARACTER}\\n`) {\n      return document.getAttachments()[0]\n    }\n  }\n\n  notifyDelegateOfCurrentAttributesChange() {\n    return this.delegate?.compositionDidChangeCurrentAttributes?.(this.currentAttributes)\n  }\n\n  notifyDelegateOfInsertionAtRange(range) {\n    return this.delegate?.compositionDidPerformInsertionAtRange?.(range)\n  }\n\n  translateUTF16PositionFromOffset(position, offset) {\n    const utf16string = this.document.toUTF16String()\n    const utf16position = utf16string.offsetFromUCS2Offset(position)\n    return utf16string.offsetToUCS2Offset(utf16position + offset)\n  }\n}\n\nComposition.proxyMethod(\"getSelectionManager().getPointRange\")\nComposition.proxyMethod(\"getSelectionManager().setLocationRangeFromPointRange\")\nComposition.proxyMethod(\"getSelectionManager().createLocationRangeFromDOMRange\")\nComposition.proxyMethod(\"getSelectionManager().locationIsCursorTarget\")\nComposition.proxyMethod(\"getSelectionManager().selectionIsExpanded\")\nComposition.proxyMethod(\"delegate?.getSelectionManager\")\n", "import BasicObject from \"trix/core/basic_object\"\n\nexport default class UndoManager extends BasicObject {\n  constructor(composition) {\n    super(...arguments)\n    this.composition = composition\n    this.undoEntries = []\n    this.redoEntries = []\n  }\n\n  recordUndoEntry(description, { context, consolidatable } = {}) {\n    const previousEntry = this.undoEntries.slice(-1)[0]\n\n    if (!consolidatable || !entryHasDescriptionAndContext(previousEntry, description, context)) {\n      const undoEntry = this.createEntry({ description, context })\n      this.undoEntries.push(undoEntry)\n      this.redoEntries = []\n    }\n  }\n\n  undo() {\n    const undoEntry = this.undoEntries.pop()\n    if (undoEntry) {\n      const redoEntry = this.createEntry(undoEntry)\n      this.redoEntries.push(redoEntry)\n      return this.composition.loadSnapshot(undoEntry.snapshot)\n    }\n  }\n\n  redo() {\n    const redoEntry = this.redoEntries.pop()\n    if (redoEntry) {\n      const undoEntry = this.createEntry(redoEntry)\n      this.undoEntries.push(undoEntry)\n      return this.composition.loadSnapshot(redoEntry.snapshot)\n    }\n  }\n\n  canUndo() {\n    return this.undoEntries.length > 0\n  }\n\n  canRedo() {\n    return this.redoEntries.length > 0\n  }\n\n  // Private\n\n  createEntry({ description, context } = {}) {\n    return {\n      description: description?.toString(),\n      context: JSON.stringify(context),\n      snapshot: this.composition.getSnapshot(),\n    }\n  }\n}\n\nconst entryHasDescriptionAndContext = (entry, description, context) =>\n  entry?.description === description?.toString() && entry?.context === JSON.stringify(context)\n", "const BLOCK_ATTRIBUTE_NAME = \"attachmentGallery\"\nconst TEXT_ATTRIBUTE_NAME = \"presentation\"\nconst TEXT_ATTRIBUTE_VALUE = \"gallery\"\n\nexport default class Filter {\n  constructor(snapshot) {\n    this.document = snapshot.document\n    this.selectedRange = snapshot.selectedRange\n  }\n\n  perform() {\n    this.removeBlockAttribute()\n    return this.applyBlockAttribute()\n  }\n\n  getSnapshot() {\n    return { document: this.document, selectedRange: this.selectedRange }\n  }\n\n  // Private\n\n  removeBlockAttribute() {\n    return this.findRangesOfBlocks().map((range) => this.document = this.document.removeAttributeAtRange(BLOCK_ATTRIBUTE_NAME, range))\n  }\n\n  applyBlockAttribute() {\n    let offset = 0\n\n    this.findRangesOfPieces().forEach((range) => {\n      if (range[1] - range[0] > 1) {\n        range[0] += offset\n        range[1] += offset\n\n        if (this.document.getCharacterAtPosition(range[1]) !== \"\\n\") {\n          this.document = this.document.insertBlockBreakAtRange(range[1])\n          if (range[1] < this.selectedRange[1]) {\n            this.moveSelectedRangeForward()\n          }\n          range[1]++\n          offset++\n        }\n\n        if (range[0] !== 0) {\n          if (this.document.getCharacterAtPosition(range[0] - 1) !== \"\\n\") {\n            this.document = this.document.insertBlockBreakAtRange(range[0])\n            if (range[0] < this.selectedRange[0]) {\n              this.moveSelectedRangeForward()\n            }\n            range[0]++\n            offset++\n          }\n        }\n\n        this.document = this.document.applyBlockAttributeAtRange(BLOCK_ATTRIBUTE_NAME, true, range)\n      }\n    })\n  }\n\n  findRangesOfBlocks() {\n    return this.document.findRangesForBlockAttribute(BLOCK_ATTRIBUTE_NAME)\n  }\n\n  findRangesOfPieces() {\n    return this.document.findRangesForTextAttribute(TEXT_ATTRIBUTE_NAME, { withValue: TEXT_ATTRIBUTE_VALUE })\n  }\n\n  moveSelectedRangeForward() {\n    this.selectedRange[0] += 1\n    this.selectedRange[1] += 1\n  }\n}\n", "import Filter from \"./filter\"\n\nexport const attachmentGalleryFilter = function(snapshot) {\n  const filter = new Filter(snapshot)\n  filter.perform()\n  return filter.getSnapshot()\n}\n\n", "import Document from \"trix/models/document\"\nimport HTMLParser from \"trix/models/html_parser\"\n\nimport UndoManager from \"trix/models/undo_manager\"\nimport { attachmentGalleryFilter } from \"trix/filters/attachment_gallery_filter\"\nconst DEFAULT_FILTERS = [ attachmentGalleryFilter ]\n\nexport default class Editor {\n  constructor(composition, selectionManager, element) {\n    this.insertFiles = this.insertFiles.bind(this)\n    this.composition = composition\n    this.selectionManager = selectionManager\n    this.element = element\n    this.undoManager = new UndoManager(this.composition)\n    this.filters = DEFAULT_FILTERS.slice(0)\n  }\n\n  loadDocument(document) {\n    return this.loadSnapshot({ document, selectedRange: [ 0, 0 ] })\n  }\n\n  loadHTML(html = \"\") {\n    const document = HTMLParser.parse(html, { referenceElement: this.element }).getDocument()\n    return this.loadDocument(document)\n  }\n\n  loadJSON({ document, selectedRange }) {\n    document = Document.fromJSON(document)\n    return this.loadSnapshot({ document, selectedRange })\n  }\n\n  loadSnapshot(snapshot) {\n    this.undoManager = new UndoManager(this.composition)\n    return this.composition.loadSnapshot(snapshot)\n  }\n\n  getDocument() {\n    return this.composition.document\n  }\n\n  getSelectedDocument() {\n    return this.composition.getSelectedDocument()\n  }\n\n  getSnapshot() {\n    return this.composition.getSnapshot()\n  }\n\n  toJSON() {\n    return this.getSnapshot()\n  }\n\n  // Document manipulation\n\n  deleteInDirection(direction) {\n    return this.composition.deleteInDirection(direction)\n  }\n\n  insertAttachment(attachment) {\n    return this.composition.insertAttachment(attachment)\n  }\n\n  insertAttachments(attachments) {\n    return this.composition.insertAttachments(attachments)\n  }\n\n  insertDocument(document) {\n    return this.composition.insertDocument(document)\n  }\n\n  insertFile(file) {\n    return this.composition.insertFile(file)\n  }\n\n  insertFiles(files) {\n    return this.composition.insertFiles(files)\n  }\n\n  insertHTML(html) {\n    return this.composition.insertHTML(html)\n  }\n\n  insertString(string) {\n    return this.composition.insertString(string)\n  }\n\n  insertText(text) {\n    return this.composition.insertText(text)\n  }\n\n  insertLineBreak() {\n    return this.composition.insertLineBreak()\n  }\n\n  // Selection\n\n  getSelectedRange() {\n    return this.composition.getSelectedRange()\n  }\n\n  getPosition() {\n    return this.composition.getPosition()\n  }\n\n  getClientRectAtPosition(position) {\n    const locationRange = this.getDocument().locationRangeFromRange([ position, position + 1 ])\n    return this.selectionManager.getClientRectAtLocationRange(locationRange)\n  }\n\n  expandSelectionInDirection(direction) {\n    return this.composition.expandSelectionInDirection(direction)\n  }\n\n  moveCursorInDirection(direction) {\n    return this.composition.moveCursorInDirection(direction)\n  }\n\n  setSelectedRange(selectedRange) {\n    return this.composition.setSelectedRange(selectedRange)\n  }\n\n  // Attributes\n\n  activateAttribute(name, value = true) {\n    return this.composition.setCurrentAttribute(name, value)\n  }\n\n  attributeIsActive(name) {\n    return this.composition.hasCurrentAttribute(name)\n  }\n\n  canActivateAttribute(name) {\n    return this.composition.canSetCurrentAttribute(name)\n  }\n\n  deactivateAttribute(name) {\n    return this.composition.removeCurrentAttribute(name)\n  }\n\n  // HTML attributes\n  setHTMLAtributeAtPosition(position, name, value) {\n    this.composition.setHTMLAtributeAtPosition(position, name, value)\n  }\n\n  // Nesting level\n\n  canDecreaseNestingLevel() {\n    return this.composition.canDecreaseNestingLevel()\n  }\n\n  canIncreaseNestingLevel() {\n    return this.composition.canIncreaseNestingLevel()\n  }\n\n  decreaseNestingLevel() {\n    if (this.canDecreaseNestingLevel()) {\n      return this.composition.decreaseNestingLevel()\n    }\n  }\n\n  increaseNestingLevel() {\n    if (this.canIncreaseNestingLevel()) {\n      return this.composition.increaseNestingLevel()\n    }\n  }\n\n  // Undo/redo\n\n  canRedo() {\n    return this.undoManager.canRedo()\n  }\n\n  canUndo() {\n    return this.undoManager.canUndo()\n  }\n\n  recordUndoEntry(description, { context, consolidatable } = {}) {\n    return this.undoManager.recordUndoEntry(description, { context, consolidatable })\n  }\n\n  redo() {\n    if (this.canRedo()) {\n      return this.undoManager.redo()\n    }\n  }\n\n  undo() {\n    if (this.canUndo()) {\n      return this.undoManager.undo()\n    }\n  }\n}\n", "/* eslint-disable\n    no-var,\n    prefer-const,\n*/\nimport {\n  elementContainsNode,\n  findChildIndexOfNode,\n  nodeIsAttachmentElement,\n  nodeIsBlockContainer,\n  nodeIsBlockStart,\n  nodeIsBlockStartComment,\n  nodeIsCursorTarget,\n  nodeIsEmptyTextNode,\n  nodeIsTextNode,\n  tagName,\n  walkTree,\n} from \"trix/core/helpers\"\n\nexport default class LocationMapper {\n  constructor(element) {\n    this.element = element\n  }\n\n  findLocationFromContainerAndOffset(container, offset, { strict } = { strict: true }) {\n    let childIndex = 0\n    let foundBlock = false\n    const location = { index: 0, offset: 0 }\n    const attachmentElement = this.findAttachmentElementParentForNode(container)\n\n    if (attachmentElement) {\n      container = attachmentElement.parentNode\n      offset = findChildIndexOfNode(attachmentElement)\n    }\n\n    const walker = walkTree(this.element, { usingFilter: rejectAttachmentContents })\n\n    while (walker.nextNode()) {\n      const node = walker.currentNode\n\n      if (node === container && nodeIsTextNode(container)) {\n        if (!nodeIsCursorTarget(node)) {\n          location.offset += offset\n        }\n        break\n      } else {\n        if (node.parentNode === container) {\n          if (childIndex++ === offset) {\n            if (!strict && nodeIsBlockStart(node, { strict })) {\n              if (foundBlock) {\n                location.index++\n              }\n              location.offset = 0\n              foundBlock = true\n            }\n            break\n          }\n        } else if (!elementContainsNode(container, node)) {\n          if (childIndex > 0) {\n            break\n          }\n        }\n\n        if (nodeIsBlockStart(node, { strict })) {\n          if (foundBlock) {\n            location.index++\n          }\n          location.offset = 0\n          foundBlock = true\n        } else {\n          location.offset += nodeLength(node)\n        }\n      }\n    }\n\n    return location\n  }\n\n  findContainerAndOffsetFromLocation(location) {\n    let container, offset\n    if (location.index === 0 && location.offset === 0) {\n      container = this.element\n      offset = 0\n\n      while (container.firstChild) {\n        container = container.firstChild\n        if (nodeIsBlockContainer(container)) {\n          offset = 1\n          break\n        }\n      }\n\n      return [ container, offset ]\n    }\n\n    let [ node, nodeOffset ] = this.findNodeAndOffsetFromLocation(location)\n    if (!node) return\n\n    if (nodeIsTextNode(node)) {\n      if (nodeLength(node) === 0) {\n        container = node.parentNode.parentNode\n        offset = findChildIndexOfNode(node.parentNode)\n        if (nodeIsCursorTarget(node, { name: \"right\" })) {\n          offset++\n        }\n      } else {\n        container = node\n        offset = location.offset - nodeOffset\n      }\n    } else {\n      container = node.parentNode\n\n      if (!nodeIsBlockStart(node.previousSibling)) {\n        if (!nodeIsBlockContainer(container)) {\n          while (node === container.lastChild) {\n            node = container\n            container = container.parentNode\n            if (nodeIsBlockContainer(container)) {\n              break\n            }\n          }\n        }\n      }\n\n      offset = findChildIndexOfNode(node)\n      if (location.offset !== 0) {\n        offset++\n      }\n    }\n\n    return [ container, offset ]\n  }\n\n  findNodeAndOffsetFromLocation(location) {\n    let node, nodeOffset\n    let offset = 0\n\n    for (const currentNode of this.getSignificantNodesForIndex(location.index)) {\n      const length = nodeLength(currentNode)\n\n      if (location.offset <= offset + length) {\n        if (nodeIsTextNode(currentNode)) {\n          node = currentNode\n          nodeOffset = offset\n          if (location.offset === nodeOffset && nodeIsCursorTarget(node)) {\n            break\n          }\n        } else if (!node) {\n          node = currentNode\n          nodeOffset = offset\n        }\n      }\n\n      offset += length\n      if (offset > location.offset) {\n        break\n      }\n    }\n\n    return [ node, nodeOffset ]\n  }\n\n  // Private\n\n  findAttachmentElementParentForNode(node) {\n    while (node && node !== this.element) {\n      if (nodeIsAttachmentElement(node)) {\n        return node\n      }\n      node = node.parentNode\n    }\n  }\n\n  getSignificantNodesForIndex(index) {\n    const nodes = []\n    const walker = walkTree(this.element, { usingFilter: acceptSignificantNodes })\n    let recordingNodes = false\n\n    while (walker.nextNode()) {\n      const node = walker.currentNode\n      if (nodeIsBlockStartComment(node)) {\n        var blockIndex\n        if (blockIndex != null) {\n          blockIndex++\n        } else {\n          blockIndex = 0\n        }\n\n        if (blockIndex === index) {\n          recordingNodes = true\n        } else if (recordingNodes) {\n          break\n        }\n      } else if (recordingNodes) {\n        nodes.push(node)\n      }\n    }\n\n    return nodes\n  }\n}\n\nconst nodeLength = function(node) {\n  if (node.nodeType === Node.TEXT_NODE) {\n    if (nodeIsCursorTarget(node)) {\n      return 0\n    } else {\n      const string = node.textContent\n      return string.length\n    }\n  } else if (tagName(node) === \"br\" || nodeIsAttachmentElement(node)) {\n    return 1\n  } else {\n    return 0\n  }\n}\n\nconst acceptSignificantNodes = function(node) {\n  if (rejectEmptyTextNodes(node) === NodeFilter.FILTER_ACCEPT) {\n    return rejectAttachmentContents(node)\n  } else {\n    return NodeFilter.FILTER_REJECT\n  }\n}\n\nconst rejectEmptyTextNodes = function(node) {\n  if (nodeIsEmptyTextNode(node)) {\n    return NodeFilter.FILTER_REJECT\n  } else {\n    return NodeFilter.FILTER_ACCEPT\n  }\n}\n\nconst rejectAttachmentContents = function(node) {\n  if (nodeIsAttachmentElement(node.parentNode)) {\n    return NodeFilter.FILTER_REJECT\n  } else {\n    return NodeFilter.FILTER_ACCEPT\n  }\n}\n", "/* eslint-disable\n    id-length,\n    no-empty,\n*/\nimport { getDOMRange, setDOMRange } from \"trix/core/helpers\"\n\nexport default class PointMapper {\n  createDOMRangeFromPoint({ x, y }) {\n    let domRange\n    if (document.caretPositionFromPoint) {\n      const { offsetNode, offset } = document.caretPositionFromPoint(x, y)\n      domRange = document.createRange()\n      domRange.setStart(offsetNode, offset)\n      return domRange\n    } else if (document.caretRangeFromPoint) {\n      return document.caretRangeFromPoint(x, y)\n    } else if (document.body.createTextRange) {\n      const originalDOMRange = getDOMRange()\n      try {\n        // IE 11 throws \"Unspecified error\" when using moveToPoint\n        // during a drag-and-drop operation.\n        const textRange = document.body.createTextRange()\n        textRange.moveToPoint(x, y)\n        textRange.select()\n      } catch (error) {}\n      domRange = getDOMRange()\n      setDOMRange(originalDOMRange)\n      return domRange\n    }\n  }\n\n  getClientRectsForDOMRange(domRange) {\n    const array = Array.from(domRange.getClientRects())\n    const start = array[0]\n    const end = array[array.length - 1]\n\n    return [ start, end ]\n  }\n}\n", "/* eslint-disable\n*/\nimport BasicObject from \"trix/core/basic_object\"\n\nimport LocationMapper from \"trix/models/location_mapper\"\nimport PointMapper from \"trix/models/point_mapper\"\n\nimport {\n  elementContainsNode,\n  getDOMRange,\n  getDOMSelection,\n  handleEvent,\n  innerElementIsActive,\n  nodeIsCursorTarget,\n  normalizeRange,\n  rangeIsCollapsed,\n  rangesAreEqual,\n  setDOMRange,\n} from \"trix/core/helpers\"\n\nexport default class SelectionManager extends BasicObject {\n  constructor(element) {\n    super(...arguments)\n    this.didMouseDown = this.didMouseDown.bind(this)\n    this.selectionDidChange = this.selectionDidChange.bind(this)\n    this.element = element\n    this.locationMapper = new LocationMapper(this.element)\n    this.pointMapper = new PointMapper()\n    this.lockCount = 0\n    handleEvent(\"mousedown\", { onElement: this.element, withCallback: this.didMouseDown })\n  }\n\n  getLocationRange(options = {}) {\n    if (options.strict === false) {\n      return this.createLocationRangeFromDOMRange(getDOMRange())\n    } else if (options.ignoreLock) {\n      return this.currentLocationRange\n    } else if (this.lockedLocationRange) {\n      return this.lockedLocationRange\n    } else {\n      return this.currentLocationRange\n    }\n  }\n\n  setLocationRange(locationRange) {\n    if (this.lockedLocationRange) return\n    locationRange = normalizeRange(locationRange)\n\n    const domRange = this.createDOMRangeFromLocationRange(locationRange)\n    if (domRange) {\n      setDOMRange(domRange)\n      this.updateCurrentLocationRange(locationRange)\n    }\n  }\n\n  setLocationRangeFromPointRange(pointRange) {\n    pointRange = normalizeRange(pointRange)\n    const startLocation = this.getLocationAtPoint(pointRange[0])\n    const endLocation = this.getLocationAtPoint(pointRange[1])\n    this.setLocationRange([ startLocation, endLocation ])\n  }\n\n  getClientRectAtLocationRange(locationRange) {\n    const domRange = this.createDOMRangeFromLocationRange(locationRange)\n    if (domRange) {\n      return this.getClientRectsForDOMRange(domRange)[1]\n    }\n  }\n\n  locationIsCursorTarget(location) {\n    const node = Array.from(this.findNodeAndOffsetFromLocation(location))[0]\n    return nodeIsCursorTarget(node)\n  }\n\n  lock() {\n    if (this.lockCount++ === 0) {\n      this.updateCurrentLocationRange()\n      this.lockedLocationRange = this.getLocationRange()\n    }\n  }\n\n  unlock() {\n    if (--this.lockCount === 0) {\n      const { lockedLocationRange } = this\n      this.lockedLocationRange = null\n      if (lockedLocationRange != null) {\n        return this.setLocationRange(lockedLocationRange)\n      }\n    }\n  }\n\n  clearSelection() {\n    return getDOMSelection()?.removeAllRanges()\n  }\n\n  selectionIsCollapsed() {\n    return getDOMRange()?.collapsed === true\n  }\n\n  selectionIsExpanded() {\n    return !this.selectionIsCollapsed()\n  }\n\n  createLocationRangeFromDOMRange(domRange, options) {\n    if (domRange == null || !this.domRangeWithinElement(domRange)) return\n\n    const start = this.findLocationFromContainerAndOffset(domRange.startContainer, domRange.startOffset, options)\n    if (!start) return\n\n    const end = domRange.collapsed\n      ? undefined\n      : this.findLocationFromContainerAndOffset(domRange.endContainer, domRange.endOffset, options)\n\n    return normalizeRange([ start, end ])\n  }\n\n  didMouseDown() {\n    return this.pauseTemporarily()\n  }\n\n  pauseTemporarily() {\n    let resumeHandlers\n    this.paused = true\n\n    const resume = () => {\n      this.paused = false\n      clearTimeout(resumeTimeout)\n\n      Array.from(resumeHandlers).forEach((handler) => {\n        handler.destroy()\n      })\n\n      if (elementContainsNode(document, this.element)) {\n        return this.selectionDidChange()\n      }\n    }\n\n    const resumeTimeout = setTimeout(resume, 200)\n\n    resumeHandlers = [ \"mousemove\", \"keydown\" ].map((eventName) =>\n      handleEvent(eventName, { onElement: document, withCallback: resume })\n    )\n  }\n\n  selectionDidChange() {\n    if (!this.paused && !innerElementIsActive(this.element)) {\n      return this.updateCurrentLocationRange()\n    }\n  }\n\n  updateCurrentLocationRange(locationRange) {\n    if (locationRange != null ? locationRange : locationRange = this.createLocationRangeFromDOMRange(getDOMRange())) {\n      if (!rangesAreEqual(locationRange, this.currentLocationRange)) {\n        this.currentLocationRange = locationRange\n        return this.delegate?.locationRangeDidChange?.(this.currentLocationRange.slice(0))\n      }\n    }\n  }\n\n  createDOMRangeFromLocationRange(locationRange) {\n    const rangeStart = this.findContainerAndOffsetFromLocation(locationRange[0])\n    const rangeEnd = rangeIsCollapsed(locationRange)\n      ? rangeStart\n      : this.findContainerAndOffsetFromLocation(locationRange[1]) || rangeStart\n\n    if (rangeStart != null && rangeEnd != null) {\n      const domRange = document.createRange()\n      domRange.setStart(...Array.from(rangeStart || []))\n      domRange.setEnd(...Array.from(rangeEnd || []))\n      return domRange\n    }\n  }\n\n  getLocationAtPoint(point) {\n    const domRange = this.createDOMRangeFromPoint(point)\n    if (domRange) {\n      return this.createLocationRangeFromDOMRange(domRange)?.[0]\n    }\n  }\n\n  domRangeWithinElement(domRange) {\n    if (domRange.collapsed) {\n      return elementContainsNode(this.element, domRange.startContainer)\n    } else {\n      return (\n        elementContainsNode(this.element, domRange.startContainer) &&\n        elementContainsNode(this.element, domRange.endContainer)\n      )\n    }\n  }\n}\n\nSelectionManager.proxyMethod(\"locationMapper.findLocationFromContainerAndOffset\")\nSelectionManager.proxyMethod(\"locationMapper.findContainerAndOffsetFromLocation\")\nSelectionManager.proxyMethod(\"locationMapper.findNodeAndOffsetFromLocation\")\nSelectionManager.proxyMethod(\"pointMapper.createDOMRangeFromPoint\")\nSelectionManager.proxyMethod(\"pointMapper.getClientRectsForDOMRange\")\n\n", "import { removeNode } from \"trix/core/helpers\"\n\nimport * as config from \"trix/config\"\nimport BasicObject from \"trix/core/basic_object\"\n\nimport { defer, handleEvent, makeElement, tagName, triggerEvent } from \"trix/core/helpers\"\nconst { lang, css, keyNames } = config\n\nconst undoable = function(fn) {\n  return function() {\n    const commands = fn.apply(this, arguments)\n    commands.do()\n    if (!this.undos) {\n      this.undos = []\n    }\n    this.undos.push(commands.undo)\n  }\n}\n\nexport default class AttachmentEditorController extends BasicObject {\n  constructor(attachmentPiece, element, container, options = {}) {\n    super(...arguments)\n    this.didClickToolbar = this.didClickToolbar.bind(this)\n    this.didClickActionButton = this.didClickActionButton.bind(this)\n    this.didKeyDownCaption = this.didKeyDownCaption.bind(this)\n    this.didInputCaption = this.didInputCaption.bind(this)\n    this.didChangeCaption = this.didChangeCaption.bind(this)\n    this.didBlurCaption = this.didBlurCaption.bind(this)\n    this.attachmentPiece = attachmentPiece\n    this.element = element\n    this.container = container\n    this.options = options\n    this.attachment = this.attachmentPiece.attachment\n    if (tagName(this.element) === \"a\") {\n      this.element = this.element.firstChild\n    }\n    this.install()\n  }\n\n  install() {\n    this.makeElementMutable()\n    this.addToolbar()\n    if (this.attachment.isPreviewable()) {\n      this.installCaptionEditor()\n    }\n  }\n\n  uninstall() {\n    let undo = this.undos.pop()\n    this.savePendingCaption()\n    while (undo) {\n      undo()\n      undo = this.undos.pop()\n    }\n    this.delegate?.didUninstallAttachmentEditor(this)\n  }\n\n  // Private\n\n  savePendingCaption() {\n    if (this.pendingCaption != null) {\n      const caption = this.pendingCaption\n      this.pendingCaption = null\n      if (caption) {\n        this.delegate?.attachmentEditorDidRequestUpdatingAttributesForAttachment?.({ caption }, this.attachment)\n      } else {\n        this.delegate?.attachmentEditorDidRequestRemovingAttributeForAttachment?.(\"caption\", this.attachment)\n      }\n    }\n  }\n\n  // Installing and uninstalling\n\n  makeElementMutable = undoable(() => {\n    return {\n      do: () => {\n        this.element.dataset.trixMutable = true\n      },\n      undo: () => delete this.element.dataset.trixMutable,\n    }\n  })\n\n  addToolbar = undoable(() => {\n    // <div class=\"#{css.attachmentMetadataContainer}\" data-trix-mutable=\"true\">\n    //   <div class=\"trix-button-row\">\n    //     <span class=\"trix-button-group trix-button-group--actions\">\n    //       <button type=\"button\" class=\"trix-button trix-button--remove\" title=\"#{lang.remove}\" data-trix-action=\"remove\">#{lang.remove}</button>\n    //     </span>\n    //   </div>\n    // </div>\n    const element = makeElement({\n      tagName: \"div\",\n      className: css.attachmentToolbar,\n      data: { trixMutable: true },\n      childNodes: makeElement({\n        tagName: \"div\",\n        className: \"trix-button-row\",\n        childNodes: makeElement({\n          tagName: \"span\",\n          className: \"trix-button-group trix-button-group--actions\",\n          childNodes: makeElement({\n            tagName: \"button\",\n            className: \"trix-button trix-button--remove\",\n            textContent: lang.remove,\n            attributes: { title: lang.remove },\n            data: { trixAction: \"remove\" },\n          }),\n        }),\n      }),\n    })\n\n    if (this.attachment.isPreviewable()) {\n      // <div class=\"#{css.attachmentMetadataContainer}\">\n      //   <span class=\"#{css.attachmentMetadata}\">\n      //     <span class=\"#{css.attachmentName}\" title=\"#{name}\">#{name}</span>\n      //     <span class=\"#{css.attachmentSize}\">#{size}</span>\n      //   </span>\n      // </div>\n      element.appendChild(\n        makeElement({\n          tagName: \"div\",\n          className: css.attachmentMetadataContainer,\n          childNodes: makeElement({\n            tagName: \"span\",\n            className: css.attachmentMetadata,\n            childNodes: [\n              makeElement({\n                tagName: \"span\",\n                className: css.attachmentName,\n                textContent: this.attachment.getFilename(),\n                attributes: { title: this.attachment.getFilename() },\n              }),\n              makeElement({\n                tagName: \"span\",\n                className: css.attachmentSize,\n                textContent: this.attachment.getFormattedFilesize(),\n              }),\n            ],\n          }),\n        })\n      )\n    }\n\n    handleEvent(\"click\", { onElement: element, withCallback: this.didClickToolbar })\n    handleEvent(\"click\", {\n      onElement: element,\n      matchingSelector: \"[data-trix-action]\",\n      withCallback: this.didClickActionButton,\n    })\n\n    triggerEvent(\"trix-attachment-before-toolbar\", { onElement: this.element, attributes: { toolbar: element, attachment: this.attachment } })\n\n    return {\n      do: () => this.element.appendChild(element),\n      undo: () => removeNode(element),\n    }\n  })\n\n  installCaptionEditor = undoable(() => {\n    const textarea = makeElement({\n      tagName: \"textarea\",\n      className: css.attachmentCaptionEditor,\n      attributes: { placeholder: lang.captionPlaceholder },\n      data: { trixMutable: true },\n    })\n    textarea.value = this.attachmentPiece.getCaption()\n\n    const textareaClone = textarea.cloneNode()\n    textareaClone.classList.add(\"trix-autoresize-clone\")\n    textareaClone.tabIndex = -1\n\n    const autoresize = function() {\n      textareaClone.value = textarea.value\n      textarea.style.height = textareaClone.scrollHeight + \"px\"\n    }\n\n    handleEvent(\"input\", { onElement: textarea, withCallback: autoresize })\n    handleEvent(\"input\", { onElement: textarea, withCallback: this.didInputCaption })\n    handleEvent(\"keydown\", { onElement: textarea, withCallback: this.didKeyDownCaption })\n    handleEvent(\"change\", { onElement: textarea, withCallback: this.didChangeCaption })\n    handleEvent(\"blur\", { onElement: textarea, withCallback: this.didBlurCaption })\n\n    const figcaption = this.element.querySelector(\"figcaption\")\n    const editingFigcaption = figcaption.cloneNode()\n\n    return {\n      do: () => {\n        figcaption.style.display = \"none\"\n        editingFigcaption.appendChild(textarea)\n        editingFigcaption.appendChild(textareaClone)\n        editingFigcaption.classList.add(`${css.attachmentCaption}--editing`)\n        figcaption.parentElement.insertBefore(editingFigcaption, figcaption)\n        autoresize()\n        if (this.options.editCaption) {\n          return defer(() => textarea.focus())\n        }\n      },\n      undo() {\n        removeNode(editingFigcaption)\n        figcaption.style.display = null\n      },\n    }\n  })\n\n  // Event handlers\n\n  didClickToolbar(event) {\n    event.preventDefault()\n    return event.stopPropagation()\n  }\n\n  didClickActionButton(event) {\n    const action = event.target.getAttribute(\"data-trix-action\")\n    switch (action) {\n      case \"remove\":\n        return this.delegate?.attachmentEditorDidRequestRemovalOfAttachment(this.attachment)\n    }\n  }\n\n  didKeyDownCaption(event) {\n    if (keyNames[event.keyCode] === \"return\") {\n      event.preventDefault()\n      this.savePendingCaption()\n      return this.delegate?.attachmentEditorDidRequestDeselectingAttachment?.(this.attachment)\n    }\n  }\n\n  didInputCaption(event) {\n    this.pendingCaption = event.target.value.replace(/\\s/g, \" \").trim()\n  }\n\n  didChangeCaption(event) {\n    return this.savePendingCaption()\n  }\n\n  didBlurCaption(event) {\n    return this.savePendingCaption()\n  }\n}\n", "import BasicObject from \"trix/core/basic_object\"\nimport DocumentView from \"trix/views/document_view\"\nimport AttachmentEditorController from \"trix/controllers/attachment_editor_controller\"\n\nimport { defer, findClosestElementFromNode, handleEvent, innerElementIsActive } from \"trix/core/helpers\"\nimport { attachmentSelector } from \"trix/config/attachments\"\n\nexport default class CompositionController extends BasicObject {\n  constructor(element, composition) {\n    super(...arguments)\n    this.didFocus = this.didFocus.bind(this)\n    this.didBlur = this.didBlur.bind(this)\n    this.didClickAttachment = this.didClickAttachment.bind(this)\n\n    this.element = element\n    this.composition = composition\n    this.documentView = new DocumentView(this.composition.document, { element: this.element })\n\n    handleEvent(\"focus\", { onElement: this.element, withCallback: this.didFocus })\n    handleEvent(\"blur\", { onElement: this.element, withCallback: this.didBlur })\n    handleEvent(\"click\", {\n      onElement: this.element,\n      matchingSelector: \"a[contenteditable=false]\",\n      preventDefault: true,\n    })\n    handleEvent(\"mousedown\", {\n      onElement: this.element,\n      matchingSelector: attachmentSelector,\n      withCallback: this.didClickAttachment,\n    })\n    handleEvent(\"click\", { onElement: this.element, matchingSelector: `a${attachmentSelector}`, preventDefault: true })\n  }\n\n  didFocus(event) {\n    const perform = () => {\n      if (!this.focused) {\n        this.focused = true\n        return this.delegate?.compositionControllerDidFocus?.()\n      }\n    }\n\n    return this.blurPromise?.then(perform) || perform()\n  }\n\n  didBlur(event) {\n    this.blurPromise = new Promise((resolve) => {\n      return defer(() => {\n        if (!innerElementIsActive(this.element)) {\n          this.focused = null\n          this.delegate?.compositionControllerDidBlur?.()\n        }\n        this.blurPromise = null\n        return resolve()\n      })\n    })\n  }\n\n  didClickAttachment(event, target) {\n    const attachment = this.findAttachmentForElement(target)\n    const editCaption = !!findClosestElementFromNode(event.target, { matchingSelector: \"figcaption\" })\n    return this.delegate?.compositionControllerDidSelectAttachment?.(attachment, { editCaption })\n  }\n\n  getSerializableElement() {\n    if (this.isEditingAttachment()) {\n      return this.documentView.shadowElement\n    } else {\n      return this.element\n    }\n  }\n\n  render() {\n    if (this.revision !== this.composition.revision) {\n      this.documentView.setDocument(this.composition.document)\n      this.documentView.render()\n      this.revision = this.composition.revision\n    }\n\n    if (this.canSyncDocumentView() && !this.documentView.isSynced()) {\n      this.delegate?.compositionControllerWillSyncDocumentView?.()\n      this.documentView.sync()\n      this.delegate?.compositionControllerDidSyncDocumentView?.()\n    }\n\n    return this.delegate?.compositionControllerDidRender?.()\n  }\n\n  rerenderViewForObject(object) {\n    this.invalidateViewForObject(object)\n    return this.render()\n  }\n\n  invalidateViewForObject(object) {\n    return this.documentView.invalidateViewForObject(object)\n  }\n\n  isViewCachingEnabled() {\n    return this.documentView.isViewCachingEnabled()\n  }\n\n  enableViewCaching() {\n    return this.documentView.enableViewCaching()\n  }\n\n  disableViewCaching() {\n    return this.documentView.disableViewCaching()\n  }\n\n  refreshViewCache() {\n    return this.documentView.garbageCollectCachedViews()\n  }\n\n  // Attachment editor management\n\n  isEditingAttachment() {\n    return !!this.attachmentEditor\n  }\n\n  installAttachmentEditorForAttachment(attachment, options) {\n    if (this.attachmentEditor?.attachment === attachment) return\n    const element = this.documentView.findElementForObject(attachment)\n    if (!element) return\n\n    this.uninstallAttachmentEditor()\n    const attachmentPiece = this.composition.document.getAttachmentPieceForAttachment(attachment)\n    this.attachmentEditor = new AttachmentEditorController(attachmentPiece, element, this.element, options)\n    this.attachmentEditor.delegate = this\n  }\n\n  uninstallAttachmentEditor() {\n    return this.attachmentEditor?.uninstall()\n  }\n\n  // Attachment controller delegate\n\n  didUninstallAttachmentEditor() {\n    this.attachmentEditor = null\n    return this.render()\n  }\n\n  attachmentEditorDidRequestUpdatingAttributesForAttachment(attributes, attachment) {\n    this.delegate?.compositionControllerWillUpdateAttachment?.(attachment)\n    return this.composition.updateAttributesForAttachment(attributes, attachment)\n  }\n\n  attachmentEditorDidRequestRemovingAttributeForAttachment(attribute, attachment) {\n    this.delegate?.compositionControllerWillUpdateAttachment?.(attachment)\n    return this.composition.removeAttributeForAttachment(attribute, attachment)\n  }\n\n  attachmentEditorDidRequestRemovalOfAttachment(attachment) {\n    return this.delegate?.compositionControllerDidRequestRemovalOfAttachment?.(attachment)\n  }\n\n  attachmentEditorDidRequestDeselectingAttachment(attachment) {\n    return this.delegate?.compositionControllerDidRequestDeselectingAttachment?.(attachment)\n  }\n\n  // Private\n\n  canSyncDocumentView() {\n    return !this.isEditingAttachment()\n  }\n\n  findAttachmentForElement(element) {\n    return this.composition.document.getAttachmentById(parseInt(element.dataset.trixId, 10))\n  }\n}\n", "import \"trix/views/object_view\"\nimport BasicObject from \"trix/core/basic_object\"\n\nexport default class Controller extends BasicObject {}\n", "import BasicObject from \"trix/core/basic_object\"\n\nimport {\n  findClosestElementFromNode,\n  nodeIsBlockStartComment,\n  nodeIsEmptyTextNode,\n  normalizeSpaces,\n  summarizeStringChange,\n  tagName,\n} from \"trix/core/helpers\"\n\nconst mutableAttributeName = \"data-trix-mutable\"\nconst mutableSelector = `[${mutableAttributeName}]`\n\nconst options = {\n  attributes: true,\n  childList: true,\n  characterData: true,\n  characterDataOldValue: true,\n  subtree: true,\n}\n\nexport default class MutationObserver extends BasicObject {\n  constructor(element) {\n    super(element)\n    this.didMutate = this.didMutate.bind(this)\n    this.element = element\n    this.observer = new window.MutationObserver(this.didMutate)\n    this.start()\n  }\n\n  start() {\n    this.reset()\n    return this.observer.observe(this.element, options)\n  }\n\n  stop() {\n    return this.observer.disconnect()\n  }\n\n  didMutate(mutations) {\n    this.mutations.push(...Array.from(this.findSignificantMutations(mutations) || []))\n\n    if (this.mutations.length) {\n      this.delegate?.elementDidMutate?.(this.getMutationSummary())\n      return this.reset()\n    }\n  }\n\n  // Private\n\n  reset() {\n    this.mutations = []\n  }\n\n  findSignificantMutations(mutations) {\n    return mutations.filter((mutation) => {\n      return this.mutationIsSignificant(mutation)\n    })\n  }\n\n  mutationIsSignificant(mutation) {\n    if (this.nodeIsMutable(mutation.target)) {\n      return false\n    }\n    for (const node of Array.from(this.nodesModifiedByMutation(mutation))) {\n      if (this.nodeIsSignificant(node)) return true\n    }\n    return false\n  }\n\n  nodeIsSignificant(node) {\n    return node !== this.element && !this.nodeIsMutable(node) && !nodeIsEmptyTextNode(node)\n  }\n\n  nodeIsMutable(node) {\n    return findClosestElementFromNode(node, { matchingSelector: mutableSelector })\n  }\n\n  nodesModifiedByMutation(mutation) {\n    const nodes = []\n    switch (mutation.type) {\n      case \"attributes\":\n        if (mutation.attributeName !== mutableAttributeName) {\n          nodes.push(mutation.target)\n        }\n        break\n      case \"characterData\":\n        // Changes to text nodes should consider the parent element\n        nodes.push(mutation.target.parentNode)\n        nodes.push(mutation.target)\n        break\n      case \"childList\":\n        // Consider each added or removed node\n        nodes.push(...Array.from(mutation.addedNodes || []))\n        nodes.push(...Array.from(mutation.removedNodes || []))\n        break\n    }\n    return nodes\n  }\n\n  getMutationSummary() {\n    return this.getTextMutationSummary()\n  }\n\n  getTextMutationSummary() {\n    const { additions, deletions } = this.getTextChangesFromCharacterData()\n    const textChanges = this.getTextChangesFromChildList()\n\n    Array.from(textChanges.additions).forEach((addition) => {\n      if (!Array.from(additions).includes(addition)) {\n        additions.push(addition)\n      }\n    })\n\n    deletions.push(...Array.from(textChanges.deletions || []))\n\n    const summary = {}\n\n    const added = additions.join(\"\")\n    if (added) {\n      summary.textAdded = added\n    }\n\n    const deleted = deletions.join(\"\")\n    if (deleted) {\n      summary.textDeleted = deleted\n    }\n\n    return summary\n  }\n\n  getMutationsByType(type) {\n    return Array.from(this.mutations).filter((mutation) => mutation.type === type)\n  }\n\n  getTextChangesFromChildList() {\n    let textAdded, textRemoved\n    const addedNodes = []\n    const removedNodes = []\n\n    Array.from(this.getMutationsByType(\"childList\")).forEach((mutation) => {\n      addedNodes.push(...Array.from(mutation.addedNodes || []))\n      removedNodes.push(...Array.from(mutation.removedNodes || []))\n    })\n\n    const singleBlockCommentRemoved =\n      addedNodes.length === 0 && removedNodes.length === 1 && nodeIsBlockStartComment(removedNodes[0])\n\n    if (singleBlockCommentRemoved) {\n      textAdded = []\n      textRemoved = [ \"\\n\" ]\n    } else {\n      textAdded = getTextForNodes(addedNodes)\n      textRemoved = getTextForNodes(removedNodes)\n    }\n\n    const additions = textAdded.filter((text, index) => text !== textRemoved[index]).map(normalizeSpaces)\n    const deletions = textRemoved.filter((text, index) => text !== textAdded[index]).map(normalizeSpaces)\n\n    return { additions, deletions }\n  }\n\n  getTextChangesFromCharacterData() {\n    let added, removed\n    const characterMutations = this.getMutationsByType(\"characterData\")\n\n    if (characterMutations.length) {\n      const startMutation = characterMutations[0],\n        endMutation = characterMutations[characterMutations.length - 1]\n\n      const oldString = normalizeSpaces(startMutation.oldValue)\n      const newString = normalizeSpaces(endMutation.target.data)\n      const summarized = summarizeStringChange(oldString, newString)\n      added = summarized.added\n      removed = summarized.removed\n    }\n\n    return {\n      additions: added ? [ added ] : [],\n      deletions: removed ? [ removed ] : [],\n    }\n  }\n}\n\nconst getTextForNodes = function(nodes = []) {\n  const text = []\n  for (const node of Array.from(nodes)) {\n    switch (node.nodeType) {\n      case Node.TEXT_NODE:\n        text.push(node.data)\n        break\n      case Node.ELEMENT_NODE:\n        if (tagName(node) === \"br\") {\n          text.push(\"\\n\")\n        } else {\n          text.push(...Array.from(getTextForNodes(node.childNodes) || []))\n        }\n        break\n    }\n  }\n  return text\n}\n", "/* eslint-disable\n    no-empty,\n*/\nimport Operation from \"trix/core/utilities/operation\"\n\nexport default class FileVerificationOperation extends Operation {\n  constructor(file) {\n    super(...arguments)\n    this.file = file\n  }\n\n  perform(callback) {\n    const reader = new FileReader()\n\n    reader.onerror = () => callback(false)\n\n    reader.onload = () => {\n      reader.onerror = null\n      try {\n        reader.abort()\n      } catch (error) {}\n      return callback(true, this.file)\n    }\n\n    return reader.readAsArrayBuffer(this.file)\n  }\n}\n", "import * as config from \"trix/config\"\nimport { NON_BREAKING_SPACE, OBJECT_REPLACEMENT_CHARACTER, ZERO_WIDTH_SPACE } from \"trix/constants\"\n\n// Each software keyboard on Android emits its own set of events and some of them can be buggy.\n// This class detects when some buggy events are being emitted and lets know the input controller\n// that they should be ignored.\nexport default class FlakyAndroidKeyboardDetector {\n  constructor(element) {\n    this.element = element\n  }\n\n  shouldIgnore(event) {\n    if (!config.browser.samsungAndroid) return false\n\n    this.previousEvent = this.event\n    this.event = event\n\n    this.checkSamsungKeyboardBuggyModeStart()\n    this.checkSamsungKeyboardBuggyModeEnd()\n\n    return this.buggyMode\n  }\n\n  // private\n\n  // The Samsung keyboard on Android can enter a buggy state in which it emits a flurry of confused events that,\n  // if processed, corrupts the editor. The buggy mode always starts with an insertText event, right after a\n  // keydown event with for an \"Unidentified\" key, with the same text as the editor element, except for a few\n  // extra whitespace, or exotic utf8, characters.\n  checkSamsungKeyboardBuggyModeStart() {\n    if (this.insertingLongTextAfterUnidentifiedChar() && differsInWhitespace(this.element.innerText, this.event.data)) {\n      this.buggyMode = true\n      this.event.preventDefault()\n    }\n  }\n\n  // The flurry of buggy events are always insertText. If we see any other type, it means it's over.\n  checkSamsungKeyboardBuggyModeEnd() {\n    if (this.buggyMode && this.event.inputType !== \"insertText\") {\n      this.buggyMode = false\n    }\n  }\n\n  insertingLongTextAfterUnidentifiedChar() {\n    return this.isBeforeInputInsertText() && this.previousEventWasUnidentifiedKeydown() && this.event.data?.length > 50\n  }\n\n  isBeforeInputInsertText() {\n    return this.event.type === \"beforeinput\" && this.event.inputType === \"insertText\"\n  }\n\n  previousEventWasUnidentifiedKeydown() {\n    return this.previousEvent?.type === \"keydown\" && this.previousEvent?.key === \"Unidentified\"\n  }\n}\n\nconst differsInWhitespace = (text1, text2) => {\n  return normalize(text1) === normalize(text2)\n}\n\nconst whiteSpaceNormalizerRegexp = new RegExp(`(${OBJECT_REPLACEMENT_CHARACTER}|${ZERO_WIDTH_SPACE}|${NON_BREAKING_SPACE}|\\\\s)+`, \"g\")\nconst normalize = (text) => text.replace(whiteSpaceNormalizerRegexp, \" \").trim()\n", "import BasicObject from \"trix/core/basic_object\"\nimport MutationObserver from \"trix/observers/mutation_observer\"\nimport FileVerificationOperation from \"trix/operations/file_verification_operation\"\nimport FlakyAndroidKeyboardDetector from \"../models/flaky_android_keyboard_detector\"\n\nimport { handleEvent, innerElementIsActive } from \"trix/core/helpers\"\n\nexport default class InputController extends BasicObject {\n\n  static events = {}\n\n  constructor(element) {\n    super(...arguments)\n    this.element = element\n    this.mutationObserver = new MutationObserver(this.element)\n    this.mutationObserver.delegate = this\n    this.flakyKeyboardDetector = new FlakyAndroidKeyboardDetector(this.element)\n    for (const eventName in this.constructor.events) {\n      handleEvent(eventName, { onElement: this.element, withCallback: this.handlerFor(eventName) })\n    }\n  }\n\n  elementDidMutate(mutationSummary) {}\n\n  editorWillSyncDocumentView() {\n    return this.mutationObserver.stop()\n  }\n\n  editorDidSyncDocumentView() {\n    return this.mutationObserver.start()\n  }\n\n  requestRender() {\n    return this.delegate?.inputControllerDidRequestRender?.()\n  }\n\n  requestReparse() {\n    this.delegate?.inputControllerDidRequestReparse?.()\n    return this.requestRender()\n  }\n\n  attachFiles(files) {\n    const operations = Array.from(files).map((file) => new FileVerificationOperation(file))\n    return Promise.all(operations).then((files) => {\n      this.handleInput(function() {\n        this.delegate?.inputControllerWillAttachFiles()\n        this.responder?.insertFiles(files)\n        return this.requestRender()\n      })\n    })\n  }\n\n  // Private\n\n  handlerFor(eventName) {\n    return (event) => {\n      if (!event.defaultPrevented) {\n        this.handleInput(() => {\n          if (!innerElementIsActive(this.element)) {\n            if (this.flakyKeyboardDetector.shouldIgnore(event)) return\n\n            this.eventName = eventName\n            this.constructor.events[eventName].call(this, event)\n          }\n        })\n      }\n    }\n  }\n\n  handleInput(callback) {\n    try {\n      this.delegate?.inputControllerWillHandleInput()\n      callback.call(this)\n    } finally {\n      this.delegate?.inputControllerDidHandleInput()\n    }\n  }\n\n  createLinkHTML(href, text) {\n    const link = document.createElement(\"a\")\n    link.href = href\n    link.textContent = text ? text : href\n    return link.outerHTML\n  }\n}\n\n", "import * as config from \"trix/config\"\nimport UTF16String from \"trix/core/utilities/utf16_string\"\nimport BasicObject from \"trix/core/basic_object\"\nimport InputController from \"trix/controllers/input_controller\"\nimport DocumentView from \"trix/views/document_view\"\nimport Document from \"trix/models/document\"\n\nimport {\n  dataTransferIsPlainText,\n  dataTransferIsWritable,\n  keyEventIsKeyboardCommand,\n  makeElement,\n  objectsAreEqual,\n  removeNode,\n  squishBreakableWhitespace,\n} from \"trix/core/helpers\"\n\nimport { selectionChangeObserver } from \"trix/observers/selection_change_observer\"\n\nconst { browser, keyNames } = config\nlet pastedFileCount = 0\n\nexport default class Level0InputController extends InputController {\n\n  static events = {\n    keydown(event) {\n      if (!this.isComposing()) {\n        this.resetInputSummary()\n      }\n      this.inputSummary.didInput = true\n\n      const keyName = keyNames[event.keyCode]\n      if (keyName) {\n        let context = this.keys\n\n        ;[ \"ctrl\", \"alt\", \"shift\", \"meta\" ].forEach((modifier) => {\n          if (event[`${modifier}Key`]) {\n            if (modifier === \"ctrl\") {\n              modifier = \"control\"\n            }\n            context = context?.[modifier]\n          }\n        })\n\n        if (context?.[keyName] != null) {\n          this.setInputSummary({ keyName })\n          selectionChangeObserver.reset()\n          context[keyName].call(this, event)\n        }\n      }\n\n      if (keyEventIsKeyboardCommand(event)) {\n        const character = String.fromCharCode(event.keyCode).toLowerCase()\n        if (character) {\n          const keys = [ \"alt\", \"shift\" ].map((modifier) => {\n            if (event[`${modifier}Key`]) {\n              return modifier\n            }\n          }).filter(key => key)\n          keys.push(character)\n          if (this.delegate?.inputControllerDidReceiveKeyboardCommand(keys)) {\n            event.preventDefault()\n          }\n        }\n      }\n    },\n\n    keypress(event) {\n      if (this.inputSummary.eventName != null) return\n      if (event.metaKey) return\n      if (event.ctrlKey && !event.altKey) return\n\n      const string = stringFromKeyEvent(event)\n      if (string) {\n        this.delegate?.inputControllerWillPerformTyping()\n        this.responder?.insertString(string)\n        return this.setInputSummary({ textAdded: string, didDelete: this.selectionIsExpanded() })\n      }\n    },\n\n    textInput(event) {\n      // Handle autocapitalization\n      const { data } = event\n      const { textAdded } = this.inputSummary\n      if (textAdded && textAdded !== data && textAdded.toUpperCase() === data) {\n        const range = this.getSelectedRange()\n        this.setSelectedRange([ range[0], range[1] + textAdded.length ])\n        this.responder?.insertString(data)\n        this.setInputSummary({ textAdded: data })\n        return this.setSelectedRange(range)\n      }\n    },\n\n    dragenter(event) {\n      event.preventDefault()\n    },\n\n    dragstart(event) {\n      this.serializeSelectionToDataTransfer(event.dataTransfer)\n      this.draggedRange = this.getSelectedRange()\n      return this.delegate?.inputControllerDidStartDrag?.()\n    },\n\n    dragover(event) {\n      if (this.draggedRange || this.canAcceptDataTransfer(event.dataTransfer)) {\n        event.preventDefault()\n        const draggingPoint = { x: event.clientX, y: event.clientY }\n        if (!objectsAreEqual(draggingPoint, this.draggingPoint)) {\n          this.draggingPoint = draggingPoint\n          return this.delegate?.inputControllerDidReceiveDragOverPoint?.(this.draggingPoint)\n        }\n      }\n    },\n\n    dragend(event) {\n      this.delegate?.inputControllerDidCancelDrag?.()\n      this.draggedRange = null\n      this.draggingPoint = null\n    },\n\n    drop(event) {\n      event.preventDefault()\n      const files = event.dataTransfer?.files\n      const documentJSON = event.dataTransfer.getData(\"application/x-trix-document\")\n\n      const point = { x: event.clientX, y: event.clientY }\n      this.responder?.setLocationRangeFromPointRange(point)\n\n      if (files?.length) {\n        this.attachFiles(files)\n      } else if (this.draggedRange) {\n        this.delegate?.inputControllerWillMoveText()\n        this.responder?.moveTextFromRange(this.draggedRange)\n        this.draggedRange = null\n        this.requestRender()\n      } else if (documentJSON) {\n        const document = Document.fromJSONString(documentJSON)\n        this.responder?.insertDocument(document)\n        this.requestRender()\n      }\n\n      this.draggedRange = null\n      this.draggingPoint = null\n    },\n\n    cut(event) {\n      if (this.responder?.selectionIsExpanded()) {\n        if (this.serializeSelectionToDataTransfer(event.clipboardData)) {\n          event.preventDefault()\n        }\n\n        this.delegate?.inputControllerWillCutText()\n        this.deleteInDirection(\"backward\")\n        if (event.defaultPrevented) {\n          return this.requestRender()\n        }\n      }\n    },\n\n    copy(event) {\n      if (this.responder?.selectionIsExpanded()) {\n        if (this.serializeSelectionToDataTransfer(event.clipboardData)) {\n          event.preventDefault()\n        }\n      }\n    },\n\n    paste(event) {\n      const clipboard = event.clipboardData || event.testClipboardData\n      const paste = { clipboard }\n\n      if (!clipboard || pasteEventIsCrippledSafariHTMLPaste(event)) {\n        this.getPastedHTMLUsingHiddenElement((html) => {\n          paste.type = \"text/html\"\n          paste.html = html\n          this.delegate?.inputControllerWillPaste(paste)\n          this.responder?.insertHTML(paste.html)\n          this.requestRender()\n          return this.delegate?.inputControllerDidPaste(paste)\n        })\n        return\n      }\n\n      const href = clipboard.getData(\"URL\")\n      const html = clipboard.getData(\"text/html\")\n      const name = clipboard.getData(\"public.url-name\")\n\n      if (href) {\n        let string\n        paste.type = \"text/html\"\n        if (name) {\n          string = squishBreakableWhitespace(name).trim()\n        } else {\n          string = href\n        }\n        paste.html = this.createLinkHTML(href, string)\n        this.delegate?.inputControllerWillPaste(paste)\n        this.setInputSummary({ textAdded: string, didDelete: this.selectionIsExpanded() })\n        this.responder?.insertHTML(paste.html)\n        this.requestRender()\n        this.delegate?.inputControllerDidPaste(paste)\n      } else if (dataTransferIsPlainText(clipboard)) {\n        paste.type = \"text/plain\"\n        paste.string = clipboard.getData(\"text/plain\")\n        this.delegate?.inputControllerWillPaste(paste)\n        this.setInputSummary({ textAdded: paste.string, didDelete: this.selectionIsExpanded() })\n        this.responder?.insertString(paste.string)\n        this.requestRender()\n        this.delegate?.inputControllerDidPaste(paste)\n      } else if (html) {\n        paste.type = \"text/html\"\n        paste.html = html\n        this.delegate?.inputControllerWillPaste(paste)\n        this.responder?.insertHTML(paste.html)\n        this.requestRender()\n        this.delegate?.inputControllerDidPaste(paste)\n      } else if (Array.from(clipboard.types).includes(\"Files\")) {\n        const file = clipboard.items?.[0]?.getAsFile?.()\n        if (file) {\n          const extension = extensionForFile(file)\n          if (!file.name && extension) {\n            file.name = `pasted-file-${++pastedFileCount}.${extension}`\n          }\n          paste.type = \"File\"\n          paste.file = file\n          this.delegate?.inputControllerWillAttachFiles()\n          this.responder?.insertFile(paste.file)\n          this.requestRender()\n          this.delegate?.inputControllerDidPaste(paste)\n        }\n      }\n\n      event.preventDefault()\n    },\n\n    compositionstart(event) {\n      return this.getCompositionInput().start(event.data)\n    },\n\n    compositionupdate(event) {\n      return this.getCompositionInput().update(event.data)\n    },\n\n    compositionend(event) {\n      return this.getCompositionInput().end(event.data)\n    },\n\n    beforeinput(event) {\n      this.inputSummary.didInput = true\n    },\n\n    input(event) {\n      this.inputSummary.didInput = true\n      return event.stopPropagation()\n    },\n  }\n\n  static keys = {\n    backspace(event) {\n      this.delegate?.inputControllerWillPerformTyping()\n      return this.deleteInDirection(\"backward\", event)\n    },\n\n    delete(event) {\n      this.delegate?.inputControllerWillPerformTyping()\n      return this.deleteInDirection(\"forward\", event)\n    },\n\n    return(event) {\n      this.setInputSummary({ preferDocument: true })\n      this.delegate?.inputControllerWillPerformTyping()\n      return this.responder?.insertLineBreak()\n    },\n\n    tab(event) {\n      if (this.responder?.canIncreaseNestingLevel()) {\n        this.responder?.increaseNestingLevel()\n        this.requestRender()\n        event.preventDefault()\n      }\n    },\n\n    left(event) {\n      if (this.selectionIsInCursorTarget()) {\n        event.preventDefault()\n        return this.responder?.moveCursorInDirection(\"backward\")\n      }\n    },\n\n    right(event) {\n      if (this.selectionIsInCursorTarget()) {\n        event.preventDefault()\n        return this.responder?.moveCursorInDirection(\"forward\")\n      }\n    },\n\n    control: {\n      d(event) {\n        this.delegate?.inputControllerWillPerformTyping()\n        return this.deleteInDirection(\"forward\", event)\n      },\n\n      h(event) {\n        this.delegate?.inputControllerWillPerformTyping()\n        return this.deleteInDirection(\"backward\", event)\n      },\n\n      o(event) {\n        event.preventDefault()\n        this.delegate?.inputControllerWillPerformTyping()\n        this.responder?.insertString(\"\\n\", { updatePosition: false })\n        return this.requestRender()\n      },\n    },\n\n    shift: {\n      return(event) {\n        this.delegate?.inputControllerWillPerformTyping()\n        this.responder?.insertString(\"\\n\")\n        this.requestRender()\n        event.preventDefault()\n      },\n\n      tab(event) {\n        if (this.responder?.canDecreaseNestingLevel()) {\n          this.responder?.decreaseNestingLevel()\n          this.requestRender()\n          event.preventDefault()\n        }\n      },\n\n      left(event) {\n        if (this.selectionIsInCursorTarget()) {\n          event.preventDefault()\n          return this.expandSelectionInDirection(\"backward\")\n        }\n      },\n\n      right(event) {\n        if (this.selectionIsInCursorTarget()) {\n          event.preventDefault()\n          return this.expandSelectionInDirection(\"forward\")\n        }\n      },\n    },\n\n    alt: {\n      backspace(event) {\n        this.setInputSummary({ preferDocument: false })\n        return this.delegate?.inputControllerWillPerformTyping()\n      },\n    },\n\n    meta: {\n      backspace(event) {\n        this.setInputSummary({ preferDocument: false })\n        return this.delegate?.inputControllerWillPerformTyping()\n      },\n    },\n  }\n\n  constructor() {\n    super(...arguments)\n    this.resetInputSummary()\n  }\n\n  setInputSummary(summary = {}) {\n    this.inputSummary.eventName = this.eventName\n    for (const key in summary) {\n      const value = summary[key]\n      this.inputSummary[key] = value\n    }\n    return this.inputSummary\n  }\n\n  resetInputSummary() {\n    this.inputSummary = {}\n  }\n\n  reset() {\n    this.resetInputSummary()\n    return selectionChangeObserver.reset()\n  }\n\n  // Mutation observer delegate\n\n  elementDidMutate(mutationSummary) {\n    if (this.isComposing()) {\n      return this.delegate?.inputControllerDidAllowUnhandledInput?.()\n    } else {\n      return this.handleInput(function() {\n        if (this.mutationIsSignificant(mutationSummary)) {\n          if (this.mutationIsExpected(mutationSummary)) {\n            this.requestRender()\n          } else {\n            this.requestReparse()\n          }\n        }\n        return this.reset()\n      })\n    }\n  }\n\n  mutationIsExpected({ textAdded, textDeleted }) {\n    if (this.inputSummary.preferDocument) {\n      return true\n    }\n\n    const mutationAdditionMatchesSummary =\n      textAdded != null ? textAdded === this.inputSummary.textAdded : !this.inputSummary.textAdded\n    const mutationDeletionMatchesSummary =\n      textDeleted != null ? this.inputSummary.didDelete : !this.inputSummary.didDelete\n\n    const unexpectedNewlineAddition = [ \"\\n\", \" \\n\" ].includes(textAdded) && !mutationAdditionMatchesSummary\n    const unexpectedNewlineDeletion = textDeleted === \"\\n\" && !mutationDeletionMatchesSummary\n    const singleUnexpectedNewline =\n      unexpectedNewlineAddition && !unexpectedNewlineDeletion ||\n      unexpectedNewlineDeletion && !unexpectedNewlineAddition\n\n    if (singleUnexpectedNewline) {\n      const range = this.getSelectedRange()\n      if (range) {\n        const offset = unexpectedNewlineAddition ? textAdded.replace(/\\n$/, \"\").length || -1 : textAdded?.length || 1\n        if (this.responder?.positionIsBlockBreak(range[1] + offset)) {\n          return true\n        }\n      }\n    }\n\n    return mutationAdditionMatchesSummary && mutationDeletionMatchesSummary\n  }\n\n  mutationIsSignificant(mutationSummary) {\n    const textChanged = Object.keys(mutationSummary).length > 0\n    const composedEmptyString = this.compositionInput?.getEndData() === \"\"\n    return textChanged || !composedEmptyString\n  }\n\n  // Private\n\n  getCompositionInput() {\n    if (this.isComposing()) {\n      return this.compositionInput\n    } else {\n      this.compositionInput = new CompositionInput(this)\n    }\n  }\n\n  isComposing() {\n    return this.compositionInput && !this.compositionInput.isEnded()\n  }\n\n  deleteInDirection(direction, event) {\n    if (this.responder?.deleteInDirection(direction) === false) {\n      if (event) {\n        event.preventDefault()\n        return this.requestRender()\n      }\n    } else {\n      return this.setInputSummary({ didDelete: true })\n    }\n  }\n\n  serializeSelectionToDataTransfer(dataTransfer) {\n    if (!dataTransferIsWritable(dataTransfer)) return\n    const document = this.responder?.getSelectedDocument().toSerializableDocument()\n\n    dataTransfer.setData(\"application/x-trix-document\", JSON.stringify(document))\n    dataTransfer.setData(\"text/html\", DocumentView.render(document).innerHTML)\n    dataTransfer.setData(\"text/plain\", document.toString().replace(/\\n$/, \"\"))\n    return true\n  }\n\n  canAcceptDataTransfer(dataTransfer) {\n    const types = {}\n    Array.from(dataTransfer?.types || []).forEach((type) => {\n      types[type] = true\n    })\n    return types.Files || types[\"application/x-trix-document\"] || types[\"text/html\"] || types[\"text/plain\"]\n  }\n\n  getPastedHTMLUsingHiddenElement(callback) {\n    const selectedRange = this.getSelectedRange()\n\n    const style = {\n      position: \"absolute\",\n      left: `${window.pageXOffset}px`,\n      top: `${window.pageYOffset}px`,\n      opacity: 0,\n    }\n\n    const element = makeElement({ style, tagName: \"div\", editable: true })\n    document.body.appendChild(element)\n    element.focus()\n\n    return requestAnimationFrame(() => {\n      const html = element.innerHTML\n      removeNode(element)\n      this.setSelectedRange(selectedRange)\n      return callback(html)\n    })\n  }\n}\n\nLevel0InputController.proxyMethod(\"responder?.getSelectedRange\")\nLevel0InputController.proxyMethod(\"responder?.setSelectedRange\")\nLevel0InputController.proxyMethod(\"responder?.expandSelectionInDirection\")\nLevel0InputController.proxyMethod(\"responder?.selectionIsInCursorTarget\")\nLevel0InputController.proxyMethod(\"responder?.selectionIsExpanded\")\n\nconst extensionForFile = (file) => file.type?.match(/\\/(\\w+)$/)?.[1]\n\nconst hasStringCodePointAt = !!\" \".codePointAt?.(0)\n\nconst stringFromKeyEvent = function(event) {\n  if (event.key && hasStringCodePointAt && event.key.codePointAt(0) === event.keyCode) {\n    return event.key\n  } else {\n    let code\n    if (event.which === null) {\n      code = event.keyCode\n    } else if (event.which !== 0 && event.charCode !== 0) {\n      code = event.charCode\n    }\n\n    if (code != null && keyNames[code] !== \"escape\") {\n      return UTF16String.fromCodepoints([ code ]).toString()\n    }\n  }\n}\n\nconst pasteEventIsCrippledSafariHTMLPaste = function(event) {\n  const paste = event.clipboardData\n  if (paste) {\n    if (paste.types.includes(\"text/html\")) {\n      // Answer is yes if there's any possibility of Paste and Match Style in Safari,\n      // which is nearly impossible to detect confidently: https://bugs.webkit.org/show_bug.cgi?id=174165\n      for (const type of paste.types) {\n        const hasPasteboardFlavor = /^CorePasteboardFlavorType/.test(type)\n        const hasReadableDynamicData = /^dyn\\./.test(type) && paste.getData(type)\n        const mightBePasteAndMatchStyle = hasPasteboardFlavor || hasReadableDynamicData\n        if (mightBePasteAndMatchStyle) {\n          return true\n        }\n      }\n      return false\n    } else {\n      const isExternalHTMLPaste = paste.types.includes(\"com.apple.webarchive\")\n      const isExternalRichTextPaste = paste.types.includes(\"com.apple.flat-rtfd\")\n      return isExternalHTMLPaste || isExternalRichTextPaste\n    }\n  }\n}\n\nclass CompositionInput extends BasicObject {\n  constructor(inputController) {\n    super(...arguments)\n    this.inputController = inputController\n    this.responder = this.inputController.responder\n    this.delegate = this.inputController.delegate\n    this.inputSummary = this.inputController.inputSummary\n    this.data = {}\n  }\n\n  start(data) {\n    this.data.start = data\n\n    if (this.isSignificant()) {\n      if (this.inputSummary.eventName === \"keypress\" && this.inputSummary.textAdded) {\n        this.responder?.deleteInDirection(\"left\")\n      }\n\n      if (!this.selectionIsExpanded()) {\n        this.insertPlaceholder()\n        this.requestRender()\n      }\n\n      this.range = this.responder?.getSelectedRange()\n    }\n  }\n\n  update(data) {\n    this.data.update = data\n\n    if (this.isSignificant()) {\n      const range = this.selectPlaceholder()\n      if (range) {\n        this.forgetPlaceholder()\n        this.range = range\n      }\n    }\n  }\n\n  end(data) {\n    this.data.end = data\n\n    if (this.isSignificant()) {\n      this.forgetPlaceholder()\n\n      if (this.canApplyToDocument()) {\n        this.setInputSummary({ preferDocument: true, didInput: false })\n        this.delegate?.inputControllerWillPerformTyping()\n        this.responder?.setSelectedRange(this.range)\n        this.responder?.insertString(this.data.end)\n        return this.responder?.setSelectedRange(this.range[0] + this.data.end.length)\n      } else if (this.data.start != null || this.data.update != null) {\n        this.requestReparse()\n        return this.inputController.reset()\n      }\n    } else {\n      return this.inputController.reset()\n    }\n  }\n\n  getEndData() {\n    return this.data.end\n  }\n\n  isEnded() {\n    return this.getEndData() != null\n  }\n\n  isSignificant() {\n    if (browser.composesExistingText) {\n      return this.inputSummary.didInput\n    } else {\n      return true\n    }\n  }\n\n  // Private\n\n  canApplyToDocument() {\n    return this.data.start?.length === 0 && this.data.end?.length > 0 && this.range\n  }\n}\n\nCompositionInput.proxyMethod(\"inputController.setInputSummary\")\nCompositionInput.proxyMethod(\"inputController.requestRender\")\nCompositionInput.proxyMethod(\"inputController.requestReparse\")\nCompositionInput.proxyMethod(\"responder?.selectionIsExpanded\")\nCompositionInput.proxyMethod(\"responder?.insertPlaceholder\")\nCompositionInput.proxyMethod(\"responder?.selectPlaceholder\")\nCompositionInput.proxyMethod(\"responder?.forgetPlaceholder\")\n", "import { getAllAttributeNames, shouldRenderInmmediatelyToDealWithIOSDictation, squishBreakableWhitespace } from \"trix/core/helpers\"\nimport InputController from \"trix/controllers/input_controller\"\nimport * as config from \"trix/config\"\n\nimport { dataTransferIsMsOfficePaste, dataTransferIsPlainText, keyEventIsKeyboardCommand, objectsAreEqual } from \"trix/core/helpers\"\n\nimport { selectionChangeObserver } from \"trix/observers/selection_change_observer\"\n\nexport default class Level2InputController extends InputController {\n  constructor(...args) {\n    super(...args)\n    this.render = this.render.bind(this)\n  }\n\n  static events = {\n    keydown(event) {\n      if (keyEventIsKeyboardCommand(event)) {\n        const command = keyboardCommandFromKeyEvent(event)\n        if (this.delegate?.inputControllerDidReceiveKeyboardCommand(command)) {\n          event.preventDefault()\n        }\n      } else {\n        let name = event.key\n        if (event.altKey) {\n          name += \"+Alt\"\n        }\n        if (event.shiftKey) {\n          name += \"+Shift\"\n        }\n        const handler = this.constructor.keys[name]\n        if (handler) {\n          return this.withEvent(event, handler)\n        }\n      }\n    },\n\n    // Handle paste event to work around beforeinput.insertFromPaste browser bugs.\n    // Safe to remove each condition once fixed upstream.\n    paste(event) {\n      // https://bugs.webkit.org/show_bug.cgi?id=194921\n      let paste\n      const href = event.clipboardData?.getData(\"URL\")\n      if (pasteEventHasFilesOnly(event)) {\n        event.preventDefault()\n        return this.attachFiles(event.clipboardData.files)\n\n        // https://bugs.chromium.org/p/chromium/issues/detail?id=934448\n      } else if (pasteEventHasPlainTextOnly(event)) {\n        event.preventDefault()\n        paste = {\n          type: \"text/plain\",\n          string: event.clipboardData.getData(\"text/plain\"),\n        }\n        this.delegate?.inputControllerWillPaste(paste)\n        this.responder?.insertString(paste.string)\n        this.render()\n        return this.delegate?.inputControllerDidPaste(paste)\n\n        // https://bugs.webkit.org/show_bug.cgi?id=196702\n      } else if (href) {\n        event.preventDefault()\n        paste = {\n          type: \"text/html\",\n          html: this.createLinkHTML(href),\n        }\n        this.delegate?.inputControllerWillPaste(paste)\n        this.responder?.insertHTML(paste.html)\n        this.render()\n        return this.delegate?.inputControllerDidPaste(paste)\n      }\n    },\n\n    beforeinput(event) {\n      const handler = this.constructor.inputTypes[event.inputType]\n\n      const immmediateRender = shouldRenderInmmediatelyToDealWithIOSDictation(event)\n\n      if (handler) {\n        this.withEvent(event, handler)\n\n        if (!immmediateRender) {\n          this.scheduleRender()\n        }\n      }\n\n      if (immmediateRender) {\n        this.render()\n      }\n    },\n\n    input(event) {\n      selectionChangeObserver.reset()\n    },\n\n    dragstart(event) {\n      if (this.responder?.selectionContainsAttachments()) {\n        event.dataTransfer.setData(\"application/x-trix-dragging\", true)\n\n        this.dragging = {\n          range: this.responder?.getSelectedRange(),\n          point: pointFromEvent(event),\n        }\n      }\n    },\n\n    dragenter(event) {\n      if (dragEventHasFiles(event)) {\n        event.preventDefault()\n      }\n    },\n\n    dragover(event) {\n      if (this.dragging) {\n        event.preventDefault()\n        const point = pointFromEvent(event)\n        if (!objectsAreEqual(point, this.dragging.point)) {\n          this.dragging.point = point\n          return this.responder?.setLocationRangeFromPointRange(point)\n        }\n      } else if (dragEventHasFiles(event)) {\n        event.preventDefault()\n      }\n    },\n\n    drop(event) {\n      if (this.dragging) {\n        event.preventDefault()\n        this.delegate?.inputControllerWillMoveText()\n        this.responder?.moveTextFromRange(this.dragging.range)\n        this.dragging = null\n        return this.scheduleRender()\n      } else if (dragEventHasFiles(event)) {\n        event.preventDefault()\n        const point = pointFromEvent(event)\n        this.responder?.setLocationRangeFromPointRange(point)\n        return this.attachFiles(event.dataTransfer.files)\n      }\n    },\n\n    dragend() {\n      if (this.dragging) {\n        this.responder?.setSelectedRange(this.dragging.range)\n        this.dragging = null\n      }\n    },\n\n    compositionend(event) {\n      if (this.composing) {\n        this.composing = false\n        if (!config.browser.recentAndroid) this.scheduleRender()\n      }\n    },\n  }\n\n  static keys = {\n    ArrowLeft() {\n      if (this.responder?.shouldManageMovingCursorInDirection(\"backward\")) {\n        this.event.preventDefault()\n        return this.responder?.moveCursorInDirection(\"backward\")\n      }\n    },\n\n    ArrowRight() {\n      if (this.responder?.shouldManageMovingCursorInDirection(\"forward\")) {\n        this.event.preventDefault()\n        return this.responder?.moveCursorInDirection(\"forward\")\n      }\n    },\n\n    Backspace() {\n      if (this.responder?.shouldManageDeletingInDirection(\"backward\")) {\n        this.event.preventDefault()\n        this.delegate?.inputControllerWillPerformTyping()\n        this.responder?.deleteInDirection(\"backward\")\n        return this.render()\n      }\n    },\n\n    Tab() {\n      if (this.responder?.canIncreaseNestingLevel()) {\n        this.event.preventDefault()\n        this.responder?.increaseNestingLevel()\n        return this.render()\n      }\n    },\n\n    \"Tab+Shift\"() {\n      if (this.responder?.canDecreaseNestingLevel()) {\n        this.event.preventDefault()\n        this.responder?.decreaseNestingLevel()\n        return this.render()\n      }\n    },\n  }\n\n  static inputTypes = {\n    deleteByComposition() {\n      return this.deleteInDirection(\"backward\", { recordUndoEntry: false })\n    },\n\n    deleteByCut() {\n      return this.deleteInDirection(\"backward\")\n    },\n\n    deleteByDrag() {\n      this.event.preventDefault()\n      return this.withTargetDOMRange(function() {\n        this.deleteByDragRange = this.responder?.getSelectedRange()\n      })\n    },\n\n    deleteCompositionText() {\n      return this.deleteInDirection(\"backward\", { recordUndoEntry: false })\n    },\n\n    deleteContent() {\n      return this.deleteInDirection(\"backward\")\n    },\n\n    deleteContentBackward() {\n      return this.deleteInDirection(\"backward\")\n    },\n\n    deleteContentForward() {\n      return this.deleteInDirection(\"forward\")\n    },\n\n    deleteEntireSoftLine() {\n      return this.deleteInDirection(\"forward\")\n    },\n\n    deleteHardLineBackward() {\n      return this.deleteInDirection(\"backward\")\n    },\n\n    deleteHardLineForward() {\n      return this.deleteInDirection(\"forward\")\n    },\n\n    deleteSoftLineBackward() {\n      return this.deleteInDirection(\"backward\")\n    },\n\n    deleteSoftLineForward() {\n      return this.deleteInDirection(\"forward\")\n    },\n\n    deleteWordBackward() {\n      return this.deleteInDirection(\"backward\")\n    },\n\n    deleteWordForward() {\n      return this.deleteInDirection(\"forward\")\n    },\n\n    formatBackColor() {\n      return this.activateAttributeIfSupported(\"backgroundColor\", this.event.data)\n    },\n\n    formatBold() {\n      return this.toggleAttributeIfSupported(\"bold\")\n    },\n\n    formatFontColor() {\n      return this.activateAttributeIfSupported(\"color\", this.event.data)\n    },\n\n    formatFontName() {\n      return this.activateAttributeIfSupported(\"font\", this.event.data)\n    },\n\n    formatIndent() {\n      if (this.responder?.canIncreaseNestingLevel()) {\n        return this.withTargetDOMRange(function() {\n          return this.responder?.increaseNestingLevel()\n        })\n      }\n    },\n\n    formatItalic() {\n      return this.toggleAttributeIfSupported(\"italic\")\n    },\n\n    formatJustifyCenter() {\n      return this.toggleAttributeIfSupported(\"justifyCenter\")\n    },\n\n    formatJustifyFull() {\n      return this.toggleAttributeIfSupported(\"justifyFull\")\n    },\n\n    formatJustifyLeft() {\n      return this.toggleAttributeIfSupported(\"justifyLeft\")\n    },\n\n    formatJustifyRight() {\n      return this.toggleAttributeIfSupported(\"justifyRight\")\n    },\n\n    formatOutdent() {\n      if (this.responder?.canDecreaseNestingLevel()) {\n        return this.withTargetDOMRange(function() {\n          return this.responder?.decreaseNestingLevel()\n        })\n      }\n    },\n\n    formatRemove() {\n      this.withTargetDOMRange(function() {\n        for (const attributeName in this.responder?.getCurrentAttributes()) {\n          this.responder?.removeCurrentAttribute(attributeName)\n        }\n      })\n    },\n\n    formatSetBlockTextDirection() {\n      return this.activateAttributeIfSupported(\"blockDir\", this.event.data)\n    },\n\n    formatSetInlineTextDirection() {\n      return this.activateAttributeIfSupported(\"textDir\", this.event.data)\n    },\n\n    formatStrikeThrough() {\n      return this.toggleAttributeIfSupported(\"strike\")\n    },\n\n    formatSubscript() {\n      return this.toggleAttributeIfSupported(\"sub\")\n    },\n\n    formatSuperscript() {\n      return this.toggleAttributeIfSupported(\"sup\")\n    },\n\n    formatUnderline() {\n      return this.toggleAttributeIfSupported(\"underline\")\n    },\n\n    historyRedo() {\n      return this.delegate?.inputControllerWillPerformRedo()\n    },\n\n    historyUndo() {\n      return this.delegate?.inputControllerWillPerformUndo()\n    },\n\n    insertCompositionText() {\n      this.composing = true\n      return this.insertString(this.event.data)\n    },\n\n    insertFromComposition() {\n      this.composing = false\n      return this.insertString(this.event.data)\n    },\n\n    insertFromDrop() {\n      const range = this.deleteByDragRange\n      if (range) {\n        this.deleteByDragRange = null\n        this.delegate?.inputControllerWillMoveText()\n        return this.withTargetDOMRange(function() {\n          return this.responder?.moveTextFromRange(range)\n        })\n      }\n    },\n\n    insertFromPaste() {\n      const { dataTransfer } = this.event\n      const paste = { dataTransfer }\n\n      const href = dataTransfer.getData(\"URL\")\n      const html = dataTransfer.getData(\"text/html\")\n\n      if (href) {\n        let string\n        this.event.preventDefault()\n        paste.type = \"text/html\"\n        const name = dataTransfer.getData(\"public.url-name\")\n        if (name) {\n          string = squishBreakableWhitespace(name).trim()\n        } else {\n          string = href\n        }\n        paste.html = this.createLinkHTML(href, string)\n        this.delegate?.inputControllerWillPaste(paste)\n        this.withTargetDOMRange(function() {\n          return this.responder?.insertHTML(paste.html)\n        })\n        this.afterRender = () => {\n          return this.delegate?.inputControllerDidPaste(paste)\n        }\n      } else if (dataTransferIsPlainText(dataTransfer)) {\n        paste.type = \"text/plain\"\n        paste.string = dataTransfer.getData(\"text/plain\")\n        this.delegate?.inputControllerWillPaste(paste)\n        this.withTargetDOMRange(function() {\n          return this.responder?.insertString(paste.string)\n        })\n\n        this.afterRender = () => {\n          return this.delegate?.inputControllerDidPaste(paste)\n        }\n      } else if (processableFilePaste(this.event)) {\n        paste.type = \"File\"\n        paste.file = dataTransfer.files[0]\n        this.delegate?.inputControllerWillPaste(paste)\n        this.withTargetDOMRange(function() {\n          return this.responder?.insertFile(paste.file)\n        })\n\n        this.afterRender = () => {\n          return this.delegate?.inputControllerDidPaste(paste)\n        }\n      } else if (html) {\n        this.event.preventDefault()\n        paste.type = \"text/html\"\n        paste.html = html\n        this.delegate?.inputControllerWillPaste(paste)\n        this.withTargetDOMRange(function() {\n          return this.responder?.insertHTML(paste.html)\n        })\n        this.afterRender = () => {\n          return this.delegate?.inputControllerDidPaste(paste)\n        }\n      }\n    },\n\n    insertFromYank() {\n      return this.insertString(this.event.data)\n    },\n\n    insertLineBreak() {\n      return this.insertString(\"\\n\")\n    },\n\n    insertLink() {\n      return this.activateAttributeIfSupported(\"href\", this.event.data)\n    },\n\n    insertOrderedList() {\n      return this.toggleAttributeIfSupported(\"number\")\n    },\n\n    insertParagraph() {\n      this.delegate?.inputControllerWillPerformTyping()\n      return this.withTargetDOMRange(function() {\n        return this.responder?.insertLineBreak()\n      })\n    },\n\n    insertReplacementText() {\n      const replacement = this.event.dataTransfer.getData(\"text/plain\")\n      const domRange = this.event.getTargetRanges()[0]\n\n      this.withTargetDOMRange(domRange, () => {\n        this.insertString(replacement, { updatePosition: false })\n      })\n    },\n\n    insertText() {\n      return this.insertString(this.event.data || this.event.dataTransfer?.getData(\"text/plain\"))\n    },\n\n    insertTranspose() {\n      return this.insertString(this.event.data)\n    },\n\n    insertUnorderedList() {\n      return this.toggleAttributeIfSupported(\"bullet\")\n    },\n  }\n\n  elementDidMutate() {\n    if (this.scheduledRender) {\n      if (this.composing) {\n        return this.delegate?.inputControllerDidAllowUnhandledInput?.()\n      }\n    } else {\n      return this.reparse()\n    }\n  }\n\n  scheduleRender() {\n    return this.scheduledRender ? this.scheduledRender : this.scheduledRender = requestAnimationFrame(this.render)\n  }\n\n  render() {\n    cancelAnimationFrame(this.scheduledRender)\n    this.scheduledRender = null\n    if (!this.composing) {\n      this.delegate?.render()\n    }\n    this.afterRender?.()\n    this.afterRender = null\n  }\n\n  reparse() {\n    return this.delegate?.reparse()\n  }\n\n  // Responder helpers\n\n  insertString(string = \"\", options) {\n    this.delegate?.inputControllerWillPerformTyping()\n    return this.withTargetDOMRange(function() {\n      return this.responder?.insertString(string, options)\n    })\n  }\n\n  toggleAttributeIfSupported(attributeName) {\n    if (getAllAttributeNames().includes(attributeName)) {\n      this.delegate?.inputControllerWillPerformFormatting(attributeName)\n      return this.withTargetDOMRange(function() {\n        return this.responder?.toggleCurrentAttribute(attributeName)\n      })\n    }\n  }\n\n  activateAttributeIfSupported(attributeName, value) {\n    if (getAllAttributeNames().includes(attributeName)) {\n      this.delegate?.inputControllerWillPerformFormatting(attributeName)\n      return this.withTargetDOMRange(function() {\n        return this.responder?.setCurrentAttribute(attributeName, value)\n      })\n    }\n  }\n\n  deleteInDirection(direction, { recordUndoEntry } = { recordUndoEntry: true }) {\n    if (recordUndoEntry) {\n      this.delegate?.inputControllerWillPerformTyping()\n    }\n    const perform = () => this.responder?.deleteInDirection(direction)\n    const domRange = this.getTargetDOMRange({ minLength: this.composing ? 1 : 2 })\n    if (domRange) {\n      return this.withTargetDOMRange(domRange, perform)\n    } else {\n      return perform()\n    }\n  }\n\n  // Selection helpers\n\n  withTargetDOMRange(domRange, fn) {\n    if (typeof domRange === \"function\") {\n      fn = domRange\n      domRange = this.getTargetDOMRange()\n    }\n    if (domRange) {\n      return this.responder?.withTargetDOMRange(domRange, fn.bind(this))\n    } else {\n      selectionChangeObserver.reset()\n      return fn.call(this)\n    }\n  }\n\n  getTargetDOMRange({ minLength } = { minLength: 0 }) {\n    const targetRanges = this.event.getTargetRanges?.()\n    if (targetRanges) {\n      if (targetRanges.length) {\n        const domRange = staticRangeToRange(targetRanges[0])\n        if (minLength === 0 || domRange.toString().length >= minLength) {\n          return domRange\n        }\n      }\n    }\n  }\n\n  withEvent(event, fn) {\n    let result\n    this.event = event\n    try {\n      result = fn.call(this)\n    } finally {\n      this.event = null\n    }\n    return result\n  }\n}\n\nconst staticRangeToRange = function(staticRange) {\n  const range = document.createRange()\n  range.setStart(staticRange.startContainer, staticRange.startOffset)\n  range.setEnd(staticRange.endContainer, staticRange.endOffset)\n  return range\n}\n\n// Event helpers\n\nconst dragEventHasFiles = (event) => Array.from(event.dataTransfer?.types || []).includes(\"Files\")\n\nconst processableFilePaste = (event) => {\n  // Paste events that only have files are handled by the paste event handler,\n  // to work around Safari not supporting beforeinput.insertFromPaste for files.\n\n  // MS Office text pastes include a file with a screenshot of the text, but we should\n  // handle them as text pastes.\n  return event.dataTransfer.files?.[0] && !pasteEventHasFilesOnly(event) && !dataTransferIsMsOfficePaste(event)\n}\n\nconst pasteEventHasFilesOnly = function(event) {\n  const clipboard = event.clipboardData\n  if (clipboard) {\n    const fileTypes = Array.from(clipboard.types).filter((type) => type.match(/file/i)) // \"Files\", \"application/x-moz-file\"\n    return fileTypes.length === clipboard.types.length && clipboard.files.length >= 1\n  }\n}\n\nconst pasteEventHasPlainTextOnly = function(event) {\n  const clipboard = event.clipboardData\n  if (clipboard) {\n    return clipboard.types.includes(\"text/plain\") && clipboard.types.length === 1\n  }\n}\n\nconst keyboardCommandFromKeyEvent = function(event) {\n  const command = []\n  if (event.altKey) {\n    command.push(\"alt\")\n  }\n  if (event.shiftKey) {\n    command.push(\"shift\")\n  }\n  command.push(event.key)\n  return command\n}\n\nconst pointFromEvent = (event) => ({\n  x: event.clientX,\n  y: event.clientY,\n})\n", "import BasicObject from \"trix/core/basic_object\"\n\nimport { findClosestElementFromNode, handleEvent, triggerEvent } from \"trix/core/helpers\"\n\nimport DOMPurify from \"dompurify\"\n\nconst attributeButtonSelector = \"[data-trix-attribute]\"\nconst actionButtonSelector = \"[data-trix-action]\"\nconst toolbarButtonSelector = `${attributeButtonSelector}, ${actionButtonSelector}`\nconst dialogSelector = \"[data-trix-dialog]\"\nconst activeDialogSelector = `${dialogSelector}[data-trix-active]`\nconst dialogButtonSelector = `${dialogSelector} [data-trix-method]`\nconst dialogInputSelector = `${dialogSelector} [data-trix-input]`\nconst getInputForDialog = (element, attributeName) => {\n  if (!attributeName) { attributeName = getAttributeName(element) }\n  return element.querySelector(`[data-trix-input][name='${attributeName}']`)\n}\nconst getActionName = (element) => element.getAttribute(\"data-trix-action\")\nconst getAttributeName = (element) => {\n  return element.getAttribute(\"data-trix-attribute\") || element.getAttribute(\"data-trix-dialog-attribute\")\n}\nconst getDialogName = (element) => element.getAttribute(\"data-trix-dialog\")\n\nexport default class ToolbarController extends BasicObject {\n  constructor(element) {\n    super(element)\n    this.didClickActionButton = this.didClickActionButton.bind(this)\n    this.didClickAttributeButton = this.didClickAttributeButton.bind(this)\n    this.didClickDialogButton = this.didClickDialogButton.bind(this)\n    this.didKeyDownDialogInput = this.didKeyDownDialogInput.bind(this)\n    this.element = element\n    this.attributes = {}\n    this.actions = {}\n    this.resetDialogInputs()\n\n    handleEvent(\"mousedown\", {\n      onElement: this.element,\n      matchingSelector: actionButtonSelector,\n      withCallback: this.didClickActionButton,\n    })\n    handleEvent(\"mousedown\", {\n      onElement: this.element,\n      matchingSelector: attributeButtonSelector,\n      withCallback: this.didClickAttributeButton,\n    })\n    handleEvent(\"click\", { onElement: this.element, matchingSelector: toolbarButtonSelector, preventDefault: true })\n    handleEvent(\"click\", {\n      onElement: this.element,\n      matchingSelector: dialogButtonSelector,\n      withCallback: this.didClickDialogButton,\n    })\n    handleEvent(\"keydown\", {\n      onElement: this.element,\n      matchingSelector: dialogInputSelector,\n      withCallback: this.didKeyDownDialogInput,\n    })\n  }\n\n  // Event handlers\n\n  didClickActionButton(event, element) {\n    this.delegate?.toolbarDidClickButton()\n    event.preventDefault()\n    const actionName = getActionName(element)\n\n    if (this.getDialog(actionName)) {\n      return this.toggleDialog(actionName)\n    } else {\n      return this.delegate?.toolbarDidInvokeAction(actionName, element)\n    }\n  }\n\n  didClickAttributeButton(event, element) {\n    this.delegate?.toolbarDidClickButton()\n    event.preventDefault()\n    const attributeName = getAttributeName(element)\n\n    if (this.getDialog(attributeName)) {\n      this.toggleDialog(attributeName)\n    } else {\n      this.delegate?.toolbarDidToggleAttribute(attributeName)\n    }\n\n    return this.refreshAttributeButtons()\n  }\n\n  didClickDialogButton(event, element) {\n    const dialogElement = findClosestElementFromNode(element, { matchingSelector: dialogSelector })\n    const method = element.getAttribute(\"data-trix-method\")\n    return this[method].call(this, dialogElement)\n  }\n\n  didKeyDownDialogInput(event, element) {\n    if (event.keyCode === 13) {\n      // Enter key\n      event.preventDefault()\n      const attribute = element.getAttribute(\"name\")\n      const dialog = this.getDialog(attribute)\n      this.setAttribute(dialog)\n    }\n    if (event.keyCode === 27) {\n      // Escape key\n      event.preventDefault()\n      return this.hideDialog()\n    }\n  }\n\n  // Action buttons\n\n  updateActions(actions) {\n    this.actions = actions\n    return this.refreshActionButtons()\n  }\n\n  refreshActionButtons() {\n    return this.eachActionButton((element, actionName) => {\n      element.disabled = this.actions[actionName] === false\n    })\n  }\n\n  eachActionButton(callback) {\n    return Array.from(this.element.querySelectorAll(actionButtonSelector)).map((element) =>\n      callback(element, getActionName(element))\n    )\n  }\n\n  // Attribute buttons\n\n  updateAttributes(attributes) {\n    this.attributes = attributes\n    return this.refreshAttributeButtons()\n  }\n\n  refreshAttributeButtons() {\n    return this.eachAttributeButton((element, attributeName) => {\n      element.disabled = this.attributes[attributeName] === false\n      if (this.attributes[attributeName] || this.dialogIsVisible(attributeName)) {\n        element.setAttribute(\"data-trix-active\", \"\")\n        return element.classList.add(\"trix-active\")\n      } else {\n        element.removeAttribute(\"data-trix-active\")\n        return element.classList.remove(\"trix-active\")\n      }\n    })\n  }\n\n  eachAttributeButton(callback) {\n    return Array.from(this.element.querySelectorAll(attributeButtonSelector)).map((element) =>\n      callback(element, getAttributeName(element))\n    )\n  }\n\n  applyKeyboardCommand(keys) {\n    const keyString = JSON.stringify(keys.sort())\n    for (const button of Array.from(this.element.querySelectorAll(\"[data-trix-key]\"))) {\n      const buttonKeys = button.getAttribute(\"data-trix-key\").split(\"+\")\n      const buttonKeyString = JSON.stringify(buttonKeys.sort())\n      if (buttonKeyString === keyString) {\n        triggerEvent(\"mousedown\", { onElement: button })\n        return true\n      }\n    }\n    return false\n  }\n\n  // Dialogs\n\n  dialogIsVisible(dialogName) {\n    const element = this.getDialog(dialogName)\n    if (element) {\n      return element.hasAttribute(\"data-trix-active\")\n    }\n  }\n\n  toggleDialog(dialogName) {\n    if (this.dialogIsVisible(dialogName)) {\n      return this.hideDialog()\n    } else {\n      return this.showDialog(dialogName)\n    }\n  }\n\n  showDialog(dialogName) {\n    this.hideDialog()\n    this.delegate?.toolbarWillShowDialog()\n\n    const element = this.getDialog(dialogName)\n    element.setAttribute(\"data-trix-active\", \"\")\n    element.classList.add(\"trix-active\")\n\n    Array.from(element.querySelectorAll(\"input[disabled]\")).forEach((disabledInput) => {\n      disabledInput.removeAttribute(\"disabled\")\n    })\n\n    const attributeName = getAttributeName(element)\n    if (attributeName) {\n      const input = getInputForDialog(element, dialogName)\n      if (input) {\n        input.value = this.attributes[attributeName] || \"\"\n        input.select()\n      }\n    }\n\n    return this.delegate?.toolbarDidShowDialog(dialogName)\n  }\n\n  setAttribute(dialogElement) {\n    const attributeName = getAttributeName(dialogElement)\n    const input = getInputForDialog(dialogElement, attributeName)\n\n    if (input.willValidate) {\n      input.setCustomValidity(\"\")\n      if (!input.checkValidity() || !this.isSafeAttribute(input)) {\n        input.setCustomValidity(\"Invalid value\")\n        input.setAttribute(\"data-trix-validate\", \"\")\n        input.classList.add(\"trix-validate\")\n        return input.focus()\n      }\n    }\n    this.delegate?.toolbarDidUpdateAttribute(attributeName, input.value)\n    return this.hideDialog()\n  }\n\n  isSafeAttribute(input) {\n    if (input.hasAttribute(\"data-trix-validate-href\")) {\n      return DOMPurify.isValidAttribute(\"a\", \"href\", input.value)\n    } else {\n      return true\n    }\n  }\n\n  removeAttribute(dialogElement) {\n    const attributeName = getAttributeName(dialogElement)\n    this.delegate?.toolbarDidRemoveAttribute(attributeName)\n    return this.hideDialog()\n  }\n\n  hideDialog() {\n    const element = this.element.querySelector(activeDialogSelector)\n    if (element) {\n      element.removeAttribute(\"data-trix-active\")\n      element.classList.remove(\"trix-active\")\n      this.resetDialogInputs()\n      return this.delegate?.toolbarDidHideDialog(getDialogName(element))\n    }\n  }\n\n  resetDialogInputs() {\n    Array.from(this.element.querySelectorAll(dialogInputSelector)).forEach((input) => {\n      input.setAttribute(\"disabled\", \"disabled\")\n      input.removeAttribute(\"data-trix-validate\")\n      input.classList.remove(\"trix-validate\")\n    })\n  }\n\n  getDialog(dialogName) {\n    return this.element.querySelector(`[data-trix-dialog=${dialogName}]`)\n  }\n}\n", "/* eslint-disable\n    id-length,\n*/\nimport * as config from \"trix/config\"\n\nimport { serializeToContentType } from \"trix/core/serialization\"\n\nimport Controller from \"trix/controllers/controller\"\nimport Level0InputController from \"trix/controllers/level_0_input_controller\"\nimport Level2InputController from \"trix/controllers/level_2_input_controller\"\nimport CompositionController from \"trix/controllers/composition_controller\"\nimport ToolbarController from \"trix/controllers/toolbar_controller\"\nimport Composition from \"trix/models/composition\"\nimport Editor from \"trix/models/editor\"\nimport AttachmentManager from \"trix/models/attachment_manager\"\nimport SelectionManager from \"trix/models/selection_manager\"\n\nimport { getBlockConfig, objectsAreEqual, rangeIsCollapsed, rangesAreEqual } from \"trix/core/helpers\"\nimport { selectionChangeObserver } from \"trix/observers/selection_change_observer\"\n\nconst snapshotsAreEqual = (a, b) => rangesAreEqual(a.selectedRange, b.selectedRange) && a.document.isEqualTo(b.document)\n\nexport default class EditorController extends Controller {\n  static actions = {\n    undo: {\n      test() {\n        return this.editor.canUndo()\n      },\n      perform() {\n        return this.editor.undo()\n      },\n    },\n    redo: {\n      test() {\n        return this.editor.canRedo()\n      },\n      perform() {\n        return this.editor.redo()\n      },\n    },\n    link: {\n      test() {\n        return this.editor.canActivateAttribute(\"href\")\n      },\n    },\n    increaseNestingLevel: {\n      test() {\n        return this.editor.canIncreaseNestingLevel()\n      },\n      perform() {\n        return this.editor.increaseNestingLevel() && this.render()\n      },\n    },\n    decreaseNestingLevel: {\n      test() {\n        return this.editor.canDecreaseNestingLevel()\n      },\n      perform() {\n        return this.editor.decreaseNestingLevel() && this.render()\n      },\n    },\n    attachFiles: {\n      test() {\n        return true\n      },\n      perform() {\n        return config.input.pickFiles(this.editor.insertFiles)\n      },\n    },\n  }\n\n  constructor({ editorElement, document, html }) {\n    super(...arguments)\n    this.editorElement = editorElement\n    this.selectionManager = new SelectionManager(this.editorElement)\n    this.selectionManager.delegate = this\n\n    this.composition = new Composition()\n    this.composition.delegate = this\n\n    this.attachmentManager = new AttachmentManager(this.composition.getAttachments())\n    this.attachmentManager.delegate = this\n\n    this.inputController =\n      config.input.getLevel() === 2\n        ? new Level2InputController(this.editorElement)\n        : new Level0InputController(this.editorElement)\n\n    this.inputController.delegate = this\n    this.inputController.responder = this.composition\n\n    this.compositionController = new CompositionController(this.editorElement, this.composition)\n    this.compositionController.delegate = this\n\n    this.toolbarController = new ToolbarController(this.editorElement.toolbarElement)\n    this.toolbarController.delegate = this\n\n    this.editor = new Editor(this.composition, this.selectionManager, this.editorElement)\n    if (document) {\n      this.editor.loadDocument(document)\n    } else {\n      this.editor.loadHTML(html)\n    }\n  }\n\n  registerSelectionManager() {\n    return selectionChangeObserver.registerSelectionManager(this.selectionManager)\n  }\n\n  unregisterSelectionManager() {\n    return selectionChangeObserver.unregisterSelectionManager(this.selectionManager)\n  }\n\n  render() {\n    return this.compositionController.render()\n  }\n\n  reparse() {\n    return this.composition.replaceHTML(this.editorElement.innerHTML)\n  }\n\n  // Composition delegate\n\n  compositionDidChangeDocument(document) {\n    this.notifyEditorElement(\"document-change\")\n    if (!this.handlingInput) {\n      return this.render()\n    }\n  }\n\n  compositionDidChangeCurrentAttributes(currentAttributes) {\n    this.currentAttributes = currentAttributes\n    this.toolbarController.updateAttributes(this.currentAttributes)\n    this.updateCurrentActions()\n    return this.notifyEditorElement(\"attributes-change\", { attributes: this.currentAttributes })\n  }\n\n  compositionDidPerformInsertionAtRange(range) {\n    if (this.pasting) {\n      this.pastedRange = range\n    }\n  }\n\n  compositionShouldAcceptFile(file) {\n    return this.notifyEditorElement(\"file-accept\", { file })\n  }\n\n  compositionDidAddAttachment(attachment) {\n    const managedAttachment = this.attachmentManager.manageAttachment(attachment)\n    return this.notifyEditorElement(\"attachment-add\", { attachment: managedAttachment })\n  }\n\n  compositionDidEditAttachment(attachment) {\n    this.compositionController.rerenderViewForObject(attachment)\n    const managedAttachment = this.attachmentManager.manageAttachment(attachment)\n    this.notifyEditorElement(\"attachment-edit\", { attachment: managedAttachment })\n    return this.notifyEditorElement(\"change\")\n  }\n\n  compositionDidChangeAttachmentPreviewURL(attachment) {\n    this.compositionController.invalidateViewForObject(attachment)\n    return this.notifyEditorElement(\"change\")\n  }\n\n  compositionDidRemoveAttachment(attachment) {\n    const managedAttachment = this.attachmentManager.unmanageAttachment(attachment)\n    return this.notifyEditorElement(\"attachment-remove\", { attachment: managedAttachment })\n  }\n\n  compositionDidStartEditingAttachment(attachment, options) {\n    this.attachmentLocationRange = this.composition.document.getLocationRangeOfAttachment(attachment)\n    this.compositionController.installAttachmentEditorForAttachment(attachment, options)\n    return this.selectionManager.setLocationRange(this.attachmentLocationRange)\n  }\n\n  compositionDidStopEditingAttachment(attachment) {\n    this.compositionController.uninstallAttachmentEditor()\n    this.attachmentLocationRange = null\n  }\n\n  compositionDidRequestChangingSelectionToLocationRange(locationRange) {\n    if (this.loadingSnapshot && !this.isFocused()) return\n    this.requestedLocationRange = locationRange\n    this.compositionRevisionWhenLocationRangeRequested = this.composition.revision\n    if (!this.handlingInput) {\n      return this.render()\n    }\n  }\n\n  compositionWillLoadSnapshot() {\n    this.loadingSnapshot = true\n  }\n\n  compositionDidLoadSnapshot() {\n    this.compositionController.refreshViewCache()\n    this.render()\n    this.loadingSnapshot = false\n  }\n\n  getSelectionManager() {\n    return this.selectionManager\n  }\n\n  // Attachment manager delegate\n\n  attachmentManagerDidRequestRemovalOfAttachment(attachment) {\n    return this.removeAttachment(attachment)\n  }\n\n  // Document controller delegate\n\n  compositionControllerWillSyncDocumentView() {\n    this.inputController.editorWillSyncDocumentView()\n    this.selectionManager.lock()\n    return this.selectionManager.clearSelection()\n  }\n\n  compositionControllerDidSyncDocumentView() {\n    this.inputController.editorDidSyncDocumentView()\n    this.selectionManager.unlock()\n    this.updateCurrentActions()\n    return this.notifyEditorElement(\"sync\")\n  }\n\n  compositionControllerDidRender() {\n    if (this.requestedLocationRange) {\n      if (this.compositionRevisionWhenLocationRangeRequested === this.composition.revision) {\n        this.selectionManager.setLocationRange(this.requestedLocationRange)\n      }\n      this.requestedLocationRange = null\n      this.compositionRevisionWhenLocationRangeRequested = null\n    }\n\n    if (this.renderedCompositionRevision !== this.composition.revision) {\n      this.runEditorFilters()\n      this.composition.updateCurrentAttributes()\n      this.notifyEditorElement(\"render\")\n    }\n\n    this.renderedCompositionRevision = this.composition.revision\n  }\n\n  compositionControllerDidFocus() {\n    if (this.isFocusedInvisibly()) {\n      this.setLocationRange({ index: 0, offset: 0 })\n    }\n    this.toolbarController.hideDialog()\n    return this.notifyEditorElement(\"focus\")\n  }\n\n  compositionControllerDidBlur() {\n    return this.notifyEditorElement(\"blur\")\n  }\n\n  compositionControllerDidSelectAttachment(attachment, options) {\n    this.toolbarController.hideDialog()\n    return this.composition.editAttachment(attachment, options)\n  }\n\n  compositionControllerDidRequestDeselectingAttachment(attachment) {\n    const locationRange = this.attachmentLocationRange || this.composition.document.getLocationRangeOfAttachment(attachment)\n    return this.selectionManager.setLocationRange(locationRange[1])\n  }\n\n  compositionControllerWillUpdateAttachment(attachment) {\n    return this.editor.recordUndoEntry(\"Edit Attachment\", { context: attachment.id, consolidatable: true })\n  }\n\n  compositionControllerDidRequestRemovalOfAttachment(attachment) {\n    return this.removeAttachment(attachment)\n  }\n\n  // Input controller delegate\n\n  inputControllerWillHandleInput() {\n    this.handlingInput = true\n    this.requestedRender = false\n  }\n\n  inputControllerDidRequestRender() {\n    this.requestedRender = true\n  }\n\n  inputControllerDidHandleInput() {\n    this.handlingInput = false\n    if (this.requestedRender) {\n      this.requestedRender = false\n      return this.render()\n    }\n  }\n\n  inputControllerDidAllowUnhandledInput() {\n    return this.notifyEditorElement(\"change\")\n  }\n\n  inputControllerDidRequestReparse() {\n    return this.reparse()\n  }\n\n  inputControllerWillPerformTyping() {\n    return this.recordTypingUndoEntry()\n  }\n\n  inputControllerWillPerformFormatting(attributeName) {\n    return this.recordFormattingUndoEntry(attributeName)\n  }\n\n  inputControllerWillCutText() {\n    return this.editor.recordUndoEntry(\"Cut\")\n  }\n\n  inputControllerWillPaste(paste) {\n    this.editor.recordUndoEntry(\"Paste\")\n    this.pasting = true\n    return this.notifyEditorElement(\"before-paste\", { paste })\n  }\n\n  inputControllerDidPaste(paste) {\n    paste.range = this.pastedRange\n    this.pastedRange = null\n    this.pasting = null\n    return this.notifyEditorElement(\"paste\", { paste })\n  }\n\n  inputControllerWillMoveText() {\n    return this.editor.recordUndoEntry(\"Move\")\n  }\n\n  inputControllerWillAttachFiles() {\n    return this.editor.recordUndoEntry(\"Drop Files\")\n  }\n\n  inputControllerWillPerformUndo() {\n    return this.editor.undo()\n  }\n\n  inputControllerWillPerformRedo() {\n    return this.editor.redo()\n  }\n\n  inputControllerDidReceiveKeyboardCommand(keys) {\n    return this.toolbarController.applyKeyboardCommand(keys)\n  }\n\n  inputControllerDidStartDrag() {\n    this.locationRangeBeforeDrag = this.selectionManager.getLocationRange()\n  }\n\n  inputControllerDidReceiveDragOverPoint(point) {\n    return this.selectionManager.setLocationRangeFromPointRange(point)\n  }\n\n  inputControllerDidCancelDrag() {\n    this.selectionManager.setLocationRange(this.locationRangeBeforeDrag)\n    this.locationRangeBeforeDrag = null\n  }\n\n  // Selection manager delegate\n\n  locationRangeDidChange(locationRange) {\n    this.composition.updateCurrentAttributes()\n    this.updateCurrentActions()\n    if (this.attachmentLocationRange && !rangesAreEqual(this.attachmentLocationRange, locationRange)) {\n      this.composition.stopEditingAttachment()\n    }\n    return this.notifyEditorElement(\"selection-change\")\n  }\n\n  // Toolbar controller delegate\n\n  toolbarDidClickButton() {\n    if (!this.getLocationRange()) {\n      return this.setLocationRange({ index: 0, offset: 0 })\n    }\n  }\n\n  toolbarDidInvokeAction(actionName, invokingElement) {\n    return this.invokeAction(actionName, invokingElement)\n  }\n\n  toolbarDidToggleAttribute(attributeName) {\n    this.recordFormattingUndoEntry(attributeName)\n    this.composition.toggleCurrentAttribute(attributeName)\n    this.render()\n    if (!this.selectionFrozen) {\n      return this.editorElement.focus()\n    }\n  }\n\n  toolbarDidUpdateAttribute(attributeName, value) {\n    this.recordFormattingUndoEntry(attributeName)\n    this.composition.setCurrentAttribute(attributeName, value)\n    this.render()\n    if (!this.selectionFrozen) {\n      return this.editorElement.focus()\n    }\n  }\n\n  toolbarDidRemoveAttribute(attributeName) {\n    this.recordFormattingUndoEntry(attributeName)\n    this.composition.removeCurrentAttribute(attributeName)\n    this.render()\n    if (!this.selectionFrozen) {\n      return this.editorElement.focus()\n    }\n  }\n\n  toolbarWillShowDialog(dialogElement) {\n    this.composition.expandSelectionForEditing()\n    return this.freezeSelection()\n  }\n\n  toolbarDidShowDialog(dialogName) {\n    return this.notifyEditorElement(\"toolbar-dialog-show\", { dialogName })\n  }\n\n  toolbarDidHideDialog(dialogName) {\n    this.thawSelection()\n    this.editorElement.focus()\n    return this.notifyEditorElement(\"toolbar-dialog-hide\", { dialogName })\n  }\n\n  // Selection\n\n  freezeSelection() {\n    if (!this.selectionFrozen) {\n      this.selectionManager.lock()\n      this.composition.freezeSelection()\n      this.selectionFrozen = true\n      return this.render()\n    }\n  }\n\n  thawSelection() {\n    if (this.selectionFrozen) {\n      this.composition.thawSelection()\n      this.selectionManager.unlock()\n      this.selectionFrozen = false\n      return this.render()\n    }\n  }\n\n  canInvokeAction(actionName) {\n    if (this.actionIsExternal(actionName)) {\n      return true\n    } else {\n      return !!this.actions[actionName]?.test?.call(this)\n    }\n  }\n\n  invokeAction(actionName, invokingElement) {\n    if (this.actionIsExternal(actionName)) {\n      return this.notifyEditorElement(\"action-invoke\", { actionName, invokingElement })\n    } else {\n      return this.actions[actionName]?.perform?.call(this)\n    }\n  }\n\n  actionIsExternal(actionName) {\n    return /^x-./.test(actionName)\n  }\n\n  getCurrentActions() {\n    const result = {}\n    for (const actionName in this.actions) {\n      result[actionName] = this.canInvokeAction(actionName)\n    }\n    return result\n  }\n\n  updateCurrentActions() {\n    const currentActions = this.getCurrentActions()\n    if (!objectsAreEqual(currentActions, this.currentActions)) {\n      this.currentActions = currentActions\n      this.toolbarController.updateActions(this.currentActions)\n      return this.notifyEditorElement(\"actions-change\", { actions: this.currentActions })\n    }\n  }\n\n  // Editor filters\n\n  runEditorFilters() {\n    let snapshot = this.composition.getSnapshot()\n\n    Array.from(this.editor.filters).forEach((filter) => {\n      const { document, selectedRange } = snapshot\n      snapshot = filter.call(this.editor, snapshot) || {}\n      if (!snapshot.document) {\n        snapshot.document = document\n      }\n      if (!snapshot.selectedRange) {\n        snapshot.selectedRange = selectedRange\n      }\n    })\n\n    if (!snapshotsAreEqual(snapshot, this.composition.getSnapshot())) {\n      return this.composition.loadSnapshot(snapshot)\n    }\n  }\n\n  // Private\n\n  updateInputElement() {\n    const element = this.compositionController.getSerializableElement()\n    const value = serializeToContentType(element, \"text/html\")\n    return this.editorElement.setFormValue(value)\n  }\n\n  notifyEditorElement(message, data) {\n    switch (message) {\n      case \"document-change\":\n        this.documentChangedSinceLastRender = true\n        break\n      case \"render\":\n        if (this.documentChangedSinceLastRender) {\n          this.documentChangedSinceLastRender = false\n          this.notifyEditorElement(\"change\")\n        }\n        break\n      case \"change\":\n      case \"attachment-add\":\n      case \"attachment-edit\":\n      case \"attachment-remove\":\n        this.updateInputElement()\n        break\n    }\n\n    return this.editorElement.notify(message, data)\n  }\n\n  removeAttachment(attachment) {\n    this.editor.recordUndoEntry(\"Delete Attachment\")\n    this.composition.removeAttachment(attachment)\n    return this.render()\n  }\n\n  recordFormattingUndoEntry(attributeName) {\n    const blockConfig = getBlockConfig(attributeName)\n    const locationRange = this.selectionManager.getLocationRange()\n    if (blockConfig || !rangeIsCollapsed(locationRange)) {\n      return this.editor.recordUndoEntry(\"Formatting\", { context: this.getUndoContext(), consolidatable: true })\n    }\n  }\n\n  recordTypingUndoEntry() {\n    return this.editor.recordUndoEntry(\"Typing\", {\n      context: this.getUndoContext(this.currentAttributes),\n      consolidatable: true,\n    })\n  }\n\n  getUndoContext(...context) {\n    return [ this.getLocationContext(), this.getTimeContext(), ...Array.from(context) ]\n  }\n\n  getLocationContext() {\n    const locationRange = this.selectionManager.getLocationRange()\n    if (rangeIsCollapsed(locationRange)) {\n      return locationRange[0].index\n    } else {\n      return locationRange\n    }\n  }\n\n  getTimeContext() {\n    if (config.undo.interval > 0) {\n      return Math.floor(new Date().getTime() / config.undo.interval)\n    } else {\n      return 0\n    }\n  }\n\n  isFocused() {\n    return this.editorElement === this.editorElement.ownerDocument?.activeElement\n  }\n\n  // Detect \"Cursor disappears sporadically\" Firefox bug.\n  // - https://bugzilla.mozilla.org/show_bug.cgi?id=226301\n  isFocusedInvisibly() {\n    return this.isFocused() && !this.getLocationRange()\n  }\n\n  get actions() {\n    return this.constructor.actions\n  }\n}\n\nEditorController.proxyMethod(\"getSelectionManager().setLocationRange\")\nEditorController.proxyMethod(\"getSelectionManager().getLocationRange\")\n", "import * as config from \"trix/config\"\n\nimport { installDefaultCSSForTagName } from \"trix/core/helpers\"\n\ninstallDefaultCSSForTagName(\"trix-toolbar\", `\\\n%t {\n  display: block;\n}\n\n%t {\n  white-space: nowrap;\n}\n\n%t [data-trix-dialog] {\n  display: none;\n}\n\n%t [data-trix-dialog][data-trix-active] {\n  display: block;\n}\n\n%t [data-trix-dialog] [data-trix-validate]:invalid {\n  background-color: #ffdddd;\n}`)\n\nexport default class TrixToolbarElement extends HTMLElement {\n\n  // Element lifecycle\n\n  connectedCallback() {\n    if (this.innerHTML === \"\") {\n      this.innerHTML = config.toolbar.getDefaultHTML()\n    }\n  }\n\n  // Properties\n\n  get editorElements() {\n    if (this.id) {\n      const nodeList = this.ownerDocument?.querySelectorAll(`trix-editor[toolbar=\"${this.id}\"]`)\n\n      return Array.from(nodeList)\n    } else {\n      return []\n    }\n  }\n\n  get editorElement() {\n    const [ editorElement ] = this.editorElements\n\n    return editorElement\n  }\n}\n", "import * as config from \"trix/config\"\n\nimport {\n  findClosestElementFromNode,\n  handleEvent,\n  handleEventOnce,\n  installDefaultCSSForTagName,\n  makeElement,\n  triggerEvent,\n} from \"trix/core/helpers\"\n\nimport { attachmentSelector } from \"trix/config/attachments\"\nimport EditorController from \"trix/controllers/editor_controller\"\nimport \"trix/elements/trix_toolbar_element\"\n\nlet id = 0\n\n// Contenteditable support helpers\n\nconst autofocus = function(element) {\n  if (!document.querySelector(\":focus\")) {\n    if (element.hasAttribute(\"autofocus\") && document.querySelector(\"[autofocus]\") === element) {\n      return element.focus()\n    }\n  }\n}\n\nconst makeEditable = function(element) {\n  if (element.hasAttribute(\"contenteditable\")) {\n    return\n  }\n  element.toggleAttribute(\"contenteditable\", !element.disabled)\n  return handleEventOnce(\"focus\", {\n    onElement: element,\n    withCallback() {\n      return configureContentEditable(element)\n    },\n  })\n}\n\nconst configureContentEditable = function(element) {\n  disableObjectResizing(element)\n  return setDefaultParagraphSeparator(element)\n}\n\nconst disableObjectResizing = function(element) {\n  if (document.queryCommandSupported?.(\"enableObjectResizing\")) {\n    document.execCommand(\"enableObjectResizing\", false, false)\n    return handleEvent(\"mscontrolselect\", { onElement: element, preventDefault: true })\n  }\n}\n\nconst setDefaultParagraphSeparator = function(element) {\n  if (document.queryCommandSupported?.(\"DefaultParagraphSeparator\")) {\n    const { tagName } = config.blockAttributes.default\n    if ([ \"div\", \"p\" ].includes(tagName)) {\n      return document.execCommand(\"DefaultParagraphSeparator\", false, tagName)\n    }\n  }\n}\n\n// Accessibility helpers\n\nconst addAccessibilityRole = function(element) {\n  if (element.hasAttribute(\"role\")) {\n    return\n  }\n  return element.setAttribute(\"role\", \"textbox\")\n}\n\nconst ensureAriaLabel = function(element) {\n  if (element.hasAttribute(\"aria-label\") || element.hasAttribute(\"aria-labelledby\")) {\n    return\n  }\n\n  const update = function() {\n    const texts = Array.from(element.labels).map((label) => {\n      if (!label.contains(element)) return label.textContent\n    }).filter(text => text)\n\n    const text = texts.join(\" \")\n    if (text) {\n      return element.setAttribute(\"aria-label\", text)\n    } else {\n      return element.removeAttribute(\"aria-label\")\n    }\n  }\n  update()\n  return handleEvent(\"focus\", { onElement: element, withCallback: update })\n}\n\n// Style\n\nconst cursorTargetStyles = (function() {\n  if (config.browser.forcesObjectResizing) {\n    return {\n      display: \"inline\",\n      width: \"auto\",\n    }\n  } else {\n    return {\n      display: \"inline-block\",\n      width: \"1px\",\n    }\n  }\n})()\n\ninstallDefaultCSSForTagName(\"trix-editor\", `\\\n%t {\n    display: block;\n}\n\n%t:empty::before {\n    content: attr(placeholder);\n    color: graytext;\n    cursor: text;\n    pointer-events: none;\n    white-space: pre-line;\n}\n\n%t a[contenteditable=false] {\n    cursor: text;\n}\n\n%t img {\n    max-width: 100%;\n    height: auto;\n}\n\n%t ${attachmentSelector} figcaption textarea {\n    resize: none;\n}\n\n%t ${attachmentSelector} figcaption textarea.trix-autoresize-clone {\n    position: absolute;\n    left: -9999px;\n    max-height: 0px;\n}\n\n%t ${attachmentSelector} figcaption[data-trix-placeholder]:empty::before {\n    content: attr(data-trix-placeholder);\n    color: graytext;\n}\n\n%t [data-trix-cursor-target] {\n    display: ${cursorTargetStyles.display} !important;\n    width: ${cursorTargetStyles.width} !important;\n    padding: 0 !important;\n    margin: 0 !important;\n    border: none !important;\n}\n\n%t [data-trix-cursor-target=left] {\n    vertical-align: top !important;\n    margin-left: -1px !important;\n}\n\n%t [data-trix-cursor-target=right] {\n    vertical-align: bottom !important;\n    margin-right: -1px !important;\n}`)\n\nclass ElementInternalsDelegate {\n  value = \"\"\n  #internals\n  #formDisabled\n\n  constructor(element) {\n    this.element = element\n    this.#internals = element.attachInternals()\n    this.#formDisabled = false\n  }\n\n  connectedCallback() {\n    this.#validate()\n  }\n\n  disconnectedCallback() {\n  }\n\n  get form() {\n    return this.#internals.form\n  }\n\n  get name() {\n    return this.element.getAttribute(\"name\")\n  }\n\n  set name(value) {\n    this.element.setAttribute(\"name\", value)\n  }\n\n  get labels() {\n    return this.#internals.labels\n  }\n\n  get disabled() {\n    return this.#formDisabled || this.element.hasAttribute(\"disabled\")\n  }\n\n  set disabled(value) {\n    this.element.toggleAttribute(\"disabled\", value)\n  }\n\n  get required() {\n    return this.element.hasAttribute(\"required\")\n  }\n\n  set required(value) {\n    this.element.toggleAttribute(\"required\", value)\n    this.#validate()\n  }\n\n  get validity() {\n    return this.#internals.validity\n  }\n\n  get validationMessage() {\n    return this.#internals.validationMessage\n  }\n\n  get willValidate() {\n    return this.#internals.willValidate\n  }\n\n  formDisabledCallback(disabled) {\n    this.#formDisabled = disabled\n  }\n\n  setFormValue(value) {\n    this.value = value\n    this.#validate()\n    this.#internals.setFormValue(this.element.disabled ? undefined : this.value)\n  }\n\n  checkValidity() {\n    return this.#internals.checkValidity()\n  }\n\n  reportValidity() {\n    return this.#internals.reportValidity()\n  }\n\n  setCustomValidity(validationMessage) {\n    this.#validate(validationMessage)\n  }\n\n  #validate(customValidationMessage = \"\") {\n    const { required, value } = this.element\n    const valueMissing = required && !value\n    const customError = !!customValidationMessage\n    const input = makeElement(\"input\", { required })\n    const validationMessage = customValidationMessage || input.validationMessage\n\n    this.#internals.setValidity({ valueMissing, customError }, validationMessage)\n  }\n}\n\nclass LegacyDelegate {\n  #focusHandler\n\n  constructor(element) {\n    this.element = element\n  }\n\n  connectedCallback() {\n    this.#focusHandler = ensureAriaLabel(this.element)\n    window.addEventListener(\"reset\", this.#resetBubbled, false)\n    window.addEventListener(\"click\", this.#clickBubbled, false)\n  }\n\n  disconnectedCallback() {\n    this.#focusHandler?.destroy()\n    window.removeEventListener(\"reset\", this.#resetBubbled, false)\n    window.removeEventListener(\"click\", this.#clickBubbled, false)\n  }\n\n  get labels() {\n    const labels = []\n    if (this.element.id && this.element.ownerDocument) {\n      labels.push(...Array.from(this.element.ownerDocument.querySelectorAll(`label[for='${this.element.id}']`) || []))\n    }\n\n    const label = findClosestElementFromNode(this.element, { matchingSelector: \"label\" })\n    if (label) {\n      if ([ this.element, null ].includes(label.control)) {\n        labels.push(label)\n      }\n    }\n\n    return labels\n  }\n\n  get form() {\n    console.warn(\"This browser does not support the .form property for trix-editor elements.\")\n\n    return null\n  }\n\n  get name() {\n    console.warn(\"This browser does not support the .name property for trix-editor elements.\")\n\n    return null\n  }\n\n  set name(value) {\n    console.warn(\"This browser does not support the .name property for trix-editor elements.\")\n  }\n\n  get disabled() {\n    console.warn(\"This browser does not support the [disabled] attribute for trix-editor elements.\")\n\n    return false\n  }\n\n  set disabled(value) {\n    console.warn(\"This browser does not support the [disabled] attribute for trix-editor elements.\")\n  }\n\n  get required() {\n    console.warn(\"This browser does not support the [required] attribute for trix-editor elements.\")\n\n    return false\n  }\n\n  set required(value) {\n    console.warn(\"This browser does not support the [required] attribute for trix-editor elements.\")\n  }\n\n  get validity() {\n    console.warn(\"This browser does not support the validity property for trix-editor elements.\")\n    return null\n  }\n\n  get validationMessage() {\n    console.warn(\"This browser does not support the validationMessage property for trix-editor elements.\")\n\n    return \"\"\n  }\n\n  get willValidate() {\n    console.warn(\"This browser does not support the willValidate property for trix-editor elements.\")\n\n    return false\n  }\n\n  formDisabledCallback(value) {\n  }\n\n  setFormValue(value) {\n  }\n\n  checkValidity() {\n    console.warn(\"This browser does not support checkValidity() for trix-editor elements.\")\n\n    return true\n  }\n\n  reportValidity() {\n    console.warn(\"This browser does not support reportValidity() for trix-editor elements.\")\n\n    return true\n  }\n\n  setCustomValidity(validationMessage) {\n    console.warn(\"This browser does not support setCustomValidity(validationMessage) for trix-editor elements.\")\n  }\n\n  #resetBubbled = (event) => {\n    if (event.defaultPrevented) return\n    if (event.target !== this.element.form) return\n    this.element.reset()\n  }\n\n  #clickBubbled = (event) => {\n    if (event.defaultPrevented) return\n    if (this.element.contains(event.target)) return\n\n    const label = findClosestElementFromNode(event.target, { matchingSelector: \"label\" })\n    if (!label) return\n\n    if (!Array.from(this.labels).includes(label)) return\n\n    this.element.focus()\n  }\n}\n\nexport default class TrixEditorElement extends HTMLElement {\n  static formAssociated = \"ElementInternals\" in window\n\n  static observedAttributes = [ \"connected\" ]\n\n  #delegate\n\n  constructor() {\n    super()\n    this.willCreateInput = true\n    this.#delegate = this.constructor.formAssociated ?\n      new ElementInternalsDelegate(this) :\n      new LegacyDelegate(this)\n  }\n\n  // Properties\n\n  get trixId() {\n    if (this.hasAttribute(\"trix-id\")) {\n      return this.getAttribute(\"trix-id\")\n    } else {\n      this.setAttribute(\"trix-id\", ++id)\n      return this.trixId\n    }\n  }\n\n  get labels() {\n    return this.#delegate.labels\n  }\n\n  get disabled() {\n    const { inputElement } = this\n\n    if (inputElement) {\n      return inputElement.disabled\n    } else {\n      return this.#delegate.disabled\n    }\n  }\n\n  set disabled(value) {\n    const { inputElement } = this\n\n    if (inputElement) {\n      inputElement.disabled = value\n    }\n    this.#delegate.disabled = value\n  }\n\n  get required() {\n    return this.#delegate.required\n  }\n\n  set required(value) {\n    this.#delegate.required = value\n  }\n\n  get validity() {\n    return this.#delegate.validity\n  }\n\n  get validationMessage() {\n    return this.#delegate.validationMessage\n  }\n\n  get willValidate() {\n    return this.#delegate.willValidate\n  }\n\n  get type() {\n    return this.localName\n  }\n\n  get toolbarElement() {\n    if (this.hasAttribute(\"toolbar\")) {\n      return this.ownerDocument?.getElementById(this.getAttribute(\"toolbar\"))\n    } else if (this.parentNode) {\n      const toolbarId = `trix-toolbar-${this.trixId}`\n      this.setAttribute(\"toolbar\", toolbarId)\n      this.internalToolbar = makeElement(\"trix-toolbar\", { id: toolbarId })\n      this.parentNode.insertBefore(this.internalToolbar, this)\n      return this.internalToolbar\n    } else {\n      return undefined\n    }\n  }\n\n  get form() {\n    const { inputElement } = this\n\n    if (inputElement) {\n      return inputElement.form\n    } else {\n      return this.#delegate.form\n    }\n  }\n\n  get inputElement() {\n    if (this.hasAttribute(\"input\")) {\n      return this.ownerDocument?.getElementById(this.getAttribute(\"input\"))\n    } else {\n      return undefined\n    }\n  }\n\n  get editor() {\n    return this.editorController?.editor\n  }\n\n  get name() {\n    const { inputElement } = this\n\n    if (inputElement) {\n      return inputElement.name\n    } else {\n      return this.#delegate.name\n    }\n  }\n\n  set name(value) {\n    const { inputElement } = this\n\n    if (inputElement) {\n      inputElement.name = value\n    } else {\n      this.#delegate.name = value\n    }\n  }\n\n  get value() {\n    const { inputElement } = this\n\n    if (inputElement) {\n      return inputElement.value\n    } else {\n      return this.#delegate.value\n    }\n  }\n\n  set value(defaultValue) {\n    this.defaultValue = defaultValue\n    this.editor?.loadHTML(this.defaultValue)\n  }\n\n  // Element callbacks\n\n  attributeChangedCallback(name, oldValue, newValue) {\n    if (name === \"connected\" && this.isConnected && oldValue != null && oldValue !== newValue) {\n      requestAnimationFrame(() => this.reconnect())\n    }\n  }\n\n  // Controller delegate methods\n\n  notify(message, data) {\n    if (this.editorController) {\n      return triggerEvent(`trix-${message}`, { onElement: this, attributes: data })\n    }\n  }\n\n  setFormValue(value) {\n    const { inputElement } = this\n\n    if (inputElement) {\n      inputElement.value = value\n    }\n    this.#delegate.setFormValue(value)\n  }\n\n  // Element lifecycle\n\n  connectedCallback() {\n    if (!this.hasAttribute(\"data-trix-internal\")) {\n      makeEditable(this)\n      addAccessibilityRole(this)\n\n      if (!this.editorController) {\n        triggerEvent(\"trix-before-initialize\", { onElement: this })\n        this.defaultValue = this.inputElement ? this.inputElement.value : this.innerHTML\n        if (!this.hasAttribute(\"input\") && this.parentNode && this.willCreateInput) {\n          const inputId = `trix-input-${this.trixId}`\n          this.setAttribute(\"input\", inputId)\n          const element = makeElement(\"input\", { type: \"hidden\", id: inputId })\n          this.parentNode.insertBefore(element, this.nextElementSibling)\n        }\n        this.editorController = new EditorController({\n          editorElement: this,\n          html: this.defaultValue\n        })\n        requestAnimationFrame(() => triggerEvent(\"trix-initialize\", { onElement: this }))\n      }\n      this.editorController.registerSelectionManager()\n      this.#delegate.connectedCallback()\n\n      this.toggleAttribute(\"connected\", true)\n      autofocus(this)\n    }\n  }\n\n  disconnectedCallback() {\n    this.editorController?.unregisterSelectionManager()\n    this.#delegate.disconnectedCallback()\n    this.toggleAttribute(\"connected\", false)\n  }\n\n  reconnect() {\n    this.removeInternalToolbar()\n    this.disconnectedCallback()\n    this.connectedCallback()\n  }\n\n  removeInternalToolbar() {\n    this.internalToolbar?.remove()\n    this.internalToolbar = null\n  }\n\n  // Form support\n\n  checkValidity() {\n    return this.#delegate.checkValidity()\n  }\n\n  reportValidity() {\n    return this.#delegate.reportValidity()\n  }\n\n  setCustomValidity(validationMessage) {\n    this.#delegate.setCustomValidity(validationMessage)\n  }\n\n  formDisabledCallback(disabled) {\n    const { inputElement } = this\n\n    if (inputElement) {\n      inputElement.disabled = disabled\n    }\n    this.toggleAttribute(\"contenteditable\", !disabled)\n    this.#delegate.formDisabledCallback(disabled)\n  }\n\n  formResetCallback() {\n    this.reset()\n  }\n\n  reset() {\n    this.value = this.defaultValue\n  }\n}\n", "import { version } from \"../../package.json\"\n\nimport * as config from \"trix/config\"\nimport * as core from \"trix/core\"\nimport * as models from \"trix/models\"\nimport * as views from \"trix/views\"\nimport * as controllers from \"trix/controllers\"\nimport * as observers from \"trix/observers\"\nimport * as operations from \"trix/operations\"\nimport * as elements from \"trix/elements\"\nimport * as filters from \"trix/filters\"\n\nconst Trix = {\n  VERSION: version,\n  config,\n  core,\n  models,\n  views,\n  controllers,\n  observers,\n  operations,\n  elements,\n  filters\n}\n\n// Expose models under the Trix constant for compatibility with v1\nObject.assign(Trix, models)\n\nfunction start() {\n  if (!customElements.get(\"trix-toolbar\")) {\n    customElements.define(\"trix-toolbar\", elements.TrixToolbarElement)\n  }\n\n  if (!customElements.get(\"trix-editor\")) {\n    customElements.define(\"trix-editor\", elements.TrixEditorElement)\n  }\n}\n\nwindow.Trix = Trix\nsetTimeout(start, 0)\n\nexport default Trix\n", "var sparkMd5 = {\n  exports: {}\n};\n\n(function(module, exports) {\n  (function(factory) {\n    {\n      module.exports = factory();\n    }\n  })((function(undefined$1) {\n    var hex_chr = [ \"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\" ];\n    function md5cycle(x, k) {\n      var a = x[0], b = x[1], c = x[2], d = x[3];\n      a += (b & c | ~b & d) + k[0] - 680876936 | 0;\n      a = (a << 7 | a >>> 25) + b | 0;\n      d += (a & b | ~a & c) + k[1] - 389564586 | 0;\n      d = (d << 12 | d >>> 20) + a | 0;\n      c += (d & a | ~d & b) + k[2] + 606105819 | 0;\n      c = (c << 17 | c >>> 15) + d | 0;\n      b += (c & d | ~c & a) + k[3] - 1044525330 | 0;\n      b = (b << 22 | b >>> 10) + c | 0;\n      a += (b & c | ~b & d) + k[4] - 176418897 | 0;\n      a = (a << 7 | a >>> 25) + b | 0;\n      d += (a & b | ~a & c) + k[5] + 1200080426 | 0;\n      d = (d << 12 | d >>> 20) + a | 0;\n      c += (d & a | ~d & b) + k[6] - 1473231341 | 0;\n      c = (c << 17 | c >>> 15) + d | 0;\n      b += (c & d | ~c & a) + k[7] - 45705983 | 0;\n      b = (b << 22 | b >>> 10) + c | 0;\n      a += (b & c | ~b & d) + k[8] + 1770035416 | 0;\n      a = (a << 7 | a >>> 25) + b | 0;\n      d += (a & b | ~a & c) + k[9] - 1958414417 | 0;\n      d = (d << 12 | d >>> 20) + a | 0;\n      c += (d & a | ~d & b) + k[10] - 42063 | 0;\n      c = (c << 17 | c >>> 15) + d | 0;\n      b += (c & d | ~c & a) + k[11] - 1990404162 | 0;\n      b = (b << 22 | b >>> 10) + c | 0;\n      a += (b & c | ~b & d) + k[12] + 1804603682 | 0;\n      a = (a << 7 | a >>> 25) + b | 0;\n      d += (a & b | ~a & c) + k[13] - 40341101 | 0;\n      d = (d << 12 | d >>> 20) + a | 0;\n      c += (d & a | ~d & b) + k[14] - 1502002290 | 0;\n      c = (c << 17 | c >>> 15) + d | 0;\n      b += (c & d | ~c & a) + k[15] + 1236535329 | 0;\n      b = (b << 22 | b >>> 10) + c | 0;\n      a += (b & d | c & ~d) + k[1] - 165796510 | 0;\n      a = (a << 5 | a >>> 27) + b | 0;\n      d += (a & c | b & ~c) + k[6] - 1069501632 | 0;\n      d = (d << 9 | d >>> 23) + a | 0;\n      c += (d & b | a & ~b) + k[11] + 643717713 | 0;\n      c = (c << 14 | c >>> 18) + d | 0;\n      b += (c & a | d & ~a) + k[0] - 373897302 | 0;\n      b = (b << 20 | b >>> 12) + c | 0;\n      a += (b & d | c & ~d) + k[5] - 701558691 | 0;\n      a = (a << 5 | a >>> 27) + b | 0;\n      d += (a & c | b & ~c) + k[10] + 38016083 | 0;\n      d = (d << 9 | d >>> 23) + a | 0;\n      c += (d & b | a & ~b) + k[15] - 660478335 | 0;\n      c = (c << 14 | c >>> 18) + d | 0;\n      b += (c & a | d & ~a) + k[4] - 405537848 | 0;\n      b = (b << 20 | b >>> 12) + c | 0;\n      a += (b & d | c & ~d) + k[9] + 568446438 | 0;\n      a = (a << 5 | a >>> 27) + b | 0;\n      d += (a & c | b & ~c) + k[14] - 1019803690 | 0;\n      d = (d << 9 | d >>> 23) + a | 0;\n      c += (d & b | a & ~b) + k[3] - 187363961 | 0;\n      c = (c << 14 | c >>> 18) + d | 0;\n      b += (c & a | d & ~a) + k[8] + 1163531501 | 0;\n      b = (b << 20 | b >>> 12) + c | 0;\n      a += (b & d | c & ~d) + k[13] - 1444681467 | 0;\n      a = (a << 5 | a >>> 27) + b | 0;\n      d += (a & c | b & ~c) + k[2] - 51403784 | 0;\n      d = (d << 9 | d >>> 23) + a | 0;\n      c += (d & b | a & ~b) + k[7] + 1735328473 | 0;\n      c = (c << 14 | c >>> 18) + d | 0;\n      b += (c & a | d & ~a) + k[12] - 1926607734 | 0;\n      b = (b << 20 | b >>> 12) + c | 0;\n      a += (b ^ c ^ d) + k[5] - 378558 | 0;\n      a = (a << 4 | a >>> 28) + b | 0;\n      d += (a ^ b ^ c) + k[8] - 2022574463 | 0;\n      d = (d << 11 | d >>> 21) + a | 0;\n      c += (d ^ a ^ b) + k[11] + 1839030562 | 0;\n      c = (c << 16 | c >>> 16) + d | 0;\n      b += (c ^ d ^ a) + k[14] - 35309556 | 0;\n      b = (b << 23 | b >>> 9) + c | 0;\n      a += (b ^ c ^ d) + k[1] - 1530992060 | 0;\n      a = (a << 4 | a >>> 28) + b | 0;\n      d += (a ^ b ^ c) + k[4] + 1272893353 | 0;\n      d = (d << 11 | d >>> 21) + a | 0;\n      c += (d ^ a ^ b) + k[7] - 155497632 | 0;\n      c = (c << 16 | c >>> 16) + d | 0;\n      b += (c ^ d ^ a) + k[10] - 1094730640 | 0;\n      b = (b << 23 | b >>> 9) + c | 0;\n      a += (b ^ c ^ d) + k[13] + 681279174 | 0;\n      a = (a << 4 | a >>> 28) + b | 0;\n      d += (a ^ b ^ c) + k[0] - 358537222 | 0;\n      d = (d << 11 | d >>> 21) + a | 0;\n      c += (d ^ a ^ b) + k[3] - 722521979 | 0;\n      c = (c << 16 | c >>> 16) + d | 0;\n      b += (c ^ d ^ a) + k[6] + 76029189 | 0;\n      b = (b << 23 | b >>> 9) + c | 0;\n      a += (b ^ c ^ d) + k[9] - 640364487 | 0;\n      a = (a << 4 | a >>> 28) + b | 0;\n      d += (a ^ b ^ c) + k[12] - 421815835 | 0;\n      d = (d << 11 | d >>> 21) + a | 0;\n      c += (d ^ a ^ b) + k[15] + 530742520 | 0;\n      c = (c << 16 | c >>> 16) + d | 0;\n      b += (c ^ d ^ a) + k[2] - 995338651 | 0;\n      b = (b << 23 | b >>> 9) + c | 0;\n      a += (c ^ (b | ~d)) + k[0] - 198630844 | 0;\n      a = (a << 6 | a >>> 26) + b | 0;\n      d += (b ^ (a | ~c)) + k[7] + 1126891415 | 0;\n      d = (d << 10 | d >>> 22) + a | 0;\n      c += (a ^ (d | ~b)) + k[14] - 1416354905 | 0;\n      c = (c << 15 | c >>> 17) + d | 0;\n      b += (d ^ (c | ~a)) + k[5] - 57434055 | 0;\n      b = (b << 21 | b >>> 11) + c | 0;\n      a += (c ^ (b | ~d)) + k[12] + 1700485571 | 0;\n      a = (a << 6 | a >>> 26) + b | 0;\n      d += (b ^ (a | ~c)) + k[3] - 1894986606 | 0;\n      d = (d << 10 | d >>> 22) + a | 0;\n      c += (a ^ (d | ~b)) + k[10] - 1051523 | 0;\n      c = (c << 15 | c >>> 17) + d | 0;\n      b += (d ^ (c | ~a)) + k[1] - 2054922799 | 0;\n      b = (b << 21 | b >>> 11) + c | 0;\n      a += (c ^ (b | ~d)) + k[8] + 1873313359 | 0;\n      a = (a << 6 | a >>> 26) + b | 0;\n      d += (b ^ (a | ~c)) + k[15] - 30611744 | 0;\n      d = (d << 10 | d >>> 22) + a | 0;\n      c += (a ^ (d | ~b)) + k[6] - 1560198380 | 0;\n      c = (c << 15 | c >>> 17) + d | 0;\n      b += (d ^ (c | ~a)) + k[13] + 1309151649 | 0;\n      b = (b << 21 | b >>> 11) + c | 0;\n      a += (c ^ (b | ~d)) + k[4] - 145523070 | 0;\n      a = (a << 6 | a >>> 26) + b | 0;\n      d += (b ^ (a | ~c)) + k[11] - 1120210379 | 0;\n      d = (d << 10 | d >>> 22) + a | 0;\n      c += (a ^ (d | ~b)) + k[2] + 718787259 | 0;\n      c = (c << 15 | c >>> 17) + d | 0;\n      b += (d ^ (c | ~a)) + k[9] - 343485551 | 0;\n      b = (b << 21 | b >>> 11) + c | 0;\n      x[0] = a + x[0] | 0;\n      x[1] = b + x[1] | 0;\n      x[2] = c + x[2] | 0;\n      x[3] = d + x[3] | 0;\n    }\n    function md5blk(s) {\n      var md5blks = [], i;\n      for (i = 0; i < 64; i += 4) {\n        md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);\n      }\n      return md5blks;\n    }\n    function md5blk_array(a) {\n      var md5blks = [], i;\n      for (i = 0; i < 64; i += 4) {\n        md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24);\n      }\n      return md5blks;\n    }\n    function md51(s) {\n      var n = s.length, state = [ 1732584193, -271733879, -1732584194, 271733878 ], i, length, tail, tmp, lo, hi;\n      for (i = 64; i <= n; i += 64) {\n        md5cycle(state, md5blk(s.substring(i - 64, i)));\n      }\n      s = s.substring(i - 64);\n      length = s.length;\n      tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];\n      for (i = 0; i < length; i += 1) {\n        tail[i >> 2] |= s.charCodeAt(i) << (i % 4 << 3);\n      }\n      tail[i >> 2] |= 128 << (i % 4 << 3);\n      if (i > 55) {\n        md5cycle(state, tail);\n        for (i = 0; i < 16; i += 1) {\n          tail[i] = 0;\n        }\n      }\n      tmp = n * 8;\n      tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n      lo = parseInt(tmp[2], 16);\n      hi = parseInt(tmp[1], 16) || 0;\n      tail[14] = lo;\n      tail[15] = hi;\n      md5cycle(state, tail);\n      return state;\n    }\n    function md51_array(a) {\n      var n = a.length, state = [ 1732584193, -271733879, -1732584194, 271733878 ], i, length, tail, tmp, lo, hi;\n      for (i = 64; i <= n; i += 64) {\n        md5cycle(state, md5blk_array(a.subarray(i - 64, i)));\n      }\n      a = i - 64 < n ? a.subarray(i - 64) : new Uint8Array(0);\n      length = a.length;\n      tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];\n      for (i = 0; i < length; i += 1) {\n        tail[i >> 2] |= a[i] << (i % 4 << 3);\n      }\n      tail[i >> 2] |= 128 << (i % 4 << 3);\n      if (i > 55) {\n        md5cycle(state, tail);\n        for (i = 0; i < 16; i += 1) {\n          tail[i] = 0;\n        }\n      }\n      tmp = n * 8;\n      tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n      lo = parseInt(tmp[2], 16);\n      hi = parseInt(tmp[1], 16) || 0;\n      tail[14] = lo;\n      tail[15] = hi;\n      md5cycle(state, tail);\n      return state;\n    }\n    function rhex(n) {\n      var s = \"\", j;\n      for (j = 0; j < 4; j += 1) {\n        s += hex_chr[n >> j * 8 + 4 & 15] + hex_chr[n >> j * 8 & 15];\n      }\n      return s;\n    }\n    function hex(x) {\n      var i;\n      for (i = 0; i < x.length; i += 1) {\n        x[i] = rhex(x[i]);\n      }\n      return x.join(\"\");\n    }\n    if (hex(md51(\"hello\")) !== \"5d41402abc4b2a76b9719d911017c592\") ;\n    if (typeof ArrayBuffer !== \"undefined\" && !ArrayBuffer.prototype.slice) {\n      (function() {\n        function clamp(val, length) {\n          val = val | 0 || 0;\n          if (val < 0) {\n            return Math.max(val + length, 0);\n          }\n          return Math.min(val, length);\n        }\n        ArrayBuffer.prototype.slice = function(from, to) {\n          var length = this.byteLength, begin = clamp(from, length), end = length, num, target, targetArray, sourceArray;\n          if (to !== undefined$1) {\n            end = clamp(to, length);\n          }\n          if (begin > end) {\n            return new ArrayBuffer(0);\n          }\n          num = end - begin;\n          target = new ArrayBuffer(num);\n          targetArray = new Uint8Array(target);\n          sourceArray = new Uint8Array(this, begin, num);\n          targetArray.set(sourceArray);\n          return target;\n        };\n      })();\n    }\n    function toUtf8(str) {\n      if (/[\\u0080-\\uFFFF]/.test(str)) {\n        str = unescape(encodeURIComponent(str));\n      }\n      return str;\n    }\n    function utf8Str2ArrayBuffer(str, returnUInt8Array) {\n      var length = str.length, buff = new ArrayBuffer(length), arr = new Uint8Array(buff), i;\n      for (i = 0; i < length; i += 1) {\n        arr[i] = str.charCodeAt(i);\n      }\n      return returnUInt8Array ? arr : buff;\n    }\n    function arrayBuffer2Utf8Str(buff) {\n      return String.fromCharCode.apply(null, new Uint8Array(buff));\n    }\n    function concatenateArrayBuffers(first, second, returnUInt8Array) {\n      var result = new Uint8Array(first.byteLength + second.byteLength);\n      result.set(new Uint8Array(first));\n      result.set(new Uint8Array(second), first.byteLength);\n      return returnUInt8Array ? result : result.buffer;\n    }\n    function hexToBinaryString(hex) {\n      var bytes = [], length = hex.length, x;\n      for (x = 0; x < length - 1; x += 2) {\n        bytes.push(parseInt(hex.substr(x, 2), 16));\n      }\n      return String.fromCharCode.apply(String, bytes);\n    }\n    function SparkMD5() {\n      this.reset();\n    }\n    SparkMD5.prototype.append = function(str) {\n      this.appendBinary(toUtf8(str));\n      return this;\n    };\n    SparkMD5.prototype.appendBinary = function(contents) {\n      this._buff += contents;\n      this._length += contents.length;\n      var length = this._buff.length, i;\n      for (i = 64; i <= length; i += 64) {\n        md5cycle(this._hash, md5blk(this._buff.substring(i - 64, i)));\n      }\n      this._buff = this._buff.substring(i - 64);\n      return this;\n    };\n    SparkMD5.prototype.end = function(raw) {\n      var buff = this._buff, length = buff.length, i, tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], ret;\n      for (i = 0; i < length; i += 1) {\n        tail[i >> 2] |= buff.charCodeAt(i) << (i % 4 << 3);\n      }\n      this._finish(tail, length);\n      ret = hex(this._hash);\n      if (raw) {\n        ret = hexToBinaryString(ret);\n      }\n      this.reset();\n      return ret;\n    };\n    SparkMD5.prototype.reset = function() {\n      this._buff = \"\";\n      this._length = 0;\n      this._hash = [ 1732584193, -271733879, -1732584194, 271733878 ];\n      return this;\n    };\n    SparkMD5.prototype.getState = function() {\n      return {\n        buff: this._buff,\n        length: this._length,\n        hash: this._hash.slice()\n      };\n    };\n    SparkMD5.prototype.setState = function(state) {\n      this._buff = state.buff;\n      this._length = state.length;\n      this._hash = state.hash;\n      return this;\n    };\n    SparkMD5.prototype.destroy = function() {\n      delete this._hash;\n      delete this._buff;\n      delete this._length;\n    };\n    SparkMD5.prototype._finish = function(tail, length) {\n      var i = length, tmp, lo, hi;\n      tail[i >> 2] |= 128 << (i % 4 << 3);\n      if (i > 55) {\n        md5cycle(this._hash, tail);\n        for (i = 0; i < 16; i += 1) {\n          tail[i] = 0;\n        }\n      }\n      tmp = this._length * 8;\n      tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n      lo = parseInt(tmp[2], 16);\n      hi = parseInt(tmp[1], 16) || 0;\n      tail[14] = lo;\n      tail[15] = hi;\n      md5cycle(this._hash, tail);\n    };\n    SparkMD5.hash = function(str, raw) {\n      return SparkMD5.hashBinary(toUtf8(str), raw);\n    };\n    SparkMD5.hashBinary = function(content, raw) {\n      var hash = md51(content), ret = hex(hash);\n      return raw ? hexToBinaryString(ret) : ret;\n    };\n    SparkMD5.ArrayBuffer = function() {\n      this.reset();\n    };\n    SparkMD5.ArrayBuffer.prototype.append = function(arr) {\n      var buff = concatenateArrayBuffers(this._buff.buffer, arr, true), length = buff.length, i;\n      this._length += arr.byteLength;\n      for (i = 64; i <= length; i += 64) {\n        md5cycle(this._hash, md5blk_array(buff.subarray(i - 64, i)));\n      }\n      this._buff = i - 64 < length ? new Uint8Array(buff.buffer.slice(i - 64)) : new Uint8Array(0);\n      return this;\n    };\n    SparkMD5.ArrayBuffer.prototype.end = function(raw) {\n      var buff = this._buff, length = buff.length, tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], i, ret;\n      for (i = 0; i < length; i += 1) {\n        tail[i >> 2] |= buff[i] << (i % 4 << 3);\n      }\n      this._finish(tail, length);\n      ret = hex(this._hash);\n      if (raw) {\n        ret = hexToBinaryString(ret);\n      }\n      this.reset();\n      return ret;\n    };\n    SparkMD5.ArrayBuffer.prototype.reset = function() {\n      this._buff = new Uint8Array(0);\n      this._length = 0;\n      this._hash = [ 1732584193, -271733879, -1732584194, 271733878 ];\n      return this;\n    };\n    SparkMD5.ArrayBuffer.prototype.getState = function() {\n      var state = SparkMD5.prototype.getState.call(this);\n      state.buff = arrayBuffer2Utf8Str(state.buff);\n      return state;\n    };\n    SparkMD5.ArrayBuffer.prototype.setState = function(state) {\n      state.buff = utf8Str2ArrayBuffer(state.buff, true);\n      return SparkMD5.prototype.setState.call(this, state);\n    };\n    SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy;\n    SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish;\n    SparkMD5.ArrayBuffer.hash = function(arr, raw) {\n      var hash = md51_array(new Uint8Array(arr)), ret = hex(hash);\n      return raw ? hexToBinaryString(ret) : ret;\n    };\n    return SparkMD5;\n  }));\n})(sparkMd5);\n\nvar SparkMD5 = sparkMd5.exports;\n\nconst fileSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice;\n\nclass FileChecksum {\n  static create(file, callback) {\n    const instance = new FileChecksum(file);\n    instance.create(callback);\n  }\n  constructor(file) {\n    this.file = file;\n    this.chunkSize = 2097152;\n    this.chunkCount = Math.ceil(this.file.size / this.chunkSize);\n    this.chunkIndex = 0;\n  }\n  create(callback) {\n    this.callback = callback;\n    this.md5Buffer = new SparkMD5.ArrayBuffer;\n    this.fileReader = new FileReader;\n    this.fileReader.addEventListener(\"load\", (event => this.fileReaderDidLoad(event)));\n    this.fileReader.addEventListener(\"error\", (event => this.fileReaderDidError(event)));\n    this.readNextChunk();\n  }\n  fileReaderDidLoad(event) {\n    this.md5Buffer.append(event.target.result);\n    if (!this.readNextChunk()) {\n      const binaryDigest = this.md5Buffer.end(true);\n      const base64digest = btoa(binaryDigest);\n      this.callback(null, base64digest);\n    }\n  }\n  fileReaderDidError(event) {\n    this.callback(`Error reading ${this.file.name}`);\n  }\n  readNextChunk() {\n    if (this.chunkIndex < this.chunkCount || this.chunkIndex == 0 && this.chunkCount == 0) {\n      const start = this.chunkIndex * this.chunkSize;\n      const end = Math.min(start + this.chunkSize, this.file.size);\n      const bytes = fileSlice.call(this.file, start, end);\n      this.fileReader.readAsArrayBuffer(bytes);\n      this.chunkIndex++;\n      return true;\n    } else {\n      return false;\n    }\n  }\n}\n\nfunction getMetaValue(name) {\n  const element = findElement(document.head, `meta[name=\"${name}\"]`);\n  if (element) {\n    return element.getAttribute(\"content\");\n  }\n}\n\nfunction findElements(root, selector) {\n  if (typeof root == \"string\") {\n    selector = root;\n    root = document;\n  }\n  const elements = root.querySelectorAll(selector);\n  return toArray(elements);\n}\n\nfunction findElement(root, selector) {\n  if (typeof root == \"string\") {\n    selector = root;\n    root = document;\n  }\n  return root.querySelector(selector);\n}\n\nfunction dispatchEvent(element, type, eventInit = {}) {\n  const {disabled: disabled} = element;\n  const {bubbles: bubbles, cancelable: cancelable, detail: detail} = eventInit;\n  const event = document.createEvent(\"Event\");\n  event.initEvent(type, bubbles || true, cancelable || true);\n  event.detail = detail || {};\n  try {\n    element.disabled = false;\n    element.dispatchEvent(event);\n  } finally {\n    element.disabled = disabled;\n  }\n  return event;\n}\n\nfunction toArray(value) {\n  if (Array.isArray(value)) {\n    return value;\n  } else if (Array.from) {\n    return Array.from(value);\n  } else {\n    return [].slice.call(value);\n  }\n}\n\nclass BlobRecord {\n  constructor(file, checksum, url, customHeaders = {}) {\n    this.file = file;\n    this.attributes = {\n      filename: file.name,\n      content_type: file.type || \"application/octet-stream\",\n      byte_size: file.size,\n      checksum: checksum\n    };\n    this.xhr = new XMLHttpRequest;\n    this.xhr.open(\"POST\", url, true);\n    this.xhr.responseType = \"json\";\n    this.xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n    this.xhr.setRequestHeader(\"Accept\", \"application/json\");\n    this.xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n    Object.keys(customHeaders).forEach((headerKey => {\n      this.xhr.setRequestHeader(headerKey, customHeaders[headerKey]);\n    }));\n    const csrfToken = getMetaValue(\"csrf-token\");\n    if (csrfToken != undefined) {\n      this.xhr.setRequestHeader(\"X-CSRF-Token\", csrfToken);\n    }\n    this.xhr.addEventListener(\"load\", (event => this.requestDidLoad(event)));\n    this.xhr.addEventListener(\"error\", (event => this.requestDidError(event)));\n  }\n  get status() {\n    return this.xhr.status;\n  }\n  get response() {\n    const {responseType: responseType, response: response} = this.xhr;\n    if (responseType == \"json\") {\n      return response;\n    } else {\n      return JSON.parse(response);\n    }\n  }\n  create(callback) {\n    this.callback = callback;\n    this.xhr.send(JSON.stringify({\n      blob: this.attributes\n    }));\n  }\n  requestDidLoad(event) {\n    if (this.status >= 200 && this.status < 300) {\n      const {response: response} = this;\n      const {direct_upload: direct_upload} = response;\n      delete response.direct_upload;\n      this.attributes = response;\n      this.directUploadData = direct_upload;\n      this.callback(null, this.toJSON());\n    } else {\n      this.requestDidError(event);\n    }\n  }\n  requestDidError(event) {\n    this.callback(`Error creating Blob for \"${this.file.name}\". Status: ${this.status}`);\n  }\n  toJSON() {\n    const result = {};\n    for (const key in this.attributes) {\n      result[key] = this.attributes[key];\n    }\n    return result;\n  }\n}\n\nclass BlobUpload {\n  constructor(blob) {\n    this.blob = blob;\n    this.file = blob.file;\n    const {url: url, headers: headers} = blob.directUploadData;\n    this.xhr = new XMLHttpRequest;\n    this.xhr.open(\"PUT\", url, true);\n    this.xhr.responseType = \"text\";\n    for (const key in headers) {\n      this.xhr.setRequestHeader(key, headers[key]);\n    }\n    this.xhr.addEventListener(\"load\", (event => this.requestDidLoad(event)));\n    this.xhr.addEventListener(\"error\", (event => this.requestDidError(event)));\n  }\n  create(callback) {\n    this.callback = callback;\n    this.xhr.send(this.file.slice());\n  }\n  requestDidLoad(event) {\n    const {status: status, response: response} = this.xhr;\n    if (status >= 200 && status < 300) {\n      this.callback(null, response);\n    } else {\n      this.requestDidError(event);\n    }\n  }\n  requestDidError(event) {\n    this.callback(`Error storing \"${this.file.name}\". Status: ${this.xhr.status}`);\n  }\n}\n\nlet id = 0;\n\nclass DirectUpload {\n  constructor(file, url, delegate, customHeaders = {}) {\n    this.id = ++id;\n    this.file = file;\n    this.url = url;\n    this.delegate = delegate;\n    this.customHeaders = customHeaders;\n  }\n  create(callback) {\n    FileChecksum.create(this.file, ((error, checksum) => {\n      if (error) {\n        callback(error);\n        return;\n      }\n      const blob = new BlobRecord(this.file, checksum, this.url, this.customHeaders);\n      notify(this.delegate, \"directUploadWillCreateBlobWithXHR\", blob.xhr);\n      blob.create((error => {\n        if (error) {\n          callback(error);\n        } else {\n          const upload = new BlobUpload(blob);\n          notify(this.delegate, \"directUploadWillStoreFileWithXHR\", upload.xhr);\n          upload.create((error => {\n            if (error) {\n              callback(error);\n            } else {\n              callback(null, blob.toJSON());\n            }\n          }));\n        }\n      }));\n    }));\n  }\n}\n\nfunction notify(object, methodName, ...messages) {\n  if (object && typeof object[methodName] == \"function\") {\n    return object[methodName](...messages);\n  }\n}\n\nclass DirectUploadController {\n  constructor(input, file) {\n    this.input = input;\n    this.file = file;\n    this.directUpload = new DirectUpload(this.file, this.url, this);\n    this.dispatch(\"initialize\");\n  }\n  start(callback) {\n    const hiddenInput = document.createElement(\"input\");\n    hiddenInput.type = \"hidden\";\n    hiddenInput.name = this.input.name;\n    this.input.insertAdjacentElement(\"beforebegin\", hiddenInput);\n    this.dispatch(\"start\");\n    this.directUpload.create(((error, attributes) => {\n      if (error) {\n        hiddenInput.parentNode.removeChild(hiddenInput);\n        this.dispatchError(error);\n      } else {\n        hiddenInput.value = attributes.signed_id;\n      }\n      this.dispatch(\"end\");\n      callback(error);\n    }));\n  }\n  uploadRequestDidProgress(event) {\n    const progress = event.loaded / event.total * 100;\n    if (progress) {\n      this.dispatch(\"progress\", {\n        progress: progress\n      });\n    }\n  }\n  get url() {\n    return this.input.getAttribute(\"data-direct-upload-url\");\n  }\n  dispatch(name, detail = {}) {\n    detail.file = this.file;\n    detail.id = this.directUpload.id;\n    return dispatchEvent(this.input, `direct-upload:${name}`, {\n      detail: detail\n    });\n  }\n  dispatchError(error) {\n    const event = this.dispatch(\"error\", {\n      error: error\n    });\n    if (!event.defaultPrevented) {\n      alert(error);\n    }\n  }\n  directUploadWillCreateBlobWithXHR(xhr) {\n    this.dispatch(\"before-blob-request\", {\n      xhr: xhr\n    });\n  }\n  directUploadWillStoreFileWithXHR(xhr) {\n    this.dispatch(\"before-storage-request\", {\n      xhr: xhr\n    });\n    xhr.upload.addEventListener(\"progress\", (event => this.uploadRequestDidProgress(event)));\n  }\n}\n\nconst inputSelector = \"input[type=file][data-direct-upload-url]:not([disabled])\";\n\nclass DirectUploadsController {\n  constructor(form) {\n    this.form = form;\n    this.inputs = findElements(form, inputSelector).filter((input => input.files.length));\n  }\n  start(callback) {\n    const controllers = this.createDirectUploadControllers();\n    const startNextController = () => {\n      const controller = controllers.shift();\n      if (controller) {\n        controller.start((error => {\n          if (error) {\n            callback(error);\n            this.dispatch(\"end\");\n          } else {\n            startNextController();\n          }\n        }));\n      } else {\n        callback();\n        this.dispatch(\"end\");\n      }\n    };\n    this.dispatch(\"start\");\n    startNextController();\n  }\n  createDirectUploadControllers() {\n    const controllers = [];\n    this.inputs.forEach((input => {\n      toArray(input.files).forEach((file => {\n        const controller = new DirectUploadController(input, file);\n        controllers.push(controller);\n      }));\n    }));\n    return controllers;\n  }\n  dispatch(name, detail = {}) {\n    return dispatchEvent(this.form, `direct-uploads:${name}`, {\n      detail: detail\n    });\n  }\n}\n\nconst processingAttribute = \"data-direct-uploads-processing\";\n\nconst submitButtonsByForm = new WeakMap;\n\nlet started = false;\n\nfunction start() {\n  if (!started) {\n    started = true;\n    document.addEventListener(\"click\", didClick, true);\n    document.addEventListener(\"submit\", didSubmitForm, true);\n    document.addEventListener(\"ajax:before\", didSubmitRemoteElement);\n  }\n}\n\nfunction didClick(event) {\n  const button = event.target.closest(\"button, input\");\n  if (button && button.type === \"submit\" && button.form) {\n    submitButtonsByForm.set(button.form, button);\n  }\n}\n\nfunction didSubmitForm(event) {\n  handleFormSubmissionEvent(event);\n}\n\nfunction didSubmitRemoteElement(event) {\n  if (event.target.tagName == \"FORM\") {\n    handleFormSubmissionEvent(event);\n  }\n}\n\nfunction handleFormSubmissionEvent(event) {\n  const form = event.target;\n  if (form.hasAttribute(processingAttribute)) {\n    event.preventDefault();\n    return;\n  }\n  const controller = new DirectUploadsController(form);\n  const {inputs: inputs} = controller;\n  if (inputs.length) {\n    event.preventDefault();\n    form.setAttribute(processingAttribute, \"\");\n    inputs.forEach(disable);\n    controller.start((error => {\n      form.removeAttribute(processingAttribute);\n      if (error) {\n        inputs.forEach(enable);\n      } else {\n        submitForm(form);\n      }\n    }));\n  }\n}\n\nfunction submitForm(form) {\n  let button = submitButtonsByForm.get(form) || findElement(form, \"input[type=submit], button[type=submit]\");\n  if (button) {\n    const {disabled: disabled} = button;\n    button.disabled = false;\n    button.focus();\n    button.click();\n    button.disabled = disabled;\n  } else {\n    button = document.createElement(\"input\");\n    button.type = \"submit\";\n    button.style.display = \"none\";\n    form.appendChild(button);\n    button.click();\n    form.removeChild(button);\n  }\n  submitButtonsByForm.delete(form);\n}\n\nfunction disable(input) {\n  input.disabled = true;\n}\n\nfunction enable(input) {\n  input.disabled = false;\n}\n\nfunction autostart() {\n  if (window.ActiveStorage) {\n    start();\n  }\n}\n\nsetTimeout(autostart, 1);\n\nclass AttachmentUpload {\n  constructor(attachment, element) {\n    this.attachment = attachment;\n    this.element = element;\n    this.directUpload = new DirectUpload(attachment.file, this.directUploadUrl, this);\n  }\n  start() {\n    this.directUpload.create(this.directUploadDidComplete.bind(this));\n    this.dispatch(\"start\");\n  }\n  directUploadWillStoreFileWithXHR(xhr) {\n    xhr.upload.addEventListener(\"progress\", (event => {\n      const progress = event.loaded / event.total * 100;\n      this.attachment.setUploadProgress(progress);\n      if (progress) {\n        this.dispatch(\"progress\", {\n          progress: progress\n        });\n      }\n    }));\n  }\n  directUploadDidComplete(error, attributes) {\n    if (error) {\n      this.dispatchError(error);\n    } else {\n      this.attachment.setAttributes({\n        sgid: attributes.attachable_sgid,\n        url: this.createBlobUrl(attributes.signed_id, attributes.filename)\n      });\n      this.dispatch(\"end\");\n    }\n  }\n  createBlobUrl(signedId, filename) {\n    return this.blobUrlTemplate.replace(\":signed_id\", signedId).replace(\":filename\", encodeURIComponent(filename));\n  }\n  dispatch(name, detail = {}) {\n    detail.attachment = this.attachment;\n    return dispatchEvent(this.element, `direct-upload:${name}`, {\n      detail: detail\n    });\n  }\n  dispatchError(error) {\n    const event = this.dispatch(\"error\", {\n      error: error\n    });\n    if (!event.defaultPrevented) {\n      alert(error);\n    }\n  }\n  get directUploadUrl() {\n    return this.element.dataset.directUploadUrl;\n  }\n  get blobUrlTemplate() {\n    return this.element.dataset.blobUrlTemplate;\n  }\n}\n\naddEventListener(\"trix-attachment-add\", (event => {\n  const {attachment: attachment, target: target} = event;\n  if (attachment.file) {\n    const upload = new AttachmentUpload(attachment, target);\n    upload.start();\n  }\n}));\n", "/*\nStimulus 3.2.1\nCopyright \u00A9 2023 Basecamp, LLC\n */\nclass EventListener {\n    constructor(eventTarget, eventName, eventOptions) {\n        this.eventTarget = eventTarget;\n        this.eventName = eventName;\n        this.eventOptions = eventOptions;\n        this.unorderedBindings = new Set();\n    }\n    connect() {\n        this.eventTarget.addEventListener(this.eventName, this, this.eventOptions);\n    }\n    disconnect() {\n        this.eventTarget.removeEventListener(this.eventName, this, this.eventOptions);\n    }\n    bindingConnected(binding) {\n        this.unorderedBindings.add(binding);\n    }\n    bindingDisconnected(binding) {\n        this.unorderedBindings.delete(binding);\n    }\n    handleEvent(event) {\n        const extendedEvent = extendEvent(event);\n        for (const binding of this.bindings) {\n            if (extendedEvent.immediatePropagationStopped) {\n                break;\n            }\n            else {\n                binding.handleEvent(extendedEvent);\n            }\n        }\n    }\n    hasBindings() {\n        return this.unorderedBindings.size > 0;\n    }\n    get bindings() {\n        return Array.from(this.unorderedBindings).sort((left, right) => {\n            const leftIndex = left.index, rightIndex = right.index;\n            return leftIndex < rightIndex ? -1 : leftIndex > rightIndex ? 1 : 0;\n        });\n    }\n}\nfunction extendEvent(event) {\n    if (\"immediatePropagationStopped\" in event) {\n        return event;\n    }\n    else {\n        const { stopImmediatePropagation } = event;\n        return Object.assign(event, {\n            immediatePropagationStopped: false,\n            stopImmediatePropagation() {\n                this.immediatePropagationStopped = true;\n                stopImmediatePropagation.call(this);\n            },\n        });\n    }\n}\n\nclass Dispatcher {\n    constructor(application) {\n        this.application = application;\n        this.eventListenerMaps = new Map();\n        this.started = false;\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.eventListeners.forEach((eventListener) => eventListener.connect());\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            this.eventListeners.forEach((eventListener) => eventListener.disconnect());\n        }\n    }\n    get eventListeners() {\n        return Array.from(this.eventListenerMaps.values()).reduce((listeners, map) => listeners.concat(Array.from(map.values())), []);\n    }\n    bindingConnected(binding) {\n        this.fetchEventListenerForBinding(binding).bindingConnected(binding);\n    }\n    bindingDisconnected(binding, clearEventListeners = false) {\n        this.fetchEventListenerForBinding(binding).bindingDisconnected(binding);\n        if (clearEventListeners)\n            this.clearEventListenersForBinding(binding);\n    }\n    handleError(error, message, detail = {}) {\n        this.application.handleError(error, `Error ${message}`, detail);\n    }\n    clearEventListenersForBinding(binding) {\n        const eventListener = this.fetchEventListenerForBinding(binding);\n        if (!eventListener.hasBindings()) {\n            eventListener.disconnect();\n            this.removeMappedEventListenerFor(binding);\n        }\n    }\n    removeMappedEventListenerFor(binding) {\n        const { eventTarget, eventName, eventOptions } = binding;\n        const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget);\n        const cacheKey = this.cacheKey(eventName, eventOptions);\n        eventListenerMap.delete(cacheKey);\n        if (eventListenerMap.size == 0)\n            this.eventListenerMaps.delete(eventTarget);\n    }\n    fetchEventListenerForBinding(binding) {\n        const { eventTarget, eventName, eventOptions } = binding;\n        return this.fetchEventListener(eventTarget, eventName, eventOptions);\n    }\n    fetchEventListener(eventTarget, eventName, eventOptions) {\n        const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget);\n        const cacheKey = this.cacheKey(eventName, eventOptions);\n        let eventListener = eventListenerMap.get(cacheKey);\n        if (!eventListener) {\n            eventListener = this.createEventListener(eventTarget, eventName, eventOptions);\n            eventListenerMap.set(cacheKey, eventListener);\n        }\n        return eventListener;\n    }\n    createEventListener(eventTarget, eventName, eventOptions) {\n        const eventListener = new EventListener(eventTarget, eventName, eventOptions);\n        if (this.started) {\n            eventListener.connect();\n        }\n        return eventListener;\n    }\n    fetchEventListenerMapForEventTarget(eventTarget) {\n        let eventListenerMap = this.eventListenerMaps.get(eventTarget);\n        if (!eventListenerMap) {\n            eventListenerMap = new Map();\n            this.eventListenerMaps.set(eventTarget, eventListenerMap);\n        }\n        return eventListenerMap;\n    }\n    cacheKey(eventName, eventOptions) {\n        const parts = [eventName];\n        Object.keys(eventOptions)\n            .sort()\n            .forEach((key) => {\n            parts.push(`${eventOptions[key] ? \"\" : \"!\"}${key}`);\n        });\n        return parts.join(\":\");\n    }\n}\n\nconst defaultActionDescriptorFilters = {\n    stop({ event, value }) {\n        if (value)\n            event.stopPropagation();\n        return true;\n    },\n    prevent({ event, value }) {\n        if (value)\n            event.preventDefault();\n        return true;\n    },\n    self({ event, value, element }) {\n        if (value) {\n            return element === event.target;\n        }\n        else {\n            return true;\n        }\n    },\n};\nconst descriptorPattern = /^(?:(?:([^.]+?)\\+)?(.+?)(?:\\.(.+?))?(?:@(window|document))?->)?(.+?)(?:#([^:]+?))(?::(.+))?$/;\nfunction parseActionDescriptorString(descriptorString) {\n    const source = descriptorString.trim();\n    const matches = source.match(descriptorPattern) || [];\n    let eventName = matches[2];\n    let keyFilter = matches[3];\n    if (keyFilter && ![\"keydown\", \"keyup\", \"keypress\"].includes(eventName)) {\n        eventName += `.${keyFilter}`;\n        keyFilter = \"\";\n    }\n    return {\n        eventTarget: parseEventTarget(matches[4]),\n        eventName,\n        eventOptions: matches[7] ? parseEventOptions(matches[7]) : {},\n        identifier: matches[5],\n        methodName: matches[6],\n        keyFilter: matches[1] || keyFilter,\n    };\n}\nfunction parseEventTarget(eventTargetName) {\n    if (eventTargetName == \"window\") {\n        return window;\n    }\n    else if (eventTargetName == \"document\") {\n        return document;\n    }\n}\nfunction parseEventOptions(eventOptions) {\n    return eventOptions\n        .split(\":\")\n        .reduce((options, token) => Object.assign(options, { [token.replace(/^!/, \"\")]: !/^!/.test(token) }), {});\n}\nfunction stringifyEventTarget(eventTarget) {\n    if (eventTarget == window) {\n        return \"window\";\n    }\n    else if (eventTarget == document) {\n        return \"document\";\n    }\n}\n\nfunction camelize(value) {\n    return value.replace(/(?:[_-])([a-z0-9])/g, (_, char) => char.toUpperCase());\n}\nfunction namespaceCamelize(value) {\n    return camelize(value.replace(/--/g, \"-\").replace(/__/g, \"_\"));\n}\nfunction capitalize(value) {\n    return value.charAt(0).toUpperCase() + value.slice(1);\n}\nfunction dasherize(value) {\n    return value.replace(/([A-Z])/g, (_, char) => `-${char.toLowerCase()}`);\n}\nfunction tokenize(value) {\n    return value.match(/[^\\s]+/g) || [];\n}\n\nfunction isSomething(object) {\n    return object !== null && object !== undefined;\n}\nfunction hasProperty(object, property) {\n    return Object.prototype.hasOwnProperty.call(object, property);\n}\n\nconst allModifiers = [\"meta\", \"ctrl\", \"alt\", \"shift\"];\nclass Action {\n    constructor(element, index, descriptor, schema) {\n        this.element = element;\n        this.index = index;\n        this.eventTarget = descriptor.eventTarget || element;\n        this.eventName = descriptor.eventName || getDefaultEventNameForElement(element) || error(\"missing event name\");\n        this.eventOptions = descriptor.eventOptions || {};\n        this.identifier = descriptor.identifier || error(\"missing identifier\");\n        this.methodName = descriptor.methodName || error(\"missing method name\");\n        this.keyFilter = descriptor.keyFilter || \"\";\n        this.schema = schema;\n    }\n    static forToken(token, schema) {\n        return new this(token.element, token.index, parseActionDescriptorString(token.content), schema);\n    }\n    toString() {\n        const eventFilter = this.keyFilter ? `.${this.keyFilter}` : \"\";\n        const eventTarget = this.eventTargetName ? `@${this.eventTargetName}` : \"\";\n        return `${this.eventName}${eventFilter}${eventTarget}->${this.identifier}#${this.methodName}`;\n    }\n    shouldIgnoreKeyboardEvent(event) {\n        if (!this.keyFilter) {\n            return false;\n        }\n        const filters = this.keyFilter.split(\"+\");\n        if (this.keyFilterDissatisfied(event, filters)) {\n            return true;\n        }\n        const standardFilter = filters.filter((key) => !allModifiers.includes(key))[0];\n        if (!standardFilter) {\n            return false;\n        }\n        if (!hasProperty(this.keyMappings, standardFilter)) {\n            error(`contains unknown key filter: ${this.keyFilter}`);\n        }\n        return this.keyMappings[standardFilter].toLowerCase() !== event.key.toLowerCase();\n    }\n    shouldIgnoreMouseEvent(event) {\n        if (!this.keyFilter) {\n            return false;\n        }\n        const filters = [this.keyFilter];\n        if (this.keyFilterDissatisfied(event, filters)) {\n            return true;\n        }\n        return false;\n    }\n    get params() {\n        const params = {};\n        const pattern = new RegExp(`^data-${this.identifier}-(.+)-param$`, \"i\");\n        for (const { name, value } of Array.from(this.element.attributes)) {\n            const match = name.match(pattern);\n            const key = match && match[1];\n            if (key) {\n                params[camelize(key)] = typecast(value);\n            }\n        }\n        return params;\n    }\n    get eventTargetName() {\n        return stringifyEventTarget(this.eventTarget);\n    }\n    get keyMappings() {\n        return this.schema.keyMappings;\n    }\n    keyFilterDissatisfied(event, filters) {\n        const [meta, ctrl, alt, shift] = allModifiers.map((modifier) => filters.includes(modifier));\n        return event.metaKey !== meta || event.ctrlKey !== ctrl || event.altKey !== alt || event.shiftKey !== shift;\n    }\n}\nconst defaultEventNames = {\n    a: () => \"click\",\n    button: () => \"click\",\n    form: () => \"submit\",\n    details: () => \"toggle\",\n    input: (e) => (e.getAttribute(\"type\") == \"submit\" ? \"click\" : \"input\"),\n    select: () => \"change\",\n    textarea: () => \"input\",\n};\nfunction getDefaultEventNameForElement(element) {\n    const tagName = element.tagName.toLowerCase();\n    if (tagName in defaultEventNames) {\n        return defaultEventNames[tagName](element);\n    }\n}\nfunction error(message) {\n    throw new Error(message);\n}\nfunction typecast(value) {\n    try {\n        return JSON.parse(value);\n    }\n    catch (o_O) {\n        return value;\n    }\n}\n\nclass Binding {\n    constructor(context, action) {\n        this.context = context;\n        this.action = action;\n    }\n    get index() {\n        return this.action.index;\n    }\n    get eventTarget() {\n        return this.action.eventTarget;\n    }\n    get eventOptions() {\n        return this.action.eventOptions;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    handleEvent(event) {\n        const actionEvent = this.prepareActionEvent(event);\n        if (this.willBeInvokedByEvent(event) && this.applyEventModifiers(actionEvent)) {\n            this.invokeWithEvent(actionEvent);\n        }\n    }\n    get eventName() {\n        return this.action.eventName;\n    }\n    get method() {\n        const method = this.controller[this.methodName];\n        if (typeof method == \"function\") {\n            return method;\n        }\n        throw new Error(`Action \"${this.action}\" references undefined method \"${this.methodName}\"`);\n    }\n    applyEventModifiers(event) {\n        const { element } = this.action;\n        const { actionDescriptorFilters } = this.context.application;\n        const { controller } = this.context;\n        let passes = true;\n        for (const [name, value] of Object.entries(this.eventOptions)) {\n            if (name in actionDescriptorFilters) {\n                const filter = actionDescriptorFilters[name];\n                passes = passes && filter({ name, value, event, element, controller });\n            }\n            else {\n                continue;\n            }\n        }\n        return passes;\n    }\n    prepareActionEvent(event) {\n        return Object.assign(event, { params: this.action.params });\n    }\n    invokeWithEvent(event) {\n        const { target, currentTarget } = event;\n        try {\n            this.method.call(this.controller, event);\n            this.context.logDebugActivity(this.methodName, { event, target, currentTarget, action: this.methodName });\n        }\n        catch (error) {\n            const { identifier, controller, element, index } = this;\n            const detail = { identifier, controller, element, index, event };\n            this.context.handleError(error, `invoking action \"${this.action}\"`, detail);\n        }\n    }\n    willBeInvokedByEvent(event) {\n        const eventTarget = event.target;\n        if (event instanceof KeyboardEvent && this.action.shouldIgnoreKeyboardEvent(event)) {\n            return false;\n        }\n        if (event instanceof MouseEvent && this.action.shouldIgnoreMouseEvent(event)) {\n            return false;\n        }\n        if (this.element === eventTarget) {\n            return true;\n        }\n        else if (eventTarget instanceof Element && this.element.contains(eventTarget)) {\n            return this.scope.containsElement(eventTarget);\n        }\n        else {\n            return this.scope.containsElement(this.action.element);\n        }\n    }\n    get controller() {\n        return this.context.controller;\n    }\n    get methodName() {\n        return this.action.methodName;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n}\n\nclass ElementObserver {\n    constructor(element, delegate) {\n        this.mutationObserverInit = { attributes: true, childList: true, subtree: true };\n        this.element = element;\n        this.started = false;\n        this.delegate = delegate;\n        this.elements = new Set();\n        this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations));\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.mutationObserver.observe(this.element, this.mutationObserverInit);\n            this.refresh();\n        }\n    }\n    pause(callback) {\n        if (this.started) {\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n        callback();\n        if (!this.started) {\n            this.mutationObserver.observe(this.element, this.mutationObserverInit);\n            this.started = true;\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.mutationObserver.takeRecords();\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n    }\n    refresh() {\n        if (this.started) {\n            const matches = new Set(this.matchElementsInTree());\n            for (const element of Array.from(this.elements)) {\n                if (!matches.has(element)) {\n                    this.removeElement(element);\n                }\n            }\n            for (const element of Array.from(matches)) {\n                this.addElement(element);\n            }\n        }\n    }\n    processMutations(mutations) {\n        if (this.started) {\n            for (const mutation of mutations) {\n                this.processMutation(mutation);\n            }\n        }\n    }\n    processMutation(mutation) {\n        if (mutation.type == \"attributes\") {\n            this.processAttributeChange(mutation.target, mutation.attributeName);\n        }\n        else if (mutation.type == \"childList\") {\n            this.processRemovedNodes(mutation.removedNodes);\n            this.processAddedNodes(mutation.addedNodes);\n        }\n    }\n    processAttributeChange(element, attributeName) {\n        if (this.elements.has(element)) {\n            if (this.delegate.elementAttributeChanged && this.matchElement(element)) {\n                this.delegate.elementAttributeChanged(element, attributeName);\n            }\n            else {\n                this.removeElement(element);\n            }\n        }\n        else if (this.matchElement(element)) {\n            this.addElement(element);\n        }\n    }\n    processRemovedNodes(nodes) {\n        for (const node of Array.from(nodes)) {\n            const element = this.elementFromNode(node);\n            if (element) {\n                this.processTree(element, this.removeElement);\n            }\n        }\n    }\n    processAddedNodes(nodes) {\n        for (const node of Array.from(nodes)) {\n            const element = this.elementFromNode(node);\n            if (element && this.elementIsActive(element)) {\n                this.processTree(element, this.addElement);\n            }\n        }\n    }\n    matchElement(element) {\n        return this.delegate.matchElement(element);\n    }\n    matchElementsInTree(tree = this.element) {\n        return this.delegate.matchElementsInTree(tree);\n    }\n    processTree(tree, processor) {\n        for (const element of this.matchElementsInTree(tree)) {\n            processor.call(this, element);\n        }\n    }\n    elementFromNode(node) {\n        if (node.nodeType == Node.ELEMENT_NODE) {\n            return node;\n        }\n    }\n    elementIsActive(element) {\n        if (element.isConnected != this.element.isConnected) {\n            return false;\n        }\n        else {\n            return this.element.contains(element);\n        }\n    }\n    addElement(element) {\n        if (!this.elements.has(element)) {\n            if (this.elementIsActive(element)) {\n                this.elements.add(element);\n                if (this.delegate.elementMatched) {\n                    this.delegate.elementMatched(element);\n                }\n            }\n        }\n    }\n    removeElement(element) {\n        if (this.elements.has(element)) {\n            this.elements.delete(element);\n            if (this.delegate.elementUnmatched) {\n                this.delegate.elementUnmatched(element);\n            }\n        }\n    }\n}\n\nclass AttributeObserver {\n    constructor(element, attributeName, delegate) {\n        this.attributeName = attributeName;\n        this.delegate = delegate;\n        this.elementObserver = new ElementObserver(element, this);\n    }\n    get element() {\n        return this.elementObserver.element;\n    }\n    get selector() {\n        return `[${this.attributeName}]`;\n    }\n    start() {\n        this.elementObserver.start();\n    }\n    pause(callback) {\n        this.elementObserver.pause(callback);\n    }\n    stop() {\n        this.elementObserver.stop();\n    }\n    refresh() {\n        this.elementObserver.refresh();\n    }\n    get started() {\n        return this.elementObserver.started;\n    }\n    matchElement(element) {\n        return element.hasAttribute(this.attributeName);\n    }\n    matchElementsInTree(tree) {\n        const match = this.matchElement(tree) ? [tree] : [];\n        const matches = Array.from(tree.querySelectorAll(this.selector));\n        return match.concat(matches);\n    }\n    elementMatched(element) {\n        if (this.delegate.elementMatchedAttribute) {\n            this.delegate.elementMatchedAttribute(element, this.attributeName);\n        }\n    }\n    elementUnmatched(element) {\n        if (this.delegate.elementUnmatchedAttribute) {\n            this.delegate.elementUnmatchedAttribute(element, this.attributeName);\n        }\n    }\n    elementAttributeChanged(element, attributeName) {\n        if (this.delegate.elementAttributeValueChanged && this.attributeName == attributeName) {\n            this.delegate.elementAttributeValueChanged(element, attributeName);\n        }\n    }\n}\n\nfunction add(map, key, value) {\n    fetch(map, key).add(value);\n}\nfunction del(map, key, value) {\n    fetch(map, key).delete(value);\n    prune(map, key);\n}\nfunction fetch(map, key) {\n    let values = map.get(key);\n    if (!values) {\n        values = new Set();\n        map.set(key, values);\n    }\n    return values;\n}\nfunction prune(map, key) {\n    const values = map.get(key);\n    if (values != null && values.size == 0) {\n        map.delete(key);\n    }\n}\n\nclass Multimap {\n    constructor() {\n        this.valuesByKey = new Map();\n    }\n    get keys() {\n        return Array.from(this.valuesByKey.keys());\n    }\n    get values() {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.reduce((values, set) => values.concat(Array.from(set)), []);\n    }\n    get size() {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.reduce((size, set) => size + set.size, 0);\n    }\n    add(key, value) {\n        add(this.valuesByKey, key, value);\n    }\n    delete(key, value) {\n        del(this.valuesByKey, key, value);\n    }\n    has(key, value) {\n        const values = this.valuesByKey.get(key);\n        return values != null && values.has(value);\n    }\n    hasKey(key) {\n        return this.valuesByKey.has(key);\n    }\n    hasValue(value) {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.some((set) => set.has(value));\n    }\n    getValuesForKey(key) {\n        const values = this.valuesByKey.get(key);\n        return values ? Array.from(values) : [];\n    }\n    getKeysForValue(value) {\n        return Array.from(this.valuesByKey)\n            .filter(([_key, values]) => values.has(value))\n            .map(([key, _values]) => key);\n    }\n}\n\nclass IndexedMultimap extends Multimap {\n    constructor() {\n        super();\n        this.keysByValue = new Map();\n    }\n    get values() {\n        return Array.from(this.keysByValue.keys());\n    }\n    add(key, value) {\n        super.add(key, value);\n        add(this.keysByValue, value, key);\n    }\n    delete(key, value) {\n        super.delete(key, value);\n        del(this.keysByValue, value, key);\n    }\n    hasValue(value) {\n        return this.keysByValue.has(value);\n    }\n    getKeysForValue(value) {\n        const set = this.keysByValue.get(value);\n        return set ? Array.from(set) : [];\n    }\n}\n\nclass SelectorObserver {\n    constructor(element, selector, delegate, details) {\n        this._selector = selector;\n        this.details = details;\n        this.elementObserver = new ElementObserver(element, this);\n        this.delegate = delegate;\n        this.matchesByElement = new Multimap();\n    }\n    get started() {\n        return this.elementObserver.started;\n    }\n    get selector() {\n        return this._selector;\n    }\n    set selector(selector) {\n        this._selector = selector;\n        this.refresh();\n    }\n    start() {\n        this.elementObserver.start();\n    }\n    pause(callback) {\n        this.elementObserver.pause(callback);\n    }\n    stop() {\n        this.elementObserver.stop();\n    }\n    refresh() {\n        this.elementObserver.refresh();\n    }\n    get element() {\n        return this.elementObserver.element;\n    }\n    matchElement(element) {\n        const { selector } = this;\n        if (selector) {\n            const matches = element.matches(selector);\n            if (this.delegate.selectorMatchElement) {\n                return matches && this.delegate.selectorMatchElement(element, this.details);\n            }\n            return matches;\n        }\n        else {\n            return false;\n        }\n    }\n    matchElementsInTree(tree) {\n        const { selector } = this;\n        if (selector) {\n            const match = this.matchElement(tree) ? [tree] : [];\n            const matches = Array.from(tree.querySelectorAll(selector)).filter((match) => this.matchElement(match));\n            return match.concat(matches);\n        }\n        else {\n            return [];\n        }\n    }\n    elementMatched(element) {\n        const { selector } = this;\n        if (selector) {\n            this.selectorMatched(element, selector);\n        }\n    }\n    elementUnmatched(element) {\n        const selectors = this.matchesByElement.getKeysForValue(element);\n        for (const selector of selectors) {\n            this.selectorUnmatched(element, selector);\n        }\n    }\n    elementAttributeChanged(element, _attributeName) {\n        const { selector } = this;\n        if (selector) {\n            const matches = this.matchElement(element);\n            const matchedBefore = this.matchesByElement.has(selector, element);\n            if (matches && !matchedBefore) {\n                this.selectorMatched(element, selector);\n            }\n            else if (!matches && matchedBefore) {\n                this.selectorUnmatched(element, selector);\n            }\n        }\n    }\n    selectorMatched(element, selector) {\n        this.delegate.selectorMatched(element, selector, this.details);\n        this.matchesByElement.add(selector, element);\n    }\n    selectorUnmatched(element, selector) {\n        this.delegate.selectorUnmatched(element, selector, this.details);\n        this.matchesByElement.delete(selector, element);\n    }\n}\n\nclass StringMapObserver {\n    constructor(element, delegate) {\n        this.element = element;\n        this.delegate = delegate;\n        this.started = false;\n        this.stringMap = new Map();\n        this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations));\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.mutationObserver.observe(this.element, { attributes: true, attributeOldValue: true });\n            this.refresh();\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.mutationObserver.takeRecords();\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n    }\n    refresh() {\n        if (this.started) {\n            for (const attributeName of this.knownAttributeNames) {\n                this.refreshAttribute(attributeName, null);\n            }\n        }\n    }\n    processMutations(mutations) {\n        if (this.started) {\n            for (const mutation of mutations) {\n                this.processMutation(mutation);\n            }\n        }\n    }\n    processMutation(mutation) {\n        const attributeName = mutation.attributeName;\n        if (attributeName) {\n            this.refreshAttribute(attributeName, mutation.oldValue);\n        }\n    }\n    refreshAttribute(attributeName, oldValue) {\n        const key = this.delegate.getStringMapKeyForAttribute(attributeName);\n        if (key != null) {\n            if (!this.stringMap.has(attributeName)) {\n                this.stringMapKeyAdded(key, attributeName);\n            }\n            const value = this.element.getAttribute(attributeName);\n            if (this.stringMap.get(attributeName) != value) {\n                this.stringMapValueChanged(value, key, oldValue);\n            }\n            if (value == null) {\n                const oldValue = this.stringMap.get(attributeName);\n                this.stringMap.delete(attributeName);\n                if (oldValue)\n                    this.stringMapKeyRemoved(key, attributeName, oldValue);\n            }\n            else {\n                this.stringMap.set(attributeName, value);\n            }\n        }\n    }\n    stringMapKeyAdded(key, attributeName) {\n        if (this.delegate.stringMapKeyAdded) {\n            this.delegate.stringMapKeyAdded(key, attributeName);\n        }\n    }\n    stringMapValueChanged(value, key, oldValue) {\n        if (this.delegate.stringMapValueChanged) {\n            this.delegate.stringMapValueChanged(value, key, oldValue);\n        }\n    }\n    stringMapKeyRemoved(key, attributeName, oldValue) {\n        if (this.delegate.stringMapKeyRemoved) {\n            this.delegate.stringMapKeyRemoved(key, attributeName, oldValue);\n        }\n    }\n    get knownAttributeNames() {\n        return Array.from(new Set(this.currentAttributeNames.concat(this.recordedAttributeNames)));\n    }\n    get currentAttributeNames() {\n        return Array.from(this.element.attributes).map((attribute) => attribute.name);\n    }\n    get recordedAttributeNames() {\n        return Array.from(this.stringMap.keys());\n    }\n}\n\nclass TokenListObserver {\n    constructor(element, attributeName, delegate) {\n        this.attributeObserver = new AttributeObserver(element, attributeName, this);\n        this.delegate = delegate;\n        this.tokensByElement = new Multimap();\n    }\n    get started() {\n        return this.attributeObserver.started;\n    }\n    start() {\n        this.attributeObserver.start();\n    }\n    pause(callback) {\n        this.attributeObserver.pause(callback);\n    }\n    stop() {\n        this.attributeObserver.stop();\n    }\n    refresh() {\n        this.attributeObserver.refresh();\n    }\n    get element() {\n        return this.attributeObserver.element;\n    }\n    get attributeName() {\n        return this.attributeObserver.attributeName;\n    }\n    elementMatchedAttribute(element) {\n        this.tokensMatched(this.readTokensForElement(element));\n    }\n    elementAttributeValueChanged(element) {\n        const [unmatchedTokens, matchedTokens] = this.refreshTokensForElement(element);\n        this.tokensUnmatched(unmatchedTokens);\n        this.tokensMatched(matchedTokens);\n    }\n    elementUnmatchedAttribute(element) {\n        this.tokensUnmatched(this.tokensByElement.getValuesForKey(element));\n    }\n    tokensMatched(tokens) {\n        tokens.forEach((token) => this.tokenMatched(token));\n    }\n    tokensUnmatched(tokens) {\n        tokens.forEach((token) => this.tokenUnmatched(token));\n    }\n    tokenMatched(token) {\n        this.delegate.tokenMatched(token);\n        this.tokensByElement.add(token.element, token);\n    }\n    tokenUnmatched(token) {\n        this.delegate.tokenUnmatched(token);\n        this.tokensByElement.delete(token.element, token);\n    }\n    refreshTokensForElement(element) {\n        const previousTokens = this.tokensByElement.getValuesForKey(element);\n        const currentTokens = this.readTokensForElement(element);\n        const firstDifferingIndex = zip(previousTokens, currentTokens).findIndex(([previousToken, currentToken]) => !tokensAreEqual(previousToken, currentToken));\n        if (firstDifferingIndex == -1) {\n            return [[], []];\n        }\n        else {\n            return [previousTokens.slice(firstDifferingIndex), currentTokens.slice(firstDifferingIndex)];\n        }\n    }\n    readTokensForElement(element) {\n        const attributeName = this.attributeName;\n        const tokenString = element.getAttribute(attributeName) || \"\";\n        return parseTokenString(tokenString, element, attributeName);\n    }\n}\nfunction parseTokenString(tokenString, element, attributeName) {\n    return tokenString\n        .trim()\n        .split(/\\s+/)\n        .filter((content) => content.length)\n        .map((content, index) => ({ element, attributeName, content, index }));\n}\nfunction zip(left, right) {\n    const length = Math.max(left.length, right.length);\n    return Array.from({ length }, (_, index) => [left[index], right[index]]);\n}\nfunction tokensAreEqual(left, right) {\n    return left && right && left.index == right.index && left.content == right.content;\n}\n\nclass ValueListObserver {\n    constructor(element, attributeName, delegate) {\n        this.tokenListObserver = new TokenListObserver(element, attributeName, this);\n        this.delegate = delegate;\n        this.parseResultsByToken = new WeakMap();\n        this.valuesByTokenByElement = new WeakMap();\n    }\n    get started() {\n        return this.tokenListObserver.started;\n    }\n    start() {\n        this.tokenListObserver.start();\n    }\n    stop() {\n        this.tokenListObserver.stop();\n    }\n    refresh() {\n        this.tokenListObserver.refresh();\n    }\n    get element() {\n        return this.tokenListObserver.element;\n    }\n    get attributeName() {\n        return this.tokenListObserver.attributeName;\n    }\n    tokenMatched(token) {\n        const { element } = token;\n        const { value } = this.fetchParseResultForToken(token);\n        if (value) {\n            this.fetchValuesByTokenForElement(element).set(token, value);\n            this.delegate.elementMatchedValue(element, value);\n        }\n    }\n    tokenUnmatched(token) {\n        const { element } = token;\n        const { value } = this.fetchParseResultForToken(token);\n        if (value) {\n            this.fetchValuesByTokenForElement(element).delete(token);\n            this.delegate.elementUnmatchedValue(element, value);\n        }\n    }\n    fetchParseResultForToken(token) {\n        let parseResult = this.parseResultsByToken.get(token);\n        if (!parseResult) {\n            parseResult = this.parseToken(token);\n            this.parseResultsByToken.set(token, parseResult);\n        }\n        return parseResult;\n    }\n    fetchValuesByTokenForElement(element) {\n        let valuesByToken = this.valuesByTokenByElement.get(element);\n        if (!valuesByToken) {\n            valuesByToken = new Map();\n            this.valuesByTokenByElement.set(element, valuesByToken);\n        }\n        return valuesByToken;\n    }\n    parseToken(token) {\n        try {\n            const value = this.delegate.parseValueForToken(token);\n            return { value };\n        }\n        catch (error) {\n            return { error };\n        }\n    }\n}\n\nclass BindingObserver {\n    constructor(context, delegate) {\n        this.context = context;\n        this.delegate = delegate;\n        this.bindingsByAction = new Map();\n    }\n    start() {\n        if (!this.valueListObserver) {\n            this.valueListObserver = new ValueListObserver(this.element, this.actionAttribute, this);\n            this.valueListObserver.start();\n        }\n    }\n    stop() {\n        if (this.valueListObserver) {\n            this.valueListObserver.stop();\n            delete this.valueListObserver;\n            this.disconnectAllActions();\n        }\n    }\n    get element() {\n        return this.context.element;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    get actionAttribute() {\n        return this.schema.actionAttribute;\n    }\n    get schema() {\n        return this.context.schema;\n    }\n    get bindings() {\n        return Array.from(this.bindingsByAction.values());\n    }\n    connectAction(action) {\n        const binding = new Binding(this.context, action);\n        this.bindingsByAction.set(action, binding);\n        this.delegate.bindingConnected(binding);\n    }\n    disconnectAction(action) {\n        const binding = this.bindingsByAction.get(action);\n        if (binding) {\n            this.bindingsByAction.delete(action);\n            this.delegate.bindingDisconnected(binding);\n        }\n    }\n    disconnectAllActions() {\n        this.bindings.forEach((binding) => this.delegate.bindingDisconnected(binding, true));\n        this.bindingsByAction.clear();\n    }\n    parseValueForToken(token) {\n        const action = Action.forToken(token, this.schema);\n        if (action.identifier == this.identifier) {\n            return action;\n        }\n    }\n    elementMatchedValue(element, action) {\n        this.connectAction(action);\n    }\n    elementUnmatchedValue(element, action) {\n        this.disconnectAction(action);\n    }\n}\n\nclass ValueObserver {\n    constructor(context, receiver) {\n        this.context = context;\n        this.receiver = receiver;\n        this.stringMapObserver = new StringMapObserver(this.element, this);\n        this.valueDescriptorMap = this.controller.valueDescriptorMap;\n    }\n    start() {\n        this.stringMapObserver.start();\n        this.invokeChangedCallbacksForDefaultValues();\n    }\n    stop() {\n        this.stringMapObserver.stop();\n    }\n    get element() {\n        return this.context.element;\n    }\n    get controller() {\n        return this.context.controller;\n    }\n    getStringMapKeyForAttribute(attributeName) {\n        if (attributeName in this.valueDescriptorMap) {\n            return this.valueDescriptorMap[attributeName].name;\n        }\n    }\n    stringMapKeyAdded(key, attributeName) {\n        const descriptor = this.valueDescriptorMap[attributeName];\n        if (!this.hasValue(key)) {\n            this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), descriptor.writer(descriptor.defaultValue));\n        }\n    }\n    stringMapValueChanged(value, name, oldValue) {\n        const descriptor = this.valueDescriptorNameMap[name];\n        if (value === null)\n            return;\n        if (oldValue === null) {\n            oldValue = descriptor.writer(descriptor.defaultValue);\n        }\n        this.invokeChangedCallback(name, value, oldValue);\n    }\n    stringMapKeyRemoved(key, attributeName, oldValue) {\n        const descriptor = this.valueDescriptorNameMap[key];\n        if (this.hasValue(key)) {\n            this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), oldValue);\n        }\n        else {\n            this.invokeChangedCallback(key, descriptor.writer(descriptor.defaultValue), oldValue);\n        }\n    }\n    invokeChangedCallbacksForDefaultValues() {\n        for (const { key, name, defaultValue, writer } of this.valueDescriptors) {\n            if (defaultValue != undefined && !this.controller.data.has(key)) {\n                this.invokeChangedCallback(name, writer(defaultValue), undefined);\n            }\n        }\n    }\n    invokeChangedCallback(name, rawValue, rawOldValue) {\n        const changedMethodName = `${name}Changed`;\n        const changedMethod = this.receiver[changedMethodName];\n        if (typeof changedMethod == \"function\") {\n            const descriptor = this.valueDescriptorNameMap[name];\n            try {\n                const value = descriptor.reader(rawValue);\n                let oldValue = rawOldValue;\n                if (rawOldValue) {\n                    oldValue = descriptor.reader(rawOldValue);\n                }\n                changedMethod.call(this.receiver, value, oldValue);\n            }\n            catch (error) {\n                if (error instanceof TypeError) {\n                    error.message = `Stimulus Value \"${this.context.identifier}.${descriptor.name}\" - ${error.message}`;\n                }\n                throw error;\n            }\n        }\n    }\n    get valueDescriptors() {\n        const { valueDescriptorMap } = this;\n        return Object.keys(valueDescriptorMap).map((key) => valueDescriptorMap[key]);\n    }\n    get valueDescriptorNameMap() {\n        const descriptors = {};\n        Object.keys(this.valueDescriptorMap).forEach((key) => {\n            const descriptor = this.valueDescriptorMap[key];\n            descriptors[descriptor.name] = descriptor;\n        });\n        return descriptors;\n    }\n    hasValue(attributeName) {\n        const descriptor = this.valueDescriptorNameMap[attributeName];\n        const hasMethodName = `has${capitalize(descriptor.name)}`;\n        return this.receiver[hasMethodName];\n    }\n}\n\nclass TargetObserver {\n    constructor(context, delegate) {\n        this.context = context;\n        this.delegate = delegate;\n        this.targetsByName = new Multimap();\n    }\n    start() {\n        if (!this.tokenListObserver) {\n            this.tokenListObserver = new TokenListObserver(this.element, this.attributeName, this);\n            this.tokenListObserver.start();\n        }\n    }\n    stop() {\n        if (this.tokenListObserver) {\n            this.disconnectAllTargets();\n            this.tokenListObserver.stop();\n            delete this.tokenListObserver;\n        }\n    }\n    tokenMatched({ element, content: name }) {\n        if (this.scope.containsElement(element)) {\n            this.connectTarget(element, name);\n        }\n    }\n    tokenUnmatched({ element, content: name }) {\n        this.disconnectTarget(element, name);\n    }\n    connectTarget(element, name) {\n        var _a;\n        if (!this.targetsByName.has(name, element)) {\n            this.targetsByName.add(name, element);\n            (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetConnected(element, name));\n        }\n    }\n    disconnectTarget(element, name) {\n        var _a;\n        if (this.targetsByName.has(name, element)) {\n            this.targetsByName.delete(name, element);\n            (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetDisconnected(element, name));\n        }\n    }\n    disconnectAllTargets() {\n        for (const name of this.targetsByName.keys) {\n            for (const element of this.targetsByName.getValuesForKey(name)) {\n                this.disconnectTarget(element, name);\n            }\n        }\n    }\n    get attributeName() {\n        return `data-${this.context.identifier}-target`;\n    }\n    get element() {\n        return this.context.element;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n}\n\nfunction readInheritableStaticArrayValues(constructor, propertyName) {\n    const ancestors = getAncestorsForConstructor(constructor);\n    return Array.from(ancestors.reduce((values, constructor) => {\n        getOwnStaticArrayValues(constructor, propertyName).forEach((name) => values.add(name));\n        return values;\n    }, new Set()));\n}\nfunction readInheritableStaticObjectPairs(constructor, propertyName) {\n    const ancestors = getAncestorsForConstructor(constructor);\n    return ancestors.reduce((pairs, constructor) => {\n        pairs.push(...getOwnStaticObjectPairs(constructor, propertyName));\n        return pairs;\n    }, []);\n}\nfunction getAncestorsForConstructor(constructor) {\n    const ancestors = [];\n    while (constructor) {\n        ancestors.push(constructor);\n        constructor = Object.getPrototypeOf(constructor);\n    }\n    return ancestors.reverse();\n}\nfunction getOwnStaticArrayValues(constructor, propertyName) {\n    const definition = constructor[propertyName];\n    return Array.isArray(definition) ? definition : [];\n}\nfunction getOwnStaticObjectPairs(constructor, propertyName) {\n    const definition = constructor[propertyName];\n    return definition ? Object.keys(definition).map((key) => [key, definition[key]]) : [];\n}\n\nclass OutletObserver {\n    constructor(context, delegate) {\n        this.started = false;\n        this.context = context;\n        this.delegate = delegate;\n        this.outletsByName = new Multimap();\n        this.outletElementsByName = new Multimap();\n        this.selectorObserverMap = new Map();\n        this.attributeObserverMap = new Map();\n    }\n    start() {\n        if (!this.started) {\n            this.outletDefinitions.forEach((outletName) => {\n                this.setupSelectorObserverForOutlet(outletName);\n                this.setupAttributeObserverForOutlet(outletName);\n            });\n            this.started = true;\n            this.dependentContexts.forEach((context) => context.refresh());\n        }\n    }\n    refresh() {\n        this.selectorObserverMap.forEach((observer) => observer.refresh());\n        this.attributeObserverMap.forEach((observer) => observer.refresh());\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            this.disconnectAllOutlets();\n            this.stopSelectorObservers();\n            this.stopAttributeObservers();\n        }\n    }\n    stopSelectorObservers() {\n        if (this.selectorObserverMap.size > 0) {\n            this.selectorObserverMap.forEach((observer) => observer.stop());\n            this.selectorObserverMap.clear();\n        }\n    }\n    stopAttributeObservers() {\n        if (this.attributeObserverMap.size > 0) {\n            this.attributeObserverMap.forEach((observer) => observer.stop());\n            this.attributeObserverMap.clear();\n        }\n    }\n    selectorMatched(element, _selector, { outletName }) {\n        const outlet = this.getOutlet(element, outletName);\n        if (outlet) {\n            this.connectOutlet(outlet, element, outletName);\n        }\n    }\n    selectorUnmatched(element, _selector, { outletName }) {\n        const outlet = this.getOutletFromMap(element, outletName);\n        if (outlet) {\n            this.disconnectOutlet(outlet, element, outletName);\n        }\n    }\n    selectorMatchElement(element, { outletName }) {\n        const selector = this.selector(outletName);\n        const hasOutlet = this.hasOutlet(element, outletName);\n        const hasOutletController = element.matches(`[${this.schema.controllerAttribute}~=${outletName}]`);\n        if (selector) {\n            return hasOutlet && hasOutletController && element.matches(selector);\n        }\n        else {\n            return false;\n        }\n    }\n    elementMatchedAttribute(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    elementAttributeValueChanged(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    elementUnmatchedAttribute(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    connectOutlet(outlet, element, outletName) {\n        var _a;\n        if (!this.outletElementsByName.has(outletName, element)) {\n            this.outletsByName.add(outletName, outlet);\n            this.outletElementsByName.add(outletName, element);\n            (_a = this.selectorObserverMap.get(outletName)) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.outletConnected(outlet, element, outletName));\n        }\n    }\n    disconnectOutlet(outlet, element, outletName) {\n        var _a;\n        if (this.outletElementsByName.has(outletName, element)) {\n            this.outletsByName.delete(outletName, outlet);\n            this.outletElementsByName.delete(outletName, element);\n            (_a = this.selectorObserverMap\n                .get(outletName)) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.outletDisconnected(outlet, element, outletName));\n        }\n    }\n    disconnectAllOutlets() {\n        for (const outletName of this.outletElementsByName.keys) {\n            for (const element of this.outletElementsByName.getValuesForKey(outletName)) {\n                for (const outlet of this.outletsByName.getValuesForKey(outletName)) {\n                    this.disconnectOutlet(outlet, element, outletName);\n                }\n            }\n        }\n    }\n    updateSelectorObserverForOutlet(outletName) {\n        const observer = this.selectorObserverMap.get(outletName);\n        if (observer) {\n            observer.selector = this.selector(outletName);\n        }\n    }\n    setupSelectorObserverForOutlet(outletName) {\n        const selector = this.selector(outletName);\n        const selectorObserver = new SelectorObserver(document.body, selector, this, { outletName });\n        this.selectorObserverMap.set(outletName, selectorObserver);\n        selectorObserver.start();\n    }\n    setupAttributeObserverForOutlet(outletName) {\n        const attributeName = this.attributeNameForOutletName(outletName);\n        const attributeObserver = new AttributeObserver(this.scope.element, attributeName, this);\n        this.attributeObserverMap.set(outletName, attributeObserver);\n        attributeObserver.start();\n    }\n    selector(outletName) {\n        return this.scope.outlets.getSelectorForOutletName(outletName);\n    }\n    attributeNameForOutletName(outletName) {\n        return this.scope.schema.outletAttributeForScope(this.identifier, outletName);\n    }\n    getOutletNameFromOutletAttributeName(attributeName) {\n        return this.outletDefinitions.find((outletName) => this.attributeNameForOutletName(outletName) === attributeName);\n    }\n    get outletDependencies() {\n        const dependencies = new Multimap();\n        this.router.modules.forEach((module) => {\n            const constructor = module.definition.controllerConstructor;\n            const outlets = readInheritableStaticArrayValues(constructor, \"outlets\");\n            outlets.forEach((outlet) => dependencies.add(outlet, module.identifier));\n        });\n        return dependencies;\n    }\n    get outletDefinitions() {\n        return this.outletDependencies.getKeysForValue(this.identifier);\n    }\n    get dependentControllerIdentifiers() {\n        return this.outletDependencies.getValuesForKey(this.identifier);\n    }\n    get dependentContexts() {\n        const identifiers = this.dependentControllerIdentifiers;\n        return this.router.contexts.filter((context) => identifiers.includes(context.identifier));\n    }\n    hasOutlet(element, outletName) {\n        return !!this.getOutlet(element, outletName) || !!this.getOutletFromMap(element, outletName);\n    }\n    getOutlet(element, outletName) {\n        return this.application.getControllerForElementAndIdentifier(element, outletName);\n    }\n    getOutletFromMap(element, outletName) {\n        return this.outletsByName.getValuesForKey(outletName).find((outlet) => outlet.element === element);\n    }\n    get scope() {\n        return this.context.scope;\n    }\n    get schema() {\n        return this.context.schema;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    get application() {\n        return this.context.application;\n    }\n    get router() {\n        return this.application.router;\n    }\n}\n\nclass Context {\n    constructor(module, scope) {\n        this.logDebugActivity = (functionName, detail = {}) => {\n            const { identifier, controller, element } = this;\n            detail = Object.assign({ identifier, controller, element }, detail);\n            this.application.logDebugActivity(this.identifier, functionName, detail);\n        };\n        this.module = module;\n        this.scope = scope;\n        this.controller = new module.controllerConstructor(this);\n        this.bindingObserver = new BindingObserver(this, this.dispatcher);\n        this.valueObserver = new ValueObserver(this, this.controller);\n        this.targetObserver = new TargetObserver(this, this);\n        this.outletObserver = new OutletObserver(this, this);\n        try {\n            this.controller.initialize();\n            this.logDebugActivity(\"initialize\");\n        }\n        catch (error) {\n            this.handleError(error, \"initializing controller\");\n        }\n    }\n    connect() {\n        this.bindingObserver.start();\n        this.valueObserver.start();\n        this.targetObserver.start();\n        this.outletObserver.start();\n        try {\n            this.controller.connect();\n            this.logDebugActivity(\"connect\");\n        }\n        catch (error) {\n            this.handleError(error, \"connecting controller\");\n        }\n    }\n    refresh() {\n        this.outletObserver.refresh();\n    }\n    disconnect() {\n        try {\n            this.controller.disconnect();\n            this.logDebugActivity(\"disconnect\");\n        }\n        catch (error) {\n            this.handleError(error, \"disconnecting controller\");\n        }\n        this.outletObserver.stop();\n        this.targetObserver.stop();\n        this.valueObserver.stop();\n        this.bindingObserver.stop();\n    }\n    get application() {\n        return this.module.application;\n    }\n    get identifier() {\n        return this.module.identifier;\n    }\n    get schema() {\n        return this.application.schema;\n    }\n    get dispatcher() {\n        return this.application.dispatcher;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get parentElement() {\n        return this.element.parentElement;\n    }\n    handleError(error, message, detail = {}) {\n        const { identifier, controller, element } = this;\n        detail = Object.assign({ identifier, controller, element }, detail);\n        this.application.handleError(error, `Error ${message}`, detail);\n    }\n    targetConnected(element, name) {\n        this.invokeControllerMethod(`${name}TargetConnected`, element);\n    }\n    targetDisconnected(element, name) {\n        this.invokeControllerMethod(`${name}TargetDisconnected`, element);\n    }\n    outletConnected(outlet, element, name) {\n        this.invokeControllerMethod(`${namespaceCamelize(name)}OutletConnected`, outlet, element);\n    }\n    outletDisconnected(outlet, element, name) {\n        this.invokeControllerMethod(`${namespaceCamelize(name)}OutletDisconnected`, outlet, element);\n    }\n    invokeControllerMethod(methodName, ...args) {\n        const controller = this.controller;\n        if (typeof controller[methodName] == \"function\") {\n            controller[methodName](...args);\n        }\n    }\n}\n\nfunction bless(constructor) {\n    return shadow(constructor, getBlessedProperties(constructor));\n}\nfunction shadow(constructor, properties) {\n    const shadowConstructor = extend(constructor);\n    const shadowProperties = getShadowProperties(constructor.prototype, properties);\n    Object.defineProperties(shadowConstructor.prototype, shadowProperties);\n    return shadowConstructor;\n}\nfunction getBlessedProperties(constructor) {\n    const blessings = readInheritableStaticArrayValues(constructor, \"blessings\");\n    return blessings.reduce((blessedProperties, blessing) => {\n        const properties = blessing(constructor);\n        for (const key in properties) {\n            const descriptor = blessedProperties[key] || {};\n            blessedProperties[key] = Object.assign(descriptor, properties[key]);\n        }\n        return blessedProperties;\n    }, {});\n}\nfunction getShadowProperties(prototype, properties) {\n    return getOwnKeys(properties).reduce((shadowProperties, key) => {\n        const descriptor = getShadowedDescriptor(prototype, properties, key);\n        if (descriptor) {\n            Object.assign(shadowProperties, { [key]: descriptor });\n        }\n        return shadowProperties;\n    }, {});\n}\nfunction getShadowedDescriptor(prototype, properties, key) {\n    const shadowingDescriptor = Object.getOwnPropertyDescriptor(prototype, key);\n    const shadowedByValue = shadowingDescriptor && \"value\" in shadowingDescriptor;\n    if (!shadowedByValue) {\n        const descriptor = Object.getOwnPropertyDescriptor(properties, key).value;\n        if (shadowingDescriptor) {\n            descriptor.get = shadowingDescriptor.get || descriptor.get;\n            descriptor.set = shadowingDescriptor.set || descriptor.set;\n        }\n        return descriptor;\n    }\n}\nconst getOwnKeys = (() => {\n    if (typeof Object.getOwnPropertySymbols == \"function\") {\n        return (object) => [...Object.getOwnPropertyNames(object), ...Object.getOwnPropertySymbols(object)];\n    }\n    else {\n        return Object.getOwnPropertyNames;\n    }\n})();\nconst extend = (() => {\n    function extendWithReflect(constructor) {\n        function extended() {\n            return Reflect.construct(constructor, arguments, new.target);\n        }\n        extended.prototype = Object.create(constructor.prototype, {\n            constructor: { value: extended },\n        });\n        Reflect.setPrototypeOf(extended, constructor);\n        return extended;\n    }\n    function testReflectExtension() {\n        const a = function () {\n            this.a.call(this);\n        };\n        const b = extendWithReflect(a);\n        b.prototype.a = function () { };\n        return new b();\n    }\n    try {\n        testReflectExtension();\n        return extendWithReflect;\n    }\n    catch (error) {\n        return (constructor) => class extended extends constructor {\n        };\n    }\n})();\n\nfunction blessDefinition(definition) {\n    return {\n        identifier: definition.identifier,\n        controllerConstructor: bless(definition.controllerConstructor),\n    };\n}\n\nclass Module {\n    constructor(application, definition) {\n        this.application = application;\n        this.definition = blessDefinition(definition);\n        this.contextsByScope = new WeakMap();\n        this.connectedContexts = new Set();\n    }\n    get identifier() {\n        return this.definition.identifier;\n    }\n    get controllerConstructor() {\n        return this.definition.controllerConstructor;\n    }\n    get contexts() {\n        return Array.from(this.connectedContexts);\n    }\n    connectContextForScope(scope) {\n        const context = this.fetchContextForScope(scope);\n        this.connectedContexts.add(context);\n        context.connect();\n    }\n    disconnectContextForScope(scope) {\n        const context = this.contextsByScope.get(scope);\n        if (context) {\n            this.connectedContexts.delete(context);\n            context.disconnect();\n        }\n    }\n    fetchContextForScope(scope) {\n        let context = this.contextsByScope.get(scope);\n        if (!context) {\n            context = new Context(this, scope);\n            this.contextsByScope.set(scope, context);\n        }\n        return context;\n    }\n}\n\nclass ClassMap {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    has(name) {\n        return this.data.has(this.getDataKey(name));\n    }\n    get(name) {\n        return this.getAll(name)[0];\n    }\n    getAll(name) {\n        const tokenString = this.data.get(this.getDataKey(name)) || \"\";\n        return tokenize(tokenString);\n    }\n    getAttributeName(name) {\n        return this.data.getAttributeNameForKey(this.getDataKey(name));\n    }\n    getDataKey(name) {\n        return `${name}-class`;\n    }\n    get data() {\n        return this.scope.data;\n    }\n}\n\nclass DataMap {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get(key) {\n        const name = this.getAttributeNameForKey(key);\n        return this.element.getAttribute(name);\n    }\n    set(key, value) {\n        const name = this.getAttributeNameForKey(key);\n        this.element.setAttribute(name, value);\n        return this.get(key);\n    }\n    has(key) {\n        const name = this.getAttributeNameForKey(key);\n        return this.element.hasAttribute(name);\n    }\n    delete(key) {\n        if (this.has(key)) {\n            const name = this.getAttributeNameForKey(key);\n            this.element.removeAttribute(name);\n            return true;\n        }\n        else {\n            return false;\n        }\n    }\n    getAttributeNameForKey(key) {\n        return `data-${this.identifier}-${dasherize(key)}`;\n    }\n}\n\nclass Guide {\n    constructor(logger) {\n        this.warnedKeysByObject = new WeakMap();\n        this.logger = logger;\n    }\n    warn(object, key, message) {\n        let warnedKeys = this.warnedKeysByObject.get(object);\n        if (!warnedKeys) {\n            warnedKeys = new Set();\n            this.warnedKeysByObject.set(object, warnedKeys);\n        }\n        if (!warnedKeys.has(key)) {\n            warnedKeys.add(key);\n            this.logger.warn(message, object);\n        }\n    }\n}\n\nfunction attributeValueContainsToken(attributeName, token) {\n    return `[${attributeName}~=\"${token}\"]`;\n}\n\nclass TargetSet {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get schema() {\n        return this.scope.schema;\n    }\n    has(targetName) {\n        return this.find(targetName) != null;\n    }\n    find(...targetNames) {\n        return targetNames.reduce((target, targetName) => target || this.findTarget(targetName) || this.findLegacyTarget(targetName), undefined);\n    }\n    findAll(...targetNames) {\n        return targetNames.reduce((targets, targetName) => [\n            ...targets,\n            ...this.findAllTargets(targetName),\n            ...this.findAllLegacyTargets(targetName),\n        ], []);\n    }\n    findTarget(targetName) {\n        const selector = this.getSelectorForTargetName(targetName);\n        return this.scope.findElement(selector);\n    }\n    findAllTargets(targetName) {\n        const selector = this.getSelectorForTargetName(targetName);\n        return this.scope.findAllElements(selector);\n    }\n    getSelectorForTargetName(targetName) {\n        const attributeName = this.schema.targetAttributeForScope(this.identifier);\n        return attributeValueContainsToken(attributeName, targetName);\n    }\n    findLegacyTarget(targetName) {\n        const selector = this.getLegacySelectorForTargetName(targetName);\n        return this.deprecate(this.scope.findElement(selector), targetName);\n    }\n    findAllLegacyTargets(targetName) {\n        const selector = this.getLegacySelectorForTargetName(targetName);\n        return this.scope.findAllElements(selector).map((element) => this.deprecate(element, targetName));\n    }\n    getLegacySelectorForTargetName(targetName) {\n        const targetDescriptor = `${this.identifier}.${targetName}`;\n        return attributeValueContainsToken(this.schema.targetAttribute, targetDescriptor);\n    }\n    deprecate(element, targetName) {\n        if (element) {\n            const { identifier } = this;\n            const attributeName = this.schema.targetAttribute;\n            const revisedAttributeName = this.schema.targetAttributeForScope(identifier);\n            this.guide.warn(element, `target:${targetName}`, `Please replace ${attributeName}=\"${identifier}.${targetName}\" with ${revisedAttributeName}=\"${targetName}\". ` +\n                `The ${attributeName} attribute is deprecated and will be removed in a future version of Stimulus.`);\n        }\n        return element;\n    }\n    get guide() {\n        return this.scope.guide;\n    }\n}\n\nclass OutletSet {\n    constructor(scope, controllerElement) {\n        this.scope = scope;\n        this.controllerElement = controllerElement;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get schema() {\n        return this.scope.schema;\n    }\n    has(outletName) {\n        return this.find(outletName) != null;\n    }\n    find(...outletNames) {\n        return outletNames.reduce((outlet, outletName) => outlet || this.findOutlet(outletName), undefined);\n    }\n    findAll(...outletNames) {\n        return outletNames.reduce((outlets, outletName) => [...outlets, ...this.findAllOutlets(outletName)], []);\n    }\n    getSelectorForOutletName(outletName) {\n        const attributeName = this.schema.outletAttributeForScope(this.identifier, outletName);\n        return this.controllerElement.getAttribute(attributeName);\n    }\n    findOutlet(outletName) {\n        const selector = this.getSelectorForOutletName(outletName);\n        if (selector)\n            return this.findElement(selector, outletName);\n    }\n    findAllOutlets(outletName) {\n        const selector = this.getSelectorForOutletName(outletName);\n        return selector ? this.findAllElements(selector, outletName) : [];\n    }\n    findElement(selector, outletName) {\n        const elements = this.scope.queryElements(selector);\n        return elements.filter((element) => this.matchesElement(element, selector, outletName))[0];\n    }\n    findAllElements(selector, outletName) {\n        const elements = this.scope.queryElements(selector);\n        return elements.filter((element) => this.matchesElement(element, selector, outletName));\n    }\n    matchesElement(element, selector, outletName) {\n        const controllerAttribute = element.getAttribute(this.scope.schema.controllerAttribute) || \"\";\n        return element.matches(selector) && controllerAttribute.split(\" \").includes(outletName);\n    }\n}\n\nclass Scope {\n    constructor(schema, element, identifier, logger) {\n        this.targets = new TargetSet(this);\n        this.classes = new ClassMap(this);\n        this.data = new DataMap(this);\n        this.containsElement = (element) => {\n            return element.closest(this.controllerSelector) === this.element;\n        };\n        this.schema = schema;\n        this.element = element;\n        this.identifier = identifier;\n        this.guide = new Guide(logger);\n        this.outlets = new OutletSet(this.documentScope, element);\n    }\n    findElement(selector) {\n        return this.element.matches(selector) ? this.element : this.queryElements(selector).find(this.containsElement);\n    }\n    findAllElements(selector) {\n        return [\n            ...(this.element.matches(selector) ? [this.element] : []),\n            ...this.queryElements(selector).filter(this.containsElement),\n        ];\n    }\n    queryElements(selector) {\n        return Array.from(this.element.querySelectorAll(selector));\n    }\n    get controllerSelector() {\n        return attributeValueContainsToken(this.schema.controllerAttribute, this.identifier);\n    }\n    get isDocumentScope() {\n        return this.element === document.documentElement;\n    }\n    get documentScope() {\n        return this.isDocumentScope\n            ? this\n            : new Scope(this.schema, document.documentElement, this.identifier, this.guide.logger);\n    }\n}\n\nclass ScopeObserver {\n    constructor(element, schema, delegate) {\n        this.element = element;\n        this.schema = schema;\n        this.delegate = delegate;\n        this.valueListObserver = new ValueListObserver(this.element, this.controllerAttribute, this);\n        this.scopesByIdentifierByElement = new WeakMap();\n        this.scopeReferenceCounts = new WeakMap();\n    }\n    start() {\n        this.valueListObserver.start();\n    }\n    stop() {\n        this.valueListObserver.stop();\n    }\n    get controllerAttribute() {\n        return this.schema.controllerAttribute;\n    }\n    parseValueForToken(token) {\n        const { element, content: identifier } = token;\n        return this.parseValueForElementAndIdentifier(element, identifier);\n    }\n    parseValueForElementAndIdentifier(element, identifier) {\n        const scopesByIdentifier = this.fetchScopesByIdentifierForElement(element);\n        let scope = scopesByIdentifier.get(identifier);\n        if (!scope) {\n            scope = this.delegate.createScopeForElementAndIdentifier(element, identifier);\n            scopesByIdentifier.set(identifier, scope);\n        }\n        return scope;\n    }\n    elementMatchedValue(element, value) {\n        const referenceCount = (this.scopeReferenceCounts.get(value) || 0) + 1;\n        this.scopeReferenceCounts.set(value, referenceCount);\n        if (referenceCount == 1) {\n            this.delegate.scopeConnected(value);\n        }\n    }\n    elementUnmatchedValue(element, value) {\n        const referenceCount = this.scopeReferenceCounts.get(value);\n        if (referenceCount) {\n            this.scopeReferenceCounts.set(value, referenceCount - 1);\n            if (referenceCount == 1) {\n                this.delegate.scopeDisconnected(value);\n            }\n        }\n    }\n    fetchScopesByIdentifierForElement(element) {\n        let scopesByIdentifier = this.scopesByIdentifierByElement.get(element);\n        if (!scopesByIdentifier) {\n            scopesByIdentifier = new Map();\n            this.scopesByIdentifierByElement.set(element, scopesByIdentifier);\n        }\n        return scopesByIdentifier;\n    }\n}\n\nclass Router {\n    constructor(application) {\n        this.application = application;\n        this.scopeObserver = new ScopeObserver(this.element, this.schema, this);\n        this.scopesByIdentifier = new Multimap();\n        this.modulesByIdentifier = new Map();\n    }\n    get element() {\n        return this.application.element;\n    }\n    get schema() {\n        return this.application.schema;\n    }\n    get logger() {\n        return this.application.logger;\n    }\n    get controllerAttribute() {\n        return this.schema.controllerAttribute;\n    }\n    get modules() {\n        return Array.from(this.modulesByIdentifier.values());\n    }\n    get contexts() {\n        return this.modules.reduce((contexts, module) => contexts.concat(module.contexts), []);\n    }\n    start() {\n        this.scopeObserver.start();\n    }\n    stop() {\n        this.scopeObserver.stop();\n    }\n    loadDefinition(definition) {\n        this.unloadIdentifier(definition.identifier);\n        const module = new Module(this.application, definition);\n        this.connectModule(module);\n        const afterLoad = definition.controllerConstructor.afterLoad;\n        if (afterLoad) {\n            afterLoad.call(definition.controllerConstructor, definition.identifier, this.application);\n        }\n    }\n    unloadIdentifier(identifier) {\n        const module = this.modulesByIdentifier.get(identifier);\n        if (module) {\n            this.disconnectModule(module);\n        }\n    }\n    getContextForElementAndIdentifier(element, identifier) {\n        const module = this.modulesByIdentifier.get(identifier);\n        if (module) {\n            return module.contexts.find((context) => context.element == element);\n        }\n    }\n    proposeToConnectScopeForElementAndIdentifier(element, identifier) {\n        const scope = this.scopeObserver.parseValueForElementAndIdentifier(element, identifier);\n        if (scope) {\n            this.scopeObserver.elementMatchedValue(scope.element, scope);\n        }\n        else {\n            console.error(`Couldn't find or create scope for identifier: \"${identifier}\" and element:`, element);\n        }\n    }\n    handleError(error, message, detail) {\n        this.application.handleError(error, message, detail);\n    }\n    createScopeForElementAndIdentifier(element, identifier) {\n        return new Scope(this.schema, element, identifier, this.logger);\n    }\n    scopeConnected(scope) {\n        this.scopesByIdentifier.add(scope.identifier, scope);\n        const module = this.modulesByIdentifier.get(scope.identifier);\n        if (module) {\n            module.connectContextForScope(scope);\n        }\n    }\n    scopeDisconnected(scope) {\n        this.scopesByIdentifier.delete(scope.identifier, scope);\n        const module = this.modulesByIdentifier.get(scope.identifier);\n        if (module) {\n            module.disconnectContextForScope(scope);\n        }\n    }\n    connectModule(module) {\n        this.modulesByIdentifier.set(module.identifier, module);\n        const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);\n        scopes.forEach((scope) => module.connectContextForScope(scope));\n    }\n    disconnectModule(module) {\n        this.modulesByIdentifier.delete(module.identifier);\n        const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);\n        scopes.forEach((scope) => module.disconnectContextForScope(scope));\n    }\n}\n\nconst defaultSchema = {\n    controllerAttribute: \"data-controller\",\n    actionAttribute: \"data-action\",\n    targetAttribute: \"data-target\",\n    targetAttributeForScope: (identifier) => `data-${identifier}-target`,\n    outletAttributeForScope: (identifier, outlet) => `data-${identifier}-${outlet}-outlet`,\n    keyMappings: Object.assign(Object.assign({ enter: \"Enter\", tab: \"Tab\", esc: \"Escape\", space: \" \", up: \"ArrowUp\", down: \"ArrowDown\", left: \"ArrowLeft\", right: \"ArrowRight\", home: \"Home\", end: \"End\", page_up: \"PageUp\", page_down: \"PageDown\" }, objectFromEntries(\"abcdefghijklmnopqrstuvwxyz\".split(\"\").map((c) => [c, c]))), objectFromEntries(\"0123456789\".split(\"\").map((n) => [n, n]))),\n};\nfunction objectFromEntries(array) {\n    return array.reduce((memo, [k, v]) => (Object.assign(Object.assign({}, memo), { [k]: v })), {});\n}\n\nclass Application {\n    constructor(element = document.documentElement, schema = defaultSchema) {\n        this.logger = console;\n        this.debug = false;\n        this.logDebugActivity = (identifier, functionName, detail = {}) => {\n            if (this.debug) {\n                this.logFormattedMessage(identifier, functionName, detail);\n            }\n        };\n        this.element = element;\n        this.schema = schema;\n        this.dispatcher = new Dispatcher(this);\n        this.router = new Router(this);\n        this.actionDescriptorFilters = Object.assign({}, defaultActionDescriptorFilters);\n    }\n    static start(element, schema) {\n        const application = new this(element, schema);\n        application.start();\n        return application;\n    }\n    async start() {\n        await domReady();\n        this.logDebugActivity(\"application\", \"starting\");\n        this.dispatcher.start();\n        this.router.start();\n        this.logDebugActivity(\"application\", \"start\");\n    }\n    stop() {\n        this.logDebugActivity(\"application\", \"stopping\");\n        this.dispatcher.stop();\n        this.router.stop();\n        this.logDebugActivity(\"application\", \"stop\");\n    }\n    register(identifier, controllerConstructor) {\n        this.load({ identifier, controllerConstructor });\n    }\n    registerActionOption(name, filter) {\n        this.actionDescriptorFilters[name] = filter;\n    }\n    load(head, ...rest) {\n        const definitions = Array.isArray(head) ? head : [head, ...rest];\n        definitions.forEach((definition) => {\n            if (definition.controllerConstructor.shouldLoad) {\n                this.router.loadDefinition(definition);\n            }\n        });\n    }\n    unload(head, ...rest) {\n        const identifiers = Array.isArray(head) ? head : [head, ...rest];\n        identifiers.forEach((identifier) => this.router.unloadIdentifier(identifier));\n    }\n    get controllers() {\n        return this.router.contexts.map((context) => context.controller);\n    }\n    getControllerForElementAndIdentifier(element, identifier) {\n        const context = this.router.getContextForElementAndIdentifier(element, identifier);\n        return context ? context.controller : null;\n    }\n    handleError(error, message, detail) {\n        var _a;\n        this.logger.error(`%s\\n\\n%o\\n\\n%o`, message, error, detail);\n        (_a = window.onerror) === null || _a === void 0 ? void 0 : _a.call(window, message, \"\", 0, 0, error);\n    }\n    logFormattedMessage(identifier, functionName, detail = {}) {\n        detail = Object.assign({ application: this }, detail);\n        this.logger.groupCollapsed(`${identifier} #${functionName}`);\n        this.logger.log(\"details:\", Object.assign({}, detail));\n        this.logger.groupEnd();\n    }\n}\nfunction domReady() {\n    return new Promise((resolve) => {\n        if (document.readyState == \"loading\") {\n            document.addEventListener(\"DOMContentLoaded\", () => resolve());\n        }\n        else {\n            resolve();\n        }\n    });\n}\n\nfunction ClassPropertiesBlessing(constructor) {\n    const classes = readInheritableStaticArrayValues(constructor, \"classes\");\n    return classes.reduce((properties, classDefinition) => {\n        return Object.assign(properties, propertiesForClassDefinition(classDefinition));\n    }, {});\n}\nfunction propertiesForClassDefinition(key) {\n    return {\n        [`${key}Class`]: {\n            get() {\n                const { classes } = this;\n                if (classes.has(key)) {\n                    return classes.get(key);\n                }\n                else {\n                    const attribute = classes.getAttributeName(key);\n                    throw new Error(`Missing attribute \"${attribute}\"`);\n                }\n            },\n        },\n        [`${key}Classes`]: {\n            get() {\n                return this.classes.getAll(key);\n            },\n        },\n        [`has${capitalize(key)}Class`]: {\n            get() {\n                return this.classes.has(key);\n            },\n        },\n    };\n}\n\nfunction OutletPropertiesBlessing(constructor) {\n    const outlets = readInheritableStaticArrayValues(constructor, \"outlets\");\n    return outlets.reduce((properties, outletDefinition) => {\n        return Object.assign(properties, propertiesForOutletDefinition(outletDefinition));\n    }, {});\n}\nfunction getOutletController(controller, element, identifier) {\n    return controller.application.getControllerForElementAndIdentifier(element, identifier);\n}\nfunction getControllerAndEnsureConnectedScope(controller, element, outletName) {\n    let outletController = getOutletController(controller, element, outletName);\n    if (outletController)\n        return outletController;\n    controller.application.router.proposeToConnectScopeForElementAndIdentifier(element, outletName);\n    outletController = getOutletController(controller, element, outletName);\n    if (outletController)\n        return outletController;\n}\nfunction propertiesForOutletDefinition(name) {\n    const camelizedName = namespaceCamelize(name);\n    return {\n        [`${camelizedName}Outlet`]: {\n            get() {\n                const outletElement = this.outlets.find(name);\n                const selector = this.outlets.getSelectorForOutletName(name);\n                if (outletElement) {\n                    const outletController = getControllerAndEnsureConnectedScope(this, outletElement, name);\n                    if (outletController)\n                        return outletController;\n                    throw new Error(`The provided outlet element is missing an outlet controller \"${name}\" instance for host controller \"${this.identifier}\"`);\n                }\n                throw new Error(`Missing outlet element \"${name}\" for host controller \"${this.identifier}\". Stimulus couldn't find a matching outlet element using selector \"${selector}\".`);\n            },\n        },\n        [`${camelizedName}Outlets`]: {\n            get() {\n                const outlets = this.outlets.findAll(name);\n                if (outlets.length > 0) {\n                    return outlets\n                        .map((outletElement) => {\n                        const outletController = getControllerAndEnsureConnectedScope(this, outletElement, name);\n                        if (outletController)\n                            return outletController;\n                        console.warn(`The provided outlet element is missing an outlet controller \"${name}\" instance for host controller \"${this.identifier}\"`, outletElement);\n                    })\n                        .filter((controller) => controller);\n                }\n                return [];\n            },\n        },\n        [`${camelizedName}OutletElement`]: {\n            get() {\n                const outletElement = this.outlets.find(name);\n                const selector = this.outlets.getSelectorForOutletName(name);\n                if (outletElement) {\n                    return outletElement;\n                }\n                else {\n                    throw new Error(`Missing outlet element \"${name}\" for host controller \"${this.identifier}\". Stimulus couldn't find a matching outlet element using selector \"${selector}\".`);\n                }\n            },\n        },\n        [`${camelizedName}OutletElements`]: {\n            get() {\n                return this.outlets.findAll(name);\n            },\n        },\n        [`has${capitalize(camelizedName)}Outlet`]: {\n            get() {\n                return this.outlets.has(name);\n            },\n        },\n    };\n}\n\nfunction TargetPropertiesBlessing(constructor) {\n    const targets = readInheritableStaticArrayValues(constructor, \"targets\");\n    return targets.reduce((properties, targetDefinition) => {\n        return Object.assign(properties, propertiesForTargetDefinition(targetDefinition));\n    }, {});\n}\nfunction propertiesForTargetDefinition(name) {\n    return {\n        [`${name}Target`]: {\n            get() {\n                const target = this.targets.find(name);\n                if (target) {\n                    return target;\n                }\n                else {\n                    throw new Error(`Missing target element \"${name}\" for \"${this.identifier}\" controller`);\n                }\n            },\n        },\n        [`${name}Targets`]: {\n            get() {\n                return this.targets.findAll(name);\n            },\n        },\n        [`has${capitalize(name)}Target`]: {\n            get() {\n                return this.targets.has(name);\n            },\n        },\n    };\n}\n\nfunction ValuePropertiesBlessing(constructor) {\n    const valueDefinitionPairs = readInheritableStaticObjectPairs(constructor, \"values\");\n    const propertyDescriptorMap = {\n        valueDescriptorMap: {\n            get() {\n                return valueDefinitionPairs.reduce((result, valueDefinitionPair) => {\n                    const valueDescriptor = parseValueDefinitionPair(valueDefinitionPair, this.identifier);\n                    const attributeName = this.data.getAttributeNameForKey(valueDescriptor.key);\n                    return Object.assign(result, { [attributeName]: valueDescriptor });\n                }, {});\n            },\n        },\n    };\n    return valueDefinitionPairs.reduce((properties, valueDefinitionPair) => {\n        return Object.assign(properties, propertiesForValueDefinitionPair(valueDefinitionPair));\n    }, propertyDescriptorMap);\n}\nfunction propertiesForValueDefinitionPair(valueDefinitionPair, controller) {\n    const definition = parseValueDefinitionPair(valueDefinitionPair, controller);\n    const { key, name, reader: read, writer: write } = definition;\n    return {\n        [name]: {\n            get() {\n                const value = this.data.get(key);\n                if (value !== null) {\n                    return read(value);\n                }\n                else {\n                    return definition.defaultValue;\n                }\n            },\n            set(value) {\n                if (value === undefined) {\n                    this.data.delete(key);\n                }\n                else {\n                    this.data.set(key, write(value));\n                }\n            },\n        },\n        [`has${capitalize(name)}`]: {\n            get() {\n                return this.data.has(key) || definition.hasCustomDefaultValue;\n            },\n        },\n    };\n}\nfunction parseValueDefinitionPair([token, typeDefinition], controller) {\n    return valueDescriptorForTokenAndTypeDefinition({\n        controller,\n        token,\n        typeDefinition,\n    });\n}\nfunction parseValueTypeConstant(constant) {\n    switch (constant) {\n        case Array:\n            return \"array\";\n        case Boolean:\n            return \"boolean\";\n        case Number:\n            return \"number\";\n        case Object:\n            return \"object\";\n        case String:\n            return \"string\";\n    }\n}\nfunction parseValueTypeDefault(defaultValue) {\n    switch (typeof defaultValue) {\n        case \"boolean\":\n            return \"boolean\";\n        case \"number\":\n            return \"number\";\n        case \"string\":\n            return \"string\";\n    }\n    if (Array.isArray(defaultValue))\n        return \"array\";\n    if (Object.prototype.toString.call(defaultValue) === \"[object Object]\")\n        return \"object\";\n}\nfunction parseValueTypeObject(payload) {\n    const { controller, token, typeObject } = payload;\n    const hasType = isSomething(typeObject.type);\n    const hasDefault = isSomething(typeObject.default);\n    const fullObject = hasType && hasDefault;\n    const onlyType = hasType && !hasDefault;\n    const onlyDefault = !hasType && hasDefault;\n    const typeFromObject = parseValueTypeConstant(typeObject.type);\n    const typeFromDefaultValue = parseValueTypeDefault(payload.typeObject.default);\n    if (onlyType)\n        return typeFromObject;\n    if (onlyDefault)\n        return typeFromDefaultValue;\n    if (typeFromObject !== typeFromDefaultValue) {\n        const propertyPath = controller ? `${controller}.${token}` : token;\n        throw new Error(`The specified default value for the Stimulus Value \"${propertyPath}\" must match the defined type \"${typeFromObject}\". The provided default value of \"${typeObject.default}\" is of type \"${typeFromDefaultValue}\".`);\n    }\n    if (fullObject)\n        return typeFromObject;\n}\nfunction parseValueTypeDefinition(payload) {\n    const { controller, token, typeDefinition } = payload;\n    const typeObject = { controller, token, typeObject: typeDefinition };\n    const typeFromObject = parseValueTypeObject(typeObject);\n    const typeFromDefaultValue = parseValueTypeDefault(typeDefinition);\n    const typeFromConstant = parseValueTypeConstant(typeDefinition);\n    const type = typeFromObject || typeFromDefaultValue || typeFromConstant;\n    if (type)\n        return type;\n    const propertyPath = controller ? `${controller}.${typeDefinition}` : token;\n    throw new Error(`Unknown value type \"${propertyPath}\" for \"${token}\" value`);\n}\nfunction defaultValueForDefinition(typeDefinition) {\n    const constant = parseValueTypeConstant(typeDefinition);\n    if (constant)\n        return defaultValuesByType[constant];\n    const hasDefault = hasProperty(typeDefinition, \"default\");\n    const hasType = hasProperty(typeDefinition, \"type\");\n    const typeObject = typeDefinition;\n    if (hasDefault)\n        return typeObject.default;\n    if (hasType) {\n        const { type } = typeObject;\n        const constantFromType = parseValueTypeConstant(type);\n        if (constantFromType)\n            return defaultValuesByType[constantFromType];\n    }\n    return typeDefinition;\n}\nfunction valueDescriptorForTokenAndTypeDefinition(payload) {\n    const { token, typeDefinition } = payload;\n    const key = `${dasherize(token)}-value`;\n    const type = parseValueTypeDefinition(payload);\n    return {\n        type,\n        key,\n        name: camelize(key),\n        get defaultValue() {\n            return defaultValueForDefinition(typeDefinition);\n        },\n        get hasCustomDefaultValue() {\n            return parseValueTypeDefault(typeDefinition) !== undefined;\n        },\n        reader: readers[type],\n        writer: writers[type] || writers.default,\n    };\n}\nconst defaultValuesByType = {\n    get array() {\n        return [];\n    },\n    boolean: false,\n    number: 0,\n    get object() {\n        return {};\n    },\n    string: \"\",\n};\nconst readers = {\n    array(value) {\n        const array = JSON.parse(value);\n        if (!Array.isArray(array)) {\n            throw new TypeError(`expected value of type \"array\" but instead got value \"${value}\" of type \"${parseValueTypeDefault(array)}\"`);\n        }\n        return array;\n    },\n    boolean(value) {\n        return !(value == \"0\" || String(value).toLowerCase() == \"false\");\n    },\n    number(value) {\n        return Number(value.replace(/_/g, \"\"));\n    },\n    object(value) {\n        const object = JSON.parse(value);\n        if (object === null || typeof object != \"object\" || Array.isArray(object)) {\n            throw new TypeError(`expected value of type \"object\" but instead got value \"${value}\" of type \"${parseValueTypeDefault(object)}\"`);\n        }\n        return object;\n    },\n    string(value) {\n        return value;\n    },\n};\nconst writers = {\n    default: writeString,\n    array: writeJSON,\n    object: writeJSON,\n};\nfunction writeJSON(value) {\n    return JSON.stringify(value);\n}\nfunction writeString(value) {\n    return `${value}`;\n}\n\nclass Controller {\n    constructor(context) {\n        this.context = context;\n    }\n    static get shouldLoad() {\n        return true;\n    }\n    static afterLoad(_identifier, _application) {\n        return;\n    }\n    get application() {\n        return this.context.application;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get targets() {\n        return this.scope.targets;\n    }\n    get outlets() {\n        return this.scope.outlets;\n    }\n    get classes() {\n        return this.scope.classes;\n    }\n    get data() {\n        return this.scope.data;\n    }\n    initialize() {\n    }\n    connect() {\n    }\n    disconnect() {\n    }\n    dispatch(eventName, { target = this.element, detail = {}, prefix = this.identifier, bubbles = true, cancelable = true, } = {}) {\n        const type = prefix ? `${prefix}:${eventName}` : eventName;\n        const event = new CustomEvent(type, { detail, bubbles, cancelable });\n        target.dispatchEvent(event);\n        return event;\n    }\n}\nController.blessings = [\n    ClassPropertiesBlessing,\n    TargetPropertiesBlessing,\n    ValuePropertiesBlessing,\n    OutletPropertiesBlessing,\n];\nController.targets = [];\nController.outlets = [];\nController.values = {};\n\nexport { Application, AttributeObserver, Context, Controller, ElementObserver, IndexedMultimap, Multimap, SelectorObserver, StringMapObserver, TokenListObserver, ValueListObserver, add, defaultSchema, del, fetch, prune };\n", "import { Application } from \"@hotwired/stimulus\"\n\nconst application = Application.start()\n\n// Configure Stimulus development experience\napplication.debug = false\nwindow.Stimulus   = application\n\nexport { application }\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"password\", \"passwordConfirmation\", \"email\", \"currentPassword\"]\n  static values = { originalEmail: String }\n\n  connect() {\n    this.refresh()\n  }\n\n  refresh() {\n    const passwordChanged = this.hasPasswordTarget && this.passwordTarget.value.length > 0\n    const emailChanged = this.hasEmailTarget && this.emailTarget.value !== this.originalEmailValue\n\n    if (this.hasCurrentPasswordTarget) {\n      this.currentPasswordTarget.required = passwordChanged || emailChanged\n    }\n\n    this.validatePasswordMatch()\n  }\n\n  validatePasswordMatch() {\n    if (!(this.hasPasswordConfirmationTarget && this.hasPasswordTarget)) return\n\n    const mismatch = this.passwordConfirmationTarget.value !== this.passwordTarget.value\n    this.passwordConfirmationTarget.setCustomValidity(mismatch ? \"Passwords do not match.\" : \"\")\n  }\n}\n", "import {Controller} from \"@hotwired/stimulus\";\nimport {loadJavascript} from \"../../utils/script_loader\";\n\nexport default class extends Controller {\n  connect() {\n    loadJavascript('https://cdn.jsdelivr.net/npm/@tsparticles/confetti@3.0.3/tsparticles.confetti.bundle.min.js')\n    this.el = $(this.element)\n    this.resultBox = $('#quiz-result')\n    this.moreActivities = $('.more-activities')\n    this.moreActivities.addClass('hidden');\n  }\n\n  onSuccess() {\n    this.showConfetti();\n    this.resultBox.find('#correct-message').removeClass('hidden');\n    this.resultBox.find('#incorrect-message').addClass('hidden');\n    this.nextAction()\n  }\n\n  wrongAnswer() {\n    this.resultBox.find('#correct-message').addClass('hidden');\n    this.resultBox.find('#incorrect-message').removeClass('hidden').addClass('shake');\n\n    setTimeout(() => {\n      this.resultBox.find('#incorrect-message').removeClass('shake');\n    }, 500)\n\n    setTimeout(() => {\n      this.element.classList.remove('wrong-answer');\n    }, 1000)\n  }\n\n\n  nextAction() {\n    const ayahKey = this.el.data('ayah');\n    const ayah = this.moreActivities.find('.ayah-info');\n    ayah.data(\"url\", `/ayah/${ayahKey}`);\n\n    setTimeout(() => {\n      this.moreActivities.removeClass('hidden');\n      this.moreActivities.addClass('shake');\n    }, 4500)\n  }\n\n\n  showConfetti() {\n    const count = 200,\n      defaults = {\n        origin: {y: 0.7},\n      };\n\n    const fire = (particleRatio, opts) => {\n      confetti(\n        Object.assign({}, defaults, opts, {\n          particleCount: Math.floor(count * particleRatio),\n        })\n      );\n    }\n\n    fire(0.25, {\n      spread: 26,\n      startVelocity: 55,\n    });\n\n    fire(0.2, {\n      spread: 60,\n    });\n\n    fire(0.35, {\n      spread: 100,\n      decay: 0.91,\n      scalar: 0.8,\n    });\n\n    fire(0.1, {\n      spread: 120,\n      startVelocity: 25,\n      decay: 0.92,\n      scalar: 1.2,\n    });\n\n    fire(0.1, {\n      spread: 120,\n      startVelocity: 45,\n    });\n\n    setTimeout(() => {\n      confetti({\n        particleCount: 300,\n        spread: 80,\n        origin: {y: 0.6},\n      })\n    }, 1000)\n\n    setTimeout(() => {\n      confetti({\n        particleCount: 1000,\n        spread: 80,\n        origin: {y: 0.6},\n      })\n    }, 2000)\n  }\n}\n", "// Load each script once. Forms with several editors call this at the same\n// time, and loading tinymce again replaces the global that earlier editors\n// were registered on.\nconst scriptPromises = {};\n\nconst loadJavascript = (url) => {\n  scriptPromises[url] ||= new Promise((resolve, reject) => {\n    const script = document.createElement('script');\n    script.src = url;\n    script.onload = resolve;\n    script.onerror = (error) => {\n      delete scriptPromises[url];\n      reject(error);\n    };\n    document.head.appendChild(script);\n  });\n\n  return scriptPromises[url];\n}\n\nconst loadStylesheet = (href) => {\n  // Create a new link element\n  const link = document.createElement('link');\n  link.rel = 'stylesheet';\n  link.href = href;\n\n  // Append the link element to the head of the document\n  document.head.appendChild(link);\n}\n\nexport {\n  loadJavascript,\n  loadStylesheet\n};", "import ActivityController from \"./activity_controller\";\n\nexport default class extends ActivityController {\n  connect() {\n    super.connect();\n\n    $(this.element).find('.option').on('click', this.checkAnswer.bind(this))\n  }\n\n  checkAnswer(e) {\n    e.preventDefault();\n    const button = $(e.target);\n    \n    if (button.attr('disabled')) {\n      return;\n    }\n\n    const {correct} = e.target.dataset;\n\n    if (correct == 'true') {\n      this.handleCorrectAnswer(button);\n    } else {\n      this.handleWrongAnswer(button);\n    }\n  }\n\n  handleCorrectAnswer(correctButton) {\n    this.el.find(\".option\").attr('disabled', 'disabled');\n    correctButton.addClass('correct-answer');\n    this.onSuccess();\n  }\n\n  handleWrongAnswer(wrongButton) {\n    wrongButton.addClass('wrong-answer shake');\n    wrongButton.attr('disabled', 'disabled');\n    \n    this.wrongAnswer();\n\n    setTimeout(() => {\n      wrongButton.removeClass('shake');\n      wrongButton.removeClass('wrong-answer');\n      wrongButton.removeAttr('disabled');\n    }, 1000);\n  }\n}\n", "import ActivityController from \"./activity_controller\";\nimport Sortable from 'sortablejs';\n\nexport default class extends ActivityController {\n  connect() {\n    super.connect();\n    this.blankBoxes = this.element.querySelectorAll('.blank-box');\n    this.remainingWords = this.element.querySelectorAll('.draggable-word');\n    this.options = this.element.querySelector(\"#options\");\n\n    this.initSortable();\n    this.addClickEvents();\n  }\n\n  initSortable() {\n    Sortable.create(this.options, {\n      group: \"shared\",\n      animation: 150,\n      onEnd: (event) => this.handleDrop(event)\n    });\n\n    this.blankBoxes.forEach((blank) => {\n      Sortable.create(blank, {\n        group: \"shared\",\n        animation: 150,\n        onEnd: (event) => this.handleDrop(event)\n      });\n    });\n  }\n\n  handleDrop(event) {\n    const target = event.to;\n    const draggableWord = event.item;\n\n    if (!target.classList.contains('blank-box')) {\n      event.from.appendChild(draggableWord);\n      return;\n    }\n\n    this.fillWord(target, draggableWord);\n    this.checkCompletion();\n  }\n\n  addClickEvents() {\n    this.blankWordClick =  this.handleBlankWordClick.bind(this);\n    this.dragableWordClick = this.handleDraggableWordClick.bind(this);\n\n    this.blankBoxes.forEach((blank) => {\n      blank.addEventListener('click', this.blankWordClick);\n    });\n\n    this.remainingWords.forEach((word) => {\n      word.addEventListener('click', this.dragableWordClick);\n    });\n  }\n\n  handleBlankWordClick(event) {\n    const blank = event.currentTarget;\n\n    if (blank.classList.contains('filled')) {\n      const wordId = blank.dataset.filledId;\n      const draggableWord = this.options.querySelector(`[data-word-id='${wordId}']`);\n\n      if (draggableWord) {\n        draggableWord.classList.remove('hidden')\n      }\n\n      blank.innerHTML = '';\n      blank.classList.remove('filled');\n      blank.dataset.filledId = '';\n    }\n  }\n\n  handleDraggableWordClick(event) {\n    const wordElement = event.currentTarget;\n    const blankBox = Array.from(this.blankBoxes).find(blank => !blank.classList.contains('filled'));\n\n    if (blankBox) {\n      this.fillWord(blankBox, wordElement);\n    }\n  }\n\n  fillWord(blankBox, draggableWord) {\n    if (blankBox.classList.contains('filled')) {\n      const currentFilledWordId = blankBox.dataset.filledId;\n      const currentFilledWord = this.options.querySelector(`[data-word-id='${currentFilledWordId}']`);\n\n      if (currentFilledWord) {\n        currentFilledWord.classList.remove('hidden');\n      }\n    }\n\n    blankBox.innerHTML = draggableWord.innerHTML.trim();\n    blankBox.classList.add('filled');\n    blankBox.dataset.filledId = draggableWord.dataset.wordId;\n\n    draggableWord.classList.add('hidden')\n    this.options.appendChild(draggableWord);\n\n    this.checkCompletion();\n  }\n\n  checkCompletion() {\n    let isCorrect = true;\n\n    if (this.element.querySelectorAll('#options .draggable-word:not(.hidden)').length === 0) {\n      this.blankBoxes.forEach((word) => {\n        const { wordId, filledId } = word.dataset;\n        if (wordId != filledId) {\n          this.wrongAnswer();\n          isCorrect = false; // Break the loop\n          return false;\n        }\n      });\n\n      if (isCorrect) {\n        this.onSuccess();\n      }\n    }\n  }\n\n    resetActivity() {\n        this.blankBoxes.forEach((blank) => {\n            blank.innerHTML = '';\n            blank.classList.remove('filled');\n            blank.dataset.filledId = '';\n        });\n\n        this.remainingWords.forEach((word) => {\n            word.classList.remove('hidden');\n            this.options.appendChild(word);\n        });\n    }\n\n\n    onSuccess() {\n    super.onSuccess();\n\n    this.blankBoxes.forEach((blank) => {\n      blank.classList.add('word-box');\n      blank.classList.remove('blank-box');\n\n      blank.removeEventListener('click', this.blankWordClick);\n      Sortable.get(blank).option(\"disabled\", true);\n    });\n\n    this.remainingWords.forEach((word) => {\n      word.removeEventListener('click', this.dragableWordClick);\n      Sortable.get(word.parentElement).option(\"disabled\", true); // Disable sorting on the word's container\n    });\n  }\n}\n", "/**!\n * Sortable 1.15.2\n * @author\tRubaXa   <trash@rubaxa.org>\n * @author\towenm    <owen23355@gmail.com>\n * @license MIT\n */\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n    if (enumerableOnly) {\n      symbols = symbols.filter(function (sym) {\n        return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n      });\n    }\n    keys.push.apply(keys, symbols);\n  }\n  return keys;\n}\nfunction _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i] != null ? arguments[i] : {};\n    if (i % 2) {\n      ownKeys(Object(source), true).forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    } else if (Object.getOwnPropertyDescriptors) {\n      Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n    } else {\n      ownKeys(Object(source)).forEach(function (key) {\n        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n      });\n    }\n  }\n  return target;\n}\nfunction _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function (obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function (obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n  return _typeof(obj);\n}\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n  return obj;\n}\nfunction _extends() {\n  _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n    return target;\n  };\n  return _extends.apply(this, arguments);\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n  if (source == null) return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key, i;\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    if (excluded.indexOf(key) >= 0) continue;\n    target[key] = source[key];\n  }\n  return target;\n}\nfunction _objectWithoutProperties(source, excluded) {\n  if (source == null) return {};\n  var target = _objectWithoutPropertiesLoose(source, excluded);\n  var key, i;\n  if (Object.getOwnPropertySymbols) {\n    var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n    for (i = 0; i < sourceSymbolKeys.length; i++) {\n      key = sourceSymbolKeys[i];\n      if (excluded.indexOf(key) >= 0) continue;\n      if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n      target[key] = source[key];\n    }\n  }\n  return target;\n}\nfunction _toConsumableArray(arr) {\n  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _arrayWithoutHoles(arr) {\n  if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction _iterableToArray(iter) {\n  if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n  if (!o) return;\n  if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n  var n = Object.prototype.toString.call(o).slice(8, -1);\n  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n  if (n === \"Map\" || n === \"Set\") return Array.from(o);\n  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n  for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n  return arr2;\n}\nfunction _nonIterableSpread() {\n  throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar version = \"1.15.2\";\n\nfunction userAgent(pattern) {\n  if (typeof window !== 'undefined' && window.navigator) {\n    return !! /*@__PURE__*/navigator.userAgent.match(pattern);\n  }\n}\nvar IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\nvar Edge = userAgent(/Edge/i);\nvar FireFox = userAgent(/firefox/i);\nvar Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);\nvar IOS = userAgent(/iP(ad|od|hone)/i);\nvar ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);\n\nvar captureMode = {\n  capture: false,\n  passive: false\n};\nfunction on(el, event, fn) {\n  el.addEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction off(el, event, fn) {\n  el.removeEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction matches( /**HTMLElement*/el, /**String*/selector) {\n  if (!selector) return;\n  selector[0] === '>' && (selector = selector.substring(1));\n  if (el) {\n    try {\n      if (el.matches) {\n        return el.matches(selector);\n      } else if (el.msMatchesSelector) {\n        return el.msMatchesSelector(selector);\n      } else if (el.webkitMatchesSelector) {\n        return el.webkitMatchesSelector(selector);\n      }\n    } catch (_) {\n      return false;\n    }\n  }\n  return false;\n}\nfunction getParentOrHost(el) {\n  return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode;\n}\nfunction closest( /**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) {\n  if (el) {\n    ctx = ctx || document;\n    do {\n      if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {\n        return el;\n      }\n      if (el === ctx) break;\n      /* jshint boss:true */\n    } while (el = getParentOrHost(el));\n  }\n  return null;\n}\nvar R_SPACE = /\\s+/g;\nfunction toggleClass(el, name, state) {\n  if (el && name) {\n    if (el.classList) {\n      el.classList[state ? 'add' : 'remove'](name);\n    } else {\n      var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');\n      el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');\n    }\n  }\n}\nfunction css(el, prop, val) {\n  var style = el && el.style;\n  if (style) {\n    if (val === void 0) {\n      if (document.defaultView && document.defaultView.getComputedStyle) {\n        val = document.defaultView.getComputedStyle(el, '');\n      } else if (el.currentStyle) {\n        val = el.currentStyle;\n      }\n      return prop === void 0 ? val : val[prop];\n    } else {\n      if (!(prop in style) && prop.indexOf('webkit') === -1) {\n        prop = '-webkit-' + prop;\n      }\n      style[prop] = val + (typeof val === 'string' ? '' : 'px');\n    }\n  }\n}\nfunction matrix(el, selfOnly) {\n  var appliedTransforms = '';\n  if (typeof el === 'string') {\n    appliedTransforms = el;\n  } else {\n    do {\n      var transform = css(el, 'transform');\n      if (transform && transform !== 'none') {\n        appliedTransforms = transform + ' ' + appliedTransforms;\n      }\n      /* jshint boss:true */\n    } while (!selfOnly && (el = el.parentNode));\n  }\n  var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n  /*jshint -W056 */\n  return matrixFn && new matrixFn(appliedTransforms);\n}\nfunction find(ctx, tagName, iterator) {\n  if (ctx) {\n    var list = ctx.getElementsByTagName(tagName),\n      i = 0,\n      n = list.length;\n    if (iterator) {\n      for (; i < n; i++) {\n        iterator(list[i], i);\n      }\n    }\n    return list;\n  }\n  return [];\n}\nfunction getWindowScrollingElement() {\n  var scrollingElement = document.scrollingElement;\n  if (scrollingElement) {\n    return scrollingElement;\n  } else {\n    return document.documentElement;\n  }\n}\n\n/**\r\n * Returns the \"bounding client rect\" of given element\r\n * @param  {HTMLElement} el                       The element whose boundingClientRect is wanted\r\n * @param  {[Boolean]} relativeToContainingBlock  Whether the rect should be relative to the containing block of (including) the container\r\n * @param  {[Boolean]} relativeToNonStaticParent  Whether the rect should be relative to the relative parent of (including) the contaienr\r\n * @param  {[Boolean]} undoScale                  Whether the container's scale() should be undone\r\n * @param  {[HTMLElement]} container              The parent the element will be placed in\r\n * @return {Object}                               The boundingClientRect of el, with specified adjustments\r\n */\nfunction getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n  if (!el.getBoundingClientRect && el !== window) return;\n  var elRect, top, left, bottom, right, height, width;\n  if (el !== window && el.parentNode && el !== getWindowScrollingElement()) {\n    elRect = el.getBoundingClientRect();\n    top = elRect.top;\n    left = elRect.left;\n    bottom = elRect.bottom;\n    right = elRect.right;\n    height = elRect.height;\n    width = elRect.width;\n  } else {\n    top = 0;\n    left = 0;\n    bottom = window.innerHeight;\n    right = window.innerWidth;\n    height = window.innerHeight;\n    width = window.innerWidth;\n  }\n  if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n    // Adjust for translate()\n    container = container || el.parentNode;\n\n    // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n    // Not needed on <= IE11\n    if (!IE11OrLess) {\n      do {\n        if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) {\n          var containerRect = container.getBoundingClientRect();\n\n          // Set relative to edges of padding box of container\n          top -= containerRect.top + parseInt(css(container, 'border-top-width'));\n          left -= containerRect.left + parseInt(css(container, 'border-left-width'));\n          bottom = top + elRect.height;\n          right = left + elRect.width;\n          break;\n        }\n        /* jshint boss:true */\n      } while (container = container.parentNode);\n    }\n  }\n  if (undoScale && el !== window) {\n    // Adjust for scale()\n    var elMatrix = matrix(container || el),\n      scaleX = elMatrix && elMatrix.a,\n      scaleY = elMatrix && elMatrix.d;\n    if (elMatrix) {\n      top /= scaleY;\n      left /= scaleX;\n      width /= scaleX;\n      height /= scaleY;\n      bottom = top + height;\n      right = left + width;\n    }\n  }\n  return {\n    top: top,\n    left: left,\n    bottom: bottom,\n    right: right,\n    width: width,\n    height: height\n  };\n}\n\n/**\r\n * Checks if a side of an element is scrolled past a side of its parents\r\n * @param  {HTMLElement}  el           The element who's side being scrolled out of view is in question\r\n * @param  {String}       elSide       Side of the element in question ('top', 'left', 'right', 'bottom')\r\n * @param  {String}       parentSide   Side of the parent in question ('top', 'left', 'right', 'bottom')\r\n * @return {HTMLElement}               The parent scroll element that the el's side is scrolled past, or null if there is no such element\r\n */\nfunction isScrolledPast(el, elSide, parentSide) {\n  var parent = getParentAutoScrollElement(el, true),\n    elSideVal = getRect(el)[elSide];\n\n  /* jshint boss:true */\n  while (parent) {\n    var parentSideVal = getRect(parent)[parentSide],\n      visible = void 0;\n    if (parentSide === 'top' || parentSide === 'left') {\n      visible = elSideVal >= parentSideVal;\n    } else {\n      visible = elSideVal <= parentSideVal;\n    }\n    if (!visible) return parent;\n    if (parent === getWindowScrollingElement()) break;\n    parent = getParentAutoScrollElement(parent, false);\n  }\n  return false;\n}\n\n/**\r\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\r\n * and non-draggable elements\r\n * @param  {HTMLElement} el       The parent element\r\n * @param  {Number} childNum      The index of the child\r\n * @param  {Object} options       Parent Sortable's options\r\n * @return {HTMLElement}          The child at index childNum, or null if not found\r\n */\nfunction getChild(el, childNum, options, includeDragEl) {\n  var currentChild = 0,\n    i = 0,\n    children = el.children;\n  while (i < children.length) {\n    if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) {\n      if (currentChild === childNum) {\n        return children[i];\n      }\n      currentChild++;\n    }\n    i++;\n  }\n  return null;\n}\n\n/**\r\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\r\n * @param  {HTMLElement} el       Parent element\r\n * @param  {selector} selector    Any other elements that should be ignored\r\n * @return {HTMLElement}          The last child, ignoring ghostEl\r\n */\nfunction lastChild(el, selector) {\n  var last = el.lastElementChild;\n  while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) {\n    last = last.previousElementSibling;\n  }\n  return last || null;\n}\n\n/**\r\n * Returns the index of an element within its parent for a selected set of\r\n * elements\r\n * @param  {HTMLElement} el\r\n * @param  {selector} selector\r\n * @return {number}\r\n */\nfunction index(el, selector) {\n  var index = 0;\n  if (!el || !el.parentNode) {\n    return -1;\n  }\n\n  /* jshint boss:true */\n  while (el = el.previousElementSibling) {\n    if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) {\n      index++;\n    }\n  }\n  return index;\n}\n\n/**\r\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\r\n * The value is returned in real pixels.\r\n * @param  {HTMLElement} el\r\n * @return {Array}             Offsets in the format of [left, top]\r\n */\nfunction getRelativeScrollOffset(el) {\n  var offsetLeft = 0,\n    offsetTop = 0,\n    winScroller = getWindowScrollingElement();\n  if (el) {\n    do {\n      var elMatrix = matrix(el),\n        scaleX = elMatrix.a,\n        scaleY = elMatrix.d;\n      offsetLeft += el.scrollLeft * scaleX;\n      offsetTop += el.scrollTop * scaleY;\n    } while (el !== winScroller && (el = el.parentNode));\n  }\n  return [offsetLeft, offsetTop];\n}\n\n/**\r\n * Returns the index of the object within the given array\r\n * @param  {Array} arr   Array that may or may not hold the object\r\n * @param  {Object} obj  An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\r\n * @return {Number}      The index of the object in the array, or -1\r\n */\nfunction indexOfObject(arr, obj) {\n  for (var i in arr) {\n    if (!arr.hasOwnProperty(i)) continue;\n    for (var key in obj) {\n      if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n    }\n  }\n  return -1;\n}\nfunction getParentAutoScrollElement(el, includeSelf) {\n  // skip to window\n  if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();\n  var elem = el;\n  var gotSelf = false;\n  do {\n    // we don't need to get elem css if it isn't even overflowing in the first place (performance)\n    if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n      var elemCSS = css(elem);\n      if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) {\n        if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();\n        if (gotSelf || includeSelf) return elem;\n        gotSelf = true;\n      }\n    }\n    /* jshint boss:true */\n  } while (elem = elem.parentNode);\n  return getWindowScrollingElement();\n}\nfunction extend(dst, src) {\n  if (dst && src) {\n    for (var key in src) {\n      if (src.hasOwnProperty(key)) {\n        dst[key] = src[key];\n      }\n    }\n  }\n  return dst;\n}\nfunction isRectEqual(rect1, rect2) {\n  return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n}\nvar _throttleTimeout;\nfunction throttle(callback, ms) {\n  return function () {\n    if (!_throttleTimeout) {\n      var args = arguments,\n        _this = this;\n      if (args.length === 1) {\n        callback.call(_this, args[0]);\n      } else {\n        callback.apply(_this, args);\n      }\n      _throttleTimeout = setTimeout(function () {\n        _throttleTimeout = void 0;\n      }, ms);\n    }\n  };\n}\nfunction cancelThrottle() {\n  clearTimeout(_throttleTimeout);\n  _throttleTimeout = void 0;\n}\nfunction scrollBy(el, x, y) {\n  el.scrollLeft += x;\n  el.scrollTop += y;\n}\nfunction clone(el) {\n  var Polymer = window.Polymer;\n  var $ = window.jQuery || window.Zepto;\n  if (Polymer && Polymer.dom) {\n    return Polymer.dom(el).cloneNode(true);\n  } else if ($) {\n    return $(el).clone(true)[0];\n  } else {\n    return el.cloneNode(true);\n  }\n}\nfunction setRect(el, rect) {\n  css(el, 'position', 'absolute');\n  css(el, 'top', rect.top);\n  css(el, 'left', rect.left);\n  css(el, 'width', rect.width);\n  css(el, 'height', rect.height);\n}\nfunction unsetRect(el) {\n  css(el, 'position', '');\n  css(el, 'top', '');\n  css(el, 'left', '');\n  css(el, 'width', '');\n  css(el, 'height', '');\n}\nfunction getChildContainingRectFromElement(container, options, ghostEl) {\n  var rect = {};\n  Array.from(container.children).forEach(function (child) {\n    var _rect$left, _rect$top, _rect$right, _rect$bottom;\n    if (!closest(child, options.draggable, container, false) || child.animated || child === ghostEl) return;\n    var childRect = getRect(child);\n    rect.left = Math.min((_rect$left = rect.left) !== null && _rect$left !== void 0 ? _rect$left : Infinity, childRect.left);\n    rect.top = Math.min((_rect$top = rect.top) !== null && _rect$top !== void 0 ? _rect$top : Infinity, childRect.top);\n    rect.right = Math.max((_rect$right = rect.right) !== null && _rect$right !== void 0 ? _rect$right : -Infinity, childRect.right);\n    rect.bottom = Math.max((_rect$bottom = rect.bottom) !== null && _rect$bottom !== void 0 ? _rect$bottom : -Infinity, childRect.bottom);\n  });\n  rect.width = rect.right - rect.left;\n  rect.height = rect.bottom - rect.top;\n  rect.x = rect.left;\n  rect.y = rect.top;\n  return rect;\n}\nvar expando = 'Sortable' + new Date().getTime();\n\nfunction AnimationStateManager() {\n  var animationStates = [],\n    animationCallbackId;\n  return {\n    captureAnimationState: function captureAnimationState() {\n      animationStates = [];\n      if (!this.options.animation) return;\n      var children = [].slice.call(this.el.children);\n      children.forEach(function (child) {\n        if (css(child, 'display') === 'none' || child === Sortable.ghost) return;\n        animationStates.push({\n          target: child,\n          rect: getRect(child)\n        });\n        var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect);\n\n        // If animating: compensate for current animation\n        if (child.thisAnimationDuration) {\n          var childMatrix = matrix(child, true);\n          if (childMatrix) {\n            fromRect.top -= childMatrix.f;\n            fromRect.left -= childMatrix.e;\n          }\n        }\n        child.fromRect = fromRect;\n      });\n    },\n    addAnimationState: function addAnimationState(state) {\n      animationStates.push(state);\n    },\n    removeAnimationState: function removeAnimationState(target) {\n      animationStates.splice(indexOfObject(animationStates, {\n        target: target\n      }), 1);\n    },\n    animateAll: function animateAll(callback) {\n      var _this = this;\n      if (!this.options.animation) {\n        clearTimeout(animationCallbackId);\n        if (typeof callback === 'function') callback();\n        return;\n      }\n      var animating = false,\n        animationTime = 0;\n      animationStates.forEach(function (state) {\n        var time = 0,\n          target = state.target,\n          fromRect = target.fromRect,\n          toRect = getRect(target),\n          prevFromRect = target.prevFromRect,\n          prevToRect = target.prevToRect,\n          animatingRect = state.rect,\n          targetMatrix = matrix(target, true);\n        if (targetMatrix) {\n          // Compensate for current animation\n          toRect.top -= targetMatrix.f;\n          toRect.left -= targetMatrix.e;\n        }\n        target.toRect = toRect;\n        if (target.thisAnimationDuration) {\n          // Could also check if animatingRect is between fromRect and toRect\n          if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) &&\n          // Make sure animatingRect is on line between toRect & fromRect\n          (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {\n            // If returning to same place as started from animation and on same axis\n            time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n          }\n        }\n\n        // if fromRect != toRect: animate\n        if (!isRectEqual(toRect, fromRect)) {\n          target.prevFromRect = fromRect;\n          target.prevToRect = toRect;\n          if (!time) {\n            time = _this.options.animation;\n          }\n          _this.animate(target, animatingRect, toRect, time);\n        }\n        if (time) {\n          animating = true;\n          animationTime = Math.max(animationTime, time);\n          clearTimeout(target.animationResetTimer);\n          target.animationResetTimer = setTimeout(function () {\n            target.animationTime = 0;\n            target.prevFromRect = null;\n            target.fromRect = null;\n            target.prevToRect = null;\n            target.thisAnimationDuration = null;\n          }, time);\n          target.thisAnimationDuration = time;\n        }\n      });\n      clearTimeout(animationCallbackId);\n      if (!animating) {\n        if (typeof callback === 'function') callback();\n      } else {\n        animationCallbackId = setTimeout(function () {\n          if (typeof callback === 'function') callback();\n        }, animationTime);\n      }\n      animationStates = [];\n    },\n    animate: function animate(target, currentRect, toRect, duration) {\n      if (duration) {\n        css(target, 'transition', '');\n        css(target, 'transform', '');\n        var elMatrix = matrix(this.el),\n          scaleX = elMatrix && elMatrix.a,\n          scaleY = elMatrix && elMatrix.d,\n          translateX = (currentRect.left - toRect.left) / (scaleX || 1),\n          translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n        target.animatingX = !!translateX;\n        target.animatingY = !!translateY;\n        css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');\n        this.forRepaintDummy = repaint(target); // repaint\n\n        css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));\n        css(target, 'transform', 'translate3d(0,0,0)');\n        typeof target.animated === 'number' && clearTimeout(target.animated);\n        target.animated = setTimeout(function () {\n          css(target, 'transition', '');\n          css(target, 'transform', '');\n          target.animated = false;\n          target.animatingX = false;\n          target.animatingY = false;\n        }, duration);\n      }\n    }\n  };\n}\nfunction repaint(target) {\n  return target.offsetWidth;\n}\nfunction calculateRealTime(animatingRect, fromRect, toRect, options) {\n  return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n}\n\nvar plugins = [];\nvar defaults = {\n  initializeByDefault: true\n};\nvar PluginManager = {\n  mount: function mount(plugin) {\n    // Set default static properties\n    for (var option in defaults) {\n      if (defaults.hasOwnProperty(option) && !(option in plugin)) {\n        plugin[option] = defaults[option];\n      }\n    }\n    plugins.forEach(function (p) {\n      if (p.pluginName === plugin.pluginName) {\n        throw \"Sortable: Cannot mount plugin \".concat(plugin.pluginName, \" more than once\");\n      }\n    });\n    plugins.push(plugin);\n  },\n  pluginEvent: function pluginEvent(eventName, sortable, evt) {\n    var _this = this;\n    this.eventCanceled = false;\n    evt.cancel = function () {\n      _this.eventCanceled = true;\n    };\n    var eventNameGlobal = eventName + 'Global';\n    plugins.forEach(function (plugin) {\n      if (!sortable[plugin.pluginName]) return;\n      // Fire global events if it exists in this sortable\n      if (sortable[plugin.pluginName][eventNameGlobal]) {\n        sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({\n          sortable: sortable\n        }, evt));\n      }\n\n      // Only fire plugin event if plugin is enabled in this sortable,\n      // and plugin has event defined\n      if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {\n        sortable[plugin.pluginName][eventName](_objectSpread2({\n          sortable: sortable\n        }, evt));\n      }\n    });\n  },\n  initializePlugins: function initializePlugins(sortable, el, defaults, options) {\n    plugins.forEach(function (plugin) {\n      var pluginName = plugin.pluginName;\n      if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n      var initialized = new plugin(sortable, el, sortable.options);\n      initialized.sortable = sortable;\n      initialized.options = sortable.options;\n      sortable[pluginName] = initialized;\n\n      // Add default options from plugin\n      _extends(defaults, initialized.defaults);\n    });\n    for (var option in sortable.options) {\n      if (!sortable.options.hasOwnProperty(option)) continue;\n      var modified = this.modifyOption(sortable, option, sortable.options[option]);\n      if (typeof modified !== 'undefined') {\n        sortable.options[option] = modified;\n      }\n    }\n  },\n  getEventProperties: function getEventProperties(name, sortable) {\n    var eventProperties = {};\n    plugins.forEach(function (plugin) {\n      if (typeof plugin.eventProperties !== 'function') return;\n      _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n    });\n    return eventProperties;\n  },\n  modifyOption: function modifyOption(sortable, name, value) {\n    var modifiedValue;\n    plugins.forEach(function (plugin) {\n      // Plugin must exist on the Sortable\n      if (!sortable[plugin.pluginName]) return;\n\n      // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\n      if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') {\n        modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n      }\n    });\n    return modifiedValue;\n  }\n};\n\nfunction dispatchEvent(_ref) {\n  var sortable = _ref.sortable,\n    rootEl = _ref.rootEl,\n    name = _ref.name,\n    targetEl = _ref.targetEl,\n    cloneEl = _ref.cloneEl,\n    toEl = _ref.toEl,\n    fromEl = _ref.fromEl,\n    oldIndex = _ref.oldIndex,\n    newIndex = _ref.newIndex,\n    oldDraggableIndex = _ref.oldDraggableIndex,\n    newDraggableIndex = _ref.newDraggableIndex,\n    originalEvent = _ref.originalEvent,\n    putSortable = _ref.putSortable,\n    extraEventProperties = _ref.extraEventProperties;\n  sortable = sortable || rootEl && rootEl[expando];\n  if (!sortable) return;\n  var evt,\n    options = sortable.options,\n    onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1);\n  // Support for new CustomEvent feature\n  if (window.CustomEvent && !IE11OrLess && !Edge) {\n    evt = new CustomEvent(name, {\n      bubbles: true,\n      cancelable: true\n    });\n  } else {\n    evt = document.createEvent('Event');\n    evt.initEvent(name, true, true);\n  }\n  evt.to = toEl || rootEl;\n  evt.from = fromEl || rootEl;\n  evt.item = targetEl || rootEl;\n  evt.clone = cloneEl;\n  evt.oldIndex = oldIndex;\n  evt.newIndex = newIndex;\n  evt.oldDraggableIndex = oldDraggableIndex;\n  evt.newDraggableIndex = newDraggableIndex;\n  evt.originalEvent = originalEvent;\n  evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n  var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));\n  for (var option in allEventProperties) {\n    evt[option] = allEventProperties[option];\n  }\n  if (rootEl) {\n    rootEl.dispatchEvent(evt);\n  }\n  if (options[onName]) {\n    options[onName].call(sortable, evt);\n  }\n}\n\nvar _excluded = [\"evt\"];\nvar pluginEvent = function pluginEvent(eventName, sortable) {\n  var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n    originalEvent = _ref.evt,\n    data = _objectWithoutProperties(_ref, _excluded);\n  PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({\n    dragEl: dragEl,\n    parentEl: parentEl,\n    ghostEl: ghostEl,\n    rootEl: rootEl,\n    nextEl: nextEl,\n    lastDownEl: lastDownEl,\n    cloneEl: cloneEl,\n    cloneHidden: cloneHidden,\n    dragStarted: moved,\n    putSortable: putSortable,\n    activeSortable: Sortable.active,\n    originalEvent: originalEvent,\n    oldIndex: oldIndex,\n    oldDraggableIndex: oldDraggableIndex,\n    newIndex: newIndex,\n    newDraggableIndex: newDraggableIndex,\n    hideGhostForTarget: _hideGhostForTarget,\n    unhideGhostForTarget: _unhideGhostForTarget,\n    cloneNowHidden: function cloneNowHidden() {\n      cloneHidden = true;\n    },\n    cloneNowShown: function cloneNowShown() {\n      cloneHidden = false;\n    },\n    dispatchSortableEvent: function dispatchSortableEvent(name) {\n      _dispatchEvent({\n        sortable: sortable,\n        name: name,\n        originalEvent: originalEvent\n      });\n    }\n  }, data));\n};\nfunction _dispatchEvent(info) {\n  dispatchEvent(_objectSpread2({\n    putSortable: putSortable,\n    cloneEl: cloneEl,\n    targetEl: dragEl,\n    rootEl: rootEl,\n    oldIndex: oldIndex,\n    oldDraggableIndex: oldDraggableIndex,\n    newIndex: newIndex,\n    newDraggableIndex: newDraggableIndex\n  }, info));\n}\nvar dragEl,\n  parentEl,\n  ghostEl,\n  rootEl,\n  nextEl,\n  lastDownEl,\n  cloneEl,\n  cloneHidden,\n  oldIndex,\n  newIndex,\n  oldDraggableIndex,\n  newDraggableIndex,\n  activeGroup,\n  putSortable,\n  awaitingDragStarted = false,\n  ignoreNextClick = false,\n  sortables = [],\n  tapEvt,\n  touchEvt,\n  lastDx,\n  lastDy,\n  tapDistanceLeft,\n  tapDistanceTop,\n  moved,\n  lastTarget,\n  lastDirection,\n  pastFirstInvertThresh = false,\n  isCircumstantialInvert = false,\n  targetMoveDistance,\n  // For positioning ghost absolutely\n  ghostRelativeParent,\n  ghostRelativeParentInitialScroll = [],\n  // (left, top)\n\n  _silent = false,\n  savedInputChecked = [];\n\n/** @const */\nvar documentExists = typeof document !== 'undefined',\n  PositionGhostAbsolutely = IOS,\n  CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float',\n  // This will not pass for IE9, because IE9 DnD only works on anchors\n  supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'),\n  supportCssPointerEvents = function () {\n    if (!documentExists) return;\n    // false when <= IE11\n    if (IE11OrLess) {\n      return false;\n    }\n    var el = document.createElement('x');\n    el.style.cssText = 'pointer-events:auto';\n    return el.style.pointerEvents === 'auto';\n  }(),\n  _detectDirection = function _detectDirection(el, options) {\n    var elCSS = css(el),\n      elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth),\n      child1 = getChild(el, 0, options),\n      child2 = getChild(el, 1, options),\n      firstChildCSS = child1 && css(child1),\n      secondChildCSS = child2 && css(child2),\n      firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width,\n      secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;\n    if (elCSS.display === 'flex') {\n      return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal';\n    }\n    if (elCSS.display === 'grid') {\n      return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal';\n    }\n    if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== 'none') {\n      var touchingSideChild2 = firstChildCSS[\"float\"] === 'left' ? 'left' : 'right';\n      return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal';\n    }\n    return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal';\n  },\n  _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\n    var dragElS1Opp = vertical ? dragRect.left : dragRect.top,\n      dragElS2Opp = vertical ? dragRect.right : dragRect.bottom,\n      dragElOppLength = vertical ? dragRect.width : dragRect.height,\n      targetS1Opp = vertical ? targetRect.left : targetRect.top,\n      targetS2Opp = vertical ? targetRect.right : targetRect.bottom,\n      targetOppLength = vertical ? targetRect.width : targetRect.height;\n    return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n  },\n  /**\r\n   * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\r\n   * @param  {Number} x      X position\r\n   * @param  {Number} y      Y position\r\n   * @return {HTMLElement}   Element of the first found nearest Sortable\r\n   */\n  _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\n    var ret;\n    sortables.some(function (sortable) {\n      var threshold = sortable[expando].options.emptyInsertThreshold;\n      if (!threshold || lastChild(sortable)) return;\n      var rect = getRect(sortable),\n        insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,\n        insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n      if (insideHorizontally && insideVertically) {\n        return ret = sortable;\n      }\n    });\n    return ret;\n  },\n  _prepareGroup = function _prepareGroup(options) {\n    function toFn(value, pull) {\n      return function (to, from, dragEl, evt) {\n        var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n        if (value == null && (pull || sameGroup)) {\n          // Default pull value\n          // Default pull and put value if same group\n          return true;\n        } else if (value == null || value === false) {\n          return false;\n        } else if (pull && value === 'clone') {\n          return value;\n        } else if (typeof value === 'function') {\n          return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\n        } else {\n          var otherGroup = (pull ? to : from).options.group.name;\n          return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n        }\n      };\n    }\n    var group = {};\n    var originalGroup = options.group;\n    if (!originalGroup || _typeof(originalGroup) != 'object') {\n      originalGroup = {\n        name: originalGroup\n      };\n    }\n    group.name = originalGroup.name;\n    group.checkPull = toFn(originalGroup.pull, true);\n    group.checkPut = toFn(originalGroup.put);\n    group.revertClone = originalGroup.revertClone;\n    options.group = group;\n  },\n  _hideGhostForTarget = function _hideGhostForTarget() {\n    if (!supportCssPointerEvents && ghostEl) {\n      css(ghostEl, 'display', 'none');\n    }\n  },\n  _unhideGhostForTarget = function _unhideGhostForTarget() {\n    if (!supportCssPointerEvents && ghostEl) {\n      css(ghostEl, 'display', '');\n    }\n  };\n\n// #1184 fix - Prevent click event on fallback if dragged but item not changed position\nif (documentExists && !ChromeForAndroid) {\n  document.addEventListener('click', function (evt) {\n    if (ignoreNextClick) {\n      evt.preventDefault();\n      evt.stopPropagation && evt.stopPropagation();\n      evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n      ignoreNextClick = false;\n      return false;\n    }\n  }, true);\n}\nvar nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {\n  if (dragEl) {\n    evt = evt.touches ? evt.touches[0] : evt;\n    var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);\n    if (nearest) {\n      // Create imitation event\n      var event = {};\n      for (var i in evt) {\n        if (evt.hasOwnProperty(i)) {\n          event[i] = evt[i];\n        }\n      }\n      event.target = event.rootEl = nearest;\n      event.preventDefault = void 0;\n      event.stopPropagation = void 0;\n      nearest[expando]._onDragOver(event);\n    }\n  }\n};\nvar _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {\n  if (dragEl) {\n    dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n  }\n};\n\n/**\r\n * @class  Sortable\r\n * @param  {HTMLElement}  el\r\n * @param  {Object}       [options]\r\n */\nfunction Sortable(el, options) {\n  if (!(el && el.nodeType && el.nodeType === 1)) {\n    throw \"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(el));\n  }\n  this.el = el; // root element\n  this.options = options = _extends({}, options);\n\n  // Export instance\n  el[expando] = this;\n  var defaults = {\n    group: null,\n    sort: true,\n    disabled: false,\n    store: null,\n    handle: null,\n    draggable: /^[uo]l$/i.test(el.nodeName) ? '>li' : '>*',\n    swapThreshold: 1,\n    // percentage; 0 <= x <= 1\n    invertSwap: false,\n    // invert always\n    invertedSwapThreshold: null,\n    // will be set to same as swapThreshold if default\n    removeCloneOnHide: true,\n    direction: function direction() {\n      return _detectDirection(el, this.options);\n    },\n    ghostClass: 'sortable-ghost',\n    chosenClass: 'sortable-chosen',\n    dragClass: 'sortable-drag',\n    ignore: 'a, img',\n    filter: null,\n    preventOnFilter: true,\n    animation: 0,\n    easing: null,\n    setData: function setData(dataTransfer, dragEl) {\n      dataTransfer.setData('Text', dragEl.textContent);\n    },\n    dropBubble: false,\n    dragoverBubble: false,\n    dataIdAttr: 'data-id',\n    delay: 0,\n    delayOnTouchOnly: false,\n    touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n    forceFallback: false,\n    fallbackClass: 'sortable-fallback',\n    fallbackOnBody: false,\n    fallbackTolerance: 0,\n    fallbackOffset: {\n      x: 0,\n      y: 0\n    },\n    supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && !Safari,\n    emptyInsertThreshold: 5\n  };\n  PluginManager.initializePlugins(this, el, defaults);\n\n  // Set default options\n  for (var name in defaults) {\n    !(name in options) && (options[name] = defaults[name]);\n  }\n  _prepareGroup(options);\n\n  // Bind all private methods\n  for (var fn in this) {\n    if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n      this[fn] = this[fn].bind(this);\n    }\n  }\n\n  // Setup drag mode\n  this.nativeDraggable = options.forceFallback ? false : supportDraggable;\n  if (this.nativeDraggable) {\n    // Touch start threshold cannot be greater than the native dragstart threshold\n    this.options.touchStartThreshold = 1;\n  }\n\n  // Bind events\n  if (options.supportPointer) {\n    on(el, 'pointerdown', this._onTapStart);\n  } else {\n    on(el, 'mousedown', this._onTapStart);\n    on(el, 'touchstart', this._onTapStart);\n  }\n  if (this.nativeDraggable) {\n    on(el, 'dragover', this);\n    on(el, 'dragenter', this);\n  }\n  sortables.push(this.el);\n\n  // Restore sorting\n  options.store && options.store.get && this.sort(options.store.get(this) || []);\n\n  // Add animation state manager\n  _extends(this, AnimationStateManager());\n}\nSortable.prototype = /** @lends Sortable.prototype */{\n  constructor: Sortable,\n  _isOutsideThisEl: function _isOutsideThisEl(target) {\n    if (!this.el.contains(target) && target !== this.el) {\n      lastTarget = null;\n    }\n  },\n  _getDirection: function _getDirection(evt, target) {\n    return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;\n  },\n  _onTapStart: function _onTapStart( /** Event|TouchEvent */evt) {\n    if (!evt.cancelable) return;\n    var _this = this,\n      el = this.el,\n      options = this.options,\n      preventOnFilter = options.preventOnFilter,\n      type = evt.type,\n      touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt,\n      target = (touch || evt).target,\n      originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target,\n      filter = options.filter;\n    _saveInputCheckedState(el);\n\n    // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n    if (dragEl) {\n      return;\n    }\n    if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {\n      return; // only left button and enabled\n    }\n\n    // cancel dnd if original target is content editable\n    if (originalTarget.isContentEditable) {\n      return;\n    }\n\n    // Safari ignores further event handling after mousedown\n    if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') {\n      return;\n    }\n    target = closest(target, options.draggable, el, false);\n    if (target && target.animated) {\n      return;\n    }\n    if (lastDownEl === target) {\n      // Ignoring duplicate `down`\n      return;\n    }\n\n    // Get the index of the dragged element within its parent\n    oldIndex = index(target);\n    oldDraggableIndex = index(target, options.draggable);\n\n    // Check filter\n    if (typeof filter === 'function') {\n      if (filter.call(this, evt, target, this)) {\n        _dispatchEvent({\n          sortable: _this,\n          rootEl: originalTarget,\n          name: 'filter',\n          targetEl: target,\n          toEl: el,\n          fromEl: el\n        });\n        pluginEvent('filter', _this, {\n          evt: evt\n        });\n        preventOnFilter && evt.cancelable && evt.preventDefault();\n        return; // cancel dnd\n      }\n    } else if (filter) {\n      filter = filter.split(',').some(function (criteria) {\n        criteria = closest(originalTarget, criteria.trim(), el, false);\n        if (criteria) {\n          _dispatchEvent({\n            sortable: _this,\n            rootEl: criteria,\n            name: 'filter',\n            targetEl: target,\n            fromEl: el,\n            toEl: el\n          });\n          pluginEvent('filter', _this, {\n            evt: evt\n          });\n          return true;\n        }\n      });\n      if (filter) {\n        preventOnFilter && evt.cancelable && evt.preventDefault();\n        return; // cancel dnd\n      }\n    }\n    if (options.handle && !closest(originalTarget, options.handle, el, false)) {\n      return;\n    }\n\n    // Prepare `dragstart`\n    this._prepareDragStart(evt, touch, target);\n  },\n  _prepareDragStart: function _prepareDragStart( /** Event */evt, /** Touch */touch, /** HTMLElement */target) {\n    var _this = this,\n      el = _this.el,\n      options = _this.options,\n      ownerDocument = el.ownerDocument,\n      dragStartFn;\n    if (target && !dragEl && target.parentNode === el) {\n      var dragRect = getRect(target);\n      rootEl = el;\n      dragEl = target;\n      parentEl = dragEl.parentNode;\n      nextEl = dragEl.nextSibling;\n      lastDownEl = target;\n      activeGroup = options.group;\n      Sortable.dragged = dragEl;\n      tapEvt = {\n        target: dragEl,\n        clientX: (touch || evt).clientX,\n        clientY: (touch || evt).clientY\n      };\n      tapDistanceLeft = tapEvt.clientX - dragRect.left;\n      tapDistanceTop = tapEvt.clientY - dragRect.top;\n      this._lastX = (touch || evt).clientX;\n      this._lastY = (touch || evt).clientY;\n      dragEl.style['will-change'] = 'all';\n      dragStartFn = function dragStartFn() {\n        pluginEvent('delayEnded', _this, {\n          evt: evt\n        });\n        if (Sortable.eventCanceled) {\n          _this._onDrop();\n          return;\n        }\n        // Delayed drag has been triggered\n        // we can re-enable the events: touchmove/mousemove\n        _this._disableDelayedDragEvents();\n        if (!FireFox && _this.nativeDraggable) {\n          dragEl.draggable = true;\n        }\n\n        // Bind the events: dragstart/dragend\n        _this._triggerDragStart(evt, touch);\n\n        // Drag start event\n        _dispatchEvent({\n          sortable: _this,\n          name: 'choose',\n          originalEvent: evt\n        });\n\n        // Chosen item\n        toggleClass(dragEl, options.chosenClass, true);\n      };\n\n      // Disable \"draggable\"\n      options.ignore.split(',').forEach(function (criteria) {\n        find(dragEl, criteria.trim(), _disableDraggable);\n      });\n      on(ownerDocument, 'dragover', nearestEmptyInsertDetectEvent);\n      on(ownerDocument, 'mousemove', nearestEmptyInsertDetectEvent);\n      on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent);\n      on(ownerDocument, 'mouseup', _this._onDrop);\n      on(ownerDocument, 'touchend', _this._onDrop);\n      on(ownerDocument, 'touchcancel', _this._onDrop);\n\n      // Make dragEl draggable (must be before delay for FireFox)\n      if (FireFox && this.nativeDraggable) {\n        this.options.touchStartThreshold = 4;\n        dragEl.draggable = true;\n      }\n      pluginEvent('delayStart', this, {\n        evt: evt\n      });\n\n      // Delay is impossible for native DnD in Edge or IE\n      if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {\n        if (Sortable.eventCanceled) {\n          this._onDrop();\n          return;\n        }\n        // If the user moves the pointer or let go the click or touch\n        // before the delay has been reached:\n        // disable the delayed drag\n        on(ownerDocument, 'mouseup', _this._disableDelayedDrag);\n        on(ownerDocument, 'touchend', _this._disableDelayedDrag);\n        on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);\n        on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler);\n        on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler);\n        options.supportPointer && on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler);\n        _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n      } else {\n        dragStartFn();\n      }\n    }\n  },\n  _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler( /** TouchEvent|PointerEvent **/e) {\n    var touch = e.touches ? e.touches[0] : e;\n    if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {\n      this._disableDelayedDrag();\n    }\n  },\n  _disableDelayedDrag: function _disableDelayedDrag() {\n    dragEl && _disableDraggable(dragEl);\n    clearTimeout(this._dragStartTimer);\n    this._disableDelayedDragEvents();\n  },\n  _disableDelayedDragEvents: function _disableDelayedDragEvents() {\n    var ownerDocument = this.el.ownerDocument;\n    off(ownerDocument, 'mouseup', this._disableDelayedDrag);\n    off(ownerDocument, 'touchend', this._disableDelayedDrag);\n    off(ownerDocument, 'touchcancel', this._disableDelayedDrag);\n    off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler);\n    off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler);\n    off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler);\n  },\n  _triggerDragStart: function _triggerDragStart( /** Event */evt, /** Touch */touch) {\n    touch = touch || evt.pointerType == 'touch' && evt;\n    if (!this.nativeDraggable || touch) {\n      if (this.options.supportPointer) {\n        on(document, 'pointermove', this._onTouchMove);\n      } else if (touch) {\n        on(document, 'touchmove', this._onTouchMove);\n      } else {\n        on(document, 'mousemove', this._onTouchMove);\n      }\n    } else {\n      on(dragEl, 'dragend', this);\n      on(rootEl, 'dragstart', this._onDragStart);\n    }\n    try {\n      if (document.selection) {\n        // Timeout neccessary for IE9\n        _nextTick(function () {\n          document.selection.empty();\n        });\n      } else {\n        window.getSelection().removeAllRanges();\n      }\n    } catch (err) {}\n  },\n  _dragStarted: function _dragStarted(fallback, evt) {\n    awaitingDragStarted = false;\n    if (rootEl && dragEl) {\n      pluginEvent('dragStarted', this, {\n        evt: evt\n      });\n      if (this.nativeDraggable) {\n        on(document, 'dragover', _checkOutsideTargetEl);\n      }\n      var options = this.options;\n\n      // Apply effect\n      !fallback && toggleClass(dragEl, options.dragClass, false);\n      toggleClass(dragEl, options.ghostClass, true);\n      Sortable.active = this;\n      fallback && this._appendGhost();\n\n      // Drag start event\n      _dispatchEvent({\n        sortable: this,\n        name: 'start',\n        originalEvent: evt\n      });\n    } else {\n      this._nulling();\n    }\n  },\n  _emulateDragOver: function _emulateDragOver() {\n    if (touchEvt) {\n      this._lastX = touchEvt.clientX;\n      this._lastY = touchEvt.clientY;\n      _hideGhostForTarget();\n      var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n      var parent = target;\n      while (target && target.shadowRoot) {\n        target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n        if (target === parent) break;\n        parent = target;\n      }\n      dragEl.parentNode[expando]._isOutsideThisEl(target);\n      if (parent) {\n        do {\n          if (parent[expando]) {\n            var inserted = void 0;\n            inserted = parent[expando]._onDragOver({\n              clientX: touchEvt.clientX,\n              clientY: touchEvt.clientY,\n              target: target,\n              rootEl: parent\n            });\n            if (inserted && !this.options.dragoverBubble) {\n              break;\n            }\n          }\n          target = parent; // store last element\n        }\n        /* jshint boss:true */ while (parent = parent.parentNode);\n      }\n      _unhideGhostForTarget();\n    }\n  },\n  _onTouchMove: function _onTouchMove( /**TouchEvent*/evt) {\n    if (tapEvt) {\n      var options = this.options,\n        fallbackTolerance = options.fallbackTolerance,\n        fallbackOffset = options.fallbackOffset,\n        touch = evt.touches ? evt.touches[0] : evt,\n        ghostMatrix = ghostEl && matrix(ghostEl, true),\n        scaleX = ghostEl && ghostMatrix && ghostMatrix.a,\n        scaleY = ghostEl && ghostMatrix && ghostMatrix.d,\n        relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent),\n        dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1),\n        dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1);\n\n      // only set the status to dragging, when we are actually dragging\n      if (!Sortable.active && !awaitingDragStarted) {\n        if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {\n          return;\n        }\n        this._onDragStart(evt, true);\n      }\n      if (ghostEl) {\n        if (ghostMatrix) {\n          ghostMatrix.e += dx - (lastDx || 0);\n          ghostMatrix.f += dy - (lastDy || 0);\n        } else {\n          ghostMatrix = {\n            a: 1,\n            b: 0,\n            c: 0,\n            d: 1,\n            e: dx,\n            f: dy\n          };\n        }\n        var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\n        css(ghostEl, 'webkitTransform', cssMatrix);\n        css(ghostEl, 'mozTransform', cssMatrix);\n        css(ghostEl, 'msTransform', cssMatrix);\n        css(ghostEl, 'transform', cssMatrix);\n        lastDx = dx;\n        lastDy = dy;\n        touchEvt = touch;\n      }\n      evt.cancelable && evt.preventDefault();\n    }\n  },\n  _appendGhost: function _appendGhost() {\n    // Bug if using scale(): https://stackoverflow.com/questions/2637058\n    // Not being adjusted for\n    if (!ghostEl) {\n      var container = this.options.fallbackOnBody ? document.body : rootEl,\n        rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),\n        options = this.options;\n\n      // Position absolutely\n      if (PositionGhostAbsolutely) {\n        // Get relatively positioned parent\n        ghostRelativeParent = container;\n        while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) {\n          ghostRelativeParent = ghostRelativeParent.parentNode;\n        }\n        if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {\n          if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement();\n          rect.top += ghostRelativeParent.scrollTop;\n          rect.left += ghostRelativeParent.scrollLeft;\n        } else {\n          ghostRelativeParent = getWindowScrollingElement();\n        }\n        ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);\n      }\n      ghostEl = dragEl.cloneNode(true);\n      toggleClass(ghostEl, options.ghostClass, false);\n      toggleClass(ghostEl, options.fallbackClass, true);\n      toggleClass(ghostEl, options.dragClass, true);\n      css(ghostEl, 'transition', '');\n      css(ghostEl, 'transform', '');\n      css(ghostEl, 'box-sizing', 'border-box');\n      css(ghostEl, 'margin', 0);\n      css(ghostEl, 'top', rect.top);\n      css(ghostEl, 'left', rect.left);\n      css(ghostEl, 'width', rect.width);\n      css(ghostEl, 'height', rect.height);\n      css(ghostEl, 'opacity', '0.8');\n      css(ghostEl, 'position', PositionGhostAbsolutely ? 'absolute' : 'fixed');\n      css(ghostEl, 'zIndex', '100000');\n      css(ghostEl, 'pointerEvents', 'none');\n      Sortable.ghost = ghostEl;\n      container.appendChild(ghostEl);\n\n      // Set transform-origin\n      css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%');\n    }\n  },\n  _onDragStart: function _onDragStart( /**Event*/evt, /**boolean*/fallback) {\n    var _this = this;\n    var dataTransfer = evt.dataTransfer;\n    var options = _this.options;\n    pluginEvent('dragStart', this, {\n      evt: evt\n    });\n    if (Sortable.eventCanceled) {\n      this._onDrop();\n      return;\n    }\n    pluginEvent('setupClone', this);\n    if (!Sortable.eventCanceled) {\n      cloneEl = clone(dragEl);\n      cloneEl.removeAttribute(\"id\");\n      cloneEl.draggable = false;\n      cloneEl.style['will-change'] = '';\n      this._hideClone();\n      toggleClass(cloneEl, this.options.chosenClass, false);\n      Sortable.clone = cloneEl;\n    }\n\n    // #1143: IFrame support workaround\n    _this.cloneId = _nextTick(function () {\n      pluginEvent('clone', _this);\n      if (Sortable.eventCanceled) return;\n      if (!_this.options.removeCloneOnHide) {\n        rootEl.insertBefore(cloneEl, dragEl);\n      }\n      _this._hideClone();\n      _dispatchEvent({\n        sortable: _this,\n        name: 'clone'\n      });\n    });\n    !fallback && toggleClass(dragEl, options.dragClass, true);\n\n    // Set proper drop events\n    if (fallback) {\n      ignoreNextClick = true;\n      _this._loopId = setInterval(_this._emulateDragOver, 50);\n    } else {\n      // Undo what was set in _prepareDragStart before drag started\n      off(document, 'mouseup', _this._onDrop);\n      off(document, 'touchend', _this._onDrop);\n      off(document, 'touchcancel', _this._onDrop);\n      if (dataTransfer) {\n        dataTransfer.effectAllowed = 'move';\n        options.setData && options.setData.call(_this, dataTransfer, dragEl);\n      }\n      on(document, 'drop', _this);\n\n      // #1276 fix:\n      css(dragEl, 'transform', 'translateZ(0)');\n    }\n    awaitingDragStarted = true;\n    _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));\n    on(document, 'selectstart', _this);\n    moved = true;\n    if (Safari) {\n      css(document.body, 'user-select', 'none');\n    }\n  },\n  // Returns true - if no further action is needed (either inserted or another condition)\n  _onDragOver: function _onDragOver( /**Event*/evt) {\n    var el = this.el,\n      target = evt.target,\n      dragRect,\n      targetRect,\n      revert,\n      options = this.options,\n      group = options.group,\n      activeSortable = Sortable.active,\n      isOwner = activeGroup === group,\n      canSort = options.sort,\n      fromSortable = putSortable || activeSortable,\n      vertical,\n      _this = this,\n      completedFired = false;\n    if (_silent) return;\n    function dragOverEvent(name, extra) {\n      pluginEvent(name, _this, _objectSpread2({\n        evt: evt,\n        isOwner: isOwner,\n        axis: vertical ? 'vertical' : 'horizontal',\n        revert: revert,\n        dragRect: dragRect,\n        targetRect: targetRect,\n        canSort: canSort,\n        fromSortable: fromSortable,\n        target: target,\n        completed: completed,\n        onMove: function onMove(target, after) {\n          return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after);\n        },\n        changed: changed\n      }, extra));\n    }\n\n    // Capture animation state\n    function capture() {\n      dragOverEvent('dragOverAnimationCapture');\n      _this.captureAnimationState();\n      if (_this !== fromSortable) {\n        fromSortable.captureAnimationState();\n      }\n    }\n\n    // Return invocation when dragEl is inserted (or completed)\n    function completed(insertion) {\n      dragOverEvent('dragOverCompleted', {\n        insertion: insertion\n      });\n      if (insertion) {\n        // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n        if (isOwner) {\n          activeSortable._hideClone();\n        } else {\n          activeSortable._showClone(_this);\n        }\n        if (_this !== fromSortable) {\n          // Set ghost class to new sortable's ghost class\n          toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n          toggleClass(dragEl, options.ghostClass, true);\n        }\n        if (putSortable !== _this && _this !== Sortable.active) {\n          putSortable = _this;\n        } else if (_this === Sortable.active && putSortable) {\n          putSortable = null;\n        }\n\n        // Animation\n        if (fromSortable === _this) {\n          _this._ignoreWhileAnimating = target;\n        }\n        _this.animateAll(function () {\n          dragOverEvent('dragOverAnimationComplete');\n          _this._ignoreWhileAnimating = null;\n        });\n        if (_this !== fromSortable) {\n          fromSortable.animateAll();\n          fromSortable._ignoreWhileAnimating = null;\n        }\n      }\n\n      // Null lastTarget if it is not inside a previously swapped element\n      if (target === dragEl && !dragEl.animated || target === el && !target.animated) {\n        lastTarget = null;\n      }\n\n      // no bubbling and not fallback\n      if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n        dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n\n        // Do not detect for empty insert if already inserted\n        !insertion && nearestEmptyInsertDetectEvent(evt);\n      }\n      !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n      return completedFired = true;\n    }\n\n    // Call when dragEl has been inserted\n    function changed() {\n      newIndex = index(dragEl);\n      newDraggableIndex = index(dragEl, options.draggable);\n      _dispatchEvent({\n        sortable: _this,\n        name: 'change',\n        toEl: el,\n        newIndex: newIndex,\n        newDraggableIndex: newDraggableIndex,\n        originalEvent: evt\n      });\n    }\n    if (evt.preventDefault !== void 0) {\n      evt.cancelable && evt.preventDefault();\n    }\n    target = closest(target, options.draggable, el, true);\n    dragOverEvent('dragOver');\n    if (Sortable.eventCanceled) return completedFired;\n    if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {\n      return completed(false);\n    }\n    ignoreNextClick = false;\n    if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list\n    : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {\n      vertical = this._getDirection(evt, target) === 'vertical';\n      dragRect = getRect(dragEl);\n      dragOverEvent('dragOverValid');\n      if (Sortable.eventCanceled) return completedFired;\n      if (revert) {\n        parentEl = rootEl; // actualization\n        capture();\n        this._hideClone();\n        dragOverEvent('revert');\n        if (!Sortable.eventCanceled) {\n          if (nextEl) {\n            rootEl.insertBefore(dragEl, nextEl);\n          } else {\n            rootEl.appendChild(dragEl);\n          }\n        }\n        return completed(true);\n      }\n      var elLastChild = lastChild(el, options.draggable);\n      if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n        // Insert to end of list\n\n        // If already at end of list: Do not insert\n        if (elLastChild === dragEl) {\n          return completed(false);\n        }\n\n        // if there is a last element, it is the target\n        if (elLastChild && el === evt.target) {\n          target = elLastChild;\n        }\n        if (target) {\n          targetRect = getRect(target);\n        }\n        if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n          capture();\n          if (elLastChild && elLastChild.nextSibling) {\n            // the last draggable element is not the last node\n            el.insertBefore(dragEl, elLastChild.nextSibling);\n          } else {\n            el.appendChild(dragEl);\n          }\n          parentEl = el; // actualization\n\n          changed();\n          return completed(true);\n        }\n      } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {\n        // Insert to start of list\n        var firstChild = getChild(el, 0, options, true);\n        if (firstChild === dragEl) {\n          return completed(false);\n        }\n        target = firstChild;\n        targetRect = getRect(target);\n        if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {\n          capture();\n          el.insertBefore(dragEl, firstChild);\n          parentEl = el; // actualization\n\n          changed();\n          return completed(true);\n        }\n      } else if (target.parentNode === el) {\n        targetRect = getRect(target);\n        var direction = 0,\n          targetBeforeFirstSwap,\n          differentLevel = dragEl.parentNode !== el,\n          differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical),\n          side1 = vertical ? 'top' : 'left',\n          scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'),\n          scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n        if (lastTarget !== target) {\n          targetBeforeFirstSwap = targetRect[side1];\n          pastFirstInvertThresh = false;\n          isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n        }\n        direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);\n        var sibling;\n        if (direction !== 0) {\n          // Check if target is beside dragEl in respective direction (ignoring hidden elements)\n          var dragIndex = index(dragEl);\n          do {\n            dragIndex -= direction;\n            sibling = parentEl.children[dragIndex];\n          } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl));\n        }\n        // If dragEl is already beside target: Do not insert\n        if (direction === 0 || sibling === target) {\n          return completed(false);\n        }\n        lastTarget = target;\n        lastDirection = direction;\n        var nextSibling = target.nextElementSibling,\n          after = false;\n        after = direction === 1;\n        var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);\n        if (moveVector !== false) {\n          if (moveVector === 1 || moveVector === -1) {\n            after = moveVector === 1;\n          }\n          _silent = true;\n          setTimeout(_unsilent, 30);\n          capture();\n          if (after && !nextSibling) {\n            el.appendChild(dragEl);\n          } else {\n            target.parentNode.insertBefore(dragEl, after ? nextSibling : target);\n          }\n\n          // Undo chrome's scroll adjustment (has no effect on other browsers)\n          if (scrolledPastTop) {\n            scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n          }\n          parentEl = dragEl.parentNode; // actualization\n\n          // must be done before animation\n          if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {\n            targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);\n          }\n          changed();\n          return completed(true);\n        }\n      }\n      if (el.contains(dragEl)) {\n        return completed(false);\n      }\n    }\n    return false;\n  },\n  _ignoreWhileAnimating: null,\n  _offMoveEvents: function _offMoveEvents() {\n    off(document, 'mousemove', this._onTouchMove);\n    off(document, 'touchmove', this._onTouchMove);\n    off(document, 'pointermove', this._onTouchMove);\n    off(document, 'dragover', nearestEmptyInsertDetectEvent);\n    off(document, 'mousemove', nearestEmptyInsertDetectEvent);\n    off(document, 'touchmove', nearestEmptyInsertDetectEvent);\n  },\n  _offUpEvents: function _offUpEvents() {\n    var ownerDocument = this.el.ownerDocument;\n    off(ownerDocument, 'mouseup', this._onDrop);\n    off(ownerDocument, 'touchend', this._onDrop);\n    off(ownerDocument, 'pointerup', this._onDrop);\n    off(ownerDocument, 'touchcancel', this._onDrop);\n    off(document, 'selectstart', this);\n  },\n  _onDrop: function _onDrop( /**Event*/evt) {\n    var el = this.el,\n      options = this.options;\n\n    // Get the index of the dragged element within its parent\n    newIndex = index(dragEl);\n    newDraggableIndex = index(dragEl, options.draggable);\n    pluginEvent('drop', this, {\n      evt: evt\n    });\n    parentEl = dragEl && dragEl.parentNode;\n\n    // Get again after plugin event\n    newIndex = index(dragEl);\n    newDraggableIndex = index(dragEl, options.draggable);\n    if (Sortable.eventCanceled) {\n      this._nulling();\n      return;\n    }\n    awaitingDragStarted = false;\n    isCircumstantialInvert = false;\n    pastFirstInvertThresh = false;\n    clearInterval(this._loopId);\n    clearTimeout(this._dragStartTimer);\n    _cancelNextTick(this.cloneId);\n    _cancelNextTick(this._dragStartId);\n\n    // Unbind events\n    if (this.nativeDraggable) {\n      off(document, 'drop', this);\n      off(el, 'dragstart', this._onDragStart);\n    }\n    this._offMoveEvents();\n    this._offUpEvents();\n    if (Safari) {\n      css(document.body, 'user-select', '');\n    }\n    css(dragEl, 'transform', '');\n    if (evt) {\n      if (moved) {\n        evt.cancelable && evt.preventDefault();\n        !options.dropBubble && evt.stopPropagation();\n      }\n      ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);\n      if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n        // Remove clone(s)\n        cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);\n      }\n      if (dragEl) {\n        if (this.nativeDraggable) {\n          off(dragEl, 'dragend', this);\n        }\n        _disableDraggable(dragEl);\n        dragEl.style['will-change'] = '';\n\n        // Remove classes\n        // ghostClass is added in dragStarted\n        if (moved && !awaitingDragStarted) {\n          toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);\n        }\n        toggleClass(dragEl, this.options.chosenClass, false);\n\n        // Drag stop event\n        _dispatchEvent({\n          sortable: this,\n          name: 'unchoose',\n          toEl: parentEl,\n          newIndex: null,\n          newDraggableIndex: null,\n          originalEvent: evt\n        });\n        if (rootEl !== parentEl) {\n          if (newIndex >= 0) {\n            // Add event\n            _dispatchEvent({\n              rootEl: parentEl,\n              name: 'add',\n              toEl: parentEl,\n              fromEl: rootEl,\n              originalEvent: evt\n            });\n\n            // Remove event\n            _dispatchEvent({\n              sortable: this,\n              name: 'remove',\n              toEl: parentEl,\n              originalEvent: evt\n            });\n\n            // drag from one list and drop into another\n            _dispatchEvent({\n              rootEl: parentEl,\n              name: 'sort',\n              toEl: parentEl,\n              fromEl: rootEl,\n              originalEvent: evt\n            });\n            _dispatchEvent({\n              sortable: this,\n              name: 'sort',\n              toEl: parentEl,\n              originalEvent: evt\n            });\n          }\n          putSortable && putSortable.save();\n        } else {\n          if (newIndex !== oldIndex) {\n            if (newIndex >= 0) {\n              // drag & drop within the same list\n              _dispatchEvent({\n                sortable: this,\n                name: 'update',\n                toEl: parentEl,\n                originalEvent: evt\n              });\n              _dispatchEvent({\n                sortable: this,\n                name: 'sort',\n                toEl: parentEl,\n                originalEvent: evt\n              });\n            }\n          }\n        }\n        if (Sortable.active) {\n          /* jshint eqnull:true */\n          if (newIndex == null || newIndex === -1) {\n            newIndex = oldIndex;\n            newDraggableIndex = oldDraggableIndex;\n          }\n          _dispatchEvent({\n            sortable: this,\n            name: 'end',\n            toEl: parentEl,\n            originalEvent: evt\n          });\n\n          // Save sorting\n          this.save();\n        }\n      }\n    }\n    this._nulling();\n  },\n  _nulling: function _nulling() {\n    pluginEvent('nulling', this);\n    rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;\n    savedInputChecked.forEach(function (el) {\n      el.checked = true;\n    });\n    savedInputChecked.length = lastDx = lastDy = 0;\n  },\n  handleEvent: function handleEvent( /**Event*/evt) {\n    switch (evt.type) {\n      case 'drop':\n      case 'dragend':\n        this._onDrop(evt);\n        break;\n      case 'dragenter':\n      case 'dragover':\n        if (dragEl) {\n          this._onDragOver(evt);\n          _globalDragOver(evt);\n        }\n        break;\n      case 'selectstart':\n        evt.preventDefault();\n        break;\n    }\n  },\n  /**\r\n   * Serializes the item into an array of string.\r\n   * @returns {String[]}\r\n   */\n  toArray: function toArray() {\n    var order = [],\n      el,\n      children = this.el.children,\n      i = 0,\n      n = children.length,\n      options = this.options;\n    for (; i < n; i++) {\n      el = children[i];\n      if (closest(el, options.draggable, this.el, false)) {\n        order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));\n      }\n    }\n    return order;\n  },\n  /**\r\n   * Sorts the elements according to the array.\r\n   * @param  {String[]}  order  order of the items\r\n   */\n  sort: function sort(order, useAnimation) {\n    var items = {},\n      rootEl = this.el;\n    this.toArray().forEach(function (id, i) {\n      var el = rootEl.children[i];\n      if (closest(el, this.options.draggable, rootEl, false)) {\n        items[id] = el;\n      }\n    }, this);\n    useAnimation && this.captureAnimationState();\n    order.forEach(function (id) {\n      if (items[id]) {\n        rootEl.removeChild(items[id]);\n        rootEl.appendChild(items[id]);\n      }\n    });\n    useAnimation && this.animateAll();\n  },\n  /**\r\n   * Save the current sorting\r\n   */\n  save: function save() {\n    var store = this.options.store;\n    store && store.set && store.set(this);\n  },\n  /**\r\n   * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\r\n   * @param   {HTMLElement}  el\r\n   * @param   {String}       [selector]  default: `options.draggable`\r\n   * @returns {HTMLElement|null}\r\n   */\n  closest: function closest$1(el, selector) {\n    return closest(el, selector || this.options.draggable, this.el, false);\n  },\n  /**\r\n   * Set/get option\r\n   * @param   {string} name\r\n   * @param   {*}      [value]\r\n   * @returns {*}\r\n   */\n  option: function option(name, value) {\n    var options = this.options;\n    if (value === void 0) {\n      return options[name];\n    } else {\n      var modifiedValue = PluginManager.modifyOption(this, name, value);\n      if (typeof modifiedValue !== 'undefined') {\n        options[name] = modifiedValue;\n      } else {\n        options[name] = value;\n      }\n      if (name === 'group') {\n        _prepareGroup(options);\n      }\n    }\n  },\n  /**\r\n   * Destroy\r\n   */\n  destroy: function destroy() {\n    pluginEvent('destroy', this);\n    var el = this.el;\n    el[expando] = null;\n    off(el, 'mousedown', this._onTapStart);\n    off(el, 'touchstart', this._onTapStart);\n    off(el, 'pointerdown', this._onTapStart);\n    if (this.nativeDraggable) {\n      off(el, 'dragover', this);\n      off(el, 'dragenter', this);\n    }\n    // Remove draggable attributes\n    Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {\n      el.removeAttribute('draggable');\n    });\n    this._onDrop();\n    this._disableDelayedDragEvents();\n    sortables.splice(sortables.indexOf(this.el), 1);\n    this.el = el = null;\n  },\n  _hideClone: function _hideClone() {\n    if (!cloneHidden) {\n      pluginEvent('hideClone', this);\n      if (Sortable.eventCanceled) return;\n      css(cloneEl, 'display', 'none');\n      if (this.options.removeCloneOnHide && cloneEl.parentNode) {\n        cloneEl.parentNode.removeChild(cloneEl);\n      }\n      cloneHidden = true;\n    }\n  },\n  _showClone: function _showClone(putSortable) {\n    if (putSortable.lastPutMode !== 'clone') {\n      this._hideClone();\n      return;\n    }\n    if (cloneHidden) {\n      pluginEvent('showClone', this);\n      if (Sortable.eventCanceled) return;\n\n      // show clone at dragEl or original position\n      if (dragEl.parentNode == rootEl && !this.options.group.revertClone) {\n        rootEl.insertBefore(cloneEl, dragEl);\n      } else if (nextEl) {\n        rootEl.insertBefore(cloneEl, nextEl);\n      } else {\n        rootEl.appendChild(cloneEl);\n      }\n      if (this.options.group.revertClone) {\n        this.animate(dragEl, cloneEl);\n      }\n      css(cloneEl, 'display', '');\n      cloneHidden = false;\n    }\n  }\n};\nfunction _globalDragOver( /**Event*/evt) {\n  if (evt.dataTransfer) {\n    evt.dataTransfer.dropEffect = 'move';\n  }\n  evt.cancelable && evt.preventDefault();\n}\nfunction _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n  var evt,\n    sortable = fromEl[expando],\n    onMoveFn = sortable.options.onMove,\n    retVal;\n  // Support for new CustomEvent feature\n  if (window.CustomEvent && !IE11OrLess && !Edge) {\n    evt = new CustomEvent('move', {\n      bubbles: true,\n      cancelable: true\n    });\n  } else {\n    evt = document.createEvent('Event');\n    evt.initEvent('move', true, true);\n  }\n  evt.to = toEl;\n  evt.from = fromEl;\n  evt.dragged = dragEl;\n  evt.draggedRect = dragRect;\n  evt.related = targetEl || toEl;\n  evt.relatedRect = targetRect || getRect(toEl);\n  evt.willInsertAfter = willInsertAfter;\n  evt.originalEvent = originalEvent;\n  fromEl.dispatchEvent(evt);\n  if (onMoveFn) {\n    retVal = onMoveFn.call(sortable, evt, originalEvent);\n  }\n  return retVal;\n}\nfunction _disableDraggable(el) {\n  el.draggable = false;\n}\nfunction _unsilent() {\n  _silent = false;\n}\nfunction _ghostIsFirst(evt, vertical, sortable) {\n  var firstElRect = getRect(getChild(sortable.el, 0, sortable.options, true));\n  var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n  var spacer = 10;\n  return vertical ? evt.clientX < childContainingRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < childContainingRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left;\n}\nfunction _ghostIsLast(evt, vertical, sortable) {\n  var lastElRect = getRect(lastChild(sortable.el, sortable.options.draggable));\n  var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n  var spacer = 10;\n  return vertical ? evt.clientX > childContainingRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > childContainingRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top;\n}\nfunction _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n  var mouseOnAxis = vertical ? evt.clientY : evt.clientX,\n    targetLength = vertical ? targetRect.height : targetRect.width,\n    targetS1 = vertical ? targetRect.top : targetRect.left,\n    targetS2 = vertical ? targetRect.bottom : targetRect.right,\n    invert = false;\n  if (!invertSwap) {\n    // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n    if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {\n      // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n      // check if past first invert threshold on side opposite of lastDirection\n      if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {\n        // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n        pastFirstInvertThresh = true;\n      }\n      if (!pastFirstInvertThresh) {\n        // dragEl shadow (target move distance shadow)\n        if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow\n        : mouseOnAxis > targetS2 - targetMoveDistance) {\n          return -lastDirection;\n        }\n      } else {\n        invert = true;\n      }\n    } else {\n      // Regular\n      if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {\n        return _getInsertDirection(target);\n      }\n    }\n  }\n  invert = invert || invertSwap;\n  if (invert) {\n    // Invert of regular\n    if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {\n      return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n    }\n  }\n  return 0;\n}\n\n/**\r\n * Gets the direction dragEl must be swapped relative to target in order to make it\r\n * seem that dragEl has been \"inserted\" into that element's position\r\n * @param  {HTMLElement} target       The target whose position dragEl is being inserted at\r\n * @return {Number}                   Direction dragEl must be swapped\r\n */\nfunction _getInsertDirection(target) {\n  if (index(dragEl) < index(target)) {\n    return 1;\n  } else {\n    return -1;\n  }\n}\n\n/**\r\n * Generate id\r\n * @param   {HTMLElement} el\r\n * @returns {String}\r\n * @private\r\n */\nfunction _generateId(el) {\n  var str = el.tagName + el.className + el.src + el.href + el.textContent,\n    i = str.length,\n    sum = 0;\n  while (i--) {\n    sum += str.charCodeAt(i);\n  }\n  return sum.toString(36);\n}\nfunction _saveInputCheckedState(root) {\n  savedInputChecked.length = 0;\n  var inputs = root.getElementsByTagName('input');\n  var idx = inputs.length;\n  while (idx--) {\n    var el = inputs[idx];\n    el.checked && savedInputChecked.push(el);\n  }\n}\nfunction _nextTick(fn) {\n  return setTimeout(fn, 0);\n}\nfunction _cancelNextTick(id) {\n  return clearTimeout(id);\n}\n\n// Fixed #973:\nif (documentExists) {\n  on(document, 'touchmove', function (evt) {\n    if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {\n      evt.preventDefault();\n    }\n  });\n}\n\n// Export utils\nSortable.utils = {\n  on: on,\n  off: off,\n  css: css,\n  find: find,\n  is: function is(el, selector) {\n    return !!closest(el, selector, el, false);\n  },\n  extend: extend,\n  throttle: throttle,\n  closest: closest,\n  toggleClass: toggleClass,\n  clone: clone,\n  index: index,\n  nextTick: _nextTick,\n  cancelNextTick: _cancelNextTick,\n  detectDirection: _detectDirection,\n  getChild: getChild\n};\n\n/**\r\n * Get the Sortable instance of an element\r\n * @param  {HTMLElement} element The element\r\n * @return {Sortable|undefined}         The instance of Sortable\r\n */\nSortable.get = function (element) {\n  return element[expando];\n};\n\n/**\r\n * Mount a plugin to Sortable\r\n * @param  {...SortablePlugin|SortablePlugin[]} plugins       Plugins being mounted\r\n */\nSortable.mount = function () {\n  for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\n    plugins[_key] = arguments[_key];\n  }\n  if (plugins[0].constructor === Array) plugins = plugins[0];\n  plugins.forEach(function (plugin) {\n    if (!plugin.prototype || !plugin.prototype.constructor) {\n      throw \"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(plugin));\n    }\n    if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils);\n    PluginManager.mount(plugin);\n  });\n};\n\n/**\r\n * Create sortable instance\r\n * @param {HTMLElement}  el\r\n * @param {Object}      [options]\r\n */\nSortable.create = function (el, options) {\n  return new Sortable(el, options);\n};\n\n// Export\nSortable.version = version;\n\nvar autoScrolls = [],\n  scrollEl,\n  scrollRootEl,\n  scrolling = false,\n  lastAutoScrollX,\n  lastAutoScrollY,\n  touchEvt$1,\n  pointerElemChangedInterval;\nfunction AutoScrollPlugin() {\n  function AutoScroll() {\n    this.defaults = {\n      scroll: true,\n      forceAutoScrollFallback: false,\n      scrollSensitivity: 30,\n      scrollSpeed: 10,\n      bubbleScroll: true\n    };\n\n    // Bind all private methods\n    for (var fn in this) {\n      if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n        this[fn] = this[fn].bind(this);\n      }\n    }\n  }\n  AutoScroll.prototype = {\n    dragStarted: function dragStarted(_ref) {\n      var originalEvent = _ref.originalEvent;\n      if (this.sortable.nativeDraggable) {\n        on(document, 'dragover', this._handleAutoScroll);\n      } else {\n        if (this.options.supportPointer) {\n          on(document, 'pointermove', this._handleFallbackAutoScroll);\n        } else if (originalEvent.touches) {\n          on(document, 'touchmove', this._handleFallbackAutoScroll);\n        } else {\n          on(document, 'mousemove', this._handleFallbackAutoScroll);\n        }\n      }\n    },\n    dragOverCompleted: function dragOverCompleted(_ref2) {\n      var originalEvent = _ref2.originalEvent;\n      // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\n      if (!this.options.dragOverBubble && !originalEvent.rootEl) {\n        this._handleAutoScroll(originalEvent);\n      }\n    },\n    drop: function drop() {\n      if (this.sortable.nativeDraggable) {\n        off(document, 'dragover', this._handleAutoScroll);\n      } else {\n        off(document, 'pointermove', this._handleFallbackAutoScroll);\n        off(document, 'touchmove', this._handleFallbackAutoScroll);\n        off(document, 'mousemove', this._handleFallbackAutoScroll);\n      }\n      clearPointerElemChangedInterval();\n      clearAutoScrolls();\n      cancelThrottle();\n    },\n    nulling: function nulling() {\n      touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;\n      autoScrolls.length = 0;\n    },\n    _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\n      this._handleAutoScroll(evt, true);\n    },\n    _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\n      var _this = this;\n      var x = (evt.touches ? evt.touches[0] : evt).clientX,\n        y = (evt.touches ? evt.touches[0] : evt).clientY,\n        elem = document.elementFromPoint(x, y);\n      touchEvt$1 = evt;\n\n      // IE does not seem to have native autoscroll,\n      // Edge's autoscroll seems too conditional,\n      // MACOS Safari does not have autoscroll,\n      // Firefox and Chrome are good\n      if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {\n        autoScroll(evt, this.options, elem, fallback);\n\n        // Listener for pointer element change\n        var ogElemScroller = getParentAutoScrollElement(elem, true);\n        if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {\n          pointerElemChangedInterval && clearPointerElemChangedInterval();\n          // Detect for pointer elem change, emulating native DnD behaviour\n          pointerElemChangedInterval = setInterval(function () {\n            var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n            if (newElem !== ogElemScroller) {\n              ogElemScroller = newElem;\n              clearAutoScrolls();\n            }\n            autoScroll(evt, _this.options, newElem, fallback);\n          }, 10);\n          lastAutoScrollX = x;\n          lastAutoScrollY = y;\n        }\n      } else {\n        // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\n        if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {\n          clearAutoScrolls();\n          return;\n        }\n        autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);\n      }\n    }\n  };\n  return _extends(AutoScroll, {\n    pluginName: 'scroll',\n    initializeByDefault: true\n  });\n}\nfunction clearAutoScrolls() {\n  autoScrolls.forEach(function (autoScroll) {\n    clearInterval(autoScroll.pid);\n  });\n  autoScrolls = [];\n}\nfunction clearPointerElemChangedInterval() {\n  clearInterval(pointerElemChangedInterval);\n}\nvar autoScroll = throttle(function (evt, options, rootEl, isFallback) {\n  // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n  if (!options.scroll) return;\n  var x = (evt.touches ? evt.touches[0] : evt).clientX,\n    y = (evt.touches ? evt.touches[0] : evt).clientY,\n    sens = options.scrollSensitivity,\n    speed = options.scrollSpeed,\n    winScroller = getWindowScrollingElement();\n  var scrollThisInstance = false,\n    scrollCustomFn;\n\n  // New scroll root, set scrollEl\n  if (scrollRootEl !== rootEl) {\n    scrollRootEl = rootEl;\n    clearAutoScrolls();\n    scrollEl = options.scroll;\n    scrollCustomFn = options.scrollFn;\n    if (scrollEl === true) {\n      scrollEl = getParentAutoScrollElement(rootEl, true);\n    }\n  }\n  var layersOut = 0;\n  var currentParent = scrollEl;\n  do {\n    var el = currentParent,\n      rect = getRect(el),\n      top = rect.top,\n      bottom = rect.bottom,\n      left = rect.left,\n      right = rect.right,\n      width = rect.width,\n      height = rect.height,\n      canScrollX = void 0,\n      canScrollY = void 0,\n      scrollWidth = el.scrollWidth,\n      scrollHeight = el.scrollHeight,\n      elCSS = css(el),\n      scrollPosX = el.scrollLeft,\n      scrollPosY = el.scrollTop;\n    if (el === winScroller) {\n      canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');\n      canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');\n    } else {\n      canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');\n      canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');\n    }\n    var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n    var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n    if (!autoScrolls[layersOut]) {\n      for (var i = 0; i <= layersOut; i++) {\n        if (!autoScrolls[i]) {\n          autoScrolls[i] = {};\n        }\n      }\n    }\n    if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {\n      autoScrolls[layersOut].el = el;\n      autoScrolls[layersOut].vx = vx;\n      autoScrolls[layersOut].vy = vy;\n      clearInterval(autoScrolls[layersOut].pid);\n      if (vx != 0 || vy != 0) {\n        scrollThisInstance = true;\n        /* jshint loopfunc:true */\n        autoScrolls[layersOut].pid = setInterval(function () {\n          // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n          if (isFallback && this.layer === 0) {\n            Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely\n          }\n          var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;\n          var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;\n          if (typeof scrollCustomFn === 'function') {\n            if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {\n              return;\n            }\n          }\n          scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n        }.bind({\n          layer: layersOut\n        }), 24);\n      }\n    }\n    layersOut++;\n  } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));\n  scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\n}, 30);\n\nvar drop = function drop(_ref) {\n  var originalEvent = _ref.originalEvent,\n    putSortable = _ref.putSortable,\n    dragEl = _ref.dragEl,\n    activeSortable = _ref.activeSortable,\n    dispatchSortableEvent = _ref.dispatchSortableEvent,\n    hideGhostForTarget = _ref.hideGhostForTarget,\n    unhideGhostForTarget = _ref.unhideGhostForTarget;\n  if (!originalEvent) return;\n  var toSortable = putSortable || activeSortable;\n  hideGhostForTarget();\n  var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n  var target = document.elementFromPoint(touch.clientX, touch.clientY);\n  unhideGhostForTarget();\n  if (toSortable && !toSortable.el.contains(target)) {\n    dispatchSortableEvent('spill');\n    this.onSpill({\n      dragEl: dragEl,\n      putSortable: putSortable\n    });\n  }\n};\nfunction Revert() {}\nRevert.prototype = {\n  startIndex: null,\n  dragStart: function dragStart(_ref2) {\n    var oldDraggableIndex = _ref2.oldDraggableIndex;\n    this.startIndex = oldDraggableIndex;\n  },\n  onSpill: function onSpill(_ref3) {\n    var dragEl = _ref3.dragEl,\n      putSortable = _ref3.putSortable;\n    this.sortable.captureAnimationState();\n    if (putSortable) {\n      putSortable.captureAnimationState();\n    }\n    var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);\n    if (nextSibling) {\n      this.sortable.el.insertBefore(dragEl, nextSibling);\n    } else {\n      this.sortable.el.appendChild(dragEl);\n    }\n    this.sortable.animateAll();\n    if (putSortable) {\n      putSortable.animateAll();\n    }\n  },\n  drop: drop\n};\n_extends(Revert, {\n  pluginName: 'revertOnSpill'\n});\nfunction Remove() {}\nRemove.prototype = {\n  onSpill: function onSpill(_ref4) {\n    var dragEl = _ref4.dragEl,\n      putSortable = _ref4.putSortable;\n    var parentSortable = putSortable || this.sortable;\n    parentSortable.captureAnimationState();\n    dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n    parentSortable.animateAll();\n  },\n  drop: drop\n};\n_extends(Remove, {\n  pluginName: 'removeOnSpill'\n});\n\nvar lastSwapEl;\nfunction SwapPlugin() {\n  function Swap() {\n    this.defaults = {\n      swapClass: 'sortable-swap-highlight'\n    };\n  }\n  Swap.prototype = {\n    dragStart: function dragStart(_ref) {\n      var dragEl = _ref.dragEl;\n      lastSwapEl = dragEl;\n    },\n    dragOverValid: function dragOverValid(_ref2) {\n      var completed = _ref2.completed,\n        target = _ref2.target,\n        onMove = _ref2.onMove,\n        activeSortable = _ref2.activeSortable,\n        changed = _ref2.changed,\n        cancel = _ref2.cancel;\n      if (!activeSortable.options.swap) return;\n      var el = this.sortable.el,\n        options = this.options;\n      if (target && target !== el) {\n        var prevSwapEl = lastSwapEl;\n        if (onMove(target) !== false) {\n          toggleClass(target, options.swapClass, true);\n          lastSwapEl = target;\n        } else {\n          lastSwapEl = null;\n        }\n        if (prevSwapEl && prevSwapEl !== lastSwapEl) {\n          toggleClass(prevSwapEl, options.swapClass, false);\n        }\n      }\n      changed();\n      completed(true);\n      cancel();\n    },\n    drop: function drop(_ref3) {\n      var activeSortable = _ref3.activeSortable,\n        putSortable = _ref3.putSortable,\n        dragEl = _ref3.dragEl;\n      var toSortable = putSortable || this.sortable;\n      var options = this.options;\n      lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);\n      if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n        if (dragEl !== lastSwapEl) {\n          toSortable.captureAnimationState();\n          if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n          swapNodes(dragEl, lastSwapEl);\n          toSortable.animateAll();\n          if (toSortable !== activeSortable) activeSortable.animateAll();\n        }\n      }\n    },\n    nulling: function nulling() {\n      lastSwapEl = null;\n    }\n  };\n  return _extends(Swap, {\n    pluginName: 'swap',\n    eventProperties: function eventProperties() {\n      return {\n        swapItem: lastSwapEl\n      };\n    }\n  });\n}\nfunction swapNodes(n1, n2) {\n  var p1 = n1.parentNode,\n    p2 = n2.parentNode,\n    i1,\n    i2;\n  if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n  i1 = index(n1);\n  i2 = index(n2);\n  if (p1.isEqualNode(p2) && i1 < i2) {\n    i2++;\n  }\n  p1.insertBefore(n2, p1.children[i1]);\n  p2.insertBefore(n1, p2.children[i2]);\n}\n\nvar multiDragElements = [],\n  multiDragClones = [],\n  lastMultiDragSelect,\n  // for selection with modifier key down (SHIFT)\n  multiDragSortable,\n  initialFolding = false,\n  // Initial multi-drag fold when drag started\n  folding = false,\n  // Folding any other time\n  dragStarted = false,\n  dragEl$1,\n  clonesFromRect,\n  clonesHidden;\nfunction MultiDragPlugin() {\n  function MultiDrag(sortable) {\n    // Bind all private methods\n    for (var fn in this) {\n      if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n        this[fn] = this[fn].bind(this);\n      }\n    }\n    if (!sortable.options.avoidImplicitDeselect) {\n      if (sortable.options.supportPointer) {\n        on(document, 'pointerup', this._deselectMultiDrag);\n      } else {\n        on(document, 'mouseup', this._deselectMultiDrag);\n        on(document, 'touchend', this._deselectMultiDrag);\n      }\n    }\n    on(document, 'keydown', this._checkKeyDown);\n    on(document, 'keyup', this._checkKeyUp);\n    this.defaults = {\n      selectedClass: 'sortable-selected',\n      multiDragKey: null,\n      avoidImplicitDeselect: false,\n      setData: function setData(dataTransfer, dragEl) {\n        var data = '';\n        if (multiDragElements.length && multiDragSortable === sortable) {\n          multiDragElements.forEach(function (multiDragElement, i) {\n            data += (!i ? '' : ', ') + multiDragElement.textContent;\n          });\n        } else {\n          data = dragEl.textContent;\n        }\n        dataTransfer.setData('Text', data);\n      }\n    };\n  }\n  MultiDrag.prototype = {\n    multiDragKeyDown: false,\n    isMultiDrag: false,\n    delayStartGlobal: function delayStartGlobal(_ref) {\n      var dragged = _ref.dragEl;\n      dragEl$1 = dragged;\n    },\n    delayEnded: function delayEnded() {\n      this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);\n    },\n    setupClone: function setupClone(_ref2) {\n      var sortable = _ref2.sortable,\n        cancel = _ref2.cancel;\n      if (!this.isMultiDrag) return;\n      for (var i = 0; i < multiDragElements.length; i++) {\n        multiDragClones.push(clone(multiDragElements[i]));\n        multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;\n        multiDragClones[i].draggable = false;\n        multiDragClones[i].style['will-change'] = '';\n        toggleClass(multiDragClones[i], this.options.selectedClass, false);\n        multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);\n      }\n      sortable._hideClone();\n      cancel();\n    },\n    clone: function clone(_ref3) {\n      var sortable = _ref3.sortable,\n        rootEl = _ref3.rootEl,\n        dispatchSortableEvent = _ref3.dispatchSortableEvent,\n        cancel = _ref3.cancel;\n      if (!this.isMultiDrag) return;\n      if (!this.options.removeCloneOnHide) {\n        if (multiDragElements.length && multiDragSortable === sortable) {\n          insertMultiDragClones(true, rootEl);\n          dispatchSortableEvent('clone');\n          cancel();\n        }\n      }\n    },\n    showClone: function showClone(_ref4) {\n      var cloneNowShown = _ref4.cloneNowShown,\n        rootEl = _ref4.rootEl,\n        cancel = _ref4.cancel;\n      if (!this.isMultiDrag) return;\n      insertMultiDragClones(false, rootEl);\n      multiDragClones.forEach(function (clone) {\n        css(clone, 'display', '');\n      });\n      cloneNowShown();\n      clonesHidden = false;\n      cancel();\n    },\n    hideClone: function hideClone(_ref5) {\n      var _this = this;\n      var sortable = _ref5.sortable,\n        cloneNowHidden = _ref5.cloneNowHidden,\n        cancel = _ref5.cancel;\n      if (!this.isMultiDrag) return;\n      multiDragClones.forEach(function (clone) {\n        css(clone, 'display', 'none');\n        if (_this.options.removeCloneOnHide && clone.parentNode) {\n          clone.parentNode.removeChild(clone);\n        }\n      });\n      cloneNowHidden();\n      clonesHidden = true;\n      cancel();\n    },\n    dragStartGlobal: function dragStartGlobal(_ref6) {\n      var sortable = _ref6.sortable;\n      if (!this.isMultiDrag && multiDragSortable) {\n        multiDragSortable.multiDrag._deselectMultiDrag();\n      }\n      multiDragElements.forEach(function (multiDragElement) {\n        multiDragElement.sortableIndex = index(multiDragElement);\n      });\n\n      // Sort multi-drag elements\n      multiDragElements = multiDragElements.sort(function (a, b) {\n        return a.sortableIndex - b.sortableIndex;\n      });\n      dragStarted = true;\n    },\n    dragStarted: function dragStarted(_ref7) {\n      var _this2 = this;\n      var sortable = _ref7.sortable;\n      if (!this.isMultiDrag) return;\n      if (this.options.sort) {\n        // Capture rects,\n        // hide multi drag elements (by positioning them absolute),\n        // set multi drag elements rects to dragRect,\n        // show multi drag elements,\n        // animate to rects,\n        // unset rects & remove from DOM\n\n        sortable.captureAnimationState();\n        if (this.options.animation) {\n          multiDragElements.forEach(function (multiDragElement) {\n            if (multiDragElement === dragEl$1) return;\n            css(multiDragElement, 'position', 'absolute');\n          });\n          var dragRect = getRect(dragEl$1, false, true, true);\n          multiDragElements.forEach(function (multiDragElement) {\n            if (multiDragElement === dragEl$1) return;\n            setRect(multiDragElement, dragRect);\n          });\n          folding = true;\n          initialFolding = true;\n        }\n      }\n      sortable.animateAll(function () {\n        folding = false;\n        initialFolding = false;\n        if (_this2.options.animation) {\n          multiDragElements.forEach(function (multiDragElement) {\n            unsetRect(multiDragElement);\n          });\n        }\n\n        // Remove all auxiliary multidrag items from el, if sorting enabled\n        if (_this2.options.sort) {\n          removeMultiDragElements();\n        }\n      });\n    },\n    dragOver: function dragOver(_ref8) {\n      var target = _ref8.target,\n        completed = _ref8.completed,\n        cancel = _ref8.cancel;\n      if (folding && ~multiDragElements.indexOf(target)) {\n        completed(false);\n        cancel();\n      }\n    },\n    revert: function revert(_ref9) {\n      var fromSortable = _ref9.fromSortable,\n        rootEl = _ref9.rootEl,\n        sortable = _ref9.sortable,\n        dragRect = _ref9.dragRect;\n      if (multiDragElements.length > 1) {\n        // Setup unfold animation\n        multiDragElements.forEach(function (multiDragElement) {\n          sortable.addAnimationState({\n            target: multiDragElement,\n            rect: folding ? getRect(multiDragElement) : dragRect\n          });\n          unsetRect(multiDragElement);\n          multiDragElement.fromRect = dragRect;\n          fromSortable.removeAnimationState(multiDragElement);\n        });\n        folding = false;\n        insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n      }\n    },\n    dragOverCompleted: function dragOverCompleted(_ref10) {\n      var sortable = _ref10.sortable,\n        isOwner = _ref10.isOwner,\n        insertion = _ref10.insertion,\n        activeSortable = _ref10.activeSortable,\n        parentEl = _ref10.parentEl,\n        putSortable = _ref10.putSortable;\n      var options = this.options;\n      if (insertion) {\n        // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n        if (isOwner) {\n          activeSortable._hideClone();\n        }\n        initialFolding = false;\n        // If leaving sort:false root, or already folding - Fold to new location\n        if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n          // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\n          var dragRectAbsolute = getRect(dragEl$1, false, true, true);\n          multiDragElements.forEach(function (multiDragElement) {\n            if (multiDragElement === dragEl$1) return;\n            setRect(multiDragElement, dragRectAbsolute);\n\n            // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n            // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n            parentEl.appendChild(multiDragElement);\n          });\n          folding = true;\n        }\n\n        // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n        if (!isOwner) {\n          // Only remove if not folding (folding will remove them anyways)\n          if (!folding) {\n            removeMultiDragElements();\n          }\n          if (multiDragElements.length > 1) {\n            var clonesHiddenBefore = clonesHidden;\n            activeSortable._showClone(sortable);\n\n            // Unfold animation for clones if showing from hidden\n            if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {\n              multiDragClones.forEach(function (clone) {\n                activeSortable.addAnimationState({\n                  target: clone,\n                  rect: clonesFromRect\n                });\n                clone.fromRect = clonesFromRect;\n                clone.thisAnimationDuration = null;\n              });\n            }\n          } else {\n            activeSortable._showClone(sortable);\n          }\n        }\n      }\n    },\n    dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\n      var dragRect = _ref11.dragRect,\n        isOwner = _ref11.isOwner,\n        activeSortable = _ref11.activeSortable;\n      multiDragElements.forEach(function (multiDragElement) {\n        multiDragElement.thisAnimationDuration = null;\n      });\n      if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n        clonesFromRect = _extends({}, dragRect);\n        var dragMatrix = matrix(dragEl$1, true);\n        clonesFromRect.top -= dragMatrix.f;\n        clonesFromRect.left -= dragMatrix.e;\n      }\n    },\n    dragOverAnimationComplete: function dragOverAnimationComplete() {\n      if (folding) {\n        folding = false;\n        removeMultiDragElements();\n      }\n    },\n    drop: function drop(_ref12) {\n      var evt = _ref12.originalEvent,\n        rootEl = _ref12.rootEl,\n        parentEl = _ref12.parentEl,\n        sortable = _ref12.sortable,\n        dispatchSortableEvent = _ref12.dispatchSortableEvent,\n        oldIndex = _ref12.oldIndex,\n        putSortable = _ref12.putSortable;\n      var toSortable = putSortable || this.sortable;\n      if (!evt) return;\n      var options = this.options,\n        children = parentEl.children;\n\n      // Multi-drag selection\n      if (!dragStarted) {\n        if (options.multiDragKey && !this.multiDragKeyDown) {\n          this._deselectMultiDrag();\n        }\n        toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));\n        if (!~multiDragElements.indexOf(dragEl$1)) {\n          multiDragElements.push(dragEl$1);\n          dispatchEvent({\n            sortable: sortable,\n            rootEl: rootEl,\n            name: 'select',\n            targetEl: dragEl$1,\n            originalEvent: evt\n          });\n\n          // Modifier activated, select from last to dragEl\n          if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {\n            var lastIndex = index(lastMultiDragSelect),\n              currentIndex = index(dragEl$1);\n            if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n              // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n              // (but previous selection existed)\n              var n, i;\n              if (currentIndex > lastIndex) {\n                i = lastIndex;\n                n = currentIndex;\n              } else {\n                i = currentIndex;\n                n = lastIndex + 1;\n              }\n              for (; i < n; i++) {\n                if (~multiDragElements.indexOf(children[i])) continue;\n                toggleClass(children[i], options.selectedClass, true);\n                multiDragElements.push(children[i]);\n                dispatchEvent({\n                  sortable: sortable,\n                  rootEl: rootEl,\n                  name: 'select',\n                  targetEl: children[i],\n                  originalEvent: evt\n                });\n              }\n            }\n          } else {\n            lastMultiDragSelect = dragEl$1;\n          }\n          multiDragSortable = toSortable;\n        } else {\n          multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);\n          lastMultiDragSelect = null;\n          dispatchEvent({\n            sortable: sortable,\n            rootEl: rootEl,\n            name: 'deselect',\n            targetEl: dragEl$1,\n            originalEvent: evt\n          });\n        }\n      }\n\n      // Multi-drag drop\n      if (dragStarted && this.isMultiDrag) {\n        folding = false;\n        // Do not \"unfold\" after around dragEl if reverted\n        if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {\n          var dragRect = getRect(dragEl$1),\n            multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');\n          if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;\n          toSortable.captureAnimationState();\n          if (!initialFolding) {\n            if (options.animation) {\n              dragEl$1.fromRect = dragRect;\n              multiDragElements.forEach(function (multiDragElement) {\n                multiDragElement.thisAnimationDuration = null;\n                if (multiDragElement !== dragEl$1) {\n                  var rect = folding ? getRect(multiDragElement) : dragRect;\n                  multiDragElement.fromRect = rect;\n\n                  // Prepare unfold animation\n                  toSortable.addAnimationState({\n                    target: multiDragElement,\n                    rect: rect\n                  });\n                }\n              });\n            }\n\n            // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n            // properly they must all be removed\n            removeMultiDragElements();\n            multiDragElements.forEach(function (multiDragElement) {\n              if (children[multiDragIndex]) {\n                parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n              } else {\n                parentEl.appendChild(multiDragElement);\n              }\n              multiDragIndex++;\n            });\n\n            // If initial folding is done, the elements may have changed position because they are now\n            // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n            // must be fired here as Sortable will not.\n            if (oldIndex === index(dragEl$1)) {\n              var update = false;\n              multiDragElements.forEach(function (multiDragElement) {\n                if (multiDragElement.sortableIndex !== index(multiDragElement)) {\n                  update = true;\n                  return;\n                }\n              });\n              if (update) {\n                dispatchSortableEvent('update');\n                dispatchSortableEvent('sort');\n              }\n            }\n          }\n\n          // Must be done after capturing individual rects (scroll bar)\n          multiDragElements.forEach(function (multiDragElement) {\n            unsetRect(multiDragElement);\n          });\n          toSortable.animateAll();\n        }\n        multiDragSortable = toSortable;\n      }\n\n      // Remove clones if necessary\n      if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n        multiDragClones.forEach(function (clone) {\n          clone.parentNode && clone.parentNode.removeChild(clone);\n        });\n      }\n    },\n    nullingGlobal: function nullingGlobal() {\n      this.isMultiDrag = dragStarted = false;\n      multiDragClones.length = 0;\n    },\n    destroyGlobal: function destroyGlobal() {\n      this._deselectMultiDrag();\n      off(document, 'pointerup', this._deselectMultiDrag);\n      off(document, 'mouseup', this._deselectMultiDrag);\n      off(document, 'touchend', this._deselectMultiDrag);\n      off(document, 'keydown', this._checkKeyDown);\n      off(document, 'keyup', this._checkKeyUp);\n    },\n    _deselectMultiDrag: function _deselectMultiDrag(evt) {\n      if (typeof dragStarted !== \"undefined\" && dragStarted) return;\n\n      // Only deselect if selection is in this sortable\n      if (multiDragSortable !== this.sortable) return;\n\n      // Only deselect if target is not item in this sortable\n      if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return;\n\n      // Only deselect if left click\n      if (evt && evt.button !== 0) return;\n      while (multiDragElements.length) {\n        var el = multiDragElements[0];\n        toggleClass(el, this.options.selectedClass, false);\n        multiDragElements.shift();\n        dispatchEvent({\n          sortable: this.sortable,\n          rootEl: this.sortable.el,\n          name: 'deselect',\n          targetEl: el,\n          originalEvent: evt\n        });\n      }\n    },\n    _checkKeyDown: function _checkKeyDown(evt) {\n      if (evt.key === this.options.multiDragKey) {\n        this.multiDragKeyDown = true;\n      }\n    },\n    _checkKeyUp: function _checkKeyUp(evt) {\n      if (evt.key === this.options.multiDragKey) {\n        this.multiDragKeyDown = false;\n      }\n    }\n  };\n  return _extends(MultiDrag, {\n    // Static methods & properties\n    pluginName: 'multiDrag',\n    utils: {\n      /**\r\n       * Selects the provided multi-drag item\r\n       * @param  {HTMLElement} el    The element to be selected\r\n       */\n      select: function select(el) {\n        var sortable = el.parentNode[expando];\n        if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;\n        if (multiDragSortable && multiDragSortable !== sortable) {\n          multiDragSortable.multiDrag._deselectMultiDrag();\n          multiDragSortable = sortable;\n        }\n        toggleClass(el, sortable.options.selectedClass, true);\n        multiDragElements.push(el);\n      },\n      /**\r\n       * Deselects the provided multi-drag item\r\n       * @param  {HTMLElement} el    The element to be deselected\r\n       */\n      deselect: function deselect(el) {\n        var sortable = el.parentNode[expando],\n          index = multiDragElements.indexOf(el);\n        if (!sortable || !sortable.options.multiDrag || !~index) return;\n        toggleClass(el, sortable.options.selectedClass, false);\n        multiDragElements.splice(index, 1);\n      }\n    },\n    eventProperties: function eventProperties() {\n      var _this3 = this;\n      var oldIndicies = [],\n        newIndicies = [];\n      multiDragElements.forEach(function (multiDragElement) {\n        oldIndicies.push({\n          multiDragElement: multiDragElement,\n          index: multiDragElement.sortableIndex\n        });\n\n        // multiDragElements will already be sorted if folding\n        var newIndex;\n        if (folding && multiDragElement !== dragEl$1) {\n          newIndex = -1;\n        } else if (folding) {\n          newIndex = index(multiDragElement, ':not(.' + _this3.options.selectedClass + ')');\n        } else {\n          newIndex = index(multiDragElement);\n        }\n        newIndicies.push({\n          multiDragElement: multiDragElement,\n          index: newIndex\n        });\n      });\n      return {\n        items: _toConsumableArray(multiDragElements),\n        clones: [].concat(multiDragClones),\n        oldIndicies: oldIndicies,\n        newIndicies: newIndicies\n      };\n    },\n    optionListeners: {\n      multiDragKey: function multiDragKey(key) {\n        key = key.toLowerCase();\n        if (key === 'ctrl') {\n          key = 'Control';\n        } else if (key.length > 1) {\n          key = key.charAt(0).toUpperCase() + key.substr(1);\n        }\n        return key;\n      }\n    }\n  });\n}\nfunction insertMultiDragElements(clonesInserted, rootEl) {\n  multiDragElements.forEach(function (multiDragElement, i) {\n    var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n    if (target) {\n      rootEl.insertBefore(multiDragElement, target);\n    } else {\n      rootEl.appendChild(multiDragElement);\n    }\n  });\n}\n\n/**\r\n * Insert multi-drag clones\r\n * @param  {[Boolean]} elementsInserted  Whether the multi-drag elements are inserted\r\n * @param  {HTMLElement} rootEl\r\n */\nfunction insertMultiDragClones(elementsInserted, rootEl) {\n  multiDragClones.forEach(function (clone, i) {\n    var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n    if (target) {\n      rootEl.insertBefore(clone, target);\n    } else {\n      rootEl.appendChild(clone);\n    }\n  });\n}\nfunction removeMultiDragElements() {\n  multiDragElements.forEach(function (multiDragElement) {\n    if (multiDragElement === dragEl$1) return;\n    multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n  });\n}\n\nSortable.mount(new AutoScrollPlugin());\nSortable.mount(Remove, Revert);\n\nexport default Sortable;\nexport { MultiDragPlugin as MultiDrag, Sortable, SwapPlugin as Swap };\n", "import ActivityController from \"./activity_controller\";\nimport Sortable from 'sortablejs';\n\nexport default class extends ActivityController {\n  connect() {\n    super.connect();\n    \n    this.mode = this.element.dataset.mode;\n    \n    if (this.mode === 'sort') {\n      this.initSortMode();\n    } else {\n      this.initMultipleChoiceMode();\n    }\n  }\n\n  initMultipleChoiceMode() {\n    $(this.element).find('.option').on('click', this.checkAnswer.bind(this))\n  }\n\n  initSortMode() {\n    this.availableSurahs = this.element.querySelector('#available-surahs');\n    this.sortSlots = this.element.querySelector('#sort-slots');\n    this.sortSlotsList = Array.from(this.sortSlots.querySelectorAll('.sort-slot'));\n    this.correctOrderData = JSON.parse(this.element.querySelector('#correct-order-data').textContent);\n    \n    this.initSortable();\n    this.addClickEvents();\n  }\n\n  initSortable() {\n    Sortable.create(this.availableSurahs, {\n      group: \"shared\",\n      animation: 150,\n      onEnd: (event) => this.handleDrop(event)\n    });\n\n    this.sortSlotsList.forEach((slot) => {\n      Sortable.create(slot, {\n        group: \"shared\",\n        animation: 150,\n        onEnd: (event) => this.handleDrop(event)\n      });\n    });\n  }\n\n  handleDrop(event) {\n    const target = event.to;\n    const draggableSurah = event.item;\n\n    if (!target.classList.contains('sort-slot')) {\n      if (target === this.availableSurahs) {\n        draggableSurah.classList.remove('cursor-default');\n        draggableSurah.classList.add('cursor-grab');\n        if (!draggableSurah.hasEventListener) {\n          draggableSurah.addEventListener('click', this.surahClick);\n          draggableSurah.hasEventListener = true;\n        }\n      }\n      return;\n    }\n\n    if (target.querySelector('.sortable-surah')) {\n      const existingSurah = target.querySelector('.sortable-surah');\n      existingSurah.classList.remove('cursor-default');\n      existingSurah.classList.add('cursor-grab');\n      this.availableSurahs.appendChild(existingSurah);\n      if (!existingSurah.hasEventListener) {\n        existingSurah.addEventListener('click', this.surahClick);\n        existingSurah.hasEventListener = true;\n      }\n    }\n\n    target.innerHTML = '';\n    target.appendChild(draggableSurah);\n    draggableSurah.classList.remove('cursor-grab');\n    draggableSurah.classList.add('cursor-default');\n    if (draggableSurah.hasEventListener) {\n      draggableSurah.removeEventListener('click', this.surahClick);\n      draggableSurah.hasEventListener = false;\n    }\n    \n    this.checkSortCompletion();\n  }\n\n  addClickEvents() {\n    this.surahClick = this.handleSurahClick.bind(this);\n    this.slotClick = this.handleSlotClick.bind(this);\n\n    this.availableSurahs.querySelectorAll('.sortable-surah').forEach((surah) => {\n      surah.addEventListener('click', this.surahClick);\n      surah.hasEventListener = true;\n    });\n\n    this.sortSlotsList.forEach((slot) => {\n      slot.addEventListener('click', this.slotClick);\n    });\n  }\n\n  handleSurahClick(event) {\n    const surahElement = event.currentTarget;\n    const emptySlot = this.sortSlotsList.find(slot => !slot.querySelector('.sortable-surah'));\n\n    if (emptySlot) {\n      this.fillSlot(emptySlot, surahElement);\n    }\n  }\n\n  handleSlotClick(event) {\n    const slot = event.currentTarget;\n    const surahInSlot = slot.querySelector('.sortable-surah');\n\n    if (surahInSlot) {\n      surahInSlot.classList.remove('cursor-default');\n      surahInSlot.classList.add('cursor-grab');\n      this.availableSurahs.appendChild(surahInSlot);\n      slot.innerHTML = '<span class=\"text-xl text-blue-400 font-bold\">?</span>';\n      if (!surahInSlot.hasEventListener) {\n        surahInSlot.addEventListener('click', this.surahClick);\n        surahInSlot.hasEventListener = true;\n      }\n      this.checkSortCompletion();\n    }\n  }\n\n  fillSlot(slot, surahElement) {\n    if (slot.querySelector('.sortable-surah')) {\n      const existingSurah = slot.querySelector('.sortable-surah');\n      existingSurah.classList.remove('cursor-default');\n      existingSurah.classList.add('cursor-grab');\n      this.availableSurahs.appendChild(existingSurah);\n      if (!existingSurah.hasEventListener) {\n        existingSurah.addEventListener('click', this.surahClick);\n        existingSurah.hasEventListener = true;\n      }\n    }\n\n    slot.innerHTML = '';\n    slot.appendChild(surahElement);\n    surahElement.classList.remove('cursor-grab');\n    surahElement.classList.add('cursor-default');\n    if (surahElement.hasEventListener) {\n      surahElement.removeEventListener('click', this.surahClick);\n      surahElement.hasEventListener = false;\n    }\n    \n    this.checkSortCompletion();\n  }\n\n  checkSortCompletion() {\n    const filledSlots = this.sortSlotsList.filter(slot => slot.querySelector('.sortable-surah'));\n    \n    if (filledSlots.length === 4) {\n      let isCorrect = true;\n      \n      this.sortSlotsList.forEach((slot, index) => {\n        const surah = slot.querySelector('.sortable-surah');\n        if (!surah) {\n          isCorrect = false;\n          return;\n        }\n        const surahChapterNumber = parseInt(surah.dataset.chapterNumber);\n        const correctChapterNumber = this.correctOrderData[index].chapter_number;\n        \n        if (surahChapterNumber !== correctChapterNumber) {\n          isCorrect = false;\n        }\n      });\n\n      if (isCorrect) {\n        this.handleSortCorrect();\n      } else {\n        this.handleSortWrong();\n      }\n    }\n  }\n\n  handleSortCorrect() {\n    this.sortSlotsList.forEach((slot) => {\n      slot.classList.add('correct-answer');\n      const surah = slot.querySelector('.sortable-surah');\n      if (surah) {\n        surah.classList.add('correct-answer');\n      }\n    });\n    \n    this.sortSlotsList.forEach((slot) => {\n      if (Sortable.get(slot)) {\n        Sortable.get(slot).option(\"disabled\", true);\n      }\n    });\n    \n    if (Sortable.get(this.availableSurahs)) {\n      Sortable.get(this.availableSurahs).option(\"disabled\", true);\n    }\n    \n    this.onSuccess();\n  }\n\n  handleSortWrong() {\n    this.sortSlotsList.forEach((slot) => {\n      const surah = slot.querySelector('.sortable-surah');\n      if (surah) {\n        surah.classList.add('wrong-answer', 'shake');\n      }\n    });\n    \n    this.wrongAnswer();\n    \n    setTimeout(() => {\n      this.sortSlotsList.forEach((slot) => {\n        const surah = slot.querySelector('.sortable-surah');\n        if (surah) {\n          surah.classList.remove('shake', 'wrong-answer');\n        }\n      });\n    }, 1000);\n  }\n\n  resetActivity() {\n    if (this.mode !== 'sort') return;\n    \n    const allSurahs = [];\n    \n    this.sortSlotsList.forEach((slot) => {\n      const surahInSlot = slot.querySelector('.sortable-surah');\n      if (surahInSlot) {\n        allSurahs.push(surahInSlot);\n      }\n      slot.innerHTML = '<span class=\"text-xl text-blue-400 font-bold\">?</span>';\n      slot.classList.remove('correct-answer');\n      \n      if (Sortable.get(slot)) {\n        Sortable.get(slot).option(\"disabled\", false);\n      }\n    });\n\n    const availableSurahsList = Array.from(this.availableSurahs.querySelectorAll('.sortable-surah'));\n    allSurahs.push(...availableSurahsList);\n\n    this.availableSurahs.innerHTML = '';\n    \n    allSurahs.forEach((surah) => {\n      surah.classList.remove('cursor-default', 'correct-answer', 'wrong-answer', 'shake');\n      surah.classList.add('cursor-grab');\n      \n      if (surah.hasEventListener) {\n        surah.removeEventListener('click', this.surahClick);\n      }\n      surah.addEventListener('click', this.surahClick);\n      surah.hasEventListener = true;\n      \n      this.availableSurahs.appendChild(surah);\n    });\n\n    if (Sortable.get(this.availableSurahs)) {\n      Sortable.get(this.availableSurahs).option(\"disabled\", false);\n    }\n  }\n\n  checkAnswer(e) {\n    e.preventDefault();\n    const button = $(e.target);\n    \n    if (button.attr('disabled')) {\n      return;\n    }\n\n    const {correct} = e.target.dataset;\n\n    if (correct == 'true') {\n      this.handleCorrectAnswer(button);\n    } else {\n      this.handleWrongAnswer(button);\n    }\n  }\n\n  handleCorrectAnswer(correctButton) {\n    this.el.find(\".option\").attr('disabled', 'disabled');\n    correctButton.addClass('correct-answer');\n    this.onSuccess();\n  }\n\n  handleWrongAnswer(wrongButton) {\n    wrongButton.addClass('wrong-answer shake');\n    wrongButton.attr('disabled', 'disabled');\n    \n    this.wrongAnswer();\n\n    setTimeout(() => {\n      wrongButton.removeClass('shake');\n      wrongButton.removeClass('wrong-answer');\n      wrongButton.removeAttr('disabled');\n    }, 1000);\n  }\n}\n", "import ActivityController from \"./activity_controller\";\n\nexport default class extends ActivityController {\n  connect() {\n    super.connect();\n\n    this.leftList = this.element.querySelector('#left-column');\n    this.rightList = this.element.querySelector('#right-column');\n    this.progressBar = this.element.querySelector('#progress-bar');\n    this.progressText = this.element.querySelector('#progress-text');\n    this.matchArea = this.element.querySelector('#match-area');\n    this.svg = this.element.querySelector('#match-svg');\n\n    this.draggingFrom = null; \n    this.ghostLine = null; \n    this.totalPairs = this.leftList.querySelectorAll('[data-id]').length;\n    this.matchedCount = 0;\n\n    this.bindEvents();\n\n    this._handleResize = () => this.refreshConnections();\n    window.addEventListener('resize', this._handleResize);\n  }\n\n  disconnect() {\n    super.disconnect();\n    if (this._allDots) {\n      this._allDots.forEach((dot) => {\n        dot.removeEventListener('click', this._handleDotClick);\n        dot.removeEventListener('mouseenter', this._handleDotEnter);\n        dot.removeEventListener('mouseleave', this._handleDotLeave);\n      });\n    }\n    if (this._allItems) {\n      this._allItems.forEach((item) => {\n        item.removeEventListener('click', this._handleItemClick);\n      });\n    }\n    if (this._handleMouseMove) {\n      window.removeEventListener('mousemove', this._handleMouseMove);\n    }\n    if (this._handleResize) {\n      window.removeEventListener('resize', this._handleResize);\n    }\n  }\n\n  bindEvents() {\n    // Dots on both sides\n    this._allDots = Array.from(this.element.querySelectorAll('.anchor-dot'));\n    this._allItems = Array.from(this.element.querySelectorAll('.list-group-item[data-id]'));\n\n    // Handlers\n    this._handleItemClick = (e) => {\n      const item = e.currentTarget.closest('[data-id]');\n      if (!item || item.classList.contains('matched')) return;\n\n      const dot = item.querySelector('.anchor-dot');\n      if (!dot) return;\n\n      this._handleClick(dot, item);\n    };\n\n    this._handleDotClick = (e) => {\n      e.stopPropagation();\n      const dot = e.currentTarget;\n      const item = dot.closest('[data-id]');\n      if (!item || item.classList.contains('matched')) return;\n\n      this._handleClick(dot, item);\n    };\n\n    // Hover cues on dots\n    this._handleDotEnter = (e) => {\n      const dot = e.currentTarget;\n      dot.style.backgroundColor = '#000';\n    };\n    this._handleDotLeave = (e) => {\n      const dot = e.currentTarget;\n      dot.style.backgroundColor = '';\n    };\n\n    this._allDots.forEach(dot => {\n      dot.addEventListener('click', this._handleDotClick);\n      dot.addEventListener('mouseenter', this._handleDotEnter);\n      dot.addEventListener('mouseleave', this._handleDotLeave);\n    });\n\n    this._allItems.forEach(item => {\n      item.addEventListener('click', this._handleItemClick);\n    });\n  }\n\n  _handleClick(dot, item) {\n    if (!this.draggingFrom) {\n      this.draggingFrom = dot;\n      this._clearActiveDot();\n      dot.classList.add('active');\n      const start = this.getCenterRelativeTo(dot, this.matchArea);\n      this.ensureGhostLine();\n      this.updateGhostLine(start.x, start.y, start.x, start.y);\n      if (this.ghostLine) {\n        this.ghostLine.setAttribute('stroke', '#198754');\n      }\n      this._handleMouseMove = (evt) => {\n        if (!this.draggingFrom || !this.ghostLine) return;\n        const parentRect = this.matchArea.getBoundingClientRect();\n        const x = evt.clientX - parentRect.left;\n        const y = evt.clientY - parentRect.top;\n        const startPos = this.getCenterRelativeTo(this.draggingFrom, this.matchArea);\n        this.updateGhostLine(startPos.x, startPos.y, x, y);\n      };\n      window.addEventListener('mousemove', this._handleMouseMove);\n    } else {\n      const startItem = this.draggingFrom.closest('[data-id]');\n      const startSide = this.draggingFrom.getAttribute('data-side');\n      const targetDot = dot;\n      const targetItem = targetDot.closest('[data-id]');\n      const targetSide = targetDot.getAttribute('data-side');\n\n      if (startItem && targetItem && startSide !== targetSide) {\n        const leftItem = startSide === 'left' ? startItem : targetItem;\n        const rightItem = startSide === 'right' ? startItem : targetItem;\n        this.checkPair(leftItem, rightItem);\n      }\n\n      this.clearGhostLine();\n      window.removeEventListener('mousemove', this._handleMouseMove);\n      this._handleMouseMove = null;\n      this.draggingFrom = null;\n      this._clearActiveDot();\n    }\n  }\n\n  _clearActiveDot() {\n    const dot = this.element.querySelector('.anchor-dot.active');\n    if (dot) dot.classList.remove('active');\n  }\n\n  checkPair(leftItem, rightItem) {\n    if (!leftItem || !rightItem) return;\n\n    const isCorrect = leftItem.dataset.id === rightItem.dataset.id;\n    // If this is a correct match, remove any previous incorrect connections\n    if (isCorrect) {\n      this.removeConnectionsForItems(leftItem.dataset.id, rightItem.dataset.id, true);\n    }\n    this.drawConnection(leftItem, rightItem, isCorrect);\n\n    if (isCorrect) {\n      this.matchedCount += 1;\n      leftItem.classList.add('matched', 'border', 'border-success', 'bg-success-subtle');\n      rightItem.classList.add('matched', 'border', 'border-success', 'bg-success-subtle');\n\n      this.updateProgress();\n      if (this.matchedCount === this.totalPairs) this.finish();\n    } else {\n      leftItem.classList.add('wrong-answer', 'bg-danger-subtle', 'border', 'border-danger');\n      rightItem.classList.add('wrong-answer', 'bg-danger-subtle', 'border', 'border-danger');\n      setTimeout(() => {\n        leftItem.classList.remove('wrong-answer', 'bg-danger-subtle', 'border', 'border-danger');\n        rightItem.classList.remove('wrong-answer', 'bg-danger-subtle', 'border', 'border-danger');\n      }, 600);\n    }\n  }\n\n  updateProgress() {\n    if (!this.progressBar) return;\n    const percent = Math.round((this.matchedCount / this.totalPairs) * 100);\n    this.progressBar.style.width = `${percent}%`;\n    this.progressBar.setAttribute('aria-valuenow', `${percent}`);\n    if (this.progressText) {\n      this.progressText.textContent = `${percent}%`;\n    }\n  }\n\n  finish() {\n    this.onSuccess();\n\n    const result = this.element.closest('.quiz-container')?.querySelector('#quiz-result');\n    if (result) {\n      const msg = document.createElement('div');\n      msg.className = 'mt-3 text-success fw-bold';\n      msg.textContent = `All pairs matched! Great job!`;\n      result.appendChild(msg);\n      result.classList.remove('hidden');\n      // Wait a frame so layout settles, then refresh positions\n      requestAnimationFrame(() => this.refreshConnections());\n    }\n  }\n\n  // Draw a connection between two items with a midpoint indicator (\u2713/\u2715)\n  drawConnection(leftItem, rightItem, isCorrect) {\n    if (!this.svg || !this.matchArea) return;\n\n    const leftDot = leftItem.querySelector(\".anchor-dot[data-side='left']\");\n    const rightDot = rightItem.querySelector(\".anchor-dot[data-side='right']\");\n    if (!leftDot || !rightDot) return;\n\n    const leftPos = this.getCenterRelativeTo(leftDot, this.matchArea);\n    const rightPos = this.getCenterRelativeTo(rightDot, this.matchArea);\n\n    const g = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n    g.setAttribute('data-left-id', leftItem.dataset.id);\n    g.setAttribute('data-right-id', rightItem.dataset.id);\n    g.setAttribute('data-correct', isCorrect ? 'true' : 'false');\n\n    const line = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n    line.setAttribute('x1', `${leftPos.x}`);\n    line.setAttribute('y1', `${leftPos.y}`);\n    line.setAttribute('x2', `${rightPos.x}`);\n    line.setAttribute('y2', `${rightPos.y}`);\n    line.setAttribute('stroke', isCorrect ? '#28a745' : '#dc3545');\n    line.setAttribute('stroke-width', '3');\n\n    const midX = (leftPos.x + rightPos.x) / 2;\n    const midY = (leftPos.y + rightPos.y) / 2;\n\n    const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n    circle.setAttribute('cx', `${midX}`);\n    circle.setAttribute('cy', `${midY}`);\n    circle.setAttribute('r', '12');\n    circle.setAttribute('fill', isCorrect ? '#e6f4ea' : '#fdecea');\n    circle.setAttribute('stroke', isCorrect ? '#28a745' : '#dc3545');\n    circle.setAttribute('stroke-width', '2');\n\n    const icon = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n    icon.setAttribute('x', `${midX}`);\n    icon.setAttribute('y', `${midY + 4}`);\n    icon.setAttribute('text-anchor', 'middle');\n    icon.setAttribute('font-size', '14');\n    icon.setAttribute('font-weight', 'bold');\n    icon.setAttribute('fill', isCorrect ? '#28a745' : '#dc3545');\n    icon.textContent = isCorrect ? '\u2713' : '\u2715';\n\n    g.appendChild(line);\n    g.appendChild(circle);\n    g.appendChild(icon);\n    this.svg.appendChild(g);\n  }\n\n  getCenterRelativeTo(el, relativeTo) {\n    const rect = el.getBoundingClientRect();\n    const parentRect = relativeTo.getBoundingClientRect();\n    return {\n      x: rect.left - parentRect.left + rect.width / 2,\n      y: rect.top - parentRect.top + rect.height / 2\n    };\n  }\n\n  // If onlyIncorrect=true, only remove red (incorrect) ones\n  removeConnectionsForItems(leftId, rightId, onlyIncorrect = false) {\n    if (!this.svg) return;\n    const groups = this.svg.querySelectorAll('g[data-left-id]');\n    groups.forEach(g => {\n      const involvesLeft = g.getAttribute('data-left-id') === leftId || g.getAttribute('data-right-id') === leftId;\n      const involvesRight = g.getAttribute('data-left-id') === rightId || g.getAttribute('data-right-id') === rightId;\n      const isIncorrect = g.getAttribute('data-correct') === 'false';\n\n      if ((involvesLeft || involvesRight) && (!onlyIncorrect || isIncorrect)) {\n        g.remove();\n      }\n    });\n  }\n\n  // Recompute all connection positions based on current layout\n  refreshConnections() {\n    if (!this.svg) return;\n    const groups = Array.from(this.svg.querySelectorAll('g[data-left-id]'));\n    groups.forEach((g) => {\n      const leftId = g.getAttribute('data-left-id');\n      const rightId = g.getAttribute('data-right-id');\n      const isCorrect = g.getAttribute('data-correct') === 'true';\n\n      const leftItem = this.leftList.querySelector(`[data-id='${leftId}']`);\n      const rightItem = this.rightList.querySelector(`[data-id='${rightId}']`);\n      if (!leftItem || !rightItem) return;\n\n      const leftDot = leftItem.querySelector(\".anchor-dot[data-side='left']\");\n      const rightDot = rightItem.querySelector(\".anchor-dot[data-side='right']\");\n      if (!leftDot || !rightDot) return;\n\n      const leftPos = this.getCenterRelativeTo(leftDot, this.matchArea);\n      const rightPos = this.getCenterRelativeTo(rightDot, this.matchArea);\n\n      const line = g.querySelector('line');\n      if (line) {\n        line.setAttribute('x1', `${leftPos.x}`);\n        line.setAttribute('y1', `${leftPos.y}`);\n        line.setAttribute('x2', `${rightPos.x}`);\n        line.setAttribute('y2', `${rightPos.y}`);\n      }\n\n      const midX = (leftPos.x + rightPos.x) / 2;\n      const midY = (leftPos.y + rightPos.y) / 2;\n      const circle = g.querySelector('circle');\n      const icon = g.querySelector('text');\n      if (circle) {\n        circle.setAttribute('cx', `${midX}`);\n        circle.setAttribute('cy', `${midY}`);\n      }\n      if (icon) {\n        icon.setAttribute('x', `${midX}`);\n        icon.setAttribute('y', `${midY + 4}`);\n        icon.textContent = isCorrect ? '\u2713' : '\u2715';\n      }\n    });\n  }\n\n  ensureGhostLine() {\n    if (!this.svg || this.ghostLine) return;\n    this.ghostLine = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n    this.ghostLine.setAttribute('stroke', '#000');\n    this.ghostLine.setAttribute('stroke-width', '2');\n    this.ghostLine.setAttribute('stroke-dasharray', '4 4');\n    this.svg.appendChild(this.ghostLine);\n  }\n\n  updateGhostLine(x1, y1, x2, y2) {\n    if (!this.ghostLine) return;\n    this.ghostLine.setAttribute('x1', `${x1}`);\n    this.ghostLine.setAttribute('y1', `${y1}`);\n    this.ghostLine.setAttribute('x2', `${x2}`);\n    this.ghostLine.setAttribute('y2', `${y2}`);\n  }\n\n  clearGhostLine() {\n    if (this.ghostLine && this.svg) {\n      this.ghostLine.remove();\n    }\n    this.ghostLine = null;\n  }\n}\n\n\n", "// Visit The Stimulus Handbook for more details\n// https://stimulusjs.org/handbook/introduction\n//\n// This example controller works with specially annotated HTML like:\n//\n// <div data-controller=\"hello\">\n//   <h1 data-target=\"hello.output\"></h1>\n// </div>\n\nimport {\n  Controller\n} from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  connect() {\n    const {userRole, actionKey} = this.element.dataset;\n\n    if(this.shouldHideSidebar(userRole, actionKey))\n      this.hideSidebar()\n  }\n\n  hideSidebar(){\n    $(\"#active_admin_content\").removeClass('with_sidebar');\n    $(\"#active_admin_content #sidebar\").remove()\n    $(\"#main_content\").css('marginRight', '0px');\n  }\n\n  shouldHideSidebar(userRole, actionKey){\n    return !['admin', 'super_admin'].includes(userRole) && ['users-index'].includes(actionKey)\n  }\n}", "// Visit The Stimulus Handbook for more details\n// https://stimulusjs.org/handbook/introduction\n//\n// This example controller works with specially annotated HTML like:\n//\n// <div data-controller=\"hello\">\n//   <h1 data-target=\"hello.output\"></h1>\n// </div>\n\nimport {\n  Controller\n} from \"@hotwired/stimulus\"\n\nexport default class AjaxModalController extends Controller {\n  connect() {\n    // Bound natively rather than through jQuery: this runs on every page and\n    // `$` isn't guaranteed to be jQuery by the time the controller connects.\n    this.boundClick = this.handleClick.bind(this);\n    this.element.addEventListener(\"click\", this.boundClick);\n  }\n\n  disconnect() {\n    if (this.boundClick) {\n      this.element.removeEventListener(\"click\", this.boundClick);\n      this.boundClick = null;\n    }\n  }\n\n  handleClick(e) {\n    if (e.target instanceof Element && e.target.classList.contains(\"disable-loading\")) return;\n\n    this.loadModal(e);\n  }\n\n  loadModal(e) {\n    var that = this;\n    e.preventDefault();\n    e.stopImmediatePropagation();\n    $(\".round-card.popup\").remove();\n\n    let target = $(e.currentTarget);\n    const url = target.data('url')\n    const {useTurbo, cssClass} = e.currentTarget.dataset;\n\n    this.createModal(cssClass);\n    this.show();\n\n    if (url) {\n      const options = {\n        method: 'GET',\n      }\n\n      if (useTurbo) {\n        options.headers = {\n          Accept: \"text/vnd.turbo-stream.html\"\n        }\n      }\n      fetch(url, options).then(response => {\n        if (!response.ok && response.status === 401) {\n          throw { status: 401, responseText: 'Unauthorized' };\n        }\n        return response.text();\n      }).then(content => {\n        this.setResponse(content, useTurbo)\n      }).catch(err => {\n        if (401 == err.status) {\n          const modalBody = document.getElementById('modal-body');\n          if (modalBody) {\n            modalBody.innerHTML = `\n              <div class='text-center p-5'> \n                <h2>${err.responseText || 'Unauthorized'}</h2>\n                <p><a href=\"/users/sign_in?user_return_to=${location.pathname}\" class=\"btn btn-primary\">Login</a></p>\n              </div>`;\n          }\n        }\n      })\n    } else {\n      this.setContent(target.data(\"title\"), `<div class=\"p-4\">${target.data(\"content\")}</div>`)\n    }\n  }\n\n  setContent(title, body) {\n    const el = document.getElementById('ajax-modal');\n    if (el) {\n      const titleEl = el.querySelector('#title');\n      const bodyEl = el.querySelector('#modal-body');\n      if (titleEl) titleEl.innerHTML = title;\n      if (bodyEl) bodyEl.innerHTML = body;\n    }\n  }\n\n  setResponse(content, useTurbo) {\n    const el = document.getElementById('ajax-modal');\n    if (!el) return;\n\n    if (useTurbo) {\n      const modalContent = el.querySelector('#modal-content');\n      if (modalContent) {\n        modalContent.innerHTML = content;\n      }\n    } else {\n      const response = $(\"<div>\").html(content);\n      this.setContent(response.find(\"#title\").html(), response.find(\"#body\").html())\n    }\n  }\n\n  createModal(classes) {\n    const existingModal = document.getElementById('ajax-modal');\n    const existingBackdrop = document.getElementById('ajax-modal-backdrop');\n    if (existingModal) existingModal.remove();\n    if (existingBackdrop) existingBackdrop.remove();\n\n    let sizeClasses = 'max-w-md';\n    if (classes) {\n      if (classes.includes('modal-lg')) {\n        sizeClasses = 'max-w-3xl';\n      } else if (classes.includes('modal-xl')) {\n        sizeClasses = 'max-w-6xl';\n      } else if (classes.includes('modal-sm')) {\n        sizeClasses = 'max-w-sm';\n      }\n    }\n\n    const backdrop = document.createElement('div');\n    backdrop.id = 'ajax-modal-backdrop';\n    backdrop.className = 'fixed inset-0 bg-black bg-opacity-50 transition-opacity duration-300 opacity-0 z-[9998]';\n    backdrop.addEventListener('click', () => this.hide());\n    document.body.appendChild(backdrop);\n\n    const modal = document.createElement('div');\n    modal.id = 'ajax-modal';\n    modal.className = 'fixed inset-0 z-[9999] overflow-y-auto opacity-0 transition-opacity duration-300';\n    modal.setAttribute('aria-hidden', 'true');\n    modal.setAttribute('tabIndex', '-1');\n    modal.setAttribute('role', 'dialog');\n    modal.setAttribute('aria-modal', 'true');\n    \n    modal.innerHTML = `\n      <div class=\"flex min-h-full items-center justify-center p-4\">\n        <div class=\"relative w-full ${sizeClasses} transform transition-all duration-300 scale-95\">\n          <div class=\"bg-white rounded-lg shadow-xl overflow-hidden\" id=\"modal-content\">\n            <div class=\"flex items-center justify-between px-6 py-4 border-b border-gray-200\" id=\"modal-header\">\n              <h5 class=\"text-lg font-semibold text-gray-900 m-0\" id=\"title\">Loading</h5>\n              <button type=\"button\" class=\"text-gray-400 hover:text-gray-600 transition-colors p-1\" aria-label=\"Close\" id=\"modal-close-btn\">\n                <svg class=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                  <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"></path>\n                </svg>\n              </button>\n            </div>\n            <div id=\"modal-body\" class=\"px-2\">\n              <div class=\"p-4\">\n                Loading\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    `;\n\n    document.body.appendChild(modal);\n\n    this.modalElement = modal;\n    this.backdropElement = backdrop;\n\n    const closeBtn = modal.querySelector('#modal-close-btn');\n    if (closeBtn) {\n      closeBtn.addEventListener('click', () => this.hide());\n    }\n\n    this.escapeHandler = (e) => {\n      if (e.key === 'Escape') {\n        this.hide();\n      }\n    };\n    document.addEventListener('keydown', this.escapeHandler);\n\n    this.closeEventHandler = () => {\n      this.hide();\n    };\n    document.addEventListener('ajax-modal:close', this.closeEventHandler);\n\n    document.body.style.overflow = 'hidden';\n\n    modal.addEventListener('click', (e) => {\n      const target = e.target.closest('[data-bs-dismiss=\"modal\"]');\n      if (target) {\n        e.preventDefault();\n        this.hide();\n        return;\n      }\n      \n      const modalContent = modal.querySelector('#modal-content');\n      if (modalContent && !modalContent.contains(e.target)) {\n        this.hide();\n      }\n    });\n  }\n\n  show() {\n    requestAnimationFrame(() => {\n      if (this.backdropElement) {\n        this.backdropElement.classList.remove('opacity-0');\n        this.backdropElement.classList.add('opacity-100');\n      }\n      if (this.modalElement) {\n        this.modalElement.classList.remove('opacity-0');\n        this.modalElement.classList.add('opacity-100');\n        const dialog = this.modalElement.querySelector('.scale-95');\n        if (dialog) {\n          dialog.classList.remove('scale-95');\n          dialog.classList.add('scale-100');\n        }\n      }\n    });\n  }\n\n  hide() {\n    if (this.backdropElement) {\n      this.backdropElement.classList.remove('opacity-100');\n      this.backdropElement.classList.add('opacity-0');\n    }\n    if (this.modalElement) {\n      this.modalElement.classList.remove('opacity-100');\n      this.modalElement.classList.add('opacity-0');\n      const dialog = this.modalElement.querySelector('.scale-100');\n      if (dialog) {\n        dialog.classList.remove('scale-100');\n        dialog.classList.add('scale-95');\n      }\n    }\n\n    setTimeout(() => {\n      if (this.modalElement) {\n        this.modalElement.remove();\n        this.modalElement = null;\n      }\n      if (this.backdropElement) {\n        this.backdropElement.remove();\n        this.backdropElement = null;\n      }\n      if (this.escapeHandler) {\n        document.removeEventListener('keydown', this.escapeHandler);\n        this.escapeHandler = null;\n      }\n      if (this.closeEventHandler) {\n        document.removeEventListener('ajax-modal:close', this.closeEventHandler);\n        this.closeEventHandler = null;\n      }\n      document.body.style.overflow = '';\n    }, 300);\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  connect() {\n    this.element.classList.add('my-5');\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"player\", \"alignedWord\", \"sttWord\", \"ayahSelect\", \"ayahInput\", \"stopToggle\", \"status\"]\n  static values = { audioUrl: String, ayahs: Array }\n\n  connect() {\n    this.stopAt = null\n    this.lastAligned = null\n    this.lastStt = null\n    this.onTimeUpdate = this.onTimeUpdate.bind(this)\n    if (this.hasPlayerTarget) {\n      this.playerTarget.addEventListener(\"timeupdate\", this.onTimeUpdate)\n    }\n    this.selectFromUrl()\n    this.onAyahPicked = () => this.selectFromUrl()\n    window.addEventListener(\"segment-pipeline:ayah\", this.onAyahPicked)\n  }\n\n  // ?ayah=2:76 (or 76) preselects that ayah and cues the audio at it. Playing\n  // still needs a click: browsers block audio that starts on its own.\n  selectFromUrl() {\n    const value = new URLSearchParams(globalThis.location?.search || \"\").get(\"ayah\")\n    if (!value) {\n      if (this.hasAyahSelectTarget) this.ayahSelectTarget.value = \"\"\n      if (this.hasStatusTarget) this.statusTarget.textContent = \"\"\n      return\n    }\n    const point = this.findPoint(value)\n    if (!point || point.start == null || !this.hasPlayerTarget) return\n\n    if (this.hasAyahSelectTarget) this.ayahSelectTarget.value = point.key\n    this.playerTarget.currentTime = point.start\n    this.showStatus(point)\n  }\n\n  disconnect() {\n    window.removeEventListener(\"segment-pipeline:ayah\", this.onAyahPicked)\n    if (this.hasPlayerTarget) {\n      this.playerTarget.removeEventListener(\"timeupdate\", this.onTimeUpdate)\n    }\n  }\n\n  play(event) {\n    const start = parseFloat(event.currentTarget.dataset.start)\n    const end = parseFloat(event.currentTarget.dataset.end)\n    if (Number.isNaN(start) || !this.hasPlayerTarget) return\n\n    this.stopAt = Number.isNaN(end) ? null : end\n    this.playerTarget.currentTime = start\n    this.playerTarget.play()\n  }\n\n  jumpToSelected(event) {\n    this.jumpTo(event.currentTarget.value)\n    if (this.hasAyahInputTarget) this.ayahInputTarget.value = \"\"\n  }\n\n  jumpToInput() {\n    if (!this.hasAyahInputTarget) return\n    const value = this.ayahInputTarget.value.trim()\n    if (this.jumpTo(value) && this.hasAyahSelectTarget) {\n      this.ayahSelectTarget.value = \"\"\n    }\n  }\n\n  jumpTo(value) {\n    if (!value || !this.hasPlayerTarget) return false\n\n    const point = this.findPoint(value)\n    if (!point || point.start == null) return false\n\n    // Play just this ayah unless \"stop at the end of the ayah\" is unticked.\n    const stop = !this.hasStopToggleTarget || this.stopToggleTarget.checked\n    this.stopAt = stop && point.end != null ? point.end : null\n    this.playerTarget.currentTime = point.start\n    this.playerTarget.play()\n    this.showStatus(point)\n    return true\n  }\n\n  findPoint(value) {\n    const points = this.ayahsValue || []\n    return points.find((p) => p.key === value) ||\n      points.find((p) => String(p.number) === String(value))\n  }\n\n  showStatus(point) {\n    if (!this.hasStatusTarget) return\n    const range = point.end != null ? ` \u00B7 ${Number(point.start).toFixed(2)}\u2013${Number(point.end).toFixed(2)}s` : \"\"\n    this.statusTarget.textContent = `${point.key}${range}`\n  }\n\n  onTimeUpdate() {\n    const time = this.playerTarget.currentTime\n\n    if (this.stopAt !== null && time >= this.stopAt) {\n      this.playerTarget.pause()\n      this.stopAt = null\n    }\n\n    this.lastAligned = this.highlight(this.alignedWordTargets, time, this.lastAligned)\n    this.lastStt = this.highlight(this.sttWordTargets, time, this.lastStt)\n  }\n\n  highlight(rows, time, previous) {\n    const active = rows.find((row) => {\n      const start = parseFloat(row.dataset.start)\n      const end = parseFloat(row.dataset.end)\n      return !Number.isNaN(start) && !Number.isNaN(end) && time >= start && time < end\n    })\n\n    if (active === previous) return previous\n\n    if (previous) previous.classList.remove(\"bg-yellow-200\")\n    if (active) {\n      active.classList.add(\"bg-yellow-200\")\n      active.scrollIntoView({ block: \"nearest\", inline: \"nearest\" })\n    }\n    return active || null\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  connect() {\n      $(this.element).keyboard({\n            autoAccept: false,\n            stayOpen: true,\n            layout: 'custom',\n            rtl: true,\n            language: ['en'],\n            closeByClickEvent: false,\n            enterNavigation: false,\n            usePreview: true,\n            visible: function () {\n              setTimeout(function () {\n                $('.ui-keyboard').draggable()\n              }, 2000)\n            },\n            css: {\n              input: 'w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent',\n              container: 'center-block dropdown-menu',\n              buttonDefault: 'btn btn-default',\n              buttonHover: 'btn-primary',\n              buttonAction: 'active',\n              buttonDisabled: 'disabled'\n            },\n            customLayout: {\n              'custom': [\n                '\\u06e4',\n                '{tab} \\u0636(c) \\u0635 \\u062b \\u0642 \\u0641 \\u063a \\u0639 \\u0647 \\u062e \\u062d \\u062c \\u062f',\n                '{lock} \\u0634 \\u0633 \\u064a \\u0628 \\u0644 \\u0627 \\u062a \\u0646 \\u0645 \\u0643 \\u0637 \\u0630 {enter}',\n                '{shift} \\u0640 \\u0626 \\u0621 \\u0624 \\u0631 \\ufefb \\u0649 \\u0629 \\u0648 \\u0632 \\u0638 {shift}',\n                '{accept} {alt} {space} {alt} {custom}'\n              ],\n              'shift': [\n                \"\u0653(`) \u064E(1) \u064B(2) \u064F(3) \u064C(4) \u0651(5) \u0652(6) \u0650(7) \u064D(8) \u0621(9) \u064A(0) \u0626(-)  \u06DB(+){bksp}\",\n                \"{tab} \u0643(Q) \u0651(W) {empty} {empty} \u062B(T) \u06D2(Y) \u0629(U) \u0649(I) {empty}  \u0670 (})\",\n                \"{lock} \u0622(A) \u0635(S) \u0636(D) \u0642(F) \u063A(G) \u0647(H) \u062C(J) \u062E(K) \u0625(L) : \\\" {enter}\",\n                \"{shift} \u0630(Z) \u0637(X) \u0638(C) {empty} {empty} \u06BA(N)  > < / {shift}\",\n                \"{accept} {alt} {space}\"\n              ],\n              'normal': [\n                \"\u0653(`) \u064E(1) \u064B(2) \u064F(3) \u064C(4) \u0651(5) \u0652(6) \u0650(7) \u064D(8) \u0621(9) \u064A(0) \u0626(-) \\u06e4\",\n                \"{tab} \u0642(q) \u0648(w) \u0639(e) \u0631(r) \u062A(t) \u06D2(y) \u0650(u) \u064A(i) \u064F(o) \u0651(p) \u06DB([) \u0670 (]) \\ \",\n                \"{lock} \u0627(a) \u0633(s) \u062F(d) \u0641(f) \u0639(g) \u062D(h) \u062C(j) \u0643(k) \u0644(l) \u061B(;) '(') {enter}\",\n                \"{shift} \u0632(z) \u0634(x) \u0686(c) \u062B(v) \u0628(b) \u0646(n) \u0645(m) \u0652(,) \\u06be(.) \\u06c1(/) {shift}\",\n                \"{cancel} {alt} {space} {accept}\"\n              ],\n              'alt': [\n                \"\\u0654 \\u0653 \\u0658 \u0652  \u0650  \u064C  \u064E  \u064B  \u064F    \\u06e4   \",\n                \"\u0670\uE022 \u0621 \u064A \u0626 \u0624 \u0629 \u0625 \u0623 \u0622 \u06DB\",\n                \"\u06E2  \uE01A \u06D6  \u06DA  \u06DB  \u064C  \u0651    \u06DA  \u0615  \uE01C \u06D9  \uE01B\",\n                \"{alt} {space} \"\n              ]\n\n            }\n          }\n      ).addTyping({showTyping: true}).previewKeyset()\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n// Ayah boundary review/adjust tool on the segment-pipeline run page.\n//\n// The table lists each ayah read-only; clicking \"Waveform\" opens a sticky\n// bottom popup that is the per-ayah editor: it shows the full ayah text, the\n// waveform region (with a few seconds of padding so the silence before/after is\n// visible and the ayah span shaded), a moving playback cursor, click-to-seek, a\n// play/pause toggle, prev/next navigation, editable start/end fields, and Save\n// (a normal POST back to alignment.json).\nexport default class extends Controller {\n  static targets = [\n    \"player\", \"popup\", \"canvas\", \"title\", \"text\", \"waveLabel\", \"form\",\n    \"numberField\", \"startInput\", \"endInput\",\n    \"playButton\", \"popupDuration\", \"prevButton\", \"nextButton\"\n  ]\n  static values = { audioUrl: String, ayahs: Array }\n\n  // Seconds of audio drawn on either side of the ayah, so the surrounding\n  // silences are visible.\n  static PAD = 2\n\n  connect() {\n    this.stopAt = null\n    this.buffer = null\n    this.activeIndex = null\n    this.region = null      // { from, to, width } for the current drawing\n    this.baseImage = null   // cached waveform pixels; cursor is overlaid on top\n    this.rafId = null\n    this.onTimeUpdate = this.onTimeUpdate.bind(this)\n    this.onPlay = this.onPlay.bind(this)\n    this.onStop = this.onStop.bind(this)\n    this.player().addEventListener(\"timeupdate\", this.onTimeUpdate)\n    this.player().addEventListener(\"play\", this.onPlay)\n    this.player().addEventListener(\"pause\", this.onStop)\n    this.player().addEventListener(\"ended\", this.onStop)\n  }\n\n  disconnect() {\n    this.stopCursorLoop()\n    this.player().removeEventListener(\"timeupdate\", this.onTimeUpdate)\n    this.player().removeEventListener(\"play\", this.onPlay)\n    this.player().removeEventListener(\"pause\", this.onStop)\n    this.player().removeEventListener(\"ended\", this.onStop)\n  }\n\n  // --- opening / navigation ------------------------------------------------\n\n  async openIndex(event) {\n    this.activeIndex = parseInt(event.currentTarget.dataset.index, 10)\n    this.popupTarget.classList.remove(\"hidden\")\n    this.populate()\n    try {\n      await this.ensureBuffer()\n      this.draw()\n    } catch (e) {\n      this.waveLabelTarget.textContent = \"Could not decode audio for the waveform. \"\n    }\n  }\n\n  prev() {\n    if (this.activeIndex > 0) this.go(this.activeIndex - 1)\n  }\n\n  next() {\n    if (this.activeIndex < this.ayahsValue.length - 1) this.go(this.activeIndex + 1)\n  }\n\n  go(index) {\n    this.pause()\n    this.activeIndex = index\n    this.populate()\n    if (this.buffer) this.draw()\n  }\n\n  close() {\n    this.pause()\n    this.popupTarget.classList.add(\"hidden\")\n  }\n\n  // --- playback ------------------------------------------------------------\n\n  togglePlay() {\n    if (this.player().paused) this.playClip()\n    else this.pause()\n  }\n\n  // Play from the cursor to the end of the ayah. If the cursor sits past the\n  // ayah (or before the drawn region), restart from the ayah start \u2014 otherwise\n  // resume from wherever it was seeked to, so you can replay a spot.\n  playClip() {\n    const { start, end } = this.currentBounds()\n    if (Number.isNaN(start) || Number.isNaN(end)) return\n\n    this.stopAt = end\n    const t = this.player().currentTime\n    const from = this.region ? this.region.from : start\n    if (Number.isNaN(t) || t < from || t >= end) this.player().currentTime = start\n    this.player().play()\n  }\n\n  pause() {\n    this.stopAt = null\n    if (!this.player().paused) this.player().pause()\n  }\n\n  // Click anywhere on the waveform to move the cursor there and replay from it.\n  seek(event) {\n    if (!this.region) return\n    const rect = this.canvasTarget.getBoundingClientRect()\n    const x = (event.clientX - rect.left) * (this.canvasTarget.width / rect.width)\n    const { from, to, width } = this.region\n    const time = from + (x / width) * (to - from)\n    this.player().currentTime = Math.min(Math.max(time, 0), this.buffer.duration)\n    this.paintCursor()\n  }\n\n  onTimeUpdate() {\n    if (this.stopAt !== null && this.player().currentTime >= this.stopAt) {\n      this.stopAt = null\n      this.player().pause()\n    }\n  }\n\n  onPlay() {\n    this.syncPlayButton()\n    this.startCursorLoop()\n  }\n\n  onStop() {\n    this.syncPlayButton()\n    this.stopCursorLoop()\n  }\n\n  syncPlayButton() {\n    this.playButtonTarget.textContent = this.player().paused ? \"\u25B6 Play\" : \"\u23F8 Pause\"\n  }\n\n  startCursorLoop() {\n    const tick = () => {\n      this.paintCursor()\n      this.rafId = requestAnimationFrame(tick)\n    }\n    this.stopCursorLoop()\n    this.rafId = requestAnimationFrame(tick)\n  }\n\n  stopCursorLoop() {\n    if (this.rafId) cancelAnimationFrame(this.rafId)\n    this.rafId = null\n  }\n\n  // --- editing -------------------------------------------------------------\n\n  onInput() {\n    this.updateDuration()\n    if (this.buffer) this.draw()\n  }\n\n  // --- rendering -----------------------------------------------------------\n\n  populate() {\n    const ayah = this.ayahsValue[this.activeIndex]\n    if (!ayah) return\n\n    this.titleTarget.textContent = `Ayah ${ayah.number}`\n    this.textTarget.textContent = ayah.text || \"\"\n    this.numberFieldTarget.value = ayah.number\n    this.startInputTarget.value = ayah.start == null ? \"\" : Number(ayah.start).toFixed(3)\n    this.endInputTarget.value = ayah.end == null ? \"\" : Number(ayah.end).toFixed(3)\n\n    this.updateDuration()\n    this.prevButtonTarget.disabled = this.activeIndex <= 0\n    this.nextButtonTarget.disabled = this.activeIndex >= this.ayahsValue.length - 1\n    this.syncPlayButton()\n  }\n\n  updateDuration() {\n    const { start, end } = this.currentBounds()\n    this.popupDurationTarget.textContent =\n      Number.isNaN(start) || Number.isNaN(end) ? \"\" : `${(end - start).toFixed(3)}s`\n  }\n\n  currentBounds() {\n    return {\n      start: parseFloat(this.startInputTarget.value),\n      end: parseFloat(this.endInputTarget.value)\n    }\n  }\n\n  async ensureBuffer() {\n    if (this.buffer) return this.buffer\n    const context = new (window.AudioContext || window.webkitAudioContext)()\n    const response = await fetch(this.audioUrlValue)\n    const bytes = await response.arrayBuffer()\n    this.buffer = await context.decodeAudioData(bytes)\n    return this.buffer\n  }\n\n  draw() {\n    const { start, end } = this.currentBounds()\n    if (!this.buffer || Number.isNaN(start) || Number.isNaN(end)) return\n\n    const duration = this.buffer.duration\n    const from = Math.max(0, start - this.constructor.PAD)\n    const to = Math.min(duration, end + this.constructor.PAD)\n    if (to <= from) return\n\n    const canvas = this.canvasTarget\n    const width = (canvas.width = canvas.clientWidth || 600)\n    const height = canvas.height\n    const ctx = canvas.getContext(\"2d\")\n    ctx.clearRect(0, 0, width, height)\n\n    const timeToX = (t) => ((t - from) / (to - from)) * width\n\n    ctx.fillStyle = \"rgba(79, 70, 229, 0.12)\"\n    ctx.fillRect(timeToX(start), 0, timeToX(end) - timeToX(start), height)\n\n    this.drawWaveform(ctx, width, height, from, to)\n\n    ctx.strokeStyle = \"rgba(16, 185, 129, 0.9)\"\n    ctx.lineWidth = 2\n    for (const t of [start, end]) {\n      const x = timeToX(t)\n      ctx.beginPath()\n      ctx.moveTo(x, 0)\n      ctx.lineTo(x, height)\n      ctx.stroke()\n    }\n\n    this.waveLabelTarget.textContent = `Showing ${from.toFixed(2)}s\u2013${to.toFixed(2)}s (\u00B1${this.constructor.PAD}s). Click to seek. `\n\n    // Cache the static drawing; the moving cursor is painted on top of it.\n    this.region = { from, to, width }\n    this.baseImage = ctx.getImageData(0, 0, width, height)\n    this.paintCursor()\n  }\n\n  paintCursor() {\n    if (!this.region || !this.baseImage) return\n\n    const canvas = this.canvasTarget\n    const ctx = canvas.getContext(\"2d\")\n    ctx.putImageData(this.baseImage, 0, 0)\n\n    const { from, to, width } = this.region\n    const time = this.player().currentTime\n    if (time < from || time > to) return\n\n    const x = ((time - from) / (to - from)) * width\n    ctx.strokeStyle = \"rgba(220, 38, 38, 0.95)\"\n    ctx.lineWidth = 2\n    ctx.beginPath()\n    ctx.moveTo(x, 0)\n    ctx.lineTo(x, canvas.height)\n    ctx.stroke()\n  }\n\n  drawWaveform(ctx, width, height, from, to) {\n    const data = this.buffer.getChannelData(0)\n    const rate = this.buffer.sampleRate\n    const startSample = Math.floor(from * rate)\n    const endSample = Math.min(data.length, Math.floor(to * rate))\n    const samplesPerPixel = Math.max(1, Math.floor((endSample - startSample) / width))\n    const mid = height / 2\n\n    ctx.strokeStyle = \"rgba(55, 65, 81, 0.8)\"\n    ctx.lineWidth = 1\n    ctx.beginPath()\n    for (let x = 0; x < width; x++) {\n      const sliceStart = startSample + x * samplesPerPixel\n      let min = 1.0\n      let max = -1.0\n      for (let i = 0; i < samplesPerPixel; i++) {\n        const value = data[sliceStart + i] || 0\n        if (value < min) min = value\n        if (value > max) max = value\n      }\n      ctx.moveTo(x + 0.5, mid + min * mid)\n      ctx.lineTo(x + 0.5, mid + max * mid)\n    }\n    ctx.stroke()\n  }\n\n  player() {\n    return this.playerTarget\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n// The ayah picker above the segment pipeline's steps. Picking an ayah puts it\n// in the URL (?ayah=2:76, so the address can be shared) and:\n//   - hides every server-rendered [data-ayah-filter-key] element of another\n//     ayah (the Fix step's cards, the Ayah boundary rows);\n//   - tells the script-driven steps (Compare, Align, Surah timeline) through a\n//     window \"segment-pipeline:ayah\" event, { detail: { key } }, and each one\n//     reads the same ?ayah= parameter to follow it.\n// An empty value (\"All ayahs\") clears the filter.\nexport const AYAH_EVENT = \"segment-pipeline:ayah\"\n\nexport default class extends Controller {\n  static targets = [\"select\"]\n\n  connect() {\n    this.apply(new URLSearchParams(window.location.search).get(\"ayah\") || \"\")\n  }\n\n  change() {\n    const key = this.selectTarget.value || \"\"\n    const url = new URL(window.location.href)\n    if (key) url.searchParams.set(\"ayah\", key)\n    else url.searchParams.delete(\"ayah\")\n    window.history.replaceState(window.history.state, \"\", url)\n\n    this.apply(key)\n    window.dispatchEvent(new CustomEvent(AYAH_EVENT, { detail: { key } }))\n  }\n\n  apply(key) {\n    document.querySelectorAll(\"[data-ayah-filter-key]\").forEach((el) => {\n      el.style.display = !key || el.dataset.ayahFilterKey === key ? \"\" : \"none\"\n    })\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  static targets = [\"panel\", \"select\"];\n  static values = { tab: String };\n\n  connect() {\n    this.outsideClick = (e) => {\n      if (!this.element.contains(e.target)) this.hide();\n    };\n    document.addEventListener(\"click\", this.outsideClick);\n  }\n\n  disconnect() {\n    document.removeEventListener(\"click\", this.outsideClick);\n  }\n\n  toggle(e) {\n    e.preventDefault();\n    e.stopPropagation();\n    if (this.panelTarget.classList.contains(\"hidden\")) {\n      this.show();\n    } else {\n      this.hide();\n    }\n  }\n\n  show() {\n    this.panelTarget.classList.remove(\"hidden\");\n  }\n\n  hide() {\n    this.panelTarget.classList.add(\"hidden\");\n  }\n\n  jump(e) {\n    e.preventDefault();\n    const key = this.selectTarget.value;\n    if (!key) return;\n\n    const tab = this.tabValue || \"ayah\";\n    const url = `/ayah/${key}?tab=${encodeURIComponent(tab)}`;\n\n    if (window.Turbo && Turbo.visit) {\n      Turbo.visit(url, { frame: \"ayah_info\" });\n    } else {\n      window.location.href = url;\n    }\n\n    this.hide();\n  }\n}\n\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\n// Plays one ayah of the surah audio and stops at its end. The play button\n// carries the range (data-from / data-to, in ms) and, optionally, the word\n// timings (data-words: [[position, from, to], ...]); while it plays, the\n// [data-position] elements inside the button's card light up as their word is\n// recited. Used on the Fix step, where the card is the ayah's [data-ayah-key].\nexport default class extends Controller {\n  static targets = [\"player\", \"status\", \"stop\"]\n\n  connect() {\n    this.stopAt = null\n    this.words = []\n    this.card = null\n    this.lit = []\n  }\n\n  disconnect() {\n    this.stop()\n  }\n\n  play(event) {\n    const button = event.currentTarget\n    const from = Number(button.dataset.from)\n    const to = Number(button.dataset.to)\n    if (!Number.isFinite(from) || !Number.isFinite(to) || !this.hasPlayerTarget) return\n\n    this.clear()\n    this.card = button.closest(\"[data-ayah-key]\")\n    this.words = JSON.parse(button.dataset.words || \"[]\")\n    this.stopAt = to\n    this.playerTarget.currentTime = from / 1000\n    // Refused (e.g. autoplay blocked): undo the \"Playing\u2026\" state rather than leave it up.\n    this.playerTarget.play().catch(() => this.stop())\n    if (this.hasStatusTarget) this.statusTarget.textContent = `Playing ${this.card?.dataset.ayahKey || \"\"}`\n    if (this.hasStopTarget) this.stopTarget.hidden = false\n    this.pump()\n  }\n\n  stop() {\n    if (this.hasPlayerTarget) this.playerTarget.pause()\n    if (this.raf) cancelAnimationFrame(this.raf)\n    this.stopAt = null\n    this.clear()\n    if (this.hasStatusTarget) this.statusTarget.textContent = \"\"\n    if (this.hasStopTarget) this.stopTarget.hidden = true\n  }\n\n  // Off the frame clock, not timeupdate (~4/s), so the stop is not late and the\n  // word highlight keeps up with short words.\n  pump() {\n    const ms = this.playerTarget.currentTime * 1000\n    if (this.stopAt != null && ms >= this.stopAt) return this.stop()\n    if (this.playerTarget.paused) return // paused by hand: keep the ayah, stop painting\n\n    this.paint(ms)\n    this.raf = requestAnimationFrame(() => this.pump())\n  }\n\n  paint(ms) {\n    if (!this.card) return\n    const active = this.words.find(([, from, to]) => ms >= from && ms < to)\n    const position = active ? String(active[0]) : null\n    if (position === this.litPosition) return\n\n    this.clear()\n    this.litPosition = position\n    if (!position) return\n    this.lit = [...this.card.querySelectorAll(`[data-position=\"${position}\"]`)]\n    this.lit.forEach((el) => el.classList.add(\"ring-2\", \"ring-indigo-400\"))\n  }\n\n  clear() {\n    this.lit.forEach((el) => el.classList.remove(\"ring-2\", \"ring-indigo-400\"))\n    this.lit = []\n    this.litPosition = null\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\nimport { getAyahModalPrefs, setAyahModalPrefs } from \"../lib/ayah_modal_store\";\n\nexport default class extends Controller {\n  static targets = [\"panel\", \"backdrop\", \"form\"];\n\n  connect() {\n    const prefs = getAyahModalPrefs();\n    if (prefs.recitationPanelOpen) {\n      this.backdropTarget.classList.remove(\"hidden\");\n      this.backdropTarget.classList.add(\"block\");\n      this.panelTarget.classList.remove(\"hidden\");\n      this.panelTarget.classList.add(\"flex\");\n    }\n    if (Number.isInteger(prefs.recitationResourceId)) {\n      const current = this.currentRecitationResourceId();\n      if (current !== prefs.recitationResourceId) {\n        this.setRecitationResourceId(prefs.recitationResourceId);\n        if (this.formTarget) this.formTarget.requestSubmit();\n      }\n    }\n  }\n\n  open(e) {\n    e.preventDefault();\n    setAyahModalPrefs({ recitationPanelOpen: true });\n    this.backdropTarget.classList.remove(\"hidden\");\n    this.backdropTarget.classList.add(\"block\");\n    this.panelTarget.classList.remove(\"hidden\");\n    this.panelTarget.classList.add(\"flex\");\n  }\n\n  close(e) {\n    e.preventDefault();\n    setAyahModalPrefs({ recitationPanelOpen: false });\n    this.panelTarget.classList.add(\"hidden\");\n    this.panelTarget.classList.remove(\"flex\");\n    this.backdropTarget.classList.add(\"hidden\");\n    this.backdropTarget.classList.remove(\"block\");\n  }\n\n  change() {\n    const id = this.currentRecitationResourceId();\n    if (Number.isInteger(id)) setAyahModalPrefs({ recitationResourceId: id });\n    if (this.formTarget) this.formTarget.requestSubmit();\n  }\n\n  currentRecitationResourceId() {\n    if (!this.formTarget) return null;\n    const input = this.formTarget.querySelector('input[name=\"recitation_resource_id\"]:checked');\n    if (!input) return null;\n    const v = parseInt(input.value, 10);\n    return Number.isInteger(v) ? v : null;\n  }\n\n  setRecitationResourceId(id) {\n    if (!this.formTarget) return;\n    const inputs = this.formTarget.querySelectorAll('input[name=\"recitation_resource_id\"]');\n    inputs.forEach((i) => {\n      i.checked = parseInt(i.value, 10) === id;\n    });\n    setAyahModalPrefs({ recitationResourceId: id });\n  }\n}\n\n\n", "const STORAGE_KEY = \"qul:ayah_modal\";\n\nfunction readRaw() {\n  try {\n    const v = window.localStorage.getItem(STORAGE_KEY);\n    if (!v) return {};\n    const parsed = JSON.parse(v);\n    return parsed && typeof parsed === \"object\" ? parsed : {};\n  } catch (_) {\n    return {};\n  }\n}\n\nfunction writeRaw(next) {\n  try {\n    window.localStorage.setItem(STORAGE_KEY, JSON.stringify(next));\n  } catch (_) {\n  }\n}\n\nexport function getAyahModalPrefs() {\n  const raw = readRaw();\n  const prefs = raw.prefs && typeof raw.prefs === \"object\" ? raw.prefs : {};\n  return {\n    script: typeof prefs.script === \"string\" ? prefs.script : null,\n    translationIds: Array.isArray(prefs.translationIds) ? prefs.translationIds : null,\n    tafsirIds: Array.isArray(prefs.tafsirIds) ? prefs.tafsirIds : null,\n    wordTranslationId: Number.isInteger(prefs.wordTranslationId) ? prefs.wordTranslationId : null,\n    transliterationId: Number.isInteger(prefs.transliterationId) ? prefs.transliterationId : null,\n    recitationResourceId: Number.isInteger(prefs.recitationResourceId) ? prefs.recitationResourceId : null,\n    translationPanelOpen: prefs.translationPanelOpen === true,\n    tafsirPanelOpen: prefs.tafsirPanelOpen === true,\n    wordTranslationPanelOpen: prefs.wordTranslationPanelOpen === true,\n    transliterationPanelOpen: prefs.transliterationPanelOpen === true,\n    scriptPanelOpen: prefs.scriptPanelOpen === true,\n    recitationPanelOpen: prefs.recitationPanelOpen === true,\n  };\n}\n\nexport function setAyahModalPrefs(partial) {\n  const raw = readRaw();\n  const existing = raw.prefs && typeof raw.prefs === \"object\" ? raw.prefs : {};\n  const nextPrefs = { ...existing, ...partial };\n  writeRaw({ ...raw, prefs: nextPrefs });\n}\n\n\n", "import { Controller } from \"@hotwired/stimulus\";\nimport { getAyahModalPrefs, setAyahModalPrefs } from \"../lib/ayah_modal_store\";\n\nexport default class extends Controller {\n  static targets = [\"panel\", \"backdrop\", \"form\"];\n\n  connect() {\n    const prefs = getAyahModalPrefs();\n    if (prefs.scriptPanelOpen) {\n      this.backdropTarget.classList.remove(\"hidden\");\n      this.backdropTarget.classList.add(\"block\");\n      this.panelTarget.classList.remove(\"hidden\");\n      this.panelTarget.classList.add(\"flex\");\n    }\n    if (prefs.script) {\n      const current = this.currentScript();\n      if (current !== prefs.script) {\n        this.setScript(prefs.script);\n        if (this.formTarget) this.formTarget.requestSubmit();\n      }\n    }\n  }\n\n  open(e) {\n    e.preventDefault();\n    setAyahModalPrefs({ scriptPanelOpen: true });\n    this.backdropTarget.classList.remove(\"hidden\");\n    this.backdropTarget.classList.add(\"block\");\n    this.panelTarget.classList.remove(\"hidden\");\n    this.panelTarget.classList.add(\"flex\");\n  }\n\n  close(e) {\n    e.preventDefault();\n    setAyahModalPrefs({ scriptPanelOpen: false });\n    this.panelTarget.classList.add(\"hidden\");\n    this.panelTarget.classList.remove(\"flex\");\n    this.backdropTarget.classList.add(\"hidden\");\n    this.backdropTarget.classList.remove(\"block\");\n  }\n\n  change() {\n    const script = this.currentScript();\n    if (script) setAyahModalPrefs({ script });\n    if (this.formTarget) this.formTarget.requestSubmit();\n  }\n\n  currentScript() {\n    if (!this.formTarget) return null;\n    const input = this.formTarget.querySelector('input[name=\"script\"]:checked');\n    return input ? input.value : null;\n  }\n\n  setScript(value) {\n    if (!this.formTarget) return;\n    const inputs = this.formTarget.querySelectorAll('input[name=\"script\"]');\n    inputs.forEach((i) => {\n      i.checked = i.value === value;\n    });\n    setAyahModalPrefs({ script: value });\n  }\n}\n\n\n", "import SegmentPlayer from './segment_player_controller';\nimport {QuranUtils} from \"../utils/quran\";\n\nexport default class extends SegmentPlayer {\n  async connect() {\n    this.ayahPlayerData = {};\n\n    await super.connect();\n  }\n\n  disconnect() {\n    super.disconnect();\n\n    Object.values(this.ayahPlayerData || {}).forEach(player => player.unload());\n  }\n\n  initializePlayer() {\n    this.player = this.initializeAyahPlayer(this.currentVerseKey);\n  }\n\n  isPlayerReadyForVerse(key) {\n    return this.player === this.ayahPlayerData[key];\n  }\n\n  initializeAyahPlayer(key) {\n    if(this.ayahPlayerData[key]) {\n      return this.ayahPlayerData[key]\n    }\n\n    // Segments for this ayah may never have loaded (empty or failed API\n    // response), there is no audio to build a player from then.\n    const audioUrl = this.getAudioUrl(key);\n    if (!audioUrl) {\n      return null;\n    }\n\n    this.ayahPlayerData[key] = new Howl({\n      src: [audioUrl],\n      html5: true,\n      onplay: this.onplay.bind(this),\n      onpause: this.onpause.bind(this),\n      onend: this.onend.bind(this),\n      onload: this.onload.bind(this),\n      onloaderror: this.onloaderror.bind(this),\n    });\n\n    return this.ayahPlayerData[key]\n  }\n\n  playAyah(key) {\n    if (this.player && this.player.playing()) {\n      this.player.stop();\n    }\n\n    this.player = this.initializeAyahPlayer(key);\n    if (!this.player) {\n      return;\n    }\n\n    this.player.seek(0);\n    this.playWindowEndMs = null;\n\n    if (this.player.state() === 'loaded') {\n      this.updateTotalDuration();\n    }\n  }\n\n  findAyahKeyAtTime(time) {\n    const segments = this.segmentsData\n\n    let left = 1;\n    let right = QuranUtils.getSurahAyahCount(this.currentChapter);\n\n    while (left <= right) {\n      const mid = Math.floor((left + right) / 2);\n      const key = `${this.currentChapter}:${mid}`;\n      const segment = segments[key];\n\n      if (!segment) {\n        left = mid + 1;\n        continue;\n      }\n\n      const {time_from, time_to} = segment;\n\n      if (time < time_from) {\n        right = mid - 1;\n      } else if (time > time_to) {\n        left = mid + 1;\n      } else {\n        return key;\n      }\n    }\n\n    return null;\n  }\n\n  async updateVerse(time) {\n  }\n\n  findSegmentAtTime(time) {\n    const segments = this.segmentsData[this.currentVerseKey]?.segments || [];\n    if (!segments.length) return null;\n\n    let left = 0;\n    let right = segments.length - 1;\n\n    while (left <= right) {\n      const mid = Math.floor((left + right) / 2);\n      const segment = segments[mid];\n\n      if (time < segment[1]) {\n        right = mid - 1;\n      } else if (time > segment[2]) {\n        left = mid + 1;\n      } else {\n        return segment; // time is within segment range\n      }\n    }\n\n    return null;\n  }\n\n\n  getAudioUrl(key) {\n    return this.segmentsData?.[key]?.audio_url || null\n  }\n\n  async loadSegments(verseKey) {\n    const verseData = this.segmentsData[verseKey];\n    if (verseData?.segments)\n      return\n\n    const parts = verseKey.split(\":\");\n    // The endpoint paginates and ignores `from`, so ask for the page that\n    // actually contains this ayah.\n    const perPage = 10;\n    const page = Math.ceil(parseInt(parts[1], 10) / perPage);\n    const url = `/api/v1/audio/ayah_segments/${this.recitation}?surah=${parts[0]}&per_page=${perPage}&page=${page}`;\n\n    const response = await fetch(url);\n    const data = await response.json();\n\n    this.segmentsData = {\n      ...this.segmentsData,\n      ...data.segments\n    };\n  }\n}", "import {Controller} from \"@hotwired/stimulus\";\nimport {Howl} from \"howler\";\nimport {QuranUtils} from \"../utils/quran\";\n\nexport default class extends Controller {\n  static targets = [\n    \"playButton\",\n    \"progress\",\n    \"currentTime\",\n    \"totalDuration\"\n  ];\n\n  async connect() {\n    const {recitation, verseKey} = this.element.dataset;\n\n    this.currentChapter = QuranUtils.getSurahNumberFromVerseKey(verseKey);\n    this.currentVerseNumber = QuranUtils.getAyahNumberFromVerseKey(verseKey);\n    this.currentVerseKey = verseKey;\n\n    this.recitation = recitation;\n    this.verses = {};\n    this.segmentsData = {}\n    this.audioData = {}\n    this.isPlaying = false\n    this.playWindowEndMs = null\n    this.draggingProgress = false\n    this.seekOnNextPlay = true\n    this.jumpToken = 0\n    this.pendingSeekRatio = null\n\n    // Range repeat: play `range.from`..`range.to`, each ayah `ayahRepeat`\n    // times, the whole range `rangeRepeat` times (Infinity to loop forever).\n    this.range = null\n    this.ayahRepeatCounter = 0\n    this.rangeRepeatCounter = 0\n    this.handlingRangeBoundary = false\n    this.rangeFinished = false\n    this.rangeSeek = null\n    this.progressLoopToken = 0\n    this.progressFallbackId = null\n    this.progressStepping = false\n\n    this.versePaginaiton = {};\n    this.segmentPaginaiton = {};\n\n    this.prevAyahButton = document.getElementById(\"previous-ayah\");\n    this.nextAyahButton = document.getElementById(\"next-ayah\");\n    this.ayahSelect = document.getElementById(\"ayah-select\");\n\n    this.playButton = this.element.querySelector('#play-button');\n    this.progressBar = this.element.querySelector('#progress-bar');\n    this.progressInput = this.element.querySelector('#progress-input');\n    this.progress = this.element.querySelector('#progress');\n    this.progressHandle = this.element.querySelector('#progress-handle');\n    this.currentTime = this.element.querySelector('#current-time');\n    this.totalTime = this.element.querySelector('#total-duration');\n    this.currentVerseKeyLabel = this.element.querySelector('#current-verse-key');\n\n    this.rangeButton = this.element.querySelector('#range-repeat-button');\n    this.rangePanel = this.element.querySelector('#range-repeat-panel');\n    this.rangeFromSelect = this.element.querySelector('#range-from');\n    this.rangeToSelect = this.element.querySelector('#range-to');\n    this.rangeAyahRepeatInput = this.element.querySelector('#range-ayah-repeat');\n    this.rangeRepeatInput = this.element.querySelector('#range-repeat-count');\n    this.rangeForeverInput = this.element.querySelector('#range-repeat-forever');\n    this.rangeAyahRepeatLabel = this.element.querySelector('#range-ayah-repeat-label');\n    this.rangeRepeatField = this.element.querySelector('#range-repeat-count-field');\n    this.rangeForeverLabel = this.element.querySelector('#range-forever-label');\n    this.rangeApplyLabel = this.element.querySelector('#range-repeat-apply-label');\n    this.rangeError = this.element.querySelector('#range-repeat-error');\n    this.rangeStatus = this.element.querySelector('#range-repeat-status');\n\n    this.loadingIndicator = this.createLoadingIndicator();\n    this.ayahContainer = this.element.querySelector(\"#current-ayah\");\n    this.highlightBg = this.ayahContainer.querySelector(\"#word-highlight\");\n\n    this.bindEvents();\n\n    await this.loadVerses(verseKey).then(() => {\n      this.renderAyah(verseKey);\n    });\n\n    // Line the player up with the ayah in the URL so the progress bar and\n    // clock match the ayah on screen before anything is played.\n    this.cueCurrentVerse();\n  }\n\n  cueCurrentVerse() {\n    if (!this.player) {\n      this.initializePlayer();\n    }\n    if (!this.player) return;\n\n    this.playAyah(this.currentVerseKey);\n    this.seekOnNextPlay = false;\n    this.refreshProgressFromPlayer();\n  }\n\n  disconnect() {\n    this.stopProgressLoop();\n\n    if (this.player) {\n      this.player.unload();\n      this.player = null;\n    }\n  }\n\n  createLoadingIndicator() {\n    const indicator = document.createElement('div');\n    indicator.className = 'absolute inset-0 flex items-center justify-center bg-white/80 z-10 hidden';\n    indicator.innerHTML = `\n      <svg class=\"animate-spin h-5 w-5 text-primary\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\">\n        <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n        <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n      </svg>\n    `;\n    this.element.appendChild(indicator);\n    return indicator;\n  }\n\n  showLoading() {\n    this.loading = true;\n    this.loadingIndicator.classList.remove('hidden');\n  }\n\n  hideLoading() {\n    this.loading = false;\n    this.loadingIndicator.classList.add('hidden');\n  }\n\n  bindEvents() {\n    this.playButton.addEventListener('click', this.togglePlay.bind(this));\n    this.bindRangeEvents();\n\n    this.progressInput.addEventListener('pointerdown', () => { this.draggingProgress = true; });\n    this.progressInput.addEventListener('pointerup', () => { this.draggingProgress = false; });\n    this.progressInput.addEventListener('keydown', () => { this.draggingProgress = true; });\n    this.progressInput.addEventListener('keyup', () => { this.draggingProgress = false; });\n    this.progressInput.addEventListener('input', (event) => {\n      this.seekToRatio(Number(event.target.value) / Number(event.target.max));\n    });\n\n    this.prevAyahButton.addEventListener(\"click\", (e) => {\n      e.preventDefault();\n      const url = new URL(this.prevAyahButton.href);\n      const key = url.searchParams.get(\"ayah\");\n      if (key) {\n        this.jumpToVerseAndResume(key);\n      }\n    });\n\n    this.nextAyahButton.addEventListener(\"click\", (e) => {\n      e.preventDefault();\n      const url = new URL(this.nextAyahButton.href);\n      const key = url.searchParams.get(\"ayah\");\n\n      if (key) {\n        this.jumpToVerseAndResume(key);\n      }\n    });\n\n    $(this.ayahSelect).on(\"select2:select\", (e) => {\n      const key = e.params.data.id;\n      if (key) {\n        this.jumpToVerseAndResume(key);\n      }\n    });\n  }\n\n  async seekToRatio(ratio) {\n    const clamped = Math.min(Math.max(ratio, 0), 1);\n\n    if (!this.player) {\n      this.initializePlayer();\n    }\n\n    // Seeking before the audio has reported a duration would land at 0, so\n    // remember where the user aimed and apply it once the file is ready.\n    const duration = this.player && this.player.duration();\n    if (!duration) {\n      this.pendingSeekRatio = clamped;\n      this.updateProgressPosition(clamped * 100);\n      return;\n    }\n\n    const time = clamped * duration;\n\n    this.player.seek(time);\n    this.playWindowEndMs = null;\n    this.seekOnNextPlay = false;\n    this.currentTime.textContent = this.formatTime(time);\n    this.updateProgressPosition(clamped * 100);\n    await this.updateVerse(time * 1000);\n    this.updateHighlighting(time * 1000);\n  }\n\n  refreshProgressFromPlayer() {\n    const duration = this.player && this.player.duration();\n    if (!duration) return;\n\n    const time = this.player.seek() || 0;\n    this.currentTime.textContent = this.formatTime(time);\n    this.updateProgressPosition((time / duration) * 100);\n  }\n\n  async loadVerses(verseKey) {\n    if (this.verses[verseKey]) {\n      return;\n    }\n\n    this.showLoading();\n\n    const chapter = QuranUtils.getSurahNumberFromVerseKey(verseKey);\n    const from = QuranUtils.getAyahNumberFromVerseKey(verseKey);\n\n    try {\n      const response = await fetch(`/api/v1/chapters/${chapter}/verses?words=true&from=${from}&per_page=5`);\n      const data = await response.json();\n\n      for (const verse of data.verses) {\n        this.verses[verse.verse_key] = verse;\n      }\n\n      await this.loadSegments(verseKey)\n    } catch (err) {\n      console.error(\"Failed to load verses\", verseKey, err);\n    } finally {\n      this.playButton.removeAttribute(\"disabled\");\n      this.hideLoading();\n    }\n  }\n\n  // The progress loop drives the clock, the progress bar and the highlight, so\n  // it must survive Howler's event ordering. Seeking to another ayah pauses and\n  // replays the sound, and the `pause` can be delivered *after* the `play` that\n  // followed it; a loop torn down by that stale event would leave the highlight\n  // stuck on one ayah while the recitation carried on. So the loop owns its own\n  // lifetime: a token invalidates older loops, and it ends only once the player\n  // has genuinely stayed stopped rather than on a single idle frame.\n  startProgressLoop() {\n    const token = ++this.progressLoopToken;\n    let idleFrames = 0;\n    let lastPosition = null;\n    let lastFrameAt = performance.now();\n\n    const tick = async () => {\n      if (token !== this.progressLoopToken) return;\n\n      lastFrameAt = performance.now();\n      await this.step();\n      if (token !== this.progressLoopToken) return;\n\n      // Resuming a streamed surah file after a seek can leave the player\n      // reporting \"not playing\" for the better part of a second, so idleness\n      // alone must not end the loop \u2014 only a player that is both stopped and\n      // not advancing, for long enough that no buffering explains it.\n      const position = this.player ? this.player.seek() : 0;\n      const stalled = this.player && !this.player.playing() && position === lastPosition;\n      lastPosition = position;\n      idleFrames = stalled ? idleFrames + 1 : 0;\n      if (idleFrames > 600) return;\n\n      this.playerId = requestAnimationFrame(tick);\n    };\n\n    cancelAnimationFrame(this.playerId);\n    this.playerId = requestAnimationFrame(tick);\n\n    // A hidden tab stops delivering animation frames, and a repeat with no one\n    // watching the boundaries runs straight past its last ayah. This timer\n    // takes over whenever frames dry up; browsers clamp it to about a second\n    // in the background, which still stops the range close enough to its end.\n    clearInterval(this.progressFallbackId);\n    this.progressFallbackId = setInterval(() => {\n      if (token !== this.progressLoopToken) {\n        clearInterval(this.progressFallbackId);\n        return;\n      }\n      if (performance.now() - lastFrameAt < 400) return;\n      this.step();\n    }, 250);\n  }\n\n  stopProgressLoop() {\n    this.progressLoopToken += 1;\n    cancelAnimationFrame(this.playerId);\n    clearInterval(this.progressFallbackId);\n  }\n\n  // One pass of the progress handling, never two at once: the animation frame\n  // and the fallback timer both drive it.\n  async step() {\n    if (this.progressStepping) return;\n\n    this.progressStepping = true;\n    try {\n      await this.updateProgress();\n    } finally {\n      this.progressStepping = false;\n    }\n  }\n\n  onplay() {\n    this.isPlaying = true;\n    this.startProgressLoop();\n    const icon = this.playButton.querySelector(\"i\");\n    icon.classList.add(\"fa-pause\");\n    icon.classList.remove(\"fa-play\");\n  }\n\n  async updateProgress() {\n    if (!this.player) {\n      return;\n    }\n\n    const time = this.player.seek();\n    const timeMs = time * 1000;\n\n    if (this.range && this.handleRangeProgress(timeMs)) {\n      return;\n    }\n\n    if (this.playWindowEndMs !== null && timeMs >= this.playWindowEndMs) {\n      this.playWindowEndMs = null;\n      this.playNextAyah();\n      return;\n    }\n\n    this.currentTime.textContent = this.formatTime(time);\n\n    const progressPercent = (time / this.player.duration()) * 100;\n    this.updateProgressPosition(progressPercent);\n\n    await this.updateVerse(timeMs);\n\n    if (!this.isPlaying) {\n      return;\n    }\n\n    this.updateHighlighting(timeMs);\n  }\n\n  updateProgressPosition(percent) {\n    const progress = Math.min(Math.max(percent, 0), 100);\n\n    this.progress.style.width = `${progress}%`;\n    this.progressHandle.style.left = `${progress}%`;\n\n    if (this.progressInput && !this.draggingProgress) {\n      this.progressInput.value = Math.round((progress / 100) * Number(this.progressInput.max));\n    }\n  }\n\n  updateHighlighting(time) {\n    const segment = this.findSegmentAtTime(time);\n    if (!segment) {\n      this.highlightBg.classList.add(\"hidden\");\n      return;\n    }\n\n    const location = `${this.currentVerseKey}:${segment[0]}`;\n    const word = this.ayahContainer.querySelector(`[data-location=\"${location}\"]`);\n    if (!word) {\n      this.highlightBg.classList.add(\"hidden\");\n      return;\n    }\n\n    const containerRect = this.ayahContainer.getBoundingClientRect();\n    const wordRect = word.getBoundingClientRect();\n\n    const top = wordRect.top - containerRect.top + this.ayahContainer.scrollTop;\n    const left = wordRect.left - containerRect.left + this.ayahContainer.scrollLeft;\n\n    this.highlightBg.classList.remove(\"hidden\");\n    this.highlightBg.style.top = `${top}px`;\n    this.highlightBg.style.left = `${left}px`;\n    this.highlightBg.style.width = `${wordRect.width}px`;\n    this.highlightBg.style.height = `${wordRect.height}px`;\n  }\n\n  onpause() {\n    // Pausing and immediately replaying (every seek to another ayah does that)\n    // can deliver Howler's `pause` *after* the `play` that followed it. Tearing\n    // the progress loop down then would leave the highlight frozen on one ayah\n    // while the recitation carries on, so trust the player's own state.\n    if (this.player && this.player.playing()) {\n      return;\n    }\n\n    this.isPlaying = false;\n\n    const icon = this.playButton.querySelector(\"i\");\n    icon.classList.add(\"fa-play\");\n    icon.classList.remove(\"fa-pause\");\n  }\n\n  onend() {\n    this.stopProgressLoop();\n\n    if (this.range && this.takeRangeAction()) {\n      return;\n    }\n\n    this.playNextAyah();\n  }\n\n  onload() {\n    this.updateTotalDuration();\n\n    if (this.pendingSeekRatio !== null) {\n      const ratio = this.pendingSeekRatio;\n      this.pendingSeekRatio = null;\n      this.seekToRatio(ratio);\n    } else if (!this.isPlaying) {\n      this.refreshProgressFromPlayer();\n    }\n  }\n\n  updateTotalDuration() {\n    const duration = this.player.duration();\n    this.totalTime.textContent = this.formatTime(duration);\n  }\n\n  onloaderror() {\n    //TODO: Handle error loading audio\n  }\n\n  renderAyah(verseKey) {\n    const verse = this.verses[verseKey];\n    if (!verse) {\n      console.error(\"Verse not found:\", verseKey);\n      return;\n    }\n\n    const container = this.element.querySelector(\"#current-ayah #words\");\n\n    container.innerHTML = \"\";\n\n    verse.words.forEach(word => {\n      const div = document.createElement(\"span\");\n      div.textContent = word.text;\n      div.dataset.location = word.location;\n      div.className = \"relative z-10 rounded-md px-1\";\n      container.appendChild(div);\n    });\n    this.highlightBg.classList.add(\"hidden\");\n    this.currentVerseKeyLabel.textContent = verseKey;\n  }\n\n\n  async jumpToVerse(verseKey) {\n    const jumpToken = ++this.jumpToken;\n    const parts = verseKey.split(\":\");\n    this.currentChapter = parseInt(parts[0], 10);\n    this.currentVerseNumber = parseInt(parts[1], 10);\n    this.currentVerseKey = verseKey;\n\n    const url = new URL(window.location);\n    url.searchParams.set(\"ayah\", verseKey);\n    history.pushState({}, \"\", url);\n\n    const verseId = QuranUtils.getAyahIdFromKey(verseKey);\n    this.updateAyahSelect(verseKey);\n\n    const prevVerseNumber = verseId - 1;\n    const nextVerseNumber = verseId + 1;\n\n    if (prevVerseNumber >= 1) {\n      this.prevAyahButton.classList.remove(\"hidden\");\n      this.prevAyahButton.href = this.buildVerseUrl(prevVerseNumber);\n    } else {\n      this.prevAyahButton.classList.add(\"hidden\");\n    }\n\n    if (nextVerseNumber <= 6236) {\n      this.nextAyahButton.classList.remove(\"hidden\");\n      this.nextAyahButton.href = this.buildVerseUrl(nextVerseNumber);\n    } else {\n      this.nextAyahButton.classList.add(\"hidden\");\n    }\n\n    await this.loadVerses(verseKey)\n\n    if (jumpToken === this.jumpToken) {\n      this.renderAyah(verseKey);\n    }\n  }\n\n  // Picking an ayah from the select or the prev/next buttons is an explicit\n  // request for that ayah: move the audio there and start playing it.\n  async jumpToVerseAndResume(verseKey) {\n    if (this.player) {\n      this.player.pause();\n    }\n\n    await this.jumpToVerse(verseKey);\n\n    this.playAyah(verseKey);\n    this.seekOnNextPlay = false;\n\n    if (this.player) {\n      this.player.play();\n      this.startProgressLoop();\n    }\n  }\n\n  buildVerseUrl(verseId) {\n    const key = QuranUtils.getAyahKeyFromId(verseId);\n    const url = new URL(window.location);\n\n    url.searchParams.set(\"ayah\", key);\n    return url.toString();\n  }\n\n  updateAyahSelect(verseKey) {\n    if (!this.ayahSelect) {\n      return;\n    }\n\n    if (!this.ayahSelect.querySelector(`option[value=\"${verseKey}\"]`)) {\n      this.ayahSelect.append(new Option(verseKey, verseKey, true, true));\n    }\n\n    $(this.ayahSelect).val(verseKey).trigger('change');\n  }\n\n  nextVerseKey() {\n    const verseId = QuranUtils.getAyahIdFromKey(this.currentVerseKey);\n\n    if (!verseId || verseId >= 6236) {\n      return null;\n    }\n\n    return QuranUtils.getAyahKeyFromId(verseId + 1);\n  }\n\n  async playNextAyah() {\n    const key = this.nextVerseKey();\n\n    if (!key) {\n      this.isPlaying = false;\n      this.player.seek(0);\n      this.updateProgressPosition(0);\n      return;\n    }\n\n    await this.jumpToVerse(key);\n    this.playAyah(key);\n    this.seekOnNextPlay = false;\n    this.player.play();\n    this.startProgressLoop();\n  }\n\n  bindRangeEvents() {\n    if (!this.rangeButton) return;\n\n    this.rangeButton.addEventListener('click', () => this.toggleRangePanel());\n    this.element.querySelector('#range-repeat-close')\n      .addEventListener('click', () => this.closeRangePanel());\n    this.element.querySelector('#range-repeat-apply')\n      .addEventListener('click', () => this.applyRange());\n    this.element.querySelector('#range-repeat-clear')\n      .addEventListener('click', () => this.clearRange());\n\n    this.rangeForeverInput.addEventListener('change', () => this.syncRangeFields());\n    this.rangeFromSelect.addEventListener('change', () => this.syncRangeFields());\n    this.rangeToSelect.addEventListener('change', () => this.syncRangeFields());\n  }\n\n  // One control covers both cases: picking the same ayah for both ends is how\n  // the user asks for a plain single-ayah repeat, so the fields that only make\n  // sense for a real range step out of the way.\n  isSingleAyahSelection() {\n    return this.rangeFromSelect.value === this.rangeToSelect.value;\n  }\n\n  syncRangeFields() {\n    const single = this.isSingleAyahSelection();\n\n    this.rangeRepeatField.classList.toggle('hidden', single);\n    this.rangeAyahRepeatLabel.textContent = single ? 'Repeat count' : 'Repeat each ayah';\n    this.rangeForeverLabel.textContent = single ? 'Repeat forever' : 'Loop the range forever';\n    this.rangeApplyLabel.textContent = single ? 'Repeat ayah' : 'Play range';\n\n    this.rangeAyahRepeatInput.disabled = single && this.rangeForeverInput.checked;\n    this.rangeRepeatInput.disabled = this.rangeForeverInput.checked;\n  }\n\n  toggleRangePanel() {\n    if (this.rangePanel.classList.contains('hidden')) {\n      this.populateRangeSelects();\n      this.rangePanel.classList.remove('hidden');\n      this.rangeButton.setAttribute('aria-expanded', 'true');\n    } else {\n      this.closeRangePanel();\n    }\n  }\n\n  closeRangePanel() {\n    this.rangePanel.classList.add('hidden');\n    this.rangeButton.setAttribute('aria-expanded', 'false');\n  }\n\n  // The selects only ever offer ayahs of the surah on screen \u2014 the surah file\n  // and the loaded segments both stop at its boundary.\n  populateRangeSelects() {\n    const ayahCount = QuranUtils.getSurahAyahCount(this.currentChapter);\n    const options = Array.from({length: ayahCount}, (_, i) => {\n      const key = `${this.currentChapter}:${i + 1}`;\n      return `<option value=\"${key}\">${key}</option>`;\n    }).join('');\n\n    const from = this.range?.from || this.currentVerseKey;\n    const to = this.range?.to || this.currentVerseKey;\n\n    this.rangeFromSelect.innerHTML = options;\n    this.rangeToSelect.innerHTML = options;\n    this.rangeFromSelect.value = from;\n    this.rangeToSelect.value = to;\n\n    this.rangeAyahRepeatInput.value = this.range?.ayahRepeat || 1;\n    this.rangeForeverInput.checked = this.range?.rangeRepeat === Infinity;\n    if (this.range && this.range.rangeRepeat !== Infinity) {\n      this.rangeRepeatInput.value = this.range.rangeRepeat;\n    }\n    this.syncRangeFields();\n    this.hideRangeError();\n  }\n\n  showRangeError(message) {\n    this.rangeError.textContent = message;\n    this.rangeError.classList.remove('hidden');\n  }\n\n  hideRangeError() {\n    this.rangeError.classList.add('hidden');\n  }\n\n  async applyRange() {\n    const from = this.rangeFromSelect.value;\n    const to = this.rangeToSelect.value;\n\n    if (QuranUtils.getAyahIdFromKey(from) > QuranUtils.getAyahIdFromKey(to)) {\n      this.showRangeError('The first ayah must come before the last ayah.');\n      return;\n    }\n\n    const clamp = (input) => Math.min(Math.max(parseInt(input.value, 10) || 1, 1), 99);\n\n    const forever = this.rangeForeverInput.checked;\n    const single = this.isSingleAyahSelection();\n\n    this.range = {\n      from,\n      to,\n      // A forever single-ayah repeat is just a one-ayah range on an endless\n      // loop, so the same counters drive both cases.\n      ayahRepeat: single && forever ? 1 : clamp(this.rangeAyahRepeatInput),\n      rangeRepeat: forever ? Infinity : (single ? 1 : clamp(this.rangeRepeatInput)),\n    };\n    this.ayahRepeatCounter = 0;\n    this.rangeRepeatCounter = 0;\n    this.rangeFinished = false;\n    // Until the jump below lands, the player is still somewhere else, and\n    // `updateVerse` would drag the range onto whatever ayah that is.\n    this.awaitRangeSeek(this.segmentsData[from]?.time_from || 0);\n\n    this.hideRangeError();\n    this.closeRangePanel();\n    this.renderRangeState();\n\n    await this.jumpToVerseAndResume(from);\n  }\n\n  clearRange() {\n    this.range = null;\n    this.ayahRepeatCounter = 0;\n    this.rangeRepeatCounter = 0;\n    this.rangeFinished = false;\n    this.rangeSeek = null;\n    this.closeRangePanel();\n    this.renderRangeState();\n  }\n\n  renderRangeState() {\n    const active = Boolean(this.range);\n\n    this.rangeButton.setAttribute('aria-pressed', active.toString());\n    this.rangeButton.classList.toggle('bg-emerald-100', active);\n    this.rangeButton.classList.toggle('text-emerald-700', active);\n    this.rangeButton.classList.toggle('bg-slate-100', !active);\n    this.rangeButton.classList.toggle('text-slate-500', !active);\n\n    this.rangeStatus.classList.toggle('hidden', !active);\n    if (!active) return;\n\n    if (this.rangeFinished) {\n      this.rangeStatus.textContent = this.range.from === this.range.to\n        ? `Finished repeating ${this.range.from}`\n        : `Finished repeating ${this.range.from} \u2013 ${this.range.to}`;\n      return;\n    }\n\n    const {from, to, ayahRepeat, rangeRepeat} = this.range;\n    const forever = rangeRepeat === Infinity;\n\n    if (from === to) {\n      const count = forever ? '\u221E' : ayahRepeat;\n      this.rangeStatus.textContent = `Repeating ${from} (play ${this.ayahRepeatCounter + 1} of ${count})`;\n      return;\n    }\n\n    const pass = forever\n      ? `pass ${this.rangeRepeatCounter + 1} of \u221E`\n      : `pass ${Math.min(this.rangeRepeatCounter + 1, rangeRepeat)} of ${rangeRepeat}`;\n    const each = ayahRepeat > 1 ? `, each ayah \u00D7${ayahRepeat}` : '';\n\n    this.rangeStatus.textContent = `Repeating ${from} \u2013 ${to} (${pass}${each})`;\n  }\n\n  // Decides what to do now that the audio for `currentVerseKey` has finished.\n  nextRangeAction() {\n    const {to, ayahRepeat, rangeRepeat} = this.range;\n\n    if (this.ayahRepeatCounter < ayahRepeat - 1) {\n      this.ayahRepeatCounter += 1;\n      return 'repeat-ayah';\n    }\n\n    this.ayahRepeatCounter = 0;\n\n    if (this.currentVerseKey !== to) {\n      return 'next-ayah';\n    }\n\n    if (rangeRepeat === Infinity || this.rangeRepeatCounter < rangeRepeat - 1) {\n      this.rangeRepeatCounter += 1;\n      return 'repeat-range';\n    }\n\n    return 'stop';\n  }\n\n  // A media element keeps reporting its pre-seek position for a while after a\n  // seek, and over a streamed two-hour surah file that can be several hundred\n  // milliseconds. Treating one of those stale readings as \"this ayah ended\"\n  // would count another repeat and step the ayah forward while the audio is\n  // still where it was, leaving the highlight one ayah ahead of the recitation\n  // for the rest of the range. So after every range seek we ignore positions\n  // until the player reports one that actually lands in the window we asked\n  // for, with a deadline so a seek that never lands cannot wedge the player.\n  awaitRangeSeek(targetMs) {\n    this.rangeSeek = {targetMs, deadline: performance.now() + 5000};\n  }\n\n  rangeSeekSettled(timeMs) {\n    if (!this.rangeSeek) return true;\n\n    const {targetMs, deadline} = this.rangeSeek;\n    const landed = timeMs >= targetMs - 250 && timeMs <= targetMs + 2000;\n\n    if (landed || performance.now() > deadline) {\n      this.rangeSeek = null;\n      return true;\n    }\n\n    return false;\n  }\n\n  // Returns true when the range took over this frame and the caller should not\n  // run its normal progress handling.\n  handleRangeProgress(timeMs) {\n    if (!this.range || this.handlingRangeBoundary) return false;\n\n    // Suppress everything, highlighting included, until the seek has landed:\n    // the position we are being handed belongs to the previous ayah.\n    if (!this.rangeSeekSettled(timeMs)) return true;\n\n    const startMs = this.currentVerseStartMs();\n    const endMs = this.currentVerseEndMs();\n\n    if (timeMs < startMs) return false;\n    if (endMs === null || timeMs < endMs) return false;\n\n    return this.takeRangeAction({advanceWithinFile: true});\n  }\n\n  // Applies the decision for the ayah that just finished. Returns true when it\n  // moved the player itself, false when the caller should carry on as usual.\n  takeRangeAction({advanceWithinFile = false} = {}) {\n    // `updateProgress` and `onend` can both see the same ayah finish; without\n    // this the range would be counted down twice for one play.\n    if (this.rangeSeek) return true;\n\n    const action = this.nextRangeAction();\n\n    if (action === 'next-ayah') {\n      // Nothing to seek: the surah file flows into the next ayah on its own.\n      // The label still has to move here rather than wait for `updateVerse`,\n      // because the silence between two ayahs matches no segment at all \u2014 the\n      // key would stay put across that gap and the next frame would read the\n      // boundary a second time and repeat the ayah instead of moving on.\n      if (!advanceWithinFile) return false;\n\n      const nextKey = this.nextVerseKey();\n      if (!nextKey) return false;\n\n      this.jumpToVerse(nextKey);\n      return true;\n    }\n\n    this.handlingRangeBoundary = true;\n\n    if (action === 'repeat-ayah') {\n      this.awaitRangeSeek(this.currentVerseStartMs());\n      this.restartCurrentVerse();\n      this.renderRangeState();\n      this.handlingRangeBoundary = false;\n      return true;\n    }\n\n    if (action === 'repeat-range') {\n      this.awaitRangeSeek(this.segmentsData[this.range.from]?.time_from || 0);\n      this.renderRangeState();\n      this.jumpToVerseAndResume(this.range.from)\n        .finally(() => { this.handlingRangeBoundary = false; });\n      return true;\n    }\n\n    this.rangeRepeatCounter = 0;\n    this.rangeFinished = true;\n    this.rangeSeek = null;\n    this.player.pause();\n    this.stopProgressLoop();\n    this.renderRangeState();\n    this.handlingRangeBoundary = false;\n    return true;\n  }\n\n  restartCurrentVerse() {\n    this.player.seek(this.currentVerseStartMs() / 1000);\n\n    if (!this.player.playing()) {\n      this.player.play();\n    }\n\n    this.startProgressLoop();\n  }\n\n  currentVerseStartMs() {\n    return this.segmentsData[this.currentVerseKey]?.time_from || 0;\n  }\n\n  currentVerseEndMs() {\n    return this.segmentsData[this.currentVerseKey]?.time_to || (this.player.duration() * 1000);\n  }\n\n  isPlayerReadyForVerse(verseKey) {\n    return Boolean(this.player && verseKey);\n  }\n\n  togglePlay() {\n    if (!this.player) {\n      this.initializePlayer();\n    }\n\n    if (this.isPlaying) {\n      this.player.pause();\n      this.stopProgressLoop();\n    } else if (this.rangeFinished) {\n      this.rangeFinished = false;\n      this.ayahRepeatCounter = 0;\n      this.rangeRepeatCounter = 0;\n      this.awaitRangeSeek(this.segmentsData[this.range.from]?.time_from || 0);\n      this.renderRangeState();\n      this.jumpToVerseAndResume(this.range.from);\n    } else {\n      if (this.seekOnNextPlay || !this.isPlayerReadyForVerse(this.currentVerseKey)) {\n        this.playAyah(this.currentVerseKey);\n        this.seekOnNextPlay = false;\n      }\n\n      this.player.play();\n      this.startProgressLoop();\n    }\n  }\n\n  formatTime(seconds) {\n    const total = Math.max(0, Math.floor(seconds || 0));\n    const h = Math.floor(total / 3600);\n    const m = Math.floor((total % 3600) / 60);\n    const s = total % 60;\n    const pad = (value) => (value < 10 ? `0${value}` : `${value}`);\n\n    // Gapless surah audio runs for hours, so hh:mm:ss is clearer than 136:00.\n    return h > 0 ? `${h}:${pad(m)}:${pad(s)}` : `${m}:${pad(s)}`;\n  }\n}\n", "// First ayah id of all surahs\nconst FIRST_AYAH = [\n  1, 8, 294, 494, 670, 790, 955, 1161, 1236, 1365, 1474, 1597, 1708, 1751, 1803,\n  1902, 2030, 2141, 2251, 2349, 2484, 2596, 2674, 2792, 2856, 2933, 3160, 3253,\n  3341, 3410, 3470, 3504, 3534, 3607, 3661, 3706, 3789, 3971, 4059, 4134, 4219,\n  4273, 4326, 4415, 4474, 4511, 4546, 4584, 4613, 4631, 4676, 4736, 4785, 4847,\n  4902, 4980, 5076, 5105, 5127, 5151, 5164, 5178, 5189, 5200, 5218, 5230, 5242,\n  5272, 5324, 5376, 5420, 5448, 5476, 5496, 5552, 5592, 5623, 5673, 5713, 5759,\n  5801, 5830, 5849, 5885, 5910, 5932, 5949, 5968, 5994, 6024, 6044, 6059, 6080,\n  6091, 6099, 6107, 6126, 6131, 6139, 6147, 6158, 6169, 6177, 6180, 6189, 6194,\n  6198, 6205, 6208, 6214, 6217, 6222, 6226, 6231, 6236\n];\n\nexport class QuranUtils {\n  static getSurahAyahRange(surah) {\n    surah = parseInt(surah, 10);\n    if (surah < 1 || surah > 114) return [];\n    return [FIRST_AYAH[surah - 1], FIRST_AYAH[surah] - 1];\n  }\n\n  static firstAyahOfSurah(verseId) {\n    return FIRST_AYAH.includes(verseId);\n  }\n\n  static lastAyahOfSurah(ayahKeyOrId) {\n    const key = ayahKeyOrId.toString().includes(':') ? ayahKeyOrId : this.getAyahKeyFromId(ayahKeyOrId);\n    const [surahNumber, ayahNumber] = key.split(':').map(Number);\n    return ayahNumber === this.getSurahAyahCount(surahNumber);\n  }\n\n  static getSurahNumberFromVerseId(verseId) {\n    for (let i = 0; i < FIRST_AYAH.length - 1; i++) {\n      if (verseId >= FIRST_AYAH[i] && verseId < FIRST_AYAH[i + 1]) return i + 1;\n    }\n    return 114; // last surah\n  }\n\n  static getSurahNumberFromVerseKey(key) {\n     return parseInt(key.split(':')[0])\n  }\n  static getAyahNumberFromVerseKey(key) {\n    return parseInt(key.split(':')[1])\n  }\n\n  static getAyahKeyFromId(verseId) {\n    if (verseId == null) return null;\n    const surah = this.getSurahNumberFromVerseId(verseId);\n    const ayah = verseId - FIRST_AYAH[surah - 1] + 1;\n    return `${surah}:${ayah}`;\n  }\n\n  static getAyahIdFromKey(key) {\n    if (!key) return null;\n    const [surah, ayah] = key.split(':').map(Number);\n    return this.getAyahId(surah, ayah);\n  }\n\n  static getAyahId(surah, ayah) {\n    return this.validAyah(surah, ayah) ? FIRST_AYAH[surah - 1] + ayah - 1 : null;\n  }\n\n  static getAyahKey(surah, ayah) {\n    return `${surah}:${ayah}`;\n  }\n\n  static validAyah(surah, ayah) {\n    return ayah > 0 && surah > 0 && surah < FIRST_AYAH.length && ayah <= this.getSurahAyahCount(surah);\n  }\n\n  static validRange(surah, from, to) {\n    surah = parseInt(surah);\n    from = parseInt(from);\n    to = parseInt(to);\n    return surah >= 1 && surah <= 114 && this.validAyah(surah, from) && (to === 0 || this.validAyah(surah, to));\n  }\n\n  static getSurahAyahCount(surah) {\n    if (surah < 1 || surah >= FIRST_AYAH.length) return null;\n    return FIRST_AYAH[surah] - FIRST_AYAH[surah - 1];\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\nimport { getAyahModalPrefs, setAyahModalPrefs } from \"../lib/ayah_modal_store\";\n\nexport default class extends Controller {\n  static targets = [\"panel\", \"backdrop\", \"form\"];\n\n  connect() {\n    const prefs = getAyahModalPrefs();\n    if (prefs.tafsirPanelOpen) {\n      this.backdropTarget.classList.remove(\"hidden\");\n      this.backdropTarget.classList.add(\"block\");\n      this.panelTarget.classList.remove(\"hidden\");\n      this.panelTarget.classList.add(\"flex\");\n    }\n    if (prefs.tafsirIds && prefs.tafsirIds.length) {\n      const current = this.currentTafsirIds();\n      const desired = prefs.tafsirIds.map((x) => parseInt(x, 10)).filter((x) => Number.isInteger(x));\n      if (!this.sameIds(current, desired)) {\n        this.setTafsirIds(desired);\n        if (this.formTarget) this.formTarget.requestSubmit();\n      }\n    }\n  }\n\n  open(e) {\n    e.preventDefault();\n    setAyahModalPrefs({ tafsirPanelOpen: true });\n    this.backdropTarget.classList.remove(\"hidden\");\n    this.backdropTarget.classList.add(\"block\");\n    this.panelTarget.classList.remove(\"hidden\");\n    this.panelTarget.classList.add(\"flex\");\n  }\n\n  close(e) {\n    e.preventDefault();\n    setAyahModalPrefs({ tafsirPanelOpen: false });\n    this.panelTarget.classList.add(\"hidden\");\n    this.panelTarget.classList.remove(\"flex\");\n    this.backdropTarget.classList.add(\"hidden\");\n    this.backdropTarget.classList.remove(\"block\");\n  }\n\n  change() {\n    const ids = this.currentTafsirIds();\n    setAyahModalPrefs({ tafsirIds: ids });\n    if (this.formTarget) this.formTarget.requestSubmit();\n  }\n\n  currentTafsirIds() {\n    if (!this.formTarget) return [];\n    const inputs = this.formTarget.querySelectorAll('input[name=\"tafsir_ids[]\"]:checked');\n    return Array.from(inputs).map((i) => parseInt(i.value, 10)).filter((x) => Number.isInteger(x));\n  }\n\n  setTafsirIds(ids) {\n    if (!this.formTarget) return;\n    const set = new Set(ids.map((x) => x.toString()));\n    const inputs = this.formTarget.querySelectorAll('input[name=\"tafsir_ids[]\"]');\n    inputs.forEach((i) => {\n      i.checked = set.has(i.value);\n    });\n    setAyahModalPrefs({ tafsirIds: ids });\n  }\n\n  sameIds(a, b) {\n    const as = [...new Set(a)].sort((x, y) => x - y);\n    const bs = [...new Set(b)].sort((x, y) => x - y);\n    if (as.length !== bs.length) return false;\n    for (let i = 0; i < as.length; i++) {\n      if (as[i] !== bs[i]) return false;\n    }\n    return true;\n  }\n}\n\n\n", "import { Controller } from \"@hotwired/stimulus\";\nimport { getAyahModalPrefs, setAyahModalPrefs } from \"../lib/ayah_modal_store\";\n\nexport default class extends Controller {\n  static targets = [\n    \"panel\",\n    \"backdrop\",\n    \"form\",\n    \"search\",\n    \"translationList\",\n    \"chevron\",\n    \"groupContent\",\n  ];\n\n  connect() {\n    const prefs = getAyahModalPrefs();\n    if (prefs.translationPanelOpen) {\n      this.backdropTarget.classList.remove(\"hidden\");\n      this.backdropTarget.classList.add(\"block\");\n      this.panelTarget.classList.remove(\"hidden\");\n      this.panelTarget.classList.add(\"flex\");\n    }\n    if (prefs.translationIds && prefs.translationIds.length) {\n      const current = this.currentTranslationIds();\n      const desired = prefs.translationIds\n        .map((x) => parseInt(x, 10))\n        .filter((x) => Number.isInteger(x));\n      if (!this.sameIds(current, desired)) {\n        this.setTranslationIds(desired);\n        if (this.formTarget) this.formTarget.requestSubmit();\n      }\n    }\n  }\n\n  open(e) {\n    e.preventDefault();\n    setAyahModalPrefs({ translationPanelOpen: true });\n    this.backdropTarget.classList.remove(\"hidden\");\n    this.backdropTarget.classList.add(\"block\");\n    this.panelTarget.classList.remove(\"hidden\");\n    this.panelTarget.classList.add(\"flex\");\n  }\n\n  close(e) {\n    e.preventDefault();\n    setAyahModalPrefs({ translationPanelOpen: false });\n    this.panelTarget.classList.add(\"hidden\");\n    this.panelTarget.classList.remove(\"flex\");\n    this.backdropTarget.classList.add(\"hidden\");\n    this.backdropTarget.classList.remove(\"block\");\n    // Submit form when closing to save translation selections\n    if (this.formTarget) this.formTarget.requestSubmit();\n  }\n\n  change() {\n    const ids = this.currentTranslationIds();\n    setAyahModalPrefs({ translationIds: ids });\n    // Removed form submission to prevent dropdown collapse during selection\n  }\n\n  currentTranslationIds() {\n    if (!this.formTarget) return [];\n    const inputs = this.formTarget.querySelectorAll(\n      'input[name=\"translation_ids[]\"]:checked',\n    );\n    return Array.from(inputs)\n      .map((i) => parseInt(i.value, 10))\n      .filter((x) => Number.isInteger(x));\n  }\n\n  setTranslationIds(ids) {\n    if (!this.formTarget) return;\n    const set = new Set(ids.map((x) => x.toString()));\n    const inputs = this.formTarget.querySelectorAll(\n      'input[name=\"translation_ids[]\"]',\n    );\n    inputs.forEach((i) => {\n      i.checked = set.has(i.value);\n    });\n    setAyahModalPrefs({ translationIds: ids });\n  }\n\n  sameIds(a, b) {\n    const as = [...new Set(a)].sort((x, y) => x - y);\n    const bs = [...new Set(b)].sort((x, y) => x - y);\n    if (as.length !== bs.length) return false;\n    for (let i = 0; i < as.length; i++) {\n      if (as[i] !== bs[i]) return false;\n    }\n    return true;\n  }\n\n  search() {\n    const query = this.searchTarget.value.toLowerCase();\n    const items =\n      this.translationListTarget.querySelectorAll(\".translation-item\");\n    const groups =\n      this.translationListTarget.querySelectorAll(\".translation-group\");\n\n    if (query === \"\") {\n      // Show all items and groups when search is empty\n      items.forEach((item) => (item.style.display = \"\"));\n      groups.forEach((group) => (group.style.display = \"\"));\n      return;\n    }\n\n    // Find groups that match the search query (language names)\n    const matchingGroups = [];\n    groups.forEach((group) => {\n      const language = group.dataset.language;\n      if (language && language.includes(query)) {\n        matchingGroups.push(group);\n      }\n    });\n\n    // If any groups match the query (language search), show all items in those groups\n    if (matchingGroups.length > 0) {\n      items.forEach((item) => {\n        const parentGroup = item.closest(\".translation-group\");\n        const isInMatchingGroup = matchingGroups.includes(parentGroup);\n        item.style.display = isInMatchingGroup ? \"\" : \"none\";\n      });\n\n      groups.forEach((group) => {\n        const isMatching = matchingGroups.includes(group);\n        group.style.display = isMatching ? \"\" : \"none\";\n\n        // Expand matching groups\n        if (isMatching) {\n          const groupContent = group.querySelector(\n            '[data-ayah-translation-selector-target=\"groupContent\"]',\n          );\n          if (groupContent) {\n            groupContent.classList.remove(\"hidden\");\n            const chevron = group.querySelector(\n              '[data-ayah-translation-selector-target=\"chevron\"]',\n            );\n            if (chevron) chevron.style.transform = \"rotate(180deg)\";\n          }\n        }\n      });\n    } else {\n      // No groups match, filter individual items by name\n      items.forEach((item) => {\n        const name = item.dataset.name;\n        const matches = name.includes(query);\n        item.style.display = matches ? \"\" : \"none\";\n      });\n\n      // Hide groups that have no visible items\n      groups.forEach((group) => {\n        const visibleItems = group.querySelectorAll(\n          '.translation-item[style=\"\"], .translation-item:not([style*=\"none\"])',\n        );\n        group.style.display = visibleItems.length > 0 ? \"\" : \"none\";\n\n        // If group is visible and has matching items, expand it\n        if (visibleItems.length > 0) {\n          const groupContent = group.querySelector(\n            '[data-ayah-translation-selector-target=\"groupContent\"]',\n          );\n          if (groupContent) {\n            groupContent.classList.remove(\"hidden\");\n            const chevron = group.querySelector(\n              '[data-ayah-translation-selector-target=\"chevron\"]',\n            );\n            if (chevron) chevron.style.transform = \"rotate(180deg)\";\n          }\n        }\n      });\n    }\n  }\n\n  toggleGroup(event) {\n    const button = event.currentTarget;\n    const group = button.dataset.group;\n    const content = this.groupContentTargets.find(\n      (target) => target.dataset.group === group,\n    );\n    const chevron = this.chevronTargets.find(\n      (target) => target.dataset.group === group,\n    );\n\n    if (content) {\n      content.classList.toggle(\"hidden\");\n    }\n\n    if (chevron) {\n      const isExpanded = !content.classList.contains(\"hidden\");\n      chevron.style.transform = isExpanded ? \"rotate(180deg)\" : \"rotate(0deg)\";\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\nimport { getAyahModalPrefs, setAyahModalPrefs } from \"../lib/ayah_modal_store\";\n\nexport default class extends Controller {\n  static targets = [\"panel\", \"backdrop\", \"form\"];\n\n  connect() {\n    const prefs = getAyahModalPrefs();\n    if (prefs.transliterationPanelOpen) {\n      this.backdropTarget.classList.remove(\"hidden\");\n      this.backdropTarget.classList.add(\"block\");\n      this.panelTarget.classList.remove(\"hidden\");\n      this.panelTarget.classList.add(\"flex\");\n    }\n    if (Number.isInteger(prefs.transliterationId)) {\n      const current = this.currentTransliterationId();\n      if (current !== prefs.transliterationId) {\n        this.setTransliterationId(prefs.transliterationId);\n        if (this.formTarget) this.formTarget.requestSubmit();\n      }\n    }\n  }\n\n  open(e) {\n    e.preventDefault();\n    setAyahModalPrefs({ transliterationPanelOpen: true });\n    this.backdropTarget.classList.remove(\"hidden\");\n    this.backdropTarget.classList.add(\"block\");\n    this.panelTarget.classList.remove(\"hidden\");\n    this.panelTarget.classList.add(\"flex\");\n  }\n\n  close(e) {\n    e.preventDefault();\n    setAyahModalPrefs({ transliterationPanelOpen: false });\n    this.panelTarget.classList.add(\"hidden\");\n    this.panelTarget.classList.remove(\"flex\");\n    this.backdropTarget.classList.add(\"hidden\");\n    this.backdropTarget.classList.remove(\"block\");\n  }\n\n  change() {\n    const id = this.currentTransliterationId();\n    if (Number.isInteger(id)) setAyahModalPrefs({ transliterationId: id });\n    if (this.formTarget) this.formTarget.requestSubmit();\n  }\n\n  currentTransliterationId() {\n    if (!this.formTarget) return null;\n    const input = this.formTarget.querySelector('input[name=\"transliteration_id\"]:checked');\n    if (!input) return null;\n    const v = parseInt(input.value, 10);\n    return Number.isInteger(v) ? v : null;\n  }\n\n  setTransliterationId(id) {\n    if (!this.formTarget) return;\n    const inputs = this.formTarget.querySelectorAll('input[name=\"transliteration_id\"]');\n    inputs.forEach((i) => {\n      i.checked = parseInt(i.value, 10) === id;\n    });\n    setAyahModalPrefs({ transliterationId: id });\n  }\n}\n\n\n", "import { Controller } from \"@hotwired/stimulus\";\nimport { getAyahModalPrefs, setAyahModalPrefs } from \"../lib/ayah_modal_store\";\n\nexport default class extends Controller {\n  static targets = [\"panel\", \"backdrop\", \"form\"];\n\n  connect() {\n    const prefs = getAyahModalPrefs();\n    if (prefs.wordTranslationPanelOpen) {\n      this.backdropTarget.classList.remove(\"hidden\");\n      this.backdropTarget.classList.add(\"block\");\n      this.panelTarget.classList.remove(\"hidden\");\n      this.panelTarget.classList.add(\"flex\");\n    }\n    if (Number.isInteger(prefs.wordTranslationId)) {\n      const current = this.currentWordTranslationId();\n      if (current !== prefs.wordTranslationId) {\n        this.setWordTranslationId(prefs.wordTranslationId);\n        if (this.formTarget) this.formTarget.requestSubmit();\n      }\n    }\n  }\n\n  open(e) {\n    e.preventDefault();\n    setAyahModalPrefs({ wordTranslationPanelOpen: true });\n    this.backdropTarget.classList.remove(\"hidden\");\n    this.backdropTarget.classList.add(\"block\");\n    this.panelTarget.classList.remove(\"hidden\");\n    this.panelTarget.classList.add(\"flex\");\n  }\n\n  close(e) {\n    e.preventDefault();\n    setAyahModalPrefs({ wordTranslationPanelOpen: false });\n    this.panelTarget.classList.add(\"hidden\");\n    this.panelTarget.classList.remove(\"flex\");\n    this.backdropTarget.classList.add(\"hidden\");\n    this.backdropTarget.classList.remove(\"block\");\n  }\n\n  change() {\n    const id = this.currentWordTranslationId();\n    if (Number.isInteger(id)) setAyahModalPrefs({ wordTranslationId: id });\n    if (this.formTarget) this.formTarget.requestSubmit();\n  }\n\n  currentWordTranslationId() {\n    if (!this.formTarget) return null;\n    const input = this.formTarget.querySelector('input[name=\"word_translation_id\"]:checked');\n    if (!input) return null;\n    const v = parseInt(input.value, 10);\n    return Number.isInteger(v) ? v : null;\n  }\n\n  setWordTranslationId(id) {\n    if (!this.formTarget) return;\n    const inputs = this.formTarget.querySelectorAll('input[name=\"word_translation_id\"]');\n    inputs.forEach((i) => {\n      i.checked = parseInt(i.value, 10) === id;\n    });\n    setAyahModalPrefs({ wordTranslationId: id });\n  }\n}\n\n\n", "import {Controller} from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  connect() {\n    this.el = $(this.element)\n    this.chapterSelect = this.el.find(\"#chapter-select\");\n    this.verseSelect = this.el.find(\"#verse-select\");\n\n    if(this.verseSelect.length > 0)\n      this.chapterSelect.on(\"change\", this.updateVerseOptions.bind(this));\n  }\n\n  updateVerseOptions(event) {\n    const selectedOption = this.chapterSelect.find(\":selected\");\n    const versesCount = selectedOption.data(\"verses\") || 286;\n    this.clearVerseOptions();\n\n    for (let i = 1; i <= versesCount; i++) {\n      const option = document.createElement(\"option\");\n      option.value = i;\n      option.text = i;\n      this.verseSelect.append(option);\n    }\n  }\n\n  clearVerseOptions() {\n    this.verseSelect.find('option[value!=\"\"]').remove()\n  }\n}\n", "// Visit The Stimulus Handbook for more details\n// https://stimulusjs.org/handbook/introduction\n//\n// This example controller works with specially annotated HTML like:\n//\n// <div data-controller=\"hello\">\n//   <h1 data-target=\"hello.output\"></h1>\n// </div>\n\nimport { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  static targets = [\"input\", \"output\", \"preview\"]\n\n  connect() {\n    const el = $(this.element);\n    const fontSwitcher = el.find('select#change_font')\n    this.el = el;\n\n    if(fontSwitcher.length >0){\n      fontSwitcher.on('change', this.changeFont.bind(this))\n      fontSwitcher.trigger('change')\n    }\n\n    el.find('.font-size-slider').on('change', (event) => {\n        const fontSize = event.target.value;\n\n        el.find('.char').css('font-size', `${fontSize}px`)\n        el.find('.preview-text').css('font-size', `${fontSize}px`)\n\n      el.find('#font-size').html(`${fontSize}px`)\n    })\n\n    el.find('#toggle-issues').on('click', (event) => {\n      el.find('.toggle').toggleClass('hidden')\n    })\n  }\n\n  disconnect() {}\n\n  changeFont(e){\n    const font = e.target.value;\n    const char = this.el.find('.char');\n    const txt = this.el.find('#text');\n\n    char.removeClass();\n    char.addClass(font).addClass('char')\n\n    txt.removeClass()\n    txt.addClass(font).addClass('w-full p-4 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent text')\n  }\n  showPreview(event) {\n    event.preventDefault()\n    if (!this.hasInputTarget || !this.hasOutputTarget) {\n      return\n    }\n\n    const inputText = this.inputTarget.value.trim()\n\n    if (!inputText) {\n      alert('Please enter some Quranic text to preview across all fonts')\n      return\n    }\n\n    this.previewTargets.forEach(previewElement => {\n      previewElement.textContent = inputText\n    })\n\n    this.outputTarget.classList.remove('hidden')\n\n    setTimeout(() => {\n      this.outputTarget.scrollIntoView({ behavior: 'smooth', block: 'start' })\n    }, 100)\n  }\n\n  hidePreview(event) {\n    event.preventDefault()\n\n    if (this.hasOutputTarget) {\n      this.outputTarget.classList.add('hidden')\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"source\"]\n\n  copy() {\n    const text = this.sourceTarget.textContent\n    navigator.clipboard.writeText(text).then(() => {\n      this.element.querySelectorAll(\"[data-clipboard-label]\").forEach((label) => {\n        const original = label.textContent\n        label.textContent = \"Copied!\"\n        setTimeout(() => { label.textContent = original }, 1200)\n      })\n    })\n  }\n}\n", "import {Controller} from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  static values = {\n    toggle: { type: Boolean, default: true },\n    target: String\n  }\n\n  connect() {\n    if (this.hasTargetValue) {\n      const targetElement = document.querySelector(this.targetValue);\n      if (targetElement && targetElement.classList.contains('collapse')) {\n        this.isTrigger = true;\n        this.targetElement = targetElement;\n        const targetHasHidden = targetElement.classList.contains('hidden');\n        const targetHasShow = targetElement.classList.contains('show');\n        const targetHasActive = targetElement.classList.contains('active');\n        const targetIsOpen = targetHasShow || targetHasActive || !targetHasHidden;\n        this.updateTriggerState(targetIsOpen);\n        return;\n      }\n    }\n    \n    const hasMdFlex = this.element.classList.contains('md:flex');\n    const isMobile = window.innerWidth < 768;\n    \n    if (hasMdFlex) {\n      if (!isMobile) {\n        const computedStyle = window.getComputedStyle(this.element);\n        if (computedStyle.display === 'none') {\n          this.element.style.display = '';\n        }\n        this.isOpen = true;\n        return;\n      } else {\n        if (!this.element.classList.contains('show') && !this.element.classList.contains('active')) {\n          if (!this.element.classList.contains('hidden')) {\n            this.element.classList.add('hidden');\n          }\n          this.isOpen = false;\n        } else {\n          if (this.element.classList.contains('hidden')) {\n            this.element.classList.remove('hidden');\n          }\n          this.isOpen = true;\n        }\n      }\n    } else {\n      const hasShow = this.element.classList.contains('show');\n      const hasActive = this.element.classList.contains('active');\n      this.isOpen = hasShow || hasActive || !this.element.classList.contains('collapse');\n      \n      if (!this.isOpen) {\n        this.element.classList.add('hidden');\n        this.element.style.maxHeight = '0';\n      } else {\n        this.element.classList.remove('hidden');\n        this.element.style.maxHeight = '';\n      }\n    }\n    \n    this.element.classList.add('transition-all', 'duration-300', 'ease-in-out', 'overflow-hidden');\n    \n    setTimeout(() => {\n      this.setupTriggers();\n    }, 0);\n  }\n\n  disconnect() {\n    if (this.resizeHandler) {\n      window.removeEventListener('resize', this.resizeHandler);\n    }\n    // Remove event listeners from triggers\n    if (this.triggerClickHandlers) {\n      this.triggerClickHandlers.forEach(({ trigger, handler }) => {\n        trigger.removeEventListener('click', handler);\n      });\n    }\n  }\n\n  setupTriggers() {\n    // Find triggers by data-bs-target or aria-controls\n    const targetId = this.element.id;\n    if (!targetId) {\n      return;\n    }\n    \n    // Find triggers with data-bs-target pointing to this element (with or without #)\n    const bsTargetTriggers = document.querySelectorAll(`[data-bs-target=\"#${targetId}\"], [data-bs-target=\"${targetId}\"]`);\n    \n    // Find triggers with aria-controls pointing to this element\n    const ariaTriggers = document.querySelectorAll(`[aria-controls=\"${targetId}\"]`);\n    \n    // Combine all triggers and remove duplicates\n    const allTriggers = Array.from(new Set([...bsTargetTriggers, ...ariaTriggers]));\n    \n    // Store handlers for cleanup\n    this.triggerClickHandlers = [];\n    \n    allTriggers.forEach(trigger => {\n      // Check if trigger has data-bs-toggle=\"collapse\" or points to this element\n      const hasBsToggle = trigger.getAttribute('data-bs-toggle') === 'collapse';\n      const triggerTarget = trigger.getAttribute('data-bs-target');\n      const triggerAriaControls = trigger.getAttribute('aria-controls');\n      const pointsToThis = triggerTarget === `#${targetId}` || triggerTarget === targetId || triggerAriaControls === targetId;\n      \n      // Attach handler if trigger has data-bs-toggle=\"collapse\" and points to this element\n      if (hasBsToggle && pointsToThis) {\n        const handler = (e) => {\n          e.preventDefault();\n          e.stopPropagation();\n          this.toggle();\n        };\n        \n        trigger.addEventListener('click', handler);\n        this.triggerClickHandlers.push({ trigger, handler });\n      }\n    });\n    \n    // Update initial trigger states\n    this.updateTriggers();\n    \n    const hasMdFlex = this.element.classList.contains('md:flex');\n    if (hasMdFlex) {\n      this.resizeHandler = () => {\n        const isMobile = window.innerWidth < 768;\n        if (!isMobile) {\n          const computedStyle = window.getComputedStyle(this.element);\n          if (computedStyle.display === 'none') {\n            this.element.style.display = '';\n          }\n          if (this.element.classList.contains('hidden')) {\n            this.element.classList.remove('hidden');\n          }\n          this.isOpen = true;\n        } else {\n          if (!this.isOpen) {\n            if (!this.element.classList.contains('hidden')) {\n              this.element.classList.add('hidden');\n            }\n          } else {\n            if (this.element.classList.contains('hidden')) {\n              this.element.classList.remove('hidden');\n            }\n          }\n        }\n      };\n      window.addEventListener('resize', this.resizeHandler);\n    }\n  }\n\n  toggle(event) {\n    if (event) {\n      event.preventDefault();\n      event.stopPropagation();\n    }\n    \n    if (this.isTrigger && this.targetElement) {\n      const targetHasHidden = this.targetElement.classList.contains('hidden');\n      const targetHasShow = this.targetElement.classList.contains('show');\n      const targetHasActive = this.targetElement.classList.contains('active');\n      const targetIsOpen = targetHasShow || targetHasActive || !targetHasHidden;\n      \n      if (targetIsOpen) {\n        this.hideTarget(this.targetElement);\n      } else {\n        this.showTarget(this.targetElement);\n      }\n      return;\n    }\n    \n    const isMobile = window.innerWidth < 768;\n    const hasMdFlex = this.element.classList.contains('md:flex');\n    if (hasMdFlex && !isMobile) {\n      return;\n    }\n    \n    if (this.isOpen) {\n      this.hide();\n    } else {\n      this.show();\n    }\n  }\n  \n  showTarget(targetElement) {\n    targetElement.classList.remove('hidden');\n    targetElement.style.maxHeight = '0';\n    targetElement.style.overflow = 'hidden';\n    \n    requestAnimationFrame(() => {\n      const height = targetElement.scrollHeight;\n      targetElement.style.maxHeight = `${height}px`;\n      \n      setTimeout(() => {\n        targetElement.style.maxHeight = '';\n        targetElement.style.overflow = '';\n        targetElement.classList.add('show', 'active');\n        this.updateTriggerState(true);\n      }, 300);\n    });\n  }\n  \n  hideTarget(targetElement) {\n    const height = targetElement.scrollHeight;\n    targetElement.style.maxHeight = `${height}px`;\n    targetElement.style.overflow = 'hidden';\n    \n    requestAnimationFrame(() => {\n      targetElement.style.maxHeight = '0';\n      \n      setTimeout(() => {\n        targetElement.classList.add('hidden');\n        targetElement.classList.remove('show', 'active');\n        targetElement.style.maxHeight = '';\n        targetElement.style.overflow = '';\n        this.updateTriggerState(false);\n      }, 300);\n    });\n  }\n  \n  updateTriggerState(isOpen) {\n    if (!this.isTrigger) return;\n    \n    if (isOpen) {\n      this.element.setAttribute('aria-expanded', 'true');\n      this.element.classList.remove('collapsed');\n      \n      const revealIcon = this.element.querySelector('.collapsed-reveal');\n      const hiddenIcon = this.element.querySelector('.collapsed-hidden');\n      if (revealIcon) revealIcon.classList.add('hidden');\n      if (hiddenIcon) hiddenIcon.classList.remove('hidden');\n    } else {\n      this.element.setAttribute('aria-expanded', 'false');\n      this.element.classList.add('collapsed');\n      \n      const revealIcon = this.element.querySelector('.collapsed-reveal');\n      const hiddenIcon = this.element.querySelector('.collapsed-hidden');\n      if (revealIcon) revealIcon.classList.remove('hidden');\n      if (hiddenIcon) hiddenIcon.classList.add('hidden');\n    }\n  }\n\n  show() {\n    const isMobile = window.innerWidth < 768;\n    const hasMdFlex = this.element.classList.contains('md:flex');\n    if (hasMdFlex && !isMobile) {\n      return;\n    }\n    \n    if (hasMdFlex) {\n      if (this.element.classList.contains('hidden')) {\n        this.element.classList.remove('hidden');\n      }\n      this.isOpen = true;\n      this.updateTriggers();\n      return;\n    }\n    \n    this.element.classList.remove('hidden');\n    this.element.style.maxHeight = '0';\n    this.element.style.overflow = 'hidden';\n    \n    requestAnimationFrame(() => {\n      const height = this.element.scrollHeight;\n      this.element.style.maxHeight = `${height}px`;\n      \n      setTimeout(() => {\n        this.element.style.maxHeight = '';\n        this.element.style.overflow = '';\n        this.element.classList.add('show', 'active');\n        this.isOpen = true;\n        this.updateTriggers();\n      }, 300);\n    });\n  }\n\n  hide() {\n    const isMobile = window.innerWidth < 768;\n    const hasMdFlex = this.element.classList.contains('md:flex');\n    if (hasMdFlex && !isMobile) {\n      return;\n    }\n    \n    if (hasMdFlex) {\n      if (!this.element.classList.contains('hidden')) {\n        this.element.classList.add('hidden');\n      }\n      this.isOpen = false;\n      this.updateTriggers();\n      return;\n    }\n    \n    const height = this.element.scrollHeight;\n    this.element.style.maxHeight = `${height}px`;\n    this.element.style.overflow = 'hidden';\n    \n    requestAnimationFrame(() => {\n      this.element.style.maxHeight = '0';\n      \n      setTimeout(() => {\n        this.element.classList.add('hidden');\n        this.element.classList.remove('show', 'active');\n        this.element.style.maxHeight = '';\n        this.element.style.overflow = '';\n        this.isOpen = false;\n        this.updateTriggers();\n      }, 300);\n    });\n  }\n\n  updateTriggers() {\n    const targetId = this.element.id;\n    if (!targetId) return;\n    \n    const triggers = document.querySelectorAll(\n      `[data-bs-target=\"#${targetId}\"], [data-bs-target=\"${targetId}\"], [aria-controls=\"${targetId}\"], [data-collapse-target-value=\"#${targetId}\"], [data-collapse-target-value=\"${targetId}\"]`\n    );\n    \n    triggers.forEach(trigger => {\n      if (this.isOpen) {\n        trigger.setAttribute('aria-expanded', 'true');\n        trigger.classList.remove('collapsed');\n        \n        const revealIcon = trigger.querySelector('.collapsed-reveal');\n        const hiddenIcon = trigger.querySelector('.collapsed-hidden');\n        if (revealIcon) revealIcon.classList.add('hidden');\n        if (hiddenIcon) hiddenIcon.classList.remove('hidden');\n      } else {\n        trigger.setAttribute('aria-expanded', 'false');\n        trigger.classList.add('collapsed');\n        \n        const revealIcon = trigger.querySelector('.collapsed-reveal');\n        const hiddenIcon = trigger.querySelector('.collapsed-hidden');\n        if (revealIcon) revealIcon.classList.remove('hidden');\n        if (hiddenIcon) hiddenIcon.classList.add('hidden');\n      }\n    });\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nconst CONFIRM_MESSAGE = \"You have unsaved changes. Are you sure you want to leave??\";\nconst DIRTY_ATTR = 'd-value';\nconst BOOL_FIELDS = ['checkbox', 'radio'];\n\nexport default class extends Controller {\n    dirty = false;\n    isModal = false\n    confirmLeaveMessage = null\n\n    connect() {\n        this.init();\n        this.bindChangeEvents()\n        this.leaveEvent = this.leavingPage.bind(this);\n        this.isModal = this.element.dataset.modal;\n        this.confirmLeaveMessage = this.element.dataset.confirmLeaveMessage;\n\n        window.onbeforeunload = (e) => this.leaveEvent(e);\n        document.addEventListener(\"turbo:before-visit\", this.leaveEvent);\n        //window.addEventListener(\"beforeunload\", this.leaveEvent);\n        this.dirty = 'true' == this.element.dataset.forceSubmit;\n\n        //clear the dirty after submitting the form\n        $(this.element).on(\"dirty:clear\", () => {\n            this.dirty = false\n        })\n\n        if (this.isModal) {\n            let modal = this.element.closest('.modal');\n\n            $(modal).on(\"hide.bs.modal\", (e) => {\n                return this.leavingPage(e);\n            });\n        }\n    }\n\n    disconnect() {\n        document.removeEventListener(\"turbo:before-visit\", this.leaveEvent);\n        window.removeEventListener(\"beforeunload\", this.leaveEvent);\n\n        window.onbeforeunload = null;\n    }\n\n    bindChangeEvents() {\n        $(this.element).on('change', (e) => {\n            let target = e.target;\n\n            if (BOOL_FIELDS.includes(target.type)) {\n                this.dirty = target.getAttribute(\"d-value\") != target.checked.toString();\n            } else\n                this.dirty = target.getAttribute(\"d-value\") != target.value;\n        });\n    }\n\n    /*\n    * Save the initial values of all fields\n    *\n    */\n    init() {\n        this.element.querySelectorAll(\"select,input,textarea\").forEach(input => {\n            input.setAttribute(DIRTY_ATTR, input.value)\n        })\n\n        this.element.querySelectorAll(\"input[type=checkbox], input[type=radio]\").forEach(input => {\n            input.setAttribute(DIRTY_ATTR, input.checked.toString())\n        });\n    }\n\n    leavingPage(event) {\n        const message = this.confirmMessage\n\n        if (this.dirty) {\n            if ([\"turbo:before-visit\", 'hide'].includes(event.type)) {\n                if (!confirm(message)) {\n                    event.stopPropagation();\n                    event.preventDefault()\n                    return false;\n                }\n            } else {\n                event.returnValue = message;//Gecko + IE\n                return message;//Gecko + Webkit, Safari, Chrome etc.\n            }\n        }\n    }\n\n    get confirmMessage() {\n        return this.confirmLeaveMessage || CONFIRM_MESSAGE\n    }\n}", "import { Controller } from \"@hotwired/stimulus\";\nimport copyToClipboard from \"copy-to-clipboard\";\nimport toastr from \"toastr\";\n\ntoastr.options = {\n  closeButton: true,\n  debug: false,\n  newestOnTop: true,\n  progressBar: true,\n  positionClass: \"toast-top-right\",\n  preventDuplicates: true,\n  onclick: null,\n  showDuration: 300,\n  hideDuration: 100,\n  timeOut: 5000,\n  extendedTimeOut: 0,\n  showEasing: \"swing\",\n  hideEasing: \"linear\",\n  showMethod: \"fadeIn\",\n  hideMethod: \"fadeOut\",\n  tapToDismiss: true\n};\n\nexport default class extends Controller {\n  copy = (event) => {\n    const isolate = this.element.dataset.stopPropagation !== undefined;\n\n    if (isolate) {\n      if (event.button !== 0) return;\n      if (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) return;\n      event.preventDefault();\n      event.stopPropagation();\n    }\n\n    const text =\n      this.element.dataset.text ||\n      this.element.textContent.trim();\n\n    copyToClipboard(text);\n\n    const toastMessage = this.element.dataset.toastMessage;\n    if (toastMessage) {\n      toastr.success(toastMessage);\n    } else {\n      this.element.dispatchEvent(\n        new CustomEvent(\"tooltip:update\", {\n          detail: {\n            text: \"Copied\",\n            temporary: true\n          }\n        })\n      );\n    }\n  };\n\n  connect() {\n    this.element.addEventListener(\"click\", this.copy);\n  }\n\n  disconnect() {\n    this.element.removeEventListener(\"click\", this.copy);\n  }\n}\n", "// Visit The Stimulus Handbook for more details\n// https://stimulusjs.org/handbook/introduction\n//\n// This example controller works with specially annotated HTML like:\n//\n// <div data-controller=\"hello\">\n//   <h1 data-target=\"hello.output\"></h1>\n// </div>\n\nimport { Controller } from \"@hotwired/stimulus\"\n//import flatpickr from \"flatpickr\";\n\nexport default class extends Controller {\n  connect() {\n    this.pickerOptions = { disableMobile: true, dateFormat: \"F d, Y\" };\n    const el = $(this.element);\n\n    if (el.data(\"minDate\")) {\n      this.pickerOptions[\"minDate\"] = el.data(\"minDate\");\n    }\n\n    if (el.data(\"maxDate\")) {\n      this.pickerOptions[\"maxDate\"] = el.data(\"maxDate\");\n    }\n\n    if (el.data(\"mode\")) {\n      this.pickerOptions[\"mode\"] = el.data(\"mode\");\n    }\n\n    if ('time' == el.data(\"mode\")) {\n      this.pickerOptions[\"enableTime\"] = true;\n      this.pickerOptions[\"dateFormat\"] = \"h:i K\";\n      this.pickerOptions.time_24hr = false\n    }\n\n    this.picker = flatpickr(this.element, this.pickerOptions);\n  }\n\n  disconnect() {\n    this.picker.destroy();\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n// Listen to a QUL recitation and a QUD delivery side by side before attaching\n// one to the other. Pick a recitation (or search for one), pick a surah, then\n// play either file, or \"Switch\" to carry on from the same moment in the other\n// one: the quickest way to hear whether they are the same recording.\nexport default class extends Controller {\n  static targets = [\n    \"recitation\", \"search\", \"searchResults\", \"surah\",\n    \"qulPlayer\", \"qudPlayer\", \"qulLabel\", \"qudLabel\",\n    \"verdict\", \"status\", \"attachForm\", \"attachId\", \"attachButton\", \"previewLink\"\n  ]\n\n  static values = { dataUrl: String, searchUrl: String, previewUrl: String, chapter: Number, attached: Boolean }\n\n  connect() {\n    this.qul = {}\n    this.qud = {}\n    this.drafts = new Set()\n    if (this.recitationTarget.value) this.load()\n  }\n\n  // ---- picking ------------------------------------------------------------\n\n  async load() {\n    const id = this.recitationTarget.value\n    this.pauseAll()\n    if (!id) {\n      this.qul = {}\n      this.render()\n      return\n    }\n\n    this.setStatus(\"Loading\u2026\")\n    try {\n      const response = await fetch(`${this.dataUrlValue}?recitation_id=${encodeURIComponent(id)}`, {\n        headers: { Accept: \"application/json\" }\n      })\n      const data = await response.json()\n      if (!response.ok) throw new Error(data.error || `HTTP ${response.status}`)\n\n      this.recitation = data.recitation\n      this.qul = data.qul || {}\n      this.qud = data.qud || {}\n      this.drafts = new Set((data.draft_chapters || []).map(String))\n      this.verdict = data.verdict\n      this.setStatus(\"\")\n      this.render()\n    } catch (error) {\n      this.setStatus(`Could not load: ${error.message}`)\n    }\n  }\n\n  search() {\n    clearTimeout(this.timer)\n    this.timer = setTimeout(() => this.runSearch(), 250)\n  }\n\n  async runSearch() {\n    const query = this.searchTarget.value.trim()\n    if (query.length < 2) return\n\n    try {\n      const response = await fetch(`${this.searchUrlValue}?q=${encodeURIComponent(query)}`, {\n        headers: { Accept: \"application/json\" }\n      })\n      if (!response.ok) return\n      const { recitations } = await response.json()\n\n      const group = this.searchResultsTarget\n      group.replaceChildren()\n      ;(recitations || []).forEach((r) => {\n        const option = document.createElement(\"option\")\n        option.value = r.id\n        option.textContent = `#${r.id} ${r.name} \u00B7 ${r.files_count || 0} files`\n        group.appendChild(option)\n      })\n      group.label = recitations?.length ? `Search: \"${query}\"` : `Search: no match for \"${query}\"`\n    } catch (error) {\n      // Leave the list as it was; the search can be retried.\n    }\n  }\n\n  // ---- rendering ----------------------------------------------------------\n\n  render() {\n    this.renderSurahs()\n    this.renderVerdict()\n    this.renderAttach()\n    this.useSurah()\n  }\n\n  renderSurahs() {\n    const current = this.surahTarget.value || String(this.chapterValue || 1)\n    this.surahTarget.replaceChildren()\n    for (let chapter = 1; chapter <= 114; chapter++) {\n      const key = String(chapter)\n      const notes = []\n      if (!this.qul[key]) notes.push(\"no QUL audio\")\n      if (!this.qud[key]) notes.push(\"no QUD audio\")\n      if (!this.drafts.has(key)) notes.push(\"no drafts\")\n      const option = document.createElement(\"option\")\n      option.value = key\n      option.textContent = notes.length ? `${chapter} (${notes.join(\", \")})` : key\n      this.surahTarget.appendChild(option)\n    }\n    this.surahTarget.value = current\n  }\n\n  renderVerdict() {\n    if (!this.hasVerdictTarget) return\n    const v = this.verdict\n    this.verdictTarget.textContent = v && this.recitation ? v.text : \"\"\n    const tone = { same_files: \"text-emerald-700\", same_recording: \"text-emerald-700\", different: \"text-red-700\" }\n    this.verdictTarget.className = `text-xs ${(v && tone[v.kind]) || \"text-gray-500\"}`\n  }\n\n  renderAttach() {\n    if (!this.hasAttachFormTarget) return\n    const r = this.recitation && String(this.recitation.id) === this.recitationTarget.value ? this.recitation : null\n    this.attachFormTarget.hidden = !r || this.attachedValue\n    if (!r) return\n\n    this.attachIdTarget.value = r.id\n    this.attachButtonTarget.value = `Attach drafts to #${r.id} ${r.name}`\n    const warnings = []\n    if (r.qua_key) warnings.push(`It is already mapped to ${r.qua_key}.`)\n    if (r.locked) warnings.push(\"Its segments are locked.\")\n    this.attachFormTarget.dataset.turboConfirm =\n      [`Attach this delivery's drafts to #${r.id} ${r.name}?`, ...warnings].join(\" \")\n  }\n\n  // Point both players at the chosen surah.\n  useSurah() {\n    this.pauseAll()\n    const key = this.surahTarget.value\n    this.setPlayer(this.qulPlayerTarget, this.qulLabelTarget, this.qul[key],\n      this.recitation ? `QUL #${this.recitation.id} ${this.recitation.name}` : \"QUL: pick a recitation\")\n    this.setPlayer(this.qudPlayerTarget, this.qudLabelTarget, this.qud[key], \"QUD delivery (the file it timed)\")\n\n    if (this.hasPreviewLinkTarget) {\n      const url = new URL(this.previewUrlValue, window.location.origin)\n      url.searchParams.set(\"chapter_id\", key)\n      if (this.recitation) url.searchParams.set(\"recitation_id\", this.recitation.id)\n      this.previewLinkTarget.href = url.toString()\n    }\n  }\n\n  setPlayer(player, label, src, title) {\n    label.textContent = src ? title : `${title}: no audio for this surah`\n    if (src) {\n      if (player.getAttribute(\"src\") !== src) player.src = src\n      player.hidden = false\n    } else {\n      player.removeAttribute(\"src\")\n      player.load()\n      player.hidden = true\n    }\n  }\n\n  // ---- playback -----------------------------------------------------------\n\n  // Only one plays at a time: two voices at once tell you little.\n  played(event) {\n    [this.qulPlayerTarget, this.qudPlayerTarget].forEach((p) => {\n      if (p !== event.target) p.pause()\n    })\n  }\n\n  // Carry on in the other file from the same moment.\n  switch() {\n    const [from, to] = this.qudPlayerTarget.paused && !this.qulPlayerTarget.paused\n      ? [this.qulPlayerTarget, this.qudPlayerTarget]\n      : !this.qudPlayerTarget.paused\n        ? [this.qudPlayerTarget, this.qulPlayerTarget]\n        : [this.qulPlayerTarget, this.qudPlayerTarget]\n    if (!to.getAttribute(\"src\")) return\n\n    const at = from.currentTime\n    from.pause()\n    to.currentTime = at\n    to.play()\n  }\n\n  // Jump both to the same point, e.g. to compare where an ayah starts.\n  syncPosition() {\n    const playing = [this.qulPlayerTarget, this.qudPlayerTarget].find((p) => !p.paused) || this.qulPlayerTarget\n    const at = playing.currentTime\n    ;[this.qulPlayerTarget, this.qudPlayerTarget].forEach((p) => {\n      if (p !== playing && p.getAttribute(\"src\")) p.currentTime = at\n    })\n  }\n\n  pauseAll() {\n    [this.qulPlayerTarget, this.qudPlayerTarget].forEach((p) => p.pause())\n  }\n\n  setStatus(text) {\n    if (this.hasStatusTarget) this.statusTarget.textContent = text\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  static targets = [\"code\", \"copyButton\", \"editor\", \"preview\"];\n  static values = {\n    playground: Boolean,\n    language: String\n  };\n\n  connect() {\n    this.initialCode = this.currentCode();\n    this.applyEditorFontFallbacks();\n    if (this.playgroundValue && this.hasEditorTarget && this.hasPreviewTarget) {\n      this.run();\n    }\n  }\n\n  copy(event) {\n    const sourceButton = event?.currentTarget || this.copyButtonTarget;\n    this.copyToClipboard(this.currentCode())\n      .then(() => this.flashButton(sourceButton, \"Copied\"))\n      .catch(() => this.flashButton(sourceButton, \"Copy failed\"));\n  }\n\n  run(event) {\n    event?.preventDefault();\n    if (!this.playgroundValue || !this.hasEditorTarget || !this.hasPreviewTarget) return;\n\n    const language = (this.languageValue || \"javascript\").toLowerCase();\n    if (language !== \"javascript\") {\n      this.previewTarget.srcdoc = this.unsupportedPreview(language);\n      return;\n    }\n\n    const safeCode = this.editorTarget.value.replace(/<\\/script/gi, \"<\\\\/script\");\n    this.previewTarget.srcdoc = this.javascriptPreview(safeCode, this.stylesheetLinksMarkup());\n  }\n\n  reset(event) {\n    event?.preventDefault();\n    if (!this.playgroundValue || !this.hasEditorTarget) return;\n\n    this.editorTarget.value = this.initialCode || \"\";\n    this.run();\n  }\n\n  currentCode() {\n    if (this.hasEditorTarget) return this.editorTarget.value;\n    if (this.hasCodeTarget) return this.codeTarget.textContent || \"\";\n    return \"\";\n  }\n\n  applyEditorFontFallbacks() {\n    if (!this.hasEditorTarget) return;\n\n    // Keep monospace behavior, but add Arabic-capable fallbacks so Quranic glyphs don't render as boxes.\n    this.editorTarget.style.fontFamily = \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', 'Noto Naskh Arabic', 'Amiri Quran', 'Scheherazade New', 'Geeza Pro', 'Arial Unicode MS', monospace\";\n    this.editorTarget.style.fontFeatureSettings = \"\\\"liga\\\" 1, \\\"calt\\\" 1\";\n  }\n\n  flashButton(button, message) {\n    if (!button) return;\n\n    const originalLabel = button.dataset.originalLabel || button.textContent;\n    button.dataset.originalLabel = originalLabel;\n    button.textContent = message;\n\n    if (button._docsCodeTimeout) clearTimeout(button._docsCodeTimeout);\n    button._docsCodeTimeout = setTimeout(() => {\n      button.textContent = originalLabel;\n    }, 1200);\n  }\n\n  copyToClipboard(text) {\n    if (navigator.clipboard?.writeText) {\n      return navigator.clipboard.writeText(text);\n    }\n\n    return new Promise((resolve, reject) => {\n      const element = document.createElement(\"textarea\");\n      element.value = text;\n      element.style.position = \"fixed\";\n      element.style.opacity = \"0\";\n      document.body.appendChild(element);\n      element.select();\n\n      try {\n        document.execCommand(\"copy\");\n        resolve();\n      } catch (error) {\n        reject(error);\n      } finally {\n        element.remove();\n      }\n    });\n  }\n\n  javascriptPreview(code, stylesheetLinksMarkup = \"\") {\n    return `<!doctype html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    ${stylesheetLinksMarkup}\n    <style>\n      @import url(\"https://fonts.googleapis.com/css2?family=Noto+Naskh+Arabic:wght@400;700&family=Amiri+Quran&display=swap\");\n\n      :root {\n        --docs-arabic-font: \"Noto Naskh Arabic\", \"Amiri Quran\", \"Scheherazade New\", \"Geeza Pro\", \"Arial Unicode MS\", serif;\n      }\n\n      body {\n        margin: 0;\n        padding: 16px;\n        font-family: ui-sans-serif, system-ui, -apple-system, sans-serif;\n        color: #0f172a;\n        background: #ffffff;\n      }\n      [dir=\"rtl\"], .docs-arabic {\n        font-family: var(--docs-arabic-font) !important;\n        text-rendering: optimizeLegibility;\n      }\n      .docs-preview-error {\n        margin-top: 12px;\n        border-radius: 8px;\n        border: 1px solid #fecaca;\n        background: #fff1f2;\n        color: #9f1239;\n        padding: 12px;\n        font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n        white-space: pre-wrap;\n      }\n    </style>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script>\n      const showError = (message) => {\n        const error = document.createElement(\"pre\");\n        error.className = \"docs-preview-error\";\n        error.textContent = String(message);\n        document.body.appendChild(error);\n      };\n\n      window.addEventListener(\"error\", (event) => {\n        showError(event.error?.stack || event.message || \"Preview error\");\n      });\n\n      window.addEventListener(\"unhandledrejection\", (event) => {\n        showError(event.reason?.stack || event.reason || \"Unhandled promise rejection\");\n      });\n\n      try {\n        ${code}\n      } catch (error) {\n        showError(error.stack || error.message || error);\n      }\n    </script>\n  </body>\n</html>`;\n  }\n\n  stylesheetLinksMarkup() {\n    const links = Array.from(document.querySelectorAll('link[rel=\"stylesheet\"][href]'))\n      .map((link) => link.getAttribute(\"href\"))\n      .filter(Boolean)\n      .map((href) => `<link rel=\"stylesheet\" href=\"${href}\">`)\n      .join(\"\");\n\n    return links;\n  }\n\n  unsupportedPreview(language) {\n    return `<!doctype html><html><body><p>Preview for \"${language}\" is not supported yet.</p></body></html>`;\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n// Copy buttons on the resource Docs tab. A button inside a `.docs-code`\n// block copies that block's <code> text.\nexport default class extends Controller {\n  async copy(event) {\n    const button = event.currentTarget\n    const code = button.closest(\".docs-code\")?.querySelector(\"code\")\n    if (!code) return\n\n    const copied = await this.copyToClipboard(code.textContent)\n    const original = button.dataset.originalLabel || button.textContent\n    button.dataset.originalLabel = original\n    button.textContent = copied ? \"Copied\" : \"Copy failed\"\n\n    clearTimeout(button._copyTimer)\n    button._copyTimer = setTimeout(() => { button.textContent = original }, 1200)\n  }\n\n  // The Clipboard API also rejects when the page isn't focused, so fall back\n  // to the textarea trick.\n  async copyToClipboard(text) {\n    if (navigator.clipboard?.writeText) {\n      try {\n        await navigator.clipboard.writeText(text)\n        return true\n      } catch (error) {\n        // fall through\n      }\n    }\n\n    const element = document.createElement(\"textarea\")\n    element.value = text\n    element.style.position = \"fixed\"\n    element.style.opacity = \"0\"\n    document.body.appendChild(element)\n    element.select()\n    const copied = document.execCommand(\"copy\")\n    element.remove()\n    return copied\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  connect() {\n    this.pos = { left: 0, top: 0, x: 0, y: 0 };\n    this.element.style.cursor = 'grab';\n    this.isDragging = false;\n\n    this.mouseMoveHandler = this.mouseMoveHandler.bind(this);\n    this.mouseUpHandler = this.mouseUpHandler.bind(this);\n    this.handleClick = this.handleClick.bind(this);\n  }\n\n  mouseDownHandler(event) {\n    if (event.button !== 0) return;\n\n    this.isDragging = false;\n    this.element.style.cursor = 'grabbing';\n    this.element.style.userSelect = 'none';\n\n    this.pos = {\n      left: this.element.scrollLeft,\n      top: this.element.scrollTop,\n      x: event.clientX,\n      y: event.clientY,\n    };\n    this.startX = event.clientX;\n    this.startY = event.clientY;\n\n    document.addEventListener('mousemove', this.mouseMoveHandler);\n    document.addEventListener('mouseup', this.mouseUpHandler);\n    document.addEventListener('click', this.handleClick, true);\n\n    event.preventDefault();\n  }\n\n  mouseMoveHandler(event) {\n    const dx = event.clientX - this.pos.x;\n    const dy = event.clientY - this.pos.y;\n\n    this.element.scrollLeft = this.pos.left - dx;\n    // Pan vertically too when the element actually scrolls that way; for a\n    // purely side-scrolling container this assignment is a no-op.\n    this.element.scrollTop = this.pos.top - dy;\n\n    if (Math.abs(dx) > 5 || Math.abs(dy) > 5) {\n      this.isDragging = true;\n    }\n  }\n\n  handleClick(event) {\n    if (this.isDragging) {\n      event.preventDefault();\n      event.stopPropagation();\n    }\n    document.removeEventListener('click', this.handleClick, true);\n  }\n\n  mouseUpHandler() {\n    this.element.style.cursor = 'grab';\n    this.element.style.removeProperty('user-select');\n\n    document.removeEventListener('mousemove', this.mouseMoveHandler);\n    document.removeEventListener('mouseup', this.mouseUpHandler);\n  }\n\n  disconnect() {\n    document.removeEventListener('mousemove', this.mouseMoveHandler);\n    document.removeEventListener('mouseup', this.mouseUpHandler);\n    document.removeEventListener('click', this.handleClick, true);\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"menu\"]\n  static values = {\n    open: Boolean\n  }\n\n  connect() {\n    this.openValue = false\n    this.setupClickOutside()\n  }\n\n  disconnect() {\n    this.removeClickOutside()\n  }\n\n  toggle(event) {\n    event.preventDefault()\n    event.stopPropagation()\n    this.openValue = !this.openValue\n  }\n\n  openValueChanged() {\n    if (this.openValue) {\n      this.show()\n    } else {\n      this.hide()\n    }\n  }\n\n  show() {\n    this.closeAllOtherDropdowns()\n    if (this.hasMenuTarget) {\n      this.menuTarget.classList.remove('hidden')\n      this.menuTarget.classList.add('block')\n    }\n    this.element.classList.add('relative')\n  }\n\n  closeAllOtherDropdowns() {\n    const allDropdowns = document.querySelectorAll('[data-controller*=\"dropdown\"]')\n    allDropdowns.forEach(dropdownElement => {\n      if (dropdownElement !== this.element) {\n        try {\n          const controller = this.application.getControllerForElementAndIdentifier(dropdownElement, 'dropdown')\n          if (controller && controller.openValue) {\n            controller.openValue = false\n          }\n        } catch (e) {\n        }\n      }\n    })\n  }\n\n  hide() {\n    if (this.hasMenuTarget) {\n      this.menuTarget.classList.add('hidden')\n      this.menuTarget.classList.remove('block')\n    }\n  }\n\n  hideOnClick(event) {\n    if (!this.element.contains(event.target)) {\n      this.openValue = false\n    }\n  }\n\n  setupClickOutside() {\n    this.boundHideOnClick = this.hideOnClick.bind(this)\n    document.addEventListener('click', this.boundHideOnClick)\n  }\n\n  removeClickOutside() {\n    if (this.boundHideOnClick) {\n      document.removeEventListener('click', this.boundHideOnClick)\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  connect() {\n    this.trackEvents()\n  }\n\n  trackEvents() {\n    $(document).on('click', '[data-event]', function () {\n      const $el = $(this)\n      const eventName = $el.data('event')\n      const category = $el.data('event-category') || 'ui_interaction'\n      const label = $el.data('event-label') || $el.text().trim()\n      const value = $el.data('event-value')\n\n      gtag('event', eventName, {\n        event_category: category,\n        event_label: label,\n        ...(value !== undefined && { value: parseInt(value) }),\n      })\n    })\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  static targets = [\"items\", \"toggle\"];\n  static values = {\n    collapsedLines: { type: Number, default: 2 }\n  };\n\n  connect() {\n    this.expanded = false;\n    this.boundMeasure = this.measure.bind(this);\n    window.addEventListener(\"resize\", this.boundMeasure);\n    window.addEventListener(\"load\", this.boundMeasure);\n    this.scheduleMeasure();\n  }\n\n  disconnect() {\n    window.removeEventListener(\"resize\", this.boundMeasure);\n    window.removeEventListener(\"load\", this.boundMeasure);\n  }\n\n  toggle(event) {\n    event.preventDefault();\n    this.expanded = !this.expanded;\n    this.applyState();\n  }\n\n  scheduleMeasure() {\n    requestAnimationFrame(() => this.measure());\n    setTimeout(() => this.measure(), 50);\n    setTimeout(() => this.measure(), 250);\n  }\n\n  measure() {\n    if (!this.hasItemsTarget || !this.hasToggleTarget) return;\n\n    const children = Array.from(this.itemsTarget.children).filter(\n      (element) => !element.classList.contains(\"hidden\")\n    );\n\n    if (children.length === 0) {\n      this.resetCollapsedState();\n      return;\n    }\n\n    const firstChildHeight = children[0].offsetHeight;\n    const computedStyle = window.getComputedStyle(this.itemsTarget);\n    const rowGap = parseFloat(computedStyle.rowGap || computedStyle.gap || \"0\");\n\n    if (!firstChildHeight) {\n      this.resetCollapsedState();\n      return;\n    }\n\n    this.collapsedHeight = (firstChildHeight * this.collapsedLinesValue) + (rowGap * (this.collapsedLinesValue - 1));\n\n    if (this.itemsTarget.scrollHeight <= this.collapsedHeight + 2) {\n      this.resetCollapsedState();\n      return;\n    }\n\n    this.toggleTarget.classList.remove(\"hidden\");\n    this.applyState();\n  }\n\n  applyState() {\n    if (!this.collapsedHeight) return;\n\n    this.itemsTarget.style.overflow = \"hidden\";\n    this.itemsTarget.style.maxHeight = this.expanded ? `${this.itemsTarget.scrollHeight}px` : `${this.collapsedHeight}px`;\n    this.toggleTarget.textContent = this.expanded ? \"Show less\" : \"Show more\";\n    this.toggleTarget.setAttribute(\"aria-expanded\", String(this.expanded));\n  }\n\n  resetCollapsedState() {\n    this.collapsedHeight = null;\n    this.expanded = false;\n    this.itemsTarget.style.maxHeight = \"\";\n    this.itemsTarget.style.overflow = \"\";\n    this.toggleTarget.classList.add(\"hidden\");\n    this.toggleTarget.textContent = \"Show more\";\n    this.toggleTarget.setAttribute(\"aria-expanded\", \"false\");\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  connect() {\n    this.el = $(this.element);\n\n    this.el.on('click', '.question-wrapper', (event) => {\n      event.preventDefault();\n      const item = $(event.target).closest('.item');\n      const isActive = item.hasClass('active');\n\n      item.toggleClass('active');\n      item.find('.answer-wrapper').slideToggle(300);\n\n      if (!isActive) {\n        const id = item.attr('id');\n        if (id) {\n          history.replaceState(null, null, `#${id}`);\n        }\n      }\n    });\n\n    this.focusCurrentQuestion();\n  }\n\n  focusCurrentQuestion() {\n    const hash = window.location.hash;\n    if (hash && hash.startsWith(\"#faq-\")) {\n      const targetItem = $(hash);\n      if (targetItem.length) {\n        const answer = targetItem.find('.answer-wrapper');\n\n        setTimeout(() => {\n          targetItem[0].scrollIntoView({ behavior: 'smooth', block: 'start' });\n          targetItem.addClass('active');\n          answer.slideDown(300);\n        }, 100);\n      }\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"search\", \"surah\", \"statusButton\", \"visibleCount\"]\n\n  connect() {\n    this.el = $(this.element);\n    this.ayahs = this.el.find(\"#ayahs\");\n    this.headers = this.el.find(\"thead th\");\n    this.rows = this.ayahs.find(\"tr\").toArray();\n    this.status = \"diff\";\n\n    this.headers.on(\"click\", this.sortColumn.bind(this));\n    this.el.find(\".group-header\").on(\"click\", this.toggleGroup.bind(this));\n\n    this.applyFilters();\n  }\n\n  setStatus(event) {\n    this.status = event.currentTarget.dataset.status;\n\n    this.statusButtonTargets.forEach((button) => {\n      const active = button.dataset.status === this.status;\n      button.classList.toggle(\"btn-primary\", active);\n      button.classList.toggle(\"btn-outline-info\", !active);\n    });\n\n    this.applyFilters();\n  }\n\n  matchesStatus(status) {\n    if (this.status === \"all\") return true;\n    if (this.status === \"diff\") return status !== \"same\";\n    return this.status === status;\n  }\n\n  // Any filter other than the plain \"All\" view is narrowing. While narrowing,\n  // collapsed groups are forced open so a matching ayah is never hidden behind\n  // its group header.\n  applyFilters() {\n    const search = this.searchTarget.value.trim().toLowerCase();\n    const surah = this.surahTarget.value;\n    const narrowed = this.status !== \"all\" || surah !== \"\" || search !== \"\";\n    let visible = 0;\n\n    this.rows.forEach((row) => {\n      const verseKey = row.firstElementChild.textContent.trim().toLowerCase();\n      const show = this.matchesStatus(row.dataset.status) &&\n        (surah === \"\" || row.dataset.surah === surah) &&\n        (search === \"\" || verseKey.includes(search));\n\n      row.classList.toggle(\"hidden\", !show);\n\n      if (row.classList.contains(\"collapse\")) {\n        row.classList.toggle(\"show\", narrowed && show);\n      }\n\n      if (show) visible += 1;\n    });\n\n    this.visibleCountTarget.textContent = visible;\n  }\n\n  sortColumn(event) {\n    const header = $(event.target);\n    const columnIndex = header.index();\n    const isAscending = header.hasClass(\"asc\");\n\n    this.headers.removeClass(\"asc desc\");\n    header.addClass(isAscending ? \"desc\" : \"asc\");\n\n    const rows = this.ayahs.find(\"tr.group-header\").toArray();\n\n    rows.sort((rowA, rowB) => {\n      let cellA = rowA.cells[columnIndex].textContent.trim();\n      let cellB = rowB.cells[columnIndex].textContent.trim();\n\n      let numA = parseFloat(cellA), numB = parseFloat(cellB);\n      if (!isNaN(numA) && !isNaN(numB)) {\n        cellA = numA;\n        cellB = numB;\n      }\n\n      return isAscending ? (cellA > cellB ? 1 : -1) : (cellA < cellB ? 1 : -1);\n    });\n\n    this.ayahs.append(rows);\n  }\n\n  toggleGroup(event) {\n    if (event.target.closest(\"a, button\")) return;\n\n    const groupClass = $(event.currentTarget).data(\"target\");\n    $(groupClass).toggleClass(\"show\");\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n// Chip filters over cards (the Fix step's ayahs, the Align step's words), plus,\n// where the view has one, a box that narrows the cards to one ayah (\"76\" or\n// \"2:76\"). The chip and the box combine. With paramValue set (\"ayah\"), the box\n// is filled from that URL parameter on load, so a shared link opens on the\n// ayah it names.\nexport default class extends Controller {\n  static targets = [\"card\", \"chip\", \"ayahInput\", \"count\"]\n  static values = { param: String }\n\n  connect() {\n    this.current = \"all\"\n    if (this.hasParamValue && this.paramValue && this.hasAyahInputTarget) {\n      const value = new URLSearchParams(globalThis.location?.search || \"\").get(this.paramValue)\n      if (value) {\n        this.ayahInputTarget.value = value\n        this.apply()\n      }\n    }\n  }\n\n  filter(event) {\n    this.current = event.currentTarget.dataset.filter\n    this.chipTargets.forEach((chip) => {\n      const active = chip.dataset.filter === this.current\n      chip.classList.toggle(\"bg-indigo-600\", active)\n      chip.classList.toggle(\"text-white\", active)\n      chip.classList.toggle(\"bg-gray-100\", !active)\n      chip.classList.toggle(\"text-gray-700\", !active)\n    })\n    this.apply()\n  }\n\n  apply() {\n    const ayah = this.hasAyahInputTarget ? this.ayahInputTarget.value.trim() : \"\"\n    let shown = 0\n    this.cardTargets.forEach((card) => {\n      const keep = this.matches(card, this.current) && this.matchesAyah(card, ayah)\n      card.classList.toggle(\"hidden\", !keep)\n      if (keep) shown++\n    })\n    if (this.hasCountTarget) {\n      this.countTarget.textContent = (this.current === \"all\" && !ayah) ? \"\" : `${shown} shown`\n    }\n  }\n\n  matches(card, value) {\n    if (!value || value === \"all\") return true\n    if (value === \"exact\") return card.dataset.exact === \"true\"\n    return card.dataset[value] === \"true\"\n  }\n\n  // \"76\" matches the ayah number, \"2:76\" the key. Cards without an ayah (the\n  // Align step's word rows) are never narrowed by it.\n  matchesAyah(card, ayah) {\n    if (!ayah || card.dataset.ayahKey === undefined) return true\n    return ayah.includes(\":\") ? card.dataset.ayahKey === ayah : card.dataset.ayahNumber === ayah\n  }\n}\n", "// Visit The Stimulus Handbook for more details\n// https://stimulusjs.org/handbook/introduction\n//\n// This example controller works with specially annotated HTML like:\n//\n// <div data-controller=\"hello\">\n//   <h1 data-target=\"hello.output\"></h1>\n// </div>\n\nimport { Controller } from \"@hotwired/stimulus\";\nimport toastr from \"toastr\";\n\ntoastr.options = {\n  closeButton: true,\n  debug: false,\n  newestOnTop: true,\n  progressBar: true,\n  positionClass: \"toast-top-right\",\n  preventDuplicates: true,\n  onclick: null,\n  showDuration: 300,\n  hideDuration: 100,\n  timeOut: 5000,\n  extendedTimeOut: 0,\n  showEasing: \"swing\",\n  hideEasing: \"linear\",\n  showMethod: \"fadeIn\",\n  hideMethod: \"fadeOut\",\n  tapToDismiss: true\n};\nexport default class extends Controller {\n  connect() {\n    const { flashError, flashNotice } = this.element.dataset;\n\n    flashError && toastr.error(flashError);\n    flashNotice && toastr.success(flashNotice);\n    setTimeout(() => {\n      this.element.remove();\n    }, 1000);\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport * as fontkit from \"fontkit\"\nimport { Buffer } from \"buffer\"\n\nwindow.Buffer = Buffer\n\n// Glyph names that every font carries but nobody wants to browse.\nconst RESERVED_GLYPH_NAMES = [\".notdef\", \".null\", \"nonmarkingreturn\", \"NULL\", \"CR\"]\n\nexport default class extends Controller {\n  static targets = [\n    \"sampleText\", \"sampleTextInput\",\n    \"fontSizeSlider\", \"fontSizeValue\",\n    \"lineHeightSlider\", \"lineHeightValue\",\n    \"glyphsContainer\", \"glyphSearch\", \"glyphZoom\", \"glyphCount\",\n    \"unmappedToggle\", \"emptyToggle\",\n    \"ligaturesTable\", \"ligatureSearch\", \"ligatureSizeSlider\", \"ligatureSizeValue\",\n    \"ligatureCount\", \"ligaturePreview\"\n  ]\n\n  static values = {\n    fontUrl: String,\n    fontFormat: String,\n    fontFace: String,\n    sampleText: String\n  }\n\n  connect() {\n    this.font = null\n    this.glyphs = []\n    this.loadState = \"idle\"\n    this.searchTimer = null\n    this.glyphsRendered = false\n\n    this.setGlyphCellSize(this.hasGlyphZoomTarget ? Number(this.glyphZoomTarget.value) : 120)\n    this.updateLigatureCount()\n    this.loadFont()\n\n    // Opened straight on /ligatures or /glyphs.\n    const openTab = this.element.querySelector('[role=\"tabpanel\"]:not([hidden])')?.dataset.tab\n    if (openTab) this.showTab(openTab)\n  }\n\n  tabShown(event) {\n    this.showTab(event.detail.tab)\n  }\n\n  showTab(tab) {\n    if (tab === \"ligatures\") this.showLigatures()\n    if (tab === \"glyphs\") this.showGlyphs()\n  }\n\n  disconnect() {\n    clearTimeout(this.searchTimer)\n    this.closeGlyphModal()\n  }\n\n  // ---------------------------------------------------------------- font load\n\n  async loadFont() {\n    if (this.loadState !== \"idle\") return this.fontPromise\n    this.loadState = \"loading\"\n\n    this.fontPromise = (async () => {\n      const response = await fetch(this.fontUrlValue)\n      if (!response.ok) throw new Error(`Could not download the font (HTTP ${response.status})`)\n\n      this.font = fontkit.create(Buffer.from(await response.arrayBuffer()))\n      this.glyphs = this.collectGlyphs(this.font)\n      this.loadState = \"loaded\"\n    })()\n\n    this.fontPromise.catch((error) => {\n      console.error(\"font-preview: failed to load font\", error)\n      this.loadState = \"error\"\n      this.loadError = error\n    })\n\n    return this.fontPromise\n  }\n\n  // Walks every glyph in the font, not only the ones reachable from cmap, so\n  // ligature-only glyphs (Surah name fonts, QCF word glyphs) show up too.\n  collectGlyphs(font) {\n    const codePointsByGlyph = new Map()\n    font.characterSet.forEach((codePoint) => {\n      const glyph = font.glyphForCodePoint(codePoint)\n      if (!glyph) return\n      if (!codePointsByGlyph.has(glyph.id)) codePointsByGlyph.set(glyph.id, [])\n      codePointsByGlyph.get(glyph.id).push(codePoint)\n    })\n\n    const glyphs = []\n    for (let id = 0; id < font.numGlyphs; id++) {\n      let glyph\n      try {\n        glyph = font.getGlyph(id)\n      } catch (error) {\n        continue\n      }\n      if (!glyph) continue\n\n      const name = glyph.name || \"\"\n      if (RESERVED_GLYPH_NAMES.includes(name)) continue\n\n      const codePoints = (codePointsByGlyph.get(id) || []).sort((a, b) => a - b)\n      // QCF page fonts map each word glyph from both an ASCII byte and its real\n      // Arabic codepoint. The Arabic one is what a reader is looking for.\n      const primary = codePoints.find((cp) => cp >= 0x0600) ?? codePoints[0]\n      const char = primary === undefined ? \"\" : String.fromCodePoint(primary)\n      const hex = primary === undefined ? null : this.toHex(primary)\n\n      glyphs.push({\n        id,\n        glyph,\n        empty: !this.glyphBox(glyph),\n        name,\n        char,\n        hex,\n        codePoints,\n        // Several codepoints often share one glyph, so every one of them has to\n        // be searchable, not just the first.\n        primary,\n        haystack: [name, `#${id}`, char]\n          .concat(codePoints.flatMap((cp) => [`u+${this.toHex(cp)}`, this.toHex(cp)]))\n          .join(\" \")\n          .toLowerCase()\n      })\n    }\n\n    // Codepoint order reads like a character map; unmapped glyphs go last.\n    return glyphs.sort((a, b) => {\n      const aKey = a.primary ?? Infinity\n      const bKey = b.primary ?? Infinity\n      return aKey - bKey || a.id - b.id\n    })\n  }\n\n  toHex(codePoint) {\n    return codePoint.toString(16).toUpperCase().padStart(4, \"0\")\n  }\n\n  // ------------------------------------------------------------ live preview\n\n  updateSampleText(event) {\n    if (this.hasSampleTextTarget) this.sampleTextTarget.textContent = event.target.value\n  }\n\n  updateFontSize(event) {\n    const size = `${event.target.value}px`\n    if (this.hasSampleTextTarget) this.sampleTextTarget.style.fontSize = size\n    if (this.hasFontSizeValueTarget) this.fontSizeValueTarget.textContent = size\n  }\n\n  updateLineHeight(event) {\n    const lineHeight = (Number(event.target.value) / 10).toFixed(1)\n    if (this.hasSampleTextTarget) this.sampleTextTarget.style.lineHeight = lineHeight\n    if (this.hasLineHeightValueTarget) this.lineHeightValueTarget.textContent = lineHeight\n  }\n\n  updateDirection(event) {\n    const dir = event.target.value\n    if (this.hasSampleTextTarget) this.sampleTextTarget.setAttribute(\"dir\", dir)\n    if (this.hasSampleTextInputTarget) this.sampleTextInputTarget.setAttribute(\"dir\", dir)\n  }\n\n  resetPreview() {\n    if (this.hasSampleTextInputTarget) this.sampleTextInputTarget.value = this.sampleTextValue\n    if (this.hasSampleTextTarget) {\n      this.sampleTextTarget.textContent = this.sampleTextValue\n      this.sampleTextTarget.style.fontSize = \"40px\"\n      this.sampleTextTarget.style.lineHeight = \"1.7\"\n      this.sampleTextTarget.setAttribute(\"dir\", \"rtl\")\n    }\n    if (this.hasFontSizeSliderTarget) this.fontSizeSliderTarget.value = 40\n    if (this.hasFontSizeValueTarget) this.fontSizeValueTarget.textContent = \"40px\"\n    if (this.hasLineHeightSliderTarget) this.lineHeightSliderTarget.value = 17\n    if (this.hasLineHeightValueTarget) this.lineHeightValueTarget.textContent = \"1.7\"\n  }\n\n  // ---------------------------------------------------------------- ligatures\n\n  async showLigatures() {\n    this.updateLigatureCount()\n    if (this.ligaturesDrawn) return\n\n    try {\n      await this.loadFont()\n    } catch (error) {\n      // Leave the CSS-rendered fallback text in place.\n      return\n    }\n\n    this.ligaturesDrawn = true\n    this.renderLigaturePreviews()\n  }\n\n  // Decorative ligature glyphs draw far outside the em box, so letting the\n  // browser lay them out overflows the row. Fit each one to its own outline\n  // on a canvas instead.\n  renderLigaturePreviews() {\n    const size = this.hasLigatureSizeSliderTarget ? Number(this.ligatureSizeSliderTarget.value) : 40\n    this.ligaturePreviewTargets.forEach((host) => this.drawLigature(host, size))\n  }\n\n  drawLigature(host, size) {\n    const text = host.dataset.ligatureText || host.textContent.trim()\n    if (!text) return\n\n    const geometry = this.runGeometry(text)\n    if (!geometry) return\n\n    const height = Math.round(size * 1.6)\n    const aspect = geometry.width / geometry.height\n    const width = Math.min(900, Math.max(size, Math.round(height * aspect)))\n\n    let canvas = host.querySelector(\"canvas\")\n    if (!canvas) {\n      canvas = document.createElement(\"canvas\")\n      canvas.className = \"block\"\n      host.textContent = \"\"\n      host.appendChild(canvas)\n    }\n    canvas.style.width = `${width}px`\n\n    const ratio = window.devicePixelRatio || 1\n    canvas.width = Math.round(width * ratio)\n    canvas.height = Math.round(height * ratio)\n\n    const ctx = canvas.getContext(\"2d\")\n    ctx.setTransform(ratio, 0, 0, ratio, 0, 0)\n    ctx.clearRect(0, 0, width, height)\n\n    const pad = 2\n    const scale = Math.min((width - pad * 2) / geometry.width, (height - pad * 2) / geometry.height)\n\n    ctx.save()\n    ctx.translate(\n      width / 2 - (geometry.minX + geometry.width / 2) * scale,\n      height / 2 + (geometry.minY + geometry.height / 2) * scale\n    )\n    ctx.scale(scale, -scale)\n    ctx.fillStyle = \"#111827\"\n    geometry.parts.forEach(({ glyph, x, y }) => {\n      ctx.save()\n      ctx.translate(x, y)\n      ctx.beginPath()\n      this.tracePath(ctx, glyph.path)\n      ctx.fill()\n      ctx.restore()\n    })\n    ctx.restore()\n  }\n\n  // Shapes the text with the font's own layout tables, then unions the\n  // bounding boxes of the glyphs it produced.\n  runGeometry(text) {\n    let run\n    try {\n      run = this.font.layout(text)\n    } catch (error) {\n      return null\n    }\n    if (!run?.glyphs?.length) return null\n\n    const parts = []\n    let penX = 0\n    let penY = 0\n    let minX = Infinity\n    let minY = Infinity\n    let maxX = -Infinity\n    let maxY = -Infinity\n\n    run.glyphs.forEach((glyph, index) => {\n      const position = run.positions[index] || {}\n      const x = penX + (position.xOffset || 0)\n      const y = penY + (position.yOffset || 0)\n      const box = this.glyphBox(glyph)\n\n      if (box) {\n        parts.push({ glyph, x, y })\n        minX = Math.min(minX, x + box.minX)\n        minY = Math.min(minY, y + box.minY)\n        maxX = Math.max(maxX, x + box.minX + box.width)\n        maxY = Math.max(maxY, y + box.minY + box.height)\n      }\n\n      penX += position.xAdvance || 0\n      penY += position.yAdvance || 0\n    })\n\n    if (!parts.length) return null\n    return { parts, minX, minY, width: maxX - minX, height: maxY - minY }\n  }\n\n  filterLigatures() {\n    const query = this.ligatureSearchTarget.value.trim().toLowerCase()\n    this.ligatureRows().forEach((row) => {\n      const matches = !query || (row.dataset.ligatureName || \"\").includes(query)\n      row.classList.toggle(\"hidden\", !matches)\n    })\n    this.updateLigatureCount()\n  }\n\n  updateLigatureSize(event) {\n    const size = Number(event.target.value)\n    if (this.hasLigatureSizeValueTarget) this.ligatureSizeValueTarget.textContent = `${size}px`\n\n    if (this.ligaturesDrawn) {\n      this.renderLigaturePreviews()\n    } else {\n      this.ligaturePreviewTargets.forEach((el) => { el.style.fontSize = `${size}px` })\n    }\n  }\n\n  ligatureRows() {\n    if (!this.hasLigaturesTableTarget) return []\n    return Array.from(this.ligaturesTableTarget.querySelectorAll(\"[data-ligature-row]\"))\n  }\n\n  updateLigatureCount() {\n    if (!this.hasLigatureCountTarget) return\n    const rows = this.ligatureRows()\n    const visible = rows.filter((row) => !row.classList.contains(\"hidden\")).length\n    this.ligatureCountTarget.textContent =\n      visible === rows.length ? `${rows.length} ligatures` : `${visible} of ${rows.length} ligatures`\n  }\n\n  // ------------------------------------------------------------------- glyphs\n\n  async showGlyphs() {\n    if (this.glyphsRendered) return\n    if (!this.hasGlyphsContainerTarget) return\n\n    this.glyphsContainerTarget.innerHTML =\n      '<div class=\"glyph-empty\">Loading the font\u2026</div>'\n\n    try {\n      await this.loadFont()\n    } catch (error) {\n      this.glyphsContainerTarget.innerHTML =\n        `<div class=\"glyph-empty\">This font could not be read in the browser.<br><span class=\"text-sm\">${this.escape(error.message)}</span></div>`\n      return\n    }\n\n    this.glyphsRendered = true\n    this.renderGlyphs()\n  }\n\n  filterGlyphs() {\n    clearTimeout(this.searchTimer)\n    this.searchTimer = setTimeout(() => this.renderGlyphs(), 150)\n  }\n\n  updateGlyphZoom(event) {\n    this.setGlyphCellSize(Number(event.target.value))\n    if (this.glyphsRendered) this.renderGlyphs()\n  }\n\n  setGlyphCellSize(size) {\n    this.glyphCellSize = size\n    if (this.hasGlyphsContainerTarget) {\n      this.glyphsContainerTarget.style.setProperty(\"--glyph-cell\", `${size}px`)\n    }\n  }\n\n  visibleGlyphs() {\n    const query = this.hasGlyphSearchTarget ? this.glyphSearchTarget.value.trim().toLowerCase() : \"\"\n    const includeUnmapped = this.hasUnmappedToggleTarget ? this.unmappedToggleTarget.checked : false\n    const includeEmpty = this.hasEmptyToggleTarget ? this.emptyToggleTarget.checked : false\n\n    return this.glyphs.filter((entry) => {\n      if (!includeUnmapped && !entry.codePoints.length) return false\n      if (!includeEmpty && entry.empty) return false\n      if (!query) return true\n      return entry.haystack.includes(query)\n    })\n  }\n\n  renderGlyphs() {\n    if (!this.hasGlyphsContainerTarget || !this.font) return\n\n    const matches = this.visibleGlyphs()\n    const container = this.glyphsContainerTarget\n    container.innerHTML = \"\"\n\n    if (this.hasGlyphCountTarget) {\n      this.glyphCountTarget.textContent =\n        matches.length === this.glyphs.length\n          ? `${this.glyphs.length} glyphs`\n          : `${matches.length} of ${this.glyphs.length} glyphs`\n    }\n\n    if (this.hasEmptyToggleTarget) {\n      const emptyCount = this.glyphs.filter((entry) => entry.empty).length\n      this.emptyToggleTarget.closest(\"label\").classList.toggle(\"hidden\", emptyCount === 0)\n    }\n    if (this.hasUnmappedToggleTarget) {\n      const unmappedCount = this.glyphs.filter((entry) => !entry.codePoints.length).length\n      this.unmappedToggleTarget.closest(\"label\").classList.toggle(\"hidden\", unmappedCount === 0)\n    }\n\n    if (!matches.length) {\n      container.innerHTML = '<div class=\"glyph-empty\">No glyph matches that search.</div>'\n      return\n    }\n\n    const fragment = document.createDocumentFragment()\n    // Cap the first paint so a 6k-glyph Mushaf font does not lock up the tab.\n    matches.slice(0, 600).forEach((entry) => fragment.appendChild(this.buildGlyphCard(entry)))\n    container.appendChild(fragment)\n\n    if (matches.length > 600) {\n      const notice = document.createElement(\"div\")\n      notice.className = \"glyph-empty\"\n      notice.textContent = `Showing the first 600 of ${matches.length} glyphs \u2014 narrow the search to see the rest.`\n      container.appendChild(notice)\n    }\n  }\n\n  buildGlyphCard(entry) {\n    const card = document.createElement(\"button\")\n    card.type = \"button\"\n    card.className = \"glyph-card\"\n    card.title = entry.hex ? `U+${entry.hex} \u00B7 ${entry.name}` : entry.name\n\n    // Word ligatures are far wider than they are tall; give them more columns\n    // so they are legible instead of shrunk to fit a square cell.\n    const box = this.glyphBox(entry.glyph)\n    const aspect = box ? box.width / box.height : 1\n    const span = aspect > 3.6 ? 3 : aspect > 1.9 ? 2 : 1\n    if (span > 1) card.style.gridColumn = `span ${span}`\n\n    const canvas = document.createElement(\"canvas\")\n    card.appendChild(canvas)\n\n    const label = document.createElement(\"span\")\n    label.className = \"glyph-card-label\"\n    label.textContent = entry.hex ? `U+${entry.hex}` : `#${entry.id}`\n    if (entry.codePoints.length > 1) label.textContent += ` +${entry.codePoints.length - 1}`\n    card.appendChild(label)\n\n    if (entry.name) {\n      const name = document.createElement(\"span\")\n      name.className = \"glyph-card-name\"\n      name.textContent = entry.name\n      card.appendChild(name)\n    }\n\n    card.addEventListener(\"click\", () => this.openGlyphModal(entry))\n\n    // The canvas has no layout width until it is in the document.\n    requestAnimationFrame(() => {\n      this.drawGlyph(canvas, entry.glyph, canvas.clientWidth || this.glyphCellSize * span, Math.round(this.glyphCellSize * 0.72))\n    })\n\n    return card\n  }\n\n  // Draws the outline scaled to its own bounding box, so a wide word ligature\n  // and a narrow harakah both fill their cell instead of being clipped.\n  drawGlyph(canvas, glyph, cssWidth, cssHeight) {\n    const ratio = window.devicePixelRatio || 1\n    canvas.width = Math.max(1, Math.round(cssWidth * ratio))\n    canvas.height = Math.max(1, Math.round(cssHeight * ratio))\n    canvas.style.height = `${cssHeight}px`\n\n    const ctx = canvas.getContext(\"2d\")\n    ctx.setTransform(ratio, 0, 0, ratio, 0, 0)\n    ctx.clearRect(0, 0, cssWidth, cssHeight)\n\n    const box = this.glyphBox(glyph)\n    if (!box) {\n      ctx.fillStyle = \"#cbd5e1\"\n      ctx.font = \"11px system-ui, sans-serif\"\n      ctx.textAlign = \"center\"\n      ctx.textBaseline = \"middle\"\n      ctx.fillText(\"no outline\", cssWidth / 2, cssHeight / 2)\n      return\n    }\n\n    const pad = Math.max(6, Math.min(cssWidth, cssHeight) * 0.12)\n    const scale = Math.min((cssWidth - pad * 2) / box.width, (cssHeight - pad * 2) / box.height)\n\n    ctx.save()\n    ctx.translate(\n      cssWidth / 2 - (box.minX + box.width / 2) * scale,\n      cssHeight / 2 + (box.minY + box.height / 2) * scale\n    )\n    ctx.scale(scale, -scale)\n    ctx.fillStyle = \"#1f2937\"\n    ctx.beginPath()\n    this.tracePath(ctx, glyph.path)\n    ctx.fill()\n    ctx.restore()\n  }\n\n  // Some fonts ship a zeroed glyf bounding box, so measure the outline itself\n  // first and only fall back to the box recorded in the table.\n  glyphBox(glyph) {\n    for (const source of [() => glyph.path.bbox, () => glyph.bbox]) {\n      let bbox\n      try {\n        bbox = source()\n      } catch (error) {\n        continue\n      }\n      if (!bbox) continue\n\n      const width = bbox.maxX - bbox.minX\n      const height = bbox.maxY - bbox.minY\n      if (width > 0 && height > 0) return { minX: bbox.minX, minY: bbox.minY, width, height }\n    }\n    return null\n  }\n\n  tracePath(ctx, path) {\n    if (!path || !Array.isArray(path.commands)) return\n    for (const { command, args } of path.commands) {\n      switch (command) {\n        case \"moveTo\": ctx.moveTo(args[0], args[1]); break\n        case \"lineTo\": ctx.lineTo(args[0], args[1]); break\n        case \"quadraticCurveTo\": ctx.quadraticCurveTo(args[0], args[1], args[2], args[3]); break\n        case \"bezierCurveTo\": ctx.bezierCurveTo(args[0], args[1], args[2], args[3], args[4], args[5]); break\n        case \"closePath\": ctx.closePath(); break\n      }\n    }\n  }\n\n  // -------------------------------------------------------------- glyph modal\n\n  openGlyphModal(entry) {\n    this.closeGlyphModal()\n\n    const overlay = document.createElement(\"div\")\n    overlay.className = \"glyph-modal\"\n    overlay.addEventListener(\"click\", (event) => {\n      if (event.target === overlay) this.closeGlyphModal()\n    })\n\n    const title = entry.hex ? `U+${entry.hex}` : `Glyph #${entry.id}`\n    overlay.innerHTML = `\n      <div class=\"glyph-modal-panel\" role=\"dialog\" aria-modal=\"true\" aria-label=\"${this.escape(title)}\">\n        <div class=\"glyph-modal-header\">\n          <div>\n            <h3 class=\"text-lg font-semibold text-gray-900 m-0\">${this.escape(title)}</h3>\n            <p class=\"text-sm text-gray-500 m-0\" data-glyph-subtitle>${this.escape(entry.name || \"unnamed glyph\")}</p>\n          </div>\n          <button type=\"button\" class=\"btn btn-secondary btn-sm\" data-glyph-close>Close</button>\n        </div>\n        <div class=\"grid gap-5 p-5 md:grid-cols-2\">\n          <div class=\"rounded-lg border border-gray-200 bg-gray-50 p-3\">\n            <canvas data-glyph-canvas class=\"block w-full\"></canvas>\n          </div>\n          <dl class=\"m-0\" data-glyph-meta></dl>\n        </div>\n      </div>\n    `\n\n    document.body.appendChild(overlay)\n    document.body.style.overflow = \"hidden\"\n    this.glyphModal = overlay\n\n    overlay.querySelector(\"[data-glyph-close]\").addEventListener(\"click\", () => this.closeGlyphModal())\n    this.escapeHandler = (event) => { if (event.key === \"Escape\") this.closeGlyphModal() }\n    document.addEventListener(\"keydown\", this.escapeHandler)\n\n    const canvas = overlay.querySelector(\"[data-glyph-canvas]\")\n    requestAnimationFrame(() => this.drawGlyph(canvas, entry.glyph, canvas.clientWidth || 320, 280))\n\n    this.fillGlyphMeta(overlay.querySelector(\"[data-glyph-meta]\"), entry)\n    this.appendUnicodeName(overlay, entry)\n  }\n\n  // The official Unicode name is not in the font, so ask the API for it.\n  async appendUnicodeName(overlay, entry) {\n    if (!entry.hex) return\n    try {\n      const response = await fetch(`/api/v1/unicode/name?code_point=${entry.hex}`)\n      if (!response.ok) return\n      const info = await response.json()\n      if (!info?.name || overlay !== this.glyphModal) return\n\n      const subtitle = overlay.querySelector(\"[data-glyph-subtitle]\")\n      if (subtitle) subtitle.textContent = `${info.name} \u00B7 ${entry.name || \"unnamed glyph\"}`\n    } catch (error) {\n      // The name is a nice-to-have; leave the glyph name on its own.\n    }\n  }\n\n  fillGlyphMeta(list, entry) {\n    const rows = [\n      [\"Glyph index\", `${entry.id}`, `${entry.id}`],\n      [\"Glyph name\", entry.name || \"\u2014\", entry.name],\n      [\"Unicode\", entry.hex ? `U+${entry.hex}` : \"not mapped\", entry.hex ? `U+${entry.hex}` : null],\n      [\"Character\", entry.char || \"\u2014\", entry.char || null],\n      [\"HTML entity\", entry.codePoints.length ? `&#x${entry.hex};` : \"\u2014\", entry.codePoints.length ? `&#x${entry.hex};` : null],\n      [\"Advance width\", `${Math.round(entry.glyph.advanceWidth)} units`, null]\n    ]\n\n    const others = entry.codePoints.filter((cp) => cp !== entry.primary)\n    if (others.length) {\n      rows.push([\"Also mapped from\", others.map((cp) => `U+${this.toHex(cp)}`).join(\", \"), null])\n    }\n\n    list.innerHTML = rows\n      .map(([label, value, copyValue]) => `\n        <div class=\"glyph-meta-row\">\n          <dt>${this.escape(label)}</dt>\n          <dd class=\"flex items-center gap-2\">\n            <span>${this.escape(value)}</span>\n            ${copyValue ? `<button type=\"button\" class=\"docs-copy-btn\" data-copy-value=\"${this.escape(copyValue)}\">Copy</button>` : \"\"}\n          </dd>\n        </div>\n      `)\n      .join(\"\")\n\n    if (entry.hex) {\n      list.insertAdjacentHTML(\"beforeend\", `\n        <div class=\"pt-3\">\n          <a class=\"text-blue-600 underline\" target=\"_blank\" rel=\"noopener noreferrer\"\n             href=\"https://www.compart.com/en/unicode/U+${entry.hex}\">Look this character up on Compart</a>\n        </div>\n      `)\n    }\n\n    list.querySelectorAll(\"[data-copy-value]\").forEach((button) => {\n      button.addEventListener(\"click\", () => this.copyText(button.dataset.copyValue, button))\n    })\n  }\n\n  closeGlyphModal() {\n    if (this.escapeHandler) {\n      document.removeEventListener(\"keydown\", this.escapeHandler)\n      this.escapeHandler = null\n    }\n    if (this.glyphModal) {\n      this.glyphModal.remove()\n      this.glyphModal = null\n      document.body.style.overflow = \"\"\n    }\n  }\n\n  // -------------------------------------------------------------------- copy\n\n  copyValue(event) {\n    const button = event.currentTarget\n    this.copyText(button.dataset.copyValue, button)\n  }\n\n  async copyText(text, button) {\n    if (text == null) return\n    try {\n      await navigator.clipboard.writeText(text)\n    } catch (error) {\n      const area = document.createElement(\"textarea\")\n      area.value = text\n      area.style.position = \"fixed\"\n      area.style.opacity = \"0\"\n      document.body.appendChild(area)\n      area.select()\n      document.execCommand(\"copy\")\n      area.remove()\n    }\n\n    if (!button) return\n    const original = button.textContent\n    button.textContent = \"Copied\"\n    button.classList.add(\"text-[#46ac7a]\")\n    setTimeout(() => {\n      button.textContent = original\n      button.classList.remove(\"text-[#46ac7a]\")\n    }, 1500)\n  }\n\n  escape(value) {\n    return String(value ?? \"\").replace(/[&<>\"']/g, (char) => ({\n      \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\"\n    })[char])\n  }\n}\n", "// Node back-compat.\nconst ENCODING_MAPPING = {\n  utf16le: 'utf-16le',\n  ucs2: 'utf-16le',\n  utf16be: 'utf-16be'\n}\n\nexport class DecodeStream {\n  constructor(buffer) {\n    this.buffer = buffer;\n    this.view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);\n    this.pos = 0;\n    this.length = this.buffer.length;\n  }\n\n  readString(length, encoding = 'ascii') {\n    encoding = ENCODING_MAPPING[encoding] || encoding;\n\n    let buf = this.readBuffer(length);\n    try {\n      let decoder = new TextDecoder(encoding);\n      return decoder.decode(buf);\n    } catch (err) {\n      return buf;\n    }\n  }\n\n  readBuffer(length) {\n    return this.buffer.slice(this.pos, (this.pos += length));\n  }\n\n  readUInt24BE() {\n    return (this.readUInt16BE() << 8) + this.readUInt8();\n  }\n\n  readUInt24LE() {\n    return this.readUInt16LE() + (this.readUInt8() << 16);\n  }\n\n  readInt24BE() {\n    return (this.readInt16BE() << 8) + this.readUInt8();\n  }\n\n  readInt24LE() {\n    return this.readUInt16LE() + (this.readInt8() << 16);\n  }\n}\n\nDecodeStream.TYPES = {\n  UInt8: 1,\n  UInt16: 2,\n  UInt24: 3,\n  UInt32: 4,\n  Int8: 1,\n  Int16: 2,\n  Int24: 3,\n  Int32: 4,\n  Float: 4,\n  Double: 8\n};\n\nfor (let key of Object.getOwnPropertyNames(DataView.prototype)) {\n  if (key.slice(0, 3) === 'get') {\n    let type = key.slice(3).replace('Ui', 'UI');\n    if (type === 'Float32') {\n      type = 'Float';\n    } else if (type === 'Float64') {\n      type = 'Double';\n    }\n    let bytes = DecodeStream.TYPES[type];\n    DecodeStream.prototype['read' + type + (bytes === 1 ? '' : 'BE')] = function () {\n      const ret = this.view[key](this.pos, false);\n      this.pos += bytes;\n      return ret;\n    };\n\n    if (bytes !== 1) {\n      DecodeStream.prototype['read' + type + 'LE'] = function () {\n        const ret = this.view[key](this.pos, true);\n        this.pos += bytes;\n        return ret;\n      };\n    }\n  }\n}\n", "import {DecodeStream} from './DecodeStream.js';\n\nconst textEncoder = new TextEncoder();\nconst isBigEndian = new Uint8Array(new Uint16Array([0x1234]).buffer)[0] == 0x12;\n\nexport class EncodeStream {\n  constructor(buffer) {\n    this.buffer = buffer;\n    this.view = new DataView(this.buffer.buffer, this.buffer.byteOffset, this.buffer.byteLength);\n    this.pos = 0;\n  }\n\n  writeBuffer(buffer) {\n    this.buffer.set(buffer, this.pos);\n    this.pos += buffer.length;\n  }\n\n  writeString(string, encoding = 'ascii') {\n    let buf;\n    switch (encoding) {\n      case 'utf16le':\n      case 'utf16-le':\n      case 'ucs2': // node treats this the same as utf16.\n        buf = stringToUtf16(string, isBigEndian);\n        break;\n\n      case 'utf16be':\n      case 'utf16-be':\n        buf = stringToUtf16(string, !isBigEndian);\n        break;\n\n      case 'utf8':\n        buf = textEncoder.encode(string);\n        break;\n\n      case 'ascii':\n        buf = stringToAscii(string);\n        break;\n\n      default:\n        throw new Error(`Unsupported encoding: ${encoding}`);\n    }\n\n    this.writeBuffer(buf);\n  }\n\n  writeUInt24BE(val) {\n    this.buffer[this.pos++] = (val >>> 16) & 0xff;\n    this.buffer[this.pos++] = (val >>> 8) & 0xff;\n    this.buffer[this.pos++] = val & 0xff;\n  }\n\n  writeUInt24LE(val) {\n    this.buffer[this.pos++] = val & 0xff;\n    this.buffer[this.pos++] = (val >>> 8) & 0xff;\n    this.buffer[this.pos++] = (val >>> 16) & 0xff;\n  }\n\n  writeInt24BE(val) {\n    if (val >= 0) {\n      this.writeUInt24BE(val);\n    } else {\n      this.writeUInt24BE(val + 0xffffff + 1);\n    }\n  }\n\n  writeInt24LE(val) {\n    if (val >= 0) {\n      this.writeUInt24LE(val);\n    } else {\n      this.writeUInt24LE(val + 0xffffff + 1);\n    }\n  }\n\n  fill(val, length) {\n    if (length < this.buffer.length) {\n      this.buffer.fill(val, this.pos, this.pos + length);\n      this.pos += length;\n    } else {\n      const buf = new Uint8Array(length);\n      buf.fill(val);\n      this.writeBuffer(buf);\n    }\n  }\n}\n\nfunction stringToUtf16(string, swap) {\n  let buf = new Uint16Array(string.length);\n  for (let i = 0; i < string.length; i++) {\n    let code = string.charCodeAt(i);\n    if (swap) {\n      code = (code >> 8) | ((code & 0xff) << 8);\n    }\n    buf[i] = code;\n  }\n  return new Uint8Array(buf.buffer);\n}\n\nfunction stringToAscii(string) {\n  let buf = new Uint8Array(string.length);\n  for (let i = 0; i < string.length; i++) {\n    // Match node.js behavior - encoding allows 8-bit rather than 7-bit.\n    buf[i] = string.charCodeAt(i);\n  }\n  return buf;\n}\n\nfor (let key of Object.getOwnPropertyNames(DataView.prototype)) {\n  if (key.slice(0, 3) === 'set') {\n    let type = key.slice(3).replace('Ui', 'UI');\n    if (type === 'Float32') {\n      type = 'Float';\n    } else if (type === 'Float64') {\n      type = 'Double';\n    }\n    let bytes = DecodeStream.TYPES[type];\n    EncodeStream.prototype['write' + type + (bytes === 1 ? '' : 'BE')] = function (value) {\n      this.view[key](this.pos, value, false);\n      this.pos += bytes;\n    };\n\n    if (bytes !== 1) {\n      EncodeStream.prototype['write' + type + 'LE'] = function (value) {\n        this.view[key](this.pos, value, true);\n        this.pos += bytes;\n      };\n    }\n  }\n}\n", "import {DecodeStream} from './DecodeStream.js';\nimport {EncodeStream} from './EncodeStream.js';\n\nexport class Base {\n  fromBuffer(buffer) {\n    let stream = new DecodeStream(buffer);\n    return this.decode(stream);\n  }\n\n  toBuffer(value) {\n    let size = this.size(value);\n    let buffer = new Uint8Array(size);\n    let stream = new EncodeStream(buffer);\n    this.encode(stream, value);\n    return buffer;\n  }\n}\n", "import {DecodeStream} from './DecodeStream.js';\nimport {Base} from './Base.js';\n\nclass NumberT extends Base {\n  constructor(type, endian = 'BE') {\n    super();\n    this.type = type;\n    this.endian = endian;\n    this.fn = this.type;\n    if (this.type[this.type.length - 1] !== '8') {\n      this.fn += this.endian;\n    }\n  }\n\n  size() {\n    return DecodeStream.TYPES[this.type];\n  }\n\n  decode(stream) {\n    return stream[`read${this.fn}`]();\n  }\n\n  encode(stream, val) {\n    return stream[`write${this.fn}`](val);\n  }\n}\n\nexport {NumberT as Number};\n\nexport const uint8 = new NumberT('UInt8');\nexport const uint16be = new NumberT('UInt16', 'BE');\nexport const uint16 = uint16be;\nexport const uint16le = new NumberT('UInt16', 'LE');\nexport const uint24be = new NumberT('UInt24', 'BE');\nexport const uint24 = uint24be;\nexport const uint24le = new NumberT('UInt24', 'LE');\nexport const uint32be = new NumberT('UInt32', 'BE');\nexport const uint32 = uint32be;\nexport const uint32le = new NumberT('UInt32', 'LE');\nexport const int8 = new NumberT('Int8');\nexport const int16be = new NumberT('Int16', 'BE');\nexport const int16 = int16be;\nexport const int16le = new NumberT('Int16', 'LE');\nexport const int24be = new NumberT('Int24', 'BE');\nexport const int24 = int24be;\nexport const int24le = new NumberT('Int24', 'LE');\nexport const int32be = new NumberT('Int32', 'BE');\nexport const int32 = int32be;\nexport const int32le = new NumberT('Int32', 'LE');\nexport const floatbe = new NumberT('Float', 'BE');\nexport const float = floatbe;\nexport const floatle = new NumberT('Float', 'LE');\nexport const doublebe = new NumberT('Double', 'BE');\nexport const double = doublebe;\nexport const doublele = new NumberT('Double', 'LE');\n\nexport class Fixed extends NumberT {\n  constructor(size, endian, fracBits = size >> 1) {\n    super(`Int${size}`, endian);\n    this._point = 1 << fracBits;\n  }\n\n  decode(stream) {\n    return super.decode(stream) / this._point;\n  }\n\n  encode(stream, val) {\n    return super.encode(stream, (val * this._point) | 0);\n  }\n}\n\nexport const fixed16be = new Fixed(16, 'BE');\nexport const fixed16 = fixed16be;\nexport const fixed16le = new Fixed(16, 'LE');\nexport const fixed32be = new Fixed(32, 'BE');\nexport const fixed32 = fixed32be;\nexport const fixed32le = new Fixed(32, 'LE');\n", "import {Number as NumberT} from './Number.js';\n\nexport function resolveLength(length, stream, parent) {\n  let res;\n  if (typeof length === 'number') {\n    res = length;\n\n  } else if (typeof length === 'function') {\n    res = length.call(parent, parent);\n\n  } else if (parent && (typeof length === 'string')) {\n    res = parent[length];\n\n  } else if (stream && length instanceof NumberT) {\n    res = length.decode(stream);\n  }\n\n  if (isNaN(res)) {\n    throw new Error('Not a fixed size');\n  }\n\n  return res;\n};\n\nexport class PropertyDescriptor {\n  constructor(opts = {}) {\n    this.enumerable = true;\n    this.configurable = true;\n\n    for (let key in opts) {\n      const val = opts[key];\n      this[key] = val;\n    }\n  }\n}\n", "import {Base} from './Base.js';\nimport {Number as NumberT} from './Number.js';\nimport * as utils from './utils.js';\n\nclass ArrayT extends Base {\n  constructor(type, length, lengthType = 'count') {\n    super();\n    this.type = type;\n    this.length = length;\n    this.lengthType = lengthType;\n  }\n\n  decode(stream, parent) {\n    let length;\n    const { pos } = stream;\n\n    const res = [];\n    let ctx = parent;\n\n    if (this.length != null) {\n      length = utils.resolveLength(this.length, stream, parent);\n    }\n\n    if (this.length instanceof NumberT) {\n      // define hidden properties\n      Object.defineProperties(res, {\n        parent:         { value: parent },\n        _startOffset:   { value: pos },\n        _currentOffset: { value: 0, writable: true },\n        _length:        { value: length }\n      });\n\n      ctx = res;\n    }\n\n    if ((length == null) || (this.lengthType === 'bytes')) {\n      const target = (length != null) ?\n        stream.pos + length\n      : (parent != null ? parent._length : undefined) ?\n        parent._startOffset + parent._length\n      :\n        stream.length;\n\n      while (stream.pos < target) {\n        res.push(this.type.decode(stream, ctx));\n      }\n\n    } else {\n      for (let i = 0, end = length; i < end; i++) {\n        res.push(this.type.decode(stream, ctx));\n      }\n    }\n\n    return res;\n  }\n\n  size(array, ctx, includePointers = true) {\n    if (!array) {\n      return this.type.size(null, ctx) * utils.resolveLength(this.length, null, ctx);\n    }\n\n    let size = 0;\n    if (this.length instanceof NumberT) {\n      size += this.length.size();\n      ctx = {parent: ctx, pointerSize: 0};\n    }\n\n    for (let item of array) {\n      size += this.type.size(item, ctx);\n    }\n\n    if (ctx && includePointers && this.length instanceof NumberT) {\n      size += ctx.pointerSize;\n    }\n    \n    return size;\n  }\n\n  encode(stream, array, parent) {\n    let ctx = parent;\n    if (this.length instanceof NumberT) {\n      ctx = {\n        pointers: [],\n        startOffset: stream.pos,\n        parent\n      };\n\n      ctx.pointerOffset = stream.pos + this.size(array, ctx, false);\n      this.length.encode(stream, array.length);\n    }\n\n    for (let item of array) {\n      this.type.encode(stream, item, ctx);\n    }\n\n    if (this.length instanceof NumberT) {\n      let i = 0;\n      while (i < ctx.pointers.length) {\n        const ptr = ctx.pointers[i++];\n        ptr.type.encode(stream, ptr.val, ptr.parent);\n      }\n    }\n  }\n}\n\nexport {ArrayT as Array};\n", "import {Array as ArrayT} from './Array.js';\nimport {Number as NumberT} from './Number.js';\nimport * as utils from './utils.js';\n\nexport class LazyArray extends ArrayT {\n  decode(stream, parent) {\n    const { pos } = stream;\n    const length = utils.resolveLength(this.length, stream, parent);\n\n    if (this.length instanceof NumberT) {\n      parent = {\n        parent,\n        _startOffset: pos,\n        _currentOffset: 0,\n        _length: length\n      };\n    }\n\n    const res = new LazyArrayValue(this.type, length, stream, parent);\n\n    stream.pos += length * this.type.size(null, parent);\n    return res;\n  }\n\n  size(val, ctx) {\n    if (val instanceof LazyArrayValue) {\n      val = val.toArray();\n    }\n\n    return super.size(val, ctx);\n  }\n\n  encode(stream, val, ctx) {\n    if (val instanceof LazyArrayValue) {\n      val = val.toArray();\n    }\n\n    return super.encode(stream, val, ctx);\n  }\n}\n\nclass LazyArrayValue {\n  constructor(type, length, stream, ctx) {\n    this.type = type;\n    this.length = length;\n    this.stream = stream;\n    this.ctx = ctx;\n    this.base = this.stream.pos;\n    this.items = [];\n  }\n\n  get(index) {\n    if ((index < 0) || (index >= this.length)) {\n      return undefined;\n    }\n\n    if (this.items[index] == null) {\n      const { pos } = this.stream;\n      this.stream.pos = this.base + (this.type.size(null, this.ctx) * index);\n      this.items[index] = this.type.decode(this.stream, this.ctx);\n      this.stream.pos = pos;\n    }\n\n    return this.items[index];\n  }\n\n  toArray() {\n    const result = [];\n    for (let i = 0, end = this.length; i < end; i++) {\n      result.push(this.get(i));\n    }\n    return result;\n  }\n}\n", "import {Base} from './Base.js';\n\nexport class Bitfield extends Base {\n  constructor(type, flags = []) {\n    super();\n    this.type = type;\n    this.flags = flags;\n  }\n\n  decode(stream) {\n    const val = this.type.decode(stream);\n\n    const res = {};\n    for (let i = 0; i < this.flags.length; i++) {\n      const flag = this.flags[i];\n      if (flag != null) {\n        res[flag] = !!(val & (1 << i));\n      }\n    }\n\n    return res;\n  }\n\n  size() {\n    return this.type.size();\n  }\n\n  encode(stream, keys) {\n    let val = 0;\n    for (let i = 0; i < this.flags.length; i++) {\n      const flag = this.flags[i];\n      if (flag != null) {\n        if (keys[flag]) { val |= (1 << i); }\n      }\n    }\n\n    return this.type.encode(stream, val);\n  }\n}\n", "import {Base} from './Base.js';\nimport {Number as NumberT} from './Number.js';\nimport * as utils from './utils.js';\n\nexport class BufferT extends Base {\n  constructor(length) {\n    super();\n    this.length = length;\n  }\n  \n  decode(stream, parent) {\n    const length = utils.resolveLength(this.length, stream, parent);\n    return stream.readBuffer(length);\n  }\n\n  size(val, parent) {\n    if (!val) {\n      return utils.resolveLength(this.length, null, parent);\n    }\n\n    let len = val.length;\n    if (this.length instanceof NumberT) {\n      len += this.length.size();\n    }\n\n    return len;\n  }\n\n  encode(stream, buf, parent) {\n    if (this.length instanceof NumberT) {\n      this.length.encode(stream, buf.length);\n    }\n\n    return stream.writeBuffer(buf);\n  }\n}\n\nexport {BufferT as Buffer};\n", "import {Base} from './Base.js';\n\nexport class Optional extends Base {\n  constructor(type, condition = true) {\n    super();\n    this.type = type;\n    this.condition = condition;\n  }\n\n  decode(stream, parent) {\n    let { condition } = this;\n    if (typeof condition === 'function') {\n      condition = condition.call(parent, parent);\n    }\n\n    if (condition) {\n      return this.type.decode(stream, parent);\n    }\n  }\n\n  size(val, parent) {\n    let { condition } = this;\n    if (typeof condition === 'function') {\n      condition = condition.call(parent, parent);\n    }\n\n    if (condition) {\n      return this.type.size(val, parent);\n    } else {\n      return 0;\n    }\n  }\n\n  encode(stream, val, parent) {\n    let { condition } = this;\n    if (typeof condition === 'function') {\n      condition = condition.call(parent, parent);\n    }\n\n    if (condition) {\n      return this.type.encode(stream, val, parent);\n    }\n  }\n}\n", "import {Base} from './Base.js';\nimport * as utils from './utils.js';\n\nexport class Reserved extends Base {\n  constructor(type, count = 1) {\n    super();\n    this.type = type;\n    this.count = count;\n  }\n  decode(stream, parent) {\n    stream.pos += this.size(null, parent);\n    return undefined;\n  }\n\n  size(data, parent) {\n    const count = utils.resolveLength(this.count, null, parent);\n    return this.type.size() * count;\n  }\n\n  encode(stream, val, parent) {\n    return stream.fill(0, this.size(val, parent));\n  }\n}\n", "import {Base} from './Base.js';\nimport {Number as NumberT} from './Number.js';\nimport * as utils from './utils.js';\n\nclass StringT extends Base {\n  constructor(length, encoding = 'ascii') {\n    super();\n    this.length = length;\n    this.encoding = encoding;\n  }\n\n  decode(stream, parent) {\n    let length, pos;\n\n    let { encoding } = this;\n    if (typeof encoding === 'function') {\n      encoding = encoding.call(parent, parent) || 'ascii';\n    }\n    let width = encodingWidth(encoding);\n\n    if (this.length != null) {\n      length = utils.resolveLength(this.length, stream, parent);\n    } else {\n      let buffer;\n      ({buffer, length, pos} = stream);\n\n      while ((pos < length - width + 1) &&\n        (buffer[pos] !== 0x00 ||\n        (width === 2 && buffer[pos+1] !== 0x00)\n        )) {\n        pos += width;\n      }\n\n      length = pos - stream.pos;\n    }\n\n\n    const string = stream.readString(length, encoding);\n\n    if ((this.length == null) && (stream.pos < stream.length)) {\n      stream.pos+=width;\n    }\n\n    return string;\n  }\n\n  size(val, parent) {\n    // Use the defined value if no value was given\n    if (val === undefined || val === null) {\n      return utils.resolveLength(this.length, null, parent);\n    }\n\n    let { encoding } = this;\n    if (typeof encoding === 'function') {\n      encoding = encoding.call(parent != null ? parent.val : undefined, parent != null ? parent.val : undefined) || 'ascii';\n    }\n\n    if (encoding === 'utf16be') {\n      encoding = 'utf16le';\n    }\n\n    let size = byteLength(val, encoding);\n    if (this.length instanceof NumberT) {\n      size += this.length.size();\n    }\n\n    if ((this.length == null)) {\n      size += encodingWidth(encoding);\n    }\n\n    return size;\n  }\n\n  encode(stream, val, parent) {\n    let { encoding } = this;\n    if (typeof encoding === 'function') {\n      encoding = encoding.call(parent != null ? parent.val : undefined, parent != null ? parent.val : undefined) || 'ascii';\n    }\n\n    if (this.length instanceof NumberT) {\n      this.length.encode(stream, byteLength(val, encoding));\n    }\n\n    stream.writeString(val, encoding);\n\n    if ((this.length == null)) {\n      return encodingWidth(encoding) == 2 ?\n        stream.writeUInt16LE(0x0000) :\n        stream.writeUInt8(0x00);\n    }\n  }\n}\n\nfunction encodingWidth(encoding) {\n  switch(encoding) {\n    case 'ascii':\n    case 'utf8': // utf8 is a byte-based encoding for zero-term string\n      return 1;\n    case 'utf16le':\n    case 'utf16-le':\n    case 'utf-16be':\n    case 'utf-16le':\n    case 'utf16be':\n    case 'utf16-be':\n    case 'ucs2':\n      return 2;\n    default:\n      //TODO: assume all other encodings are 1-byters\n      //throw new Error('Unknown encoding ' + encoding);\n      return 1;\n  }\n}\n\nfunction byteLength(string, encoding) {\n  switch (encoding) {\n    case 'ascii':\n      return string.length;\n    case 'utf8':\n      let len = 0;\n      for (let i = 0; i < string.length; i++) {\n        let c = string.charCodeAt(i);\n\n        if (c >= 0xd800 && c <= 0xdbff && i < string.length - 1) {\n          let c2 = string.charCodeAt(++i);\n          if ((c2 & 0xfc00) === 0xdc00) {\n            c = ((c & 0x3ff) << 10) + (c2 & 0x3ff) + 0x10000;\n          } else {\n            // unmatched surrogate.\n            i--;\n          }\n        }\n\n        if ((c & 0xffffff80) === 0) {\n          len++;\n        } else if ((c & 0xfffff800) === 0) {\n          len += 2;\n        } else if ((c & 0xffff0000) === 0) {\n          len += 3;\n        } else if ((c & 0xffe00000) === 0) {\n          len += 4;\n        }\n      }\n      return len;\n    case 'utf16le':\n    case 'utf16-le':\n    case 'utf16be':\n    case 'utf16-be':\n    case 'ucs2':\n      return string.length * 2;\n    default:\n      throw new Error('Unknown encoding ' + encoding);\n  }\n}\n\nexport {StringT as String};\n", "import {Base} from './Base.js';\nimport * as utils from './utils.js';\n\nexport class Struct extends Base {\n  constructor(fields = {}) {\n    super();\n    this.fields = fields;\n  }\n\n  decode(stream, parent, length = 0) {\n    const res = this._setup(stream, parent, length);\n    this._parseFields(stream, res, this.fields);\n\n    if (this.process != null) {\n      this.process.call(res, stream);\n    }\n    return res;\n  }\n\n  _setup(stream, parent, length) {\n    const res = {};\n\n    // define hidden properties\n    Object.defineProperties(res, {\n      parent:         { value: parent },\n      _startOffset:   { value: stream.pos },\n      _currentOffset: { value: 0, writable: true },\n      _length:        { value: length }\n    });\n\n    return res;\n  }\n\n  _parseFields(stream, res, fields) {\n    for (let key in fields) {\n      var val;\n      const type = fields[key];\n      if (typeof type === 'function') {\n        val = type.call(res, res);\n      } else {\n        val = type.decode(stream, res);\n      }\n\n      if (val !== undefined) {\n        if (val instanceof utils.PropertyDescriptor) {\n          Object.defineProperty(res, key, val);\n        } else {\n          res[key] = val;\n        }\n      }\n\n      res._currentOffset = stream.pos - res._startOffset;\n    }\n\n  }\n\n  size(val, parent, includePointers = true) {\n    if (val == null) { val = {}; }\n    const ctx = {\n      parent,\n      val,\n      pointerSize: 0\n    };\n\n    if (this.preEncode != null) {\n      this.preEncode.call(val);\n    }\n\n    let size = 0;\n    for (let key in this.fields) {\n      const type = this.fields[key];\n      if (type.size != null) {\n        size += type.size(val[key], ctx);\n      }\n    }\n\n    if (includePointers) {\n      size += ctx.pointerSize;\n    }\n\n    return size;\n  }\n\n  encode(stream, val, parent) {\n    let type;\n    if (this.preEncode != null) {\n      this.preEncode.call(val, stream);\n    }\n\n    const ctx = {\n      pointers: [],\n      startOffset: stream.pos,\n      parent,\n      val,\n      pointerSize: 0\n    };\n\n    ctx.pointerOffset = stream.pos + this.size(val, ctx, false);\n\n    for (let key in this.fields) {\n      type = this.fields[key];\n      if (type.encode != null) {\n        type.encode(stream, val[key], ctx);\n      }\n    }\n\n    let i = 0;\n    while (i < ctx.pointers.length) {\n      const ptr = ctx.pointers[i++];\n      ptr.type.encode(stream, ptr.val, ptr.parent);\n    }\n  }\n}\n", "import {Struct} from './Struct.js';\n\nconst getPath = (object, pathArray) => {\n  return pathArray.reduce((prevObj, key) => prevObj && prevObj[key], object);\n};\n\nexport class VersionedStruct extends Struct {\n  constructor(type, versions = {}) {\n    super();\n    this.type = type;\n    this.versions = versions;\n    if (typeof type === 'string') {\n      this.versionPath = type.split('.');\n    }\n  }\n\n  decode(stream, parent, length = 0) {\n    const res = this._setup(stream, parent, length);\n\n    if (typeof this.type === 'string') {\n      res.version = getPath(parent, this.versionPath);\n    } else {\n      res.version = this.type.decode(stream);\n    }\n\n    if (this.versions.header) {\n      this._parseFields(stream, res, this.versions.header);\n    }\n\n    const fields = this.versions[res.version];\n    if ((fields == null)) {\n      throw new Error(`Unknown version ${res.version}`);\n    }\n\n    if (fields instanceof VersionedStruct) {\n      return fields.decode(stream, parent);\n    }\n\n    this._parseFields(stream, res, fields);\n\n    if (this.process != null) {\n      this.process.call(res, stream);\n    }\n    return res;\n  }\n\n  size(val, parent, includePointers = true) {\n    let key, type;\n    if (!val) {\n      throw new Error('Not a fixed size');\n    }\n\n    if (this.preEncode != null) {\n      this.preEncode.call(val);\n    }\n\n    const ctx = {\n      parent,\n      val,\n      pointerSize: 0\n    };\n\n    let size = 0;\n    if (typeof this.type !== 'string') {\n      size += this.type.size(val.version, ctx);\n    }\n\n    if (this.versions.header) {\n      for (key in this.versions.header) {\n        type = this.versions.header[key];\n        if (type.size != null) {\n          size += type.size(val[key], ctx);\n        }\n      }\n    }\n\n    const fields = this.versions[val.version];\n    if ((fields == null)) {\n      throw new Error(`Unknown version ${val.version}`);\n    }\n\n    for (key in fields) {\n      type = fields[key];\n      if (type.size != null) {\n        size += type.size(val[key], ctx);\n      }\n    }\n\n    if (includePointers) {\n      size += ctx.pointerSize;\n    }\n\n    return size;\n  }\n\n  encode(stream, val, parent) {\n    let key, type;\n    if (this.preEncode != null) {\n      this.preEncode.call(val, stream);\n    }\n\n    const ctx = {\n      pointers: [],\n      startOffset: stream.pos,\n      parent,\n      val,\n      pointerSize: 0\n    };\n\n    ctx.pointerOffset = stream.pos + this.size(val, ctx, false);\n\n    if (typeof this.type !== 'string') {\n      this.type.encode(stream, val.version);\n    }\n\n    if (this.versions.header) {\n      for (key in this.versions.header) {\n        type = this.versions.header[key];\n        if (type.encode != null) {\n          type.encode(stream, val[key], ctx);\n        }\n      }\n    }\n\n    const fields = this.versions[val.version];\n    for (key in fields) {\n      type = fields[key];\n      if (type.encode != null) {\n        type.encode(stream, val[key], ctx);\n      }\n    }\n\n    let i = 0;\n    while (i < ctx.pointers.length) {\n      const ptr = ctx.pointers[i++];\n      ptr.type.encode(stream, ptr.val, ptr.parent);\n    }\n  }\n}\n", "import * as utils from './utils.js';\nimport {Base} from './Base.js';\n\nexport class Pointer extends Base {\n  constructor(offsetType, type, options = {}) {\n    super();\n    this.offsetType = offsetType;\n    this.type = type;\n    this.options = options;\n    if (this.type === 'void') { this.type = null; }\n    if (this.options.type == null) { this.options.type = 'local'; }\n    if (this.options.allowNull == null) { this.options.allowNull = true; }\n    if (this.options.nullValue == null) { this.options.nullValue = 0; }\n    if (this.options.lazy == null) { this.options.lazy = false; }\n    if (this.options.relativeTo) {\n      if (typeof this.options.relativeTo !== 'function') {\n        throw new Error('relativeTo option must be a function');\n      }\n      this.relativeToGetter = options.relativeTo;\n    }\n  }\n\n  decode(stream, ctx) {\n    const offset = this.offsetType.decode(stream, ctx);\n\n    // handle NULL pointers\n    if ((offset === this.options.nullValue) && this.options.allowNull) {\n      return null;\n    }\n\n    let relative;\n    switch (this.options.type) {\n      case 'local':     relative = ctx._startOffset; break;\n      case 'immediate': relative = stream.pos - this.offsetType.size(); break;\n      case 'parent':    relative = ctx.parent._startOffset; break;\n      default:\n        var c = ctx;\n        while (c.parent) {\n          c = c.parent;\n        }\n\n        relative = c._startOffset || 0;\n    }\n\n    if (this.options.relativeTo) {\n      relative += this.relativeToGetter(ctx);\n    }\n\n    const ptr = offset + relative;\n\n    if (this.type != null) {\n      let val = null;\n      const decodeValue = () => {\n        if (val != null) { return val; }\n\n        const { pos } = stream;\n        stream.pos = ptr;\n        val = this.type.decode(stream, ctx);\n        stream.pos = pos;\n        return val;\n      };\n\n      // If this is a lazy pointer, define a getter to decode only when needed.\n      // This obviously only works when the pointer is contained by a Struct.\n      if (this.options.lazy) {\n        return new utils.PropertyDescriptor({\n          get: decodeValue});\n      }\n\n      return decodeValue();\n    } else {\n      return ptr;\n    }\n  }\n\n  size(val, ctx) {\n    const parent = ctx;\n    switch (this.options.type) {\n      case 'local': case 'immediate':\n        break;\n      case 'parent':\n        ctx = ctx.parent;\n        break;\n      default: // global\n        while (ctx.parent) {\n          ctx = ctx.parent;\n        }\n    }\n\n    let { type } = this;\n    if (type == null) {\n      if (!(val instanceof VoidPointer)) {\n        throw new Error(\"Must be a VoidPointer\");\n      }\n\n      ({ type } = val);\n      val = val.value;\n    }\n\n    if (val && ctx) {\n      // Must be written as two separate lines rather than += in case `type.size` mutates ctx.pointerSize.\n      let size = type.size(val, parent);\n      ctx.pointerSize += size;\n    }\n\n    return this.offsetType.size();\n  }\n\n  encode(stream, val, ctx) {\n    let relative;\n    const parent = ctx;\n    if ((val == null)) {\n      this.offsetType.encode(stream, this.options.nullValue);\n      return;\n    }\n\n    switch (this.options.type) {\n      case 'local':\n        relative = ctx.startOffset;\n        break;\n      case 'immediate':\n        relative = stream.pos + this.offsetType.size(val, parent);\n        break;\n      case 'parent':\n        ctx = ctx.parent;\n        relative = ctx.startOffset;\n        break;\n      default: // global\n        relative = 0;\n        while (ctx.parent) {\n          ctx = ctx.parent;\n        }\n    }\n\n    if (this.options.relativeTo) {\n      relative += this.relativeToGetter(parent.val);\n    }\n\n    this.offsetType.encode(stream, ctx.pointerOffset - relative);\n\n    let { type } = this;\n    if (type == null) {\n      if (!(val instanceof VoidPointer)) {\n        throw new Error(\"Must be a VoidPointer\");\n      }\n\n      ({ type } = val);\n      val = val.value;\n    }\n\n    ctx.pointers.push({\n      type,\n      val,\n      parent\n    });\n\n    return ctx.pointerOffset += type.size(val, parent);\n  }\n}\n\n// A pointer whose type is determined at decode time\nexport class VoidPointer {\n  constructor(type, value) {\n    this.type = type;\n    this.value = value;\n  }\n}\n", "function _define_property(obj, key, value) {\n    if (key in obj) {\n        Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true });\n    } else obj[key] = value;\n\n    return obj;\n}\nexport { _define_property as _ };\n", "/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n  extendStatics = Object.setPrototypeOf ||\n      ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n      function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n  return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n  if (typeof b !== \"function\" && b !== null)\n      throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n  extendStatics(d, b);\n  function __() { this.constructor = d; }\n  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n  __assign = Object.assign || function __assign(t) {\n      for (var s, i = 1, n = arguments.length; i < n; i++) {\n          s = arguments[i];\n          for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n      }\n      return t;\n  }\n  return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n  var t = {};\n  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n      t[p] = s[p];\n  if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n      for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n          if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n              t[p[i]] = s[p[i]];\n      }\n  return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n  if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n  return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n  return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n  function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n  var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n  var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n  var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n  var _, done = false;\n  for (var i = decorators.length - 1; i >= 0; i--) {\n      var context = {};\n      for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n      for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n      context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n      var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n      if (kind === \"accessor\") {\n          if (result === void 0) continue;\n          if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n          if (_ = accept(result.get)) descriptor.get = _;\n          if (_ = accept(result.set)) descriptor.set = _;\n          if (_ = accept(result.init)) initializers.unshift(_);\n      }\n      else if (_ = accept(result)) {\n          if (kind === \"field\") initializers.unshift(_);\n          else descriptor[key] = _;\n      }\n  }\n  if (target) Object.defineProperty(target, contextIn.name, descriptor);\n  done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n  var useValue = arguments.length > 2;\n  for (var i = 0; i < initializers.length; i++) {\n      value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n  }\n  return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n  return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n  if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n  return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n  if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n  return new (P || (P = Promise))(function (resolve, reject) {\n      function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n      function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n      function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n  });\n}\n\nexport function __generator(thisArg, body) {\n  var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n  return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n  function verb(n) { return function (v) { return step([n, v]); }; }\n  function step(op) {\n      if (f) throw new TypeError(\"Generator is already executing.\");\n      while (g && (g = 0, op[0] && (_ = 0)), _) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n              case 0: case 1: t = op; break;\n              case 4: _.label++; return { value: op[1], done: false };\n              case 5: _.label++; y = op[1]; op = [0]; continue;\n              case 7: op = _.ops.pop(); _.trys.pop(); continue;\n              default:\n                  if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n                  if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n                  if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n                  if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n                  if (t[2]) _.ops.pop();\n                  _.trys.pop(); continue;\n          }\n          op = body.call(thisArg, _);\n      } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n      if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n  }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n  if (k2 === undefined) k2 = k;\n  var desc = Object.getOwnPropertyDescriptor(m, k);\n  if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n      desc = { enumerable: true, get: function() { return m[k]; } };\n  }\n  Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n  if (k2 === undefined) k2 = k;\n  o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n  for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n  var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n  if (m) return m.call(o);\n  if (o && typeof o.length === \"number\") return {\n      next: function () {\n          if (o && i >= o.length) o = void 0;\n          return { value: o && o[i++], done: !o };\n      }\n  };\n  throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n  var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n  if (!m) return o;\n  var i = m.call(o), r, ar = [], e;\n  try {\n      while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n  }\n  catch (error) { e = { error: error }; }\n  finally {\n      try {\n          if (r && !r.done && (m = i[\"return\"])) m.call(i);\n      }\n      finally { if (e) throw e.error; }\n  }\n  return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n  for (var ar = [], i = 0; i < arguments.length; i++)\n      ar = ar.concat(__read(arguments[i]));\n  return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n  for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n  for (var r = Array(s), k = 0, i = 0; i < il; i++)\n      for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n          r[k] = a[j];\n  return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n  if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n      if (ar || !(i in from)) {\n          if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n          ar[i] = from[i];\n      }\n  }\n  return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n  return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n  if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n  var g = generator.apply(thisArg, _arguments || []), i, q = [];\n  return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n  function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n  function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n  function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n  function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n  function fulfill(value) { resume(\"next\", value); }\n  function reject(value) { resume(\"throw\", value); }\n  function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n  var i, p;\n  return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n  function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n  if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n  var m = o[Symbol.asyncIterator], i;\n  return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n  function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n  function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n  if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n  return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n  Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n  o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n  ownKeys = Object.getOwnPropertyNames || function (o) {\n    var ar = [];\n    for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n    return ar;\n  };\n  return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n  if (mod && mod.__esModule) return mod;\n  var result = {};\n  if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n  __setModuleDefault(result, mod);\n  return result;\n}\n\nexport function __importDefault(mod) {\n  return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n  if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n  if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n  return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n  if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n  if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n  if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n  return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n  if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n  return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n  if (value !== null && value !== void 0) {\n    if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n    var dispose, inner;\n    if (async) {\n      if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n      dispose = value[Symbol.asyncDispose];\n    }\n    if (dispose === void 0) {\n      if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n      dispose = value[Symbol.dispose];\n      if (async) inner = dispose;\n    }\n    if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n    if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n    env.stack.push({ value: value, dispose: dispose, async: async });\n  }\n  else if (async) {\n    env.stack.push({ async: true });\n  }\n  return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n  var e = new Error(message);\n  return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n  function fail(e) {\n    env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n    env.hasError = true;\n  }\n  var r, s = 0;\n  function next() {\n    while (r = env.stack.pop()) {\n      try {\n        if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n        if (r.dispose) {\n          var result = r.dispose.call(r.value);\n          if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n        }\n        else s |= 1;\n      }\n      catch (e) {\n        fail(e);\n      }\n    }\n    if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n    if (env.hasError) throw env.error;\n  }\n  return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n  if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n      return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n          return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n      });\n  }\n  return path;\n}\n\nexport default {\n  __extends,\n  __assign,\n  __rest,\n  __decorate,\n  __param,\n  __esDecorate,\n  __runInitializers,\n  __propKey,\n  __setFunctionName,\n  __metadata,\n  __awaiter,\n  __generator,\n  __createBinding,\n  __exportStar,\n  __values,\n  __read,\n  __spread,\n  __spreadArrays,\n  __spreadArray,\n  __await,\n  __asyncGenerator,\n  __asyncDelegator,\n  __asyncValues,\n  __makeTemplateObject,\n  __importStar,\n  __importDefault,\n  __classPrivateFieldGet,\n  __classPrivateFieldSet,\n  __classPrivateFieldIn,\n  __addDisposableResource,\n  __disposeResources,\n  __rewriteRelativeImportExtension,\n};\n", "import base64 from 'base64-js';\nimport UnicodeTrie from 'unicode-trie';\nimport data from './data.json';\n\nconst trie = new UnicodeTrie(base64.toByteArray(require('fs').readFileSync(__dirname + '/data.trie', 'base64')));\n\nconst log2 = Math.log2 || (n => Math.log(n) / Math.LN2);\nconst bits = (n) => ((log2(n) + 1) | 0);\n\n// compute the number of bits stored for each field\nconst CATEGORY_BITS = bits(data.categories.length - 1);\nconst COMBINING_BITS = bits(data.combiningClasses.length - 1);\nconst SCRIPT_BITS = bits(data.scripts.length - 1);\nconst EAW_BITS = bits(data.eaw.length - 1);\nconst NUMBER_BITS = 10;\n\n// compute shift and mask values for each field\nconst CATEGORY_SHIFT = COMBINING_BITS + SCRIPT_BITS + EAW_BITS + NUMBER_BITS;\nconst COMBINING_SHIFT = SCRIPT_BITS + EAW_BITS + NUMBER_BITS;\nconst SCRIPT_SHIFT = EAW_BITS + NUMBER_BITS;\nconst EAW_SHIFT = NUMBER_BITS;\nconst CATEGORY_MASK = (1 << CATEGORY_BITS) - 1;\nconst COMBINING_MASK = (1 << COMBINING_BITS) - 1;\nconst SCRIPT_MASK = (1 << SCRIPT_BITS) - 1;\nconst EAW_MASK = (1 << EAW_BITS) - 1;\nconst NUMBER_MASK = (1 << NUMBER_BITS) - 1;\n\nexport function getCategory(codePoint) {\n  const val = trie.get(codePoint);\n  return data.categories[(val >> CATEGORY_SHIFT) & CATEGORY_MASK];\n}\n\nexport function getCombiningClass(codePoint) {\n  const val = trie.get(codePoint);\n  return data.combiningClasses[(val >> COMBINING_SHIFT) & COMBINING_MASK];\n}\n\nexport function getScript(codePoint) {\n  const val = trie.get(codePoint);\n  return data.scripts[(val >> SCRIPT_SHIFT) & SCRIPT_MASK];\n}\n\nexport function getEastAsianWidth(codePoint) {\n  const val = trie.get(codePoint);\n  return data.eaw[(val >> EAW_SHIFT) & EAW_MASK];\n}\n\nexport function getNumericValue(codePoint) {\n  let val = trie.get(codePoint);\n  let num = val & NUMBER_MASK;\n\n  if (num === 0) {\n    return null;\n  } else if (num <= 50) {\n    return num - 1;\n  } else if (num < 0x1e0) {\n    const numerator = (num >> 4) - 12;\n    const denominator = (num & 0xf) + 1;\n    return numerator / denominator;\n  } else if (num < 0x300) {\n    val = (num >> 5) - 14;\n    let exp = (num & 0x1f) + 2;\n\n    while (exp > 0) {\n      val *= 10;\n      exp--;\n    }\n    return val;\n  } else {\n    val = (num >> 2) - 0xbf;\n    let exp = (num & 3) + 1;\n    while (exp > 0) {\n      val *= 60;\n      exp--;\n    }\n    return val;\n  }\n}\n\nexport function isAlphabetic(codePoint) {\n  const category = getCategory(codePoint);\n  return (\n    category === 'Lu' ||\n    category === 'Ll' ||\n    category === 'Lt' ||\n    category === 'Lm' ||\n    category === 'Lo' ||\n    category === 'Nl'\n  )\n}\n\nexport function isDigit(codePoint) {\n  return getCategory(codePoint) === 'Nd'\n}\n\nexport function isPunctuation(codePoint) {\n  const category = getCategory(codePoint);\n  return (\n    category === 'Pc' ||\n    category === 'Pd' ||\n    category === 'Pe' ||\n    category === 'Pf' ||\n    category === 'Pi' ||\n    category === 'Po' ||\n    category === 'Ps'\n  );\n}\n\nexport function isLowerCase(codePoint) {\n  return getCategory(codePoint) === 'Ll';\n}\n\nexport function isUpperCase(codePoint) {\n  return getCategory(codePoint) === 'Lu'\n}\n\nexport function isTitleCase(codePoint) {\n  return getCategory(codePoint) === 'Lt'\n}\n\nexport function isWhiteSpace(codePoint) {\n  const category = getCategory(codePoint);\n  return (\n    category === 'Zs' ||\n    category === 'Zl' ||\n    category === 'Zp'\n  );\n}\n\nexport function isBaseForm(codePoint) {\n  const category = getCategory(codePoint);\n  return (\n    category === 'Nd' ||\n    category === 'No' ||\n    category === 'Nl' ||\n    category === 'Lu' ||\n    category === 'Ll' ||\n    category === 'Lt' ||\n    category === 'Lm' ||\n    category === 'Lo' ||\n    category === 'Me' ||\n    category === 'Mc'\n  )\n}\n\nexport function isMark(codePoint) {\n  const category = getCategory(codePoint);\n  return (\n    category === 'Mn' ||\n    category === 'Me' ||\n    category === 'Mc'\n  );\n}\n\n// Backwards compatibility.\nexport default {\n  getCategory,\n  getCombiningClass,\n  getScript,\n  getEastAsianWidth,\n  getNumericValue,\n  isAlphabetic,\n  isDigit,\n  isPunctuation,\n  isLowerCase,\n  isUpperCase,\n  isTitleCase,\n  isWhiteSpace,\n  isBaseForm,\n  isMark\n};\n", "{\"categories\":[\"Cc\",\"Zs\",\"Po\",\"Sc\",\"Ps\",\"Pe\",\"Sm\",\"Pd\",\"Nd\",\"Lu\",\"Sk\",\"Pc\",\"Ll\",\"So\",\"Lo\",\"Pi\",\"Cf\",\"No\",\"Pf\",\"Lt\",\"Lm\",\"Mn\",\"Me\",\"Mc\",\"Nl\",\"Zl\",\"Zp\",\"Cs\",\"Co\"],\"combiningClasses\":[\"Not_Reordered\",\"Above\",\"Above_Right\",\"Below\",\"Attached_Above_Right\",\"Attached_Below\",\"Overlay\",\"Iota_Subscript\",\"Double_Below\",\"Double_Above\",\"Below_Right\",\"Above_Left\",\"CCC10\",\"CCC11\",\"CCC12\",\"CCC13\",\"CCC14\",\"CCC15\",\"CCC16\",\"CCC17\",\"CCC18\",\"CCC19\",\"CCC20\",\"CCC21\",\"CCC22\",\"CCC23\",\"CCC24\",\"CCC25\",\"CCC30\",\"CCC31\",\"CCC32\",\"CCC27\",\"CCC28\",\"CCC29\",\"CCC33\",\"CCC34\",\"CCC35\",\"CCC36\",\"Nukta\",\"Virama\",\"CCC84\",\"CCC91\",\"CCC103\",\"CCC107\",\"CCC118\",\"CCC122\",\"CCC129\",\"CCC130\",\"CCC132\",\"Attached_Above\",\"Below_Left\",\"Left\",\"Kana_Voicing\",\"CCC26\",\"Right\"],\"scripts\":[\"Common\",\"Latin\",\"Bopomofo\",\"Inherited\",\"Greek\",\"Coptic\",\"Cyrillic\",\"Armenian\",\"Hebrew\",\"Arabic\",\"Syriac\",\"Thaana\",\"Nko\",\"Samaritan\",\"Mandaic\",\"Devanagari\",\"Bengali\",\"Gurmukhi\",\"Gujarati\",\"Oriya\",\"Tamil\",\"Telugu\",\"Kannada\",\"Malayalam\",\"Sinhala\",\"Thai\",\"Lao\",\"Tibetan\",\"Myanmar\",\"Georgian\",\"Hangul\",\"Ethiopic\",\"Cherokee\",\"Canadian_Aboriginal\",\"Ogham\",\"Runic\",\"Tagalog\",\"Hanunoo\",\"Buhid\",\"Tagbanwa\",\"Khmer\",\"Mongolian\",\"Limbu\",\"Tai_Le\",\"New_Tai_Lue\",\"Buginese\",\"Tai_Tham\",\"Balinese\",\"Sundanese\",\"Batak\",\"Lepcha\",\"Ol_Chiki\",\"Braille\",\"Glagolitic\",\"Tifinagh\",\"Han\",\"Hiragana\",\"Katakana\",\"Yi\",\"Lisu\",\"Vai\",\"Bamum\",\"Syloti_Nagri\",\"Phags_Pa\",\"Saurashtra\",\"Kayah_Li\",\"Rejang\",\"Javanese\",\"Cham\",\"Tai_Viet\",\"Meetei_Mayek\",\"null\",\"Linear_B\",\"Lycian\",\"Carian\",\"Old_Italic\",\"Gothic\",\"Old_Permic\",\"Ugaritic\",\"Old_Persian\",\"Deseret\",\"Shavian\",\"Osmanya\",\"Osage\",\"Elbasan\",\"Caucasian_Albanian\",\"Linear_A\",\"Cypriot\",\"Imperial_Aramaic\",\"Palmyrene\",\"Nabataean\",\"Hatran\",\"Phoenician\",\"Lydian\",\"Meroitic_Hieroglyphs\",\"Meroitic_Cursive\",\"Kharoshthi\",\"Old_South_Arabian\",\"Old_North_Arabian\",\"Manichaean\",\"Avestan\",\"Inscriptional_Parthian\",\"Inscriptional_Pahlavi\",\"Psalter_Pahlavi\",\"Old_Turkic\",\"Old_Hungarian\",\"Hanifi_Rohingya\",\"Old_Sogdian\",\"Sogdian\",\"Elymaic\",\"Brahmi\",\"Kaithi\",\"Sora_Sompeng\",\"Chakma\",\"Mahajani\",\"Sharada\",\"Khojki\",\"Multani\",\"Khudawadi\",\"Grantha\",\"Newa\",\"Tirhuta\",\"Siddham\",\"Modi\",\"Takri\",\"Ahom\",\"Dogra\",\"Warang_Citi\",\"Nandinagari\",\"Zanabazar_Square\",\"Soyombo\",\"Pau_Cin_Hau\",\"Bhaiksuki\",\"Marchen\",\"Masaram_Gondi\",\"Gunjala_Gondi\",\"Makasar\",\"Cuneiform\",\"Egyptian_Hieroglyphs\",\"Anatolian_Hieroglyphs\",\"Mro\",\"Bassa_Vah\",\"Pahawh_Hmong\",\"Medefaidrin\",\"Miao\",\"Tangut\",\"Nushu\",\"Duployan\",\"SignWriting\",\"Nyiakeng_Puachue_Hmong\",\"Wancho\",\"Mende_Kikakui\",\"Adlam\"],\"eaw\":[\"N\",\"Na\",\"A\",\"W\",\"H\",\"F\"]}", "import { registerFormat, create, defaultLanguage, setDefaultLanguage } from './base';\nimport TTFFont from './TTFFont';\nimport WOFFFont from './WOFFFont';\nimport WOFF2Font from './WOFF2Font';\nimport TrueTypeCollection from './TrueTypeCollection';\nimport DFont from './DFont';\n\n// Register font formats\nregisterFormat(TTFFont);\nregisterFormat(WOFFFont);\nregisterFormat(WOFF2Font);\nregisterFormat(TrueTypeCollection);\nregisterFormat(DFont);\n\nexport * from './base';\n", "import {DecodeStream} from 'restructure';\n\nexport let logErrors = false;\n\nlet formats = [];\nexport function registerFormat(format) {\n  formats.push(format);\n};\n\nexport function create(buffer, postscriptName) {\n  for (let i = 0; i < formats.length; i++) {\n    let format = formats[i];\n    if (format.probe(buffer)) {\n      let font = new format(new DecodeStream(buffer));\n      if (postscriptName) {\n        return font.getFont(postscriptName);\n      }\n\n      return font;\n    }\n  }\n\n  throw new Error('Unknown font format');\n};\n\nexport let defaultLanguage = 'en';\nexport function setDefaultLanguage(lang = 'en') {\n  defaultLanguage = lang;\n};\n", "import * as r from 'restructure';\nimport { cache } from './decorators';\nimport * as fontkit from './base';\nimport Directory from './tables/directory';\nimport tables from './tables';\nimport CmapProcessor from './CmapProcessor';\nimport LayoutEngine from './layout/LayoutEngine';\nimport TTFGlyph from './glyph/TTFGlyph';\nimport CFFGlyph from './glyph/CFFGlyph';\nimport SBIXGlyph from './glyph/SBIXGlyph';\nimport COLRGlyph from './glyph/COLRGlyph';\nimport GlyphVariationProcessor from './glyph/GlyphVariationProcessor';\nimport TTFSubset from './subset/TTFSubset';\nimport CFFSubset from './subset/CFFSubset';\nimport BBox from './glyph/BBox';\nimport { asciiDecoder } from './utils';\n\n/**\n * This is the base class for all SFNT-based font formats in fontkit.\n * It supports TrueType, and PostScript glyphs, and several color glyph formats.\n */\nexport default class TTFFont {\n  type = 'TTF';\n\n  static probe(buffer) {\n    let format = asciiDecoder.decode(buffer.slice(0, 4));\n    return format === 'true' || format === 'OTTO' || format === String.fromCharCode(0, 1, 0, 0);\n  }\n\n  constructor(stream, variationCoords = null) {\n    this.defaultLanguage = null;\n    this.stream = stream;\n    this.variationCoords = variationCoords;\n\n    this._directoryPos = this.stream.pos;\n    this._tables = {};\n    this._glyphs = {};\n    this._decodeDirectory();\n\n    // define properties for each table to lazily parse\n    for (let tag in this.directory.tables) {\n      let table = this.directory.tables[tag];\n      if (tables[tag] && table.length > 0) {\n        Object.defineProperty(this, tag, {\n          get: this._getTable.bind(this, table)\n        });\n      }\n    }\n  }\n\n  setDefaultLanguage(lang = null) {\n    this.defaultLanguage = lang;\n  }\n\n  _getTable(table) {\n    if (!(table.tag in this._tables)) {\n      try {\n        this._tables[table.tag] = this._decodeTable(table);\n      } catch (e) {\n        if (fontkit.logErrors) {\n          console.error(`Error decoding table ${table.tag}`);\n          console.error(e.stack);\n        }\n      }\n    }\n\n    return this._tables[table.tag];\n  }\n\n  _getTableStream(tag) {\n    let table = this.directory.tables[tag];\n    if (table) {\n      this.stream.pos = table.offset;\n      return this.stream;\n    }\n\n    return null;\n  }\n\n  _decodeDirectory() {\n    return this.directory = Directory.decode(this.stream, {_startOffset: 0});\n  }\n\n  _decodeTable(table) {\n    let pos = this.stream.pos;\n\n    let stream = this._getTableStream(table.tag);\n    let result = tables[table.tag].decode(stream, this, table.length);\n\n    this.stream.pos = pos;\n    return result;\n  }\n\n  /**\n   * Gets a string from the font's `name` table\n   * `lang` is a BCP-47 language code.\n   * @return {string}\n   */\n  getName(key, lang = this.defaultLanguage || fontkit.defaultLanguage) {\n    let record = this.name && this.name.records[key];\n    if (record) {\n      // Attempt to retrieve the entry, depending on which translation is available:\n      return (\n          record[lang]\n          || record[this.defaultLanguage]\n          || record[fontkit.defaultLanguage]\n          || record['en']\n          || record[Object.keys(record)[0]] // Seriously, ANY language would be fine\n          || null\n      );\n    }\n\n    return null;\n  }\n\n  /**\n   * The unique PostScript name for this font, e.g. \"Helvetica-Bold\"\n   * @type {string}\n   */\n  get postscriptName() {\n    return this.getName('postscriptName');\n  }\n\n  /**\n   * The font's full name, e.g. \"Helvetica Bold\"\n   * @type {string}\n   */\n  get fullName() {\n    return this.getName('fullName');\n  }\n\n  /**\n   * The font's family name, e.g. \"Helvetica\"\n   * @type {string}\n   */\n  get familyName() {\n    return this.getName('fontFamily');\n  }\n\n  /**\n   * The font's sub-family, e.g. \"Bold\".\n   * @type {string}\n   */\n  get subfamilyName() {\n    return this.getName('fontSubfamily');\n  }\n\n  /**\n   * The font's copyright information\n   * @type {string}\n   */\n  get copyright() {\n    return this.getName('copyright');\n  }\n\n  /**\n   * The font's version number\n   * @type {string}\n   */\n  get version() {\n    return this.getName('version');\n  }\n\n  /**\n   * The font’s [ascender](https://en.wikipedia.org/wiki/Ascender_(typography))\n   * @type {number}\n   */\n  get ascent() {\n    return this.hhea.ascent;\n  }\n\n  /**\n   * The font’s [descender](https://en.wikipedia.org/wiki/Descender)\n   * @type {number}\n   */\n  get descent() {\n    return this.hhea.descent;\n  }\n\n  /**\n   * The amount of space that should be included between lines\n   * @type {number}\n   */\n  get lineGap() {\n    return this.hhea.lineGap;\n  }\n\n  /**\n   * The offset from the normal underline position that should be used\n   * @type {number}\n   */\n  get underlinePosition() {\n    return this.post.underlinePosition;\n  }\n\n  /**\n   * The weight of the underline that should be used\n   * @type {number}\n   */\n  get underlineThickness() {\n    return this.post.underlineThickness;\n  }\n\n  /**\n   * If this is an italic font, the angle the cursor should be drawn at to match the font design\n   * @type {number}\n   */\n  get italicAngle() {\n    return this.post.italicAngle;\n  }\n\n  /**\n   * The height of capital letters above the baseline.\n   * See [here](https://en.wikipedia.org/wiki/Cap_height) for more details.\n   * @type {number}\n   */\n  get capHeight() {\n    let os2 = this['OS/2'];\n    return os2 ? os2.capHeight : this.ascent;\n  }\n\n  /**\n   * The height of lower case letters in the font.\n   * See [here](https://en.wikipedia.org/wiki/X-height) for more details.\n   * @type {number}\n   */\n  get xHeight() {\n    let os2 = this['OS/2'];\n    return os2 ? os2.xHeight : 0;\n  }\n\n  /**\n   * The number of glyphs in the font.\n   * @type {number}\n   */\n  get numGlyphs() {\n    return this.maxp.numGlyphs;\n  }\n\n  /**\n   * The size of the font’s internal coordinate grid\n   * @type {number}\n   */\n  get unitsPerEm() {\n    return this.head.unitsPerEm;\n  }\n\n  /**\n   * The font’s bounding box, i.e. the box that encloses all glyphs in the font.\n   * @type {BBox}\n   */\n  @cache\n  get bbox() {\n    return Object.freeze(new BBox(this.head.xMin, this.head.yMin, this.head.xMax, this.head.yMax));\n  }\n\n  @cache\n  get _cmapProcessor() {\n    return new CmapProcessor(this.cmap);\n  }\n\n  /**\n   * An array of all of the unicode code points supported by the font.\n   * @type {number[]}\n   */\n  @cache\n  get characterSet() {\n    return this._cmapProcessor.getCharacterSet();\n  }\n\n  /**\n   * Returns whether there is glyph in the font for the given unicode code point.\n   *\n   * @param {number} codePoint\n   * @return {boolean}\n   */\n  hasGlyphForCodePoint(codePoint) {\n    return !!this._cmapProcessor.lookup(codePoint);\n  }\n\n  /**\n   * Maps a single unicode code point to a Glyph object.\n   * Does not perform any advanced substitutions (there is no context to do so).\n   *\n   * @param {number} codePoint\n   * @return {Glyph}\n   */\n  glyphForCodePoint(codePoint) {\n    return this.getGlyph(this._cmapProcessor.lookup(codePoint), [codePoint]);\n  }\n\n  /**\n   * Returns an array of Glyph objects for the given string.\n   * This is only a one-to-one mapping from characters to glyphs.\n   * For most uses, you should use font.layout (described below), which\n   * provides a much more advanced mapping supporting AAT and OpenType shaping.\n   *\n   * @param {string} string\n   * @return {Glyph[]}\n   */\n  glyphsForString(string) {\n    let glyphs = [];\n    let len = string.length;\n    let idx = 0;\n    let last = -1;\n    let state = -1;\n\n    while (idx <= len) {\n      let code = 0;\n      let nextState = 0;\n\n      if (idx < len) {\n        // Decode the next codepoint from UTF 16\n        code = string.charCodeAt(idx++);\n        if (0xd800 <= code && code <= 0xdbff && idx < len) {\n          let next = string.charCodeAt(idx);\n          if (0xdc00 <= next && next <= 0xdfff) {\n            idx++;\n            code = ((code & 0x3ff) << 10) + (next & 0x3ff) + 0x10000;\n          }\n        }\n\n        // Compute the next state: 1 if the next codepoint is a variation selector, 0 otherwise.\n        nextState = ((0xfe00 <= code && code <= 0xfe0f) || (0xe0100 <= code && code <= 0xe01ef)) ? 1 : 0;\n      } else {\n        idx++;\n      }\n\n      if (state === 0 && nextState === 1) {\n        // Variation selector following normal codepoint.\n        glyphs.push(this.getGlyph(this._cmapProcessor.lookup(last, code), [last, code]));\n      } else if (state === 0 && nextState === 0) {\n        // Normal codepoint following normal codepoint.\n        glyphs.push(this.glyphForCodePoint(last));\n      }\n\n      last = code;\n      state = nextState;\n    }\n\n    return glyphs;\n  }\n\n  @cache\n  get _layoutEngine() {\n    return new LayoutEngine(this);\n  }\n\n  /**\n   * Returns a GlyphRun object, which includes an array of Glyphs and GlyphPositions for the given string.\n   *\n   * @param {string} string\n   * @param {string[]} [userFeatures]\n   * @param {string} [script]\n   * @param {string} [language]\n   * @param {string} [direction]\n   * @return {GlyphRun}\n   */\n  layout(string, userFeatures, script, language, direction) {\n    return this._layoutEngine.layout(string, userFeatures, script, language, direction);\n  }\n\n  /**\n   * Returns an array of strings that map to the given glyph id.\n   * @param {number} gid - glyph id\n   */\n  stringsForGlyph(gid) {\n    return this._layoutEngine.stringsForGlyph(gid);\n  }\n\n  /**\n   * An array of all [OpenType feature tags](https://www.microsoft.com/typography/otspec/featuretags.htm)\n   * (or mapped AAT tags) supported by the font.\n   * The features parameter is an array of OpenType feature tags to be applied in addition to the default set.\n   * If this is an AAT font, the OpenType feature tags are mapped to AAT features.\n   *\n   * @type {string[]}\n   */\n  get availableFeatures() {\n    return this._layoutEngine.getAvailableFeatures();\n  }\n\n  getAvailableFeatures(script, language) {\n    return this._layoutEngine.getAvailableFeatures(script, language);\n  }\n\n  _getBaseGlyph(glyph, characters = []) {\n    if (!this._glyphs[glyph]) {\n      if (this.directory.tables.glyf) {\n        this._glyphs[glyph] = new TTFGlyph(glyph, characters, this);\n\n      } else if (this.directory.tables['CFF '] || this.directory.tables.CFF2) {\n        this._glyphs[glyph] = new CFFGlyph(glyph, characters, this);\n      }\n    }\n\n    return this._glyphs[glyph] || null;\n  }\n\n  /**\n   * Returns a glyph object for the given glyph id.\n   * You can pass the array of code points this glyph represents for\n   * your use later, and it will be stored in the glyph object.\n   *\n   * @param {number} glyph\n   * @param {number[]} characters\n   * @return {Glyph}\n   */\n  getGlyph(glyph, characters = []) {\n    if (!this._glyphs[glyph]) {\n      if (this.directory.tables.sbix) {\n        this._glyphs[glyph] = new SBIXGlyph(glyph, characters, this);\n\n      } else if ((this.directory.tables.COLR) && (this.directory.tables.CPAL)) {\n        this._glyphs[glyph] = new COLRGlyph(glyph, characters, this);\n\n      } else {\n        this._getBaseGlyph(glyph, characters);\n      }\n    }\n\n    return this._glyphs[glyph] || null;\n  }\n\n  /**\n   * Returns a Subset for this font.\n   * @return {Subset}\n   */\n  createSubset() {\n    if (this.directory.tables['CFF ']) {\n      return new CFFSubset(this);\n    }\n\n    return new TTFSubset(this);\n  }\n\n  /**\n   * Returns an object describing the available variation axes\n   * that this font supports. Keys are setting tags, and values\n   * contain the axis name, range, and default value.\n   *\n   * @type {object}\n   */\n  @cache\n  get variationAxes() {\n    let res = {};\n    if (!this.fvar) {\n      return res;\n    }\n\n    for (let axis of this.fvar.axis) {\n      res[axis.axisTag.trim()] = {\n        name: axis.name.en,\n        min: axis.minValue,\n        default: axis.defaultValue,\n        max: axis.maxValue\n      };\n    }\n\n    return res;\n  }\n\n  /**\n   * Returns an object describing the named variation instances\n   * that the font designer has specified. Keys are variation names\n   * and values are the variation settings for this instance.\n   *\n   * @type {object}\n   */\n  @cache\n  get namedVariations() {\n    let res = {};\n    if (!this.fvar) {\n      return res;\n    }\n\n    for (let instance of this.fvar.instance) {\n      let settings = {};\n      for (let i = 0; i < this.fvar.axis.length; i++) {\n        let axis = this.fvar.axis[i];\n        settings[axis.axisTag.trim()] = instance.coord[i];\n      }\n\n      res[instance.name.en] = settings;\n    }\n\n    return res;\n  }\n\n  /**\n   * Returns a new font with the given variation settings applied.\n   * Settings can either be an instance name, or an object containing\n   * variation tags as specified by the `variationAxes` property.\n   *\n   * @param {object} settings\n   * @return {TTFFont}\n   */\n  getVariation(settings) {\n    if (!(this.directory.tables.fvar && ((this.directory.tables.gvar && this.directory.tables.glyf) || this.directory.tables.CFF2))) {\n      throw new Error('Variations require a font with the fvar, gvar and glyf, or CFF2 tables.');\n    }\n\n    if (typeof settings === 'string') {\n      settings = this.namedVariations[settings];\n    }\n\n    if (typeof settings !== 'object') {\n      throw new Error('Variation settings must be either a variation name or settings object.');\n    }\n\n    // normalize the coordinates\n    let coords = this.fvar.axis.map((axis, i) => {\n      let axisTag = axis.axisTag.trim();\n      if (axisTag in settings) {\n        return Math.max(axis.minValue, Math.min(axis.maxValue, settings[axisTag]));\n      } else {\n        return axis.defaultValue;\n      }\n    });\n\n    let stream = new r.DecodeStream(this.stream.buffer);\n    stream.pos = this._directoryPos;\n\n    let font = new TTFFont(stream, coords);\n    font._tables = this._tables;\n\n    return font;\n  }\n\n  @cache\n  get _variationProcessor() {\n    if (!this.fvar) {\n      return null;\n    }\n\n    let variationCoords = this.variationCoords;\n\n    // Ignore if no variation coords and not CFF2\n    if (!variationCoords && !this.CFF2) {\n      return null;\n    }\n\n    if (!variationCoords) {\n      variationCoords = this.fvar.axis.map(axis => axis.defaultValue);\n    }\n\n    return new GlyphVariationProcessor(this, variationCoords);\n  }\n\n  // Standardized format plugin API\n  getFont(name) {\n    return this.getVariation(name);\n  }\n}\n", "/**\n * This decorator caches the results of a getter or method such that\n * the results are lazily computed once, and then cached.\n * @private\n */\nexport function cache(target, key, descriptor) {\n  if (descriptor.get) {\n    let get = descriptor.get;\n    descriptor.get = function() {\n      let value = get.call(this);\n      Object.defineProperty(this, key, { value });\n      return value;\n    };\n  } else if (typeof descriptor.value === 'function') {\n    let fn = descriptor.value;\n\n    return {\n      get() {\n        let cache = new Map;\n        function memoized(...args) {\n          let key = args.length > 0 ? args[0] : 'value';\n          if (cache.has(key)) {\n            return cache.get(key);\n          }\n\n          let result = fn.apply(this, args);\n          cache.set(key, result);\n          return result;\n        };\n\n        Object.defineProperty(this, key, {value: memoized});\n        return memoized;\n      }\n    };\n  }\n}\n", "import * as r from 'restructure';\nimport Tables from './';\n\nlet TableEntry = new r.Struct({\n  tag:        new r.String(4),\n  checkSum:   r.uint32,\n  offset:     new r.Pointer(r.uint32, 'void', { type: 'global' }),\n  length:     r.uint32\n});\n\nlet Directory = new r.Struct({\n  tag:            new r.String(4),\n  numTables:      r.uint16,\n  searchRange:    r.uint16,\n  entrySelector:  r.uint16,\n  rangeShift:     r.uint16,\n  tables:         new r.Array(TableEntry, 'numTables')\n});\n\nDirectory.process = function() {\n  let tables = {};\n  for (let table of this.tables) {\n    tables[table.tag] = table;\n  }\n\n  this.tables = tables;\n};\n\nDirectory.preEncode = function() {\n  if (!Array.isArray(this.tables)) {\n    let tables = [];\n    for (let tag in this.tables) {\n      let table = this.tables[tag];\n      if (table) {\n        tables.push({\n          tag: tag,\n          checkSum: 0,\n          offset: new r.VoidPointer(Tables[tag], table),\n          length: Tables[tag].size(table)\n        });\n      }\n    }\n    \n    this.tables = tables;\n  }\n\n  this.tag = 'true';\n  this.numTables = this.tables.length;\n\n  let maxExponentFor2 = Math.floor((Math.log(this.numTables) / Math.LN2));\n  let maxPowerOf2 = Math.pow(2, maxExponentFor2);\n\n  this.searchRange =  maxPowerOf2 * 16;\n  this.entrySelector = Math.log(maxPowerOf2) / Math.LN2;\n  this.rangeShift = this.numTables * 16 - this.searchRange;\n};\n\nexport default Directory;\n", "let tables = {};\nexport default tables;\n\n// Required Tables\nimport cmap from './cmap';\nimport head from './head';\nimport hhea from './hhea';\nimport hmtx from './hmtx';\nimport maxp from './maxp';\nimport name from './name';\nimport OS2 from './OS2';\nimport post from './post';\n\ntables.cmap = cmap;\ntables.head = head;\ntables.hhea = hhea;\ntables.hmtx = hmtx;\ntables.maxp = maxp;\ntables.name = name;\ntables['OS/2'] = OS2;\ntables.post = post;\n\n\n// TrueType Outlines\nimport cvt from './cvt';\nimport fpgm from './fpgm';\nimport loca from './loca';\nimport prep from './prep';\nimport glyf from './glyf';\n\ntables.fpgm = fpgm;\ntables.loca = loca;\ntables.prep = prep;\ntables['cvt '] = cvt;\ntables.glyf = glyf;\n\n\n// PostScript Outlines\nimport CFFFont from '../cff/CFFFont';\nimport VORG from './VORG';\n\ntables['CFF '] = CFFFont;\ntables['CFF2'] = CFFFont;\ntables.VORG = VORG;\n\n\n// Bitmap Glyphs\nimport EBLC from './EBLC';\nimport sbix from './sbix';\nimport COLR from './COLR';\nimport CPAL from './CPAL';\n\ntables.EBLC = EBLC;\ntables.CBLC = tables.EBLC;\ntables.sbix = sbix;\ntables.COLR = COLR;\ntables.CPAL = CPAL;\n\n\n// Advanced OpenType Tables\nimport BASE from './BASE';\nimport GDEF from './GDEF';\nimport GPOS from './GPOS';\nimport GSUB from './GSUB';\nimport JSTF from './JSTF';\n\ntables.BASE = BASE;\ntables.GDEF = GDEF;\ntables.GPOS = GPOS;\ntables.GSUB = GSUB;\ntables.JSTF = JSTF;\n\n// OpenType variations tables\nimport HVAR from './HVAR';\n\ntables.HVAR = HVAR;\n\n// Other OpenType Tables\nimport DSIG from './DSIG';\nimport gasp from './gasp';\nimport hdmx from './hdmx';\nimport kern from './kern';\nimport LTSH from './LTSH';\nimport PCLT from './PCLT';\nimport VDMX from './VDMX';\nimport vhea from './vhea';\nimport vmtx from './vmtx';\n\ntables.DSIG = DSIG;\ntables.gasp = gasp;\ntables.hdmx = hdmx;\ntables.kern = kern;\ntables.LTSH = LTSH;\ntables.PCLT = PCLT;\ntables.VDMX = VDMX;\ntables.vhea = vhea;\ntables.vmtx = vmtx;\n\n\n// Apple Advanced Typography Tables\nimport avar from './avar';\nimport bsln from './bsln';\nimport feat from './feat';\nimport fvar from './fvar';\nimport gvar from './gvar';\nimport just from './just';\nimport morx from './morx';\nimport opbd from './opbd';\n\ntables.avar = avar;\ntables.bsln = bsln;\ntables.feat = feat;\ntables.fvar = fvar;\ntables.gvar = gvar;\ntables.just = just;\ntables.morx = morx;\ntables.opbd = opbd;\n", "import * as r from 'restructure';\n\nlet SubHeader = new r.Struct({\n  firstCode:      r.uint16,\n  entryCount:     r.uint16,\n  idDelta:        r.int16,\n  idRangeOffset:  r.uint16\n});\n\nlet CmapGroup = new r.Struct({\n  startCharCode:  r.uint32,\n  endCharCode:    r.uint32,\n  glyphID:        r.uint32\n});\n\nlet UnicodeValueRange = new r.Struct({\n  startUnicodeValue:  r.uint24,\n  additionalCount:    r.uint8\n});\n\nlet UVSMapping = new r.Struct({\n  unicodeValue: r.uint24,\n  glyphID:      r.uint16\n});\n\nlet DefaultUVS = new r.Array(UnicodeValueRange, r.uint32);\nlet NonDefaultUVS = new r.Array(UVSMapping, r.uint32);\n\nlet VarSelectorRecord = new r.Struct({\n  varSelector:    r.uint24,\n  defaultUVS:     new r.Pointer(r.uint32, DefaultUVS, {type: 'parent'}),\n  nonDefaultUVS:  new r.Pointer(r.uint32, NonDefaultUVS, {type: 'parent'})\n});\n\nlet CmapSubtable = new r.VersionedStruct(r.uint16, {\n  0: { // Byte encoding\n    length:     r.uint16,   // Total table length in bytes (set to 262 for format 0)\n    language:   r.uint16,   // Language code for this encoding subtable, or zero if language-independent\n    codeMap:    new r.LazyArray(r.uint8, 256)\n  },\n\n  2: { // High-byte mapping (CJK)\n    length:           r.uint16,\n    language:         r.uint16,\n    subHeaderKeys:    new r.Array(r.uint16, 256),\n    subHeaderCount:   t => Math.max.apply(Math, t.subHeaderKeys),\n    subHeaders:       new r.LazyArray(SubHeader, 'subHeaderCount'),\n    glyphIndexArray:  new r.LazyArray(r.uint16, 'subHeaderCount')\n  },\n\n  4: { // Segment mapping to delta values\n    length:           r.uint16,              // Total table length in bytes\n    language:         r.uint16,              // Language code\n    segCountX2:       r.uint16,\n    segCount:         t => t.segCountX2 >> 1,\n    searchRange:      r.uint16,\n    entrySelector:    r.uint16,\n    rangeShift:       r.uint16,\n    endCode:          new r.LazyArray(r.uint16, 'segCount'),\n    reservedPad:      new r.Reserved(r.uint16),       // This value should be zero\n    startCode:        new r.LazyArray(r.uint16, 'segCount'),\n    idDelta:          new r.LazyArray(r.int16, 'segCount'),\n    idRangeOffset:    new r.LazyArray(r.uint16, 'segCount'),\n    glyphIndexArray:  new r.LazyArray(r.uint16, t => (t.length - t._currentOffset) / 2)\n  },\n\n  6: { // Trimmed table\n    length:         r.uint16,\n    language:       r.uint16,\n    firstCode:      r.uint16,\n    entryCount:     r.uint16,\n    glyphIndices:   new r.LazyArray(r.uint16, 'entryCount')\n  },\n\n  8: { // mixed 16-bit and 32-bit coverage\n    reserved: new r.Reserved(r.uint16),\n    length:   r.uint32,\n    language: r.uint16,\n    is32:     new r.LazyArray(r.uint8, 8192),\n    nGroups:  r.uint32,\n    groups:   new r.LazyArray(CmapGroup, 'nGroups')\n  },\n\n  10: { // Trimmed Array\n    reserved:       new r.Reserved(r.uint16),\n    length:         r.uint32,\n    language:       r.uint32,\n    firstCode:      r.uint32,\n    entryCount:     r.uint32,\n    glyphIndices:   new r.LazyArray(r.uint16, 'numChars')\n  },\n\n  12: { // Segmented coverage\n    reserved: new r.Reserved(r.uint16),\n    length:   r.uint32,\n    language: r.uint32,\n    nGroups:  r.uint32,\n    groups:   new r.LazyArray(CmapGroup, 'nGroups')\n  },\n\n  13: { // Many-to-one range mappings (same as 12 except for group.startGlyphID)\n    reserved: new r.Reserved(r.uint16),\n    length:   r.uint32,\n    language: r.uint32,\n    nGroups:  r.uint32,\n    groups:   new r.LazyArray(CmapGroup, 'nGroups')\n  },\n\n  14: { // Unicode Variation Sequences\n    length:       r.uint32,\n    numRecords:   r.uint32,\n    varSelectors: new r.LazyArray(VarSelectorRecord, 'numRecords')\n  }\n});\n\nlet CmapEntry = new r.Struct({\n  platformID:  r.uint16,  // Platform identifier\n  encodingID:  r.uint16,  // Platform-specific encoding identifier\n  table:       new r.Pointer(r.uint32, CmapSubtable, {type: 'parent', lazy: true})\n});\n\n// character to glyph mapping\nexport default new r.Struct({\n  version:      r.uint16,\n  numSubtables: r.uint16,\n  tables:       new r.Array(CmapEntry, 'numSubtables')\n});\n", "import * as r from 'restructure';\n\n// font header\nexport default new r.Struct({\n  version:            r.int32,                   // 0x00010000 (version 1.0)\n  revision:           r.int32,                   // set by font manufacturer\n  checkSumAdjustment: r.uint32,\n  magicNumber:        r.uint32,                  // set to 0x5F0F3CF5\n  flags:              r.uint16,\n  unitsPerEm:         r.uint16,                  // range from 64 to 16384\n  created:            new r.Array(r.int32, 2),\n  modified:           new r.Array(r.int32, 2),\n  xMin:               r.int16,                   // for all glyph bounding boxes\n  yMin:               r.int16,                   // for all glyph bounding boxes\n  xMax:               r.int16,                   // for all glyph bounding boxes\n  yMax:               r.int16,                   // for all glyph bounding boxes\n  macStyle:           new r.Bitfield(r.uint16, [\n    'bold', 'italic', 'underline', 'outline',\n    'shadow', 'condensed', 'extended'\n  ]),\n  lowestRecPPEM:      r.uint16,                  // smallest readable size in pixels\n  fontDirectionHint:  r.int16,\n  indexToLocFormat:   r.int16,                   // 0 for short offsets, 1 for long\n  glyphDataFormat:    r.int16                    // 0 for current format\n});\n", "import * as r from 'restructure';\n\n// horizontal header\nexport default new r.Struct({\n  version:              r.int32,\n  ascent:               r.int16,   // Distance from baseline of highest ascender\n  descent:              r.int16,   // Distance from baseline of lowest descender\n  lineGap:              r.int16,   // Typographic line gap\n  advanceWidthMax:      r.uint16,  // Maximum advance width value in 'hmtx' table\n  minLeftSideBearing:   r.int16,   // Maximum advance width value in 'hmtx' table\n  minRightSideBearing:  r.int16,   // Minimum right sidebearing value\n  xMaxExtent:           r.int16,\n  caretSlopeRise:       r.int16,   // Used to calculate the slope of the cursor (rise/run); 1 for vertical\n  caretSlopeRun:        r.int16,   // 0 for vertical\n  caretOffset:          r.int16,   // Set to 0 for non-slanted fonts\n  reserved:             new r.Reserved(r.int16, 4),\n  metricDataFormat:     r.int16,   // 0 for current format\n  numberOfMetrics:      r.uint16   // Number of advance widths in 'hmtx' table\n});\n", "import * as r from 'restructure';\n\nlet HmtxEntry = new r.Struct({\n  advance: r.uint16,\n  bearing: r.int16\n});\n\nexport default new r.Struct({\n  metrics:    new r.LazyArray(HmtxEntry, t => t.parent.hhea.numberOfMetrics),\n  bearings:   new r.LazyArray(r.int16, t => t.parent.maxp.numGlyphs - t.parent.hhea.numberOfMetrics)\n});\n", "import * as r from 'restructure';\n\n// maxiumum profile\nexport default new r.Struct({\n  version:                r.int32,\n  numGlyphs:              r.uint16,  // The number of glyphs in the font\n  maxPoints:              r.uint16,  // Maximum points in a non-composite glyph\n  maxContours:            r.uint16,  // Maximum contours in a non-composite glyph\n  maxComponentPoints:     r.uint16,  // Maximum points in a composite glyph\n  maxComponentContours:   r.uint16,  // Maximum contours in a composite glyph\n  maxZones:               r.uint16,  // 1 if instructions do not use the twilight zone, 2 otherwise\n  maxTwilightPoints:      r.uint16,  // Maximum points used in Z0\n  maxStorage:             r.uint16,  // Number of Storage Area locations\n  maxFunctionDefs:        r.uint16,  // Number of FDEFs\n  maxInstructionDefs:     r.uint16,  // Number of IDEFs\n  maxStackElements:       r.uint16,  // Maximum stack depth\n  maxSizeOfInstructions:  r.uint16,  // Maximum byte count for glyph instructions\n  maxComponentElements:   r.uint16,  // Maximum number of components referenced at “top level” for any composite glyph\n  maxComponentDepth:      r.uint16   // Maximum levels of recursion; 1 for simple components\n});\n", "import * as r from 'restructure';\nimport {getEncoding, LANGUAGES} from '../encodings';\n\nlet NameRecord = new r.Struct({\n  platformID: r.uint16,\n  encodingID: r.uint16,\n  languageID: r.uint16,\n  nameID:     r.uint16,\n  length:     r.uint16,\n  string:     new r.Pointer(r.uint16,\n    new r.String('length', t => getEncoding(t.platformID, t.encodingID, t.languageID)),\n    { type: 'parent', relativeTo: ctx => ctx.parent.stringOffset, allowNull: false }\n  )\n});\n\nlet LangTagRecord = new r.Struct({\n  length:  r.uint16,\n  tag:     new r.Pointer(r.uint16, new r.String('length', 'utf16be'), {type: 'parent', relativeTo: ctx => ctx.stringOffset})\n});\n\nvar NameTable = new r.VersionedStruct(r.uint16, {\n  0: {\n    count:          r.uint16,\n    stringOffset:   r.uint16,\n    records:        new r.Array(NameRecord, 'count')\n  },\n  1: {\n    count:          r.uint16,\n    stringOffset:   r.uint16,\n    records:        new r.Array(NameRecord, 'count'),\n    langTagCount:   r.uint16,\n    langTags:       new r.Array(LangTagRecord, 'langTagCount')\n  }\n});\n\nexport default NameTable;\n\nconst NAMES = [\n  'copyright',\n  'fontFamily',\n  'fontSubfamily',\n  'uniqueSubfamily',\n  'fullName',\n  'version',\n  'postscriptName', // Note: A font may have only one PostScript name and that name must be ASCII.\n  'trademark',\n  'manufacturer',\n  'designer',\n  'description',\n  'vendorURL',\n  'designerURL',\n  'license',\n  'licenseURL',\n  null, // reserved\n  'preferredFamily',\n  'preferredSubfamily',\n  'compatibleFull',\n  'sampleText',\n  'postscriptCIDFontName',\n  'wwsFamilyName',\n  'wwsSubfamilyName'\n];\n\nNameTable.process = function(stream) {\n  var records = {};\n  for (let record of this.records) {\n    // find out what language this is for\n    let language = LANGUAGES[record.platformID][record.languageID];\n\n    if (language == null && this.langTags != null && record.languageID >= 0x8000) {\n      language = this.langTags[record.languageID - 0x8000].tag;\n    }\n\n    if (language == null) {\n      language = record.platformID + '-' + record.languageID;\n    }\n\n    // if the nameID is >= 256, it is a font feature record (AAT)\n    let key = record.nameID >= 256 ? 'fontFeatures' : (NAMES[record.nameID] || record.nameID);\n    if (records[key] == null) {\n      records[key] = {};\n    }\n\n    let obj = records[key];\n    if (record.nameID >= 256) {\n      obj = obj[record.nameID] || (obj[record.nameID] = {});\n    }\n\n    if (typeof record.string === 'string' || typeof obj[language] !== 'string') {\n      obj[language] = record.string;\n    }\n  }\n\n  this.records = records;\n};\n\nNameTable.preEncode = function() {\n  if (Array.isArray(this.records)) return;\n  this.version = 0;\n\n  let records = [];\n  for (let key in this.records) {\n    let val = this.records[key];\n    if (key === 'fontFeatures') continue;\n\n    records.push({\n      platformID: 3,\n      encodingID: 1,\n      languageID: 0x409,\n      nameID: NAMES.indexOf(key),\n      length: val.en.length * 2,\n      string: val.en\n    });\n\n    if (key === 'postscriptName') {\n      records.push({\n        platformID: 1,\n        encodingID: 0,\n        languageID: 0,\n        nameID: NAMES.indexOf(key),\n        length: val.en.length,\n        string: val.en\n      });\n    }\n  }\n\n  this.records = records;\n  this.count = records.length;\n  this.stringOffset = NameTable.size(this, null, false);\n};\n", "/**\n * Gets an encoding name from platform, encoding, and language ids.\n * Returned encoding names can be used in iconv-lite to decode text.\n */\nexport function getEncoding(platformID, encodingID, languageID = 0) {\n  if (platformID === 1 && MAC_LANGUAGE_ENCODINGS[languageID]) {\n    return MAC_LANGUAGE_ENCODINGS[languageID];\n  }\n  \n  return ENCODINGS[platformID][encodingID];\n}\n\nconst SINGLE_BYTE_ENCODINGS = new Set(['x-mac-roman', 'x-mac-cyrillic', 'iso-8859-6', 'iso-8859-8']);\nconst MAC_ENCODINGS = {\n  'x-mac-croatian': 'ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®Š™´¨≠ŽØ∞±≤≥∆µ∂∑∏š∫ªºΩžø¿¡¬√ƒ≈Ć«Č… ÀÃÕŒœĐ—“”‘’÷◊©⁄€‹›Æ»–·‚„‰ÂćÁčÈÍÎÏÌÓÔđÒÚÛÙıˆ˜¯πË˚¸Êæˇ',\n  'x-mac-gaelic': 'ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØḂ±≤≥ḃĊċḊḋḞḟĠġṀæøṁṖṗɼƒſṠ«»… ÀÃÕŒœ–—“”‘’ṡẛÿŸṪ€‹›Ŷŷṫ·Ỳỳ⁊ÂÊÁËÈÍÎÏÌÓÔ♣ÒÚÛÙıÝýŴŵẄẅẀẁẂẃ',\n  'x-mac-greek': 'Ä¹²É³ÖÜ΅àâä΄¨çéèêë£™îï•½‰ôö¦€ùûü†ΓΔΘΛΞΠß®©ΣΪ§≠°·Α±≤≥¥ΒΕΖΗΙΚΜΦΫΨΩάΝ¬ΟΡ≈Τ«»… ΥΧΆΈœ–―“”‘’÷ΉΊΌΎέήίόΏύαβψδεφγηιξκλμνοπώρστθωςχυζϊϋΐΰ\\u00AD',\n  'x-mac-icelandic': 'ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûüÝ°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄€ÐðÞþý·‚„‰ÂÊÁËÈÍÎÏÌÓÔÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ',\n  'x-mac-inuit': 'ᐃᐄᐅᐆᐊᐋᐱᐲᐳᐴᐸᐹᑉᑎᑏᑐᑑᑕᑖᑦᑭᑮᑯᑰᑲᑳᒃᒋᒌᒍᒎᒐᒑ°ᒡᒥᒦ•¶ᒧ®©™ᒨᒪᒫᒻᓂᓃᓄᓅᓇᓈᓐᓯᓰᓱᓲᓴᓵᔅᓕᓖᓗᓘᓚᓛᓪᔨᔩᔪᔫᔭ… ᔮᔾᕕᕖᕗ–—“”‘’ᕘᕙᕚᕝᕆᕇᕈᕉᕋᕌᕐᕿᖀᖁᖂᖃᖄᖅᖏᖐᖑᖒᖓᖔᖕᙱᙲᙳᙴᙵᙶᖖᖠᖡᖢᖣᖤᖥᖦᕼŁł',\n  'x-mac-ce': 'ÄĀāÉĄÖÜáąČäčĆćéŹźĎíďĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅņŃ¬√ńŇ∆«»… ňŐÕőŌ–—“”‘’÷◊ōŔŕŘ‹›řŖŗŠ‚„šŚśÁŤťÍŽžŪÓÔūŮÚůŰűŲųÝýķŻŁżĢˇ',\n  'x-mac-romanian': 'ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ĂȘ∞±≤≥¥µ∂∑∏π∫ªºΩăș¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄€‹›Țț‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ',\n  'x-mac-turkish': 'ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸĞğİıŞş‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔÒÚÛÙˆ˜¯˘˙˚¸˝˛ˇ'\n};\n\nconst encodingCache = new Map();\n\nexport function getEncodingMapping(encoding) {\n  let cached = encodingCache.get(encoding);\n  if (cached) {\n    return cached;\n  }\n\n  // These encodings aren't supported by TextDecoder.\n  let mapping = MAC_ENCODINGS[encoding];\n  if (mapping) {\n    let res = new Map();\n    for (let i = 0; i < mapping.length; i++) {\n      res.set(mapping.charCodeAt(i), 0x80 + i);\n    }\n\n    encodingCache.set(encoding, res);\n    return res;\n  }\n\n  // Only single byte encodings can be mapped 1:1.\n  if (SINGLE_BYTE_ENCODINGS.has(encoding)) {\n    // TextEncoder only supports utf8, whereas TextDecoder supports legacy encodings.\n    // Use this to create a mapping of code points.\n    let decoder = new TextDecoder(encoding);\n    let mapping = new Uint8Array(0x80);\n    for (let i = 0; i < 0x80; i++) {\n      mapping[i] = 0x80 + i;\n    }\n\n    let res = new Map();\n    let s = decoder.decode(mapping);\n    for (let i = 0; i < 0x80; i++) {\n      res.set(s.charCodeAt(i), 0x80 + i);\n    }\n\n    encodingCache.set(encoding, res);\n    return res;\n  }\n}\n\n// Map of platform ids to encoding ids.\nexport const ENCODINGS = [\n  // unicode\n  ['utf-16be', 'utf-16be', 'utf-16be', 'utf-16be', 'utf-16be', 'utf-16be', 'utf-16be'],\n  \n  // macintosh\n  // Mappings available at http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/\n  // 0\tRoman                 17\tMalayalam\n  // 1\tJapanese\t            18\tSinhalese\n  // 2\tTraditional Chinese\t  19\tBurmese\n  // 3\tKorean\t              20\tKhmer\n  // 4\tArabic\t              21\tThai\n  // 5\tHebrew\t              22\tLaotian\n  // 6\tGreek\t                23\tGeorgian\n  // 7\tRussian\t              24\tArmenian\n  // 8\tRSymbol\t              25\tSimplified Chinese\n  // 9\tDevanagari\t          26\tTibetan\n  // 10\tGurmukhi\t            27\tMongolian\n  // 11\tGujarati\t            28\tGeez\n  // 12\tOriya\t                29\tSlavic\n  // 13\tBengali\t              30\tVietnamese\n  // 14\tTamil\t                31\tSindhi\n  // 15\tTelugu\t              32\t(Uninterpreted)\n  // 16\tKannada\n  ['x-mac-roman', 'shift-jis', 'big5', 'euc-kr', 'iso-8859-6', 'iso-8859-8',\n   'x-mac-greek', 'x-mac-cyrillic', 'x-mac-symbol', 'x-mac-devanagari', 'x-mac-gurmukhi', 'x-mac-gujarati',\n   'Oriya', 'Bengali', 'Tamil', 'Telugu', 'Kannada', 'Malayalam', 'Sinhalese',\n   'Burmese', 'Khmer', 'iso-8859-11', 'Laotian', 'Georgian', 'Armenian', 'gbk', \n   'Tibetan', 'Mongolian', 'Geez', 'x-mac-ce', 'Vietnamese', 'Sindhi'],\n  \n  // ISO (deprecated)\n  ['ascii', null, 'iso-8859-1'],\n  \n  // windows\n  // Docs here: http://msdn.microsoft.com/en-us/library/system.text.encoding(v=vs.110).aspx\n  ['symbol', 'utf-16be', 'shift-jis', 'gb18030', 'big5', 'euc-kr', 'johab', null, null, null, 'utf-16be']\n];\n\n// Overrides for Mac scripts by language id.\n// See http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/Readme.txt\nexport const MAC_LANGUAGE_ENCODINGS = {\n  15: 'x-mac-icelandic',\n  17: 'x-mac-turkish',\n  18: 'x-mac-croatian',\n  24: 'x-mac-ce',\n  25: 'x-mac-ce',\n  26: 'x-mac-ce',\n  27: 'x-mac-ce',\n  28: 'x-mac-ce',\n  30: 'x-mac-icelandic',\n  37: 'x-mac-romanian',\n  38: 'x-mac-ce',\n  39: 'x-mac-ce',\n  40: 'x-mac-ce',\n  143: 'x-mac-inuit',\n  146: 'x-mac-gaelic'\n};\n\n// Map of platform ids to BCP-47 language codes.\nexport const LANGUAGES = [\n  // unicode\n  [],\n  \n  { // macintosh\n    0: 'en',        30: 'fo',       60: 'ks',       90: 'rw',\n    1: 'fr',        31: 'fa',       61: 'ku',       91: 'rn',\n    2: 'de',        32: 'ru',       62: 'sd',       92: 'ny',\n    3: 'it',        33: 'zh',       63: 'bo',       93: 'mg',\n    4: 'nl',        34: 'nl-BE',    64: 'ne',       94: 'eo',\n    5: 'sv',        35: 'ga',       65: 'sa',       128: 'cy',\n    6: 'es',        36: 'sq',       66: 'mr',       129: 'eu',\n    7: 'da',        37: 'ro',       67: 'bn',       130: 'ca',\n    8: 'pt',        38: 'cz',       68: 'as',       131: 'la',\n    9: 'no',        39: 'sk',       69: 'gu',       132: 'qu',\n    10: 'he',       40: 'si',       70: 'pa',       133: 'gn',\n    11: 'ja',       41: 'yi',       71: 'or',       134: 'ay',\n    12: 'ar',       42: 'sr',       72: 'ml',       135: 'tt',\n    13: 'fi',       43: 'mk',       73: 'kn',       136: 'ug',\n    14: 'el',       44: 'bg',       74: 'ta',       137: 'dz',\n    15: 'is',       45: 'uk',       75: 'te',       138: 'jv',\n    16: 'mt',       46: 'be',       76: 'si',       139: 'su',\n    17: 'tr',       47: 'uz',       77: 'my',       140: 'gl',\n    18: 'hr',       48: 'kk',       78: 'km',       141: 'af',\n    19: 'zh-Hant',  49: 'az-Cyrl',  79: 'lo',       142: 'br',\n    20: 'ur',       50: 'az-Arab',  80: 'vi',       143: 'iu',\n    21: 'hi',       51: 'hy',       81: 'id',       144: 'gd',\n    22: 'th',       52: 'ka',       82: 'tl',       145: 'gv',\n    23: 'ko',       53: 'mo',       83: 'ms',       146: 'ga',\n    24: 'lt',       54: 'ky',       84: 'ms-Arab',  147: 'to',\n    25: 'pl',       55: 'tg',       85: 'am',       148: 'el-polyton',\n    26: 'hu',       56: 'tk',       86: 'ti',       149: 'kl',\n    27: 'es',       57: 'mn-CN',    87: 'om',       150: 'az',\n    28: 'lv',       58: 'mn',       88: 'so',       151: 'nn',\n    29: 'se',       59: 'ps',       89: 'sw',\n  },\n  \n  // ISO (deprecated)\n  [],\n  \n  { // windows                                        \n    0x0436: 'af',       0x4009: 'en-IN',    0x0487: 'rw',          0x0432: 'tn',       \n    0x041C: 'sq',       0x1809: 'en-IE',    0x0441: 'sw',          0x045B: 'si',          \n    0x0484: 'gsw',      0x2009: 'en-JM',    0x0457: 'kok',         0x041B: 'sk',          \n    0x045E: 'am',       0x4409: 'en-MY',    0x0412: 'ko',          0x0424: 'sl',          \n    0x1401: 'ar-DZ',    0x1409: 'en-NZ',    0x0440: 'ky',          0x2C0A: 'es-AR',       \n    0x3C01: 'ar-BH',    0x3409: 'en-PH',    0x0454: 'lo',          0x400A: 'es-BO',       \n    0x0C01: 'ar',       0x4809: 'en-SG',    0x0426: 'lv',          0x340A: 'es-CL',       \n    0x0801: 'ar-IQ',    0x1C09: 'en-ZA',    0x0427: 'lt',          0x240A: 'es-CO',       \n    0x2C01: 'ar-JO',    0x2C09: 'en-TT',    0x082E: 'dsb',         0x140A: 'es-CR',       \n    0x3401: 'ar-KW',    0x0809: 'en-GB',    0x046E: 'lb',          0x1C0A: 'es-DO',       \n    0x3001: 'ar-LB',    0x0409: 'en',       0x042F: 'mk',          0x300A: 'es-EC',       \n    0x1001: 'ar-LY',    0x3009: 'en-ZW',    0x083E: 'ms-BN',       0x440A: 'es-SV',       \n    0x1801: 'ary',      0x0425: 'et',       0x043E: 'ms',          0x100A: 'es-GT',       \n    0x2001: 'ar-OM',    0x0438: 'fo',       0x044C: 'ml',          0x480A: 'es-HN',       \n    0x4001: 'ar-QA',    0x0464: 'fil',      0x043A: 'mt',          0x080A: 'es-MX',       \n    0x0401: 'ar-SA',    0x040B: 'fi',       0x0481: 'mi',          0x4C0A: 'es-NI',       \n    0x2801: 'ar-SY',    0x080C: 'fr-BE',    0x047A: 'arn',         0x180A: 'es-PA',       \n    0x1C01: 'aeb',      0x0C0C: 'fr-CA',    0x044E: 'mr',          0x3C0A: 'es-PY',       \n    0x3801: 'ar-AE',    0x040C: 'fr',       0x047C: 'moh',         0x280A: 'es-PE',       \n    0x2401: 'ar-YE',    0x140C: 'fr-LU',    0x0450: 'mn',          0x500A: 'es-PR',       \n    0x042B: 'hy',       0x180C: 'fr-MC',    0x0850: 'mn-CN',       0x0C0A: 'es',          \n    0x044D: 'as',       0x100C: 'fr-CH',    0x0461: 'ne',          0x040A: 'es',          \n    0x082C: 'az-Cyrl',  0x0462: 'fy',       0x0414: 'nb',          0x540A: 'es-US',       \n    0x042C: 'az',       0x0456: 'gl',       0x0814: 'nn',          0x380A: 'es-UY',     \n    0x046D: 'ba',       0x0437: 'ka',       0x0482: 'oc',          0x200A: 'es-VE',       \n    0x042D: 'eu',       0x0C07: 'de-AT',    0x0448: 'or',          0x081D: 'sv-FI',       \n    0x0423: 'be',       0x0407: 'de',       0x0463: 'ps',          0x041D: 'sv',          \n    0x0845: 'bn',       0x1407: 'de-LI',    0x0415: 'pl',          0x045A: 'syr',         \n    0x0445: 'bn-IN',    0x1007: 'de-LU',    0x0416: 'pt',          0x0428: 'tg',          \n    0x201A: 'bs-Cyrl',  0x0807: 'de-CH',    0x0816: 'pt-PT',       0x085F: 'tzm',         \n    0x141A: 'bs',       0x0408: 'el',       0x0446: 'pa',          0x0449: 'ta',          \n    0x047E: 'br',       0x046F: 'kl',       0x046B: 'qu-BO',       0x0444: 'tt',          \n    0x0402: 'bg',       0x0447: 'gu',       0x086B: 'qu-EC',       0x044A: 'te',          \n    0x0403: 'ca',       0x0468: 'ha',       0x0C6B: 'qu',          0x041E: 'th',          \n    0x0C04: 'zh-HK',    0x040D: 'he',       0x0418: 'ro',          0x0451: 'bo',          \n    0x1404: 'zh-MO',    0x0439: 'hi',       0x0417: 'rm',          0x041F: 'tr',          \n    0x0804: 'zh',       0x040E: 'hu',       0x0419: 'ru',          0x0442: 'tk',          \n    0x1004: 'zh-SG',    0x040F: 'is',       0x243B: 'smn',         0x0480: 'ug',          \n    0x0404: 'zh-TW',    0x0470: 'ig',       0x103B: 'smj-NO',      0x0422: 'uk',          \n    0x0483: 'co',       0x0421: 'id',       0x143B: 'smj',         0x042E: 'hsb',         \n    0x041A: 'hr',       0x045D: 'iu',       0x0C3B: 'se-FI',       0x0420: 'ur',          \n    0x101A: 'hr-BA',    0x085D: 'iu-Latn',  0x043B: 'se',          0x0843: 'uz-Cyrl',     \n    0x0405: 'cs',       0x083C: 'ga',       0x083B: 'se-SE',       0x0443: 'uz',          \n    0x0406: 'da',       0x0434: 'xh',       0x203B: 'sms',         0x042A: 'vi',          \n    0x048C: 'prs',      0x0435: 'zu',       0x183B: 'sma-NO',      0x0452: 'cy',          \n    0x0465: 'dv',       0x0410: 'it',       0x1C3B: 'sms',         0x0488: 'wo',          \n    0x0813: 'nl-BE',    0x0810: 'it-CH',    0x044F: 'sa',          0x0485: 'sah',         \n    0x0413: 'nl',       0x0411: 'ja',       0x1C1A: 'sr-Cyrl-BA',  0x0478: 'ii',          \n    0x0C09: 'en-AU',    0x044B: 'kn',       0x0C1A: 'sr',          0x046A: 'yo',           \n    0x2809: 'en-BZ',    0x043F: 'kk',       0x181A: 'sr-Latn-BA',  \n    0x1009: 'en-CA',    0x0453: 'km',       0x081A: 'sr-Latn',     \n    0x2409: 'en-029',   0x0486: 'quc',      0x046C: 'nso',         \n  }\n];\n", "import * as r from 'restructure';\n\nvar OS2 = new r.VersionedStruct(r.uint16, {\n  header: {\n    xAvgCharWidth:          r.int16,   // average weighted advance width of lower case letters and space\n    usWeightClass:          r.uint16,  // visual weight of stroke in glyphs\n    usWidthClass:           r.uint16,  // relative change from the normal aspect ratio (width to height ratio)\n    fsType:                 new r.Bitfield(r.uint16, [ // Indicates font embedding licensing rights\n      null, 'noEmbedding', 'viewOnly', 'editable', null,\n      null, null, null, 'noSubsetting', 'bitmapOnly'\n    ]),\n    ySubscriptXSize:        r.int16,   // recommended horizontal size in pixels for subscripts\n    ySubscriptYSize:        r.int16,   // recommended vertical size in pixels for subscripts\n    ySubscriptXOffset:      r.int16,   // recommended horizontal offset for subscripts\n    ySubscriptYOffset:      r.int16,   // recommended vertical offset form the baseline for subscripts\n    ySuperscriptXSize:      r.int16,   // recommended horizontal size in pixels for superscripts\n    ySuperscriptYSize:      r.int16,   // recommended vertical size in pixels for superscripts\n    ySuperscriptXOffset:    r.int16,   // recommended horizontal offset for superscripts\n    ySuperscriptYOffset:    r.int16,   // recommended vertical offset from the baseline for superscripts\n    yStrikeoutSize:         r.int16,   // width of the strikeout stroke\n    yStrikeoutPosition:     r.int16,   // position of the strikeout stroke relative to the baseline\n    sFamilyClass:           r.int16,   // classification of font-family design\n    panose:                 new r.Array(r.uint8, 10),   // describe the visual characteristics of a given typeface\n    ulCharRange:            new r.Array(r.uint32, 4),\n    vendorID:               new r.String(4),          // four character identifier for the font vendor\n    fsSelection:            new r.Bitfield(r.uint16, [  // bit field containing information about the font\n      'italic', 'underscore', 'negative', 'outlined', 'strikeout',\n      'bold', 'regular', 'useTypoMetrics', 'wws', 'oblique'\n    ]),\n    usFirstCharIndex:       r.uint16,  // The minimum Unicode index in this font\n    usLastCharIndex:        r.uint16   // The maximum Unicode index in this font\n  },\n\n  // The Apple version of this table ends here, but the Microsoft one continues on...\n  0: {},\n\n  1: {\n    typoAscender:       r.int16,\n    typoDescender:      r.int16,\n    typoLineGap:        r.int16,\n    winAscent:          r.uint16,\n    winDescent:         r.uint16,\n    codePageRange:      new r.Array(r.uint32, 2)\n  },\n\n  2: {\n    // these should be common with version 1 somehow\n    typoAscender:       r.int16,\n    typoDescender:      r.int16,\n    typoLineGap:        r.int16,\n    winAscent:          r.uint16,\n    winDescent:         r.uint16,\n    codePageRange:      new r.Array(r.uint32, 2),\n\n    xHeight:            r.int16,\n    capHeight:          r.int16,\n    defaultChar:        r.uint16,\n    breakChar:          r.uint16,\n    maxContent:         r.uint16\n  },\n\n  5: {\n    typoAscender:       r.int16,\n    typoDescender:      r.int16,\n    typoLineGap:        r.int16,\n    winAscent:          r.uint16,\n    winDescent:         r.uint16,\n    codePageRange:      new r.Array(r.uint32, 2),\n\n    xHeight:            r.int16,\n    capHeight:          r.int16,\n    defaultChar:        r.uint16,\n    breakChar:          r.uint16,\n    maxContent:         r.uint16,\n\n    usLowerOpticalPointSize: r.uint16,\n    usUpperOpticalPointSize: r.uint16\n  }\n});\n\nlet versions = OS2.versions;\nversions[3] = versions[4] = versions[2];\n\nexport default OS2;\n", "import * as r from 'restructure';\n\n// PostScript information\nexport default new r.VersionedStruct(r.fixed32, {\n  header: { // these fields exist at the top of all versions\n    italicAngle:        r.fixed32, // Italic angle in counter-clockwise degrees from the vertical.\n    underlinePosition:  r.int16,   // Suggested distance of the top of the underline from the baseline\n    underlineThickness: r.int16,   // Suggested values for the underline thickness\n    isFixedPitch:       r.uint32,  // Whether the font is monospaced\n    minMemType42:       r.uint32,  // Minimum memory usage when a TrueType font is downloaded as a Type 42 font\n    maxMemType42:       r.uint32,  // Maximum memory usage when a TrueType font is downloaded as a Type 42 font\n    minMemType1:        r.uint32,  // Minimum memory usage when a TrueType font is downloaded as a Type 1 font\n    maxMemType1:        r.uint32   // Maximum memory usage when a TrueType font is downloaded as a Type 1 font\n  },\n\n  1: {}, // version 1 has no additional fields\n\n  2: {\n    numberOfGlyphs: r.uint16,\n    glyphNameIndex: new r.Array(r.uint16, 'numberOfGlyphs'),\n    names:          new r.Array(new r.String(r.uint8))\n  },\n\n  2.5: {\n    numberOfGlyphs: r.uint16,\n    offsets:        new r.Array(r.uint8, 'numberOfGlyphs')\n  },\n\n  3: {}, // version 3 has no additional fields\n\n  4: {\n    map: new r.Array(r.uint32, t => t.parent.maxp.numGlyphs)\n  }\n});\n", "import * as r from 'restructure';\n\n// An array of predefined values accessible by instructions\nexport default new r.Struct({\n  controlValues: new r.Array(r.int16)\n});\n", "import * as r from 'restructure';\n\n// A list of instructions that are executed once when a font is first used.\n// These instructions are known as the font program. The main use of this table\n// is for the definition of functions that are used in many different glyph programs.\nexport default new r.Struct({\n  instructions: new r.Array(r.uint8)\n});\n", "import * as r from 'restructure';\n\nlet loca = new r.VersionedStruct('head.indexToLocFormat', {\n  0: {\n    offsets: new r.Array(r.uint16)\n  },\n  1: {\n    offsets: new r.Array(r.uint32)\n  }\n});\n\nloca.process = function() {\n  if (this.version === 0 && !this._processed) {\n    for (let i = 0; i < this.offsets.length; i++) {\n      this.offsets[i] <<= 1;\n    }\n    this._processed = true;\n  }\n};\n\nloca.preEncode = function() {\n  if (this.version === 0 && this._processed !== false) {\n    for (let i = 0; i < this.offsets.length; i++) {\n      this.offsets[i] >>>= 1;\n    }\n    this._processed = false;\n  }\n};\n\nexport default loca;\n", "import * as r from 'restructure';\n\n// Set of instructions executed whenever the point size or font transformation change\nexport default new r.Struct({\n  controlValueProgram: new r.Array(r.uint8)\n});\n", "import * as r from 'restructure';\n\n// only used for encoding\nexport default new r.Array(new r.Buffer);\n", "import * as r from 'restructure';\nimport CFFIndex from './CFFIndex';\nimport CFFTop from './CFFTop';\nimport CFFPrivateDict from './CFFPrivateDict';\nimport standardStrings from './CFFStandardStrings';\n\nclass CFFFont {\n  constructor(stream) {\n    this.stream = stream;\n    this.decode();\n  }\n\n  static decode(stream) {\n    return new CFFFont(stream);\n  }\n\n  decode() {\n    let start = this.stream.pos;\n    let top = CFFTop.decode(this.stream);\n    for (let key in top) {\n      let val = top[key];\n      this[key] = val;\n    }\n\n    if (this.version < 2) {\n      if (this.topDictIndex.length !== 1) {\n        throw new Error(\"Only a single font is allowed in CFF\");\n      }\n\n      this.topDict = this.topDictIndex[0];\n    }\n\n    this.isCIDFont = this.topDict.ROS != null;\n    return this;\n  }\n\n  string(sid) {\n    if (this.version >= 2) {\n      return null;\n    }\n\n    if (sid < standardStrings.length) {\n      return standardStrings[sid];\n    }\n\n    return this.stringIndex[sid - standardStrings.length];\n  }\n\n  get postscriptName() {\n    if (this.version < 2) {\n      return this.nameIndex[0];\n    }\n\n    return null;\n  }\n\n  get fullName() {\n    return this.string(this.topDict.FullName);\n  }\n\n  get familyName() {\n    return this.string(this.topDict.FamilyName);\n  }\n\n  getCharString(glyph) {\n    this.stream.pos = this.topDict.CharStrings[glyph].offset;\n    return this.stream.readBuffer(this.topDict.CharStrings[glyph].length);\n  }\n\n  getGlyphName(gid) {\n    // CFF2 glyph names are in the post table.\n    if (this.version >= 2) {\n      return null;\n    }\n\n    // CID-keyed fonts don't have glyph names\n    if (this.isCIDFont) {\n      return null;\n    }\n\n    let { charset } = this.topDict;\n    if (Array.isArray(charset)) {\n      return charset[gid];\n    }\n\n    if (gid === 0) {\n      return '.notdef';\n    }\n\n    gid -= 1;\n\n    switch (charset.version) {\n      case 0:\n        return this.string(charset.glyphs[gid]);\n\n      case 1:\n      case 2:\n        for (let i = 0; i < charset.ranges.length; i++) {\n          let range = charset.ranges[i];\n          if (range.offset <= gid && gid <= range.offset + range.nLeft) {\n            return this.string(range.first + (gid - range.offset));\n          }\n        }\n        break;\n    }\n\n    return null;\n  }\n\n  fdForGlyph(gid) {\n    if (!this.topDict.FDSelect) {\n      return null;\n    }\n\n    switch (this.topDict.FDSelect.version) {\n      case 0:\n        return this.topDict.FDSelect.fds[gid];\n\n      case 3:\n      case 4:\n        let { ranges } = this.topDict.FDSelect;\n        let low = 0;\n        let high = ranges.length - 1;\n\n        while (low <= high) {\n          let mid = (low + high) >> 1;\n\n          if (gid < ranges[mid].first) {\n            high = mid - 1;\n          } else if (mid < high && gid >= ranges[mid + 1].first) {\n            low = mid + 1;\n          } else {\n            return ranges[mid].fd;\n          }\n        }\n      default:\n        throw new Error(`Unknown FDSelect version: ${this.topDict.FDSelect.version}`);\n    }\n  }\n\n  privateDictForGlyph(gid) {\n    if (this.topDict.FDSelect) {\n      let fd = this.fdForGlyph(gid);\n      if (this.topDict.FDArray[fd]) {\n        return this.topDict.FDArray[fd].Private;\n      }\n\n      return null;\n    }\n\n    if (this.version < 2) {\n      return this.topDict.Private;\n    }\n\n    return this.topDict.FDArray[0].Private;\n  }\n}\n\nexport default CFFFont;\n", "import * as r from 'restructure';\n\nexport default class CFFIndex {\n  constructor(type) {\n    this.type = type;\n  }\n\n  getCFFVersion(ctx) {\n    while (ctx && !ctx.hdrSize) {\n      ctx = ctx.parent;\n    }\n\n    return ctx ? ctx.version : -1;\n  }\n\n  decode(stream, parent) {\n    let version = this.getCFFVersion(parent);\n    let count = version >= 2\n      ? stream.readUInt32BE()\n      : stream.readUInt16BE();\n\n    if (count === 0) {\n      return [];\n    }\n\n    let offSize = stream.readUInt8();\n    let offsetType;\n    if (offSize === 1) {\n      offsetType = r.uint8;\n    } else if (offSize === 2) {\n      offsetType = r.uint16;\n    } else if (offSize === 3) {\n      offsetType = r.uint24;\n    } else if (offSize === 4) {\n      offsetType = r.uint32;\n    } else {\n      throw new Error(`Bad offset size in CFFIndex: ${offSize} ${stream.pos}`);\n    }\n\n    let ret = [];\n    let startPos = stream.pos + ((count + 1) * offSize) - 1;\n\n    let start = offsetType.decode(stream);\n    for (let i = 0; i < count; i++) {\n      let end = offsetType.decode(stream);\n\n      if (this.type != null) {\n        let pos = stream.pos;\n        stream.pos = startPos + start;\n\n        parent.length = end - start;\n        ret.push(this.type.decode(stream, parent));\n        stream.pos = pos;\n      } else {\n        ret.push({\n          offset: startPos + start,\n          length: end - start\n        });\n      }\n\n      start = end;\n    }\n\n    stream.pos = startPos + start;\n    return ret;\n  }\n\n  size(arr, parent) {\n    let size = 2;\n    if (arr.length === 0) {\n      return size;\n    }\n\n    let type = this.type || new r.Buffer;\n\n    // find maximum offset to detminine offset type\n    let offset = 1;\n    for (let i = 0; i < arr.length; i++) {\n      let item = arr[i];\n      offset += type.size(item, parent);\n    }\n\n    let offsetType;\n    if (offset <= 0xff) {\n      offsetType = r.uint8;\n    } else if (offset <= 0xffff) {\n      offsetType = r.uint16;\n    } else if (offset <= 0xffffff) {\n      offsetType = r.uint24;\n    } else if (offset <= 0xffffffff) {\n      offsetType = r.uint32;\n    } else {\n      throw new Error(\"Bad offset in CFFIndex\");\n    }\n\n    size += 1 + offsetType.size() * (arr.length + 1);\n    size += offset - 1;\n\n    return size;\n  }\n\n  encode(stream, arr, parent) {\n    stream.writeUInt16BE(arr.length);\n    if (arr.length === 0) {\n      return;\n    }\n\n    let type = this.type || new r.Buffer;\n\n    // find maximum offset to detminine offset type\n    let sizes = [];\n    let offset = 1;\n    for (let item of arr) {\n      let s = type.size(item, parent);\n      sizes.push(s);\n      offset += s;\n    }\n\n    let offsetType;\n    if (offset <= 0xff) {\n      offsetType = r.uint8;\n    } else if (offset <= 0xffff) {\n      offsetType = r.uint16;\n    } else if (offset <= 0xffffff) {\n      offsetType = r.uint24;\n    } else if (offset <= 0xffffffff) {\n      offsetType = r.uint32;\n    } else {\n      throw new Error(\"Bad offset in CFFIndex\");\n    }\n\n    // write offset size\n    stream.writeUInt8(offsetType.size());\n\n    // write elements\n    offset = 1;\n    offsetType.encode(stream, offset);\n\n    for (let size of sizes) {\n      offset += size;\n      offsetType.encode(stream, offset);\n    }\n\n    for (let item of arr) {\n      type.encode(stream, item, parent);\n    }\n\n    return;\n  }\n}\n", "import * as r from 'restructure';\nimport { resolveLength } from 'restructure';\nimport CFFDict from './CFFDict';\nimport CFFIndex from './CFFIndex';\nimport CFFPointer from './CFFPointer';\nimport CFFPrivateDict from './CFFPrivateDict';\nimport StandardStrings from './CFFStandardStrings';\nimport { StandardEncoding, ExpertEncoding } from './CFFEncodings';\nimport { ISOAdobeCharset, ExpertCharset, ExpertSubsetCharset } from './CFFCharsets';\nimport { ItemVariationStore } from '../tables/variations';\n\n// Checks if an operand is an index of a predefined value,\n// otherwise delegates to the provided type.\nclass PredefinedOp {\n  constructor(predefinedOps, type) {\n    this.predefinedOps = predefinedOps;\n    this.type = type;\n  }\n\n  decode(stream, parent, operands) {\n    if (this.predefinedOps[operands[0]]) {\n      return this.predefinedOps[operands[0]];\n    }\n\n    return this.type.decode(stream, parent, operands);\n  }\n\n  size(value, ctx) {\n    return this.type.size(value, ctx);\n  }\n\n  encode(stream, value, ctx) {\n    let index = this.predefinedOps.indexOf(value);\n    if (index !== -1) {\n      return index;\n    }\n\n    return this.type.encode(stream, value, ctx);\n  }\n}\n\nclass CFFEncodingVersion extends r.Number {\n  constructor() {\n    super('UInt8');\n  }\n\n  decode(stream) {\n    return r.uint8.decode(stream) & 0x7f;\n  }\n}\n\nlet Range1 = new r.Struct({\n  first: r.uint16,\n  nLeft: r.uint8\n});\n\nlet Range2 = new r.Struct({\n  first: r.uint16,\n  nLeft: r.uint16\n});\n\nlet CFFCustomEncoding = new r.VersionedStruct(new CFFEncodingVersion(), {\n  0: {\n    nCodes: r.uint8,\n    codes: new r.Array(r.uint8, 'nCodes')\n  },\n\n  1: {\n    nRanges: r.uint8,\n    ranges: new r.Array(Range1, 'nRanges')\n  }\n\n  // TODO: supplement?\n});\n\nlet CFFEncoding = new PredefinedOp([ StandardEncoding, ExpertEncoding ], new CFFPointer(CFFCustomEncoding, { lazy: true }));\n\n// Decodes an array of ranges until the total\n// length is equal to the provided length.\nclass RangeArray extends r.Array {\n  decode(stream, parent) {\n    let length = resolveLength(this.length, stream, parent);\n    let count = 0;\n    let res = [];\n    while (count < length) {\n      let range = this.type.decode(stream, parent);\n      range.offset = count;\n      count += range.nLeft + 1;\n      res.push(range);\n    }\n\n    return res;\n  }\n}\n\nlet CFFCustomCharset = new r.VersionedStruct(r.uint8, {\n  0: {\n    glyphs: new r.Array(r.uint16, t => t.parent.CharStrings.length - 1)\n  },\n\n  1: {\n    ranges: new RangeArray(Range1, t => t.parent.CharStrings.length - 1)\n  },\n\n  2: {\n    ranges: new RangeArray(Range2, t => t.parent.CharStrings.length - 1)\n  }\n});\n\nlet CFFCharset = new PredefinedOp([ ISOAdobeCharset, ExpertCharset, ExpertSubsetCharset ], new CFFPointer(CFFCustomCharset, {lazy: true}));\n\nlet FDRange3 = new r.Struct({\n  first: r.uint16,\n  fd: r.uint8\n});\n\nlet FDRange4 = new r.Struct({\n  first: r.uint32,\n  fd: r.uint16\n});\n\nlet FDSelect = new r.VersionedStruct(r.uint8, {\n  0: {\n    fds: new r.Array(r.uint8, t => t.parent.CharStrings.length)\n  },\n\n  3: {\n    nRanges: r.uint16,\n    ranges: new r.Array(FDRange3, 'nRanges'),\n    sentinel: r.uint16\n  },\n\n  4: {\n    nRanges: r.uint32,\n    ranges: new r.Array(FDRange4, 'nRanges'),\n    sentinel: r.uint32\n  }\n});\n\nlet ptr = new CFFPointer(CFFPrivateDict);\nclass CFFPrivateOp {\n  decode(stream, parent, operands) {\n    parent.length = operands[0];\n    return ptr.decode(stream, parent, [operands[1]]);\n  }\n\n  size(dict, ctx) {\n    return [CFFPrivateDict.size(dict, ctx, false), ptr.size(dict, ctx)[0]];\n  }\n\n  encode(stream, dict, ctx) {\n    return [CFFPrivateDict.size(dict, ctx, false), ptr.encode(stream, dict, ctx)[0]];\n  }\n}\n\nlet FontDict = new CFFDict([\n  // key       name                   type(s)                                 default\n  [18,        'Private',              new CFFPrivateOp,                       null],\n  [[12, 38],  'FontName',             'sid',                                  null],\n  [[12, 7],   'FontMatrix',           'array',                                [0.001, 0, 0, 0.001, 0, 0]],\n  [[12, 5],   'PaintType',            'number',                               0],\n]);\n\nlet CFFTopDict = new CFFDict([\n  // key       name                   type(s)                                 default\n  [[12, 30],  'ROS',                  ['sid', 'sid', 'number'],               null],\n\n  [0,         'version',              'sid',                                  null],\n  [1,         'Notice',               'sid',                                  null],\n  [[12, 0],   'Copyright',            'sid',                                  null],\n  [2,         'FullName',             'sid',                                  null],\n  [3,         'FamilyName',           'sid',                                  null],\n  [4,         'Weight',               'sid',                                  null],\n  [[12, 1],   'isFixedPitch',         'boolean',                              false],\n  [[12, 2],   'ItalicAngle',          'number',                               0],\n  [[12, 3],   'UnderlinePosition',    'number',                               -100],\n  [[12, 4],   'UnderlineThickness',   'number',                               50],\n  [[12, 5],   'PaintType',            'number',                               0],\n  [[12, 6],   'CharstringType',       'number',                               2],\n  [[12, 7],   'FontMatrix',           'array',                                [0.001, 0, 0, 0.001, 0, 0]],\n  [13,        'UniqueID',             'number',                               null],\n  [5,         'FontBBox',             'array',                                [0, 0, 0, 0]],\n  [[12, 8],   'StrokeWidth',          'number',                               0],\n  [14,        'XUID',                 'array',                                null],\n  [15,        'charset',              CFFCharset,                             ISOAdobeCharset],\n  [16,        'Encoding',             CFFEncoding,                            StandardEncoding],\n  [17,        'CharStrings',          new CFFPointer(new CFFIndex),           null],\n  [18,        'Private',              new CFFPrivateOp,                       null],\n  [[12, 20],  'SyntheticBase',        'number',                               null],\n  [[12, 21],  'PostScript',           'sid',                                  null],\n  [[12, 22],  'BaseFontName',         'sid',                                  null],\n  [[12, 23],  'BaseFontBlend',        'delta',                                null],\n\n  // CID font specific\n  [[12, 31],  'CIDFontVersion',       'number',                               0],\n  [[12, 32],  'CIDFontRevision',      'number',                               0],\n  [[12, 33],  'CIDFontType',          'number',                               0],\n  [[12, 34],  'CIDCount',             'number',                               8720],\n  [[12, 35],  'UIDBase',              'number',                               null],\n  [[12, 37],  'FDSelect',             new CFFPointer(FDSelect),               null],\n  [[12, 36],  'FDArray',              new CFFPointer(new CFFIndex(FontDict)), null],\n  [[12, 38],  'FontName',             'sid',                                  null]\n]);\n\nlet VariationStore = new r.Struct({\n  length: r.uint16,\n  itemVariationStore: ItemVariationStore\n})\n\nlet CFF2TopDict = new CFFDict([\n  [[12, 7],   'FontMatrix',           'array',                                [0.001, 0, 0, 0.001, 0, 0]],\n  [17,        'CharStrings',          new CFFPointer(new CFFIndex),           null],\n  [[12, 37],  'FDSelect',             new CFFPointer(FDSelect),               null],\n  [[12, 36],  'FDArray',              new CFFPointer(new CFFIndex(FontDict)), null],\n  [24,        'vstore',               new CFFPointer(VariationStore),         null],\n  [25,        'maxstack',             'number',                               193]\n]);\n\nlet CFFTop = new r.VersionedStruct(r.fixed16, {\n  1: {\n    hdrSize:            r.uint8,\n    offSize:            r.uint8,\n    nameIndex:          new CFFIndex(new r.String('length')),\n    topDictIndex:       new CFFIndex(CFFTopDict),\n    stringIndex:        new CFFIndex(new r.String('length')),\n    globalSubrIndex:    new CFFIndex\n  },\n\n  2: {\n    hdrSize:            r.uint8,\n    length:             r.uint16,\n    topDict:            CFF2TopDict,\n    globalSubrIndex:    new CFFIndex\n  }\n});\n\nexport default CFFTop;\n", "import isEqual from 'fast-deep-equal';\nimport * as r from 'restructure';\nimport CFFOperand from './CFFOperand';\nimport { PropertyDescriptor } from 'restructure';\n\nexport default class CFFDict {\n  constructor(ops = []) {\n    this.ops = ops;\n    this.fields = {};\n    for (let field of ops) {\n      let key = Array.isArray(field[0]) ? field[0][0] << 8 | field[0][1] : field[0];\n      this.fields[key] = field;\n    }\n  }\n\n  decodeOperands(type, stream, ret, operands) {\n    if (Array.isArray(type)) {\n      return operands.map((op, i) => this.decodeOperands(type[i], stream, ret, [op]));\n    } else if (type.decode != null) {\n      return type.decode(stream, ret, operands);\n    } else {\n      switch (type) {\n        case 'number':\n        case 'offset':\n        case 'sid':\n          return operands[0];\n        case 'boolean':\n          return !!operands[0];\n        default:\n          return operands;\n      }\n    }\n  }\n\n  encodeOperands(type, stream, ctx, operands) {\n    if (Array.isArray(type)) {\n      return operands.map((op, i) => this.encodeOperands(type[i], stream, ctx, op)[0]);\n    } else if (type.encode != null) {\n      return type.encode(stream, operands, ctx);\n    } else if (typeof operands === 'number') {\n      return [operands];\n    } else if (typeof operands === 'boolean') {\n      return [+operands];\n    } else if (Array.isArray(operands)) {\n      return operands;\n    } else {\n      return [operands];\n    }\n  }\n\n  decode(stream, parent) {\n    let end = stream.pos + parent.length;\n    let ret = {};\n    let operands = [];\n\n    // define hidden properties\n    Object.defineProperties(ret, {\n      parent:         { value: parent },\n      _startOffset:   { value: stream.pos }\n    });\n\n    // fill in defaults\n    for (let key in this.fields) {\n      let field = this.fields[key];\n      ret[field[1]] = field[3];\n    }\n\n    while (stream.pos < end) {\n      let b = stream.readUInt8();\n      if (b < 28) {\n        if (b === 12) {\n          b = (b << 8) | stream.readUInt8();\n        }\n\n        let field = this.fields[b];\n        if (!field) {\n          throw new Error(`Unknown operator ${b}`);\n        }\n\n        let val = this.decodeOperands(field[2], stream, ret, operands);\n        if (val != null) {\n          if (val instanceof PropertyDescriptor) {\n            Object.defineProperty(ret, field[1], val);\n          } else {\n            ret[field[1]] = val;\n          }\n        }\n\n        operands = [];\n      } else {\n        operands.push(CFFOperand.decode(stream, b));\n      }\n    }\n\n    return ret;\n  }\n\n  size(dict, parent, includePointers = true) {\n    let ctx = {\n      parent,\n      val: dict,\n      pointerSize: 0,\n      startOffset: parent.startOffset || 0\n    };\n\n    let len = 0;\n\n    for (let k in this.fields) {\n      let field = this.fields[k];\n      let val = dict[field[1]];\n      if (val == null || isEqual(val, field[3])) {\n        continue;\n      }\n\n      let operands = this.encodeOperands(field[2], null, ctx, val);\n      for (let op of operands) {\n        len += CFFOperand.size(op);\n      }\n\n      let key = Array.isArray(field[0]) ? field[0] : [field[0]];\n      len += key.length;\n    }\n\n    if (includePointers) {\n      len += ctx.pointerSize;\n    }\n\n    return len;\n  }\n\n  encode(stream, dict, parent) {\n    let ctx = {\n      pointers: [],\n      startOffset: stream.pos,\n      parent,\n      val: dict,\n      pointerSize: 0\n    };\n\n    ctx.pointerOffset = stream.pos + this.size(dict, ctx, false);\n\n    for (let field of this.ops) {\n      let val = dict[field[1]];\n      if (val == null || isEqual(val, field[3])) {\n        continue;\n      }\n\n      let operands = this.encodeOperands(field[2], stream, ctx, val);\n      for (let op of operands) {\n        CFFOperand.encode(stream, op);\n      }\n\n      let key = Array.isArray(field[0]) ? field[0] : [field[0]];\n      for (let op of key) {\n        stream.writeUInt8(op);\n      }\n    }\n\n    let i = 0;\n    while (i < ctx.pointers.length) {\n      let ptr = ctx.pointers[i++];\n      ptr.type.encode(stream, ptr.val, ptr.parent);\n    }\n\n    return;\n  }\n}\n", "const FLOAT_EOF = 0xf;\nconst FLOAT_LOOKUP = [\n  '0', '1', '2', '3', '4', '5', '6', '7',\n  '8', '9', '.', 'E', 'E-', null, '-'\n];\n\nconst FLOAT_ENCODE_LOOKUP = {\n  '.': 10,\n  'E': 11,\n  'E-': 12,\n  '-': 14\n};\n\nexport default class CFFOperand {\n  static decode(stream, value) {\n    if (32 <= value && value <= 246) {\n      return value - 139;\n    }\n\n    if (247 <= value && value <= 250) {\n      return (value - 247) * 256 + stream.readUInt8() + 108;\n    }\n\n    if (251 <= value && value <= 254) {\n      return -(value - 251) * 256 - stream.readUInt8() - 108;\n    }\n\n    if (value === 28) {\n      return stream.readInt16BE();\n    }\n\n    if (value === 29) {\n      return stream.readInt32BE();\n    }\n\n    if (value === 30) {\n      let str = '';\n      while (true) {\n        let b = stream.readUInt8();\n\n        let n1 = b >> 4;\n        if (n1 === FLOAT_EOF) { break; }\n        str += FLOAT_LOOKUP[n1];\n\n        let n2 = b & 15;\n        if (n2 === FLOAT_EOF) { break; }\n        str += FLOAT_LOOKUP[n2];\n      }\n\n      return parseFloat(str);\n    }\n\n    return null;\n  }\n\n  static size(value) {\n    // if the value needs to be forced to the largest size (32 bit)\n    // e.g. for unknown pointers, set to 32768\n    if (value.forceLarge) {\n      value = 32768;\n    }\n\n    if ((value | 0) !== value) { // floating point\n      let str = '' + value;\n      return 1 + Math.ceil((str.length + 1) / 2);\n\n    } else if (-107 <= value && value <= 107) {\n      return 1;\n\n    } else if (108 <= value && value <= 1131 || -1131 <= value && value <= -108) {\n      return 2;\n\n    } else if (-32768 <= value && value <= 32767) {\n      return 3;\n\n    } else {\n      return 5;\n    }\n  }\n\n  static encode(stream, value) {\n    // if the value needs to be forced to the largest size (32 bit)\n    // e.g. for unknown pointers, save the old value and set to 32768\n    let val = Number(value);\n\n    if (value.forceLarge) {\n      stream.writeUInt8(29);\n      return stream.writeInt32BE(val);\n\n    } else if ((val | 0) !== val) { // floating point\n      stream.writeUInt8(30);\n\n      let str = '' + val;\n      for (let i = 0; i < str.length; i += 2) {\n        let c1 = str[i];\n        let n1 = FLOAT_ENCODE_LOOKUP[c1] || +c1;\n\n        if (i === str.length - 1) {\n          var n2 = FLOAT_EOF;\n        } else {\n          let c2 = str[i + 1];\n          var n2 = FLOAT_ENCODE_LOOKUP[c2] || +c2;\n        }\n\n        stream.writeUInt8((n1 << 4) | (n2 & 15));\n      }\n\n      if (n2 !== FLOAT_EOF) {\n        return stream.writeUInt8((FLOAT_EOF << 4));\n      }\n\n    } else if (-107 <= val && val <= 107) {\n      return stream.writeUInt8(val + 139);\n\n    } else if (108 <= val && val <= 1131) {\n      val -= 108;\n      stream.writeUInt8((val >> 8) + 247);\n      return stream.writeUInt8(val & 0xff);\n\n    } else if (-1131 <= val && val <= -108) {\n      val = -val - 108;\n      stream.writeUInt8((val >> 8) + 251);\n      return stream.writeUInt8(val & 0xff);\n\n    } else if (-32768 <= val && val <= 32767) {\n      stream.writeUInt8(28);\n      return stream.writeInt16BE(val);\n\n    } else {\n      stream.writeUInt8(29);\n      return stream.writeInt32BE(val);\n    }\n  }\n}\n", "import * as r from 'restructure';\n\nexport default class CFFPointer extends r.Pointer {\n  constructor(type, options = {}) {\n    if (options.type == null) {\n      options.type = 'global';\n    }\n\n    super(null, type, options);\n  }\n\n  decode(stream, parent, operands) {\n    this.offsetType = {\n      decode: () => operands[0]\n    };\n\n    return super.decode(stream, parent, operands);\n  }\n\n  encode(stream, value, ctx) {\n    if (!stream) {\n      // compute the size (so ctx.pointerSize is correct)\n      this.offsetType = {\n        size: () => 0\n      };\n\n      this.size(value, ctx);\n      return [new Ptr(0)];\n    }\n\n    let ptr = null;\n    this.offsetType = {\n      encode: (stream, val) => ptr = val\n    };\n\n    super.encode(stream, value, ctx);\n    return [new Ptr(ptr)];\n  }\n}\n\nclass Ptr {\n  constructor(val) {\n    this.val = val;\n    this.forceLarge = true;\n  }\n\n  valueOf() {\n    return this.val;\n  }\n}\n", "import CFFDict from './CFFDict';\nimport CFFIndex from './CFFIndex';\nimport CFFPointer from './CFFPointer';\n\nclass CFFBlendOp {\n  static decode(stream, parent, operands) {\n    let numBlends = operands.pop();\n\n    // TODO: actually blend. For now just consume the deltas\n    // since we don't use any of the values anyway.\n    while (operands.length > numBlends) {\n      operands.pop();\n    }\n  }\n}\n\nexport default new CFFDict([\n  // key       name                    type                                          default\n  [6,         'BlueValues',           'delta',                                       null],\n  [7,         'OtherBlues',           'delta',                                       null],\n  [8,         'FamilyBlues',          'delta',                                       null],\n  [9,         'FamilyOtherBlues',     'delta',                                       null],\n  [[12, 9],   'BlueScale',            'number',                                      0.039625],\n  [[12, 10],  'BlueShift',            'number',                                      7],\n  [[12, 11],  'BlueFuzz',             'number',                                      1],\n  [10,        'StdHW',                'number',                                      null],\n  [11,        'StdVW',                'number',                                      null],\n  [[12, 12],  'StemSnapH',            'delta',                                       null],\n  [[12, 13],  'StemSnapV',            'delta',                                       null],\n  [[12, 14],  'ForceBold',            'boolean',                                     false],\n  [[12, 17],  'LanguageGroup',        'number',                                      0],\n  [[12, 18],  'ExpansionFactor',      'number',                                      0.06],\n  [[12, 19],  'initialRandomSeed',    'number',                                      0],\n  [20,        'defaultWidthX',        'number',                                      0],\n  [21,        'nominalWidthX',        'number',                                      0],\n  [22,        'vsindex',              'number',                                      0],\n  [23,        'blend',                CFFBlendOp,                                    null],\n  [19,        'Subrs',                new CFFPointer(new CFFIndex, {type: 'local'}), null]\n]);\n", "// Automatically generated from Appendix A of the CFF specification; do\n// not edit. Length should be 391.\nexport default [\n  \".notdef\", \"space\", \"exclam\", \"quotedbl\", \"numbersign\", \"dollar\",\n  \"percent\", \"ampersand\", \"quoteright\", \"parenleft\", \"parenright\",\n  \"asterisk\", \"plus\", \"comma\", \"hyphen\", \"period\", \"slash\", \"zero\", \"one\",\n  \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\", \"colon\",\n  \"semicolon\", \"less\", \"equal\", \"greater\", \"question\", \"at\", \"A\", \"B\", \"C\",\n  \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\",\n  \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\", \"bracketleft\", \"backslash\",\n  \"bracketright\", \"asciicircum\", \"underscore\", \"quoteleft\", \"a\", \"b\", \"c\",\n  \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\", \"k\", \"l\", \"m\", \"n\", \"o\", \"p\", \"q\", \"r\",\n  \"s\", \"t\", \"u\", \"v\", \"w\", \"x\", \"y\", \"z\", \"braceleft\", \"bar\", \"braceright\",\n  \"asciitilde\", \"exclamdown\", \"cent\", \"sterling\", \"fraction\", \"yen\",\n  \"florin\", \"section\", \"currency\", \"quotesingle\", \"quotedblleft\",\n  \"guillemotleft\", \"guilsinglleft\", \"guilsinglright\", \"fi\", \"fl\", \"endash\",\n  \"dagger\", \"daggerdbl\", \"periodcentered\", \"paragraph\", \"bullet\",\n  \"quotesinglbase\", \"quotedblbase\", \"quotedblright\", \"guillemotright\",\n  \"ellipsis\", \"perthousand\", \"questiondown\", \"grave\", \"acute\", \"circumflex\",\n  \"tilde\", \"macron\", \"breve\", \"dotaccent\", \"dieresis\", \"ring\", \"cedilla\",\n  \"hungarumlaut\", \"ogonek\", \"caron\", \"emdash\", \"AE\", \"ordfeminine\", \"Lslash\",\n  \"Oslash\", \"OE\", \"ordmasculine\", \"ae\", \"dotlessi\", \"lslash\", \"oslash\", \"oe\",\n  \"germandbls\", \"onesuperior\", \"logicalnot\", \"mu\", \"trademark\", \"Eth\",\n  \"onehalf\", \"plusminus\", \"Thorn\", \"onequarter\", \"divide\", \"brokenbar\",\n  \"degree\", \"thorn\", \"threequarters\", \"twosuperior\", \"registered\", \"minus\",\n  \"eth\", \"multiply\", \"threesuperior\", \"copyright\", \"Aacute\", \"Acircumflex\",\n  \"Adieresis\", \"Agrave\", \"Aring\", \"Atilde\", \"Ccedilla\", \"Eacute\",\n  \"Ecircumflex\", \"Edieresis\", \"Egrave\", \"Iacute\", \"Icircumflex\", \"Idieresis\",\n  \"Igrave\", \"Ntilde\", \"Oacute\", \"Ocircumflex\", \"Odieresis\", \"Ograve\",\n  \"Otilde\", \"Scaron\", \"Uacute\", \"Ucircumflex\", \"Udieresis\", \"Ugrave\",\n  \"Yacute\", \"Ydieresis\", \"Zcaron\", \"aacute\", \"acircumflex\", \"adieresis\",\n  \"agrave\", \"aring\", \"atilde\", \"ccedilla\", \"eacute\", \"ecircumflex\",\n  \"edieresis\", \"egrave\", \"iacute\", \"icircumflex\", \"idieresis\", \"igrave\",\n  \"ntilde\", \"oacute\", \"ocircumflex\", \"odieresis\", \"ograve\", \"otilde\",\n  \"scaron\", \"uacute\", \"ucircumflex\", \"udieresis\", \"ugrave\", \"yacute\",\n  \"ydieresis\", \"zcaron\", \"exclamsmall\", \"Hungarumlautsmall\",\n  \"dollaroldstyle\", \"dollarsuperior\", \"ampersandsmall\", \"Acutesmall\",\n  \"parenleftsuperior\", \"parenrightsuperior\", \"twodotenleader\",\n  \"onedotenleader\", \"zerooldstyle\", \"oneoldstyle\", \"twooldstyle\",\n  \"threeoldstyle\", \"fouroldstyle\", \"fiveoldstyle\", \"sixoldstyle\",\n  \"sevenoldstyle\", \"eightoldstyle\", \"nineoldstyle\", \"commasuperior\",\n  \"threequartersemdash\", \"periodsuperior\", \"questionsmall\", \"asuperior\",\n  \"bsuperior\", \"centsuperior\", \"dsuperior\", \"esuperior\", \"isuperior\",\n  \"lsuperior\", \"msuperior\", \"nsuperior\", \"osuperior\", \"rsuperior\",\n  \"ssuperior\", \"tsuperior\", \"ff\", \"ffi\", \"ffl\", \"parenleftinferior\",\n  \"parenrightinferior\", \"Circumflexsmall\", \"hyphensuperior\", \"Gravesmall\",\n  \"Asmall\", \"Bsmall\", \"Csmall\", \"Dsmall\", \"Esmall\", \"Fsmall\", \"Gsmall\",\n  \"Hsmall\", \"Ismall\", \"Jsmall\", \"Ksmall\", \"Lsmall\", \"Msmall\", \"Nsmall\",\n  \"Osmall\", \"Psmall\", \"Qsmall\", \"Rsmall\", \"Ssmall\", \"Tsmall\", \"Usmall\",\n  \"Vsmall\", \"Wsmall\", \"Xsmall\", \"Ysmall\", \"Zsmall\", \"colonmonetary\",\n  \"onefitted\", \"rupiah\", \"Tildesmall\", \"exclamdownsmall\", \"centoldstyle\",\n  \"Lslashsmall\", \"Scaronsmall\", \"Zcaronsmall\", \"Dieresissmall\", \"Brevesmall\",\n  \"Caronsmall\", \"Dotaccentsmall\", \"Macronsmall\", \"figuredash\",\n  \"hypheninferior\", \"Ogoneksmall\", \"Ringsmall\", \"Cedillasmall\",\n  \"questiondownsmall\", \"oneeighth\", \"threeeighths\", \"fiveeighths\",\n  \"seveneighths\", \"onethird\", \"twothirds\", \"zerosuperior\", \"foursuperior\",\n  \"fivesuperior\", \"sixsuperior\", \"sevensuperior\", \"eightsuperior\",\n  \"ninesuperior\", \"zeroinferior\", \"oneinferior\", \"twoinferior\",\n  \"threeinferior\", \"fourinferior\", \"fiveinferior\", \"sixinferior\",\n  \"seveninferior\", \"eightinferior\", \"nineinferior\", \"centinferior\",\n  \"dollarinferior\", \"periodinferior\", \"commainferior\", \"Agravesmall\",\n  \"Aacutesmall\", \"Acircumflexsmall\", \"Atildesmall\", \"Adieresissmall\",\n  \"Aringsmall\", \"AEsmall\", \"Ccedillasmall\", \"Egravesmall\", \"Eacutesmall\",\n  \"Ecircumflexsmall\", \"Edieresissmall\", \"Igravesmall\", \"Iacutesmall\",\n  \"Icircumflexsmall\", \"Idieresissmall\", \"Ethsmall\", \"Ntildesmall\",\n  \"Ogravesmall\", \"Oacutesmall\", \"Ocircumflexsmall\", \"Otildesmall\",\n  \"Odieresissmall\", \"OEsmall\", \"Oslashsmall\", \"Ugravesmall\", \"Uacutesmall\",\n  \"Ucircumflexsmall\", \"Udieresissmall\", \"Yacutesmall\", \"Thornsmall\",\n  \"Ydieresissmall\", \"001.000\", \"001.001\", \"001.002\", \"001.003\", \"Black\",\n  \"Bold\", \"Book\", \"Light\", \"Medium\", \"Regular\", \"Roman\", \"Semibold\"\n];\n", "export let StandardEncoding = [\n  '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n  '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright',\n  'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two',\n  'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater',\n  'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',\n  'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',\n  'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',\n  'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '', '', '', '', '', '', '', '',\n  '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n  'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle',\n  'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger',\n  'daggerdbl', 'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright',\n  'guillemotright', 'ellipsis', 'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex', 'tilde',\n  'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring', 'cedilla', '', 'hungarumlaut', 'ogonek', 'caron',\n  'emdash', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'AE', '', 'ordfeminine', '', '', '',\n  '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae', '', '', '', 'dotlessi', '', '',\n  'lslash', 'oslash', 'oe', 'germandbls'\n];\n\nexport let ExpertEncoding = [\n  '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n  '', '', '', '', 'space', 'exclamsmall', 'Hungarumlautsmall', '', 'dollaroldstyle', 'dollarsuperior',\n  'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader',\n  'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle',\n  'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon',\n  'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', '', 'asuperior',\n  'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', '', '', 'isuperior', '', '', 'lsuperior', 'msuperior',\n  'nsuperior', 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior', '', 'ff', 'fi', 'fl', 'ffi', 'ffl',\n  'parenleftinferior', '', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall',\n  'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall',\n  'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',\n  'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', '', '', '', '', '', '', '',\n  '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n  'exclamdownsmall', 'centoldstyle', 'Lslashsmall', '', '', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall',\n  'Brevesmall', 'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '', 'figuredash', 'hypheninferior',\n  '', '', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters',\n  'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', '',\n  '', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',\n  'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior',\n  'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior',\n  'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall',\n  'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall',\n  'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',\n  'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall',\n  'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',\n  'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall'\n];\n", "export let ISOAdobeCharset = [\n  '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar',\n  'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright',\n  'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero',\n  'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',\n  'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question',\n  'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',\n  'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',\n  'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',\n  'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',\n  'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',\n  'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',\n  'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',\n  'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',\n  'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',\n  'periodcentered', 'paragraph', 'bullet', 'quotesinglbase',\n  'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',\n  'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde',\n  'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla',\n  'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine',\n  'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash',\n  'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu',\n  'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter',\n  'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior',\n  'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright',\n  'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde',\n  'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute',\n  'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex',\n  'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex',\n  'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute',\n  'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla',\n  'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex',\n  'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis',\n  'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis',\n  'ugrave', 'yacute', 'ydieresis', 'zcaron'\n];\n\nexport let ExpertCharset = [\n  '.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle',\n  'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',\n  'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',\n  'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',\n  'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',\n  'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle',\n  'colon', 'semicolon', 'commasuperior', 'threequartersemdash',\n  'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior',\n  'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',\n  'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',\n  'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',\n  'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',\n  'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',\n  'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',\n  'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',\n  'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',\n  'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle',\n  'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall',\n  'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall',\n  'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall',\n  'Cedillasmall', 'onequarter', 'onehalf', 'threequarters',\n  'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',\n  'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',\n  'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',\n  'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',\n  'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',\n  'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',\n  'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',\n  'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall',\n  'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall',\n  'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',\n  'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',\n  'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',\n  'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',\n  'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',\n  'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',\n  'Ydieresissmall'\n];\n\nexport let ExpertSubsetCharset = [\n  '.notdef', 'space', 'dollaroldstyle', 'dollarsuperior',\n  'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',\n  'onedotenleader', 'comma', 'hyphen', 'period', 'fraction',\n  'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle',\n  'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle',\n  'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior',\n  'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior',\n  'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',\n  'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',\n  'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',\n  'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted',\n  'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter',\n  'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',\n  'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',\n  'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',\n  'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',\n  'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',\n  'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',\n  'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',\n  'periodinferior', 'commainferior'\n];\n", "import {Feature} from './opentype';\nimport * as r from 'restructure';\n\n/*******************\n * Variation Store *\n *******************/\n\nlet F2DOT14 = new r.Fixed(16, 'BE', 14);\nlet RegionAxisCoordinates = new r.Struct({\n  startCoord: F2DOT14,\n  peakCoord: F2DOT14,\n  endCoord: F2DOT14\n});\n\nlet VariationRegionList = new r.Struct({\n  axisCount: r.uint16,\n  regionCount: r.uint16,\n  variationRegions: new r.Array(new r.Array(RegionAxisCoordinates, 'axisCount'), 'regionCount')\n});\n\nlet DeltaSet = new r.Struct({\n  shortDeltas: new r.Array(r.int16, t => t.parent.shortDeltaCount),\n  regionDeltas: new r.Array(r.int8, t => t.parent.regionIndexCount - t.parent.shortDeltaCount),\n  deltas: t => t.shortDeltas.concat(t.regionDeltas)\n});\n\nlet ItemVariationData = new r.Struct({\n  itemCount: r.uint16,\n  shortDeltaCount: r.uint16,\n  regionIndexCount: r.uint16,\n  regionIndexes: new r.Array(r.uint16, 'regionIndexCount'),\n  deltaSets: new r.Array(DeltaSet, 'itemCount')\n});\n\nexport let ItemVariationStore = new r.Struct({\n  format: r.uint16,\n  variationRegionList: new r.Pointer(r.uint32, VariationRegionList),\n  variationDataCount: r.uint16,\n  itemVariationData: new r.Array(new r.Pointer(r.uint32, ItemVariationData), 'variationDataCount')\n});\n\n/**********************\n * Feature Variations *\n **********************/\n\nlet ConditionTable = new r.VersionedStruct(r.uint16, {\n  1: {\n    axisIndex: r.uint16,\n    axisIndex: r.uint16,\n    filterRangeMinValue: F2DOT14,\n    filterRangeMaxValue: F2DOT14\n  }\n});\n\nlet ConditionSet = new r.Struct({\n  conditionCount: r.uint16,\n  conditionTable: new r.Array(new r.Pointer(r.uint32, ConditionTable), 'conditionCount')\n});\n\nlet FeatureTableSubstitutionRecord = new r.Struct({\n  featureIndex: r.uint16,\n  alternateFeatureTable: new r.Pointer(r.uint32, Feature, {type: 'parent'})\n});\n\nlet FeatureTableSubstitution = new r.Struct({\n  version: r.fixed32,\n  substitutionCount: r.uint16,\n  substitutions: new r.Array(FeatureTableSubstitutionRecord, 'substitutionCount')\n});\n\nlet FeatureVariationRecord = new r.Struct({\n  conditionSet: new r.Pointer(r.uint32, ConditionSet, {type: 'parent'}),\n  featureTableSubstitution: new r.Pointer(r.uint32, FeatureTableSubstitution, {type: 'parent'})\n});\n\nexport let FeatureVariations = new r.Struct({\n  majorVersion: r.uint16,\n  minorVersion: r.uint16,\n  featureVariationRecordCount: r.uint32,\n  featureVariationRecords: new r.Array(FeatureVariationRecord, 'featureVariationRecordCount')\n});\n", "import * as r from 'restructure';\n\n//########################\n// Scripts and Languages #\n//########################\n\nlet LangSysTable = new r.Struct({\n  reserved:         new r.Reserved(r.uint16),\n  reqFeatureIndex:  r.uint16,\n  featureCount:     r.uint16,\n  featureIndexes:   new r.Array(r.uint16, 'featureCount')\n});\n\nlet LangSysRecord = new r.Struct({\n  tag:      new r.String(4),\n  langSys:  new r.Pointer(r.uint16, LangSysTable, { type: 'parent' })\n});\n\nlet Script = new r.Struct({\n  defaultLangSys: new r.Pointer(r.uint16, LangSysTable),\n  count:          r.uint16,\n  langSysRecords: new r.Array(LangSysRecord, 'count')\n});\n\nlet ScriptRecord = new r.Struct({\n  tag:    new r.String(4),\n  script: new r.Pointer(r.uint16, Script, { type: 'parent' })\n});\n\nexport let ScriptList = new r.Array(ScriptRecord, r.uint16);\n\n//#######################\n// Features and Lookups #\n//#######################\n\nlet FeatureParams = new r.Struct({\n  version:    r.uint16, // should be set to 0 according OT spec\n  nameID:     r.uint16, //OT spec: UI Name ID or uiLabelNameId\n});\n\nexport let Feature = new r.Struct({\n  featureParams:      new r.Pointer(r.uint16, FeatureParams),\n  lookupCount:        r.uint16,\n  lookupListIndexes:  new r.Array(r.uint16, 'lookupCount')\n});\n\nlet FeatureRecord = new r.Struct({\n  tag:      new r.String(4),\n  feature:  new r.Pointer(r.uint16, Feature, { type: 'parent' })\n});\n\nexport let FeatureList = new r.Array(FeatureRecord, r.uint16);\n\nlet LookupFlags = new r.Struct({\n  markAttachmentType: r.uint8,\n  flags: new r.Bitfield(r.uint8, [\n    'rightToLeft', 'ignoreBaseGlyphs', 'ignoreLigatures',\n    'ignoreMarks', 'useMarkFilteringSet'\n  ])\n});\n\nexport function LookupList(SubTable) {\n  let Lookup = new r.Struct({\n    lookupType:         r.uint16,\n    flags:              LookupFlags,\n    subTableCount:      r.uint16,\n    subTables:          new r.Array(new r.Pointer(r.uint16, SubTable), 'subTableCount'),\n    markFilteringSet:   new r.Optional(r.uint16, t => t.flags.flags.useMarkFilteringSet)\n  });\n\n  return new r.LazyArray(new r.Pointer(r.uint16, Lookup), r.uint16);\n}\n\n//#################\n// Coverage Table #\n//#################\n\nlet RangeRecord = new r.Struct({\n  start:              r.uint16,\n  end:                r.uint16,\n  startCoverageIndex: r.uint16\n});\n\nexport let Coverage = new r.VersionedStruct(r.uint16, {\n  1: {\n    glyphCount:   r.uint16,\n    glyphs:       new r.Array(r.uint16, 'glyphCount')\n  },\n  2: {\n    rangeCount:   r.uint16,\n    rangeRecords: new r.Array(RangeRecord, 'rangeCount')\n  }\n});\n\n//#########################\n// Class Definition Table #\n//#########################\n\nlet ClassRangeRecord = new r.Struct({\n  start:  r.uint16,\n  end:    r.uint16,\n  class:  r.uint16\n});\n\nexport let ClassDef = new r.VersionedStruct(r.uint16, {\n  1: { // Class array\n    startGlyph:       r.uint16,\n    glyphCount:       r.uint16,\n    classValueArray:  new r.Array(r.uint16, 'glyphCount')\n  },\n  2: { // Class ranges\n    classRangeCount:  r.uint16,\n    classRangeRecord: new r.Array(ClassRangeRecord, 'classRangeCount')\n  }\n});\n\n//###############\n// Device Table #\n//###############\n\nexport let Device = new r.Struct({\n  a: r.uint16, // startSize for hinting Device, outerIndex for VariationIndex\n  b: r.uint16, // endSize for Device, innerIndex for VariationIndex\n  deltaFormat: r.uint16\n});\n\n//#############################################\n// Contextual Substitution/Positioning Tables #\n//#############################################\n\nlet LookupRecord = new r.Struct({\n  sequenceIndex:      r.uint16,\n  lookupListIndex:    r.uint16\n});\n\nlet Rule = new r.Struct({\n  glyphCount:     r.uint16,\n  lookupCount:    r.uint16,\n  input:          new r.Array(r.uint16, t => t.glyphCount - 1),\n  lookupRecords:  new r.Array(LookupRecord, 'lookupCount')\n});\n\nlet RuleSet = new r.Array(new r.Pointer(r.uint16, Rule), r.uint16);\n\nlet ClassRule = new r.Struct({\n  glyphCount:     r.uint16,\n  lookupCount:    r.uint16,\n  classes:        new r.Array(r.uint16, t => t.glyphCount - 1),\n  lookupRecords:  new r.Array(LookupRecord, 'lookupCount')\n});\n\nlet ClassSet = new r.Array(new r.Pointer(r.uint16, ClassRule), r.uint16);\n\nexport let Context = new r.VersionedStruct(r.uint16, {\n  1: { // Simple context\n    coverage:      new r.Pointer(r.uint16, Coverage),\n    ruleSetCount:  r.uint16,\n    ruleSets:      new r.Array(new r.Pointer(r.uint16, RuleSet), 'ruleSetCount')\n  },\n  2: { // Class-based context\n    coverage:      new r.Pointer(r.uint16, Coverage),\n    classDef:      new r.Pointer(r.uint16, ClassDef),\n    classSetCnt:   r.uint16,\n    classSet:      new r.Array(new r.Pointer(r.uint16, ClassSet), 'classSetCnt')\n  },\n  3: {\n    glyphCount:    r.uint16,\n    lookupCount:   r.uint16,\n    coverages:     new r.Array(new r.Pointer(r.uint16, Coverage), 'glyphCount'),\n    lookupRecords: new r.Array(LookupRecord, 'lookupCount')\n  }\n});\n\n//######################################################\n// Chaining Contextual Substitution/Positioning Tables #\n//######################################################\n\nlet ChainRule = new r.Struct({\n  backtrackGlyphCount:  r.uint16,\n  backtrack:            new r.Array(r.uint16, 'backtrackGlyphCount'),\n  inputGlyphCount:      r.uint16,\n  input:                new r.Array(r.uint16, t => t.inputGlyphCount - 1),\n  lookaheadGlyphCount:  r.uint16,\n  lookahead:            new r.Array(r.uint16, 'lookaheadGlyphCount'),\n  lookupCount:          r.uint16,\n  lookupRecords:        new r.Array(LookupRecord, 'lookupCount')\n});\n\nlet ChainRuleSet = new r.Array(new r.Pointer(r.uint16, ChainRule), r.uint16);\n\nexport let ChainingContext = new r.VersionedStruct(r.uint16, {\n  1: { // Simple context glyph substitution\n    coverage:           new r.Pointer(r.uint16, Coverage),\n    chainCount:         r.uint16,\n    chainRuleSets:      new r.Array(new r.Pointer(r.uint16, ChainRuleSet), 'chainCount')\n  },\n\n  2: { // Class-based chaining context\n    coverage:           new r.Pointer(r.uint16, Coverage),\n    backtrackClassDef:  new r.Pointer(r.uint16, ClassDef),\n    inputClassDef:      new r.Pointer(r.uint16, ClassDef),\n    lookaheadClassDef:  new r.Pointer(r.uint16, ClassDef),\n    chainCount:         r.uint16,\n    chainClassSet:      new r.Array(new r.Pointer(r.uint16, ChainRuleSet), 'chainCount')\n  },\n\n  3: { // Coverage-based chaining context\n    backtrackGlyphCount:    r.uint16,\n    backtrackCoverage:      new r.Array(new r.Pointer(r.uint16, Coverage), 'backtrackGlyphCount'),\n    inputGlyphCount:        r.uint16,\n    inputCoverage:          new r.Array(new r.Pointer(r.uint16, Coverage), 'inputGlyphCount'),\n    lookaheadGlyphCount:    r.uint16,\n    lookaheadCoverage:      new r.Array(new r.Pointer(r.uint16, Coverage), 'lookaheadGlyphCount'),\n    lookupCount:            r.uint16,\n    lookupRecords:          new r.Array(LookupRecord, 'lookupCount')\n  }\n});\n", "import * as r from 'restructure';\n\nlet VerticalOrigin = new r.Struct({\n  glyphIndex:   r.uint16,\n  vertOriginY:  r.int16\n});\n\nexport default new r.Struct({\n  majorVersion:           r.uint16,\n  minorVersion:           r.uint16,\n  defaultVertOriginY:     r.int16,\n  numVertOriginYMetrics:  r.uint16,\n  metrics:                new r.Array(VerticalOrigin, 'numVertOriginYMetrics')\n});\n", "import * as r from 'restructure';\nimport {BigMetrics} from './EBDT';\n\nlet SBitLineMetrics = new r.Struct({\n  ascender: r.int8,\n  descender: r.int8,\n  widthMax: r.uint8,\n  caretSlopeNumerator: r.int8,\n  caretSlopeDenominator: r.int8,\n  caretOffset: r.int8,\n  minOriginSB: r.int8,\n  minAdvanceSB: r.int8,\n  maxBeforeBL: r.int8,\n  minAfterBL: r.int8,\n  pad: new r.Reserved(r.int8, 2)\n});\n\nlet CodeOffsetPair = new r.Struct({\n  glyphCode: r.uint16,\n  offset: r.uint16\n});\n\nlet IndexSubtable = new r.VersionedStruct(r.uint16, {\n  header: {\n    imageFormat: r.uint16,\n    imageDataOffset: r.uint32\n  },\n\n  1: {\n    offsetArray: new r.Array(r.uint32, t => t.parent.lastGlyphIndex - t.parent.firstGlyphIndex + 1)\n  },\n\n  2: {\n    imageSize: r.uint32,\n    bigMetrics: BigMetrics\n  },\n\n  3: {\n    offsetArray: new r.Array(r.uint16, t => t.parent.lastGlyphIndex - t.parent.firstGlyphIndex + 1)\n  },\n\n  4: {\n    numGlyphs: r.uint32,\n    glyphArray: new r.Array(CodeOffsetPair, t => t.numGlyphs + 1)\n  },\n\n  5: {\n    imageSize: r.uint32,\n    bigMetrics: BigMetrics,\n    numGlyphs: r.uint32,\n    glyphCodeArray: new r.Array(r.uint16, 'numGlyphs')\n  }\n});\n\nlet IndexSubtableArray = new r.Struct({\n  firstGlyphIndex: r.uint16,\n  lastGlyphIndex: r.uint16,\n  subtable: new r.Pointer(r.uint32, IndexSubtable)\n});\n\nlet BitmapSizeTable = new r.Struct({\n  indexSubTableArray: new r.Pointer(r.uint32, new r.Array(IndexSubtableArray, 1), { type: 'parent' }),\n  indexTablesSize: r.uint32,\n  numberOfIndexSubTables: r.uint32,\n  colorRef: r.uint32,\n  hori: SBitLineMetrics,\n  vert: SBitLineMetrics,\n  startGlyphIndex: r.uint16,\n  endGlyphIndex: r.uint16,\n  ppemX: r.uint8,\n  ppemY: r.uint8,\n  bitDepth: r.uint8,\n  flags: new r.Bitfield(r.uint8, ['horizontal', 'vertical'])\n});\n\nexport default new r.Struct({\n  version:  r.uint32, // 0x00020000\n  numSizes: r.uint32,\n  sizes:    new r.Array(BitmapSizeTable, 'numSizes')\n});\n", "import * as r from 'restructure';\n\nexport let BigMetrics = new r.Struct({\n  height: r.uint8,\n  width: r.uint8,\n  horiBearingX: r.int8,\n  horiBearingY: r.int8,\n  horiAdvance: r.uint8,\n  vertBearingX: r.int8,\n  vertBearingY: r.int8,\n  vertAdvance: r.uint8\n});\n\nexport let SmallMetrics = new r.Struct({\n  height: r.uint8,\n  width: r.uint8,\n  bearingX: r.int8,\n  bearingY: r.int8,\n  advance: r.uint8\n});\n\nlet EBDTComponent = new r.Struct({\n  glyph: r.uint16,\n  xOffset: r.int8,\n  yOffset: r.int8\n});\n\nclass ByteAligned {}\n\nclass BitAligned {}\n\nexport let glyph = new r.VersionedStruct('version', {\n  1: {\n    metrics: SmallMetrics,\n    data: ByteAligned\n  },\n\n  2: {\n    metrics: SmallMetrics,\n    data: BitAligned\n  },\n\n  // format 3 is deprecated\n  // format 4 is not supported by Microsoft\n\n  5: {\n    data: BitAligned\n  },\n\n  6: {\n    metrics: BigMetrics,\n    data: ByteAligned\n  },\n\n  7: {\n    metrics: BigMetrics,\n    data: BitAligned\n  },\n\n  8: {\n    metrics: SmallMetrics,\n    pad: new r.Reserved(r.uint8),\n    numComponents: r.uint16,\n    components: new r.Array(EBDTComponent, 'numComponents')\n  },\n\n  9: {\n    metrics: BigMetrics,\n    pad: new r.Reserved(r.uint8),\n    numComponents: r.uint16,\n    components: new r.Array(EBDTComponent, 'numComponents')\n  },\n\n  17: {\n    metrics: SmallMetrics,\n    dataLen: r.uint32,\n    data: new r.Buffer('dataLen')\n  },\n\n  18: {\n    metrics: BigMetrics,\n    dataLen: r.uint32,\n    data: new r.Buffer('dataLen')\n  },\n\n  19: {\n    dataLen: r.uint32,\n    data: new r.Buffer('dataLen')\n  }\n});\n\n", "import * as r from 'restructure';\n\nlet ImageTable = new r.Struct({\n  ppem: r.uint16,\n  resolution: r.uint16,\n  imageOffsets: new r.Array(new r.Pointer(r.uint32, 'void'), t => t.parent.parent.maxp.numGlyphs + 1)\n});\n\n// This is the Apple sbix table, used by the \"Apple Color Emoji\" font.\n// It includes several image tables with images for each bitmap glyph\n// of several different sizes.\nexport default new r.Struct({\n  version: r.uint16,\n  flags: new r.Bitfield(r.uint16, ['renderOutlines']),\n  numImgTables: r.uint32,\n  imageTables: new r.Array(new r.Pointer(r.uint32, ImageTable), 'numImgTables')\n});\n", "import * as r from 'restructure';\n\nlet LayerRecord = new r.Struct({\n  gid: r.uint16,          // Glyph ID of layer glyph (must be in z-order from bottom to top).\n  paletteIndex: r.uint16  // Index value to use in the appropriate palette. This value must\n});                       // be less than numPaletteEntries in the CPAL table, except for\n                          // the special case noted below. Each palette entry is 16 bits.\n                          // A palette index of 0xFFFF is a special case indicating that\n                          // the text foreground color should be used.\n\nlet BaseGlyphRecord = new r.Struct({\n  gid: r.uint16,             // Glyph ID of reference glyph. This glyph is for reference only\n                             // and is not rendered for color.\n  firstLayerIndex: r.uint16, // Index (from beginning of the Layer Records) to the layer record.\n                             // There will be numLayers consecutive entries for this base glyph.\n  numLayers: r.uint16\n});\n\nexport default new r.Struct({\n  version: r.uint16,\n  numBaseGlyphRecords: r.uint16,\n  baseGlyphRecord: new r.Pointer(r.uint32, new r.Array(BaseGlyphRecord, 'numBaseGlyphRecords')),\n  layerRecords: new r.Pointer(r.uint32, new r.Array(LayerRecord, 'numLayerRecords'), { lazy: true }),\n  numLayerRecords: r.uint16\n});\n", "import * as r from 'restructure';\n\nlet ColorRecord = new r.Struct({\n  blue: r.uint8,\n  green: r.uint8,\n  red: r.uint8,\n  alpha: r.uint8\n});\n\nexport default new r.VersionedStruct(r.uint16, {\n  header: {\n    numPaletteEntries: r.uint16,\n    numPalettes: r.uint16,\n    numColorRecords: r.uint16,\n    colorRecords: new r.Pointer(r.uint32, new r.Array(ColorRecord, 'numColorRecords')),\n    colorRecordIndices: new r.Array(r.uint16, 'numPalettes'),\n  },\n  0: {},\n  1: {\n    offsetPaletteTypeArray: new r.Pointer(r.uint32, new r.Array(r.uint32, 'numPalettes')),\n    offsetPaletteLabelArray: new r.Pointer(r.uint32, new r.Array(r.uint16, 'numPalettes')),\n    offsetPaletteEntryLabelArray: new r.Pointer(r.uint32, new r.Array(r.uint16, 'numPaletteEntries'))\n  }\n});\n", "import * as r from 'restructure';\nimport {ScriptList, FeatureList, LookupList, Coverage, ClassDef, Device} from './opentype';\nimport {ItemVariationStore} from './variations';\n\nlet BaseCoord = new r.VersionedStruct(r.uint16, {\n  1: { // Design units only\n    coordinate:   r.int16 // X or Y value, in design units\n  },\n\n  2: { // Design units plus contour point\n    coordinate:     r.int16,   // X or Y value, in design units\n    referenceGlyph: r.uint16,  // GlyphID of control glyph\n    baseCoordPoint: r.uint16   // Index of contour point on the referenceGlyph\n  },\n\n  3: { // Design units plus Device table\n    coordinate:   r.int16,                         // X or Y value, in design units\n    deviceTable:  new r.Pointer(r.uint16, Device)  // Device table for X or Y value\n  }\n});\n\nlet BaseValues = new r.Struct({\n  defaultIndex:   r.uint16,  // Index of default baseline for this script-same index in the BaseTagList\n  baseCoordCount: r.uint16,\n  baseCoords:     new r.Array(new r.Pointer(r.uint16, BaseCoord), 'baseCoordCount')\n});\n\nlet FeatMinMaxRecord = new r.Struct({\n  tag:        new r.String(4),  // 4-byte feature identification tag-must match FeatureTag in FeatureList\n  minCoord:   new r.Pointer(r.uint16, BaseCoord, {type: 'parent'}), // May be NULL\n  maxCoord:   new r.Pointer(r.uint16, BaseCoord, {type: 'parent'})  // May be NULL\n});\n\nlet MinMax = new r.Struct({\n  minCoord:           new r.Pointer(r.uint16, BaseCoord),  // May be NULL\n  maxCoord:           new r.Pointer(r.uint16, BaseCoord),  // May be NULL\n  featMinMaxCount:    r.uint16,                            // May be 0\n  featMinMaxRecords:  new r.Array(FeatMinMaxRecord, 'featMinMaxCount') // In alphabetical order\n});\n\nlet BaseLangSysRecord = new r.Struct({\n  tag:    new r.String(4),  // 4-byte language system identification tag\n  minMax: new r.Pointer(r.uint16, MinMax, {type: 'parent'})\n});\n\nlet BaseScript = new r.Struct({\n  baseValues:         new r.Pointer(r.uint16, BaseValues), // May be NULL\n  defaultMinMax:      new r.Pointer(r.uint16, MinMax),     // May be NULL\n  baseLangSysCount:   r.uint16,                            // May be 0\n  baseLangSysRecords: new r.Array(BaseLangSysRecord, 'baseLangSysCount') // in alphabetical order by BaseLangSysTag\n});\n\nlet BaseScriptRecord = new r.Struct({\n  tag:      new r.String(4),  // 4-byte script identification tag\n  script:   new r.Pointer(r.uint16, BaseScript, {type: 'parent'})\n});\n\nlet BaseScriptList = new r.Array(BaseScriptRecord, r.uint16);\n\n// Array of 4-byte baseline identification tags-must be in alphabetical order\nlet BaseTagList = new r.Array(new r.String(4), r.uint16);\n\nlet Axis = new r.Struct({\n  baseTagList:    new r.Pointer(r.uint16, BaseTagList),  // May be NULL\n  baseScriptList: new r.Pointer(r.uint16, BaseScriptList)\n});\n\nexport default new r.VersionedStruct(r.uint32, {\n  header: {\n    horizAxis:    new r.Pointer(r.uint16, Axis),   // May be NULL\n    vertAxis:     new r.Pointer(r.uint16, Axis)    // May be NULL\n  },\n\n  0x00010000: {},\n  0x00010001: {\n    itemVariationStore: new r.Pointer(r.uint32, ItemVariationStore)\n  }\n});\n", "import * as r from 'restructure';\nimport {ScriptList, FeatureList, LookupList, Coverage, ClassDef, Device} from './opentype';\nimport {ItemVariationStore} from './variations';\n\nlet AttachPoint = new r.Array(r.uint16, r.uint16);\nlet AttachList = new r.Struct({\n  coverage:       new r.Pointer(r.uint16, Coverage),\n  glyphCount:     r.uint16,\n  attachPoints:   new r.Array(new r.Pointer(r.uint16, AttachPoint), 'glyphCount')\n});\n\nlet CaretValue = new r.VersionedStruct(r.uint16, {\n  1: { // Design units only\n    coordinate: r.int16\n  },\n\n  2: { // Contour point\n    caretValuePoint: r.uint16\n  },\n\n  3: { // Design units plus Device table\n    coordinate:     r.int16,\n    deviceTable:    new r.Pointer(r.uint16, Device)\n  }\n});\n\nlet LigGlyph = new r.Array(new r.Pointer(r.uint16, CaretValue), r.uint16);\n\nlet LigCaretList = new r.Struct({\n  coverage:       new r.Pointer(r.uint16, Coverage),\n  ligGlyphCount:  r.uint16,\n  ligGlyphs:      new r.Array(new r.Pointer(r.uint16, LigGlyph), 'ligGlyphCount')\n});\n\nlet MarkGlyphSetsDef = new r.Struct({\n  markSetTableFormat: r.uint16,\n  markSetCount:       r.uint16,\n  coverage:           new r.Array(new r.Pointer(r.uint32, Coverage), 'markSetCount')\n});\n\nexport default new r.VersionedStruct(r.uint32, {\n  header: {\n    glyphClassDef:      new r.Pointer(r.uint16, ClassDef),\n    attachList:         new r.Pointer(r.uint16, AttachList),\n    ligCaretList:       new r.Pointer(r.uint16, LigCaretList),\n    markAttachClassDef: new r.Pointer(r.uint16, ClassDef)\n  },\n\n  0x00010000: {},\n  0x00010002: {\n    markGlyphSetsDef:   new r.Pointer(r.uint16, MarkGlyphSetsDef)\n  },\n  0x00010003: {\n    markGlyphSetsDef:   new r.Pointer(r.uint16, MarkGlyphSetsDef),\n    itemVariationStore: new r.Pointer(r.uint32, ItemVariationStore)\n  }\n});\n", "import * as r from 'restructure';\nimport {ScriptList, FeatureList, LookupList, Coverage, ClassDef, Device, Context, ChainingContext} from './opentype';\nimport {FeatureVariations} from './variations';\n\nlet ValueFormat = new r.Bitfield(r.uint16, [\n  'xPlacement', 'yPlacement',\n  'xAdvance', 'yAdvance',\n  'xPlaDevice', 'yPlaDevice',\n  'xAdvDevice', 'yAdvDevice'\n]);\n\nlet types = {\n  xPlacement: r.int16,\n  yPlacement: r.int16,\n  xAdvance:   r.int16,\n  yAdvance:   r.int16,\n  xPlaDevice: new r.Pointer(r.uint16, Device, { type: 'global', relativeTo: ctx => ctx.rel }),\n  yPlaDevice: new r.Pointer(r.uint16, Device, { type: 'global', relativeTo: ctx => ctx.rel }),\n  xAdvDevice: new r.Pointer(r.uint16, Device, { type: 'global', relativeTo: ctx => ctx.rel }),\n  yAdvDevice: new r.Pointer(r.uint16, Device, { type: 'global', relativeTo: ctx => ctx.rel })\n};\n\nclass ValueRecord {\n  constructor(key = 'valueFormat') {\n    this.key = key;\n  }\n\n  buildStruct(parent) {\n    let struct = parent;\n    while (!struct[this.key] && struct.parent) {\n      struct = struct.parent;\n    }\n\n    if (!struct[this.key]) return;\n\n    let fields = {};\n    fields.rel = () => struct._startOffset;\n\n    let format = struct[this.key];\n    for (let key in format) {\n      if (format[key]) {\n        fields[key] = types[key];\n      }\n    }\n\n    return new r.Struct(fields);\n  }\n\n  size(val, ctx) {\n    return this.buildStruct(ctx).size(val, ctx);\n  }\n\n  decode(stream, parent) {\n    let res = this.buildStruct(parent).decode(stream, parent);\n    delete res.rel;\n    return res;\n  }\n}\n\nlet PairValueRecord = new r.Struct({\n  secondGlyph:    r.uint16,\n  value1:         new ValueRecord('valueFormat1'),\n  value2:         new ValueRecord('valueFormat2')\n});\n\nlet PairSet = new r.Array(PairValueRecord, r.uint16);\n\nlet Class2Record = new r.Struct({\n  value1: new ValueRecord('valueFormat1'),\n  value2: new ValueRecord('valueFormat2')\n});\n\nlet Anchor = new r.VersionedStruct(r.uint16, {\n  1: { // Design units only\n    xCoordinate:    r.int16,\n    yCoordinate:    r.int16\n  },\n\n  2: { // Design units plus contour point\n    xCoordinate:    r.int16,\n    yCoordinate:    r.int16,\n    anchorPoint:    r.uint16\n  },\n\n  3: { // Design units plus Device tables\n    xCoordinate:    r.int16,\n    yCoordinate:    r.int16,\n    xDeviceTable:   new r.Pointer(r.uint16, Device),\n    yDeviceTable:   new r.Pointer(r.uint16, Device)\n  }\n});\n\nlet EntryExitRecord = new r.Struct({\n  entryAnchor:    new r.Pointer(r.uint16, Anchor, {type: 'parent'}),\n  exitAnchor:     new r.Pointer(r.uint16, Anchor, {type: 'parent'})\n});\n\nlet MarkRecord = new r.Struct({\n  class:      r.uint16,\n  markAnchor: new r.Pointer(r.uint16, Anchor, {type: 'parent'})\n});\n\nlet MarkArray = new r.Array(MarkRecord, r.uint16);\n\nlet BaseRecord  = new r.Array(new r.Pointer(r.uint16, Anchor), t => t.parent.classCount);\nlet BaseArray   = new r.Array(BaseRecord, r.uint16);\n\nlet ComponentRecord = new r.Array(new r.Pointer(r.uint16, Anchor), t => t.parent.parent.classCount);\nlet LigatureAttach  = new r.Array(ComponentRecord, r.uint16);\nlet LigatureArray   = new r.Array(new r.Pointer(r.uint16, LigatureAttach), r.uint16);\n\nlet GPOSLookup = new r.VersionedStruct('lookupType', {\n  1: new r.VersionedStruct(r.uint16, { // Single Adjustment\n    1: { // Single positioning value\n      coverage:       new r.Pointer(r.uint16, Coverage),\n      valueFormat:    ValueFormat,\n      value:          new ValueRecord()\n    },\n    2: {\n      coverage:       new r.Pointer(r.uint16, Coverage),\n      valueFormat:    ValueFormat,\n      valueCount:     r.uint16,\n      values:         new r.LazyArray(new ValueRecord(), 'valueCount')\n    }\n  }),\n\n  2: new r.VersionedStruct(r.uint16, { // Pair Adjustment Positioning\n    1: { // Adjustments for glyph pairs\n      coverage:       new r.Pointer(r.uint16, Coverage),\n      valueFormat1:   ValueFormat,\n      valueFormat2:   ValueFormat,\n      pairSetCount:   r.uint16,\n      pairSets:       new r.LazyArray(new r.Pointer(r.uint16, PairSet), 'pairSetCount')\n    },\n\n    2: { // Class pair adjustment\n      coverage:       new r.Pointer(r.uint16, Coverage),\n      valueFormat1:   ValueFormat,\n      valueFormat2:   ValueFormat,\n      classDef1:      new r.Pointer(r.uint16, ClassDef),\n      classDef2:      new r.Pointer(r.uint16, ClassDef),\n      class1Count:    r.uint16,\n      class2Count:    r.uint16,\n      classRecords:   new r.LazyArray(new r.LazyArray(Class2Record, 'class2Count'), 'class1Count')\n    }\n  }),\n\n  3: { // Cursive Attachment Positioning\n    format:             r.uint16,\n    coverage:           new r.Pointer(r.uint16, Coverage),\n    entryExitCount:     r.uint16,\n    entryExitRecords:   new r.Array(EntryExitRecord, 'entryExitCount')\n  },\n\n  4: { // MarkToBase Attachment Positioning\n    format:             r.uint16,\n    markCoverage:       new r.Pointer(r.uint16, Coverage),\n    baseCoverage:       new r.Pointer(r.uint16, Coverage),\n    classCount:         r.uint16,\n    markArray:          new r.Pointer(r.uint16, MarkArray),\n    baseArray:          new r.Pointer(r.uint16, BaseArray)\n  },\n\n  5: { // MarkToLigature Attachment Positioning\n    format:             r.uint16,\n    markCoverage:       new r.Pointer(r.uint16, Coverage),\n    ligatureCoverage:   new r.Pointer(r.uint16, Coverage),\n    classCount:         r.uint16,\n    markArray:          new r.Pointer(r.uint16, MarkArray),\n    ligatureArray:      new r.Pointer(r.uint16, LigatureArray)\n  },\n\n  6: { // MarkToMark Attachment Positioning\n    format:             r.uint16,\n    mark1Coverage:      new r.Pointer(r.uint16, Coverage),\n    mark2Coverage:      new r.Pointer(r.uint16, Coverage),\n    classCount:         r.uint16,\n    mark1Array:         new r.Pointer(r.uint16, MarkArray),\n    mark2Array:         new r.Pointer(r.uint16, BaseArray)\n  },\n\n  7: Context,          // Contextual positioning\n  8: ChainingContext,  // Chaining contextual positioning\n\n  9: { // Extension Positioning\n    posFormat:   r.uint16,\n    lookupType:  r.uint16,   // cannot also be 9\n    extension:   new r.Pointer(r.uint32, null)\n  }\n});\n\n// Fix circular reference\nGPOSLookup.versions[9].extension.type = GPOSLookup;\n\nexport default new r.VersionedStruct(r.uint32, {\n  header: {\n    scriptList:     new r.Pointer(r.uint16, ScriptList),\n    featureList:    new r.Pointer(r.uint16, FeatureList),\n    lookupList:     new r.Pointer(r.uint16, new LookupList(GPOSLookup))\n  },\n\n  0x00010000: {},\n  0x00010001: {\n    featureVariations: new r.Pointer(r.uint32, FeatureVariations)\n  }\n});\n\n// export GPOSLookup for JSTF table\nexport { GPOSLookup };\n", "import * as r from 'restructure';\nimport {ScriptList, FeatureList, LookupList, Coverage, ClassDef, Device, Context, ChainingContext} from './opentype';\nimport {FeatureVariations} from './variations';\n\nlet Sequence = new r.Array(r.uint16, r.uint16);\nlet AlternateSet = Sequence;\n\nlet Ligature = new r.Struct({\n  glyph:      r.uint16,\n  compCount:  r.uint16,\n  components: new r.Array(r.uint16, t => t.compCount - 1)\n});\n\nlet LigatureSet = new r.Array(new r.Pointer(r.uint16, Ligature), r.uint16);\n\nlet GSUBLookup = new r.VersionedStruct('lookupType', {\n  1: new r.VersionedStruct(r.uint16, {// Single Substitution\n    1: {\n      coverage:       new r.Pointer(r.uint16, Coverage),\n      deltaGlyphID:   r.int16\n    },\n    2: {\n      coverage:       new r.Pointer(r.uint16, Coverage),\n      glyphCount:     r.uint16,\n      substitute:     new r.LazyArray(r.uint16, 'glyphCount')\n    }\n  }),\n\n  2: { // Multiple Substitution\n    substFormat:    r.uint16,\n    coverage:       new r.Pointer(r.uint16, Coverage),\n    count:          r.uint16,\n    sequences:      new r.LazyArray(new r.Pointer(r.uint16, Sequence), 'count')\n  },\n\n  3: { // Alternate Substitution\n    substFormat:    r.uint16,\n    coverage:       new r.Pointer(r.uint16, Coverage),\n    count:          r.uint16,\n    alternateSet:   new r.LazyArray(new r.Pointer(r.uint16, AlternateSet), 'count')\n  },\n\n  4: { // Ligature Substitution\n    substFormat:    r.uint16,\n    coverage:       new r.Pointer(r.uint16, Coverage),\n    count:          r.uint16,\n    ligatureSets:   new r.LazyArray(new r.Pointer(r.uint16, LigatureSet), 'count')\n  },\n\n  5: Context,         // Contextual Substitution\n  6: ChainingContext, // Chaining Contextual Substitution\n\n  7: { // Extension Substitution\n    substFormat:   r.uint16,\n    lookupType:    r.uint16,   // cannot also be 7\n    extension:     new r.Pointer(r.uint32, null)\n  },\n\n  8: { // Reverse Chaining Contextual Single Substitution\n    substFormat:            r.uint16,\n    coverage:               new r.Pointer(r.uint16, Coverage),\n    backtrackCoverage:      new r.Array(new r.Pointer(r.uint16, Coverage), 'backtrackGlyphCount'),\n    lookaheadGlyphCount:    r.uint16,\n    lookaheadCoverage:      new r.Array(new r.Pointer(r.uint16, Coverage), 'lookaheadGlyphCount'),\n    glyphCount:             r.uint16,\n    substitutes:            new r.Array(r.uint16, 'glyphCount')\n  }\n});\n\n// Fix circular reference\nGSUBLookup.versions[7].extension.type = GSUBLookup;\n\nexport default new r.VersionedStruct(r.uint32, {\n  header: {\n    scriptList:     new r.Pointer(r.uint16, ScriptList),\n    featureList:    new r.Pointer(r.uint16, FeatureList),\n    lookupList:     new r.Pointer(r.uint16, new LookupList(GSUBLookup))\n  },\n\n  0x00010000: {},\n  0x00010001: {\n    featureVariations: new r.Pointer(r.uint32, FeatureVariations)\n  }\n});\n", "import * as r from 'restructure';\nimport { ScriptList, FeatureList, LookupList, Coverage, ClassDef, Device } from './opentype';\nimport { GPOSLookup } from './GPOS';\n\nlet JstfGSUBModList = new r.Array(r.uint16, r.uint16);\n\nlet JstfPriority = new r.Struct({\n  shrinkageEnableGSUB:    new r.Pointer(r.uint16, JstfGSUBModList),\n  shrinkageDisableGSUB:   new r.Pointer(r.uint16, JstfGSUBModList),\n  shrinkageEnableGPOS:    new r.Pointer(r.uint16, JstfGSUBModList),\n  shrinkageDisableGPOS:   new r.Pointer(r.uint16, JstfGSUBModList),\n  shrinkageJstfMax:       new r.Pointer(r.uint16, new LookupList(GPOSLookup)),\n  extensionEnableGSUB:    new r.Pointer(r.uint16, JstfGSUBModList),\n  extensionDisableGSUB:   new r.Pointer(r.uint16, JstfGSUBModList),\n  extensionEnableGPOS:    new r.Pointer(r.uint16, JstfGSUBModList),\n  extensionDisableGPOS:   new r.Pointer(r.uint16, JstfGSUBModList),\n  extensionJstfMax:       new r.Pointer(r.uint16, new LookupList(GPOSLookup))\n});\n\nlet JstfLangSys = new r.Array(new r.Pointer(r.uint16, JstfPriority), r.uint16);\n\nlet JstfLangSysRecord = new r.Struct({\n  tag:         new r.String(4),\n  jstfLangSys: new r.Pointer(r.uint16, JstfLangSys)\n});\n\nlet JstfScript = new r.Struct({\n  extenderGlyphs: new r.Pointer(r.uint16, new r.Array(r.uint16, r.uint16)), // array of glyphs to extend line length\n  defaultLangSys: new r.Pointer(r.uint16, JstfLangSys),\n  langSysCount:   r.uint16,\n  langSysRecords: new r.Array(JstfLangSysRecord, 'langSysCount')\n});\n\nlet JstfScriptRecord = new r.Struct({\n  tag:    new r.String(4),\n  script: new r.Pointer(r.uint16, JstfScript, {type: 'parent'})\n});\n\nexport default new r.Struct({\n  version:     r.uint32,  // should be 0x00010000\n  scriptCount: r.uint16,\n  scriptList:  new r.Array(JstfScriptRecord, 'scriptCount')\n});\n", "import * as r from 'restructure';\nimport { resolveLength } from 'restructure';\nimport { ItemVariationStore } from './variations';\n\n// TODO: add this to restructure\nclass VariableSizeNumber {\n  constructor(size) {\n    this._size = size;\n  }\n\n  decode(stream, parent) {\n    switch (this.size(0, parent)) {\n      case 1: return stream.readUInt8();\n      case 2: return stream.readUInt16BE();\n      case 3: return stream.readUInt24BE();\n      case 4: return stream.readUInt32BE();\n    }\n  }\n\n  size(val, parent) {\n    return resolveLength(this._size, null, parent);\n  }\n}\n\nlet MapDataEntry = new r.Struct({\n  entry: new VariableSizeNumber(t => ((t.parent.entryFormat & 0x0030) >> 4) + 1),\n  outerIndex: t => t.entry >> ((t.parent.entryFormat & 0x000F) + 1),\n  innerIndex: t => t.entry & ((1 << ((t.parent.entryFormat & 0x000F) + 1)) - 1)\n});\n\nlet DeltaSetIndexMap = new r.Struct({\n  entryFormat: r.uint16,\n  mapCount: r.uint16,\n  mapData: new r.Array(MapDataEntry, 'mapCount')\n});\n\nexport default new r.Struct({\n  majorVersion: r.uint16,\n  minorVersion: r.uint16,\n  itemVariationStore: new r.Pointer(r.uint32, ItemVariationStore),\n  advanceWidthMapping: new r.Pointer(r.uint32, DeltaSetIndexMap),\n  LSBMapping: new r.Pointer(r.uint32, DeltaSetIndexMap),\n  RSBMapping: new r.Pointer(r.uint32, DeltaSetIndexMap)\n});\n", "import * as r from 'restructure';\n\nlet Signature = new r.Struct({\n  format: r.uint32,\n  length: r.uint32,\n  offset: r.uint32\n});\n\nlet SignatureBlock = new r.Struct({\n  reserved:       new r.Reserved(r.uint16, 2),\n  cbSignature:    r.uint32,  // Length (in bytes) of the PKCS#7 packet in pbSignature\n  signature:      new r.Buffer('cbSignature')\n});\n\nexport default new r.Struct({\n  ulVersion:       r.uint32,  // Version number of the DSIG table (0x00000001)\n  usNumSigs:       r.uint16,  // Number of signatures in the table\n  usFlag:          r.uint16,  // Permission flags\n  signatures:      new r.Array(Signature, 'usNumSigs'),\n  signatureBlocks: new r.Array(SignatureBlock, 'usNumSigs')\n});\n", "import * as r from 'restructure';\n\nlet GaspRange = new r.Struct({\n  rangeMaxPPEM:       r.uint16,                  // Upper limit of range, in ppem\n  rangeGaspBehavior:  new r.Bitfield(r.uint16, [ // Flags describing desired rasterizer behavior\n    'grayscale', 'gridfit',\n    'symmetricSmoothing', 'symmetricGridfit'     // only in version 1, for ClearType\n  ])\n});\n\nexport default new r.Struct({\n  version:    r.uint16,  // set to 0\n  numRanges:  r.uint16,\n  gaspRanges: new r.Array(GaspRange, 'numRanges') // Sorted by ppem\n});\n", "import * as r from 'restructure';\n\nlet DeviceRecord = new r.Struct({\n  pixelSize:      r.uint8,\n  maximumWidth:   r.uint8,\n  widths:         new r.Array(r.uint8, t => t.parent.parent.maxp.numGlyphs)\n});\n\n// The Horizontal Device Metrics table stores integer advance widths scaled to particular pixel sizes\nexport default new r.Struct({\n  version:            r.uint16,\n  numRecords:         r.int16,\n  sizeDeviceRecord:   r.int32,\n  records:            new r.Array(DeviceRecord, 'numRecords')\n});\n", "import * as r from 'restructure';\n\nlet KernPair = new r.Struct({\n  left:   r.uint16,\n  right:  r.uint16,\n  value:  r.int16\n});\n\nlet ClassTable = new r.Struct({\n  firstGlyph: r.uint16,\n  nGlyphs: r.uint16,\n  offsets: new r.Array(r.uint16, 'nGlyphs'),\n  max: t => t.offsets.length && Math.max.apply(Math, t.offsets)\n});\n\nlet Kern2Array = new r.Struct({\n  off: t => t._startOffset - t.parent.parent._startOffset,\n  len: t => (((t.parent.leftTable.max - t.off) / t.parent.rowWidth) + 1) * (t.parent.rowWidth / 2),\n  values: new r.LazyArray(r.int16, 'len')\n});\n\nlet KernSubtable = new r.VersionedStruct('format', {\n  0: {\n    nPairs:         r.uint16,\n    searchRange:    r.uint16,\n    entrySelector:  r.uint16,\n    rangeShift:     r.uint16,\n    pairs:          new r.Array(KernPair, 'nPairs')\n  },\n\n  2: {\n    rowWidth:   r.uint16,\n    leftTable:  new r.Pointer(r.uint16, ClassTable, {type: 'parent'}),\n    rightTable: new r.Pointer(r.uint16, ClassTable, {type: 'parent'}),\n    array:      new r.Pointer(r.uint16, Kern2Array, {type: 'parent'})\n  },\n\n  3: {\n    glyphCount:       r.uint16,\n    kernValueCount:   r.uint8,\n    leftClassCount:   r.uint8,\n    rightClassCount:  r.uint8,\n    flags:            r.uint8,\n    kernValue:        new r.Array(r.int16, 'kernValueCount'),\n    leftClass:        new r.Array(r.uint8, 'glyphCount'),\n    rightClass:       new r.Array(r.uint8, 'glyphCount'),\n    kernIndex:        new r.Array(r.uint8, t => t.leftClassCount * t.rightClassCount)\n  }\n});\n\nlet KernTable = new r.VersionedStruct('version', {\n  0: { // Microsoft uses this format\n    subVersion: r.uint16,  // Microsoft has an extra sub-table version number\n    length:     r.uint16,  // Length of the subtable, in bytes\n    format:     r.uint8,   // Format of subtable\n    coverage:   new r.Bitfield(r.uint8, [\n      'horizontal',    // 1 if table has horizontal data, 0 if vertical\n      'minimum',       // If set to 1, the table has minimum values. If set to 0, the table has kerning values.\n      'crossStream',   // If set to 1, kerning is perpendicular to the flow of the text\n      'override'      // If set to 1 the value in this table replaces the accumulated value\n    ]),\n    subtable:   KernSubtable,\n    padding: new r.Reserved(r.uint8, t => t.length - t._currentOffset)\n  },\n  1: { // Apple uses this format\n    length:     r.uint32,\n    coverage:   new r.Bitfield(r.uint8, [\n      null, null, null, null, null,\n      'variation',     // Set if table has variation kerning values\n      'crossStream',   // Set if table has cross-stream kerning values\n      'vertical'      // Set if table has vertical kerning values\n    ]),\n    format:     r.uint8,\n    tupleIndex: r.uint16,\n    subtable:   KernSubtable,\n    padding: new r.Reserved(r.uint8, t => t.length - t._currentOffset)\n  }\n});\n\nexport default new r.VersionedStruct(r.uint16, {\n  0: { // Microsoft Version\n    nTables:    r.uint16,\n    tables:     new r.Array(KernTable, 'nTables')\n  },\n\n  1: { // Apple Version\n    reserved:   new r.Reserved(r.uint16), // the other half of the version number\n    nTables:    r.uint32,\n    tables:     new r.Array(KernTable, 'nTables')\n  }\n});\n", "import * as r from 'restructure';\n\n// Linear Threshold table\n// Records the ppem for each glyph at which the scaling becomes linear again,\n// despite instructions effecting the advance width\nexport default new r.Struct({\n  version:    r.uint16,\n  numGlyphs:  r.uint16,\n  yPels:      new r.Array(r.uint8, 'numGlyphs')\n});\n", "import * as r from 'restructure';\n\n// PCL 5 Table\n// NOTE: The PCLT table is strongly discouraged for OpenType fonts with TrueType outlines\nexport default new r.Struct({\n  version:              r.uint16,\n  fontNumber:           r.uint32,\n  pitch:                r.uint16,\n  xHeight:              r.uint16,\n  style:                r.uint16,\n  typeFamily:           r.uint16,\n  capHeight:            r.uint16,\n  symbolSet:            r.uint16,\n  typeface:             new r.String(16),\n  characterComplement:  new r.String(8),\n  fileName:             new r.String(6),\n  strokeWeight:         new r.String(1),\n  widthType:            new r.String(1),\n  serifStyle:           r.uint8,\n  reserved:             new r.Reserved(r.uint8)\n});\n", "import * as r from 'restructure';\n\n// VDMX tables contain ascender/descender overrides for certain (usually small)\n// sizes. This is needed in order to match font metrics on Windows.\n\nlet Ratio = new r.Struct({\n  bCharSet:       r.uint8,                             // Character set\n  xRatio:         r.uint8,                             // Value to use for x-Ratio\n  yStartRatio:    r.uint8,                             // Starting y-Ratio value\n  yEndRatio:      r.uint8                              // Ending y-Ratio value\n});\n\nlet vTable = new r.Struct({\n  yPelHeight:     r.uint16,                            // yPelHeight to which values apply\n  yMax:           r.int16,                             // Maximum value (in pels) for this yPelHeight\n  yMin:           r.int16                              // Minimum value (in pels) for this yPelHeight\n});\n\nlet VdmxGroup = new r.Struct({\n  recs:           r.uint16,                            // Number of height records in this group\n  startsz:        r.uint8,                             // Starting yPelHeight\n  endsz:          r.uint8,                             // Ending yPelHeight\n  entries:        new r.Array(vTable, 'recs')          // The VDMX records\n});\n\nexport default new r.Struct({\n  version:        r.uint16,                            // Version number (0 or 1)\n  numRecs:        r.uint16,                            // Number of VDMX groups present\n  numRatios:      r.uint16,                            // Number of aspect ratio groupings\n  ratioRanges:    new r.Array(Ratio, 'numRatios'),     // Ratio ranges\n  offsets:        new r.Array(r.uint16, 'numRatios'),  // Offset to the VDMX group for this ratio range\n  groups:         new r.Array(VdmxGroup, 'numRecs')    // The actual VDMX groupings\n});\n", "import * as r from 'restructure';\n\n// Vertical Header Table\nexport default new r.Struct({\n  version:                r.uint16,  // Version number of the Vertical Header Table\n  ascent:                 r.int16,   // The vertical typographic ascender for this font\n  descent:                r.int16,   // The vertical typographic descender for this font\n  lineGap:                r.int16,   // The vertical typographic line gap for this font\n  advanceHeightMax:       r.int16,   // The maximum advance height measurement found in the font\n  minTopSideBearing:      r.int16,   // The minimum top side bearing measurement found in the font\n  minBottomSideBearing:   r.int16,   // The minimum bottom side bearing measurement found in the font\n  yMaxExtent:             r.int16,\n  caretSlopeRise:         r.int16,   // Caret slope (rise/run)\n  caretSlopeRun:          r.int16,\n  caretOffset:            r.int16,   // Set value equal to 0 for nonslanted fonts\n  reserved:               new r.Reserved(r.int16, 4),\n  metricDataFormat:       r.int16,   // Set to 0\n  numberOfMetrics:        r.uint16   // Number of advance heights in the Vertical Metrics table\n});\n", "import * as r from 'restructure';\n\nlet VmtxEntry = new r.Struct({\n  advance: r.uint16,  // The advance height of the glyph\n  bearing: r.int16    // The top sidebearing of the glyph\n});\n\n// Vertical Metrics Table\nexport default new r.Struct({\n  metrics:  new r.LazyArray(VmtxEntry, t => t.parent.vhea.numberOfMetrics),\n  bearings: new r.LazyArray(r.int16, t => t.parent.maxp.numGlyphs - t.parent.vhea.numberOfMetrics)\n});\n", "import * as r from 'restructure';\n\nlet shortFrac = new r.Fixed(16, 'BE', 14);\n\nlet Correspondence = new r.Struct({\n  fromCoord: shortFrac,\n  toCoord: shortFrac\n});\n\nlet Segment = new r.Struct({\n  pairCount: r.uint16,\n  correspondence: new r.Array(Correspondence, 'pairCount')\n});\n\nexport default new r.Struct({\n  version: r.fixed32,\n  axisCount: r.uint32,\n  segment: new r.Array(Segment, 'axisCount')\n});\n", "import * as r from 'restructure';\nimport { LookupTable } from './aat';\n\nlet BslnSubtable = new r.VersionedStruct('format', {\n  0: { // Distance-based, no mapping\n    deltas: new r.Array(r.int16, 32)\n  },\n\n  1: { // Distance-based, with mapping\n    deltas: new r.Array(r.int16, 32),\n    mappingData: new LookupTable(r.uint16)\n  },\n\n  2: { // Control point-based, no mapping\n    standardGlyph: r.uint16,\n    controlPoints: new r.Array(r.uint16, 32)\n  },\n\n  3: { // Control point-based, with mapping\n    standardGlyph: r.uint16,\n    controlPoints: new r.Array(r.uint16, 32),\n    mappingData: new LookupTable(r.uint16)\n  }\n});\n\nexport default new r.Struct({\n  version: r.fixed32,\n  format: r.uint16,\n  defaultBaseline: r.uint16,\n  subtable: BslnSubtable\n});\n", "import * as r from 'restructure';\n\nclass UnboundedArrayAccessor {\n  constructor(type, stream, parent) {\n    this.type = type;\n    this.stream = stream;\n    this.parent = parent;\n    this.base = this.stream.pos;\n    this._items = [];\n  }\n\n  getItem(index) {\n    if (this._items[index] == null) {\n      let pos = this.stream.pos;\n      this.stream.pos = this.base + this.type.size(null, this.parent) * index;\n      this._items[index] = this.type.decode(this.stream, this.parent);\n      this.stream.pos = pos;\n    }\n\n    return this._items[index];\n  }\n\n  inspect() {\n    return `[UnboundedArray ${this.type.constructor.name}]`;\n  }\n}\n\nexport class UnboundedArray extends r.Array {\n  constructor(type) {\n    super(type, 0);\n  }\n\n  decode(stream, parent) {\n    return new UnboundedArrayAccessor(this.type, stream, parent);\n  }\n}\n\nexport let LookupTable = function(ValueType = r.uint16) {\n  // Helper class that makes internal structures invisible to pointers\n  class Shadow {\n    constructor(type) {\n      this.type = type;\n    }\n\n    decode(stream, ctx) {\n      ctx = ctx.parent.parent;\n      return this.type.decode(stream, ctx);\n    }\n\n    size(val, ctx) {\n      ctx = ctx.parent.parent;\n      return this.type.size(val, ctx);\n    }\n\n    encode(stream, val, ctx) {\n      ctx = ctx.parent.parent;\n      return this.type.encode(stream, val, ctx);\n    }\n  }\n\n  ValueType = new Shadow(ValueType);\n\n  let BinarySearchHeader = new r.Struct({\n    unitSize: r.uint16,\n    nUnits: r.uint16,\n    searchRange: r.uint16,\n    entrySelector: r.uint16,\n    rangeShift: r.uint16\n  });\n\n  let LookupSegmentSingle = new r.Struct({\n    lastGlyph: r.uint16,\n    firstGlyph: r.uint16,\n    value: ValueType\n  });\n\n  let LookupSegmentArray = new r.Struct({\n    lastGlyph: r.uint16,\n    firstGlyph: r.uint16,\n    values: new r.Pointer(r.uint16, new r.Array(ValueType, t => t.lastGlyph - t.firstGlyph + 1), {type: 'parent'})\n  });\n\n  let LookupSingle = new r.Struct({\n    glyph: r.uint16,\n    value: ValueType\n  });\n\n  return new r.VersionedStruct(r.uint16, {\n    0: {\n      values: new UnboundedArray(ValueType) // length == number of glyphs maybe?\n    },\n    2: {\n      binarySearchHeader: BinarySearchHeader,\n      segments: new r.Array(LookupSegmentSingle, t => t.binarySearchHeader.nUnits)\n    },\n    4: {\n      binarySearchHeader: BinarySearchHeader,\n      segments: new r.Array(LookupSegmentArray, t => t.binarySearchHeader.nUnits)\n    },\n    6: {\n      binarySearchHeader: BinarySearchHeader,\n      segments: new r.Array(LookupSingle, t => t.binarySearchHeader.nUnits)\n    },\n    8: {\n      firstGlyph: r.uint16,\n      count: r.uint16,\n      values: new r.Array(ValueType, 'count')\n    }\n  });\n};\n\nexport function StateTable(entryData = {}, lookupType = r.uint16) {\n  let entry = Object.assign({\n    newState: r.uint16,\n    flags: r.uint16\n  }, entryData);\n\n  let Entry = new r.Struct(entry);\n  let StateArray = new UnboundedArray(new r.Array(r.uint16, t => t.nClasses));\n\n  let StateHeader = new r.Struct({\n    nClasses: r.uint32,\n    classTable: new r.Pointer(r.uint32, new LookupTable(lookupType)),\n    stateArray: new r.Pointer(r.uint32, StateArray),\n    entryTable: new r.Pointer(r.uint32, new UnboundedArray(Entry))\n  });\n\n  return StateHeader;\n}\n\n// This is the old version of the StateTable structure\nexport function StateTable1(entryData = {}, lookupType = r.uint16) {\n  let ClassLookupTable = new r.Struct({\n    version() { return 8; }, // simulate LookupTable\n    firstGlyph: r.uint16,\n    values: new r.Array(r.uint8, r.uint16)\n  });\n\n  let entry = Object.assign({\n    newStateOffset: r.uint16,\n    // convert offset to stateArray index\n    newState: t => (t.newStateOffset - (t.parent.stateArray.base - t.parent._startOffset)) / t.parent.nClasses,\n    flags: r.uint16\n  }, entryData);\n\n  let Entry = new r.Struct(entry);\n  let StateArray = new UnboundedArray(new r.Array(r.uint8, t => t.nClasses));\n\n  let StateHeader1 = new r.Struct({\n    nClasses: r.uint16,\n    classTable: new r.Pointer(r.uint16, ClassLookupTable),\n    stateArray: new r.Pointer(r.uint16, StateArray),\n    entryTable: new r.Pointer(r.uint16, new UnboundedArray(Entry))\n  });\n\n  return StateHeader1;\n}\n", "import * as r from 'restructure';\n\nlet Setting = new r.Struct({\n  setting: r.uint16,\n  nameIndex: r.int16,\n  name: t => t.parent.parent.parent.name.records.fontFeatures[t.nameIndex]\n});\n\nlet FeatureName = new r.Struct({\n  feature: r.uint16,\n  nSettings: r.uint16,\n  settingTable: new r.Pointer(r.uint32, new r.Array(Setting, 'nSettings'), { type: 'parent' }),\n  featureFlags: new r.Bitfield(r.uint8, [\n    null, null, null, null, null, null,\n    'hasDefault', 'exclusive'\n  ]),\n  defaultSetting: r.uint8,\n  nameIndex: r.int16,\n  name: t => t.parent.parent.name.records.fontFeatures[t.nameIndex]\n});\n\nexport default new r.Struct({\n  version: r.fixed32,\n  featureNameCount: r.uint16,\n  reserved1: new r.Reserved(r.uint16),\n  reserved2: new r.Reserved(r.uint32),\n  featureNames: new r.Array(FeatureName, 'featureNameCount')\n});\n", "import * as r from 'restructure';\n\nlet Axis = new r.Struct({\n  axisTag: new r.String(4),\n  minValue: r.fixed32,\n  defaultValue: r.fixed32,\n  maxValue: r.fixed32,\n  flags: r.uint16,\n  nameID: r.uint16,\n  name: t => t.parent.parent.name.records.fontFeatures[t.nameID]\n});\n\nlet Instance = new r.Struct({\n  nameID: r.uint16,\n  name: t => t.parent.parent.name.records.fontFeatures[t.nameID],\n  flags: r.uint16,\n  coord: new r.Array(r.fixed32, t => t.parent.axisCount),\n  postscriptNameID: new r.Optional(r.uint16, t => t.parent.instanceSize - t._currentOffset > 0)\n});\n\nexport default new r.Struct({\n  version: r.fixed32,\n  offsetToData: r.uint16,\n  countSizePairs: r.uint16,\n  axisCount: r.uint16,\n  axisSize: r.uint16,\n  instanceCount: r.uint16,\n  instanceSize: r.uint16,\n  axis: new r.Array(Axis, 'axisCount'),\n  instance: new r.Array(Instance, 'instanceCount')\n});\n", "import * as r from 'restructure';\n\nlet shortFrac = new r.Fixed(16, 'BE', 14);\nclass Offset {\n  static decode(stream, parent) {\n    // In short format, offsets are multiplied by 2.\n    // This doesn't seem to be documented by Apple, but it\n    // is implemented this way in Freetype.\n    return parent.flags\n      ? stream.readUInt32BE()\n      : stream.readUInt16BE() * 2;\n  }\n}\n\nlet gvar = new r.Struct({\n  version: r.uint16,\n  reserved: new r.Reserved(r.uint16),\n  axisCount: r.uint16,\n  globalCoordCount: r.uint16,\n  globalCoords: new r.Pointer(r.uint32, new r.Array(new r.Array(shortFrac, 'axisCount'), 'globalCoordCount')),\n  glyphCount: r.uint16,\n  flags: r.uint16,\n  offsetToData: r.uint32,\n  offsets: new r.Array(new r.Pointer(Offset, 'void', { relativeTo: ctx => ctx.offsetToData, allowNull: false }), t => t.glyphCount + 1)\n});\n\nexport default gvar;\n", "import * as r from 'restructure';\nimport { LookupTable, StateTable1 } from './aat';\n\nlet ClassTable = new r.Struct({\n  length: r.uint16,\n  coverage: r.uint16,\n  subFeatureFlags: r.uint32,\n  stateTable: new StateTable1\n});\n\nlet WidthDeltaRecord = new r.Struct({\n  justClass: r.uint32,\n  beforeGrowLimit: r.fixed32,\n  beforeShrinkLimit: r.fixed32,\n  afterGrowLimit: r.fixed32,\n  afterShrinkLimit: r.fixed32,\n  growFlags: r.uint16,\n  shrinkFlags: r.uint16\n});\n\nlet WidthDeltaCluster = new r.Array(WidthDeltaRecord, r.uint32);\n\nlet ActionData = new r.VersionedStruct('actionType', {\n  0: { // Decomposition action\n    lowerLimit: r.fixed32,\n    upperLimit: r.fixed32,\n    order: r.uint16,\n    glyphs: new r.Array(r.uint16, r.uint16)\n  },\n\n  1: { // Unconditional add glyph action\n    addGlyph: r.uint16\n  },\n\n  2: { // Conditional add glyph action\n    substThreshold: r.fixed32,\n    addGlyph: r.uint16,\n    substGlyph: r.uint16\n  },\n\n  3: {}, // Stretch glyph action (no data, not supported by CoreText)\n\n  4: { // Ductile glyph action (not supported by CoreText)\n    variationAxis: r.uint32,\n    minimumLimit: r.fixed32,\n    noStretchValue: r.fixed32,\n    maximumLimit: r.fixed32\n  },\n\n  5: { // Repeated add glyph action\n    flags: r.uint16,\n    glyph: r.uint16\n  }\n});\n\nlet Action = new r.Struct({\n  actionClass: r.uint16,\n  actionType: r.uint16,\n  actionLength: r.uint32,\n  actionData: ActionData,\n  padding: new r.Reserved(r.uint8, t => t.actionLength - t._currentOffset)\n});\n\nlet PostcompensationAction = new r.Array(Action, r.uint32);\nlet PostCompensationTable = new r.Struct({\n  lookupTable: new LookupTable(new r.Pointer(r.uint16, PostcompensationAction))\n});\n\nlet JustificationTable = new r.Struct({\n  classTable: new r.Pointer(r.uint16, ClassTable, { type: 'parent' }),\n  wdcOffset: r.uint16,\n  postCompensationTable: new r.Pointer(r.uint16, PostCompensationTable, { type: 'parent' }),\n  widthDeltaClusters: new LookupTable(new r.Pointer(r.uint16, WidthDeltaCluster, { type: 'parent', relativeTo: ctx => ctx.wdcOffset }))\n});\n\nexport default new r.Struct({\n  version: r.uint32,\n  format: r.uint16,\n  horizontal: new r.Pointer(r.uint16, JustificationTable),\n  vertical: new r.Pointer(r.uint16, JustificationTable)\n});\n", "import * as r from 'restructure';\nimport { UnboundedArray, LookupTable, StateTable } from './aat';\n\nlet LigatureData = {\n  action: r.uint16\n};\n\nlet ContextualData = {\n  markIndex: r.uint16,\n  currentIndex: r.uint16\n};\n\nlet InsertionData = {\n  currentInsertIndex: r.uint16,\n  markedInsertIndex: r.uint16\n};\n\nlet SubstitutionTable = new r.Struct({\n  items: new UnboundedArray(new r.Pointer(r.uint32, new LookupTable))\n});\n\nlet SubtableData = new r.VersionedStruct('type', {\n  0: { // Indic Rearrangement Subtable\n    stateTable: new StateTable\n  },\n\n  1: { // Contextual Glyph Substitution Subtable\n    stateTable: new StateTable(ContextualData),\n    substitutionTable: new r.Pointer(r.uint32, SubstitutionTable)\n  },\n\n  2: { // Ligature subtable\n    stateTable: new StateTable(LigatureData),\n    ligatureActions: new r.Pointer(r.uint32, new UnboundedArray(r.uint32)),\n    components: new r.Pointer(r.uint32, new UnboundedArray(r.uint16)),\n    ligatureList: new r.Pointer(r.uint32, new UnboundedArray(r.uint16))\n  },\n\n  4: { // Non-contextual Glyph Substitution Subtable\n    lookupTable: new LookupTable\n  },\n\n  5: { // Glyph Insertion Subtable\n    stateTable: new StateTable(InsertionData),\n    insertionActions: new r.Pointer(r.uint32, new UnboundedArray(r.uint16))\n  }\n});\n\nlet Subtable = new r.Struct({\n  length: r.uint32,\n  coverage: r.uint24,\n  type: r.uint8,\n  subFeatureFlags: r.uint32,\n  table: SubtableData,\n  padding: new r.Reserved(r.uint8, t => t.length - t._currentOffset)\n});\n\nlet FeatureEntry = new r.Struct({\n  featureType:    r.uint16,\n  featureSetting: r.uint16,\n  enableFlags:    r.uint32,\n  disableFlags:   r.uint32\n});\n\nlet MorxChain = new r.Struct({\n  defaultFlags:     r.uint32,\n  chainLength:      r.uint32,\n  nFeatureEntries:  r.uint32,\n  nSubtables:       r.uint32,\n  features:         new r.Array(FeatureEntry, 'nFeatureEntries'),\n  subtables:        new r.Array(Subtable, 'nSubtables')\n});\n\nexport default new r.Struct({\n  version:  r.uint16,\n  unused:   new r.Reserved(r.uint16),\n  nChains:  r.uint32,\n  chains:   new r.Array(MorxChain, 'nChains')\n});\n", "import * as r from 'restructure';\nimport { LookupTable } from './aat';\n\nlet OpticalBounds = new r.Struct({\n  left: r.int16,\n  top: r.int16,\n  right: r.int16,\n  bottom: r.int16\n});\n\nexport default new r.Struct({\n  version: r.fixed32,\n  format: r.uint16,\n  lookupTable: new LookupTable(OpticalBounds)\n});\n", "import { binarySearch } from './utils';\nimport { encodingExists, getEncoding, getEncodingMapping } from './encodings';\nimport { cache } from './decorators';\nimport { range } from './utils';\n\nexport default class CmapProcessor {\n  constructor(cmapTable) {\n    // Attempt to find a Unicode cmap first\n    this.encoding = null;\n    this.cmap = this.findSubtable(cmapTable, [\n      // 32-bit subtables\n      [3, 10],\n      [0, 6],\n      [0, 4],\n\n      // 16-bit subtables\n      [3, 1],\n      [0, 3],\n      [0, 2],\n      [0, 1],\n      [0, 0]\n    ]);\n\n    // If not unicode cmap was found, take the first table with a supported encoding.\n    if (!this.cmap) {\n      for (let cmap of cmapTable.tables) {\n        let encoding = getEncoding(cmap.platformID, cmap.encodingID, cmap.table.language - 1);\n        let mapping = getEncodingMapping(encoding);\n        if (mapping) {\n          this.cmap = cmap.table;\n          this.encoding = mapping;\n        }\n      }\n    }\n\n    if (!this.cmap) {\n      throw new Error(\"Could not find a supported cmap table\");\n    }\n\n    this.uvs = this.findSubtable(cmapTable, [[0, 5]]);\n    if (this.uvs && this.uvs.version !== 14) {\n      this.uvs = null;\n    }\n  }\n\n  findSubtable(cmapTable, pairs) {\n    for (let [platformID, encodingID] of pairs) {\n      for (let cmap of cmapTable.tables) {\n        if (cmap.platformID === platformID && cmap.encodingID === encodingID) {\n          return cmap.table;\n        }\n      }\n    }\n\n    return null;\n  }\n\n  lookup(codepoint, variationSelector) {\n    // If there is no Unicode cmap in this font, we need to re-encode\n    // the codepoint in the encoding that the cmap supports.\n    if (this.encoding) {\n      codepoint = this.encoding.get(codepoint) || codepoint;\n\n      // Otherwise, try to get a Unicode variation selector for this codepoint if one is provided.\n    } else if (variationSelector) {\n      let gid = this.getVariationSelector(codepoint, variationSelector);\n      if (gid) {\n        return gid;\n      }\n    }\n\n    let cmap = this.cmap;\n    switch (cmap.version) {\n      case 0:\n        return cmap.codeMap.get(codepoint) || 0;\n\n      case 4: {\n        let min = 0;\n        let max = cmap.segCount - 1;\n        while (min <= max) {\n          let mid = (min + max) >> 1;\n\n          if (codepoint < cmap.startCode.get(mid)) {\n            max = mid - 1;\n          } else if (codepoint > cmap.endCode.get(mid)) {\n            min = mid + 1;\n          } else {\n            let rangeOffset = cmap.idRangeOffset.get(mid);\n            let gid;\n\n            if (rangeOffset === 0) {\n              gid = codepoint + cmap.idDelta.get(mid);\n            } else {\n              let index = rangeOffset / 2 + (codepoint - cmap.startCode.get(mid)) - (cmap.segCount - mid);\n              gid = cmap.glyphIndexArray.get(index) || 0;\n              if (gid !== 0) {\n                gid += cmap.idDelta.get(mid);\n              }\n            }\n\n            return gid & 0xffff;\n          }\n        }\n\n        return 0;\n      }\n\n      case 8:\n        throw new Error('TODO: cmap format 8');\n\n      case 6:\n      case 10:\n        return cmap.glyphIndices.get(codepoint - cmap.firstCode) || 0;\n\n      case 12:\n      case 13: {\n        let min = 0;\n        let max = cmap.nGroups - 1;\n        while (min <= max) {\n          let mid = (min + max) >> 1;\n          let group = cmap.groups.get(mid);\n\n          if (codepoint < group.startCharCode) {\n            max = mid - 1;\n          } else if (codepoint > group.endCharCode) {\n            min = mid + 1;\n          } else {\n            if (cmap.version === 12) {\n              return group.glyphID + (codepoint - group.startCharCode);\n            } else {\n              return group.glyphID;\n            }\n          }\n        }\n\n        return 0;\n      }\n\n      case 14:\n        throw new Error('TODO: cmap format 14');\n\n      default:\n        throw new Error(`Unknown cmap format ${cmap.version}`);\n    }\n  }\n\n  getVariationSelector(codepoint, variationSelector) {\n    if (!this.uvs) {\n      return 0;\n    }\n\n    let selectors = this.uvs.varSelectors.toArray();\n    let i = binarySearch(selectors, x => variationSelector - x.varSelector);\n    let sel = selectors[i];\n\n    if (i !== -1 && sel.defaultUVS) {\n      i = binarySearch(sel.defaultUVS, x =>\n        codepoint < x.startUnicodeValue ? -1 : codepoint > x.startUnicodeValue + x.additionalCount ? +1 : 0\n      );\n    }\n\n    if (i !== -1 && sel.nonDefaultUVS) {\n      i = binarySearch(sel.nonDefaultUVS, x => codepoint - x.unicodeValue);\n      if (i !== -1) {\n        return sel.nonDefaultUVS[i].glyphID;\n      }\n    }\n\n    return 0;\n  }\n\n  @cache\n  getCharacterSet() {\n    let cmap = this.cmap;\n    switch (cmap.version) {\n      case 0:\n        return range(0, cmap.codeMap.length);\n\n      case 4: {\n        let res = [];\n        let endCodes = cmap.endCode.toArray();\n        for (let i = 0; i < endCodes.length; i++) {\n          let tail = endCodes[i] + 1;\n          let start = cmap.startCode.get(i);\n          res.push(...range(start, tail));\n        }\n\n        return res;\n      }\n\n      case 8:\n        throw new Error('TODO: cmap format 8');\n\n      case 6:\n      case 10:\n        return range(cmap.firstCode, cmap.firstCode + cmap.glyphIndices.length);\n\n      case 12:\n      case 13: {\n        let res = [];\n        for (let group of cmap.groups.toArray()) {\n          res.push(...range(group.startCharCode, group.endCharCode + 1));\n        }\n\n        return res;\n      }\n\n      case 14:\n        throw new Error('TODO: cmap format 14');\n\n      default:\n        throw new Error(`Unknown cmap format ${cmap.version}`);\n    }\n  }\n\n  @cache\n  codePointsForGlyph(gid) {\n    let cmap = this.cmap;\n    switch (cmap.version) {\n      case 0: {\n        let res = [];\n        for (let i = 0; i < 256; i++) {\n          if (cmap.codeMap.get(i) === gid) {\n            res.push(i);\n          }\n        }\n\n        return res;\n      }\n\n      case 4: {\n        let res = [];\n        for (let i = 0; i < cmap.segCount; i++) {\n          let end = cmap.endCode.get(i);\n          let start = cmap.startCode.get(i);\n          let rangeOffset = cmap.idRangeOffset.get(i);\n          let delta = cmap.idDelta.get(i);\n\n          for (var c = start; c <= end; c++) {\n            let g = 0;\n            if (rangeOffset === 0) {\n              g = c + delta;\n            } else {\n              let index = rangeOffset / 2 + (c - start) - (cmap.segCount - i);\n              g = cmap.glyphIndexArray.get(index) || 0;\n              if (g !== 0) {\n                g += delta;\n              }\n            }\n\n            if (g === gid) {\n              res.push(c);\n            }\n          }\n        }\n\n        return res;\n      }\n\n      case 12: {\n        let res = [];\n        for (let group of cmap.groups.toArray()) {\n          if (gid >= group.glyphID && gid <= group.glyphID + (group.endCharCode - group.startCharCode)) {\n            res.push(group.startCharCode + (gid - group.glyphID));\n          }\n        }\n\n        return res;\n      }\n\n      case 13: {\n        let res = [];\n        for (let group of cmap.groups.toArray()) {\n          if (gid === group.glyphID) {\n            res.push(...range(group.startCharCode, group.endCharCode + 1));\n          }\n        }\n\n        return res;\n      }\n\n      default:\n        throw new Error(`Unknown cmap format ${cmap.version}`);\n    }\n  }\n}\n", "export function binarySearch(arr, cmp) {\n  let min = 0;\n  let max = arr.length - 1;\n  while (min <= max) {\n    let mid = (min + max) >> 1;\n    let res = cmp(arr[mid]);\n\n    if (res < 0) {\n      max = mid - 1;\n    } else if (res > 0) {\n      min = mid + 1;\n    } else {\n      return mid;\n    }\n  }\n\n  return -1;\n}\n\nexport function range(index, end) {\n  let range = [];\n  while (index < end) {\n    range.push(index++);\n  }\n  return range;\n}\n\nexport const asciiDecoder = new TextDecoder('ascii');\n\n// Based on https://github.com/niklasvh/base64-arraybuffer. MIT license.\nconst CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nconst LOOKUP = new Uint8Array(256);\nfor (let i = 0; i < CHARS.length; i++) {\n  LOOKUP[CHARS.charCodeAt(i)] = i;\n}\n\nexport function decodeBase64(base64) {\n  let bufferLength = base64.length * 0.75;\n\n  if (base64[base64.length - 1] === '=') {\n    bufferLength--;\n    if (base64[base64.length - 2] === '=') {\n      bufferLength--;\n    }\n  }\n\n  let bytes = new Uint8Array(bufferLength);\n  let p = 0;\n\n  for (let i = 0, len = base64.length; i < len; i += 4) {\n    let encoded1 = LOOKUP[base64.charCodeAt(i)];\n    let encoded2 = LOOKUP[base64.charCodeAt(i + 1)];\n    let encoded3 = LOOKUP[base64.charCodeAt(i + 2)];\n    let encoded4 = LOOKUP[base64.charCodeAt(i + 3)];\n\n    bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n    bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n    bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n  }\n\n  return bytes;\n}\n", "import KernProcessor from './KernProcessor';\nimport UnicodeLayoutEngine from './UnicodeLayoutEngine';\nimport GlyphRun from './GlyphRun';\nimport GlyphPosition from './GlyphPosition';\nimport * as Script from './Script';\nimport AATLayoutEngine from '../aat/AATLayoutEngine';\nimport OTLayoutEngine from '../opentype/OTLayoutEngine';\n\nexport default class LayoutEngine {\n  constructor(font) {\n    this.font = font;\n    this.unicodeLayoutEngine = null;\n    this.kernProcessor = null;\n\n    // Choose an advanced layout engine. We try the AAT morx table first since more\n    // scripts are currently supported because the shaping logic is built into the font.\n    if (this.font.morx) {\n      this.engine = new AATLayoutEngine(this.font);\n\n    } else if (this.font.GSUB || this.font.GPOS) {\n      this.engine = new OTLayoutEngine(this.font);\n    }\n  }\n\n  layout(string, features, script, language, direction) {\n    // Make the features parameter optional\n    if (typeof features === 'string') {\n      direction = language;\n      language = script;\n      script = features;\n      features = [];\n    }\n\n    // Map string to glyphs if needed\n    if (typeof string === 'string') {\n      // Attempt to detect the script from the string if not provided.\n      if (script == null) {\n        script = Script.forString(string);\n      }\n\n      var glyphs = this.font.glyphsForString(string);\n    } else {\n      // Attempt to detect the script from the glyph code points if not provided.\n      if (script == null) {\n        let codePoints = [];\n        for (let glyph of string) {\n          codePoints.push(...glyph.codePoints);\n        }\n\n        script = Script.forCodePoints(codePoints);\n      }\n\n      var glyphs = string;\n    }\n\n    let glyphRun = new GlyphRun(glyphs, features, script, language, direction);\n\n    // Return early if there are no glyphs\n    if (glyphs.length === 0) {\n      glyphRun.positions = [];\n      return glyphRun;\n    }\n\n    // Setup the advanced layout engine\n    if (this.engine && this.engine.setup) {\n      this.engine.setup(glyphRun);\n    }\n\n    // Substitute and position the glyphs\n    this.substitute(glyphRun);\n    this.position(glyphRun);\n\n    this.hideDefaultIgnorables(glyphRun.glyphs, glyphRun.positions);\n\n    // Let the layout engine clean up any state it might have\n    if (this.engine && this.engine.cleanup) {\n      this.engine.cleanup();\n    }\n\n    return glyphRun;\n  }\n\n  substitute(glyphRun) {\n    // Call the advanced layout engine to make substitutions\n    if (this.engine && this.engine.substitute) {\n      this.engine.substitute(glyphRun);\n    }\n  }\n\n  position(glyphRun) {\n    // Get initial glyph positions\n    glyphRun.positions = glyphRun.glyphs.map(glyph => new GlyphPosition(glyph.advanceWidth));\n    let positioned = null;\n\n    // Call the advanced layout engine. Returns the features applied.\n    if (this.engine && this.engine.position) {\n      positioned = this.engine.position(glyphRun);\n    }\n\n    // if there is no GPOS table, use unicode properties to position marks.\n    if (!positioned && (!this.engine || this.engine.fallbackPosition)) {\n      if (!this.unicodeLayoutEngine) {\n        this.unicodeLayoutEngine = new UnicodeLayoutEngine(this.font);\n      }\n\n      this.unicodeLayoutEngine.positionGlyphs(glyphRun.glyphs, glyphRun.positions);\n    }\n\n    // if kerning is not supported by GPOS, do kerning with the TrueType/AAT kern table\n    if ((!positioned || !positioned.kern) && glyphRun.features.kern !== false && this.font.kern) {\n      if (!this.kernProcessor) {\n        this.kernProcessor = new KernProcessor(this.font);\n      }\n\n      this.kernProcessor.process(glyphRun.glyphs, glyphRun.positions);\n      glyphRun.features.kern = true;\n    }\n  }\n\n  hideDefaultIgnorables(glyphs, positions) {\n    let space = this.font.glyphForCodePoint(0x20);\n    for (let i = 0; i < glyphs.length; i++) {\n      if (this.isDefaultIgnorable(glyphs[i].codePoints[0])) {\n        glyphs[i] = space;\n        positions[i].xAdvance = 0;\n        positions[i].yAdvance = 0;\n      }\n    }\n  }\n\n  isDefaultIgnorable(ch) {\n    // From DerivedCoreProperties.txt in the Unicode database,\n    // minus U+115F, U+1160, U+3164 and U+FFA0, which is what\n    // Harfbuzz and Uniscribe do.\n    let plane = ch >> 16;\n    if (plane === 0) {\n      // BMP\n      switch (ch >> 8) {\n      \tcase 0x00: return ch === 0x00AD;\n      \tcase 0x03: return ch === 0x034F;\n      \tcase 0x06: return ch === 0x061C;\n      \tcase 0x17: return 0x17B4 <= ch && ch <= 0x17B5;\n      \tcase 0x18: return 0x180B <= ch && ch <= 0x180E;\n      \tcase 0x20: return (0x200B <= ch && ch <= 0x200F) || (0x202A <= ch && ch <= 0x202E) || (0x2060 <= ch && ch <= 0x206F);\n      \tcase 0xFE: return (0xFE00 <= ch && ch <= 0xFE0F) || ch === 0xFEFF;\n      \tcase 0xFF: return 0xFFF0 <= ch && ch <= 0xFFF8;\n      \tdefault:   return false;\n      }\n    } else {\n      // Other planes\n      switch (plane) {\n      \tcase 0x01: return (0x1BCA0 <= ch && ch <= 0x1BCA3) || (0x1D173 <= ch && ch <= 0x1D17A);\n      \tcase 0x0E: return 0xE0000 <= ch && ch <= 0xE0FFF;\n      \tdefault:   return false;\n      }\n    }\n  }\n\n  getAvailableFeatures(script, language) {\n    let features = [];\n\n    if (this.engine) {\n      features.push(...this.engine.getAvailableFeatures(script, language));\n    }\n\n    if (this.font.kern && features.indexOf('kern') === -1) {\n      features.push('kern');\n    }\n\n    return features;\n  }\n\n  stringsForGlyph(gid) {\n    let result = new Set;\n\n    let codePoints = this.font._cmapProcessor.codePointsForGlyph(gid);\n    for (let codePoint of codePoints) {\n      result.add(String.fromCodePoint(codePoint));\n    }\n\n    if (this.engine && this.engine.stringsForGlyph) {\n      for (let string of this.engine.stringsForGlyph(gid)) {\n        result.add(string);\n      }\n    }\n\n    return Array.from(result);\n  }\n}\n", "import {binarySearch} from '../utils';\n\nexport default class KernProcessor {\n  constructor(font) {\n    this.kern = font.kern;\n  }\n\n  process(glyphs, positions) {\n    for (let glyphIndex = 0; glyphIndex < glyphs.length - 1; glyphIndex++) {\n      let left = glyphs[glyphIndex].id;\n      let right = glyphs[glyphIndex + 1].id;\n      positions[glyphIndex].xAdvance += this.getKerning(left, right);\n    }\n  }\n\n  getKerning(left, right) {\n    let res = 0;\n\n    for (let table of this.kern.tables) {\n      if (table.coverage.crossStream) {\n        continue;\n      }\n\n      switch (table.version) {\n        case 0:\n          if (!table.coverage.horizontal) {\n            continue;\n          }\n\n          break;\n        case 1:\n          if (table.coverage.vertical || table.coverage.variation) {\n            continue;\n          }\n\n          break;\n        default:\n          throw new Error(`Unsupported kerning table version ${table.version}`);\n      }\n\n      let val = 0;\n      let s = table.subtable;\n      switch (table.format) {\n        case 0:\n          let pairIdx = binarySearch(s.pairs, function (pair) {\n            return (left - pair.left) || (right - pair.right);\n          });\n\n          if (pairIdx >= 0) {\n            val = s.pairs[pairIdx].value;\n          }\n\n          break;\n\n        case 2:\n          let leftOffset = 0, rightOffset = 0;\n          if (left >= s.leftTable.firstGlyph && left < s.leftTable.firstGlyph + s.leftTable.nGlyphs) {\n            leftOffset = s.leftTable.offsets[left - s.leftTable.firstGlyph];\n          } else {\n            leftOffset = s.array.off;\n          }\n\n          if (right >= s.rightTable.firstGlyph && right < s.rightTable.firstGlyph + s.rightTable.nGlyphs) {\n            rightOffset = s.rightTable.offsets[right - s.rightTable.firstGlyph];\n          }\n\n          let index = (leftOffset + rightOffset - s.array.off) / 2;\n          val = s.array.values.get(index);\n          break;\n\n        case 3:\n          if (left >= s.glyphCount || right >= s.glyphCount) {\n            return 0;\n          }\n\n          val = s.kernValue[s.kernIndex[s.leftClass[left] * s.rightClassCount + s.rightClass[right]]];\n          break;\n\n        default:\n          throw new Error(`Unsupported kerning sub-table format ${table.format}`);\n      }\n\n      // Microsoft supports the override flag, which resets the result\n      // Otherwise, the sum of the results from all subtables is returned\n      if (table.coverage.override) {\n        res = val;\n      } else {\n        res += val;\n      }\n    }\n\n    return res;\n  }\n}\n", "import {getCombiningClass} from 'unicode-properties';\n\n/**\n * This class is used when GPOS does not define 'mark' or 'mkmk' features\n * for positioning marks relative to base glyphs. It uses the unicode\n * combining class property to position marks.\n *\n * Based on code from Harfbuzz, thanks!\n * https://github.com/behdad/harfbuzz/blob/master/src/hb-ot-shape-fallback.cc\n */\nexport default class UnicodeLayoutEngine {\n  constructor(font) {\n    this.font = font;\n  }\n\n  positionGlyphs(glyphs, positions) {\n    // find each base + mark cluster, and position the marks relative to the base\n    let clusterStart = 0;\n    let clusterEnd = 0;\n    for (let index = 0; index < glyphs.length; index++) {\n      let glyph = glyphs[index];\n      if (glyph.isMark) { // TODO: handle ligatures\n        clusterEnd = index;\n      } else {\n        if (clusterStart !== clusterEnd) {\n          this.positionCluster(glyphs, positions, clusterStart, clusterEnd);\n        }\n\n        clusterStart = clusterEnd = index;\n      }\n    }\n\n    if (clusterStart !== clusterEnd) {\n      this.positionCluster(glyphs, positions, clusterStart, clusterEnd);\n    }\n\n    return positions;\n  }\n\n  positionCluster(glyphs, positions, clusterStart, clusterEnd) {\n    let base = glyphs[clusterStart];\n    let baseBox = base.cbox.copy();\n\n    // adjust bounding box for ligature glyphs\n    if (base.codePoints.length > 1) {\n      // LTR. TODO: RTL support.\n      baseBox.minX += ((base.codePoints.length - 1) * baseBox.width) / base.codePoints.length;\n    }\n\n    let xOffset = -positions[clusterStart].xAdvance;\n    let yOffset = 0;\n    let yGap = this.font.unitsPerEm / 16;\n\n    // position each of the mark glyphs relative to the base glyph\n    for (let index = clusterStart + 1; index <= clusterEnd; index++) {\n      let mark = glyphs[index];\n      let markBox = mark.cbox;\n      let position = positions[index];\n\n      let combiningClass = this.getCombiningClass(mark.codePoints[0]);\n\n      if (combiningClass !== 'Not_Reordered') {\n        position.xOffset = position.yOffset = 0;\n\n        // x positioning\n        switch (combiningClass) {\n          case 'Double_Above':\n          case 'Double_Below':\n            // LTR. TODO: RTL support.\n            position.xOffset += baseBox.minX - markBox.width / 2 - markBox.minX;\n            break;\n\n          case 'Attached_Below_Left':\n          case 'Below_Left':\n          case 'Above_Left':\n            // left align\n            position.xOffset += baseBox.minX - markBox.minX;\n            break;\n\n          case 'Attached_Above_Right':\n          case 'Below_Right':\n          case 'Above_Right':\n            // right align\n            position.xOffset += baseBox.maxX - markBox.width - markBox.minX;\n            break;\n\n          default: // Attached_Below, Attached_Above, Below, Above, other\n            // center align\n            position.xOffset += baseBox.minX + (baseBox.width - markBox.width) / 2 - markBox.minX;\n        }\n\n        // y positioning\n        switch (combiningClass) {\n          case 'Double_Below':\n          case 'Below_Left':\n          case 'Below':\n          case 'Below_Right':\n          case 'Attached_Below_Left':\n          case 'Attached_Below':\n            // add a small gap between the glyphs if they are not attached\n            if (combiningClass === 'Attached_Below_Left' || combiningClass === 'Attached_Below') {\n              baseBox.minY += yGap;\n            }\n\n            position.yOffset = -baseBox.minY - markBox.maxY;\n            baseBox.minY += markBox.height;\n            break;\n\n          case 'Double_Above':\n          case 'Above_Left':\n          case 'Above':\n          case 'Above_Right':\n          case 'Attached_Above':\n          case 'Attached_Above_Right':\n            // add a small gap between the glyphs if they are not attached\n            if (combiningClass === 'Attached_Above' || combiningClass === 'Attached_Above_Right') {\n              baseBox.maxY += yGap;\n            }\n\n            position.yOffset = baseBox.maxY - markBox.minY;\n            baseBox.maxY += markBox.height;\n            break;\n        }\n\n        position.xAdvance = position.yAdvance = 0;\n        position.xOffset += xOffset;\n        position.yOffset += yOffset;\n\n      } else {\n        xOffset -= position.xAdvance;\n        yOffset -= position.yAdvance;\n      }\n    }\n\n    return;\n  }\n\n  getCombiningClass(codePoint) {\n    let combiningClass = getCombiningClass(codePoint);\n\n    // Thai / Lao need some per-character work\n    if ((codePoint & ~0xff) === 0x0e00) {\n      if (combiningClass === 'Not_Reordered') {\n        switch (codePoint) {\n          case 0x0e31:\n          case 0x0e34:\n          case 0x0e35:\n          case 0x0e36:\n          case 0x0e37:\n          case 0x0e47:\n          case 0x0e4c:\n          case 0x0e3d:\n          case 0x0e4e:\n            return 'Above_Right';\n\n          case 0x0eb1:\n          case 0x0eb4:\n          case 0x0eb5:\n          case 0x0eb6:\n          case 0x0eb7:\n          case 0x0ebb:\n          case 0x0ecc:\n          case 0x0ecd:\n            return 'Above';\n\n          case 0x0ebc:\n            return 'Below';\n        }\n      } else if (codePoint === 0x0e3a) { // virama\n        return 'Below_Right';\n      }\n    }\n\n    switch (combiningClass) {\n      // Hebrew\n\n      case 'CCC10': // sheva\n      case 'CCC11': // hataf segol\n      case 'CCC12': // hataf patah\n      case 'CCC13': // hataf qamats\n      case 'CCC14': // hiriq\n      case 'CCC15': // tsere\n      case 'CCC16': // segol\n      case 'CCC17': // patah\n      case 'CCC18': // qamats\n      case 'CCC20': // qubuts\n      case 'CCC22': // meteg\n        return 'Below';\n\n      case 'CCC23': // rafe\n        return 'Attached_Above';\n\n      case 'CCC24': // shin dot\n        return 'Above_Right';\n\n      case 'CCC25': // sin dot\n      case 'CCC19': // holam\n        return 'Above_Left';\n\n      case 'CCC26': // point varika\n        return 'Above';\n\n      case 'CCC21': // dagesh\n        break;\n\n      // Arabic and Syriac\n\n      case 'CCC27': // fathatan\n      case 'CCC28': // dammatan\n      case 'CCC30': // fatha\n      case 'CCC31': // damma\n      case 'CCC33': // shadda\n      case 'CCC34': // sukun\n      case 'CCC35': // superscript alef\n      case 'CCC36': // superscript alaph\n        return 'Above';\n\n      case 'CCC29': // kasratan\n      case 'CCC32': // kasra\n        return 'Below';\n\n      // Thai\n\n      case 'CCC103': // sara u / sara uu\n        return 'Below_Right';\n\n      case 'CCC107': // mai\n        return 'Above_Right';\n\n      // Lao\n\n      case 'CCC118': // sign u / sign uu\n        return 'Below';\n\n      case 'CCC122': // mai\n        return 'Above';\n\n      // Tibetan\n\n      case 'CCC129': // sign aa\n      case 'CCC132': // sign u\n        return 'Below';\n\n      case 'CCC130': // sign i\n        return 'Above';\n    }\n\n    return combiningClass;\n  }\n}\n", "import BBox from '../glyph/BBox';\nimport * as Script from '../layout/Script';\n\n/**\n * Represents a run of Glyph and GlyphPosition objects.\n * Returned by the font layout method.\n */\nexport default class GlyphRun {\n  constructor(glyphs, features, script, language, direction) {\n    /**\n     * An array of Glyph objects in the run\n     * @type {Glyph[]}\n     */\n    this.glyphs = glyphs;\n\n    /**\n     * An array of GlyphPosition objects for each glyph in the run\n     * @type {GlyphPosition[]}\n     */\n    this.positions = null;\n\n    /**\n     * The script that was requested for shaping. This was either passed in or detected automatically.\n     * @type {string}\n     */\n    this.script = script;\n\n    /**\n     * The language requested for shaping, as passed in. If `null`, the default language for the\n     * script was used.\n     * @type {string}\n     */\n    this.language = language || null;\n\n    /**\n     * The direction requested for shaping, as passed in (either ltr or rtl).\n     * If `null`, the default direction of the script is used.\n     * @type {string}\n     */\n    this.direction = direction || Script.direction(script);\n\n    /**\n     * The features requested during shaping. This is a combination of user\n     * specified features and features chosen by the shaper.\n     * @type {object}\n     */\n    this.features = {};\n\n    // Convert features to an object\n    if (Array.isArray(features)) {\n      for (let tag of features) {\n        this.features[tag] = true;\n      }\n    } else if (typeof features === 'object') {\n      this.features = features;\n    }\n  }\n\n  /**\n   * The total advance width of the run.\n   * @type {number}\n   */\n  get advanceWidth() {\n    let width = 0;\n    for (let position of this.positions) {\n      width += position.xAdvance;\n    }\n\n    return width;\n  }\n\n /**\n  * The total advance height of the run.\n  * @type {number}\n  */\n  get advanceHeight() {\n    let height = 0;\n    for (let position of this.positions) {\n      height += position.yAdvance;\n    }\n\n    return height;\n  }\n\n /**\n  * The bounding box containing all glyphs in the run.\n  * @type {BBox}\n  */\n  get bbox() {\n    let bbox = new BBox;\n\n    let x = 0;\n    let y = 0;\n    for (let index = 0; index < this.glyphs.length; index++) {\n      let glyph = this.glyphs[index];\n      let p = this.positions[index];\n      let b = glyph.bbox;\n\n      bbox.addPoint(b.minX + x + p.xOffset, b.minY + y + p.yOffset);\n      bbox.addPoint(b.maxX + x + p.xOffset, b.maxY + y + p.yOffset);\n\n      x += p.xAdvance;\n      y += p.yAdvance;\n    }\n\n    return bbox;\n  }\n}\n", "/**\n * Represents a glyph bounding box\n */\nexport default class BBox {\n  constructor(minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity) {\n    /**\n     * The minimum X position in the bounding box\n     * @type {number}\n     */\n    this.minX = minX;\n\n    /**\n     * The minimum Y position in the bounding box\n     * @type {number}\n     */\n    this.minY = minY;\n\n    /**\n     * The maxmimum X position in the bounding box\n     * @type {number}\n     */\n    this.maxX = maxX;\n\n    /**\n     * The maxmimum Y position in the bounding box\n     * @type {number}\n     */\n    this.maxY = maxY;\n  }\n\n  /**\n   * The width of the bounding box\n   * @type {number}\n   */\n  get width() {\n    return this.maxX - this.minX;\n  }\n\n  /**\n   * The height of the bounding box\n   * @type {number}\n   */\n  get height() {\n    return this.maxY - this.minY;\n  }\n\n  addPoint(x, y) {\n    if (Math.abs(x) !== Infinity) {\n      if (x < this.minX) {\n        this.minX = x;\n      }\n\n      if (x > this.maxX) {\n        this.maxX = x;\n      }\n    }\n\n    if (Math.abs(y) !== Infinity) {\n      if (y < this.minY) {\n        this.minY = y;\n      }\n\n      if (y > this.maxY) {\n        this.maxY = y;\n      }\n    }\n  }\n\n  copy() {\n    return new BBox(this.minX, this.minY, this.maxX, this.maxY);\n  }\n}\n", "import {getScript} from 'unicode-properties';\n\n// This maps the Unicode Script property to an OpenType script tag\n// Data from http://www.microsoft.com/typography/otspec/scripttags.htm\n// and http://www.unicode.org/Public/UNIDATA/PropertyValueAliases.txt.\nconst UNICODE_SCRIPTS = {\n  Caucasian_Albanian: 'aghb',\n  Arabic: 'arab',\n  Imperial_Aramaic: 'armi',\n  Armenian: 'armn',\n  Avestan: 'avst',\n  Balinese: 'bali',\n  Bamum: 'bamu',\n  Bassa_Vah: 'bass',\n  Batak: 'batk',\n  Bengali: ['bng2', 'beng'],\n  Bopomofo: 'bopo',\n  Brahmi: 'brah',\n  Braille: 'brai',\n  Buginese: 'bugi',\n  Buhid: 'buhd',\n  Chakma: 'cakm',\n  Canadian_Aboriginal: 'cans',\n  Carian: 'cari',\n  Cham: 'cham',\n  Cherokee: 'cher',\n  Coptic: 'copt',\n  Cypriot: 'cprt',\n  Cyrillic: 'cyrl',\n  Devanagari: ['dev2', 'deva'],\n  Deseret: 'dsrt',\n  Duployan: 'dupl',\n  Egyptian_Hieroglyphs: 'egyp',\n  Elbasan: 'elba',\n  Ethiopic: 'ethi',\n  Georgian: 'geor',\n  Glagolitic: 'glag',\n  Gothic: 'goth',\n  Grantha: 'gran',\n  Greek: 'grek',\n  Gujarati: ['gjr2', 'gujr'],\n  Gurmukhi: ['gur2', 'guru'],\n  Hangul: 'hang',\n  Han: 'hani',\n  Hanunoo: 'hano',\n  Hebrew: 'hebr',\n  Hiragana: 'hira',\n  Pahawh_Hmong: 'hmng',\n  Katakana_Or_Hiragana: 'hrkt',\n  Old_Italic: 'ital',\n  Javanese: 'java',\n  Kayah_Li: 'kali',\n  Katakana: 'kana',\n  Kharoshthi: 'khar',\n  Khmer: 'khmr',\n  Khojki: 'khoj',\n  Kannada: ['knd2', 'knda'],\n  Kaithi: 'kthi',\n  Tai_Tham: 'lana',\n  Lao: 'lao ',\n  Latin: 'latn',\n  Lepcha: 'lepc',\n  Limbu: 'limb',\n  Linear_A: 'lina',\n  Linear_B: 'linb',\n  Lisu: 'lisu',\n  Lycian: 'lyci',\n  Lydian: 'lydi',\n  Mahajani: 'mahj',\n  Mandaic: 'mand',\n  Manichaean: 'mani',\n  Mende_Kikakui: 'mend',\n  Meroitic_Cursive: 'merc',\n  Meroitic_Hieroglyphs: 'mero',\n  Malayalam: ['mlm2', 'mlym'],\n  Modi: 'modi',\n  Mongolian: 'mong',\n  Mro: 'mroo',\n  Meetei_Mayek: 'mtei',\n  Myanmar: ['mym2', 'mymr'],\n  Old_North_Arabian: 'narb',\n  Nabataean: 'nbat',\n  Nko: 'nko ',\n  Ogham: 'ogam',\n  Ol_Chiki: 'olck',\n  Old_Turkic: 'orkh',\n  Oriya: ['ory2', 'orya'],\n  Osmanya: 'osma',\n  Palmyrene: 'palm',\n  Pau_Cin_Hau: 'pauc',\n  Old_Permic: 'perm',\n  Phags_Pa: 'phag',\n  Inscriptional_Pahlavi: 'phli',\n  Psalter_Pahlavi: 'phlp',\n  Phoenician: 'phnx',\n  Miao: 'plrd',\n  Inscriptional_Parthian: 'prti',\n  Rejang: 'rjng',\n  Runic: 'runr',\n  Samaritan: 'samr',\n  Old_South_Arabian: 'sarb',\n  Saurashtra: 'saur',\n  Shavian: 'shaw',\n  Sharada: 'shrd',\n  Siddham: 'sidd',\n  Khudawadi: 'sind',\n  Sinhala: 'sinh',\n  Sora_Sompeng: 'sora',\n  Sundanese: 'sund',\n  Syloti_Nagri: 'sylo',\n  Syriac: 'syrc',\n  Tagbanwa: 'tagb',\n  Takri: 'takr',\n  Tai_Le: 'tale',\n  New_Tai_Lue: 'talu',\n  Tamil: ['tml2', 'taml'],\n  Tai_Viet: 'tavt',\n  Telugu: ['tel2', 'telu'],\n  Tifinagh: 'tfng',\n  Tagalog: 'tglg',\n  Thaana: 'thaa',\n  Thai: 'thai',\n  Tibetan: 'tibt',\n  Tirhuta: 'tirh',\n  Ugaritic: 'ugar',\n  Vai: 'vai ',\n  Warang_Citi: 'wara',\n  Old_Persian: 'xpeo',\n  Cuneiform: 'xsux',\n  Yi: 'yi  ',\n  Inherited: 'zinh',\n  Common: 'zyyy',\n  Unknown: 'zzzz'\n};\n\nconst OPENTYPE_SCRIPTS = {};\nfor (let script in UNICODE_SCRIPTS) {\n  let tag = UNICODE_SCRIPTS[script];\n  if (Array.isArray(tag)) {\n    for (let t of tag) {\n      OPENTYPE_SCRIPTS[t] = script;\n    }\n  } else {\n    OPENTYPE_SCRIPTS[tag] = script;\n  }\n}\n\nexport function fromUnicode(script) {\n  return UNICODE_SCRIPTS[script];\n}\n\nexport function fromOpenType(tag) {\n  return OPENTYPE_SCRIPTS[tag];\n}\n\nexport function forString(string) {\n  let len = string.length;\n  let idx = 0;\n  while (idx < len) {\n    let code = string.charCodeAt(idx++);\n\n    // Check if this is a high surrogate\n    if (0xd800 <= code && code <= 0xdbff && idx < len) {\n      let next = string.charCodeAt(idx);\n\n      // Check if this is a low surrogate\n      if (0xdc00 <= next && next <= 0xdfff) {\n        idx++;\n        code = ((code & 0x3FF) << 10) + (next & 0x3FF) + 0x10000;\n      }\n    }\n\n    let script = getScript(code);\n    if (script !== 'Common' && script !== 'Inherited' && script !== 'Unknown') {\n      return UNICODE_SCRIPTS[script];\n    }\n  }\n\n  return UNICODE_SCRIPTS.Unknown;\n}\n\nexport function forCodePoints(codePoints) {\n  for (let i = 0; i < codePoints.length; i++) {\n    let codePoint = codePoints[i];\n    let script = getScript(codePoint);\n    if (script !== 'Common' && script !== 'Inherited' && script !== 'Unknown') {\n      return UNICODE_SCRIPTS[script];\n    }\n  }\n\n  return UNICODE_SCRIPTS.Unknown;\n}\n\n// The scripts in this map are written from right to left\nconst RTL = {\n  arab: true,   // Arabic\n  hebr: true,   // Hebrew\n  syrc: true,   // Syriac\n  thaa: true,   // Thaana\n  cprt: true,   // Cypriot Syllabary\n  khar: true,   // Kharosthi\n  phnx: true,   // Phoenician\n  'nko ': true, // N'Ko\n  lydi: true,   // Lydian\n  avst: true,   // Avestan\n  armi: true,   // Imperial Aramaic\n  phli: true,   // Inscriptional Pahlavi\n  prti: true,   // Inscriptional Parthian\n  sarb: true,   // Old South Arabian\n  orkh: true,   // Old Turkic, Orkhon Runic\n  samr: true,   // Samaritan\n  mand: true,   // Mandaic, Mandaean\n  merc: true,   // Meroitic Cursive\n  mero: true,   // Meroitic Hieroglyphs\n\n  // Unicode 7.0 (not listed on http://www.microsoft.com/typography/otspec/scripttags.htm)\n  mani: true,   // Manichaean\n  mend: true,   // Mende Kikakui\n  nbat: true,   // Nabataean\n  narb: true,   // Old North Arabian\n  palm: true,   // Palmyrene\n  phlp: true    // Psalter Pahlavi\n};\n\nexport function direction(script) {\n  if (RTL[script]) {\n    return 'rtl';\n  }\n\n  return 'ltr';\n}\n", "/**\n * Represents positioning information for a glyph in a GlyphRun.\n */\nexport default class GlyphPosition {\n  constructor(xAdvance = 0, yAdvance = 0, xOffset = 0, yOffset = 0) {\n    /**\n     * The amount to move the virtual pen in the X direction after rendering this glyph.\n     * @type {number}\n     */\n    this.xAdvance = xAdvance;\n\n    /**\n     * The amount to move the virtual pen in the Y direction after rendering this glyph.\n     * @type {number}\n     */\n    this.yAdvance = yAdvance;\n\n    /**\n     * The offset from the pen position in the X direction at which to render this glyph.\n     * @type {number}\n     */\n    this.xOffset = xOffset;\n\n    /**\n     * The offset from the pen position in the Y direction at which to render this glyph.\n     * @type {number}\n     */\n    this.yOffset = yOffset;\n  }\n}\n", "import * as AATFeatureMap from './AATFeatureMap';\nimport * as Script from '../layout/Script';\nimport AATMorxProcessor from './AATMorxProcessor';\n\nexport default class AATLayoutEngine {\n  constructor(font) {\n    this.font = font;\n    this.morxProcessor = new AATMorxProcessor(font);\n    this.fallbackPosition = false;\n  }\n\n  substitute(glyphRun) {\n    // AAT expects the glyphs to be in visual order prior to morx processing,\n    // so reverse the glyphs if the script is right-to-left.\n    if (glyphRun.direction === 'rtl') {\n      glyphRun.glyphs.reverse();\n    }\n\n    this.morxProcessor.process(glyphRun.glyphs, AATFeatureMap.mapOTToAAT(glyphRun.features));\n  }\n\n  getAvailableFeatures(script, language) {\n    return AATFeatureMap.mapAATToOT(this.morxProcessor.getSupportedFeatures());\n  }\n\n  stringsForGlyph(gid) {\n    let glyphStrings = this.morxProcessor.generateInputs(gid);\n    let result = new Set;\n\n    for (let glyphs of glyphStrings) {\n      this._addStrings(glyphs, 0, result, '');\n    }\n\n    return result;\n  }\n\n  _addStrings(glyphs, index, strings, string) {\n    let codePoints = this.font._cmapProcessor.codePointsForGlyph(glyphs[index]);\n\n    for (let codePoint of codePoints) {\n      let s = string + String.fromCodePoint(codePoint);\n      if (index < glyphs.length - 1) {\n        this._addStrings(glyphs, index + 1, strings, s);\n      } else {\n        strings.add(s);\n      }\n    }\n  }\n}\n", "// see https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html\n// and /System/Library/Frameworks/CoreText.framework/Versions/A/Headers/SFNTLayoutTypes.h on a Mac\nconst features = {\n  allTypographicFeatures: {\n    code: 0,\n    exclusive: false,\n    allTypeFeatures: 0\n  },\n  ligatures: {\n    code: 1,\n    exclusive: false,\n    requiredLigatures: 0,\n    commonLigatures: 2,\n    rareLigatures: 4,\n    // logos: 6\n    rebusPictures: 8,\n    diphthongLigatures: 10,\n    squaredLigatures: 12,\n    abbrevSquaredLigatures: 14,\n    symbolLigatures: 16,\n    contextualLigatures: 18,\n    historicalLigatures: 20\n  },\n  cursiveConnection: {\n    code: 2,\n    exclusive: true,\n    unconnected: 0,\n    partiallyConnected: 1,\n    cursive: 2\n  },\n  letterCase: {\n    code: 3,\n    exclusive: true\n  },\n    // upperAndLowerCase: 0          # deprecated\n    // allCaps: 1                    # deprecated\n    // allLowerCase: 2               # deprecated\n    // smallCaps: 3                  # deprecated\n    // initialCaps: 4                # deprecated\n    // initialCapsAndSmallCaps: 5    # deprecated\n  verticalSubstitution: {\n    code: 4,\n    exclusive: false,\n    substituteVerticalForms: 0\n  },\n  linguisticRearrangement: {\n    code: 5,\n    exclusive: false,\n    linguisticRearrangement: 0\n  },\n  numberSpacing: {\n    code: 6,\n    exclusive: true,\n    monospacedNumbers: 0,\n    proportionalNumbers: 1,\n    thirdWidthNumbers: 2,\n    quarterWidthNumbers: 3\n  },\n  smartSwash: {\n    code: 8,\n    exclusive: false,\n    wordInitialSwashes: 0,\n    wordFinalSwashes: 2,\n    // lineInitialSwashes: 4\n    // lineFinalSwashes: 6\n    nonFinalSwashes: 8\n  },\n  diacritics: {\n    code: 9,\n    exclusive: true,\n    showDiacritics: 0,\n    hideDiacritics: 1,\n    decomposeDiacritics: 2\n  },\n  verticalPosition: {\n    code: 10,\n    exclusive: true,\n    normalPosition: 0,\n    superiors: 1,\n    inferiors: 2,\n    ordinals: 3,\n    scientificInferiors: 4\n  },\n  fractions: {\n    code: 11,\n    exclusive: true,\n    noFractions: 0,\n    verticalFractions: 1,\n    diagonalFractions: 2\n  },\n  overlappingCharacters: {\n    code: 13,\n    exclusive: false,\n    preventOverlap: 0\n  },\n  typographicExtras: {\n    code: 14,\n    exclusive: false,\n    // hyphensToEmDash: 0\n    // hyphenToEnDash: 2\n    slashedZero: 4\n  },\n    // formInterrobang: 6\n    // smartQuotes: 8\n    // periodsToEllipsis: 10\n  mathematicalExtras: {\n    code: 15,\n    exclusive: false,\n    // hyphenToMinus: 0\n    // asteristoMultiply: 2\n    // slashToDivide: 4\n    // inequalityLigatures: 6\n    // exponents: 8\n    mathematicalGreek: 10\n  },\n  ornamentSets: {\n    code: 16,\n    exclusive: true,\n    noOrnaments: 0,\n    dingbats: 1,\n    piCharacters: 2,\n    fleurons: 3,\n    decorativeBorders: 4,\n    internationalSymbols: 5,\n    mathSymbols: 6\n  },\n  characterAlternatives: {\n    code: 17,\n    exclusive: true,\n    noAlternates: 0\n  },\n    // user defined options\n  designComplexity: {\n    code: 18,\n    exclusive: true,\n    designLevel1: 0,\n    designLevel2: 1,\n    designLevel3: 2,\n    designLevel4: 3,\n    designLevel5: 4\n  },\n  styleOptions: {\n    code: 19,\n    exclusive: true,\n    noStyleOptions: 0,\n    displayText: 1,\n    engravedText: 2,\n    illuminatedCaps: 3,\n    titlingCaps: 4,\n    tallCaps: 5\n  },\n  characterShape: {\n    code: 20,\n    exclusive: true,\n    traditionalCharacters: 0,\n    simplifiedCharacters: 1,\n    JIS1978Characters: 2,\n    JIS1983Characters: 3,\n    JIS1990Characters: 4,\n    traditionalAltOne: 5,\n    traditionalAltTwo: 6,\n    traditionalAltThree: 7,\n    traditionalAltFour: 8,\n    traditionalAltFive: 9,\n    expertCharacters: 10,\n    JIS2004Characters: 11,\n    hojoCharacters: 12,\n    NLCCharacters: 13,\n    traditionalNamesCharacters: 14\n  },\n  numberCase: {\n    code: 21,\n    exclusive: true,\n    lowerCaseNumbers: 0,\n    upperCaseNumbers: 1\n  },\n  textSpacing: {\n    code: 22,\n    exclusive: true,\n    proportionalText: 0,\n    monospacedText: 1,\n    halfWidthText: 2,\n    thirdWidthText: 3,\n    quarterWidthText: 4,\n    altProportionalText: 5,\n    altHalfWidthText: 6\n  },\n  transliteration: {\n    code: 23,\n    exclusive: true,\n    noTransliteration: 0\n  },\n    // hanjaToHangul: 1\n    // hiraganaToKatakana: 2\n    // katakanaToHiragana: 3\n    // kanaToRomanization: 4\n    // romanizationToHiragana: 5\n    // romanizationToKatakana: 6\n    // hanjaToHangulAltOne: 7\n    // hanjaToHangulAltTwo: 8\n    // hanjaToHangulAltThree: 9\n  annotation: {\n    code: 24,\n    exclusive: true,\n    noAnnotation: 0,\n    boxAnnotation: 1,\n    roundedBoxAnnotation: 2,\n    circleAnnotation: 3,\n    invertedCircleAnnotation: 4,\n    parenthesisAnnotation: 5,\n    periodAnnotation: 6,\n    romanNumeralAnnotation: 7,\n    diamondAnnotation: 8,\n    invertedBoxAnnotation: 9,\n    invertedRoundedBoxAnnotation: 10\n  },\n  kanaSpacing: {\n    code: 25,\n    exclusive: true,\n    fullWidthKana: 0,\n    proportionalKana: 1\n  },\n  ideographicSpacing: {\n    code: 26,\n    exclusive: true,\n    fullWidthIdeographs: 0,\n    proportionalIdeographs: 1,\n    halfWidthIdeographs: 2\n  },\n  unicodeDecomposition: {\n    code: 27,\n    exclusive: false,\n    canonicalComposition: 0,\n    compatibilityComposition: 2,\n    transcodingComposition: 4\n  },\n  rubyKana: {\n    code: 28,\n    exclusive: false,\n    // noRubyKana: 0     # deprecated - use rubyKanaOff instead\n    // rubyKana: 1     # deprecated - use rubyKanaOn instead\n    rubyKana: 2\n  },\n  CJKSymbolAlternatives: {\n    code: 29,\n    exclusive: true,\n    noCJKSymbolAlternatives: 0,\n    CJKSymbolAltOne: 1,\n    CJKSymbolAltTwo: 2,\n    CJKSymbolAltThree: 3,\n    CJKSymbolAltFour: 4,\n    CJKSymbolAltFive: 5\n  },\n  ideographicAlternatives: {\n    code: 30,\n    exclusive: true,\n    noIdeographicAlternatives: 0,\n    ideographicAltOne: 1,\n    ideographicAltTwo: 2,\n    ideographicAltThree: 3,\n    ideographicAltFour: 4,\n    ideographicAltFive: 5\n  },\n  CJKVerticalRomanPlacement: {\n    code: 31,\n    exclusive: true,\n    CJKVerticalRomanCentered: 0,\n    CJKVerticalRomanHBaseline: 1\n  },\n  italicCJKRoman: {\n    code: 32,\n    exclusive: false,\n    // noCJKItalicRoman: 0     # deprecated - use CJKItalicRomanOff instead\n    // CJKItalicRoman: 1     # deprecated - use CJKItalicRomanOn instead\n    CJKItalicRoman: 2\n  },\n  caseSensitiveLayout: {\n    code: 33,\n    exclusive: false,\n    caseSensitiveLayout: 0,\n    caseSensitiveSpacing: 2\n  },\n  alternateKana: {\n    code: 34,\n    exclusive: false,\n    alternateHorizKana: 0,\n    alternateVertKana: 2\n  },\n  stylisticAlternatives: {\n    code: 35,\n    exclusive: false,\n    noStylisticAlternates: 0,\n    stylisticAltOne: 2,\n    stylisticAltTwo: 4,\n    stylisticAltThree: 6,\n    stylisticAltFour: 8,\n    stylisticAltFive: 10,\n    stylisticAltSix: 12,\n    stylisticAltSeven: 14,\n    stylisticAltEight: 16,\n    stylisticAltNine: 18,\n    stylisticAltTen: 20,\n    stylisticAltEleven: 22,\n    stylisticAltTwelve: 24,\n    stylisticAltThirteen: 26,\n    stylisticAltFourteen: 28,\n    stylisticAltFifteen: 30,\n    stylisticAltSixteen: 32,\n    stylisticAltSeventeen: 34,\n    stylisticAltEighteen: 36,\n    stylisticAltNineteen: 38,\n    stylisticAltTwenty: 40\n  },\n  contextualAlternates: {\n    code: 36,\n    exclusive: false,\n    contextualAlternates: 0,\n    swashAlternates: 2,\n    contextualSwashAlternates: 4\n  },\n  lowerCase: {\n    code: 37,\n    exclusive: true,\n    defaultLowerCase: 0,\n    lowerCaseSmallCaps: 1,\n    lowerCasePetiteCaps: 2\n  },\n  upperCase: {\n    code: 38,\n    exclusive: true,\n    defaultUpperCase: 0,\n    upperCaseSmallCaps: 1,\n    upperCasePetiteCaps: 2\n  },\n  languageTag: { // indices into ltag table\n    code: 39,\n    exclusive: true\n  },\n  CJKRomanSpacing: {\n    code: 103,\n    exclusive: true,\n    halfWidthCJKRoman: 0,\n    proportionalCJKRoman: 1,\n    defaultCJKRoman: 2,\n    fullWidthCJKRoman: 3\n  }\n};\n\nconst feature = (name, selector) => [features[name].code, features[name][selector]];\n\nconst OTMapping = {\n  rlig: feature('ligatures', 'requiredLigatures'),\n  clig: feature('ligatures', 'contextualLigatures'),\n  dlig: feature('ligatures', 'rareLigatures'),\n  hlig: feature('ligatures', 'historicalLigatures'),\n  liga: feature('ligatures', 'commonLigatures'),\n  hist: feature('ligatures', 'historicalLigatures'), // ??\n\n  smcp: feature('lowerCase', 'lowerCaseSmallCaps'),\n  pcap: feature('lowerCase', 'lowerCasePetiteCaps'),\n\n  frac: feature('fractions', 'diagonalFractions'),\n  dnom: feature('fractions', 'diagonalFractions'), // ??\n  numr: feature('fractions', 'diagonalFractions'), // ??\n  afrc: feature('fractions', 'verticalFractions'),\n  // aalt\n  // abvf, abvm, abvs, akhn, blwf, blwm, blws, cfar, cjct, cpsp, falt, isol, jalt, ljmo, mset?\n  // ltra, ltrm, nukt, pref, pres, pstf, psts, rand, rkrf, rphf, rtla, rtlm, size, tjmo, tnum?\n  // unic, vatu, vhal, vjmo, vpal, vrt2\n  // dist -> trak table?\n  // kern, vkrn -> kern table\n  // lfbd + opbd + rtbd -> opbd table?\n  // mark, mkmk -> acnt table?\n  // locl -> languageTag + ltag table\n\n  case: feature('caseSensitiveLayout', 'caseSensitiveLayout'), // also caseSensitiveSpacing\n  ccmp: feature('unicodeDecomposition', 'canonicalComposition'), // compatibilityComposition?\n  cpct: feature('CJKVerticalRomanPlacement', 'CJKVerticalRomanCentered'), // guess..., probably not given below\n  valt: feature('CJKVerticalRomanPlacement', 'CJKVerticalRomanCentered'),\n  swsh: feature('contextualAlternates', 'swashAlternates'),\n  cswh: feature('contextualAlternates', 'contextualSwashAlternates'),\n  curs: feature('cursiveConnection', 'cursive'), // ??\n  c2pc: feature('upperCase', 'upperCasePetiteCaps'),\n  c2sc: feature('upperCase', 'upperCaseSmallCaps'),\n\n  init: feature('smartSwash', 'wordInitialSwashes'), // ??\n  fin2: feature('smartSwash', 'wordFinalSwashes'), // ??\n  medi: feature('smartSwash', 'nonFinalSwashes'), // ??\n  med2: feature('smartSwash', 'nonFinalSwashes'), // ??\n  fin3: feature('smartSwash', 'wordFinalSwashes'), // ??\n  fina: feature('smartSwash', 'wordFinalSwashes'), // ??\n\n  pkna: feature('kanaSpacing', 'proportionalKana'),\n  half: feature('textSpacing', 'halfWidthText'), // also HalfWidthCJKRoman, HalfWidthIdeographs?\n  halt: feature('textSpacing', 'altHalfWidthText'),\n\n  hkna: feature('alternateKana', 'alternateHorizKana'),\n  vkna: feature('alternateKana', 'alternateVertKana'),\n  // hngl: feature 'transliteration', 'hanjaToHangulSelector' # deprecated\n\n  ital: feature('italicCJKRoman', 'CJKItalicRoman'),\n  lnum: feature('numberCase', 'upperCaseNumbers'),\n  onum: feature('numberCase', 'lowerCaseNumbers'),\n  mgrk: feature('mathematicalExtras', 'mathematicalGreek'),\n\n  // nalt: not enough info. what type of annotation?\n  // ornm: ditto, which ornament style?\n\n  calt: feature('contextualAlternates', 'contextualAlternates'), // or more?\n  vrt2: feature('verticalSubstitution', 'substituteVerticalForms'), // oh... below?\n  vert: feature('verticalSubstitution', 'substituteVerticalForms'),\n  tnum: feature('numberSpacing', 'monospacedNumbers'),\n  pnum: feature('numberSpacing', 'proportionalNumbers'),\n  sups: feature('verticalPosition', 'superiors'),\n  subs: feature('verticalPosition', 'inferiors'),\n  ordn: feature('verticalPosition', 'ordinals'),\n  pwid: feature('textSpacing', 'proportionalText'),\n  hwid: feature('textSpacing', 'halfWidthText'),\n  qwid: feature('textSpacing', 'quarterWidthText'), // also QuarterWidthNumbers?\n  twid: feature('textSpacing', 'thirdWidthText'), // also ThirdWidthNumbers?\n  fwid: feature('textSpacing', 'proportionalText'), //??\n  palt: feature('textSpacing', 'altProportionalText'),\n  trad: feature('characterShape', 'traditionalCharacters'),\n  smpl: feature('characterShape', 'simplifiedCharacters'),\n  jp78: feature('characterShape', 'JIS1978Characters'),\n  jp83: feature('characterShape', 'JIS1983Characters'),\n  jp90: feature('characterShape', 'JIS1990Characters'),\n  jp04: feature('characterShape', 'JIS2004Characters'),\n  expt: feature('characterShape', 'expertCharacters'),\n  hojo: feature('characterShape', 'hojoCharacters'),\n  nlck: feature('characterShape', 'NLCCharacters'),\n  tnam: feature('characterShape', 'traditionalNamesCharacters'),\n  ruby: feature('rubyKana', 'rubyKana'),\n  titl: feature('styleOptions', 'titlingCaps'),\n  zero: feature('typographicExtras', 'slashedZero'),\n\n  ss01: feature('stylisticAlternatives', 'stylisticAltOne'),\n  ss02: feature('stylisticAlternatives', 'stylisticAltTwo'),\n  ss03: feature('stylisticAlternatives', 'stylisticAltThree'),\n  ss04: feature('stylisticAlternatives', 'stylisticAltFour'),\n  ss05: feature('stylisticAlternatives', 'stylisticAltFive'),\n  ss06: feature('stylisticAlternatives', 'stylisticAltSix'),\n  ss07: feature('stylisticAlternatives', 'stylisticAltSeven'),\n  ss08: feature('stylisticAlternatives', 'stylisticAltEight'),\n  ss09: feature('stylisticAlternatives', 'stylisticAltNine'),\n  ss10: feature('stylisticAlternatives', 'stylisticAltTen'),\n  ss11: feature('stylisticAlternatives', 'stylisticAltEleven'),\n  ss12: feature('stylisticAlternatives', 'stylisticAltTwelve'),\n  ss13: feature('stylisticAlternatives', 'stylisticAltThirteen'),\n  ss14: feature('stylisticAlternatives', 'stylisticAltFourteen'),\n  ss15: feature('stylisticAlternatives', 'stylisticAltFifteen'),\n  ss16: feature('stylisticAlternatives', 'stylisticAltSixteen'),\n  ss17: feature('stylisticAlternatives', 'stylisticAltSeventeen'),\n  ss18: feature('stylisticAlternatives', 'stylisticAltEighteen'),\n  ss19: feature('stylisticAlternatives', 'stylisticAltNineteen'),\n  ss20: feature('stylisticAlternatives', 'stylisticAltTwenty')\n};\n\n  // salt: feature 'stylisticAlternatives', 'stylisticAltOne' # hmm, which one to choose\n\n// Add cv01-cv99 features\nfor (let i = 1; i <= 99; i++) {\n  OTMapping[`cv${`00${i}`.slice(-2)}`] = [features.characterAlternatives.code, i];\n}\n\n// create inverse mapping\nlet AATMapping = {};\nfor (let ot in OTMapping) {\n  let aat = OTMapping[ot];\n  if (AATMapping[aat[0]] == null) {\n    AATMapping[aat[0]] = {};\n  }\n\n  AATMapping[aat[0]][aat[1]] = ot;\n}\n\n// Maps an array of OpenType features to AAT features\n// in the form of {featureType:{featureSetting:true}}\nexport function mapOTToAAT(features) {\n  let res = {};\n  for (let k in features) {\n    let r;\n    if (r = OTMapping[k]) {\n      if (res[r[0]] == null) {\n        res[r[0]] = {};\n      }\n\n      res[r[0]][r[1]] = features[k];\n    }\n  }\n\n  return res;\n}\n\n// Maps strings in a [featureType, featureSetting]\n// to their equivalent number codes\nfunction mapFeatureStrings(f) {\n  let [type, setting] = f;\n  if (isNaN(type)) {\n    var typeCode = features[type] && features[type].code;\n  } else {\n    var typeCode = type;\n  }\n\n  if (isNaN(setting)) {\n    var settingCode = features[type] && features[type][setting];\n  } else {\n    var settingCode = setting;\n  }\n\n  return [typeCode, settingCode];\n}\n\n// Maps AAT features to an array of OpenType features\n// Supports both arrays in the form of [[featureType, featureSetting]]\n// and objects in the form of {featureType:{featureSetting:true}}\n// featureTypes and featureSettings can be either strings or number codes\nexport function mapAATToOT(features) {\n  let res = {};\n  if (Array.isArray(features)) {\n    for (let k = 0; k < features.length; k++) {\n      let r;\n      let f = mapFeatureStrings(features[k]);\n      if (r = AATMapping[f[0]] && AATMapping[f[0]][f[1]]) {\n        res[r] = true;\n      }\n    }\n\n  } else if (typeof features === 'object') {\n    for (let type in features) {\n      let feature = features[type];\n      for (let setting in feature) {\n        let r;\n        let f = mapFeatureStrings([type, setting]);\n        if (feature[setting] && (r = AATMapping[f[0]] && AATMapping[f[0]][f[1]])) {\n          res[r] = true;\n        }\n      }\n    }\n  }\n\n  return Object.keys(res);\n}\n", "import AATStateMachine from './AATStateMachine';\nimport AATLookupTable from './AATLookupTable';\nimport {cache} from '../decorators';\n\n// indic replacement flags\nconst MARK_FIRST = 0x8000;\nconst MARK_LAST  = 0x2000;\nconst VERB       = 0x000F;\n\n// contextual substitution and glyph insertion flag\nconst SET_MARK = 0x8000;\n\n// ligature entry flags\nconst SET_COMPONENT  = 0x8000;\nconst PERFORM_ACTION = 0x2000;\n\n// ligature action masks\nconst LAST_MASK   = 0x80000000;\nconst STORE_MASK  = 0x40000000;\nconst OFFSET_MASK = 0x3FFFFFFF;\n\nconst VERTICAL_ONLY           = 0x800000;\nconst REVERSE_DIRECTION       = 0x400000;\nconst HORIZONTAL_AND_VERTICAL = 0x200000;\n\n// glyph insertion flags\nconst CURRENT_IS_KASHIDA_LIKE = 0x2000;\nconst MARKED_IS_KASHIDA_LIKE  = 0x1000;\nconst CURRENT_INSERT_BEFORE   = 0x0800;\nconst MARKED_INSERT_BEFORE    = 0x0400;\nconst CURRENT_INSERT_COUNT    = 0x03E0;\nconst MARKED_INSERT_COUNT     = 0x001F;\n\nexport default class AATMorxProcessor {\n  constructor(font) {\n    this.processIndicRearragement = this.processIndicRearragement.bind(this);\n    this.processContextualSubstitution = this.processContextualSubstitution.bind(this);\n    this.processLigature = this.processLigature.bind(this);\n    this.processNoncontextualSubstitutions = this.processNoncontextualSubstitutions.bind(this);\n    this.processGlyphInsertion = this.processGlyphInsertion.bind(this);\n    this.font = font;\n    this.morx = font.morx;\n    this.inputCache = null;\n  }\n\n  // Processes an array of glyphs and applies the specified features\n  // Features should be in the form of {featureType:{featureSetting:boolean}}\n  process(glyphs, features = {}) {\n    for (let chain of this.morx.chains) {\n      let flags = chain.defaultFlags;\n\n      // enable/disable the requested features\n      for (let feature of chain.features) {\n        let f;\n        if (f = features[feature.featureType]) {\n          if (f[feature.featureSetting]) {\n            flags &= feature.disableFlags;\n            flags |= feature.enableFlags;\n          } else if (f[feature.featureSetting] === false) {\n            flags |= ~feature.disableFlags;\n            flags &= ~feature.enableFlags;\n          }\n        }\n      }\n\n      for (let subtable of chain.subtables) {\n        if (subtable.subFeatureFlags & flags) {\n          this.processSubtable(subtable, glyphs);\n        }\n      }\n    }\n\n    // remove deleted glyphs\n    let index = glyphs.length - 1;\n    while (index >= 0) {\n      if (glyphs[index].id === 0xffff) {\n        glyphs.splice(index, 1);\n      }\n\n      index--;\n    }\n\n    return glyphs;\n  }\n\n  processSubtable(subtable, glyphs) {\n    this.subtable = subtable;\n    this.glyphs = glyphs;\n    if (this.subtable.type === 4) {\n      this.processNoncontextualSubstitutions(this.subtable, this.glyphs);\n      return;\n    }\n\n    this.ligatureStack = [];\n    this.markedGlyph = null;\n    this.firstGlyph = null;\n    this.lastGlyph = null;\n    this.markedIndex = null;\n\n    let stateMachine = this.getStateMachine(subtable);\n    let process = this.getProcessor();\n\n    let reverse = !!(this.subtable.coverage & REVERSE_DIRECTION);\n    return stateMachine.process(this.glyphs, reverse, process);\n  }\n\n  @cache\n  getStateMachine(subtable) {\n    return new AATStateMachine(subtable.table.stateTable);\n  }\n\n  getProcessor() {\n    switch (this.subtable.type) {\n      case 0:\n        return this.processIndicRearragement;\n      case 1:\n        return this.processContextualSubstitution;\n      case 2:\n        return this.processLigature;\n      case 4:\n        return this.processNoncontextualSubstitutions;\n      case 5:\n        return this.processGlyphInsertion;\n      default:\n        throw new Error(`Invalid morx subtable type: ${this.subtable.type}`);\n    }\n  }\n\n  processIndicRearragement(glyph, entry, index) {\n    if (entry.flags & MARK_FIRST) {\n      this.firstGlyph = index;\n    }\n\n    if (entry.flags & MARK_LAST) {\n      this.lastGlyph = index;\n    }\n\n    reorderGlyphs(this.glyphs, entry.flags & VERB, this.firstGlyph, this.lastGlyph);\n  }\n\n  processContextualSubstitution(glyph, entry, index) {\n    let subsitutions = this.subtable.table.substitutionTable.items;\n    if (entry.markIndex !== 0xffff) {\n      let lookup = subsitutions.getItem(entry.markIndex);\n      let lookupTable = new AATLookupTable(lookup);\n      glyph = this.glyphs[this.markedGlyph];\n      var gid = lookupTable.lookup(glyph.id);\n      if (gid) {\n        this.glyphs[this.markedGlyph] = this.font.getGlyph(gid, glyph.codePoints);\n      }\n    }\n\n    if (entry.currentIndex !== 0xffff) {\n      let lookup = subsitutions.getItem(entry.currentIndex);\n      let lookupTable = new AATLookupTable(lookup);\n      glyph = this.glyphs[index];\n      var gid = lookupTable.lookup(glyph.id);\n      if (gid) {\n        this.glyphs[index] = this.font.getGlyph(gid, glyph.codePoints);\n      }\n    }\n\n    if (entry.flags & SET_MARK) {\n      this.markedGlyph = index;\n    }\n  }\n\n  processLigature(glyph, entry, index) {\n    if (entry.flags & SET_COMPONENT) {\n      this.ligatureStack.push(index);\n    }\n\n    if (entry.flags & PERFORM_ACTION) {\n      let actions = this.subtable.table.ligatureActions;\n      let components = this.subtable.table.components;\n      let ligatureList = this.subtable.table.ligatureList;\n\n      let actionIndex = entry.action;\n      let last = false;\n      let ligatureIndex = 0;\n      let codePoints = [];\n      let ligatureGlyphs = [];\n\n      while (!last) {\n        let componentGlyph = this.ligatureStack.pop();\n        codePoints.unshift(...this.glyphs[componentGlyph].codePoints);\n\n        let action = actions.getItem(actionIndex++);\n        last = !!(action & LAST_MASK);\n        let store = !!(action & STORE_MASK);\n        let offset = (action & OFFSET_MASK) << 2 >> 2; // sign extend 30 to 32 bits\n        offset += this.glyphs[componentGlyph].id;\n\n        let component = components.getItem(offset);\n        ligatureIndex += component;\n\n        if (last || store) {\n          let ligatureEntry = ligatureList.getItem(ligatureIndex);\n          this.glyphs[componentGlyph] = this.font.getGlyph(ligatureEntry, codePoints);\n          ligatureGlyphs.push(componentGlyph);\n          ligatureIndex = 0;\n          codePoints = [];\n        } else {\n          this.glyphs[componentGlyph] = this.font.getGlyph(0xffff);\n        }\n      }\n\n      // Put ligature glyph indexes back on the stack\n      this.ligatureStack.push(...ligatureGlyphs);\n    }\n  }\n\n  processNoncontextualSubstitutions(subtable, glyphs, index) {\n    let lookupTable = new AATLookupTable(subtable.table.lookupTable);\n\n    for (index = 0; index < glyphs.length; index++) {\n      let glyph = glyphs[index];\n      if (glyph.id !== 0xffff) {\n        let gid = lookupTable.lookup(glyph.id);\n        if (gid) { // 0 means do nothing\n          glyphs[index] = this.font.getGlyph(gid, glyph.codePoints);\n        }\n      }\n    }\n  }\n\n  _insertGlyphs(glyphIndex, insertionActionIndex, count, isBefore) {\n    let insertions = [];\n    while (count--) {\n      let gid = this.subtable.table.insertionActions.getItem(insertionActionIndex++);\n      insertions.push(this.font.getGlyph(gid));\n    }\n\n    if (!isBefore) {\n      glyphIndex++;\n    }\n\n    this.glyphs.splice(glyphIndex, 0, ...insertions);\n  }\n\n  processGlyphInsertion(glyph, entry, index) {\n    if (entry.flags & SET_MARK) {\n      this.markedIndex = index;\n    }\n\n    if (entry.markedInsertIndex !== 0xffff) {\n      let count = (entry.flags & MARKED_INSERT_COUNT) >>> 5;\n      let isBefore = !!(entry.flags & MARKED_INSERT_BEFORE);\n      this._insertGlyphs(this.markedIndex, entry.markedInsertIndex, count, isBefore);\n    }\n\n    if (entry.currentInsertIndex !== 0xffff) {\n      let count = (entry.flags & CURRENT_INSERT_COUNT) >>> 5;\n      let isBefore = !!(entry.flags & CURRENT_INSERT_BEFORE);\n      this._insertGlyphs(index, entry.currentInsertIndex, count, isBefore);\n    }\n  }\n\n  getSupportedFeatures() {\n    let features = [];\n    for (let chain of this.morx.chains) {\n      for (let feature of chain.features) {\n        features.push([feature.featureType, feature.featureSetting]);\n      }\n    }\n\n    return features;\n  }\n\n  generateInputs(gid) {\n    if (!this.inputCache) {\n      this.generateInputCache();\n    }\n\n    return this.inputCache[gid] || [];\n  }\n\n  generateInputCache() {\n    this.inputCache = {};\n\n    for (let chain of this.morx.chains) {\n      let flags = chain.defaultFlags;\n\n      for (let subtable of chain.subtables) {\n        if (subtable.subFeatureFlags & flags) {\n          this.generateInputsForSubtable(subtable);\n        }\n      }\n    }\n  }\n\n  generateInputsForSubtable(subtable) {\n    // Currently, only supporting ligature subtables.\n    if (subtable.type !== 2) {\n      return;\n    }\n\n    let reverse = !!(subtable.coverage & REVERSE_DIRECTION);\n    if (reverse) {\n      throw new Error('Reverse subtable, not supported.');\n    }\n\n    this.subtable = subtable;\n    this.ligatureStack = [];\n\n    let stateMachine = this.getStateMachine(subtable);\n    let process = this.getProcessor();\n\n    let input = [];\n    let stack = [];\n    this.glyphs = [];\n\n    stateMachine.traverse({\n      enter: (glyph, entry) => {\n        let glyphs = this.glyphs;\n        stack.push({\n          glyphs: glyphs.slice(),\n          ligatureStack: this.ligatureStack.slice()\n        });\n\n        // Add glyph to input and glyphs to process.\n        let g = this.font.getGlyph(glyph);\n        input.push(g);\n        glyphs.push(input[input.length - 1]);\n\n        // Process ligature substitution\n        process(glyphs[glyphs.length - 1], entry, glyphs.length - 1);\n\n        // Add input to result if only one matching (non-deleted) glyph remains.\n        let count = 0;\n        let found = 0;\n        for (let i = 0; i < glyphs.length && count <= 1; i++) {\n          if (glyphs[i].id !== 0xffff) {\n            count++;\n            found = glyphs[i].id;\n          }\n        }\n\n        if (count === 1) {\n          let result = input.map(g => g.id);\n          let cache = this.inputCache[found];\n          if (cache) {\n            cache.push(result);\n          } else {\n            this.inputCache[found] = [result];\n          }\n        }\n      },\n\n      exit: () => {\n        ({glyphs: this.glyphs, ligatureStack: this.ligatureStack} = stack.pop());\n        input.pop();\n      }\n    });\n  }\n}\n\n// swaps the glyphs in rangeA with those in rangeB\n// reverse the glyphs inside those ranges if specified\n// ranges are in [offset, length] format\nfunction swap(glyphs, rangeA, rangeB, reverseA = false, reverseB = false) {\n  let end = glyphs.splice(rangeB[0] - (rangeB[1] - 1), rangeB[1]);\n  if (reverseB) {\n    end.reverse();\n  }\n\n  let start = glyphs.splice(rangeA[0], rangeA[1], ...end);\n  if (reverseA) {\n    start.reverse();\n  }\n\n  glyphs.splice(rangeB[0] - (rangeA[1] - 1), 0, ...start);\n  return glyphs;\n}\n\nfunction reorderGlyphs(glyphs, verb, firstGlyph, lastGlyph) {\n  let length = lastGlyph - firstGlyph + 1;\n  switch (verb) {\n    case 0: // no change\n      return glyphs;\n\n    case 1: // Ax => xA\n      return swap(glyphs, [firstGlyph, 1], [lastGlyph, 0]);\n\n    case 2: // xD => Dx\n      return swap(glyphs, [firstGlyph, 0], [lastGlyph, 1]);\n\n    case 3: // AxD => DxA\n      return swap(glyphs, [firstGlyph, 1], [lastGlyph, 1]);\n\n    case 4: // ABx => xAB\n      return swap(glyphs, [firstGlyph, 2], [lastGlyph, 0]);\n\n    case 5: // ABx => xBA\n      return swap(glyphs, [firstGlyph, 2], [lastGlyph, 0], true, false);\n\n    case 6: // xCD => CDx\n      return swap(glyphs, [firstGlyph, 0], [lastGlyph, 2]);\n\n    case 7: // xCD => DCx\n      return swap(glyphs, [firstGlyph, 0], [lastGlyph, 2], false, true);\n\n    case 8: // AxCD => CDxA\n      return swap(glyphs, [firstGlyph, 1], [lastGlyph, 2]);\n\n    case 9: // AxCD => DCxA\n      return swap(glyphs, [firstGlyph, 1], [lastGlyph, 2], false, true);\n\n    case 10: // ABxD => DxAB\n      return swap(glyphs, [firstGlyph, 2], [lastGlyph, 1]);\n\n    case 11: // ABxD => DxBA\n      return swap(glyphs, [firstGlyph, 2], [lastGlyph, 1], true, false);\n\n    case 12: // ABxCD => CDxAB\n      return swap(glyphs, [firstGlyph, 2], [lastGlyph, 2]);\n\n    case 13: // ABxCD => CDxBA\n      return swap(glyphs, [firstGlyph, 2], [lastGlyph, 2], true, false);\n\n    case 14: // ABxCD => DCxAB\n      return swap(glyphs, [firstGlyph, 2], [lastGlyph, 2], false, true);\n\n    case 15: // ABxCD => DCxBA\n      return swap(glyphs, [firstGlyph, 2], [lastGlyph, 2], true, true);\n\n    default:\n      throw new Error(`Unknown verb: ${verb}`);\n  }\n}\n", "import AATLookupTable from './AATLookupTable';\n\nconst START_OF_TEXT_STATE = 0;\nconst START_OF_LINE_STATE = 1;\n\nconst END_OF_TEXT_CLASS = 0;\nconst OUT_OF_BOUNDS_CLASS = 1;\nconst DELETED_GLYPH_CLASS = 2;\nconst END_OF_LINE_CLASS = 3;\n\nconst DONT_ADVANCE = 0x4000;\n\nexport default class AATStateMachine {\n  constructor(stateTable) {\n    this.stateTable = stateTable;\n    this.lookupTable = new AATLookupTable(stateTable.classTable);\n  }\n\n  process(glyphs, reverse, processEntry) {\n    let currentState = START_OF_TEXT_STATE; // START_OF_LINE_STATE is used for kashida glyph insertions sometimes I think?\n    let index = reverse ? glyphs.length - 1 : 0;\n    let dir = reverse ? -1 : 1;\n\n    while ((dir === 1 && index <= glyphs.length) || (dir === -1 && index >= -1)) {\n      let glyph = null;\n      let classCode = OUT_OF_BOUNDS_CLASS;\n      let shouldAdvance = true;\n\n      if (index === glyphs.length || index === -1) {\n        classCode = END_OF_TEXT_CLASS;\n      } else {\n        glyph = glyphs[index];\n        if (glyph.id === 0xffff) { // deleted glyph\n          classCode = DELETED_GLYPH_CLASS;\n        } else {\n          classCode = this.lookupTable.lookup(glyph.id);\n          if (classCode == null) {\n            classCode = OUT_OF_BOUNDS_CLASS;\n          }\n        }\n      }\n\n      let row = this.stateTable.stateArray.getItem(currentState);\n      let entryIndex = row[classCode];\n      let entry = this.stateTable.entryTable.getItem(entryIndex);\n\n      if (classCode !== END_OF_TEXT_CLASS && classCode !==  DELETED_GLYPH_CLASS) {\n        processEntry(glyph, entry, index);\n        shouldAdvance = !(entry.flags & DONT_ADVANCE);\n      }\n\n      currentState = entry.newState;\n      if (shouldAdvance) {\n        index += dir;\n      }\n    }\n\n    return glyphs;\n  }\n\n  /**\n   * Performs a depth-first traversal of the glyph strings\n   * represented by the state machine.\n   */\n  traverse(opts, state = 0, visited = new Set) {\n    if (visited.has(state)) {\n      return;\n    }\n\n    visited.add(state);\n\n    let {nClasses, stateArray, entryTable} = this.stateTable;\n    let row = stateArray.getItem(state);\n\n    // Skip predefined classes\n    for (let classCode = 4; classCode < nClasses; classCode++) {\n      let entryIndex = row[classCode];\n      let entry = entryTable.getItem(entryIndex);\n\n      // Try all glyphs in the class\n      for (let glyph of this.lookupTable.glyphsForValue(classCode)) {\n        if (opts.enter) {\n          opts.enter(glyph, entry);\n        }\n\n        if (entry.newState !== 0) {\n          this.traverse(opts, entry.newState, visited);\n        }\n\n        if (opts.exit) {\n          opts.exit(glyph, entry);\n        }\n      }\n    }\n  }\n}\n", "import {cache} from '../decorators';\nimport {range} from '../utils';\n\nexport default class AATLookupTable {\n  constructor(table) {\n    this.table = table;\n  }\n\n  lookup(glyph) {\n    switch (this.table.version) {\n      case 0: // simple array format\n        return this.table.values.getItem(glyph);\n\n      case 2: // segment format\n      case 4: {\n        let min = 0;\n        let max = this.table.binarySearchHeader.nUnits - 1;\n\n        while (min <= max) {\n          var mid = (min + max) >> 1;\n          var seg = this.table.segments[mid];\n\n          // special end of search value\n          if (seg.firstGlyph === 0xffff) {\n            return null;\n          }\n\n          if (glyph < seg.firstGlyph) {\n            max = mid - 1;\n          } else if (glyph > seg.lastGlyph) {\n            min = mid + 1;\n          } else {\n            if (this.table.version === 2) {\n              return seg.value;\n            } else {\n              return seg.values[glyph - seg.firstGlyph];\n            }\n          }\n        }\n\n        return null;\n      }\n\n      case 6: { // lookup single\n        let min = 0;\n        let max = this.table.binarySearchHeader.nUnits - 1;\n\n        while (min <= max) {\n          var mid = (min + max) >> 1;\n          var seg = this.table.segments[mid];\n\n          // special end of search value\n          if (seg.glyph === 0xffff) {\n            return null;\n          }\n\n          if (glyph < seg.glyph) {\n            max = mid - 1;\n          } else if (glyph > seg.glyph) {\n            min = mid + 1;\n          } else {\n            return seg.value;\n          }\n        }\n\n        return null;\n      }\n\n      case 8: // lookup trimmed\n        return this.table.values[glyph - this.table.firstGlyph];\n\n      default:\n        throw new Error(`Unknown lookup table format: ${this.table.version}`);\n    }\n  }\n\n  @cache\n  glyphsForValue(classValue) {\n    let res = [];\n\n    switch (this.table.version) {\n      case 2: // segment format\n      case 4: {\n        for (let segment of this.table.segments) {\n          if ((this.table.version === 2 && segment.value === classValue)) {\n            res.push(...range(segment.firstGlyph, segment.lastGlyph + 1));\n          } else {\n            for (let index = 0; index < segment.values.length; index++) {\n              if (segment.values[index] === classValue) {\n                res.push(segment.firstGlyph + index);\n              }\n            }\n          }\n        }\n\n        break;\n      }\n\n      case 6: { // lookup single\n        for (let segment of this.table.segments) {\n          if (segment.value === classValue) {\n            res.push(segment.glyph);\n          }\n        }\n\n        break;\n      }\n\n      case 8: { // lookup trimmed\n        for (let i = 0; i < this.table.values.length; i++) {\n          if (this.table.values[i] === classValue) {\n            res.push(this.table.firstGlyph + i);\n          }\n        }\n\n        break;\n      }\n\n      default:\n        throw new Error(`Unknown lookup table format: ${this.table.version}`);\n    }\n\n    return res;\n  }\n}\n", "import ShapingPlan from './ShapingPlan';\nimport * as Shapers from './shapers';\nimport GlyphInfo from './GlyphInfo';\nimport GSUBProcessor from './GSUBProcessor';\nimport GPOSProcessor from './GPOSProcessor';\n\nexport default class OTLayoutEngine {\n  constructor(font) {\n    this.font = font;\n    this.glyphInfos = null;\n    this.plan = null;\n    this.GSUBProcessor = null;\n    this.GPOSProcessor = null;\n    this.fallbackPosition = true;\n\n    if (font.GSUB) {\n      this.GSUBProcessor = new GSUBProcessor(font, font.GSUB);\n    }\n\n    if (font.GPOS) {\n      this.GPOSProcessor = new GPOSProcessor(font, font.GPOS);\n    }\n  }\n\n  setup(glyphRun) {\n    // Map glyphs to GlyphInfo objects so data can be passed between\n    // GSUB and GPOS without mutating the real (shared) Glyph objects.\n    this.glyphInfos = glyphRun.glyphs.map(glyph => new GlyphInfo(this.font, glyph.id, [...glyph.codePoints]));\n\n    // Select a script based on what is available in GSUB/GPOS.\n    let script = null;\n    if (this.GPOSProcessor) {\n      script = this.GPOSProcessor.selectScript(glyphRun.script, glyphRun.language, glyphRun.direction);\n    }\n\n    if (this.GSUBProcessor) {\n      script = this.GSUBProcessor.selectScript(glyphRun.script, glyphRun.language, glyphRun.direction);\n    }\n\n    // Choose a shaper based on the script, and setup a shaping plan.\n    // This determines which features to apply to which glyphs.\n    this.shaper = Shapers.choose(script);\n    this.plan = new ShapingPlan(this.font, script, glyphRun.direction);\n    this.shaper.plan(this.plan, this.glyphInfos, glyphRun.features);\n\n    // Assign chosen features to output glyph run\n    for (let key in this.plan.allFeatures) {\n      glyphRun.features[key] = true;\n    }\n  }\n\n  substitute(glyphRun) {\n    if (this.GSUBProcessor) {\n      this.plan.process(this.GSUBProcessor, this.glyphInfos);\n\n      // Map glyph infos back to normal Glyph objects\n      glyphRun.glyphs = this.glyphInfos.map(glyphInfo => this.font.getGlyph(glyphInfo.id, glyphInfo.codePoints));\n    }\n  }\n\n  position(glyphRun) {\n    if (this.shaper.zeroMarkWidths === 'BEFORE_GPOS') {\n      this.zeroMarkAdvances(glyphRun.positions);\n    }\n\n    if (this.GPOSProcessor) {\n      this.plan.process(this.GPOSProcessor, this.glyphInfos, glyphRun.positions);\n    }\n\n    if (this.shaper.zeroMarkWidths === 'AFTER_GPOS') {\n      this.zeroMarkAdvances(glyphRun.positions);\n    }\n\n    // Reverse the glyphs and positions if the script is right-to-left\n    if (glyphRun.direction === 'rtl') {\n      glyphRun.glyphs.reverse();\n      glyphRun.positions.reverse();\n    }\n\n    return this.GPOSProcessor && this.GPOSProcessor.features;\n  }\n\n  zeroMarkAdvances(positions) {\n    for (let i = 0; i < this.glyphInfos.length; i++) {\n      if (this.glyphInfos[i].isMark) {\n        positions[i].xAdvance = 0;\n        positions[i].yAdvance = 0;\n      }\n    }\n  }\n\n  cleanup() {\n    this.glyphInfos = null;\n    this.plan = null;\n    this.shaper = null;\n  }\n\n  getAvailableFeatures(script, language) {\n    let features = [];\n\n    if (this.GSUBProcessor) {\n      this.GSUBProcessor.selectScript(script, language);\n      features.push(...Object.keys(this.GSUBProcessor.features));\n    }\n\n    if (this.GPOSProcessor) {\n      this.GPOSProcessor.selectScript(script, language);\n      features.push(...Object.keys(this.GPOSProcessor.features));\n    }\n\n    return features;\n  }\n}\n", "import * as Script from '../layout/Script';\n\n/**\n * ShapingPlans are used by the OpenType shapers to store which\n * features should by applied, and in what order to apply them.\n * The features are applied in groups called stages. A feature\n * can be applied globally to all glyphs, or locally to only\n * specific glyphs.\n *\n * @private\n */\nexport default class ShapingPlan {\n  constructor(font, script, direction) {\n    this.font = font;\n    this.script = script;\n    this.direction = direction;\n    this.stages = [];\n    this.globalFeatures = {};\n    this.allFeatures = {};\n  }\n\n  /**\n   * Adds the given features to the last stage.\n   * Ignores features that have already been applied.\n   */\n  _addFeatures(features, global) {\n    let stageIndex = this.stages.length - 1;\n    let stage = this.stages[stageIndex];\n    for (let feature of features) {\n      if (this.allFeatures[feature] == null) {\n        stage.push(feature);\n        this.allFeatures[feature] = stageIndex;\n\n        if (global) {\n          this.globalFeatures[feature] = true;\n        }\n      }\n    }\n  }\n\n  /**\n   * Add features to the last stage\n   */\n  add(arg, global = true) {\n    if (this.stages.length === 0) {\n      this.stages.push([]);\n    }\n\n    if (typeof arg === 'string') {\n      arg = [arg];\n    }\n\n    if (Array.isArray(arg)) {\n      this._addFeatures(arg, global);\n    } else if (typeof arg === 'object') {\n      this._addFeatures(arg.global || [], true);\n      this._addFeatures(arg.local || [], false);\n    } else {\n      throw new Error(\"Unsupported argument to ShapingPlan#add\");\n    }\n  }\n\n  /**\n   * Add a new stage\n   */\n  addStage(arg, global) {\n    if (typeof arg === 'function') {\n      this.stages.push(arg, []);\n    } else {\n      this.stages.push([]);\n      this.add(arg, global);\n    }\n  }\n\n  setFeatureOverrides(features) {\n    if (Array.isArray(features)) {\n      this.add(features);\n    } else if (typeof features === 'object') {\n      for (let tag in features) {\n        if (features[tag]) {\n          this.add(tag);\n        } else if (this.allFeatures[tag] != null) {\n          let stage = this.stages[this.allFeatures[tag]];\n          stage.splice(stage.indexOf(tag), 1);\n          delete this.allFeatures[tag];\n          delete this.globalFeatures[tag];\n        }\n      }\n    }\n  }\n\n  /**\n   * Assigns the global features to the given glyphs\n   */\n  assignGlobalFeatures(glyphs) {\n    for (let glyph of glyphs) {\n      for (let feature in this.globalFeatures) {\n        glyph.features[feature] = true;\n      }\n    }\n  }\n\n  /**\n   * Executes the planned stages using the given OTProcessor\n   */\n  process(processor, glyphs, positions) {\n    for (let stage of this.stages) {\n      if (typeof stage === 'function') {\n        if (!positions) {\n          stage(this.font, glyphs, this);\n        }\n\n      } else if (stage.length > 0) {\n        processor.applyFeatures(stage, glyphs, positions);\n      }\n    }\n  }\n}\n", "import DefaultShaper from './DefaultShaper';\nimport ArabicShaper from './ArabicShaper';\nimport HangulShaper from './HangulShaper';\nimport IndicShaper from './IndicShaper';\nimport UniversalShaper from './UniversalShaper';\n\nconst SHAPERS = {\n  arab: ArabicShaper,    // Arabic\n  mong: ArabicShaper,    // Mongolian\n  syrc: ArabicShaper,    // Syriac\n  'nko ': ArabicShaper,  // N'Ko\n  phag: ArabicShaper,    // Phags Pa\n  mand: ArabicShaper,    // Mandaic\n  mani: ArabicShaper,    // Manichaean\n  phlp: ArabicShaper,    // Psalter Pahlavi\n\n  hang: HangulShaper,    // Hangul\n\n  bng2: IndicShaper,     // Bengali\n  beng: IndicShaper,     // Bengali\n  dev2: IndicShaper,     // Devanagari\n  deva: IndicShaper,     // Devanagari\n  gjr2: IndicShaper,     // Gujarati\n  gujr: IndicShaper,     // Gujarati\n  guru: IndicShaper,     // Gurmukhi\n  gur2: IndicShaper,     // Gurmukhi\n  knda: IndicShaper,     // Kannada\n  knd2: IndicShaper,     // Kannada\n  mlm2: IndicShaper,     // Malayalam\n  mlym: IndicShaper,     // Malayalam\n  ory2: IndicShaper,     // Oriya\n  orya: IndicShaper,     // Oriya\n  taml: IndicShaper,     // Tamil\n  tml2: IndicShaper,     // Tamil\n  telu: IndicShaper,     // Telugu\n  tel2: IndicShaper,     // Telugu\n  khmr: IndicShaper,     // Khmer\n\n  bali: UniversalShaper, // Balinese\n  batk: UniversalShaper, // Batak\n  brah: UniversalShaper, // Brahmi\n  bugi: UniversalShaper, // Buginese\n  buhd: UniversalShaper, // Buhid\n  cakm: UniversalShaper, // Chakma\n  cham: UniversalShaper, // Cham\n  dupl: UniversalShaper, // Duployan\n  egyp: UniversalShaper, // Egyptian Hieroglyphs\n  gran: UniversalShaper, // Grantha\n  hano: UniversalShaper, // Hanunoo\n  java: UniversalShaper, // Javanese\n  kthi: UniversalShaper, // Kaithi\n  kali: UniversalShaper, // Kayah Li\n  khar: UniversalShaper, // Kharoshthi\n  khoj: UniversalShaper, // Khojki\n  sind: UniversalShaper, // Khudawadi\n  lepc: UniversalShaper, // Lepcha\n  limb: UniversalShaper, // Limbu\n  mahj: UniversalShaper, // Mahajani\n  // mand: UniversalShaper, // Mandaic\n  // mani: UniversalShaper, // Manichaean\n  mtei: UniversalShaper, // Meitei Mayek\n  modi: UniversalShaper, // Modi\n  // mong: UniversalShaper, // Mongolian\n  // 'nko ': UniversalShaper, // N’Ko\n  hmng: UniversalShaper, // Pahawh Hmong\n  // phag: UniversalShaper, // Phags-pa\n  // phlp: UniversalShaper, // Psalter Pahlavi\n  rjng: UniversalShaper, // Rejang\n  saur: UniversalShaper, // Saurashtra\n  shrd: UniversalShaper, // Sharada\n  sidd: UniversalShaper, // Siddham\n  sinh: IndicShaper, // Sinhala\n  sund: UniversalShaper, // Sundanese\n  sylo: UniversalShaper, // Syloti Nagri\n  tglg: UniversalShaper, // Tagalog\n  tagb: UniversalShaper, // Tagbanwa\n  tale: UniversalShaper, // Tai Le\n  lana: UniversalShaper, // Tai Tham\n  tavt: UniversalShaper, // Tai Viet\n  takr: UniversalShaper, // Takri\n  tibt: UniversalShaper, // Tibetan\n  tfng: UniversalShaper, // Tifinagh\n  tirh: UniversalShaper, // Tirhuta\n\n  latn: DefaultShaper,   // Latin\n  DFLT: DefaultShaper    // Default\n};\n\nexport function choose(script) {\n  if (!Array.isArray(script)) {\n    script = [script];\n  }\n\n  for (let s of script) {\n    let shaper = SHAPERS[s];\n    if (shaper) {\n      return shaper;\n    }\n  }\n\n  return DefaultShaper;\n}\n", "import {isDigit} from 'unicode-properties';\n\nconst VARIATION_FEATURES = ['rvrn'];\nconst COMMON_FEATURES = ['ccmp', 'locl', 'rlig', 'mark', 'mkmk'];\nconst FRACTIONAL_FEATURES = ['frac', 'numr', 'dnom'];\nconst HORIZONTAL_FEATURES = ['calt', 'clig', 'liga', 'rclt', 'curs', 'kern'];\nconst VERTICAL_FEATURES = ['vert'];\nconst DIRECTIONAL_FEATURES = {\n  ltr: ['ltra', 'ltrm'],\n  rtl: ['rtla', 'rtlm']\n};\n\nexport default class DefaultShaper {\n  static zeroMarkWidths = 'AFTER_GPOS';\n  static plan(plan, glyphs, features) {\n    // Plan the features we want to apply\n    this.planPreprocessing(plan);\n    this.planFeatures(plan);\n    this.planPostprocessing(plan, features);\n\n    // Assign the global features to all the glyphs\n    plan.assignGlobalFeatures(glyphs);\n\n    // Assign local features to glyphs\n    this.assignFeatures(plan, glyphs);\n  }\n\n  static planPreprocessing(plan) {\n    plan.add({\n      global: [...VARIATION_FEATURES, ...DIRECTIONAL_FEATURES[plan.direction]],\n      local: FRACTIONAL_FEATURES\n    });\n  }\n\n  static planFeatures(plan) {\n    // Do nothing by default. Let subclasses override this.\n  }\n\n  static planPostprocessing(plan, userFeatures) {\n    plan.add([...COMMON_FEATURES, ...HORIZONTAL_FEATURES]);\n    plan.setFeatureOverrides(userFeatures);\n  }\n\n  static assignFeatures(plan, glyphs) {\n    // Enable contextual fractions\n    for (let i = 0; i < glyphs.length; i++) {\n      let glyph = glyphs[i];\n      if (glyph.codePoints[0] === 0x2044) { // fraction slash\n        let start = i;\n        let end = i + 1;\n\n        // Apply numerator\n        while (start > 0 && isDigit(glyphs[start - 1].codePoints[0])) {\n          glyphs[start - 1].features.numr = true;\n          glyphs[start - 1].features.frac = true;\n          start--;\n        }\n\n        // Apply denominator\n        while (end < glyphs.length && isDigit(glyphs[end].codePoints[0])) {\n          glyphs[end].features.dnom = true;\n          glyphs[end].features.frac = true;\n          end++;\n        }\n\n        // Apply fraction slash\n        glyph.features.frac = true;\n        i = end - 1;\n      }\n    }\n  }\n}\n", "import DefaultShaper from './DefaultShaper';\nimport {getCategory} from 'unicode-properties';\nimport UnicodeTrie from 'unicode-trie';\nimport { decodeBase64 } from '../../utils';\n\nconst trie = new UnicodeTrie(decodeBase64(require('fs').readFileSync(__dirname + '/data.trie', 'base64')));\nconst FEATURES = ['isol', 'fina', 'fin2', 'fin3', 'medi', 'med2', 'init'];\n\nconst ShapingClasses = {\n  Non_Joining: 0,\n  Left_Joining: 1,\n  Right_Joining: 2,\n  Dual_Joining: 3,\n  Join_Causing: 3,\n  ALAPH: 4,\n  'DALATH RISH': 5,\n  Transparent: 6\n};\n\nconst ISOL = 'isol';\nconst FINA = 'fina';\nconst FIN2 = 'fin2';\nconst FIN3 = 'fin3';\nconst MEDI = 'medi';\nconst MED2 = 'med2';\nconst INIT = 'init';\nconst NONE = null;\n\n// Each entry is [prevAction, curAction, nextState]\nconst STATE_TABLE = [\n  //   Non_Joining,        Left_Joining,       Right_Joining,     Dual_Joining,           ALAPH,            DALATH RISH\n  // State 0: prev was U,  not willing to join.\n  [ [ NONE, NONE, 0 ],  [ NONE, ISOL, 2 ],  [ NONE, ISOL, 1 ],  [ NONE, ISOL, 2 ],  [ NONE, ISOL, 1 ],  [ NONE, ISOL, 6 ] ],\n\n  // State 1: prev was R or ISOL/ALAPH,  not willing to join.\n  [ [ NONE, NONE, 0 ],  [ NONE, ISOL, 2 ],  [ NONE, ISOL, 1 ],  [ NONE, ISOL, 2 ],  [ NONE, FIN2, 5 ],  [ NONE, ISOL, 6 ] ],\n\n  // State 2: prev was D/L in ISOL form,  willing to join.\n  [ [ NONE, NONE, 0 ],  [ NONE, ISOL, 2 ],  [ INIT, FINA, 1 ],  [ INIT, FINA, 3 ],  [ INIT, FINA, 4 ],  [ INIT, FINA, 6 ] ],\n\n  // State 3: prev was D in FINA form,  willing to join.\n  [ [ NONE, NONE, 0 ],  [ NONE, ISOL, 2 ],  [ MEDI, FINA, 1 ],  [ MEDI, FINA, 3 ],  [ MEDI, FINA, 4 ],  [ MEDI, FINA, 6 ] ],\n\n  // State 4: prev was FINA ALAPH,  not willing to join.\n  [ [ NONE, NONE, 0 ],  [ NONE, ISOL, 2 ],  [ MED2, ISOL, 1 ],  [ MED2, ISOL, 2 ],  [ MED2, FIN2, 5 ],  [ MED2, ISOL, 6 ] ],\n\n  // State 5: prev was FIN2/FIN3 ALAPH,  not willing to join.\n  [ [ NONE, NONE, 0 ],  [ NONE, ISOL, 2 ],  [ ISOL, ISOL, 1 ],  [ ISOL, ISOL, 2 ],  [ ISOL, FIN2, 5 ],  [ ISOL, ISOL, 6 ] ],\n\n  // State 6: prev was DALATH/RISH,  not willing to join.\n  [ [ NONE, NONE, 0 ],  [ NONE, ISOL, 2 ],  [ NONE, ISOL, 1 ],  [ NONE, ISOL, 2 ],  [ NONE, FIN3, 5 ],  [ NONE, ISOL, 6 ] ]\n];\n\n/**\n * This is a shaper for Arabic, and other cursive scripts.\n * It uses data from ArabicShaping.txt in the Unicode database,\n * compiled to a UnicodeTrie by generate-data.coffee.\n *\n * The shaping state machine was ported from Harfbuzz.\n * https://github.com/behdad/harfbuzz/blob/master/src/hb-ot-shape-complex-arabic.cc\n */\nexport default class ArabicShaper extends DefaultShaper {\n  static planFeatures(plan) {\n    plan.add(['ccmp', 'locl']);\n    for (let i = 0; i < FEATURES.length; i++) {\n      let feature = FEATURES[i];\n      plan.addStage(feature, false);\n    }\n\n    plan.addStage('mset');\n  }\n\n  static assignFeatures(plan, glyphs) {\n    super.assignFeatures(plan, glyphs);\n\n    let prev = -1;\n    let state = 0;\n    let actions = [];\n\n    // Apply the state machine to map glyphs to features\n    for (let i = 0; i < glyphs.length; i++) {\n      let curAction, prevAction;\n      var glyph = glyphs[i];\n      let type = getShapingClass(glyph.codePoints[0]);\n      if (type === ShapingClasses.Transparent) {\n        actions[i] = NONE;\n        continue;\n      }\n\n      [prevAction, curAction, state] = STATE_TABLE[state][type];\n\n      if (prevAction !== NONE && prev !== -1) {\n        actions[prev] = prevAction;\n      }\n\n      actions[i] = curAction;\n      prev = i;\n    }\n\n    // Apply the chosen features to their respective glyphs\n    for (let index = 0; index < glyphs.length; index++) {\n      let feature;\n      var glyph = glyphs[index];\n      if (feature = actions[index]) {\n        glyph.features[feature] = true;\n      }\n    }\n  }\n}\n\nfunction getShapingClass(codePoint) {\n  let res = trie.get(codePoint);\n  if (res) {\n    return res - 1;\n  }\n\n  let category = getCategory(codePoint);\n  if (category === 'Mn' || category === 'Me' || category === 'Cf') {\n    return ShapingClasses.Transparent;\n  }\n\n  return ShapingClasses.Non_Joining;\n}\n", "import DefaultShaper from './DefaultShaper';\nimport GlyphInfo from '../GlyphInfo';\n\n/**\n * This is a shaper for the Hangul script, used by the Korean language.\n * It does the following:\n *   - decompose if unsupported by the font:\n *     <LV>   -> <L,V>\n *     <LVT>  -> <L,V,T>\n *     <LV,T> -> <L,V,T>\n *\n *   - compose if supported by the font:\n *     <L,V>   -> <LV>\n *     <L,V,T> -> <LVT>\n *     <LV,T>  -> <LVT>\n *\n *   - reorder tone marks (S is any valid syllable):\n *     <S, M> -> <M, S>\n *\n *   - apply ljmo, vjmo, and tjmo OpenType features to decomposed Jamo sequences.\n *\n * This logic is based on the following documents:\n *   - http://www.microsoft.com/typography/OpenTypeDev/hangul/intro.htm\n *   - http://ktug.org/~nomos/harfbuzz-hangul/hangulshaper.pdf\n */\nexport default class HangulShaper extends DefaultShaper {\n  static zeroMarkWidths = 'NONE';\n  static planFeatures(plan) {\n    plan.add(['ljmo', 'vjmo', 'tjmo'], false);\n  }\n\n  static assignFeatures(plan, glyphs) {\n    let state = 0;\n    let i = 0;\n    while (i < glyphs.length) {\n      let action;\n      let glyph = glyphs[i];\n      let code = glyph.codePoints[0];\n      let type = getType(code);\n\n      [ action, state ] = STATE_TABLE[state][type];\n\n      switch (action) {\n        case DECOMPOSE:\n          // Decompose the composed syllable if it is not supported by the font.\n          if (!plan.font.hasGlyphForCodePoint(code)) {\n            i = decompose(glyphs, i, plan.font);\n          }\n          break;\n\n        case COMPOSE:\n          // Found a decomposed syllable. Try to compose if supported by the font.\n          i = compose(glyphs, i, plan.font);\n          break;\n\n        case TONE_MARK:\n          // Got a valid syllable, followed by a tone mark. Move the tone mark to the beginning of the syllable.\n          reorderToneMark(glyphs, i, plan.font);\n          break;\n\n        case INVALID:\n          // Tone mark has no valid syllable to attach to, so insert a dotted circle\n          i = insertDottedCircle(glyphs, i, plan.font);\n          break;\n      }\n\n      i++;\n    }\n  }\n}\n\nconst HANGUL_BASE  = 0xac00;\nconst HANGUL_END   = 0xd7a4;\nconst HANGUL_COUNT = HANGUL_END - HANGUL_BASE + 1;\nconst L_BASE  = 0x1100; // lead\nconst V_BASE  = 0x1161; // vowel\nconst T_BASE  = 0x11a7; // trail\nconst L_COUNT = 19;\nconst V_COUNT = 21;\nconst T_COUNT = 28;\nconst L_END   = L_BASE + L_COUNT - 1;\nconst V_END   = V_BASE + V_COUNT - 1;\nconst T_END   = T_BASE + T_COUNT - 1;\nconst DOTTED_CIRCLE = 0x25cc;\n\nconst isL    = code => 0x1100 <= code && code <= 0x115f || 0xa960 <= code && code <= 0xa97c;\nconst isV    = code => 0x1160 <= code && code <= 0x11a7 || 0xd7b0 <= code && code <= 0xd7c6;\nconst isT    = code => 0x11a8 <= code && code <= 0x11ff || 0xd7cb <= code && code <= 0xd7fb;\nconst isTone = code => 0x302e <= code && code <= 0x302f;\nconst isLVT  = code => HANGUL_BASE <= code && code <= HANGUL_END;\nconst isLV   = code => (code - HANGUL_BASE) < HANGUL_COUNT && (code - HANGUL_BASE) % T_COUNT === 0;\nconst isCombiningL = code => L_BASE <= code && code <= L_END;\nconst isCombiningV = code => V_BASE <= code && code <= V_END;\nconst isCombiningT = code => T_BASE + 1 && 1 <= code && code <= T_END;\n\n// Character categories\nconst X   = 0; // Other character\nconst L   = 1; // Leading consonant\nconst V   = 2; // Medial vowel\nconst T   = 3; // Trailing consonant\nconst LV  = 4; // Composed <LV> syllable\nconst LVT = 5; // Composed <LVT> syllable\nconst M   = 6; // Tone mark\n\n// This function classifies a character using the above categories.\nfunction getType(code) {\n  if (isL(code))    { return L; }\n  if (isV(code))    { return V; }\n  if (isT(code))    { return T; }\n  if (isLV(code))   { return LV; }\n  if (isLVT(code))  { return LVT; }\n  if (isTone(code)) { return M; }\n  return X;\n}\n\n// State machine actions\nconst NO_ACTION = 0;\nconst DECOMPOSE = 1;\nconst COMPOSE   = 2;\nconst TONE_MARK = 4;\nconst INVALID   = 5;\n\n// Build a state machine that accepts valid syllables, and applies actions along the way.\n// The logic this is implementing is documented at the top of the file.\nconst STATE_TABLE = [\n  //       X                 L                 V                T                  LV                LVT               M\n  // State 0: start state\n  [ [ NO_ACTION, 0 ], [ NO_ACTION, 1 ], [ NO_ACTION, 0 ], [ NO_ACTION, 0 ], [ DECOMPOSE, 2 ], [ DECOMPOSE, 3 ], [  INVALID, 0  ] ],\n\n  // State 1: <L>\n  [ [ NO_ACTION, 0 ], [ NO_ACTION, 1 ], [  COMPOSE, 2  ], [ NO_ACTION, 0 ], [ DECOMPOSE, 2 ], [ DECOMPOSE, 3 ], [  INVALID, 0  ] ],\n\n  // State 2: <L,V> or <LV>\n  [ [ NO_ACTION, 0 ], [ NO_ACTION, 1 ], [ NO_ACTION, 0 ], [  COMPOSE, 3  ], [ DECOMPOSE, 2 ], [ DECOMPOSE, 3 ], [ TONE_MARK, 0 ] ],\n\n  // State 3: <L,V,T> or <LVT>\n  [ [ NO_ACTION, 0 ], [ NO_ACTION, 1 ], [ NO_ACTION, 0 ], [ NO_ACTION, 0 ], [ DECOMPOSE, 2 ], [ DECOMPOSE, 3 ], [ TONE_MARK, 0 ] ]\n];\n\nfunction getGlyph(font, code, features) {\n  return new GlyphInfo(font, font.glyphForCodePoint(code).id, [code], features);\n}\n\nfunction decompose(glyphs, i, font) {\n  let glyph = glyphs[i];\n  let code = glyph.codePoints[0];\n\n  let s = code - HANGUL_BASE;\n  let t = T_BASE + s % T_COUNT;\n  s = s / T_COUNT | 0;\n  let l = L_BASE + s / V_COUNT | 0;\n  let v = V_BASE + s % V_COUNT;\n\n  // Don't decompose if all of the components are not available\n  if (!font.hasGlyphForCodePoint(l) ||\n      !font.hasGlyphForCodePoint(v) ||\n      (t !== T_BASE && !font.hasGlyphForCodePoint(t))) {\n    return i;\n  }\n\n  // Replace the current glyph with decomposed L, V, and T glyphs,\n  // and apply the proper OpenType features to each component.\n  let ljmo = getGlyph(font, l, glyph.features);\n  ljmo.features.ljmo = true;\n\n  let vjmo = getGlyph(font, v, glyph.features);\n  vjmo.features.vjmo = true;\n\n  let insert = [ ljmo, vjmo ];\n\n  if (t > T_BASE) {\n    let tjmo = getGlyph(font, t, glyph.features);\n    tjmo.features.tjmo = true;\n    insert.push(tjmo);\n  }\n\n  glyphs.splice(i, 1, ...insert);\n  return i + insert.length - 1;\n}\n\nfunction compose(glyphs, i, font) {\n  let glyph = glyphs[i];\n  let code = glyphs[i].codePoints[0];\n  let type = getType(code);\n\n  let prev = glyphs[i - 1].codePoints[0];\n  let prevType = getType(prev);\n\n  // Figure out what type of syllable we're dealing with\n  let lv, ljmo, vjmo, tjmo;\n  if (prevType === LV && type === T) {\n    // <LV,T>\n    lv = prev;\n    tjmo = glyph;\n  } else {\n    if (type === V) {\n      // <L,V>\n      ljmo = glyphs[i - 1];\n      vjmo = glyph;\n    } else {\n      // <L,V,T>\n      ljmo = glyphs[i - 2];\n      vjmo = glyphs[i - 1];\n      tjmo = glyph;\n    }\n\n    let l = ljmo.codePoints[0];\n    let v = vjmo.codePoints[0];\n\n    // Make sure L and V are combining characters\n    if (isCombiningL(l) && isCombiningV(v)) {\n      lv = HANGUL_BASE + ((l - L_BASE) * V_COUNT + (v - V_BASE)) * T_COUNT;\n    }\n  }\n\n  let t = (tjmo && tjmo.codePoints[0]) || T_BASE;\n  if ((lv != null) && (t === T_BASE || isCombiningT(t))) {\n    let s = lv + (t - T_BASE);\n\n    // Replace with a composed glyph if supported by the font,\n    // otherwise apply the proper OpenType features to each component.\n    if (font.hasGlyphForCodePoint(s)) {\n      let del = prevType === V ? 3 : 2;\n      glyphs.splice(i - del + 1, del, getGlyph(font, s, glyph.features));\n      return i - del + 1;\n    }\n  }\n\n  // Didn't compose (either a non-combining component or unsupported by font).\n  if (ljmo) { ljmo.features.ljmo = true; }\n  if (vjmo) { vjmo.features.vjmo = true; }\n  if (tjmo) { tjmo.features.tjmo = true; }\n\n  if (prevType === LV) {\n    // Sequence was originally <L,V>, which got combined earlier.\n    // Either the T was non-combining, or the LVT glyph wasn't supported.\n    // Decompose the glyph again and apply OT features.\n    decompose(glyphs, i - 1, font);\n    return i + 1;\n  }\n\n  return i;\n}\n\nfunction getLength(code) {\n  switch (getType(code)) {\n    case LV:\n    case LVT:\n      return 1;\n    case V:\n      return 2;\n    case T:\n      return 3;\n  }\n}\n\nfunction reorderToneMark(glyphs, i, font) {\n  let glyph = glyphs[i];\n  let code = glyphs[i].codePoints[0];\n\n  // Move tone mark to the beginning of the previous syllable, unless it is zero width\n  if (font.glyphForCodePoint(code).advanceWidth === 0) { return; }\n\n  let prev = glyphs[i - 1].codePoints[0];\n  let len = getLength(prev);\n\n  glyphs.splice(i, 1);\n  return glyphs.splice(i - len, 0, glyph);\n}\n\nfunction insertDottedCircle(glyphs, i, font) {\n  let glyph = glyphs[i];\n  let code = glyphs[i].codePoints[0];\n\n  if (font.hasGlyphForCodePoint(DOTTED_CIRCLE)) {\n    let dottedCircle = getGlyph(font, DOTTED_CIRCLE, glyph.features);\n\n    // If the tone mark is zero width, insert the dotted circle before, otherwise after\n    let idx = font.glyphForCodePoint(code).advanceWidth === 0 ? i : i + 1;\n    glyphs.splice(idx, 0, dottedCircle);\n    i++;\n  }\n\n  return i;\n}\n", "import {isMark} from 'unicode-properties';\nimport OTProcessor from './OTProcessor';\n\nexport default class GlyphInfo {\n  constructor(font, id, codePoints = [], features) {\n    this._font = font;\n    this.codePoints = codePoints;\n    this.id = id;\n\n    this.features = {};\n    if (Array.isArray(features)) {\n      for (let i = 0; i < features.length; i++) {\n        let feature = features[i];\n        this.features[feature] = true;\n      }\n    } else if (typeof features === 'object') {\n      Object.assign(this.features, features);\n    }\n\n    this.ligatureID = null;\n    this.ligatureComponent = null;\n    this.isLigated = false;\n    this.cursiveAttachment = null;\n    this.markAttachment = null;\n    this.shaperInfo = null;\n    this.substituted = false;\n    this.isMultiplied = false;\n  }\n\n  get id() {\n    return this._id;\n  }\n\n  set id(id) {\n    this._id = id;\n    this.substituted = true;\n\n    let GDEF = this._font.GDEF;\n    if (GDEF && GDEF.glyphClassDef) {\n      // TODO: clean this up\n      let classID = OTProcessor.prototype.getClassID(id, GDEF.glyphClassDef);\n      this.isBase = classID === 1;\n      this.isLigature = classID === 2;\n      this.isMark = classID === 3;\n      this.markAttachmentType = GDEF.markAttachClassDef ? OTProcessor.prototype.getClassID(id, GDEF.markAttachClassDef) : 0;\n    } else {\n      this.isMark = this.codePoints.length > 0 && this.codePoints.every(isMark);\n      this.isBase = !this.isMark;\n      this.isLigature = this.codePoints.length > 1;\n      this.markAttachmentType = 0;\n    }\n  }\n\n  copy() {\n    return new GlyphInfo(this._font, this.id, this.codePoints, this.features);\n  }\n}\n", "import GlyphIterator from './GlyphIterator';\nimport * as Script from '../layout/Script';\n\nconst DEFAULT_SCRIPTS = ['DFLT', 'dflt', 'latn'];\n\nexport default class OTProcessor {\n  constructor(font, table) {\n    this.font = font;\n    this.table = table;\n\n    this.script = null;\n    this.scriptTag = null;\n\n    this.language = null;\n    this.languageTag = null;\n\n    this.features = {};\n    this.lookups = {};\n\n    // Setup variation substitutions\n    this.variationsIndex = font._variationProcessor\n      ? this.findVariationsIndex(font._variationProcessor.normalizedCoords)\n      : -1;\n\n    // initialize to default script + language\n    this.selectScript();\n\n    // current context (set by applyFeatures)\n    this.glyphs = [];\n    this.positions = []; // only used by GPOS\n    this.ligatureID = 1;\n    this.currentFeature = null;\n  }\n\n  findScript(script) {\n    if (this.table.scriptList == null) {\n      return null;\n    }\n\n    if (!Array.isArray(script)) {\n      script = [script];\n    }\n\n    for (let s of script) {\n      for (let entry of this.table.scriptList) {\n        if (entry.tag === s) {\n          return entry;\n        }\n      }\n    }\n\n    return null;\n  }\n\n  selectScript(script, language, direction) {\n    let changed = false;\n    let entry;\n    if (!this.script || script !== this.scriptTag) {\n      entry = this.findScript(script);\n      if (!entry) {\n        entry = this.findScript(DEFAULT_SCRIPTS);\n      }\n\n      if (!entry) {\n        return this.scriptTag;\n      }\n\n      this.scriptTag = entry.tag;\n      this.script = entry.script;\n      this.language = null;\n      this.languageTag = null;\n      changed = true;\n    }\n\n    if (!direction || direction !== this.direction) {\n      this.direction = direction || Script.direction(script);\n    }\n\n    if (language && language.length < 4) {\n      language += ' '.repeat(4 - language.length);\n    }\n\n    if (!language || language !== this.languageTag) {\n      this.language = null;\n\n      for (let lang of this.script.langSysRecords) {\n        if (lang.tag === language) {\n          this.language = lang.langSys;\n          this.languageTag = lang.tag;\n          break;\n        }\n      }\n\n      if (!this.language) {\n        this.language = this.script.defaultLangSys;\n        this.languageTag = null;\n      }\n\n      changed = true;\n    }\n\n    // Build a feature lookup table\n    if (changed) {\n      this.features = {};\n      if (this.language) {\n        for (let featureIndex of this.language.featureIndexes) {\n          let record = this.table.featureList[featureIndex];\n          let substituteFeature = this.substituteFeatureForVariations(featureIndex);\n          this.features[record.tag] = substituteFeature || record.feature;\n        }\n      }\n    }\n\n    return this.scriptTag;\n  }\n\n  lookupsForFeatures(userFeatures = [], exclude) {\n    let lookups = [];\n    for (let tag of userFeatures) {\n      let feature = this.features[tag];\n      if (!feature) {\n        continue;\n      }\n\n      for (let lookupIndex of feature.lookupListIndexes) {\n        if (exclude && exclude.indexOf(lookupIndex) !== -1) {\n          continue;\n        }\n\n        lookups.push({\n          feature: tag,\n          index: lookupIndex,\n          lookup: this.table.lookupList.get(lookupIndex)\n        });\n      }\n    }\n\n    lookups.sort((a, b) => a.index - b.index);\n    return lookups;\n  }\n\n  substituteFeatureForVariations(featureIndex) {\n    if (this.variationsIndex === -1) {\n      return null;\n    }\n\n    let record = this.table.featureVariations.featureVariationRecords[this.variationsIndex];\n    let substitutions = record.featureTableSubstitution.substitutions;\n    for (let substitution of substitutions) {\n      if (substitution.featureIndex === featureIndex) {\n        return substitution.alternateFeatureTable;\n      }\n    }\n\n    return null;\n  }\n\n  findVariationsIndex(coords) {\n    let variations = this.table.featureVariations;\n    if (!variations) {\n      return -1;\n    }\n\n    let records = variations.featureVariationRecords;\n    for (let i = 0; i < records.length; i++) {\n      let conditions = records[i].conditionSet.conditionTable;\n      if (this.variationConditionsMatch(conditions, coords)) {\n        return i;\n      }\n    }\n\n    return -1;\n  }\n\n  variationConditionsMatch(conditions, coords) {\n    return conditions.every(condition => {\n      let coord = condition.axisIndex < coords.length ? coords[condition.axisIndex] : 0;\n      return condition.filterRangeMinValue <= coord && coord <= condition.filterRangeMaxValue;\n    });\n  }\n\n  applyFeatures(userFeatures, glyphs, advances) {\n    let lookups = this.lookupsForFeatures(userFeatures);\n    this.applyLookups(lookups, glyphs, advances);\n  }\n\n  applyLookups(lookups, glyphs, positions) {\n    this.glyphs = glyphs;\n    this.positions = positions;\n    this.glyphIterator = new GlyphIterator(glyphs);\n\n    for (let { feature, lookup } of lookups) {\n      this.currentFeature = feature;\n      this.glyphIterator.reset(lookup.flags);\n\n      while (this.glyphIterator.index < glyphs.length) {\n        if (!(feature in this.glyphIterator.cur.features)) {\n          this.glyphIterator.next();\n          continue;\n        }\n\n        for (let table of lookup.subTables) {\n          let res = this.applyLookup(lookup.lookupType, table);\n          if (res) {\n            break;\n          }\n        }\n\n        this.glyphIterator.next();\n      }\n    }\n  }\n\n  applyLookup(lookup, table) {\n    throw new Error(\"applyLookup must be implemented by subclasses\");\n  }\n\n  applyLookupList(lookupRecords) {\n    let options = this.glyphIterator.options;\n    let glyphIndex = this.glyphIterator.index;\n\n    for (let lookupRecord of lookupRecords) {\n      // Reset flags and find glyph index for this lookup record\n      this.glyphIterator.reset(options, glyphIndex);\n      this.glyphIterator.increment(lookupRecord.sequenceIndex);\n\n      // Get the lookup and setup flags for subtables\n      let lookup = this.table.lookupList.get(lookupRecord.lookupListIndex);\n      this.glyphIterator.reset(lookup.flags, this.glyphIterator.index);\n\n      // Apply lookup subtables until one matches\n      for (let table of lookup.subTables) {\n        if (this.applyLookup(lookup.lookupType, table)) {\n          break;\n        }\n      }\n    }\n\n    this.glyphIterator.reset(options, glyphIndex);\n    return true;\n  }\n\n  coverageIndex(coverage, glyph) {\n    if (glyph == null) {\n      glyph = this.glyphIterator.cur.id;\n    }\n\n    switch (coverage.version) {\n      case 1:\n        return coverage.glyphs.indexOf(glyph);\n\n      case 2:\n        for (let range of coverage.rangeRecords) {\n          if (range.start <= glyph && glyph <= range.end) {\n            return range.startCoverageIndex + glyph - range.start;\n          }\n        }\n\n        break;\n    }\n\n    return -1;\n  }\n\n  match(sequenceIndex, sequence, fn, matched) {\n    let pos = this.glyphIterator.index;\n    let glyph = this.glyphIterator.increment(sequenceIndex);\n    let idx = 0;\n\n    while (idx < sequence.length && glyph && fn(sequence[idx], glyph)) {\n      if (matched) {\n        matched.push(this.glyphIterator.index);\n      }\n\n      idx++;\n      glyph = this.glyphIterator.next();\n    }\n\n    this.glyphIterator.index = pos;\n    if (idx < sequence.length) {\n      return false;\n    }\n\n    return matched || true;\n  }\n\n  sequenceMatches(sequenceIndex, sequence) {\n    return this.match(sequenceIndex, sequence, (component, glyph) => component === glyph.id);\n  }\n\n  sequenceMatchIndices(sequenceIndex, sequence) {\n    return this.match(sequenceIndex, sequence, (component, glyph) => {\n      // If the current feature doesn't apply to this glyph,\n      if (!(this.currentFeature in glyph.features)) {\n        return false;\n      }\n\n      return component === glyph.id;\n    }, []);\n  }\n\n  coverageSequenceMatches(sequenceIndex, sequence) {\n    return this.match(sequenceIndex, sequence, (coverage, glyph) =>\n      this.coverageIndex(coverage, glyph.id) >= 0\n    );\n  }\n\n  getClassID(glyph, classDef) {\n    switch (classDef.version) {\n      case 1: // Class array\n        let i = glyph - classDef.startGlyph;\n        if (i >= 0 && i < classDef.classValueArray.length) {\n          return classDef.classValueArray[i];\n        }\n\n        break;\n\n      case 2:\n        for (let range of classDef.classRangeRecord) {\n          if (range.start <= glyph && glyph <= range.end) {\n            return range.class;\n          }\n        }\n\n        break;\n    }\n\n    return 0;\n  }\n\n  classSequenceMatches(sequenceIndex, sequence, classDef) {\n    return this.match(sequenceIndex, sequence, (classID, glyph) =>\n      classID === this.getClassID(glyph.id, classDef)\n    );\n  }\n\n  applyContext(table) {\n    let index, set;\n    switch (table.version) {\n      case 1:\n        index = this.coverageIndex(table.coverage);\n        if (index === -1) {\n          return false;\n        }\n\n        set = table.ruleSets[index];\n        for (let rule of set) {\n          if (this.sequenceMatches(1, rule.input)) {\n            return this.applyLookupList(rule.lookupRecords);\n          }\n        }\n\n        break;\n\n      case 2:\n        if (this.coverageIndex(table.coverage) === -1) {\n          return false;\n        }\n\n        index = this.getClassID(this.glyphIterator.cur.id, table.classDef);\n        if (index === -1) {\n          return false;\n        }\n\n        set = table.classSet[index];\n        for (let rule of set) {\n          if (this.classSequenceMatches(1, rule.classes, table.classDef)) {\n            return this.applyLookupList(rule.lookupRecords);\n          }\n        }\n\n        break;\n\n      case 3:\n        if (this.coverageSequenceMatches(0, table.coverages)) {\n          return this.applyLookupList(table.lookupRecords);\n        }\n\n        break;\n    }\n\n    return false;\n  }\n\n  applyChainingContext(table) {\n    let index;\n    switch (table.version) {\n      case 1:\n        index = this.coverageIndex(table.coverage);\n        if (index === -1) {\n          return false;\n        }\n\n        let set = table.chainRuleSets[index];\n        for (let rule of set) {\n          if (this.sequenceMatches(-rule.backtrack.length, rule.backtrack)\n            && this.sequenceMatches(1, rule.input)\n            && this.sequenceMatches(1 + rule.input.length, rule.lookahead)) {\n            return this.applyLookupList(rule.lookupRecords);\n          }\n        }\n\n        break;\n\n      case 2:\n        if (this.coverageIndex(table.coverage) === -1) {\n          return false;\n        }\n\n        index = this.getClassID(this.glyphIterator.cur.id, table.inputClassDef);\n        let rules = table.chainClassSet[index];\n        if (!rules) {\n          return false;\n        }\n\n        for (let rule of rules) {\n          if (this.classSequenceMatches(-rule.backtrack.length, rule.backtrack, table.backtrackClassDef) &&\n            this.classSequenceMatches(1, rule.input, table.inputClassDef) &&\n            this.classSequenceMatches(1 + rule.input.length, rule.lookahead, table.lookaheadClassDef)) {\n            return this.applyLookupList(rule.lookupRecords);\n          }\n        }\n\n        break;\n\n      case 3:\n        if (this.coverageSequenceMatches(-table.backtrackGlyphCount, table.backtrackCoverage) &&\n          this.coverageSequenceMatches(0, table.inputCoverage) &&\n          this.coverageSequenceMatches(table.inputGlyphCount, table.lookaheadCoverage)) {\n          return this.applyLookupList(table.lookupRecords);\n        }\n\n        break;\n    }\n\n    return false;\n  }\n}\n", "export default class GlyphIterator {\n  constructor(glyphs, options) {\n    this.glyphs = glyphs;\n    this.reset(options);\n  }\n\n  reset(options = {}, index = 0) {\n    this.options = options;\n    this.flags = options.flags || {};\n    this.markAttachmentType = options.markAttachmentType || 0;\n    this.index = index;\n  }\n\n  get cur() {\n    return this.glyphs[this.index] || null;\n  }\n\n  shouldIgnore(glyph) {\n    return (this.flags.ignoreMarks && glyph.isMark) ||\n           (this.flags.ignoreBaseGlyphs && glyph.isBase) ||\n           (this.flags.ignoreLigatures && glyph.isLigature) ||\n           (this.markAttachmentType && glyph.isMark && glyph.markAttachmentType !== this.markAttachmentType);\n  }\n\n  move(dir) {\n    this.index += dir;\n    while (0 <= this.index && this.index < this.glyphs.length && this.shouldIgnore(this.glyphs[this.index])) {\n      this.index += dir;\n    }\n\n    if (0 > this.index || this.index >= this.glyphs.length) {\n      return null;\n    }\n\n    return this.glyphs[this.index];\n  }\n\n  next() {\n    return this.move(+1);\n  }\n\n  prev() {\n    return this.move(-1);\n  }\n\n  peek(count = 1) {\n    let idx = this.index;\n    let res = this.increment(count);\n    this.index = idx;\n    return res;\n  }\n\n  peekIndex(count = 1) {\n    let idx = this.index;\n    this.increment(count);\n    let res = this.index;\n    this.index = idx;\n    return res;\n  }\n\n  increment(count = 1) {\n    let dir = count < 0 ? -1 : 1;\n    count = Math.abs(count);\n    while (count--) {\n      this.move(dir);\n    }\n\n    return this.glyphs[this.index];\n  }\n}\n", "import DefaultShaper from './DefaultShaper';\nimport StateMachine from 'dfa';\nimport UnicodeTrie from 'unicode-trie';\nimport {getCategory} from 'unicode-properties';\nimport * as Script from '../../layout/Script';\nimport GlyphInfo from '../GlyphInfo';\nimport indicMachine from './indic.json';\nimport useData from './use.json';\nimport {\n  CATEGORIES,\n  POSITIONS,\n  CONSONANT_FLAGS,\n  JOINER_FLAGS,\n  HALANT_OR_COENG_FLAGS, INDIC_CONFIGS,\n  INDIC_DECOMPOSITIONS\n} from './indic-data';\nimport { decodeBase64 } from '../../utils';\n\nconst {decompositions} = useData;\nconst trie = new UnicodeTrie(decodeBase64(require('fs').readFileSync(__dirname + '/indic.trie', 'base64')));\nconst stateMachine = new StateMachine(indicMachine);\n\n/**\n * The IndicShaper supports indic scripts e.g. Devanagari, Kannada, etc.\n * Based on code from Harfbuzz: https://github.com/behdad/harfbuzz/blob/master/src/hb-ot-shape-complex-indic.cc\n */\nexport default class IndicShaper extends DefaultShaper {\n  static zeroMarkWidths = 'NONE';\n  static planFeatures(plan) {\n    plan.addStage(setupSyllables);\n\n    plan.addStage(['locl', 'ccmp']);\n\n    plan.addStage(initialReordering);\n\n    plan.addStage('nukt');\n    plan.addStage('akhn');\n    plan.addStage('rphf', false);\n    plan.addStage('rkrf');\n    plan.addStage('pref', false);\n    plan.addStage('blwf', false);\n    plan.addStage('abvf', false);\n    plan.addStage('half', false);\n    plan.addStage('pstf', false);\n    plan.addStage('vatu');\n    plan.addStage('cjct');\n    plan.addStage('cfar', false);\n\n    plan.addStage(finalReordering);\n\n    plan.addStage({\n      local: ['init'],\n      global: ['pres', 'abvs', 'blws', 'psts', 'haln', 'dist', 'abvm', 'blwm', 'calt', 'clig']\n    });\n\n    // Setup the indic config for the selected script\n    plan.unicodeScript = Script.fromOpenType(plan.script);\n    plan.indicConfig = INDIC_CONFIGS[plan.unicodeScript] || INDIC_CONFIGS.Default;\n    plan.isOldSpec = plan.indicConfig.hasOldSpec && plan.script[plan.script.length - 1] !== '2';\n\n    // TODO: turn off kern (Khmer) and liga features.\n  }\n\n  static assignFeatures(plan, glyphs) {\n    // Decompose split matras\n    // TODO: do this in a more general unicode normalizer\n    for (let i = glyphs.length - 1; i >= 0; i--) {\n      let codepoint = glyphs[i].codePoints[0];\n      let d = INDIC_DECOMPOSITIONS[codepoint] || decompositions[codepoint];\n      if (d) {\n        let decomposed = d.map(c => {\n          let g = plan.font.glyphForCodePoint(c);\n          return new GlyphInfo(plan.font, g.id, [c], glyphs[i].features);\n        });\n\n        glyphs.splice(i, 1, ...decomposed);\n      }\n    }\n  }\n}\n\nfunction indicCategory(glyph) {\n  return trie.get(glyph.codePoints[0]) >> 8;\n}\n\nfunction indicPosition(glyph) {\n  return 1 << (trie.get(glyph.codePoints[0]) & 0xff);\n}\n\nclass IndicInfo {\n  constructor(category, position, syllableType, syllable) {\n    this.category = category;\n    this.position = position;\n    this.syllableType = syllableType;\n    this.syllable = syllable;\n  }\n}\n\nfunction setupSyllables(font, glyphs) {\n  let syllable = 0;\n  let last = 0;\n  for (let [start, end, tags] of stateMachine.match(glyphs.map(indicCategory))) {\n    if (start > last) {\n      ++syllable;\n      for (let i = last; i < start; i++) {\n        glyphs[i].shaperInfo = new IndicInfo(CATEGORIES.X, POSITIONS.End, 'non_indic_cluster', syllable);\n      }\n    }\n\n    ++syllable;\n\n    // Create shaper info\n    for (let i = start; i <= end; i++) {\n      glyphs[i].shaperInfo = new IndicInfo(\n        1 << indicCategory(glyphs[i]),\n        indicPosition(glyphs[i]),\n        tags[0],\n        syllable\n      );\n    }\n\n    last = end + 1;\n  }\n\n  if (last < glyphs.length) {\n    ++syllable;\n    for (let i = last; i < glyphs.length; i++) {\n      glyphs[i].shaperInfo = new IndicInfo(CATEGORIES.X, POSITIONS.End, 'non_indic_cluster', syllable);\n    }\n  }\n}\n\nfunction isConsonant(glyph) {\n  return glyph.shaperInfo.category & CONSONANT_FLAGS;\n}\n\nfunction isJoiner(glyph) {\n  return glyph.shaperInfo.category & JOINER_FLAGS;\n}\n\nfunction isHalantOrCoeng(glyph) {\n  return glyph.shaperInfo.category & HALANT_OR_COENG_FLAGS;\n}\n\nfunction wouldSubstitute(glyphs, feature) {\n  for (let glyph of glyphs) {\n    glyph.features = {[feature]: true};\n  }\n\n  let GSUB = glyphs[0]._font._layoutEngine.engine.GSUBProcessor;\n  GSUB.applyFeatures([feature], glyphs);\n\n  return glyphs.length === 1;\n}\n\nfunction consonantPosition(font, consonant, virama) {\n  let glyphs = [virama, consonant, virama];\n  if (wouldSubstitute(glyphs.slice(0, 2), 'blwf') || wouldSubstitute(glyphs.slice(1, 3), 'blwf')) {\n    return POSITIONS.Below_C;\n  } else if (wouldSubstitute(glyphs.slice(0, 2), 'pstf') || wouldSubstitute(glyphs.slice(1, 3), 'pstf')) {\n    return POSITIONS.Post_C;\n  } else if (wouldSubstitute(glyphs.slice(0, 2), 'pref') || wouldSubstitute(glyphs.slice(1, 3), 'pref')) {\n    return POSITIONS.Post_C;\n  }\n\n  return POSITIONS.Base_C;\n}\n\nfunction initialReordering(font, glyphs, plan) {\n  let indicConfig = plan.indicConfig;\n  let features = font._layoutEngine.engine.GSUBProcessor.features;\n\n  let dottedCircle = font.glyphForCodePoint(0x25cc).id;\n  let virama = font.glyphForCodePoint(indicConfig.virama).id;\n  if (virama) {\n    let info = new GlyphInfo(font, virama, [indicConfig.virama]);\n    for (let i = 0; i < glyphs.length; i++) {\n      if (glyphs[i].shaperInfo.position === POSITIONS.Base_C) {\n        glyphs[i].shaperInfo.position = consonantPosition(font, glyphs[i].copy(), info);\n      }\n    }\n  }\n\n  for (let start = 0, end = nextSyllable(glyphs, 0); start < glyphs.length; start = end, end = nextSyllable(glyphs, start)) {\n    let {category, syllableType} = glyphs[start].shaperInfo;\n\n    if (syllableType === 'symbol_cluster' || syllableType === 'non_indic_cluster') {\n      continue;\n    }\n\n    if (syllableType === 'broken_cluster' && dottedCircle) {\n      let g = new GlyphInfo(font, dottedCircle, [0x25cc]);\n      g.shaperInfo = new IndicInfo(\n        1 << indicCategory(g),\n        indicPosition(g),\n        glyphs[start].shaperInfo.syllableType,\n        glyphs[start].shaperInfo.syllable\n      );\n\n      // Insert after possible Repha.\n      let i = start;\n      while (i < end && glyphs[i].shaperInfo.category === CATEGORIES.Repha) {\n        i++;\n      }\n\n      glyphs.splice(i++, 0, g);\n      end++;\n    }\n\n    // 1. Find base consonant:\n    //\n    // The shaping engine finds the base consonant of the syllable, using the\n    // following algorithm: starting from the end of the syllable, move backwards\n    // until a consonant is found that does not have a below-base or post-base\n    // form (post-base forms have to follow below-base forms), or that is not a\n    // pre-base reordering Ra, or arrive at the first consonant. The consonant\n    // stopped at will be the base.\n\n    let base = end;\n    let limit = start;\n    let hasReph = false;\n\n    // If the syllable starts with Ra + Halant (in a script that has Reph)\n    // and has more than one consonant, Ra is excluded from candidates for\n    // base consonants.\n    if (indicConfig.rephPos !== POSITIONS.Ra_To_Become_Reph &&\n      features.rphf &&\n      start + 3 <= end && (\n        (indicConfig.rephMode === 'Implicit' && !isJoiner(glyphs[start + 2])) ||\n        (indicConfig.rephMode === 'Explicit' && glyphs[start + 2].shaperInfo.category === CATEGORIES.ZWJ)\n      )\n    ) {\n      // See if it matches the 'rphf' feature.\n      let g = [glyphs[start].copy(), glyphs[start + 1].copy(), glyphs[start + 2].copy()];\n      if (wouldSubstitute(g.slice(0, 2), 'rphf') || (indicConfig.rephMode === 'Explicit' && wouldSubstitute(g, 'rphf'))) {\n        limit += 2;\n        while (limit < end && isJoiner(glyphs[limit])) {\n          limit++;\n        }\n        base = start;\n        hasReph = true;\n      }\n    } else if (indicConfig.rephMode === 'Log_Repha' && glyphs[start].shaperInfo.category === CATEGORIES.Repha) {\n      limit++;\n      while (limit < end && isJoiner(glyphs[limit])) {\n        limit++;\n      }\n      base = start;\n      hasReph = true;\n    }\n\n    switch (indicConfig.basePos) {\n      case 'Last': {\n        // starting from the end of the syllable, move backwards\n        let i = end;\n        let seenBelow = false;\n\n        do {\n          let info = glyphs[--i].shaperInfo;\n\n          // until a consonant is found\n          if (isConsonant(glyphs[i])) {\n            // that does not have a below-base or post-base form\n            // (post-base forms have to follow below-base forms),\n            if (info.position !== POSITIONS.Below_C && (info.position !== POSITIONS.Post_C || seenBelow)) {\n              base = i;\n              break;\n            }\n\n            // or that is not a pre-base reordering Ra,\n            //\n            // IMPLEMENTATION NOTES:\n            //\n            // Our pre-base reordering Ra's are marked POS_POST_C, so will be skipped\n            // by the logic above already.\n            //\n\n            // or arrive at the first consonant. The consonant stopped at will\n            // be the base.\n            if (info.position === POSITIONS.Below_C) {\n              seenBelow = true;\n            }\n\n            base = i;\n          } else if (start < i && info.category === CATEGORIES.ZWJ && glyphs[i - 1].shaperInfo.category === CATEGORIES.H) {\n            // A ZWJ after a Halant stops the base search, and requests an explicit\n            // half form.\n            // A ZWJ before a Halant, requests a subjoined form instead, and hence\n            // search continues.  This is particularly important for Bengali\n            // sequence Ra,H,Ya that should form Ya-Phalaa by subjoining Ya.\n            break;\n          }\n        } while (i > limit);\n        break;\n      }\n\n      case 'First': {\n        // The first consonant is always the base.\n        base = start;\n\n        // Mark all subsequent consonants as below.\n        for (let i = base + 1; i < end; i++) {\n          if (isConsonant(glyphs[i])) {\n            glyphs[i].shaperInfo.position = POSITIONS.Below_C;\n          }\n        }\n      }\n    }\n\n    // If the syllable starts with Ra + Halant (in a script that has Reph)\n    // and has more than one consonant, Ra is excluded from candidates for\n    // base consonants.\n    //\n    //  Only do this for unforced Reph. (ie. not for Ra,H,ZWJ)\n    if (hasReph && base === start && limit - base <= 2) {\n      hasReph = false;\n    }\n\n    // 2. Decompose and reorder Matras:\n    //\n    // Each matra and any syllable modifier sign in the cluster are moved to the\n    // appropriate position relative to the consonant(s) in the cluster. The\n    // shaping engine decomposes two- or three-part matras into their constituent\n    // parts before any repositioning. Matra characters are classified by which\n    // consonant in a conjunct they have affinity for and are reordered to the\n    // following positions:\n    //\n    //   o Before first half form in the syllable\n    //   o After subjoined consonants\n    //   o After post-form consonant\n    //   o After main consonant (for above marks)\n    //\n    // IMPLEMENTATION NOTES:\n    //\n    // The normalize() routine has already decomposed matras for us, so we don't\n    // need to worry about that.\n\n    // 3.  Reorder marks to canonical order:\n    //\n    // Adjacent nukta and halant or nukta and vedic sign are always repositioned\n    // if necessary, so that the nukta is first.\n    //\n    // IMPLEMENTATION NOTES:\n    //\n    // We don't need to do this: the normalize() routine already did this for us.\n\n    // Reorder characters\n\n    for (let i = start; i < base; i++) {\n      let info = glyphs[i].shaperInfo;\n      info.position = Math.min(POSITIONS.Pre_C, info.position);\n    }\n\n    if (base < end) {\n      glyphs[base].shaperInfo.position = POSITIONS.Base_C;\n    }\n\n    // Mark final consonants.  A final consonant is one appearing after a matra,\n    // like in Khmer.\n    for (let i = base + 1; i < end; i++) {\n      if (glyphs[i].shaperInfo.category === CATEGORIES.M) {\n        for (let j = i + 1; j < end; j++) {\n          if (isConsonant(glyphs[j])) {\n            glyphs[j].shaperInfo.position = POSITIONS.Final_C;\n            break;\n          }\n        }\n        break;\n      }\n    }\n\n    // Handle beginning Ra\n    if (hasReph) {\n      glyphs[start].shaperInfo.position = POSITIONS.Ra_To_Become_Reph;\n    }\n\n    // For old-style Indic script tags, move the first post-base Halant after\n    // last consonant.\n    //\n    // Reports suggest that in some scripts Uniscribe does this only if there\n    // is *not* a Halant after last consonant already (eg. Kannada), while it\n    // does it unconditionally in other scripts (eg. Malayalam).  We don't\n    // currently know about other scripts, so we single out Malayalam for now.\n    //\n    // Kannada test case:\n    // U+0C9A,U+0CCD,U+0C9A,U+0CCD\n    // With some versions of Lohit Kannada.\n    // https://bugs.freedesktop.org/show_bug.cgi?id=59118\n    //\n    // Malayalam test case:\n    // U+0D38,U+0D4D,U+0D31,U+0D4D,U+0D31,U+0D4D\n    // With lohit-ttf-20121122/Lohit-Malayalam.ttf\n    if (plan.isOldSpec) {\n      let disallowDoubleHalants = plan.unicodeScript !== 'Malayalam';\n      for (let i = base + 1; i < end; i++) {\n        if (glyphs[i].shaperInfo.category === CATEGORIES.H) {\n          let j;\n          for (j = end - 1; j > i; j--) {\n            if (isConsonant(glyphs[j]) || (disallowDoubleHalants && glyphs[j].shaperInfo.category === CATEGORIES.H)) {\n              break;\n            }\n          }\n\n          if (glyphs[j].shaperInfo.category !== CATEGORIES.H && j > i) {\n            // Move Halant to after last consonant.\n            let t = glyphs[i];\n            glyphs.splice(i, 0, ...glyphs.splice(i + 1, j - i));\n            glyphs[j] = t;\n          }\n\n          break;\n        }\n      }\n    }\n\n    // Attach misc marks to previous char to move with them.\n    let lastPos = POSITIONS.Start;\n    for (let i = start; i < end; i++) {\n      let info = glyphs[i].shaperInfo;\n      if (info.category & (JOINER_FLAGS | CATEGORIES.N | CATEGORIES.RS | CATEGORIES.CM | HALANT_OR_COENG_FLAGS & info.category)) {\n        info.position = lastPos;\n        if (info.category === CATEGORIES.H && info.position === POSITIONS.Pre_M) {\n          // Uniscribe doesn't move the Halant with Left Matra.\n          // TEST: U+092B,U+093F,U+094DE\n          // We follow.  This is important for the Sinhala\n          // U+0DDA split matra since it decomposes to U+0DD9,U+0DCA\n          // where U+0DD9 is a left matra and U+0DCA is the virama.\n          // We don't want to move the virama with the left matra.\n          // TEST: U+0D9A,U+0DDA\n          for (let j = i; j > start; j--) {\n            if (glyphs[j - 1].shaperInfo.position !== POSITIONS.Pre_M) {\n              info.position = glyphs[j - 1].shaperInfo.position;\n              break;\n            }\n          }\n        }\n      } else if (info.position !== POSITIONS.SMVD) {\n        lastPos = info.position;\n      }\n    }\n\n    // For post-base consonants let them own anything before them\n    // since the last consonant or matra.\n    let last = base;\n    for (let i = base + 1; i < end; i++) {\n      if (isConsonant(glyphs[i])) {\n        for (let j = last + 1; j < i; j++) {\n          if (glyphs[j].shaperInfo.position < POSITIONS.SMVD) {\n            glyphs[j].shaperInfo.position = glyphs[i].shaperInfo.position;\n          }\n        }\n        last = i;\n      } else if (glyphs[i].shaperInfo.category === CATEGORIES.M) {\n        last = i;\n      }\n    }\n\n    let arr = glyphs.slice(start, end);\n    arr.sort((a, b) => a.shaperInfo.position - b.shaperInfo.position);\n    glyphs.splice(start, arr.length, ...arr);\n\n    // Find base again\n    for (let i = start; i < end; i++) {\n      if (glyphs[i].shaperInfo.position === POSITIONS.Base_C) {\n        base = i;\n        break;\n      }\n    }\n\n    // Setup features now\n\n    // Reph\n    for (let i = start; i < end && glyphs[i].shaperInfo.position === POSITIONS.Ra_To_Become_Reph; i++) {\n      glyphs[i].features.rphf = true;\n    }\n\n    // Pre-base\n    let blwf = !plan.isOldSpec && indicConfig.blwfMode === 'Pre_And_Post';\n    for (let i = start; i < base; i++) {\n      glyphs[i].features.half = true;\n      if (blwf) {\n        glyphs[i].features.blwf = true;\n      }\n    }\n\n    // Post-base\n    for (let i = base + 1; i < end; i++) {\n      glyphs[i].features.abvf = true;\n      glyphs[i].features.pstf = true;\n      glyphs[i].features.blwf = true;\n    }\n\n    if (plan.isOldSpec && plan.unicodeScript === 'Devanagari') {\n      // Old-spec eye-lash Ra needs special handling.  From the\n      // spec:\n      //\n      // \"The feature 'below-base form' is applied to consonants\n      // having below-base forms and following the base consonant.\n      // The exception is vattu, which may appear below half forms\n      // as well as below the base glyph. The feature 'below-base\n      // form' will be applied to all such occurrences of Ra as well.\"\n      //\n      // Test case: U+0924,U+094D,U+0930,U+094d,U+0915\n      // with Sanskrit 2003 font.\n      //\n      // However, note that Ra,Halant,ZWJ is the correct way to\n      // request eyelash form of Ra, so we wouldbn't inhibit it\n      // in that sequence.\n      //\n      // Test case: U+0924,U+094D,U+0930,U+094d,U+200D,U+0915\n      for (let i = start; i + 1 < base; i++) {\n        if (glyphs[i].shaperInfo.category === CATEGORIES.Ra &&\n          glyphs[i + 1].shaperInfo.category === CATEGORIES.H &&\n          (i + 1 === base || glyphs[i + 2].shaperInfo.category === CATEGORIES.ZWJ)\n        ) {\n          glyphs[i].features.blwf = true;\n          glyphs[i + 1].features.blwf = true;\n        }\n      }\n    }\n\n    let prefLen = 2;\n    if (features.pref && base + prefLen < end) {\n      // Find a Halant,Ra sequence and mark it for pre-base reordering processing.\n      for (let i = base + 1; i + prefLen - 1 < end; i++) {\n        let g = [glyphs[i].copy(), glyphs[i + 1].copy()];\n        if (wouldSubstitute(g, 'pref')) {\n          for (let j = 0; j < prefLen; j++) {\n            glyphs[i++].features.pref = true;\n          }\n\n          // Mark the subsequent stuff with 'cfar'.  Used in Khmer.\n          // Read the feature spec.\n          // This allows distinguishing the following cases with MS Khmer fonts:\n          // U+1784,U+17D2,U+179A,U+17D2,U+1782\n          // U+1784,U+17D2,U+1782,U+17D2,U+179A\n          if (features.cfar) {\n            for (; i < end; i++) {\n              glyphs[i].features.cfar = true;\n            }\n          }\n\n          break;\n        }\n      }\n    }\n\n    // Apply ZWJ/ZWNJ effects\n    for (let i = start + 1; i < end; i++) {\n      if (isJoiner(glyphs[i])) {\n        let nonJoiner = glyphs[i].shaperInfo.category === CATEGORIES.ZWNJ;\n        let j = i;\n\n        do {\n          j--;\n\n          // ZWJ/ZWNJ should disable CJCT.  They do that by simply\n          // being there, since we don't skip them for the CJCT\n          // feature (ie. F_MANUAL_ZWJ)\n\n          // A ZWNJ disables HALF.\n          if (nonJoiner) {\n            delete glyphs[j].features.half;\n          }\n        } while (j > start && !isConsonant(glyphs[j]));\n      }\n    }\n  }\n}\n\nfunction finalReordering(font, glyphs, plan) {\n  let indicConfig = plan.indicConfig;\n  let features = font._layoutEngine.engine.GSUBProcessor.features;\n\n  for (let start = 0, end = nextSyllable(glyphs, 0); start < glyphs.length; start = end, end = nextSyllable(glyphs, start)) {\n    // 4. Final reordering:\n    //\n    // After the localized forms and basic shaping forms GSUB features have been\n    // applied (see below), the shaping engine performs some final glyph\n    // reordering before applying all the remaining font features to the entire\n    // cluster.\n\n    let tryPref = !!features.pref;\n\n    // Find base again\n    let base = start;\n    for (; base < end; base++) {\n      if (glyphs[base].shaperInfo.position >= POSITIONS.Base_C) {\n        if (tryPref && base + 1 < end) {\n          for (let i = base + 1; i < end; i++) {\n            if (glyphs[i].features.pref) {\n              if (!(glyphs[i].substituted && glyphs[i].isLigated && !glyphs[i].isMultiplied)) {\n                // Ok, this was a 'pref' candidate but didn't form any.\n                // Base is around here...\n                base = i;\n                while (base < end && isHalantOrCoeng(glyphs[base])) {\n                  base++;\n                }\n                glyphs[base].shaperInfo.position = POSITIONS.BASE_C;\n                tryPref = false;\n              }\n              break;\n            }\n          }\n        }\n\n        // For Malayalam, skip over unformed below- (but NOT post-) forms.\n        if (plan.unicodeScript === 'Malayalam') {\n          for (let i = base + 1; i < end; i++) {\n            while (i < end && isJoiner(glyphs[i])) {\n              i++;\n            }\n\n            if (i === end || !isHalantOrCoeng(glyphs[i])) {\n              break;\n            }\n\n            i++; // Skip halant.\n            while (i < end && isJoiner(glyphs[i])) {\n              i++;\n            }\n\n            if (i < end && isConsonant(glyphs[i]) && glyphs[i].shaperInfo.position === POSITIONS.Below_C) {\n              base = i;\n              glyphs[base].shaperInfo.position = POSITIONS.Base_C;\n            }\n          }\n        }\n\n        if (start < base && glyphs[base].shaperInfo.position > POSITIONS.Base_C) {\n          base--;\n        }\n        break;\n      }\n    }\n\n    if (base === end && start < base && glyphs[base - 1].shaperInfo.category === CATEGORIES.ZWJ) {\n      base--;\n    }\n\n    if (base < end) {\n      while (start < base && glyphs[base].shaperInfo.category & (CATEGORIES.N | HALANT_OR_COENG_FLAGS)) {\n        base--;\n      }\n    }\n\n    // o Reorder matras:\n    //\n    // If a pre-base matra character had been reordered before applying basic\n    // features, the glyph can be moved closer to the main consonant based on\n    // whether half-forms had been formed. Actual position for the matra is\n    // defined as “after last standalone halant glyph, after initial matra\n    // position and before the main consonant”. If ZWJ or ZWNJ follow this\n    // halant, position is moved after it.\n    //\n\n    if (start + 1 < end && start < base) { // Otherwise there can't be any pre-base matra characters.\n      // If we lost track of base, alas, position before last thingy.\n      let newPos = base === end ? base - 2 : base - 1;\n\n      // Malayalam / Tamil do not have \"half\" forms or explicit virama forms.\n      // The glyphs formed by 'half' are Chillus or ligated explicit viramas.\n      // We want to position matra after them.\n      if (plan.unicodeScript !== 'Malayalam' && plan.unicodeScript !== 'Tamil') {\n        while (newPos > start && !(glyphs[newPos].shaperInfo.category & (CATEGORIES.M | HALANT_OR_COENG_FLAGS))) {\n          newPos--;\n        }\n\n        // If we found no Halant we are done.\n        // Otherwise only proceed if the Halant does\n        // not belong to the Matra itself!\n        if (isHalantOrCoeng(glyphs[newPos]) && glyphs[newPos].shaperInfo.position !== POSITIONS.Pre_M) {\n          // If ZWJ or ZWNJ follow this halant, position is moved after it.\n          if (newPos + 1 < end && isJoiner(glyphs[newPos + 1])) {\n            newPos++;\n          }\n        } else {\n          newPos = start; // No move.\n        }\n      }\n\n      if (start < newPos && glyphs[newPos].shaperInfo.position !== POSITIONS.Pre_M) {\n        // Now go see if there's actually any matras...\n        for (let i = newPos; i > start; i--) {\n          if (glyphs[i - 1].shaperInfo.position === POSITIONS.Pre_M) {\n            let oldPos = i - 1;\n            if (oldPos < base && base <= newPos) { // Shouldn't actually happen.\n              base--;\n            }\n\n            let tmp = glyphs[oldPos];\n            glyphs.splice(oldPos, 0, ...glyphs.splice(oldPos + 1, newPos - oldPos));\n            glyphs[newPos] = tmp;\n\n            newPos--;\n          }\n        }\n      }\n    }\n\n    // o Reorder reph:\n    //\n    // Reph’s original position is always at the beginning of the syllable,\n    // (i.e. it is not reordered at the character reordering stage). However,\n    // it will be reordered according to the basic-forms shaping results.\n    // Possible positions for reph, depending on the script, are; after main,\n    // before post-base consonant forms, and after post-base consonant forms.\n\n    // Two cases:\n    //\n    // - If repha is encoded as a sequence of characters (Ra,H or Ra,H,ZWJ), then\n    //   we should only move it if the sequence ligated to the repha form.\n    //\n    // - If repha is encoded separately and in the logical position, we should only\n    //   move it if it did NOT ligate.  If it ligated, it's probably the font trying\n    //   to make it work without the reordering.\n    if (start + 1 < end &&\n      glyphs[start].shaperInfo.position === POSITIONS.Ra_To_Become_Reph &&\n      (glyphs[start].shaperInfo.category === CATEGORIES.Repha) !== (glyphs[start].isLigated && !glyphs[start].isMultiplied)\n    ) {\n      let newRephPos;\n      let rephPos = indicConfig.rephPos;\n      let found = false;\n\n      // 1. If reph should be positioned after post-base consonant forms,\n      //    proceed to step 5.\n      if (rephPos !== POSITIONS.After_Post) {\n        //  2. If the reph repositioning class is not after post-base: target\n        //     position is after the first explicit halant glyph between the\n        //     first post-reph consonant and last main consonant. If ZWJ or ZWNJ\n        //     are following this halant, position is moved after it. If such\n        //     position is found, this is the target position. Otherwise,\n        //     proceed to the next step.\n        //\n        //     Note: in old-implementation fonts, where classifications were\n        //     fixed in shaping engine, there was no case where reph position\n        //     will be found on this step.\n        newRephPos = start + 1;\n        while (newRephPos < base && !isHalantOrCoeng(glyphs[newRephPos])) {\n          newRephPos++;\n        }\n\n        if (newRephPos < base && isHalantOrCoeng(glyphs[newRephPos])) {\n          // ->If ZWJ or ZWNJ are following this halant, position is moved after it.\n          if (newRephPos + 1 < base && isJoiner(glyphs[newRephPos + 1])) {\n            newRephPos++;\n          }\n\n          found = true;\n        }\n\n        // 3. If reph should be repositioned after the main consonant: find the\n        //    first consonant not ligated with main, or find the first\n        //    consonant that is not a potential pre-base reordering Ra.\n        if (!found && rephPos === POSITIONS.After_Main) {\n          newRephPos = base;\n          while (newRephPos + 1 < end && glyphs[newRephPos + 1].shaperInfo.position <= POSITIONS.After_Main) {\n            newRephPos++;\n          }\n\n          found = newRephPos < end;\n        }\n\n        // 4. If reph should be positioned before post-base consonant, find\n        //    first post-base classified consonant not ligated with main. If no\n        //    consonant is found, the target position should be before the\n        //    first matra, syllable modifier sign or vedic sign.\n        //\n        // This is our take on what step 4 is trying to say (and failing, BADLY).\n        if (!found && rephPos === POSITIONS.After_Sub) {\n          newRephPos = base;\n          while (newRephPos + 1 < end && !(glyphs[newRephPos + 1].shaperInfo.position & (POSITIONS.Post_C | POSITIONS.After_Post | POSITIONS.SMVD))) {\n            newRephPos++;\n          }\n\n          found = newRephPos < end;\n        }\n      }\n\n      //  5. If no consonant is found in steps 3 or 4, move reph to a position\n      //     immediately before the first post-base matra, syllable modifier\n      //     sign or vedic sign that has a reordering class after the intended\n      //     reph position. For example, if the reordering position for reph\n      //     is post-main, it will skip above-base matras that also have a\n      //     post-main position.\n      if (!found) {\n        // Copied from step 2.\n        newRephPos = start + 1;\n        while (newRephPos < base && !isHalantOrCoeng(glyphs[newRephPos])) {\n          newRephPos++;\n        }\n\n        if (newRephPos < base && isHalantOrCoeng(glyphs[newRephPos])) {\n          // ->If ZWJ or ZWNJ are following this halant, position is moved after it.\n          if (newRephPos + 1 < base && isJoiner(glyphs[newRephPos + 1])) {\n            newRephPos++;\n          }\n\n          found = true;\n        }\n      }\n\n      // 6. Otherwise, reorder reph to the end of the syllable.\n      if (!found) {\n        newRephPos = end - 1;\n        while (newRephPos > start && glyphs[newRephPos].shaperInfo.position === POSITIONS.SMVD) {\n          newRephPos--;\n        }\n\n        // If the Reph is to be ending up after a Matra,Halant sequence,\n        // position it before that Halant so it can interact with the Matra.\n        // However, if it's a plain Consonant,Halant we shouldn't do that.\n        // Uniscribe doesn't do this.\n        // TEST: U+0930,U+094D,U+0915,U+094B,U+094D\n        if (isHalantOrCoeng(glyphs[newRephPos])) {\n          for (let i = base + 1; i < newRephPos; i++) {\n            if (glyphs[i].shaperInfo.category === CATEGORIES.M) {\n              newRephPos--;\n            }\n          }\n        }\n      }\n\n      let reph = glyphs[start];\n      glyphs.splice(start, 0, ...glyphs.splice(start + 1, newRephPos - start));\n      glyphs[newRephPos] = reph;\n\n      if (start < base && base <= newRephPos) {\n        base--;\n      }\n    }\n\n    // o Reorder pre-base reordering consonants:\n    //\n    // If a pre-base reordering consonant is found, reorder it according to\n    // the following rules:\n    if (tryPref && base + 1 < end) {\n      for (let i = base + 1; i < end; i++) {\n        if (glyphs[i].features.pref) {\n           // 1. Only reorder a glyph produced by substitution during application\n           //    of the <pref> feature. (Note that a font may shape a Ra consonant with\n           //    the feature generally but block it in certain contexts.)\n\n          // Note: We just check that something got substituted.  We don't check that\n          // the <pref> feature actually did it...\n          //\n          // Reorder pref only if it ligated.\n          if (glyphs[i].isLigated && !glyphs[i].isMultiplied) {\n            // 2. Try to find a target position the same way as for pre-base matra.\n            //    If it is found, reorder pre-base consonant glyph.\n            //\n            // 3. If position is not found, reorder immediately before main\n            //    consonant.\n            let newPos = base;\n\n            // Malayalam / Tamil do not have \"half\" forms or explicit virama forms.\n            // The glyphs formed by 'half' are Chillus or ligated explicit viramas.\n            // We want to position matra after them.\n            if (plan.unicodeScript !== 'Malayalam' && plan.unicodeScript !== 'Tamil') {\n              while (newPos > start && !(glyphs[newPos - 1].shaperInfo.category & (CATEGORIES.M | HALANT_OR_COENG_FLAGS))) {\n                newPos--;\n              }\n\n              // In Khmer coeng model, a H,Ra can go *after* matras.  If it goes after a\n              // split matra, it should be reordered to *before* the left part of such matra.\n              if (newPos > start && glyphs[newPos - 1].shaperInfo.category === CATEGORIES.M) {\n                let oldPos = i;\n                for (let j = base + 1; j < oldPos; j++) {\n                  if (glyphs[j].shaperInfo.category === CATEGORIES.M) {\n                    newPos--;\n                    break;\n                  }\n                }\n              }\n            }\n\n            if (newPos > start && isHalantOrCoeng(glyphs[newPos - 1])) {\n              // -> If ZWJ or ZWNJ follow this halant, position is moved after it.\n              if (newPos < end && isJoiner(glyphs[newPos])) {\n                newPos++;\n              }\n            }\n\n            let oldPos = i;\n            let tmp = glyphs[oldPos];\n            glyphs.splice(newPos + 1, 0, ...glyphs.splice(newPos, oldPos - newPos));\n            glyphs[newPos] = tmp;\n\n            if (newPos <= base && base < oldPos) {\n              base++;\n            }\n          }\n\n          break;\n        }\n      }\n    }\n\n    // Apply 'init' to the Left Matra if it's a word start.\n    if (glyphs[start].shaperInfo.position === POSITIONS.Pre_M && (!start || !/Cf|Mn/.test(getCategory(glyphs[start - 1].codePoints[0])))) {\n      glyphs[start].features.init = true;\n    }\n  }\n}\n\nfunction nextSyllable(glyphs, start) {\n  if (start >= glyphs.length) return start;\n  let syllable = glyphs[start].shaperInfo.syllable;\n  while (++start < glyphs.length && glyphs[start].shaperInfo.syllable === syllable);\n  return start;\n}\n", "{\"stateTable\":[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,2,3,4,5,6,7,8,9,0,10,11,11,12,13,14,15,16,17],[0,0,0,18,19,20,21,22,23,0,24,0,0,25,26,0,0,27,0],[0,0,0,28,29,30,31,32,33,0,34,0,0,35,36,0,0,37,0],[0,0,0,38,5,7,7,8,9,0,10,0,0,0,13,0,0,16,0],[0,39,0,0,0,40,41,0,9,0,10,0,0,0,42,0,39,0,0],[0,0,0,0,43,44,44,8,9,0,0,0,0,12,43,0,0,0,0],[0,0,0,0,43,44,44,8,9,0,0,0,0,0,43,0,0,0,0],[0,0,0,45,46,47,48,49,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,0,50,0,0,51,0,10,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,52,0,0,0,0,0,0,0,0],[0,0,0,53,54,55,56,57,58,0,59,0,0,60,61,0,0,62,0],[0,0,0,4,5,7,7,8,9,0,10,0,0,0,13,0,0,16,0],[0,63,64,0,0,40,41,0,9,0,10,0,0,0,42,0,63,0,0],[0,2,3,4,5,6,7,8,9,0,10,11,11,12,13,0,2,16,0],[0,0,0,18,65,20,21,22,23,0,24,0,0,25,26,0,0,27,0],[0,0,0,0,66,67,67,8,9,0,10,0,0,0,68,0,0,0,0],[0,0,0,69,0,70,70,0,71,0,72,0,0,0,0,0,0,0,0],[0,0,0,73,19,74,74,22,23,0,24,0,0,0,26,0,0,27,0],[0,75,0,0,0,76,77,0,23,0,24,0,0,0,78,0,75,0,0],[0,0,0,0,79,80,80,22,23,0,0,0,0,25,79,0,0,0,0],[0,0,0,18,19,20,74,22,23,0,24,0,0,25,26,0,0,27,0],[0,0,0,81,82,83,84,85,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,0,0,86,0,0,87,0,24,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,88,0,0,0,0,0,0,0,0],[0,0,0,18,19,74,74,22,23,0,24,0,0,0,26,0,0,27,0],[0,89,90,0,0,76,77,0,23,0,24,0,0,0,78,0,89,0,0],[0,0,0,0,91,92,92,22,23,0,24,0,0,0,93,0,0,0,0],[0,0,0,94,29,95,31,32,33,0,34,0,0,0,36,0,0,37,0],[0,96,0,0,0,97,98,0,33,0,34,0,0,0,99,0,96,0,0],[0,0,0,0,100,101,101,32,33,0,0,0,0,35,100,0,0,0,0],[0,0,0,0,100,101,101,32,33,0,0,0,0,0,100,0,0,0,0],[0,0,0,102,103,104,105,106,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,0,0,107,0,0,108,0,34,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,109,0,0,0,0,0,0,0,0],[0,0,0,28,29,95,31,32,33,0,34,0,0,0,36,0,0,37,0],[0,110,111,0,0,97,98,0,33,0,34,0,0,0,99,0,110,0,0],[0,0,0,0,112,113,113,32,33,0,34,0,0,0,114,0,0,0,0],[0,0,0,0,5,7,7,8,9,0,10,0,0,0,13,0,0,16,0],[0,0,0,115,116,117,118,8,9,0,10,0,0,119,120,0,0,16,0],[0,0,0,0,0,121,121,0,9,0,10,0,0,0,42,0,0,0,0],[0,39,0,122,0,123,123,8,9,0,10,0,0,0,42,0,39,0,0],[0,124,64,0,0,0,0,0,0,0,0,0,0,0,0,0,124,0,0],[0,39,0,0,0,121,125,0,9,0,10,0,0,0,42,0,39,0,0],[0,0,0,0,0,126,126,8,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,46,47,48,49,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,0,47,47,49,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,0,127,127,49,9,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,128,127,127,49,9,0,0,0,0,0,0,0,0,0,0],[0,0,0,129,130,131,132,133,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0],[0,0,0,0,0,50,0,0,0,0,10,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,134,0,0,0,0,0,0,0,0],[0,0,0,135,54,56,56,57,58,0,59,0,0,0,61,0,0,62,0],[0,136,0,0,0,137,138,0,58,0,59,0,0,0,139,0,136,0,0],[0,0,0,0,140,141,141,57,58,0,0,0,0,60,140,0,0,0,0],[0,0,0,0,140,141,141,57,58,0,0,0,0,0,140,0,0,0,0],[0,0,0,142,143,144,145,146,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,0,0,147,0,0,148,0,59,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,149,0,0,0,0,0,0,0,0],[0,0,0,53,54,56,56,57,58,0,59,0,0,0,61,0,0,62,0],[0,150,151,0,0,137,138,0,58,0,59,0,0,0,139,0,150,0,0],[0,0,0,0,152,153,153,57,58,0,59,0,0,0,154,0,0,0,0],[0,0,0,155,116,156,157,8,9,0,10,0,0,158,120,0,0,16,0],[0,0,0,0,0,121,121,0,9,0,10,0,0,0,0,0,0,0,0],[0,75,3,4,5,159,160,8,161,0,162,0,11,12,163,0,75,16,0],[0,0,0,0,0,40,164,0,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,165,44,44,8,9,0,0,0,0,0,165,0,0,0,0],[0,124,64,0,0,40,164,0,9,0,10,0,0,0,42,0,124,0,0],[0,0,0,0,0,70,70,0,71,0,72,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,71,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,166,0,0,167,0,72,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,168,0,0,0,0,0,0,0,0],[0,0,0,0,19,74,74,22,23,0,24,0,0,0,26,0,0,27,0],[0,0,0,0,79,80,80,22,23,0,0,0,0,0,79,0,0,0,0],[0,0,0,169,170,171,172,22,23,0,24,0,0,173,174,0,0,27,0],[0,0,0,0,0,175,175,0,23,0,24,0,0,0,78,0,0,0,0],[0,75,0,176,0,177,177,22,23,0,24,0,0,0,78,0,75,0,0],[0,178,90,0,0,0,0,0,0,0,0,0,0,0,0,0,178,0,0],[0,75,0,0,0,175,179,0,23,0,24,0,0,0,78,0,75,0,0],[0,0,0,0,0,180,180,22,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,82,83,84,85,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,0,0,83,83,85,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,0,0,181,181,85,23,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,182,181,181,85,23,0,0,0,0,0,0,0,0,0,0],[0,0,0,183,184,185,186,187,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,0],[0,0,0,0,0,86,0,0,0,0,24,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,188,0,0,0,0,0,0,0,0],[0,0,0,189,170,190,191,22,23,0,24,0,0,192,174,0,0,27,0],[0,0,0,0,0,175,175,0,23,0,24,0,0,0,0,0,0,0,0],[0,0,0,0,0,76,193,0,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,0,194,80,80,22,23,0,0,0,0,0,194,0,0,0,0],[0,178,90,0,0,76,193,0,23,0,24,0,0,0,78,0,178,0,0],[0,0,0,0,29,95,31,32,33,0,34,0,0,0,36,0,0,37,0],[0,0,0,0,100,101,101,32,33,0,0,0,0,0,100,0,0,0,0],[0,0,0,195,196,197,198,32,33,0,34,0,0,199,200,0,0,37,0],[0,0,0,0,0,201,201,0,33,0,34,0,0,0,99,0,0,0,0],[0,96,0,202,0,203,203,32,33,0,34,0,0,0,99,0,96,0,0],[0,204,111,0,0,0,0,0,0,0,0,0,0,0,0,0,204,0,0],[0,96,0,0,0,201,205,0,33,0,34,0,0,0,99,0,96,0,0],[0,0,0,0,0,206,206,32,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,103,104,105,106,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,0,0,104,104,106,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,0,0,207,207,106,33,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,208,207,207,106,33,0,0,0,0,0,0,0,0,0,0],[0,0,0,209,210,211,212,213,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,34,0,0,0,0,0,0,0,0],[0,0,0,0,0,107,0,0,0,0,34,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,214,0,0,0,0,0,0,0,0],[0,0,0,215,196,216,217,32,33,0,34,0,0,218,200,0,0,37,0],[0,0,0,0,0,201,201,0,33,0,34,0,0,0,0,0,0,0,0],[0,0,0,0,0,97,219,0,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,0,220,101,101,32,33,0,0,0,0,0,220,0,0,0,0],[0,204,111,0,0,97,219,0,33,0,34,0,0,0,99,0,204,0,0],[0,0,0,221,116,222,222,8,9,0,10,0,0,0,120,0,0,16,0],[0,223,0,0,0,40,224,0,9,0,10,0,0,0,42,0,223,0,0],[0,0,0,0,225,44,44,8,9,0,0,0,0,119,225,0,0,0,0],[0,0,0,115,116,117,222,8,9,0,10,0,0,119,120,0,0,16,0],[0,0,0,115,116,222,222,8,9,0,10,0,0,0,120,0,0,16,0],[0,226,64,0,0,40,224,0,9,0,10,0,0,0,42,0,226,0,0],[0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0],[0,39,0,0,0,121,121,0,9,0,10,0,0,0,42,0,39,0,0],[0,0,0,0,0,44,44,8,9,0,0,0,0,0,0,0,0,0,0],[0,0,0,227,0,228,229,0,9,0,10,0,0,230,0,0,0,0,0],[0,39,0,122,0,121,121,0,9,0,10,0,0,0,42,0,39,0,0],[0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,231,231,49,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,232,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,130,131,132,133,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,0,131,131,133,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,0,233,233,133,9,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,234,233,233,133,9,0,0,0,0,0,0,0,0,0,0],[0,0,0,235,236,237,238,239,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,54,56,56,57,58,0,59,0,0,0,61,0,0,62,0],[0,0,0,240,241,242,243,57,58,0,59,0,0,244,245,0,0,62,0],[0,0,0,0,0,246,246,0,58,0,59,0,0,0,139,0,0,0,0],[0,136,0,247,0,248,248,57,58,0,59,0,0,0,139,0,136,0,0],[0,249,151,0,0,0,0,0,0,0,0,0,0,0,0,0,249,0,0],[0,136,0,0,0,246,250,0,58,0,59,0,0,0,139,0,136,0,0],[0,0,0,0,0,251,251,57,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,143,144,145,146,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,0,0,144,144,146,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,0,0,252,252,146,58,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,253,252,252,146,58,0,0,0,0,0,0,0,0,0,0],[0,0,0,254,255,256,257,258,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,59,0,0,0,0,0,0,0,0],[0,0,0,0,0,147,0,0,0,0,59,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,259,0,0,0,0,0,0,0,0],[0,0,0,260,241,261,262,57,58,0,59,0,0,263,245,0,0,62,0],[0,0,0,0,0,246,246,0,58,0,59,0,0,0,0,0,0,0,0],[0,0,0,0,0,137,264,0,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,0,265,141,141,57,58,0,0,0,0,0,265,0,0,0,0],[0,249,151,0,0,137,264,0,58,0,59,0,0,0,139,0,249,0,0],[0,0,0,221,116,222,222,8,9,0,10,0,0,0,120,0,0,16,0],[0,0,0,0,225,44,44,8,9,0,0,0,0,158,225,0,0,0,0],[0,0,0,155,116,156,222,8,9,0,10,0,0,158,120,0,0,16,0],[0,0,0,155,116,222,222,8,9,0,10,0,0,0,120,0,0,16,0],[0,0,0,0,43,266,266,8,161,0,24,0,0,12,267,0,0,0,0],[0,75,0,176,43,268,268,269,161,0,24,0,0,0,267,0,75,0,0],[0,0,0,0,0,270,0,0,271,0,162,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,272,0,0,0,0,0,0,0,0],[0,273,274,0,0,40,41,0,9,0,10,0,0,0,42,0,273,0,0],[0,0,0,40,0,123,123,8,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,0,121,275,0,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,72,0,0,0,0,0,0,0,0],[0,0,0,0,0,166,0,0,0,0,72,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,276,0,0,0,0,0,0,0,0],[0,0,0,277,170,278,278,22,23,0,24,0,0,0,174,0,0,27,0],[0,279,0,0,0,76,280,0,23,0,24,0,0,0,78,0,279,0,0],[0,0,0,0,281,80,80,22,23,0,0,0,0,173,281,0,0,0,0],[0,0,0,169,170,171,278,22,23,0,24,0,0,173,174,0,0,27,0],[0,0,0,169,170,278,278,22,23,0,24,0,0,0,174,0,0,27,0],[0,282,90,0,0,76,280,0,23,0,24,0,0,0,78,0,282,0,0],[0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,0],[0,75,0,0,0,175,175,0,23,0,24,0,0,0,78,0,75,0,0],[0,0,0,0,0,80,80,22,23,0,0,0,0,0,0,0,0,0,0],[0,0,0,283,0,284,285,0,23,0,24,0,0,286,0,0,0,0,0],[0,75,0,176,0,175,175,0,23,0,24,0,0,0,78,0,75,0,0],[0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,287,287,85,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,288,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,184,185,186,187,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,0,0,185,185,187,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,0,0,289,289,187,23,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,290,289,289,187,23,0,0,0,0,0,0,0,0,0,0],[0,0,0,291,292,293,294,295,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,277,170,278,278,22,23,0,24,0,0,0,174,0,0,27,0],[0,0,0,0,281,80,80,22,23,0,0,0,0,192,281,0,0,0,0],[0,0,0,189,170,190,278,22,23,0,24,0,0,192,174,0,0,27,0],[0,0,0,189,170,278,278,22,23,0,24,0,0,0,174,0,0,27,0],[0,0,0,76,0,177,177,22,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,0,0,175,296,0,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,297,196,298,298,32,33,0,34,0,0,0,200,0,0,37,0],[0,299,0,0,0,97,300,0,33,0,34,0,0,0,99,0,299,0,0],[0,0,0,0,301,101,101,32,33,0,0,0,0,199,301,0,0,0,0],[0,0,0,195,196,197,298,32,33,0,34,0,0,199,200,0,0,37,0],[0,0,0,195,196,298,298,32,33,0,34,0,0,0,200,0,0,37,0],[0,302,111,0,0,97,300,0,33,0,34,0,0,0,99,0,302,0,0],[0,0,0,0,0,0,0,0,33,0,0,0,0,0,0,0,0,0,0],[0,96,0,0,0,201,201,0,33,0,34,0,0,0,99,0,96,0,0],[0,0,0,0,0,101,101,32,33,0,0,0,0,0,0,0,0,0,0],[0,0,0,303,0,304,305,0,33,0,34,0,0,306,0,0,0,0,0],[0,96,0,202,0,201,201,0,33,0,34,0,0,0,99,0,96,0,0],[0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,307,307,106,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,308,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,210,211,212,213,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,0,0,211,211,213,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,0,0,309,309,213,33,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,310,309,309,213,33,0,0,0,0,0,0,0,0,0,0],[0,0,0,311,312,313,314,315,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,297,196,298,298,32,33,0,34,0,0,0,200,0,0,37,0],[0,0,0,0,301,101,101,32,33,0,0,0,0,218,301,0,0,0,0],[0,0,0,215,196,216,298,32,33,0,34,0,0,218,200,0,0,37,0],[0,0,0,215,196,298,298,32,33,0,34,0,0,0,200,0,0,37,0],[0,0,0,97,0,203,203,32,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,0,0,201,316,0,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,0,116,222,222,8,9,0,10,0,0,0,120,0,0,16,0],[0,0,0,0,225,44,44,8,9,0,0,0,0,0,225,0,0,0,0],[0,0,0,317,318,319,320,8,9,0,10,0,0,321,322,0,0,16,0],[0,223,0,323,0,123,123,8,9,0,10,0,0,0,42,0,223,0,0],[0,223,0,0,0,121,324,0,9,0,10,0,0,0,42,0,223,0,0],[0,0,0,325,318,326,327,8,9,0,10,0,0,328,322,0,0,16,0],[0,0,0,64,0,121,121,0,9,0,10,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,9,0,0,0,0,230,0,0,0,0,0],[0,0,0,227,0,228,121,0,9,0,10,0,0,230,0,0,0,0,0],[0,0,0,227,0,121,121,0,9,0,10,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,49,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,0,0],[0,0,0,0,0,329,329,133,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,330,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,236,237,238,239,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,0,237,237,239,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,0,331,331,239,9,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,332,331,331,239,9,0,0,0,0,0,0,0,0,0,0],[0,0,0,333,40,121,334,0,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,335,241,336,336,57,58,0,59,0,0,0,245,0,0,62,0],[0,337,0,0,0,137,338,0,58,0,59,0,0,0,139,0,337,0,0],[0,0,0,0,339,141,141,57,58,0,0,0,0,244,339,0,0,0,0],[0,0,0,240,241,242,336,57,58,0,59,0,0,244,245,0,0,62,0],[0,0,0,240,241,336,336,57,58,0,59,0,0,0,245,0,0,62,0],[0,340,151,0,0,137,338,0,58,0,59,0,0,0,139,0,340,0,0],[0,0,0,0,0,0,0,0,58,0,0,0,0,0,0,0,0,0,0],[0,136,0,0,0,246,246,0,58,0,59,0,0,0,139,0,136,0,0],[0,0,0,0,0,141,141,57,58,0,0,0,0,0,0,0,0,0,0],[0,0,0,341,0,342,343,0,58,0,59,0,0,344,0,0,0,0,0],[0,136,0,247,0,246,246,0,58,0,59,0,0,0,139,0,136,0,0],[0,0,0,0,0,0,0,57,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,345,345,146,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,346,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,255,256,257,258,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,0,0,256,256,258,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,0,0,347,347,258,58,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,348,347,347,258,58,0,0,0,0,0,0,0,0,0,0],[0,0,0,349,350,351,352,353,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,335,241,336,336,57,58,0,59,0,0,0,245,0,0,62,0],[0,0,0,0,339,141,141,57,58,0,0,0,0,263,339,0,0,0,0],[0,0,0,260,241,261,336,57,58,0,59,0,0,263,245,0,0,62,0],[0,0,0,260,241,336,336,57,58,0,59,0,0,0,245,0,0,62,0],[0,0,0,137,0,248,248,57,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,0,0,246,354,0,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,0,0,126,126,8,23,0,0,0,0,0,0,0,0,0,0],[0,355,90,0,0,121,125,0,9,0,10,0,0,0,42,0,355,0,0],[0,0,0,0,0,356,356,269,23,0,0,0,0,0,0,0,0,0,0],[0,0,0,357,358,359,360,361,161,0,162,0,0,0,362,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,162,0,0,0,0,0,0,0,0],[0,0,0,0,0,270,0,0,0,0,162,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,363,0,0,0,0,0,0,0,0],[0,0,0,364,116,365,366,8,161,0,162,0,0,367,120,0,0,16,0],[0,0,0,0,0,368,368,0,161,0,162,0,0,0,0,0,0,0,0],[0,0,0,40,0,121,121,0,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,170,278,278,22,23,0,24,0,0,0,174,0,0,27,0],[0,0,0,0,281,80,80,22,23,0,0,0,0,0,281,0,0,0,0],[0,0,0,369,370,371,372,22,23,0,24,0,0,373,374,0,0,27,0],[0,279,0,375,0,177,177,22,23,0,24,0,0,0,78,0,279,0,0],[0,279,0,0,0,175,376,0,23,0,24,0,0,0,78,0,279,0,0],[0,0,0,377,370,378,379,22,23,0,24,0,0,380,374,0,0,27,0],[0,0,0,90,0,175,175,0,23,0,24,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,23,0,0,0,0,286,0,0,0,0,0],[0,0,0,283,0,284,175,0,23,0,24,0,0,286,0,0,0,0,0],[0,0,0,283,0,175,175,0,23,0,24,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,85,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,0,0],[0,0,0,0,0,381,381,187,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,382,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,292,293,294,295,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,0,0,293,293,295,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,0,0,383,383,295,23,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,384,383,383,295,23,0,0,0,0,0,0,0,0,0,0],[0,0,0,385,76,175,386,0,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,76,0,175,175,0,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,0,196,298,298,32,33,0,34,0,0,0,200,0,0,37,0],[0,0,0,0,301,101,101,32,33,0,0,0,0,0,301,0,0,0,0],[0,0,0,387,388,389,390,32,33,0,34,0,0,391,392,0,0,37,0],[0,299,0,393,0,203,203,32,33,0,34,0,0,0,99,0,299,0,0],[0,299,0,0,0,201,394,0,33,0,34,0,0,0,99,0,299,0,0],[0,0,0,395,388,396,397,32,33,0,34,0,0,398,392,0,0,37,0],[0,0,0,111,0,201,201,0,33,0,34,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,33,0,0,0,0,306,0,0,0,0,0],[0,0,0,303,0,304,201,0,33,0,34,0,0,306,0,0,0,0,0],[0,0,0,303,0,201,201,0,33,0,34,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,106,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,0,0],[0,0,0,0,0,399,399,213,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,400,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,312,313,314,315,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,0,0,313,313,315,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,0,0,401,401,315,33,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,402,401,401,315,33,0,0,0,0,0,0,0,0,0,0],[0,0,0,403,97,201,404,0,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,97,0,201,201,0,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,405,318,406,406,8,9,0,10,0,0,0,322,0,0,16,0],[0,407,0,0,0,40,408,0,9,0,10,0,0,0,42,0,407,0,0],[0,0,0,0,409,44,44,8,9,0,0,0,0,321,409,0,0,0,0],[0,0,0,317,318,319,406,8,9,0,10,0,0,321,322,0,0,16,0],[0,0,0,317,318,406,406,8,9,0,10,0,0,0,322,0,0,16,0],[0,410,64,0,0,40,408,0,9,0,10,0,0,0,42,0,410,0,0],[0,223,0,0,0,121,121,0,9,0,10,0,0,0,42,0,223,0,0],[0,223,0,323,0,121,121,0,9,0,10,0,0,0,42,0,223,0,0],[0,0,0,405,318,406,406,8,9,0,10,0,0,0,322,0,0,16,0],[0,0,0,0,409,44,44,8,9,0,0,0,0,328,409,0,0,0,0],[0,0,0,325,318,326,406,8,9,0,10,0,0,328,322,0,0,16,0],[0,0,0,325,318,406,406,8,9,0,10,0,0,0,322,0,0,16,0],[0,0,0,0,0,0,0,133,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,130,0,0],[0,0,0,0,0,411,411,239,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,412,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,40,121,334,0,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,413,0,0,0,9,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,241,336,336,57,58,0,59,0,0,0,245,0,0,62,0],[0,0,0,0,339,141,141,57,58,0,0,0,0,0,339,0,0,0,0],[0,0,0,414,415,416,417,57,58,0,59,0,0,418,419,0,0,62,0],[0,337,0,420,0,248,248,57,58,0,59,0,0,0,139,0,337,0,0],[0,337,0,0,0,246,421,0,58,0,59,0,0,0,139,0,337,0,0],[0,0,0,422,415,423,424,57,58,0,59,0,0,425,419,0,0,62,0],[0,0,0,151,0,246,246,0,58,0,59,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,58,0,0,0,0,344,0,0,0,0,0],[0,0,0,341,0,342,246,0,58,0,59,0,0,344,0,0,0,0,0],[0,0,0,341,0,246,246,0,58,0,59,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,146,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,143,0,0],[0,0,0,0,0,426,426,258,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,427,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,350,351,352,353,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,0,0,351,351,353,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,0,0,428,428,353,58,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,429,428,428,353,58,0,0,0,0,0,0,0,0,0,0],[0,0,0,430,137,246,431,0,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,137,0,246,246,0,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,432,116,433,434,8,161,0,162,0,0,435,120,0,0,16,0],[0,0,0,0,0,180,180,269,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,358,359,360,361,161,0,162,0,0,0,362,0,0,0,0],[0,0,0,0,0,359,359,361,161,0,162,0,0,0,362,0,0,0,0],[0,0,0,0,0,436,436,361,161,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,437,436,436,361,161,0,0,0,0,0,0,0,0,0,0],[0,0,0,438,439,440,441,442,161,0,162,0,0,0,362,0,0,0,0],[0,443,274,0,0,0,0,0,0,0,0,0,0,0,0,0,443,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,444,116,445,445,8,161,0,162,0,0,0,120,0,0,16,0],[0,0,0,0,225,44,44,8,161,0,0,0,0,367,225,0,0,0,0],[0,0,0,364,116,365,445,8,161,0,162,0,0,367,120,0,0,16,0],[0,0,0,364,116,445,445,8,161,0,162,0,0,0,120,0,0,16,0],[0,0,0,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0],[0,0,0,446,370,447,447,22,23,0,24,0,0,0,374,0,0,27,0],[0,448,0,0,0,76,449,0,23,0,24,0,0,0,78,0,448,0,0],[0,0,0,0,450,80,80,22,23,0,0,0,0,373,450,0,0,0,0],[0,0,0,369,370,371,447,22,23,0,24,0,0,373,374,0,0,27,0],[0,0,0,369,370,447,447,22,23,0,24,0,0,0,374,0,0,27,0],[0,451,90,0,0,76,449,0,23,0,24,0,0,0,78,0,451,0,0],[0,279,0,0,0,175,175,0,23,0,24,0,0,0,78,0,279,0,0],[0,279,0,375,0,175,175,0,23,0,24,0,0,0,78,0,279,0,0],[0,0,0,446,370,447,447,22,23,0,24,0,0,0,374,0,0,27,0],[0,0,0,0,450,80,80,22,23,0,0,0,0,380,450,0,0,0,0],[0,0,0,377,370,378,447,22,23,0,24,0,0,380,374,0,0,27,0],[0,0,0,377,370,447,447,22,23,0,24,0,0,0,374,0,0,27,0],[0,0,0,0,0,0,0,187,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,184,0,0],[0,0,0,0,0,452,452,295,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,453,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,76,175,386,0,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,0,454,0,0,0,23,0,0,0,0,0,0,0,0,0,0],[0,0,0,455,388,456,456,32,33,0,34,0,0,0,392,0,0,37,0],[0,457,0,0,0,97,458,0,33,0,34,0,0,0,99,0,457,0,0],[0,0,0,0,459,101,101,32,33,0,0,0,0,391,459,0,0,0,0],[0,0,0,387,388,389,456,32,33,0,34,0,0,391,392,0,0,37,0],[0,0,0,387,388,456,456,32,33,0,34,0,0,0,392,0,0,37,0],[0,460,111,0,0,97,458,0,33,0,34,0,0,0,99,0,460,0,0],[0,299,0,0,0,201,201,0,33,0,34,0,0,0,99,0,299,0,0],[0,299,0,393,0,201,201,0,33,0,34,0,0,0,99,0,299,0,0],[0,0,0,455,388,456,456,32,33,0,34,0,0,0,392,0,0,37,0],[0,0,0,0,459,101,101,32,33,0,0,0,0,398,459,0,0,0,0],[0,0,0,395,388,396,456,32,33,0,34,0,0,398,392,0,0,37,0],[0,0,0,395,388,456,456,32,33,0,34,0,0,0,392,0,0,37,0],[0,0,0,0,0,0,0,213,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,210,0,0],[0,0,0,0,0,461,461,315,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,462,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,97,201,404,0,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,0,463,0,0,0,33,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,318,406,406,8,9,0,10,0,0,0,322,0,0,16,0],[0,0,0,0,409,44,44,8,9,0,0,0,0,0,409,0,0,0,0],[0,0,0,464,465,466,467,8,9,0,10,0,0,468,469,0,0,16,0],[0,407,0,470,0,123,123,8,9,0,10,0,0,0,42,0,407,0,0],[0,407,0,0,0,121,471,0,9,0,10,0,0,0,42,0,407,0,0],[0,0,0,472,465,473,474,8,9,0,10,0,0,475,469,0,0,16,0],[0,0,0,0,0,0,0,239,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,236,0,0],[0,0,0,0,0,0,476,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,477,415,478,478,57,58,0,59,0,0,0,419,0,0,62,0],[0,479,0,0,0,137,480,0,58,0,59,0,0,0,139,0,479,0,0],[0,0,0,0,481,141,141,57,58,0,0,0,0,418,481,0,0,0,0],[0,0,0,414,415,416,478,57,58,0,59,0,0,418,419,0,0,62,0],[0,0,0,414,415,478,478,57,58,0,59,0,0,0,419,0,0,62,0],[0,482,151,0,0,137,480,0,58,0,59,0,0,0,139,0,482,0,0],[0,337,0,0,0,246,246,0,58,0,59,0,0,0,139,0,337,0,0],[0,337,0,420,0,246,246,0,58,0,59,0,0,0,139,0,337,0,0],[0,0,0,477,415,478,478,57,58,0,59,0,0,0,419,0,0,62,0],[0,0,0,0,481,141,141,57,58,0,0,0,0,425,481,0,0,0,0],[0,0,0,422,415,423,478,57,58,0,59,0,0,425,419,0,0,62,0],[0,0,0,422,415,478,478,57,58,0,59,0,0,0,419,0,0,62,0],[0,0,0,0,0,0,0,258,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0],[0,0,0,0,0,483,483,353,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,484,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,137,246,431,0,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,0,485,0,0,0,58,0,0,0,0,0,0,0,0,0,0],[0,0,0,444,116,445,445,8,161,0,162,0,0,0,120,0,0,16,0],[0,0,0,0,225,44,44,8,161,0,0,0,0,435,225,0,0,0,0],[0,0,0,432,116,433,445,8,161,0,162,0,0,435,120,0,0,16,0],[0,0,0,432,116,445,445,8,161,0,162,0,0,0,120,0,0,16,0],[0,0,0,0,0,486,486,361,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,487,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,439,440,441,442,161,0,162,0,0,0,362,0,0,0,0],[0,0,0,0,0,440,440,442,161,0,162,0,0,0,362,0,0,0,0],[0,0,0,0,0,488,488,442,161,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,489,488,488,442,161,0,0,0,0,0,0,0,0,0,0],[0,0,0,490,491,492,493,494,161,0,162,0,0,0,362,0,0,0,0],[0,0,0,495,0,496,497,0,161,0,162,0,0,498,0,0,0,0,0],[0,0,0,0,116,445,445,8,161,0,162,0,0,0,120,0,0,16,0],[0,0,0,0,225,44,44,8,161,0,0,0,0,0,225,0,0,0,0],[0,0,0,0,370,447,447,22,23,0,24,0,0,0,374,0,0,27,0],[0,0,0,0,450,80,80,22,23,0,0,0,0,0,450,0,0,0,0],[0,0,0,499,500,501,502,22,23,0,24,0,0,503,504,0,0,27,0],[0,448,0,505,0,177,177,22,23,0,24,0,0,0,78,0,448,0,0],[0,448,0,0,0,175,506,0,23,0,24,0,0,0,78,0,448,0,0],[0,0,0,507,500,508,509,22,23,0,24,0,0,510,504,0,0,27,0],[0,0,0,0,0,0,0,295,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,292,0,0],[0,0,0,0,0,0,511,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,388,456,456,32,33,0,34,0,0,0,392,0,0,37,0],[0,0,0,0,459,101,101,32,33,0,0,0,0,0,459,0,0,0,0],[0,0,0,512,513,514,515,32,33,0,34,0,0,516,517,0,0,37,0],[0,457,0,518,0,203,203,32,33,0,34,0,0,0,99,0,457,0,0],[0,457,0,0,0,201,519,0,33,0,34,0,0,0,99,0,457,0,0],[0,0,0,520,513,521,522,32,33,0,34,0,0,523,517,0,0,37,0],[0,0,0,0,0,0,0,315,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,312,0,0],[0,0,0,0,0,0,524,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,525,465,526,526,8,9,0,10,0,0,0,469,0,0,16,0],[0,527,0,0,0,40,528,0,9,0,10,0,0,0,42,0,527,0,0],[0,0,0,0,529,44,44,8,9,0,0,0,0,468,529,0,0,0,0],[0,0,0,464,465,466,526,8,9,0,10,0,0,468,469,0,0,16,0],[0,0,0,464,465,526,526,8,9,0,10,0,0,0,469,0,0,16,0],[0,530,64,0,0,40,528,0,9,0,10,0,0,0,42,0,530,0,0],[0,407,0,0,0,121,121,0,9,0,10,0,0,0,42,0,407,0,0],[0,407,0,470,0,121,121,0,9,0,10,0,0,0,42,0,407,0,0],[0,0,0,525,465,526,526,8,9,0,10,0,0,0,469,0,0,16,0],[0,0,0,0,529,44,44,8,9,0,0,0,0,475,529,0,0,0,0],[0,0,0,472,465,473,526,8,9,0,10,0,0,475,469,0,0,16,0],[0,0,0,472,465,526,526,8,9,0,10,0,0,0,469,0,0,16,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,0,0],[0,0,0,0,415,478,478,57,58,0,59,0,0,0,419,0,0,62,0],[0,0,0,0,481,141,141,57,58,0,0,0,0,0,481,0,0,0,0],[0,0,0,531,532,533,534,57,58,0,59,0,0,535,536,0,0,62,0],[0,479,0,537,0,248,248,57,58,0,59,0,0,0,139,0,479,0,0],[0,479,0,0,0,246,538,0,58,0,59,0,0,0,139,0,479,0,0],[0,0,0,539,532,540,541,57,58,0,59,0,0,542,536,0,0,62,0],[0,0,0,0,0,0,0,353,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,350,0,0],[0,0,0,0,0,0,543,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,361,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,358,0,0],[0,0,0,0,0,544,544,442,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,545,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,491,492,493,494,161,0,162,0,0,0,362,0,0,0,0],[0,0,0,0,0,492,492,494,161,0,162,0,0,0,362,0,0,0,0],[0,0,0,0,0,546,546,494,161,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,547,546,546,494,161,0,0,0,0,0,0,0,0,0,0],[0,0,0,548,549,368,550,0,161,0,162,0,0,0,362,0,0,0,0],[0,0,0,274,0,368,368,0,161,0,162,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,161,0,0,0,0,498,0,0,0,0,0],[0,0,0,495,0,496,368,0,161,0,162,0,0,498,0,0,0,0,0],[0,0,0,495,0,368,368,0,161,0,162,0,0,0,0,0,0,0,0],[0,0,0,551,500,552,552,22,23,0,24,0,0,0,504,0,0,27,0],[0,553,0,0,0,76,554,0,23,0,24,0,0,0,78,0,553,0,0],[0,0,0,0,555,80,80,22,23,0,0,0,0,503,555,0,0,0,0],[0,0,0,499,500,501,552,22,23,0,24,0,0,503,504,0,0,27,0],[0,0,0,499,500,552,552,22,23,0,24,0,0,0,504,0,0,27,0],[0,556,90,0,0,76,554,0,23,0,24,0,0,0,78,0,556,0,0],[0,448,0,0,0,175,175,0,23,0,24,0,0,0,78,0,448,0,0],[0,448,0,505,0,175,175,0,23,0,24,0,0,0,78,0,448,0,0],[0,0,0,551,500,552,552,22,23,0,24,0,0,0,504,0,0,27,0],[0,0,0,0,555,80,80,22,23,0,0,0,0,510,555,0,0,0,0],[0,0,0,507,500,508,552,22,23,0,24,0,0,510,504,0,0,27,0],[0,0,0,507,500,552,552,22,23,0,24,0,0,0,504,0,0,27,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76,0,0],[0,0,0,557,513,558,558,32,33,0,34,0,0,0,517,0,0,37,0],[0,559,0,0,0,97,560,0,33,0,34,0,0,0,99,0,559,0,0],[0,0,0,0,561,101,101,32,33,0,0,0,0,516,561,0,0,0,0],[0,0,0,512,513,514,558,32,33,0,34,0,0,516,517,0,0,37,0],[0,0,0,512,513,558,558,32,33,0,34,0,0,0,517,0,0,37,0],[0,562,111,0,0,97,560,0,33,0,34,0,0,0,99,0,562,0,0],[0,457,0,0,0,201,201,0,33,0,34,0,0,0,99,0,457,0,0],[0,457,0,518,0,201,201,0,33,0,34,0,0,0,99,0,457,0,0],[0,0,0,557,513,558,558,32,33,0,34,0,0,0,517,0,0,37,0],[0,0,0,0,561,101,101,32,33,0,0,0,0,523,561,0,0,0,0],[0,0,0,520,513,521,558,32,33,0,34,0,0,523,517,0,0,37,0],[0,0,0,520,513,558,558,32,33,0,34,0,0,0,517,0,0,37,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,97,0,0],[0,0,0,0,465,526,526,8,9,0,10,0,0,0,469,0,0,16,0],[0,0,0,0,529,44,44,8,9,0,0,0,0,0,529,0,0,0,0],[0,0,0,563,66,564,565,8,9,0,10,0,0,566,68,0,0,16,0],[0,527,0,567,0,123,123,8,9,0,10,0,0,0,42,0,527,0,0],[0,527,0,0,0,121,568,0,9,0,10,0,0,0,42,0,527,0,0],[0,0,0,569,66,570,571,8,9,0,10,0,0,572,68,0,0,16,0],[0,0,0,573,532,574,574,57,58,0,59,0,0,0,536,0,0,62,0],[0,575,0,0,0,137,576,0,58,0,59,0,0,0,139,0,575,0,0],[0,0,0,0,577,141,141,57,58,0,0,0,0,535,577,0,0,0,0],[0,0,0,531,532,533,574,57,58,0,59,0,0,535,536,0,0,62,0],[0,0,0,531,532,574,574,57,58,0,59,0,0,0,536,0,0,62,0],[0,578,151,0,0,137,576,0,58,0,59,0,0,0,139,0,578,0,0],[0,479,0,0,0,246,246,0,58,0,59,0,0,0,139,0,479,0,0],[0,479,0,537,0,246,246,0,58,0,59,0,0,0,139,0,479,0,0],[0,0,0,573,532,574,574,57,58,0,59,0,0,0,536,0,0,62,0],[0,0,0,0,577,141,141,57,58,0,0,0,0,542,577,0,0,0,0],[0,0,0,539,532,540,574,57,58,0,59,0,0,542,536,0,0,62,0],[0,0,0,539,532,574,574,57,58,0,59,0,0,0,536,0,0,62,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,137,0,0],[0,0,0,0,0,0,0,442,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,439,0,0],[0,0,0,0,0,579,579,494,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,580,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,549,368,550,0,161,0,162,0,0,0,362,0,0,0,0],[0,0,0,0,0,368,368,0,161,0,162,0,0,0,362,0,0,0,0],[0,0,0,0,581,0,0,0,161,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,500,552,552,22,23,0,24,0,0,0,504,0,0,27,0],[0,0,0,0,555,80,80,22,23,0,0,0,0,0,555,0,0,0,0],[0,0,0,582,91,583,584,22,23,0,24,0,0,585,93,0,0,27,0],[0,553,0,586,0,177,177,22,23,0,24,0,0,0,78,0,553,0,0],[0,553,0,0,0,175,587,0,23,0,24,0,0,0,78,0,553,0,0],[0,0,0,588,91,589,590,22,23,0,24,0,0,591,93,0,0,27,0],[0,0,0,0,513,558,558,32,33,0,34,0,0,0,517,0,0,37,0],[0,0,0,0,561,101,101,32,33,0,0,0,0,0,561,0,0,0,0],[0,0,0,592,112,593,594,32,33,0,34,0,0,595,114,0,0,37,0],[0,559,0,596,0,203,203,32,33,0,34,0,0,0,99,0,559,0,0],[0,559,0,0,0,201,597,0,33,0,34,0,0,0,99,0,559,0,0],[0,0,0,598,112,599,600,32,33,0,34,0,0,601,114,0,0,37,0],[0,0,0,602,66,67,67,8,9,0,10,0,0,0,68,0,0,16,0],[0,0,0,0,165,44,44,8,9,0,0,0,0,566,165,0,0,0,0],[0,0,0,563,66,564,67,8,9,0,10,0,0,566,68,0,0,16,0],[0,0,0,563,66,67,67,8,9,0,10,0,0,0,68,0,0,16,0],[0,527,0,0,0,121,121,0,9,0,10,0,0,0,42,0,527,0,0],[0,527,0,567,0,121,121,0,9,0,10,0,0,0,42,0,527,0,0],[0,0,0,602,66,67,67,8,9,0,10,0,0,0,68,0,0,16,0],[0,0,0,0,165,44,44,8,9,0,0,0,0,572,165,0,0,0,0],[0,0,0,569,66,570,67,8,9,0,10,0,0,572,68,0,0,16,0],[0,0,0,569,66,67,67,8,9,0,10,0,0,0,68,0,0,16,0],[0,0,0,0,532,574,574,57,58,0,59,0,0,0,536,0,0,62,0],[0,0,0,0,577,141,141,57,58,0,0,0,0,0,577,0,0,0,0],[0,0,0,603,152,604,605,57,58,0,59,0,0,606,154,0,0,62,0],[0,575,0,607,0,248,248,57,58,0,59,0,0,0,139,0,575,0,0],[0,575,0,0,0,246,608,0,58,0,59,0,0,0,139,0,575,0,0],[0,0,0,609,152,610,611,57,58,0,59,0,0,612,154,0,0,62,0],[0,0,0,0,0,0,0,494,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,491,0,0],[0,0,0,0,0,0,613,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,614,91,92,92,22,23,0,24,0,0,0,93,0,0,27,0],[0,0,0,0,194,80,80,22,23,0,0,0,0,585,194,0,0,0,0],[0,0,0,582,91,583,92,22,23,0,24,0,0,585,93,0,0,27,0],[0,0,0,582,91,92,92,22,23,0,24,0,0,0,93,0,0,27,0],[0,553,0,0,0,175,175,0,23,0,24,0,0,0,78,0,553,0,0],[0,553,0,586,0,175,175,0,23,0,24,0,0,0,78,0,553,0,0],[0,0,0,614,91,92,92,22,23,0,24,0,0,0,93,0,0,27,0],[0,0,0,0,194,80,80,22,23,0,0,0,0,591,194,0,0,0,0],[0,0,0,588,91,589,92,22,23,0,24,0,0,591,93,0,0,27,0],[0,0,0,588,91,92,92,22,23,0,24,0,0,0,93,0,0,27,0],[0,0,0,615,112,113,113,32,33,0,34,0,0,0,114,0,0,37,0],[0,0,0,0,220,101,101,32,33,0,0,0,0,595,220,0,0,0,0],[0,0,0,592,112,593,113,32,33,0,34,0,0,595,114,0,0,37,0],[0,0,0,592,112,113,113,32,33,0,34,0,0,0,114,0,0,37,0],[0,559,0,0,0,201,201,0,33,0,34,0,0,0,99,0,559,0,0],[0,559,0,596,0,201,201,0,33,0,34,0,0,0,99,0,559,0,0],[0,0,0,615,112,113,113,32,33,0,34,0,0,0,114,0,0,37,0],[0,0,0,0,220,101,101,32,33,0,0,0,0,601,220,0,0,0,0],[0,0,0,598,112,599,113,32,33,0,34,0,0,601,114,0,0,37,0],[0,0,0,598,112,113,113,32,33,0,34,0,0,0,114,0,0,37,0],[0,0,0,0,66,67,67,8,9,0,10,0,0,0,68,0,0,16,0],[0,0,0,616,152,153,153,57,58,0,59,0,0,0,154,0,0,62,0],[0,0,0,0,265,141,141,57,58,0,0,0,0,606,265,0,0,0,0],[0,0,0,603,152,604,153,57,58,0,59,0,0,606,154,0,0,62,0],[0,0,0,603,152,153,153,57,58,0,59,0,0,0,154,0,0,62,0],[0,575,0,0,0,246,246,0,58,0,59,0,0,0,139,0,575,0,0],[0,575,0,607,0,246,246,0,58,0,59,0,0,0,139,0,575,0,0],[0,0,0,616,152,153,153,57,58,0,59,0,0,0,154,0,0,62,0],[0,0,0,0,265,141,141,57,58,0,0,0,0,612,265,0,0,0,0],[0,0,0,609,152,610,153,57,58,0,59,0,0,612,154,0,0,62,0],[0,0,0,609,152,153,153,57,58,0,59,0,0,0,154,0,0,62,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,549,0,0],[0,0,0,0,91,92,92,22,23,0,24,0,0,0,93,0,0,27,0],[0,0,0,0,112,113,113,32,33,0,34,0,0,0,114,0,0,37,0],[0,0,0,0,152,153,153,57,58,0,59,0,0,0,154,0,0,62,0]],\"accepting\":[false,true,true,true,true,true,false,false,true,true,true,true,true,true,true,true,true,true,true,true,false,true,true,true,true,true,true,true,true,true,false,true,true,true,true,true,true,true,true,true,true,true,false,true,false,true,true,false,false,true,true,true,true,true,true,false,false,true,true,true,true,true,true,true,true,true,true,false,true,true,false,true,true,true,false,true,true,true,false,true,false,true,true,false,false,true,true,true,true,true,true,true,false,true,true,false,true,true,true,false,true,false,true,true,false,false,true,true,true,true,true,true,true,false,true,true,true,false,true,true,true,false,true,false,true,true,false,false,false,true,true,false,false,true,true,true,true,true,true,false,true,false,true,true,false,false,true,true,true,true,true,true,true,false,true,true,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,true,true,true,false,true,false,true,true,false,false,false,true,true,false,false,true,true,true,false,true,true,true,true,true,true,false,true,true,true,false,true,false,true,true,false,false,false,true,true,false,false,true,true,true,false,true,true,true,true,true,false,true,true,true,true,true,false,true,true,false,false,false,false,true,true,false,false,true,true,true,false,true,true,true,false,true,false,true,true,false,false,false,true,true,false,false,true,true,true,false,true,true,true,true,false,true,false,true,true,true,true,true,true,true,true,true,false,true,true,true,true,true,false,true,true,false,false,false,false,true,true,false,false,true,true,true,false,true,true,true,true,true,false,true,true,false,false,false,false,true,true,false,false,true,true,true,true,false,true,true,true,true,true,true,false,true,true,false,false,false,false,true,false,true,false,true,true,true,true,true,false,true,true,false,false,false,false,true,true,false,false,true,true,true,false,true,true,false,false,true,false,true,true,false,true,true,false,true,true,false,true,true,true,true,true,true,false,true,true,false,false,false,false,true,false,true,true,false,true,true,true,true,true,true,false,true,true,false,false,false,false,true,false,true,false,true,true,true,true,false,false,false,true,true,false,true,true,true,true,true,true,false,true,true,false,false,false,false,true,false,true,false,true,true,false,false,true,true,false,false,true,true,true,false,true,false,true,true,true,true,false,false,false,true,false,true,true,true,true,false,false,false,true,true,false,true,true,true,true,true,true,false,true,true,false,true,false,true,true,true,true,false,false,false,false,false,false,false,true,true,false,false,true,true,false,true,true,true,true,false,true,true,true,true,true,true,false,true,true,false,true,true,false,true,true,true,true,true,true,false,true,true,false,true,false,true,true,true,true,true,true,false,true,true,true,true,true,true,false,true,true,false,false,false,false,false,true,true,false,true,false,true,true,true,true,true,false,true,true,true,true,true,false,true,true,true,true,true,false,true,true,true,false,true,true,true,true,false,false,false,true,false,true,true,true,true,true,false,true,true,true,false,true,true,true,true,true,false,true,true,true,true,false,true,true,true,true,true,false,true,true,false,true,true,true],\"tags\":[[],[\"broken_cluster\"],[\"consonant_syllable\"],[\"vowel_syllable\"],[\"broken_cluster\"],[\"broken_cluster\"],[],[],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"standalone_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"consonant_syllable\"],[\"broken_cluster\"],[\"symbol_cluster\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[],[],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"symbol_cluster\"],[],[\"symbol_cluster\"],[\"symbol_cluster\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"broken_cluster\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[],[],[],[\"broken_cluster\"],[\"broken_cluster\"],[],[],[\"broken_cluster\"],[\"broken_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"symbol_cluster\"],[\"symbol_cluster\"],[\"symbol_cluster\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[],[],[],[],[\"broken_cluster\"],[\"broken_cluster\"],[],[],[\"broken_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[\"broken_cluster\"],[],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[\"broken_cluster\"],[\"symbol_cluster\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[],[],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[],[],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"broken_cluster\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[],[],[],[],[\"broken_cluster\"],[],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[],[],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[],[],[\"consonant_syllable\",\"broken_cluster\"],[],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[],[],[],[\"consonant_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[],[],[],[\"vowel_syllable\"],[],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[],[],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[],[],[],[\"standalone_cluster\"],[],[\"consonant_syllable\",\"broken_cluster\"],[],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[],[],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[],[],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[],[],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[],[],[\"broken_cluster\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[],[],[],[],[],[],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[],[],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[],[],[],[],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[],[],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"broken_cluster\"],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[\"consonant_syllable\"],[\"vowel_syllable\"],[\"standalone_cluster\"]]}", "{\"categories\":[\"O\",\"IND\",\"S\",\"GB\",\"B\",\"FM\",\"CGJ\",\"VMAbv\",\"VMPst\",\"VAbv\",\"VPst\",\"CMBlw\",\"VPre\",\"VBlw\",\"H\",\"VMBlw\",\"CMAbv\",\"MBlw\",\"CS\",\"R\",\"SUB\",\"MPst\",\"MPre\",\"FAbv\",\"FPst\",\"FBlw\",\"null\",\"SMAbv\",\"SMBlw\",\"VMPre\",\"ZWNJ\",\"ZWJ\",\"WJ\",\"M\",\"VS\",\"N\",\"HN\",\"MAbv\"],\"decompositions\":{\"2507\":[2503,2494],\"2508\":[2503,2519],\"2888\":[2887,2902],\"2891\":[2887,2878],\"2892\":[2887,2903],\"3018\":[3014,3006],\"3019\":[3015,3006],\"3020\":[3014,3031],\"3144\":[3142,3158],\"3264\":[3263,3285],\"3271\":[3270,3285],\"3272\":[3270,3286],\"3274\":[3270,3266],\"3275\":[3270,3266,3285],\"3402\":[3398,3390],\"3403\":[3399,3390],\"3404\":[3398,3415],\"3546\":[3545,3530],\"3548\":[3545,3535],\"3549\":[3545,3535,3530],\"3550\":[3545,3551],\"3635\":[3661,3634],\"3763\":[3789,3762],\"3955\":[3953,3954],\"3957\":[3953,3956],\"3958\":[4018,3968],\"3959\":[4018,3953,3968],\"3960\":[4019,3968],\"3961\":[4019,3953,3968],\"3969\":[3953,3968],\"6971\":[6970,6965],\"6973\":[6972,6965],\"6976\":[6974,6965],\"6977\":[6975,6965],\"6979\":[6978,6965],\"69934\":[69937,69927],\"69935\":[69938,69927],\"70475\":[70471,70462],\"70476\":[70471,70487],\"70843\":[70841,70842],\"70844\":[70841,70832],\"70846\":[70841,70845],\"71098\":[71096,71087],\"71099\":[71097,71087]},\"stateTable\":[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,3,4,4,5,0,6,7,8,9,10,11,12,13,14,15,16,0,17,18,11,19,20,21,22,0,0,0,23,0,0,2,0,0,24,0,25],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,28,0,0,0,0,0,27,0,0,0],[0,0,0,0,0,29,0,30,31,32,33,34,35,36,37,38,39,40,0,0,41,35,42,43,44,45,0,0,0,46,0,0,0,0,39,0,0,47],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,5,0,6,7,0,0,0,0,0,0,14,0,0,0,0,0,0,0,20,21,22,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,5,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,22,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,5,0,6,7,8,9,0,0,12,0,14,0,0,0,0,0,0,0,20,21,22,0,0,0,23,0,0,0,0,0,0,0,0],[0,0,0,0,0,5,0,6,7,0,9,0,0,0,0,14,0,0,0,0,0,0,0,20,21,22,0,0,0,23,0,0,0,0,0,0,0,0],[0,0,0,0,0,5,0,6,7,8,9,10,11,12,13,14,0,16,0,0,18,11,19,20,21,22,0,0,0,23,0,0,0,0,0,0,0,25],[0,0,0,0,0,5,0,6,7,8,9,0,11,12,0,14,0,0,0,0,0,0,0,20,21,22,0,0,0,23,0,0,0,0,0,0,0,0],[0,0,0,0,0,5,0,6,7,0,9,0,0,12,0,14,0,0,0,0,0,0,0,20,21,22,0,0,0,23,0,0,0,0,0,0,0,0],[0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,5,0,0,7,0,0,0,0,0,0,14,0,0,0,0,0,0,0,20,21,22,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,5,0,6,7,8,9,10,11,12,13,14,15,16,0,0,18,11,19,20,21,22,0,0,0,23,0,0,0,0,0,0,0,25],[0,0,0,0,0,5,0,6,7,8,9,0,11,12,0,14,0,0,0,0,0,11,0,20,21,22,0,0,0,23,0,0,0,0,0,0,0,0],[0,0,0,4,4,5,0,6,7,8,9,10,11,12,13,14,15,16,0,0,18,11,19,20,21,22,0,0,0,23,0,0,0,0,0,0,0,25],[0,0,0,0,0,5,0,6,7,8,9,48,11,12,13,14,48,16,0,0,18,11,19,20,21,22,0,0,0,23,0,0,0,0,49,0,0,25],[0,0,0,0,0,5,0,6,7,8,9,0,11,12,0,14,0,16,0,0,0,11,0,20,21,22,0,0,0,23,0,0,0,0,0,0,0,25],[0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,22,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,22,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,5,0,6,7,0,0,0,0,0,0,14,0,0,0,0,0,0,0,20,21,22,0,0,0,23,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,0,51,0],[0,0,0,0,0,5,0,6,7,8,9,0,11,12,0,14,0,16,0,0,0,11,0,20,21,22,0,0,0,23,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,28,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,29,0,30,31,0,0,0,0,0,0,38,0,0,0,0,0,0,0,43,44,45,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,29,0,0,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,43,44,45,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,29,0,30,31,32,33,0,0,36,0,38,0,0,0,0,0,0,0,43,44,45,0,0,0,46,0,0,0,0,0,0,0,0],[0,0,0,0,0,29,0,30,31,0,33,0,0,0,0,38,0,0,0,0,0,0,0,43,44,45,0,0,0,46,0,0,0,0,0,0,0,0],[0,0,0,0,0,29,0,30,31,32,33,34,35,36,37,38,0,40,0,0,41,35,42,43,44,45,0,0,0,46,0,0,0,0,0,0,0,47],[0,0,0,0,0,29,0,30,31,32,33,0,35,36,0,38,0,0,0,0,0,0,0,43,44,45,0,0,0,46,0,0,0,0,0,0,0,0],[0,0,0,0,0,29,0,30,31,0,33,0,0,36,0,38,0,0,0,0,0,0,0,43,44,45,0,0,0,46,0,0,0,0,0,0,0,0],[0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,29,0,0,31,0,0,0,0,0,0,38,0,0,0,0,0,0,0,43,44,45,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,29,0,30,31,32,33,34,35,36,37,38,39,40,0,0,41,35,42,43,44,45,0,0,0,46,0,0,0,0,0,0,0,47],[0,0,0,0,0,29,0,30,31,32,33,0,35,36,0,38,0,0,0,0,0,35,0,43,44,45,0,0,0,46,0,0,0,0,0,0,0,0],[0,0,0,0,0,29,0,30,31,32,33,52,35,36,37,38,52,40,0,0,41,35,42,43,44,45,0,0,0,46,0,0,0,0,53,0,0,47],[0,0,0,0,0,29,0,30,31,32,33,0,35,36,0,38,0,40,0,0,0,35,0,43,44,45,0,0,0,46,0,0,0,0,0,0,0,47],[0,0,0,0,0,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,43,44,45,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,45,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,29,0,30,31,0,0,0,0,0,0,38,0,0,0,0,0,0,0,43,44,45,0,0,0,46,0,0,0,0,0,0,0,0],[0,0,0,0,0,29,0,30,31,32,33,0,35,36,0,38,0,40,0,0,0,35,0,43,44,45,0,0,0,46,0,0,0,0,0,0,0,0],[0,0,0,0,0,5,0,6,7,8,9,48,11,12,13,14,0,16,0,0,18,11,19,20,21,22,0,0,0,23,0,0,0,0,0,0,0,25],[0,0,0,0,0,5,0,6,7,8,9,48,11,12,13,14,48,16,0,0,18,11,19,20,21,22,0,0,0,23,0,0,0,0,0,0,0,25],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,0,0],[0,0,0,0,0,29,0,30,31,32,33,52,35,36,37,38,0,40,0,0,41,35,42,43,44,45,0,0,0,46,0,0,0,0,0,0,0,47],[0,0,0,0,0,29,0,30,31,32,33,52,35,36,37,38,52,40,0,0,41,35,42,43,44,45,0,0,0,46,0,0,0,0,0,0,0,47],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,0,51,0]],\"accepting\":[false,true,true,true,true,true,true,true,true,true,true,true,true,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],\"tags\":[[],[\"broken_cluster\"],[\"independent_cluster\"],[\"symbol_cluster\"],[\"standard_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"numeral_cluster\"],[\"broken_cluster\"],[\"independent_cluster\"],[\"symbol_cluster\"],[\"symbol_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"virama_terminated_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"numeral_cluster\"],[\"number_joiner_terminated_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"numeral_cluster\"]]}", "// Cateories used in the OpenType spec:\n// https://www.microsoft.com/typography/otfntdev/devanot/shaping.aspx\nexport const CATEGORIES = {\n  X: 1 << 0,\n  C: 1 << 1,\n  V: 1 << 2,\n  N: 1 << 3,\n  H: 1 << 4,\n  ZWNJ: 1 << 5,\n  ZWJ: 1 << 6,\n  M: 1 << 7,\n  SM: 1 << 8,\n  VD: 1 << 9,\n  A: 1 << 10,\n  Placeholder: 1 << 11,\n  Dotted_Circle: 1 << 12,\n  RS: 1 << 13,    // Register Shifter, used in Khmer OT spec.\n  Coeng: 1 << 14, // Khmer-style Virama.\n  Repha: 1 << 15, // Atomically-encoded logical or visual repha.\n  Ra: 1 << 16,\n  CM: 1 << 17,    // Consonant-Medial.\n  Symbol: 1 << 18 // Avagraha, etc that take marks (SM,A,VD).\n};\n\n// Visual positions in a syllable from left to right.\nexport const POSITIONS = {\n  Start: 1 << 0,\n\n  Ra_To_Become_Reph: 1 << 1,\n  Pre_M: 1 << 2,\n  Pre_C: 1 << 3,\n\n  Base_C: 1 << 4,\n  After_Main: 1 << 5,\n\n  Above_C: 1 << 6,\n\n  Before_Sub: 1 << 7,\n  Below_C: 1 << 8,\n  After_Sub: 1 << 9,\n\n  Before_Post: 1 << 10,\n  Post_C: 1 << 11,\n  After_Post: 1 << 12,\n\n  Final_C: 1 << 13,\n  SMVD: 1 << 14,\n\n  End: 1 << 15\n};\n\nexport const CONSONANT_FLAGS = CATEGORIES.C | CATEGORIES.Ra | CATEGORIES.CM | CATEGORIES.V | CATEGORIES.Placeholder | CATEGORIES.Dotted_Circle;\nexport const JOINER_FLAGS = CATEGORIES.ZWJ | CATEGORIES.ZWNJ;\nexport const HALANT_OR_COENG_FLAGS = CATEGORIES.H | CATEGORIES.Coeng;\n\nexport const INDIC_CONFIGS = {\n  Default: {\n    hasOldSpec: false,\n    virama: 0,\n    basePos: 'Last',\n    rephPos: POSITIONS.Before_Post,\n    rephMode: 'Implicit',\n    blwfMode: 'Pre_And_Post'\n  },\n\n  Devanagari: {\n    hasOldSpec: true,\n    virama: 0x094D,\n    basePos: 'Last',\n    rephPos: POSITIONS.Before_Post,\n    rephMode: 'Implicit',\n    blwfMode: 'Pre_And_Post'\n  },\n\n  Bengali: {\n    hasOldSpec: true,\n    virama: 0x09CD,\n    basePos: 'Last',\n    rephPos: POSITIONS.After_Sub,\n    rephMode: 'Implicit',\n    blwfMode: 'Pre_And_Post'\n  },\n\n  Gurmukhi: {\n    hasOldSpec: true,\n    virama: 0x0A4D,\n    basePos: 'Last',\n    rephPos: POSITIONS.Before_Sub,\n    rephMode: 'Implicit',\n    blwfMode: 'Pre_And_Post'\n  },\n\n  Gujarati: {\n    hasOldSpec: true,\n    virama: 0x0ACD,\n    basePos: 'Last',\n    rephPos: POSITIONS.Before_Post,\n    rephMode: 'Implicit',\n    blwfMode: 'Pre_And_Post'\n  },\n\n  Oriya: {\n    hasOldSpec: true,\n    virama: 0x0B4D,\n    basePos: 'Last',\n    rephPos: POSITIONS.After_Main,\n    rephMode: 'Implicit',\n    blwfMode: 'Pre_And_Post'\n  },\n\n  Tamil: {\n    hasOldSpec: true,\n    virama: 0x0BCD,\n    basePos: 'Last',\n    rephPos: POSITIONS.After_Post,\n    rephMode: 'Implicit',\n    blwfMode: 'Pre_And_Post'\n  },\n\n  Telugu: {\n    hasOldSpec: true,\n    virama: 0x0C4D,\n    basePos: 'Last',\n    rephPos: POSITIONS.After_Post,\n    rephMode: 'Explicit',\n    blwfMode: 'Post_Only'\n  },\n\n  Kannada: {\n    hasOldSpec: true,\n    virama: 0x0CCD,\n    basePos: 'Last',\n    rephPos: POSITIONS.After_Post,\n    rephMode: 'Implicit',\n    blwfMode: 'Post_Only'\n  },\n\n  Malayalam: {\n    hasOldSpec: true,\n    virama: 0x0D4D,\n    basePos: 'Last',\n    rephPos: POSITIONS.After_Main,\n    rephMode: 'Log_Repha',\n    blwfMode: 'Pre_And_Post'\n  },\n\n  // Handled by UniversalShaper\n  // Sinhala: {\n  //   hasOldSpec: false,\n  //   virama: 0x0DCA,\n  //   basePos: 'Last_Sinhala',\n  //   rephPos: POSITIONS.After_Main,\n  //   rephMode: 'Explicit',\n  //   blwfMode: 'Pre_And_Post'\n  // },\n\n  Khmer: {\n    hasOldSpec: false,\n    virama: 0x17D2,\n    basePos: 'First',\n    rephPos: POSITIONS.Ra_To_Become_Reph,\n    rephMode: 'Vis_Repha',\n    blwfMode: 'Pre_And_Post'\n  }\n};\n\n// Additional decompositions that aren't in Unicode\nexport const INDIC_DECOMPOSITIONS = {\n  // Khmer\n  0x17BE: [0x17C1, 0x17BE],\n  0x17BF: [0x17C1, 0x17BF],\n  0x17C0: [0x17C1, 0x17C0],\n  0x17C4: [0x17C1, 0x17C4],\n  0x17C5: [0x17C1, 0x17C5]\n};\n", "import DefaultShaper from './DefaultShaper';\nimport StateMachine from 'dfa';\nimport UnicodeTrie from 'unicode-trie';\nimport GlyphInfo from '../GlyphInfo';\nimport useData from './use.json';\nimport { decodeBase64 } from '../../utils';\n\nconst {categories, decompositions} = useData;\nconst trie = new UnicodeTrie(decodeBase64(require('fs').readFileSync(__dirname + '/use.trie', 'base64')));\nconst stateMachine = new StateMachine(useData);\n\n/**\n * This shaper is an implementation of the Universal Shaping Engine, which\n * uses Unicode data to shape a number of scripts without a dedicated shaping engine.\n * See https://www.microsoft.com/typography/OpenTypeDev/USE/intro.htm.\n */\nexport default class UniversalShaper extends DefaultShaper {\n  static zeroMarkWidths = 'BEFORE_GPOS';\n  static planFeatures(plan) {\n    plan.addStage(setupSyllables);\n\n    // Default glyph pre-processing group\n    plan.addStage(['locl', 'ccmp', 'nukt', 'akhn']);\n\n    // Reordering group\n    plan.addStage(clearSubstitutionFlags);\n    plan.addStage(['rphf'], false);\n    plan.addStage(recordRphf);\n    plan.addStage(clearSubstitutionFlags);\n    plan.addStage(['pref']);\n    plan.addStage(recordPref);\n\n    // Orthographic unit shaping group\n    plan.addStage(['rkrf', 'abvf', 'blwf', 'half', 'pstf', 'vatu', 'cjct']);\n    plan.addStage(reorder);\n\n    // Topographical features\n    // Scripts that need this are handled by the Arabic shaper, not implemented here for now.\n    // plan.addStage(['isol', 'init', 'medi', 'fina', 'med2', 'fin2', 'fin3'], false);\n\n    // Standard topographic presentation and positional feature application\n    plan.addStage(['abvs', 'blws', 'pres', 'psts', 'dist', 'abvm', 'blwm']);\n  }\n\n  static assignFeatures(plan, glyphs) {\n    // Decompose split vowels\n    // TODO: do this in a more general unicode normalizer\n    for (let i = glyphs.length - 1; i >= 0; i--) {\n      let codepoint = glyphs[i].codePoints[0];\n      if (decompositions[codepoint]) {\n        let decomposed = decompositions[codepoint].map(c => {\n          let g = plan.font.glyphForCodePoint(c);\n          return new GlyphInfo(plan.font, g.id, [c], glyphs[i].features);\n        });\n\n        glyphs.splice(i, 1, ...decomposed);\n      }\n    }\n  }\n}\n\nfunction useCategory(glyph) {\n  return trie.get(glyph.codePoints[0]);\n}\n\nclass USEInfo {\n  constructor(category, syllableType, syllable) {\n    this.category = category;\n    this.syllableType = syllableType;\n    this.syllable = syllable;\n  }\n}\n\nfunction setupSyllables(font, glyphs) {\n  let syllable = 0;\n  for (let [start, end, tags] of stateMachine.match(glyphs.map(useCategory))) {\n    ++syllable;\n\n    // Create shaper info\n    for (let i = start; i <= end; i++) {\n      glyphs[i].shaperInfo = new USEInfo(categories[useCategory(glyphs[i])], tags[0], syllable);\n    }\n\n    // Assign rphf feature\n    let limit = glyphs[start].shaperInfo.category === 'R' ? 1 : Math.min(3, end - start);\n    for (let i = start; i < start + limit; i++) {\n      glyphs[i].features.rphf = true;\n    }\n  }\n}\n\nfunction clearSubstitutionFlags(font, glyphs) {\n  for (let glyph of glyphs) {\n    glyph.substituted = false;\n  }\n}\n\nfunction recordRphf(font, glyphs) {\n  for (let glyph of glyphs) {\n    if (glyph.substituted && glyph.features.rphf) {\n      // Mark a substituted repha.\n      glyph.shaperInfo.category = 'R';\n    }\n  }\n}\n\nfunction recordPref(font, glyphs) {\n  for (let glyph of glyphs) {\n    if (glyph.substituted) {\n      // Mark a substituted pref as VPre, as they behave the same way.\n      glyph.shaperInfo.category = 'VPre';\n    }\n  }\n}\n\nfunction reorder(font, glyphs) {\n  let dottedCircle = font.glyphForCodePoint(0x25cc).id;\n\n  for (let start = 0, end = nextSyllable(glyphs, 0); start < glyphs.length; start = end, end = nextSyllable(glyphs, start)) {\n    let i, j;\n    let info = glyphs[start].shaperInfo;\n    let type = info.syllableType;\n\n    // Only a few syllable types need reordering.\n    if (type !== 'virama_terminated_cluster' && type !== 'standard_cluster' && type !== 'broken_cluster') {\n      continue;\n    }\n\n    // Insert a dotted circle glyph in broken clusters.\n    if (type === 'broken_cluster' && dottedCircle) {\n      let g = new GlyphInfo(font, dottedCircle, [0x25cc]);\n      g.shaperInfo = info;\n\n      // Insert after possible Repha.\n      for (i = start; i < end && glyphs[i].shaperInfo.category === 'R'; i++);\n      glyphs.splice(++i, 0, g);\n      end++;\n    }\n\n    // Move things forward.\n    if (info.category === 'R' && end - start > 1) {\n      // Got a repha. Reorder it to after first base, before first halant.\n      for (i = start + 1; i < end; i++) {\n        info = glyphs[i].shaperInfo;\n        if (isBase(info) || isHalant(glyphs[i])) {\n          // If we hit a halant, move before it; otherwise it's a base: move to it's\n          // place, and shift things in between backward.\n          if (isHalant(glyphs[i])) {\n            i--;\n          }\n\n          glyphs.splice(start, 0, ...glyphs.splice(start + 1, i - start), glyphs[i]);\n          break;\n        }\n      }\n    }\n\n    // Move things back.\n    for (i = start, j = end; i < end; i++) {\n      info = glyphs[i].shaperInfo;\n      if (isBase(info) || isHalant(glyphs[i])) {\n        // If we hit a halant, move after it; otherwise it's a base: move to it's\n        // place, and shift things in between backward.\n        j = isHalant(glyphs[i]) ? i + 1 : i;\n      } else if ((info.category === 'VPre' || info.category === 'VMPre') && j < i) {\n        glyphs.splice(j, 1, glyphs[i], ...glyphs.splice(j, i - j));\n      }\n    }\n  }\n}\n\nfunction nextSyllable(glyphs, start) {\n  if (start >= glyphs.length) return start;\n  let syllable = glyphs[start].shaperInfo.syllable;\n  while (++start < glyphs.length && glyphs[start].shaperInfo.syllable === syllable);\n  return start;\n}\n\nfunction isHalant(glyph) {\n  return glyph.shaperInfo.category === 'H' && !glyph.isLigated;\n}\n\nfunction isBase(info) {\n  return info.category === 'B' || info.category === 'GB';\n}\n", "import OTProcessor from './OTProcessor';\nimport GlyphInfo from './GlyphInfo';\n\nexport default class GSUBProcessor extends OTProcessor {\n  applyLookup(lookupType, table) {\n    switch (lookupType) {\n      case 1: { // Single Substitution\n        let index = this.coverageIndex(table.coverage);\n        if (index === -1) {\n          return false;\n        }\n\n        let glyph = this.glyphIterator.cur;\n        switch (table.version) {\n          case 1:\n            glyph.id = (glyph.id + table.deltaGlyphID) & 0xffff;\n            break;\n\n          case 2:\n            glyph.id = table.substitute.get(index);\n            break;\n        }\n\n        return true;\n      }\n\n      case 2: { // Multiple Substitution\n        let index = this.coverageIndex(table.coverage);\n        if (index !== -1) {\n          let sequence = table.sequences.get(index);\n\n          if (sequence.length === 0) {\n            // If the sequence length is zero, delete the glyph.\n            // The OpenType spec disallows this, but seems like Harfbuzz and Uniscribe allow it.\n            this.glyphs.splice(this.glyphIterator.index, 1);\n            return true;\n          }\n\n          this.glyphIterator.cur.id = sequence[0];\n          this.glyphIterator.cur.ligatureComponent = 0;\n\n          let features = this.glyphIterator.cur.features;\n          let curGlyph = this.glyphIterator.cur;\n          let replacement = sequence.slice(1).map((gid, i) => {\n            let glyph = new GlyphInfo(this.font, gid, undefined, features);\n            glyph.shaperInfo = curGlyph.shaperInfo;\n            glyph.isLigated = curGlyph.isLigated;\n            glyph.ligatureComponent = i + 1;\n            glyph.substituted = true;\n            glyph.isMultiplied = true;\n            return glyph;\n          });\n\n          this.glyphs.splice(this.glyphIterator.index + 1, 0, ...replacement);\n          return true;\n        }\n\n        return false;\n      }\n\n      case 3: { // Alternate Substitution\n        let index = this.coverageIndex(table.coverage);\n        if (index !== -1) {\n          let USER_INDEX = 0; // TODO\n          this.glyphIterator.cur.id = table.alternateSet.get(index)[USER_INDEX];\n          return true;\n        }\n\n        return false;\n      }\n\n      case 4: { // Ligature Substitution\n        let index = this.coverageIndex(table.coverage);\n        if (index === -1) {\n          return false;\n        }\n\n        for (let ligature of table.ligatureSets.get(index)) {\n          let matched = this.sequenceMatchIndices(1, ligature.components);\n          if (!matched) {\n            continue;\n          }\n\n          let curGlyph = this.glyphIterator.cur;\n\n          // Concatenate all of the characters the new ligature will represent\n          let characters = curGlyph.codePoints.slice();\n          for (let index of matched) {\n            characters.push(...this.glyphs[index].codePoints);\n          }\n\n          // Create the replacement ligature glyph\n          let ligatureGlyph = new GlyphInfo(this.font, ligature.glyph, characters, curGlyph.features);\n          ligatureGlyph.shaperInfo = curGlyph.shaperInfo;\n          ligatureGlyph.isLigated = true;\n          ligatureGlyph.substituted = true;\n\n          // From Harfbuzz:\n          // - If it *is* a mark ligature, we don't allocate a new ligature id, and leave\n          //   the ligature to keep its old ligature id.  This will allow it to attach to\n          //   a base ligature in GPOS.  Eg. if the sequence is: LAM,LAM,SHADDA,FATHA,HEH,\n          //   and LAM,LAM,HEH for a ligature, they will leave SHADDA and FATHA with a\n          //   ligature id and component value of 2.  Then if SHADDA,FATHA form a ligature\n          //   later, we don't want them to lose their ligature id/component, otherwise\n          //   GPOS will fail to correctly position the mark ligature on top of the\n          //   LAM,LAM,HEH ligature. See https://bugzilla.gnome.org/show_bug.cgi?id=676343\n          //\n          // - If a ligature is formed of components that some of which are also ligatures\n          //   themselves, and those ligature components had marks attached to *their*\n          //   components, we have to attach the marks to the new ligature component\n          //   positions!  Now *that*'s tricky!  And these marks may be following the\n          //   last component of the whole sequence, so we should loop forward looking\n          //   for them and update them.\n          //\n          //   Eg. the sequence is LAM,LAM,SHADDA,FATHA,HEH, and the font first forms a\n          //   'calt' ligature of LAM,HEH, leaving the SHADDA and FATHA with a ligature\n          //   id and component == 1.  Now, during 'liga', the LAM and the LAM-HEH ligature\n          //   form a LAM-LAM-HEH ligature.  We need to reassign the SHADDA and FATHA to\n          //   the new ligature with a component value of 2.\n          //\n          //   This in fact happened to a font...  See https://bugzilla.gnome.org/show_bug.cgi?id=437633\n          let isMarkLigature = curGlyph.isMark;\n          for (let i = 0; i < matched.length && isMarkLigature; i++) {\n            isMarkLigature = this.glyphs[matched[i]].isMark;\n          }\n\n          ligatureGlyph.ligatureID = isMarkLigature ? null : this.ligatureID++;\n\n          let lastLigID = curGlyph.ligatureID;\n          let lastNumComps = curGlyph.codePoints.length;\n          let curComps = lastNumComps;\n          let idx = this.glyphIterator.index + 1;\n\n          // Set ligatureID and ligatureComponent on glyphs that were skipped in the matched sequence.\n          // This allows GPOS to attach marks to the correct ligature components.\n          for (let matchIndex of matched) {\n            // Don't assign new ligature components for mark ligatures (see above)\n            if (isMarkLigature) {\n              idx = matchIndex;\n            } else {\n              while (idx < matchIndex) {\n                var ligatureComponent = curComps - lastNumComps + Math.min(this.glyphs[idx].ligatureComponent || 1, lastNumComps);\n                this.glyphs[idx].ligatureID = ligatureGlyph.ligatureID;\n                this.glyphs[idx].ligatureComponent = ligatureComponent;\n                idx++;\n              }\n            }\n\n            lastLigID = this.glyphs[idx].ligatureID;\n            lastNumComps = this.glyphs[idx].codePoints.length;\n            curComps += lastNumComps;\n            idx++; // skip base glyph\n          }\n\n          // Adjust ligature components for any marks following\n          if (lastLigID && !isMarkLigature) {\n            for (let i = idx; i < this.glyphs.length; i++) {\n              if (this.glyphs[i].ligatureID === lastLigID) {\n                var ligatureComponent = curComps - lastNumComps + Math.min(this.glyphs[i].ligatureComponent || 1, lastNumComps);\n                this.glyphs[i].ligatureComponent = ligatureComponent;\n              } else {\n                break;\n              }\n            }\n          }\n\n          // Delete the matched glyphs, and replace the current glyph with the ligature glyph\n          for (let i = matched.length - 1; i >= 0; i--) {\n            this.glyphs.splice(matched[i], 1);\n          }\n\n          this.glyphs[this.glyphIterator.index] = ligatureGlyph;\n          return true;\n        }\n\n        return false;\n      }\n\n      case 5: // Contextual Substitution\n        return this.applyContext(table);\n\n      case 6: // Chaining Contextual Substitution\n        return this.applyChainingContext(table);\n\n      case 7: // Extension Substitution\n        return this.applyLookup(table.lookupType, table.extension);\n\n      default:\n        throw new Error(`GSUB lookupType ${lookupType} is not supported`);\n    }\n  }\n}\n", "import OTProcessor from './OTProcessor';\n\nexport default class GPOSProcessor extends OTProcessor {\n  applyPositionValue(sequenceIndex, value) {\n    let position = this.positions[this.glyphIterator.peekIndex(sequenceIndex)];\n    if (value.xAdvance != null) {\n      position.xAdvance += value.xAdvance;\n    }\n\n    if (value.yAdvance != null) {\n      position.yAdvance += value.yAdvance;\n    }\n\n    if (value.xPlacement != null) {\n      position.xOffset += value.xPlacement;\n    }\n\n    if (value.yPlacement != null) {\n      position.yOffset += value.yPlacement;\n    }\n\n    // Adjustments for font variations\n    let variationProcessor = this.font._variationProcessor;\n    let variationStore = this.font.GDEF && this.font.GDEF.itemVariationStore;\n    if (variationProcessor && variationStore) {\n      if (value.xPlaDevice) {\n        position.xOffset += variationProcessor.getDelta(variationStore, value.xPlaDevice.a, value.xPlaDevice.b);\n      }\n\n      if (value.yPlaDevice) {\n        position.yOffset += variationProcessor.getDelta(variationStore, value.yPlaDevice.a, value.yPlaDevice.b);\n      }\n\n      if (value.xAdvDevice) {\n        position.xAdvance += variationProcessor.getDelta(variationStore, value.xAdvDevice.a, value.xAdvDevice.b);\n      }\n\n      if (value.yAdvDevice) {\n        position.yAdvance += variationProcessor.getDelta(variationStore, value.yAdvDevice.a, value.yAdvDevice.b);\n      }\n    }\n\n    // TODO: device tables\n  }\n\n  applyLookup(lookupType, table) {\n    switch (lookupType) {\n      case 1: { // Single positioning value\n        let index = this.coverageIndex(table.coverage);\n        if (index === -1) {\n          return false;\n        }\n\n        switch (table.version) {\n          case 1:\n            this.applyPositionValue(0, table.value);\n            break;\n\n          case 2:\n            this.applyPositionValue(0, table.values.get(index));\n            break;\n        }\n\n        return true;\n      }\n\n      case 2: { // Pair Adjustment Positioning\n        let nextGlyph = this.glyphIterator.peek();\n        if (!nextGlyph) {\n          return false;\n        }\n\n        let index = this.coverageIndex(table.coverage);\n        if (index === -1) {\n          return false;\n        }\n\n        switch (table.version) {\n          case 1: // Adjustments for glyph pairs\n            let set = table.pairSets.get(index);\n\n            for (let pair of set) {\n              if (pair.secondGlyph === nextGlyph.id) {\n                this.applyPositionValue(0, pair.value1);\n                this.applyPositionValue(1, pair.value2);\n                return true;\n              }\n            }\n\n            return false;\n\n          case 2: // Class pair adjustment\n            let class1 = this.getClassID(this.glyphIterator.cur.id, table.classDef1);\n            let class2 = this.getClassID(nextGlyph.id, table.classDef2);\n            if (class1 === -1 || class2 === -1) {\n              return false;\n            }\n\n            var pair = table.classRecords.get(class1).get(class2);\n            this.applyPositionValue(0, pair.value1);\n            this.applyPositionValue(1, pair.value2);\n            return true;\n        }\n      }\n\n      case 3: { // Cursive Attachment Positioning\n        let nextIndex = this.glyphIterator.peekIndex();\n        let nextGlyph = this.glyphs[nextIndex];\n        if (!nextGlyph) {\n          return false;\n        }\n\n        let curRecord = table.entryExitRecords[this.coverageIndex(table.coverage)];\n        if (!curRecord || !curRecord.exitAnchor) {\n          return false;\n        }\n\n        let nextRecord = table.entryExitRecords[this.coverageIndex(table.coverage, nextGlyph.id)];\n        if (!nextRecord || !nextRecord.entryAnchor) {\n          return false;\n        }\n\n        let entry = this.getAnchor(nextRecord.entryAnchor);\n        let exit = this.getAnchor(curRecord.exitAnchor);\n\n        let cur = this.positions[this.glyphIterator.index];\n        let next = this.positions[nextIndex];\n        let d;\n\n        switch (this.direction) {\n          case 'ltr':\n            cur.xAdvance = exit.x + cur.xOffset;\n\n            d = entry.x + next.xOffset;\n            next.xAdvance -= d;\n            next.xOffset -= d;\n            break;\n\n          case 'rtl':\n            d = exit.x + cur.xOffset;\n            cur.xAdvance -= d;\n            cur.xOffset -= d;\n            next.xAdvance = entry.x + next.xOffset;\n            break;\n        }\n\n        if (this.glyphIterator.flags.rightToLeft) {\n          this.glyphIterator.cur.cursiveAttachment = nextIndex;\n          cur.yOffset = entry.y - exit.y;\n        } else {\n          nextGlyph.cursiveAttachment = this.glyphIterator.index;\n          cur.yOffset = exit.y - entry.y;\n        }\n\n        return true;\n      }\n\n      case 4: { // Mark to base positioning\n        let markIndex = this.coverageIndex(table.markCoverage);\n        if (markIndex === -1) {\n          return false;\n        }\n\n        // search backward for a base glyph\n        let baseGlyphIndex = this.glyphIterator.index;\n        while (--baseGlyphIndex >= 0 && (this.glyphs[baseGlyphIndex].isMark || this.glyphs[baseGlyphIndex].ligatureComponent > 0));\n\n        if (baseGlyphIndex < 0) {\n          return false;\n        }\n\n        let baseIndex = this.coverageIndex(table.baseCoverage, this.glyphs[baseGlyphIndex].id);\n        if (baseIndex === -1) {\n          return false;\n        }\n\n        let markRecord = table.markArray[markIndex];\n        let baseAnchor = table.baseArray[baseIndex][markRecord.class];\n        this.applyAnchor(markRecord, baseAnchor, baseGlyphIndex);\n        return true;\n      }\n\n      case 5: { // Mark to ligature positioning\n        let markIndex = this.coverageIndex(table.markCoverage);\n        if (markIndex === -1) {\n          return false;\n        }\n\n        // search backward for a base glyph\n        let baseGlyphIndex = this.glyphIterator.index;\n        while (--baseGlyphIndex >= 0 && this.glyphs[baseGlyphIndex].isMark);\n\n        if (baseGlyphIndex < 0) {\n          return false;\n        }\n\n        let ligIndex = this.coverageIndex(table.ligatureCoverage, this.glyphs[baseGlyphIndex].id);\n        if (ligIndex === -1) {\n          return false;\n        }\n\n        let ligAttach = table.ligatureArray[ligIndex];\n        let markGlyph = this.glyphIterator.cur;\n        let ligGlyph = this.glyphs[baseGlyphIndex];\n        let compIndex = ligGlyph.ligatureID && ligGlyph.ligatureID === markGlyph.ligatureID && (markGlyph.ligatureComponent > 0)\n          ? Math.min(markGlyph.ligatureComponent, ligGlyph.codePoints.length) - 1\n          : ligGlyph.codePoints.length - 1;\n\n        let markRecord = table.markArray[markIndex];\n        let baseAnchor = ligAttach[compIndex][markRecord.class];\n        this.applyAnchor(markRecord, baseAnchor, baseGlyphIndex);\n        return true;\n      }\n\n      case 6: { // Mark to mark positioning\n        let mark1Index = this.coverageIndex(table.mark1Coverage);\n        if (mark1Index === -1) {\n          return false;\n        }\n\n        // get the previous mark to attach to\n        let prevIndex = this.glyphIterator.peekIndex(-1);\n        let prev = this.glyphs[prevIndex];\n        if (!prev || !prev.isMark) {\n          return false;\n        }\n\n        let cur = this.glyphIterator.cur;\n\n        // The following logic was borrowed from Harfbuzz\n        let good = false;\n        if (cur.ligatureID === prev.ligatureID) {\n          if (!cur.ligatureID) { // Marks belonging to the same base\n            good = true;\n          } else if (cur.ligatureComponent === prev.ligatureComponent) { // Marks belonging to the same ligature component\n            good = true;\n          }\n        } else {\n          // If ligature ids don't match, it may be the case that one of the marks\n          // itself is a ligature, in which case match.\n          if ((cur.ligatureID && !cur.ligatureComponent) || (prev.ligatureID && !prev.ligatureComponent)) {\n            good = true;\n          }\n        }\n\n        if (!good) {\n          return false;\n        }\n\n        let mark2Index = this.coverageIndex(table.mark2Coverage, prev.id);\n        if (mark2Index === -1) {\n          return false;\n        }\n\n        let markRecord = table.mark1Array[mark1Index];\n        let baseAnchor = table.mark2Array[mark2Index][markRecord.class];\n        this.applyAnchor(markRecord, baseAnchor, prevIndex);\n        return true;\n      }\n\n      case 7: // Contextual positioning\n        return this.applyContext(table);\n\n      case 8: // Chaining contextual positioning\n        return this.applyChainingContext(table);\n\n      case 9: // Extension positioning\n        return this.applyLookup(table.lookupType, table.extension);\n\n      default:\n        throw new Error(`Unsupported GPOS table: ${lookupType}`);\n    }\n  }\n\n  applyAnchor(markRecord, baseAnchor, baseGlyphIndex) {\n    let baseCoords = this.getAnchor(baseAnchor);\n    let markCoords = this.getAnchor(markRecord.markAnchor);\n\n    let basePos = this.positions[baseGlyphIndex];\n    let markPos = this.positions[this.glyphIterator.index];\n\n    markPos.xOffset = baseCoords.x - markCoords.x;\n    markPos.yOffset = baseCoords.y - markCoords.y;\n    this.glyphIterator.cur.markAttachment = baseGlyphIndex;\n  }\n\n  getAnchor(anchor) {\n    // TODO: contour point, device tables\n    let x = anchor.xCoordinate;\n    let y = anchor.yCoordinate;\n\n    // Adjustments for font variations\n    let variationProcessor = this.font._variationProcessor;\n    let variationStore = this.font.GDEF && this.font.GDEF.itemVariationStore;\n    if (variationProcessor && variationStore) {\n      if (anchor.xDeviceTable) {\n        x += variationProcessor.getDelta(variationStore, anchor.xDeviceTable.a, anchor.xDeviceTable.b);\n      }\n\n      if (anchor.yDeviceTable) {\n        y += variationProcessor.getDelta(variationStore, anchor.yDeviceTable.a, anchor.yDeviceTable.b);\n      }\n    }\n\n    return { x, y };\n  }\n\n  applyFeatures(userFeatures, glyphs, advances) {\n    super.applyFeatures(userFeatures, glyphs, advances);\n\n    for (var i = 0; i < this.glyphs.length; i++) {\n      this.fixCursiveAttachment(i);\n    }\n\n    this.fixMarkAttachment();\n  }\n\n  fixCursiveAttachment(i) {\n    let glyph = this.glyphs[i];\n    if (glyph.cursiveAttachment != null) {\n      let j = glyph.cursiveAttachment;\n\n      glyph.cursiveAttachment = null;\n      this.fixCursiveAttachment(j);\n\n      this.positions[i].yOffset += this.positions[j].yOffset;\n    }\n  }\n\n  fixMarkAttachment() {\n    for (let i = 0; i < this.glyphs.length; i++) {\n      let glyph = this.glyphs[i];\n      if (glyph.markAttachment != null) {\n        let j = glyph.markAttachment;\n\n        this.positions[i].xOffset += this.positions[j].xOffset;\n        this.positions[i].yOffset += this.positions[j].yOffset;\n\n        if (this.direction === 'ltr') {\n          for (let k = j; k < i; k++) {\n            this.positions[i].xOffset -= this.positions[k].xAdvance;\n            this.positions[i].yOffset -= this.positions[k].yAdvance;\n          }\n        } else {\n          for (let k = j + 1; k < i + 1; k++) {\n            this.positions[i].xOffset += this.positions[k].xAdvance;\n            this.positions[i].yOffset += this.positions[k].yAdvance;\n          }\n        }\n      }\n    }\n  }\n}\n", "import Glyph from './Glyph';\nimport Path from './Path';\nimport BBox from './BBox';\nimport * as r from 'restructure';\n\n// The header for both simple and composite glyphs\nlet GlyfHeader = new r.Struct({\n  numberOfContours: r.int16, // if negative, this is a composite glyph\n  xMin:             r.int16,\n  yMin:             r.int16,\n  xMax:             r.int16,\n  yMax:             r.int16\n});\n\n// Flags for simple glyphs\nconst ON_CURVE        = 1 << 0;\nconst X_SHORT_VECTOR  = 1 << 1;\nconst Y_SHORT_VECTOR  = 1 << 2;\nconst REPEAT          = 1 << 3;\nconst SAME_X          = 1 << 4;\nconst SAME_Y          = 1 << 5;\n\n// Flags for composite glyphs\nconst ARG_1_AND_2_ARE_WORDS     = 1 << 0;\nconst ARGS_ARE_XY_VALUES        = 1 << 1;\nconst ROUND_XY_TO_GRID          = 1 << 2;\nconst WE_HAVE_A_SCALE           = 1 << 3;\nconst MORE_COMPONENTS           = 1 << 5;\nconst WE_HAVE_AN_X_AND_Y_SCALE  = 1 << 6;\nconst WE_HAVE_A_TWO_BY_TWO      = 1 << 7;\nconst WE_HAVE_INSTRUCTIONS      = 1 << 8;\nconst USE_MY_METRICS            = 1 << 9;\nconst OVERLAP_COMPOUND          = 1 << 10;\nconst SCALED_COMPONENT_OFFSET   = 1 << 11;\nconst UNSCALED_COMPONENT_OFFSET = 1 << 12;\n\n// Represents a point in a simple glyph\nexport class Point {\n  constructor(onCurve, endContour, x = 0, y = 0) {\n    this.onCurve = onCurve;\n    this.endContour = endContour;\n    this.x = x;\n    this.y = y;\n  }\n\n  copy() {\n    return new Point(this.onCurve, this.endContour, this.x, this.y);\n  }\n}\n\n// Represents a component in a composite glyph\nclass Component {\n  constructor(glyphID, dx, dy) {\n    this.glyphID = glyphID;\n    this.dx = dx;\n    this.dy = dy;\n    this.pos = 0;\n    this.scaleX = this.scaleY = 1;\n    this.scale01 = this.scale10 = 0;\n  }\n}\n\n/**\n * Represents a TrueType glyph.\n */\nexport default class TTFGlyph extends Glyph {\n  type = 'TTF';\n\n  // Parses just the glyph header and returns the bounding box\n  _getCBox(internal) {\n    // We need to decode the glyph if variation processing is requested,\n    // so it's easier just to recompute the path's cbox after decoding.\n    if (this._font._variationProcessor && !internal) {\n      return this.path.cbox;\n    }\n\n    let stream = this._font._getTableStream('glyf');\n    stream.pos += this._font.loca.offsets[this.id];\n    let glyph = GlyfHeader.decode(stream);\n\n    let cbox = new BBox(glyph.xMin, glyph.yMin, glyph.xMax, glyph.yMax);\n    return Object.freeze(cbox);\n  }\n\n  // Parses a single glyph coordinate\n  _parseGlyphCoord(stream, prev, short, same) {\n    if (short) {\n      var val = stream.readUInt8();\n      if (!same) {\n        val = -val;\n      }\n\n      val += prev;\n    } else {\n      if (same) {\n        var val = prev;\n      } else {\n        var val = prev + stream.readInt16BE();\n      }\n    }\n\n    return val;\n  }\n\n  // Decodes the glyph data into points for simple glyphs,\n  // or components for composite glyphs\n  _decode() {\n    let glyfPos = this._font.loca.offsets[this.id];\n    let nextPos = this._font.loca.offsets[this.id + 1];\n\n    // Nothing to do if there is no data for this glyph\n    if (glyfPos === nextPos) { return null; }\n\n    let stream = this._font._getTableStream('glyf');\n    stream.pos += glyfPos;\n    let startPos = stream.pos;\n\n    let glyph = GlyfHeader.decode(stream);\n\n    if (glyph.numberOfContours > 0) {\n      this._decodeSimple(glyph, stream);\n\n    } else if (glyph.numberOfContours < 0) {\n      this._decodeComposite(glyph, stream, startPos);\n    }\n\n    return glyph;\n  }\n\n  _decodeSimple(glyph, stream) {\n    // this is a simple glyph\n    glyph.points = [];\n\n    let endPtsOfContours = new r.Array(r.uint16, glyph.numberOfContours).decode(stream);\n    glyph.instructions = new r.Array(r.uint8, r.uint16).decode(stream);\n\n    let flags = [];\n    let numCoords = endPtsOfContours[endPtsOfContours.length - 1] + 1;\n\n    while (flags.length < numCoords) {\n      var flag = stream.readUInt8();\n      flags.push(flag);\n\n      // check for repeat flag\n      if (flag & REPEAT) {\n        let count = stream.readUInt8();\n        for (let j = 0; j < count; j++) {\n          flags.push(flag);\n        }\n      }\n    }\n\n    for (var i = 0; i < flags.length; i++) {\n      var flag = flags[i];\n      let point = new Point(!!(flag & ON_CURVE), endPtsOfContours.indexOf(i) >= 0, 0, 0);\n      glyph.points.push(point);\n    }\n\n    let px = 0;\n    for (var i = 0; i < flags.length; i++) {\n      var flag = flags[i];\n      glyph.points[i].x = px = this._parseGlyphCoord(stream, px, flag & X_SHORT_VECTOR, flag & SAME_X);\n    }\n\n    let py = 0;\n    for (var i = 0; i < flags.length; i++) {\n      var flag = flags[i];\n      glyph.points[i].y = py = this._parseGlyphCoord(stream, py, flag & Y_SHORT_VECTOR, flag & SAME_Y);\n    }\n\n    if (this._font._variationProcessor) {\n      let points = glyph.points.slice();\n      points.push(...this._getPhantomPoints(glyph));\n\n      this._font._variationProcessor.transformPoints(this.id, points);\n      glyph.phantomPoints = points.slice(-4);\n    }\n\n    return;\n  }\n\n  _decodeComposite(glyph, stream, offset = 0) {\n    // this is a composite glyph\n    glyph.components = [];\n    let haveInstructions = false;\n    let flags = MORE_COMPONENTS;\n\n    while (flags & MORE_COMPONENTS) {\n      flags = stream.readUInt16BE();\n      let gPos = stream.pos - offset;\n      let glyphID = stream.readUInt16BE();\n      if (!haveInstructions) {\n        haveInstructions = (flags & WE_HAVE_INSTRUCTIONS) !== 0;\n      }\n\n      if (flags & ARG_1_AND_2_ARE_WORDS) {\n        var dx = stream.readInt16BE();\n        var dy = stream.readInt16BE();\n      } else {\n        var dx = stream.readInt8();\n        var dy = stream.readInt8();\n      }\n\n      var component = new Component(glyphID, dx, dy);\n      component.pos = gPos;\n\n      if (flags & WE_HAVE_A_SCALE) {\n        // fixed number with 14 bits of fraction\n        component.scaleX =\n        component.scaleY = ((stream.readUInt8() << 24) | (stream.readUInt8() << 16)) / 1073741824;\n\n      } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) {\n        component.scaleX = ((stream.readUInt8() << 24) | (stream.readUInt8() << 16)) / 1073741824;\n        component.scaleY = ((stream.readUInt8() << 24) | (stream.readUInt8() << 16)) / 1073741824;\n\n      } else if (flags & WE_HAVE_A_TWO_BY_TWO) {\n        component.scaleX  = ((stream.readUInt8() << 24) | (stream.readUInt8() << 16)) / 1073741824;\n        component.scale01 = ((stream.readUInt8() << 24) | (stream.readUInt8() << 16)) / 1073741824;\n        component.scale10 = ((stream.readUInt8() << 24) | (stream.readUInt8() << 16)) / 1073741824;\n        component.scaleY  = ((stream.readUInt8() << 24) | (stream.readUInt8() << 16)) / 1073741824;\n      }\n\n      glyph.components.push(component);\n    }\n\n    if (this._font._variationProcessor) {\n      let points = [];\n      for (let j = 0; j < glyph.components.length; j++) {\n        var component = glyph.components[j];\n        points.push(new Point(true, true, component.dx, component.dy));\n      }\n\n      points.push(...this._getPhantomPoints(glyph));\n\n      this._font._variationProcessor.transformPoints(this.id, points);\n      glyph.phantomPoints = points.splice(-4, 4);\n\n      for (let i = 0; i < points.length; i++) {\n        let point = points[i];\n        glyph.components[i].dx = point.x;\n        glyph.components[i].dy = point.y;\n      }\n    }\n\n    return haveInstructions;\n  }\n\n  _getPhantomPoints(glyph) {\n    let cbox = this._getCBox(true);\n    if (this._metrics == null) {\n      this._metrics = Glyph.prototype._getMetrics.call(this, cbox);\n    }\n\n    let { advanceWidth, advanceHeight, leftBearing, topBearing } = this._metrics;\n\n    return [\n      new Point(false, true, glyph.xMin - leftBearing, 0),\n      new Point(false, true, glyph.xMin - leftBearing + advanceWidth, 0),\n      new Point(false, true, 0, glyph.yMax + topBearing),\n      new Point(false, true, 0, glyph.yMax + topBearing + advanceHeight)\n    ];\n  }\n\n  // Decodes font data, resolves composite glyphs, and returns an array of contours\n  _getContours() {\n    let glyph = this._decode();\n    if (!glyph) {\n      return [];\n    }\n\n    let points = [];\n\n    if (glyph.numberOfContours < 0) {\n      // resolve composite glyphs\n      for (let component of glyph.components) {\n        let contours = this._font.getGlyph(component.glyphID)._getContours();\n        for (let i = 0; i < contours.length; i++) {\n          let contour = contours[i];\n          for (let j = 0; j < contour.length; j++) {\n            let point = contour[j];\n            let x = point.x * component.scaleX + point.y * component.scale01 + component.dx;\n            let y = point.y * component.scaleY + point.x * component.scale10 + component.dy;\n            points.push(new Point(point.onCurve, point.endContour, x, y));\n          }\n        }\n      }\n    } else {\n      points = glyph.points || [];\n    }\n\n    // Recompute and cache metrics if we performed variation processing, and don't have an HVAR table\n    if (glyph.phantomPoints && !this._font.directory.tables.HVAR) {\n      this._metrics.advanceWidth  = glyph.phantomPoints[1].x - glyph.phantomPoints[0].x;\n      this._metrics.advanceHeight = glyph.phantomPoints[3].y - glyph.phantomPoints[2].y;\n      this._metrics.leftBearing   = glyph.xMin - glyph.phantomPoints[0].x;\n      this._metrics.topBearing    = glyph.phantomPoints[2].y - glyph.yMax;\n    }\n\n    let contours = [];\n    let cur = [];\n    for (let k = 0; k < points.length; k++) {\n      var point = points[k];\n      cur.push(point);\n      if (point.endContour) {\n        contours.push(cur);\n        cur = [];\n      }\n    }\n\n    return contours;\n  }\n\n  _getMetrics() {\n    if (this._metrics) {\n      return this._metrics;\n    }\n\n    let cbox = this._getCBox(true);\n    super._getMetrics(cbox);\n\n    if (this._font._variationProcessor && !this._font.HVAR) {\n      // No HVAR table, decode the glyph. This triggers recomputation of metrics.\n      this.path;\n    }\n\n    return this._metrics;\n  }\n\n  // Converts contours to a Path object that can be rendered\n  _getPath() {\n    let contours = this._getContours();\n    let path = new Path;\n\n    for (let i = 0; i < contours.length; i++) {\n      let contour = contours[i];\n      let firstPt = contour[0];\n      let lastPt = contour[contour.length - 1];\n      let start = 0;\n\n      if (firstPt.onCurve) {\n        // The first point will be consumed by the moveTo command, so skip in the loop\n        var curvePt = null;\n        start = 1;\n      } else {\n        if (lastPt.onCurve) {\n          // Start at the last point if the first point is off curve and the last point is on curve\n          firstPt = lastPt;\n        } else {\n          // Start at the middle if both the first and last points are off curve\n          firstPt = new Point(false, false, (firstPt.x + lastPt.x) / 2, (firstPt.y + lastPt.y) / 2);\n        }\n\n        var curvePt = firstPt;\n      }\n\n      path.moveTo(firstPt.x, firstPt.y);\n\n      for (let j = start; j < contour.length; j++) {\n        let pt = contour[j];\n        let prevPt = j === 0 ? firstPt : contour[j - 1];\n\n        if (prevPt.onCurve && pt.onCurve) {\n          path.lineTo(pt.x, pt.y);\n\n        } else if (prevPt.onCurve && !pt.onCurve) {\n          var curvePt = pt;\n\n        } else if (!prevPt.onCurve && !pt.onCurve) {\n          let midX = (prevPt.x + pt.x) / 2;\n          let midY = (prevPt.y + pt.y) / 2;\n          path.quadraticCurveTo(prevPt.x, prevPt.y, midX, midY);\n          var curvePt = pt;\n\n        } else if (!prevPt.onCurve && pt.onCurve) {\n          path.quadraticCurveTo(curvePt.x, curvePt.y, pt.x, pt.y);\n          var curvePt = null;\n\n        } else {\n          throw new Error(\"Unknown TTF path state\");\n        }\n      }\n\n      // Connect the first and last points\n      if (curvePt) {\n        path.quadraticCurveTo(curvePt.x, curvePt.y, firstPt.x, firstPt.y);\n      }\n\n      path.closePath();\n    }\n\n    return path;\n  }\n}\n", "import { cache } from '../decorators';\nimport Path from './Path';\nimport {isMark} from 'unicode-properties';\nimport StandardNames from './StandardNames';\n\n/**\n * Glyph objects represent a glyph in the font. They have various properties for accessing metrics and\n * the actual vector path the glyph represents, and methods for rendering the glyph to a graphics context.\n *\n * You do not create glyph objects directly. They are created by various methods on the font object.\n * There are several subclasses of the base Glyph class internally that may be returned depending\n * on the font format, but they all inherit from this class.\n */\nexport default class Glyph {\n  constructor(id, codePoints, font) {\n    /**\n     * The glyph id in the font\n     * @type {number}\n     */\n    this.id = id;\n\n    /**\n     * An array of unicode code points that are represented by this glyph.\n     * There can be multiple code points in the case of ligatures and other glyphs\n     * that represent multiple visual characters.\n     * @type {number[]}\n     */\n    this.codePoints = codePoints;\n    this._font = font;\n\n    // TODO: get this info from GDEF if available\n    this.isMark = this.codePoints.length > 0 && this.codePoints.every(isMark);\n    this.isLigature = this.codePoints.length > 1;\n  }\n\n  _getPath() {\n    return new Path();\n  }\n\n  _getCBox() {\n    return this.path.cbox;\n  }\n\n  _getBBox() {\n    return this.path.bbox;\n  }\n\n  _getTableMetrics(table) {\n    if (this.id < table.metrics.length) {\n      return table.metrics.get(this.id);\n    }\n\n    let metric = table.metrics.get(table.metrics.length - 1);\n    let res = {\n      advance: metric ? metric.advance : 0,\n      bearing: table.bearings.get(this.id - table.metrics.length) || 0\n    };\n\n    return res;\n  }\n\n  _getMetrics(cbox) {\n    if (this._metrics) { return this._metrics; }\n\n    let {advance:advanceWidth, bearing:leftBearing} = this._getTableMetrics(this._font.hmtx);\n\n    // For vertical metrics, use vmtx if available, or fall back to global data from OS/2 or hhea\n    if (this._font.vmtx) {\n      var {advance:advanceHeight, bearing:topBearing} = this._getTableMetrics(this._font.vmtx);\n\n    } else {\n      let os2;\n      if (typeof cbox === 'undefined' || cbox === null) { ({ cbox } = this); }\n\n      if ((os2 = this._font['OS/2']) && os2.version > 0) {\n        var advanceHeight = Math.abs(os2.typoAscender - os2.typoDescender);\n        var topBearing = os2.typoAscender - cbox.maxY;\n\n      } else {\n        let { hhea } = this._font;\n        var advanceHeight = Math.abs(hhea.ascent - hhea.descent);\n        var topBearing = hhea.ascent - cbox.maxY;\n      }\n    }\n\n    if (this._font._variationProcessor && this._font.HVAR) {\n      advanceWidth += this._font._variationProcessor.getAdvanceAdjustment(this.id, this._font.HVAR);\n    }\n\n    return this._metrics = { advanceWidth, advanceHeight, leftBearing, topBearing };\n  }\n\n  /**\n   * The glyph’s control box.\n   * This is often the same as the bounding box, but is faster to compute.\n   * Because of the way bezier curves are defined, some of the control points\n   * can be outside of the bounding box. Where `bbox` takes this into account,\n   * `cbox` does not. Thus, cbox is less accurate, but faster to compute.\n   * See [here](http://www.freetype.org/freetype2/docs/glyphs/glyphs-6.html#section-2)\n   * for a more detailed description.\n   *\n   * @type {BBox}\n   */\n  @cache\n  get cbox() {\n    return this._getCBox();\n  }\n\n  /**\n   * The glyph’s bounding box, i.e. the rectangle that encloses the\n   * glyph outline as tightly as possible.\n   * @type {BBox}\n   */\n  @cache\n  get bbox() {\n    return this._getBBox();\n  }\n\n  /**\n   * A vector Path object representing the glyph outline.\n   * @type {Path}\n   */\n  @cache\n  get path() {\n    // Cache the path so we only decode it once\n    // Decoding is actually performed by subclasses\n    return this._getPath();\n  }\n\n  /**\n   * Returns a path scaled to the given font size.\n   * @param {number} size\n   * @return {Path}\n   */\n  getScaledPath(size) {\n    let scale = 1 / this._font.unitsPerEm * size;\n    return this.path.scale(scale);\n  }\n\n  /**\n   * The glyph's advance width.\n   * @type {number}\n   */\n  @cache\n  get advanceWidth() {\n    return this._getMetrics().advanceWidth;\n  }\n\n  /**\n   * The glyph's advance height.\n   * @type {number}\n   */\n  @cache\n  get advanceHeight() {\n    return this._getMetrics().advanceHeight;\n  }\n\n  get ligatureCaretPositions() {}\n\n  _getName() {\n    let { post } = this._font;\n    if (!post) {\n      return null;\n    }\n\n    switch (post.version) {\n      case 1:\n        return StandardNames[this.id];\n\n      case 2:\n        let id = post.glyphNameIndex[this.id];\n        if (id < StandardNames.length) {\n          return StandardNames[id];\n        }\n\n        return post.names[id - StandardNames.length];\n\n      case 2.5:\n        return StandardNames[this.id + post.offsets[this.id]];\n\n      case 4:\n        return String.fromCharCode(post.map[this.id]);\n    }\n  }\n\n  /**\n   * The glyph's name\n   * @type {string}\n   */\n  @cache\n  get name() {\n    return this._getName();\n  }\n\n  /**\n   * Renders the glyph to the given graphics context, at the specified font size.\n   * @param {CanvasRenderingContext2d} ctx\n   * @param {number} size\n   */\n  render(ctx, size) {\n    ctx.save();\n\n    let scale = 1 / this._font.head.unitsPerEm * size;\n    ctx.scale(scale, scale);\n\n    let fn = this.path.toFunction();\n    fn(ctx);\n    ctx.fill();\n\n    ctx.restore();\n  }\n}\n", "import BBox from './BBox';\n\nconst SVG_COMMANDS = {\n  moveTo: 'M',\n  lineTo: 'L',\n  quadraticCurveTo: 'Q',\n  bezierCurveTo: 'C',\n  closePath: 'Z'\n};\n\n/**\n * Path objects are returned by glyphs and represent the actual\n * vector outlines for each glyph in the font. Paths can be converted\n * to SVG path data strings, or to functions that can be applied to\n * render the path to a graphics context.\n */\nexport default class Path {\n  constructor() {\n    this.commands = [];\n    this._bbox = null;\n    this._cbox = null;\n  }\n\n  /**\n   * Compiles the path to a JavaScript function that can be applied with\n   * a graphics context in order to render the path.\n   * @return {string}\n   */\n  toFunction() {\n    return ctx => {\n      this.commands.forEach(c => {\n        return ctx[c.command].apply(ctx, c.args)\n      })\n    };\n  }\n\n  /**\n   * Converts the path to an SVG path data string\n   * @return {string}\n   */\n  toSVG() {\n    let cmds = this.commands.map(c => {\n      let args = c.args.map(arg => Math.round(arg * 100) / 100);\n      return `${SVG_COMMANDS[c.command]}${args.join(' ')}`;\n    });\n\n    return cmds.join('');\n  }\n\n  /**\n   * Gets the \"control box\" of a path.\n   * This is like the bounding box, but it includes all points including\n   * control points of bezier segments and is much faster to compute than\n   * the real bounding box.\n   * @type {BBox}\n   */\n  get cbox() {\n    if (!this._cbox) {\n      let cbox = new BBox;\n      for (let command of this.commands) {\n        for (let i = 0; i < command.args.length; i += 2) {\n          cbox.addPoint(command.args[i], command.args[i + 1]);\n        }\n      }\n\n      this._cbox = Object.freeze(cbox);\n    }\n\n    return this._cbox;\n  }\n\n  /**\n   * Gets the exact bounding box of the path by evaluating curve segments.\n   * Slower to compute than the control box, but more accurate.\n   * @type {BBox}\n   */\n  get bbox() {\n    if (this._bbox) {\n      return this._bbox;\n    }\n\n    let bbox = new BBox;\n    let cx = 0, cy = 0;\n\n    let f = t => (\n      Math.pow(1 - t, 3) * p0[i]\n        + 3 * Math.pow(1 - t, 2) * t * p1[i]\n        + 3 * (1 - t) * Math.pow(t, 2) * p2[i]\n        + Math.pow(t, 3) * p3[i]\n    );\n\n    for (let c of this.commands) {\n      switch (c.command) {\n        case 'moveTo':\n        case 'lineTo':\n          let [x, y] = c.args;\n          bbox.addPoint(x, y);\n          cx = x;\n          cy = y;\n          break;\n\n        case 'quadraticCurveTo':\n        case 'bezierCurveTo':\n          if (c.command === 'quadraticCurveTo') {\n            // http://fontforge.org/bezier.html\n            var [qp1x, qp1y, p3x, p3y] = c.args;\n            var cp1x = cx + 2 / 3 * (qp1x - cx);    // CP1 = QP0 + 2/3 * (QP1-QP0)\n            var cp1y = cy + 2 / 3 * (qp1y - cy);\n            var cp2x = p3x + 2 / 3 * (qp1x - p3x);  // CP2 = QP2 + 2/3 * (QP1-QP2)\n            var cp2y = p3y + 2 / 3 * (qp1y - p3y);\n          } else {\n            var [cp1x, cp1y, cp2x, cp2y, p3x, p3y] = c.args;\n          }\n\n          // http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\n          bbox.addPoint(p3x, p3y);\n\n          var p0 = [cx, cy];\n          var p1 = [cp1x, cp1y];\n          var p2 = [cp2x, cp2y];\n          var p3 = [p3x, p3y];\n\n          for (var i = 0; i <= 1; i++) {\n            let b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];\n            let a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];\n            c = 3 * p1[i] - 3 * p0[i];\n\n            if (a === 0) {\n              if (b === 0) {\n                continue;\n              }\n\n              let t = -c / b;\n              if (0 < t && t < 1) {\n                if (i === 0) {\n                  bbox.addPoint(f(t), bbox.maxY);\n                } else if (i === 1) {\n                  bbox.addPoint(bbox.maxX, f(t));\n                }\n              }\n\n              continue;\n            }\n\n            let b2ac = Math.pow(b, 2) - 4 * c * a;\n            if (b2ac < 0) {\n              continue;\n            }\n\n            let t1 = (-b + Math.sqrt(b2ac)) / (2 * a);\n            if (0 < t1 && t1 < 1) {\n              if (i === 0) {\n                bbox.addPoint(f(t1), bbox.maxY);\n              } else if (i === 1) {\n                bbox.addPoint(bbox.maxX, f(t1));\n              }\n            }\n\n            let t2 = (-b - Math.sqrt(b2ac)) / (2 * a);\n            if (0 < t2 && t2 < 1) {\n              if (i === 0) {\n                bbox.addPoint(f(t2), bbox.maxY);\n              } else if (i === 1) {\n                bbox.addPoint(bbox.maxX, f(t2));\n              }\n            }\n          }\n\n          cx = p3x;\n          cy = p3y;\n          break;\n      }\n    }\n\n    return this._bbox = Object.freeze(bbox);\n  }\n\n  /**\n   * Applies a mapping function to each point in the path.\n   * @param {function} fn\n   * @return {Path}\n   */\n  mapPoints(fn) {\n    let path = new Path;\n\n    for (let c of this.commands) {\n      let args = [];\n      for (let i = 0; i < c.args.length; i += 2) {\n        let [x, y] = fn(c.args[i], c.args[i + 1]);\n        args.push(x, y);\n      }\n\n      path[c.command](...args);\n    }\n\n    return path;\n  }\n\n  /**\n   * Transforms the path by the given matrix.\n   */\n  transform(m0, m1, m2, m3, m4, m5) {\n    return this.mapPoints((x, y) => {\n      const tx = m0 * x + m2 * y + m4;\n      const ty = m1 * x + m3 * y + m5;\n      return [tx, ty];\n    });\n  }\n\n  /**\n   * Translates the path by the given offset.\n   */\n  translate(x, y) {\n    return this.transform(1, 0, 0, 1, x, y);\n  }\n\n  /**\n   * Rotates the path by the given angle (in radians).\n   */\n  rotate(angle) {\n    let cos = Math.cos(angle);\n    let sin = Math.sin(angle);\n    return this.transform(cos, sin, -sin, cos, 0, 0);\n  }\n\n  /**\n   * Scales the path.\n   */\n  scale(scaleX, scaleY = scaleX) {\n    return this.transform(scaleX, 0, 0, scaleY, 0, 0);\n  }\n}\n\nfor (let command of ['moveTo', 'lineTo', 'quadraticCurveTo', 'bezierCurveTo', 'closePath']) {\n  Path.prototype[command] = function(...args) {\n    this._bbox = this._cbox = null;\n    this.commands.push({\n      command,\n      args\n    });\n\n    return this;\n  };\n}\n", "export default [\n  '.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',\n  'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash',\n  'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',\n  'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',\n  'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',\n  'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',\n  'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde',\n  'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis', 'Udieresis', 'aacute', 'agrave',\n  'acircumflex', 'adieresis', 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',\n  'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve', 'ocircumflex', 'odieresis',\n  'otilde', 'uacute', 'ugrave', 'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section',\n  'bullet', 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute', 'dieresis', 'notequal',\n  'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation',\n  'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash', 'questiondown',\n  'exclamdown', 'logicalnot', 'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft', 'guillemotright',\n  'ellipsis', 'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash', 'emdash', 'quotedblleft',\n  'quotedblright', 'quoteleft', 'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction',\n  'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered', 'quotesinglbase',\n  'quotedblbase', 'perthousand', 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute',\n  'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute', 'Ucircumflex',\n  'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut',\n  'ogonek', 'caron', 'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar', 'Eth', 'eth',\n  'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply', 'onesuperior', 'twosuperior', 'threesuperior',\n  'onehalf', 'onequarter', 'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla', 'scedilla',\n  'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat'\n];\n", "import Glyph from './Glyph';\nimport Path from './Path';\n\n/**\n * Represents an OpenType PostScript glyph, in the Compact Font Format.\n */\nexport default class CFFGlyph extends Glyph {\n  type = 'CFF';\n\n  _getName() {\n    if (this._font.CFF2) {\n      return super._getName();\n    }\n\n    return this._font['CFF '].getGlyphName(this.id);\n  }\n\n  bias(s) {\n    if (s.length < 1240) {\n      return 107;\n    } else if (s.length < 33900) {\n      return 1131;\n    } else {\n      return 32768;\n    }\n  }\n\n  _getPath() {\n    let cff = this._font.CFF2 || this._font['CFF '];\n    let { stream } = cff;\n    let str = cff.topDict.CharStrings[this.id];\n    let end = str.offset + str.length;\n    stream.pos = str.offset;\n\n    let path = new Path;\n    let stack = [];\n    let trans = [];\n\n    let width = null;\n    let nStems = 0;\n    let x = 0, y = 0;\n    let usedGsubrs;\n    let usedSubrs;\n    let open = false;\n\n    this._usedGsubrs = usedGsubrs = {};\n    this._usedSubrs = usedSubrs = {};\n\n    let gsubrs = cff.globalSubrIndex || [];\n    let gsubrsBias = this.bias(gsubrs);\n\n    let privateDict = cff.privateDictForGlyph(this.id) || {};\n    let subrs = privateDict.Subrs || [];\n    let subrsBias = this.bias(subrs);\n\n    let vstore = cff.topDict.vstore && cff.topDict.vstore.itemVariationStore;\n    let vsindex = privateDict.vsindex;\n    let variationProcessor = this._font._variationProcessor;\n\n    function checkWidth() {\n      if (width == null) {\n        width = stack.shift() + privateDict.nominalWidthX;\n      }\n    }\n\n    function parseStems() {\n      if (stack.length % 2 !== 0) {\n        checkWidth();\n      }\n\n      nStems += stack.length >> 1;\n      return stack.length = 0;\n    }\n\n    function moveTo(x, y) {\n      if (open) {\n        path.closePath();\n      }\n\n      path.moveTo(x, y);\n      open = true;\n    }\n\n    let parse = function () {\n      while (stream.pos < end) {\n        let op = stream.readUInt8();\n        if (op < 32) {\n          let index, subr, phase;\n          let c1x, c1y, c2x, c2y, c3x, c3y;\n          let c4x, c4y, c5x, c5y, c6x, c6y;\n          let pts;\n\n          switch (op) {\n            case 1:  // hstem\n            case 3:  // vstem\n            case 18: // hstemhm\n            case 23: // vstemhm\n              parseStems();\n              break;\n\n            case 4: // vmoveto\n              if (stack.length > 1) {\n                checkWidth();\n              }\n\n              y += stack.shift();\n              moveTo(x, y);\n              break;\n\n            case 5: // rlineto\n              while (stack.length >= 2) {\n                x += stack.shift();\n                y += stack.shift();\n                path.lineTo(x, y);\n              }\n              break;\n\n            case 6: // hlineto\n            case 7: // vlineto\n              phase = op === 6;\n              while (stack.length >= 1) {\n                if (phase) {\n                  x += stack.shift();\n                } else {\n                  y += stack.shift();\n                }\n\n                path.lineTo(x, y);\n                phase = !phase;\n              }\n              break;\n\n            case 8: // rrcurveto\n              while (stack.length > 0) {\n                c1x = x + stack.shift();\n                c1y = y + stack.shift();\n                c2x = c1x + stack.shift();\n                c2y = c1y + stack.shift();\n                x = c2x + stack.shift();\n                y = c2y + stack.shift();\n                path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y);\n              }\n              break;\n\n            case 10: // callsubr\n              index = stack.pop() + subrsBias;\n              subr = subrs[index];\n              if (subr) {\n                usedSubrs[index] = true;\n                let p = stream.pos;\n                let e = end;\n                stream.pos = subr.offset;\n                end = subr.offset + subr.length;\n                parse();\n                stream.pos = p;\n                end = e;\n              }\n              break;\n\n            case 11: // return\n              if (cff.version >= 2) {\n                break;\n              }\n              return;\n\n            case 14: // endchar\n              if (cff.version >= 2) {\n                break;\n              }\n\n              if (stack.length > 0) {\n                checkWidth();\n              }\n\n              if (open) {\n                path.closePath();\n                open = false;\n              }\n              break;\n\n            case 15: { // vsindex\n              if (cff.version < 2) {\n                throw new Error('vsindex operator not supported in CFF v1');\n              }\n\n              vsindex = stack.pop();\n              break;\n            }\n\n            case 16: { // blend\n              if (cff.version < 2) {\n                throw new Error('blend operator not supported in CFF v1');\n              }\n\n              if (!variationProcessor) {\n                throw new Error('blend operator in non-variation font');\n              }\n\n              let blendVector = variationProcessor.getBlendVector(vstore, vsindex);\n              let numBlends = stack.pop();\n              let numOperands = numBlends * blendVector.length;\n              let delta = stack.length - numOperands;\n              let base = delta - numBlends;\n\n              for (let i = 0; i < numBlends; i++) {\n                let sum = stack[base + i];\n                for (let j = 0; j < blendVector.length; j++) {\n                  sum += blendVector[j] * stack[delta++];\n                }\n\n                stack[base + i] = sum;\n              }\n\n              while (numOperands--) {\n                stack.pop();\n              }\n\n              break;\n            }\n\n            case 19: // hintmask\n            case 20: // cntrmask\n              parseStems();\n              stream.pos += (nStems + 7) >> 3;\n              break;\n\n            case 21: // rmoveto\n              if (stack.length > 2) {\n                checkWidth();\n              }\n\n              x += stack.shift();\n              y += stack.shift();\n              moveTo(x, y);\n              break;\n\n            case 22: // hmoveto\n              if (stack.length > 1) {\n                checkWidth();\n              }\n\n              x += stack.shift();\n              moveTo(x, y);\n              break;\n\n            case 24: // rcurveline\n              while (stack.length >= 8) {\n                c1x = x + stack.shift();\n                c1y = y + stack.shift();\n                c2x = c1x + stack.shift();\n                c2y = c1y + stack.shift();\n                x = c2x + stack.shift();\n                y = c2y + stack.shift();\n                path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y);\n              }\n\n              x += stack.shift();\n              y += stack.shift();\n              path.lineTo(x, y);\n              break;\n\n            case 25: // rlinecurve\n              while (stack.length >= 8) {\n                x += stack.shift();\n                y += stack.shift();\n                path.lineTo(x, y);\n              }\n\n              c1x = x + stack.shift();\n              c1y = y + stack.shift();\n              c2x = c1x + stack.shift();\n              c2y = c1y + stack.shift();\n              x = c2x + stack.shift();\n              y = c2y + stack.shift();\n              path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y);\n              break;\n\n            case 26: // vvcurveto\n              if (stack.length % 2) {\n                x += stack.shift();\n              }\n\n              while (stack.length >= 4) {\n                c1x = x;\n                c1y = y + stack.shift();\n                c2x = c1x + stack.shift();\n                c2y = c1y + stack.shift();\n                x = c2x;\n                y = c2y + stack.shift();\n                path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y);\n              }\n              break;\n\n            case 27: // hhcurveto\n              if (stack.length % 2) {\n                y += stack.shift();\n              }\n\n              while (stack.length >= 4) {\n                c1x = x + stack.shift();\n                c1y = y;\n                c2x = c1x + stack.shift();\n                c2y = c1y + stack.shift();\n                x = c2x + stack.shift();\n                y = c2y;\n                path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y);\n              }\n              break;\n\n            case 28: // shortint\n              stack.push(stream.readInt16BE());\n              break;\n\n            case 29: // callgsubr\n              index = stack.pop() + gsubrsBias;\n              subr = gsubrs[index];\n              if (subr) {\n                usedGsubrs[index] = true;\n                let p = stream.pos;\n                let e = end;\n                stream.pos = subr.offset;\n                end = subr.offset + subr.length;\n                parse();\n                stream.pos = p;\n                end = e;\n              }\n              break;\n\n            case 30: // vhcurveto\n            case 31: // hvcurveto\n              phase = op === 31;\n              while (stack.length >= 4) {\n                if (phase) {\n                  c1x = x + stack.shift();\n                  c1y = y;\n                  c2x = c1x + stack.shift();\n                  c2y = c1y + stack.shift();\n                  y = c2y + stack.shift();\n                  x = c2x + (stack.length === 1 ? stack.shift() : 0);\n                } else {\n                  c1x = x;\n                  c1y = y + stack.shift();\n                  c2x = c1x + stack.shift();\n                  c2y = c1y + stack.shift();\n                  x = c2x + stack.shift();\n                  y = c2y + (stack.length === 1 ? stack.shift() : 0);\n                }\n\n                path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y);\n                phase = !phase;\n              }\n              break;\n\n            case 12:\n              op = stream.readUInt8();\n              switch (op) {\n                case 3: // and\n                  let a = stack.pop();\n                  let b = stack.pop();\n                  stack.push(a && b ? 1 : 0);\n                  break;\n\n                case 4: // or\n                  a = stack.pop();\n                  b = stack.pop();\n                  stack.push(a || b ? 1 : 0);\n                  break;\n\n                case 5: // not\n                  a = stack.pop();\n                  stack.push(a ? 0 : 1);\n                  break;\n\n                case 9: // abs\n                  a = stack.pop();\n                  stack.push(Math.abs(a));\n                  break;\n\n                case 10: // add\n                  a = stack.pop();\n                  b = stack.pop();\n                  stack.push(a + b);\n                  break;\n\n                case 11: // sub\n                  a = stack.pop();\n                  b = stack.pop();\n                  stack.push(a - b);\n                  break;\n\n                case 12: // div\n                  a = stack.pop();\n                  b = stack.pop();\n                  stack.push(a / b);\n                  break;\n\n                case 14: // neg\n                  a = stack.pop();\n                  stack.push(-a);\n                  break;\n\n                case 15: // eq\n                  a = stack.pop();\n                  b = stack.pop();\n                  stack.push(a === b ? 1 : 0);\n                  break;\n\n                case 18: // drop\n                  stack.pop();\n                  break;\n\n                case 20: // put\n                  let val = stack.pop();\n                  let idx = stack.pop();\n                  trans[idx] = val;\n                  break;\n\n                case 21: // get\n                  idx = stack.pop();\n                  stack.push(trans[idx] || 0);\n                  break;\n\n                case 22: // ifelse\n                  let s1 = stack.pop();\n                  let s2 = stack.pop();\n                  let v1 = stack.pop();\n                  let v2 = stack.pop();\n                  stack.push(v1 <= v2 ? s1 : s2);\n                  break;\n\n                case 23: // random\n                  stack.push(Math.random());\n                  break;\n\n                case 24: // mul\n                  a = stack.pop();\n                  b = stack.pop();\n                  stack.push(a * b);\n                  break;\n\n                case 26: // sqrt\n                  a = stack.pop();\n                  stack.push(Math.sqrt(a));\n                  break;\n\n                case 27: // dup\n                  a = stack.pop();\n                  stack.push(a, a);\n                  break;\n\n                case 28: // exch\n                  a = stack.pop();\n                  b = stack.pop();\n                  stack.push(b, a);\n                  break;\n\n                case 29: // index\n                  idx = stack.pop();\n                  if (idx < 0) {\n                    idx = 0;\n                  } else if (idx > stack.length - 1) {\n                    idx = stack.length - 1;\n                  }\n\n                  stack.push(stack[idx]);\n                  break;\n\n                case 30: // roll\n                  let n = stack.pop();\n                  let j = stack.pop();\n\n                  if (j >= 0) {\n                    while (j > 0) {\n                      var t = stack[n - 1];\n                      for (let i = n - 2; i >= 0; i--) {\n                        stack[i + 1] = stack[i];\n                      }\n\n                      stack[0] = t;\n                      j--;\n                    }\n                  } else {\n                    while (j < 0) {\n                      var t = stack[0];\n                      for (let i = 0; i <= n; i++) {\n                        stack[i] = stack[i + 1];\n                      }\n\n                      stack[n - 1] = t;\n                      j++;\n                    }\n                  }\n                  break;\n\n                case 34: // hflex\n                  c1x = x + stack.shift();\n                  c1y = y;\n                  c2x = c1x + stack.shift();\n                  c2y = c1y + stack.shift();\n                  c3x = c2x + stack.shift();\n                  c3y = c2y;\n                  c4x = c3x + stack.shift();\n                  c4y = c3y;\n                  c5x = c4x + stack.shift();\n                  c5y = c4y;\n                  c6x = c5x + stack.shift();\n                  c6y = c5y;\n                  x = c6x;\n                  y = c6y;\n\n                  path.bezierCurveTo(c1x, c1y, c2x, c2y, c3x, c3y);\n                  path.bezierCurveTo(c4x, c4y, c5x, c5y, c6x, c6y);\n                  break;\n\n                case 35: // flex\n                  pts = [];\n\n                  for (let i = 0; i <= 5; i++) {\n                    x += stack.shift();\n                    y += stack.shift();\n                    pts.push(x, y);\n                  }\n\n                  path.bezierCurveTo(...pts.slice(0, 6));\n                  path.bezierCurveTo(...pts.slice(6));\n                  stack.shift(); // fd\n                  break;\n\n                case 36: // hflex1\n                  c1x = x + stack.shift();\n                  c1y = y + stack.shift();\n                  c2x = c1x + stack.shift();\n                  c2y = c1y + stack.shift();\n                  c3x = c2x + stack.shift();\n                  c3y = c2y;\n                  c4x = c3x + stack.shift();\n                  c4y = c3y;\n                  c5x = c4x + stack.shift();\n                  c5y = c4y + stack.shift();\n                  c6x = c5x + stack.shift();\n                  c6y = c5y;\n                  x = c6x;\n                  y = c6y;\n\n                  path.bezierCurveTo(c1x, c1y, c2x, c2y, c3x, c3y);\n                  path.bezierCurveTo(c4x, c4y, c5x, c5y, c6x, c6y);\n                  break;\n\n                case 37: // flex1\n                  let startx = x;\n                  let starty = y;\n\n                  pts = [];\n                  for (let i = 0; i <= 4; i++) {\n                    x += stack.shift();\n                    y += stack.shift();\n                    pts.push(x, y);\n                  }\n\n                  if (Math.abs(x - startx) > Math.abs(y - starty)) { // horizontal\n                    x += stack.shift();\n                    y = starty;\n                  } else {\n                    x = startx;\n                    y += stack.shift();\n                  }\n\n                  pts.push(x, y);\n                  path.bezierCurveTo(...pts.slice(0, 6));\n                  path.bezierCurveTo(...pts.slice(6));\n                  break;\n\n                default:\n                  throw new Error(`Unknown op: 12 ${op}`);\n              }\n              break;\n\n            default:\n              throw new Error(`Unknown op: ${op}`);\n          }\n\n        } else if (op < 247) {\n          stack.push(op - 139);\n        } else if (op < 251) {\n          var b1 = stream.readUInt8();\n          stack.push((op - 247) * 256 + b1 + 108);\n        } else if (op < 255) {\n          var b1 = stream.readUInt8();\n          stack.push(-(op - 251) * 256 - b1 - 108);\n        } else {\n          stack.push(stream.readInt32BE() / 65536);\n        }\n      }\n    };\n\n    parse();\n\n    if (open) {\n      path.closePath();\n    }\n\n    return path;\n  }\n}\n", "import TTFGlyph from './TTFGlyph';\nimport * as r from 'restructure';\n\nlet SBIXImage = new r.Struct({\n  originX: r.uint16,\n  originY: r.uint16,\n  type: new r.String(4),\n  data: new r.Buffer(t => t.parent.buflen - t._currentOffset)\n});\n\n/**\n * Represents a color (e.g. emoji) glyph in Apple's SBIX format.\n */\nexport default class SBIXGlyph extends TTFGlyph {\n  type = 'SBIX';\n\n  /**\n   * Returns an object representing a glyph image at the given point size.\n   * The object has a data property with a Buffer containing the actual image data,\n   * along with the image type, and origin.\n   *\n   * @param {number} size\n   * @return {object}\n   */\n  getImageForSize(size) {\n    for (let i = 0; i < this._font.sbix.imageTables.length; i++) {\n      var table = this._font.sbix.imageTables[i];\n      if (table.ppem >= size) { break; }\n    }\n\n    let offsets = table.imageOffsets;\n    let start = offsets[this.id];\n    let end = offsets[this.id + 1];\n\n    if (start === end) {\n      return null;\n    }\n\n    this._font.stream.pos = start;\n    return SBIXImage.decode(this._font.stream, {buflen: end - start});\n  }\n\n  render(ctx, size) {\n    let img = this.getImageForSize(size);\n    if (img != null) {\n      let scale = size / this._font.unitsPerEm;\n      ctx.image(img.data, {height: size, x: img.originX, y: (this.bbox.minY - img.originY) * scale});\n    }\n\n    if (this._font.sbix.flags.renderOutlines) {\n      super.render(ctx, size);\n    }\n  }\n}\n", "import Glyph from './Glyph';\nimport BBox from './BBox';\n\nclass COLRLayer {\n  constructor(glyph, color) {\n    this.glyph = glyph;\n    this.color = color;\n  }\n}\n\n/**\n * Represents a color (e.g. emoji) glyph in Microsoft's COLR format.\n * Each glyph in this format contain a list of colored layers, each\n * of which  is another vector glyph.\n */\nexport default class COLRGlyph extends Glyph {\n  type = 'COLR';\n\n  _getBBox() {\n    let bbox = new BBox;\n    for (let i = 0; i < this.layers.length; i++) {\n      let layer = this.layers[i];\n      let b = layer.glyph.bbox;\n      bbox.addPoint(b.minX, b.minY);\n      bbox.addPoint(b.maxX, b.maxY);\n    }\n\n    return bbox;\n  }\n\n  /**\n   * Returns an array of objects containing the glyph and color for\n   * each layer in the composite color glyph.\n   * @type {object[]}\n   */\n  get layers() {\n    let cpal = this._font.CPAL;\n    let colr = this._font.COLR;\n    let low = 0;\n    let high = colr.baseGlyphRecord.length - 1;\n\n    while (low <= high) {\n      let mid = (low + high) >> 1;\n      var rec = colr.baseGlyphRecord[mid];\n\n      if (this.id < rec.gid) {\n        high = mid - 1;\n      } else if (this.id > rec.gid) {\n        low = mid + 1;\n      } else {\n        var baseLayer = rec;\n        break;\n      }\n    }\n\n    // if base glyph not found in COLR table,\n    // default to normal glyph from glyf or CFF\n    if (baseLayer == null) {\n      var g = this._font._getBaseGlyph(this.id);\n      var color = {\n        red: 0,\n        green: 0,\n        blue: 0,\n        alpha: 255\n      };\n\n      return [new COLRLayer(g, color)];\n    }\n\n    // otherwise, return an array of all the layers\n    let layers = [];\n    for (let i = baseLayer.firstLayerIndex; i < baseLayer.firstLayerIndex + baseLayer.numLayers; i++) {\n      var rec = colr.layerRecords[i];\n      var color = cpal.colorRecords[rec.paletteIndex];\n      var g = this._font._getBaseGlyph(rec.gid);\n      layers.push(new COLRLayer(g, color));\n    }\n\n    return layers;\n  }\n\n  render(ctx, size) {\n    for (let {glyph, color} of this.layers) {\n      ctx.fillColor([color.red, color.green, color.blue], color.alpha / 255 * 100);\n      glyph.render(ctx, size);\n    }\n\n    return;\n  }\n}\n", "const TUPLES_SHARE_POINT_NUMBERS = 0x8000;\nconst TUPLE_COUNT_MASK           = 0x0fff;\nconst EMBEDDED_TUPLE_COORD       = 0x8000;\nconst INTERMEDIATE_TUPLE         = 0x4000;\nconst PRIVATE_POINT_NUMBERS      = 0x2000;\nconst TUPLE_INDEX_MASK           = 0x0fff;\nconst POINTS_ARE_WORDS           = 0x80;\nconst POINT_RUN_COUNT_MASK       = 0x7f;\nconst DELTAS_ARE_ZERO            = 0x80;\nconst DELTAS_ARE_WORDS           = 0x40;\nconst DELTA_RUN_COUNT_MASK       = 0x3f;\n\n/**\n * This class is transforms TrueType glyphs according to the data from\n * the Apple Advanced Typography variation tables (fvar, gvar, and avar).\n * These tables allow infinite adjustments to glyph weight, width, slant,\n * and optical size without the designer needing to specify every exact style.\n *\n * Apple's documentation for these tables is not great, so thanks to the\n * Freetype project for figuring much of this out.\n *\n * @private\n */\nexport default class GlyphVariationProcessor {\n  constructor(font, coords) {\n    this.font = font;\n    this.normalizedCoords = this.normalizeCoords(coords);\n    this.blendVectors = new Map;\n  }\n\n  normalizeCoords(coords) {\n    // the default mapping is linear along each axis, in two segments:\n    // from the minValue to defaultValue, and from defaultValue to maxValue.\n    let normalized = [];\n    for (var i = 0; i < this.font.fvar.axis.length; i++) {\n      let axis = this.font.fvar.axis[i];\n      if (coords[i] < axis.defaultValue) {\n        normalized.push((coords[i] - axis.defaultValue + Number.EPSILON) / (axis.defaultValue - axis.minValue + Number.EPSILON));\n      } else {\n        normalized.push((coords[i] - axis.defaultValue + Number.EPSILON) / (axis.maxValue - axis.defaultValue + Number.EPSILON));\n      }\n    }\n\n    // if there is an avar table, the normalized value is calculated\n    // by interpolating between the two nearest mapped values.\n    if (this.font.avar) {\n      for (var i = 0; i < this.font.avar.segment.length; i++) {\n        let segment = this.font.avar.segment[i];\n        for (let j = 0; j < segment.correspondence.length; j++) {\n          let pair = segment.correspondence[j];\n          if (j >= 1 && normalized[i] < pair.fromCoord) {\n            let prev = segment.correspondence[j - 1];\n            normalized[i] = ((normalized[i] - prev.fromCoord) * (pair.toCoord - prev.toCoord) + Number.EPSILON) /\n              (pair.fromCoord - prev.fromCoord + Number.EPSILON) +\n              prev.toCoord;\n\n            break;\n          }\n        }\n      }\n    }\n\n    return normalized;\n  }\n\n  transformPoints(gid, glyphPoints) {\n    if (!this.font.fvar || !this.font.gvar) { return; }\n\n    let { gvar } = this.font;\n    if (gid >= gvar.glyphCount) { return; }\n\n    let offset = gvar.offsets[gid];\n    if (offset === gvar.offsets[gid + 1]) { return; }\n\n    // Read the gvar data for this glyph\n    let { stream } = this.font;\n    stream.pos = offset;\n    if (stream.pos >= stream.length) {\n      return;\n    }\n\n    let tupleCount = stream.readUInt16BE();\n    let offsetToData = offset + stream.readUInt16BE();\n\n    if (tupleCount & TUPLES_SHARE_POINT_NUMBERS) {\n      var here = stream.pos;\n      stream.pos = offsetToData;\n      var sharedPoints = this.decodePoints();\n      offsetToData = stream.pos;\n      stream.pos = here;\n    }\n\n    let origPoints = glyphPoints.map(pt => pt.copy());\n\n    tupleCount &= TUPLE_COUNT_MASK;\n    for (let i = 0; i < tupleCount; i++) {\n      let tupleDataSize = stream.readUInt16BE();\n      let tupleIndex = stream.readUInt16BE();\n\n      if (tupleIndex & EMBEDDED_TUPLE_COORD) {\n        var tupleCoords = [];\n        for (let a = 0; a < gvar.axisCount; a++) {\n          tupleCoords.push(stream.readInt16BE() / 16384);\n        }\n\n      } else {\n        if ((tupleIndex & TUPLE_INDEX_MASK) >= gvar.globalCoordCount) {\n          throw new Error('Invalid gvar table');\n        }\n\n        var tupleCoords = gvar.globalCoords[tupleIndex & TUPLE_INDEX_MASK];\n      }\n\n      if (tupleIndex & INTERMEDIATE_TUPLE) {\n        var startCoords = [];\n        for (let a = 0; a < gvar.axisCount; a++) {\n          startCoords.push(stream.readInt16BE() / 16384);\n        }\n\n        var endCoords = [];\n        for (let a = 0; a < gvar.axisCount; a++) {\n          endCoords.push(stream.readInt16BE() / 16384);\n        }\n      }\n\n      // Get the factor at which to apply this tuple\n      let factor = this.tupleFactor(tupleIndex, tupleCoords, startCoords, endCoords);\n      if (factor === 0) {\n        offsetToData += tupleDataSize;\n        continue;\n      }\n\n      var here = stream.pos;\n      stream.pos = offsetToData;\n\n      if (tupleIndex & PRIVATE_POINT_NUMBERS) {\n        var points = this.decodePoints();\n      } else {\n        var points = sharedPoints;\n      }\n\n      // points.length = 0 means there are deltas for all points\n      let nPoints = points.length === 0 ? glyphPoints.length : points.length;\n      let xDeltas = this.decodeDeltas(nPoints);\n      let yDeltas = this.decodeDeltas(nPoints);\n\n      if (points.length === 0) { // all points\n        for (let i = 0; i < glyphPoints.length; i++) {\n          var point = glyphPoints[i];\n          point.x += Math.round(xDeltas[i] * factor);\n          point.y += Math.round(yDeltas[i] * factor);\n        }\n      } else {\n        let outPoints = origPoints.map(pt => pt.copy());\n        let hasDelta = glyphPoints.map(() => false);\n\n        for (let i = 0; i < points.length; i++) {\n          let idx = points[i];\n          if (idx < glyphPoints.length) {\n            let point = outPoints[idx];\n            hasDelta[idx] = true;\n\n            point.x += xDeltas[i] * factor;\n            point.y += yDeltas[i] * factor;\n          }\n        }\n\n        this.interpolateMissingDeltas(outPoints, origPoints, hasDelta);\n\n        for (let i = 0; i < glyphPoints.length; i++) {\n          let deltaX = outPoints[i].x - origPoints[i].x;\n          let deltaY = outPoints[i].y - origPoints[i].y;\n\n          glyphPoints[i].x = Math.round(glyphPoints[i].x + deltaX);\n          glyphPoints[i].y = Math.round(glyphPoints[i].y + deltaY);\n        }\n      }\n\n      offsetToData += tupleDataSize;\n      stream.pos = here;\n    }\n  }\n\n  decodePoints() {\n    let stream = this.font.stream;\n    let count = stream.readUInt8();\n\n    if (count & POINTS_ARE_WORDS) {\n      count = (count & POINT_RUN_COUNT_MASK) << 8 | stream.readUInt8();\n    }\n\n    let points = new Uint16Array(count);\n    let i = 0;\n    let point = 0;\n    while (i < count) {\n      let run = stream.readUInt8();\n      let runCount = (run & POINT_RUN_COUNT_MASK) + 1;\n      let fn = run & POINTS_ARE_WORDS ? stream.readUInt16 : stream.readUInt8;\n\n      for (let j = 0; j < runCount && i < count; j++) {\n        point += fn.call(stream);\n        points[i++] = point;\n      }\n    }\n\n    return points;\n  }\n\n  decodeDeltas(count) {\n    let stream = this.font.stream;\n    let i = 0;\n    let deltas = new Int16Array(count);\n\n    while (i < count) {\n      let run = stream.readUInt8();\n      let runCount = (run & DELTA_RUN_COUNT_MASK) + 1;\n\n      if (run & DELTAS_ARE_ZERO) {\n        i += runCount;\n\n      } else {\n        let fn = run & DELTAS_ARE_WORDS ? stream.readInt16BE : stream.readInt8;\n        for (let j = 0; j < runCount && i < count; j++) {\n          deltas[i++] = fn.call(stream);\n        }\n      }\n    }\n\n    return deltas;\n  }\n\n  tupleFactor(tupleIndex, tupleCoords, startCoords, endCoords) {\n    let normalized = this.normalizedCoords;\n    let { gvar } = this.font;\n    let factor = 1;\n\n    for (let i = 0; i < gvar.axisCount; i++) {\n      if (tupleCoords[i] === 0) {\n        continue;\n      }\n\n      if (normalized[i] === 0) {\n        return 0;\n      }\n\n      if ((tupleIndex & INTERMEDIATE_TUPLE) === 0) {\n        if ((normalized[i] < Math.min(0, tupleCoords[i])) ||\n            (normalized[i] > Math.max(0, tupleCoords[i]))) {\n          return 0;\n        }\n\n        factor = (factor * normalized[i] + Number.EPSILON) / (tupleCoords[i] + Number.EPSILON);\n      } else {\n        if ((normalized[i] < startCoords[i]) ||\n            (normalized[i] > endCoords[i])) {\n          return 0;\n\n        } else if (normalized[i] < tupleCoords[i]) {\n          factor = factor * (normalized[i] - startCoords[i] + Number.EPSILON) / (tupleCoords[i] - startCoords[i] + Number.EPSILON);\n\n        } else {\n          factor = factor * (endCoords[i] - normalized[i] + Number.EPSILON) / (endCoords[i] - tupleCoords[i] + Number.EPSILON);\n        }\n      }\n    }\n\n    return factor;\n  }\n\n  // Interpolates points without delta values.\n  // Needed for the Ø and Q glyphs in Skia.\n  // Algorithm from Freetype.\n  interpolateMissingDeltas(points, inPoints, hasDelta) {\n    if (points.length === 0) {\n      return;\n    }\n\n    let point = 0;\n    while (point < points.length) {\n      let firstPoint = point;\n\n      // find the end point of the contour\n      let endPoint = point;\n      let pt = points[endPoint];\n      while (!pt.endContour) {\n        pt = points[++endPoint];\n      }\n\n      // find the first point that has a delta\n      while (point <= endPoint && !hasDelta[point]) {\n        point++;\n      }\n\n      if (point > endPoint) {\n        continue;\n      }\n\n      let firstDelta = point;\n      let curDelta = point;\n      point++;\n\n      while (point <= endPoint) {\n        // find the next point with a delta, and interpolate intermediate points\n        if (hasDelta[point]) {\n          this.deltaInterpolate(curDelta + 1, point - 1, curDelta, point, inPoints, points);\n          curDelta = point;\n        }\n\n        point++;\n      }\n\n      // shift contour if we only have a single delta\n      if (curDelta === firstDelta) {\n        this.deltaShift(firstPoint, endPoint, curDelta, inPoints, points);\n      } else {\n        // otherwise, handle the remaining points at the end and beginning of the contour\n        this.deltaInterpolate(curDelta + 1, endPoint, curDelta, firstDelta, inPoints, points);\n\n        if (firstDelta > 0) {\n          this.deltaInterpolate(firstPoint, firstDelta - 1, curDelta, firstDelta, inPoints, points);\n        }\n      }\n\n      point = endPoint + 1;\n    }\n  }\n\n  deltaInterpolate(p1, p2, ref1, ref2, inPoints, outPoints) {\n    if (p1 > p2) {\n      return;\n    }\n\n    let iterable = ['x', 'y'];\n    for (let i = 0; i < iterable.length; i++) {\n      let k = iterable[i];\n      if (inPoints[ref1][k] > inPoints[ref2][k]) {\n        var p = ref1;\n        ref1 = ref2;\n        ref2 = p;\n      }\n\n      let in1 = inPoints[ref1][k];\n      let in2 = inPoints[ref2][k];\n      let out1 = outPoints[ref1][k];\n      let out2 = outPoints[ref2][k];\n\n      // If the reference points have the same coordinate but different\n      // delta, inferred delta is zero.  Otherwise interpolate.\n      if (in1 !== in2 || out1 === out2) {\n        let scale = in1 === in2 ? 0 : (out2 - out1) / (in2 - in1);\n\n        for (let p = p1; p <= p2; p++) {\n          let out = inPoints[p][k];\n\n          if (out <= in1) {\n            out += out1 - in1;\n          } else if (out >= in2) {\n            out += out2 - in2;\n          } else {\n            out = out1 + (out - in1) * scale;\n          }\n\n          outPoints[p][k] = out;\n        }\n      }\n    }\n  }\n\n  deltaShift(p1, p2, ref, inPoints, outPoints) {\n    let deltaX = outPoints[ref].x - inPoints[ref].x;\n    let deltaY = outPoints[ref].y - inPoints[ref].y;\n\n    if (deltaX === 0 && deltaY === 0) {\n      return;\n    }\n\n    for (let p = p1; p <= p2; p++) {\n      if (p !== ref) {\n        outPoints[p].x += deltaX;\n        outPoints[p].y += deltaY;\n      }\n    }\n  }\n\n  getAdvanceAdjustment(gid, table) {\n    let outerIndex, innerIndex;\n\n    if (table.advanceWidthMapping) {\n      let idx = gid;\n      if (idx >= table.advanceWidthMapping.mapCount) {\n        idx = table.advanceWidthMapping.mapCount - 1;\n      }\n\n      let entryFormat = table.advanceWidthMapping.entryFormat;\n      ({outerIndex, innerIndex} = table.advanceWidthMapping.mapData[idx]);\n    } else {\n      outerIndex = 0;\n      innerIndex = gid;\n    }\n\n    return this.getDelta(table.itemVariationStore, outerIndex, innerIndex);\n  }\n\n  // See pseudo code from `Font Variations Overview'\n  // in the OpenType specification.\n  getDelta(itemStore, outerIndex, innerIndex) {\n    if (outerIndex >= itemStore.itemVariationData.length) {\n      return 0;\n    }\n\n    let varData = itemStore.itemVariationData[outerIndex];\n    if (innerIndex >= varData.deltaSets.length) {\n      return 0;\n    }\n\n    let deltaSet = varData.deltaSets[innerIndex];\n    let blendVector = this.getBlendVector(itemStore, outerIndex);\n    let netAdjustment = 0;\n\n    for (let master = 0; master < varData.regionIndexCount; master++) {\n      netAdjustment += deltaSet.deltas[master] * blendVector[master];\n    }\n\n    return netAdjustment;\n  }\n\n  getBlendVector(itemStore, outerIndex) {\n    let varData = itemStore.itemVariationData[outerIndex];\n    if (this.blendVectors.has(varData)) {\n      return this.blendVectors.get(varData);\n    }\n\n    let normalizedCoords = this.normalizedCoords;\n    let blendVector = [];\n\n    // outer loop steps through master designs to be blended\n    for (let master = 0; master < varData.regionIndexCount; master++) {\n      let scalar = 1;\n      let regionIndex = varData.regionIndexes[master];\n      let axes = itemStore.variationRegionList.variationRegions[regionIndex];\n\n      // inner loop steps through axes in this region\n      for (let j = 0; j < axes.length; j++) {\n        let axis = axes[j];\n        let axisScalar;\n\n        // compute the scalar contribution of this axis\n        // ignore invalid ranges\n        if (axis.startCoord > axis.peakCoord || axis.peakCoord > axis.endCoord) {\n          axisScalar = 1;\n\n        } else if (axis.startCoord < 0 && axis.endCoord > 0 && axis.peakCoord !== 0) {\n          axisScalar = 1;\n\n        // peak of 0 means ignore this axis\n        } else if (axis.peakCoord === 0) {\n          axisScalar = 1;\n\n        // ignore this region if coords are out of range\n        } else if (normalizedCoords[j] < axis.startCoord || normalizedCoords[j] > axis.endCoord) {\n          axisScalar = 0;\n\n        // calculate a proportional factor\n        } else {\n          if (normalizedCoords[j] === axis.peakCoord) {\n            axisScalar = 1;\n          } else if (normalizedCoords[j] < axis.peakCoord) {\n            axisScalar = (normalizedCoords[j] - axis.startCoord + Number.EPSILON) /\n              (axis.peakCoord - axis.startCoord + Number.EPSILON);\n          } else {\n            axisScalar = (axis.endCoord - normalizedCoords[j] + Number.EPSILON) /\n              (axis.endCoord - axis.peakCoord + Number.EPSILON);\n          }\n        }\n\n        // take product of all the axis scalars\n        scalar *= axisScalar;\n      }\n\n      blendVector[master] = scalar;\n    }\n\n    this.blendVectors.set(varData, blendVector);\n    return blendVector;\n  }\n}\n", "import cloneDeep from 'clone';\nimport Subset from './Subset';\nimport Directory from '../tables/directory';\nimport Tables from '../tables';\nimport TTFGlyphEncoder from '../glyph/TTFGlyphEncoder';\n\nexport default class TTFSubset extends Subset {\n  constructor(font) {\n    super(font);\n    this.glyphEncoder = new TTFGlyphEncoder;\n  }\n\n  _addGlyph(gid) {\n    let glyph = this.font.getGlyph(gid);\n    let glyf = glyph._decode();\n\n    // get the offset to the glyph from the loca table\n    let curOffset = this.font.loca.offsets[gid];\n    let nextOffset = this.font.loca.offsets[gid + 1];\n\n    let stream = this.font._getTableStream('glyf');\n    stream.pos += curOffset;\n\n    let buffer = stream.readBuffer(nextOffset - curOffset);\n\n    // if it is a compound glyph, include its components\n    if (glyf && glyf.numberOfContours < 0) {\n      buffer = new Uint8Array(buffer);\n      let view = new DataView(buffer.buffer);\n      for (let component of glyf.components) {\n        gid = this.includeGlyph(component.glyphID);\n        view.setUint16(component.pos, gid);\n      }\n    } else if (glyf && this.font._variationProcessor) {\n      // If this is a TrueType variation glyph, re-encode the path\n      buffer = this.glyphEncoder.encodeSimple(glyph.path, glyf.instructions);\n    }\n\n    this.glyf.push(buffer);\n    this.loca.offsets.push(this.offset);\n\n    this.hmtx.metrics.push({\n      advance: glyph.advanceWidth,\n      bearing: glyph._getMetrics().leftBearing\n    });\n\n    this.offset += buffer.length;\n    return this.glyf.length - 1;\n  }\n\n  encode() {\n    // tables required by PDF spec:\n    //   head, hhea, loca, maxp, cvt , prep, glyf, hmtx, fpgm\n    //\n    // additional tables required for standalone fonts:\n    //   name, cmap, OS/2, post\n\n    this.glyf = [];\n    this.offset = 0;\n    this.loca = {\n      offsets: [],\n      version: this.font.loca.version\n    };\n\n    this.hmtx = {\n      metrics: [],\n      bearings: []\n    };\n\n    // include all the glyphs\n    // not using a for loop because we need to support adding more\n    // glyphs to the array as we go, and CoffeeScript caches the length.\n    let i = 0;\n    while (i < this.glyphs.length) {\n      this._addGlyph(this.glyphs[i++]);\n    }\n\n    let maxp = cloneDeep(this.font.maxp);\n    maxp.numGlyphs = this.glyf.length;\n\n    this.loca.offsets.push(this.offset);\n\n    let head = cloneDeep(this.font.head);\n    head.indexToLocFormat = this.loca.version;\n\n    let hhea = cloneDeep(this.font.hhea);\n    hhea.numberOfMetrics = this.hmtx.metrics.length;\n\n    // map = []\n    // for index in [0...256]\n    //     if index < @numGlyphs\n    //         map[index] = index\n    //     else\n    //         map[index] = 0\n    //\n    // cmapTable =\n    //     version: 0\n    //     length: 262\n    //     language: 0\n    //     codeMap: map\n    //\n    // cmap =\n    //     version: 0\n    //     numSubtables: 1\n    //     tables: [\n    //         platformID: 1\n    //         encodingID: 0\n    //         table: cmapTable\n    //     ]\n\n    // TODO: subset prep, cvt, fpgm?\n    return Directory.toBuffer({\n      tables: {\n        head,\n        hhea,\n        loca: this.loca,\n        maxp,\n        'cvt ': this.font['cvt '],\n        prep: this.font.prep,\n        glyf: this.glyf,\n        hmtx: this.hmtx,\n        fpgm: this.font.fpgm\n\n        // name: clone @font.name\n        // 'OS/2': clone @font['OS/2']\n        // post: clone @font.post\n        // cmap: cmap\n      }\n    });\n  }\n}\n", "import * as r from 'restructure';\n\nconst resolved = Promise.resolve();\n\nexport default class Subset {\n  constructor(font) {\n    this.font = font;\n    this.glyphs = [];\n    this.mapping = {};\n\n    // always include the missing glyph\n    this.includeGlyph(0);\n  }\n\n  includeGlyph(glyph) {\n    if (typeof glyph === 'object') {\n      glyph = glyph.id;\n    }\n\n    if (this.mapping[glyph] == null) {\n      this.glyphs.push(glyph);\n      this.mapping[glyph] = this.glyphs.length - 1;\n    }\n\n    return this.mapping[glyph];\n  }\n}\n", "import * as r from 'restructure';\n\n// Flags for simple glyphs\nconst ON_CURVE        = 1 << 0;\nconst X_SHORT_VECTOR  = 1 << 1;\nconst Y_SHORT_VECTOR  = 1 << 2;\nconst REPEAT          = 1 << 3;\nconst SAME_X          = 1 << 4;\nconst SAME_Y          = 1 << 5;\n\nclass Point {\n  static size(val) {\n    return val >= 0 && val <= 255 ? 1 : 2;\n  }\n  \n  static encode(stream, value) {\n    if (value >= 0 && value <= 255) {\n      stream.writeUInt8(value);\n    } else {\n      stream.writeInt16BE(value);\n    }\n  }\n}\n\nlet Glyf = new r.Struct({\n  numberOfContours: r.int16, // if negative, this is a composite glyph\n  xMin: r.int16,\n  yMin: r.int16,\n  xMax: r.int16,\n  yMax: r.int16,\n  endPtsOfContours: new r.Array(r.uint16, 'numberOfContours'),\n  instructions: new r.Array(r.uint8, r.uint16),\n  flags: new r.Array(r.uint8, 0),\n  xPoints: new r.Array(Point, 0),\n  yPoints: new r.Array(Point, 0)\n});\n\n/**\n * Encodes TrueType glyph outlines\n */\nexport default class TTFGlyphEncoder {\n  encodeSimple(path, instructions = []) {\n    let endPtsOfContours = [];\n    let xPoints = [];\n    let yPoints = [];\n    let flags = [];\n    let same = 0;\n    let lastX = 0, lastY = 0, lastFlag = 0;\n    let pointCount = 0;\n    \n    for (let i = 0; i < path.commands.length; i++) {\n      let c = path.commands[i];\n      \n      for (let j = 0; j < c.args.length; j += 2) {\n        let x = c.args[j];\n        let y = c.args[j + 1];\n        let flag = 0;\n        \n        // If the ending point of a quadratic curve is the midpoint\n        // between the control point and the control point of the next\n        // quadratic curve, we can omit the ending point.\n        if (c.command === 'quadraticCurveTo' && j === 2) {\n          let next = path.commands[i + 1];\n          if (next && next.command === 'quadraticCurveTo') {\n            let midX = (lastX + next.args[0]) / 2;\n            let midY = (lastY + next.args[1]) / 2;\n            \n            if (x === midX && y === midY) {\n              continue;\n            }\n          }\n        }\n        \n        // All points except control points are on curve.\n        if (!(c.command === 'quadraticCurveTo' && j === 0)) {\n          flag |= ON_CURVE;\n        }\n        \n        flag = this._encodePoint(x, lastX, xPoints, flag, X_SHORT_VECTOR, SAME_X);\n        flag = this._encodePoint(y, lastY, yPoints, flag, Y_SHORT_VECTOR, SAME_Y);\n        \n        if (flag === lastFlag && same < 255) {\n          flags[flags.length - 1] |= REPEAT;\n          same++;\n        } else {\n          if (same > 0) {\n            flags.push(same);\n            same = 0;\n          }\n      \n          flags.push(flag);\n          lastFlag = flag;\n        }\n        \n        lastX = x;\n        lastY = y;\n        pointCount++;\n      }\n  \n      if (c.command === 'closePath') {\n        endPtsOfContours.push(pointCount - 1);\n      }\n    }\n\n    // Close the path if the last command didn't already\n    if (path.commands.length > 1 && path.commands[path.commands.length - 1].command !== 'closePath') {\n      endPtsOfContours.push(pointCount - 1);\n    }\n    \n    let bbox = path.bbox;\n    let glyf = {\n      numberOfContours: endPtsOfContours.length,\n      xMin: bbox.minX,\n      yMin: bbox.minY,\n      xMax: bbox.maxX,\n      yMax: bbox.maxY,\n      endPtsOfContours: endPtsOfContours,\n      instructions: instructions,\n      flags: flags,\n      xPoints: xPoints,\n      yPoints: yPoints\n    };\n    \n    let size = Glyf.size(glyf);\n    let tail = 4 - (size % 4);\n    \n    let stream = new r.EncodeStream(size + tail);\n    Glyf.encode(stream, glyf);\n    \n    // Align to 4-byte length\n    if (tail !== 0) {\n      stream.fill(0, tail);\n    }\n    \n    return stream.buffer;\n  }\n  \n  _encodePoint(value, last, points, flag, shortFlag, sameFlag) {\n    let diff = value - last;\n    \n    if (value === last) {\n      flag |= sameFlag;\n    } else {\n      if (-255 <= diff && diff <= 255) {\n        flag |= shortFlag;\n        if (diff < 0) {\n          diff = -diff;\n        } else {\n          flag |= sameFlag;\n        }\n      }\n      \n      points.push(diff);\n    }\n    \n    return flag;\n  }\n}\n", "import Subset from './Subset';\nimport CFFTop from '../cff/CFFTop';\nimport CFFPrivateDict from '../cff/CFFPrivateDict';\nimport standardStrings from '../cff/CFFStandardStrings';\n\nexport default class CFFSubset extends Subset {\n  constructor(font) {\n    super(font);\n\n    this.cff = this.font['CFF '];\n    if (!this.cff) {\n      throw new Error('Not a CFF Font');\n    }\n  }\n\n  subsetCharstrings() {\n    this.charstrings = [];\n    let gsubrs = {};\n\n    for (let gid of this.glyphs) {\n      this.charstrings.push(this.cff.getCharString(gid));\n\n      let glyph = this.font.getGlyph(gid);\n      let path = glyph.path; // this causes the glyph to be parsed\n\n      for (let subr in glyph._usedGsubrs) {\n        gsubrs[subr] = true;\n      }\n    }\n\n    this.gsubrs = this.subsetSubrs(this.cff.globalSubrIndex, gsubrs);\n  }\n\n  subsetSubrs(subrs, used) {\n    let res = [];\n    for (let i = 0; i < subrs.length; i++) {\n      let subr = subrs[i];\n      if (used[i]) {\n        this.cff.stream.pos = subr.offset;\n        res.push(this.cff.stream.readBuffer(subr.length));\n      } else {\n        res.push(new Uint8Array([11])); // return\n      }\n    }\n\n    return res;\n  }\n\n  subsetFontdict(topDict) {\n    topDict.FDArray = [];\n    topDict.FDSelect = {\n      version: 0,\n      fds: []\n    };\n\n    let used_fds = {};\n    let used_subrs = [];\n    let fd_select = {};\n    for (let gid of this.glyphs) {\n      let fd = this.cff.fdForGlyph(gid);\n      if (fd == null) {\n        continue;\n      }\n\n      if (!used_fds[fd]) {\n        topDict.FDArray.push(Object.assign({}, this.cff.topDict.FDArray[fd]));\n        used_subrs.push({});\n        fd_select[fd] = topDict.FDArray.length - 1;\n      }\n\n      used_fds[fd] = true;\n      topDict.FDSelect.fds.push(fd_select[fd]);\n\n      let glyph = this.font.getGlyph(gid);\n      let path = glyph.path; // this causes the glyph to be parsed\n      for (let subr in glyph._usedSubrs) {\n        used_subrs[fd_select[fd]][subr] = true;\n      }\n    }\n\n    for (let i = 0; i < topDict.FDArray.length; i++) {\n      let dict = topDict.FDArray[i];\n      delete dict.FontName;\n      if (dict.Private && dict.Private.Subrs) {\n        dict.Private = Object.assign({}, dict.Private);\n        dict.Private.Subrs = this.subsetSubrs(dict.Private.Subrs, used_subrs[i]);\n      }\n    }\n\n    return;\n  }\n\n  createCIDFontdict(topDict) {\n    let used_subrs = {};\n    for (let gid of this.glyphs) {\n      let glyph = this.font.getGlyph(gid);\n      let path = glyph.path; // this causes the glyph to be parsed\n\n      for (let subr in glyph._usedSubrs) {\n        used_subrs[subr] = true;\n      }\n    }\n\n    let privateDict = Object.assign({}, this.cff.topDict.Private);\n    if (this.cff.topDict.Private && this.cff.topDict.Private.Subrs) {\n      privateDict.Subrs = this.subsetSubrs(this.cff.topDict.Private.Subrs, used_subrs);\n    }\n\n    topDict.FDArray = [{ Private: privateDict }];\n    return topDict.FDSelect = {\n      version: 3,\n      nRanges: 1,\n      ranges: [{ first: 0, fd: 0 }],\n      sentinel: this.charstrings.length\n    };\n  }\n\n  addString(string) {\n    if (!string) {\n      return null;\n    }\n\n    if (!this.strings) {\n      this.strings = [];\n    }\n\n    this.strings.push(string);\n    return standardStrings.length + this.strings.length - 1;\n  }\n\n  encode() {\n    this.subsetCharstrings();\n\n    let charset = {\n      version: this.charstrings.length > 255 ? 2 : 1,\n      ranges: [{ first: 1, nLeft: this.charstrings.length - 2 }]\n    };\n\n    let topDict = Object.assign({}, this.cff.topDict);\n    topDict.Private = null;\n    topDict.charset = charset;\n    topDict.Encoding = null;\n    topDict.CharStrings = this.charstrings;\n\n    for (let key of ['version', 'Notice', 'Copyright', 'FullName', 'FamilyName', 'Weight', 'PostScript', 'BaseFontName', 'FontName']) {\n      topDict[key] = this.addString(this.cff.string(topDict[key]));\n    }\n\n    topDict.ROS = [this.addString('Adobe'), this.addString('Identity'), 0];\n    topDict.CIDCount = this.charstrings.length;\n\n    if (this.cff.isCIDFont) {\n      this.subsetFontdict(topDict);\n    } else {\n      this.createCIDFontdict(topDict);\n    }\n\n    let top = {\n      version: 1,\n      hdrSize: this.cff.hdrSize,\n      offSize: 4,\n      header: this.cff.header,\n      nameIndex: [this.cff.postscriptName],\n      topDictIndex: [topDict],\n      stringIndex: this.strings,\n      globalSubrIndex: this.gsubrs\n    };\n\n    return CFFTop.toBuffer(top);\n  }\n}\n", "import TTFFont from './TTFFont';\nimport WOFFDirectory from './tables/WOFFDirectory';\nimport tables from './tables';\nimport inflate from 'tiny-inflate';\nimport * as r from 'restructure';\nimport { asciiDecoder } from './utils';\n\nexport default class WOFFFont extends TTFFont {\n  type = 'WOFF';\n\n  static probe(buffer) {\n    return asciiDecoder.decode(buffer.slice(0, 4)) === 'wOFF';\n  }\n\n  _decodeDirectory() {\n    this.directory = WOFFDirectory.decode(this.stream, { _startOffset: 0 });\n  }\n\n  _getTableStream(tag) {\n    let table = this.directory.tables[tag];\n    if (table) {\n      this.stream.pos = table.offset;\n\n      if (table.compLength < table.length) {\n        this.stream.pos += 2; // skip deflate header\n        let outBuffer = new Uint8Array(table.length);\n        let buf = inflate(this.stream.readBuffer(table.compLength - 2), outBuffer);\n        return new r.DecodeStream(buf);\n      } else {\n        return this.stream;\n      }\n    }\n\n    return null;\n  }\n}\n", "import * as r from 'restructure';\nimport tables from './';\n\nlet WOFFDirectoryEntry = new r.Struct({\n  tag:          new r.String(4),\n  offset:       new r.Pointer(r.uint32, 'void', {type: 'global'}),\n  compLength:   r.uint32,\n  length:       r.uint32,\n  origChecksum: r.uint32\n});\n\nlet WOFFDirectory = new r.Struct({\n  tag:            new r.String(4), // should be 'wOFF'\n  flavor:         r.uint32,\n  length:         r.uint32,\n  numTables:      r.uint16,\n  reserved:       new r.Reserved(r.uint16),\n  totalSfntSize:  r.uint32,\n  majorVersion:   r.uint16,\n  minorVersion:   r.uint16,\n  metaOffset:     r.uint32,\n  metaLength:     r.uint32,\n  metaOrigLength: r.uint32,\n  privOffset:     r.uint32,\n  privLength:     r.uint32,\n  tables:         new r.Array(WOFFDirectoryEntry, 'numTables')\n});\n\nWOFFDirectory.process = function() {\n  let tables = {};\n  for (let table of this.tables) {\n    tables[table.tag] = table;\n  }\n\n  this.tables = tables;\n};\n\nexport default WOFFDirectory;\n", "import * as r from 'restructure';\nimport brotli from 'brotli/decompress.js';\nimport TTFFont from './TTFFont';\nimport TTFGlyph, { Point } from './glyph/TTFGlyph';\nimport WOFF2Glyph from './glyph/WOFF2Glyph';\nimport WOFF2Directory from './tables/WOFF2Directory';\nimport { asciiDecoder } from './utils';\n\n/**\n * Subclass of TTFFont that represents a TTF/OTF font compressed by WOFF2\n * See spec here: http://www.w3.org/TR/WOFF2/\n */\nexport default class WOFF2Font extends TTFFont {\n  type = 'WOFF2';\n\n  static probe(buffer) {\n    return asciiDecoder.decode(buffer.slice(0, 4)) === 'wOF2';\n  }\n\n  _decodeDirectory() {\n    this.directory = WOFF2Directory.decode(this.stream);\n    this._dataPos = this.stream.pos;\n  }\n\n  _decompress() {\n    // decompress data and setup table offsets if we haven't already\n    if (!this._decompressed) {\n      this.stream.pos = this._dataPos;\n      let buffer = this.stream.readBuffer(this.directory.totalCompressedSize);\n\n      let decompressedSize = 0;\n      for (let tag in this.directory.tables) {\n        let entry = this.directory.tables[tag];\n        entry.offset = decompressedSize;\n        decompressedSize += (entry.transformLength != null) ? entry.transformLength : entry.length;\n      }\n\n      let decompressed = brotli(buffer, decompressedSize);\n      if (!decompressed) {\n        throw new Error('Error decoding compressed data in WOFF2');\n      }\n\n      this.stream = new r.DecodeStream(decompressed);\n      this._decompressed = true;\n    }\n  }\n\n  _decodeTable(table) {\n    this._decompress();\n    return super._decodeTable(table);\n  }\n\n  // Override this method to get a glyph and return our\n  // custom subclass if there is a glyf table.\n  _getBaseGlyph(glyph, characters = []) {\n    if (!this._glyphs[glyph]) {\n      if (this.directory.tables.glyf && this.directory.tables.glyf.transformed) {\n        if (!this._transformedGlyphs) { this._transformGlyfTable(); }\n        return this._glyphs[glyph] = new WOFF2Glyph(glyph, characters, this);\n\n      } else {\n        return super._getBaseGlyph(glyph, characters);\n      }\n    }\n  }\n\n  _transformGlyfTable() {\n    this._decompress();\n    this.stream.pos = this.directory.tables.glyf.offset;\n    let table = GlyfTable.decode(this.stream);\n    let glyphs = [];\n\n    for (let index = 0; index < table.numGlyphs; index++) {\n      let glyph = {};\n      let nContours = table.nContours.readInt16BE();\n      glyph.numberOfContours = nContours;\n\n      if (nContours > 0) { // simple glyph\n        let nPoints = [];\n        let totalPoints = 0;\n\n        for (let i = 0; i < nContours; i++) {\n          let r = read255UInt16(table.nPoints);\n          totalPoints += r;\n          nPoints.push(totalPoints);\n        }\n\n        glyph.points = decodeTriplet(table.flags, table.glyphs, totalPoints);\n        for (let i = 0; i < nContours; i++) {\n          glyph.points[nPoints[i] - 1].endContour = true;\n        }\n\n        var instructionSize = read255UInt16(table.glyphs);\n\n      } else if (nContours < 0) { // composite glyph\n        let haveInstructions = TTFGlyph.prototype._decodeComposite.call({ _font: this }, glyph, table.composites);\n        if (haveInstructions) {\n          var instructionSize = read255UInt16(table.glyphs);\n        }\n      }\n\n      glyphs.push(glyph);\n    }\n\n    this._transformedGlyphs = glyphs;\n  }\n}\n\n// Special class that accepts a length and returns a sub-stream for that data\nclass Substream {\n  constructor(length) {\n    this.length = length;\n    this._buf = new r.Buffer(length);\n  }\n\n  decode(stream, parent) {\n    return new r.DecodeStream(this._buf.decode(stream, parent));\n  }\n}\n\n// This struct represents the entire glyf table\nlet GlyfTable = new r.Struct({\n  version: r.uint32,\n  numGlyphs: r.uint16,\n  indexFormat: r.uint16,\n  nContourStreamSize: r.uint32,\n  nPointsStreamSize: r.uint32,\n  flagStreamSize: r.uint32,\n  glyphStreamSize: r.uint32,\n  compositeStreamSize: r.uint32,\n  bboxStreamSize: r.uint32,\n  instructionStreamSize: r.uint32,\n  nContours: new Substream('nContourStreamSize'),\n  nPoints: new Substream('nPointsStreamSize'),\n  flags: new Substream('flagStreamSize'),\n  glyphs: new Substream('glyphStreamSize'),\n  composites: new Substream('compositeStreamSize'),\n  bboxes: new Substream('bboxStreamSize'),\n  instructions: new Substream('instructionStreamSize')\n});\n\nconst WORD_CODE = 253;\nconst ONE_MORE_BYTE_CODE2 = 254;\nconst ONE_MORE_BYTE_CODE1 = 255;\nconst LOWEST_U_CODE = 253;\n\nfunction read255UInt16(stream) {\n  let code = stream.readUInt8();\n\n  if (code === WORD_CODE) {\n    return stream.readUInt16BE();\n  }\n\n  if (code === ONE_MORE_BYTE_CODE1) {\n    return stream.readUInt8() + LOWEST_U_CODE;\n  }\n\n  if (code === ONE_MORE_BYTE_CODE2) {\n    return stream.readUInt8() + LOWEST_U_CODE * 2;\n  }\n\n  return code;\n}\n\nfunction withSign(flag, baseval) {\n  return flag & 1 ? baseval : -baseval;\n}\n\nfunction decodeTriplet(flags, glyphs, nPoints) {\n  let y;\n  let x = y = 0;\n  let res = [];\n\n  for (let i = 0; i < nPoints; i++) {\n    let dx = 0, dy = 0;\n    let flag = flags.readUInt8();\n    let onCurve = !(flag >> 7);\n    flag &= 0x7f;\n\n    if (flag < 10) {\n      dx = 0;\n      dy = withSign(flag, ((flag & 14) << 7) + glyphs.readUInt8());\n\n    } else if (flag < 20) {\n      dx = withSign(flag, (((flag - 10) & 14) << 7) + glyphs.readUInt8());\n      dy = 0;\n\n    } else if (flag < 84) {\n      var b0 = flag - 20;\n      var b1 = glyphs.readUInt8();\n      dx = withSign(flag, 1 + (b0 & 0x30) + (b1 >> 4));\n      dy = withSign(flag >> 1, 1 + ((b0 & 0x0c) << 2) + (b1 & 0x0f));\n\n    } else if (flag < 120) {\n      var b0 = flag - 84;\n      dx = withSign(flag, 1 + ((b0 / 12) << 8) + glyphs.readUInt8());\n      dy = withSign(flag >> 1, 1 + (((b0 % 12) >> 2) << 8) + glyphs.readUInt8());\n\n    } else if (flag < 124) {\n      var b1 = glyphs.readUInt8();\n      let b2 = glyphs.readUInt8();\n      dx = withSign(flag, (b1 << 4) + (b2 >> 4));\n      dy = withSign(flag >> 1, ((b2 & 0x0f) << 8) + glyphs.readUInt8());\n\n    } else {\n      dx = withSign(flag, glyphs.readUInt16BE());\n      dy = withSign(flag >> 1, glyphs.readUInt16BE());\n    }\n\n    x += dx;\n    y += dy;\n    res.push(new Point(onCurve, false, x, y));\n  }\n\n  return res;\n}\n", "import TTFGlyph from './TTFGlyph';\n\n/**\n * Represents a TrueType glyph in the WOFF2 format, which compresses glyphs differently.\n */\nexport default class WOFF2Glyph extends TTFGlyph {\n  type = 'WOFF2';\n\n  _decode() {\n    // We have to decode in advance (in WOFF2Font), so just return the pre-decoded data.\n    return this._font._transformedGlyphs[this.id];\n  }\n\n  _getCBox() {\n    return this.path.bbox;\n  }\n}\n", "import * as r from 'restructure';\n\nconst Base128 = {\n  decode(stream) {\n    let result = 0;\n    let iterable = [0, 1, 2, 3, 4];\n    for (let j = 0; j < iterable.length; j++) {\n      let i = iterable[j];\n      let code = stream.readUInt8();\n\n      // If any of the top seven bits are set then we're about to overflow.\n      if (result & 0xe0000000) {\n        throw new Error('Overflow');\n      }\n\n      result = (result << 7) | (code & 0x7f);\n      if ((code & 0x80) === 0) {\n        return result;\n      }\n    }\n\n    throw new Error('Bad base 128 number');\n  }\n};\n\nlet knownTags = [\n  'cmap', 'head', 'hhea', 'hmtx', 'maxp', 'name', 'OS/2', 'post', 'cvt ',\n  'fpgm', 'glyf', 'loca', 'prep', 'CFF ', 'VORG', 'EBDT', 'EBLC', 'gasp',\n  'hdmx', 'kern', 'LTSH', 'PCLT', 'VDMX', 'vhea', 'vmtx', 'BASE', 'GDEF',\n  'GPOS', 'GSUB', 'EBSC', 'JSTF', 'MATH', 'CBDT', 'CBLC', 'COLR', 'CPAL',\n  'SVG ', 'sbix', 'acnt', 'avar', 'bdat', 'bloc', 'bsln', 'cvar', 'fdsc',\n  'feat', 'fmtx', 'fvar', 'gvar', 'hsty', 'just', 'lcar', 'mort', 'morx',\n  'opbd', 'prop', 'trak', 'Zapf', 'Silf', 'Glat', 'Gloc', 'Feat', 'Sill'\n];\n\nlet WOFF2DirectoryEntry = new r.Struct({\n  flags: r.uint8,\n  customTag: new r.Optional(new r.String(4), t => (t.flags & 0x3f) === 0x3f),\n  tag: t => t.customTag || knownTags[t.flags & 0x3f],// || (() => { throw new Error(`Bad tag: ${flags & 0x3f}`); })(); },\n  length: Base128,\n  transformVersion: t => (t.flags >>> 6) & 0x03,\n  transformed: t => (t.tag === 'glyf' || t.tag === 'loca') ? t.transformVersion === 0 : t.transformVersion !== 0,\n  transformLength: new r.Optional(Base128, t => t.transformed)\n});\n\nlet WOFF2Directory = new r.Struct({\n  tag: new r.String(4), // should be 'wOF2'\n  flavor: r.uint32,\n  length: r.uint32,\n  numTables: r.uint16,\n  reserved: new r.Reserved(r.uint16),\n  totalSfntSize: r.uint32,\n  totalCompressedSize: r.uint32,\n  majorVersion: r.uint16,\n  minorVersion: r.uint16,\n  metaOffset: r.uint32,\n  metaLength: r.uint32,\n  metaOrigLength: r.uint32,\n  privOffset: r.uint32,\n  privLength: r.uint32,\n  tables: new r.Array(WOFF2DirectoryEntry, 'numTables')\n});\n\nWOFF2Directory.process = function() {\n  let tables = {};\n  for (let i = 0; i < this.tables.length; i++) {\n    let table = this.tables[i];\n    tables[table.tag] = table;\n  }\n\n  return this.tables = tables;\n};\n\nexport default WOFF2Directory;\n", "import * as r from 'restructure';\nimport TTFFont from './TTFFont';\nimport Directory from './tables/directory';\nimport tables from './tables';\nimport { asciiDecoder } from './utils';\n\nlet TTCHeader = new r.VersionedStruct(r.uint32, {\n  0x00010000: {\n    numFonts:   r.uint32,\n    offsets:    new r.Array(r.uint32, 'numFonts')\n  },\n  0x00020000: {\n    numFonts:   r.uint32,\n    offsets:    new r.Array(r.uint32, 'numFonts'),\n    dsigTag:    r.uint32,\n    dsigLength: r.uint32,\n    dsigOffset: r.uint32\n  }\n});\n\nexport default class TrueTypeCollection {\n  type = 'TTC';\n\n  static probe(buffer) {\n    return asciiDecoder.decode(buffer.slice(0, 4)) === 'ttcf';\n  }\n\n  constructor(stream) {\n    this.stream = stream;\n    if (stream.readString(4) !== 'ttcf') {\n      throw new Error('Not a TrueType collection');\n    }\n\n    this.header = TTCHeader.decode(stream);\n  }\n\n  getFont(name) {\n    for (let offset of this.header.offsets) {\n      let stream = new r.DecodeStream(this.stream.buffer);\n      stream.pos = offset;\n      let font = new TTFFont(stream);\n      if (\n        font.postscriptName === name ||\n        (\n          font.postscriptName instanceof Uint8Array && \n          name instanceof Uint8Array && \n          font.postscriptName.every((v, i) => name[i] === v)\n        )\n      ) {\n        return font;\n      }\n    }\n\n    return null;\n  }\n\n  get fonts() {\n    let fonts = [];\n    for (let offset of this.header.offsets) {\n      let stream = new r.DecodeStream(this.stream.buffer);\n      stream.pos = offset;\n      fonts.push(new TTFFont(stream));\n    }\n\n    return fonts;\n  }\n}\n", "import * as r from 'restructure';\nimport TTFFont from './TTFFont';\n\nlet DFontName = new r.String(r.uint8);\nlet DFontData = new r.Struct({\n  len: r.uint32,\n  buf: new r.Buffer('len')\n});\n\nlet Ref = new r.Struct({\n  id: r.uint16,\n  nameOffset: r.int16,\n  attr: r.uint8,\n  dataOffset: r.uint24,\n  handle: r.uint32\n});\n\nlet Type = new r.Struct({\n  name: new r.String(4),\n  maxTypeIndex: r.uint16,\n  refList: new r.Pointer(r.uint16, new r.Array(Ref, t => t.maxTypeIndex + 1), { type: 'parent' })\n});\n\nlet TypeList = new r.Struct({\n  length: r.uint16,\n  types: new r.Array(Type, t => t.length + 1)\n});\n\nlet DFontMap = new r.Struct({\n  reserved: new r.Reserved(r.uint8, 24),\n  typeList: new r.Pointer(r.uint16, TypeList),\n  nameListOffset: new r.Pointer(r.uint16, 'void')\n});\n\nlet DFontHeader = new r.Struct({\n  dataOffset: r.uint32,\n  map: new r.Pointer(r.uint32, DFontMap),\n  dataLength: r.uint32,\n  mapLength: r.uint32\n});\n\nexport default class DFont {\n  type = 'DFont';\n\n  static probe(buffer) {\n    let stream = new r.DecodeStream(buffer);\n\n    try {\n      var header = DFontHeader.decode(stream);\n    } catch (e) {\n      return false;\n    }\n\n    for (let type of header.map.typeList.types) {\n      if (type.name === 'sfnt') {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  constructor(stream) {\n    this.stream = stream;\n    this.header = DFontHeader.decode(this.stream);\n\n    for (let type of this.header.map.typeList.types) {\n      for (let ref of type.refList) {\n        if (ref.nameOffset >= 0) {\n          this.stream.pos = ref.nameOffset + this.header.map.nameListOffset;\n          ref.name = DFontName.decode(this.stream);\n        } else {\n          ref.name = null;\n        }\n      }\n\n      if (type.name === 'sfnt') {\n        this.sfnt = type;\n      }\n    }\n  }\n\n  getFont(name) {\n    if (!this.sfnt) {\n      return null;\n    }\n\n    for (let ref of this.sfnt.refList) {\n      let pos = this.header.dataOffset + ref.dataOffset + 4;\n      let stream = new r.DecodeStream(this.stream.buffer.slice(pos));\n      let font = new TTFFont(stream);\n      if (\n        font.postscriptName === name ||\n        (\n          font.postscriptName instanceof Uint8Array && \n          name instanceof Uint8Array && \n          font.postscriptName.every((v, i) => name[i] === v)\n        )\n      ) {\n        return font;\n      }\n    }\n\n    return null;\n  }\n\n  get fonts() {\n    let fonts = [];\n    for (let ref of this.sfnt.refList) {\n      let pos = this.header.dataOffset + ref.dataOffset + 4;\n      let stream = new r.DecodeStream(this.stream.buffer.slice(pos));\n      fonts.push(new TTFFont(stream));\n    }\n\n    return fonts;\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"dialog\", \"qudRadio\", \"quaNotice\", \"qudTransport\"]\n\n  open() {\n    this.dialogTarget.showModal()\n    this.sourceChanged()\n  }\n\n  close() {\n    this.dialogTarget.close()\n  }\n\n  sourceChanged() {\n    if (!this.hasQudRadioTarget) return\n\n    const qud = this.qudRadioTarget.checked\n\n    if (this.hasQudTransportTarget) this.qudTransportTarget.classList.toggle(\"hidden\", !qud)\n    if (this.hasQuaNoticeTarget) this.quaNoticeTarget.classList.toggle(\"hidden\", !qud)\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  connect() {\n    document.querySelectorAll(\".node-row\").forEach((row) => {\n      const nodeId = row.dataset.nodeId;\n      const typeSelect = row.querySelector(\".node-type-select\");\n      if (typeSelect && typeSelect.value) {\n        this.updateResourceType(nodeId, typeSelect.value);\n      }\n    });\n  }\n\n  refreshGraphPreview() {\n    window.dispatchEvent(new CustomEvent(\"refresh-graph-preview\"));\n  }\n\n  saveNodeField(event) {\n    const input = event.target;\n    const nodeId = input.dataset.nodeId;\n    const field = input.dataset.field;\n    const value = input.value;\n\n    if (!nodeId || !field) return;\n    const graphId = this.getGraphId();\n\n    const csrfToken = document.querySelector(\n      'meta[name=\"csrf-token\"]'\n    )?.content;\n\n    fetch(\n      `/morphology/dependency-graphs/${graphId}/nodes/${nodeId}?${field}=${encodeURIComponent(value)}`,\n      {\n        method: \"PATCH\",\n        headers: {\n          \"X-CSRF-Token\": csrfToken,\n          Accept: \"application/json\",\n        },\n      }\n    )\n      .then((response) => {\n        if (response.ok) {\n          this.showSaveIndicator(input, \"success\");\n          this.refreshGraphPreview();\n        } else {\n          this.showSaveIndicator(input, \"error\");\n        }\n      })\n      .catch((error) => {\n        console.error(\"Error saving node:\", error);\n        this.showSaveIndicator(input, \"error\");\n      });\n  }\n\n  saveEdgeField(event) {\n    const input = event.target;\n    const edgeId = input.dataset.edgeId;\n    const field = input.dataset.field;\n    const value = input.value;\n\n    if (!edgeId || !field) return;\n    const graphId = this.getGraphId();\n\n    const csrfToken = document.querySelector(\n      'meta[name=\"csrf-token\"]'\n    )?.content;\n\n    fetch(\n      `/morphology/dependency-graphs/${graphId}/edges/${edgeId}?${field}=${encodeURIComponent(value)}`,\n      {\n        method: \"PATCH\",\n        headers: {\n          \"X-CSRF-Token\": csrfToken,\n          Accept: \"application/json\",\n        },\n      }\n    )\n      .then((response) => {\n        if (response.ok) {\n          this.showSaveIndicator(input, \"success\");\n          this.refreshGraphPreview();\n        } else {\n          this.showSaveIndicator(input, \"error\");\n        }\n      })\n      .catch((error) => {\n        console.error(\"Error saving edge:\", error);\n        this.showSaveIndicator(input, \"error\");\n      });\n  }\n\n  showSaveIndicator(input, status) {\n    const originalBorder = input.style.borderColor;\n    input.style.borderColor = status === \"success\" ? \"#28a745\" : \"#dc3545\";\n    setTimeout(() => {\n      input.style.borderColor = originalBorder;\n    }, 1000);\n  }\n\n  savePhraseNodeField(event) {\n    const input = event.target;\n    const nodeId = input.dataset.nodeId;\n    const row = document.querySelector(`.node-row[data-node-id=\"${nodeId}\"]`);\n\n    if (!row) return;\n    const graphId = this.getGraphId();\n\n    const phrasePos = row.querySelector(\".phrase-pos-input\")?.value || \"\";\n    const phraseSource =\n      row.querySelector(\".phrase-source-select\")?.value || \"\";\n    const phraseTarget =\n      row.querySelector(\".phrase-target-select\")?.value || \"\";\n\n    const csrfToken = document.querySelector(\n      'meta[name=\"csrf-token\"]'\n    )?.content;\n\n    const params = new URLSearchParams({\n      phrase_pos: phrasePos,\n      phrase_source: phraseSource,\n      phrase_target: phraseTarget,\n    });\n\n    fetch(`/morphology/dependency-graphs/${graphId}/nodes/${nodeId}?${params.toString()}`, {\n      method: \"PATCH\",\n      headers: {\n        \"X-CSRF-Token\": csrfToken,\n        Accept: \"application/json\",\n      },\n    })\n      .then((response) => {\n        if (response.ok) {\n          this.showSaveIndicator(input, \"success\");\n          this.refreshGraphPreview();\n        } else {\n          this.showSaveIndicator(input, \"error\");\n        }\n      })\n      .catch((error) => {\n        console.error(\"Error saving phrase node:\", error);\n        this.showSaveIndicator(input, \"error\");\n      });\n  }\n\n  handleNodeTypeChange(event) {\n    const nodeId = event.target.dataset.nodeId;\n    const nodeType = event.target.value;\n    const graphId = this.getGraphId();\n\n    this.saveNodeField(event);\n\n    fetch(\n      `/morphology/dependency-graphs/${graphId}/nodes/${nodeId}/fields?node_type=${nodeType}`,\n      {\n        method: \"POST\",\n        headers: {\n          Accept: \"text/vnd.turbo-stream.html\",\n          \"X-CSRF-Token\": document.querySelector('[name=\"csrf-token\"]').content,\n        },\n      }\n    )\n      .then((response) => response.text())\n      .then((html) => {\n        Turbo.renderStreamMessage(html);\n        this.updateResourceType(nodeId, nodeType);\n      })\n      .catch((error) => {\n        console.error(\"Error updating node fields:\", error);\n      });\n  }\n\n  updateResourceType(nodeId, nodeType) {\n    const row = document.querySelector(`.node-row[data-node-id=\"${nodeId}\"]`);\n    if (!row) return;\n\n    const resourceTypeSelect = row.querySelector(\".resource-type-select\");\n    if (!resourceTypeSelect) return;\n\n    if (nodeType === \"word\" || nodeType === \"reference\") {\n      resourceTypeSelect.value = \"Morphology::Word\";\n    } else if (nodeType === \"phrase\") {\n      resourceTypeSelect.value = \"Morphology::DependencyGraph::GraphNodeEdge\";\n    } else if (nodeType === \"elided\") {\n      resourceTypeSelect.value = \"\";\n    }\n  }\n\n  updatePhraseValue(event) {\n    const nodeId = event.currentTarget.dataset.nodeId;\n    const row = document.querySelector(`.node-row[data-node-id=\"${nodeId}\"]`);\n    if (!row) return;\n\n    const posInput = row.querySelector(\".phrase-pos-input\");\n    const sourceSelect = row.querySelector(\".phrase-source-select\");\n    const targetSelect = row.querySelector(\".phrase-target-select\");\n    const valueField = row.querySelector(\".phrase-value-field\");\n    const posField = row.querySelector(\".phrase-pos-field\");\n\n    if (!posInput || !sourceSelect || !targetSelect || !valueField) return;\n\n    const pos = posInput.value.trim();\n    const source = sourceSelect.value;\n    const target = targetSelect.value;\n\n    if (pos && source && target) {\n      valueField.value = `${pos}(n${source} - n${target})`;\n    } else if (pos) {\n      valueField.value = pos;\n    } else {\n      valueField.value = \"\";\n    }\n\n    if (posField) {\n      posField.value = pos;\n    }\n  }\n\n  updatePhraseDropdowns() {\n    const nodeNumbers = [];\n    document.querySelectorAll(\".node-row\").forEach((row) => {\n      const numberCell = row.querySelector(\".node-number\");\n      if (numberCell) {\n        const numberText = numberCell.textContent.trim();\n        if (numberText.startsWith(\"new-number-\")) {\n          return;\n        }\n        const match = numberText.match(/n(\\d+)/);\n        if (match) {\n          nodeNumbers.push({\n            display: numberText,\n            value: match[1],\n          });\n        }\n      }\n    });\n\n    document\n      .querySelectorAll(\".phrase-source-select, .phrase-target-select\")\n      .forEach((select) => {\n        const currentValue = select.value;\n\n        select.innerHTML = '<option value=\"\">Select</option>';\n        nodeNumbers.forEach((node) => {\n          const option = document.createElement(\"option\");\n          option.value = node.value;\n          option.textContent = node.display;\n          if (node.value === currentValue) {\n            option.selected = true;\n          }\n          select.appendChild(option);\n        });\n      });\n  }\n\n  removeNode(event) {\n    const nodeId = event.currentTarget.dataset.nodeId;\n    const row = document.querySelector(`.node-row[data-node-id=\"${nodeId}\"]`);\n\n    if (!row) return;\n\n    if (\n      !confirm(\n        \"Are you sure you want to remove this node? This will also remove any edges connected to it.\"\n      )\n    ) {\n      return;\n    }\n\n    const csrfToken = document.querySelector(\n      'meta[name=\"csrf-token\"]'\n    )?.content;\n    const graphId = this.getGraphId();\n\n    fetch(`/morphology/dependency-graphs/${graphId}/nodes/${nodeId}`, {\n      method: \"DELETE\",\n      headers: {\n        \"X-CSRF-Token\": csrfToken,\n        Accept: \"text/vnd.turbo-stream.html\",\n      },\n    })\n      .then((response) => {\n        if (response.ok) {\n          return response.text();\n        } else {\n          throw new Error(\"Failed to delete node\");\n        }\n      })\n      .then((html) => {\n        Turbo.renderStreamMessage(html);\n        this.updateNodeCount();\n        this.updatePhraseNodeCount();\n        this.refreshGraphPreview();\n      })\n      .catch((error) => {\n        console.error(\"Error:\", error);\n        alert(\"Failed to delete node\");\n      });\n  }\n\n  addNodeAfter(event) {\n    event.preventDefault();\n    const currentNodeId = event.currentTarget.dataset.nodeId;\n    const graphId = this.getGraphId();\n\n    fetch(\n      `/morphology/dependency-graphs/${graphId}/nodes?after_node_id=${currentNodeId}`,\n      {\n        method: \"POST\",\n        headers: {\n          Accept: \"text/vnd.turbo-stream.html\",\n          \"X-CSRF-Token\": document.querySelector('[name=\"csrf-token\"]').content,\n        },\n      }\n    )\n      .then((response) => response.text())\n      .then((html) => {\n        Turbo.renderStreamMessage(html);\n        this.updatePhraseDropdowns();\n        this.updateNodeCount();\n        this.refreshGraphPreview();\n      })\n      .catch((error) => {\n        console.error(\"Error adding node:\", error);\n      });\n  }\n\n  getGraphId() {\n    const graphIdInput =\n      document.getElementById(\"graph_id\") ||\n      document.querySelector('input[name=\"graph_id\"]');\n    return graphIdInput?.value || \"\";\n  }\n\n  updateNodeCount() {\n    const rows = document.querySelectorAll(\n      '.node-row:not([style*=\"display: none\"])'\n    );\n    const countSpan = document.querySelector(\".node-count\");\n    if (countSpan) {\n      countSpan.textContent = rows.length;\n    }\n  }\n\n  updatePhraseNodeCount() {\n    const rows = document.querySelectorAll(\"#phrase_nodes_tbody .node-row\");\n    const countSpan = document.querySelector(\".phrase-node-count\");\n    if (countSpan) {\n      countSpan.textContent = rows.length;\n    }\n  }\n\n  addPhraseNode(event) {\n    event.preventDefault();\n    const graphId = this.getGraphId();\n    const csrfToken = document.querySelector(\n      'meta[name=\"csrf-token\"]'\n    )?.content;\n\n    fetch(`/morphology/dependency-graphs/${graphId}/nodes?type=phrase`, {\n      method: \"POST\",\n      headers: {\n        \"X-CSRF-Token\": csrfToken,\n        Accept: \"text/vnd.turbo-stream.html\",\n      },\n    })\n      .then((response) => response.text())\n      .then((html) => {\n        Turbo.renderStreamMessage(html);\n        this.updatePhraseNodeCount();\n        this.refreshGraphPreview();\n      })\n      .catch((error) => {\n        console.error(\"Error adding phrase node:\", error);\n        alert(\"Failed to add phrase node\");\n      });\n  }\n\n  addEdge(event) {\n    event.preventDefault();\n    const graphId = this.getGraphId();\n    const csrfToken = document.querySelector(\n      'meta[name=\"csrf-token\"]'\n    )?.content;\n\n    fetch(`/morphology/dependency-graphs/${graphId}/edges`, {\n      method: \"POST\",\n      headers: {\n        \"X-CSRF-Token\": csrfToken,\n        Accept: \"text/vnd.turbo-stream.html\",\n      },\n    })\n      .then((response) => response.text())\n      .then((html) => {\n        Turbo.renderStreamMessage(html);\n        this.updateEdgeCount();\n        this.refreshGraphPreview();\n      })\n      .catch((error) => {\n        console.error(\"Error adding edge:\", error);\n        alert(\"Failed to add edge\");\n      });\n  }\n\n  removeEdge(event) {\n    const edgeId = event.currentTarget.dataset.edgeId;\n    const row = document.querySelector(`.edge-row[data-edge-id=\"${edgeId}\"]`);\n    if (!row) return;\n\n    if (!confirm(\"Are you sure you want to delete this edge?\")) return;\n\n    const csrfToken = document.querySelector(\n      'meta[name=\"csrf-token\"]'\n    )?.content;\n    const graphId = this.getGraphId();\n\n    fetch(`/morphology/dependency-graphs/${graphId}/edges/${edgeId}`, {\n      method: \"DELETE\",\n      headers: {\n        \"X-CSRF-Token\": csrfToken,\n        Accept: \"text/vnd.turbo-stream.html\",\n      },\n    })\n      .then((response) => {\n        if (response.ok) {\n          return response.text();\n        } else {\n          throw new Error(\"Failed to delete edge\");\n        }\n      })\n      .then((html) => {\n        Turbo.renderStreamMessage(html);\n        this.updateEdgeCount();\n        this.refreshGraphPreview();\n      })\n      .catch((error) => {\n        console.error(\"Error deleting edge:\", error);\n        alert(\"Failed to delete edge\");\n      });\n  }\n\n  updateEdgeCount() {\n    const rows = document.querySelectorAll(\".edge-row\");\n    const countSpan = document.querySelector(\".edge-count\");\n    if (countSpan) {\n      countSpan.textContent = rows.length;\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  static targets = [\"modal\"];\n\n  connect() {\n    this.defaults = {\n      syntaxGraphTokenFontSize: 34,\n      syntaxGraphTagFontSize: 15,\n      syntaxGraphHeaderFontSize: 10,\n      syntaxGraphElidedWordFontSize: 22,\n      syntaxGraphEdgeLabelFontSize: 15,\n      syntaxGraphHeaderTextDeltaY: 15,\n      syntaxGraphPosTagGap: 25,\n      syntaxGraphBracketDeltaY: 16,\n      syntaxGraphWordGap: 63,\n      syntaxGraphHeaderExtraGap: 10,\n      syntaxGraphPosTagYOffset: 65,\n      defaultFont: \"Helvetica Neue, Arial, sans-serif\",\n      defaultArabicFont: \"qpc-hafs\",\n      elidedWordFont: \"Arial, sans-serif\",\n    };\n\n    this.loadFromUrl();\n    this.setupModal();\n  }\n\n  setupModal() {\n    this.escapeHandler = (e) => {\n      if (e.key === \"Escape\" && !this.modalTarget.classList.contains(\"hidden\")) {\n        this.hideModal();\n      }\n    };\n    document.addEventListener(\"keydown\", this.escapeHandler);\n  }\n\n  disconnect() {\n    if (this.escapeHandler) {\n      document.removeEventListener(\"keydown\", this.escapeHandler);\n    }\n  }\n\n  showModal(event) {\n    if (event) event.preventDefault();\n    this.modalTarget.classList.remove(\"hidden\");\n    document.body.style.overflow = \"hidden\";\n  }\n\n  hideModal(event) {\n    if (event) event.preventDefault();\n    this.modalTarget.classList.add(\"hidden\");\n    document.body.style.overflow = \"\";\n  }\n\n  loadFromUrl() {\n    const params = new URLSearchParams(window.location.search);\n\n    const intOrDefault = (key, fallback) => {\n      const value = parseInt(params.get(key), 10);\n      return Number.isNaN(value) ? fallback : value;\n    };\n\n    this.setValueForId(\n      \"setting-token-font-size\",\n      intOrDefault(\n        \"syntaxGraphTokenFontSize\",\n        this.defaults.syntaxGraphTokenFontSize\n      )\n    );\n    this.setValueForId(\n      \"setting-tag-font-size\",\n      intOrDefault(\n        \"syntaxGraphTagFontSize\",\n        this.defaults.syntaxGraphTagFontSize\n      )\n    );\n    this.setValueForId(\n      \"setting-header-font-size\",\n      intOrDefault(\n        \"syntaxGraphHeaderFontSize\",\n        this.defaults.syntaxGraphHeaderFontSize\n      )\n    );\n    this.setValueForId(\n      \"setting-elided-font-size\",\n      intOrDefault(\n        \"syntaxGraphElidedWordFontSize\",\n        this.defaults.syntaxGraphElidedWordFontSize\n      )\n    );\n    this.setValueForId(\n      \"setting-edge-label-font-size\",\n      intOrDefault(\n        \"syntaxGraphEdgeLabelFontSize\",\n        this.defaults.syntaxGraphEdgeLabelFontSize\n      )\n    );\n\n    this.setValueForId(\n      \"setting-header-line-gap\",\n      intOrDefault(\n        \"syntaxGraphHeaderTextDeltaY\",\n        this.defaults.syntaxGraphHeaderTextDeltaY\n      )\n    );\n    this.setValueForId(\n      \"setting-pos-tag-gap\",\n      intOrDefault(\"syntaxGraphPosTagGap\", this.defaults.syntaxGraphPosTagGap)\n    );\n    this.setValueForId(\n      \"setting-bracket-delta-y\",\n      intOrDefault(\n        \"syntaxGraphBracketDeltaY\",\n        this.defaults.syntaxGraphBracketDeltaY\n      )\n    );\n\n    this.setValueForId(\n      \"setting-word-gap\",\n      intOrDefault(\"syntaxGraphWordGap\", this.defaults.syntaxGraphWordGap)\n    );\n    this.setValueForId(\n      \"setting-header-extra-gap\",\n      intOrDefault(\n        \"syntaxGraphHeaderExtraGap\",\n        this.defaults.syntaxGraphHeaderExtraGap\n      )\n    );\n    this.setValueForId(\n      \"setting-pos-tag-y-offset\",\n      intOrDefault(\n        \"syntaxGraphPosTagYOffset\",\n        this.defaults.syntaxGraphPosTagYOffset\n      )\n    );\n\n    this.setValueForId(\n      \"setting-default-font\",\n      params.get(\"defaultFont\") || this.defaults.defaultFont\n    );\n    this.setValueForId(\n      \"setting-arabic-font\",\n      params.get(\"defaultArabicFont\") || this.defaults.defaultArabicFont\n    );\n    this.setValueForId(\n      \"setting-elided-word-font\",\n      params.get(\"elidedWordFont\") || this.defaults.elidedWordFont\n    );\n  }\n\n  apply(event) {\n    event.preventDefault();\n\n    const theme = {\n      fonts: {\n        defaultFont: {\n          family: this.valueForId(\"setting-default-font\"),\n        },\n        defaultArabicFont: {\n          family: this.valueForId(\"setting-arabic-font\"),\n        },\n        elidedWordFont: {\n          family: this.valueForId(\"setting-elided-word-font\"),\n        },\n      },\n      syntaxGraphTokenFontSize: this.intValueForId(\"setting-token-font-size\"),\n      syntaxGraphTagFontSize: this.intValueForId(\"setting-tag-font-size\"),\n      syntaxGraphHeaderFontSize: this.intValueForId(\"setting-header-font-size\"),\n      syntaxGraphElidedWordFontSize: this.intValueForId(\n        \"setting-elided-font-size\"\n      ),\n      syntaxGraphEdgeLabelFontSize: this.intValueForId(\n        \"setting-edge-label-font-size\"\n      ),\n      syntaxGraphHeaderTextDeltaY: this.intValueForId(\n        \"setting-header-line-gap\"\n      ),\n      syntaxGraphPosTagGap: this.intValueForId(\"setting-pos-tag-gap\"),\n      syntaxGraphBracketDeltaY: this.intValueForId(\"setting-bracket-delta-y\"),\n      syntaxGraphWordGap: this.intValueForId(\"setting-word-gap\"),\n      syntaxGraphHeaderExtraGap: this.intValueForId(\"setting-header-extra-gap\"),\n      syntaxGraphPosTagYOffset: this.intValueForId(\"setting-pos-tag-y-offset\"),\n    };\n\n    const url = new URL(window.location.href);\n    const params = url.searchParams;\n\n    params.set(\"syntaxGraphTokenFontSize\", theme.syntaxGraphTokenFontSize);\n    params.set(\"syntaxGraphTagFontSize\", theme.syntaxGraphTagFontSize);\n    params.set(\"syntaxGraphHeaderFontSize\", theme.syntaxGraphHeaderFontSize);\n    params.set(\n      \"syntaxGraphElidedWordFontSize\",\n      theme.syntaxGraphElidedWordFontSize\n    );\n    params.set(\n      \"syntaxGraphEdgeLabelFontSize\",\n      theme.syntaxGraphEdgeLabelFontSize\n    );\n    params.set(\n      \"syntaxGraphHeaderTextDeltaY\",\n      theme.syntaxGraphHeaderTextDeltaY\n    );\n    params.set(\"syntaxGraphPosTagGap\", theme.syntaxGraphPosTagGap);\n    params.set(\"syntaxGraphBracketDeltaY\", theme.syntaxGraphBracketDeltaY);\n    params.set(\"syntaxGraphWordGap\", theme.syntaxGraphWordGap);\n    params.set(\"syntaxGraphHeaderExtraGap\", theme.syntaxGraphHeaderExtraGap);\n    params.set(\"syntaxGraphPosTagYOffset\", theme.syntaxGraphPosTagYOffset);\n    params.set(\"defaultFont\", theme.fonts.defaultFont.family);\n    params.set(\"defaultArabicFont\", theme.fonts.defaultArabicFont.family);\n    params.set(\"elidedWordFont\", theme.fonts.elidedWordFont.family);\n\n    window.history.replaceState({}, \"\", url.toString());\n\n    const graphElement = document.getElementById(\"main-syntax-graph\");\n    if (graphElement) {\n      window.dispatchEvent(new CustomEvent(\"refresh-graph-preview\"));\n    }\n  }\n\n  reset(event) {\n    event.preventDefault();\n\n    this.setValueForId(\n      \"setting-token-font-size\",\n      this.defaults.syntaxGraphTokenFontSize\n    );\n    this.setValueForId(\n      \"setting-tag-font-size\",\n      this.defaults.syntaxGraphTagFontSize\n    );\n    this.setValueForId(\n      \"setting-header-font-size\",\n      this.defaults.syntaxGraphHeaderFontSize\n    );\n    this.setValueForId(\n      \"setting-elided-font-size\",\n      this.defaults.syntaxGraphElidedWordFontSize\n    );\n    this.setValueForId(\n      \"setting-edge-label-font-size\",\n      this.defaults.syntaxGraphEdgeLabelFontSize\n    );\n    this.setValueForId(\"setting-word-gap\", this.defaults.syntaxGraphWordGap);\n    this.setValueForId(\n      \"setting-header-extra-gap\",\n      this.defaults.syntaxGraphHeaderExtraGap\n    );\n    this.setValueForId(\n      \"setting-pos-tag-y-offset\",\n      this.defaults.syntaxGraphPosTagYOffset\n    );\n    this.setValueForId(\"setting-default-font\", this.defaults.defaultFont);\n    this.setValueForId(\"setting-arabic-font\", this.defaults.defaultArabicFont);\n    this.setValueForId(\n      \"setting-elided-word-font\",\n      this.defaults.elidedWordFont\n    );\n\n    const url = new URL(window.location.href);\n    const params = url.searchParams;\n\n    [\n      \"syntaxGraphTokenFontSize\",\n      \"syntaxGraphTagFontSize\",\n      \"syntaxGraphHeaderFontSize\",\n      \"syntaxGraphElidedWordFontSize\",\n      \"syntaxGraphEdgeLabelFontSize\",\n      \"syntaxGraphHeaderTextDeltaY\",\n      \"syntaxGraphPosTagGap\",\n      \"syntaxGraphBracketDeltaY\",\n      \"syntaxGraphWordGap\",\n      \"syntaxGraphHeaderExtraGap\",\n      \"syntaxGraphPosTagYOffset\",\n      \"defaultFont\",\n      \"defaultArabicFont\",\n      \"elidedWordFont\",\n    ].forEach((key) => params.delete(key));\n\n    window.history.replaceState({}, \"\", url.toString());\n\n    const graphElement = document.getElementById(\"main-syntax-graph\");\n    if (graphElement) {\n      window.dispatchEvent(new CustomEvent(\"refresh-graph-preview\"));\n    }\n  }\n\n  valueForId(id) {\n    const el = this.element.querySelector(`#${id}`);\n    return el ? el.value : \"\";\n  }\n\n  setValueForId(id, value) {\n    const el = this.element.querySelector(`#${id}`);\n    if (el) el.value = value;\n  }\n\n  intValueForId(id) {\n    const value = parseInt(this.valueForId(id), 10);\n    return Number.isNaN(value) ? null : value;\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  static targets = [\n    \"loadingState\",\n    \"contentState\",\n    \"graphsContainer\",\n    \"graphTemplate\",\n    \"nodeTemplate\",\n    \"errorContainer\",\n    \"saveButton\",\n    \"saveButtonText\",\n    \"saveButtonSpinner\",\n    \"dropzone\"\n  ];\n\n  static values = {\n    chapter: Number,\n    verse: Number,\n    graphId: Number\n  };\n\n  connect() {\n    this.draggedNode = null;\n    this.sourceGraphId = null;\n    this.graphsData = [];\n    this.nextTempGraphId = -1;\n    \n    const modalElement = document.getElementById(\"graphSplitterModal\");\n    if (modalElement) {\n      this.setupModal(modalElement);\n    }\n  }\n\n  setupModal(modalElement) {\n    const showButtons = document.querySelectorAll('[data-bs-target=\"#graphSplitterModal\"]');\n    showButtons.forEach(button => {\n      button.addEventListener('click', (e) => {\n        e.preventDefault();\n        this.showModal(modalElement);\n        this.loadGraphsData();\n      });\n    });\n\n    const closeButtons = modalElement.querySelectorAll('[data-action*=\"closeModal\"], [data-bs-dismiss=\"modal\"]');\n    closeButtons.forEach(button => {\n      button.addEventListener('click', (e) => {\n        e.preventDefault();\n        this.hideModal(modalElement);\n      });\n    });\n\n    modalElement.addEventListener('click', (e) => {\n      if (e.target === modalElement) {\n        this.hideModal(modalElement);\n      }\n    });\n\n    document.addEventListener('keydown', (e) => {\n      if (e.key === 'Escape' && !modalElement.classList.contains('hidden')) {\n        this.hideModal(modalElement);\n      }\n    });\n  }\n\n  showModal(modalElement) {\n    const backdrop = document.createElement('div');\n    backdrop.className = 'modal-backdrop fixed inset-0 bg-black bg-opacity-50 transition-opacity duration-300 z-[9998]';\n    backdrop.style.opacity = '0';\n    document.body.appendChild(backdrop);\n    \n    modalElement.classList.remove('hidden');\n    modalElement.setAttribute('aria-hidden', 'false');\n    document.body.classList.add('modal-open');\n    document.body.style.overflow = 'hidden';\n    \n    requestAnimationFrame(() => {\n      backdrop.style.opacity = '1';\n      modalElement.classList.remove('opacity-0');\n      modalElement.classList.add('opacity-100');\n    });\n  }\n\n  async loadGraphsData() {\n    console.log(\"loadGraphsData called\", this.chapterValue, this.verseValue);\n    try {\n      const url = `/morphology/dependency-graphs/${this.graphIdValue}/verse_graphs_data`;\n      console.log(\"Fetching from:\", url);\n      \n      const response = await fetch(url);\n      console.log(\"Response status:\", response.status);\n      \n      if (!response.ok) {\n        const errorText = await response.text();\n        console.error(\"Response error:\", errorText);\n        throw new Error(`HTTP ${response.status}: ${errorText}`);\n      }\n      \n      const data = await response.json();\n      console.log(\"Data received:\", data);\n      \n      this.graphsData = data.graphs;\n      this.renderGraphs();\n      \n      this.loadingStateTarget.classList.add(\"hidden\");\n      this.contentStateTarget.classList.remove(\"hidden\");\n    } catch (error) {\n      console.error(\"Error loading graphs:\", error);\n      this.showError(\"Failed to load graphs data. Please try again.\");\n      this.loadingStateTarget.classList.add(\"hidden\");\n      this.contentStateTarget.classList.remove(\"hidden\");\n    }\n  }\n\n  renderGraphs() {\n    this.graphsContainerTarget.innerHTML = \"\";\n    \n    this.graphsData.forEach(graph => {\n      const graphElement = this.createGraphElement(graph);\n      this.graphsContainerTarget.appendChild(graphElement);\n    });\n  }\n\n  createGraphElement(graph) {\n    const template = this.graphTemplateTarget.content.cloneNode(true);\n    const graphCard = template.querySelector(\".graph-card\");\n    \n    graphCard.dataset.graphId = graph.id;\n    graphCard.querySelector(\".graph-number\").textContent = `#${graph.graph_number}`;\n    graphCard.querySelector(\".node-count\").textContent = `${graph.nodes.length} nodes`;\n    \n    const nodesList = graphCard.querySelector(\".nodes-list\");\n    const emptyState = graphCard.querySelector(\".empty-state\");\n    \n    if (graph.nodes.length === 0) {\n      emptyState.classList.remove(\"hidden\");\n    } else {\n      graph.nodes.forEach(node => {\n        const nodeElement = this.createNodeElement(node);\n        nodesList.appendChild(nodeElement);\n      });\n    }\n    \n    return graphCard;\n  }\n\n  createNodeElement(node) {\n    const template = this.nodeTemplateTarget.content.cloneNode(true);\n    const nodeItem = template.querySelector(\".node-item\");\n    \n    nodeItem.dataset.nodeId = node.id;\n    nodeItem.dataset.allNodeIds = JSON.stringify(node.all_node_ids || [node.id]);\n    nodeItem.querySelector(\".node-display-text\").textContent = node.text;\n    nodeItem.querySelector(\".node-location\").textContent = node.location;\n    nodeItem.querySelector(\".node-type\").textContent = node.type;\n    \n    return nodeItem;\n  }\n\n  createNewGraph() {\n    const newGraph = {\n      id: this.nextTempGraphId--,\n      graph_number: \"New\",\n      nodes: []\n    };\n    \n    this.graphsData.push(newGraph);\n    \n    const graphElement = this.createGraphElement(newGraph);\n    this.graphsContainerTarget.appendChild(graphElement);\n  }\n\n  handleDragStart(event) {\n    this.draggedNode = event.currentTarget;\n    this.sourceGraphId = event.currentTarget.closest(\".graph-card\").dataset.graphId;\n    \n    event.currentTarget.classList.add(\"opacity-50\");\n    event.dataTransfer.effectAllowed = \"move\";\n    event.dataTransfer.setData(\"text/html\", event.currentTarget.innerHTML);\n  }\n\n  handleDragEnd(event) {\n    event.currentTarget.classList.remove(\"opacity-50\");\n    \n    this.dropzoneTargets.forEach(dropzone => {\n      dropzone.classList.remove(\"border-blue-500\", \"bg-blue-50\");\n    });\n  }\n\n  handleDragOver(event) {\n    event.preventDefault();\n    event.dataTransfer.dropEffect = \"move\";\n    \n    const dropzone = event.currentTarget;\n    dropzone.classList.add(\"border-blue-500\", \"bg-blue-50\");\n  }\n\n  handleDragLeave(event) {\n    const dropzone = event.currentTarget;\n    \n    if (!dropzone.contains(event.relatedTarget)) {\n      dropzone.classList.remove(\"border-blue-500\", \"bg-blue-50\");\n    }\n  }\n\n  handleDrop(event) {\n    event.preventDefault();\n    event.stopPropagation();\n    \n    if (!this.draggedNode) return;\n    \n    // Find the dropzone - could be the current target or a parent\n    let dropzone = event.currentTarget;\n    if (!dropzone.classList.contains('graph-dropzone')) {\n      dropzone = dropzone.closest('.graph-dropzone');\n    }\n    \n    // Remove highlight from all dropzones\n    this.dropzoneTargets.forEach(dz => {\n      dz.classList.remove(\"border-blue-500\", \"bg-blue-50\");\n    });\n    \n    const targetGraphCard = dropzone.closest(\".graph-card\");\n    const targetGraphId = targetGraphCard.dataset.graphId;\n    \n    if (this.sourceGraphId === targetGraphId) {\n      return;\n    }\n    \n    const nodesList = dropzone.querySelector(\".nodes-list\");\n    const emptyState = dropzone.querySelector(\".empty-state\");\n    \n    nodesList.appendChild(this.draggedNode);\n    emptyState.classList.add(\"hidden\");\n    \n    this.updateNodeCounts();\n    this.updateEmptyStates();\n    \n    this.draggedNode = null;\n    this.sourceGraphId = null;\n  }\n\n  updateNodeCounts() {\n    const graphCards = this.graphsContainerTarget.querySelectorAll(\".graph-card\");\n    \n    graphCards.forEach(card => {\n      const nodeCount = card.querySelectorAll(\".node-item\").length;\n      card.querySelector(\".node-count\").textContent = `${nodeCount} nodes`;\n    });\n  }\n\n  updateEmptyStates() {\n    const graphCards = this.graphsContainerTarget.querySelectorAll(\".graph-card\");\n    \n    graphCards.forEach(card => {\n      const nodesList = card.querySelector(\".nodes-list\");\n      const emptyState = card.querySelector(\".empty-state\");\n      const hasNodes = nodesList.querySelectorAll(\".node-item\").length > 0;\n      \n      if (hasNodes) {\n        emptyState.classList.add(\"hidden\");\n      } else {\n        emptyState.classList.remove(\"hidden\");\n      }\n    });\n  }\n\n  async saveChanges() {\n    this.hideError();\n    \n    const changedGraphs = this.getChangedGraphs();\n    \n    if (changedGraphs.length === 0) {\n      this.showError(\"No changes detected. Please move some nodes between graphs.\");\n      return;\n    }\n    \n    this.saveButtonTarget.disabled = true;\n    this.saveButtonTextTarget.classList.add(\"hidden\");\n    this.saveButtonSpinnerTarget.classList.remove(\"hidden\");\n    \n    try {\n      for (const change of changedGraphs) {\n        await this.splitGraph(change.sourceGraphId, change.nodeIds);\n      }\n      \n      const modalElement = document.getElementById(\"graphSplitterModal\");\n      if (modalElement) {\n        this.hideModal(modalElement);\n      }\n      \n      window.location.reload();\n    } catch (error) {\n      console.error(\"Error saving changes:\", error);\n      this.showError(error.message || \"Failed to save changes. Please try again.\");\n      \n      this.saveButtonTarget.disabled = false;\n      this.saveButtonTextTarget.classList.remove(\"hidden\");\n      this.saveButtonSpinnerTarget.classList.add(\"hidden\");\n    }\n  }\n\n  getChangedGraphs() {\n    const changes = [];\n    const graphCards = this.graphsContainerTarget.querySelectorAll(\".graph-card\");\n    \n    graphCards.forEach(card => {\n      const graphId = parseInt(card.dataset.graphId);\n      \n      // Collect all node IDs including segments\n      const currentNodeIds = Array.from(card.querySelectorAll(\".node-item\"))\n        .map(node => parseInt(node.dataset.nodeId));\n      \n      const currentAllNodeIds = Array.from(card.querySelectorAll(\".node-item\"))\n        .flatMap(node => JSON.parse(node.dataset.allNodeIds || '[]'));\n      \n      const originalGraph = this.graphsData.find(g => g.id === graphId);\n      if (!originalGraph) return;\n      \n      const originalNodeIds = originalGraph.nodes.map(n => n.id);\n      \n      const addedNodes = currentNodeIds.filter(id => !originalNodeIds.includes(id));\n      \n      if (addedNodes.length > 0) {\n        // Get all node IDs (including segments) for the added nodes\n        const addedNodeElements = Array.from(card.querySelectorAll(\".node-item\"))\n          .filter(node => addedNodes.includes(parseInt(node.dataset.nodeId)));\n        \n        const allNodeIdsToMove = addedNodeElements\n          .flatMap(node => JSON.parse(node.dataset.allNodeIds || '[]'));\n        \n        changes.push({\n          sourceGraphId: this.findOriginalGraphForNodes(addedNodes),\n          targetGraphId: graphId,\n          nodeIds: allNodeIdsToMove\n        });\n      }\n    });\n    \n    return changes;\n  }\n\n  findOriginalGraphForNodes(nodeIds) {\n    for (const graph of this.graphsData) {\n      const hasAllNodes = nodeIds.every(nodeId => \n        graph.nodes.some(n => n.id === nodeId)\n      );\n      if (hasAllNodes) {\n        return graph.id;\n      }\n    }\n    return null;\n  }\n\n  async splitGraph(sourceGraphId, nodeIds) {\n    const response = await fetch(`/morphology/dependency-graphs/${sourceGraphId}/split`, {\n      method: \"POST\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n        \"X-CSRF-Token\": document.querySelector(\"[name='csrf-token']\").content\n      },\n      body: JSON.stringify({\n        node_ids: nodeIds\n      })\n    });\n    \n    const data = await response.json();\n    \n    if (!response.ok || !data.success) {\n      throw new Error(data.errors?.join(\", \") || \"Failed to split graph\");\n    }\n    \n    return data;\n  }\n\n  showError(message) {\n    this.errorContainerTarget.querySelector('p').textContent = message;\n    this.errorContainerTarget.classList.remove(\"hidden\");\n  }\n\n  hideError() {\n    this.errorContainerTarget.classList.add(\"hidden\");\n  }\n\n  closeModal(event) {\n    const modalElement = document.getElementById(\"graphSplitterModal\");\n    if (modalElement) {\n      this.hideModal(modalElement);\n    }\n  }\n\n  hideModal(modalElement) {\n    modalElement.classList.remove('opacity-100');\n    modalElement.classList.add('opacity-0');\n    modalElement.setAttribute('aria-hidden', 'true');\n    \n    const backdrop = document.querySelector('.modal-backdrop');\n    if (backdrop) {\n      backdrop.style.opacity = '0';\n      setTimeout(() => {\n        if (backdrop.parentNode) {\n          backdrop.parentNode.removeChild(backdrop);\n        }\n      }, 300);\n    }\n    \n    document.body.classList.remove('modal-open');\n    document.body.style.overflow = '';\n    document.body.style.paddingRight = '';\n    \n    setTimeout(() => {\n      modalElement.classList.add('hidden');\n    }, 300);\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nconst ACTIVE_NAV_CLASS = \"nav-link--active\"\n\nconst RESOURCES_PREFIX = \"/resources\"\nconst FAQ_PATH = \"/faq\"\nconst TOOLS_PATH = \"/tools\"\nconst CMS_PREFIX = \"/cms\"\n\nexport default class extends Controller {\n  static targets = [\"resources\", \"tools\", \"faq\", \"cms\"]\n\n  connect() {\n    this.boundApply = () => this.apply()\n    this.apply()\n    document.addEventListener(\"turbo:load\", this.boundApply)\n    document.addEventListener(\"turbo:render\", this.boundApply)\n  }\n\n  disconnect() {\n    document.removeEventListener(\"turbo:load\", this.boundApply)\n    document.removeEventListener(\"turbo:render\", this.boundApply)\n  }\n\n  apply() {\n    const path = window.location.pathname\n    this.clearNavStates()\n\n    if (this.matchesResources(path)) {\n      this.activateTargets(this.resourcesTargets)\n    } else if (path === TOOLS_PATH) {\n      this.activateTargets(this.toolsTargets)\n    } else if (path === FAQ_PATH) {\n      this.activateTargets(this.faqTargets)\n    } else if (this.matchesCms(path)) {\n      this.activateTargets(this.cmsTargets)\n    }\n  }\n\n  matchesResources(path) {\n    return path === RESOURCES_PREFIX || path.startsWith(`${RESOURCES_PREFIX}/`)\n  }\n\n  matchesCms(path) {\n    return path.startsWith(CMS_PREFIX)\n  }\n\n  clearNavStates() {\n    ;[\n      ...this.resourcesTargets,\n      ...this.toolsTargets,\n      ...this.faqTargets,\n      ...this.cmsTargets,\n    ].forEach((el) => {\n      el.classList.remove(ACTIVE_NAV_CLASS)\n      el.removeAttribute(\"aria-current\")\n    })\n  }\n\n  activateTargets(elements) {\n    elements.forEach((el) => {\n      el.classList.add(ACTIVE_NAV_CLASS)\n      el.setAttribute(\"aria-current\", \"page\")\n    })\n  }\n}\n", "// Visit The Stimulus Handbook for more details\n// https://stimulusjs.org/handbook/introduction\n//\n// This example controller works with specially annotated HTML like:\n//\n// <div data-controller=\"hello\">\n//   <h1 data-target=\"hello.output\"></h1>\n// </div>\n\nimport { Controller } from \"@hotwired/stimulus\"\n//import '@json-editor/json-editor';\nimport {loadJavascript, loadStylesheet} from \"../utils/script_loader\";\n\nexport default class extends Controller {\n  connect() {\n    loadStylesheet(\"https://cdnjs.cloudflare.com/ajax/libs/jsoneditor/9.10.2/jsoneditor.css\");\n    loadJavascript(\"https://cdnjs.cloudflare.com/ajax/libs/jsoneditor/9.10.2/jsoneditor.min.js\").then(this.initEditor.bind(this))\n  }\n\n  initEditor(){\n    let el = $(this.element)\n    el.hide();\n\n    const editorDiv = document.createElement('div');\n    editorDiv.id=\"json-editor-form\"\n    this.element.parentNode.insertBefore(editorDiv, this.element);\n\n    const config = {\n      modes: ['code', 'form', 'text', 'tree', 'view', 'preview'], // allowed modes\n      onChange: () => {\n        el.val(JSON.stringify(this.editor.get()))\n      }\n    }\n    this.editor = new JSONEditor(document.getElementById('json-editor-form'), config);\n    this.editor.set(this.initialJson())\n\n    el.val(JSON.stringify(this.editor.get()))\n  }\n\n  initialJson() {\n    return JSON.parse(this.element.dataset.json || \"{}\")\n  }\n\n\n  disconnect() {\n    if(this.editor)\n    this.editor.destroy();\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"tree\", \"raw\"]\n\n  connect() {\n    if (!this.hasTreeTarget || !this.hasRawTarget) return\n    try {\n      const data = JSON.parse(this.rawTarget.textContent)\n      this.treeTarget.appendChild(this.buildNode(null, data, true))\n      this.showTree()\n    } catch (error) {\n      this.showRaw()\n    }\n  }\n\n  showTree() {\n    if (this.hasTreeTarget) this.treeTarget.classList.remove(\"hidden\")\n    if (this.hasRawTarget) this.rawTarget.classList.add(\"hidden\")\n  }\n\n  showRaw() {\n    if (this.hasTreeTarget) this.treeTarget.classList.add(\"hidden\")\n    if (this.hasRawTarget) this.rawTarget.classList.remove(\"hidden\")\n  }\n\n  buildNode(key, value, open = false) {\n    const wrapper = document.createElement(\"div\")\n    wrapper.className = \"leading-6\"\n\n    const isObject = value !== null && typeof value === \"object\"\n\n    if (!isObject) {\n      wrapper.appendChild(this.keyLabel(key))\n      const span = document.createElement(\"span\")\n      span.textContent = this.formatPrimitive(value)\n      span.className = this.primitiveClass(value)\n      wrapper.appendChild(span)\n      return wrapper\n    }\n\n    const entries = Array.isArray(value)\n      ? value.map((item, index) => [index, item])\n      : Object.entries(value)\n\n    const details = document.createElement(\"details\")\n    if (open) details.open = true\n\n    const summary = document.createElement(\"summary\")\n    summary.className = \"cursor-pointer select-none\"\n    summary.appendChild(this.keyLabel(key))\n    const meta = document.createElement(\"span\")\n    meta.className = \"text-gray-400\"\n    meta.textContent = Array.isArray(value) ? `Array(${entries.length})` : `Object(${entries.length})`\n    summary.appendChild(meta)\n    details.appendChild(summary)\n\n    const children = document.createElement(\"div\")\n    children.className = \"pl-4 border-l border-gray-200 ml-1\"\n    entries.forEach(([childKey, childValue]) => {\n      children.appendChild(this.buildNode(childKey, childValue))\n    })\n    details.appendChild(children)\n    wrapper.appendChild(details)\n    return wrapper\n  }\n\n  keyLabel(key) {\n    const label = document.createElement(\"span\")\n    if (key === null) {\n      label.textContent = \"\"\n    } else {\n      label.textContent = `${key}: `\n      label.className = \"text-indigo-700 font-medium\"\n    }\n    return label\n  }\n\n  formatPrimitive(value) {\n    if (value === null) return \"null\"\n    if (typeof value === \"string\") return `\"${value}\"`\n    return String(value)\n  }\n\n  primitiveClass(value) {\n    if (typeof value === \"number\") return \"text-emerald-700\"\n    if (typeof value === \"boolean\") return \"text-purple-700\"\n    if (value === null) return \"text-gray-400\"\n    return \"text-gray-800\"\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  connect() {\n    if (\"IntersectionObserver\" in window) {\n      this.createObserver();\n    } else {\n      this.loadImage();\n    }\n  }\n\n  createObserver() {\n    const observerOptions = {\n      root: null,\n      threshold: 0.1,\n    };\n\n    const observer = new IntersectionObserver(this.handleIntersect.bind(this), observerOptions);\n    observer.observe(this.element);\n  }\n\n  handleIntersect(entries, observer) {\n    entries.forEach(entry => {\n      if (entry.isIntersecting) {\n        this.loadImage();\n        observer.unobserve(this.element); // Stop observing once the image is loaded\n      }\n    });\n  }\n\n  loadImage() {\n    const img = this.element;\n    const dataSrc = img.getAttribute(\"data-src\");\n    if (dataSrc) {\n      img.src = dataSrc;\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = { \n    pageNumber: Number,\n    updateUrl: String\n  }\n\n  connect() {\n    this.updateTimeouts = {}\n    this.setupInputListeners()\n    this.setupPreviewWordLinks()\n  }\n\n  setupPreviewWordLinks() {\n    const preview = document.getElementById('preview')\n    if (!preview) return\n\n    const observer = new MutationObserver(() => {\n      this.attachPreviewWordClickHandlers()\n    })\n    \n    observer.observe(preview, { childList: true, subtree: true })\n    this.attachPreviewWordClickHandlers()\n  }\n\n  attachPreviewWordClickHandlers() {\n    const preview = document.getElementById('preview')\n    if (!preview) return\n\n    preview.querySelectorAll('.preview-word-link').forEach(link => {\n      if (!link.dataset.clickHandlerAttached) {\n        link.addEventListener('click', (e) => {\n          e.preventDefault()\n          const wordId = link.dataset.wordId\n          this.scrollToWordForm(wordId)\n        })\n        link.dataset.clickHandlerAttached = 'true'\n      }\n    })\n  }\n\n  scrollToWordForm(wordId) {\n    const formContainer = document.getElementById(`word-form-${wordId}`)\n    \n    if (formContainer) {\n      formContainer.scrollIntoView({ behavior: 'smooth', block: 'center' })\n      \n      formContainer.style.transition = 'background-color 0.3s ease'\n      formContainer.style.backgroundColor = '#fef3c7'\n      \n      setTimeout(() => {\n        formContainer.style.backgroundColor = ''\n        setTimeout(() => {\n          formContainer.style.transition = ''\n        }, 300)\n      }, 1500)\n    }\n  }\n\n  setupInputListeners() {\n    const observer = new MutationObserver(() => {\n      this.attachListenersToNewInputs()\n    })\n    \n    observer.observe(this.element, { childList: true, subtree: true })\n    this.attachListenersToNewInputs()\n  }\n\n  attachListenersToNewInputs() {\n    this.element.querySelectorAll('input[type=\"number\"][name*=\"[frequency]\"]').forEach(input => {\n      if (!input.dataset.listenerAttached || input.dataset.listenerAttached !== 'true') {\n        input.addEventListener('input', (e) => {\n          this.handleInputChange(e.target)\n        })\n        input.dataset.listenerAttached = 'true'\n      }\n    })\n  }\n\n  handleInputChange(input) {\n    const mistakeKey = this.extractMistakeKey(input.name)\n    if (!mistakeKey) return\n\n    clearTimeout(this.updateTimeouts[mistakeKey])\n    \n    this.updateTimeouts[mistakeKey] = setTimeout(() => {\n      this.saveMistake(input, mistakeKey)\n    }, 500)\n  }\n\n  extractMistakeKey(name) {\n    const match = name.match(/mistakes\\[([^\\]]+)\\]/)\n    return match ? match[1] : null\n  }\n\n  async saveMistake(input, mistakeKey) {\n    const frequency = parseFloat(input.value) || 0\n    const [wordId, charStart, charEnd] = this.parseMistakeKey(mistakeKey)\n    \n    const data = {\n      mistakes: {\n        [mistakeKey]: {\n          frequency: frequency,\n          char_start: charStart === 'nil' ? null : charStart,\n          char_end: charEnd === 'nil' ? null : charEnd\n        }\n      }\n    }\n\n    try {\n      const response = await fetch(this.updateUrlValue, {\n        method: 'PUT',\n        headers: {\n          'Content-Type': 'application/json',\n          'X-CSRF-Token': document.querySelector('meta[name=\"csrf-token\"]').content,\n          'Accept': 'application/json'\n        },\n        body: JSON.stringify(data)\n      })\n\n      if (response.ok) {\n        this.updatePreview(wordId, charStart, charEnd, frequency)\n        this.showSaveIndicator(input)\n      } else {\n        console.error('Failed to save mistake')\n      }\n    } catch (error) {\n      console.error('Error saving mistake:', error)\n    }\n  }\n\n  parseMistakeKey(key) {\n    const parts = key.split('_')\n    let wordId = parts[0]\n    let charStart = parts[1] === 'nil' ? null : parseInt(parts[1])\n    let charEnd = parts[2] === 'nil' ? null : parseInt(parts[2])\n    \n    if (charStart !== null && charEnd !== null && charStart > charEnd) {\n      [charStart, charEnd] = [charEnd, charStart]\n    }\n    \n    return [wordId, charStart, charEnd]\n  }\n\n  updatePreview(wordId, charStart, charEnd, frequency) {\n    const wordIdStr = wordId.toString()\n    const charStartStr = charStart === 'nil' ? null : charStart\n    const charEndStr = charEnd === 'nil' ? null : charEnd\n\n    const preview = document.getElementById('preview')\n    if (!preview) return\n    \n    const wordElement = preview.querySelector(`[data-word-id=\"${wordIdStr}\"]`)\n    if (!wordElement) return\n\n    if (charStartStr === null && charEndStr === null) {\n      this.updateFullWordPreview(wordElement, parseFloat(frequency))\n    } else {\n      this.updatePartialWordPreview(wordElement, parseInt(charStartStr), parseInt(charEndStr), parseFloat(frequency))\n    }\n  }\n\n  updateFullWordPreview(wordElement, frequency) {\n    if (frequency && frequency > 0) {\n      const textColor = this.mistakeColor(frequency)\n      const glow = this.mistakeGlowIntensity(frequency)\n      \n      wordElement.classList.add('word-mistake-highlight')\n      wordElement.style.color = textColor\n      wordElement.style.textShadow = `0 0 ${glow}px ${textColor}`\n      wordElement.title = `Frequency: ${frequency}`\n    } else {\n      wordElement.classList.remove('word-mistake-highlight')\n      wordElement.style.color = ''\n      wordElement.style.textShadow = ''\n      wordElement.title = ''\n    }\n  }\n\n  updatePartialWordPreview(wordElement, charStart, charEnd, frequency) {\n    const textNode = wordElement.querySelector('a')\n    if (!textNode) return\n\n    let originalText = wordElement.dataset.originalText\n    if (!originalText) {\n      originalText = textNode.textContent || textNode.innerText || ''\n      wordElement.dataset.originalText = originalText\n    }\n    \n    const wordText = originalText\n    \n    const existingPartialHighlights = wordElement.querySelectorAll('.word-mistake-highlight-partial')\n    const highlightMap = new Map()\n    \n    existingPartialHighlights.forEach(span => {\n      const start = parseInt(span.dataset.charStart || span.getAttribute('data-char-start'))\n      const end = parseInt(span.dataset.charEnd || span.getAttribute('data-char-end'))\n      if (!isNaN(start) && !isNaN(end) && !(start === charStart && end === charEnd)) {\n        const freq = parseFloat(span.dataset.frequency || span.getAttribute('data-frequency')) || 0\n        if (freq > 0) {\n          highlightMap.set(`${start}-${end}`, {\n            start,\n            end,\n            frequency: freq\n          })\n        }\n      }\n    })\n    \n    if (frequency > 0) {\n      highlightMap.set(`${charStart}-${charEnd}`, {\n        start: charStart,\n        end: charEnd,\n        frequency: frequency\n      })\n    }\n    \n    const sortedHighlights = Array.from(highlightMap.values()).sort((a, b) => a.start - b.start)\n    \n    let html = ''\n    let lastPos = 0\n    \n    sortedHighlights.forEach(highlight => {\n      if (lastPos < highlight.start) {\n        const plainText = wordText.substring(lastPos, highlight.start)\n        html += plainText\n      }\n      \n      const textColor = this.mistakeColor(highlight.frequency)\n      const glow = this.mistakeGlowIntensity(highlight.frequency)\n      const highlightText = wordText.substring(highlight.start, highlight.end)\n      \n      html += `<span class=\"word-mistake-highlight-partial\" data-char-start=\"${highlight.start}\" data-char-end=\"${highlight.end}\" data-frequency=\"${highlight.frequency}\" style=\"color: ${textColor}; text-shadow: 0 0 ${glow}px ${textColor};\" title=\"Frequency: ${highlight.frequency}\">${highlightText}</span>`\n      lastPos = highlight.end\n    })\n    \n    if (lastPos < wordText.length) {\n      html += wordText.substring(lastPos)\n    }\n    \n    textNode.innerHTML = html || wordText\n  }\n\n  mistakeColor(frequency) {\n    if (!frequency || frequency <= 0) return 'inherit'\n    \n    const freq = Math.min(Math.max(parseFloat(frequency), 0.0), 1.0)\n    \n    const yellowR = 255, yellowG = 200, yellowB = 0\n    const orangeR = 255, orangeG = 140, orangeB = 0\n    const redR = 255, redG = 0, redB = 0\n    \n    let r, g, b\n    \n    if (freq <= 0.5) {\n      const t = freq * 2\n      r = Math.round(yellowR + (orangeR - yellowR) * t)\n      g = Math.round(yellowG + (orangeG - yellowG) * t)\n      b = Math.round(yellowB + (orangeB - yellowB) * t)\n    } else {\n      const t = (freq - 0.5) * 2\n      r = Math.round(orangeR + (redR - orangeR) * t)\n      g = Math.round(orangeG + (redG - orangeG) * t)\n      b = Math.round(orangeB + (redB - orangeB) * t)\n    }\n    \n    return `rgb(${r}, ${g}, ${b})`\n  }\n\n  mistakeGlowIntensity(frequency) {\n    if (!frequency || frequency <= 0) return 0\n    const freq = Math.min(Math.max(parseFloat(frequency), 0.0), 1.0)\n    return Math.round(freq * 20)\n  }\n\n  showSaveIndicator(input) {\n    const originalBg = input.style.backgroundColor\n    input.style.backgroundColor = '#d4edda'\n    \n    setTimeout(() => {\n      input.style.backgroundColor = originalBg\n    }, 300)\n  }\n\n  removePartialRange(event) {\n    event.preventDefault()\n    event.stopPropagation()\n    \n    const button = event.currentTarget\n    const container = button.closest('[data-partial-range]')\n    const mistakeKey = this.extractMistakeKeyFromContainer(container)\n    \n    if (mistakeKey) {\n      const [wordId, charStart, charEnd] = this.parseMistakeKey(mistakeKey)\n      \n      fetch(this.updateUrlValue, {\n        method: 'PUT',\n        headers: {\n          'Content-Type': 'application/json',\n          'X-CSRF-Token': document.querySelector('meta[name=\"csrf-token\"]').content,\n          'Accept': 'application/json'\n        },\n        body: JSON.stringify({\n          mistakes: {\n            [mistakeKey]: {\n              frequency: 0,\n              char_start: charStart === 'nil' ? null : charStart,\n              char_end: charEnd === 'nil' ? null : charEnd\n            }\n          }\n        })\n      }).then(response => {\n        if (response.ok) {\n          container.remove()\n          this.updatePreview(wordId, charStart, charEnd, 0)\n        }\n      }).catch(error => {\n        console.error('Error removing partial range:', error)\n      })\n    } else {\n      container.remove()\n    }\n  }\n\n  extractMistakeKeyFromContainer(container) {\n    const input = container.querySelector('input[type=\"number\"][name*=\"[frequency]\"]')\n    return input ? this.extractMistakeKey(input.name) : null\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  connect() {\n    this.el = $(this.element);\n    \n    this.history = [];\n    this.historyIndex = -1;\n    this.maxHistorySize = 50;\n    \n    this.saveState();\n    \n    this.el.find(\"#decrement\").on(\"click\", this.decrementPage.bind(this));\n    this.el.find(\"#increment\").on(\"click\", this.incrementPage.bind(this));\n\n    this.setupKeyboardShortcuts();\n\n    $(\".mushaf-layout-form .remove-ayah\").on('click', (event) => {\n      event.preventDefault()\n      $(event.target).closest(\".verse\").remove()\n    });\n\n    $(\".mushaf-layout-form .line-number-input\").on('change', (event) => {\n      const ayahNumber = Number(event.currentTarget.dataset.verse);\n      const positionNumber = Number(event.currentTarget.dataset.wordPosition);\n      const lineNumber = Number(event.currentTarget.value);\n      const propagate = $(\"#propagate-changes\").is(\":checked\")\n\n      // If lineNumber is 0, always propagate regardless of checkbox\n      // For other values, respect the propagate checkbox\n      const shouldPropagate = lineNumber === 0 || propagate;\n\n      if (!shouldPropagate) {\n        this.saveState();\n        return;\n      }\n\n      document.querySelectorAll('.line-number-input').forEach((input) => {\n        var ayah = Number(input.dataset.verse)\n        const position = Number(input.dataset.wordPosition);\n\n        if (ayah > ayahNumber) {\n          input.value = lineNumber;\n        } else if(ayah == ayahNumber){\n          if(position > positionNumber)\n            input.value = lineNumber;\n        }\n      })\n      \n      // Save state after propagation\n      this.saveState();\n    });\n  }\n\n  decrementPage(){\n    this.changePageNumberForAllWords(-1);\n    this.saveState();\n  }\n  \n  incrementPage(){\n    this.changePageNumberForAllWords(1);\n    this.saveState();\n  }\n\n  changePageNumberForAllWords(change){\n    document.querySelectorAll('.line-number-input').forEach((input) => {\n      var line = Number(input.value);\n      if(line != 0)\n        input.value = line + change;\n    })\n  }\n  \n  // Save current state to history for undo/redo\n  saveState() {\n    const currentState = this.getCurrentState();\n    \n    if (this.historyIndex < this.history.length - 1) {\n      this.history = this.history.slice(0, this.historyIndex + 1);\n    }\n    \n    this.history.push(currentState);\n    \n    if (this.history.length > this.maxHistorySize) {\n      this.history.shift();\n    } else {\n      this.historyIndex++;\n    }\n    \n    this.updateUndoRedoButtons();\n  }\n  \n  getCurrentState() {\n    const state = [];\n    document.querySelectorAll('.line-number-input').forEach((input) => {\n      state.push({\n        verse: input.dataset.verse,\n        wordPosition: input.dataset.wordPosition,\n        value: input.value\n      });\n    });\n    return state;\n  }\n  \n  restoreState(state) {\n    state.forEach((item) => {\n      const input = document.querySelector(\n        `.line-number-input[data-verse=\"${item.verse}\"][data-word-position=\"${item.wordPosition}\"]`\n      );\n      if (input) {\n        input.value = item.value;\n      }\n    });\n  }\n  \n  undo() {\n    if (this.historyIndex > 0) {\n      this.historyIndex--;\n      this.restoreState(this.history[this.historyIndex]);\n      this.updateUndoRedoButtons();\n    }\n  }\n  \n  redo() {\n    if (this.historyIndex < this.history.length - 1) {\n      this.historyIndex++;\n      this.restoreState(this.history[this.historyIndex]);\n      this.updateUndoRedoButtons();\n    }\n  }\n  \n  setupUndoRedo() {\n    this.el.find(\"#undo-button\").on(\"click\", (e) => {\n      e.preventDefault();\n      this.undo();\n    });\n    \n    this.el.find(\"#redo-button\").on(\"click\", (e) => {\n      e.preventDefault();\n      this.redo();\n    });\n  }\n  \n  updateUndoRedoButtons() {\n    const undoButton = this.el.find(\"#undo-button\");\n    const redoButton = this.el.find(\"#redo-button\");\n    \n    if (undoButton.length) {\n      undoButton.prop('disabled', this.historyIndex <= 0);\n    }\n    \n    if (redoButton.length) {\n      redoButton.prop('disabled', this.historyIndex >= this.history.length - 1);\n    }\n  }\n  \n  setupKeyboardShortcuts() {\n    $(document).on('keydown.mushaf-builder', (e) => {\n      // Check if we're in the mushaf layout form context\n      if (!$(e.target).closest('.mushaf-layout-form').length && \n          !$(e.target).closest('[data-controller*=\"mushaf-page-builder\"]').length) {\n        return;\n      }\n      \n      if ((e.ctrlKey || e.metaKey) && e.key === 'z' && !e.shiftKey) {\n        e.preventDefault();\n        this.undo();\n      }\n      \n      if ((e.ctrlKey || e.metaKey) && (e.key === 'y' || (e.shiftKey && e.key === 'z'))) {\n        e.preventDefault();\n        this.redo();\n      }\n    });\n  }\n  \n  disconnect() {\n    $(document).off('keydown.mushaf-builder');\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  connect() {\n    const el = $(this.element);\n    const ayahs = el.find(\".page .ayah\");\n    const words = el.find(\".page .ayah .char\");\n    const fontSwitcher = el.find('select#change_font')\n    const mushtabiat = el.find('#mushtabiat')\n\n    mushtabiat.on(\"change\", (event) => {\n      const url = window.location.href;\n      const urlWithQuery = new URL(url);\n\n      let showMushtabiat = urlWithQuery.searchParams.get('mushtabiat');\n      showMushtabiat = showMushtabiat !== '0'  ? 1 : 0\n      urlWithQuery.searchParams.set('mushtabiat', showMushtabiat);\n\n      window.location.href = urlWithQuery.href;\n    })\n\n    if(fontSwitcher.length >0){\n      fontSwitcher.on('change', this.changeFont.bind(this))\n    }\n\n    ayahs.on('mouseover', (event) => {\n      const ayah = event.currentTarget.dataset.ayah;\n      $(`[data-ayah=${ayah}]`).addClass('highlight bg-success-50')\n    });\n\n    ayahs.on('mouseout', (event) => {\n      const ayah = event.currentTarget.dataset.ayah;\n      $(`[data-ayah=${ayah}]`).removeClass('highlight bg-success-50')\n    });\n\n    words.on('mouseover', (event) => {\n      const wordId = event.currentTarget.dataset.wordId;\n      $(`[data-word-id=${wordId}]`).addClass('highlight bg-info-50')\n    });\n\n    words.on('mouseout', (event) => {\n      const wordId = event.currentTarget.dataset.wordId;\n      $(`[data-word-id=${wordId}]`).removeClass('highlight bg-info-50')\n    });\n\n    el.find('.font-size-slider').on('change', (event) => {\n      const fontSize = event.target.value;\n\n      el.find('.char').css('font-size', `${fontSize}px`)\n      el.find('#size').html(`${fontSize}px`)\n    })\n\n    this.el = el;\n  }\n\n  changeFont(e){\n    const font = e.target.value;\n    this.el.removeClass().addClass(`mushaf mushaf-${font}`)\n  }\n}\n", "import {Controller} from \"@hotwired/stimulus\"\nimport LocalStore from \"../utils/LocalStore\";\n\n// One suggested ayah in the Mutashabihat builder.\n//\n// Click the first word and then the last word to select a range. An ayah can\n// have more than one range, since the same phrase can appear twice in it.\n// Clicking a word inside a selected range excludes it (a word that differs\n// from the phrase), clicking it again includes it back.\nexport default class extends Controller {\n  static targets = [\"word\", \"ranges\", \"bookmark\", \"saveButton\"]\n  static values = {\n    ranges: Array,\n    excluded: Array,\n    editable: Boolean,\n    saved: Boolean\n  }\n\n  connect() {\n    this.store = new LocalStore()\n    this.anchor = null\n    this.ranges = this.rangesValue.map(([from, to]) => [Math.min(from, to), Math.max(from, to)])\n    this.excluded = new Set(this.excludedValue.map(Number))\n    this.onKeydown = this.onKeydown.bind(this)\n    document.addEventListener('keydown', this.onKeydown)\n\n    this.render()\n    this.renderBookmark()\n  }\n\n  disconnect() {\n    document.removeEventListener('keydown', this.onKeydown)\n  }\n\n  pick(event) {\n    if (!this.editableValue) return\n\n    const position = parseInt(event.currentTarget.dataset.position)\n\n    if (this.anchor !== null) {\n      this.addRange(this.anchor, position)\n      this.anchor = null\n    } else if (this.rangeIndexFor(position) > -1) {\n      this.excluded.has(position) ? this.excluded.delete(position) : this.excluded.add(position)\n    } else {\n      this.anchor = position\n    }\n\n    this.markDirty()\n    this.render()\n  }\n\n  removeRange(event) {\n    const [from, to] = this.ranges[parseInt(event.currentTarget.dataset.index)]\n    this.ranges = this.ranges.filter(([f, t]) => f !== from || t !== to)\n    this.excluded.forEach((p) => { if (p >= from && p <= to) this.excluded.delete(p) })\n\n    this.markDirty()\n    this.render()\n  }\n\n  useRanges(event) {\n    this.ranges = JSON.parse(event.currentTarget.dataset.ranges)\n    this.excluded.forEach((p) => { if (this.rangeIndexFor(p) === -1) this.excluded.delete(p) })\n    this.anchor = null\n\n    this.markDirty()\n    this.render()\n  }\n\n  clear() {\n    this.ranges = []\n    this.excluded.clear()\n    this.anchor = null\n\n    this.markDirty()\n    this.render()\n  }\n\n  onKeydown(event) {\n    if (event.key === 'Escape' && this.anchor !== null) {\n      this.anchor = null\n      this.render()\n    }\n  }\n\n  addRange(a, b) {\n    let from = Math.min(a, b)\n    let to = Math.max(a, b)\n\n    // Merge with any range it overlaps\n    const kept = []\n    this.ranges.forEach(([f, t]) => {\n      if (f <= to && t >= from) {\n        from = Math.min(from, f)\n        to = Math.max(to, t)\n      } else {\n        kept.push([f, t])\n      }\n    })\n\n    kept.push([from, to])\n    this.ranges = kept.sort((x, y) => x[0] - y[0])\n  }\n\n  rangeIndexFor(position) {\n    return this.ranges.findIndex(([from, to]) => position >= from && position <= to)\n  }\n\n  excludedInRanges() {\n    return [...this.excluded].filter((p) => this.rangeIndexFor(p) > -1).sort((a, b) => a - b)\n  }\n\n  render() {\n    this.wordTargets.forEach((word) => {\n      const position = parseInt(word.dataset.position)\n      const range = this.ranges[this.rangeIndexFor(position)]\n\n      word.classList.toggle('is-selected', !!range)\n      word.classList.toggle('is-excluded', !!range && this.excluded.has(position))\n      word.classList.toggle('range-start', !!range && range[0] === position)\n      word.classList.toggle('range-end', !!range && range[1] === position)\n      word.classList.toggle('is-anchor', this.anchor === position)\n    })\n\n    this.renderRanges()\n  }\n\n  renderRanges() {\n    if (!this.hasRangesTarget) return\n\n    const chips = this.ranges.map(([from, to], index) => {\n      const label = from === to ? `${from}` : `${from}\u2013${to}`\n      const remove = this.editableValue\n        ? `<button type=\"button\" class=\"range-chip-remove\" data-index=\"${index}\" data-action=\"mutashabihat-ayah#removeRange\" aria-label=\"Remove range ${label}\">&times;</button>`\n        : ''\n\n      return `<span class=\"range-chip\">${label}${remove}</span>`\n    })\n\n    if (this.anchor !== null) {\n      chips.push(`<span class=\"range-chip is-pending\">${this.anchor}\u2013? <span class=\"opacity-70\">click last word, Esc to cancel</span></span>`)\n    } else if (chips.length === 0) {\n      chips.push(`<span class=\"text-xs text-slate-400\">No words selected</span>`)\n    }\n\n    this.rangesTarget.innerHTML = chips.join('')\n  }\n\n  markDirty() {\n    if (this.hasSaveButtonTarget) this.saveButtonTarget.classList.add('is-dirty')\n  }\n\n  save() {\n    this.request('POST', '/morphology_phrases', {\n      ...this.sourceParams(),\n      verse_id: this.element.dataset.ayahid,\n      ranges: JSON.stringify(this.ranges),\n      excluded_words: this.excludedInRanges().join(',')\n    })\n  }\n\n  remove() {\n    const phraseId = this.sourceParams().phrase_id\n\n    if (!this.savedValue || !phraseId) {\n      this.element.remove()\n      return\n    }\n\n    if (!confirm(`Remove ${this.element.dataset.ayahkey} from this phrase?`)) return\n\n    this.request('DELETE', '/morphology_phrases/ayah', {\n      phrase_id: phraseId,\n      verse_id: this.element.dataset.ayahid\n    })\n  }\n\n  sourceParams() {\n    const value = (id) => document.getElementById(id)?.value\n\n    return {\n      phrase_text: value('text'),\n      source_ayah_key: value('source_ayah'),\n      source_ayah_word_from: value('word_from'),\n      source_ayah_word_to: value('word_to'),\n      phrase_id: value('phrase_id')\n    }\n  }\n\n  request(method, url, data) {\n    fetch(url, {\n      method: method,\n      headers: {\n        'Content-Type': 'application/json',\n        'X-CSRF-Token': document.querySelector('meta[name=\"csrf-token\"]')?.content,\n        Accept: \"text/vnd.turbo-stream.html\"\n      },\n      body: JSON.stringify(data)\n    })\n      .then(r => r.text())\n      .then(html => Turbo.renderStreamMessage(html))\n  }\n\n  bookmarks() {\n    try {\n      return JSON.parse(this.store.get('bookmarks') || \"{}\")\n    } catch (e) {\n      return {}\n    }\n  }\n\n  toggleBookmark() {\n    const bookmarks = this.bookmarks()\n    const key = this.element.dataset.ayahkey\n\n    bookmarks[key] ? delete bookmarks[key] : bookmarks[key] = true\n    this.store.set('bookmarks', JSON.stringify(bookmarks))\n    this.renderBookmark()\n  }\n\n  renderBookmark() {\n    if (!this.hasBookmarkTarget) return\n\n    const active = !!this.bookmarks()[this.element.dataset.ayahkey]\n    this.bookmarkTarget.classList.toggle('is-active', active)\n  }\n}\n", "class CookieStore {\n  getItem(key) {\n    let values = document.cookie.match(`(^|;)\\\\s*${key}\\\\s*=\\\\s*([^;]+)`);\n    return values ? values.pop() : null;\n  }\n\n  setItem(key, val) {\n    let date = new Date();\n    let days = 300;\n    date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);\n    let expires = \"; expires=\" + date.toGMTString();\n    document.cookie = key + \"=\" + String(val) + expires + \"; path=/\";\n  }\n\n  removeItem(key, val){\n    throw \"remove item is not implemented for CookieStore\"\n  }\n}\n\nclass LocalStore {\n  get(key, fallback) {\n    return this.getStore().getItem(this.transformKey(key)) || fallback;\n  }\n\n  set(key, val) {\n    return this.getStore().setItem(this.transformKey(key), val);\n  }\n\n  remove(key){\n    return this.getStore().removeItem(this.transformKey(key));\n  }\n\n  transformKey(key) {\n    return `qul-${key}`;\n  }\n\n  getStore() {\n    if (\"object\" == typeof localStorage) {\n      return localStorage;\n    } else {\n      return new CookieStore();\n    }\n  }\n}\n\nexport default LocalStore;\n", "import {Controller} from \"@hotwired/stimulus\"\n\n// Source phrase bar of the Mutashabihat builder. Picking a new source ayah,\n// or clicking the first and last word of the source phrase, searches again.\n// Each ayah card is handled by the mutashabihat-ayah controller.\nexport default class extends Controller {\n  static targets = [\"form\", \"sourceWord\", \"wordFrom\", \"wordTo\", \"hint\", \"bar\", \"sentinel\"]\n\n  connect() {\n    this.anchor = null\n    this.el = $(this.element)\n\n    // select2 fires jQuery change events, not native ones\n    this.el.on('change.mutashabihat', '#add_ayah_key', this.suggestNewAyah.bind(this))\n    this.el.on('change.mutashabihat', '#source_ayah', this.changeSourceAyah.bind(this))\n\n    this.watchStuck()\n  }\n\n  disconnect() {\n    this.el.off('.mutashabihat')\n    if (this.onScroll) window.removeEventListener('scroll', this.onScroll)\n  }\n\n  // Once the source bar is pinned while scrolling, shrink it to just the\n  // selected words so it doesn't cover the ayahs.\n  watchStuck() {\n    if (!this.hasSentinelTarget || !this.hasBarTarget) return\n\n    this.onScroll = () => {\n      if (this.scrollFrame) return\n\n      this.scrollFrame = requestAnimationFrame(() => {\n        this.scrollFrame = null\n        const pinned = this.sentinelTarget.getBoundingClientRect().top < 76\n        this.barTarget.classList.toggle('is-stuck', pinned && this.anchor === null)\n      })\n    }\n\n    window.addEventListener('scroll', this.onScroll, {passive: true})\n    this.onScroll()\n  }\n\n  pickSourceWord(event) {\n    const position = parseInt(event.currentTarget.dataset.position)\n\n    if (this.anchor === null) {\n      this.anchor = position\n      this.barTarget?.classList.remove('is-stuck')\n      this.sourceWordTargets.forEach((w) => {\n        w.classList.remove('is-selected', 'range-start', 'range-end')\n        w.classList.toggle('is-anchor', parseInt(w.dataset.position) === position)\n      })\n      if (this.hasHintTarget) this.hintTarget.textContent = 'Now click the last word of the phrase'\n      return\n    }\n\n    this.wordFromTarget.value = Math.min(this.anchor, position)\n    this.wordToTarget.value = Math.max(this.anchor, position)\n    this.search()\n  }\n\n  changeSourceAyah() {\n    // New ayah, let the server pick the full ayah as the phrase\n    this.wordFromTarget.value = ''\n    this.wordToTarget.value = ''\n    this.search()\n  }\n\n  search() {\n    if (this.hasHintTarget) this.hintTarget.textContent = 'Searching...'\n    this.formTarget.requestSubmit()\n  }\n\n  filter(event) {\n    const selected = event.currentTarget.dataset.filter\n\n    this.element.querySelectorAll('[data-filter]').forEach((b) => b.classList.toggle('is-active', b === event.currentTarget))\n    this.element.querySelectorAll('#suggested-ayahs .ayah').forEach((card) => {\n      const categories = (card.dataset.categories || '').split(' ')\n      card.classList.toggle('hidden', selected !== 'all' && !categories.includes(selected))\n    })\n  }\n\n  suggestNewAyah(event) {\n    const key = $(event.target).val()\n    if (!key) return\n\n    const params = new URLSearchParams({\n      add_ayah_key: key,\n      source_ayah: this.element.querySelector('#source_ayah')?.value || '',\n      word_from: this.wordFromTarget.value,\n      word_to: this.wordToTarget.value\n    })\n\n    fetch(`/morphology_phrases/new?${params}`, {\n      headers: {Accept: \"text/vnd.turbo-stream.html\"}\n    })\n      .then(r => r.text())\n      .then(html => Turbo.renderStreamMessage(html))\n  }\n}\n", "import {Controller} from \"@hotwired/stimulus\"\n\n// Ayah proofreading page: hovering a phrase card highlights its words in\n// the ayah, and hovering a word highlights the phrases it belongs to.\n// \"Show differences\" colours words that differ from the phrase in its\n// ayahs, and is remembered for next time.\nexport default class extends Controller {\n  static targets = [\"sentinel\", \"sticky\", \"diffToggle\"]\n\n  // The ayah text pins below the 75px site header. Once pinned it gets a\n  // smaller font and a capped height (see .ayah-sticky.is-stuck).\n  connect() {\n    this.onScroll = this.updateStuck.bind(this)\n    window.addEventListener(\"scroll\", this.onScroll, {passive: true})\n    this.updateStuck()\n\n    if (this.hasDiffToggleTarget) {\n      this.diffToggleTarget.checked = this.storedDiff()\n      this.toggleDiff()\n    }\n  }\n\n  toggleDiff() {\n    const show = this.diffToggleTarget.checked\n    this.element.classList.toggle(\"show-diff\", show)\n\n    try {\n      localStorage.setItem(\"mutashabihat-show-diff\", show ? \"1\" : \"0\")\n    } catch (e) {}\n  }\n\n  storedDiff() {\n    try {\n      return localStorage.getItem(\"mutashabihat-show-diff\") === \"1\"\n    } catch (e) {\n      return false\n    }\n  }\n\n  disconnect() {\n    window.removeEventListener(\"scroll\", this.onScroll)\n  }\n\n  updateStuck() {\n    if (!this.hasSentinelTarget || !this.hasStickyTarget) return\n\n    this.stickyTarget.classList.toggle(\"is-stuck\", this.sentinelTarget.getBoundingClientRect().top < 76)\n  }\n\n  focusGroup(event) {\n    this.focus([event.currentTarget.dataset.group])\n  }\n\n  focusWord(event) {\n    this.focus(event.currentTarget.dataset.groups.split(\" \"))\n  }\n\n  focus(groups) {\n    this.element.classList.add(\"is-focusing\")\n\n    this.element.querySelectorAll(\".ayah-word.is-shared\").forEach(word => {\n      const match = word.dataset.groups.split(\" \").some(g => groups.includes(g))\n      word.classList.toggle(\"is-focused\", match)\n    })\n\n    this.element.querySelectorAll(\".phrase-group, .phrase-chip\").forEach(card => {\n      card.classList.toggle(\"is-focused\", groups.includes(card.dataset.group))\n    })\n  }\n\n  blur() {\n    this.element.classList.remove(\"is-focusing\")\n    this.element.querySelectorAll(\".is-focused\").forEach(el => el.classList.remove(\"is-focused\"))\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"offcanvas\"]\n  static values = {\n    open: Boolean,\n    target: String\n  }\n\n  connect() {\n    this.openValue = false\n    this.setupClickOutside()\n  }\n\n  disconnect() {\n    this.removeClickOutside()\n  }\n\n  toggle(event) {\n    if (event) {\n      event.preventDefault()\n      event.stopPropagation()\n    }\n    this.openValue = !this.openValue\n  }\n\n  openValueChanged() {\n    if (this.openValue) {\n      this.show()\n    } else {\n      this.hide()\n    }\n  }\n\n  getTarget() {\n    if (this.hasOffcanvasTarget) {\n      return this.offcanvasTarget\n    }\n\n    if (this.hasTargetValue) {\n      return document.querySelector(this.targetValue)\n    }\n\n    return null\n  }\n\n  show() {\n    const target = this.getTarget()\n    if (target) {\n      target.classList.remove('hidden')\n      \n      // Determine direction based on class\n      const isLeft = target.classList.contains('left-0')\n      target.style.transform = isLeft ? 'translateX(-100%)' : 'translateX(100%)'\n\n      // Force reflow\n      target.offsetHeight\n\n      target.classList.add('fixed', 'top-0', 'h-full', 'w-full', 'max-w-md', 'bg-white', 'shadow-xl', 'z-50', 'transform', 'transition-transform', 'duration-300', 'ease-in-out')\n      \n      setTimeout(() => {\n        target.style.transform = 'translateX(0)'\n      }, 10)\n    }\n  }\n\n  hide() {\n    const target = this.getTarget()\n    if (target) {\n      const isLeft = target.classList.contains('left-0')\n      target.style.transform = isLeft ? 'translateX(-100%)' : 'translateX(100%)'\n      \n      setTimeout(() => {\n        target.classList.add('hidden')\n        target.classList.remove('fixed', 'top-0', 'h-full', 'w-full', 'max-w-md', 'bg-white', 'shadow-xl', 'z-50', 'transform', 'transition-transform', 'duration-300', 'ease-in-out')\n      }, 300)\n    }\n  }\n\n  hideOnClick(event) {\n    const target = this.getTarget()\n    if (target && !this.element.contains(event.target) && !target.contains(event.target)) {\n      this.openValue = false\n    }\n  }\n\n  setupClickOutside() {\n    this.boundHideOnClick = this.hideOnClick.bind(this)\n    document.addEventListener('click', this.boundHideOnClick)\n  }\n\n  removeClickOutside() {\n    if (this.boundHideOnClick) {\n      document.removeEventListener('click', this.boundHideOnClick)\n    }\n  }\n}\n\n\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  connect() {\n    this.resetHandler = this.reset.bind(this)\n    window.addEventListener('resize', this.resetHandler)\n  }\n\n  disconnect() {\n    window.removeEventListener('resize', this.resetHandler)\n  }\n\n  reset() {\n    if (window.innerWidth >= 768) {\n      const offcanvasElement = document.querySelector('.offcanvas.show');\n      if (offcanvasElement) {\n        const btnClose = offcanvasElement.querySelector('.btn-close');\n        if (btnClose) {\n          btnClose.click();\n        }\n      }\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"searchInput\", \"tableRow\"]\n\n  search() {\n    const searchTerm = this.searchInputTarget.value.trim().toLowerCase()\n    \n    this.tableRowTargets.forEach(row => {\n      const pageNumber = row.dataset.pageNumber\n      const firstAyah = row.dataset.firstAyah || \"\"\n      const lastAyah = row.dataset.lastAyah || \"\"\n      \n      if (searchTerm === \"\") {\n        row.style.display = \"\"\n        return\n      }\n      \n      if (pageNumber.includes(searchTerm)) {\n        row.style.display = \"\"\n        return\n      }\n      \n      if (firstAyah.toLowerCase().includes(searchTerm) || \n          lastAyah.toLowerCase().includes(searchTerm)) {\n        row.style.display = \"\"\n        return\n      }\n      \n      if (searchTerm.includes(\":\")) {\n        const [surah, ayah] = searchTerm.split(\":\").map(n => parseInt(n))\n        \n        if (!isNaN(surah) && !isNaN(ayah)) {\n          const [firstSurah, firstAyahNum] = firstAyah.split(\":\").map(n => parseInt(n))\n          const [lastSurah, lastAyahNum] = lastAyah.split(\":\").map(n => parseInt(n))\n          \n          if (this.isAyahInRange(surah, ayah, firstSurah, firstAyahNum, lastSurah, lastAyahNum)) {\n            row.style.display = \"\"\n            return\n          }\n        }\n      }\n      \n      row.style.display = \"none\"\n    })\n  }\n  \n  isAyahInRange(surah, ayah, firstSurah, firstAyah, lastSurah, lastAyah) {\n    if (surah === firstSurah && surah === lastSurah) {\n      return ayah >= firstAyah && ayah <= lastAyah\n    }\n    \n    if (surah === firstSurah) {\n      return ayah >= firstAyah\n    }\n    \n    if (surah === lastSurah) {\n      return ayah <= lastAyah\n    }\n    \n    if (surah > firstSurah && surah < lastSurah) {\n      return true\n    }\n    \n    return false\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\";\n\nconst BODY_CLASSES = []\n\nexport default class extends Controller {\n  connect() {\n    const {title, body_class} = this.element.dataset;\n    BODY_CLASSES.forEach((klass, i) => {\n      body.classList.remove(klass)\n    })\n\n     if(body_class){\n       body.classList.add(body_class)\n       BODY_CLASSES.push(body_class)\n     }\n\n    document.title = title\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\nimport PDFViewer from \"../utils/pdf_viewer\";\nimport { loadJavascript } from '../utils/script_loader';\n\nexport default class extends Controller {\n  connect() {\n    if(!this.element.dataset.initialized){\n      loadJavascript(\"https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.8.162/pdf.min.js\").then(this.initPdfViewer.bind(this));\n    }\n  }\n\n  initPdfViewer() {\n    this.element.dataset.initialized = true\n\n    const { pdfUrl, page, pageOffset } = this.element.dataset;\n\n    $(this.element).prepend(this.controlHtml(pageOffset));\n\n    const pdfViewer = new PDFViewer(pdfUrl, this.element, parseInt(page || 1), parseInt(pageOffset || 0));\n    pdfViewer.init();\n\n    this.attachEventListeners(pdfViewer);\n  }\n\n  controlHtml(offset) {\n    return `\n      <div id=\"controls\" class=\"d-flex justify-content-between mb-3 border-bottom p-2 resize-heading\">\n        <div class=\"d-flex justify-content-between\">\n          <div class=\"me-2\">\n            <button id=\"prevBtn\" class=\"btn btn-info btn-xs\" disabled>Previous</button>\n            <button id=\"nextBtn\" class=\"btn btn-info btn-xs\" disabled>Next</button>\n          </div>\n         \n         <div>\n           <button id=\"zoomInBtn\" class=\"btn btn-primary btn-xs\" disabled>+</button>\n          <button id=\"zoomOutBtn\" class=\"btn btn-primary btn-xs\" disabled>-</button>  \n         </div> \n        </div>\n        \n        <div>\n        <select id=\"pageDropdown\" disabled>\n          <option value=\"1\">Page 1</option>\n        </select>\n        <small>offset(${offset||0})</small>\n        <label>\n          <input type=\"checkbox\" checked id=\"pdf-fit-viewport\"> Fit parent\n        </label>\n</div>\n        \n      </div>\n    `;\n  }\n\n  attachEventListeners(pdfViewer) {\n    const prevBtn = this.element.querySelector(\"#prevBtn\");\n    const nextBtn = this.element.querySelector(\"#nextBtn\");\n    const zoomInBtn = this.element.querySelector(\"#zoomInBtn\");\n    const zoomOutBtn = this.element.querySelector(\"#zoomOutBtn\");\n    const pageDropdown = this.element.querySelector(\"#pageDropdown\");\n    const fitViewportCheckbox = this.element.querySelector(\"#pdf-fit-viewport\");\n\n    // Enable buttons once the PDF is loaded\n    pdfViewer.onLoad(() => {\n      prevBtn.disabled = false;\n      nextBtn.disabled = false;\n      zoomInBtn.disabled = false;\n      zoomOutBtn.disabled = false;\n      pageDropdown.disabled = false;\n\n      // Populate the page dropdown\n      for (let i = 1; i <= pdfViewer.totalPages; i++) {\n        pageDropdown.innerHTML += `<option value=\"${i}\">Page ${i}</option>`;\n      }\n    });\n\n    // Handle previous button click\n    prevBtn.addEventListener(\"click\", () => {\n      pdfViewer.prevPage();\n      pageDropdown.value = pdfViewer.currentPage;\n    });\n\n    // Handle next button click\n    nextBtn.addEventListener(\"click\", () => {\n      pdfViewer.nextPage();\n      pageDropdown.value = pdfViewer.currentPage;\n    });\n\n    // Handle page dropdown change\n    pageDropdown.addEventListener(\"change\", (e) => {\n      const pageNumber = parseInt(e.target.value);\n      pdfViewer.jumpToPage(pageNumber);\n    });\n\n    // Handle zoom in\n    zoomInBtn.addEventListener(\"click\", () => {\n      pdfViewer.zoomIn();\n    });\n\n    // Handle zoom out\n    zoomOutBtn.addEventListener(\"click\", () => {\n      pdfViewer.zoomOut();\n    });\n\n    // Handle fit viewport checkbox\n    fitViewportCheckbox.addEventListener(\"change\", (e) => {\n      pdfViewer.setFitViewport(e.target.checked);\n    });\n  }\n}", "class PDFViewer {\n  constructor(pdfURL, context, page) {\n    this.maxScale = 3.0;\n    this.minScale = 0.5;\n    this.currentScale = 1.0;\n    this.zoomLevel = 0;\n\n    this.pdfURL = pdfURL;\n    this.pdfDoc = null;\n    this.currentPage = Number(page || 1);\n    this.totalPages = 0;\n\n    this.fitParent = context.querySelector('#pdf-fit-viewport');\n    this.pdfContainer = context.querySelector('#pdf-container');\n    this.canvas = context.querySelector('#pdf-canvas');\n    this.prevBtn = context.querySelector('#prevBtn');\n    this.nextBtn = context.querySelector('#nextBtn');\n    this.zoomInBtn = context.querySelector('#zoomInBtn');\n    this.zoomOutBtn = context.querySelector('#zoomOutBtn');\n    this.pageDropdown = context.querySelector('#pageDropdown');\n\n    if (this.fitParent) {\n      this.toggleCanvasFit();\n    }\n    this.onLoadCallbacks = []; // Array to store onLoad callbacks\n  }\n\n  async init() {\n    // Load PDF.js worker\n    pdfjsLib.GlobalWorkerOptions.workerSrc =\n      'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.8.162/pdf.worker.min.js';\n\n    // Initialize lazy loading using Intersection Observer\n    const observer = new IntersectionObserver(\n      (entries) => {\n        entries.forEach((entry) => {\n          if (entry.isIntersecting) {\n            this.loadPDF();\n            observer.unobserve(entry.target);\n          }\n        });\n      },\n      { threshold: 0.1 } // Adjust threshold as needed\n    );\n\n    observer.observe(this.pdfContainer);\n  }\n\n  async loadPDF() {\n    try {\n      const loadingTask = pdfjsLib.getDocument({\n        url: this.pdfURL,\n        disableAutoFetch: false, // Allow PDF.js to fetch the entire file\n        disableStream: false, // Enable streaming\n        withCredentials: false, // Adjust based on your CORS setup\n      });\n\n      this.pdfDoc = await loadingTask.promise;\n      this.totalPages = this.pdfDoc.numPages;\n\n      // Populate the dropdown with page options\n      this.populatePageDropdown();\n\n      // Enable controls after PDF is loaded\n      this.enableControls();\n\n      // Render the initial page\n      await this.renderPage(this.currentPage);\n\n      // Enable lazy loading for subsequent pages\n      this.enableLazyLoading();\n\n      // Trigger onLoad callbacks\n      this.onLoadCallbacks.forEach((callback) => callback());\n    } catch (error) {\n      console.error('Error loading PDF:', error);\n    }\n  }\n  async renderPage(pageNum) {\n    if (!this.pdfDoc || pageNum < 1 || pageNum > this.totalPages) return;\n\n    const page = await this.pdfDoc.getPage(pageNum);\n    const viewport = page.getViewport({ scale: this.currentScale });\n\n    // Adjust canvas dimensions\n    this.canvas.height = viewport.height;\n    this.canvas.width = viewport.width;\n\n    // Render the page\n    const renderContext = {\n      canvasContext: this.canvas.getContext('2d'),\n      viewport: viewport,\n    };\n    await page.render(renderContext).promise;\n\n    // Update controls\n    this.updateControls();\n  }\n\n  onLoad(callback) {\n    if (this.pdfDoc) {\n      // If PDF is already loaded, call the callback immediately\n      callback();\n    } else {\n      // Otherwise, add the callback to the queue\n      this.onLoadCallbacks.push(callback);\n    }\n  }\n\n  toggleCanvasFit() {\n    if (this.fitParent && this.fitParent.checked) {\n      this.canvas.classList.add('w-100');\n    } else {\n      this.canvas.classList.remove('w-100');\n      if (this.pdfDoc) {\n        this.renderPage(this.currentPage);\n      }\n    }\n  }\n\n  setFitViewport(fit) {\n    if (this.fitParent) {\n      this.fitParent.checked = fit;\n      this.toggleCanvasFit();\n    }\n  }\n\n  prevPage() {\n    if (this.currentPage > 1) {\n      this.currentPage--;\n      this.renderPage(this.currentPage);\n    }\n  }\n\n  nextPage() {\n    if (this.currentPage < this.totalPages) {\n      this.currentPage++;\n      this.renderPage(this.currentPage);\n    }\n  }\n\n  jumpToPage() {\n    const selectedPage = parseInt(this.pageDropdown.value);\n    if (selectedPage >= 1 && selectedPage <= this.totalPages) {\n      this.currentPage = selectedPage;\n      this.renderPage(this.currentPage);\n    }\n  }\n\n  zoomIn() {\n    if (this.currentScale < this.maxScale) {\n      this.currentScale += 0.1;\n      this.updateZoom();\n    }\n  }\n\n  zoomOut() {\n    if (this.currentScale > this.minScale) {\n      this.currentScale -= 0.1;\n      this.updateZoom();\n    }\n  }\n\n  updateZoom() {\n    const padding = Math.max(0, this.zoomLevel * 50);\n    this.pdfContainer.style.paddingTop = `${padding}px`;\n    this.canvas.style.transform = `scale(${this.currentScale})`;\n    this.renderPage(this.currentPage); // Re-render page after zoom\n  }\n\n  populatePageDropdown() {\n    this.pageDropdown.innerHTML = ''; // Clear existing options\n    for (let i = 1; i <= this.totalPages; i++) {\n      const option = document.createElement('option');\n      option.value = i;\n      option.text = `Page ${i}`;\n      this.pageDropdown.appendChild(option);\n    }\n    this.pageDropdown.value = this.currentPage;\n  }\n\n  enableControls() {\n    this.prevBtn.disabled = false;\n    this.nextBtn.disabled = false;\n    this.pageDropdown.disabled = false;\n    this.zoomInBtn.disabled = false;\n    this.zoomOutBtn.disabled = false;\n  }\n\n  updateControls() {\n    this.prevBtn.disabled = this.currentPage === 1;\n    this.nextBtn.disabled = this.currentPage === this.totalPages;\n    this.pageDropdown.value = this.currentPage;\n  }\n\n  enableLazyLoading() {\n    const observer = new IntersectionObserver(\n      (entries) => {\n        entries.forEach((entry) => {\n          if (entry.isIntersecting && this.currentPage < this.totalPages) {\n            this.nextPage();\n          }\n        });\n      },\n      { threshold: 0.5 } // Adjust threshold as needed\n    );\n\n    observer.observe(this.canvas);\n  }\n}\n\nexport default PDFViewer;", "// Visit The Stimulus Handbook for more details\n// https://stimulusjs.org/handbook/introduction\n//\n// This example controller works with specially annotated HTML like:\n//\n// <div data-controller=\"hello\">\n//   <h1 data-target=\"hello.output\"></h1>\n// </div>\n\nimport {Controller} from \"@hotwired/stimulus\";\nimport {loadJavascript} from \"../utils/script_loader\";\n\nexport default class extends Controller {\n  connect() {\n    this.loadLib()\n    this.confirmGraph();\n  }\n\n  disconnect() {\n  }\n\n  loadLib() {\n    loadJavascript(\"https://cdnjs.cloudflare.com/ajax/libs/peity/3.3.0/jquery.peity.min.js\").then(this.generateGraph.bind(this))\n  }\n\n  confirmGraph() {\n    let element = $(this.element);\n\n    setTimeout(() => {\n      // if text area is still visible, means editor didn't initialized\n      if (element.is(\":visible\")) {\n        this.loadLib();\n      }\n    }, 300);\n  }\n\n\n  generateGraph() {\n    if(!this.el){\n      this.el = $(this.element)\n      this.el.peity(this.el.data('chart'), {\n       width: '100%',\n       height: 100\n      })\n    }\n  }\n}\n", "// Visit The Stimulus Handbook for more details\n// https://stimulusjs.org/handbook/introduction\n//\n// This example controller works with specially annotated HTML like:\n//\n// <div data-controller=\"hello\">\n//   <h1 data-target=\"hello.output\"></h1>\n// </div>\n\nimport AjaxModalController from \"./ajax_modal_controller\"\nimport LocalStore from \"../utils/LocalStore\";\n\nexport default class extends AjaxModalController {\n  connect() {\n    this.store = new LocalStore();\n    $(this.element).on(\"click\", e => {\n      this.loadModal(e);\n    });\n  }\n\n  loadModal(e) {\n    e.preventDefault();\n    e.stopImmediatePropagation();\n    this.createModal();\n    this.show();\n    this.renderBookmarks();\n  }\n\n  renderBookmarks() {\n    const bookmarks = this.store.get('bookmarks') || [];\n    let html = '';\n\n    if (bookmarks.length === 0) {\n      html = '<div class=\"p-4 text-center text-gray-500\">No bookmarks found.</div>';\n    } else {\n      html = '<div class=\"divide-y divide-gray-100\">';\n      bookmarks.forEach(bookmark => {\n        html += `\n          <div class=\"p-4 hover:bg-gray-50 transition-colors\">\n            <a href=\"${bookmark.url}\" class=\"block\">\n              <div class=\"font-medium text-gray-900\">${bookmark.key}</div>\n              <div class=\"text-sm text-gray-500 mt-1\">${bookmark.text}</div>\n            </a>\n          </div>\n        `;\n      });\n      html += '</div>';\n    }\n\n    this.setContent('Bookmarks', html);\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    placement: { type: String, default: 'right' },\n    trigger: { type: String, default: 'focus' }\n  }\n\n  connect() {\n    this.title = this.element.getAttribute('data-bs-title') || this.element.getAttribute('title') || '';\n    this.content = this.element.getAttribute('data-bs-content') || '';\n    \n    if (this.title) {\n      this.element.removeAttribute('title');\n    }\n    \n    this.createPopover();\n    \n    if (this.triggerValue === 'focus') {\n      this.element.addEventListener('focus', this.show);\n      this.element.addEventListener('blur', this.hide);\n    } else if (this.triggerValue === 'click') {\n      this.element.addEventListener('click', this.toggle);\n    } else {\n      this.element.addEventListener('mouseenter', this.show);\n      this.element.addEventListener('mouseleave', this.hide);\n    }\n  }\n\n  disconnect() {\n    this.element.removeEventListener('focus', this.show);\n    this.element.removeEventListener('blur', this.hide);\n    this.element.removeEventListener('click', this.toggle);\n    this.element.removeEventListener('mouseenter', this.show);\n    this.element.removeEventListener('mouseleave', this.hide);\n    \n    if (this.popoverElement && this.popoverElement.parentNode) {\n      this.popoverElement.parentNode.removeChild(this.popoverElement);\n    }\n    \n    if (this.title) {\n      this.element.setAttribute('title', this.title);\n    }\n  }\n\n  createPopover() {\n    this.popoverElement = document.createElement('div');\n    this.popoverElement.className = 'absolute z-50 bg-white rounded-lg shadow-xl border border-gray-200 p-4 max-w-sm opacity-0 transition-opacity duration-200 pointer-events-none';\n    this.popoverElement.setAttribute('role', 'tooltip');\n    this.popoverElement.style.visibility = 'hidden';\n    this.popoverElement.style.position = 'fixed';\n    this.popoverElement.style.display = 'none';\n    \n    if (this.title) {\n      const titleEl = document.createElement('div');\n      titleEl.className = 'font-semibold text-gray-900 mb-2';\n      titleEl.innerHTML = this.title;\n      this.popoverElement.appendChild(titleEl);\n    }\n    \n    if (this.content) {\n      const contentEl = document.createElement('div');\n      contentEl.className = 'text-sm text-gray-700';\n      contentEl.innerHTML = this.content;\n      this.popoverElement.appendChild(contentEl);\n    }\n    \n    this.arrow = document.createElement('div');\n    this.arrow.className = 'absolute w-0 h-0';\n    this.arrow.style.pointerEvents = 'none';\n    this.arrow.style.zIndex = '51';\n    this.popoverElement.appendChild(this.arrow);\n    \n    document.body.appendChild(this.popoverElement);\n    \n    this.show = this.show.bind(this);\n    this.hide = this.hide.bind(this);\n    this.toggle = this.toggle.bind(this);\n  }\n\n  show = () => {\n    if (!this.title && !this.content) return;\n    \n    this.popoverElement.style.display = 'block';\n    this.popoverElement.style.visibility = 'hidden';\n    this.popoverElement.classList.remove('opacity-0');\n    this.popoverElement.classList.add('opacity-100');\n    this.popoverElement.classList.remove('pointer-events-none');\n    \n    this.updatePosition();\n    \n    this.popoverElement.style.visibility = 'visible';\n  }\n\n  hide = () => {\n    this.popoverElement.classList.remove('opacity-100');\n    this.popoverElement.classList.add('opacity-0');\n    this.popoverElement.classList.add('pointer-events-none');\n    this.popoverElement.style.visibility = 'hidden';\n    this.popoverElement.style.display = 'none';\n  }\n\n  toggle = (e) => {\n    e.preventDefault();\n    e.stopPropagation();\n    if (this.popoverElement.classList.contains('opacity-0')) {\n      this.show();\n    } else {\n      this.hide();\n    }\n  }\n\n  updatePosition() {\n    const elementRect = this.element.getBoundingClientRect();\n    const popoverRect = this.popoverElement.getBoundingClientRect();\n    const viewportWidth = window.innerWidth;\n    const viewportHeight = window.innerHeight;\n    const scrollX = window.scrollX || window.pageXOffset;\n    const scrollY = window.scrollY || window.pageYOffset;\n    \n    const offset = 8;\n    let placement = this.element.getAttribute('data-bs-placement') || this.placementValue;\n    \n    let x = 0;\n    let y = 0;\n    \n    const spaceTop = elementRect.top;\n    const spaceBottom = viewportHeight - elementRect.bottom;\n    const spaceLeft = elementRect.left;\n    const spaceRight = viewportWidth - elementRect.right;\n    \n    if (placement === 'top' && spaceTop < popoverRect.height + offset) {\n      placement = spaceBottom > spaceTop ? 'bottom' : 'top';\n    } else if (placement === 'bottom' && spaceBottom < popoverRect.height + offset) {\n      placement = spaceTop > spaceBottom ? 'top' : 'bottom';\n    } else if (placement === 'left' && spaceLeft < popoverRect.width + offset) {\n      placement = spaceRight > spaceLeft ? 'right' : 'left';\n    } else if (placement === 'right' && spaceRight < popoverRect.width + offset) {\n      placement = spaceLeft > spaceRight ? 'left' : 'right';\n    }\n    \n    this.updateArrowDirection(placement);\n    \n    switch (placement) {\n      case 'top':\n        x = elementRect.left + (elementRect.width / 2) - (popoverRect.width / 2);\n        y = elementRect.top - popoverRect.height - offset;\n        break;\n      case 'bottom':\n        x = elementRect.left + (elementRect.width / 2) - (popoverRect.width / 2);\n        y = elementRect.bottom + offset;\n        break;\n      case 'left':\n        x = elementRect.left - popoverRect.width - offset;\n        y = elementRect.top + (elementRect.height / 2) - (popoverRect.height / 2);\n        break;\n      case 'right':\n        x = elementRect.right + offset;\n        y = elementRect.top + (elementRect.height / 2) - (popoverRect.height / 2);\n        break;\n    }\n    \n    const padding = 8;\n    x = Math.max(padding, Math.min(x, viewportWidth - popoverRect.width - padding));\n    y = Math.max(padding, Math.min(y, viewportHeight - popoverRect.height - padding));\n    \n    this.popoverElement.style.left = `${x + scrollX}px`;\n    this.popoverElement.style.top = `${y + scrollY}px`;\n  }\n\n  updateArrowDirection(placement) {\n    this.arrow.style.borderLeft = '';\n    this.arrow.style.borderRight = '';\n    this.arrow.style.borderTop = '';\n    this.arrow.style.borderBottom = '';\n    this.arrow.style.top = '';\n    this.arrow.style.bottom = '';\n    this.arrow.style.left = '';\n    this.arrow.style.right = '';\n    this.arrow.style.marginLeft = '';\n    this.arrow.style.marginTop = '';\n    \n    const arrowColor = 'rgb(229, 231, 235)';\n    const arrowBorderColor = 'rgb(209, 213, 219)';\n    \n    switch (placement) {\n      case 'top':\n        this.arrow.style.borderLeft = '8px solid transparent';\n        this.arrow.style.borderRight = '8px solid transparent';\n        this.arrow.style.borderTop = `8px solid ${arrowBorderColor}`;\n        this.arrow.style.bottom = '-8px';\n        this.arrow.style.left = '50%';\n        this.arrow.style.marginLeft = '-8px';\n        break;\n      case 'bottom':\n        this.arrow.style.borderLeft = '8px solid transparent';\n        this.arrow.style.borderRight = '8px solid transparent';\n        this.arrow.style.borderBottom = `8px solid ${arrowBorderColor}`;\n        this.arrow.style.top = '-8px';\n        this.arrow.style.left = '50%';\n        this.arrow.style.marginLeft = '-8px';\n        break;\n      case 'left':\n        this.arrow.style.borderTop = '8px solid transparent';\n        this.arrow.style.borderBottom = '8px solid transparent';\n        this.arrow.style.borderLeft = `8px solid ${arrowBorderColor}`;\n        this.arrow.style.right = '-8px';\n        this.arrow.style.top = '50%';\n        this.arrow.style.marginTop = '-8px';\n        break;\n      case 'right':\n        this.arrow.style.borderTop = '8px solid transparent';\n        this.arrow.style.borderBottom = '8px solid transparent';\n        this.arrow.style.borderRight = `8px solid ${arrowBorderColor}`;\n        this.arrow.style.left = '-8px';\n        this.arrow.style.top = '50%';\n        this.arrow.style.marginTop = '-8px';\n        break;\n    }\n  }\n}\n", "import {Controller} from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  connect() {\n    this.el = $(this.element);\n    this.el.find(\"[data-view]\").on(\"click\", this.showView.bind(this));\n  }\n\n  showView(event) {\n    const viewType = event.currentTarget.dataset.view;\n    this.el.find(\"[data-view]\").removeClass(\"active\");\n    this.el.find(\"[data-view-type]\").removeClass(\"active\");\n\n    this.el.find(`[data-view=${viewType}]`).addClass(\"active\");\n    this.el.find(`[data-view-type=${viewType}]`).addClass(\"active\");\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"query\", \"results\"]\n  static values = { searchUrl: String }\n\n  search() {\n    clearTimeout(this.timer)\n    this.timer = setTimeout(() => this.run(), 250)\n  }\n\n  async run() {\n    const query = this.queryTarget.value.trim()\n    if (query.length < 2) return\n\n    try {\n      const url = `${this.searchUrlValue}?q=${encodeURIComponent(query)}`\n      const response = await fetch(url, { headers: { Accept: \"application/json\" } })\n      if (!response.ok) return\n\n      const { recitations } = await response.json()\n      this.render(recitations || [])\n    } catch (error) {\n      // A failed search leaves the previous results in place; the operator can retry.\n    }\n  }\n\n  render(recitations) {\n    this.resultsTarget.replaceChildren()\n\n    if (!recitations.length) {\n      const empty = document.createElement(\"p\")\n      empty.className = \"px-2 py-3 text-xs text-gray-400\"\n      empty.textContent = \"No reciters match that.\"\n      this.resultsTarget.appendChild(empty)\n      return\n    }\n\n    recitations.forEach((recitation) => {\n      const label = document.createElement(\"label\")\n      label.className = \"flex items-start gap-2 px-2 py-1.5 hover:bg-gray-50 cursor-pointer text-xs\"\n\n      const radio = document.createElement(\"input\")\n      radio.type = \"radio\"\n      radio.name = \"audio_recitation_id\"\n      radio.value = recitation.id\n      radio.className = \"mt-0.5\"\n      label.appendChild(radio)\n\n      const text = document.createElement(\"span\")\n      const title = document.createElement(\"span\")\n      title.className = \"font-medium text-gray-800\"\n      title.textContent = `#${recitation.id} ${recitation.name}`\n      text.appendChild(title)\n\n      // Spell out the two things that make an attach a mistake: it is already\n      // claimed by another delivery, or its segments are locked.\n      if (recitation.qua_key) {\n        const mapped = document.createElement(\"span\")\n        mapped.className = \"text-amber-600\"\n        mapped.textContent = ` \u00B7 already mapped to ${recitation.qua_key}`\n        text.appendChild(mapped)\n      }\n      if (recitation.locked) {\n        const locked = document.createElement(\"span\")\n        locked.className = \"text-red-600\"\n        locked.textContent = \" \u00B7 \uD83D\uDD12 locked\"\n        text.appendChild(locked)\n      }\n\n      const meta = document.createElement(\"span\")\n      meta.className = \"block text-gray-500\"\n      meta.textContent = `${recitation.segments_count || 0} segments \u00B7 ${recitation.files_count || 0} files`\n      text.appendChild(meta)\n\n      label.appendChild(text)\n      this.resultsTarget.appendChild(label)\n    })\n  }\n}\n", "// Visit The Stimulus Handbook for more details\n// https://stimulusjs.org/handbook/introduction\n//\n// This example controller works with specially annotated HTML like:\n//\n// <div data-controller=\"hello\">\n//   <h1 data-target=\"hello.output\"></h1>\n// </div>\n\nimport {Controller} from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  connect() {\n    this.autoClose = this.element.dataset.autoClose;\n    this.disableHistoryOnSubmit = this.autoClose || this.element.dataset.disableHistory;\n    this.form = $(this.element);\n\n    this.form.attr(\"novalidate\", \"novalidate\");\n    var that = this;\n\n    this.form.find(\"[type='submit']\").on(\"click\", event => {\n      if (this.form.hasClass(\"skip-validation\")) return true;\n\n      return that.jsValidate(event);\n    });\n\n    this.form.on(\"submit\", event => {\n      return that.jsValidate(event);\n    });\n\n    this.form.on(\"turbo:submit-start\", this.disableFields.bind(this))\n    this.form.on(\"turbo:submit-end\", this.enableFields.bind(this))\n\n\n    this.form.on(\"turbo:submit-end\", (event, xhr, s) => {\n      let form = event.target;\n      const success = event.detail.success;\n\n      if (success) {\n        form.reset();\n        form.classList.remove(\"was-validated\");\n\n        if (this.autoClose) {\n          document.dispatchEvent(new CustomEvent(\"ajax-modal:close\"));\n        } else if(!this.disableHistoryOnSubmit){\n          history.pushState(\n            {},\n            \"\",\n            event.detail.fetchResponse.response.url\n          );\n        }\n      } else {\n        $(form)\n          .find(\"#form-error-wrapper div\")\n          .addClass(\"p-4 mb-4 bg-red-50 border border-red-200 text-red-800 rounded\")\n          .removeClass(\"hidden\");\n      }\n\n      return true;\n    });\n\n    this.form.on(\"ajax:error\", event => {\n      $(event.target)\n        .find(\"#form-error-wrapper div\")\n        .html(\"Sorry, something went wrong. Error: Interval server error.\")\n        .addClass(\"alert alert-danger\")\n        .removeClass(\"hidden\");\n    });\n  }\n\n  jsValidate(event) {\n    this.removeValidations();\n    if (!this.form.hasClass(\"was-validated\"))\n      this.form.addClass(\"was-validated\");\n\n    if (this.form[0].checkValidity() === false) {\n      event.preventDefault();\n      event.stopPropagation();\n      event.currentTarget.reportValidity();\n\n      return false;\n    } else {\n      this.form.trigger(\"dirty:clear\");\n      $(event.currentTarget).addClass(\"validated\");\n      return true;\n    }\n  }\n\n  disableFields(event) {\n    const target = event.target;\n\n    for (const field of target.elements) {\n      field.disabled = true\n    }\n  }\n\n  enableFields(event) {\n    const target = event.target;\n\n    for (const field of target.elements) {\n      field.disabled = false\n    }\n  }\n\n  removeValidations(dom){\n    $(\"#errors-close-btn\").click()\n  }\n\n  disconnect() {\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  connect() {\n    this.element[\"remoteSelect\"] = this;\n    this.bindRemoteSelect2();\n  }\n\n  bindRemoteSelect2() {\n    let el = $(this.element);\n\n    // reading from data allows <input data-searchable_select='{\"tags\": ['some']}'>\n    // to be passed to select2\n    let options = {\n      multiple: el.data(\"multiple\") || false,\n      allowClear: true,\n      placeholder: el.data(\"placeholder\") || \"Select\",\n      tags: el.data(\"tags\") || false // for adding items on the fly\n    };\n\n    if (el.data(\"parent\")) {\n      options[\"dropdownParent\"] = $(el.data(\"parent\"));\n    }\n\n    // Label for typed text that isn't in the list, e.g. data-create-label=\"Add missing\"\n    if (options.tags && el.data(\"create-label\")) {\n      const label = el.data(\"create-label\");\n      options[\"createTag\"] = params => {\n        const term = $.trim(params.term);\n        return term ? { id: term, text: `${label}: ${term}`, newTag: true } : null;\n      };\n      options[\"insertTag\"] = (data, tag) => data.push(tag);\n    }\n\n    const url = el.data(\"url\");\n    const that = this;\n\n    if (url) {\n      $.extend(options, {\n        minimumInputLength: 0,\n        ajax: {\n          url: url,\n          dataType: \"json\",\n          cache: true,\n\n          data: function(params) {\n            return {\n              query: params.term,\n              page: that.pageParamWithBaseZero(params)\n            };\n          }\n        },\n        escapeMarkup: function(text) {\n          return text;\n        }\n      });\n    }\n\n    options[\"templateResult\"] = item => {\n      return this.dropdownItemTemplate(item);\n    };\n\n    // Arabic options, e.g. data-text-class=\"qpc-hafs text-xl\". The value is the Arabic text,\n    // results can have a meaning shown next to it.\n    const textClass = el.data(\"text-class\");\n    if (textClass) {\n      const arabic = item => {\n        if (item.loading || !item.id) return item.text;\n\n        const option = $(\"<span class='inline-flex items-baseline gap-2'>\");\n        if (item.newTag) option.append($(\"<span class='text-sm text-green-700'>\").text(el.data(\"create-label\")));\n        option.append($(\"<span dir='rtl'>\").addClass(textClass).text(item.id));\n        if (item.meaning) option.append($(\"<span class='text-sm text-gray-500'>\").text(item.meaning));\n        return option;\n      };\n      options[\"templateResult\"] = arabic;\n      options[\"templateSelection\"] = arabic;\n    }\n    /*\n        options[\"templateSelection\"] = item => {\n            return this.resultTemplate(item);\n        };*/\n\n    this.select = el.select2(options);\n  }\n\n  dropdownItemTemplate(item) {\n    if (item.loading) return item.text;\n\n    if (!item.description) {\n      return item.text;\n    }\n\n    let container = $(`\n        <div class='select2-result'>\n          <div class='select2-result__title'>${item.description}</div>\n      </div>`);\n\n    return container;\n  }\n\n  resultTemplate(item) {\n    return item.text;\n  }\n\n  removeSelect2() {\n    const select = this.select.data(\"select2\");\n    if (select) select.destroy();\n  }\n\n  disconnect() {\n    this.removeSelect2();\n  }\n\n  pageParamWithBaseZero(params) {\n    return params.page ? params.page - 1 : undefined;\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"tab\", \"loader\"]\n  static classes = [\"active\", \"inactive\"]\n\n  select(event) {\n    this.tabTargets.forEach((tab) => {\n      const selected = tab === event.currentTarget\n      tab.classList.remove(...(selected ? this.inactiveClasses : this.activeClasses))\n      tab.classList.add(...(selected ? this.activeClasses : this.inactiveClasses))\n    })\n  }\n\n  showLoader() {\n    if (this.hasLoaderTarget) this.loaderTarget.classList.remove(\"hidden\")\n  }\n\n  hideLoader() {\n    if (this.hasLoaderTarget) this.loaderTarget.classList.add(\"hidden\")\n  }\n}\n", "import {Controller} from \"@hotwired/stimulus\";\nimport LocalStore from \"../utils/LocalStore\";\n\nconst localStore = new LocalStore();\nconst MIN_RATIO = 0.15;\nconst MAX_RATIO = 0.85;\n\nexport default class extends Controller {\n  connect() {\n    this.leftSide = this.element.querySelector('#left-side');\n    this.rightSide = this.element.querySelector('#right-side');\n    this.resizeHandler = this.element.querySelector('#resize-handler')\n    this.isResizing = false;\n    this.id = this.element.id || location.pathname.replaceAll(\"/\", \"-\");\n\n    if (!this.leftSide || !this.rightSide || !this.resizeHandler) return;\n\n    this.onMouseDown = this.startResize.bind(this);\n    this.onMouseMove = this.resize.bind(this);\n    this.onMouseUp = this.stopResize.bind(this);\n\n    this.resizeHandler.addEventListener('mousedown', this.onMouseDown);\n\n    // Panes are sized with flex-grow ratios instead of pixel widths. Pixel widths\n    // force the surrounding table cell to grow and push the page out of the viewport.\n    const ratio = parseFloat(localStore.get(`${this.id}-ratio`));\n    this.applyRatio(isNaN(ratio) ? 0.5 : ratio);\n\n    // Drop the legacy pixel widths, they break the layout on smaller screens.\n    localStore.remove(`${this.id}-lw`);\n    localStore.remove(`${this.id}-rw`);\n  }\n\n  startResize(e) {\n    e.preventDefault();\n    this.isResizing = true;\n    document.addEventListener('mousemove', this.onMouseMove);\n    document.addEventListener('mouseup', this.onMouseUp);\n  }\n\n  applyRatio(ratio) {\n    const value = Math.min(Math.max(ratio, MIN_RATIO), MAX_RATIO);\n\n    this.leftSide.style.flexGrow = value;\n    this.rightSide.style.flexGrow = 1 - value;\n\n    return value;\n  }\n\n  resize(e) {\n    if (!this.isResizing) return;\n\n    const container = this.leftSide.parentElement;\n    const style = window.getComputedStyle(container);\n\n    // clientWidth already excludes the border, padding still needs to go\n    const available = container.clientWidth\n      - parseFloat(style.paddingLeft)\n      - parseFloat(style.paddingRight)\n      - this.resizeHandler.offsetWidth;\n\n    if (available <= 0) return;\n\n    const leftWidth = e.clientX - this.leftSide.getBoundingClientRect().left;\n    const ratio = this.applyRatio(leftWidth / available);\n\n    localStore.set(`${this.id}-ratio`, ratio);\n  };\n\n  stopResize() {\n    this.isResizing = false;\n    document.removeEventListener('mousemove', this.onMouseMove);\n    document.removeEventListener('mouseup', this.onMouseUp);\n  };\n\n  disconnect() {\n    this.stopResize();\n\n    if (this.resizeHandler) {\n      this.resizeHandler.removeEventListener('mousedown', this.onMouseDown);\n    }\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['count', 'empty'];\n\n  static values = {\n    mode: { type: String, default: 'filter' },\n    scope: { type: String, default: '' }\n  };\n\n  connect() {\n    this.input = this.element.querySelector('#search-input');\n    this.boundHandleKeydown = this.handleKeydown.bind(this);\n    this.boundHandleInput = this.handleInput.bind(this);\n\n    document.addEventListener('keydown', this.boundHandleKeydown);\n\n    if (this.input && this.modeValue !== 'submit') {\n      this.input.addEventListener('input', this.boundHandleInput);\n    }\n  }\n\n  disconnect() {\n    document.removeEventListener('keydown', this.boundHandleKeydown);\n\n    if (this.input) {\n      this.input.removeEventListener('input', this.boundHandleInput);\n    }\n  }\n\n  handleInput(event) {\n    this.filterResults(event.target.value);\n  }\n\n  filterResults(rawQuery) {\n    const query = (rawQuery || '').trim().toLowerCase();\n\n    if (!query) {\n      this.resetSearch();\n      return;\n    }\n\n    let visible = 0;\n\n    this.searchItems().forEach((element) => {\n      const matches = (element.dataset.search || '').toLowerCase().includes(query);\n\n      element.classList.toggle('!hidden', !matches);\n      if (matches) visible += 1;\n    });\n\n    this.updateCount(visible);\n\n    if (visible > 0) {\n      this.hideEmptyResultsMessage();\n    } else {\n      this.showEmptyResultsMessage(query);\n    }\n  }\n\n  resetSearch() {\n    const items = this.searchItems();\n    items.forEach((element) => element.classList.remove('!hidden'));\n    this.updateCount(items.length);\n    this.hideEmptyResultsMessage();\n  }\n\n  // The results live outside the toolbar, so walk up to the page's results\n  // wrapper rather than searching only inside this controller's element.\n  resultsRoot() {\n    if (this.scopeValue) return document.querySelector(this.scopeValue) || this.element;\n\n    return this.element.closest('#resources') ||\n           this.element.closest('.resources-lists') ||\n           this.element;\n  }\n\n  searchItems() {\n    return Array.from(this.resultsRoot().querySelectorAll('[data-search]'));\n  }\n\n  updateCount(visible) {\n    if (!this.hasCountTarget) return;\n\n    if (this.totalCount === undefined) this.totalCount = this.countTarget.textContent.trim();\n    this.countTarget.textContent = visible === this.searchItems().length ? this.totalCount : visible;\n  }\n\n  showEmptyResultsMessage(query) {\n    if (this.hasEmptyTarget) {\n      this.emptyTarget.classList.remove('hidden');\n      const term = this.emptyTarget.querySelector('[data-search-term]');\n      if (term) term.textContent = query;\n    }\n    this.element.querySelector('#empty-results-message')?.classList.remove('hidden');\n  }\n\n  hideEmptyResultsMessage() {\n    if (this.hasEmptyTarget) this.emptyTarget.classList.add('hidden');\n    this.element.querySelector('#empty-results-message')?.classList.add('hidden');\n  }\n\n  handleKeydown(event) {\n    if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'k') {\n      event.preventDefault();\n      this.input?.focus();\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n// Tabs on the resource detail page. Each tab is a real URL\n// (/resources/:type/:id/docs), so the address bar can be copied and a fresh\n// load renders the same tab on the server.\nexport default class extends Controller {\n  static targets = [\"tab\", \"pane\"]\n\n  select(event) {\n    // Let ctrl/cmd/middle-click open the tab URL in a new browser tab.\n    if (event.metaKey || event.ctrlKey || event.shiftKey || event.button > 0) return\n    event.preventDefault()\n\n    const link = event.currentTarget\n    const key = link.dataset.tab\n\n    const current = this.paneTargets.find((pane) => !pane.hidden)\n    const next = this.paneFor(key)\n    this.holdHeightUntilLoaded(next, current?.offsetHeight)\n\n    this.tabTargets.forEach((tab) => tab.setAttribute(\"aria-selected\", tab === link))\n    this.paneTargets.forEach((pane) => { pane.hidden = pane !== next })\n\n    // Keep query params (e.g. ?ayah=) so switching back restores the preview.\n    const url = new URL(link.href)\n    url.search = window.location.search\n    this.replaceUrl(url)\n\n    this.dispatch(\"shown\", { detail: { tab: key } })\n  }\n\n  // Start loading a lazy tab on hover/focus, so it's usually ready by the click.\n  prefetch(event) {\n    const frame = this.frameIn(this.paneFor(event.currentTarget.dataset.tab))\n    if (frame && frame.loading === \"lazy\") frame.loading = \"eager\"\n  }\n\n  // A lazy tab shows a one-line placeholder until its content arrives. Keep it\n  // as tall as the tab we're leaving so the page doesn't shrink and jump.\n  holdHeightUntilLoaded(pane, height) {\n    const frame = this.frameIn(pane)\n    if (!frame || frame.hasAttribute(\"complete\") || !height) return\n\n    pane.style.minHeight = `${height}px`\n    frame.addEventListener(\"turbo:frame-load\", () => { pane.style.minHeight = \"\" }, { once: true })\n    frame.loading = \"eager\"\n  }\n\n  paneFor(key) {\n    return this.paneTargets.find((pane) => pane.dataset.tab === key)\n  }\n\n  frameIn(pane) {\n    return pane?.querySelector(\"turbo-frame[src]\")\n  }\n\n  // Go through Turbo so its own idea of the current location stays in sync.\n  replaceUrl(url) {\n    const turboHistory = window.Turbo?.navigator?.history\n    if (turboHistory) {\n      turboHistory.replace(url)\n    } else {\n      window.history.replaceState(window.history.state, \"\", url)\n    }\n  }\n}\n", "import {Controller} from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  connect() {\n    this.codeDom = this.element.querySelector(\"code\");\n    this.code = this.codeDom.innerText;\n\n    this.createPreviewDom();\n    this.createRunButton();\n  }\n\n  createRunButton() {\n    const button = document.createElement(\"button\");\n    button.innerText = \"Run\";\n    button.style.position = \"absolute\";\n    button.style.top = \"5px\";\n    button.style.right = \"5px\";\n    button.style.background = \"#4CAF50\";\n    button.style.color = \"white\";\n    button.style.border = \"none\";\n    button.style.padding = \"5px 10px\";\n    button.style.borderRadius = \"4px\";\n    button.style.cursor = \"pointer\";\n    button.style.fontSize = \"12px\";\n\n    button.addEventListener(\"click\", () => this.runCode());\n\n    this.element.style.position = \"relative\"; // Ensure the <code> is positioned\n    this.element.appendChild(button);\n  }\n\n  createPreviewDom(){\n    this.previewDiv = document.createElement(\"div\");\n    this.previewDiv.id = \"run-preview\";\n    this.previewDiv.style.marginTop = \"10px\";\n    this.previewDiv.style.padding = \"10px\";\n    this.previewDiv.style.border = \"1px solid #ccc\";\n    this.previewDiv.style.minHeight = \"50px\";\n    this.previewDiv.style.overflow = \"auto\";\n    this.previewDiv.style.background = \"#f9f9f9\";\n\n    this.element.insertAdjacentElement(\"afterend\", this.previewDiv);\n  }\n\n  runCode() {\n    this.previewDiv.innerHTML = \"\";\n    this.previewDiv.scrollIntoView({ behavior: \"smooth\" });\n\n    try {\n      new Function(this.code)();\n    } catch (error) {\n      console.error(\"Error executing code:\", error);\n    }\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\nimport { alignLetterTakes } from \"../lib/letter_slices\"\nimport { findRepeats, FULL, PARTIAL } from \"../lib/segment_repeats\"\n\n// Same threshold the server uses for DraftSegment::SUSPICIOUS_DRIFT_MS, so a\n// word the table paints red is a word the \"differ\" counts also counted.\nconst DRIFT_MS = 300\n\nexport default class extends Controller {\n  static targets = [\n    \"player\", \"playButton\", \"scrubber\", \"clock\", \"verses\", \"status\",\n    \"liveToggle\", \"draftToggle\", \"lettersToggle\", \"followToggle\",\n    \"draftLabel\", \"lettersLabel\", \"summary\", \"nextDiff\",\n    \"counts\", \"showFilter\", \"filterNote\", \"approveAll\", \"rejectAll\", \"reviewNote\", \"emptyFilter\"\n  ]\n  static values = { url: String, audioUrl: String, reviewUrl: String, reviewAllUrl: String }\n\n  connect() {\n    this.verses = []\n    this.wordNodes = []   // { el, verseIndex, layer, from, to }\n    this.letterNodes = []\n    this.lastKey = \"\"\n    this.playUntil = null   // set while playing one layer's range only\n    this.diffVerses = new Set()    // verseIndex values that disagree\n    this.rowsByVerse = new Map()   // verseIndex -> the row element\n    this.repeatsByVerse = new Map()// verseIndex -> { kind, repeats }\n    this.bars = []                 // { verseIndex, from, to, el, fill, clock }\n    this.focusVerse = null         // the ayah last played or dragged, preferred\n                                   // when two ayah ranges overlap the clock\n    this.onTime = () => this.tick()\n    this.onMeta = () => this.renderClock()\n    this.playerTarget.addEventListener(\"timeupdate\", this.onTime)\n    this.playerTarget.addEventListener(\"loadedmetadata\", this.onMeta)\n    this.playerTarget.addEventListener(\"ended\", () => this.setPlayLabel(false))\n    // The ayah picker above the steps (ayah_filter_controller) changed ?ayah=.\n    this.onAyahPicked = () => { this.redraw(); this.focusLinkedAyah() }\n    window.addEventListener(\"segment-pipeline:ayah\", this.onAyahPicked)\n    this.load()\n  }\n\n  disconnect() {\n    globalThis.removeEventListener?.(\"segment-pipeline:ayah\", this.onAyahPicked)\n    this.closeJson()\n    this.playerTarget.pause()\n    this.playerTarget.removeEventListener(\"timeupdate\", this.onTime)\n    this.playerTarget.removeEventListener(\"loadedmetadata\", this.onMeta)\n    if (this.raf) cancelAnimationFrame(this.raf)\n  }\n\n  async load() {\n    try {\n      const response = await fetch(this.urlValue, { headers: { Accept: \"application/json\" } })\n      if (!response.ok) throw new Error(`HTTP ${response.status}`)\n      const data = await response.json()\n      this.verses = data.verses || []\n      this.render(data)\n    } catch (error) {\n      this.statusTarget.textContent = `Could not load timings: ${error.message}`\n    }\n  }\n\n  // ---- rendering ---------------------------------------------------------\n\n  render(data) {\n    const hasLive = this.verses.some((v) => v.live)\n    const hasDraft = this.verses.some((v) => v.draft)\n    const hasLiveLetters = this.verses.some((v) => v.live && (v.live.letters || []).length)\n    const hasDraftLetters = this.verses.some((v) => v.draft && (v.draft.letters || []).length)\n\n    this.liveToggleTarget.disabled = !hasLive\n    this.draftToggleTarget.disabled = !hasDraft\n    this.lettersToggleTarget.disabled = !(hasLiveLetters || hasDraftLetters)\n\n    if (!hasLive) this.liveToggleTarget.checked = false\n    if (!hasDraft) this.draftToggleTarget.checked = false\n\n    const staged = this.verses.find((v) => v.draft)?.draft?.staged\n    this.draftLabelTarget.textContent = hasDraft\n      ? (staged ? `(staged drafts, ${data.source})` : `(not staged yet, ${data.source})`)\n      : \"(nothing to compare)\"\n\n    const letterNote = []\n    if (hasLiveLetters) letterNote.push(\"live\")\n    if (hasDraftLetters) letterNote.push(\"draft\")\n    this.lettersLabelTarget.textContent = letterNote.length\n      ? `(${letterNote.join(\" + \")})`\n      : \"(no letter data)\"\n\n    this.versesTarget.replaceChildren()\n    this.wordNodes = []\n    this.letterNodes = []\n    this.diffs = []\n    this.bars = []\n\n    if (!this.verses.length) {\n      this.statusTarget.textContent = \"No timings for this surah yet.\"\n      return\n    }\n    this.statusTarget.classList.add(\"hidden\")\n\n    this.verses.forEach((verse, verseIndex) => {\n      this.versesTarget.appendChild(this.verseRow(verse, verseIndex))\n    })\n    this.summarise(hasLive, hasDraft)\n    this.redraw()\n    this.focusLinkedAyah()\n  }\n\n  // ?ayah=2:5 (an ayah key, e.g. from an audit report) opens the page on that\n  // ayah: scroll to its row, outline it, and cue the audio at its start\n  // without playing it.\n  focusLinkedAyah() {\n    this.rowsByVerse.forEach((row) => {\n      row.classList.remove(\"ring-2\")\n      if (row.style) row.style.boxShadow = \"\"\n    })\n    const key = this.linkedAyah()\n    if (!key) return\n\n    const verseIndex = this.verses.findIndex((v) => String(v.key) === key)\n    const row = this.rowsByVerse.get(verseIndex)\n    if (!row) return\n\n    row.classList.add(\"ring-2\")\n    row.style.boxShadow = \"0 0 0 2px #f59e0b\" // amber, set inline: no rebuilt CSS needed\n    row.scrollIntoView({ block: \"center\" })\n\n    const range = this.ayahRange(this.verses[verseIndex])\n    this.focusVerse = verseIndex\n    if (range) this.playerTarget.currentTime = Math.max(0, range.from / 1000)\n    this.tick()\n  }\n\n  // Per word, how far apart the two layers put its boundaries. Without this the\n  // page looks inert when the layers agree exactly (which they do whenever the\n  // live segments were themselves imported from the same source) \u2014 \"they agree\n  // on all 58 words\" is a real answer, not a blank screen.\n  summarise(hasLive, hasDraft) {\n    if (!hasLive || !hasDraft) {\n      this.summaryTarget.textContent = hasLive\n        ? \"Nothing staged to compare against yet \u2014 only the live segments are shown.\"\n        : \"No live segments for this surah yet \u2014 only the draft is shown.\"\n      this.nextDiffTarget.hidden = true\n      // A draft with nothing live is new, and the recitation page counts it as\n      // differing (DraftSegment#suspicious?). Mark it so here too, or the\n      // \"differ\" link from that page opens on an empty list.\n      this.diffVerses = new Set(\n        hasLive ? [] : this.verses.flatMap((verse, index) => (verse.draft ? [index] : []))\n      )\n      return\n    }\n\n    let compared = 0\n    let worst = 0\n\n    this.verses.forEach((verse, verseIndex) => {\n      const live = this.spanMap(verse.live)\n      const draft = this.spanMap(verse.draft)\n      const positions = new Set([...live.keys(), ...draft.keys()])\n\n      positions.forEach((position) => {\n        const a = live.get(position)\n        const b = draft.get(position)\n        compared++\n        if (!a || !b) {\n          this.diffs.push({ verseIndex, position, drift: Infinity, missing: true })\n          return\n        }\n        const drift = Math.max(Math.abs(a[0] - b[0]), Math.abs(a[1] - b[1]))\n        if (drift > this.constructor.DRIFT_TOLERANCE_MS) {\n          this.diffs.push({ verseIndex, position, drift, missing: false })\n          worst = Math.max(worst, drift)\n        }\n      })\n    })\n\n    this.diffs.sort((x, y) => x.verseIndex - y.verseIndex || x.position - y.position)\n    this.diffVerses = new Set(this.diffs.map((diff) => diff.verseIndex))\n    this.nextDiffTarget.hidden = this.diffs.length === 0\n    this.diffIndex = -1\n\n    this.summaryTarget.textContent = this.diffs.length === 0\n      ? `Live and draft agree on all ${compared} word timings \u2014 play it to confirm the highlighting lands on the right words.`\n      : `${this.diffs.length} of ${compared} words differ between live and draft (worst ${worst === 0 ? \"\u2014\" : `${worst} ms`}).`\n  }\n\n  static DRIFT_TOLERANCE_MS = 1\n\n  spanMap(layer) {\n    const map = new Map()\n    ;((layer || {}).words || []).forEach(([position, from, to]) => {\n      if (!map.has(position)) map.set(position, [from, to])\n    })\n    return map\n  }\n\n  // Walk the disagreements: jump the audio to each one so you can hear it.\n  nextDiff() {\n    if (!this.diffs.length) return\n\n    this.diffIndex = (this.diffIndex + 1) % this.diffs.length\n    const diff = this.diffs[this.diffIndex]\n    const verse = this.verses[diff.verseIndex]\n    const span = this.spanMap(verse.draft).get(diff.position) || this.spanMap(verse.live).get(diff.position)\n    if (!span) return\n\n    // Start a moment early so the divergence is audible in context.\n    this.playerTarget.currentTime = Math.max(0, (span[0] - 400) / 1000)\n    this.nextDiffTarget.textContent =\n      `Next difference (${this.diffIndex + 1}/${this.diffs.length}) \u00B7 ${verse.key} word ${diff.position}`\n    if (this.playerTarget.paused) this.togglePlay()\n    else this.tick()\n  }\n\n  verseRow(verse, verseIndex) {\n    const row = document.createElement(\"div\")\n    row.className = \"border border-gray-200 rounded-lg px-3 py-2\"\n    row.dataset.verseIndex = String(verseIndex)\n\n    const head = document.createElement(\"div\")\n    head.className = \"flex items-center gap-2 text-xs text-gray-400 mb-1\"\n\n    const jump = document.createElement(\"button\")\n    jump.type = \"button\"\n    jump.className = \"px-1.5 py-0.5 rounded bg-gray-100 text-gray-600 hover:bg-gray-200\"\n    jump.textContent = \"\u25B6\"\n    jump.title = \"Play on from this ayah\"\n    jump.addEventListener(\"click\", () => { this.focusVerse = verseIndex; this.playFrom(verse) })\n    head.appendChild(jump)\n\n    const label = document.createElement(\"span\")\n    label.className = \"font-medium text-gray-600\"\n    label.textContent = verse.key\n    head.appendChild(label)\n\n    // Each layer's range is its own play button: the two often differ, and the\n    // only way to judge which is right is to hear each one on its own.\n    head.appendChild(this.rangeChip(\"current\", verse.live, \"indigo\", verseIndex))\n    head.appendChild(this.rangeChip(\"draft\", verse.draft, \"amber\", verseIndex))\n\n    const repeat = this.repeatChip(verse, verseIndex)\n    if (repeat) head.appendChild(repeat)\n    head.appendChild(this.jsonButton(verse))\n    head.appendChild(this.reviewControls(verse, verseIndex))\n    row.appendChild(head)\n    const bar = this.ayahBar(verse, verseIndex)\n    if (bar) row.appendChild(bar)\n    const takes = this.takesRow(verseIndex)\n    if (takes) row.appendChild(takes)\n    const issues = this.issuesList(verse)\n    if (issues) row.appendChild(issues)\n    this.rowsByVerse.set(verseIndex, row)\n\n    // One word row per enabled layer, so a disagreement shows as the two rows\n    // lighting up different words at the same instant.\n    row.appendChild(this.wordRow(verse, verseIndex, \"live\"))\n    row.appendChild(this.wordRow(verse, verseIndex, \"draft\"))\n    return row\n  }\n\n  // Highlighting shows you THAT two layers disagree; the numbers show you by how\n  // much and where. A modal rather than an inline panel: the table is wide, and\n  // expanding it in place pushes every later ayah down the page, which costs you\n  // your place in a 286-ayah surah.\n  jsonButton(verse) {\n    const button = document.createElement(\"button\")\n    button.type = \"button\"\n    button.className = \"px-1.5 py-0.5 rounded bg-gray-100 text-gray-600 hover:bg-gray-200 font-mono\"\n    button.textContent = \"{ }\"\n    button.title = \"Show the raw timings for this ayah, current next to draft\"\n    button.addEventListener(\"click\", () => this.openJson(verse))\n    return button\n  }\n\n  openJson(verse) {\n    this.closeJson()\n\n    const overlay = document.createElement(\"div\")\n    overlay.dataset.jsonModal = \"1\"\n    overlay.className = \"fixed inset-0 z-50 flex items-start justify-center p-4 bg-black/40 overflow-y-auto\"\n    // Only the backdrop closes; a click that started inside the dialog must not.\n    overlay.addEventListener(\"click\", (event) => { if (event.target === overlay) this.closeJson() })\n\n    const dialog = document.createElement(\"div\")\n    dialog.className = \"bg-white rounded-lg shadow-xl w-full max-w-4xl my-8\"\n    dialog.dataset.jsonDialog = \"1\"\n\n    const head = document.createElement(\"div\")\n    head.className = \"flex items-center justify-between px-4 py-2 border-b border-gray-200\"\n    const title = document.createElement(\"div\")\n    title.className = \"text-sm font-semibold text-gray-800\"\n    title.textContent = `Raw timings \u2014 ${verse.key}`\n    head.appendChild(title)\n\n    const close = document.createElement(\"button\")\n    close.type = \"button\"\n    close.dataset.jsonClose = \"1\"\n    close.className = \"text-gray-400 hover:text-gray-800 text-lg leading-none px-2\"\n    close.textContent = \"\\u00d7\"\n    close.title = \"Close (Esc)\"\n    close.addEventListener(\"click\", () => this.closeJson())\n    head.appendChild(close)\n    dialog.appendChild(head)\n\n    const body = document.createElement(\"div\")\n    body.className = \"p-4 space-y-3\"\n    body.dir = \"ltr\"\n    body.appendChild(this.jsonPanel(verse))\n    dialog.appendChild(body)\n\n    overlay.appendChild(dialog)\n    document.body.appendChild(overlay)\n\n    this.jsonModal = overlay\n    this.onJsonKey = (event) => { if (event.key === \"Escape\") this.closeJson() }\n    document.addEventListener(\"keydown\", this.onJsonKey)\n  }\n\n  closeJson() {\n    if (this.onJsonKey) {\n      document.removeEventListener(\"keydown\", this.onJsonKey)\n      this.onJsonKey = null\n    }\n    if (!this.jsonModal) return\n    this.jsonModal.remove()\n    this.jsonModal = null\n  }\n\n  jsonPanel(verse) {\n    const panel = document.createElement(\"div\")\n    panel.dataset.jsonPanel = \"1\"\n    panel.className = \"space-y-3\"\n    panel.dir = \"ltr\"\n    panel.appendChild(this.deltaTable(verse))\n\n    const columns = document.createElement(\"div\")\n    columns.className = \"grid grid-cols-1 md:grid-cols-2 gap-2\"\n    columns.appendChild(this.jsonColumn(\"current (live)\", verse.live, \"text-indigo-700\"))\n    columns.appendChild(this.jsonColumn(\"draft\", verse.draft, \"text-amber-700\"))\n    panel.appendChild(columns)\n    return panel\n  }\n\n  jsonColumn(title, data, tone) {\n    const box = document.createElement(\"div\")\n    box.className = \"border border-gray-200 rounded\"\n\n    const head = document.createElement(\"div\")\n    head.className = \"flex items-center justify-between px-2 py-1 bg-gray-50 border-b border-gray-200\"\n\n    const label = document.createElement(\"span\")\n    label.className = `text-[11px] font-medium ${tone}`\n    label.textContent = title\n    head.appendChild(label)\n\n    const text = data ? JSON.stringify(data, null, 2) : \"null\"\n    const copy = document.createElement(\"button\")\n    copy.type = \"button\"\n    copy.className = \"text-[11px] text-gray-500 hover:text-gray-800\"\n    copy.textContent = \"copy\"\n    copy.addEventListener(\"click\", () => {\n      // The page may be served over plain http, where clipboard is undefined.\n      const done = () => { copy.textContent = \"copied\"; setTimeout(() => { copy.textContent = \"copy\" }, 1200) }\n      if (navigator.clipboard) navigator.clipboard.writeText(text).then(done, () => { copy.textContent = \"failed\" })\n      else copy.textContent = \"no clipboard\"\n    })\n    head.appendChild(copy)\n    box.appendChild(head)\n\n    const pre = document.createElement(\"pre\")\n    pre.className = \"text-[11px] leading-snug p-2 overflow-auto max-h-80 text-gray-700 whitespace-pre\"\n    pre.textContent = text\n    box.appendChild(pre)\n    return box\n  }\n\n  // Word-by-word, the two layers next to each other with the gap between them.\n  // This is the table that answers \"is this a constant offset or a real\n  // disagreement\" \u2014 a column of near-identical deltas means a shift, which is\n  // fixable, while scattered ones mean the recordings actually differ.\n  //\n  // Built with real nodes rather than an innerHTML string so the word text\n  // never has to be escaped by hand.\n  deltaTable(verse) {\n    const live = new Map(((verse.live || {}).words || []).map((w) => [w[0], w]))\n    const draft = new Map(((verse.draft || {}).words || []).map((w) => [w[0], w]))\n    const texts = new Map((verse.words || []).map((w) => [w.position, w.text]))\n    const positions = [...new Set([...live.keys(), ...draft.keys()])].sort((a, b) => a - b)\n\n    const table = document.createElement(\"table\")\n    table.className = \"w-full text-[11px] tabular-nums\"\n    table.dataset.deltaTable = \"1\"\n\n    const head = document.createElement(\"tr\")\n    head.className = \"text-gray-400 text-left\"\n    const headings = [[\"#\", \"\"], [\"word\", \"\"], [\"current\", \"text-indigo-600\"],\n                      [\"draft\", \"text-amber-600\"], [\"\\u0394start\", \"\"], [\"\\u0394end\", \"\"]]\n    headings.forEach(([text, tone]) => {\n      const th = document.createElement(\"th\")\n      th.className = `py-0.5 pr-2 ${tone}`\n      th.textContent = text\n      head.appendChild(th)\n    })\n    table.appendChild(head)\n\n    const ms = (v) => (v == null ? \"\\u2014\" : (v / 1000).toFixed(2))\n    const cell = (row, text, className) => {\n      const td = document.createElement(\"td\")\n      td.className = `pr-2 ${className || \"\"}`\n      td.textContent = text\n      row.appendChild(td)\n      return td\n    }\n\n    positions.forEach((position) => {\n      const l = live.get(position)\n      const d = draft.get(position)\n      const ds = l && d ? d[1] - l[1] : null\n      const de = l && d ? d[2] - l[2] : null\n      const off = !l || !d || Math.abs(ds) > DRIFT_MS || Math.abs(de) > DRIFT_MS\n\n      const tr = document.createElement(\"tr\")\n      tr.dataset.position = String(position)\n      // One side missing the word, or the two more than a blink apart.\n      tr.dataset.off = off ? \"1\" : \"0\"\n      if (off) tr.className = \"bg-red-50\"\n\n      cell(tr, String(position), \"text-gray-400\")\n      const word = cell(tr, texts.get(position) || \"\", \"digitalkhatt-v2\")\n      word.dir = \"rtl\"\n      cell(tr, l ? `${ms(l[1])}\\u2013${ms(l[2])}` : \"\\u2014\", \"text-indigo-700\")\n      cell(tr, d ? `${ms(d[1])}\\u2013${ms(d[2])}` : \"\\u2014\", \"text-amber-700\")\n      cell(tr, this.signed(ds), ds != null && Math.abs(ds) > DRIFT_MS ? \"text-red-600 font-medium\" : \"text-gray-500\")\n      cell(tr, this.signed(de), de != null && Math.abs(de) > DRIFT_MS ? \"text-red-600 font-medium\" : \"text-gray-500\")\n      table.appendChild(tr)\n    })\n\n    const wrap = document.createElement(\"div\")\n    wrap.className = \"overflow-x-auto max-h-80 overflow-y-auto border border-gray-200 rounded p-2\"\n    wrap.appendChild(table)\n    return wrap\n  }\n\n  signed(value) {\n    if (value == null) return \"\\u2014\"\n    return value > 0 ? `+${value}` : String(value)\n  }\n\n  // Where the reciter backed up and said something again. Read off the draft\n  // when there is one \u2014 that is the layer being judged \u2014 otherwise off live, so\n  // an ayah whose repeat only exists on one side is still findable.\n  repeatChip(verse, verseIndex) {\n    const layer = (verse.draft && (verse.draft.words || []).length) ? verse.draft : verse.live\n    const words = (layer || {}).words || []\n    const repeats = findRepeats(words, (verse.words || []).length)\n    if (!repeats.length) return null\n\n    const kind = repeats.some((r) => r.full) ? FULL : PARTIAL\n    this.repeatsByVerse.set(verseIndex, { kind, repeats })\n\n    const chip = document.createElement(\"button\")\n    chip.type = \"button\"\n    chip.className = `px-1.5 py-0.5 rounded whitespace-nowrap ${this.constructor.REPEAT_TONES[kind]}`\n    chip.dataset.repeat = kind\n    chip.textContent = `\u21BB ${repeats.map((r) => r.label).join(\", \")}`\n    chip.title = \"Play on from the repeat\"\n    chip.addEventListener(\"click\", () => {\n      const start = repeats.map((r) => r.startMs).filter((ms) => ms != null).sort((a, b) => a - b)[0]\n      if (start != null) {\n        this.focusVerse = verseIndex\n        this.playUntil = null\n        this.seekTo(start)\n      }\n    })\n    return chip\n  }\n\n  // A line under the ayah's bar with one button per take of each repeat, each\n  // playing just that take, so the takes can be heard one after another.\n  takesRow(verseIndex) {\n    const found = this.repeatsByVerse.get(verseIndex)\n    if (!found) return null\n\n    const tone = this.constructor.REPEAT_TONES[found.kind]\n    const line = document.createElement(\"div\")\n    line.className = \"flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-gray-500 mb-1\"\n    line.dataset.takes = String(verseIndex)\n\n    found.repeats.forEach((repeat) => {\n      const group = document.createElement(\"span\")\n      group.className = \"flex items-center gap-1\"\n      const label = document.createElement(\"span\")\n      label.textContent = `\u21BB ${repeat.label}:`\n      group.appendChild(label)\n\n      ;(repeat.takes || []).forEach((take, index) => {\n        if (take.startMs == null || take.endMs == null) return\n\n        const button = document.createElement(\"button\")\n        button.type = \"button\"\n        button.className = `px-1.5 py-0.5 rounded tabular-nums whitespace-nowrap ${tone}`\n        button.dataset.take = `${repeat.fromWord}-${repeat.toWord}-${index + 1}`\n        button.textContent = `\u25B6 ${index + 1}`\n        button.title = `Play take ${index + 1} of ${repeat.label}: ` +\n          `${(take.startMs / 1000).toFixed(2)}\u2013${(take.endMs / 1000).toFixed(2)}s`\n        button.addEventListener(\"click\", () => {\n          this.focusVerse = verseIndex\n          this.playRange({ from: take.startMs, to: take.endMs })\n        })\n        group.appendChild(button)\n      })\n      line.appendChild(group)\n    })\n    return line\n  }\n\n  // The validator's issues for this ayah, per layer, with the ayah key taken\n  // off the front: the row already says which ayah it is. A word key stays\n  // (\"word 4: \u2026\") because it says where in the ayah to listen.\n  issuesList(verse) {\n    const issues = verse.issues || {}\n    const layers = [[\"draft\", \"draft\", \"text-amber-700\"], [\"live\", \"current\", \"text-indigo-700\"]]\n      .filter(([layer]) => (issues[layer] || []).length)\n    if (!layers.length) return null\n\n    const box = document.createElement(\"ul\")\n    box.className = \"text-xs text-gray-600 mb-1 space-y-0.5\"\n    box.dataset.issues = verse.key\n\n    layers.forEach(([layer, label, tone]) => {\n      issues[layer].forEach(([category, text]) => {\n        const item = document.createElement(\"li\")\n        const tag = document.createElement(\"span\")\n        tag.className = `font-medium ${tone}`\n        tag.textContent = `${label} `\n        const cat = document.createElement(\"span\")\n        cat.className = \"font-mono text-red-700\"\n        cat.textContent = `${category} `\n        const body = document.createElement(\"span\")\n        body.textContent = this.issueText(verse.key, text)\n        item.appendChild(tag)\n        item.appendChild(cat)\n        item.appendChild(body)\n        box.appendChild(item)\n      })\n    })\n    return box\n  }\n\n  issueText(verseKey, text) {\n    const prefix = `${verseKey}:`\n    if (text.startsWith(prefix)) {\n      const rest = text.slice(prefix.length)\n      const word = rest.match(/^(\\d+)\\s*/)\n      return word ? `word ${word[1]}: ${rest.slice(word[0].length)}` : rest\n    }\n    return text.startsWith(verseKey) ? text.slice(verseKey.length).trim() : text\n  }\n\n  // The span the ayah's progress bar covers: from the earlier layer's start to\n  // the later layer's end, so both layers' audio is reachable by dragging.\n  ayahRange(verse) {\n    const layers = [verse.live, verse.draft].filter((d) => d && d.from != null && d.to != null)\n    if (!layers.length) return null\n\n    const from = Math.min(...layers.map((d) => Number(d.from)))\n    const to = Math.max(...layers.map((d) => Number(d.to)))\n    return to > from ? { from, to } : null\n  }\n\n  // A thin bar per ayah: it fills while the clock is inside the ayah, and\n  // clicking or dragging on it seeks to that point of the ayah. Repeat takes\n  // are shaded on it, so you can see where each one is and drag straight to it.\n  ayahBar(verse, verseIndex) {\n    const range = this.ayahRange(verse)\n    if (!range) return null\n\n    const wrap = document.createElement(\"div\")\n    wrap.className = \"flex items-center gap-2 mt-1 mb-1\"\n    wrap.dataset.ayahBar = String(verseIndex)\n\n    const track = document.createElement(\"div\")\n    track.className = \"relative flex-1 h-2.5 rounded-full bg-gray-200 cursor-pointer\"\n    track.style.touchAction = \"none\" // let a drag seek instead of scrolling the page\n    track.title = \"Click or drag to seek within this ayah\"\n\n    const span = range.to - range.from\n    const pct = (ms) => `${Math.min(100, Math.max(0, ((ms - range.from) / span) * 100))}%`\n\n    const repeats = (this.repeatsByVerse.get(verseIndex) || {}).repeats || []\n    repeats.forEach((repeat) => {\n      ;(repeat.takes || []).forEach((take) => {\n        if (take.startMs == null || take.endMs == null) return\n        const shade = document.createElement(\"div\")\n        shade.className = \"absolute inset-y-0 rounded-full\"\n        shade.style.background = \"rgba(168, 85, 247, 0.35)\" // purple, like the repeat chips\n        shade.style.left = pct(take.startMs)\n        shade.style.width = `calc(${pct(take.endMs)} - ${pct(take.startMs)})`\n        track.appendChild(shade)\n      })\n    })\n\n    const fill = document.createElement(\"div\")\n    fill.className = \"absolute inset-y-0 left-0 rounded-full bg-amber-500 opacity-80 pointer-events-none\"\n    fill.style.width = \"0%\"\n    track.appendChild(fill)\n\n    const clock = document.createElement(\"span\")\n    clock.className = \"text-xs tabular-nums text-gray-400 w-24 text-right\"\n    clock.textContent = `0.0 / ${(span / 1000).toFixed(1)}s`\n\n    const seekAt = (event) => {\n      const box = track.getBoundingClientRect()\n      if (!box.width) return\n      const ratio = Math.min(1, Math.max(0, (event.clientX - box.left) / box.width))\n      this.focusVerse = verseIndex\n      this.playUntil = null\n      this.playerTarget.currentTime = (range.from + ratio * span) / 1000\n      this.tick()\n    }\n    track.addEventListener(\"pointerdown\", (event) => {\n      this.dragging = true\n      track.setPointerCapture?.(event.pointerId)\n      seekAt(event)\n    })\n    track.addEventListener(\"pointermove\", (event) => { if (this.dragging) seekAt(event) })\n    const stop = () => { this.dragging = false }\n    track.addEventListener(\"pointerup\", stop)\n    track.addEventListener(\"pointercancel\", stop)\n\n    wrap.appendChild(track)\n    wrap.appendChild(clock)\n    this.bars.push({ verseIndex, from: range.from, to: range.to, fill, clock })\n    return wrap\n  }\n\n  // Fill the bar of the ayah the clock is in and empty the one it left. When\n  // ayah ranges overlap, the ayah you last played or dragged wins.\n  paintBars(ms) {\n    const inside = (bar) => ms >= bar.from && ms < bar.to\n    const focused = this.bars.find((bar) => bar.verseIndex === this.focusVerse && inside(bar))\n    const bar = focused || this.bars.find(inside)\n\n    if (this.activeBar && this.activeBar !== bar) {\n      this.activeBar.fill.style.width = \"0%\"\n      this.activeBar.clock.textContent = `0.0 / ${((this.activeBar.to - this.activeBar.from) / 1000).toFixed(1)}s`\n    }\n    this.activeBar = bar\n    if (!bar) return\n\n    const span = bar.to - bar.from\n    bar.fill.style.width = `${((ms - bar.from) / span) * 100}%`\n    bar.clock.textContent = `${((ms - bar.from) / 1000).toFixed(1)} / ${(span / 1000).toFixed(1)}s`\n  }\n\n  static REPEAT_TONES = {\n    [FULL]: \"bg-purple-100 text-purple-700 hover:bg-purple-200\",\n    [PARTIAL]: \"bg-sky-100 text-sky-700 hover:bg-sky-200\"\n  }\n\n  // Approve / reject / reset for one ayah, next to the ranges they apply to.\n  // A draft that was never staged (the compare view can render what the current\n  // artifacts WOULD stage) has no id, so there is nothing to review yet.\n  reviewControls(verse, verseIndex) {\n    const box = document.createElement(\"span\")\n    box.className = \"ml-auto flex items-center gap-1\"\n    box.dataset.review = String(verseIndex)\n\n    const draft = verse.draft\n    if (!draft || !draft.id) {\n      const hint = document.createElement(\"span\")\n      hint.className = \"text-gray-300\"\n      hint.textContent = draft ? \"not staged\" : \"\"\n      box.appendChild(hint)\n      return box\n    }\n\n    const pill = document.createElement(\"span\")\n    pill.dataset.statusPill = \"1\"\n    box.appendChild(pill)\n\n    const button = (label, decision, cls) => {\n      const el = document.createElement(\"button\")\n      el.type = \"button\"\n      el.className = `px-1.5 py-0.5 rounded ${cls}`\n      el.textContent = label\n      el.dataset.decision = decision\n      el.addEventListener(\"click\", () => this.review(verseIndex, decision))\n      box.appendChild(el)\n      return el\n    }\n\n    button(\"Approve\", \"approve\", \"bg-gray-800 text-white hover:bg-gray-700\")\n    button(\"Reject\", \"reject\", \"bg-red-100 text-red-700 hover:bg-red-200\")\n    button(\"Reset\", \"reset\", \"bg-gray-100 text-gray-600 hover:bg-gray-200\")\n\n    this.paintStatus(box, draft.status)\n    return box\n  }\n\n  // Which buttons make sense depends on where the draft already is: offering\n  // \"Approve\" on an approved draft is a no-op that only costs a click to find out.\n  paintStatus(box, status) {\n    const pill = box.querySelector(\"[data-status-pill]\")\n    if (pill) {\n      pill.className = `px-1.5 py-0.5 rounded font-medium ${this.constructor.STATUS_TONES[status] || this.constructor.STATUS_TONES.pending}`\n      pill.textContent = status === \"pending\" || !status ? \"to review\" : status\n    }\n\n    box.querySelectorAll(\"[data-decision]\").forEach((el) => {\n      const decision = el.dataset.decision\n      el.hidden = (decision === \"approve\" && status === \"approved\") ||\n                  (decision === \"reject\" && status === \"rejected\") ||\n                  (decision === \"reset\" && (status === \"pending\" || !status)) ||\n                  status === \"imported\"\n    })\n  }\n\n  static STATUS_TONES = {\n    pending: \"bg-gray-100 text-gray-600\",\n    approved: \"bg-emerald-100 text-emerald-700\",\n    rejected: \"bg-red-100 text-red-700\",\n    imported: \"bg-indigo-100 text-indigo-700\"\n  }\n\n  // The range readout doubles as the button that plays it \u2014 playback stops at\n  // the range's end, so \"current\" and \"draft\" are actually distinguishable\n  // instead of both running on into the rest of the surah.\n  rangeChip(label, data, tone, verseIndex) {\n    if (!data || data.from == null) {\n      const empty = document.createElement(\"span\")\n      empty.className = \"text-gray-300\"\n      empty.textContent = `no ${label}`\n      return empty\n    }\n\n    const chip = document.createElement(\"button\")\n    chip.type = \"button\"\n    chip.className = `tabular-nums px-1.5 py-0.5 rounded ${this.constructor.CHIP_TONES[tone]}`\n    chip.dataset.playRange = label\n    chip.textContent = `\u25B6 ${label} ${(data.from / 1000).toFixed(2)}\u2013${(data.to / 1000).toFixed(2)}s`\n    chip.title = `Play just the ${label} range (${data.to - data.from} ms)`\n    chip.addEventListener(\"click\", () => { this.focusVerse = verseIndex; this.playRange(data) })\n    return chip\n  }\n\n  wordRow(verse, verseIndex, layer) {\n    const row = document.createElement(\"div\")\n    row.className = \"digitalkhatt-v2 leading-loose flex flex-wrap gap-x-3 gap-y-1 justify-end py-1\"\n    row.style.fontSize = \"24px\" // the font's class default is 30px; two rows of that is a lot to scan\n    row.dir = \"rtl\"\n\n    const timings = new Map()\n    ;((verse[layer] || {}).words || []).forEach(([position, from, to]) => {\n      // A repeated word appears twice; keep every span so both light up.\n      if (!timings.has(position)) timings.set(position, [])\n      timings.get(position).push([from, to])\n    })\n\n    const words = verse.words.length\n      ? verse.words\n      : [...timings.keys()].sort((a, b) => a - b).map((position) => ({ position, text: `#${position}` }))\n\n    const lettersByWord = this.lettersByWord(verse[layer])\n\n    words.forEach((word) => {\n      const span = document.createElement(\"span\")\n      span.className = \"px-1 rounded border-b-2 border-transparent transition-colors duration-75\"\n      span.title = `word ${word.position}`\n      span.dataset.wordId = `${layer}-${verseIndex}-${word.position}`\n      this.fillWord(span, word, lettersByWord[word.position], verseIndex, layer,\n                    timings.get(word.position))\n      row.appendChild(span)\n\n      const spans = timings.get(word.position) || []\n      if (spans.length) {\n        spans.forEach(([from, to]) =>\n          this.wordNodes.push({ el: span, verseIndex, layer, from, to, position: word.position }))\n      } else {\n        span.classList.add(\"opacity-30\") // no timing on this layer for this word\n      }\n    })\n    // Label and tint each layer's row: both rows hold the same text, so\n    // without this it is hard to tell which highlight belongs to which layer.\n    const block = document.createElement(\"div\")\n    block.className = layer === \"draft\"\n      ? \"flex items-start gap-2 border-t border-dashed border-gray-200 mt-1 pt-1\"\n      : \"flex items-start gap-2\"\n    block.dataset.layer = layer\n    block.dataset.kind = \"words\"\n    block.style.borderLeft = `3px solid ${layer === \"draft\" ? \"#fcd34d\" : \"#a5b4fc\"}`\n    block.style.paddingLeft = \"6px\"\n\n    const label = document.createElement(\"span\")\n    label.className = `text-xs font-medium w-12 shrink-0 pt-2 ${layer === \"draft\" ? \"text-amber-700\" : \"text-indigo-700\"}`\n    label.textContent = layer === \"draft\" ? \"draft\" : \"current\"\n    block.appendChild(label)\n\n    row.classList.add(\"flex-1\", \"min-w-0\")\n    block.appendChild(row)\n    return block\n  }\n\n  // The word is either plain text, or \u2014 when this layer has letter timings that\n  // align onto it \u2014 one .seg-letter span per letter, concatenating back to\n  // exactly the same string.\n  //\n  // `occurrences` are the word's own spans: more than one means the reciter\n  // repeated it, and each take gives the same slices another timing range.\n  fillWord(span, word, letters, verseIndex, layer, occurrences) {\n    const text = word.text || `#${word.position}`\n    const slices = letters && letters.length ? alignLetterTakes(text, letters, occurrences) : null\n\n    if (!slices) {\n      span.textContent = text\n      return\n    }\n\n    slices.forEach((slice, index) => {\n      if (!slice.text) return\n\n      const ranges = slice.ranges || [[slice.start, slice.end]]\n      const cell = document.createElement(\"span\")\n      cell.className = \"seg-letter\"\n      cell.textContent = slice.text\n      cell.title = ranges\n        .map(([from, to]) => `${(from / 1000).toFixed(3)}\u2013${(to / 1000).toFixed(3)}s`)\n        .join(\", \")\n      span.appendChild(cell)\n\n      const id = `${layer}-${verseIndex}-${word.position}-${index}`\n      ranges.forEach(([from, to]) => this.letterNodes.push({ el: cell, layer, from, to, id }))\n    })\n  }\n\n  // word position => [{ char, start, end }], in reading order.\n  lettersByWord(layer) {\n    const map = {}\n    ;((layer || {}).letters || []).forEach(([position, char, start, end]) => {\n      ;(map[position] || (map[position] = [])).push({ char, start: Number(start), end: Number(end) })\n    })\n    return map\n  }\n\n  // ---- reviewing ---------------------------------------------------------\n  //\n  // Posting JSON instead of submitting a form is the whole point: the audio\n  // keeps playing and the scroll position survives, so a reviewer can judge\n  // ayah after ayah without the page going out from under them.\n\n  async review(verseIndex, decision) {\n    const verse = this.verses[verseIndex]\n    const draft = verse && verse.draft\n    if (!draft || !draft.id) return\n\n    const url = this.reviewUrlValue.replace(\"DRAFT_ID\", String(draft.id))\n    const data = await this.post(url, { decision })\n    if (!data) return\n\n    draft.status = data.status\n    const box = this.versesTarget.querySelector(`[data-review=\"${verseIndex}\"]`)\n    if (box) this.paintStatus(box, data.status)\n    this.applyCounts(data.counts)\n    this.reviewNoteTarget.textContent = `${verse.key}: ${data.status}.`\n  }\n\n  // Approving only touches drafts nobody has judged, so a bulk approve can\n  // never quietly overturn a rejection someone made on purpose.\n  approveAll() { return this.reviewAll(\"approve\", \"pending\") }\n\n  // Rejecting takes the lot, approved included. The workflow this exists for is\n  // \"approve everything, then listen and throw back the bad ones\" \u2014 and after\n  // that first approve-all there IS nothing unreviewed left, so a reject that\n  // skipped approved drafts could only ever do nothing. Rejecting is also the\n  // safe direction: a rejected draft is simply never imported.\n  rejectAll() { return this.reviewAll(\"reject\", \"all\") }\n\n  async reviewAll(decision, scope) {\n    const staged = this.verses.filter((v) => v.draft && v.draft.id)\n    const targets = scope === \"all\"\n      ? staged.filter((v) => v.draft.status !== (decision === \"approve\" ? \"approved\" : \"rejected\"))\n      : staged.filter((v) => v.draft.status === \"pending\")\n\n    if (!targets.length) {\n      this.reviewNoteTarget.textContent = scope === \"all\"\n        ? \"Every ayah is already rejected.\"\n        : \"Nothing left unreviewed.\"\n      return\n    }\n\n    if (!window.confirm(this.bulkPrompt(decision, scope, targets))) return\n\n    const data = await this.post(this.reviewAllUrlValue, { decision, scope })\n    if (!data) return\n\n    targets.forEach((verse) => {\n      verse.draft.status = data.status\n      const index = this.verses.indexOf(verse)\n      const box = this.versesTarget.querySelector(`[data-review=\"${index}\"]`)\n      if (box) this.paintStatus(box, data.status)\n    })\n    this.applyCounts(data.counts)\n    this.reviewNoteTarget.textContent = `${data.changed} ayah(s) marked ${data.status}.`\n  }\n\n  // Say plainly how many settled decisions are about to be overturned \u2014 that is\n  // the whole difference between this and the unreviewed-only version.\n  bulkPrompt(decision, scope, targets) {\n    const verb = decision === \"approve\" ? \"Approve\" : \"Reject\"\n    if (scope !== \"all\") return `${verb} ${targets.length} unreviewed ayah(s) in this surah?`\n\n    const settled = targets.filter((v) => v.draft.status !== \"pending\").length\n    let text = `${verb} all ${targets.length} ayah(s) in this surah?`\n    if (settled) text += `\\n\\n${settled} of them have already been reviewed and will be overturned.`\n    return `${text}\\n\\nNothing live changes either way \u2014 only an import does that.`\n  }\n\n  async post(url, params) {\n    const token = document.querySelector('meta[name=\"csrf-token\"]')\n    const body = new URLSearchParams(params)\n\n    try {\n      const response = await fetch(url, {\n        method: \"POST\",\n        headers: {\n          \"Accept\": \"application/json\",\n          \"Content-Type\": \"application/x-www-form-urlencoded\",\n          \"X-CSRF-Token\": token ? token.content : \"\"\n        },\n        body\n      })\n      if (!response.ok) throw new Error(`HTTP ${response.status}`)\n      return await response.json()\n    } catch (error) {\n      this.reviewNoteTarget.textContent = `Could not save: ${error.message}`\n      return null\n    }\n  }\n\n  applyCounts(counts) {\n    if (!counts || !this.hasCountsTarget) return\n\n    this.countsTarget.querySelectorAll(\"[data-count]\").forEach((el) => {\n      el.textContent = String(counts[el.dataset.count] || 0)\n    })\n  }\n\n  // ---- toggles -----------------------------------------------------------\n\n  redraw() {\n    const showLive = this.liveToggleTarget.checked\n    const showDraft = this.draftToggleTarget.checked\n\n    this.versesTarget.querySelectorAll(\"[data-kind]\").forEach((row) => {\n      row.hidden = !(row.dataset.layer === \"live\" ? showLive : showDraft)\n    })\n\n    this.applyVerseFilter()\n    this.lastKey = \"\" // force the next tick to repaint\n    this.tick()\n  }\n\n  // Narrow a long surah to the ayahs worth looking at. On a surah imported from\n  // the same source as the live segments nearly everything agrees, and the few\n  // that matter \u2014 a disagreement, or somewhere the reciter backed up \u2014 are\n  // otherwise buried in hundreds of identical rows.\n  static FILTERS = {\n    all: () => true,\n    differ: (ctx, index) => ctx.diffVerses.has(index),\n    repeat: (ctx, index) => ctx.repeatsByVerse.has(index),\n    repeat_partial: (ctx, index) => ctx.repeatsByVerse.get(index)?.kind === PARTIAL,\n    repeat_full: (ctx, index) => ctx.repeatsByVerse.get(index)?.kind === FULL,\n    issues: (ctx, index) => ctx.issueCount(index, \"live\") + ctx.issueCount(index, \"draft\") > 0,\n    issues_draft: (ctx, index) => ctx.issueCount(index, \"draft\") > 0,\n    issues_live: (ctx, index) => ctx.issueCount(index, \"live\") > 0\n  }\n\n  issueCount(verseIndex, layer) {\n    return (((this.verses[verseIndex] || {}).issues || {})[layer] || []).length\n  }\n\n  filterMode() {\n    const value = this.hasShowFilterTarget ? this.showFilterTarget.value : \"all\"\n    return this.constructor.FILTERS[value] ? value : \"all\"\n  }\n\n  // ?ayah=2:76, set by a shared link or the ayah picker above the steps.\n  linkedAyah() {\n    return new URLSearchParams(globalThis.location?.search || \"\").get(\"ayah\") || \"\"\n  }\n\n  applyVerseFilter() {\n    const mode = this.filterMode()\n    const keeps = this.constructor.FILTERS[mode]\n    const ayah = this.linkedAyah()\n    let shown = 0\n\n    this.rowsByVerse.forEach((row, verseIndex) => {\n      const keep = keeps(this, verseIndex) && (!ayah || String(this.verses[verseIndex]?.key) === ayah)\n      row.hidden = !keep\n      if (keep) shown++\n    })\n\n    if (this.hasFilterNoteTarget) {\n      this.filterNoteTarget.textContent = mode === \"all\" && !ayah\n        ? this.repeatSummary()\n        : `Showing ${shown} of ${this.rowsByVerse.size} ayahs.`\n    }\n    if (this.hasEmptyFilterTarget) {\n      this.emptyFilterTarget.hidden = !(mode !== \"all\" && shown === 0)\n    }\n  }\n\n  repeatSummary() {\n    const kinds = [...this.repeatsByVerse.values()].map((entry) => entry.kind)\n    if (!kinds.length) return \"No repeated words in this surah.\"\n\n    const full = kinds.filter((kind) => kind === FULL).length\n    const partial = kinds.length - full\n    const parts = []\n    if (full) parts.push(`${full} whole-ayah`)\n    if (partial) parts.push(`${partial} partial`)\n    return `${kinds.length} ayah(s) with a repeat (${parts.join(\", \")}).`\n  }\n\n  // ---- playback ----------------------------------------------------------\n\n  togglePlay() {\n    if (this.playerTarget.paused) {\n      // Pressing play again means \"keep going\", so drop any range boundary.\n      if (this.playerTarget.currentTime * 1000 >= (this.playUntil ?? Infinity)) this.playUntil = null\n      this.playerTarget.play().catch(() => {})\n      this.setPlayLabel(true)\n      this.pump()\n    } else {\n      this.playerTarget.pause()\n      this.setPlayLabel(false)\n    }\n  }\n\n  // Whichever layer starts EARLIER. Taking live whenever it exists skips any\n  // audio only the draft covers \u2014 a repeated ayah, where the reciter backs up\n  // and the live segments start at the second take, is exactly that audio.\n  playFrom(verse) {\n    const starts = [verse.live, verse.draft]\n      .filter((data) => data && data.from != null)\n      .map((data) => data.from)\n    if (!starts.length) return\n\n    this.playUntil = null\n    this.seekTo(Math.min(...starts))\n  }\n\n  // One layer's range, and stop where it ends.\n  playRange(data) {\n    if (!data || data.from == null) return\n\n    this.playUntil = data.to\n    this.seekTo(data.from)\n  }\n\n  seekTo(ms) {\n    this.playerTarget.currentTime = Math.max(0, ms / 1000)\n    if (this.playerTarget.paused) this.togglePlay()\n    else this.tick()\n  }\n\n  scrub() {\n    const duration = this.playerTarget.duration\n    if (!Number.isFinite(duration)) return\n\n    this.playUntil = null\n    this.playerTarget.currentTime = (this.scrubberTarget.value / 1000) * duration\n    this.tick()\n  }\n\n  setPlayLabel(playing) {\n    this.playButtonTarget.textContent = playing ? \"\u23F8 Pause\" : \"\u25B6 Play\"\n  }\n\n  // timeupdate only fires ~4\u00D7/s, which looks laggy against word spans that are\n  // often shorter than 300 ms; drive the paint off the frame clock while playing.\n  pump() {\n    if (this.playerTarget.paused) return\n\n    this.tick()\n    this.raf = requestAnimationFrame(() => this.pump())\n  }\n\n  tick() {\n    const ms = this.playerTarget.currentTime * 1000\n    this.renderClock()\n\n    // Stop on the frame clock, not `timeupdate` \u2014 at ~4 events/s a range would\n    // overrun by up to a quarter second, which is audible.\n    if (this.playUntil != null && ms >= this.playUntil) {\n      this.playUntil = null\n      if (!this.playerTarget.paused) {\n        this.playerTarget.pause()\n        this.setPlayLabel(false)\n      }\n    }\n\n    this.paintBars(ms)\n\n    const showLive = this.liveToggleTarget.checked\n    const showDraft = this.draftToggleTarget.checked\n    const showLetters = this.lettersToggleTarget.checked\n\n    // Keyed by verse+word, NOT by element: each layer renders its own row, so the\n    // same word is two different elements. Comparing elements would mean the two\n    // layers could never be seen to agree.\n    const active = { live: new Set(), draft: new Set() }\n    this.wordNodes.forEach((node) => {\n      if (ms >= node.from && ms < node.to) active[node.layer].add(this.wordKey(node))\n    })\n\n    // Letters turn over several times inside one word, so they need their own\n    // term in the repaint key \u2014 keyed on words alone, a letter change inside a\n    // held word would never be drawn. Only walked when letters are on: a long\n    // surah has tens of thousands of slices.\n    const letters = new Set()\n    if (showLetters) {\n      this.letterNodes.forEach((node) => {\n        if (ms >= node.from && ms < node.to) letters.add(node.id)\n      })\n    }\n\n    // Repaint only when the highlighted set actually changed \u2014 this runs every\n    // frame, and touching thousands of class lists 60\u00D7/s would drop frames on\n    // a long surah.\n    const key = `${showLive}|${showDraft}|${showLetters}|` +\n      `${this.setKey(active.live)}|${this.setKey(active.draft)}|${this.setKey(letters)}`\n    if (key === this.lastKey) return\n    this.lastKey = key\n\n    this.wordNodes.forEach((node) => this.paintWord(node, active, showLive, showDraft))\n    this.paintLetters(letters, showLive, showDraft)\n    this.follow(active)\n  }\n\n  // Written out as literal class strings, never interpolated: Tailwind only ships\n  // the classes it can see as text in the source.\n  // Written out in full: Tailwind scans the source text, so a class built by\n  // interpolation (`bg-` + tone) is never generated and the chip renders bare.\n  static CHIP_TONES = {\n    indigo: \"text-indigo-700 bg-indigo-50 hover:bg-indigo-100\",\n    amber: \"text-amber-700 bg-amber-50 hover:bg-amber-100\"\n  }\n\n  static TONES = {\n    live: [\"bg-indigo-100\", \"text-indigo-800\", \"border-indigo-500\"],\n    draft: [\"bg-amber-100\", \"text-amber-800\", \"border-amber-500\"],\n    agreed: [\"bg-emerald-100\", \"text-emerald-800\", \"border-emerald-500\"]\n  }\n\n  wordKey(node) {\n    return `${node.verseIndex}-${node.position}`\n  }\n\n  paintWord(node, active, showLive, showDraft) {\n    const el = node.el\n    const key = this.wordKey(node)\n    const liveOn = showLive && active.live.has(key)\n    const draftOn = showDraft && active.draft.has(key)\n    const onThisRow = node.layer === \"live\" ? liveOn : draftOn\n\n    const tones = this.constructor.TONES\n    el.classList.remove(...tones.live, ...tones.draft, ...tones.agreed)\n    el.classList.add(\"border-transparent\")\n    if (!onThisRow) return\n\n    el.classList.remove(\"border-transparent\")\n    // Green means both layers agree this word is sounding right now; anything\n    // else means they disagree, which is exactly what you came here to find.\n    const tone = liveOn && draftOn ? tones.agreed : tones[node.layer]\n    el.classList.add(...tone)\n  }\n\n  // Several letters can share one time range \u2014 a fatha and the superscript alef\n  // above it are a single sound and are given identical timings \u2014 so every slice\n  // covering the clock lights up, not just the first.\n  paintLetters(active, showLive, showDraft) {\n    this.letterNodes.forEach(({ el, layer, id }) => {\n      const layerOn = layer === \"live\" ? showLive : showDraft\n      el.classList.toggle(\"letter-active\", layerOn && active.has(id))\n    })\n  }\n\n  follow(active) {\n    if (!this.followToggleTarget.checked) return\n\n    const key = [...active.draft][0] || [...active.live][0]\n    const node = key && this.wordNodes.find((n) => this.wordKey(n) === key)\n    const row = node && node.el.closest(\"[data-verse-index]\")\n    if (!row || row === this.lastRow) return\n\n    this.lastRow = row\n    row.scrollIntoView({ block: \"center\", behavior: \"smooth\" })\n  }\n\n  renderClock() {\n    const current = this.playerTarget.currentTime\n    const duration = this.playerTarget.duration\n    this.clockTarget.textContent = `${current.toFixed(2)} / ${Number.isFinite(duration) ? duration.toFixed(2) : \"0.00\"}`\n    if (Number.isFinite(duration) && duration > 0 && document.activeElement !== this.scrubberTarget) {\n      this.scrubberTarget.value = String(Math.round((current / duration) * 1000))\n    }\n  }\n\n  setKey(set) {\n    return set.size ? [...set].sort().join(\",\") : \"\"\n  }\n}\n", "// Aligning letter segments onto displayed Arabic word text.\n//\n// The idea: rather than rendering the glyph stored in each letter segment, slice\n// the word's own DigitalKhatt text into one piece per segment. Rendering the\n// slices as plain inline spans preserves the cursive joining, so the word still\n// reads as normal Arabic while a single letter can be highlighted.\n\n// Hamza-carrier letters: the precomposed form a letter segment uses (\u0623)\n// compares equal to the decomposed one DigitalKhatt renders (\u0627\u0654).\nexport const HAMZA_FORMS = {\n  '\u0622': '\u0627\u0653',\n  '\u0623': '\u0627\u0654',\n  '\u0624': '\u0648\u0654',\n  '\u0625': '\u0627\u0655',\n  '\u0626': '\u064A\u0654',\n};\n\n// Characters the letter-segment source and the DigitalKhatt text spell\n// differently but which denote the same sound: alef maksura for a final yeh,\n// the Quranic open tanween forms, the small-high-head sukun, and the alef\n// variants. Folded to one spelling for matching only \u2014 the displayed text is\n// always sliced from the original string.\nexport const CANONICAL_CP = {\n  '\u0649': '\u064A',\n  '\u06CC': '\u064A',\n  '\u0640': '',\n  '\u06E1': '\u0652',\n  '\u08F0': '\u064B',\n  '\u08F1': '\u064C',\n  '\u08F2': '\u064D',\n  '\u0671': '\u0627',\n  '\u0670': '\u0627',\n};\n\nexport const ARABIC_MARK = /[\u064B-\u065F\u0670\u06D6-\u06ED\u08D3-\u08FF]/;\n\nexport const canonicalCp = (cp) => (CANONICAL_CP[cp] !== undefined ? CANONICAL_CP[cp] : cp);\n\n// Tested on the RAW codepoints, before canonicalisation: a dagger alef (\\u0670)\n// is a mark here even though it folds to a plain alef for matching.\nconst isMarkOnly = (target) => target.every((cp) => ARABIC_MARK.test(cp));\n\n// Expand precomposed hamza carriers so they match either spelling. `index` keeps\n// every expanded codepoint pointing back at the original character, so slicing\n// never splits one.\n//\n// NFD would do the expansion but also applies canonical ordering, which reorders\n// Quranic mark runs such as shadda + fatha \u2014 that both breaks the match and\n// corrupts the rendered text, so the expansion is done by hand.\nexport function expandChars(chars) {\n  const out = [];\n\n  chars.forEach((char, index) => {\n    const expanded = HAMZA_FORMS[char] || char;\n    for (const cp of expanded) out.push({ cp, index });\n  });\n\n  return out;\n}\n\n// Alignment of a letter-segment list onto the displayed word text.\n//\n// A segment's `char` is not always a single character: a consonant carrying a\n// shadda or sukun is stored as one segment (\u0646\u0651), so targets are matched as\n// codepoint sequences. The segment data also comes from a source whose\n// orthography differs from the DigitalKhatt text in places (alef maksura for\n// final yeh, plain fatha for an open fathatan, a sukun the mushaf doesn't\n// write), so matching is done on canonicalised codepoints and falls back to the\n// bare base letter. A letter that still can't be placed is skipped rather than\n// failing the whole word \u2014 it simply never highlights, while the rest of the\n// word stays letter-addressable.\n//\n// Characters between matches attach to the preceding letter and trailing ones to\n// the last letter, so the concatenated slices always reproduce the word exactly \u2014\n// nothing is dropped from the display.\n//\n//   word    displayed text, e.g. \"\u0628\u0650\u0633\u06E1\u0645\u0650\"\n//   letters [{ char, start, end }, ...] in reading order\n//   \u2192       [{ text, start, end }, ...], one per letter, or null\nexport function alignLetters(word, letters) {\n  if (!word || !letters || !letters.length) return null;\n\n  const chars = Array.from(word);\n  const expanded = expandChars(chars);\n  const slices = letters.map((letter) => ({ text: '', start: letter.start, end: letter.end }));\n\n  // `ei` walks the expanded codepoints, `ci` the original characters; both only\n  // move forward, which keeps the slices in reading order.\n  let ei = 0;\n  let ci = 0;\n\n  const seek = (target, from) => {\n    for (let j = from; j + target.length <= expanded.length; j++) {\n      if (target.every((cp, k) => canonicalCp(expanded[j + k].cp) === canonicalCp(cp))) return j;\n    }\n    return -1;\n  };\n\n  for (let li = 0; li < letters.length; li++) {\n    const target = expandChars(Array.from(letters[li].char || '')).map((e) => e.cp);\n    if (!target.length) continue;\n\n    let j = seek(target, ei);\n    let len = target.length;\n\n    // A segment that is nothing but diacritics (QUD's char layer gives every\n    // harakah its own span) belongs to the letter just consumed, so it may only\n    // match AT the cursor. Letting it seek forward is actively harmful: in\n    // \u0671\u0644\u0652\u062D\u064E\u0645\u0652\u062F\u064F the lone fatha QUD emits for the alef-wasla's helping vowel would\n    // otherwise match the fatha on the \u062D four characters later, dragging the\n    // cursor past \u0644\u0652 and \u062D and leaving all three unhighlightable. If the mark is\n    // not right here, this text does not write it \u2014 skip it and move on.\n    if (isMarkOnly(target) && j !== ei) j = -1;\n\n    if (j < 0 && target.length > 1) {\n      const base = target.filter((cp) => !ARABIC_MARK.test(cp));\n      if (base.length) {\n        j = seek(base, ei);\n        len = base.length;\n      }\n    }\n\n    if (j < 0) continue;\n\n    const matchStart = expanded[j].index;\n    if (matchStart > ci) {\n      const attachTo = li === 0 ? 0 : li - 1;\n      slices[attachTo].text += chars.slice(ci, matchStart).join('');\n    }\n\n    const from = Math.max(matchStart, ci);\n    const to = expanded[j + len - 1].index + 1;\n    if (to > from) slices[li].text += chars.slice(from, to).join('');\n\n    ci = Math.max(ci, to);\n    ei = j + len;\n  }\n\n  if (ci < chars.length) {\n    slices[slices.length - 1].text += chars.slice(ci).join('');\n  }\n\n  return slices;\n}\n\n// ---------------------------------------------------------------------------\n// Repeated words\n// ---------------------------------------------------------------------------\n//\n// When a reciter backs up and repeats part of an ayah, the word appears several\n// times in `segments` and carries a full set of letters per take. The mushaf\n// still shows the word once, so the text can only be sliced once \u2014 a take is not\n// a second word, it is a second set of timings for the same slices.\n//\n// `alignLetters` on the merged list would place only the first take: its cursor\n// only moves forward, so every later take finds nothing left to match and comes\n// back with empty slices that can never highlight. Splitting by take first and\n// merging the timings afterwards is what keeps both takes addressable.\n\n// Group a word's letters by which take of the word they fall in. `occurrences`\n// are the word's [start, end] spans, in the order they were recited. A letter\n// that lands in no span (timings that disagree at the edges) joins the last take\n// that had already started, so nothing is silently dropped.\nexport function splitLetterTakes(letters, occurrences) {\n  const list = letters || [];\n  if (!list.length) return [];\n\n  const spans = (occurrences || [])\n    .map((occurrence) => [Number(occurrence[0]), Number(occurrence[1])])\n    .filter(([start, end]) => Number.isFinite(start) && Number.isFinite(end))\n    .sort((a, b) => a[0] - b[0]);\n\n  if (spans.length < 2) return [list];\n\n  const takes = spans.map(() => []);\n\n  list.forEach((letter) => {\n    let index = spans.findIndex(([start, end]) => letter.start >= start && letter.start < end);\n\n    if (index < 0) {\n      index = 0;\n      for (let i = 0; i < spans.length; i++) {\n        if (letter.start >= spans[i][0]) index = i;\n      }\n    }\n\n    takes[index].push(letter);\n  });\n\n  return takes.filter((take) => take.length);\n}\n\n// Slices for a word that may have been recited more than once: one slice per\n// letter of the displayed text, each carrying a `ranges` list with one entry per\n// take. Callers highlight a slice while the clock is inside ANY of its ranges.\n//\n//   word        displayed text\n//   letters     [{ char, start, end }, ...] across every take, in reading order\n//   occurrences the word's [start, end] spans, one per take\n//   \u2192           [{ text, start, end, ranges: [[start, end], ...] }, ...] or null\n//\n// A partial take \u2014 the reciter starting the word and stopping \u2014 is a prefix of\n// the full one, so take timings line up with the slices by index. The fullest\n// take defines the text partition; nothing is attached beyond where it ends.\nexport function alignLetterTakes(word, letters, occurrences) {\n  const takes = splitLetterTakes(letters, occurrences);\n  if (!takes.length) return null;\n\n  const aligned = takes.map((take) => alignLetters(word, take)).filter(Boolean);\n  if (!aligned.length) return null;\n\n  const base = aligned.reduce((widest, take) => (take.length > widest.length ? take : widest));\n\n  return base.map((slice, index) => ({\n    text: slice.text,\n    start: slice.start,\n    end: slice.end,\n    ranges: aligned\n      .map((take) => take[index])\n      .filter(Boolean)\n      .map((take) => [take.start, take.end]),\n  }));\n}\n", "// A segment's word list is [[position, startMs, endMs], ...] in RECITATION\n// order, so a repeat shows up as a run of positions appearing again later:\n//\n//   [1,2,3,4, 1,2,3,4,5,6,7,8,9,10,11]\n//    \u2514 take 1 \u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500 take 2 \u2500\u2500\u2500\u2500\u2500\u2500\u2518   \u2192 words 1\u20134 repeated\n//\n// That one shape covers both cases people care about: a few words said twice,\n// and a whole ayah started over.\n\nexport const PARTIAL = \"partial\"\nexport const FULL = \"full\"\n\n// Every repeated run in one ayah's word list.\n//\n//   wordSegments [[position, startMs, endMs], ...] in recitation order\n//   wordsCount   how many words the ayah actually has, so a run covering all of\n//                them can be called a full repeat rather than a long partial one\n//   \u2192            [{ fromWord, toWord, full, label, startMs, takes }]\n//                takes: every time the run was recited, [{ startMs, endMs }] in\n//                order, so each one can be played on its own\nexport function findRepeats(wordSegments, wordsCount) {\n  const positions = (wordSegments || []).map((segment) => Number(segment[0]))\n  const seen = {}\n  const found = []\n  const byRange = {}\n  const take = (at, length) => {\n    const first = wordSegments[at]\n    const last = wordSegments[at + length - 1]\n    return { startMs: first ? Number(first[1]) : null, endMs: last ? Number(last[2]) : null }\n  }\n\n  for (let i = 0; i < positions.length; i++) {\n    const previous = seen[positions[i]]\n\n    if (previous !== undefined) {\n      const length = i - previous\n\n      if (length > 0 && i + length <= positions.length) {\n        let identical = true\n        for (let k = 0; k < length; k++) {\n          if (positions[previous + k] !== positions[i + k]) {\n            identical = false\n            break\n          }\n        }\n\n        const fromWord = positions[i]\n        const toWord = positions[i + length - 1]\n\n        // Alternating takes (1 2 1 2) also match shifted by one word, as a\n        // backwards \"2\u20131\" run. That is the same repeat seen again, not a new one.\n        if (identical && fromWord <= toWord) {\n          const rangeKey = `${fromWord}-${toWord}`\n\n          const existing = byRange[rangeKey]\n\n          if (existing) {\n            // A third (or later) take of the same run.\n            existing.takes.push(take(i, length))\n          } else {\n            const full = fromWord === 1 && wordsCount > 0 && toWord >= wordsCount\n            const entry = {\n              fromWord,\n              toWord,\n              full,\n              label: full\n                ? `whole ayah (${fromWord}\u2013${toWord})`\n                : (fromWord === toWord ? `word ${fromWord}` : `words ${fromWord}\u2013${toWord}`),\n              startMs: wordSegments[i] ? Number(wordSegments[i][1]) : null,\n              takes: [take(previous, length), take(i, length)],\n            }\n            byRange[rangeKey] = entry\n            found.push(entry)\n          }\n        }\n      }\n    }\n\n    seen[positions[i]] = i\n  }\n\n  return found\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"tab\", \"pane\"]\n\n  select(event) {\n    const category = event.currentTarget.dataset.category\n\n    this.paneTargets.forEach((pane) => {\n      pane.classList.toggle(\"hidden\", pane.dataset.category !== category)\n    })\n\n    this.tabTargets.forEach((tab) => {\n      const active = tab === event.currentTarget\n      tab.classList.toggle(\"bg-white\", active)\n      tab.classList.toggle(\"border-gray-300\", active)\n      tab.classList.toggle(\"text-gray-900\", active)\n      tab.classList.toggle(\"bg-gray-50\", !active)\n      tab.classList.toggle(\"border-transparent\", !active)\n      tab.classList.toggle(\"text-gray-500\", !active)\n    })\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = { statusUrl: String, interval: Number }\n\n  connect() {\n    this.poll = this.poll.bind(this)\n    this.timer = setInterval(this.poll, this.intervalValue || 7000)\n    this.poll()\n  }\n\n  disconnect() {\n    if (this.timer) clearInterval(this.timer)\n  }\n\n  async poll() {\n    try {\n      const response = await fetch(this.statusUrlValue, { headers: { Accept: \"application/json\" } })\n      if (!response.ok) return\n      const data = await response.json()\n      ;(data.runs || []).forEach((run) => this.updateRow(run))\n    } catch (error) {\n      return\n    }\n  }\n\n  updateRow(run) {\n    const row = this.element.querySelector(`[data-run-chapter=\"${run.chapter_id}\"]`)\n    if (!row) return\n\n    this.setField(row, \"step\", run.current_step || \"\u2014\")\n    this.setField(row, \"source\", run.source || \"\")\n    this.setField(row, \"last_log\", run.last_log || \"\")\n\n    const badge = row.querySelector('[data-field=\"status\"]')\n    if (badge) {\n      badge.textContent = run.status || \"\u2014\"\n      badge.className = this.badgeClass(run.status)\n    }\n\n    const error = row.querySelector('[data-field=\"error\"]')\n    if (error) {\n      if (run.error) {\n        error.textContent = run.error\n        error.classList.remove(\"hidden\")\n      } else {\n        error.textContent = \"\"\n        error.classList.add(\"hidden\")\n      }\n    }\n\n    if (run.coverage !== null && run.coverage !== undefined) {\n      this.setField(row, \"coverage\", `${run.coverage}%`)\n    }\n  }\n\n  setField(row, field, value) {\n    const element = row.querySelector(`[data-field=\"${field}\"]`)\n    if (element) element.textContent = value\n  }\n\n  badgeClass(status) {\n    const base = \"inline-block px-2 py-0.5 rounded text-xs font-medium \"\n    const map = {\n      running: \"bg-amber-100 text-amber-700\",\n      completed: \"bg-emerald-100 text-emerald-700\",\n      failed: \"bg-red-100 text-red-700\",\n      pending: \"bg-gray-100 text-gray-600\"\n    }\n    return base + (map[status] || \"bg-gray-50 text-gray-400\")\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"step\", \"panel\"]\n  static values = { statusUrl: String, chapterId: Number, default: String, interval: Number }\n\n  connect() {\n    this.show(this.defaultValue || this.firstStepKey())\n    if (this.hasStatusUrlValue) {\n      this.poll = this.poll.bind(this)\n      this.timer = setInterval(this.poll, this.intervalValue || 7000)\n      this.poll()\n    }\n  }\n\n  disconnect() {\n    if (this.timer) clearInterval(this.timer)\n  }\n\n  select(event) {\n    const key = event.currentTarget.dataset.stepKey\n    this.show(key)\n    // Put the tab in the URL so the address can be copied and shared as is.\n    // replaceState, not pushState: switching tabs should not fill the history.\n    const url = new URL(window.location.href)\n    url.searchParams.set(\"step\", key)\n    window.history.replaceState(window.history.state, \"\", url)\n  }\n\n  show(key) {\n    this.panelTargets.forEach((panel) => panel.classList.toggle(\"hidden\", panel.dataset.stepKey !== key))\n    this.stepTargets.forEach((step) => {\n      const active = step.dataset.stepKey === key\n      step.classList.toggle(\"ring-2\", active)\n      step.classList.toggle(\"ring-indigo-400\", active)\n    })\n  }\n\n  firstStepKey() {\n    return this.stepTargets[0] ? this.stepTargets[0].dataset.stepKey : null\n  }\n\n  async poll() {\n    try {\n      const response = await fetch(this.statusUrlValue, { headers: { Accept: \"application/json\" } })\n      if (!response.ok) return\n      const data = await response.json()\n      const run = (data.runs || []).find((r) => r.chapter_id === this.chapterIdValue)\n      if (run) this.applyRun(run)\n      if (!data.any_active && this.timer) {\n        clearInterval(this.timer)\n        this.timer = null\n      }\n    } catch (error) {\n      return\n    }\n  }\n\n  applyRun(run) {\n    this.setField(\"step\", run.current_step || \"\u2014\")\n    this.setField(\"last_log\", run.last_log || \"\")\n\n    const badge = this.element.querySelector('[data-field=\"status\"]')\n    if (badge) {\n      badge.textContent = run.status || \"\u2014\"\n      badge.className = this.statusClass(run.status)\n    }\n\n    const error = this.element.querySelector('[data-field=\"error\"]')\n    if (error) {\n      if (run.error) {\n        error.textContent = run.error\n        error.classList.remove(\"hidden\")\n      } else {\n        error.textContent = \"\"\n        error.classList.add(\"hidden\")\n      }\n    }\n\n    this.recolorTimeline(run)\n  }\n\n  recolorTimeline(run) {\n    const order = this.stepTargets.map((step) => step.dataset.stepKey)\n    const currentIndex = order.indexOf(run.current_step)\n    const completed = run.status === \"completed\" || run.current_step === \"done\"\n\n    this.stepTargets.forEach((step, index) => {\n      let state\n      if (completed) state = \"done\"\n      else if (currentIndex === -1) state = \"pending\"\n      else if (index < currentIndex) state = \"done\"\n      else if (index === currentIndex) state = run.status === \"failed\" ? \"failed\" : \"active\"\n      else state = \"pending\"\n      this.applyDotState(step, state)\n    })\n  }\n\n  applyDotState(step, state) {\n    const dot = step.querySelector(\"[data-dot]\")\n    if (dot) {\n      const base = \"w-8 h-8 rounded-full flex items-center justify-center text-xs font-bold \"\n      dot.className = base + this.dotClass(state)\n    }\n    const label = step.querySelector(\"[data-state-label]\")\n    if (label) label.textContent = state\n  }\n\n  setField(field, value) {\n    const element = this.element.querySelector(`[data-field=\"${field}\"]`)\n    if (element) element.textContent = value\n  }\n\n  dotClass(state) {\n    const map = {\n      done: \"bg-emerald-500 text-white\",\n      active: \"bg-amber-500 text-white animate-pulse\",\n      failed: \"bg-red-500 text-white\"\n    }\n    return map[state] || \"bg-gray-200 text-gray-500\"\n  }\n\n  statusClass(status) {\n    const base = \"inline-block px-2 py-0.5 rounded text-xs font-medium \"\n    const map = {\n      running: \"bg-amber-100 text-amber-700\",\n      completed: \"bg-emerald-100 text-emerald-700\",\n      failed: \"bg-red-100 text-red-700\",\n      pending: \"bg-gray-100 text-gray-600\"\n    }\n    return base + (map[status] || \"bg-gray-50 text-gray-400\")\n  }\n}\n", "// Visit The Stimulus Handbook for more details\n// https://stimulusjs.org/handbook/introduction\n//\n// This example controller works with specially annotated HTML like:\n//\n// <div data-controller=\"hello\">\n//   <h1 data-target=\"hello.output\"></h1>\n// </div>\n\nimport { Controller } from \"@hotwired/stimulus\";\nimport select2 from \"select2\";\nwindow.select2 = select2();\n\nexport default class extends Controller {\n  connect() {\n    let el = $(this.element);\n\n    let options = { allowClear: true, placeholder: \"Select\" };\n\n    if (el.data(\"multiple\")) {\n      options[\"multiple\"] = true;\n    }\n\n    if (el.data(\"tags\")) {\n      options[\"tags\"] = true;\n\n      options[\"createTag\"] = (newTag) => {\n        return {\n          id: \"new:\" + newTag.term,\n          text: newTag.term + \" (create new)\",\n        };\n      };\n    }\n\n    if (el.data(\"parent\")) options[\"dropdownParent\"] = $(el.data(\"parent\"));\n\n    options[\"templateResult\"] = (item) => {\n      return this.dropdownItemTemplate(item);\n    };\n    options[\"escapeMarkup\"] = (markup) => markup;\n\n    // Weird, had to expose select2 to window before using it.\n    // Debug and fix this\n    this.select = el.select2(options);\n\n    // Forward Select2 change event to native change event for Stimulus actions\n    this.select.on(\"select2:select select2:clear\", () => {\n      this.element.dispatchEvent(new Event(\"change\", { bubbles: true }));\n    });\n  }\n\n  dropdownItemTemplate(item) {\n    if (item.loading) return item.text;\n\n    if (item.element && item.element.dataset) {\n      let container = $(`\n        <div class='22 select2-result ${item.element.dataset.class}'>\n           <strong>${item.text}</strong>\n          <div class='select2-result__title'>${item.element.dataset.description || \"\"}</div>\n      </div>`);\n\n      return container;\n    } else {\n      return item.text;\n    }\n  }\n\n  disconnect() {\n    const select = this.select.data(\"select2\");\n    if (select) select.destroy();\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  connect() {\n    var footnote = $('.translation sup')\n    if (footnote.length) {\n      footnote.click(function (e) {\n        e.preventDefault()\n        e.stopImmediatePropagation()\n        var footnoteId = $(this).attr('foot_note')\n\n        $.get(`/cms/foot_notes/${footnoteId}.json`, {}).then(function (data) {\n          $(\"<div>\").html(data.text).addClass(`${data.language_name} footnote-dialog`).appendTo(\"body\").dialog()\n        })\n      })\n    }\n  }\n}\n", "import {Controller} from \"@hotwired/stimulus\";\n\n// Clickable steps in the tool help, shows one step at a time.\n// The markup comes from StepFlowHelper#step_flow.\nexport default class extends Controller {\n  static targets = [\"node\", \"panel\"]\n\n  connect() {\n    this.select(0)\n  }\n\n  show(event) {\n    this.select(event.params.index)\n  }\n\n  next() {\n    this.select(Math.min(this.current + 1, this.panelTargets.length - 1))\n  }\n\n  previous() {\n    this.select(Math.max(this.current - 1, 0))\n  }\n\n  select(index) {\n    this.current = index\n    this.panelTargets.forEach((panel, i) => panel.classList.toggle(\"hidden\", i !== index))\n    this.nodeTargets.forEach((node, i) => node.setAttribute(\"aria-selected\", i === index))\n  }\n}\n", "import SegmentPlayer from './segment_player_controller';\nimport {QuranUtils} from \"../utils/quran\";\n\nexport default class extends SegmentPlayer {\n  async connect() {\n    await super.connect();\n  }\n\n  initializePlayer() {\n    if (this.player) {\n      this.player.unload();\n    }\n\n    this.playerChapter = this.currentChapter;\n    this.player = new Howl({\n      src: [this.getAudioUrl()],\n      html5: true,\n      // A gapless surah can be a two-hour file; only pull metadata up front.\n      preload: 'metadata',\n      onplay: this.onplay.bind(this),\n      onpause: this.onpause.bind(this),\n      onend: this.onend.bind(this),\n      onload: this.onload.bind(this),\n      onloaderror: this.onloaderror.bind(this),\n    });\n  }\n\n  isPlayerReadyForVerse() {\n    return this.player && this.playerChapter === this.currentChapter;\n  }\n\n  playAyah(key) {\n    if (!this.player || this.playerChapter !== this.currentChapter) {\n      this.initializePlayer();\n    }\n\n    const segment = this.segmentsData[key]\n    if (segment) {\n      this.player.seek(segment.time_from / 1000);\n      this.playWindowEndMs = null;\n\n      if (this.player.state() === 'loaded') {\n        this.updateTotalDuration();\n      }\n    }\n  }\n\n  findAyahKeyAtTime(time) {\n    const segments = this.segmentsData\n\n    let left = 1;\n    let right = QuranUtils.getSurahAyahCount(this.currentChapter);\n\n    while (left <= right) {\n      const mid = Math.floor((left + right) / 2);\n      const key = `${this.currentChapter}:${mid}`;\n      const segment = segments[key];\n\n      if (!segment) {\n        left = mid + 1;\n        continue;\n      }\n\n      const {time_from, time_to} = segment;\n\n      if (time < time_from) {\n        right = mid - 1;\n      } else if (time > time_to) {\n        left = mid + 1;\n      } else {\n        return key;\n      }\n    }\n\n    return null;\n  }\n\n  async updateVerse(time) {\n    const segments = this.segmentsData[this.currentVerseKey];\n    if (segments && time >= segments.time_from && time <= segments.time_to) {\n      return\n    }\n\n    const key = this.findAyahKeyAtTime(time);\n\n    if (!key) return;\n    await this.jumpToVerse(key);\n  }\n\n  findSegmentAtTime(time) {\n    const segments = this.segmentsData[this.currentVerseKey]?.segments || [];\n    if (!segments.length) return null;\n\n    let left = 0;\n    let right = segments.length - 1;\n\n    while (left <= right) {\n      const mid = Math.floor((left + right) / 2);\n      const segment = segments[mid];\n\n      if (time < segment[1]) {\n        right = mid - 1;\n      } else if (time > segment[2]) {\n        left = mid + 1;\n      } else {\n        return segment; // time is within segment range\n      }\n    }\n\n    return null;\n  }\n\n\n  getAudioUrl() {\n    return this.audioData.url\n  }\n\n  async loadSegments(verseKey) {\n    const verseData = this.segmentsData[verseKey];\n    if (verseData?.segments)\n      return\n\n    const parts = verseKey.split(\":\");\n    const ayahCount = QuranUtils.getSurahAyahCount(parts[0]);\n    // The endpoint paginates (10 per page by default) and ignores from/to, so\n    // ask for the whole surah in one page \u2014 seeking needs every segment.\n    const url = `/api/v1/audio/surah_segments/${this.recitation}?surah=${parts[0]}&per_page=${ayahCount}`;\n\n    const response = await fetch(url);\n    const data = await response.json();\n\n    this.audioData = data.audio;\n\n    this.segmentsData = {\n      ...this.segmentsData,\n      ...data.segments\n    };\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\n// Full-surah QA timeline for the segment-pipeline run page.\n//\n// Renders, over the decoded waveform, three stacked tracks \u2014 ayahs, forced-align\n// words, and the raw STT stream \u2014 from the DB-free JSON the server builds out of\n// the pipeline files. Words are coloured by the fix-step status (merged / repeat\n// / missed), overlaps are outlined, and the slice of each ayah that contains an\n// issue is underlined, so transcript problems and boundary overlaps are visible\n// at a glance. A moving cursor tracks playback; the canvas is click-to-seek,\n// zoomable, and horizontally scrollable.\n//\n// Only the visible time window is drawn each frame (the canvas stays viewport-\n// width and sticky; a spacer provides the scroll extent), so long surahs at high\n// zoom never hit the browser's max-canvas-size limit.\nexport default class extends Controller {\n  static targets = [\"scroll\", \"spacer\", \"canvas\", \"playButton\", \"zoomLabel\", \"time\", \"status\"]\n  static values = { url: String, audioUrl: String }\n\n  static HEIGHT = 250\n  static BANDS = {\n    wave: [8, 78],\n    ayah: [88, 118],\n    word: [128, 176],\n    stt: [186, 220],\n    ruler: 236\n  }\n  static COLORS = {\n    ok: \"#9ca3af\", merged: \"#a855f7\", repeat: \"#3b82f6\", missed: \"#f59e0b\",\n    overlap: \"#ef4444\", wave: \"#6b7280\", stt: \"#cbd5e1\", cursor: \"#dc2626\",\n    ayahLine: \"rgba(30,41,59,0.15)\"\n  }\n\n  connect() {\n    this.timeline = null\n    this.buffer = null\n    this.loaded = false\n    this.pps = 0\n    this.playing = false\n    this.rafId = null\n    this.player = new Audio(this.audioUrlValue)\n    this.player.preload = \"none\"\n    this.onFrame = this.onFrame.bind(this)\n    this.render = this.render.bind(this)\n    this.onResize = this.onResize.bind(this)\n\n    this.player.addEventListener(\"play\", () => { this.playing = true; this.syncPlayButton(); this.startLoop() })\n    this.player.addEventListener(\"pause\", () => { this.playing = false; this.syncPlayButton(); this.stopLoop() })\n    this.player.addEventListener(\"ended\", () => { this.playing = false; this.syncPlayButton(); this.stopLoop() })\n    window.addEventListener(\"resize\", this.onResize)\n    // The ayah picker above the steps changed ?ayah=: move to that ayah.\n    this.onAyahPicked = () => this.goToLinkedAyah()\n    window.addEventListener(\"segment-pipeline:ayah\", this.onAyahPicked)\n\n    // Lazy-load only when the tab actually becomes visible (the panel is\n    // display:none until selected, so the canvas has no width before that).\n    this.observer = new IntersectionObserver((entries) => {\n      if (entries.some((e) => e.isIntersecting)) this.load()\n    })\n    this.observer.observe(this.element)\n  }\n\n  disconnect() {\n    window.removeEventListener(\"segment-pipeline:ayah\", this.onAyahPicked)\n    this.stopLoop()\n    this.player.pause()\n    this.observer?.disconnect()\n    window.removeEventListener(\"resize\", this.onResize)\n  }\n\n  async load() {\n    if (this.loaded) return\n    this.loaded = true\n    try {\n      const response = await fetch(this.urlValue, { headers: { Accept: \"application/json\" } })\n      this.timeline = await response.json()\n    } catch (e) {\n      this.statusTarget.textContent = \"Could not load timeline data.\"\n      return\n    }\n    if (!this.timeline.words || this.timeline.words.length === 0) {\n      this.statusTarget.textContent = \"No timeline yet \u2014 run forced alignment first.\"\n      return\n    }\n\n    this.pps = this.fitPps()\n    this.sizeCanvas()\n    this.applyZoom()\n    this.statusTarget.textContent =\n      `${this.timeline.words.length} words \u00B7 ${this.timeline.ayahs.length} ayahs \u00B7 click to seek, scroll to pan, \u00B1 to zoom.`\n\n    try {\n      const ctx = new (window.AudioContext || window.webkitAudioContext)()\n      const bytes = await (await fetch(this.audioUrlValue)).arrayBuffer()\n      this.buffer = await ctx.decodeAudioData(bytes)\n    } catch (e) {\n      this.buffer = null // render tracks without the waveform\n    }\n    this.render()\n    this.goToLinkedAyah()\n  }\n\n  // --- geometry ------------------------------------------------------------\n\n  viewportWidth() {\n    return this.scrollTarget.clientWidth || 800\n  }\n\n  fitPps() {\n    return Math.max(this.viewportWidth() / (this.timeline.duration || 1), 2)\n  }\n\n  sizeCanvas() {\n    const canvas = this.canvasTarget\n    canvas.width = this.viewportWidth()\n    canvas.height = this.constructor.HEIGHT\n  }\n\n  applyZoom() {\n    this.spacerTarget.style.width = `${Math.ceil(this.timeline.duration * this.pps)}px`\n    this.spacerTarget.style.height = `${this.constructor.HEIGHT}px`\n    this.zoomLabelTarget.textContent = `${Math.round(this.pps)} px/s`\n  }\n\n  timeToX(t) {\n    return t * this.pps - this.scrollTarget.scrollLeft\n  }\n\n  xToTime(x) {\n    return (x + this.scrollTarget.scrollLeft) / this.pps\n  }\n\n  // --- interaction ---------------------------------------------------------\n\n  onResize() {\n    if (!this.timeline) return\n    this.sizeCanvas()\n    this.render()\n  }\n\n  onScroll() {\n    if (this.timeline) this.render()\n  }\n\n  // Seek and scroll to the ayah in ?ayah= (key \"2:76\" or number), once the\n  // timeline has loaded. Called on load and when the ayah picker changes.\n  goToLinkedAyah() {\n    const key = new URLSearchParams(window.location.search).get(\"ayah\")\n    if (!key || !this.timeline) return\n\n    const number = key.split(\":\").pop()\n    const ayah = this.timeline.ayahs.find((a) => String(a.number) === number)\n    if (!ayah || ayah.start == null) return\n\n    this.player.currentTime = ayah.start\n    this.scrollTarget.scrollLeft = Math.max(ayah.start * this.pps - this.viewportWidth() / 4, 0)\n    this.render()\n  }\n\n  zoomIn() { this.zoom(1.5) }\n  zoomOut() { this.zoom(1 / 1.5) }\n\n  zoom(factor) {\n    if (!this.timeline) return\n    const centerTime = this.xToTime(this.viewportWidth() / 2)\n    const min = this.fitPps() / 2\n    this.pps = Math.min(Math.max(this.pps * factor, min), 500)\n    this.applyZoom()\n    this.scrollTarget.scrollLeft = Math.max(centerTime * this.pps - this.viewportWidth() / 2, 0)\n    this.render()\n  }\n\n  seek(event) {\n    if (!this.timeline) return\n    const rect = this.canvasTarget.getBoundingClientRect()\n    this.player.currentTime = Math.max(this.xToTime(event.clientX - rect.left), 0)\n    this.render()\n  }\n\n  togglePlay() {\n    if (this.player.paused) this.player.play()\n    else this.player.pause()\n  }\n\n  syncPlayButton() {\n    this.playButtonTarget.textContent = this.player.paused ? \"\u25B6 Play\" : \"\u23F8 Pause\"\n  }\n\n  startLoop() {\n    this.stopLoop()\n    this.rafId = requestAnimationFrame(this.onFrame)\n  }\n\n  stopLoop() {\n    if (this.rafId) cancelAnimationFrame(this.rafId)\n    this.rafId = null\n  }\n\n  onFrame() {\n    this.followCursor()\n    this.render()\n    if (this.playing) this.rafId = requestAnimationFrame(this.onFrame)\n  }\n\n  followCursor() {\n    const x = this.timeToX(this.player.currentTime)\n    const vw = this.viewportWidth()\n    if (x < 0 || x > vw * 0.85) {\n      this.scrollTarget.scrollLeft = Math.max(this.player.currentTime * this.pps - vw * 0.2, 0)\n    }\n  }\n\n  // --- rendering -----------------------------------------------------------\n\n  render() {\n    if (!this.timeline) return\n    const canvas = this.canvasTarget\n    const vw = canvas.width\n    const ctx = canvas.getContext(\"2d\")\n    const B = this.constructor.BANDS\n    const C = this.constructor.COLORS\n    ctx.clearRect(0, 0, vw, canvas.height)\n\n    const t0 = this.xToTime(0)\n    const t1 = this.xToTime(vw)\n    const visible = (s, e) => e >= t0 && s <= t1\n\n    this.drawWaveform(ctx, vw, t0, t1)\n\n    // Ayah boundary lines through every track + ayah blocks.\n    ctx.textBaseline = \"middle\"\n    this.timeline.ayahs.forEach((ayah, i) => {\n      if (ayah.start == null || !visible(ayah.start, ayah.end)) return\n      const x = this.timeToX(ayah.start)\n      const w = (ayah.end - ayah.start) * this.pps\n\n      ctx.fillStyle = i % 2 === 0 ? \"rgba(99,102,241,0.06)\" : \"rgba(99,102,241,0.12)\"\n      ctx.fillRect(x, B.ayah[0], w, B.ayah[1] - B.ayah[0])\n      ctx.strokeStyle = C.ayahLine\n      ctx.lineWidth = 1\n      ctx.beginPath(); ctx.moveTo(x, B.wave[0]); ctx.lineTo(x, B.stt[1]); ctx.stroke()\n\n      ctx.fillStyle = ayah.overlap ? C.overlap : \"#4338ca\"\n      ctx.font = \"11px sans-serif\"\n      const label = ayah.overlap ? `${ayah.number} \u26A0` : `${ayah.number}`\n      ctx.fillText(label, x + 4, (B.ayah[0] + B.ayah[1]) / 2)\n    })\n\n    // Word track \u2014 one block per forced-align word, coloured by fix-step status.\n    this.timeline.words.forEach((word) => {\n      if (word.start == null || !visible(word.start, word.end)) return\n      const x = this.timeToX(word.start)\n      const w = Math.max((word.end - word.start) * this.pps, 1)\n      const color = C[word.status] || C.ok\n\n      ctx.fillStyle = color\n      ctx.globalAlpha = word.status === \"missed\" ? 0.45 : 0.85\n      ctx.fillRect(x, B.word[0], w, B.word[1] - B.word[0])\n      ctx.globalAlpha = 1\n\n      if (word.overlap) {\n        ctx.strokeStyle = C.overlap\n        ctx.lineWidth = 2\n        ctx.strokeRect(x + 1, B.word[0] + 1, w - 2, B.word[1] - B.word[0] - 2)\n      }\n\n      // Underline the slice of the ayah band that carries a fix-step issue.\n      if (word.status && word.status !== \"ok\") {\n        ctx.fillStyle = color\n        ctx.fillRect(x, B.ayah[1] - 3, w, 3)\n      }\n\n      if (w > 26) {\n        ctx.fillStyle = \"#111827\"\n        ctx.font = \"12px sans-serif\"\n        this.clippedText(ctx, word.text, x + 3, (B.word[0] + B.word[1]) / 2, w - 6)\n      }\n    })\n\n    // STT reference track.\n    ctx.fillStyle = C.stt\n    this.timeline.stt_words.forEach((word) => {\n      if (word.start == null || !visible(word.start, word.end)) return\n      const x = this.timeToX(word.start)\n      const w = Math.max((word.end - word.start) * this.pps, 1)\n      ctx.fillRect(x, B.stt[0], w, B.stt[1] - B.stt[0])\n    })\n\n    this.drawTrackLabels(ctx)\n    this.drawRuler(ctx, vw, t0, t1)\n    this.drawCursor(ctx, canvas.height)\n    this.updateClock()\n  }\n\n  drawWaveform(ctx, vw, t0, t1) {\n    const B = this.constructor.BANDS\n    const [top, bottom] = B.wave\n    const mid = (top + bottom) / 2\n    const half = (bottom - top) / 2\n\n    ctx.fillStyle = \"#f8fafc\"\n    ctx.fillRect(0, top, vw, bottom - top)\n    if (!this.buffer) return\n\n    const data = this.buffer.getChannelData(0)\n    const rate = this.buffer.sampleRate\n    ctx.strokeStyle = this.constructor.COLORS.wave\n    ctx.lineWidth = 1\n    ctx.beginPath()\n    for (let x = 0; x < vw; x++) {\n      const s = Math.floor(this.xToTime(x) * rate)\n      const e = Math.floor(this.xToTime(x + 1) * rate)\n      let min = 1.0, max = -1.0\n      for (let i = s; i < e; i++) {\n        const v = data[i] || 0\n        if (v < min) min = v\n        if (v > max) max = v\n      }\n      if (min > max) continue\n      ctx.moveTo(x + 0.5, mid + min * half)\n      ctx.lineTo(x + 0.5, mid + max * half)\n    }\n    ctx.stroke()\n  }\n\n  drawTrackLabels(ctx) {\n    const B = this.constructor.BANDS\n    ctx.font = \"bold 10px sans-serif\"\n    ctx.textBaseline = \"top\"\n    ;[[\"ayah\", \"AYAH\"], [\"word\", \"WORDS\"], [\"stt\", \"STT\"]].forEach(([key, label]) => {\n      // Draw on a translucent white pill so the label stays legible over the\n      // waveform / coloured blocks behind it.\n      const w = ctx.measureText(label).width\n      ctx.fillStyle = \"rgba(255,255,255,0.85)\"\n      ctx.fillRect(1, B[key][0] + 1, w + 6, 12)\n      ctx.fillStyle = \"#334155\"\n      ctx.fillText(label, 4, B[key][0] + 2)\n    })\n    ctx.textBaseline = \"middle\"\n  }\n\n  drawRuler(ctx, vw, t0, t1) {\n    const y = this.constructor.BANDS.ruler\n    const step = this.tickStep()\n    ctx.strokeStyle = \"#e2e8f0\"\n    ctx.fillStyle = \"#94a3b8\"\n    ctx.font = \"9px sans-serif\"\n    ctx.textBaseline = \"top\"\n    for (let t = Math.ceil(t0 / step) * step; t <= t1; t += step) {\n      const x = this.timeToX(t)\n      ctx.beginPath(); ctx.moveTo(x, y); ctx.lineTo(x, y + 6); ctx.stroke()\n      ctx.fillText(this.clock(t), x + 2, y + 6)\n    }\n    ctx.textBaseline = \"middle\"\n  }\n\n  tickStep() {\n    const target = 80 / this.pps // aim for a tick every ~80px\n    for (const s of [0.5, 1, 2, 5, 10, 15, 30, 60, 120, 300]) {\n      if (s >= target) return s\n    }\n    return 600\n  }\n\n  drawCursor(ctx, height) {\n    const x = this.timeToX(this.player.currentTime)\n    if (x < 0 || x > this.canvasTarget.width) return\n    ctx.strokeStyle = this.constructor.COLORS.cursor\n    ctx.lineWidth = 2\n    ctx.beginPath(); ctx.moveTo(x, 0); ctx.lineTo(x, height - 12); ctx.stroke()\n  }\n\n  clippedText(ctx, text, x, y, maxWidth) {\n    ctx.save()\n    ctx.beginPath()\n    ctx.rect(x, y - 8, maxWidth, 16)\n    ctx.clip()\n    ctx.fillText(text, x, y)\n    ctx.restore()\n  }\n\n  updateClock() {\n    this.timeTarget.textContent = `${this.clock(this.player.currentTime)} / ${this.clock(this.timeline.duration)}`\n  }\n\n  clock(seconds) {\n    const s = Math.max(Math.floor(seconds || 0), 0)\n    return `${Math.floor(s / 60)}:${String(s % 60).padStart(2, \"0\")}`\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\"\n\nconst COLORS = {\n  ayah: \"#5EEAD4\",\n  sequence: \"#0F766E\",\n  line: \"#FBBF24\",\n  lineOpacity: \"0.45\",\n  word: \"#7C3AED\",\n  search: \"#EA580C\",\n  diacriticHighlight: \"#2563EB\",\n  waqfHighlight: \"#C026D3\"\n}\n\nconst MARGIN_IDS = {\n  surah: \"md-non-quranic-header-surah-name\",\n  juz: \"md-non-quranic-header-juz-name\",\n  pageNumber: \"md-non-quranic-page-number\",\n  hizb: \"md-non-quranic-margin-juz-hisb\",\n  sajda: \"md-non-quranic-margin-sajda\"\n}\n\nexport default class extends Controller {\n  static targets = [\n    \"svgHost\",\n    \"wordInput\",\n    \"multiWordInput\",\n    \"searchInput\",\n    \"matchCount\",\n    \"ayahList\",\n    \"toolsPanel\",\n    \"toolsBackdrop\"\n  ]\n\n  connect() {\n    this.toolsOpen = false\n    this._onKeydown = this.onKeydown.bind(this)\n    window.addEventListener(\"keydown\", this._onKeydown)\n    this.svg = this.svgHostTarget.querySelector(\"svg\")\n    this.wordNodes = []\n    this.ayahWords = new Map()\n    this.blobCache = new WeakMap()\n    this._ayahClick = this.onAyahListClick.bind(this)\n\n    this.state = {\n      line: null,\n      ayah: null,\n      search: \"\",\n      wordIds: [],\n      showDiacritics: true,\n      highlightDiacritics: false,\n      showWaqf: true,\n      waqfHighlight: false,\n      margins: {\n        surah: true,\n        juz: true,\n        pageNumber: true,\n        hizb: true,\n        sajda: true\n      }\n    }\n\n    this.cache = {\n      original: new WeakMap(),\n      word: new Set(),\n      search: new Set(),\n      ayah: new Set(),\n      waqf: new Set()\n    }\n\n    this.sequence = {\n      timer: null,\n      words: [],\n      index: -1,\n      prevWord: null\n    }\n\n    if (this.svg) {\n      this.ensureOverlay()\n      this.indexWords()\n      this.buildAyahList()\n      if (this.hasAyahListTarget) {\n        this.ayahListTarget.addEventListener(\"click\", this._ayahClick)\n      }\n      this.refresh()\n    }\n    this.syncPanelUi()\n    this.refreshButtonLabels()\n  }\n\n  disconnect() {\n    window.removeEventListener(\"keydown\", this._onKeydown)\n    this.unlockBodyScroll()\n    this.stopSequence(false)\n    if (this.hasAyahListTarget) {\n      this.ayahListTarget.removeEventListener(\"click\", this._ayahClick)\n    }\n  }\n\n  onKeydown(e) {\n    if (e.key === \"Escape\" && this.toolsOpen) {\n      e.preventDefault()\n      this.closeToolsPanel()\n    }\n  }\n\n  openCustomizePanel() {\n    this.setToolsOpen(true)\n  }\n\n  closeToolsPanel() {\n    this.setToolsOpen(false)\n  }\n\n  setToolsOpen(open) {\n    this.toolsOpen = open\n    this.syncPanelUi()\n  }\n\n  syncPanelUi() {\n    const tools = this.toolsOpen\n\n    if (this.hasToolsPanelTarget) {\n      const p = this.toolsPanelTarget\n      p.hidden = !tools\n      p.classList.toggle(\"translate-x-full\", !tools)\n      p.classList.toggle(\"translate-x-0\", tools)\n      p.classList.toggle(\"pointer-events-none\", !tools)\n      p.classList.toggle(\"pointer-events-auto\", tools)\n      p.setAttribute(\"aria-hidden\", tools ? \"false\" : \"true\")\n    }\n\n    if (this.hasToolsBackdropTarget) {\n      const b = this.toolsBackdropTarget\n      b.classList.toggle(\"opacity-0\", !tools)\n      b.classList.toggle(\"invisible\", !tools)\n      b.classList.toggle(\"pointer-events-none\", !tools)\n      b.setAttribute(\"aria-hidden\", tools ? \"false\" : \"true\")\n    }\n\n    if (tools) {\n      this.lockBodyScroll()\n    } else {\n      this.unlockBodyScroll()\n    }\n  }\n\n  lockBodyScroll() {\n    if (typeof window !== \"undefined\" && window.matchMedia(\"(max-width: 1023px)\").matches) {\n      document.body.style.overflow = \"hidden\"\n    }\n  }\n\n  unlockBodyScroll() {\n    document.body.style.overflow = \"\"\n  }\n\n  scrollMushafIntoView() {\n    if (!this.hasSvgHostTarget) return\n    requestAnimationFrame(() => {\n      requestAnimationFrame(() => {\n        this.svgHostTarget.scrollIntoView({\n          behavior: \"smooth\",\n          block: \"center\",\n          inline: \"nearest\"\n        })\n      })\n    })\n  }\n\n  toggleState(event) {\n    const key = event.params?.key || event.currentTarget?.dataset?.key\n    if (key == null || this.state[key] === undefined) return\n    this.state[key] = !this.state[key]\n    this.refresh()\n  }\n\n  stopSequenceClick() {\n    this.stopSequence(true)\n  }\n\n  toggleMargin(e) {\n    const k = e.currentTarget.dataset.marginKey\n    if (!k || this.state.margins[k] === undefined) return\n    this.state.margins[k] = !this.state.margins[k]\n    this.applyMargins()\n    this.refreshButtonLabels()\n  }\n\n  onAyahListClick(e) {\n    const btn = e.target.closest(\"[data-surah][data-ayah]\")\n    if (!btn) return\n    const surah = Number(btn.dataset.surah)\n    const ayah = Number(btn.dataset.ayah)\n    this.applyAyahSelection(surah, ayah)\n  }\n\n  applyAyahSelection(surah, ayah) {\n    this.stopSequence(false)\n    const same =\n      this.state.ayah &&\n      this.state.ayah.surah === surah &&\n      this.state.ayah.ayah === ayah\n    this.state.ayah = same ? null : { surah, ayah }\n    this.refresh()\n    if (this.state.ayah) {\n      this.startSequence(this.state.ayah.surah, this.state.ayah.ayah)\n    }\n    this.scrollMushafIntoView()\n  }\n\n  selectLine(e) {\n    const n = Number(e.currentTarget.dataset.line)\n    this.state.line = this.state.line === n ? null : n\n    this.refresh()\n    this.scrollMushafIntoView()\n  }\n\n  applyLine() {\n    if (!this.state.line) return\n    const id = `md-line-${String(this.state.line).padStart(2, \"0\")}`\n    const node = this.svg.getElementById(id)\n    if (!node) return\n    const box = node.getBBox()\n    const rect = document.createElementNS(SVG_NS, \"rect\")\n    rect.setAttribute(\"x\", String(box.x - 1.5))\n    rect.setAttribute(\"y\", String(box.y - 1.5))\n    rect.setAttribute(\"width\", String(box.width + 3))\n    rect.setAttribute(\"height\", String(box.height + 3))\n    rect.setAttribute(\"rx\", \"2\")\n    rect.setAttribute(\"fill\", COLORS.line)\n    rect.setAttribute(\"fill-opacity\", COLORS.lineOpacity)\n    rect.setAttribute(\"pointer-events\", \"none\")\n    this.overlay.appendChild(rect)\n  }\n\n  ayahAttr(w) {\n    return w.getAttribute(\"data-aya\") || w.getAttribute(\"data-ayah\")\n  }\n\n  ayahKey(surah, ayah) {\n    const s = String(Number(surah)).padStart(3, \"0\")\n    const a = String(Number(ayah)).padStart(3, \"0\")\n    return `${s}|${a}`\n  }\n\n  indexWords() {\n    this.wordNodes = this.words()\n    this.ayahWords.clear()\n    for (const w of this.wordNodes) {\n      const s = w.getAttribute(\"data-surah\")\n      const a = this.ayahAttr(w)\n      if (!s || a == null || a === \"\") continue\n      const key = this.ayahKey(s, a)\n      if (!this.ayahWords.has(key)) this.ayahWords.set(key, [])\n      this.ayahWords.get(key).push(w)\n    }\n    for (const [, list] of this.ayahWords) {\n      list.sort(\n        (a, b) =>\n          Number(a.getAttribute(\"data-word-index-in-ayah\") || 0) -\n          Number(b.getAttribute(\"data-word-index-in-ayah\") || 0)\n      )\n    }\n  }\n\n  wordsForAyah(surah, ayah) {\n    return this.ayahWords.get(this.ayahKey(surah, ayah)) || []\n  }\n\n  buildAyahList() {\n    if (!this.hasAyahListTarget) return\n    const rows = []\n    const keys = [...this.ayahWords.keys()].sort((a, b) => {\n      const [as, aa] = a.split(\"|\").map(Number)\n      const [bs, ba] = b.split(\"|\").map(Number)\n      return as !== bs ? as - bs : aa - ba\n    })\n    for (const key of keys) {\n      const [surah, ayah] = key.split(\"|\")\n      const label = `${Number(surah)}:${Number(ayah)}`\n      rows.push(\n        `<button type=\"button\" class=\"rounded-lg border border-slate-200 bg-white px-2.5 py-1.5 text-xs font-medium text-slate-700 hover:bg-slate-50 min-w-[3rem]\" data-surah=\"${surah}\" data-ayah=\"${ayah}\">${label}</button>`\n      )\n    }\n    this.ayahListTarget.innerHTML = rows.join(\"\")\n  }\n\n  applyAyah() {\n    if (!this.state.ayah) return\n    const words = this.wordsForAyah(this.state.ayah.surah, this.state.ayah.ayah)\n    for (const w of words) {\n      this.paint(w, COLORS.ayah, this.cache.ayah)\n    }\n  }\n\n  highlightWord() {\n    const raw = this.wordInputTarget.value.trim()\n    if (!raw) return\n    const id = raw.replace(/^md-word-/, \"\").padStart(3, \"0\")\n    this.state.wordIds = [id]\n    this.refresh()\n    this.scrollMushafIntoView()\n  }\n\n  highlightMultipleWords() {\n    const raw = this.multiWordInputTarget?.value || \"\"\n    const ids = raw\n      .split(\",\")\n      .map(s => s.trim())\n      .filter(Boolean)\n      .map(id => id.replace(/^md-word-/, \"\").padStart(3, \"0\"))\n    this.state.wordIds = ids\n    this.refresh()\n    this.scrollMushafIntoView()\n  }\n\n  applyWordHighlights() {\n    for (const id of this.state.wordIds) {\n      const node = this.svg.getElementById(`md-word-${id}`)\n      if (node) this.paint(node, COLORS.word, this.cache.word)\n    }\n  }\n\n  search() {\n    this.state.search = this.normalize(this.searchInputTarget.value)\n    this.refreshSearchOnly()\n    this.scrollMushafIntoView()\n  }\n\n  clearSearch() {\n    this.state.search = \"\"\n    if (this.hasSearchInputTarget) this.searchInputTarget.value = \"\"\n    for (const p of this.cache.search) {\n      this.restore(p)\n    }\n    this.cache.search.clear()\n    if (this.hasMatchCountTarget) this.matchCountTarget.textContent = \"\"\n  }\n\n  refreshSearchOnly() {\n    for (const p of this.cache.search) {\n      this.restore(p)\n    }\n    this.cache.search.clear()\n    this.applySearch()\n  }\n\n  applySearch() {\n    if (!this.state.search) {\n      if (this.hasMatchCountTarget) this.matchCountTarget.textContent = \"\"\n      return\n    }\n    const q = this.state.search\n    const tokens = q.split(/\\s+/).filter(Boolean)\n    let count = 0\n    const list = this.wordNodes\n\n    if (tokens.length === 1) {\n      const t = tokens[0]\n      for (const w of list) {\n        if (this.wordBlob(w).includes(t)) {\n          this.paint(w, COLORS.search, this.cache.search)\n          count++\n        }\n      }\n    } else {\n      const n = tokens.length\n      for (let i = 0; i <= list.length - n; i++) {\n        let ok = true\n        for (let j = 0; j < n; j++) {\n          if (this.wordBlob(list[i + j]) !== tokens[j]) {\n            ok = false\n            break\n          }\n        }\n        if (ok) {\n          count++\n          for (let j = 0; j < n; j++) {\n            this.paint(list[i + j], COLORS.search, this.cache.search)\n          }\n        }\n      }\n    }\n\n    if (this.hasMatchCountTarget) {\n      this.matchCountTarget.textContent = count ? `${count} matches` : \"0 matches\"\n    }\n  }\n\n  wordBlob(w) {\n    if (this.blobCache.has(w)) return this.blobCache.get(w)\n    const hafs = w.getAttribute(\"data-hafs\") || \"\"\n    const imlaey = w.getAttribute(\"data-imlaey\") || \"\"\n    let text = \"\"\n    w.querySelectorAll(\"path[data-text]\").forEach(p => {\n      text += \" \" + (p.getAttribute(\"data-text\") || \"\")\n    })\n    const blob = this.normalize(`${hafs} ${imlaey} ${text}`)\n    this.blobCache.set(w, blob)\n    return blob\n  }\n\n  applyDiacritics() {\n    const sel = \"path[data-type='diacritic']\"\n    this.svg.querySelectorAll(sel).forEach(p => {\n      this.capture(p)\n      p.style.display = this.state.showDiacritics ? \"\" : \"none\"\n      if (this.state.highlightDiacritics && this.state.showDiacritics) {\n        p.style.fill = COLORS.diacriticHighlight\n      } else {\n        this.restoreFill(p)\n      }\n    })\n  }\n\n  applyMargins() {\n    for (const [marginKey, id] of Object.entries(MARGIN_IDS)) {\n      const el = this.svg.getElementById(id)\n      if (!el) continue\n      this.capture(el)\n      el.style.display = this.state.margins[marginKey] ? \"\" : \"none\"\n    }\n  }\n\n  waqfNodes() {\n    return this.svg.querySelectorAll(\n      \"path[data-type='waqf'], g[data-type='waqf'], path[data-waqf], g[data-waqf]\"\n    )\n  }\n\n  startSequence(surah, ayah) {\n    this.stopSequence(false)\n    const words = this.wordsForAyah(surah, ayah)\n    if (!words.length) return\n    this.sequence.words = words\n    this.sequence.index = 0\n    this.sequence.prevWord = null\n    this.advanceSequenceFrame(true)\n    this.sequence.timer = window.setInterval(() => {\n      this.sequence.index++\n      if (this.sequence.index >= this.sequence.words.length) {\n        this.stopSequence(true)\n        return\n      }\n      this.advanceSequenceFrame(false)\n    }, 1000)\n  }\n\n  advanceSequenceFrame(isFirst) {\n    const words = this.sequence.words\n    const i = this.sequence.index\n    if (!isFirst && this.sequence.prevWord) {\n      this.paint(this.sequence.prevWord, COLORS.ayah, this.cache.ayah)\n    }\n    const w = words[i]\n    this.paint(w, COLORS.sequence, this.cache.ayah)\n    this.sequence.prevWord = w\n  }\n\n  stopSequence(runRefresh = false) {\n    if (this.sequence.timer) {\n      window.clearInterval(this.sequence.timer)\n      this.sequence.timer = null\n    }\n    this.sequence.words = []\n    this.sequence.index = -1\n    this.sequence.prevWord = null\n    if (runRefresh) this.refresh()\n  }\n\n  refresh() {\n    if (!this.svg) return\n    this.clearVisualLayers()\n    this.applyMargins()\n    this.applyDiacritics()\n    this.applyWaqfLayer()\n    this.applyLine()\n    this.applyAyah()\n    this.applyWordHighlights()\n    this.applySearch()\n    this.refreshButtonLabels()\n  }\n\n  applyWaqfLayer() {\n    for (const p of this.cache.waqf) {\n      this.restore(p)\n    }\n    this.cache.waqf.clear()\n    const nodes = [...this.waqfNodes()]\n    for (const node of nodes) {\n      this.capture(node)\n      node.style.display = this.state.showWaqf ? \"\" : \"none\"\n    }\n    if (this.state.waqfHighlight && this.state.showWaqf) {\n      for (const node of nodes) {\n        const paths =\n          node.tagName === \"path\" ? [node] : [...node.querySelectorAll(\"path\")]\n        for (const p of paths) {\n          this.capture(p)\n          p.style.fill = COLORS.waqfHighlight\n          this.cache.waqf.add(p)\n        }\n      }\n    }\n  }\n\n  clearVisualLayers() {\n    for (const p of this.cache.word) {\n      this.restore(p)\n    }\n    this.cache.word.clear()\n\n    for (const p of this.cache.ayah) {\n      this.restore(p)\n    }\n    this.cache.ayah.clear()\n\n    for (const p of this.cache.search) {\n      this.restore(p)\n    }\n    this.cache.search.clear()\n\n    while (this.overlay && this.overlay.firstChild) {\n      this.overlay.removeChild(this.overlay.firstChild)\n    }\n  }\n\n  words() {\n    return Array.from(this.svg.querySelectorAll('g[id^=\"md-word-\"]'))\n  }\n\n  paint(group, color, set) {\n    group.querySelectorAll(\"path\").forEach(p => {\n      this.capture(p)\n      p.style.fill = color\n      set.add(p)\n    })\n  }\n\n  capture(node) {\n    if (this.cache.original.has(node)) return\n    this.cache.original.set(node, {\n      fill: node.style.fill || \"\",\n      display: node.style.display || \"\"\n    })\n  }\n\n  restore(node) {\n    const o = this.cache.original.get(node)\n    if (!o) return\n    node.style.fill = o.fill\n    node.style.display = o.display\n  }\n\n  restoreFill(node) {\n    const o = this.cache.original.get(node)\n    if (!o) return\n    node.style.fill = o.fill\n  }\n\n  refreshButtonLabels() {\n    this.element.querySelectorAll(\"[data-key]\").forEach(button => {\n      const key = button.dataset.key\n      if (!key || this.state[key] === undefined) return\n      const onLabel = button.dataset.onLabel\n      const offLabel = button.dataset.offLabel\n      if (!onLabel || !offLabel) return\n      button.textContent = this.state[key] ? onLabel : offLabel\n    })\n\n    this.element.querySelectorAll(\"[data-margin-key]\").forEach(button => {\n      const key = button.dataset.marginKey\n      if (!key || this.state.margins[key] === undefined) return\n      const onLabel = button.dataset.onLabel\n      const offLabel = button.dataset.offLabel\n      if (!onLabel || !offLabel) return\n      button.textContent = this.state.margins[key] ? onLabel : offLabel\n    })\n  }\n\n  normalize(s) {\n    return (s || \"\")\n      .normalize(\"NFC\")\n      .toLowerCase()\n      .trim()\n      .replace(/\\s+/g, \" \")\n  }\n\n  ensureOverlay() {\n    const host = this.svg.querySelector(\"#md-page-inner\") || this.svg\n    let g = this.svg.querySelector(\"#md-line-overlay\")\n    if (!g) {\n      g = document.createElementNS(SVG_NS, \"g\")\n      g.setAttribute(\"id\", \"md-line-overlay\")\n      g.setAttribute(\"pointer-events\", \"none\")\n      host.appendChild(g)\n    }\n    this.overlay = g\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n// Gallery for an SVG artwork resource: fetches each file from the CDN and\n// inlines it, so the size and colour controls actually reach the artwork.\nexport default class extends Controller {\n  static targets = [\"grid\", \"search\", \"sizeSlider\", \"sizeValue\", \"colour\", \"count\"]\n\n  static values = {\n    urls: Array\n  }\n\n  connect() {\n    this.rendered = false\n    this.searchTimer = null\n    this.updateCount()\n    this.showGallery()\n  }\n\n  disconnect() {\n    clearTimeout(this.searchTimer)\n  }\n\n  showGallery() {\n    if (this.rendered) return\n    this.rendered = true\n\n    this.urlsValue.forEach((url) => this.gridTarget.appendChild(this.buildCard(url)))\n    this.updateSize()\n    this.updateColour()\n  }\n\n  buildCard(url) {\n    const label = url.split(\"/\").pop().replace(/\\.svg$/, \"\")\n\n    const card = document.createElement(\"button\")\n    card.type = \"button\"\n    card.className = \"svg-card\"\n    card.dataset.svgName = label.toLowerCase()\n    card.dataset.svgUrl = url\n    card.title = `Copy ${url}`\n    card.addEventListener(\"click\", () => this.copyUrl(card))\n\n    const art = document.createElement(\"div\")\n    art.className = \"svg-card-art\"\n    card.appendChild(art)\n\n    const name = document.createElement(\"span\")\n    name.className = \"svg-card-name\"\n    name.textContent = label\n    card.appendChild(name)\n\n    this.loadInto(art, url, label)\n\n    return card\n  }\n\n  async loadInto(container, url, label) {\n    try {\n      const response = await fetch(url)\n      if (!response.ok) throw new Error(`HTTP ${response.status}`)\n\n      const markup = await response.text()\n      const svg = new DOMParser().parseFromString(markup, \"image/svg+xml\").documentElement\n\n      if (svg.nodeName.toLowerCase() !== \"svg\") throw new Error(\"not an SVG\")\n\n      // Let CSS drive the size; the viewBox keeps the aspect ratio.\n      svg.removeAttribute(\"width\")\n      svg.removeAttribute(\"height\")\n      container.appendChild(svg)\n    } catch (error) {\n      container.textContent = \"\u2014\"\n      container.title = `Could not load ${label}: ${error.message}`\n    }\n  }\n\n  filter() {\n    clearTimeout(this.searchTimer)\n    this.searchTimer = setTimeout(() => this.applyFilter(), 150)\n  }\n\n  applyFilter() {\n    const term = (this.hasSearchTarget ? this.searchTarget.value : \"\").trim().toLowerCase()\n\n    this.cards().forEach((card) => {\n      card.hidden = term !== \"\" && !card.dataset.svgName.includes(term)\n    })\n\n    this.updateCount()\n  }\n\n  updateSize() {\n    if (!this.hasSizeSliderTarget) return\n\n    const size = Number(this.sizeSliderTarget.value)\n    this.element.style.setProperty(\"--svg-card-height\", `${size}px`)\n    if (this.hasSizeValueTarget) this.sizeValueTarget.textContent = `${size}px`\n  }\n\n  updateColour() {\n    if (!this.hasColourTarget) return\n\n    this.element.style.setProperty(\"--svg-card-colour\", this.colourTarget.value)\n  }\n\n  updateBackground(event) {\n    this.element.style.setProperty(\"--svg-card-bg\", event.target.value)\n  }\n\n  async copyUrl(card) {\n    const copied = await this.copyToClipboard(card.dataset.svgUrl)\n    if (copied) this.flash(card)\n  }\n\n  flash(card) {\n    card.classList.add(\"svg-card-copied\")\n    clearTimeout(card._svgCopyTimer)\n    card._svgCopyTimer = setTimeout(() => card.classList.remove(\"svg-card-copied\"), 900)\n  }\n\n  // The Clipboard API is not just missing on older browsers, it also rejects\n  // when the page is not focused or the permission is denied \u2014 fall back to\n  // the textarea trick in both cases.\n  async copyToClipboard(text) {\n    if (navigator.clipboard?.writeText) {\n      try {\n        await navigator.clipboard.writeText(text)\n        return true\n      } catch (error) {\n        // fall through\n      }\n    }\n\n    const element = document.createElement(\"textarea\")\n    element.value = text\n    element.style.position = \"fixed\"\n    element.style.opacity = \"0\"\n    document.body.appendChild(element)\n    element.select()\n\n    try {\n      return document.execCommand(\"copy\")\n    } catch (error) {\n      return false\n    } finally {\n      element.remove()\n    }\n  }\n\n  cards() {\n    return Array.from(this.gridTarget.querySelectorAll(\".svg-card\"))\n  }\n\n  updateCount() {\n    if (!this.hasCountTarget) return\n\n    const total = this.urlsValue.length\n    const visible = this.rendered ? this.cards().filter((card) => !card.hidden).length : total\n    this.countTarget.textContent = visible === total ? `${total} images` : `${visible} of ${total}`\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  static targets = [\"container\"];\n  static values = {\n    graphData: Object,\n    theme: Object,\n    url: String,\n    filename: String,\n  };\n  connect() {\n    if (this.hasUrlValue) {\n      this.loadGraphData();\n    } else if (this.graphDataValue) {\n      this.renderSyntaxGraph();\n    }\n\n    this.refreshHandler = () => this.refresh();\n    window.addEventListener(\"refresh-graph-preview\", this.refreshHandler);\n  }\n\n  disconnect() {\n    if (this.refreshHandler) {\n      window.removeEventListener(\"refresh-graph-preview\", this.refreshHandler);\n    }\n  }\n\n  refresh() {\n    if (this.hasUrlValue) {\n      this.loadGraphData();\n    }\n  }\n\n  async loadGraphData() {\n    try {\n      this.containerTarget.textContent = \"Loading syntax graph...\";\n      const res = await fetch(this.urlValue, {\n        headers: { Accept: \"application/json\" },\n      });\n      if (!res.ok) throw new Error(`HTTP ${res.status}`);\n      const data = await res.json();\n      this.graphDataValue = data;\n      this.renderSyntaxGraph();\n    } catch (error) {\n      console.error(\"Failed to load syntax graph:\", error);\n      this.containerTarget.innerHTML =\n        '<div class=\"error\">Failed to load syntax graph</div>';\n    }\n  }\n  async renderSyntaxGraph() {\n    try {\n      const visualizer = new SyntaxGraphVisualizer(\n        this.graphDataValue,\n        this.getTheme()\n      );\n      const svg = await visualizer.renderGraph();\n      this.containerTarget.innerHTML = \"\";\n      this.containerTarget.appendChild(svg);\n    } catch (error) {\n      console.error(\"Error rendering syntax graph:\", error);\n      this.containerTarget.innerHTML =\n        '<div class=\"error\">Error rendering syntax graph</div>';\n    }\n  }\n\n  getTheme() {\n    const defaultTheme = {\n      fonts: {\n        defaultFont: { family: \"Helvetica Neue, Arial, sans-serif\" },\n        defaultArabicFont: {\n          family: \"qpc-hafs\",\n        },\n        elidedWordFont: { family: \"Arial, sans-serif\" },\n      },\n      syntaxGraphTokenFontSize: 34,\n      syntaxGraphTagFontSize: 15,\n      syntaxGraphHeaderFontSize: 10,\n      syntaxGraphElidedWordFontSize: 22,\n      syntaxGraphEdgeLabelFontSize: 15,\n      syntaxGraphHeaderTextDeltaY: 15,\n      syntaxGraphPosTagGap: 25,\n      syntaxGraphBracketDeltaY: 16,\n      syntaxGraphWordGap: 63,\n      syntaxGraphHeaderExtraGap: 25,\n      syntaxGraphPosTagYOffset: 65,\n    };\n\n    const savedSettings = this.loadSavedSettings();\n\n    let theme = { ...defaultTheme };\n\n    if (savedSettings) {\n      theme = {\n        ...theme,\n        ...savedSettings,\n        fonts: {\n          ...theme.fonts,\n          ...(savedSettings.fonts || {}),\n        },\n      };\n    }\n\n    if (this.themeValue && Object.keys(this.themeValue).length > 0) {\n      theme = {\n        ...theme,\n        ...this.themeValue,\n        fonts: {\n          ...theme.fonts,\n          ...(this.themeValue.fonts || {}),\n        },\n      };\n    }\n    return theme;\n  }\n\n  loadSavedSettings() {\n    try {\n      const params = new URLSearchParams(window.location.search);\n\n      const getInt = (key) => {\n        const value = parseInt(params.get(key), 10);\n        return Number.isNaN(value) ? null : value;\n      };\n\n      const settings = {};\n\n      const tokenSize = getInt(\"syntaxGraphTokenFontSize\");\n      if (tokenSize !== null) settings.syntaxGraphTokenFontSize = tokenSize;\n\n      const tagSize = getInt(\"syntaxGraphTagFontSize\");\n      if (tagSize !== null) settings.syntaxGraphTagFontSize = tagSize;\n\n      const headerSize = getInt(\"syntaxGraphHeaderFontSize\");\n      if (headerSize !== null) settings.syntaxGraphHeaderFontSize = headerSize;\n\n      const elidedSize = getInt(\"syntaxGraphElidedWordFontSize\");\n      if (elidedSize !== null)\n        settings.syntaxGraphElidedWordFontSize = elidedSize;\n\n      const edgeSize = getInt(\"syntaxGraphEdgeLabelFontSize\");\n      if (edgeSize !== null) settings.syntaxGraphEdgeLabelFontSize = edgeSize;\n\n      const headerDeltaY = getInt(\"syntaxGraphHeaderTextDeltaY\");\n      if (headerDeltaY !== null)\n        settings.syntaxGraphHeaderTextDeltaY = headerDeltaY;\n\n      const posTagGap = getInt(\"syntaxGraphPosTagGap\");\n      if (posTagGap !== null) settings.syntaxGraphPosTagGap = posTagGap;\n\n      const bracketDeltaY = getInt(\"syntaxGraphBracketDeltaY\");\n      if (bracketDeltaY !== null)\n        settings.syntaxGraphBracketDeltaY = bracketDeltaY;\n\n      const wordGap = getInt(\"syntaxGraphWordGap\");\n      if (wordGap !== null) settings.syntaxGraphWordGap = wordGap;\n\n      const headerExtraGap = getInt(\"syntaxGraphHeaderExtraGap\");\n      if (headerExtraGap !== null)\n        settings.syntaxGraphHeaderExtraGap = headerExtraGap;\n\n      const posTagYOffset = getInt(\"syntaxGraphPosTagYOffset\");\n      if (posTagYOffset !== null)\n        settings.syntaxGraphPosTagYOffset = posTagYOffset;\n\n      const fonts = {};\n      const defaultFont = params.get(\"defaultFont\");\n      if (defaultFont) fonts.defaultFont = { family: defaultFont };\n\n      const defaultArabicFont = params.get(\"defaultArabicFont\");\n      if (defaultArabicFont)\n        fonts.defaultArabicFont = { family: defaultArabicFont };\n\n      const elidedWordFont = params.get(\"elidedWordFont\");\n      if (elidedWordFont) fonts.elidedWordFont = { family: elidedWordFont };\n\n      if (Object.keys(fonts).length > 0) {\n        settings.fonts = fonts;\n      }\n\n      if (Object.keys(settings).length === 0) return null;\n\n      return settings;\n    } catch (e) {\n      console.warn(\"Failed to load saved graph settings:\", e);\n      return null;\n    }\n  }\n}\nclass SyntaxGraphVisualizer {\n  constructor(syntaxGraph, theme) {\n    this.syntaxGraph = syntaxGraph;\n    this.syntaxGraph.segmentNodeCount = syntaxGraph.words.reduce(\n      (sum, word) => sum + (word.endNode - word.startNode + 1),\n      0\n    );\n    this.theme = theme;\n    this.colorService = new ColorService();\n    this.heightMap = new HeightMap();\n    this.phraseLayouts = [];\n    this.nodePositions = [];\n\n    this.arabicTerms = new Map([\n      [\"adj\", \"\u0635\u0641\u0629\"],\n      [\"amd\", \"\u0627\u0633\u062A\u062F\u0631\u0627\u0643\"],\n      [\"ans\", \"\u062C\u0648\u0627\u0628\"],\n      [\"app\", \"\u0628\u062F\u0644\"],\n      [\"avr\", \"\u0631\u062F\u0639\"],\n      [\"caus\", \"\u0633\u0628\u0628\u064A\u0629\"],\n      [\"cert\", \"\u062A\u062D\u0642\u064A\u0642\"],\n      [\"circ\", \"\u062D\u0627\u0644\"],\n      [\"cog\", \"\u0645\u0641\u0639\u0648\u0644 \u0645\u0637\u0644\u0642\"],\n      [\"com\", \"\u0645\u0641\u0639\u0648\u0644 \u0645\u0639\u0647\"],\n      [\"cond\", \"\u0634\u0631\u0637\"],\n      [\"conj\", \"\u0645\u0639\u0637\u0648\u0641\"],\n      [\"cpnd\", \"\u0645\u0631\u0643\u0628\"],\n      [\"emph\", \"\u062A\u0648\u0643\u064A\u062F\"],\n      [\"eq\", \"\u062A\u0633\u0648\u064A\u0629\"],\n      [\"exh\", \"\u062A\u062D\u0636\u064A\u0636\"],\n      [\"exl\", \"\u062A\u0641\u0635\u064A\u0644\"],\n      [\"exp\", \"\u0645\u0633\u062A\u062B\u0646\u064A\"],\n      [\"fut\", \"\u0627\u0633\u062A\u0642\u0628\u0627\u0644\"],\n      [\"gen\", \"\u0645\u062C\u0631\u0648\u0631\"],\n      [\"impv\", \"\u0623\u0645\u0631\"],\n      [\"imrs\", \"\u062C\u0648\u0627\u0628 \u0623\u0645\u0631\"],\n      [\"inc\", \"\u0627\u0628\u062A\u062F\u0627\u0621\"],\n      [\"int\", \"\u062A\u0641\u0633\u064A\u0631\"],\n      [\"intg\", \"\u0627\u0633\u062A\u0641\u0647\u0627\u0645\"],\n      [\"link\", \"\u0645\u062A\u0639\u0644\u0642\"],\n      [\"neg\", \"\u0646\u0641\u064A\"],\n      [\"obj\", \"\u0645\u0641\u0639\u0648\u0644 \u0628\u0647\"],\n      [\"pass\", \"\u0646\u0627\u0626\u0628 \u0641\u0627\u0639\u0644\"],\n      [\"poss\", \"\u0645\u0636\u0627\u0641 \u0625\u0644\u064A\u0647\"],\n      [\"pred\", \"\u062E\u0628\u0631\"],\n      [\"prev\", \"\u0643\u0627\u0641\"],\n      [\"pro\", \"\u0646\u0647\u064A\"],\n      [\"prp\", \"\u0645\u0641\u0639\u0648\u0644 \u0644\u0623\u062C\u0644\u0647\"],\n      [\"res\", \"\u062D\u0635\u0631\"],\n      [\"ret\", \"\u0627\u0636\u0631\u0627\u0628\"],\n      [\"rslt\", \"\u062C\u0648\u0627\u0628 \u0634\u0631\u0637\"],\n      [\"spec\", \"\u062A\u0645\u064A\u064A\u0632\"],\n      [\"sub\", \"\u0635\u0644\u0629\"],\n      [\"subj\", \"\u0641\u0627\u0639\u0644\"],\n      [\"sup\", \"\u0632\u0627\u0626\u062F\"],\n      [\"sur\", \"\u0641\u062C\u0627\u0621\u0629\"],\n      [\"voc\", \"\u0645\u0646\u0627\u062F\u064A\"],\n    ]);\n\n    this.subject = \"\u0627\u0633\u0645\";\n    this.predicate = \"\u062E\u0628\u0631\";\n  }\n\n  getLabelFont() {\n    return this.syntaxGraph.locale === 'ar'\n      ? this.theme.fonts.defaultArabicFont\n      : this.theme.fonts.defaultFont;\n  }\n\n  grammarTermUrl(category, term) {\n    const locale = this.syntaxGraph.locale || 'en';\n    return `/morphology/grammar/${encodeURIComponent(category)}/${encodeURIComponent(term)}?locale=${encodeURIComponent(locale)}`;\n  }\n\n  async renderGraph() {\n    await this.loadFonts();\n    const layout = this.layoutGraph();\n    return this.renderSVG(layout);\n  }\n\n  async loadFonts() {\n    const fonts = [\n      this.theme.fonts.defaultFont.family,\n      this.theme.fonts.defaultArabicFont.family,\n      this.theme.fonts.elidedWordFont.family,\n    ];\n\n    for (const fontFamily of fonts) {\n      try {\n        const style = `1em ${fontFamily}`;\n        await document.fonts.load(style);\n        const loaded = document.fonts.check(style);\n        if (!loaded) {\n          console.warn(`Failed to load font ${fontFamily}`);\n        }\n      } catch (error) {\n        console.warn(`Error loading font ${fontFamily}:`, error);\n      }\n    }\n  }\n\n  layoutGraph() {\n    const { words } = this.syntaxGraph;\n\n    // Create temporary SVG for text measurement\n    const tempSvg = document.createElementNS(\n      \"http://www.w3.org/2000/svg\",\n      \"svg\"\n    );\n    tempSvg.style.position = \"absolute\";\n    tempSvg.style.visibility = \"hidden\";\n    document.body.appendChild(tempSvg);\n    const wordLayouts = words.map((word, i) => {\n      const brackets = this.brackets(word);\n      return {\n        location: this.createBox(\n          word.token ? word.token.location || \"\" : \"\",\n          tempSvg,\n          this.theme.fonts.defaultFont,\n          this.theme.syntaxGraphHeaderFontSize\n        ),\n        phonetic: this.createBox(\n          word.token ? word.token.phonetic || \"\" : \"\",\n          tempSvg,\n          this.theme.fonts.defaultFont,\n          this.theme.syntaxGraphHeaderFontSize\n        ),\n        translation: this.createBox(\n          word.token ? word.token.translation || \"\" : \"\",\n          tempSvg,\n          this.theme.fonts.defaultFont,\n          this.theme.syntaxGraphHeaderFontSize\n        ),\n        bra: brackets\n          ? this.createBox(\n              \")\",\n              tempSvg,\n              this.theme.fonts.elidedWordFont,\n              this.theme.syntaxGraphElidedWordFontSize\n            )\n          : undefined,\n        token: this.createBox(\n          this.getTokenText(word),\n          tempSvg,\n          this.theme.fonts.defaultArabicFont,\n          this.theme.syntaxGraphTokenFontSize\n        ),\n        ket: brackets\n          ? this.createBox(\n              \")\",\n              tempSvg,\n              this.theme.fonts.elidedWordFont,\n              this.theme.syntaxGraphElidedWordFontSize\n            )\n          : undefined,\n        nodeCircles: [],\n        posTags: this.getPosTagTexts(word).map((text) =>\n          this.createBox(\n            text,\n            tempSvg,\n            this.getLabelFont(),\n            this.theme.syntaxGraphTagFontSize\n          )\n        ),\n        bounds: { x: 0, y: 0, width: 0, height: 0 },\n      };\n    });\n    for (let i = 0; i < words.length; i++) {\n      this.layoutWord(words[i], wordLayouts[i]);\n    }\n\n    const wordGap = this.theme.syntaxGraphWordGap || 63;\n    const containerWidth = this.getTotalWidth(\n      wordLayouts.map((layout) => layout.bounds),\n      wordGap\n    );\n    const segmentNodeY =\n      Math.max(...wordLayouts.map((layout) => layout.bounds.height)) + 5;\n    this.heightMap.addSpan(0, containerWidth, segmentNodeY);\n\n    let x = containerWidth;\n    for (const layout of wordLayouts) {\n      x -= layout.bounds.width;\n      this.positionWord(layout, x, 0);\n      x -= wordGap;\n\n      for (const nodeCircle of layout.nodeCircles) {\n        this.nodePositions.push({ x: nodeCircle.cx, y: segmentNodeY });\n      }\n    }\n\n    if (this.syntaxGraph.phraseNodes) {\n      for (const phraseNode of this.syntaxGraph.phraseNodes) {\n        this.phraseLayouts.push({\n          line: { x1: 0, y1: 0, x2: 0, y2: 0 },\n          nodeCircle: { cx: 0, cy: 0, r: 0 },\n          phraseTag: this.createBox(\n            phraseNode.label || phraseNode.phraseTag,\n            tempSvg,\n            this.getLabelFont(),\n            this.theme.syntaxGraphTagFontSize\n          ),\n        });\n      }\n    }\n\n    const edgeLabels = (this.syntaxGraph.edges || []).map((edge) => {\n      const label = edge.label || this.getEdgeLabel(edge);\n      return this.createBox(\n        label,\n        tempSvg,\n        this.getLabelFont(),\n        this.theme.syntaxGraphEdgeLabelFontSize\n      );\n    });\n\n    const arcs = [];\n    const arrows = [];\n    const { edges } = this.syntaxGraph;\n    if (edges) {\n      for (let i = 0; i < edges.length; i++) {\n        const { startNode, endNode } = edges[i];\n\n        const start =\n          this.nodePositions[startNode] ?? this.layoutPhrase(startNode);\n        const end = this.nodePositions[endNode] ?? this.layoutPhrase(endNode);\n\n        const right = start.x < end.x;\n        const { x: x1, y: y1 } = right ? start : end;\n        const { x: x2, y: y2 } = right ? end : start;\n\n        const boxWidth = x2 - x1;\n        let y = Math.min(y1, y2);\n        const deltaY = Math.abs(y2 - y1);\n\n        const maxY = this.heightMap.getHeight(x1 + 5, x2 - 5);\n        let boxHeight = deltaY + 30;\n        while (y + boxHeight < maxY) {\n          boxHeight += 50;\n        }\n\n        const ry = boxHeight;\n        const theta = Math.asin(deltaY / ry);\n        const rx = boxWidth / (1 + Math.cos(theta));\n        arcs.push({ x1, y1, x2, y2, rx, ry });\n        y += boxHeight;\n\n        const maximaX = y2 > y1 ? x1 + rx : x2 - rx;\n        arrows.push({ x: maximaX - 3, y: y - 5, right });\n\n        const edgeLabel = edgeLabels[i];\n        y += 5;\n        edgeLabel.x = maximaX - edgeLabel.width * 0.5;\n        edgeLabel.y = y;\n        this.heightMap.addSpan(x1, x2, y + edgeLabel.height);\n      }\n    }\n\n    const actualWidth = containerWidth * 1.5; // 50% buffer to ensure no cutoff\n\n    document.body.removeChild(tempSvg);\n\n    return {\n      wordLayouts,\n      phraseLayouts: this.phraseLayouts,\n      edgeLabels,\n      arcs,\n      arrows,\n      containerSize: {\n        width: Math.ceil(actualWidth),\n        height: Math.ceil(this.heightMap.height),\n      },\n      originalWidth: Math.ceil(containerWidth), // For viewBox\n    };\n  }\n\n  layoutWord(word, layout) {\n    const {\n      bounds,\n      location,\n      phonetic,\n      translation,\n      bra,\n      token,\n      ket,\n      nodeCircles,\n      posTags,\n    } = layout;\n    const headerTextDeltaY = this.theme.syntaxGraphHeaderTextDeltaY || 15; // React uses 23, not 15\n    const headerExtraGap = this.theme.syntaxGraphHeaderExtraGap || 10;\n    const posTagGap = this.theme.syntaxGraphPosTagGap || 25;\n    const bracketDeltaY = this.theme.syntaxGraphBracketDeltaY || 16;\n    const posTagYOffset = this.theme.syntaxGraphPosTagYOffset || 65;\n    let y = 0;\n\n    const posTagWidth = this.getTotalWidth(posTags, posTagGap);\n    const brackets = this.brackets(word);\n    const tokenWidth = brackets\n      ? bra.width + token.width + ket.width\n      : token.width;\n    const width = Math.max(\n      location.width,\n      phonetic.width,\n      translation.width,\n      tokenWidth,\n      posTagWidth\n    );\n\n    this.centerHorizontal(location, width, y);\n    y += headerTextDeltaY;\n    this.centerHorizontal(phonetic, width, y);\n    y += headerTextDeltaY;\n    this.centerHorizontal(translation, width, y);\n    y += headerExtraGap; // React uses +7, not +10\n\n    let x = (width + tokenWidth) / 2;\n    if (brackets) {\n      x -= ket.width;\n      ket.x = x + 10;\n      ket.y = y + bracketDeltaY;\n    }\n    x -= token.width;\n    token.x = x;\n    token.y = y - 20; // React puts token at y, not y - 20\n    if (brackets) {\n      x -= bra.width;\n      bra.x = x; // Add spacing for RTL - start bracket is on the right\n      bra.y = y + bracketDeltaY;\n    }\n\n    if (!word.token && !word.elidedText) {\n      token.x += -10;\n    }\n    y += posTagYOffset;\n\n    let tagX = (width + posTagWidth) / 2;\n    const r = 3;\n    for (const posTag of posTags) {\n      tagX -= posTag.width;\n      const centerX = tagX + posTag.width / 2;\n      const centerY = y + 18;\n      nodeCircles.push({ cx: centerX, cy: y, r });\n      // Position box so its center is at centerX, centerY for addCenteredText\n      posTag.x = centerX - posTag.width / 2;\n      posTag.y = centerY - posTag.height / 2;\n      tagX -= posTagGap;\n    }\n\n    bounds.width = width;\n    bounds.height = Math.max(...posTags.map((tag) => tag.y + tag.height));\n  }\n\n  positionWord(layout, x, y) {\n    layout.bounds.x = x;\n    layout.bounds.y = y;\n    layout.location.x += x;\n    layout.location.y += y;\n    layout.phonetic.x += x;\n    layout.phonetic.y += y;\n    layout.translation.x += x;\n    layout.translation.y += y;\n    if (layout.bra) {\n      layout.bra.x += x;\n      layout.bra.y += y;\n    }\n    layout.token.x += x;\n    layout.token.y += y;\n    if (layout.ket) {\n      layout.ket.x += x;\n      layout.ket.y += y;\n    }\n\n    for (const nodeCircle of layout.nodeCircles) {\n      nodeCircle.cx += x;\n      nodeCircle.cy += y;\n    }\n\n    for (const posTag of layout.posTags) {\n      posTag.x += x;\n      posTag.y += y;\n    }\n  }\n\n  layoutPhrase(node) {\n    const { startNode, endNode } = this.getPhraseNode(node);\n    const x1 = this.nodePositions[endNode].x;\n    const x2 = this.nodePositions[startNode].x;\n    let y = this.heightMap.getHeight(x1, x2) + 20;\n    const x = (x1 + x2) / 2;\n\n    // Line\n    const phraseIndex = node - this.syntaxGraph.segmentNodeCount;\n    const layout = this.phraseLayouts[phraseIndex];\n    layout.line = { x1, y1: y, x2, y2: y };\n    y += 13;\n\n    // Node\n    layout.nodeCircle = { cx: x, cy: y, r: 3 };\n    y += 10;\n\n    // Phrase tag - center text above the node circle\n    const phraseTag = layout.phraseTag;\n    const centerX = x;\n    const centerY = y + 10;\n    phraseTag.x = centerX - phraseTag.width / 2;\n    phraseTag.y = centerY - phraseTag.height / 2;\n\n    // Node\n    y += phraseTag.height + 4;\n    const position = { x, y };\n    this.nodePositions[node] = position;\n    this.heightMap.addSpan(x1, x2, y);\n    return position;\n  }\n\n  getTotalWidth(elements, gap) {\n    return (\n      elements.reduce((totalWidth, element) => totalWidth + element.width, 0) +\n      gap * (elements.length - 1)\n    );\n  }\n\n  centerHorizontal(element, width, y) {\n    // element.x = element.width / 2 + 15;\n    element.x = (width + element.width) / 2;\n    element.y = y;\n  }\n\n  createBox(\n    text,\n    tempSvg,\n    font = this.theme.fonts.defaultFont,\n    fontSize = this.theme.syntaxGraphTagFontSize\n  ) {\n    if (!text) {\n      return { x: 0, y: 0, width: 0, height: 0 };\n    }\n\n    const textElement = document.createElementNS(\n      \"http://www.w3.org/2000/svg\",\n      \"text\"\n    );\n    textElement.textContent = text;\n    textElement.setAttribute(\"font-family\", font.family);\n    textElement.setAttribute(\"font-size\", fontSize);\n\n    try {\n      tempSvg.appendChild(textElement);\n      const bbox = textElement.getBBox();\n\n      const result = {\n        x: bbox.x || 0,\n        y: bbox.y || 0,\n        width: bbox.width || 0,\n        height: bbox.height || 0,\n      };\n\n      if (textElement.parentNode === tempSvg) {\n        tempSvg.removeChild(textElement);\n      }\n\n      return result;\n    } catch (error) {\n      console.warn(\"Error measuring text:\", text, error);\n      return {\n        x: 0,\n        y: 0,\n        width: text.length * fontSize * 0.6,\n        height: fontSize,\n      };\n    }\n  }\n\n  getPhraseNode(node) {\n    return this.syntaxGraph.phraseNodes[\n      node - this.syntaxGraph.segmentNodeCount\n    ];\n  }\n\n  getTokenText(word) {\n    if (word.token) {\n      return word.token.segments.map((seg) => seg.arabic).join(\"\");\n    } else if (word.elidedText) {\n      return word.elidedText;\n    } else {\n      return \"( * )\";\n    }\n  }\n\n  getPosTagTexts(word) {\n    if (word.token) {\n      return word.token.segments\n        .filter((segment) => segment.posTag !== \"DET\")\n        .map((segment) => segment.posLabel || segment.posTag);\n    } else {\n      return [word.elidedPosLabel || word.elidedPosTag || \"ELIDED\"];\n    }\n  }\n\n  getPosTagCodes(word) {\n    if (word.token) {\n      return word.token.segments\n        .filter((segment) => segment.posTag !== \"DET\")\n        .map((segment) => segment.posTag);\n    } else {\n      return [word.elidedPosTag || \"ELIDED\"];\n    }\n  }\n\n  getPosTagSegments(word) {\n    if (word.token) {\n      return word.token.segments.filter((segment) => segment.posTag !== \"DET\");\n    } else {\n      return [{ posTag: word.elidedPosTag || \"ELIDED\" }];\n    }\n  }\n\n  getEdgeLabel(edge) {\n    const { dependencyTag, endNode: headNode } = edge;\n    if (dependencyTag !== \"subjx\" && dependencyTag !== \"predx\") {\n      return this.arabicTerms.get(dependencyTag) || \"?\";\n    }\n\n    const name = dependencyTag === \"subjx\" ? this.subject : this.predicate;\n    const headWord = this.syntaxGraph.words.find(\n      (word) => headNode >= word.startNode && headNode <= word.endNode\n    );\n\n    if (headWord && headWord.token) {\n      const headSegment = headWord.token.segments.find(\n        (segment) => segment.nodeNumber === headNode\n      );\n      if (headSegment && headSegment.posTag === \"V\") {\n        return name;\n      }\n    }\n\n    return this.arabicTerms.get(dependencyTag) || \"?\";\n  }\n\n  renderSVG(layout) {\n    const {\n      wordLayouts,\n      phraseLayouts,\n      edgeLabels,\n      arcs,\n      arrows,\n      containerSize,\n      originalWidth,\n    } = layout;\n    const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n    svg.setAttribute(\"width\", containerSize.width);\n    svg.setAttribute(\"height\", containerSize.height);\n    svg.setAttribute(\"viewBox\", `0 0 ${originalWidth} ${containerSize.height}`);\n    svg.classList.add(\"syntax-graph-view\");\n\n    // Render words using new layout structure\n    this.syntaxGraph.words.forEach((word, i) => {\n      const wordLayout = wordLayouts[i];\n      const fade = word.type === \"reference\";\n      const brackets = this.brackets(word);\n\n      // Header text\n      if (word.token) {\n        const locationText = word.token.location || \"\";\n        if (fade) {\n          this.addText(\n            svg,\n            locationText,\n            wordLayout.location,\n            this.theme.fonts.defaultFont,\n            this.theme.syntaxGraphHeaderFontSize,\n            \"silver\"\n          );\n        } else {\n          this.addLinkText(\n            svg,\n            locationText,\n            wordLayout.location,\n            this.theme.fonts.defaultFont,\n            this.theme.syntaxGraphHeaderFontSize,\n            this.wordDetailUrl(locationText),\n            \"location\"\n          );\n        }\n        this.addText(\n          svg,\n          word.token.phonetic || \"\",\n          wordLayout.phonetic,\n          this.theme.fonts.defaultFont,\n          this.theme.syntaxGraphHeaderFontSize,\n          fade ? \"silver\" : \"phonetic\"\n        );\n        this.addText(\n          svg,\n          word.token.translation || \"\",\n          wordLayout.translation,\n          this.theme.fonts.defaultFont,\n          this.theme.syntaxGraphHeaderFontSize,\n          fade ? \"silver\" : \"\"\n        );\n      }\n\n      // Brackets\n      if (brackets && wordLayout.bra) {\n        this.addText(\n          svg,\n          \")\",\n          wordLayout.bra,\n          this.theme.fonts.elidedWordFont,\n          this.theme.syntaxGraphElidedWordFontSize,\n          \"silver\"\n        );\n      }\n\n      // Token - render as single text or with tspan segments\n      if (word.token && word.token.segments) {\n        const textElement = document.createElementNS(\n          \"http://www.w3.org/2000/svg\",\n          \"text\"\n        );\n        const fontMetrics = this.getFontMetrics(\n          this.theme.fonts.defaultArabicFont\n        );\n        const y =\n          wordLayout.token.y +\n          wordLayout.token.height -\n          fontMetrics.descenderHeight * this.theme.syntaxGraphTokenFontSize;\n        const x = wordLayout.token.x + wordLayout.token.width;\n\n        textElement.setAttribute(\"x\", x);\n        textElement.setAttribute(\"y\", y);\n        textElement.setAttribute(\n          \"font-family\",\n          this.theme.fonts.defaultArabicFont.family\n        );\n        textElement.setAttribute(\n          \"font-size\",\n          (this.theme.syntaxGraphTokenFontSize)\n        );\n        textElement.setAttribute(\"direction\", \"rtl\");\n\n        word.token.segments.forEach((segment) => {\n          const tspan = document.createElementNS(\n            \"http://www.w3.org/2000/svg\",\n            \"tspan\"\n          );\n          tspan.textContent = segment.arabic;\n          const segmentClassName = fade\n            ? \"silver\"\n            : this.colorService.getSegmentColor(segment);\n          if (segmentClassName) tspan.classList.add(segmentClassName);\n          textElement.appendChild(tspan);\n        });\n\n        svg.appendChild(textElement);\n      } else {\n        // Elided or simple token\n        const tokenText = this.getTokenText(word);\n        const isElided = tokenText == \"( * )\";\n\n        // Use elided font for all elided words (both (*) placeholder and actual elidedText)\n        const font = isElided\n          ? this.theme.fonts.elidedWordFont\n          : this.theme.fonts.defaultArabicFont;\n        const fontSize = isElided\n          ? this.theme.syntaxGraphElidedWordFontSize\n          : this.theme.syntaxGraphTokenFontSize;\n\n        this.addText(\n          svg,\n          tokenText,\n          wordLayout.token,\n          font,\n          fontSize,\n          \"silver\",\n          true\n        );\n      }\n\n      // Brackets\n      if (brackets && wordLayout.ket) {\n        this.addText(\n          svg,\n          \"(\",\n          wordLayout.ket,\n          this.theme.fonts.elidedWordFont,\n          this.theme.syntaxGraphElidedWordFontSize,\n          \"silver\"\n        );\n      }\n\n      // POS tags and node circles\n      const posTagTexts = this.getPosTagTexts(word);\n      const posTagSegments = this.getPosTagSegments(word);\n      posTagTexts.forEach((posTagText, j) => {\n        const nodeCircle = wordLayout.nodeCircles[j];\n        const posTag = wordLayout.posTags[j];\n        const className = fade\n          ? \"silver\"\n          : this.colorService.getSegmentColor(posTagSegments[j]);\n\n        if (nodeCircle) {\n          this.addCircle(svg, nodeCircle, className);\n        }\n        if (posTag) {\n          this.addModalCenteredText(\n            svg,\n            posTagText,\n            posTag,\n            this.getLabelFont(),\n            this.theme.syntaxGraphTagFontSize,\n            className,\n            this.grammarTermUrl(\"pos_tags\", posTagSegments[j].posTag)\n          );\n        }\n      });\n    });\n\n    // Render phrase nodes\n    if (this.syntaxGraph.phraseNodes) {\n      this.syntaxGraph.phraseNodes.forEach((phraseNode, i) => {\n        const phraseLayout = phraseLayouts[i];\n        const className = this.colorService.getPhraseColor(\n          phraseNode.phraseTag\n        );\n\n        if (phraseLayout) {\n          this.addLine(svg, phraseLayout.line, \"sky\");\n          this.addCircle(svg, phraseLayout.nodeCircle, className);\n          this.addModalCenteredText(\n            svg,\n            phraseNode.label || phraseNode.phraseTag,\n            phraseLayout.phraseTag,\n            this.getLabelFont(),\n            this.theme.syntaxGraphTagFontSize,\n            className,\n            this.grammarTermUrl(\"edge_relations\", phraseNode.phraseTag)\n          );\n        }\n      });\n    }\n\n    // Render arcs and arrows\n    if (this.syntaxGraph.edges) {\n      this.syntaxGraph.edges.forEach((edge, i) => {\n        const arc = arcs[i];\n        if (arc) {\n          const className = `${this.colorService.getDependencyColor(edge.dependencyTag)}`;\n          this.addArc(svg, arc, className);\n          this.addArrow(svg, arrows[i], className);\n        }\n      });\n\n      // Render edge labels\n      this.syntaxGraph.edges.forEach((edge, i) => {\n        const edgeLabel = edgeLabels[i];\n        const className = `${this.colorService.getDependencyColor(edge.dependencyTag)}`;\n\n        if (edgeLabel) {\n          this.addRect(svg, edgeLabel, \"edge-label\");\n          this.addModalCenteredText(\n            svg,\n            edge.label || this.getEdgeLabel(edge),\n            edgeLabel,\n            this.getLabelFont(),\n            this.theme.syntaxGraphEdgeLabelFontSize,\n            className,\n            this.grammarTermUrl(\"edge_relations\", edge.dependencyTag)\n          );\n        }\n      });\n    }\n\n    return svg;\n  }\n\n  wordDetailUrl(location) {\n    const params = new URLSearchParams(window.location.search);\n    const locale = params.get(\"locale\");\n    let url = `/morphology/word?location=${encodeURIComponent(location)}`;\n    if (locale) {\n      url += `&locale=${encodeURIComponent(locale)}`;\n    }\n    return url;\n  }\n\n  brackets(word) {\n    return (\n      word.type === \"reference\" || (word.type === \"elided\" && word.elidedText)\n    );\n  }\n\n  addText(svg, text, box, font, fontSize, className = \"\", rtl = false) {\n    if (!box || !text) return;\n\n    const textElement = document.createElementNS(\n      \"http://www.w3.org/2000/svg\",\n      \"text\"\n    );\n    textElement.textContent = text;\n\n    const fontMetrics = this.getFontMetrics(font);\n    const y = box.y + box.height - fontMetrics.descenderHeight * fontSize;\n    const x = rtl ? box.x + box.width : box.x;\n\n    textElement.setAttribute(\"x\", x);\n    textElement.setAttribute(\"y\", y);\n    textElement.setAttribute(\"font-family\", font.family);\n    textElement.setAttribute(\"font-size\", fontSize);\n    if (className) textElement.classList.add(className);\n    if (rtl) textElement.setAttribute(\"direction\", \"rtl\");\n\n    svg.appendChild(textElement);\n  }\n\n  addLinkText(svg, text, box, font, fontSize, href, className = \"\", rtl = false) {\n    if (!box || !text || !href) return;\n\n    const linkElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"a\");\n    linkElement.setAttribute(\"href\", href);\n    linkElement.setAttributeNS(\"http://www.w3.org/1999/xlink\", \"xlink:href\", href);\n\n    const textElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n    textElement.textContent = text;\n\n    const fontMetrics = this.getFontMetrics(font);\n    const y = box.y + box.height - fontMetrics.descenderHeight * fontSize;\n    const x = rtl ? box.x + box.width : box.x;\n\n    textElement.setAttribute(\"x\", x);\n    textElement.setAttribute(\"y\", y);\n    textElement.setAttribute(\"font-family\", font.family);\n    textElement.setAttribute(\"font-size\", fontSize);\n    if (className) textElement.classList.add(className);\n    if (rtl) textElement.setAttribute(\"direction\", \"rtl\");\n\n    linkElement.appendChild(textElement);\n    svg.appendChild(linkElement);\n  }\n\n  addCenteredText(svg, text, box, font, fontSize, className = \"\") {\n    if (!box || !text) return;\n\n    const textElement = document.createElementNS(\n      \"http://www.w3.org/2000/svg\",\n      \"text\"\n    );\n    textElement.textContent = text;\n\n    // Center the text within the box\n    const x = box.x + box.width / 2;\n    const y = box.y + box.height / 2;\n\n    textElement.setAttribute(\"x\", x);\n    textElement.setAttribute(\"y\", y);\n    textElement.setAttribute(\"font-family\", font.family);\n    textElement.setAttribute(\"font-size\", fontSize);\n    textElement.setAttribute(\"text-anchor\", \"middle\");\n    textElement.setAttribute(\"dominant-baseline\", \"middle\");\n    if (className) textElement.classList.add(className);\n\n    svg.appendChild(textElement);\n  }\n\n  addModalCenteredText(svg, text, box, font, fontSize, className = \"\", url) {\n    if (!box || !text || !url) return;\n\n    const linkElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"a\");\n    linkElement.setAttribute(\"href\", url);\n    linkElement.setAttributeNS(\"http://www.w3.org/1999/xlink\", \"xlink:href\", url);\n    linkElement.setAttribute(\"data-controller\", \"ajax-modal\");\n    linkElement.setAttribute(\"data-url\", url);\n\n    const textElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n    textElement.textContent = text;\n    const x = box.x + box.width / 2;\n    const y = box.y + box.height / 2;\n    textElement.setAttribute(\"x\", x);\n    textElement.setAttribute(\"y\", y);\n    textElement.setAttribute(\"font-family\", font.family);\n    textElement.setAttribute(\"font-size\", fontSize);\n    textElement.setAttribute(\"text-anchor\", \"middle\");\n    textElement.setAttribute(\"dominant-baseline\", \"middle\");\n    if (className) textElement.classList.add(className);\n    textElement.classList.add(\"term-link\");\n\n    linkElement.appendChild(textElement);\n    svg.appendChild(linkElement);\n  }\n\n  getFontMetrics(font) {\n    // Approximate font metrics - React uses actual font service\n    return {\n      descenderHeight: 0.1, // Approximate descender height ratio\n    };\n\n    // Use canvas-based measurement like React FontService\n    if (!this.fontMetricsCache) {\n      this.fontMetricsCache = new Map();\n    }\n\n    const fontKey = font.family;\n    if (this.fontMetricsCache.has(fontKey)) {\n      return this.fontMetricsCache.get(fontKey);\n    }\n\n    // Create canvas for measurement\n    if (!this.metricsCanvas) {\n      this.metricsCanvas = document.createElement(\"canvas\");\n      this.metricsContext = this.metricsCanvas.getContext(\"2d\");\n    }\n\n    // Measure font metrics using canvas\n    const fontSize = 100;\n    this.metricsContext.font = `${fontSize}px ${font.family}`;\n    const textMetrics = this.metricsContext.measureText(\"abc\");\n\n    const fontMetrics = {\n      descenderHeight: textMetrics.fontBoundingBoxDescent / fontSize,\n    };\n\n    // Cache the result\n    this.fontMetricsCache.set(fontKey, fontMetrics);\n    return fontMetrics;\n  }\n\n  addCircle(svg, circle, className) {\n    const circleElement = document.createElementNS(\n      \"http://www.w3.org/2000/svg\",\n      \"circle\"\n    );\n    circleElement.setAttribute(\"cx\", circle.cx);\n    circleElement.setAttribute(\"cy\", circle.cy);\n    circleElement.setAttribute(\"r\", circle.r);\n    if (className) circleElement.classList.add(className);\n    svg.appendChild(circleElement);\n  }\n\n  addLine(svg, line, className) {\n    const lineElement = document.createElementNS(\n      \"http://www.w3.org/2000/svg\",\n      \"line\"\n    );\n    lineElement.setAttribute(\"x1\", line.x1);\n    lineElement.setAttribute(\"y1\", line.y1);\n    lineElement.setAttribute(\"x2\", line.x2);\n    lineElement.setAttribute(\"y2\", line.y2);\n    if (className) lineElement.classList.add(className);\n    svg.appendChild(lineElement);\n  }\n\n  addRect(svg, rect, className) {\n    const rectElement = document.createElementNS(\n      \"http://www.w3.org/2000/svg\",\n      \"rect\"\n    );\n    rectElement.setAttribute(\"x\", rect.x);\n    rectElement.setAttribute(\"y\", rect.y);\n    rectElement.setAttribute(\"width\", rect.width);\n    rectElement.setAttribute(\"height\", rect.height);\n    if (className) rectElement.classList.add(className);\n    svg.appendChild(rectElement);\n  }\n\n  addArc(svg, arc, className) {\n    const path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n    const d = `M ${arc.x1} ${arc.y1} A ${arc.rx} ${arc.ry} 0 0 0 ${arc.x2} ${arc.y2}`;\n    path.setAttribute(\"d\", d);\n    path.setAttribute(\"fill\", \"none\");\n    if (className) path.classList.add(className);\n    svg.appendChild(path);\n  }\n\n  addArrow(svg, arrow, className) {\n    const polygon = document.createElementNS(\n      \"http://www.w3.org/2000/svg\",\n      \"polygon\"\n    );\n    const { x, y, right } = arrow;\n    const points = right\n      ? `${x},${y} ${x},${y + 10} ${x + 6},${y + 5}`\n      : `${x + 6},${y} ${x + 6},${y + 10} ${x},${y + 5}`;\n    polygon.setAttribute(\"points\", points);\n    if (className) polygon.classList.add(className);\n    svg.appendChild(polygon);\n  }\n}\n\nclass HeightMap {\n  constructor() {\n    this.spans = [];\n  }\n\n  get height() {\n    return this.spans.reduce((max, span) => Math.max(max, span.height), 0);\n  }\n\n  getHeight(x1, x2) {\n    x1 += 5;\n    x2 -= 5;\n\n    let max = 0;\n    for (const span of this.spans) {\n      if (x1 <= span.x2 && x2 >= span.x1 && span.height > max) {\n        max = span.height;\n      }\n    }\n    return max;\n  }\n\n  addSpan(x1, x2, height) {\n    this.spans.push({ x1, x2, height });\n  }\n}\n\nclass ColorService {\n  constructor() {\n    this.posTagColors = new Map([\n      [\"ADJ\", \"purple\"],\n      [\"CIRC\", \"navy\"],\n      [\"COM\", \"navy\"],\n      [\"COND\", \"orange\"],\n      [\"CONJ\", \"navy\"],\n      [\"DEM\", \"brown\"],\n      [\"DET\", \"gray\"],\n      [\"INL\", \"orange\"],\n      [\"INTG\", \"rose\"],\n      [\"LOC\", \"orange\"],\n      [\"N\", \"sky\"],\n      [\"NEG\", \"red\"],\n      [\"PN\", \"blue\"],\n      [\"P\", \"rust\"],\n      [\"PREV\", \"orange\"],\n      [\"PRP\", \"gold\"],\n      [\"PRO\", \"red\"],\n      [\"REL\", \"gold\"],\n      [\"REM\", \"navy\"],\n      [\"RSLT\", \"navy\"],\n      [\"SUB\", \"gold\"],\n      [\"T\", \"orange\"],\n      [\"V\", \"seagreen\"],\n      [\"VOC\", \"green\"],\n    ]);\n\n    this.phraseTagColors = new Map([\n      [\"CS\", \"orange\"],\n      [\"PP\", \"rust\"],\n      [\"SC\", \"gold\"],\n      [\"VS\", \"seagreen\"],\n    ]);\n\n    this.dependencyTagColors = new Map([\n      [\"adj\", \"purple\"],\n      [\"app\", \"sky\"],\n      [\"circ\", \"seagreen\"],\n      [\"cog\", \"seagreen\"],\n      [\"com\", \"metal\"],\n      [\"cond\", \"orange\"],\n      [\"cpnd\", \"sky\"],\n      [\"gen\", \"rust\"],\n      [\"int\", \"orange\"],\n      [\"intg\", \"rose\"],\n      [\"link\", \"orange\"],\n      [\"neg\", \"red\"],\n      [\"obj\", \"metal\"],\n      [\"pass\", \"sky\"],\n      [\"poss\", \"sky\"],\n      [\"pred\", \"metal\"],\n      [\"predx\", \"metal\"],\n      [\"prev\", \"orange\"],\n      [\"pro\", \"red\"],\n      [\"prp\", \"metal\"],\n      [\"spec\", \"metal\"],\n      [\"spec\", \"sky\"],\n      [\"sub\", \"gold\"],\n      [\"subj\", \"sky\"],\n      [\"subjx\", \"sky\"],\n      [\"voc\", \"green\"],\n    ]);\n  }\n\n  getSegmentColor(segment) {\n    const { posTag } = segment;\n    const color = this.posTagColors.get(posTag);\n    if (color) {\n      return color;\n    }\n    if (posTag === \"PRON\") {\n      switch (segment.pronounType) {\n        case \"subj\":\n          return \"sky\";\n        case \"obj2\":\n          return \"orange\";\n        default:\n          return \"metal\";\n      }\n    }\n    return \"pink\";\n  }\n\n  getPhraseColor(phraseTag) {\n    return this.phraseTagColors.get(phraseTag) || \"blue\";\n  }\n\n  getDependencyColor(dependencyTag) {\n    return this.dependencyTagColors.get(dependencyTag) || \"pink\";\n  }\n\n  getPosTagColor(posTag) {\n    const color = this.posTagColors.get(posTag);\n    if (color) return color;\n\n    if (posTag === \"PRON\") {\n      return \"red\"; // Default for pronouns\n    }\n\n    return \"purple\";\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\nimport domtoimage from \"dom-to-image-more\";\n\nexport default class extends Controller {\n  static targets = [\"graphContainer\"];\n\n  async download(event) {\n    if (event) event.preventDefault();\n\n    const button = event?.currentTarget;\n    let originalHtml;\n\n    if (button) {\n      originalHtml = button.innerHTML;\n      button.disabled = true;\n      button.classList.add(\"opacity-70\", \"cursor-not-allowed\");\n      button.innerHTML = '<i class=\"fa fa-spinner fa-spin\"></i>';\n    }\n\n    if (!this.hasGraphContainerTarget) {\n      if (button) {\n        button.disabled = false;\n        button.classList.remove(\"opacity-70\", \"cursor-not-allowed\");\n        if (originalHtml) button.innerHTML = originalHtml;\n      }\n      return;\n    }\n\n    const container = this.graphContainerTarget;\n    const svg = container.querySelector(\"svg\");\n    if (!svg) {\n      console.warn(\"No syntax graph SVG found to download.\");\n      if (button) {\n        button.disabled = false;\n        button.classList.remove(\"opacity-70\", \"cursor-not-allowed\");\n        if (originalHtml) button.innerHTML = originalHtml;\n      }\n      return;\n    }\n\n    try {\n      if (document.fonts && document.fonts.ready) {\n        await document.fonts.ready;\n      }\n\n      const dataUrl = await domtoimage.toPng(container, {\n        bgcolor: \"#fff\",\n        scale: 2,\n        style: {\n          transform: \"scale(1)\",\n          transformOrigin: \"top left\",\n        },\n      });\n\n      const link = document.createElement(\"a\");\n      link.href = dataUrl;\n\n      const baseName =\n        container.dataset.syntaxGraphFilenameValue || \"syntax-graph\";\n      link.download = `${baseName}.png`;\n\n      document.body.appendChild(link);\n      link.click();\n      document.body.removeChild(link);\n    } catch (error) {\n      console.error(\"Failed to export syntax graph:\", error);\n    } finally {\n      if (button) {\n        button.disabled = false;\n        button.classList.remove(\"opacity-70\", \"cursor-not-allowed\");\n        if (originalHtml) button.innerHTML = originalHtml;\n      }\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"pane\"]\n  static values = {\n    activeTab: String\n  }\n\n  connect() {\n    const tabButtons = this.getTabButtons()\n    \n    tabButtons.forEach(btn => {\n      btn.classList.add('rounded-t')\n      if (!btn.hasAttribute('data-action')) {\n        btn.setAttribute('data-action', 'click->tabs#switch')\n      }\n    })\n    \n    let initialActive = this.element.querySelector('[data-tabs-target-value].active, [role=\"tab\"].active, .active[data-action*=\"tabs#switch\"]')\n    if (!initialActive && tabButtons.length > 0) initialActive = tabButtons[0]\n    if (initialActive) this.activateTab(initialActive, tabButtons)\n  }\n\n  getTabButtons() {\n    return this.element.querySelectorAll('[data-tabs-target-value], [role=\"tab\"], [data-action*=\"tabs#switch\"]')\n  }\n\n  getTabPanes() {\n    return this.element.querySelectorAll('[role=\"tabpanel\"]')\n  }\n\n  switch(event) {\n    event.preventDefault()\n    event.stopPropagation()\n    \n    const button = event.currentTarget\n    const tabButtons = this.getTabButtons()\n    \n    this.activateTab(button, tabButtons)\n  }\n\n  activateTab(button, tabButtons) {\n    this.updateBordersAndColors(button, tabButtons)\n    const rawTarget = button.getAttribute('data-tabs-target-value')\n    if (rawTarget) {\n      const targetId = rawTarget.startsWith('#') ? rawTarget : `#${rawTarget}`\n      this.showPane(targetId)\n      this.updateAyahNavLinks(targetId.replace('#', ''))\n    }\n  }\n\n  showPane(targetId) {\n    const allPanes = this.getTabPanes()\n    allPanes.forEach(pane => {\n      pane.classList.remove('active')\n      pane.classList.add('hidden')\n      pane.setAttribute('hidden', 'hidden')\n    })\n\n    const targetPane = this.element.querySelector(targetId)\n    if (targetPane) {\n      targetPane.classList.add('active')\n      targetPane.classList.remove('hidden')\n      targetPane.removeAttribute('hidden')\n    }\n  }\n\n  updateBordersAndColors(activeButton, tabButtons) {\n    tabButtons.forEach(btn => {\n      btn.style.borderTop = 'none'\n      btn.style.borderRight = 'none'\n      btn.style.borderLeft = 'none'\n      btn.style.borderBottom = 'none'\n      \n      btn.classList.remove('text-gray-700', 'bg-white', '-mb-px', 'border-b', 'border-b-white', 'active')\n      btn.classList.add('text-[#57d798]')\n      btn.setAttribute('aria-selected', 'false')\n    })\n    \n    if (activeButton) {\n      activeButton.style.borderTop = '1px solid #dee2e6'\n      activeButton.style.borderRight = '1px solid #dee2e6'\n      activeButton.style.borderLeft = '1px solid #dee2e6'\n      activeButton.style.borderBottom = 'none'\n      \n      activeButton.classList.remove('text-[#57d798]')\n      activeButton.classList.add('text-gray-700', 'bg-white', '-mb-px', 'border-b', 'border-b-white', 'active')\n      activeButton.setAttribute('aria-selected', 'true')\n    }\n  }\n\n  updateAyahNavLinks(tabKey) {\n    const header = document.getElementById('modal-header')\n    if (!header) return\n    const links = header.querySelectorAll('a[data-ayah-nav=\"true\"]')\n    links.forEach((a) => {\n      try {\n        const url = new URL(a.getAttribute('href'), window.location.origin)\n        url.searchParams.set('tab', tabKey)\n        a.setAttribute('href', url.pathname + url.search)\n      } catch (_) {\n      }\n    })\n\n    const jump = header.querySelector('[data-ayah-jump-tab-value]')\n    if (jump) {\n      jump.setAttribute('data-ayah-jump-tab-value', tabKey)\n    }\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Reloads the before/after picture of a tafsir's ayah range when the first\n// or last ayah changes\nexport default class extends Controller {\n  static targets = [\"start\", \"end\", \"frame\"];\n  static values = { url: String };\n\n  refresh() {\n    const url = new URL(this.urlValue, window.location.origin);\n    url.searchParams.set(\"start_verse_id\", this.startTarget.value);\n    url.searchParams.set(\"end_verse_id\", this.endTarget.value);\n    this.frameTarget.src = url.toString();\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n// Shows the current and draft tafsir text for one ayah side by side.\n// It builds its own overlay stacked above the ajax-modal it is opened from, so\n// the comparison table underneath stays untouched.\nexport default class extends Controller {\n  static values = { url: String }\n\n  disconnect() {\n    this.close();\n  }\n\n  // Delegated from the table body: one listener rather than one per row.\n  open(event) {\n    const trigger = event.target.closest(\".status_tag\");\n    if (!trigger) return;\n\n    event.preventDefault();\n    event.stopPropagation();\n\n    const verseKey = trigger.closest(\"tr\").querySelector(\"td strong\").textContent.trim();\n    this.close();\n    this.build(verseKey);\n\n    fetch(`${this.urlValue}?verse_key=${encodeURIComponent(verseKey)}`, {\n      headers: { \"X-Requested-With\": \"XMLHttpRequest\" }\n    })\n      .then((response) => {\n        if (!response.ok) throw new Error(response.statusText);\n        return response.text();\n      })\n      .then((html) => {\n        if (this.bodyElement) this.bodyElement.innerHTML = html;\n      })\n      .catch(() => {\n        if (this.bodyElement) {\n          this.bodyElement.innerHTML = `<div class=\"p-4 text-red-600\">Could not load text for ${verseKey}.</div>`;\n        }\n      });\n  }\n\n  build(verseKey) {\n    const overlay = document.createElement(\"div\");\n    // Above the ajax-modal, which sits at z-[9999].\n    overlay.className = \"fixed inset-0 z-[10050] overflow-y-auto bg-black bg-opacity-50\";\n    overlay.innerHTML = `\n      <div class=\"flex min-h-full items-start justify-center p-4\">\n        <div class=\"relative w-full max-w-6xl bg-white rounded-lg shadow-xl\" data-popup-content>\n          <div class=\"flex items-center justify-between px-4 py-3 border-b border-gray-200\">\n            <h5 class=\"text-lg font-semibold m-0\">${verseKey}</h5>\n            <button type=\"button\" class=\"btn btn-sm btn-secondary\" data-popup-close>Close</button>\n          </div>\n          <div class=\"max-h-[80vh] overflow-y-auto\" data-popup-body>\n            <div class=\"p-4 text-gray-500\">Loading\u2026</div>\n          </div>\n        </div>\n      </div>\n    `;\n\n    overlay.addEventListener(\"click\", (e) => {\n      if (e.target.closest(\"[data-popup-close]\") || !e.target.closest(\"[data-popup-content]\")) {\n        this.close();\n      }\n    });\n\n    this.escapeHandler = (e) => {\n      if (e.key === \"Escape\") {\n        // Close this popup only; the comparison modal handles Escape itself.\n        e.stopImmediatePropagation();\n        this.close();\n      }\n    };\n    document.addEventListener(\"keydown\", this.escapeHandler, true);\n\n    document.body.appendChild(overlay);\n    this.overlayElement = overlay;\n    this.bodyElement = overlay.querySelector(\"[data-popup-body]\");\n  }\n\n  close() {\n    if (this.overlayElement) {\n      this.overlayElement.remove();\n      this.overlayElement = null;\n      this.bodyElement = null;\n    }\n    if (this.escapeHandler) {\n      document.removeEventListener(\"keydown\", this.escapeHandler, true);\n      this.escapeHandler = null;\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  connect() {\n   this.el = $(this.element);\n\n   const ayahWords = this.el.find(\"[data-location]\");\n\n    ayahWords.on(\"mouseenter\", (event) => {\n      const location = $(event.target).data(\"location\");\n      $(`[data-location='${location}']`).addClass(\"border-highlighted\");\n    })\n\n    ayahWords.on(\"mouseleave\", (event) => {\n      const location = $(event.target).data(\"location\");\n      $(`[data-location='${location}']`).removeClass(\"border-highlighted\");\n    })\n  }\n}\n", "import {Controller} from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  connect() {\n    this.el = $(this.element)\n    this.addThemeButtons()\n    this.bindEvents()\n  }\n\n  addThemeButtons() {\n    const light = \"<button class='btn btn-info' data-theme='theme-light'>Light</button>\"\n    const dark = \"<button class='btn btn-info' data-theme='theme-dark'>Dark</button>\"\n    const sepia = \"<button class='btn btn-info' data-theme='theme-sepia'>Sepia</button>\"\n    const black = \"<button class='btn btn-info' data-theme='theme-black'>Black</button>\"\n\n    const p1 = \"<button class='btn btn-info' data-theme='theme1'>P1</button>\"\n    const p2 = \"<button class='btn btn-info' data-theme='theme2'>P2</button>\"\n    const p3 = \"<button class='btn btn-info' data-theme='theme3'>P3</button>\"\n    const p4 = \"<button class='btn btn-info' data-theme='theme4'>P4</button>\"\n    const p5 = \"<button class='btn btn-info' data-theme='theme5'>P5</button>\"\n    const p6 = \"<button class='btn btn-info' data-theme='theme6'>P6</button>\"\n\n    this.el.append(`<div>${light} ${dark} ${sepia} ${black} ${p1} ${p2} ${p3} ${p4} ${p5} ${p6}</div>`)\n  }\n\n  bindEvents(){\n    this.el.find('[data-theme]').on('click', (e) => {\n      const theme = e.target.dataset.theme;\n      this.el.removeClass(\"theme-light theme-dark theme-sepia theme-black theme-normal theme1 theme2 theme3 theme4 theme5 theme6\")\n      this.el.addClass(theme);\n    })\n  }\n}\n", "import {Controller} from \"@hotwired/stimulus\"\n\nconst TAJWEED_RULE_DESCRIPTION = {\n  ham_wasl: \"Hamzat ul Wasl\",\n  slnt: \"Silent\",\n  laam_shamsiyah: \"Lam Shamsiyyah\",\n  madda_normal: \"Normal Prolongation: 2 Vowels\",\n  madda_permissible: \"Permissible Prolongation: 2, 4, 6 Vowels\",\n  madda_necessary: \"Necessary Prolongation: 6 Vowels\",\n  madda_obligatory: \"Obligatory Prolongation: 4-5 Vowels\",\n  madda_obligatory_monfasel: \"Madd Al-Munfasil 2, 4, or 5 Vowels\",\n  madda_obligatory_mottasel: \"Madd Al-Muttasil 4, or 5 Vowels\",\n  qalaqah: \"Qalaqah\",\n  ikhafa_shafawi: \"Ikhafa' Shafawi - With Meem\",\n  ikhafa: \"Ikhafa'\",\n  iqlab: \"Iqlab\",\n  idgham_shafawi: \"Idgham Shafawi - With Meem\",\n  idgham_ghunnah: \"Idgham - With Ghunnah\",\n  idgham_wo_ghunnah: \"Idgham - Without Ghunnah\",\n  idgham_mutajanisayn: \"Idgham - Mutajanisayn\",\n  idgham_mutaqaribayn: \"Idgham - Mutaqaribayn\",\n  ghunnah: \"Ghunnah: 2 Vowels\",\n  izhar: \"Izhaar Halqi \u0627\u0644\u0625\u0638\u0647\u0627\u0631 \u0627\u0644\u062D\u0644\u0642\u0649\",\n  izhar_shafawi: \"Izhar Shafawi - With Meem\",\n  tafkheem: 'Tafkheem(Heavy letter)'\n}\n\nexport default class extends Controller {\n  connect() {\n    this.addTatweelBeforeDaggerAlif();\n    this.bindTajweedTooltip()\n  }\n\n  addTatweelBeforeDaggerAlif(){\n    /*this.element.querySelectorAll('.madda_normal').forEach((madRule, _) => {\n      if(!madRule.innerText.includes('\u0640')) {\n        madRule.innerText = madRule.innerText.replace(\"\u0670\", \"\u0640\u0670\");\n      }\n    })*/\n\n    this.element.querySelectorAll('.madda_normal').forEach((madRule) => {\n      let prevLetter = this.getPreviousLetter(madRule);\n      if (prevLetter && this.isJoiningLetter(prevLetter) && !madRule.innerText.includes('\u0640')) {\n        madRule.innerText = madRule.innerText.replace(\"\u0670\", \"\u0640\u0670\");\n      }\n    });\n  }\n\n  isJoiningLetter(letter) {\n    const nonJoiningLetters = ['\u0649','\u0648', '\u0632', '\u0631', '\u0630', '\u062F', '\u0627', '\u0621'];\n    return !nonJoiningLetters.includes(letter);\n  }\n\n  getPreviousLetter(madRule) {\n    let prevNode = madRule.previousSibling;\n    if (!prevNode) return null;\n\n    let prevText;\n\n    // If the previous node is an element (wrapped in a div or span), get its text content\n    if (prevNode.nodeType === Node.ELEMENT_NODE) {\n      prevText = prevNode.innerText;\n    }\n    // If the previous node is a text node, get the content\n    else if (prevNode.nodeType === Node.TEXT_NODE) {\n      prevText = prevNode.textContent;\n    }\n\n    if (prevText) {\n      // Strip diacritical marks (harakat) using a regex that matches Arabic harakat Unicode range\n      let baseLetter = prevText.replace(/[\\u064B-\\u0652]/g, '').slice(-1);\n      return baseLetter;\n    }\n\n    return null;\n  }\n  \n  bindTajweedTooltip() {\n    const keys = Object.keys(TAJWEED_RULE_DESCRIPTION);\n    keys.forEach((name) => {\n      this.element.querySelectorAll(`.${name}`).forEach((elem) => {\n        const existingControllers = elem.getAttribute('data-controller') || '';\n        const controllers = existingControllers.split(' ').filter(c => c.trim());\n        if (!controllers.includes('tooltip')) {\n          controllers.push('tooltip');\n          elem.setAttribute('data-controller', controllers.join(' '));\n        }\n        elem.setAttribute('title', TAJWEED_RULE_DESCRIPTION[name]);\n        elem.setAttribute('data-tooltip-placement-value', 'top');\n      })\n    })\n  }\n}\n", "// Visit The Stimulus Handbook for more details\n// https://stimulusjs.org/handbook/introduction\n//\n// This example controller works with specially annotated HTML like:\n//\n// <div data-controller=\"hello\">\n//   <h1 data-target=\"hello.output\"></h1>\n// </div>\n\nimport {Controller} from \"@hotwired/stimulus\";\nimport {loadJavascript} from \"../utils/script_loader\";\n\nconst cleanHtml = (html) => {\n  let dom = $(`<div>`).html(html)\n  dom[0].querySelectorAll(\"span, p, div\")\n    .forEach(el => el.textContent.trim() === \"\" && el.parentNode.removeChild(el));\n\n  return dom.html()\n}\n\nexport default class extends Controller {\n  connect() {\n    this.loadEditor()\n\n    let form = $(this.element).closest('form');\n    form.on('submit', (e) => {\n      const value = this.element.value;\n\n      if (value)\n        this.element.value = cleanHtml(value)\n    })\n\n    this.confirmEditor();\n  }\n\n  disconnect() {\n    if (typeof tinyMCE == \"object\") {\n      const active = tinymce.activeEditor;\n      if (active)\n        active.destroy()\n    }\n  }\n\n  loadEditor() {\n    if (typeof tinyMCE == \"object\") {\n      this.createEditor();\n    } else {\n      loadJavascript(\"https://cdnjs.cloudflare.com/ajax/libs/tinymce/5.4.1/tinymce.min.js\").then(this.createEditor.bind(this))\n    }\n  }\n\n  confirmEditor() {\n    let element = $(this.element);\n\n    setTimeout(() => {\n      // if text area is still visible, means editor didn't initialized\n      if (element.is(\":visible\")) {\n        this.loadEditor();\n      }\n    }, 300);\n  }\n\n\n  createEditor() {\n    if (tinymce.get(this.element.id)) return\n\n    const {stylesheet} = this.element.dataset;\n    const styles = [document.querySelector('#tinymce_custom_style').href];\n\n    if (stylesheet)\n      styles.push(stylesheet)\n\n    tinymce.init({\n      selector: `#${this.element.id}`,\n      height: 500,\n      convert_urls: false,\n      menubar: true,\n      forced_root_block: false,\n      entity_encoding: \"raw\",\n      force_p_newlines: true,\n      content_css: styles,\n      setup: (editor) => {\n        editor.on(\"selectionchange\", () => {\n          var selectedText = editor.selection.getContent({format: \"text\"});\n\n          // Check if text is selected\n          if (selectedText.length > 0) {\n           // this.showPopup(selectedText, editor.selection);\n          } else {\n            // Hide the popup if no text is selected\n           // this.hidePopup();\n          }\n        });\n\n        editor.ui.registry.addButton(\"popupButton\", {\n          icon: \"paste-text\",\n          onAction: () => {\n            // Custom logic to display the popup when the button is clicked\n            // You can use the editor.selection API to get the selected text\n            var selectedText = editor.selection.getContent({format: \"text\"});\n            this.showPopup(selectedText, editor.selection);\n          },\n        })\n      },\n      plugins: [\n        \"advlist lists link image charmap print preview anchor\",\n        \"searchreplace visualblocks fullscreen\",\n        \"insertdatetime media table paste code help wordcount selection\"\n      ],\n      toolbar:\n        \"undo redo | formatselect | \" +\n        \" bold italic backcolor | alignleft aligncenter \" +\n        \" alignright alignjustify | bullist numlist outdent indent | \" +\n        \" removeformat | popupButton | help\"\n    });\n  }\n\n  hidePopup() {\n\n  }\n\n  showPopup(selectedText, selection) {\n    $(\".suggestion-popup\").remove();\n\n    var popup = document.createElement(\"div\");\n    popup.className = \"suggestion-popup\";\n    popup.innerHTML = this.suggestionPopupTemplate(selectedText);\n\n    var selectedRange = selection.getRng();\n    /* var boundingRect = selectedRange.getBoundingClientRect();\n     popup.style.top = boundingRect.bottom + \"px\";\n     popup.style.left = boundingRect.left + \"px\";\n */\n    // Append the popup to the body\n    document.body.appendChild(popup);\n\n    // Close the popup when clicking outside of it\n    document.addEventListener(\"click\", function (event) {\n      if (!popup.contains(event.target)) {\n        document.body.removeChild(popup);\n      }\n    });\n  }\n\n  suggestionPopupTemplate(text) {\n    return `\n<div class=\"suggestion-panel\" data-controller=\"search-suggestion\">\n <div class=\"header\">\n <span>Search suggestion</span>\n  <button class=\"close\">x</button>\n </div>\n\n<div class=\"suggestions\">\n<section>\n  \n</section>\n</div>\n\n<div class=\"search-wrapper\">\n  <textarea>${text}</textarea>\n</div>\n</div>`\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n\nexport default class extends Controller {\n  connect() {\n    this.el = $(this.element);\n    this.state = 'hidden'\n\n    this.parent = this.el.closest('.password')\n    this.parent.css('position', 'relative')\n\n    this.el.after(`<div class=\"toggle-password\"><i class=\"fa fa-eye\"></i></div>`);\n    this.parent.on('click', '.toggle-password', this.togglePassword.bind(this));\n  }\n\n  togglePassword(){\n    if(this.state === 'hidden'){\n      this.parent.find('input').attr('type', 'text');\n      this.state = 'visible';\n      this.parent.find('i').removeClass('fa-eye').addClass('fa-eye-slash');\n    } else {\n      this.parent.find('input').attr('type', 'password');\n      this.state = 'hidden';\n      this.parent.find('i').removeClass('fa-eye-slash').addClass('fa-eye');\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  static values = {\n    placement: { type: String, default: \"top\" },\n    offset: { type: Number, default: 8 }\n  }\n\n  connect() {\n    // Determine the title, prioritizing our cached version to survive re-connections\n    this.title = this.element.dataset.qulTooltipTitle || \n                 this.element.getAttribute(\"title\") || \n                 this.element.dataset.title;\n    \n    if (!this.title || !this.title.trim()) return;\n\n    // Cache it in a data attribute that doesn't trigger tooltips naturally\n    this.element.dataset.qulTooltipTitle = this.title;\n    \n    // Remove the native title to prevent double tooltips\n    this.element.removeAttribute(\"title\");\n\n    this.showTooltip = this.showTooltip.bind(this);\n    this.hideTooltip = this.hideTooltip.bind(this);\n\n    this.element.addEventListener(\"mouseenter\", this.showTooltip);\n    this.element.addEventListener(\"mouseleave\", this.hideTooltip);\n    // Use focusin/out for accessibility but add tabIndex if needed (handled in views usually)\n    this.element.addEventListener(\"focusin\", this.showTooltip);\n    this.element.addEventListener(\"focusout\", this.hideTooltip);\n  }\n\n  disconnect() {\n    this.element.removeEventListener(\"mouseenter\", this.showTooltip);\n    this.element.removeEventListener(\"mouseleave\", this.hideTooltip);\n    this.element.removeEventListener(\"focusin\", this.showTooltip);\n    this.element.removeEventListener(\"focusout\", this.hideTooltip);\n    this.removeTooltip();\n  }\n\n  showTooltip() {\n    // Ensure we don't have multiple tooltips\n    this.removeTooltip();\n\n    // Create the tooltip element\n    this.tooltip = document.createElement(\"div\");\n    this.tooltip.setAttribute(\"role\", \"tooltip\");\n    \n    // Apply styles directly to be safe from purge or config issues\n    // Using  classes for theme consistency\n    this.tooltip.className = \"fixed z-[99999] px-3 py-1.5 text-[11px] font-medium text-white bg-gray-900 rounded shadow-xl pointer-events-none whitespace-nowrap leading-tight\";\n    \n    // Explicit visibility management\n    this.tooltip.style.opacity = \"0\";\n    this.tooltip.style.visibility = \"hidden\";\n    this.tooltip.style.display = \"block\";\n    this.tooltip.textContent = this.title;\n    \n    // Add the arrow\n    this.arrow = document.createElement(\"div\");\n    this.arrow.className = \"absolute w-2 h-2 bg-gray-900 rotate-45\";\n    this.tooltip.appendChild(this.arrow);\n\n    document.body.appendChild(this.tooltip);\n\n    // Give the browser a moment to layout the tooltip so we can measure it\n    // offsetWidth only works if display != none\n    requestAnimationFrame(() => {\n      this.updatePosition();\n      if (this.tooltip) {\n        this.tooltip.style.visibility = \"visible\";\n        this.tooltip.style.opacity = \"1\";\n        // Smooth transition\n        this.tooltip.style.transition = \"opacity 0.1s ease-out, transform 0.1s ease-out\";\n      }\n    });\n  }\n\n  hideTooltip() {\n    if (this.tooltip) {\n      this.tooltip.style.opacity = \"0\";\n      const el = this.tooltip;\n      // Faster cleanup\n      setTimeout(() => {\n        if (el && el.parentNode) el.parentNode.removeChild(el);\n      }, 100);\n      this.tooltip = null;\n    }\n  }\n\n  removeTooltip() {\n    const existing = document.body.querySelectorAll('div[role=\"tooltip\"]');\n    existing.forEach(el => {\n      if (el.parentNode) el.parentNode.removeChild(el);\n    });\n    this.tooltip = null;\n  }\n\n  updatePosition() {\n    if (!this.tooltip) return;\n\n    const rect = this.element.getBoundingClientRect();\n    const tipWidth = this.tooltip.offsetWidth;\n    const tipHeight = this.tooltip.offsetHeight;\n    \n    // We use getBoundingClientRect for the button, \n    // and since the tooltip is fixed, we coordinate directly with it.\n    \n    const centerX = rect.left + (rect.width / 2);\n    const centerY = rect.top + (rect.height / 2);\n    \n    let x = 0;\n    let y = 0;\n    let arrowStyle = {};\n\n    const placement = this.placementValue || \"top\";\n    const offset = this.offsetValue || 8;\n\n    if (placement === \"top\") {\n      x = centerX - (tipWidth / 2);\n      y = rect.top - tipHeight - offset;\n      arrowStyle = { bottom: \"-4px\", left: \"50%\", marginLeft: \"-4px\" };\n    } else if (placement === \"bottom\") {\n      x = centerX - (tipWidth / 2);\n      y = rect.bottom + offset;\n      arrowStyle = { top: \"-4px\", left: \"50%\", marginLeft: \"-4px\" };\n    } else if (placement === \"left\") {\n      x = rect.left - tipWidth - offset;\n      y = centerY - (tipHeight / 2);\n      arrowStyle = { right: \"-4px\", top: \"50%\", marginTop: \"-4px\" };\n    } else if (placement === \"right\") {\n      x = rect.right + offset;\n      y = centerY - (tipHeight / 2);\n      arrowStyle = { left: \"-4px\", top: \"50%\", marginTop: \"-4px\" };\n    }\n\n    // Viewport collision protection (keep 10px from edges)\n    const padding = 10;\n    x = Math.max(padding, Math.min(x, window.innerWidth - tipWidth - padding));\n    y = Math.max(padding, Math.min(y, window.innerHeight - tipHeight - padding));\n\n    this.tooltip.style.left = `${x}px`;\n    this.tooltip.style.top = `${y}px`;\n    \n    // Fine-tune arrow position if the tooltip was shifted by padding logic\n    if (placement === \"top\" || placement === \"bottom\") {\n      const idealX = centerX - (tipWidth / 2);\n      const shift = idealX - x;\n      const arrowLeft = (tipWidth / 2) + shift;\n      // Constrain arrow within the tooltip width\n      this.arrow.style.left = `${Math.max(8, Math.min(tipWidth - 8, arrowLeft))}px`;\n    }\n\n    Object.assign(this.arrow.style, arrowStyle);\n  }\n}", "// Visit The Stimulus Handbook for more details\n// https://stimulusjs.org/handbook/introduction\n//\n// This example controller works with specially annotated HTML like:\n//\n// <div data-controller=\"hello\">\n//   <h1 data-target=\"hello.output\"></h1>\n// </div>\n\nimport AjaxModalController from \"./ajax_modal_controller\"\n\nexport default class extends AjaxModalController {\n    connect() {\n        const draft = this.element.getAttribute(\"draft\");\n\n        $(this.element).on(\"click\", \"sup\", e => {\n            e.preventDefault();\n            const target = e.target;\n\n            this.loadModal(target.getAttribute(\"foot_note\"), draft);\n        });\n    }\n\n    loadModal(id, isDraft) {\n        var that = this;\n\n        let url = `/foot_notes/${id}?draft=${isDraft}`;\n        this.createModal('translation');\n        this.show();\n\n        fetch(url).then(response => response.text()).then(content => {\n            const response = $(\"<div>\").html(content);\n            this.setContent(response.find(\"#title\").html(), response.find(\"#body\").html())\n        }).catch(err => {\n            if (401 == err.status) {\n                const modalBody = document.getElementById('modal-body');\n                if (modalBody) {\n                    modalBody.innerHTML = `\n                    <div class='text-center p-5'> \n                        <h2>${err.responseText}</h2>\n                        <p><a href=\"/users/sign_in?user_return_to=${location.pathname}\" class=\"btn btn-primary\">Login</a></p>\n                    </div>`;\n                }\n            }\n        })\n    }\n}", "import {Controller} from \"@hotwired/stimulus\";\n\nconst HARDCODED_FOOTNOTES = {\n  pl: \"Plural \u2014 the Arabic address or verb is plural\",\n  sg: \"Singular \u2014 the Arabic address or verb is singular\",\n  dl: \"Dual \u2014 the Arabic address or verb is dual\",\n};\n\nexport default class extends Controller {\n  connect() {\n    this.inlineFootnotes()\n  }\n\n  inlineFootnotes() {\n    const footnotes = this.element.querySelectorAll('sup')\n    footnotes.forEach((dom) => {\n      const footNote = dom.getAttribute('foot_note')\n      const marker = (dom.textContent || '').trim().toLowerCase()\n\n      dom.classList.add('footnote-marker')\n\n      if (!footNote && HARDCODED_FOOTNOTES[marker]) {\n        dom.classList.add('footnote-grammar')\n        dom.setAttribute('title', HARDCODED_FOOTNOTES[marker])\n        return\n      }\n\n      if (footNote) {\n        $(dom).append(`(${footNote})`)\n      }\n    })\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  toggle(e) {\n    e.preventDefault();\n    e.stopPropagation();\n\n    const sup = e.currentTarget;\n    const id = sup.getAttribute(\"data-footnote-id\");\n    if (!id) return;\n\n    const block = this.element.querySelector(`[data-footnote-block-id=\"${id}\"]`);\n    if (!block) return;\n\n    if (block.classList.contains(\"hidden\")) {\n      this.element\n        .querySelectorAll(\"[data-footnote-block-id]\")\n        .forEach((el) => el.classList.add(\"hidden\"));\n      block.classList.remove(\"hidden\");\n    } else {\n      block.classList.add(\"hidden\");\n    }\n  }\n\n  close(e) {\n    e.preventDefault();\n    e.stopPropagation();\n\n    const btn = e.currentTarget;\n    const id = btn.getAttribute(\"data-footnote-close-id\");\n    if (!id) return;\n\n    const block = this.element.querySelector(`[data-footnote-block-id=\"${id}\"]`);\n    if (block) block.classList.add(\"hidden\");\n  }\n}\n\n\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Footnotes in the translation proofreading form. The text links a footnote\n// with {{n}}, and each footnote has a box with its text.\n//\n// - Add footnote puts the next {{n}} at the cursor and adds its box\n// - Remove takes the box and its {{n}} out\n// - Typing a {{n}} that has no box adds one, a box whose {{n}} is gone is flagged\nexport default class extends Controller {\n  static targets = [\"text\", \"list\", \"template\", \"empty\"];\n\n  connect() {\n    this.cursorMoved = false;\n    this.refresh();\n  }\n\n  // Before the user clicks into the text, a new footnote goes at the end\n  track() {\n    this.cursorMoved = true;\n  }\n\n  add() {\n    const key = this.nextKey();\n    const marker = `{{${key}}}`;\n    const textarea = this.textTarget;\n    const at = this.cursorMoved ? textarea.selectionEnd : textarea.value.length;\n    // A footnote follows the word before it: \"worlds {{2}} and\"\n    const before = textarea.value.slice(0, at).trimEnd();\n    const after = textarea.value.slice(at);\n    const spacer = after && !/^\\s/.test(after) ? \" \" : \"\";\n\n    textarea.value = `${before}${before ? \" \" : \"\"}${marker}${spacer}${after}`;\n    const box = this.addBox(key);\n    this.refresh();\n    box.querySelector(\"textarea\").focus();\n  }\n\n  remove(event) {\n    const box = event.target.closest(\"[data-key]\");\n    const pattern = new RegExp(`\\\\s*\\\\{\\\\{\\\\s*${box.dataset.key}\\\\s*\\\\}\\\\}`, \"g\");\n\n    this.textTarget.value = this.textTarget.value.replace(pattern, \"\");\n    box.remove();\n    this.refresh();\n  }\n\n  refresh() {\n    const keys = this.markerKeys();\n\n    keys.forEach((key) => {\n      if (!this.box(key)) this.addBox(key);\n    });\n\n    this.boxes().forEach((box) => {\n      const used = keys.includes(box.dataset.key);\n      box.querySelector(\"[data-unused]\").classList.toggle(\"hidden\", used);\n      box.classList.toggle(\"border-amber-400\", !used);\n    });\n\n    this.emptyTarget.classList.toggle(\"hidden\", this.boxes().length > 0);\n  }\n\n  addBox(key) {\n    const html = this.templateTarget.innerHTML.replace(/KEY/g, key);\n    this.listTarget.insertAdjacentHTML(\"beforeend\", html);\n    return this.box(key);\n  }\n\n  markerKeys() {\n    return [...this.textTarget.value.matchAll(/\\{\\{\\s*(\\d+)\\s*\\}\\}/g)].map((match) => match[1]);\n  }\n\n  nextKey() {\n    const keys = [...this.markerKeys(), ...this.boxes().map((box) => box.dataset.key)].map(Number);\n    return keys.length ? Math.max(...keys) + 1 : 1;\n  }\n\n  boxes() {\n    return [...this.listTarget.querySelectorAll(\"[data-key]\")];\n  }\n\n  box(key) {\n    return this.listTarget.querySelector(`[data-key=\"${key}\"]`);\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// ============================================================================\n// Treebank rendering\n// ----------------------------------------------------------------------------\n// Renders the JSON payload from Morphology::TreebankPresenter as an SVG\n// dependency/constituency graph, modelled on the Python (displaCy-derived)\n// reference. There are two moving parts:\n//\n//   1. collapseSentence(sentence, depth) \u2014 a pure transform that folds the\n//      constituency tree to a given depth. It collapses the deepest phrase\n//      nodes into synthetic \"phrase_unit\" tokens and remaps every token\n//      position / edge endpoint / phrase span so the renderer can draw the\n//      folded view without knowing anything about collapsing. Depth 0 = fully\n//      expanded (all words shown); higher depth = fewer, larger units.\n//\n//   2. TreebankRenderer \u2014 lays the SVG out in horizontal bands, top to bottom:\n//        banner            reconstructed ayah text + reference\n//        phraseTopGap      headroom so phrase-edge arcs clear the banner\n//        phrase levels     constituency nodes, one row per level (dots+labels)\n//        arc band          dependency arcs curving above the words\n//        token row         the surface words (drawn RIGHT-TO-LEFT)\n//      Words sit in the bottom row; dependency edges arc above them; phrase\n//      (constituency) edges and floating elided nodes live in the upper band.\n//\n// The Controller wires zoom, the accordion (one card per sentence), and the\n// per-sentence level +/- controls that call collapseSentence then re-render.\n// ============================================================================\n\n// Fold `sentence`'s constituency tree so the `depth` deepest levels stay open\n// and everything below is merged into single \"phrase_unit\" tokens. Returns a\n// NEW sentence object (never mutates the input) with rewritten tokens/edges/\n// phraseNodes whose positions are contiguous 0..n again.\nexport function collapseSentence(sentence, depth) {\n  const phraseNodes = (sentence.phraseNodes || []).map(pn => Object.assign({}, pn, { span: [...pn.span] }));\n  const originalTokens = (sentence.tokens || []).map(t => Object.assign({}, t));\n  const originalEdges = (sentence.edges || []).map(e => Object.assign({}, e));\n\n  const maxLevel = phraseNodes.length > 0 ? Math.max(...phraseNodes.map(pn => pn.level)) : 0;\n  const collapseLevel = maxLevel - depth;\n\n  if (collapseLevel <= 0) {\n    return Object.assign({}, sentence, {\n      tokens: originalTokens,\n      edges: originalEdges,\n      phraseNodes: phraseNodes,\n    });\n  }\n\n  const isSpanContainedIn = (inner, outer) =>\n    outer.span[0] <= inner.span[0] && outer.span[1] >= inner.span[1];\n\n  // Nodes at/below collapseLevel get folded away; nodes above stay open.\n  const collapsibleNodes = phraseNodes.filter(pn => pn.level <= collapseLevel);\n  const openedNodes = phraseNodes.filter(pn => pn.level > collapseLevel);\n\n  // The outermost collapsible nodes (not contained by another collapsible one)\n  // become the visible units \u2014 each renders as one merged phrase_unit token.\n  const topCollapsedUnits = collapsibleNodes.filter(pn =>\n    !collapsibleNodes.some(other => other !== pn && isSpanContainedIn(pn, other))\n  );\n\n  // Drop opened nodes that now live inside a collapsed unit \u2014 they've vanished.\n  const visibleOpenedNodes = openedNodes.filter(o =>\n    !topCollapsedUnits.some(u => isSpanContainedIn(o, u))\n  );\n\n  const coveredByUnit = (position) => {\n    let owner = null;\n    for (const u of topCollapsedUnits) {\n      if (u.span[0] <= position && u.span[1] >= position) {\n        if (!owner || (u.span[1] - u.span[0]) < (owner.span[1] - owner.span[0])) owner = u;\n      }\n    }\n    return owner;\n  };\n\n  // Walk the original tokens left\u2192right rebuilding a contiguous position list:\n  // each run of tokens covered by a collapsed unit collapses to ONE synthetic\n  // phrase_unit token (emitted the first time that unit is hit); uncovered\n  // tokens pass through with a fresh sequential position.\n  const newTokens = [];\n  const unitSyntheticIndex = new Map();\n  const usedUnits = new Set();\n  let pos = 0;\n\n  for (const tok of originalTokens) {\n    const unit = coveredByUnit(tok.position);\n    if (unit) {\n      if (!usedUnits.has(unit)) {\n        usedUnits.add(unit);\n        unitSyntheticIndex.set(unit, pos);\n        newTokens.push({\n          position: pos,\n          location: null,\n          arabic: unit.text,\n          posKey: unit.labelKey,\n          posLabel: unit.label,\n          colorClass: \"green\",\n          tokenType: \"phrase_unit\",\n          labelCategory: \"edge_relations\",\n          wordUrl: null,\n        });\n        pos++;\n      }\n    } else {\n      newTokens.push(Object.assign({}, tok, { position: pos }));\n      pos++;\n    }\n  }\n\n  // Build old-position \u2192 new-position map so edges and phrase spans can be\n  // remapped onto the rebuilt token list (unit-covered positions all map to\n  // their unit's synthetic index).\n  const origPosToNewPos = {};\n  const origNonUnitTokens = originalTokens.filter(t => !coveredByUnit(t.position));\n  const nonUnitNewTokens = newTokens.filter(t => t.tokenType !== \"phrase_unit\");\n  for (let i = 0; i < origNonUnitTokens.length; i++) {\n    origPosToNewPos[origNonUnitTokens[i].position] = nonUnitNewTokens[i].position;\n  }\n  for (const orig of originalTokens) {\n    const unit = coveredByUnit(orig.position);\n    if (unit) origPosToNewPos[orig.position] = unitSyntheticIndex.get(unit);\n  }\n\n  const remapPosition = (value) => {\n    const mapped = origPosToNewPos[value];\n    return mapped !== undefined ? mapped : value;\n  };\n\n  const remapCentroid = (value) => {\n    const floor = Math.floor(value);\n    const ceil = Math.ceil(value);\n    const lo = origPosToNewPos[floor];\n    const hi = origPosToNewPos[ceil];\n    if (lo === undefined && hi === undefined) return value;\n    if (lo === undefined) return hi;\n    if (hi === undefined) return lo;\n    if (floor === ceil) return lo;\n    return lo + (hi - lo) * (value - floor);\n  };\n\n  const remappedPhraseNodes = visibleOpenedNodes.map(pn => Object.assign({}, pn, {\n    span: [remapPosition(pn.span[0]), remapPosition(pn.span[1])],\n    centroid: remapCentroid(pn.centroid),\n    headPosition: remapPosition(pn.headPosition),\n  }));\n\n  // Resolve one edge endpoint to its new (position, isPhrase) after folding.\n  // A phrase endpoint stays a phrase only if its node is still visibly open;\n  // otherwise (or if it fell inside a collapsed unit) it becomes a word-level\n  // endpoint pointing at the merged unit.\n  const resolveEndpoint = (edgePos, isPhrase) => {\n    if (isPhrase) {\n      const pn = phraseNodes.find(p => p.headPosition === edgePos)\n        || phraseNodes\n          .filter(p => p.span[0] <= edgePos && p.span[1] >= edgePos)\n          .sort((a, b) => (a.span[1] - a.span[0]) - (b.span[1] - b.span[0]))[0];\n      if (pn) {\n        const unit = topCollapsedUnits.find(u => isSpanContainedIn(pn, u));\n        if (unit) return { pos: unitSyntheticIndex.get(unit), isPhrase: false };\n        if (visibleOpenedNodes.includes(pn)) {\n          return { pos: remapPosition(edgePos), isPhrase: true };\n        }\n      }\n      const coveringUnit = coveredByUnit(edgePos);\n      if (coveringUnit) return { pos: unitSyntheticIndex.get(coveringUnit), isPhrase: false };\n      return { pos: remapPosition(edgePos), isPhrase: false };\n    }\n    const unit = coveredByUnit(edgePos);\n    if (unit) return { pos: unitSyntheticIndex.get(unit), isPhrase: false };\n    return { pos: remapPosition(edgePos), isPhrase: false };\n  };\n\n  // Remap every edge; drop edges that now connect a unit to itself (both ends\n  // folded into the same word) and de-dupe edges that collapsed onto the same\n  // from/to/relation triple.\n  const newEdges = [];\n  const seen = new Set();\n  for (const edge of originalEdges) {\n    const fromResolved = resolveEndpoint(edge.from, edge.fromIsPhrase);\n    const toResolved = resolveEndpoint(edge.to, edge.toIsPhrase);\n    if (fromResolved.pos === toResolved.pos && !fromResolved.isPhrase && !toResolved.isPhrase) continue;\n    const edgeKey = `${fromResolved.pos}:${fromResolved.isPhrase}:${toResolved.pos}:${toResolved.isPhrase}:${edge.relation}`;\n    if (seen.has(edgeKey)) continue;\n    seen.add(edgeKey);\n    newEdges.push(Object.assign({}, edge, {\n      from: fromResolved.pos,\n      to: toResolved.pos,\n      fromIsPhrase: fromResolved.isPhrase,\n      toIsPhrase: toResolved.isPhrase,\n    }));\n  }\n\n  return Object.assign({}, sentence, {\n    tokens: newTokens,\n    edges: newEdges,\n    phraseNodes: remappedPhraseNodes,\n  });\n}\n\n// Stimulus controller: fetches the payload from `url` and renders it either as\n// a flat list of sentences (expandable=false) or as an accordion where each\n// card has its own collapse-depth controls (expandable=true). Zoom scales the\n// rendered SVGs via their stored data-base-width/height.\nexport default class extends Controller {\n  static targets = [\"container\", \"canvas\", \"zoomIn\", \"zoomOut\", \"zoomReset\", \"download\", \"accordionList\"];\n  static values = {\n    url: String,\n    expandable: Boolean,\n  };\n\n  connect() {\n    this.zoomLevel = 1.0;\n    this.sentenceStates = [];\n    this.payload = null;\n    if (this.hasUrlValue) {\n      this.loadData();\n    }\n  }\n\n  zoomIn() {\n    this.zoomLevel = Math.min(2.0, parseFloat((this.zoomLevel + 0.1).toFixed(1)));\n    this.applyZoom();\n  }\n\n  zoomOut() {\n    this.zoomLevel = Math.max(0.5, parseFloat((this.zoomLevel - 0.1).toFixed(1)));\n    this.applyZoom();\n  }\n\n  zoomReset() {\n    this.zoomLevel = 1.0;\n    this.applyZoom();\n  }\n\n  applyZoom() {\n    let scope;\n    if (this.expandableValue && this.hasAccordionListTarget) {\n      scope = this.accordionListTarget;\n    } else {\n      scope = this.containerTarget.querySelector(\".treebank-zoom-wrapper\");\n    }\n    if (!scope) return;\n    scope.querySelectorAll(\"svg[data-base-width]\").forEach(svg => {\n      const bw = parseFloat(svg.getAttribute(\"data-base-width\"));\n      const bh = parseFloat(svg.getAttribute(\"data-base-height\"));\n      svg.setAttribute(\"width\", bw * this.zoomLevel);\n      svg.setAttribute(\"height\", bh * this.zoomLevel);\n    });\n  }\n\n  async loadData() {\n    try {\n      if (!this.expandableValue) {\n        this.containerTarget.textContent = \"Loading treebank...\";\n      }\n      const res = await fetch(this.urlValue, { headers: { Accept: \"application/json\" } });\n      if (!res.ok) throw new Error(`HTTP ${res.status}`);\n      const data = await res.json();\n      this.payload = data;\n      if (this.expandableValue) {\n        await this.renderAccordion(data);\n      } else {\n        await this.renderAll(data);\n      }\n    } catch (err) {\n      console.error(\"Treebank load failed:\", err);\n      const errorEl = document.createElement(\"div\");\n      errorEl.className = \"text-red-500 p-4\";\n      errorEl.textContent = \"Failed to load treebank data.\";\n      const host = this.expandableValue && this.hasAccordionListTarget ? this.accordionListTarget : this.containerTarget;\n      host.innerHTML = \"\";\n      host.appendChild(errorEl);\n    }\n  }\n\n  async renderAll(payload) {\n    const sentences = payload.sentences || [];\n    this.containerTarget.innerHTML = \"\";\n\n    await this.loadFonts();\n\n    const zoomWrapper = document.createElement(\"div\");\n    zoomWrapper.className = \"treebank-zoom-wrapper\";\n    this.containerTarget.appendChild(zoomWrapper);\n\n    for (let i = 0; i < sentences.length; i++) {\n      const sentence = sentences[i];\n      const renderer = new TreebankRenderer(sentence);\n      const svg = await renderer.render();\n      const wrapper = document.createElement(\"div\");\n      wrapper.className = \"treebank-sentence-wrap\";\n      if (i === 0) {\n        wrapper.setAttribute(\"data-syntax-graph-download-target\", \"graphContainer\");\n      }\n      wrapper.appendChild(svg);\n      zoomWrapper.appendChild(wrapper);\n    }\n\n    this.applyZoom();\n    if (this.hasCanvasTarget) this.centerScroll(this.canvasTarget);\n  }\n\n  // Center the horizontal scroll so a wide treebank opens on its middle rather\n  // than one edge. rAF lets layout settle after the SVG width is applied.\n  centerScroll(scroller) {\n    if (!scroller) return;\n    requestAnimationFrame(() => {\n      const overflow = scroller.scrollWidth - scroller.clientWidth;\n      if (overflow > 0) scroller.scrollLeft = overflow / 2;\n    });\n  }\n\n  // Both faces must be resolved before the first measureText call, or every\n  // slot gets sized against a fallback font and the layout comes out wrong.\n  async loadFonts() {\n    await Promise.all([\n      document.fonts.load(\"1em digitalkhatt-v2\"),\n      document.fonts.load(\"1em qpc-hafs\"),\n    ]).catch(() => {});\n  }\n\n  sentenceMaxLevel(sentence) {\n    const phraseNodes = sentence.phraseNodes || [];\n    return phraseNodes.length > 0 ? Math.max(...phraseNodes.map(pn => pn.level)) : 0;\n  }\n\n  async renderAccordion(payload) {\n    const sentences = payload.sentences || [];\n    await this.loadFonts();\n\n    this.sentenceStates = sentences.map((_, i) => ({ expanded: i === 0, depth: 0 }));\n\n    this.accordionListTarget.innerHTML = \"\";\n\n    for (let i = 0; i < sentences.length; i++) {\n      const card = this.buildCard(sentences[i], i);\n      this.accordionListTarget.appendChild(card);\n      if (this.sentenceStates[i].expanded) {\n        await this.renderCardSvg(i);\n      }\n    }\n\n    this.updateDownloadTarget();\n  }\n\n  buildCard(sentence, idx) {\n    const maxLevel = this.sentenceMaxLevel(sentence);\n    const state = this.sentenceStates[idx];\n\n    const card = document.createElement(\"div\");\n    card.className = \"tb-card\";\n    card.setAttribute(\"data-sentence-idx\", idx);\n\n    const header = document.createElement(\"div\");\n    header.className = \"tb-card-header\";\n\n    const titleArea = document.createElement(\"div\");\n    titleArea.className = \"tb-card-title\";\n\n    const titleText = document.createElement(\"span\");\n    titleText.className = \"tb-card-title-text\";\n    titleText.textContent = `Sentence ${idx + 1}`;\n\n    const rangeSpan = document.createElement(\"span\");\n    rangeSpan.className = \"tb-card-range\";\n    rangeSpan.textContent = sentence.verseRange || \"\";\n\n    const countSpan = document.createElement(\"span\");\n    countSpan.className = \"tb-card-count\";\n    countSpan.textContent = `${(sentence.tokens || []).length} tokens`;\n\n    const snippetSpan = document.createElement(\"span\");\n    snippetSpan.className = \"tb-card-snippet\";\n    const bannerText = (sentence.banner && sentence.banner.text) || \"\";\n    snippetSpan.textContent = bannerText.length > 80 ? `${bannerText.slice(0, 80)}\u2026` : bannerText;\n\n    titleArea.appendChild(titleText);\n    titleArea.appendChild(rangeSpan);\n    titleArea.appendChild(countSpan);\n    titleArea.appendChild(snippetSpan);\n\n    const chevron = document.createElement(\"button\");\n    chevron.type = \"button\";\n    chevron.className = \"tb-card-chevron\";\n    chevron.setAttribute(\"data-action\", \"click->treebank#toggleCard\");\n    chevron.setAttribute(\"data-idx\", idx);\n    chevron.setAttribute(\"title\", \"Expand or collapse\");\n    const chevronIcon = document.createElement(\"i\");\n    chevronIcon.className = state.expanded ? \"fa fa-chevron-up\" : \"fa fa-chevron-down\";\n    chevron.appendChild(chevronIcon);\n\n    header.appendChild(titleArea);\n    header.appendChild(chevron);\n    card.appendChild(header);\n\n    const body = document.createElement(\"div\");\n    body.className = state.expanded ? \"tb-card-body\" : \"tb-card-body hidden\";\n\n    if (maxLevel > 0) {\n      const controls = document.createElement(\"div\");\n      controls.className = \"tb-card-controls\";\n\n      const mkBtn = (action, label) => {\n        const btn = document.createElement(\"button\");\n        btn.type = \"button\";\n        btn.className = \"tb-btn-level\";\n        btn.setAttribute(\"data-action\", `click->treebank#${action}`);\n        btn.setAttribute(\"data-idx\", idx);\n        btn.textContent = label;\n        return btn;\n      };\n\n      const depthDisplay = document.createElement(\"span\");\n      depthDisplay.className = \"tb-depth-display\";\n      depthDisplay.setAttribute(\"data-depth-display\", idx);\n      depthDisplay.textContent = `${state.depth} / ${maxLevel}`;\n\n      controls.appendChild(mkBtn(\"levelDown\", \"\u2212 level\"));\n      controls.appendChild(depthDisplay);\n      controls.appendChild(mkBtn(\"levelUp\", \"+ level\"));\n      controls.appendChild(mkBtn(\"expandAllLevels\", \"expand all\"));\n      controls.appendChild(mkBtn(\"collapseAllLevels\", \"collapse all\"));\n      body.appendChild(controls);\n    }\n\n    const svgContainer = document.createElement(\"div\");\n    svgContainer.className = \"tb-card-svg-container\";\n    // Drag-to-pan, same as the standalone canvas; the container scrolls in\n    // both directions once the tree outgrows it.\n    svgContainer.setAttribute(\"data-controller\", \"draggable-scroll\");\n    svgContainer.setAttribute(\"data-action\", \"mousedown->draggable-scroll#mouseDownHandler\");\n    body.appendChild(svgContainer);\n    card.appendChild(body);\n\n    return card;\n  }\n\n  cardFor(idx) {\n    return this.accordionListTarget.querySelector(`[data-sentence-idx=\"${idx}\"]`);\n  }\n\n  // Re-render one card's SVG at its current collapse depth. Always folds from\n  // the pristine payload sentence (never a previously-folded one) so depth\n  // changes are absolute, not cumulative.\n  async renderCardSvg(idx) {\n    const sentences = (this.payload && this.payload.sentences) || [];\n    const sentence = sentences[idx];\n    const card = this.cardFor(idx);\n    if (!sentence || !card) return;\n\n    const svgContainer = card.querySelector(\".tb-card-svg-container\");\n    if (!svgContainer) return;\n\n    const transformed = collapseSentence(sentence, this.sentenceStates[idx].depth);\n    const renderer = new TreebankRenderer(transformed);\n    const svg = await renderer.render();\n    svgContainer.innerHTML = \"\";\n    svgContainer.appendChild(svg);\n    this.applyZoom();\n    this.centerScroll(svgContainer);\n  }\n\n  async toggleCard(event) {\n    const idx = parseInt(event.currentTarget.getAttribute(\"data-idx\"), 10);\n    if (isNaN(idx) || !this.sentenceStates[idx]) return;\n\n    const state = this.sentenceStates[idx];\n    state.expanded = !state.expanded;\n\n    const card = this.cardFor(idx);\n    if (!card) return;\n\n    const body = card.querySelector(\".tb-card-body\");\n    const chevronIcon = card.querySelector(\".tb-card-chevron i\");\n\n    if (state.expanded) {\n      body.classList.remove(\"hidden\");\n      if (chevronIcon) chevronIcon.className = \"fa fa-chevron-up\";\n      const svgContainer = card.querySelector(\".tb-card-svg-container\");\n      if (svgContainer && !svgContainer.querySelector(\"svg\")) {\n        await this.renderCardSvg(idx);\n      }\n    } else {\n      body.classList.add(\"hidden\");\n      if (chevronIcon) chevronIcon.className = \"fa fa-chevron-down\";\n    }\n\n    this.updateDownloadTarget();\n  }\n\n  async changeDepth(idx, newDepth) {\n    const sentences = (this.payload && this.payload.sentences) || [];\n    const sentence = sentences[idx];\n    if (!sentence) return;\n\n    const maxLevel = this.sentenceMaxLevel(sentence);\n    const clamped = Math.max(0, Math.min(maxLevel, newDepth));\n    if (clamped === this.sentenceStates[idx].depth) return;\n    this.sentenceStates[idx].depth = clamped;\n\n    const card = this.cardFor(idx);\n    if (card) {\n      const depthDisplay = card.querySelector(`[data-depth-display=\"${idx}\"]`);\n      if (depthDisplay) depthDisplay.textContent = `${clamped} / ${maxLevel}`;\n    }\n\n    await this.renderCardSvg(idx);\n  }\n\n  async levelDown(event) {\n    const idx = parseInt(event.currentTarget.getAttribute(\"data-idx\"), 10);\n    if (isNaN(idx) || !this.sentenceStates[idx]) return;\n    await this.changeDepth(idx, this.sentenceStates[idx].depth - 1);\n  }\n\n  async levelUp(event) {\n    const idx = parseInt(event.currentTarget.getAttribute(\"data-idx\"), 10);\n    if (isNaN(idx) || !this.sentenceStates[idx]) return;\n    await this.changeDepth(idx, this.sentenceStates[idx].depth + 1);\n  }\n\n  async expandAllLevels(event) {\n    const idx = parseInt(event.currentTarget.getAttribute(\"data-idx\"), 10);\n    if (isNaN(idx) || !this.sentenceStates[idx]) return;\n    const sentences = (this.payload && this.payload.sentences) || [];\n    const sentence = sentences[idx];\n    if (!sentence) return;\n    await this.changeDepth(idx, this.sentenceMaxLevel(sentence));\n  }\n\n  async collapseAllLevels(event) {\n    const idx = parseInt(event.currentTarget.getAttribute(\"data-idx\"), 10);\n    if (isNaN(idx) || !this.sentenceStates[idx]) return;\n    await this.changeDepth(idx, 0);\n  }\n\n  updateDownloadTarget() {\n    if (!this.hasAccordionListTarget) return;\n    this.accordionListTarget.querySelectorAll(\".tb-card-svg-container\").forEach(el => {\n      el.removeAttribute(\"data-syntax-graph-download-target\");\n    });\n    const firstExpanded = this.sentenceStates.findIndex(s => s.expanded);\n    if (this.hasDownloadTarget) this.downloadTarget.disabled = firstExpanded === -1;\n    if (firstExpanded === -1) return;\n    const card = this.cardFor(firstExpanded);\n    if (!card) return;\n    const svgContainer = card.querySelector(\".tb-card-svg-container\");\n    if (svgContainer) svgContainer.setAttribute(\"data-syntax-graph-download-target\", \"graphContainer\");\n  }\n}\n\n// Draws one sentence payload into a fresh <svg>. Stateless between calls except\n// for a few layout fields (phraseLevelHeight/phraseTopGap) that render() sets\n// up front from the sentence's phrase structure.\nclass TreebankRenderer {\n  constructor(sentence) {\n    this.sentence = sentence;\n    this.locale = sentence.locale || \"ar\";\n\n    // The Quranic script renders in Digital Khatt; grammar terms and the\n    // surah reference stay on qpc-hafs, which has better coverage for the\n    // Arabic term vocabulary.\n    // A stack, not a single family: Digital Khatt does not cover every\n    // codepoint that appears in the text (the ornate brackets, for one), and\n    // SVG falls through the list per glyph.\n    this.quranFont = \"digitalkhatt-v2, qpc-hafs, serif\";\n    // Digital Khatt gives U+0020 a NEGATIVE advance (it expects the renderer to\n    // do its own justification), so multi-word strings - the banner, phrase\n    // surface text, collapsed phrase units - run together without this.\n    this.quranWordSpacing = \"0.5em\";\n    this.arabicFont = \"qpc-hafs\";\n    this.labelFont = \"Arial, sans-serif\";\n    this.tokenFontSize = 32;\n    this.posLabelFontSize = 14;\n    this.locationFontSize = 11;\n    this.bannerFontSize = 22;\n    this.bannerRefFontSize = 14;\n    this.edgeLabelFontSize = 13;\n\n    // Vertical layout model (px). Bands stack top\u2192bottom in render():\n    // banner \u2192 phraseTopGap \u2192 phrase levels \u2192 arc band \u2192 token row.\n    this.slotWidth = 90;            // min horizontal width per word slot\n    this.slotGap = 20;              // gap between adjacent word slots\n    this.bannerHeight = 70;         // top strip holding the ayah text + reference\n    this.phraseLevelHeight = 0;     // total height of the phrase-level rows (set in render)\n    this.PHRASE_LEVEL_STEP = 70;    // vertical distance between consecutive phrase levels\n    this.PHRASE_EDGE_ARC_HEIGHT = 50; // how high a phrase (constituency) edge arcs above its band\n    this.PHRASE_EDGE_FOOT_LIFT = 28;  // float phrase-edge arcs above the phrase nodes so they clear the phrase surface text drawn above each dot\n    this.phraseTopGap = 0;          // extra headroom so phrase-edge arcs clear the banner (set in render)\n    this.tokenRowHeight = 90;       // bottom row: location + arabic + POS label\n    this.arcBandHeight = 0;\n    this.padding = 20;\n    this.SVG_NS = \"http://www.w3.org/2000/svg\";\n    this.XLINK_NS = \"http://www.w3.org/1999/xlink\";\n  }\n\n  grammarUrl(category, term) {\n    return `/morphology/grammar/${encodeURIComponent(category)}/${encodeURIComponent(term)}?locale=${encodeURIComponent(this.locale)}`;\n  }\n\n  async render() {\n    const tokens = this.sentence.tokens || [];\n    const allEdges = this.sentence.edges || [];\n    // Split edges: word\u2194word dependencies arc in the lower arc band; edges with\n    // a phrase endpoint are drawn in the upper phrase band (drawPhraseEdges).\n    const edges = allEdges.filter(e => !e.fromIsPhrase && !e.toIsPhrase);\n    const phraseEdges = allEdges.filter(e => e.fromIsPhrase || e.toIsPhrase);\n    const phraseNodes = this.sentence.phraseNodes || [];\n    const maxLevel = phraseNodes.length > 0 ? Math.max(...phraseNodes.map(pn => pn.level)) : 0;\n    this.phraseLevelHeight = maxLevel * this.PHRASE_LEVEL_STEP;\n    // Only reserve top headroom when phrase edges exist \u2014 otherwise their arcs\n    // (which rise PHRASE_EDGE_ARC_HEIGHT above the top phrase row) collide with\n    // the banner and overlap the text.\n    this.phraseTopGap = phraseEdges.length > 0 ? (this.PHRASE_EDGE_ARC_HEIGHT + this.PHRASE_EDGE_FOOT_LIFT + 24) : 0;\n\n    const tempSvg = document.createElementNS(this.SVG_NS, \"svg\");\n    tempSvg.style.position = \"absolute\";\n    tempSvg.style.visibility = \"hidden\";\n    tempSvg.style.top = \"-9999px\";\n    document.body.appendChild(tempSvg);\n\n    const slotWidths = tokens.map(tok => {\n      const arabicW = this.measureText(tempSvg, tok.arabic || \"\", this.quranFont, this.tokenFontSize);\n      const posW = this.measureText(tempSvg, tok.posLabel || \"\", this.arabicFont, this.posLabelFontSize);\n      const locW = this.measureText(tempSvg, tok.location || \"\", this.labelFont, this.locationFontSize);\n      return Math.max(arabicW + 24, posW + 16, locW + 16, this.slotWidth);\n    });\n\n    const totalTokenWidth = slotWidths.reduce((s, w) => s + w, 0) + this.slotGap * Math.max(0, tokens.length - 1);\n    const svgW = totalTokenWidth + this.padding * 2;\n\n    // Map each token position to an x-center (RTL), then pre-compute dependency\n    // arc heights so the arc band can be sized to fit the tallest arc.\n    const positionToCenter = this.buildPositionToCenter(tokens, slotWidths, svgW);\n    const tokenCenters = tokens.map(tok => positionToCenter[tok.position] ?? 0);\n    const arcData = this.computeArcsFromMap(tokens, edges, positionToCenter);\n    const arcBandHeight = arcData.length > 0 ? (arcData.reduce((m, a) => Math.max(m, a.apexY), 0) + 40) : 0;\n\n    // Total canvas height = sum of all stacked bands.\n    const svgH = this.bannerHeight + this.phraseTopGap + this.phraseLevelHeight + arcBandHeight + this.tokenRowHeight + this.padding;\n\n    const bannerText = (this.sentence.banner && this.sentence.banner.text) || \"\";\n    const bannerTextW = this.measureText(tempSvg, bannerText, this.quranFont, this.bannerFontSize);\n\n    // Kept alive past the slot-sizing pass: placeLabel measures against it\n    // while the tree is being drawn. Removed at the end of render().\n    this.measureSvg = tempSvg;\n    this.labelBoxes = [];\n    this.drawnDuplicateBlocks = new Set();\n\n    const svg = document.createElementNS(this.SVG_NS, \"svg\");\n    svg.setAttribute(\"width\", svgW);\n    svg.setAttribute(\"height\", svgH);\n    svg.setAttribute(\"viewBox\", `0 0 ${svgW} ${svgH}`);\n    svg.setAttribute(\"xmlns\", this.SVG_NS);\n    svg.setAttribute(\"data-base-width\", svgW);\n    svg.setAttribute(\"data-base-height\", svgH);\n    svg.style.display = \"block\";\n\n    this.drawBanner(svg, svgW, bannerTextW);\n\n    // y of the top of the word row \u2014 the shared baseline that dependency arcs\n    // curve up from and phrase connectors drop down to.\n    const tokenRowY = this.bannerHeight + this.phraseTopGap + this.phraseLevelHeight + arcBandHeight;\n\n    let phraseDotPositions = new Map();\n    if (phraseNodes.length > 0) {\n      phraseDotPositions = this.drawPhraseLevel(svg, phraseNodes, positionToCenter, tokenRowY, maxLevel);\n    }\n\n    this.drawBannerConnectors(svg, phraseNodes, phraseDotPositions, tokens, positionToCenter, svgW, tokenRowY);\n\n    if (arcData.length > 0) {\n      this.drawArcs(svg, arcData, tokenRowY);\n    }\n\n    if (phraseEdges.length > 0) {\n      this.drawPhraseEdges(svg, phraseEdges, phraseNodes, phraseDotPositions, positionToCenter, tokenRowY, tokens);\n    }\n\n    this.drawTokens(svg, tokens, tokenCenters, tokenRowY);\n\n    document.body.removeChild(tempSvg);\n    this.measureSvg = null;\n\n    return svg;\n  }\n\n  // --- label collision avoidance -------------------------------------------\n  // Phrase nodes draw their surface text and category label on fixed rows, and\n  // relation labels sit just above each arc's apex. Nothing coordinated those,\n  // so a relation label landed on top of a phrase label (\"Verbal Sentence\" and\n  // friends) whenever an arc apexed near a phrase node. Every label now claims\n  // a rectangle: fixed labels reserve theirs, and relation labels step away\n  // from the arc until they find clear space.\n\n  labelBox(x, y, text, fontFamily, fontSize, anchorMiddle = true) {\n    const w = this.measureText(this.measureSvg, text, fontFamily, fontSize) || text.length * fontSize * 0.6;\n    const h = fontSize * 1.25;\n    return {\n      x1: anchorMiddle ? x - w / 2 : x,\n      x2: anchorMiddle ? x + w / 2 : x + w,\n      y1: y - h,\n      y2: y,\n    };\n  }\n\n  boxesOverlap(a, b) {\n    const PAD = 2;\n    return !(a.x2 + PAD < b.x1 || a.x1 - PAD > b.x2 || a.y2 + PAD < b.y1 || a.y1 - PAD > b.y2);\n  }\n\n  // Reserve space for a label that cannot move.\n  reserveLabel(x, y, text, fontFamily, fontSize) {\n    if (!text) return;\n    this.labelBoxes.push(this.labelBox(x, y, text, fontFamily, fontSize));\n  }\n\n  // Find a free y for a movable label, preferring its natural position and then\n  // stepping away from the arc. Returns the chosen y (the natural one if\n  // nothing is clear, so a label is never dropped).\n  placeLabel(x, y, text, fontFamily, fontSize) {\n    if (!text) return y;\n\n    const step = fontSize + 4;\n    const offsets = [0];\n    for (let k = 1; k <= 7; k++) offsets.push(-step * k);\n    for (let k = 1; k <= 3; k++) offsets.push(step * k);\n\n    for (const dy of offsets) {\n      const box = this.labelBox(x, y + dy, text, fontFamily, fontSize);\n      if (!this.labelBoxes.some(other => this.boxesOverlap(box, other))) {\n        this.labelBoxes.push(box);\n        return y + dy;\n      }\n    }\n\n    this.labelBoxes.push(this.labelBox(x, y, text, fontFamily, fontSize));\n    return y;\n  }\n\n  // Set the Quranic face plus its word spacing on one element.\n  applyQuranFont(el) {\n    el.setAttribute(\"font-family\", this.quranFont);\n    el.setAttribute(\"word-spacing\", this.quranWordSpacing);\n  }\n\n  measureText(svg, text, fontFamily, fontSize) {\n    if (!text) return 0;\n    const t = document.createElementNS(this.SVG_NS, \"text\");\n    t.textContent = text;\n    t.setAttribute(\"font-family\", fontFamily);\n    t.setAttribute(\"font-size\", fontSize);\n    if (fontFamily === this.quranFont) t.setAttribute(\"word-spacing\", this.quranWordSpacing);\n    svg.appendChild(t);\n    try {\n      const bb = t.getBBox();\n      svg.removeChild(t);\n      return bb.width || text.length * fontSize * 0.6;\n    } catch (_) {\n      svg.removeChild(t);\n      return text.length * fontSize * 0.6;\n    }\n  }\n\n  // Position \u2192 x-center map. Arabic is RTL: position 0 is the RIGHTMOST slot,\n  // so we lay slots out from the right edge leftward.\n  buildPositionToCenter(tokens, slotWidths, svgW) {\n    const map = {};\n    let x = svgW - this.padding;\n    for (let i = 0; i < tokens.length; i++) {\n      const tok = tokens[i];\n      x -= slotWidths[i];\n      map[tok.position] = x + slotWidths[i] / 2;\n      if (i < tokens.length - 1) x -= this.slotGap;\n    }\n    return map;\n  }\n\n  centroidToX(centroid, positionToCenter) {\n    const floor = Math.floor(centroid);\n    const ceil = Math.ceil(centroid);\n    if (floor === ceil) return positionToCenter[floor] ?? 0;\n    const xFloor = positionToCenter[floor];\n    const xCeil = positionToCenter[ceil];\n    if (xFloor === undefined && xCeil === undefined) return 0;\n    if (xFloor === undefined) return xCeil;\n    if (xCeil === undefined) return xFloor;\n    const frac = centroid - floor;\n    return xFloor + (xCeil - xFloor) * frac;\n  }\n\n  // y-center of a phrase node's dot. Higher level = closer to the banner\n  // (top); level 0 sits just above the word row.\n  phraseDotY(level, maxLevel) {\n    return this.bannerHeight + this.phraseTopGap + (maxLevel - level) * this.PHRASE_LEVEL_STEP + this.PHRASE_LEVEL_STEP / 2;\n  }\n\n  // Assign each dependency edge an apex height so arcs don't overlap: shorter\n  // spans arc lower, and any arc that would collide with an already-placed one\n  // covering the same x-range is bumped up by ARC_STEP until it's clear.\n  computeArcsFromMap(tokens, edges, positionToCenter) {\n    const arcList = edges.map(edge => {\n      const fromX = positionToCenter[edge.from];\n      const toX = positionToCenter[edge.to];\n      if (fromX === undefined || toX === undefined) return null;\n      const span = Math.abs(edge.from - edge.to);\n      return { edge, fromX, toX, span, apexY: 0 };\n    }).filter(Boolean);\n\n    arcList.sort((a, b) => a.span - b.span);\n\n    const RANK_STEP = 50;\n    const ARC_STEP = 25;\n\n    const distinctSpans = [...new Set(arcList.map(a => a.span))].sort((a, b) => a - b);\n    const spanRank = {};\n    distinctSpans.forEach((span, idx) => { spanRank[span] = idx; });\n\n    const occupiedBands = [];\n\n    for (const arc of arcList) {\n      const x1 = Math.min(arc.fromX, arc.toX);\n      const x2 = Math.max(arc.fromX, arc.toX);\n      let apexY = (spanRank[arc.span] + 1) * RANK_STEP;\n\n      let collision = true;\n      while (collision) {\n        collision = false;\n        for (const band of occupiedBands) {\n          if (!(x2 < band.x1 || x1 > band.x2) && Math.abs(apexY - band.apexY) < ARC_STEP) {\n            apexY = band.apexY + ARC_STEP;\n            collision = true;\n            break;\n          }\n        }\n      }\n\n      arc.apexY = apexY;\n      occupiedBands.push({ x1, x2, apexY });\n    }\n\n    return arcList;\n  }\n\n  drawBanner(svg, svgW, bannerTextW) {\n    const bannerText = (this.sentence.banner && this.sentence.banner.text) || \"\";\n    const refText = (this.sentence.banner && this.sentence.banner.reference) || \"\";\n    const cx = svgW / 2;\n\n    const bannerTextEl = document.createElementNS(this.SVG_NS, \"text\");\n    bannerTextEl.textContent = bannerText;\n    bannerTextEl.setAttribute(\"x\", cx);\n    bannerTextEl.setAttribute(\"y\", 32);\n    this.applyQuranFont(bannerTextEl);\n    bannerTextEl.setAttribute(\"font-size\", this.bannerFontSize);\n    bannerTextEl.setAttribute(\"text-anchor\", \"middle\");\n    bannerTextEl.setAttribute(\"dominant-baseline\", \"middle\");\n    bannerTextEl.classList.add(\"treebank-banner-text\");\n    svg.appendChild(bannerTextEl);\n\n    const refEl = document.createElementNS(this.SVG_NS, \"text\");\n    refEl.textContent = refText;\n    refEl.setAttribute(\"x\", cx);\n    refEl.setAttribute(\"y\", 56);\n    refEl.setAttribute(\"font-family\", this.arabicFont);\n    refEl.setAttribute(\"font-size\", this.bannerRefFontSize);\n    refEl.setAttribute(\"text-anchor\", \"middle\");\n    refEl.setAttribute(\"dominant-baseline\", \"middle\");\n    refEl.classList.add(\"treebank-banner-ref\");\n    svg.appendChild(refEl);\n\n    const textW = (bannerTextW && bannerTextW > 0) ? bannerTextW : Math.min(svgW - this.padding * 2, bannerText.length * this.bannerFontSize * 0.6);\n    const ulX1 = cx - textW / 2;\n    const ulX2 = cx + textW / 2;\n    const underline = document.createElementNS(this.SVG_NS, \"line\");\n    underline.setAttribute(\"x1\", ulX1);\n    underline.setAttribute(\"y1\", this.bannerHeight - 4);\n    underline.setAttribute(\"x2\", ulX2);\n    underline.setAttribute(\"y2\", this.bannerHeight - 4);\n    underline.classList.add(\"treebank-banner-underline\");\n    svg.appendChild(underline);\n  }\n\n  phraseConnectorPath(svg, x1, y1, x2, y2) {\n    const path = document.createElementNS(this.SVG_NS, \"path\");\n    path.setAttribute(\"d\", `M ${x1},${y1} L ${x2},${y2}`);\n    path.setAttribute(\"fill\", \"none\");\n    path.setAttribute(\"stroke\", \"#4472C4\");\n    path.setAttribute(\"stroke-width\", \"0.6\");\n    path.setAttribute(\"stroke-dasharray\", \"2.6 2\");\n    path.classList.add(\"treebank-phrase-link\");\n    svg.appendChild(path);\n  }\n\n  // Draw the constituency nodes: place a dot per phrase node at its\n  // (centroid-x, level-y), connect each node to its parent phrase and to the\n  // words it covers, then render the node text + clickable relation label.\n  // Returns node \u2192 {x, y} so phrase edges/connectors can anchor to the dots.\n  drawPhraseLevel(svg, phraseNodes, positionToCenter, tokenRowY, maxLevel) {\n    const phraseDotPositions = new Map();\n    const DOT_R = 5;\n    const TOKEN_TOP_Y_OFFSET = 6;\n\n    for (const pn of phraseNodes) {\n      const x = this.centroidToX(pn.centroid, positionToCenter);\n      const y = this.phraseDotY(pn.level, maxLevel);\n      phraseDotPositions.set(pn, { x, y });\n    }\n\n    for (const pn of phraseNodes) {\n      const parent = this.findParentPhrase(pn, phraseNodes);\n      if (!parent) continue;\n      const { x: dotX, y: dotY } = phraseDotPositions.get(pn);\n      const { x: parentX, y: parentY } = phraseDotPositions.get(parent);\n      this.phraseConnectorPath(svg, dotX, dotY, parentX, parentY);\n    }\n\n    const allPositions = new Set();\n    for (const pn of phraseNodes) {\n      for (let pos = pn.span[0]; pos <= pn.span[1]; pos++) {\n        allPositions.add(pos);\n      }\n    }\n\n    for (const pos of allPositions) {\n      const tokX = positionToCenter[pos];\n      if (tokX === undefined) continue;\n      const owner = this.findSmallestCoveringPhrase(pos, phraseNodes);\n      if (!owner) continue;\n      const { x: dotX, y: dotY } = phraseDotPositions.get(owner);\n      this.phraseConnectorPath(svg, tokX, tokenRowY - TOKEN_TOP_Y_OFFSET, dotX, dotY);\n    }\n\n    for (const pn of phraseNodes) {\n      const { x: dotX, y: dotY } = phraseDotPositions.get(pn);\n\n      const circle = document.createElementNS(this.SVG_NS, \"circle\");\n      circle.setAttribute(\"cx\", dotX);\n      circle.setAttribute(\"cy\", dotY);\n      circle.setAttribute(\"r\", DOT_R);\n      circle.classList.add(\"treebank-phrase-dot\");\n      svg.appendChild(circle);\n\n      const textEl = document.createElementNS(this.SVG_NS, \"text\");\n      textEl.textContent = pn.text || \"\";\n      textEl.setAttribute(\"x\", dotX);\n      textEl.setAttribute(\"y\", dotY - DOT_R - 4);\n      this.applyQuranFont(textEl);\n      textEl.setAttribute(\"font-size\", \"13\");\n      textEl.setAttribute(\"text-anchor\", \"middle\");\n      textEl.setAttribute(\"dominant-baseline\", \"auto\");\n      textEl.classList.add(\"treebank-phrase-text\");\n      svg.appendChild(textEl);\n      this.reserveLabel(dotX, dotY - DOT_R - 4, pn.text || \"\", this.quranFont, 13);\n\n      if (pn.label && pn.labelKey) {\n        const labelUrl = this.grammarUrl(\"edge_relations\", pn.labelKey);\n        const linkEl = document.createElementNS(this.SVG_NS, \"a\");\n        linkEl.setAttribute(\"href\", labelUrl);\n        linkEl.setAttributeNS(this.XLINK_NS, \"xlink:href\", labelUrl);\n        linkEl.setAttribute(\"data-controller\", \"ajax-modal\");\n        linkEl.setAttribute(\"data-url\", labelUrl);\n\n        const labelEl = document.createElementNS(this.SVG_NS, \"text\");\n        labelEl.textContent = pn.label;\n        labelEl.setAttribute(\"x\", dotX);\n        labelEl.setAttribute(\"y\", dotY + DOT_R + 14);\n        labelEl.setAttribute(\"font-family\", this.arabicFont);\n        labelEl.setAttribute(\"font-size\", \"12\");\n        labelEl.setAttribute(\"text-anchor\", \"middle\");\n        labelEl.setAttribute(\"dominant-baseline\", \"hanging\");\n        labelEl.classList.add(\"treebank-phrase-label\", \"term-link\");\n        linkEl.appendChild(labelEl);\n        svg.appendChild(linkEl);\n        // dominant-baseline is \"hanging\" here, so the box hangs below dotY.\n        this.reserveLabel(dotX, dotY + DOT_R + 14 + 12, pn.label, this.arabicFont, 12);\n      }\n    }\n\n    return phraseDotPositions;\n  }\n\n  // Draw the thin dashed \"spine\" linking the banner down into the tree: from a\n  // dot under the banner center to each top-level phrase node, and directly to\n  // any word not covered by any phrase (routed through the band so lines stay\n  // vertical rather than crossing diagonally).\n  drawBannerConnectors(svg, phraseNodes, phraseDotPositions, tokens, positionToCenter, svgW, tokenRowY) {\n    const bannerAnchorX = svgW / 2;\n    const bannerAnchorY = this.bannerHeight - 4;\n\n    const bannerDot = document.createElementNS(this.SVG_NS, \"circle\");\n    bannerDot.setAttribute(\"cx\", bannerAnchorX);\n    bannerDot.setAttribute(\"cy\", bannerAnchorY);\n    bannerDot.setAttribute(\"r\", 4);\n    bannerDot.classList.add(\"treebank-phrase-dot\");\n    svg.appendChild(bannerDot);\n\n    const topPhraseNodes = phraseNodes.filter(pn => {\n      return !phraseNodes.some(other =>\n        other !== pn &&\n        other.level > pn.level &&\n        other.span[0] <= pn.span[0] &&\n        other.span[1] >= pn.span[1]\n      );\n    });\n\n    const coveredPositions = new Set();\n    for (const pn of phraseNodes) {\n      for (let p = pn.span[0]; p <= pn.span[1]; p++) {\n        coveredPositions.add(p);\n      }\n    }\n\n    for (const pn of topPhraseNodes) {\n      const pos = phraseDotPositions.get(pn);\n      if (pos) this.phraseConnectorPath(svg, pos.x, pos.y, bannerAnchorX, bannerAnchorY);\n    }\n\n    const topTokenY = tokenRowY - 6;\n    const bandAnchorY = this.bannerHeight + this.phraseTopGap + this.phraseLevelHeight;\n    for (const tok of tokens) {\n      if (coveredPositions.has(tok.position)) continue;\n      const tokX = positionToCenter[tok.position];\n      if (tokX === undefined) continue;\n      if (this.phraseLevelHeight > 0) {\n        this.phraseConnectorPath(svg, bannerAnchorX, bannerAnchorY, tokX, bandAnchorY);\n        this.phraseConnectorPath(svg, tokX, bandAnchorY, tokX, topTokenY);\n      } else {\n        this.phraseConnectorPath(svg, bannerAnchorX, bannerAnchorY, tokX, topTokenY);\n      }\n    }\n  }\n\n  // The immediate parent constituent: the smallest higher-level phrase whose\n  // span fully contains this node's span.\n  findParentPhrase(pn, phraseNodes) {\n    const containing = phraseNodes.filter(other =>\n      other !== pn &&\n      other.level > pn.level &&\n      other.span[0] <= pn.span[0] &&\n      other.span[1] >= pn.span[1]\n    );\n    if (containing.length === 0) return null;\n    containing.sort((a, b) => {\n      const sizeDiff = (a.span[1] - a.span[0]) - (b.span[1] - b.span[0]);\n      if (sizeDiff !== 0) return sizeDiff;\n      return a.level - b.level;\n    });\n    return containing[0];\n  }\n\n  findSmallestCoveringPhrase(position, phraseNodes) {\n    const covering = phraseNodes.filter(pn =>\n      pn.span[0] <= position && pn.span[1] >= position\n    );\n    if (covering.length === 0) return null;\n    covering.sort((a, b) => (a.span[1] - a.span[0]) - (b.span[1] - b.span[0]));\n    return covering[0];\n  }\n\n  // Render a word as a floating node up in the phrase band (dot + underlined\n  // arabic + POS label), used when a phrase edge attaches to a bare word (e.g.\n  // an elided (*) token) so it appears both in the band and the bottom row.\n  drawDuplicateTokenBlock(svg, tok, x, y, colorClass) {\n    // A token can be the endpoint of more than one phrase edge. Without this\n    // guard the same block is drawn once per edge, stacking identical text on\n    // itself and reading as a rendering artefact.\n    const key = `${tok.position}@${Math.round(y)}`;\n    if (this.drawnDuplicateBlocks.has(key)) return;\n    this.drawnDuplicateBlocks.add(key);\n\n    const DOT_R = 5;\n    const UNDERLINE_W = 28;\n    const LABEL_OFFSET = 14;\n\n    const circle = document.createElementNS(this.SVG_NS, \"circle\");\n    circle.setAttribute(\"cx\", x);\n    circle.setAttribute(\"cy\", y);\n    circle.setAttribute(\"r\", DOT_R);\n    circle.classList.add(\"treebank-phrase-dot\");\n    svg.appendChild(circle);\n\n    const textEl = document.createElementNS(this.SVG_NS, \"text\");\n    textEl.textContent = tok.arabic || \"\";\n    textEl.setAttribute(\"x\", x);\n    textEl.setAttribute(\"y\", y - DOT_R - 4);\n    this.applyQuranFont(textEl);\n    textEl.setAttribute(\"font-size\", \"13\");\n    textEl.setAttribute(\"text-anchor\", \"middle\");\n    textEl.setAttribute(\"dominant-baseline\", \"auto\");\n    if (colorClass) textEl.classList.add(colorClass);\n    svg.appendChild(textEl);\n    this.reserveLabel(x, y - DOT_R - 4, tok.arabic || \"\", this.quranFont, 13);\n\n    const ul = document.createElementNS(this.SVG_NS, \"line\");\n    ul.setAttribute(\"x1\", x - UNDERLINE_W / 2);\n    ul.setAttribute(\"y1\", y - DOT_R - 5);\n    ul.setAttribute(\"x2\", x + UNDERLINE_W / 2);\n    ul.setAttribute(\"y2\", y - DOT_R - 5);\n    ul.setAttribute(\"stroke\", colorClass ? null : \"#333\");\n    ul.setAttribute(\"stroke-width\", \"0.8\");\n    if (colorClass) ul.classList.add(colorClass);\n    svg.appendChild(ul);\n\n    if (tok.posLabel) {\n      // dominant-baseline is \"hanging\", so the box hangs below this y.\n      const posY = this.placeLabel(x, y + DOT_R + LABEL_OFFSET + 12, tok.posLabel, this.arabicFont, 12) - 12;\n\n      const posEl = document.createElementNS(this.SVG_NS, \"text\");\n      posEl.textContent = tok.posLabel;\n      posEl.setAttribute(\"x\", x);\n      posEl.setAttribute(\"y\", posY);\n      posEl.setAttribute(\"font-family\", this.arabicFont);\n      posEl.setAttribute(\"font-size\", \"12\");\n      posEl.setAttribute(\"text-anchor\", \"middle\");\n      posEl.setAttribute(\"dominant-baseline\", \"hanging\");\n      if (colorClass) posEl.classList.add(colorClass);\n      posEl.classList.add(\"treebank-phrase-label\");\n      svg.appendChild(posEl);\n    }\n  }\n\n  // Draw constituency-level edges (e.g. \u0645\u062A\u0639\u0644\u0642/Link relations) in the upper\n  // band. Each endpoint is either a phrase node (anchor on its dot) or a bare\n  // word (drawn as a floating duplicate block and dropped to the word row with\n  // a dashed line). The relation itself is a cubic arc apexing ARC_HEIGHT above\n  // the higher endpoint, with an arrowhead and a clickable label at the apex.\n  drawPhraseEdges(svg, phraseEdges, phraseNodes, phraseDotPositions, positionToCenter, tokenRowY, tokens) {\n    const ARC_HEIGHT = this.PHRASE_EDGE_ARC_HEIGHT;\n    const DOT_R = 5;\n\n    const allBandY = [...phraseDotPositions.values()].map(p => p.y);\n    const defaultBandY = allBandY.length > 0 ? Math.min(...allBandY) : tokenRowY - ARC_HEIGHT * 2;\n\n    const tokensByPos = {};\n    if (tokens) tokens.forEach(t => { tokensByPos[t.position] = t; });\n\n    for (const edge of phraseEdges) {\n      let fromX = null;\n      let fromY = null;\n      let toX = null;\n      let toY = null;\n\n      if (edge.fromIsPhrase) {\n        const pn = phraseNodes.find(pn => pn.headPosition === edge.from)\n               || this.findSmallestCoveringPhrase(edge.from, phraseNodes);\n        const pos = pn ? phraseDotPositions.get(pn) : null;\n        if (!pos) continue;\n        fromX = pos.x;\n        fromY = pos.y;\n      } else {\n        const baseX = positionToCenter[edge.from] ?? null;\n        if (baseX === null) continue;\n        const bandY = defaultBandY;\n        const tok = tokensByPos[edge.from];\n        if (tok) {\n          this.drawDuplicateTokenBlock(svg, tok, baseX, bandY, tok.colorClass);\n          const dotLine = document.createElementNS(this.SVG_NS, \"path\");\n          dotLine.setAttribute(\"d\", `M ${baseX},${tokenRowY - 6} L ${baseX},${bandY + DOT_R}`);\n          dotLine.setAttribute(\"fill\", \"none\");\n          dotLine.setAttribute(\"stroke\", \"#4472C4\");\n          dotLine.setAttribute(\"stroke-width\", \"0.8\");\n          dotLine.setAttribute(\"stroke-dasharray\", \"3 2\");\n          svg.appendChild(dotLine);\n        }\n        fromX = baseX;\n        fromY = bandY;\n      }\n\n      if (edge.toIsPhrase) {\n        const pn = phraseNodes.find(pn => pn.headPosition === edge.to)\n               || this.findSmallestCoveringPhrase(edge.to, phraseNodes);\n        const pos = pn ? phraseDotPositions.get(pn) : null;\n        if (!pos) continue;\n        toX = pos.x;\n        toY = pos.y;\n      } else {\n        const baseX = positionToCenter[edge.to] ?? null;\n        if (baseX === null) continue;\n        const bandY = fromY !== null ? fromY : defaultBandY;\n        const tok = tokensByPos[edge.to];\n        if (tok) {\n          this.drawDuplicateTokenBlock(svg, tok, baseX, bandY, tok.colorClass);\n          const dotLine = document.createElementNS(this.SVG_NS, \"path\");\n          dotLine.setAttribute(\"d\", `M ${baseX},${tokenRowY - 6} L ${baseX},${bandY + DOT_R}`);\n          dotLine.setAttribute(\"fill\", \"none\");\n          dotLine.setAttribute(\"stroke\", \"#4472C4\");\n          dotLine.setAttribute(\"stroke-width\", \"0.8\");\n          dotLine.setAttribute(\"stroke-dasharray\", \"3 2\");\n          svg.appendChild(dotLine);\n        }\n        toX = baseX;\n        toY = bandY;\n      }\n\n      if (fromX === null || toX === null || fromY === null || toY === null) continue;\n\n      // Float the drawn arc a fixed amount above the two node feet so it clears\n      // the phrase surface text. The nodes/blocks themselves stay on their band\n      // (kept inline) \u2014 only the arc path lifts.\n      const fromFootY = fromY - this.PHRASE_EDGE_FOOT_LIFT;\n      const toFootY = toY - this.PHRASE_EDGE_FOOT_LIFT;\n      const bandY = Math.min(fromFootY, toFootY);\n      const apexAbsY = bandY - ARC_HEIGHT;\n\n      const path = document.createElementNS(this.SVG_NS, \"path\");\n      const d = `M ${fromX},${fromFootY} C ${fromX},${apexAbsY} ${toX},${apexAbsY} ${toX},${toFootY}`;\n      path.setAttribute(\"d\", d);\n      path.setAttribute(\"fill\", \"none\");\n      path.setAttribute(\"stroke-width\", \"1.5\");\n      if (edge.colorClass) path.classList.add(edge.colorClass);\n      svg.appendChild(path);\n\n      const midX = (fromX + toX) / 2;\n      const curveApexY = apexAbsY + (bandY - apexAbsY) * 0.25;\n      const arrowSize = 6;\n      const goesLeft = toX < fromX;\n\n      const arrow = document.createElementNS(this.SVG_NS, \"polygon\");\n      let points;\n      if (goesLeft) {\n        points = `${midX - arrowSize},${curveApexY} ${midX + arrowSize / 2},${curveApexY - arrowSize / 2} ${midX + arrowSize / 2},${curveApexY + arrowSize / 2}`;\n      } else {\n        points = `${midX + arrowSize},${curveApexY} ${midX - arrowSize / 2},${curveApexY - arrowSize / 2} ${midX - arrowSize / 2},${curveApexY + arrowSize / 2}`;\n      }\n      arrow.setAttribute(\"points\", points);\n      if (edge.colorClass) arrow.classList.add(edge.colorClass);\n      svg.appendChild(arrow);\n\n      if (edge.label && edge.relation) {\n        const labelUrl = this.grammarUrl(\"edge_relations\", edge.relation);\n        const linkEl = document.createElementNS(this.SVG_NS, \"a\");\n        linkEl.setAttribute(\"href\", labelUrl);\n        linkEl.setAttributeNS(this.XLINK_NS, \"xlink:href\", labelUrl);\n        linkEl.setAttribute(\"data-controller\", \"ajax-modal\");\n        linkEl.setAttribute(\"data-url\", labelUrl);\n\n        const labelY = this.placeLabel(midX, curveApexY - 6, edge.label, this.arabicFont, this.edgeLabelFontSize);\n\n        const labelEl = document.createElementNS(this.SVG_NS, \"text\");\n        labelEl.textContent = edge.label;\n        labelEl.setAttribute(\"x\", midX);\n        labelEl.setAttribute(\"y\", labelY);\n        labelEl.setAttribute(\"font-family\", this.arabicFont);\n        labelEl.setAttribute(\"font-size\", this.edgeLabelFontSize);\n        labelEl.setAttribute(\"text-anchor\", \"middle\");\n        labelEl.setAttribute(\"dominant-baseline\", \"auto\");\n        if (edge.colorClass) labelEl.classList.add(edge.colorClass);\n        labelEl.classList.add(\"term-link\");\n        linkEl.appendChild(labelEl);\n        svg.appendChild(linkEl);\n      }\n    }\n  }\n\n  // Draw the bottom word row: each slot stacks location key (clickable),\n  // arabic surface form, and POS label (clickable) top to bottom.\n  drawTokens(svg, tokens, centers, baseY) {\n    const locationY = baseY + 16;\n    const arabicY = baseY + 50;\n    const posY = baseY + 78;\n\n    tokens.forEach((tok, i) => {\n      const cx = centers[i];\n\n      if (tok.location) {\n        if (tok.wordUrl) {\n          const linkEl = document.createElementNS(this.SVG_NS, \"a\");\n          linkEl.setAttribute(\"href\", tok.wordUrl);\n          linkEl.setAttributeNS(this.XLINK_NS, \"xlink:href\", tok.wordUrl);\n          const locEl = document.createElementNS(this.SVG_NS, \"text\");\n          locEl.textContent = tok.location;\n          locEl.setAttribute(\"x\", cx);\n          locEl.setAttribute(\"y\", locationY);\n          locEl.setAttribute(\"font-family\", this.labelFont);\n          locEl.setAttribute(\"font-size\", this.locationFontSize);\n          locEl.setAttribute(\"text-anchor\", \"middle\");\n          locEl.classList.add(\"treebank-location\");\n          linkEl.appendChild(locEl);\n          svg.appendChild(linkEl);\n        } else {\n          const locEl = document.createElementNS(this.SVG_NS, \"text\");\n          locEl.textContent = tok.location;\n          locEl.setAttribute(\"x\", cx);\n          locEl.setAttribute(\"y\", locationY);\n          locEl.setAttribute(\"font-family\", this.labelFont);\n          locEl.setAttribute(\"font-size\", this.locationFontSize);\n          locEl.setAttribute(\"text-anchor\", \"middle\");\n          locEl.classList.add(\"treebank-location\");\n          svg.appendChild(locEl);\n        }\n      }\n\n      const arabicEl = document.createElementNS(this.SVG_NS, \"text\");\n      arabicEl.textContent = tok.arabic || \"\";\n      arabicEl.setAttribute(\"x\", cx);\n      arabicEl.setAttribute(\"y\", arabicY);\n      this.applyQuranFont(arabicEl);\n      arabicEl.setAttribute(\"font-size\", this.tokenFontSize);\n      arabicEl.setAttribute(\"text-anchor\", \"middle\");\n      arabicEl.setAttribute(\"dominant-baseline\", \"middle\");\n      if (tok.colorClass) arabicEl.classList.add(tok.colorClass);\n      svg.appendChild(arabicEl);\n\n      if (tok.posLabel && tok.posKey) {\n        const posUrl = this.grammarUrl(tok.labelCategory || \"pos_tags\", tok.posKey);\n        const linkEl = document.createElementNS(this.SVG_NS, \"a\");\n        linkEl.setAttribute(\"href\", posUrl);\n        linkEl.setAttributeNS(this.XLINK_NS, \"xlink:href\", posUrl);\n        linkEl.setAttribute(\"data-controller\", \"ajax-modal\");\n        linkEl.setAttribute(\"data-url\", posUrl);\n\n        const posEl = document.createElementNS(this.SVG_NS, \"text\");\n        posEl.textContent = tok.posLabel;\n        posEl.setAttribute(\"x\", cx);\n        posEl.setAttribute(\"y\", posY);\n        posEl.setAttribute(\"font-family\", this.arabicFont);\n        posEl.setAttribute(\"font-size\", this.posLabelFontSize);\n        posEl.setAttribute(\"text-anchor\", \"middle\");\n        posEl.setAttribute(\"dominant-baseline\", \"middle\");\n        if (tok.colorClass) posEl.classList.add(tok.colorClass);\n        posEl.classList.add(\"term-link\");\n        linkEl.appendChild(posEl);\n        svg.appendChild(linkEl);\n      }\n    });\n  }\n\n  // Draw the word\u2194word dependency arcs: a cubic curve from one word's top to\n  // another's, rising to the pre-computed apex, with a direction arrowhead and\n  // a clickable relation label near the apex.\n  drawArcs(svg, arcData, tokenRowY) {\n    for (const arc of arcData) {\n      const { edge, fromX, toX, apexY } = arc;\n      const x1 = fromX;\n      const x2 = toX;\n      const y = tokenRowY;\n      const apexAbsY = tokenRowY - apexY;\n\n      const cp1x = x1;\n      const cp1y = apexAbsY;\n      const cp2x = x2;\n      const cp2y = apexAbsY;\n\n      const path = document.createElementNS(this.SVG_NS, \"path\");\n      const d = `M ${x1},${y} C ${cp1x},${cp1y} ${cp2x},${cp2y} ${x2},${y}`;\n      path.setAttribute(\"d\", d);\n      path.setAttribute(\"fill\", \"none\");\n      path.setAttribute(\"stroke-width\", \"1.5\");\n      if (edge.colorClass) path.classList.add(edge.colorClass);\n      svg.appendChild(path);\n\n      const midX = (x1 + x2) / 2;\n      const curveApexY = apexAbsY + (y - apexAbsY) * 0.25;\n      const arrowSize = 6;\n      const goesLeft = toX < fromX;\n\n      const arrow = document.createElementNS(this.SVG_NS, \"polygon\");\n      let points;\n      if (goesLeft) {\n        points = `${midX - arrowSize},${curveApexY} ${midX + arrowSize / 2},${curveApexY - arrowSize / 2} ${midX + arrowSize / 2},${curveApexY + arrowSize / 2}`;\n      } else {\n        points = `${midX + arrowSize},${curveApexY} ${midX - arrowSize / 2},${curveApexY - arrowSize / 2} ${midX - arrowSize / 2},${curveApexY + arrowSize / 2}`;\n      }\n      arrow.setAttribute(\"points\", points);\n      if (edge.colorClass) arrow.classList.add(edge.colorClass);\n      svg.appendChild(arrow);\n\n      if (edge.label && edge.relation) {\n        const labelUrl = this.grammarUrl(\"edge_relations\", edge.relation);\n        const linkEl = document.createElementNS(this.SVG_NS, \"a\");\n        linkEl.setAttribute(\"href\", labelUrl);\n        linkEl.setAttributeNS(this.XLINK_NS, \"xlink:href\", labelUrl);\n        linkEl.setAttribute(\"data-controller\", \"ajax-modal\");\n        linkEl.setAttribute(\"data-url\", labelUrl);\n\n        const labelY = this.placeLabel(midX, curveApexY - 6, edge.label, this.arabicFont, this.edgeLabelFontSize);\n\n        const labelEl = document.createElementNS(this.SVG_NS, \"text\");\n        labelEl.textContent = edge.label;\n        labelEl.setAttribute(\"x\", midX);\n        labelEl.setAttribute(\"y\", labelY);\n        labelEl.setAttribute(\"font-family\", this.arabicFont);\n        labelEl.setAttribute(\"font-size\", this.edgeLabelFontSize);\n        labelEl.setAttribute(\"text-anchor\", \"middle\");\n        labelEl.setAttribute(\"dominant-baseline\", \"auto\");\n        if (edge.colorClass) labelEl.classList.add(edge.colorClass);\n        labelEl.classList.add(\"term-link\");\n        linkEl.appendChild(labelEl);\n        svg.appendChild(linkEl);\n      }\n    }\n  }\n}\n", "import {Controller} from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  connect() {\n    const frame = this.element.querySelector('turbo-frame')\n    this.frameId = frame ? frame.id : null\n    this.loadingIndicator = this.element.querySelector('#turbo-loading-indicator');\n    \n    this.boundShowLoading = this.showLoading.bind(this);\n    this.boundHideLoading = this.hideLoading.bind(this);\n    \n    document.addEventListener('turbo:before-fetch-request', this.boundShowLoading);\n    document.addEventListener('turbo:frame-render', this.boundHideLoading);\n    document.addEventListener('turbo:frame-load', this.boundHideLoading);\n    document.addEventListener('turbo:fetch-request-error', this.boundHideLoading);\n  }\n\n  showLoading(event) {\n    if (!this.frameId) return\n    const headers = event?.detail?.fetchOptions?.headers || {}\n    const target = headers['Turbo-Frame']\n    if (target !== this.frameId) return\n    const indicator = this.element.querySelector('#turbo-loading-indicator');\n    if (indicator) {\n      indicator.classList.remove('hidden');\n    }\n  }\n\n  hideLoading(event) {\n    if (this.frameId) {\n      const targetId = event?.target?.id\n      if (targetId && targetId !== this.frameId) return\n    }\n    const indicator = this.element.querySelector('#turbo-loading-indicator');\n    if (indicator) {\n      indicator.classList.add('hidden');\n    }\n  }\n\n  disconnect() {\n    document.removeEventListener('turbo:before-fetch-request', this.boundShowLoading);\n    document.removeEventListener('turbo:frame-render', this.boundHideLoading);\n    document.removeEventListener('turbo:frame-load', this.boundHideLoading);\n    document.removeEventListener('turbo:fetch-request-error', this.boundHideLoading);\n  }\n}\n\n", "import {Controller} from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  connect() {\n    const currentPage = Number(this.element.dataset.page);\n\n    document.querySelectorAll('a[data-turbo-frame]').forEach(link => {\n      const url = new URL(link.href);\n      const linkText = link.textContent.trim().toLowerCase();\n      let targetPage = currentPage;\n\n      if (linkText === 'previous page') {\n        targetPage = Math.max(1, currentPage - 1);\n      } else if (linkText === 'next page') {\n        targetPage = currentPage + 1;\n      }\n\n      url.searchParams.set('page_number', targetPage);\n      link.href = url.toString();\n    });\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  connect() {\n    this.boundCloseOnOutsideClick = this.closeOnOutsideClick.bind(this)\n    document.addEventListener(\"click\", this.boundCloseOnOutsideClick)\n  }\n\n  disconnect() {\n    document.removeEventListener(\"click\", this.boundCloseOnOutsideClick)\n  }\n\n  close() {\n    this.element.removeAttribute(\"open\")\n  }\n\n  closeOnOutsideClick(event) {\n    if (!this.element.contains(event.target)) {\n      this.close()\n    }\n  }\n}\n", "import {Controller} from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  connect() {\n    this.element.addEventListener('mouseup', this.addPopoverToSelection.bind(this));\n    this.currentPopover = null;\n  }\n\n  addPopoverToSelection() {\n    const selectedText = this.getSelectedNode();\n\n    if (selectedText !== '' && !this.currentPopover) {\n      const selection = window.getSelection();\n      if (selection.rangeCount > 0) {\n        const range = selection.getRangeAt(0);\n        const rect = range.getBoundingClientRect();\n        \n        this.createPopover(selectedText, rect);\n      }\n    }\n  }\n\n  getSelectedNode() {\n    if (window.getSelection) {\n      return window.getSelection().toString();\n    } else if (document.selection && document.selection.type !== 'Control') {\n      return document.selection.createRange().text;\n    }\n    return '';\n  }\n\n  createPopover(text, rect) {\n    if (this.currentPopover) {\n      this.removePopover();\n    }\n    \n    const popover = document.createElement('div');\n    popover.className = 'absolute z-50 bg-white rounded-lg shadow-xl border border-gray-200 p-3 max-w-xs opacity-0 transition-opacity duration-200';\n    popover.style.position = 'fixed';\n    popover.style.left = `${rect.left + (rect.width / 2)}px`;\n    popover.style.top = `${rect.top - 10}px`;\n    popover.style.transform = 'translate(-50%, -100%)';\n    \n    const content = document.createElement('div');\n    content.className = 'text-sm text-gray-700';\n    content.textContent = text || 'Hello';\n    popover.appendChild(content);\n    \n    document.body.appendChild(popover);\n    this.currentPopover = popover;\n    \n    requestAnimationFrame(() => {\n      popover.classList.remove('opacity-0');\n      popover.classList.add('opacity-100');\n    });\n    \n    setTimeout(() => {\n      this.removePopover();\n    }, 3000);\n    \n    document.addEventListener('click', this.removePopover.bind(this), { once: true });\n    document.addEventListener('selectionchange', this.removePopover.bind(this), { once: true });\n  }\n\n  removePopover() {\n    if (this.currentPopover && this.currentPopover.parentNode) {\n      this.currentPopover.classList.remove('opacity-100');\n      this.currentPopover.classList.add('opacity-0');\n      setTimeout(() => {\n        if (this.currentPopover && this.currentPopover.parentNode) {\n          this.currentPopover.parentNode.removeChild(this.currentPopover);\n        }\n        this.currentPopover = null;\n      }, 200);\n    }\n  }\n\n  disconnect() {\n    this.removePopover();\n    this.element.removeEventListener('mouseup', this.addPopoverToSelection);\n  }\n}\n", "import {Controller} from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  connect() {\n    this.el = $(this.element);\n    const {page} = this.element.dataset;\n    this.currentPage = Number(page);\n\n    this.btnJump = this.el.find('#jump-to-page');\n    this.btnPrevious = this.el.find('#previous-page');\n    this.btnNext = this.el.find('#next-page');\n\n    this.btnJump.on('change', this.jumpToPage.bind(this));\n    this.btnPrevious.on('click', this.previousPage.bind(this));\n    this.btnNext.on('click', this.nextPage.bind(this));\n\n    this.zoomSlider = this.element.querySelector('#zoom-slider');\n    this.zoomHandler = () => {\n      const scale = this.zoomSlider.value;\n      this.zoom(scale);\n    };\n\n    this.zoomSlider.addEventListener('input', this.zoomHandler);\n  }\n\n  disconnect() {\n    this.btnJump.off('change');\n    this.btnPrevious.off('click');\n    this.btnNext.off('click');\n\n    if (this.zoomSlider && this.zoomHandler) {\n      this.zoomSlider.removeEventListener('input', this.zoomHandler);\n    }\n  }\n\n  zoom(scale) {\n    const zoomableImage = this.element.querySelector('#zoom-image');\n    zoomableImage.style.transform = `scale(${scale})`;\n  }\n\n  previousPage(event) {\n    this.changePage(this.currentPage - 1)\n  }\n  nextPage(event) {\n    this.changePage(this.currentPage + 1)\n  }\n  jumpToPage(event) {\n    const page = event.target.value;\n    this.changePage(page)\n  }\n\n  changePage(pageNumber) {\n    const img = this.element.querySelector('#zoom-image')\n    this.currentPage = Number(pageNumber);\n    this.el.find(\"#page\").text(pageNumber);\n\n    if(pageNumber <= 1){\n      this.btnPrevious.addClass('hidden')\n    } else {\n      this.btnPrevious.removeClass('hidden')\n    }\n\n    img.src = this.buildUrl(pageNumber)\n  }\n\n  buildUrl(page) {\n    page = !!page ? parseInt(page) : 1;\n    const {host, format} = this.element.dataset;\n\n    return `${host}/${page}.${format || 'jpg'}`;\n  }\n}\n", "\n        import * as module0 from './account_form_controller.js';import * as module1 from './activities/activity_controller.js';import * as module2 from './activities/ayah_mastery_controller.js';import * as module3 from './activities/fill_the_blanks_controller.js';import * as module4 from './activities/surah_order_controller.js';import * as module5 from './activities/word_match_controller.js';import * as module6 from './admin_page_controller.js';import * as module7 from './ajax_modal_controller.js';import * as module8 from './alert_controller.js';import * as module9 from './align_player_controller.js';import * as module10 from './arabic_keyboard_controller.js';import * as module11 from './ayah_boundary_controller.js';import * as module12 from './ayah_filter_controller.js';import * as module13 from './ayah_jump_controller.js';import * as module14 from './ayah_player_controller.js';import * as module15 from './ayah_recitation_selector_controller.js';import * as module16 from './ayah_script_selector_controller.js';import * as module17 from './ayah_segment_player_controller.js';import * as module18 from './ayah_tafsir_selector_controller.js';import * as module19 from './ayah_translation_selector_controller.js';import * as module20 from './ayah_transliteration_selector_controller.js';import * as module21 from './ayah_word_translation_selector_controller.js';import * as module22 from './chapter_verses_filter_controller.js';import * as module23 from './chars_info_controller.js';import * as module24 from './clipboard_controller.js';import * as module25 from './collapse_controller.js';import * as module26 from './confirm_leave_controller.js';import * as module27 from './copy_to_clipboard_controller.js';import * as module28 from './datepicker_controller.js';import * as module29 from './delivery_audio_compare_controller.js';import * as module30 from './docs_code_controller.js';import * as module31 from './docs_copy_controller.js';import * as module32 from './draggable_scroll_controller.js';import * as module33 from './dropdown_controller.js';import * as module34 from './event_tracker_controller.js';import * as module35 from './facet_list_controller.js';import * as module36 from './faq_controller.js';import * as module37 from './filter_ayah_controller.js';import * as module38 from './fix_filter_controller.js';import * as module39 from './flash_message_controller.js';import * as module40 from './font_preview_controller.js';import * as module41 from './generate_dialog_controller.js';import * as module42 from './graph_bulk_edit_controller.js';import * as module43 from './graph_settings_controller.js';import * as module44 from './graph_splitter_controller.js';import * as module45 from './header_nav_controller.js';import * as module46 from './json_editor_controller.js';import * as module47 from './json_viewer_controller.js';import * as module48 from './lazy_load_controller.js';import * as module49 from './mistake_heatmap_controller.js';import * as module50 from './mushaf_page_builder_controller.js';import * as module51 from './mushaf_page_controller.js';import * as module52 from './mutashabihat_ayah_controller.js';import * as module53 from './mutashabihat_builder_controller.js';import * as module54 from './mutashabihat_proofread_controller.js';import * as module55 from './offcanvas_controller.js';import * as module56 from './offcanvas_reset_controller.js';import * as module57 from './page_search_controller.js';import * as module58 from './page_title_controller.js';import * as module59 from './pdf_viewer_controller.js';import * as module60 from './peity_controller.js';import * as module61 from './phrase_ayah_bookmark_controller.js';import * as module62 from './popover_controller.js';import * as module63 from './proofreading_view_switcher_controller.js';import * as module64 from './recitation_picker_controller.js';import * as module65 from './remote_form_controller.js';import * as module66 from './remote_select2_controller.js';import * as module67 from './remote_tab_controller.js';import * as module68 from './resizeable_controller.js';import * as module69 from './resource_search_controller.js';import * as module70 from './resource_tabs_controller.js';import * as module71 from './runable_widget_controller.js';import * as module72 from './segment_compare_controller.js';import * as module73 from './segment_issue_tabs_controller.js';import * as module74 from './segment_pipeline_controller.js';import * as module75 from './segment_player_controller.js';import * as module76 from './segment_timeline_controller.js';import * as module77 from './select2_controller.js';import * as module78 from './show_footnote_controller.js';import * as module79 from './step_flow_controller.js';import * as module80 from './surah_segment_player_controller.js';import * as module81 from './surah_timeline_controller.js';import * as module82 from './svg_mushaf_controller.js';import * as module83 from './svg_preview_controller.js';import * as module84 from './syntax_graph_controller.js';import * as module85 from './syntax_graph_download_controller.js';import * as module86 from './tabs_controller.js';import * as module87 from './tafsir_range_controller.js';import * as module88 from './tafsir_text_popup_controller.js';import * as module89 from './tajweed_annotator_controller.js';import * as module90 from './tajweed_font_controller.js';import * as module91 from './tajweed_highlight_controller.js';import * as module92 from './tinymce_controller.js';import * as module93 from './toggle_password_controller.js';import * as module94 from './tooltip_controller.js';import * as module95 from './translation_controller.js';import * as module96 from './translation_footnote_controller.js';import * as module97 from './translation_footnote_toggle_controller.js';import * as module98 from './translation_footnotes_controller.js';import * as module99 from './treebank_controller.js';import * as module100 from './turbo_frame_loading_controller.js';import * as module101 from './update_mushaf_page_controller.js';import * as module102 from './user_menu_controller.js';import * as module103 from './verse_controller.js';import * as module104 from './zoom_image_controller.js'\n        const modules = [{name: 'account-form', module: module0, filename: 'account_form_controller.js'},{name: 'activities--activity', module: module1, filename: 'activities/activity_controller.js'},{name: 'activities--ayah-mastery', module: module2, filename: 'activities/ayah_mastery_controller.js'},{name: 'activities--fill-the-blanks', module: module3, filename: 'activities/fill_the_blanks_controller.js'},{name: 'activities--surah-order', module: module4, filename: 'activities/surah_order_controller.js'},{name: 'activities--word-match', module: module5, filename: 'activities/word_match_controller.js'},{name: 'admin-page', module: module6, filename: 'admin_page_controller.js'},{name: 'ajax-modal', module: module7, filename: 'ajax_modal_controller.js'},{name: 'alert', module: module8, filename: 'alert_controller.js'},{name: 'align-player', module: module9, filename: 'align_player_controller.js'},{name: 'arabic-keyboard', module: module10, filename: 'arabic_keyboard_controller.js'},{name: 'ayah-boundary', module: module11, filename: 'ayah_boundary_controller.js'},{name: 'ayah-filter', module: module12, filename: 'ayah_filter_controller.js'},{name: 'ayah-jump', module: module13, filename: 'ayah_jump_controller.js'},{name: 'ayah-player', module: module14, filename: 'ayah_player_controller.js'},{name: 'ayah-recitation-selector', module: module15, filename: 'ayah_recitation_selector_controller.js'},{name: 'ayah-script-selector', module: module16, filename: 'ayah_script_selector_controller.js'},{name: 'ayah-segment-player', module: module17, filename: 'ayah_segment_player_controller.js'},{name: 'ayah-tafsir-selector', module: module18, filename: 'ayah_tafsir_selector_controller.js'},{name: 'ayah-translation-selector', module: module19, filename: 'ayah_translation_selector_controller.js'},{name: 'ayah-transliteration-selector', module: module20, filename: 'ayah_transliteration_selector_controller.js'},{name: 'ayah-word-translation-selector', module: module21, filename: 'ayah_word_translation_selector_controller.js'},{name: 'chapter-verses-filter', module: module22, filename: 'chapter_verses_filter_controller.js'},{name: 'chars-info', module: module23, filename: 'chars_info_controller.js'},{name: 'clipboard', module: module24, filename: 'clipboard_controller.js'},{name: 'collapse', module: module25, filename: 'collapse_controller.js'},{name: 'confirm-leave', module: module26, filename: 'confirm_leave_controller.js'},{name: 'copy-to-clipboard', module: module27, filename: 'copy_to_clipboard_controller.js'},{name: 'datepicker', module: module28, filename: 'datepicker_controller.js'},{name: 'delivery-audio-compare', module: module29, filename: 'delivery_audio_compare_controller.js'},{name: 'docs-code', module: module30, filename: 'docs_code_controller.js'},{name: 'docs-copy', module: module31, filename: 'docs_copy_controller.js'},{name: 'draggable-scroll', module: module32, filename: 'draggable_scroll_controller.js'},{name: 'dropdown', module: module33, filename: 'dropdown_controller.js'},{name: 'event-tracker', module: module34, filename: 'event_tracker_controller.js'},{name: 'facet-list', module: module35, filename: 'facet_list_controller.js'},{name: 'faq', module: module36, filename: 'faq_controller.js'},{name: 'filter-ayah', module: module37, filename: 'filter_ayah_controller.js'},{name: 'fix-filter', module: module38, filename: 'fix_filter_controller.js'},{name: 'flash-message', module: module39, filename: 'flash_message_controller.js'},{name: 'font-preview', module: module40, filename: 'font_preview_controller.js'},{name: 'generate-dialog', module: module41, filename: 'generate_dialog_controller.js'},{name: 'graph-bulk-edit', module: module42, filename: 'graph_bulk_edit_controller.js'},{name: 'graph-settings', module: module43, filename: 'graph_settings_controller.js'},{name: 'graph-splitter', module: module44, filename: 'graph_splitter_controller.js'},{name: 'header-nav', module: module45, filename: 'header_nav_controller.js'},{name: 'json-editor', module: module46, filename: 'json_editor_controller.js'},{name: 'json-viewer', module: module47, filename: 'json_viewer_controller.js'},{name: 'lazy-load', module: module48, filename: 'lazy_load_controller.js'},{name: 'mistake-heatmap', module: module49, filename: 'mistake_heatmap_controller.js'},{name: 'mushaf-page-builder', module: module50, filename: 'mushaf_page_builder_controller.js'},{name: 'mushaf-page', module: module51, filename: 'mushaf_page_controller.js'},{name: 'mutashabihat-ayah', module: module52, filename: 'mutashabihat_ayah_controller.js'},{name: 'mutashabihat-builder', module: module53, filename: 'mutashabihat_builder_controller.js'},{name: 'mutashabihat-proofread', module: module54, filename: 'mutashabihat_proofread_controller.js'},{name: 'offcanvas', module: module55, filename: 'offcanvas_controller.js'},{name: 'offcanvas-reset', module: module56, filename: 'offcanvas_reset_controller.js'},{name: 'page-search', module: module57, filename: 'page_search_controller.js'},{name: 'page-title', module: module58, filename: 'page_title_controller.js'},{name: 'pdf-viewer', module: module59, filename: 'pdf_viewer_controller.js'},{name: 'peity', module: module60, filename: 'peity_controller.js'},{name: 'phrase-ayah-bookmark', module: module61, filename: 'phrase_ayah_bookmark_controller.js'},{name: 'popover', module: module62, filename: 'popover_controller.js'},{name: 'proofreading-view-switcher', module: module63, filename: 'proofreading_view_switcher_controller.js'},{name: 'recitation-picker', module: module64, filename: 'recitation_picker_controller.js'},{name: 'remote-form', module: module65, filename: 'remote_form_controller.js'},{name: 'remote-select2', module: module66, filename: 'remote_select2_controller.js'},{name: 'remote-tab', module: module67, filename: 'remote_tab_controller.js'},{name: 'resizeable', module: module68, filename: 'resizeable_controller.js'},{name: 'resource-search', module: module69, filename: 'resource_search_controller.js'},{name: 'resource-tabs', module: module70, filename: 'resource_tabs_controller.js'},{name: 'runable-widget', module: module71, filename: 'runable_widget_controller.js'},{name: 'segment-compare', module: module72, filename: 'segment_compare_controller.js'},{name: 'segment-issue-tabs', module: module73, filename: 'segment_issue_tabs_controller.js'},{name: 'segment-pipeline', module: module74, filename: 'segment_pipeline_controller.js'},{name: 'segment-player', module: module75, filename: 'segment_player_controller.js'},{name: 'segment-timeline', module: module76, filename: 'segment_timeline_controller.js'},{name: 'select2', module: module77, filename: 'select2_controller.js'},{name: 'show-footnote', module: module78, filename: 'show_footnote_controller.js'},{name: 'step-flow', module: module79, filename: 'step_flow_controller.js'},{name: 'surah-segment-player', module: module80, filename: 'surah_segment_player_controller.js'},{name: 'surah-timeline', module: module81, filename: 'surah_timeline_controller.js'},{name: 'svg-mushaf', module: module82, filename: 'svg_mushaf_controller.js'},{name: 'svg-preview', module: module83, filename: 'svg_preview_controller.js'},{name: 'syntax-graph', module: module84, filename: 'syntax_graph_controller.js'},{name: 'syntax-graph-download', module: module85, filename: 'syntax_graph_download_controller.js'},{name: 'tabs', module: module86, filename: 'tabs_controller.js'},{name: 'tafsir-range', module: module87, filename: 'tafsir_range_controller.js'},{name: 'tafsir-text-popup', module: module88, filename: 'tafsir_text_popup_controller.js'},{name: 'tajweed-annotator', module: module89, filename: 'tajweed_annotator_controller.js'},{name: 'tajweed-font', module: module90, filename: 'tajweed_font_controller.js'},{name: 'tajweed-highlight', module: module91, filename: 'tajweed_highlight_controller.js'},{name: 'tinymce', module: module92, filename: 'tinymce_controller.js'},{name: 'toggle-password', module: module93, filename: 'toggle_password_controller.js'},{name: 'tooltip', module: module94, filename: 'tooltip_controller.js'},{name: 'translation', module: module95, filename: 'translation_controller.js'},{name: 'translation-footnote', module: module96, filename: 'translation_footnote_controller.js'},{name: 'translation-footnote-toggle', module: module97, filename: 'translation_footnote_toggle_controller.js'},{name: 'translation-footnotes', module: module98, filename: 'translation_footnotes_controller.js'},{name: 'treebank', module: module99, filename: 'treebank_controller.js'},{name: 'turbo-frame-loading', module: module100, filename: 'turbo_frame_loading_controller.js'},{name: 'update-mushaf-page', module: module101, filename: 'update_mushaf_page_controller.js'},{name: 'user-menu', module: module102, filename: 'user_menu_controller.js'},{name: 'verse', module: module103, filename: 'verse_controller.js'},{name: 'zoom-image', module: module104, filename: 'zoom_image_controller.js'}]\n        export default modules;\n      ", "import { application } from \"./application\"\n\nimport controllers from \"./**/*_controller.js\"\ncontrollers.forEach((controller) => {\n  application.register(controller.name, controller.module.default)\n})\n", "class AyahPlayer extends HTMLElement {\n  constructor() {\n    super();\n    this.attachShadow({ mode: \"open\" });\n\n    this.audioURL = \"\";\n    this.audioID = \"\";\n    this.ayahs = [];\n    this.currentAyah = null;\n    this.currentWordId = null;\n\n    this.audioElement = document.createElement(\"audio\");\n    this.audioElement.controls = true;\n    this.audioElement.addEventListener(\"timeupdate\", () => this.updateHighlight());\n  }\n\n  static get observedAttributes() {\n    return [\"audio-url\", \"audio-id\"];\n  }\n\n  async connectedCallback() {\n    this.render();\n    await this.fetchSegments();\n  }\n\n  async attributeChangedCallback(name, oldValue, newValue) {\n    if (name === \"audio-url\") {\n      this.audioURL = newValue;\n      this.audioElement.src = this.audioURL;\n    } else if (name === \"audio-id\") {\n      this.audioID = newValue;\n      await this.fetchSegments();\n    }\n  }\n\n  async fetchSegments() {\n    if (!this.audioID) return;\n\n    try {\n      const response = await fetch(`/api/segments/${this.audioID}`);\n      const data = await response.json();\n      this.ayahs = data || [];\n      this.render();\n    } catch (error) {\n      console.error(\"Error fetching segments:\", error);\n    }\n  }\n\n  // **Binary Search to find the currently playing Ayah**\n  findCurrentAyah(currentTime) {\n    let left = 0, right = this.ayahs.length - 1;\n    while (left <= right) {\n      const mid = Math.floor((left + right) / 2);\n      const ayah = this.ayahs[mid];\n\n      if (currentTime >= ayah.start && currentTime <= ayah.ends) {\n        return ayah;\n      } else if (currentTime < ayah.start) {\n        right = mid - 1;\n      } else {\n        left = mid + 1;\n      }\n    }\n    return null;\n  }\n\n  // **Binary Search to find the currently playing Word**\n  findCurrentWord(segments, currentTime) {\n    let left = 0, right = segments.length - 1;\n    while (left <= right) {\n      const mid = Math.floor((left + right) / 2);\n      const [wordId, startTime, endTime] = segments[mid];\n\n      if (currentTime >= startTime && currentTime <= endTime) {\n        return wordId;\n      } else if (currentTime < startTime) {\n        right = mid - 1;\n      } else {\n        left = mid + 1;\n      }\n    }\n    return null;\n  }\n\n  updateHighlight() {\n    const currentTime = this.audioElement.currentTime * 1000; // Convert to milliseconds\n\n    // Find the currently playing Ayah using binary search\n    const newAyah = this.findCurrentAyah(currentTime);\n    if (newAyah !== this.currentAyah) {\n      this.currentAyah = newAyah;\n      this.autoScrollToAyah();\n    }\n\n    // Find the currently playing Word within the Ayah using binary search\n    if (this.currentAyah) {\n      this.currentWordId = this.findCurrentWord(this.currentAyah.segments, currentTime);\n    } else {\n      this.currentWordId = null;\n    }\n\n    this.render();\n  }\n\n  autoScrollToAyah() {\n    if (this.currentAyah) {\n      setTimeout(() => {\n        const ayahElement = this.shadowRoot.querySelector(`#ayah-${this.currentAyah.ayah}`);\n        if (ayahElement) {\n          ayahElement.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n        }\n      }, 100); // Delay to allow UI to update before scrolling\n    }\n  }\n\n  // **Seek Audio when clicking on a word**\n  seekAudio(wordId) {\n    if (!this.currentAyah) return;\n\n    const wordSegment = this.currentAyah.segments.find(([id]) => id === wordId);\n    if (wordSegment) {\n      const [_, startTime] = wordSegment;\n      this.audioElement.currentTime = startTime / 1000; // Convert to seconds\n    }\n  }\n\n  render() {\n    this.shadowRoot.innerHTML = `\n      <style>\n        .ayah-text {\n          font-size: 24px;\n          text-align: center;\n          margin-top: 10px;\n        }\n        .highlighted {\n          background-color: yellow;\n          padding: 2px 5px;\n          border-radius: 5px;\n        }\n        .ayah-container {\n          text-align: center;\n          margin-bottom: 10px;\n        }\n        .word {\n          cursor: pointer;\n          transition: background-color 0.3s;\n        }\n        .word:hover {\n          background-color: lightgray;\n        }\n      </style>\n      <div class=\"ayah-player\">\n        ${this.audioElement.outerHTML}\n        <div class=\"ayah-container\">\n          ${this.ayahs\n      .map(\n        (ayah) => `\n                <div id=\"ayah-${ayah.ayah}\" class=\"ayah-text\">\n                  <strong>Ayah ${ayah.ayah}:</strong> \n                  ${ayah.words\n          .map(\n            (word) =>\n              `<span class=\"word ${this.currentWordId === word.id ? \"highlighted\" : \"\"}\" \n                               data-word-id=\"${word.id}\">${word.text}</span>`\n          )\n          .join(\" \")}\n                </div>`\n      )\n      .join(\"\")}\n        </div>\n      </div>\n    `;\n\n    this.shadowRoot.querySelector(\"audio\").replaceWith(this.audioElement);\n\n    // Attach event listeners to words for seeking\n    this.shadowRoot.querySelectorAll(\".word\").forEach((wordElement) => {\n      wordElement.addEventListener(\"click\", (event) => {\n        const wordId = parseInt(event.target.dataset.wordId, 10);\n        this.seekAudio(wordId);\n      });\n    });\n  }\n}\n\ncustomElements.define(\"ayah-player\", AyahPlayer);\n"],
  "mappings": "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;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAK;AAAA;AAAA,QAE7D;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA;AAAA,QAE7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA;AAAA;AAAA,QAG7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA;AAAA,QAE7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA;AAAA,QAE7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA;AAAA,QAE7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA;AAAA,QAE5C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC9C;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA;AAAA,QAE3D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC3D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC3D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC3D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA;AAAA,QAE3D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA;AAAA,QAE5D;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;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cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,QAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,QAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,QAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,QAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,QAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,QAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,QAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,QAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,QAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,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Y,MAAQ;MAAe,OAAQ;MACvE,MAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe,MAAQ;MACvE,OAAQ;MAAY,OAAQ;MAAY,MAAQ;MAAe,MAAQ;MACvE,OAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe,MAAQ;MACvE,OAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe,OAAQ;MACvE,MAAQ;MAAY,OAAQ;MAAY,MAAQ;MAAe,OAAQ;MACvE,MAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe,MAAQ;MACvE,MAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe,OAAQ;MACvE,OAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe,MAAQ;MACvE,MAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe,OAAQ;MACvE,OAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe,MAAQ;MACvE,MAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe,OAAQ;MACvE,OAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe,OAAQ;MACvE,MAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe,OAAQ;MACvE,MAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe,MAAQ;MACvE,MAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe,MAAQ;MACvE,MAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe,OAAQ;MACvE,MAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe,OAAQ;MACvE,MAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe,MAAQ;MACvE,MAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe,MAAQ;MACvE,MAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe,MAAQ;MACvE,MAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe,MAAQ;MACvE,MAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe,MAAQ;MACvE,MAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe,MAAQ;MACvE,MAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe,MAAQ;MACvE,MAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe,MAAQ;MACvE,MAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe,MAAQ;MACvE,MAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe,MAAQ;MACvE,MAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe,MAAQ;MACvE,MAAQ;MAAY,MAAQ;MAAY,MAAQ;MAAe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",
  "names": ["global", "w", "window", "indexOf", "isFunction", "isWindow", "document", "i", "version", "jQuery", "j", "clone", "arr", "matches", "_i", "sort", "a", "b", "push", "documentElement", "expando", "rquickExpr", "e", "find", "m", "tokenize", "cache", "fn", "id", "node", "start", "dir", "n", "elem", "l", "_", "add", "index", "v", "value", "deferred", "error", "data", "nodeName", "on", "t", "tr", "name", "p", "length", "to", "option", "location", "s", "val", "ct", "completed", "body", "off", "method", "type", "consumer", "error", "consumer", "s", "consumer", "s", "subscription", "a", "HowlerGlobal", "Howler", "i", "j", "e", "Howl", "o", "Sound", "id", "start", "index", "to", "cache", "fn", "error", "version", "x", "y", "z", "or", "i", "e", "format", "err", "define", "$", "toastr", "error", "notify", "i", "options", "map", "a", "b", "i", "byteLength", "i", "len", "uint8", "start", "len2", "i", "lt", "dt", "t", "lengths", "off", "d", "offs", "isBigEndian", "b", "n", "m", "i", "index", "INITIAL_STATE", "FAIL_STATE", "StateMachine", "constructor", "dfa", "stateTable", "accepting", "tags", "match", "str", "self", "Symbol", "iterator", "state", "startRun", "lastAccepting", "lastState", "p", "length", "c", "apply", "actions", "start", "end", "tag", "slice", "clone", "_", "parent", "depth", "index", "i", "c", "o", "re", "i", "p", "i", "p", "i", "i", "p", "t", "Context", "br", "n", "i", "index", "p", "x", "v", "j", "e", "m", "i", "d", "s", "c", "rt", "Buffer", "e", "b", "byteLength", "i", "a", "x", "y", "start", "n", "m", "j", "indexOf", "lo", "hi", "E", "Base", "c", "fn", "jQuery", "S2", "require", "define", "config", "i", "j", "index", "e", "$", "m", "decoratedMethod", "d", "k", "id", "s", "option", "matches", "c", "_", "val", "defaults", "item", "t", "params", "$e", "css", "l", "a", "n", "select2", "global", "util", "let", "uid_index", "escape", "string", "replace", "isDataUrl", "url", "search", "canvasToBlob", "canvas", "toBlob", "Promise", "resolve", "binaryString", "atob", "toDataURL", "split", "length", "binaryArray", "Uint8Array", "i", "charCodeAt", "Blob", "type", "resolveUrl", "baseUrl", "doc", "document", "implementation", "createHTMLDocument", "base", "createElement", "a", "head", "appendChild", "body", "href", "getAndEncode", "cacheEntry", "domtoimage", "impl", "urlCache", "find", "el", "promise", "push", "options", "cacheBust", "test", "Date", "getTime", "xhr", "XMLHttpRequest", "fail", "message", "console", "error", "placehold", "placeholder", "imagePlaceholder", "status", "timeout", "httpTimeout", "onerror", "ontimeout", "onloadend", "readyState", "DONE", "toLowerCase", "startsWith", "response", "reader", "FileReader", "result", "readAsDataURL", "ex", "toString", "useCredentialsFilters", "useCredentials", "filter", "e", "credentialsFilter", "withCredentials", "corsImg", "indexOf", "window", "location", "origin", "method", "toUpperCase", "open", "isJson", "headers", "corsData", "Object", "keys", "forEach", "key", "setRequestHeader", "data", "JSON", "parse", "stringify", "responseType", "send", "uid", "Math", "random", "pow", "slice", "asArray", "arrayLike", "array", "escapeXhtml", "makeImage", "uri", "reject", "svg", "createElementNS", "image", "Image", "crossOrigin", "onload", "removeChild", "requestAnimationFrame", "src", "width", "node", "px", "isNaN", "leftBorder", "rightBorder", "scrollWidth", "height", "topBorder", "bottomBorder", "scrollHeight", "getWindow", "isElement", "isElementHostForOpenShadowRoot", "value", "shadowRoot", "isShadowRoot", "isInShadowRoot", "isHTMLElement", "HTMLElement", "isHTMLCanvasElement", "HTMLCanvasElement", "isHTMLInputElement", "HTMLInputElement", "isHTMLImageElement", "HTMLImageElement", "isHTMLLinkElement", "HTMLLinkElement", "isHTMLScriptElement", "HTMLScriptElement", "isHTMLStyleElement", "HTMLStyleElement", "isHTMLTextAreaElement", "HTMLTextAreaElement", "isShadowSlotElement", "HTMLSlotElement", "isSVGElement", "SVGElement", "isSVGRectElement", "SVGRectElement", "isDimensionMissing", "ownerDocument", "undefined", "defaultView", "ShadowRoot", "getRootNode", "Element", "styleProperty", "nodeType", "ELEMENT_NODE", "getComputedStyle", "getPropertyValue", "parseFloat", "NaN", "inliner", "URL_REGEX", "inlineAll", "get", "shouldProcess", "then", "readUrls", "urls", "done", "prefix", "inline", "urlAsRegex", "match", "exec", "urlValue", "RegExp", "dataUrl", "pattern", "fontFaces", "resolveAll", "readAll", "webFonts", "all", "map", "webFont", "cssStrings", "join", "styleSheets", "cssRules", "sheet", "sheetProto", "getPrototypeOf", "prototype", "hasOwnProperty", "call", "bind", "rule", "CSSRule", "FONT_FACE_RULE", "style", "rules", "newWebFont", "webFontRule", "parentStyleSheet", "cssText", "images", "inlineCSSProperty", "newImage", "childNodes", "child", "properties", "inliningTasks", "propertyName", "priority", "getPropertyPriority", "inlinedValue", "setProperty", "element", "defaultOptions", "copyDefaultStyles", "styleCaching", "adjustClonedNode", "filterStyles", "toSvg", "toPng", "draw", "toJpeg", "quality", "toPixelData", "getContext", "getImageData", "toCanvas", "copyOptions", "exports", "module", "Node", "globalThis", "ownerWindow", "restorations", "originalChild", "wrappingSpan", "replaceWith", "append", "wrapper", "clonee", "cloneNode", "parentComputedStyles", "sandbox", "makeNodeCopy", "adjustCloneBefore", "clone", "cloneChildren", "getParentOfChildren", "adjustCloneAfter", "processClone", "original", "originalChildren", "getRenderedChildren", "originalComputedStyles", "getRenderedParent", "clonedChild", "host", "assignedNodes", "cloneStyle", "clonePseudoElements", "copyUserInput", "fixSvg", "fixResponsiveImages", "removeAttribute", "srcset", "sizes", "currentSrc", "copyFont", "source", "target", "font", "fontFamily", "fontFeatureSettings", "fontKerning", "fontSize", "fontStretch", "fontStyle", "fontVariant", "fontVariantCaps", "fontVariantEastAsian", "fontVariantLigatures", "fontVariantNumeric", "fontVariationSettings", "fontWeight", "copyStyle", "sourceElement", "targetElement", "sourceComputedStyles", "copyUserComputedStyleFast", "removeProperty", "prop", "cloneClassName", "clonePseudoElement", "content", "formatPseudoElementStyle", "selector", "formatCssText", "formatCssProperties", "createTextNode", "styleText", "formatProperty", "name", "propertyValue", "propertyPriority", "currentClass", "getAttribute", "styleElement", "setAttribute", "innerHTML", "attribute", "disableEmbedFonts", "embedFonts", "disableInlineImages", "inlineImages", "bgcolor", "backgroundColor", "property", "onCloneResult", "onclone", "XMLSerializer", "serializeToString", "xhtml", "foreignObjectSizing", "restoration", "pop", "removeDefaultStylesTimeoutId", "clearTimeout", "setTimeout", "tagNameDefaultStyles", "domNode", "scale", "ctx", "fillStyle", "fillRect", "msImageSmoothingEnabled", "imageSmoothingEnabled", "drawImage", "styleNode", "defaultStyle", "tagKey", "tagHierarchy", "_", "sourceNode", "tagNames", "tagName", "ascentStoppers", "includes", "parentNode", "defaultElement", "sandboxDocument", "childTagName", "childElement", "textContent", "sandboxWindow", "contentWindow", "charsetToUse", "characterSet", "docTypeDeclaration", "docType", "doctype", "escapeHTML", "publicId", "systemId", "trim", "id", "top", "visibility", "position", "tryTechniques", "charset", "title", "write", "metaCharset", "sandboxHTML", "documentElement", "outerHTML", "contentDocument", "unsafeText", "div", "innerText", "defaultComputedStyle", "destroyElementHierarchy", "parentElement", "targetStyle", "needs_prefixing", "sourceValue", "defaultValue", "parentValue", "this", "jquery", "i", "_", "fn", "submitter", "config", "location", "body", "error", "toCacheKey", "index", "cookie", "id", "x", "y", "clone", "defaults", "ctx", "morphChildren", "findBestMatch", "e", "morphNode", "createMorphContext", "normalizeElement", "normalizeParent", "option", "session", "visit", "recentRequests", "Turbo", "findFrameElement_fn", "document", "c", "createConsumer", "m", "x", "submitter", "body", "attachmentSelector", "attachments", "preview", "presentation", "caption", "name", "size", "file", "attributes", "default", "tagName", "parse", "quote", "nestable", "heading1", "terminal", "breakOnReturn", "group", "code", "htmlAttributes", "text", "plaintext", "bulletList", "bullet", "listAttribute", "test", "element", "parentNode", "this", "numberList", "number", "attachmentGallery", "exclusive", "_element$tagName", "toLowerCase", "androidVersionMatch", "navigator", "userAgent", "match", "androidVersion", "parseInt", "browser$1", "composesExistingText", "recentAndroid", "samsungAndroid", "forcesObjectResizing", "supportsInputEvents", "InputEvent", "every", "prop", "prototype", "dompurify", "ADD_ATTR", "SAFE_FOR_XML", "RETURN_DOM", "lang$1", "attachFiles", "bold", "bullets", "byte", "bytes", "captionPlaceholder", "indent", "italic", "link", "numbers", "outdent", "redo", "remove", "strike", "undo", "unlink", "url", "urlPlaceholder", "GB", "KB", "MB", "PB", "TB", "sizes", "lang", "file_size_formatting", "prefix", "precision", "formatter", "concat", "base", "exp", "Math", "floor", "log", "withoutInsignificantZeros", "pow", "toFixed", "replace", "ZERO_WIDTH_SPACE", "NON_BREAKING_SPACE", "extend", "properties", "key", "value", "html", "document", "documentElement", "matches", "handleEvent", "eventName", "onElement", "matchingSelector", "withCallback", "inPhase", "preventDefault", "times", "arguments", "length", "undefined", "selector", "useCapture", "handler", "event", "destroy", "target", "findClosestElementFromNode", "call", "removeEventListener", "addEventListener", "createEvent", "bubbles", "cancelable", "initEvent", "triggerEvent", "dispatchEvent", "elementMatchesSelector", "nodeType", "node", "untilNode", "Node", "ELEMENT_NODE", "closest", "innerElementIsActive", "activeElement", "elementContainsNode", "findChildIndexOfNode", "_node", "childIndex", "previousSibling", "removeNode", "_node$parentNode", "removeChild", "walkTree", "tree", "onlyNodesOfType", "usingFilter", "expandEntityReferences", "whatToShow", "NodeFilter", "SHOW_ELEMENT", "SHOW_TEXT", "SHOW_COMMENT", "SHOW_ALL", "createTreeWalker", "makeElement", "tag", "options", "createElement", "editable", "contenteditable", "setAttribute", "style", "data", "dataset", "className", "split", "forEach", "classList", "add", "textContent", "childNodes", "childNode", "appendChild", "blockTagNames", "getBlockTagNames", "blockAttributes", "push", "nodeIsBlockContainer", "nodeIsBlockStartComment", "firstChild", "nodeIsBlockStart", "strict", "includes", "nodeIsCommentNode", "COMMENT_NODE", "nodeIsCursorTarget", "nodeIsTextNode", "trixCursorTarget", "nodeIsAttachmentElement", "nodeIsEmptyTextNode", "TEXT_NODE", "input", "level2Enabled", "getLevel", "browser", "pickFiles", "callback", "type", "multiple", "hidden", "id", "fileInputId", "files", "getElementById", "body", "click", "parser", "removeBlankTableCells", "tableCellSeparator", "tableRowSeparator", "text_attributes", "inheritable", "window", "getComputedStyle", "fontWeight", "fontStyle", "href", "groupTagName", "getAttribute", "frozen", "backgroundColor", "toolbar", "getDefaultHTML", "interval", "attachment", "attachmentCaption", "attachmentCaptionEditor", "attachmentMetadata", "attachmentMetadataContainer", "attachmentName", "attachmentProgress", "attachmentSize", "attachmentToolbar", "BasicObject", "expression", "toMethod", "toProperty", "optional", "parseProxyMethodExpression", "subject", "object", "_this$toMethod", "_object", "apply", "proxyMethodExpressionPattern", "Error", "args", "Function", "RegExp", "$", "UTF16String", "box", "fromUCS2String", "toString", "ucs2String", "ucs2decode", "codepoints", "ucs2encode", "constructor", "super", "ucs2Length", "offsetToUCS2Offset", "offset", "slice", "max", "offsetFromUCS2Offset", "ucs2Offset", "fromCodepoints", "charAt", "isEqualTo", "toJSON", "getCacheKey", "hasArrayFrom", "_Array$from", "Array", "from", "hasStringCodePointAt", "_$codePointAt", "codePointAt", "hasStringFromCodePoint", "_String$fromCodePoint", "String", "fromCodePoint", "string", "map", "char", "output", "counter", "charCodeAt", "extra", "array", "result", "fromCharCode", "join", "TrixObject", "jsonString", "fromJSON", "JSON", "hasSameConstructorAs", "inspect", "parts", "contents", "contentsForInspection", "toJSONString", "stringify", "toUTF16String", "arraysAreEqual", "a", "b", "index", "spliceArray", "_len", "_key", "splice", "RTL_PATTERN", "getDirection", "dir", "dirName", "textArea", "form", "supportsDirName", "FormData", "has", "error", "supportsDirSelector", "get", "trim", "allAttributeNames", "blockAttributeNames", "textAttributeNames", "listAttributeNames", "getAllAttributeNames", "getTextAttributeNames", "getBlockAttributeNames", "getBlockConfig", "attributeName", "config", "Object", "keys", "getTextConfig", "installDefaultCSSForTagName", "defaultCSS", "insertStyleElementForTagName", "nonce", "getCSPNonce", "head", "insertBefore", "getMetaElement", "content", "querySelector", "testTransferData", "dataTransferIsPlainText", "dataTransfer", "getData", "DOMParser", "parseFromString", "keyEventIsKeyboardCommand", "platform", "metaKey", "ctrlKey", "defer", "fn", "setTimeout", "copyObject", "objectsAreEqual", "normalizeRange", "range", "isArray", "copyValue", "rangeIsCollapsed", "start", "end", "rangeValuesAreEqual", "rangesAreEqual", "leftRange", "rightRange", "leftStart", "leftEnd", "rightStart", "rightEnd", "left", "right", "SelectionChangeObserver", "update", "bind", "selectionManagers", "started", "stop", "registerSelectionManager", "selectionManager", "unregisterSelectionManager", "filter", "sm", "notifySelectionManagersOfSelectionChange", "selectionDidChange", "reset", "selectionChangeObserver", "getDOMSelection", "selection", "getSelection", "rangeCount", "getDOMRange", "_getDOMSelection", "domRange", "getRangeAt", "domRangeIsPrivate", "setDOMRange", "removeAllRanges", "addRange", "nodeIsPrivate", "startContainer", "endContainer", "getPrototypeOf", "normalizeSpaces", "breakableWhitespacePattern", "squishBreakableWhitespace", "source", "utf16StringDifferences", "diffA", "utf16StringDifference", "utf16String", "diffB", "leftIndex", "rightIndexA", "rightIndexB", "Hash", "fromCommonAttributesOfObjects", "objects", "hash", "getKeys", "getKeysCommonToHash", "values", "copy", "merge", "unbox", "toArray", "isEmpty", "toObject", "keyToRemove", "sort", "ObjectGroup", "groupObjects", "ungroupedObjects", "depth", "asTree", "_object$canBeGrouped2", "_object$canBeGrouped", "_group$canBeGroupedWi", "_group", "canBeGrouped", "canBeGroupedWith", "getObjects", "getDepth", "ObjectMap", "find", "ElementStore", "elements", "getKey", "trixStoreKey", "Operation", "isPerforming", "performing", "hasPerformed", "performed", "hasSucceeded", "succeeded", "hasFailed", "getPromise", "promise", "Promise", "resolve", "reject", "perform", "release", "_this$promise", "_this$promise$cancel", "cancel", "proxyMethod", "ObjectView", "childViews", "rootView", "getNodes", "nodes", "createNodes", "cloneNode", "invalidate", "_this$parentView", "parentView", "invalidateViewForObject", "_this$findViewForObje", "findViewForObject", "findOrCreateCachedChildView", "viewClass", "view", "getCachedViewForObject", "recordChildView", "createChildView", "cacheViewForObject", "ObjectGroupView", "getAllChildViews", "views", "childView", "findElement", "findElementForObject", "getViewCache", "isViewCachingEnabled", "viewCache", "shouldCacheViews", "enableViewCaching", "disableViewCaching", "_this$getViewCache", "cache", "garbageCollectCachedViews", "objectKeys", "objectGroup", "getChildViews", "createContainerElement", "entries", "setPrototypeOf", "isFrozen", "getOwnPropertyDescriptor", "freeze", "seal", "create", "construct", "Reflect", "x", "func", "thisArg", "Func", "_len2", "_key2", "arrayForEach", "unapply", "arrayLastIndexOf", "lastIndexOf", "arrayPop", "pop", "arrayPush", "arraySplice", "arrayIsArray", "stringToLowerCase", "stringToString", "stringMatch", "stringReplace", "stringIndexOf", "indexOf", "stringTrim", "numberToString", "Number", "booleanToString", "Boolean", "bigintToString", "BigInt", "symbolToString", "Symbol", "objectHasOwnProperty", "hasOwnProperty", "objectToString", "regExpTest", "typeErrorCreate", "TypeError", "_len4", "_key4", "lastIndex", "_len3", "_key3", "addToSet", "set", "transformCaseFunc", "l", "lcElement", "cleanArray", "clone", "newObject", "property", "lookupGetter", "desc", "t", "e", "i", "n", "r", "o", "s", "c", "u", "h", "d", "g", "m", "p", "f", "v", "A", "y", "C", "E", "S", "R", "T", "k", "w", "D", "L", "N", "I", "O", "F", "P", "M", "B", "_", "j", "W", "U", "V", "z", "H", "q", "J", "K", "G", "X", "Y", "Z", "Q", "tt", "et", "it", "nt", "rt", "ot", "st", "at", "lt", "ct", "ut", "ht", "dt", "gt", "mt", "pt", "ft", "bt", "vt", "At", "yt", "xt", "Ct", "Et", "St", "Rt", "Tt", "kt", "wt", "Dt", "Lt", "Nt", "It", "_unused", "Ot", "Ft", "Pt", "Mt", "Bt", "_t", "jt", "Wt", "Ut", "Vt", "qt", "zt", "Ht", "Jt", "Kt", "valueAsRecord", "valueToString", "stringified", "DOMPurify", "addHook", "attrName", "keepAttr", "forceKeepAttr", "DEFAULT_ALLOWED_ATTRIBUTES", "DEFAULT_FORBIDDEN_PROTOCOLS", "DEFAULT_FORBIDDEN_ELEMENTS", "HTMLSanitizer", "sanitizedElement", "sanitize", "sanitizedHtml", "getHTML", "outerHTML", "innerHTML", "sanitizer", "allowedAttributes", "forbiddenProtocols", "forbiddenElements", "purifyOptions", "createBodyElementForHTML", "sanitizeElements", "normalizeListElementNesting", "purifyConfig", "assign", "setConfig", "getBody", "walker", "nodesToRemove", "nextNode", "currentNode", "elementIsRemovable", "sanitizeElement", "hasAttribute", "protocol", "removeAttribute", "_ref", "querySelectorAll", "listElement", "previousElement", "previousElementSibling", "elementIsForbidden", "elementIsntSerializable", "doc", "implementation", "createHTMLDocument", "css", "AttachmentView", "uploadProgressDelegate", "attachmentPiece", "piece", "createContentNodes", "innerElement", "figure", "getClassName", "getHref", "tabindex", "hasContent", "setHTML", "getContent", "createCaptionElement", "isPending", "progressElement", "class", "getUploadProgress", "trixMutable", "createCursorTarget", "figcaption", "getCaption", "captionConfig", "getCaptionConfig", "getFilename", "getFormattedFilesize", "nameElement", "createTextNode", "sizeElement", "names", "getType", "extension", "getExtension", "trixAttachment", "trixContentType", "getContentType", "trixId", "trixAttributes", "trixSerialize", "htmlContainsTagName", "isValidAttribute", "_config$attachments$t", "findProgressElement", "_this$findElement", "attachmentDidChangeUploadProgress", "div", "PreviewableAttachmentView", "previewDelegate", "image", "src", "refresh", "updateAttributesForImage", "getURL", "previewURL", "getPreviewURL", "serializedAttributes", "width", "getWidth", "height", "getHeight", "alt", "storeKey", "attachmentDidChangeAttributes", "PieceView", "getAttributes", "textConfig", "context", "createAttachmentNodes", "createStringNodes", "_element", "firstElementChild", "isPreviewable", "_this$textConfig", "iterable", "substring", "preserveSpaces", "styles", "pendingElement", "styleProperty", "isLast", "isFirst", "followsWhitespace", "TextView", "pieces", "getPieces", "endsWithWhitespace", "previousPiece", "BlockView", "block", "createComment", "_getBlockConfig", "getLastAttribute", "textView", "shouldAddExtraNewlineElement", "isRTL", "getBlockBreakPosition", "DocumentView", "render", "sync", "elementStore", "setDocument", "shadowElement", "getBlocks", "isSynced", "elementsHaveEqualHTML", "documentFragment", "lastChild", "fragment", "createDocumentFragmentForSync", "didSync", "findStoredElements", "createDocumentFragment", "storedElement", "replaceChild", "otherElement", "ignoreSpaces", "Piece", "types", "pieceJSON", "copyWithAttributes", "getValue", "copyWithAdditionalAttributes", "copyWithoutAttribute", "attribute", "getAttributesHash", "hasSameStringValueAsPiece", "hasSameAttributesAsPiece", "isBlockBreak", "isSerializable", "getLength", "canBeConsolidatedWith", "_defineProperty", "ImagePreloadOperation", "Image", "onload", "naturalWidth", "naturalHeight", "onerror", "Attachment", "attributesForFile", "setFile", "filename", "filesize", "contentType", "attachmentJSON", "releaseFile", "didChangeAttributes", "setAttributes", "newAttributes", "_this$previewDelegate", "_this$previewDelegate2", "_this$delegate", "_this$delegate$attach", "delegate", "preloadURL", "previewablePattern", "getFilesize", "_this$getFilename$mat", "getFile", "preloadFile", "releasePreloadedFile", "uploadProgress", "setUploadProgress", "_this$uploadProgressD", "_this$uploadProgressD2", "preloadingURL", "setPreviewURL", "_this$previewDelegate3", "_this$previewDelegate4", "_this$delegate2", "_this$delegate2$attac", "attachmentDidChangePreviewURL", "preload", "fileObjectURL", "URL", "createObjectURL", "revokeObjectURL", "then", "catch", "AttachmentPiece", "ensureAttachmentExclusivelyHasAttribute", "removeProhibitedAttributes", "permittedAttributes", "_piece$attachment", "json", "toConsole", "registerType", "StringPiece", "consolidateWith", "splitAtOffset", "SplittableList", "eachObject", "insertObjectAtIndex", "insertSplittableListAtIndex", "splittableList", "insertSplittableListAtPosition", "position", "splitObjectAtPosition", "editObjectAtIndex", "replaceObjectAtIndex", "removeObjectAtIndex", "getObjectAtIndex", "getSplittableListInRange", "rightIndex", "splitObjectsAtRange", "selectSplittableList", "removeObjectsInRange", "transformObjectsInRange", "transform", "transformedObjects", "rightOuterIndex", "leftInnerIndex", "startOfRange", "endOfRange", "getObjectAtPosition", "findIndexAndOffsetAtPosition", "splitIndex", "splitOffset", "leftObject", "rightObject", "consolidate", "pendingObject", "_pendingObject$canBeC", "_pendingObject", "consolidateFromIndexToIndex", "startIndex", "endIndex", "objectsInRange", "consolidatedInRange", "currentPosition", "nextPosition", "findPositionAtIndexAndOffset", "currentIndex", "getEndPosition", "endPosition", "objectArraysAreEqual", "Text", "textJSON", "notEmpty", "pieceList", "copyWithPieceList", "copyUsingObjectMap", "objectMap", "appendText", "insertTextAtPosition", "removeTextAtRange", "replaceTextAtRange", "moveTextFromRangeToPosition", "getTextAtRange", "addAttributeAtRange", "addAttributesAtRange", "removeAttributeAtRange", "setAttributesAtRange", "getAttributesAtPosition", "_this$pieceList$getOb", "getCommonAttributes", "getCommonAttributesAtRange", "getExpandedRangeForAttributeAtOffset", "getStringAtRange", "getStringAtPosition", "startsWithString", "endsWithString", "getAttachmentPieces", "getAttachments", "getAttachmentAndPositionById", "attachmentId", "getAttachmentById", "getRangeOfAttachment", "attachmentAndPosition", "updateAttributesForAttachment", "_text$pieceList", "eachPiece", "getPieceAtPosition", "toSerializableText", "Block", "blockJSON", "applyBlockBreakToText", "copyWithText", "copyWithoutText", "copyWithoutAttributes", "mappedText", "addAttribute", "expandAttribute", "addHTMLAttribute", "removeLastValue", "removeLastAttribute", "getLastElement", "getAttributeLevel", "getAttributeAtLevel", "level", "hasAttributes", "getLastNestableAttribute", "getNestableAttributes", "getNestingLevel", "decreaseNestingLevel", "increaseNestingLevel", "getListItemAttributes", "isListItem", "isTerminalBlock", "_getBlockConfig2", "breaksOnReturn", "_getBlockConfig3", "findLineBreakInDirectionFromPosition", "direction", "newlineText", "textForStringWithAttributes", "getTextWithoutBlockBreak", "textEndsInBlockBreak", "otherBlock", "otherAttributes", "otherAttribute", "getListAttributeNames", "unmarkExistingInnerBlockBreaksInText", "addBlockBreakToText", "modified", "innerPieces", "lastPiece", "unmarkBlockBreakPiece", "blockBreakText", "blockBreak", "Document", "documentJSON", "textAttributes", "blocks", "blockList", "getBlockAtIndex", "consolidateBlocks", "copyUsingObjectsFromDocument", "sourceDocument", "copyWithBaseBlockAttributes", "replaceBlock", "oldBlock", "newBlock", "insertDocumentAtRange", "locationFromPosition", "getBlockAtPosition", "mergeDocumentAtRange", "formattedDocument", "startPosition", "startLocation", "baseBlockAttributes", "getBaseBlockAttributes", "trailingBlockAttributes", "leadingBlockAttributes", "blockCount", "getBlockCount", "firstBlock", "firstText", "insertTextAtRange", "leftPosition", "rightPosition", "leftLocation", "rightLocation", "locationRangeFromRange", "leftOffset", "leftBlock", "rightOffset", "rightBlock", "leftText", "rightText", "affectedBlockCount", "getDocumentAtRange", "movingRightward", "eachBlockAtRange", "textRange", "eachBlock", "getTextAtIndex", "removeAttributeForAttachment", "setHTMLAttributeAtPosition", "updatedBlock", "insertBlockBreakAtRange", "applyBlockAttributeAtRange", "expanded", "expandRangeToLineBreaksAndSplitBlocks", "blockConfig", "removeLastListAttributeAtRange", "exceptAttributeName", "converted", "convertLineBreaksToBlockBreaksInRange", "removeBlockAttributesAtRange", "removeLastTerminalAttributeAtRange", "consolidateBlocksAtRange", "lastAttributeName", "endLocation", "startBlock", "positionFromLocation", "endBlock", "_this$getBlockAtIndex", "getTextAtPosition", "getCharacterAtPosition", "getEditCount", "editCount", "getCommonAttributesAtPosition", "attributesForBlock", "commonAttributes", "attributesLeft", "inheritableAttributes", "getRangeOfCommonAttributeAtPosition", "startOffset", "endOffset", "blockIndex", "lastAttributeIndex", "min", "attachmentPieces", "getLocationRangeOfAttachment", "getAttachmentPieceForAttachment", "findRangesForBlockAttribute", "ranges", "findRangesForTextAttribute", "withValue", "location", "locationRangeFromPosition", "rangeFromLocationRange", "locationRange", "getTexts", "toSerializableDocument", "pieceForString", "parseTrixDataAttribute", "HTMLParser", "referenceElement", "blockElements", "processedElements", "getDocument", "createHiddenContainer", "containerElement", "nodeFilter", "processNode", "translateBlockElementMarginsToNewlines", "removeHiddenContainer", "display", "nextSibling", "isInsignificantTextNode", "appendBlockForTextNode", "processTextNode", "appendBlockForElement", "processElement", "currentBlockElement", "isBlockElement", "appendStringWithAttributes", "_this$currentBlock", "getBlockAttributes", "getBlockHTMLAttributes", "currentBlock", "appendBlockForAttributesWithElement", "elementIsBlockElement", "currentBlockContainsElement", "parentBlockElement", "findParentBlockElement", "appendEmptyBlock", "parentElement", "_node$previousSibling", "elementCanDisplayPreformattedText", "stringEndsWithWhitespace", "leftTrimBreakableWhitespace", "getTextAttributes", "appendAttachmentWithAttributes", "isExtraBR", "dimensions", "needsTableSeparator", "appendPiece", "appendStringToTextAtIndex", "prependStringToTextAtIndex", "unshift", "configAttr", "attributeInheritedFromBlock", "blockElement", "findBlockElementAncestors", "attrConfig", "_attrConfig$test", "reverse", "settings", "ancestors", "stringIsAllBreakableWhitespace", "nodeEndsWithNonWhitespace", "_element$previousSibl", "defaultMargin", "getMarginOfDefaultBlockElement", "margin", "getMarginOfBlockElementAtIndex", "top", "bottom", "getBlockElementMargin", "whiteSpace", "marginTop", "marginBottom", "FILTER_REJECT", "FILTER_ACCEPT", "unserializableAttributeNames", "serializedAttributesAttribute", "serializedAttributesSelector", "blockCommentPattern", "serializers", "serializable", "HTMLElement", "el", "ManagedAttachment", "attachmentManager", "requestRemovalOfAttachment", "AttachmentManager", "managedAttachments", "manageAttachment", "attachmentIsManaged", "attachmentManagerDidRequestRemovalOfAttachment", "unmanageAttachment", "managedAttachment", "LineBreakInsertion", "composition", "selectedRange", "getSelectedRange", "previousCharacter", "nextCharacter", "shouldInsertBlockBreak", "shouldBreakFormattedBlock", "shouldDecreaseListLevel", "shouldPrependListItem", "shouldRemoveLastBlockAttribute", "Composition", "currentAttributes", "revision", "_this$delegate$compos", "refreshAttachments", "compositionDidChangeDocument", "getSnapshot", "loadSnapshot", "_this$delegate2$compo", "_this$delegate3", "_this$delegate3$compo", "compositionWillLoadSnapshot", "setSelection", "compositionDidLoadSnapshot", "insertText", "updatePosition", "notifyDelegateOfInsertionAtRange", "insertBlock", "insertDocument", "insertString", "getCurrentTextAttributes", "insertBlockBreak", "insertLineBreak", "insertion", "decreaseListLevel", "removeLastBlockAttribute", "breakFormattedBlock", "insertHTML", "replaceHTML", "getLocationRange", "insertFile", "insertFiles", "_this$delegate4", "compositionShouldAcceptFile", "attachmentForFile", "insertAttachments", "insertAttachment", "attachmentText", "textForAttachmentWithAttributes", "shouldManageDeletingInDirection", "shouldManageMovingCursorInDirection", "deleteInDirection", "deletingIntoPreviousBlock", "selectionSpansBlocks", "selectionIsCollapsed", "canDecreaseBlockAttributeLevel", "getBlock", "decreaseBlockAttributeLevel", "getExpandedRangeInDirection", "getAttachmentAtRange", "editAttachment", "moveTextFromRange", "removeAttachment", "stopEditingAttachment", "removeCurrentAttribute", "insertPlaceholder", "placeholderPosition", "getPosition", "selectPlaceholder", "setSelectedRange", "PLACEHOLDER", "forgetPlaceholder", "hasCurrentAttribute", "toggleCurrentAttribute", "setCurrentAttribute", "canSetCurrentAttribute", "canSetCurrentBlockAttribute", "canSetCurrentTextAttribute", "getSelectedDocument", "setBlockAttribute", "setTextAttribute", "notifyDelegateOfCurrentAttributesChange", "setHTMLAtributeAtPosition", "allowedHTMLAttributes", "newDocument", "removeBlockAttribute", "updateCurrentAttributes", "removeTextAttribute", "canDecreaseNestingLevel", "_this$getBlock", "canIncreaseNestingLevel", "previousBlock", "getPreviousBlock", "_this$getBlock2", "_this$getBlock3", "attributeLevel", "ignoreLock", "getCurrentAttributes", "freezeSelection", "thawSelection", "hasFrozenSelection", "_this$delegate5", "compositionDidRequestChangingSelectionToLocationRange", "getSelectionManager", "setLocationRange", "targetLocationRange", "withTargetLocationRange", "withTargetRange", "withTargetDOMRange", "createLocationRangeFromDOMRange", "translateUTF16PositionFromOffset", "editingAttachment", "moveCursorInDirection", "canEditAttachment", "expandSelectionInDirection", "expandSelectionForEditing", "expandSelectionAroundCommonAttribute", "selectionContainsAttachments", "_this$getSelectedAtta", "getSelectedAttachments", "selectionIsInCursorTarget", "positionIsCursorTarget", "locationIsCursorTarget", "positionIsBlockBreak", "_this$document$getPie", "_this$getSelectedDocu", "added", "removed", "oldArray", "newArray", "existingValues", "Set", "currentValues", "_this$delegate6", "_this$delegate6$compo", "compositionDidRemoveAttachment", "_this$delegate7", "_this$delegate7$compo", "compositionDidAddAttachment", "_this$delegate8", "_this$delegate8$compo", "compositionDidEditAttachment", "_this$delegate9", "_this$delegate9$compo", "compositionDidChangeAttachmentPreviewURL", "_this$delegate10", "_this$delegate10$comp", "compositionDidStartEditingAttachment", "_this$delegate11", "_this$delegate11$comp", "compositionDidStopEditingAttachment", "_this$delegate12", "_this$delegate12$comp", "compositionDidChangeCurrentAttributes", "_this$delegate13", "_this$delegate13$comp", "compositionDidPerformInsertionAtRange", "utf16string", "utf16position", "UndoManager", "undoEntries", "redoEntries", "recordUndoEntry", "description", "consolidatable", "previousEntry", "entryHasDescriptionAndContext", "undoEntry", "createEntry", "redoEntry", "snapshot", "canUndo", "canRedo", "entry", "BLOCK_ATTRIBUTE_NAME", "Filter", "applyBlockAttribute", "findRangesOfBlocks", "findRangesOfPieces", "moveSelectedRangeForward", "attachmentGalleryFilter", "DEFAULT_FILTERS", "Editor", "undoManager", "filters", "loadDocument", "loadHTML", "loadJSON", "getClientRectAtPosition", "getClientRectAtLocationRange", "activateAttribute", "attributeIsActive", "canActivateAttribute", "deactivateAttribute", "LocationMapper", "findLocationFromContainerAndOffset", "container", "foundBlock", "attachmentElement", "findAttachmentElementParentForNode", "rejectAttachmentContents", "nodeLength", "findContainerAndOffsetFromLocation", "nodeOffset", "findNodeAndOffsetFromLocation", "getSignificantNodesForIndex", "acceptSignificantNodes", "recordingNodes", "rejectEmptyTextNodes", "PointMapper", "createDOMRangeFromPoint", "caretPositionFromPoint", "offsetNode", "createRange", "setStart", "caretRangeFromPoint", "createTextRange", "originalDOMRange", "moveToPoint", "select", "getClientRectsForDOMRange", "getClientRects", "SelectionManager", "didMouseDown", "locationMapper", "pointMapper", "lockCount", "currentLocationRange", "lockedLocationRange", "createDOMRangeFromLocationRange", "updateCurrentLocationRange", "setLocationRangeFromPointRange", "pointRange", "getLocationAtPoint", "lock", "unlock", "clearSelection", "_getDOMRange", "collapsed", "selectionIsExpanded", "domRangeWithinElement", "pauseTemporarily", "resumeHandlers", "paused", "resume", "clearTimeout", "resumeTimeout", "_this$delegate$locati", "locationRangeDidChange", "rangeStart", "rangeEnd", "setEnd", "point", "_this$createLocationR", "keyNames", "undoable", "commands", "do", "undos", "AttachmentEditorController", "title", "trixAction", "didClickToolbar", "didClickActionButton", "textarea", "placeholder", "textareaClone", "tabIndex", "autoresize", "scrollHeight", "didInputCaption", "didKeyDownCaption", "didChangeCaption", "didBlurCaption", "editingFigcaption", "editCaption", "focus", "install", "makeElementMutable", "addToolbar", "installCaptionEditor", "uninstall", "savePendingCaption", "didUninstallAttachmentEditor", "pendingCaption", "_this$delegate3$attac", "attachmentEditorDidRequestUpdatingAttributesForAttachment", "attachmentEditorDidRequestRemovingAttributeForAttachment", "stopPropagation", "attachmentEditorDidRequestRemovalOfAttachment", "_this$delegate5$attac", "keyCode", "attachmentEditorDidRequestDeselectingAttachment", "CompositionController", "didFocus", "didBlur", "didClickAttachment", "documentView", "_this$blurPromise", "focused", "compositionControllerDidFocus", "blurPromise", "compositionControllerDidBlur", "findAttachmentForElement", "compositionControllerDidSelectAttachment", "getSerializableElement", "isEditingAttachment", "_this$delegate4$compo", "_this$delegate5$compo", "canSyncDocumentView", "compositionControllerWillSyncDocumentView", "compositionControllerDidSyncDocumentView", "compositionControllerDidRender", "rerenderViewForObject", "refreshViewCache", "attachmentEditor", "installAttachmentEditorForAttachment", "_this$attachmentEdito", "uninstallAttachmentEditor", "_this$attachmentEdito2", "compositionControllerWillUpdateAttachment", "compositionControllerDidRequestRemovalOfAttachment", "compositionControllerDidRequestDeselectingAttachment", "Controller", "mutableAttributeName", "mutableSelector", "childList", "characterData", "characterDataOldValue", "subtree", "MutationObserver", "didMutate", "observer", "observe", "disconnect", "mutations", "_this$delegate$elemen", "findSignificantMutations", "elementDidMutate", "getMutationSummary", "mutation", "mutationIsSignificant", "nodeIsMutable", "nodesModifiedByMutation", "nodeIsSignificant", "addedNodes", "removedNodes", "getTextMutationSummary", "additions", "deletions", "getTextChangesFromCharacterData", "textChanges", "getTextChangesFromChildList", "addition", "summary", "textAdded", "deleted", "textDeleted", "getMutationsByType", "textRemoved", "getTextForNodes", "characterMutations", "startMutation", "endMutation", "summarized", "oldString", "newString", "oldValue", "FileVerificationOperation", "reader", "FileReader", "abort", "readAsArrayBuffer", "FlakyAndroidKeyboardDetector", "shouldIgnore", "previousEvent", "checkSamsungKeyboardBuggyModeStart", "checkSamsungKeyboardBuggyModeEnd", "buggyMode", "insertingLongTextAfterUnidentifiedChar", "differsInWhitespace", "innerText", "inputType", "_this$event$data", "isBeforeInputInsertText", "previousEventWasUnidentifiedKeydown", "_this$previousEvent", "_this$previousEvent2", "text1", "text2", "normalize", "whiteSpaceNormalizerRegexp", "InputController", "mutationObserver", "flakyKeyboardDetector", "events", "handlerFor", "mutationSummary", "editorWillSyncDocumentView", "editorDidSyncDocumentView", "requestRender", "_this$delegate$inputC", "inputControllerDidRequestRender", "requestReparse", "_this$delegate2$input", "inputControllerDidRequestReparse", "operations", "all", "handleInput", "_this$responder", "inputControllerWillAttachFiles", "responder", "defaultPrevented", "inputControllerWillHandleInput", "inputControllerDidHandleInput", "createLinkHTML", "pastedFileCount", "Level0InputController", "resetInputSummary", "setInputSummary", "inputSummary", "isComposing", "inputControllerDidAllowUnhandledInput", "mutationIsExpected", "preferDocument", "mutationAdditionMatchesSummary", "mutationDeletionMatchesSummary", "didDelete", "unexpectedNewlineAddition", "unexpectedNewlineDeletion", "_this$compositionInpu", "textChanged", "composedEmptyString", "compositionInput", "getEndData", "getCompositionInput", "CompositionInput", "isEnded", "_this$responder2", "serializeSelectionToDataTransfer", "_this$responder3", "setData", "canAcceptDataTransfer", "Files", "getPastedHTMLUsingHiddenElement", "pageXOffset", "pageYOffset", "opacity", "requestAnimationFrame", "keydown", "didInput", "keyName", "_context2", "modifier", "_context", "character", "inputControllerDidReceiveKeyboardCommand", "keypress", "altKey", "stringFromKeyEvent", "_this$responder9", "inputControllerWillPerformTyping", "textInput", "toUpperCase", "_this$responder10", "dragenter", "dragstart", "_this$delegate5$input", "draggedRange", "inputControllerDidStartDrag", "dragover", "draggingPoint", "clientX", "clientY", "_this$delegate6$input", "inputControllerDidReceiveDragOverPoint", "dragend", "_this$delegate7$input", "inputControllerDidCancelDrag", "drop", "_event$dataTransfer", "_this$responder11", "_this$responder12", "inputControllerWillMoveText", "_this$responder13", "fromJSONString", "cut", "_this$responder14", "clipboardData", "inputControllerWillCutText", "_this$responder15", "paste", "clipboard", "testClipboardData", "pasteEventIsCrippledSafariHTMLPaste", "_this$responder16", "inputControllerWillPaste", "inputControllerDidPaste", "_this$responder17", "_this$delegate14", "_this$responder18", "_this$delegate15", "_this$delegate16", "_this$responder19", "_this$delegate17", "_clipboard$items", "_clipboard$items$getA", "items", "getAsFile", "_this$delegate18", "_this$responder20", "_this$delegate19", "extensionForFile", "compositionstart", "compositionupdate", "compositionend", "beforeinput", "backspace", "_this$delegate20", "delete", "_this$delegate21", "return", "_this$delegate22", "_this$responder21", "tab", "_this$responder22", "_this$responder23", "_this$responder24", "_this$responder25", "control", "_this$delegate23", "_this$delegate24", "_this$delegate25", "_this$responder26", "shift", "_this$delegate26", "_this$responder27", "_this$responder28", "_this$responder29", "_this$delegate27", "meta", "_this$delegate28", "_file$type", "which", "charCode", "hasPasteboardFlavor", "hasReadableDynamicData", "isExternalHTMLPaste", "isExternalRichTextPaste", "inputController", "isSignificant", "_this$responder5", "_this$responder4", "canApplyToDocument", "_this$responder6", "_this$responder7", "_this$responder8", "_this$data$start", "_this$data$end", "Level2InputController", "scheduledRender", "composing", "reparse", "scheduleRender", "_this$afterRender", "cancelAnimationFrame", "afterRender", "toggleAttributeIfSupported", "inputControllerWillPerformFormatting", "activateAttributeIfSupported", "getTargetDOMRange", "minLength", "_this$event$getTarget", "_this$event", "targetRanges", "getTargetRanges", "staticRangeToRange", "withEvent", "command", "keyboardCommandFromKeyEvent", "shiftKey", "_event$clipboardData", "pasteEventHasFilesOnly", "pasteEventHasPlainTextOnly", "inputTypes", "immmediateRender", "inputEvent", "dragging", "pointFromEvent", "dragEventHasFiles", "ArrowLeft", "ArrowRight", "Backspace", "Tab", "deleteByComposition", "deleteByCut", "deleteByDrag", "deleteByDragRange", "deleteCompositionText", "deleteContent", "deleteContentBackward", "deleteContentForward", "deleteEntireSoftLine", "deleteHardLineBackward", "deleteHardLineForward", "deleteSoftLineBackward", "deleteSoftLineForward", "deleteWordBackward", "deleteWordForward", "formatBackColor", "formatBold", "formatFontColor", "formatFontName", "formatIndent", "formatItalic", "formatJustifyCenter", "formatJustifyFull", "formatJustifyLeft", "formatJustifyRight", "formatOutdent", "formatRemove", "_this$responder30", "formatSetBlockTextDirection", "formatSetInlineTextDirection", "formatStrikeThrough", "formatSubscript", "formatSuperscript", "formatUnderline", "historyRedo", "inputControllerWillPerformRedo", "historyUndo", "inputControllerWillPerformUndo", "insertCompositionText", "insertFromComposition", "insertFromDrop", "_this$responder31", "insertFromPaste", "_this$responder32", "_this$responder33", "processableFilePaste", "_this$responder34", "_this$responder35", "insertFromYank", "insertLink", "insertOrderedList", "insertParagraph", "_this$responder36", "insertReplacementText", "replacement", "_this$event$dataTrans", "insertTranspose", "insertUnorderedList", "staticRange", "_event$dataTransfer$f", "attributeButtonSelector", "actionButtonSelector", "toolbarButtonSelector", "dialogSelector", "activeDialogSelector", "dialogButtonSelector", "dialogInputSelector", "getInputForDialog", "getAttributeName", "getActionName", "ToolbarController", "didClickAttributeButton", "didClickDialogButton", "didKeyDownDialogInput", "actions", "resetDialogInputs", "toolbarDidClickButton", "actionName", "getDialog", "toggleDialog", "toolbarDidInvokeAction", "toolbarDidToggleAttribute", "refreshAttributeButtons", "dialogElement", "dialog", "hideDialog", "updateActions", "refreshActionButtons", "eachActionButton", "disabled", "updateAttributes", "eachAttributeButton", "dialogIsVisible", "applyKeyboardCommand", "keyString", "button", "buttonKeys", "dialogName", "showDialog", "toolbarWillShowDialog", "disabledInput", "toolbarDidShowDialog", "willValidate", "setCustomValidity", "checkValidity", "isSafeAttribute", "toolbarDidUpdateAttribute", "toolbarDidRemoveAttribute", "toolbarDidHideDialog", "EditorController", "editorElement", "compositionController", "toolbarController", "toolbarElement", "editor", "notifyEditorElement", "handlingInput", "updateCurrentActions", "pasting", "pastedRange", "attachmentLocationRange", "loadingSnapshot", "isFocused", "requestedLocationRange", "compositionRevisionWhenLocationRangeRequested", "renderedCompositionRevision", "runEditorFilters", "isFocusedInvisibly", "requestedRender", "recordTypingUndoEntry", "recordFormattingUndoEntry", "locationRangeBeforeDrag", "invokingElement", "invokeAction", "selectionFrozen", "canInvokeAction", "actionIsExternal", "_this$actions$actionN", "_this$actions$actionN2", "getCurrentActions", "currentActions", "snapshotsAreEqual", "updateInputElement", "serializer", "setFormValue", "message", "documentChangedSinceLastRender", "notify", "getUndoContext", "getLocationContext", "getTimeContext", "Date", "getTime", "_this$editorElement$o", "ownerDocument", "TrixToolbarElement", "connectedCallback", "editorElements", "_this$ownerDocument", "nodeList", "makeEditable", "toggleAttribute", "configureContentEditable", "disableObjectResizing", "setDefaultParagraphSeparator", "_document$queryComman", "_document", "queryCommandSupported", "execCommand", "_document$queryComman2", "_document2", "cursorTargetStyles", "_internals", "WeakMap", "_formDisabled", "_validate", "WeakSet", "ElementInternalsDelegate", "_classPrivateFieldInitSpec", "writable", "_classPrivateFieldSet", "attachInternals", "_classPrivateMethodGet", "_validate2", "disconnectedCallback", "_classPrivateFieldGet", "labels", "required", "validity", "validationMessage", "formDisabledCallback", "reportValidity", "customValidationMessage", "valueMissing", "customError", "setValidity", "_focusHandler", "_resetBubbled", "_clickBubbled", "LegacyDelegate", "contains", "label", "texts", "_classPrivateFieldGet2", "console", "warn", "_delegate", "TrixEditorElement", "willCreateInput", "formAssociated", "inputElement", "localName", "toolbarId", "internalToolbar", "_this$ownerDocument2", "_this$editorControlle", "editorController", "defaultValue", "_this$editor", "attributeChangedCallback", "newValue", "isConnected", "reconnect", "inputId", "nextElementSibling", "_this$editorControlle2", "removeInternalToolbar", "_this$internalToolbar", "formResetCallback", "Trix", "VERSION", "version", "core", "models", "controllers", "observers", "customElements", "define", "x", "k", "a", "b", "c", "d", "s", "i", "n", "lo", "hi", "j", "to", "hex", "SparkMD5", "start", "error", "application", "error", "matches", "_", "index", "e", "fetch", "matches", "match", "oldValue", "index", "_", "error", "constructor", "extend", "a", "b", "application", "element", "c", "n", "k", "v", "error", "defaults", "e", "i", "obj", "on", "fn", "_", "i", "n", "index", "extend", "x", "y", "$", "ghostEl", "option", "p", "defaults", "dispatchEvent", "rootEl", "cloneEl", "oldIndex", "newIndex", "oldDraggableIndex", "newDraggableIndex", "putSortable", "pluginEvent", "_detectDirection", "_dragElInRowColumn", "_detectNearestEmptySortable", "x", "y", "_prepareGroup", "to", "dragEl", "_hideGhostForTarget", "_unhideGhostForTarget", "nearestEmptyInsertDetectEvent", "i", "_checkOutsideTargetEl", "fn", "on", "dragStartFn", "e", "target", "after", "toArray", "n", "id", "el", "extend", "plugins", "drop", "autoScroll", "onSpill", "index", "e", "e", "start", "x", "y", "g", "e", "body", "start", "p", "e", "index", "start", "t", "x", "to", "i", "e", "to", "v", "_", "e", "id", "v", "i", "e", "i", "i", "to", "e", "location", "_", "i", "to", "h", "m", "s", "x", "e", "i", "a", "b", "y", "x", "e", "i", "a", "b", "y", "matches", "e", "id", "v", "i", "e", "id", "v", "i", "i", "option", "e", "e", "e", "toastr", "copyToClipboard", "id", "error", "r", "option", "v", "p", "to", "at", "error", "error", "e", "id", "import_toastr", "toastr", "i", "i", "index", "i", "i", "i", "c", "c2", "i", "i", "c", "c", "r", "d", "i", "$bdjGp$unicodetrie", "$bdjGp$base64js", "n", "i", "fn", "cache", "key", "t", "mapping", "s", "version", "start", "b", "k", "$6uUbQ$fastdeepequal", "stream", "index", "p", "x", "c", "g", "y", "i", "x", "y", "index", "p", "b", "ot", "k", "r", "f", "index", "f", "index", "g", "i", "cache", "start", "s", "global", "i", "start", "$6uUbQ$unicodetrie", "index", "s", "a", "b", "fn", "id", "t", "l", "v", "del", "$parcel$interopDefault", "$6uUbQ$dfa", "d", "c", "g", "j", "oldPos", "pair", "x", "y", "k", "f", "t2", "x", "y", "j", "i", "contours", "point", "k", "start", "pt", "s", "index", "p", "e", "a", "b", "n", "t", "g", "fn", "c", "$6uUbQ$clone", "$6uUbQ$tinyinflate", "$6uUbQ$brotlidecompressjs", "r", "v", "error", "id", "a", "b", "_a", "x", "y", "index", "matches", "error", "option", "e", "id", "e", "error", "g", "n", "id", "config", "error", "index", "e", "error", "start", "a", "b", "r", "g", "t", "e", "e", "to", "f", "t", "p", "a", "b", "x", "y", "index", "id", "r", "e", "w", "b", "r", "e", "g", "n", "i", "error", "i", "option", "i", "e", "e", "e", "x", "y", "error", "s", "option", "e", "matches", "error", "index", "ei", "ci", "j", "k", "li", "e", "to", "start", "a", "b", "i", "at", "i", "k", "error", "v", "row", "index", "a", "b", "x", "y", "to", "body", "w", "l", "d", "de", "off", "tr", "r", "start", "bar", "id", "n", "error", "r", "error", "index", "select2", "e", "index", "i", "e", "t", "x", "a", "B", "C", "s", "i", "w", "v", "y", "e", "p", "b", "k", "n", "id", "w", "s", "a", "q", "t", "i", "j", "o", "g", "error", "error", "e", "i", "x", "start", "x2", "y", "location", "r", "j", "d", "domtoimage", "error", "a", "_", "e", "location", "e", "c", "e", "x", "y", "e", "id", "e", "id", "at", "pn", "t", "e", "o", "u", "i", "lo", "hi", "p", "a", "b", "unit", "_", "body", "s", "w", "m", "x", "y", "h", "k", "bandY", "d", "error", "id", "_"]
}
