Repository: therealglazou/bluegriffon Branch: master Commit: 7abbf5822d10 Files: 14176 Total size: 42.4 MB Directory structure: gitextract__6ei82a5/ ├── LICENSE ├── Makefile.in ├── README.md ├── app/ │ ├── Makefile.in │ ├── Makefile.in.debug │ ├── Makefile.in.test │ ├── application.ini │ ├── bluegriffon.exe.manifest │ ├── icons/ │ │ ├── bluegriffon16.xpm │ │ └── bluegriffon50.xpm │ ├── macbuild/ │ │ └── Contents/ │ │ ├── Info.plist.in │ │ ├── MacOS-files.in │ │ └── Resources/ │ │ ├── English.lproj/ │ │ │ └── InfoPlist.strings.in │ │ └── bluegriffon.icns │ ├── macversion.py │ ├── moz.build │ ├── mozilla.in │ ├── nsEditorApp.cpp │ ├── profile/ │ │ ├── bluegriffon-prefs.js │ │ ├── channel-prefs.js │ │ └── prefs.js │ ├── splash.rc │ └── splashos2.rc ├── app-rules.mk ├── app.mozbuild ├── base/ │ ├── Makefile.in │ ├── content/ │ │ └── bluegriffon/ │ │ ├── EditorAllTags.css │ │ ├── EditorContent.css │ │ ├── EditorContentAnchors.css │ │ ├── EditorOverride.css │ │ ├── bindings/ │ │ │ ├── cssClassPicker.xml │ │ │ ├── deckedPanelsTabs.xml │ │ │ ├── ecolorpicker.xml │ │ │ ├── filepickerbutton.css │ │ │ ├── filepickerbutton.xml │ │ │ ├── floatingpanel.xml │ │ │ ├── inContext.xml │ │ │ ├── lengthbox.xml │ │ │ ├── media.xml │ │ │ ├── menulist.xml │ │ │ ├── multistate.css │ │ │ ├── multistate.xml │ │ │ ├── rotator.xml │ │ │ ├── rulers.xml │ │ │ ├── structurebar.css │ │ │ ├── structurebar.xml │ │ │ ├── tab.xml │ │ │ └── tabeditor.xml │ │ ├── credits.xhtml │ │ ├── dialogs/ │ │ │ ├── aboutDialog.js │ │ │ ├── aboutDialog.xul │ │ │ ├── convertClipboardToTable.js │ │ │ ├── convertClipboardToTable.xul │ │ │ ├── convertToTable.js │ │ │ ├── convertToTable.xul │ │ │ ├── dictionary.js │ │ │ ├── dictionary.xul │ │ │ ├── editStylesheet.js │ │ │ ├── editStylesheet.xul │ │ │ ├── form-common.js │ │ │ ├── insertAnchor.js │ │ │ ├── insertAnchor.xul │ │ │ ├── insertAudio.js │ │ │ ├── insertAudio.xul │ │ │ ├── insertButton.js │ │ │ ├── insertButton.xul │ │ │ ├── insertChars.js │ │ │ ├── insertChars.xul │ │ │ ├── insertCommentOrPI.js │ │ │ ├── insertCommentOrPI.xul │ │ │ ├── insertDatalist.js │ │ │ ├── insertDatalist.xul │ │ │ ├── insertFieldset.js │ │ │ ├── insertFieldset.xul │ │ │ ├── insertForm.js │ │ │ ├── insertForm.xul │ │ │ ├── insertFormInput.js │ │ │ ├── insertFormInput.xul │ │ │ ├── insertHR.js │ │ │ ├── insertHR.xul │ │ │ ├── insertHTML.js │ │ │ ├── insertHTML.xul │ │ │ ├── insertImage.js │ │ │ ├── insertImage.xul │ │ │ ├── insertKeygen.js │ │ │ ├── insertKeygen.xul │ │ │ ├── insertLabel.js │ │ │ ├── insertLabel.xul │ │ │ ├── insertLink.js │ │ │ ├── insertLink.xul │ │ │ ├── insertMeter.js │ │ │ ├── insertMeter.xul │ │ │ ├── insertOutput.js │ │ │ ├── insertOutput.xul │ │ │ ├── insertProgress.js │ │ │ ├── insertProgress.xul │ │ │ ├── insertSelect.js │ │ │ ├── insertSelect.xul │ │ │ ├── insertStylesheet.js │ │ │ ├── insertStylesheet.xul │ │ │ ├── insertTOC.js │ │ │ ├── insertTOC.xul │ │ │ ├── insertTable.js │ │ │ ├── insertTable.xul │ │ │ ├── insertTextarea.js │ │ │ ├── insertTextarea.xul │ │ │ ├── insertVideo.js │ │ │ ├── insertVideo.xul │ │ │ ├── languages.js │ │ │ ├── languages.xul │ │ │ ├── listProperties.js │ │ │ ├── listProperties.xul │ │ │ ├── markupCleaner.js │ │ │ ├── markupCleaner.xul │ │ │ ├── newDocument.js │ │ │ ├── newDocument.xul │ │ │ ├── newPageWizard.js │ │ │ ├── newPageWizard.xul │ │ │ ├── openLocation.js │ │ │ ├── openLocation.xul │ │ │ ├── pageProperties.js │ │ │ ├── pageProperties.xul │ │ │ ├── parsingError.js │ │ │ ├── parsingError.xul │ │ │ ├── releaseNotes.xul │ │ │ ├── spellCheck.js │ │ │ ├── spellCheck.xul │ │ │ ├── updateAvailable.js │ │ │ └── updateAvailable.xul │ │ ├── js/ │ │ │ ├── autoInsertTable.inc │ │ │ ├── beautify-html.js │ │ │ ├── blanks.inc │ │ │ ├── bluegriffon.js │ │ │ ├── colourPicker.js │ │ │ ├── commands.js │ │ │ ├── customize.js │ │ │ ├── dummyCommands.inc │ │ │ ├── editCommands.inc │ │ │ ├── fileCommands.inc │ │ │ ├── findbar.inc │ │ │ ├── formatCommands.inc │ │ │ ├── html5.js │ │ │ ├── inContext.js │ │ │ ├── insertionCommands.inc │ │ │ ├── languages.js │ │ │ ├── liveview.inc │ │ │ ├── macWindowMenu.js │ │ │ ├── markupCleaner.js │ │ │ ├── navigationCommands.inc │ │ │ ├── observers.inc │ │ │ ├── phpAndComments.inc │ │ │ ├── printCommands.inc │ │ │ ├── rebuildTOC-old.js │ │ │ ├── rebuildTOC.js │ │ │ ├── recentPages.js │ │ │ ├── recentPages.js2 │ │ │ ├── shutdown.inc │ │ │ ├── startup.inc │ │ │ ├── tableCommands.inc │ │ │ ├── tableResizer.js │ │ │ ├── updateManager.js │ │ │ ├── viewCommands.inc │ │ │ └── zoomManager.js │ │ ├── prefs/ │ │ │ ├── advanced.js │ │ │ ├── advanced.xul │ │ │ ├── connection.js │ │ │ ├── connection.xul │ │ │ ├── deactivateLicense.js │ │ │ ├── deactivateLicense.xul │ │ │ ├── editShortcut.js │ │ │ ├── editShortcut.xul │ │ │ ├── file.js │ │ │ ├── file.xul │ │ │ ├── general.xul │ │ │ ├── license.js │ │ │ ├── license.xul │ │ │ ├── newPage.js │ │ │ ├── newPage.xul │ │ │ ├── osx.js │ │ │ ├── osx.xul │ │ │ ├── prefs.js │ │ │ ├── prefs.xul │ │ │ ├── shortcuts.js │ │ │ ├── shortcuts.xul │ │ │ ├── source.js │ │ │ ├── source.xul │ │ │ ├── styles.js │ │ │ ├── styles.xul │ │ │ ├── update.js │ │ │ └── update.xul │ │ ├── txns/ │ │ │ ├── diChangeFileStylesheetTxn.js │ │ │ ├── diCommentOrPIChangeTxn.js │ │ │ ├── diInnerHtmlChangedTxn.js │ │ │ ├── diNodeDeletionTxn.js │ │ │ ├── diNodeInsertionTxn.js │ │ │ ├── diRemoveAttributeNSTxn.js │ │ │ ├── diSetAttributeNSTxn.js │ │ │ └── diStyleAttrChangeTxn.js │ │ ├── utils/ │ │ │ ├── dgid.js │ │ │ ├── global.js │ │ │ ├── login.js │ │ │ └── notifiers.js │ │ └── xul/ │ │ ├── autoInsertTable.inc │ │ ├── bluegriffon.xul │ │ ├── colourPicker.xul │ │ ├── extensionsOverlay.xul │ │ ├── findbar.inc │ │ ├── formatbarpalette.inc │ │ ├── formatmenulistsbarpalette.inc │ │ ├── hiddenWindow.xul │ │ ├── macWindowMenu.inc │ │ ├── maintoolbarpalette.inc │ │ ├── menubar.inc │ │ ├── overlays.inc │ │ ├── popups.inc │ │ ├── scripts.inc │ │ └── sets.inc │ ├── jar.mn │ ├── jar.mn.in │ ├── locale/ │ │ └── en-US/ │ │ └── bluegriffon/ │ │ └── prefs/ │ │ ├── license.properties │ │ └── newPage.dtd │ ├── moz.build │ └── res/ │ ├── base-min.css │ ├── cm2.html │ ├── codemirror/ │ │ ├── addon/ │ │ │ ├── comment/ │ │ │ │ ├── comment.js │ │ │ │ └── continuecomment.js │ │ │ ├── dialog/ │ │ │ │ ├── dialog.css │ │ │ │ └── dialog.js │ │ │ ├── display/ │ │ │ │ ├── fullscreen.css │ │ │ │ ├── fullscreen.js │ │ │ │ ├── panel.js │ │ │ │ ├── placeholder.js │ │ │ │ └── rulers.js │ │ │ ├── edit/ │ │ │ │ ├── closebrackets.js │ │ │ │ ├── closetag.js │ │ │ │ ├── continuelist.js │ │ │ │ ├── matchbrackets.js │ │ │ │ ├── matchtags.js │ │ │ │ └── trailingspace.js │ │ │ ├── fold/ │ │ │ │ ├── brace-fold.js │ │ │ │ ├── comment-fold.js │ │ │ │ ├── foldcode.js │ │ │ │ ├── foldgutter.css │ │ │ │ ├── foldgutter.js │ │ │ │ ├── indent-fold.js │ │ │ │ ├── markdown-fold.js │ │ │ │ └── xml-fold.js │ │ │ ├── hint/ │ │ │ │ ├── anyword-hint.js │ │ │ │ ├── css-hint.js │ │ │ │ ├── html-hint.js │ │ │ │ ├── javascript-hint.js │ │ │ │ ├── show-hint.css │ │ │ │ ├── show-hint.js │ │ │ │ ├── sql-hint.js │ │ │ │ └── xml-hint.js │ │ │ ├── lint/ │ │ │ │ ├── coffeescript-lint.js │ │ │ │ ├── css-lint.js │ │ │ │ ├── javascript-lint.js │ │ │ │ ├── json-lint.js │ │ │ │ ├── lint.css │ │ │ │ ├── lint.js │ │ │ │ └── yaml-lint.js │ │ │ ├── merge/ │ │ │ │ ├── merge.css │ │ │ │ └── merge.js │ │ │ ├── mode/ │ │ │ │ ├── loadmode.js │ │ │ │ ├── multiplex.js │ │ │ │ ├── multiplex_test.js │ │ │ │ ├── overlay.js │ │ │ │ └── simple.js │ │ │ ├── runmode/ │ │ │ │ ├── colorize.js │ │ │ │ ├── runmode-standalone.js │ │ │ │ ├── runmode.js │ │ │ │ └── runmode.node.js │ │ │ ├── scroll/ │ │ │ │ ├── annotatescrollbar.js │ │ │ │ ├── scrollpastend.js │ │ │ │ ├── simplescrollbars.css │ │ │ │ └── simplescrollbars.js │ │ │ ├── search/ │ │ │ │ ├── match-highlighter.js │ │ │ │ ├── matchesonscrollbar.css │ │ │ │ ├── matchesonscrollbar.js │ │ │ │ ├── search.js │ │ │ │ └── searchcursor.js │ │ │ ├── selection/ │ │ │ │ ├── active-line.js │ │ │ │ ├── mark-selection.js │ │ │ │ └── selection-pointer.js │ │ │ ├── tern/ │ │ │ │ ├── tern.css │ │ │ │ ├── tern.js │ │ │ │ └── worker.js │ │ │ └── wrap/ │ │ │ └── hardwrap.js │ │ ├── lib/ │ │ │ ├── codemirror.css │ │ │ └── codemirror.js │ │ ├── mode/ │ │ │ ├── apl/ │ │ │ │ ├── apl.js │ │ │ │ └── index.html │ │ │ ├── asciiarmor/ │ │ │ │ ├── asciiarmor.js │ │ │ │ └── index.html │ │ │ ├── asterisk/ │ │ │ │ ├── asterisk.js │ │ │ │ └── index.html │ │ │ ├── clike/ │ │ │ │ ├── clike.js │ │ │ │ ├── index.html │ │ │ │ └── scala.html │ │ │ ├── clojure/ │ │ │ │ ├── clojure.js │ │ │ │ └── index.html │ │ │ ├── cmake/ │ │ │ │ ├── cmake.js │ │ │ │ └── index.html │ │ │ ├── cobol/ │ │ │ │ ├── cobol.js │ │ │ │ └── index.html │ │ │ ├── coffeescript/ │ │ │ │ ├── coffeescript.js │ │ │ │ └── index.html │ │ │ ├── commonlisp/ │ │ │ │ ├── commonlisp.js │ │ │ │ └── index.html │ │ │ ├── css/ │ │ │ │ ├── css.js │ │ │ │ ├── index.html │ │ │ │ ├── less.html │ │ │ │ ├── less_test.js │ │ │ │ ├── scss.html │ │ │ │ ├── scss_test.js │ │ │ │ └── test.js │ │ │ ├── cypher/ │ │ │ │ ├── cypher.js │ │ │ │ └── index.html │ │ │ ├── d/ │ │ │ │ ├── d.js │ │ │ │ └── index.html │ │ │ ├── dart/ │ │ │ │ ├── dart.js │ │ │ │ └── index.html │ │ │ ├── diff/ │ │ │ │ ├── diff.js │ │ │ │ └── index.html │ │ │ ├── django/ │ │ │ │ ├── django.js │ │ │ │ └── index.html │ │ │ ├── dockerfile/ │ │ │ │ ├── dockerfile.js │ │ │ │ └── index.html │ │ │ ├── dtd/ │ │ │ │ ├── dtd.js │ │ │ │ └── index.html │ │ │ ├── dylan/ │ │ │ │ ├── dylan.js │ │ │ │ └── index.html │ │ │ ├── ebnf/ │ │ │ │ ├── ebnf.js │ │ │ │ └── index.html │ │ │ ├── ecl/ │ │ │ │ ├── ecl.js │ │ │ │ └── index.html │ │ │ ├── eiffel/ │ │ │ │ ├── eiffel.js │ │ │ │ └── index.html │ │ │ ├── erlang/ │ │ │ │ ├── erlang.js │ │ │ │ └── index.html │ │ │ ├── forth/ │ │ │ │ ├── forth.js │ │ │ │ └── index.html │ │ │ ├── fortran/ │ │ │ │ ├── fortran.js │ │ │ │ └── index.html │ │ │ ├── gas/ │ │ │ │ ├── gas.js │ │ │ │ └── index.html │ │ │ ├── gfm/ │ │ │ │ ├── gfm.js │ │ │ │ ├── index.html │ │ │ │ └── test.js │ │ │ ├── gherkin/ │ │ │ │ ├── gherkin.js │ │ │ │ └── index.html │ │ │ ├── go/ │ │ │ │ ├── go.js │ │ │ │ └── index.html │ │ │ ├── groovy/ │ │ │ │ ├── groovy.js │ │ │ │ └── index.html │ │ │ ├── haml/ │ │ │ │ ├── haml.js │ │ │ │ ├── index.html │ │ │ │ └── test.js │ │ │ ├── handlebars/ │ │ │ │ ├── handlebars.js │ │ │ │ └── index.html │ │ │ ├── haskell/ │ │ │ │ ├── haskell.js │ │ │ │ └── index.html │ │ │ ├── haxe/ │ │ │ │ ├── haxe.js │ │ │ │ └── index.html │ │ │ ├── htmlembedded/ │ │ │ │ ├── htmlembedded.js │ │ │ │ └── index.html │ │ │ ├── htmlmixed/ │ │ │ │ ├── htmlmixed.js │ │ │ │ └── index.html │ │ │ ├── http/ │ │ │ │ ├── http.js │ │ │ │ └── index.html │ │ │ ├── idl/ │ │ │ │ ├── idl.js │ │ │ │ └── index.html │ │ │ ├── index.html │ │ │ ├── jade/ │ │ │ │ ├── index.html │ │ │ │ └── jade.js │ │ │ ├── javascript/ │ │ │ │ ├── index.html │ │ │ │ ├── javascript.js │ │ │ │ ├── json-ld.html │ │ │ │ ├── test.js │ │ │ │ └── typescript.html │ │ │ ├── jinja2/ │ │ │ │ ├── index.html │ │ │ │ └── jinja2.js │ │ │ ├── julia/ │ │ │ │ ├── index.html │ │ │ │ └── julia.js │ │ │ ├── kotlin/ │ │ │ │ ├── index.html │ │ │ │ └── kotlin.js │ │ │ ├── livescript/ │ │ │ │ ├── index.html │ │ │ │ └── livescript.js │ │ │ ├── lua/ │ │ │ │ ├── index.html │ │ │ │ └── lua.js │ │ │ ├── markdown/ │ │ │ │ ├── index.html │ │ │ │ ├── markdown.js │ │ │ │ └── test.js │ │ │ ├── meta.js │ │ │ ├── mirc/ │ │ │ │ ├── index.html │ │ │ │ └── mirc.js │ │ │ ├── mllike/ │ │ │ │ ├── index.html │ │ │ │ └── mllike.js │ │ │ ├── modelica/ │ │ │ │ ├── index.html │ │ │ │ └── modelica.js │ │ │ ├── mumps/ │ │ │ │ ├── index.html │ │ │ │ └── mumps.js │ │ │ ├── nginx/ │ │ │ │ ├── index.html │ │ │ │ └── nginx.js │ │ │ ├── ntriples/ │ │ │ │ ├── index.html │ │ │ │ └── ntriples.js │ │ │ ├── octave/ │ │ │ │ ├── index.html │ │ │ │ └── octave.js │ │ │ ├── pascal/ │ │ │ │ ├── index.html │ │ │ │ └── pascal.js │ │ │ ├── pegjs/ │ │ │ │ ├── index.html │ │ │ │ └── pegjs.js │ │ │ ├── perl/ │ │ │ │ ├── index.html │ │ │ │ └── perl.js │ │ │ ├── php/ │ │ │ │ ├── index.html │ │ │ │ ├── php.js │ │ │ │ └── test.js │ │ │ ├── pig/ │ │ │ │ ├── index.html │ │ │ │ └── pig.js │ │ │ ├── properties/ │ │ │ │ ├── index.html │ │ │ │ └── properties.js │ │ │ ├── puppet/ │ │ │ │ ├── index.html │ │ │ │ └── puppet.js │ │ │ ├── python/ │ │ │ │ ├── index.html │ │ │ │ └── python.js │ │ │ ├── q/ │ │ │ │ ├── index.html │ │ │ │ └── q.js │ │ │ ├── r/ │ │ │ │ ├── index.html │ │ │ │ └── r.js │ │ │ ├── rpm/ │ │ │ │ ├── changes/ │ │ │ │ │ └── index.html │ │ │ │ ├── index.html │ │ │ │ └── rpm.js │ │ │ ├── rst/ │ │ │ │ ├── index.html │ │ │ │ └── rst.js │ │ │ ├── ruby/ │ │ │ │ ├── index.html │ │ │ │ ├── ruby.js │ │ │ │ └── test.js │ │ │ ├── rust/ │ │ │ │ ├── index.html │ │ │ │ └── rust.js │ │ │ ├── sass/ │ │ │ │ ├── index.html │ │ │ │ └── sass.js │ │ │ ├── scheme/ │ │ │ │ ├── index.html │ │ │ │ └── scheme.js │ │ │ ├── shell/ │ │ │ │ ├── index.html │ │ │ │ ├── shell.js │ │ │ │ └── test.js │ │ │ ├── sieve/ │ │ │ │ ├── index.html │ │ │ │ └── sieve.js │ │ │ ├── slim/ │ │ │ │ ├── index.html │ │ │ │ ├── slim.js │ │ │ │ └── test.js │ │ │ ├── smalltalk/ │ │ │ │ ├── index.html │ │ │ │ └── smalltalk.js │ │ │ ├── smarty/ │ │ │ │ ├── index.html │ │ │ │ └── smarty.js │ │ │ ├── solr/ │ │ │ │ ├── index.html │ │ │ │ └── solr.js │ │ │ ├── soy/ │ │ │ │ ├── index.html │ │ │ │ └── soy.js │ │ │ ├── sparql/ │ │ │ │ ├── index.html │ │ │ │ └── sparql.js │ │ │ ├── spreadsheet/ │ │ │ │ ├── index.html │ │ │ │ └── spreadsheet.js │ │ │ ├── sql/ │ │ │ │ ├── index.html │ │ │ │ └── sql.js │ │ │ ├── stex/ │ │ │ │ ├── index.html │ │ │ │ ├── stex.js │ │ │ │ └── test.js │ │ │ ├── stylus/ │ │ │ │ ├── index.html │ │ │ │ └── stylus.js │ │ │ ├── tcl/ │ │ │ │ ├── index.html │ │ │ │ └── tcl.js │ │ │ ├── textile/ │ │ │ │ ├── index.html │ │ │ │ ├── test.js │ │ │ │ └── textile.js │ │ │ ├── tiddlywiki/ │ │ │ │ ├── index.html │ │ │ │ ├── tiddlywiki.css │ │ │ │ └── tiddlywiki.js │ │ │ ├── tiki/ │ │ │ │ ├── index.html │ │ │ │ ├── tiki.css │ │ │ │ └── tiki.js │ │ │ ├── toml/ │ │ │ │ ├── index.html │ │ │ │ └── toml.js │ │ │ ├── tornado/ │ │ │ │ ├── index.html │ │ │ │ └── tornado.js │ │ │ ├── troff/ │ │ │ │ ├── index.html │ │ │ │ └── troff.js │ │ │ ├── turtle/ │ │ │ │ ├── index.html │ │ │ │ └── turtle.js │ │ │ ├── vb/ │ │ │ │ ├── index.html │ │ │ │ └── vb.js │ │ │ ├── vbscript/ │ │ │ │ ├── index.html │ │ │ │ └── vbscript.js │ │ │ ├── velocity/ │ │ │ │ ├── index.html │ │ │ │ └── velocity.js │ │ │ ├── verilog/ │ │ │ │ ├── index.html │ │ │ │ ├── test.js │ │ │ │ └── verilog.js │ │ │ ├── xml/ │ │ │ │ ├── index.html │ │ │ │ ├── test.js │ │ │ │ └── xml.js │ │ │ ├── xquery/ │ │ │ │ ├── index.html │ │ │ │ ├── test.js │ │ │ │ └── xquery.js │ │ │ ├── yaml/ │ │ │ │ ├── index.html │ │ │ │ └── yaml.js │ │ │ └── z80/ │ │ │ ├── index.html │ │ │ └── z80.js │ │ ├── theme/ │ │ │ ├── 3024-day.css │ │ │ ├── 3024-night.css │ │ │ ├── ambiance-mobile.css │ │ │ ├── ambiance.css │ │ │ ├── base16-dark.css │ │ │ ├── base16-light.css │ │ │ ├── blackboard.css │ │ │ ├── cobalt.css │ │ │ ├── colorforth.css │ │ │ ├── eclipse.css │ │ │ ├── elegant.css │ │ │ ├── erlang-dark.css │ │ │ ├── lesser-dark.css │ │ │ ├── liquibyte.css │ │ │ ├── mbo.css │ │ │ ├── mdn-like.css │ │ │ ├── midnight.css │ │ │ ├── monokai.css │ │ │ ├── neat.css │ │ │ ├── neo.css │ │ │ ├── night.css │ │ │ ├── paraiso-dark.css │ │ │ ├── paraiso-light.css │ │ │ ├── pastel-on-dark.css │ │ │ ├── rubyblue.css │ │ │ ├── solarized.css │ │ │ ├── the-matrix.css │ │ │ ├── tomorrow-night-bright.css │ │ │ ├── tomorrow-night-eighties.css │ │ │ ├── twilight.css │ │ │ ├── vibrant-ink.css │ │ │ ├── xq-dark.css │ │ │ ├── xq-light.css │ │ │ └── zenburn.css │ │ └── themes-list.js │ ├── csseditor.html │ ├── html5.html │ ├── html_strict.html │ ├── html_transitional.html │ ├── markdowneditor.html │ ├── polyglot.xhtml │ ├── reset-fonts-grids.css │ ├── scripteditor.html │ ├── xhtml11.xhtml │ ├── xhtml5.xhtml │ ├── xhtml_strict.html │ ├── xhtml_strict.xhtml │ ├── xhtml_transitional.html │ └── xhtml_transitional.xhtml ├── branding/ │ ├── Makefile.in │ ├── bluegriffon.icns │ ├── branding.nsi │ ├── configure.sh │ ├── disk.icns │ ├── document.icns │ ├── dsstore │ └── moz.build ├── build.mk ├── components/ │ ├── Makefile.in │ ├── bgCharUnicodeAutocomplete.js │ ├── bgCharUnicodeAutocomplete.manifest │ ├── bgCommandHandler.js │ ├── bgCommandHandler.manifest │ ├── bgLocationAutocomplete.js │ ├── bgLocationAutocomplete.manifest │ ├── devtools/ │ │ ├── content/ │ │ │ ├── dbg-messenger-overlay.js │ │ │ └── dbg-messenger-overlay.xul │ │ ├── extension/ │ │ │ ├── Makefile.in │ │ │ ├── bootstrap.js │ │ │ ├── content/ │ │ │ │ ├── options.js │ │ │ │ └── options.xul │ │ │ ├── install.rdf │ │ │ ├── jar.mn │ │ │ ├── locale/ │ │ │ │ └── en-US/ │ │ │ │ ├── dbgserver.dtd │ │ │ │ └── dbgserver.properties │ │ │ └── moz.build │ │ ├── jar.mn │ │ ├── modules/ │ │ │ ├── RemoteDebuggerServer.jsm │ │ │ └── XULRootActor.js │ │ └── moz.build │ ├── fuelApplication.js │ ├── fuelApplication.manifest │ ├── moz.build │ ├── phpStreamConverter.js │ └── phpStreamConverter.manifest ├── config/ │ ├── codename.txt │ ├── gecko_dev_content.patch │ ├── gecko_dev_idl.patch │ ├── gecko_dev_revision.txt │ ├── mozconfig.macosx │ ├── mozconfig.ubuntu64 │ ├── mozconfig.win │ ├── mozilla_central_revision.txt │ ├── version.txt │ └── win/ │ ├── bluegriffon.iss │ └── bluegriffon32.iss ├── confvars.sh ├── defs.mk ├── extensions/ │ ├── Makefile.in │ ├── fs/ │ │ ├── Makefile.in │ │ ├── content/ │ │ │ ├── addFont.js │ │ │ ├── addFont.xul │ │ │ ├── fontsquirrel.js │ │ │ ├── fs.js │ │ │ ├── fs.xul │ │ │ ├── fsOverlay.js │ │ │ └── fsOverlay.xul │ │ ├── install.rdf │ │ ├── jar.mn │ │ ├── jar.mn.in │ │ ├── moz.build │ │ └── skin/ │ │ └── fs.css │ ├── gfd/ │ │ ├── Makefile.in │ │ ├── content/ │ │ │ ├── addFont.js │ │ │ ├── addFont.xul │ │ │ ├── directory.js │ │ │ ├── gfd.js │ │ │ ├── gfd.xul │ │ │ ├── gfdOverlay.js │ │ │ ├── gfdOverlay.xul │ │ │ └── preview.html │ │ ├── install.rdf │ │ ├── jar.mn │ │ ├── jar.mn.in │ │ ├── moz.build │ │ └── skin/ │ │ └── gfd.css │ ├── inspector/ │ │ ├── .hg/ │ │ │ ├── 00changelog.i │ │ │ ├── branch │ │ │ ├── cache/ │ │ │ │ ├── branch2-served │ │ │ │ └── tags │ │ │ ├── dirstate │ │ │ ├── hgrc │ │ │ ├── requires │ │ │ ├── store/ │ │ │ │ ├── 00changelog.d │ │ │ │ ├── 00changelog.i │ │ │ │ ├── 00manifest.d │ │ │ │ ├── 00manifest.i │ │ │ │ ├── data/ │ │ │ │ │ ├── _makefile.in.i │ │ │ │ │ ├── base/ │ │ │ │ │ │ ├── _makefile.in.i │ │ │ │ │ │ ├── js/ │ │ │ │ │ │ │ ├── _makefile.in.i │ │ │ │ │ │ │ ├── inspector-cmdline.js.i │ │ │ │ │ │ │ └── moz.build.i │ │ │ │ │ │ ├── makefile.win.i │ │ │ │ │ │ ├── moz.build.i │ │ │ │ │ │ ├── public/ │ │ │ │ │ │ │ ├── _m_a_n_i_f_e_s_t___i_d_l.i │ │ │ │ │ │ │ ├── _makefile.in.i │ │ │ │ │ │ │ ├── in_i_bitmap.idl.i │ │ │ │ │ │ │ ├── in_i_bitmap_depot.idl.i │ │ │ │ │ │ │ ├── in_i_bitmap_u_r_i.idl.i │ │ │ │ │ │ │ ├── in_i_c_s_s_value_search.idl.i │ │ │ │ │ │ │ ├── in_i_d_o_m_data_source.idl.i │ │ │ │ │ │ │ ├── in_i_d_o_m_r_d_f_resource.idl.i │ │ │ │ │ │ │ ├── in_i_d_o_m_utils.idl.i │ │ │ │ │ │ │ ├── in_i_d_o_m_view.idl.i │ │ │ │ │ │ │ ├── in_i_deep_tree_walker.idl.i │ │ │ │ │ │ │ ├── in_i_file_search.idl.i │ │ │ │ │ │ │ ├── in_i_flasher.idl.i │ │ │ │ │ │ │ ├── in_i_p_n_g_encoder.idl.i │ │ │ │ │ │ │ ├── in_i_screen_capturer.idl.i │ │ │ │ │ │ │ ├── in_i_search_observer.idl.i │ │ │ │ │ │ │ ├── in_i_search_orphan_images.idl.i │ │ │ │ │ │ │ ├── in_i_search_process.idl.i │ │ │ │ │ │ │ ├── makefile.win.i │ │ │ │ │ │ │ ├── ns_i_c_s_s_dec_data_source.idl.i │ │ │ │ │ │ │ ├── ns_i_c_s_s_dec_int_holder.idl.i │ │ │ │ │ │ │ ├── ns_i_c_s_s_rule_data_source.idl.i │ │ │ │ │ │ │ ├── ns_i_d_o_m_d_s_resource.idl.i │ │ │ │ │ │ │ ├── ns_i_ins_d_o_m_data_source.idl.i │ │ │ │ │ │ │ └── ~2ecvsignore.i │ │ │ │ │ │ ├── src/ │ │ │ │ │ │ │ ├── _makefile.in.i │ │ │ │ │ │ │ ├── dsinfo.h.i │ │ │ │ │ │ │ ├── in_bitmap.cpp.i │ │ │ │ │ │ │ ├── in_bitmap.h.i │ │ │ │ │ │ │ ├── in_bitmap_channel.cpp.i │ │ │ │ │ │ │ ├── in_bitmap_channel.h.i │ │ │ │ │ │ │ ├── in_bitmap_decoder.cpp.i │ │ │ │ │ │ │ ├── in_bitmap_decoder.h.i │ │ │ │ │ │ │ ├── in_bitmap_depot.cpp.i │ │ │ │ │ │ │ ├── in_bitmap_depot.h.i │ │ │ │ │ │ │ ├── in_bitmap_protocol_handler.cpp.i │ │ │ │ │ │ │ ├── in_bitmap_protocol_handler.h.i │ │ │ │ │ │ │ ├── in_bitmap_u_r_i.cpp.i │ │ │ │ │ │ │ ├── in_bitmap_u_r_i.h.i │ │ │ │ │ │ │ ├── in_c_s_s_value_search.cpp.i │ │ │ │ │ │ │ ├── in_c_s_s_value_search.h.i │ │ │ │ │ │ │ ├── in_d_o_m_data_source.cpp.i │ │ │ │ │ │ │ ├── in_d_o_m_data_source.h.i │ │ │ │ │ │ │ ├── in_d_o_m_r_d_f_resource.cpp.i │ │ │ │ │ │ │ ├── in_d_o_m_r_d_f_resource.h.i │ │ │ │ │ │ │ ├── in_d_o_m_utils.cpp.i │ │ │ │ │ │ │ ├── in_d_o_m_utils.h.i │ │ │ │ │ │ │ ├── in_d_o_m_view.cpp.i │ │ │ │ │ │ │ ├── in_d_o_m_view.h.i │ │ │ │ │ │ │ ├── in_deep_tree_walker.cpp.i │ │ │ │ │ │ │ ├── in_deep_tree_walker.h.i │ │ │ │ │ │ │ ├── in_file_search.cpp.i │ │ │ │ │ │ │ ├── in_file_search.h.i │ │ │ │ │ │ │ ├── in_flasher.cpp.i │ │ │ │ │ │ │ ├── in_flasher.h.i │ │ │ │ │ │ │ ├── in_layout_utils.cpp.i │ │ │ │ │ │ │ ├── in_layout_utils.h.i │ │ │ │ │ │ │ ├── in_p_n_g_encoder.cpp.i │ │ │ │ │ │ │ ├── in_p_n_g_encoder.h.i │ │ │ │ │ │ │ ├── in_search_item_image.cpp.i │ │ │ │ │ │ │ ├── in_search_item_image.h.i │ │ │ │ │ │ │ ├── in_search_loop.cpp.i │ │ │ │ │ │ │ ├── in_search_loop.h.i │ │ │ │ │ │ │ ├── in_search_orphan_images.cpp.i │ │ │ │ │ │ │ ├── in_search_orphan_images.h.i │ │ │ │ │ │ │ ├── makefile.win.i │ │ │ │ │ │ │ ├── ns_c_s_s_dec_data_source.cpp.i │ │ │ │ │ │ │ ├── ns_c_s_s_dec_data_source.h.i │ │ │ │ │ │ │ ├── ns_c_s_s_dec_int_holder.cpp.i │ │ │ │ │ │ │ ├── ns_c_s_s_dec_int_holder.h.i │ │ │ │ │ │ │ ├── ns_c_s_s_rule_data_source.cpp.i │ │ │ │ │ │ │ ├── ns_c_s_s_rule_data_source.h.i │ │ │ │ │ │ │ ├── ns_d_o_m_d_s_resource.cpp.i │ │ │ │ │ │ │ ├── ns_d_o_m_d_s_resource.h.i │ │ │ │ │ │ │ ├── ns_d_o_m_data_source.cpp.i │ │ │ │ │ │ │ ├── ns_d_o_m_data_source.h.i │ │ │ │ │ │ │ ├── win/ │ │ │ │ │ │ │ │ ├── _makefile.in.i │ │ │ │ │ │ │ │ ├── in_screen_capturer.cpp.i │ │ │ │ │ │ │ │ ├── in_screen_capturer.h.i │ │ │ │ │ │ │ │ ├── makefile.win.i │ │ │ │ │ │ │ │ └── ~2ecvsignore.i │ │ │ │ │ │ │ └── ~2ecvsignore.i │ │ │ │ │ │ └── ~2ecvsignore.i │ │ │ │ │ ├── build/ │ │ │ │ │ │ ├── _makefile.in.i │ │ │ │ │ │ ├── install.js.i │ │ │ │ │ │ ├── makefile.win.i │ │ │ │ │ │ ├── moz.build.i │ │ │ │ │ │ ├── src/ │ │ │ │ │ │ │ ├── _makefile.in.i │ │ │ │ │ │ │ ├── inspector.pkg.i │ │ │ │ │ │ │ ├── makefile.win.i │ │ │ │ │ │ │ ├── ns_inspector_module.cpp.i │ │ │ │ │ │ │ └── ~2ecvsignore.i │ │ │ │ │ │ └── ~2ecvsignore.i │ │ │ │ │ ├── install.rdf.i │ │ │ │ │ ├── jar.mn.i │ │ │ │ │ ├── macbuild/ │ │ │ │ │ │ ├── _inspector._prefix.i │ │ │ │ │ │ ├── _inspector_debug._prefix.i │ │ │ │ │ │ ├── inspector.mcp.i │ │ │ │ │ │ ├── inspector.xml.i │ │ │ │ │ │ ├── inspector_i_d_l.mcp.i │ │ │ │ │ │ └── inspector_i_d_l.xml.i │ │ │ │ │ ├── makefile.win.i │ │ │ │ │ ├── makefiles.sh.i │ │ │ │ │ ├── moz.build.i │ │ │ │ │ ├── resources/ │ │ │ │ │ │ ├── _makefile.in.i │ │ │ │ │ │ ├── content/ │ │ │ │ │ │ │ ├── _flasher.js.i │ │ │ │ │ │ │ ├── _inspector_app.js.i │ │ │ │ │ │ │ ├── _makefile.in.i │ │ │ │ │ │ │ ├── _viewer_pane.js.i │ │ │ │ │ │ │ ├── _viewer_registry.js.i │ │ │ │ │ │ │ ├── browser_overlay.xul.i │ │ │ │ │ │ │ ├── command_overlay.xul.i │ │ │ │ │ │ │ ├── contents.rdf.i │ │ │ │ │ │ │ ├── contents.rdf.in.i │ │ │ │ │ │ │ ├── editing_overlay.xul.i │ │ │ │ │ │ │ ├── extensions/ │ │ │ │ │ │ │ │ ├── multipanel.css.i │ │ │ │ │ │ │ │ ├── multipanel.xml.i │ │ │ │ │ │ │ │ ├── titled_splitter.css.i │ │ │ │ │ │ │ │ ├── titled_splitter.xml.i │ │ │ │ │ │ │ │ ├── tree_editable.css.i │ │ │ │ │ │ │ │ ├── tree_editable.xml.i │ │ │ │ │ │ │ │ └── wsm-colorpicker.js.i │ │ │ │ │ │ │ ├── hooks.js.i │ │ │ │ │ │ │ ├── inspector-history.rdf.i │ │ │ │ │ │ │ ├── inspector-prefs.rdf.i │ │ │ │ │ │ │ ├── inspector.css.i │ │ │ │ │ │ │ ├── inspector.js.i │ │ │ │ │ │ │ ├── inspector.xml.i │ │ │ │ │ │ │ ├── inspector.xul.i │ │ │ │ │ │ │ ├── inspector_overlay.xul.i │ │ │ │ │ │ │ ├── jar.mn.i │ │ │ │ │ │ │ ├── jsutil/ │ │ │ │ │ │ │ │ ├── commands/ │ │ │ │ │ │ │ │ │ └── base_commands.js.i │ │ │ │ │ │ │ │ ├── events/ │ │ │ │ │ │ │ │ │ └── _observer_manager.js.i │ │ │ │ │ │ │ │ ├── rdf/ │ │ │ │ │ │ │ │ │ ├── _r_d_f_array.js.i │ │ │ │ │ │ │ │ │ └── _r_d_f_u.js.i │ │ │ │ │ │ │ │ ├── system/ │ │ │ │ │ │ │ │ │ ├── _clipboard_utils.js.i │ │ │ │ │ │ │ │ │ ├── _disk_search.js.i │ │ │ │ │ │ │ │ │ ├── _file_picker_utils.js.i │ │ │ │ │ │ │ │ │ ├── _pref_utils.js.i │ │ │ │ │ │ │ │ │ ├── clipboard_flavors.js.i │ │ │ │ │ │ │ │ │ └── file.js.i │ │ │ │ │ │ │ │ ├── xpcom/ │ │ │ │ │ │ │ │ │ └── _x_p_c_u.js.i │ │ │ │ │ │ │ │ └── xul/ │ │ │ │ │ │ │ │ ├── _d_n_d_utils.js.i │ │ │ │ │ │ │ │ ├── _frame_exchange.js.i │ │ │ │ │ │ │ │ ├── in_base_outliner_view.js.i │ │ │ │ │ │ │ │ ├── in_base_tree_view.js.i │ │ │ │ │ │ │ │ ├── in_data_tree_view.js.i │ │ │ │ │ │ │ │ ├── in_form_manager.js.i │ │ │ │ │ │ │ │ ├── in_outliner_builder.js.i │ │ │ │ │ │ │ │ ├── in_tree_builder.js.i │ │ │ │ │ │ │ │ └── in_tree_table_builder.js.i │ │ │ │ │ │ │ ├── keyset_overlay.xul.i │ │ │ │ │ │ │ ├── makefile.win.i │ │ │ │ │ │ │ ├── object.js.i │ │ │ │ │ │ │ ├── object.xul.i │ │ │ │ │ │ │ ├── popup_overlay.xul.i │ │ │ │ │ │ │ ├── prefs/ │ │ │ │ │ │ │ │ ├── _m_a_n_i_f_e_s_t.i │ │ │ │ │ │ │ │ ├── inspector.js.i │ │ │ │ │ │ │ │ ├── pref-inspector.js.i │ │ │ │ │ │ │ │ ├── pref-inspector.xul.i │ │ │ │ │ │ │ │ ├── pref-sidebar.js.i │ │ │ │ │ │ │ │ ├── pref-sidebar.xul.i │ │ │ │ │ │ │ │ ├── prefs.xul.i │ │ │ │ │ │ │ │ └── prefs_overlay.xul.i │ │ │ │ │ │ │ ├── res/ │ │ │ │ │ │ │ │ ├── _linux/ │ │ │ │ │ │ │ │ │ ├── win_inspector_main.xpm.i │ │ │ │ │ │ │ │ │ └── win_inspector_main16.xpm.i │ │ │ │ │ │ │ │ ├── _m_a_n_i_f_e_s_t.i │ │ │ │ │ │ │ │ ├── _o_s2/ │ │ │ │ │ │ │ │ │ └── win_inspector_main.ico.i │ │ │ │ │ │ │ │ ├── _w_i_n_n_t/ │ │ │ │ │ │ │ │ │ └── win_inspector_main.ico.i │ │ │ │ │ │ │ │ ├── search-registry.rdf.i │ │ │ │ │ │ │ │ ├── viewer-registry.rdf.i │ │ │ │ │ │ │ │ ├── win_inspector_main.ico.i │ │ │ │ │ │ │ │ ├── win_inspector_main.xpm.i │ │ │ │ │ │ │ │ ├── win_inspector_main16.xpm.i │ │ │ │ │ │ │ │ └── win_inspector_main_o_s2.ico.i │ │ │ │ │ │ │ ├── search/ │ │ │ │ │ │ │ │ ├── in_search_module.js.i │ │ │ │ │ │ │ │ ├── in_search_service.js.i │ │ │ │ │ │ │ │ ├── in_search_tree_builder.js.i │ │ │ │ │ │ │ │ ├── in_search_utils.js.i │ │ │ │ │ │ │ │ └── modules/ │ │ │ │ │ │ │ │ ├── command_overlay.xul.i │ │ │ │ │ │ │ │ ├── find_files/ │ │ │ │ │ │ │ │ │ ├── dialog.js.i │ │ │ │ │ │ │ │ │ ├── dialog.xul.i │ │ │ │ │ │ │ │ │ └── find_files.xml.i │ │ │ │ │ │ │ │ ├── junk_imgs/ │ │ │ │ │ │ │ │ │ ├── dialog.js.i │ │ │ │ │ │ │ │ │ ├── dialog.xul.i │ │ │ │ │ │ │ │ │ └── junk_imgs.xml.i │ │ │ │ │ │ │ │ └── popup_overlay.xul.i │ │ │ │ │ │ │ ├── search-registry.rdf.i │ │ │ │ │ │ │ ├── sidebar/ │ │ │ │ │ │ │ │ ├── _inspector_sidebar.js.i │ │ │ │ │ │ │ │ └── sidebar.xul.i │ │ │ │ │ │ │ ├── sidebar.js.i │ │ │ │ │ │ │ ├── sidebar.xul.i │ │ │ │ │ │ │ ├── statusbar_overlay.xul.i │ │ │ │ │ │ │ ├── tasks_overlay-cz.xul.i │ │ │ │ │ │ │ ├── tasks_overlay-ff.xul.i │ │ │ │ │ │ │ ├── tasks_overlay-mobile.xul.i │ │ │ │ │ │ │ ├── tasks_overlay-sb.xul.i │ │ │ │ │ │ │ ├── tasks_overlay-tb.xul.i │ │ │ │ │ │ │ ├── tasks_overlay.xul.i │ │ │ │ │ │ │ ├── tests/ │ │ │ │ │ │ │ │ └── allskin.xul.i │ │ │ │ │ │ │ ├── toolbox_overlay.xul.i │ │ │ │ │ │ │ ├── util.dtd.i │ │ │ │ │ │ │ ├── util_window.xul.i │ │ │ │ │ │ │ ├── utils.js.i │ │ │ │ │ │ │ ├── venkman_overlay.xul.i │ │ │ │ │ │ │ ├── viewer-registry.rdf.i │ │ │ │ │ │ │ ├── viewer_overlay.xul.i │ │ │ │ │ │ │ ├── viewers/ │ │ │ │ │ │ │ │ ├── accessible_event/ │ │ │ │ │ │ │ │ │ ├── accessible_event.js.i │ │ │ │ │ │ │ │ │ └── accessible_event.xul.i │ │ │ │ │ │ │ │ ├── accessible_events/ │ │ │ │ │ │ │ │ │ ├── accessible_events.js.i │ │ │ │ │ │ │ │ │ ├── accessible_events.xul.i │ │ │ │ │ │ │ │ │ └── handler_help_dialog.xul.i │ │ │ │ │ │ │ │ ├── accessible_object/ │ │ │ │ │ │ │ │ │ ├── accessible_object.js.i │ │ │ │ │ │ │ │ │ └── accessible_object.xul.i │ │ │ │ │ │ │ │ ├── accessible_props/ │ │ │ │ │ │ │ │ │ ├── accessible_prop_viewer_mgr.js.i │ │ │ │ │ │ │ │ │ ├── accessible_props.js.i │ │ │ │ │ │ │ │ │ └── accessible_props.xul.i │ │ │ │ │ │ │ │ ├── accessible_relations/ │ │ │ │ │ │ │ │ │ ├── accessible_relations.js.i │ │ │ │ │ │ │ │ │ └── accessible_relations.xul.i │ │ │ │ │ │ │ │ ├── accessible_tree/ │ │ │ │ │ │ │ │ │ ├── accessible_tree.js.i │ │ │ │ │ │ │ │ │ ├── accessible_tree.xul.i │ │ │ │ │ │ │ │ │ ├── eval_j_s_dialog.js.i │ │ │ │ │ │ │ │ │ └── eval_j_s_dialog.xul.i │ │ │ │ │ │ │ │ ├── box_model/ │ │ │ │ │ │ │ │ │ ├── box_model.js.i │ │ │ │ │ │ │ │ │ ├── box_model.xul.i │ │ │ │ │ │ │ │ │ └── color_picker.xul.i │ │ │ │ │ │ │ │ ├── computed_style/ │ │ │ │ │ │ │ │ │ ├── computed_style.js.i │ │ │ │ │ │ │ │ │ └── computed_style.xul.i │ │ │ │ │ │ │ │ ├── dom/ │ │ │ │ │ │ │ │ │ ├── _find_dialog.js.i │ │ │ │ │ │ │ │ │ ├── columns_dialog.js.i │ │ │ │ │ │ │ │ │ ├── columns_dialog.xul.i │ │ │ │ │ │ │ │ │ ├── command_overlay.xul.i │ │ │ │ │ │ │ │ │ ├── dom.js.i │ │ │ │ │ │ │ │ │ ├── dom.xul.i │ │ │ │ │ │ │ │ │ ├── find_dialog.xul.i │ │ │ │ │ │ │ │ │ ├── insert_dialog.js.i │ │ │ │ │ │ │ │ │ ├── insert_dialog.xul.i │ │ │ │ │ │ │ │ │ ├── keyset_overlay.xul.i │ │ │ │ │ │ │ │ │ ├── popup_overlay.xul.i │ │ │ │ │ │ │ │ │ ├── pseudo_class_dialog.js.i │ │ │ │ │ │ │ │ │ └── pseudo_class_dialog.xul.i │ │ │ │ │ │ │ │ ├── dom_node/ │ │ │ │ │ │ │ │ │ ├── dom_node.js.i │ │ │ │ │ │ │ │ │ ├── dom_node.xul.i │ │ │ │ │ │ │ │ │ ├── dom_node_dialog.js.i │ │ │ │ │ │ │ │ │ └── dom_node_dialog.xul.i │ │ │ │ │ │ │ │ ├── js_object/ │ │ │ │ │ │ │ │ │ ├── eval_expr_dialog.js.i │ │ │ │ │ │ │ │ │ ├── eval_expr_dialog.xul.i │ │ │ │ │ │ │ │ │ ├── js_object.js.i │ │ │ │ │ │ │ │ │ ├── js_object.xul.i │ │ │ │ │ │ │ │ │ ├── js_object_view.js.i │ │ │ │ │ │ │ │ │ ├── js_object_viewer.js.i │ │ │ │ │ │ │ │ │ └── js_object_viewer.xul.i │ │ │ │ │ │ │ │ ├── node_element/ │ │ │ │ │ │ │ │ │ ├── node_element.js.i │ │ │ │ │ │ │ │ │ └── node_element.xul.i │ │ │ │ │ │ │ │ ├── node_text/ │ │ │ │ │ │ │ │ │ ├── node_text.js.i │ │ │ │ │ │ │ │ │ └── node_text.xul.i │ │ │ │ │ │ │ │ ├── style_rules/ │ │ │ │ │ │ │ │ │ ├── command_overlay.xul.i │ │ │ │ │ │ │ │ │ ├── keyset_overlay.xul.i │ │ │ │ │ │ │ │ │ ├── popup_overlay.xul.i │ │ │ │ │ │ │ │ │ ├── style_rules.js.i │ │ │ │ │ │ │ │ │ └── style_rules.xul.i │ │ │ │ │ │ │ │ ├── stylesheets/ │ │ │ │ │ │ │ │ │ ├── stylesheets.js.i │ │ │ │ │ │ │ │ │ └── stylesheets.xul.i │ │ │ │ │ │ │ │ ├── used_font_faces/ │ │ │ │ │ │ │ │ │ ├── used_font_faces.js.i │ │ │ │ │ │ │ │ │ └── used_font_faces.xul.i │ │ │ │ │ │ │ │ └── xbl_bindings/ │ │ │ │ │ │ │ │ ├── xbl_bindings.js.i │ │ │ │ │ │ │ │ └── xbl_bindings.xul.i │ │ │ │ │ │ │ └── ~2ecvsignore.i │ │ │ │ │ │ ├── locale/ │ │ │ │ │ │ │ ├── _makefile.in.i │ │ │ │ │ │ │ ├── ca/ │ │ │ │ │ │ │ │ ├── editing.dtd.i │ │ │ │ │ │ │ │ ├── inspector.dtd.i │ │ │ │ │ │ │ │ ├── inspector.properties.i │ │ │ │ │ │ │ │ ├── prefs.dtd.i │ │ │ │ │ │ │ │ ├── search/ │ │ │ │ │ │ │ │ │ ├── find_files.dtd.i │ │ │ │ │ │ │ │ │ └── junk_imgs.dtd.i │ │ │ │ │ │ │ │ ├── tasks_overlay.dtd.i │ │ │ │ │ │ │ │ └── viewers/ │ │ │ │ │ │ │ │ ├── box_model.dtd.i │ │ │ │ │ │ │ │ ├── computed_style.dtd.i │ │ │ │ │ │ │ │ ├── dom.dtd.i │ │ │ │ │ │ │ │ ├── dom_node.dtd.i │ │ │ │ │ │ │ │ ├── js_object.dtd.i │ │ │ │ │ │ │ │ ├── style_rules.dtd.i │ │ │ │ │ │ │ │ ├── stylesheets.dtd.i │ │ │ │ │ │ │ │ └── xbl_bindings.dtd.i │ │ │ │ │ │ │ ├── contents.rdf.i │ │ │ │ │ │ │ ├── cs/ │ │ │ │ │ │ │ │ ├── editing.dtd.i │ │ │ │ │ │ │ │ ├── inspector.dtd.i │ │ │ │ │ │ │ │ ├── inspector.properties.i │ │ │ │ │ │ │ │ ├── prefs.dtd.i │ │ │ │ │ │ │ │ ├── tasks_overlay.dtd.i │ │ │ │ │ │ │ │ └── viewers/ │ │ │ │ │ │ │ │ ├── accessible_event.dtd.i │ │ │ │ │ │ │ │ ├── accessible_events.dtd.i │ │ │ │ │ │ │ │ ├── accessible_props.dtd.i │ │ │ │ │ │ │ │ ├── accessible_relations.dtd.i │ │ │ │ │ │ │ │ ├── accessible_tree.dtd.i │ │ │ │ │ │ │ │ ├── box_model.dtd.i │ │ │ │ │ │ │ │ ├── computed_style.dtd.i │ │ │ │ │ │ │ │ ├── dom.dtd.i │ │ │ │ │ │ │ │ ├── dom_node.dtd.i │ │ │ │ │ │ │ │ ├── js_object.dtd.i │ │ │ │ │ │ │ │ ├── style_rules.dtd.i │ │ │ │ │ │ │ │ ├── stylesheets.dtd.i │ │ │ │ │ │ │ │ └── xbl_bindings.dtd.i │ │ │ │ │ │ │ ├── cs-_c_z/ │ │ │ │ │ │ │ │ ├── editing.dtd.i │ │ │ │ │ │ │ │ ├── inspector.dtd.i │ │ │ │ │ │ │ │ ├── inspector.properties.i │ │ │ │ │ │ │ │ ├── prefs.dtd.i │ │ │ │ │ │ │ │ ├── search/ │ │ │ │ │ │ │ │ │ ├── find_files.dtd.i │ │ │ │ │ │ │ │ │ └── junk_imgs.dtd.i │ │ │ │ │ │ │ │ ├── tasks_overlay.dtd.i │ │ │ │ │ │ │ │ └── viewers/ │ │ │ │ │ │ │ │ ├── box_model.dtd.i │ │ │ │ │ │ │ │ ├── computed_style.dtd.i │ │ │ │ │ │ │ │ ├── dom.dtd.i │ │ │ │ │ │ │ │ ├── dom_node.dtd.i │ │ │ │ │ │ │ │ ├── js_object.dtd.i │ │ │ │ │ │ │ │ ├── style_rules.dtd.i │ │ │ │ │ │ │ │ ├── stylesheets.dtd.i │ │ │ │ │ │ │ │ └── xbl_bindings.dtd.i │ │ │ │ │ │ │ ├── da/ │ │ │ │ │ │ │ │ ├── editing.dtd.i │ │ │ │ │ │ │ │ ├── inspector.dtd.i │ │ │ │ │ │ │ │ ├── inspector.properties.i │ │ │ │ │ │ │ │ ├── prefs.dtd.i │ │ │ │ │ │ │ │ ├── search/ │ │ │ │ │ │ │ │ │ ├── find_files.dtd.i │ │ │ │ │ │ │ │ │ └── junk_imgs.dtd.i │ │ │ │ │ │ │ │ ├── tasks_overlay.dtd.i │ │ │ │ │ │ │ │ └── viewers/ │ │ │ │ │ │ │ │ ├── box_model.dtd.i │ │ │ │ │ │ │ │ ├── computed_style.dtd.i │ │ │ │ │ │ │ │ ├── dom.dtd.i │ │ │ │ │ │ │ │ ├── dom_node.dtd.i │ │ │ │ │ │ │ │ ├── js_object.dtd.i │ │ │ │ │ │ │ │ ├── style_rules.dtd.i │ │ │ │ │ │ │ │ ├── stylesheets.dtd.i │ │ │ │ │ │ │ │ └── xbl_bindings.dtd.i │ │ │ │ │ │ │ ├── de/ │ │ │ │ │ │ │ │ ├── editing.dtd.i │ │ │ │ │ │ │ │ ├── inspector.dtd.i │ │ │ │ │ │ │ │ ├── inspector.properties.i │ │ │ │ │ │ │ │ ├── prefs.dtd.i │ │ │ │ │ │ │ │ ├── search/ │ │ │ │ │ │ │ │ │ ├── find_files.dtd.i │ │ │ │ │ │ │ │ │ └── junk_imgs.dtd.i │ │ │ │ │ │ │ │ ├── tasks_overlay.dtd.i │ │ │ │ │ │ │ │ ├── viewer-registry.dtd.i │ │ │ │ │ │ │ │ └── viewers/ │ │ │ │ │ │ │ │ ├── accessible_event.dtd.i │ │ │ │ │ │ │ │ ├── accessible_events.dtd.i │ │ │ │ │ │ │ │ ├── accessible_events.properties.i │ │ │ │ │ │ │ │ ├── accessible_events_handler_help_dialog.dtd.i │ │ │ │ │ │ │ │ ├── accessible_props.dtd.i │ │ │ │ │ │ │ │ ├── accessible_props.properties.i │ │ │ │ │ │ │ │ ├── accessible_relations.dtd.i │ │ │ │ │ │ │ │ ├── accessible_tree.dtd.i │ │ │ │ │ │ │ │ ├── accessible_tree_eval_j_s_dialog.dtd.i │ │ │ │ │ │ │ │ ├── box_model.dtd.i │ │ │ │ │ │ │ │ ├── computed_style.dtd.i │ │ │ │ │ │ │ │ ├── dom.dtd.i │ │ │ │ │ │ │ │ ├── dom_node.dtd.i │ │ │ │ │ │ │ │ ├── js_object.dtd.i │ │ │ │ │ │ │ │ ├── style_rules.dtd.i │ │ │ │ │ │ │ │ ├── stylesheets.dtd.i │ │ │ │ │ │ │ │ ├── used_font_faces.dtd.i │ │ │ │ │ │ │ │ └── xbl_bindings.dtd.i │ │ │ │ │ │ │ ├── el/ │ │ │ │ │ │ │ │ ├── editing.dtd.i │ │ │ │ │ │ │ │ ├── inspector.dtd.i │ │ │ │ │ │ │ │ ├── inspector.properties.i │ │ │ │ │ │ │ │ ├── prefs.dtd.i │ │ │ │ │ │ │ │ ├── search/ │ │ │ │ │ │ │ │ │ ├── find_files.dtd.i │ │ │ │ │ │ │ │ │ └── junk_imgs.dtd.i │ │ │ │ │ │ │ │ ├── tasks_overlay.dtd.i │ │ │ │ │ │ │ │ ├── viewer-registry.dtd.i │ │ │ │ │ │ │ │ └── viewers/ │ │ │ │ │ │ │ │ ├── accessible_event.dtd.i │ │ │ │ │ │ │ │ ├── accessible_events.dtd.i │ │ │ │ │ │ │ │ ├── accessible_events.properties.i │ │ │ │ │ │ │ │ ├── accessible_events_handler_help_dialog.dtd.i │ │ │ │ │ │ │ │ ├── accessible_props.dtd.i │ │ │ │ │ │ │ │ ├── accessible_props.properties.i │ │ │ │ │ │ │ │ ├── accessible_relations.dtd.i │ │ │ │ │ │ │ │ ├── accessible_tree.dtd.i │ │ │ │ │ │ │ │ ├── accessible_tree_eval_j_s_dialog.dtd.i │ │ │ │ │ │ │ │ ├── box_model.dtd.i │ │ │ │ │ │ │ │ ├── computed_style.dtd.i │ │ │ │ │ │ │ │ ├── dom.dtd.i │ │ │ │ │ │ │ │ ├── dom_node.dtd.i │ │ │ │ │ │ │ │ ├── js_object.dtd.i │ │ │ │ │ │ │ │ ├── style_rules.dtd.i │ │ │ │ │ │ │ │ ├── stylesheets.dtd.i │ │ │ │ │ │ │ │ ├── used_font_faces.dtd.i │ │ │ │ │ │ │ │ └── xbl_bindings.dtd.i │ │ │ │ │ │ │ ├── en-_g_b/ │ │ │ │ │ │ │ │ ├── editing.dtd.i │ │ │ │ │ │ │ │ ├── inspector.dtd.i │ │ │ │ │ │ │ │ ├── inspector.properties.i │ │ │ │ │ │ │ │ ├── prefs.dtd.i │ │ │ │ │ │ │ │ ├── tasks_overlay.dtd.i │ │ │ │ │ │ │ │ ├── viewer-registry.dtd.i │ │ │ │ │ │ │ │ └── viewers/ │ │ │ │ │ │ │ │ ├── accessible_event.dtd.i │ │ │ │ │ │ │ │ ├── accessible_events.dtd.i │ │ │ │ │ │ │ │ ├── accessible_events.properties.i │ │ │ │ │ │ │ │ ├── accessible_events_handler_help_dialog.dtd.i │ │ │ │ │ │ │ │ ├── accessible_props.dtd.i │ │ │ │ │ │ │ │ ├── accessible_props.properties.i │ │ │ │ │ │ │ │ ├── accessible_relations.dtd.i │ │ │ │ │ │ │ │ ├── accessible_tree.dtd.i │ │ │ │ │ │ │ │ ├── accessible_tree_eval_j_s_dialog.dtd.i │ │ │ │ │ │ │ │ ├── box_model.dtd.i │ │ │ │ │ │ │ │ ├── computed_style.dtd.i │ │ │ │ │ │ │ │ ├── dom.dtd.i │ │ │ │ │ │ │ │ ├── dom_node.dtd.i │ │ │ │ │ │ │ │ ├── js_object.dtd.i │ │ │ │ │ │ │ │ ├── style_rules.dtd.i │ │ │ │ │ │ │ │ ├── stylesheets.dtd.i │ │ │ │ │ │ │ │ ├── used_font_faces.dtd.i │ │ │ │ │ │ │ │ └── xbl_bindings.dtd.i │ │ │ │ │ │ │ ├── en-_u_s/ │ │ │ │ │ │ │ │ ├── _makefile.in.i │ │ │ │ │ │ │ │ ├── contents.rdf.i │ │ │ │ │ │ │ │ ├── contents.rdf.in.i │ │ │ │ │ │ │ │ ├── editing.dtd.i │ │ │ │ │ │ │ │ ├── inspector.dtd.i │ │ │ │ │ │ │ │ ├── inspector.properties.i │ │ │ │ │ │ │ │ ├── jar.mn.i │ │ │ │ │ │ │ │ ├── makefile.win.i │ │ │ │ │ │ │ │ ├── prefs.dtd.i │ │ │ │ │ │ │ │ ├── search/ │ │ │ │ │ │ │ │ │ ├── find_files.dtd.i │ │ │ │ │ │ │ │ │ └── junk_imgs.dtd.i │ │ │ │ │ │ │ │ ├── tasks_overlay.dtd.i │ │ │ │ │ │ │ │ ├── viewer-registry.dtd.i │ │ │ │ │ │ │ │ ├── viewers/ │ │ │ │ │ │ │ │ │ ├── accessible_event.dtd.i │ │ │ │ │ │ │ │ │ ├── accessible_events.dtd.i │ │ │ │ │ │ │ │ │ ├── accessible_events.properties.i │ │ │ │ │ │ │ │ │ ├── accessible_events_handler_help_dialog.dtd.i │ │ │ │ │ │ │ │ │ ├── accessible_props.dtd.i │ │ │ │ │ │ │ │ │ ├── accessible_props.properties.i │ │ │ │ │ │ │ │ │ ├── accessible_relations.dtd.i │ │ │ │ │ │ │ │ │ ├── accessible_tree.dtd.i │ │ │ │ │ │ │ │ │ ├── accessible_tree_eval_j_s_dialog.dtd.i │ │ │ │ │ │ │ │ │ ├── box_model.dtd.i │ │ │ │ │ │ │ │ │ ├── computed_style.dtd.i │ │ │ │ │ │ │ │ │ ├── dom.dtd.i │ │ │ │ │ │ │ │ │ ├── dom_node.dtd.i │ │ │ │ │ │ │ │ │ ├── js_object.dtd.i │ │ │ │ │ │ │ │ │ ├── node_element.dtd.i │ │ │ │ │ │ │ │ │ ├── style_rules.dtd.i │ │ │ │ │ │ │ │ │ ├── stylesheets.dtd.i │ │ │ │ │ │ │ │ │ ├── used_font_faces.dtd.i │ │ │ │ │ │ │ │ │ └── xbl_bindings.dtd.i │ │ │ │ │ │ │ │ └── ~2ecvsignore.i │ │ │ │ │ │ │ ├── fi/ │ │ │ │ │ │ │ │ ├── editing.dtd.i │ │ │ │ │ │ │ │ ├── inspector.dtd.i │ │ │ │ │ │ │ │ ├── inspector.properties.i │ │ │ │ │ │ │ │ ├── prefs.dtd.i │ │ │ │ │ │ │ │ ├── tasks_overlay.dtd.i │ │ │ │ │ │ │ │ ├── viewer-registry.dtd.i │ │ │ │ │ │ │ │ └── viewers/ │ │ │ │ │ │ │ │ ├── accessible_event.dtd.i │ │ │ │ │ │ │ │ ├── accessible_events.dtd.i │ │ │ │ │ │ │ │ ├── accessible_events.properties.i │ │ │ │ │ │ │ │ ├── accessible_events_handler_help_dialog.dtd.i │ │ │ │ │ │ │ │ ├── accessible_props.dtd.i │ │ │ │ │ │ │ │ ├── accessible_props.properties.i │ │ │ │ │ │ │ │ ├── accessible_relations.dtd.i │ │ │ │ │ │ │ │ ├── accessible_tree.dtd.i │ │ │ │ │ │ │ │ ├── accessible_tree_eval_j_s_dialog.dtd.i │ │ │ │ │ │ │ │ ├── box_model.dtd.i │ │ │ │ │ │ │ │ ├── computed_style.dtd.i │ │ │ │ │ │ │ │ ├── dom.dtd.i │ │ │ │ │ │ │ │ ├── dom_node.dtd.i │ │ │ │ │ │ │ │ ├── js_object.dtd.i │ │ │ │ │ │ │ │ ├── style_rules.dtd.i │ │ │ │ │ │ │ │ ├── stylesheets.dtd.i │ │ │ │ │ │ │ │ ├── used_font_faces.dtd.i │ │ │ │ │ │ │ │ └── xbl_bindings.dtd.i │ │ │ │ │ │ │ ├── fr/ │ │ │ │ │ │ │ │ ├── editing.dtd.i │ │ │ │ │ │ │ │ ├── inspector.dtd.i │ │ │ │ │ │ │ │ ├── inspector.properties.i │ │ │ │ │ │ │ │ ├── prefs.dtd.i │ │ │ │ │ │ │ │ ├── search/ │ │ │ │ │ │ │ │ │ ├── find_files.dtd.i │ │ │ │ │ │ │ │ │ └── junk_imgs.dtd.i │ │ │ │ │ │ │ │ ├── tasks_overlay.dtd.i │ │ │ │ │ │ │ │ ├── viewer-registry.dtd.i │ │ │ │ │ │ │ │ └── viewers/ │ │ │ │ │ │ │ │ ├── accessible_event.dtd.i │ │ │ │ │ │ │ │ ├── accessible_events.dtd.i │ │ │ │ │ │ │ │ ├── accessible_events.properties.i │ │ │ │ │ │ │ │ ├── accessible_events_handler_help_dialog.dtd.i │ │ │ │ │ │ │ │ ├── accessible_props.dtd.i │ │ │ │ │ │ │ │ ├── accessible_props.properties.i │ │ │ │ │ │ │ │ ├── accessible_relations.dtd.i │ │ │ │ │ │ │ │ ├── accessible_tree.dtd.i │ │ │ │ │ │ │ │ ├── accessible_tree_eval_j_s_dialog.dtd.i │ │ │ │ │ │ │ │ ├── box_model.dtd.i │ │ │ │ │ │ │ │ ├── computed_style.dtd.i │ │ │ │ │ │ │ │ ├── dom.dtd.i │ │ │ │ │ │ │ │ ├── dom_node.dtd.i │ │ │ │ │ │ │ │ ├── js_object.dtd.i │ │ │ │ │ │ │ │ ├── style_rules.dtd.i │ │ │ │ │ │ │ │ ├── stylesheets.dtd.i │ │ │ │ │ │ │ │ └── xbl_bindings.dtd.i │ │ │ │ │ │ │ ├── ga-_i_e/ │ │ │ │ │ │ │ │ ├── editing.dtd.i │ │ │ │ │ │ │ │ ├── inspector.dtd.i │ │ │ │ │ │ │ │ ├── inspector.properties.i │ │ │ │ │ │ │ │ ├── prefs.dtd.i │ │ │ │ │ │ │ │ ├── search/ │ │ │ │ │ │ │ │ │ ├── find_files.dtd.i │ │ │ │ │ │ │ │ │ └── junk_imgs.dtd.i │ │ │ │ │ │ │ │ ├── tasks_overlay.dtd.i │ │ │ │ │ │ │ │ └── viewers/ │ │ │ │ │ │ │ │ ├── box_model.dtd.i │ │ │ │ │ │ │ │ ├── computed_style.dtd.i │ │ │ │ │ │ │ │ ├── dom.dtd.i │ │ │ │ │ │ │ │ ├── dom_node.dtd.i │ │ │ │ │ │ │ │ ├── js_object.dtd.i │ │ │ │ │ │ │ │ ├── style_rules.dtd.i │ │ │ │ │ │ │ │ ├── stylesheets.dtd.i │ │ │ │ │ │ │ │ └── xbl_bindings.dtd.i │ │ │ │ │ │ │ ├── hu/ │ │ │ │ │ │ │ │ ├── editing.dtd.i │ │ │ │ │ │ │ │ ├── inspector.dtd.i │ │ │ │ │ │ │ │ ├── inspector.properties.i │ │ │ │ │ │ │ │ ├── prefs.dtd.i │ │ │ │ │ │ │ │ ├── search/ │ │ │ │ │ │ │ │ │ ├── find_files.dtd.i │ │ │ │ │ │ │ │ │ └── junk_imgs.dtd.i │ │ │ │ │ │ │ │ ├── tasks_overlay.dtd.i │ │ │ │ │ │ │ │ └── viewers/ │ │ │ │ │ │ │ │ ├── box_model.dtd.i │ │ │ │ │ │ │ │ ├── computed_style.dtd.i │ │ │ │ │ │ │ │ ├── dom.dtd.i │ │ │ │ │ │ │ │ ├── dom_node.dtd.i │ │ │ │ │ │ │ │ ├── js_object.dtd.i │ │ │ │ │ │ │ │ ├── style_rules.dtd.i │ │ │ │ │ │ │ │ ├── stylesheets.dtd.i │ │ │ │ │ │ │ │ └── xbl_bindings.dtd.i │ │ │ │ │ │ │ ├── jar.mn.i │ │ │ │ │ │ │ ├── makefile.win.i │ │ │ │ │ │ │ ├── moz.build.i │ │ │ │ │ │ │ ├── nb-_n_o/ │ │ │ │ │ │ │ │ ├── editing.dtd.i │ │ │ │ │ │ │ │ ├── inspector.dtd.i │ │ │ │ │ │ │ │ ├── inspector.properties.i │ │ │ │ │ │ │ │ ├── prefs.dtd.i │ │ │ │ │ │ │ │ ├── search/ │ │ │ │ │ │ │ │ │ ├── find_files.dtd.i │ │ │ │ │ │ │ │ │ └── junk_imgs.dtd.i │ │ │ │ │ │ │ │ ├── tasks_overlay.dtd.i │ │ │ │ │ │ │ │ └── viewers/ │ │ │ │ │ │ │ │ ├── accessible_events.dtd.i │ │ │ │ │ │ │ │ ├── accessible_props.dtd.i │ │ │ │ │ │ │ │ ├── accessible_tree.dtd.i │ │ │ │ │ │ │ │ ├── box_model.dtd.i │ │ │ │ │ │ │ │ ├── computed_style.dtd.i │ │ │ │ │ │ │ │ ├── dom.dtd.i │ │ │ │ │ │ │ │ ├── dom_node.dtd.i │ │ │ │ │ │ │ │ ├── js_object.dtd.i │ │ │ │ │ │ │ │ ├── style_rules.dtd.i │ │ │ │ │ │ │ │ ├── stylesheets.dtd.i │ │ │ │ │ │ │ │ └── xbl_bindings.dtd.i │ │ │ │ │ │ │ ├── pl/ │ │ │ │ │ │ │ │ ├── editing.dtd.i │ │ │ │ │ │ │ │ ├── inspector.dtd.i │ │ │ │ │ │ │ │ ├── inspector.properties.i │ │ │ │ │ │ │ │ ├── prefs.dtd.i │ │ │ │ │ │ │ │ ├── search/ │ │ │ │ │ │ │ │ │ ├── find_files.dtd.i │ │ │ │ │ │ │ │ │ └── junk_imgs.dtd.i │ │ │ │ │ │ │ │ ├── tasks_overlay.dtd.i │ │ │ │ │ │ │ │ ├── viewer-registry.dtd.i │ │ │ │ │ │ │ │ └── viewers/ │ │ │ │ │ │ │ │ ├── accessible_event.dtd.i │ │ │ │ │ │ │ │ ├── accessible_events.dtd.i │ │ │ │ │ │ │ │ ├── accessible_events.properties.i │ │ │ │ │ │ │ │ ├── accessible_events_handler_help_dialog.dtd.i │ │ │ │ │ │ │ │ ├── accessible_props.dtd.i │ │ │ │ │ │ │ │ ├── accessible_props.properties.i │ │ │ │ │ │ │ │ ├── accessible_relations.dtd.i │ │ │ │ │ │ │ │ ├── accessible_tree.dtd.i │ │ │ │ │ │ │ │ ├── accessible_tree_eval_j_s_dialog.dtd.i │ │ │ │ │ │ │ │ ├── box_model.dtd.i │ │ │ │ │ │ │ │ ├── computed_style.dtd.i │ │ │ │ │ │ │ │ ├── dom.dtd.i │ │ │ │ │ │ │ │ ├── dom_node.dtd.i │ │ │ │ │ │ │ │ ├── js_object.dtd.i │ │ │ │ │ │ │ │ ├── style_rules.dtd.i │ │ │ │ │ │ │ │ ├── stylesheets.dtd.i │ │ │ │ │ │ │ │ ├── used_font_faces.dtd.i │ │ │ │ │ │ │ │ └── xbl_bindings.dtd.i │ │ │ │ │ │ │ ├── pt-_b_r/ │ │ │ │ │ │ │ │ ├── editing.dtd.i │ │ │ │ │ │ │ │ ├── inspector.dtd.i │ │ │ │ │ │ │ │ ├── inspector.properties.i │ │ │ │ │ │ │ │ ├── prefs.dtd.i │ │ │ │ │ │ │ │ ├── search/ │ │ │ │ │ │ │ │ │ ├── find_files.dtd.i │ │ │ │ │ │ │ │ │ └── junk_imgs.dtd.i │ │ │ │ │ │ │ │ ├── tasks_overlay.dtd.i │ │ │ │ │ │ │ │ └── viewers/ │ │ │ │ │ │ │ │ ├── box_model.dtd.i │ │ │ │ │ │ │ │ ├── computed_style.dtd.i │ │ │ │ │ │ │ │ ├── dom.dtd.i │ │ │ │ │ │ │ │ ├── dom_node.dtd.i │ │ │ │ │ │ │ │ ├── js_object.dtd.i │ │ │ │ │ │ │ │ ├── style_rules.dtd.i │ │ │ │ │ │ │ │ ├── stylesheets.dtd.i │ │ │ │ │ │ │ │ └── xbl_bindings.dtd.i │ │ │ │ │ │ │ ├── ru/ │ │ │ │ │ │ │ │ ├── editing.dtd.i │ │ │ │ │ │ │ │ ├── inspector.dtd.i │ │ │ │ │ │ │ │ ├── inspector.properties.i │ │ │ │ │ │ │ │ ├── prefs.dtd.i │ │ │ │ │ │ │ │ ├── search/ │ │ │ │ │ │ │ │ │ ├── find_files.dtd.i │ │ │ │ │ │ │ │ │ └── junk_imgs.dtd.i │ │ │ │ │ │ │ │ ├── tasks_overlay.dtd.i │ │ │ │ │ │ │ │ ├── viewer-registry.dtd.i │ │ │ │ │ │ │ │ └── viewers/ │ │ │ │ │ │ │ │ ├── accessible_event.dtd.i │ │ │ │ │ │ │ │ ├── accessible_events.dtd.i │ │ │ │ │ │ │ │ ├── accessible_events.properties.i │ │ │ │ │ │ │ │ ├── accessible_events_handler_help_dialog.dtd.i │ │ │ │ │ │ │ │ ├── accessible_props.dtd.i │ │ │ │ │ │ │ │ ├── accessible_props.properties.i │ │ │ │ │ │ │ │ ├── accessible_relations.dtd.i │ │ │ │ │ │ │ │ ├── accessible_tree.dtd.i │ │ │ │ │ │ │ │ ├── accessible_tree_eval_j_s_dialog.dtd.i │ │ │ │ │ │ │ │ ├── box_model.dtd.i │ │ │ │ │ │ │ │ ├── computed_style.dtd.i │ │ │ │ │ │ │ │ ├── dom.dtd.i │ │ │ │ │ │ │ │ ├── dom_node.dtd.i │ │ │ │ │ │ │ │ ├── js_object.dtd.i │ │ │ │ │ │ │ │ ├── style_rules.dtd.i │ │ │ │ │ │ │ │ ├── stylesheets.dtd.i │ │ │ │ │ │ │ │ ├── used_font_faces.dtd.i │ │ │ │ │ │ │ │ └── xbl_bindings.dtd.i │ │ │ │ │ │ │ ├── sk/ │ │ │ │ │ │ │ │ ├── editing.dtd.i │ │ │ │ │ │ │ │ ├── inspector.dtd.i │ │ │ │ │ │ │ │ ├── inspector.properties.i │ │ │ │ │ │ │ │ ├── prefs.dtd.i │ │ │ │ │ │ │ │ ├── search/ │ │ │ │ │ │ │ │ │ ├── find_files.dtd.i │ │ │ │ │ │ │ │ │ └── junk_imgs.dtd.i │ │ │ │ │ │ │ │ ├── tasks_overlay.dtd.i │ │ │ │ │ │ │ │ ├── viewer-registry.dtd.i │ │ │ │ │ │ │ │ └── viewers/ │ │ │ │ │ │ │ │ ├── accessible_event.dtd.i │ │ │ │ │ │ │ │ ├── accessible_events.dtd.i │ │ │ │ │ │ │ │ ├── accessible_events.properties.i │ │ │ │ │ │ │ │ ├── accessible_events_handler_help_dialog.dtd.i │ │ │ │ │ │ │ │ ├── accessible_props.dtd.i │ │ │ │ │ │ │ │ ├── accessible_props.properties.i │ │ │ │ │ │ │ │ ├── accessible_relations.dtd.i │ │ │ │ │ │ │ │ ├── accessible_tree.dtd.i │ │ │ │ │ │ │ │ ├── accessible_tree_eval_j_s_dialog.dtd.i │ │ │ │ │ │ │ │ ├── box_model.dtd.i │ │ │ │ │ │ │ │ ├── computed_style.dtd.i │ │ │ │ │ │ │ │ ├── dom.dtd.i │ │ │ │ │ │ │ │ ├── dom_node.dtd.i │ │ │ │ │ │ │ │ ├── js_object.dtd.i │ │ │ │ │ │ │ │ ├── style_rules.dtd.i │ │ │ │ │ │ │ │ ├── stylesheets.dtd.i │ │ │ │ │ │ │ │ ├── used_font_faces.dtd.i │ │ │ │ │ │ │ │ └── xbl_bindings.dtd.i │ │ │ │ │ │ │ ├── sv-_s_e/ │ │ │ │ │ │ │ │ ├── editing.dtd.i │ │ │ │ │ │ │ │ ├── inspector.dtd.i │ │ │ │ │ │ │ │ ├── inspector.properties.i │ │ │ │ │ │ │ │ ├── prefs.dtd.i │ │ │ │ │ │ │ │ ├── search/ │ │ │ │ │ │ │ │ │ ├── find_files.dtd.i │ │ │ │ │ │ │ │ │ └── junk_imgs.dtd.i │ │ │ │ │ │ │ │ ├── tasks_overlay.dtd.i │ │ │ │ │ │ │ │ ├── viewer-registry.dtd.i │ │ │ │ │ │ │ │ └── viewers/ │ │ │ │ │ │ │ │ ├── accessible_event.dtd.i │ │ │ │ │ │ │ │ ├── accessible_events.dtd.i │ │ │ │ │ │ │ │ ├── accessible_events.properties.i │ │ │ │ │ │ │ │ ├── accessible_events_handler_help_dialog.dtd.i │ │ │ │ │ │ │ │ ├── accessible_props.dtd.i │ │ │ │ │ │ │ │ ├── accessible_props.properties.i │ │ │ │ │ │ │ │ ├── accessible_relations.dtd.i │ │ │ │ │ │ │ │ ├── accessible_tree.dtd.i │ │ │ │ │ │ │ │ ├── accessible_tree_eval_j_s_dialog.dtd.i │ │ │ │ │ │ │ │ ├── box_model.dtd.i │ │ │ │ │ │ │ │ ├── computed_style.dtd.i │ │ │ │ │ │ │ │ ├── dom.dtd.i │ │ │ │ │ │ │ │ ├── dom_node.dtd.i │ │ │ │ │ │ │ │ ├── js_object.dtd.i │ │ │ │ │ │ │ │ ├── style_rules.dtd.i │ │ │ │ │ │ │ │ ├── stylesheets.dtd.i │ │ │ │ │ │ │ │ ├── used_font_faces.dtd.i │ │ │ │ │ │ │ │ └── xbl_bindings.dtd.i │ │ │ │ │ │ │ ├── zh-_c_n/ │ │ │ │ │ │ │ │ ├── editing.dtd.i │ │ │ │ │ │ │ │ ├── inspector.dtd.i │ │ │ │ │ │ │ │ ├── inspector.properties.i │ │ │ │ │ │ │ │ ├── prefs.dtd.i │ │ │ │ │ │ │ │ ├── search/ │ │ │ │ │ │ │ │ │ ├── find_files.dtd.i │ │ │ │ │ │ │ │ │ └── junk_imgs.dtd.i │ │ │ │ │ │ │ │ ├── tasks_overlay.dtd.i │ │ │ │ │ │ │ │ └── viewers/ │ │ │ │ │ │ │ │ ├── box_model.dtd.i │ │ │ │ │ │ │ │ ├── computed_style.dtd.i │ │ │ │ │ │ │ │ ├── dom.dtd.i │ │ │ │ │ │ │ │ ├── dom_node.dtd.i │ │ │ │ │ │ │ │ ├── js_object.dtd.i │ │ │ │ │ │ │ │ ├── style_rules.dtd.i │ │ │ │ │ │ │ │ ├── stylesheets.dtd.i │ │ │ │ │ │ │ │ └── xbl_bindings.dtd.i │ │ │ │ │ │ │ ├── zh-_t_w/ │ │ │ │ │ │ │ │ ├── editing.dtd.i │ │ │ │ │ │ │ │ ├── inspector.dtd.i │ │ │ │ │ │ │ │ ├── inspector.properties.i │ │ │ │ │ │ │ │ ├── prefs.dtd.i │ │ │ │ │ │ │ │ ├── search/ │ │ │ │ │ │ │ │ │ ├── find_files.dtd.i │ │ │ │ │ │ │ │ │ └── junk_imgs.dtd.i │ │ │ │ │ │ │ │ ├── tasks_overlay.dtd.i │ │ │ │ │ │ │ │ └── viewers/ │ │ │ │ │ │ │ │ ├── box_model.dtd.i │ │ │ │ │ │ │ │ ├── computed_style.dtd.i │ │ │ │ │ │ │ │ ├── dom.dtd.i │ │ │ │ │ │ │ │ ├── dom_node.dtd.i │ │ │ │ │ │ │ │ ├── js_object.dtd.i │ │ │ │ │ │ │ │ ├── style_rules.dtd.i │ │ │ │ │ │ │ │ ├── stylesheets.dtd.i │ │ │ │ │ │ │ │ └── xbl_bindings.dtd.i │ │ │ │ │ │ │ └── ~2ecvsignore.i │ │ │ │ │ │ ├── makefile.win.i │ │ │ │ │ │ ├── moz.build.i │ │ │ │ │ │ ├── skin/ │ │ │ │ │ │ │ ├── _makefile.in.i │ │ │ │ │ │ │ ├── classic/ │ │ │ │ │ │ │ │ ├── _image_search_item.gif.i │ │ │ │ │ │ │ │ ├── _makefile.in.i │ │ │ │ │ │ │ │ ├── btn_find-dis.gif.i │ │ │ │ │ │ │ │ ├── btn_find.gif.i │ │ │ │ │ │ │ │ ├── btn_selecting-act.gif.i │ │ │ │ │ │ │ │ ├── btn_selecting-dis.gif.i │ │ │ │ │ │ │ │ ├── btn_selecting.gif.i │ │ │ │ │ │ │ │ ├── contents.rdf.i │ │ │ │ │ │ │ │ ├── icon_important.gif.i │ │ │ │ │ │ │ │ ├── icon_viewer_list-dis.gif.i │ │ │ │ │ │ │ │ ├── icon_viewer_list.gif.i │ │ │ │ │ │ │ │ ├── icon_viewer_menu-dis.gif.i │ │ │ │ │ │ │ │ ├── icon_viewer_menu.gif.i │ │ │ │ │ │ │ │ ├── inspector.css.i │ │ │ │ │ │ │ │ ├── inspector_window.css.i │ │ │ │ │ │ │ │ ├── jar.mn.i │ │ │ │ │ │ │ │ ├── makefile.win.i │ │ │ │ │ │ │ │ ├── multipanel.css.i │ │ │ │ │ │ │ │ ├── panelset.css.i │ │ │ │ │ │ │ │ ├── sidebar.css.i │ │ │ │ │ │ │ │ ├── titled_splitter.css.i │ │ │ │ │ │ │ │ ├── titledsplitter-close.gif.i │ │ │ │ │ │ │ │ ├── tree_editable.css.i │ │ │ │ │ │ │ │ ├── viewer_pane.css.i │ │ │ │ │ │ │ │ ├── viewers/ │ │ │ │ │ │ │ │ │ ├── accessible_event/ │ │ │ │ │ │ │ │ │ │ └── accessible_event.css.i │ │ │ │ │ │ │ │ │ ├── accessible_events/ │ │ │ │ │ │ │ │ │ │ └── accessible_events.css.i │ │ │ │ │ │ │ │ │ ├── accessible_props/ │ │ │ │ │ │ │ │ │ │ └── accessible_props.css.i │ │ │ │ │ │ │ │ │ ├── accessible_tree/ │ │ │ │ │ │ │ │ │ │ └── accessible_tree.css.i │ │ │ │ │ │ │ │ │ ├── box_model/ │ │ │ │ │ │ │ │ │ │ └── box_model.css.i │ │ │ │ │ │ │ │ │ ├── dom/ │ │ │ │ │ │ │ │ │ │ ├── columns_dialog.css.i │ │ │ │ │ │ │ │ │ │ ├── dom.css.i │ │ │ │ │ │ │ │ │ │ └── find_dialog.css.i │ │ │ │ │ │ │ │ │ ├── dom_node/ │ │ │ │ │ │ │ │ │ │ └── dom_node.css.i │ │ │ │ │ │ │ │ │ ├── node_element/ │ │ │ │ │ │ │ │ │ │ └── node_element.css.i │ │ │ │ │ │ │ │ │ ├── node_text/ │ │ │ │ │ │ │ │ │ │ └── node_text.css.i │ │ │ │ │ │ │ │ │ ├── style_rules/ │ │ │ │ │ │ │ │ │ │ └── style_rules.css.i │ │ │ │ │ │ │ │ │ └── xbl_bindings/ │ │ │ │ │ │ │ │ │ └── xbl_bindings.css.i │ │ │ │ │ │ │ │ └── ~2ecvsignore.i │ │ │ │ │ │ │ ├── makefile.win.i │ │ │ │ │ │ │ ├── modern/ │ │ │ │ │ │ │ │ ├── _image_search_item.gif.i │ │ │ │ │ │ │ │ ├── _makefile.in.i │ │ │ │ │ │ │ │ ├── btn_find-dis.gif.i │ │ │ │ │ │ │ │ ├── btn_find.gif.i │ │ │ │ │ │ │ │ ├── btn_selecting-act.gif.i │ │ │ │ │ │ │ │ ├── btn_selecting-dis.gif.i │ │ │ │ │ │ │ │ ├── btn_selecting.gif.i │ │ │ │ │ │ │ │ ├── contents.rdf.i │ │ │ │ │ │ │ │ ├── icon_important.gif.i │ │ │ │ │ │ │ │ ├── icon_viewer_list-dis.gif.i │ │ │ │ │ │ │ │ ├── icon_viewer_list.gif.i │ │ │ │ │ │ │ │ ├── icon_viewer_menu-dis.gif.i │ │ │ │ │ │ │ │ ├── icon_viewer_menu.gif.i │ │ │ │ │ │ │ │ ├── inspector.css.i │ │ │ │ │ │ │ │ ├── inspector_window.css.i │ │ │ │ │ │ │ │ ├── jar.mn.i │ │ │ │ │ │ │ │ ├── makefile.win.i │ │ │ │ │ │ │ │ ├── multipanel.css.i │ │ │ │ │ │ │ │ ├── panelset.css.i │ │ │ │ │ │ │ │ ├── sidebar.css.i │ │ │ │ │ │ │ │ ├── titled_splitter.css.i │ │ │ │ │ │ │ │ ├── titledsplitter-close.gif.i │ │ │ │ │ │ │ │ ├── tree_editable.css.i │ │ │ │ │ │ │ │ ├── viewer_pane.css.i │ │ │ │ │ │ │ │ ├── viewers/ │ │ │ │ │ │ │ │ │ ├── accessible_event/ │ │ │ │ │ │ │ │ │ │ └── accessible_event.css.i │ │ │ │ │ │ │ │ │ ├── accessible_events/ │ │ │ │ │ │ │ │ │ │ └── accessible_events.css.i │ │ │ │ │ │ │ │ │ ├── accessible_props/ │ │ │ │ │ │ │ │ │ │ └── accessible_props.css.i │ │ │ │ │ │ │ │ │ ├── accessible_tree/ │ │ │ │ │ │ │ │ │ │ └── accessible_tree.css.i │ │ │ │ │ │ │ │ │ ├── box_model/ │ │ │ │ │ │ │ │ │ │ └── box_model.css.i │ │ │ │ │ │ │ │ │ ├── dom/ │ │ │ │ │ │ │ │ │ │ ├── columns_dialog.css.i │ │ │ │ │ │ │ │ │ │ ├── dom.css.i │ │ │ │ │ │ │ │ │ │ └── find_dialog.css.i │ │ │ │ │ │ │ │ │ ├── dom_node/ │ │ │ │ │ │ │ │ │ │ └── dom_node.css.i │ │ │ │ │ │ │ │ │ ├── node_element/ │ │ │ │ │ │ │ │ │ │ └── node_element.css.i │ │ │ │ │ │ │ │ │ ├── node_text/ │ │ │ │ │ │ │ │ │ │ └── node_text.css.i │ │ │ │ │ │ │ │ │ ├── style_rules/ │ │ │ │ │ │ │ │ │ │ └── style_rules.css.i │ │ │ │ │ │ │ │ │ └── xbl_bindings/ │ │ │ │ │ │ │ │ │ └── xbl_bindings.css.i │ │ │ │ │ │ │ │ └── ~2ecvsignore.i │ │ │ │ │ │ │ └── ~2ecvsignore.i │ │ │ │ │ │ └── ~2ecvsignore.i │ │ │ │ │ ├── ~2ecvsignore.i │ │ │ │ │ ├── ~2ehgignore.i │ │ │ │ │ └── ~2ehgtags.i │ │ │ │ ├── fncache │ │ │ │ ├── phaseroots │ │ │ │ ├── undo │ │ │ │ └── undo.phaseroots │ │ │ ├── undo.bookmarks │ │ │ ├── undo.branch │ │ │ ├── undo.desc │ │ │ └── undo.dirstate │ │ ├── .hgignore │ │ ├── .hgtags │ │ ├── Makefile.in │ │ ├── base/ │ │ │ └── js/ │ │ │ └── inspector-cmdline.js │ │ ├── build/ │ │ │ ├── Makefile.in │ │ │ ├── install.js │ │ │ └── moz.build │ │ ├── install.rdf │ │ ├── jar.mn │ │ ├── moz.build │ │ └── resources/ │ │ ├── Makefile.in │ │ ├── content/ │ │ │ ├── Flasher.js │ │ │ ├── ViewerRegistry.js │ │ │ ├── browserOverlay.xul │ │ │ ├── commandOverlay.xul │ │ │ ├── editingOverlay.xul │ │ │ ├── extensions/ │ │ │ │ ├── titledSplitter.css │ │ │ │ ├── titledSplitter.xml │ │ │ │ └── wsm-colorpicker.js │ │ │ ├── hooks.js │ │ │ ├── inspector.css │ │ │ ├── inspector.js │ │ │ ├── inspector.xml │ │ │ ├── inspector.xul │ │ │ ├── inspectorOverlay.xul │ │ │ ├── jsutil/ │ │ │ │ ├── commands/ │ │ │ │ │ └── baseCommands.js │ │ │ │ ├── events/ │ │ │ │ │ └── ObserverManager.js │ │ │ │ ├── rdf/ │ │ │ │ │ ├── RDFArray.js │ │ │ │ │ └── RDFU.js │ │ │ │ ├── system/ │ │ │ │ │ ├── DiskSearch.js │ │ │ │ │ ├── FilePickerUtils.js │ │ │ │ │ ├── PrefUtils.js │ │ │ │ │ └── clipboardFlavors.js │ │ │ │ ├── xpcom/ │ │ │ │ │ └── XPCU.js │ │ │ │ └── xul/ │ │ │ │ ├── DNDUtils.js │ │ │ │ ├── FrameExchange.js │ │ │ │ ├── inBaseTreeView.js │ │ │ │ ├── inDataTreeView.js │ │ │ │ ├── inFormManager.js │ │ │ │ └── inTreeBuilder.js │ │ │ ├── keysetOverlay.xul │ │ │ ├── object.js │ │ │ ├── object.xul │ │ │ ├── popupOverlay.xul │ │ │ ├── prefs/ │ │ │ │ ├── inspector.js │ │ │ │ ├── pref-inspector.js │ │ │ │ ├── pref-inspector.xul │ │ │ │ ├── pref-sidebar.js │ │ │ │ └── prefsOverlay.xul │ │ │ ├── res/ │ │ │ │ ├── Linux/ │ │ │ │ │ ├── winInspectorMain.xpm │ │ │ │ │ └── winInspectorMain16.xpm │ │ │ │ ├── search-registry.rdf │ │ │ │ └── viewer-registry.rdf │ │ │ ├── sidebar.js │ │ │ ├── sidebar.xul │ │ │ ├── statusbarOverlay.xul │ │ │ ├── tasksOverlay-cz.xul │ │ │ ├── tasksOverlay-ff.xul │ │ │ ├── tasksOverlay-mobile.xul │ │ │ ├── tasksOverlay-sb.xul │ │ │ ├── tasksOverlay-tb.xul │ │ │ ├── tasksOverlay.xul │ │ │ ├── tests/ │ │ │ │ └── allskin.xul │ │ │ ├── toolboxOverlay.xul │ │ │ ├── toolsOverlay-bg.xul │ │ │ ├── utils.js │ │ │ ├── venkmanOverlay.xul │ │ │ └── viewers/ │ │ │ ├── accessibleEvent/ │ │ │ │ ├── accessibleEvent.js │ │ │ │ └── accessibleEvent.xul │ │ │ ├── accessibleEvents/ │ │ │ │ ├── accessibleEvents.js │ │ │ │ ├── accessibleEvents.xul │ │ │ │ └── handlerHelpDialog.xul │ │ │ ├── accessibleObject/ │ │ │ │ ├── accessibleObject.js │ │ │ │ └── accessibleObject.xul │ │ │ ├── accessibleProps/ │ │ │ │ ├── accessiblePropViewerMgr.js │ │ │ │ ├── accessibleProps.js │ │ │ │ └── accessibleProps.xul │ │ │ ├── accessibleRelations/ │ │ │ │ ├── accessibleRelations.js │ │ │ │ └── accessibleRelations.xul │ │ │ ├── accessibleTree/ │ │ │ │ ├── accessibleTree.js │ │ │ │ ├── accessibleTree.xul │ │ │ │ ├── evalJSDialog.js │ │ │ │ └── evalJSDialog.xul │ │ │ ├── boxModel/ │ │ │ │ ├── boxModel.js │ │ │ │ └── boxModel.xul │ │ │ ├── computedStyle/ │ │ │ │ ├── computedStyle.js │ │ │ │ └── computedStyle.xul │ │ │ ├── dom/ │ │ │ │ ├── FindDialog.js │ │ │ │ ├── columnsDialog.js │ │ │ │ ├── columnsDialog.xul │ │ │ │ ├── commandOverlay.xul │ │ │ │ ├── dom.js │ │ │ │ ├── dom.xul │ │ │ │ ├── findDialog.xul │ │ │ │ ├── insertDialog.js │ │ │ │ ├── insertDialog.xul │ │ │ │ ├── keysetOverlay.xul │ │ │ │ ├── popupOverlay.xul │ │ │ │ ├── pseudoClassDialog.js │ │ │ │ └── pseudoClassDialog.xul │ │ │ ├── domNode/ │ │ │ │ ├── domNode.js │ │ │ │ ├── domNode.xul │ │ │ │ ├── domNodeDialog.js │ │ │ │ └── domNodeDialog.xul │ │ │ ├── jsObject/ │ │ │ │ ├── evalExprDialog.js │ │ │ │ ├── evalExprDialog.xul │ │ │ │ ├── jsObject.js │ │ │ │ ├── jsObject.xul │ │ │ │ ├── jsObjectViewer.js │ │ │ │ └── jsObjectViewer.xul │ │ │ ├── styleRules/ │ │ │ │ ├── commandOverlay.xul │ │ │ │ ├── keysetOverlay.xul │ │ │ │ ├── popupOverlay.xul │ │ │ │ ├── styleRules.js │ │ │ │ └── styleRules.xul │ │ │ ├── stylesheets/ │ │ │ │ ├── stylesheets.js │ │ │ │ └── stylesheets.xul │ │ │ ├── usedFontFaces/ │ │ │ │ ├── usedFontFaces.js │ │ │ │ └── usedFontFaces.xul │ │ │ └── xblBindings/ │ │ │ ├── xblBindings.js │ │ │ └── xblBindings.xul │ │ ├── locale/ │ │ │ ├── Makefile.in │ │ │ ├── ca/ │ │ │ │ ├── editing.dtd │ │ │ │ ├── inspector.dtd │ │ │ │ ├── inspector.properties │ │ │ │ ├── prefs.dtd │ │ │ │ ├── search/ │ │ │ │ │ ├── findFiles.dtd │ │ │ │ │ └── junkImgs.dtd │ │ │ │ ├── tasksOverlay.dtd │ │ │ │ └── viewers/ │ │ │ │ ├── boxModel.dtd │ │ │ │ ├── computedStyle.dtd │ │ │ │ ├── dom.dtd │ │ │ │ ├── domNode.dtd │ │ │ │ ├── jsObject.dtd │ │ │ │ ├── styleRules.dtd │ │ │ │ ├── stylesheets.dtd │ │ │ │ └── xblBindings.dtd │ │ │ ├── cs/ │ │ │ │ ├── editing.dtd │ │ │ │ ├── inspector.dtd │ │ │ │ ├── inspector.properties │ │ │ │ ├── prefs.dtd │ │ │ │ ├── tasksOverlay.dtd │ │ │ │ └── viewers/ │ │ │ │ ├── accessibleEvent.dtd │ │ │ │ ├── accessibleEvents.dtd │ │ │ │ ├── accessibleProps.dtd │ │ │ │ ├── accessibleRelations.dtd │ │ │ │ ├── accessibleTree.dtd │ │ │ │ ├── boxModel.dtd │ │ │ │ ├── computedStyle.dtd │ │ │ │ ├── dom.dtd │ │ │ │ ├── domNode.dtd │ │ │ │ ├── jsObject.dtd │ │ │ │ ├── styleRules.dtd │ │ │ │ ├── stylesheets.dtd │ │ │ │ └── xblBindings.dtd │ │ │ ├── da/ │ │ │ │ ├── editing.dtd │ │ │ │ ├── inspector.dtd │ │ │ │ ├── inspector.properties │ │ │ │ ├── prefs.dtd │ │ │ │ ├── search/ │ │ │ │ │ ├── findFiles.dtd │ │ │ │ │ └── junkImgs.dtd │ │ │ │ ├── tasksOverlay.dtd │ │ │ │ └── viewers/ │ │ │ │ ├── boxModel.dtd │ │ │ │ ├── computedStyle.dtd │ │ │ │ ├── dom.dtd │ │ │ │ ├── domNode.dtd │ │ │ │ ├── jsObject.dtd │ │ │ │ ├── styleRules.dtd │ │ │ │ ├── stylesheets.dtd │ │ │ │ └── xblBindings.dtd │ │ │ ├── de/ │ │ │ │ ├── editing.dtd │ │ │ │ ├── inspector.dtd │ │ │ │ ├── inspector.properties │ │ │ │ ├── prefs.dtd │ │ │ │ ├── tasksOverlay.dtd │ │ │ │ ├── viewer-registry.dtd │ │ │ │ └── viewers/ │ │ │ │ ├── accessibleEvent.dtd │ │ │ │ ├── accessibleEvents.dtd │ │ │ │ ├── accessibleEvents.properties │ │ │ │ ├── accessibleEventsHandlerHelpDialog.dtd │ │ │ │ ├── accessibleProps.dtd │ │ │ │ ├── accessibleProps.properties │ │ │ │ ├── accessibleRelations.dtd │ │ │ │ ├── accessibleTree.dtd │ │ │ │ ├── accessibleTreeEvalJSDialog.dtd │ │ │ │ ├── boxModel.dtd │ │ │ │ ├── computedStyle.dtd │ │ │ │ ├── dom.dtd │ │ │ │ ├── domNode.dtd │ │ │ │ ├── jsObject.dtd │ │ │ │ ├── styleRules.dtd │ │ │ │ ├── stylesheets.dtd │ │ │ │ ├── usedFontFaces.dtd │ │ │ │ └── xblBindings.dtd │ │ │ ├── el/ │ │ │ │ ├── editing.dtd │ │ │ │ ├── inspector.dtd │ │ │ │ ├── inspector.properties │ │ │ │ ├── prefs.dtd │ │ │ │ ├── tasksOverlay.dtd │ │ │ │ ├── viewer-registry.dtd │ │ │ │ └── viewers/ │ │ │ │ ├── accessibleEvent.dtd │ │ │ │ ├── accessibleEvents.dtd │ │ │ │ ├── accessibleEvents.properties │ │ │ │ ├── accessibleEventsHandlerHelpDialog.dtd │ │ │ │ ├── accessibleProps.dtd │ │ │ │ ├── accessibleProps.properties │ │ │ │ ├── accessibleRelations.dtd │ │ │ │ ├── accessibleTree.dtd │ │ │ │ ├── accessibleTreeEvalJSDialog.dtd │ │ │ │ ├── boxModel.dtd │ │ │ │ ├── computedStyle.dtd │ │ │ │ ├── dom.dtd │ │ │ │ ├── domNode.dtd │ │ │ │ ├── jsObject.dtd │ │ │ │ ├── styleRules.dtd │ │ │ │ ├── stylesheets.dtd │ │ │ │ ├── usedFontFaces.dtd │ │ │ │ └── xblBindings.dtd │ │ │ ├── en-GB/ │ │ │ │ ├── editing.dtd │ │ │ │ ├── inspector.dtd │ │ │ │ ├── inspector.properties │ │ │ │ ├── prefs.dtd │ │ │ │ ├── tasksOverlay.dtd │ │ │ │ ├── viewer-registry.dtd │ │ │ │ └── viewers/ │ │ │ │ ├── accessibleEvent.dtd │ │ │ │ ├── accessibleEvents.dtd │ │ │ │ ├── accessibleEvents.properties │ │ │ │ ├── accessibleEventsHandlerHelpDialog.dtd │ │ │ │ ├── accessibleProps.dtd │ │ │ │ ├── accessibleProps.properties │ │ │ │ ├── accessibleRelations.dtd │ │ │ │ ├── accessibleTree.dtd │ │ │ │ ├── accessibleTreeEvalJSDialog.dtd │ │ │ │ ├── boxModel.dtd │ │ │ │ ├── computedStyle.dtd │ │ │ │ ├── dom.dtd │ │ │ │ ├── domNode.dtd │ │ │ │ ├── jsObject.dtd │ │ │ │ ├── styleRules.dtd │ │ │ │ ├── stylesheets.dtd │ │ │ │ ├── usedFontFaces.dtd │ │ │ │ └── xblBindings.dtd │ │ │ ├── en-US/ │ │ │ │ ├── editing.dtd │ │ │ │ ├── inspector.dtd │ │ │ │ ├── inspector.properties │ │ │ │ ├── prefs.dtd │ │ │ │ ├── tasksOverlay.dtd │ │ │ │ ├── viewer-registry.dtd │ │ │ │ └── viewers/ │ │ │ │ ├── accessibleEvent.dtd │ │ │ │ ├── accessibleEvents.dtd │ │ │ │ ├── accessibleEvents.properties │ │ │ │ ├── accessibleEventsHandlerHelpDialog.dtd │ │ │ │ ├── accessibleProps.dtd │ │ │ │ ├── accessibleProps.properties │ │ │ │ ├── accessibleRelations.dtd │ │ │ │ ├── accessibleTree.dtd │ │ │ │ ├── accessibleTreeEvalJSDialog.dtd │ │ │ │ ├── boxModel.dtd │ │ │ │ ├── computedStyle.dtd │ │ │ │ ├── dom.dtd │ │ │ │ ├── domNode.dtd │ │ │ │ ├── jsObject.dtd │ │ │ │ ├── styleRules.dtd │ │ │ │ ├── stylesheets.dtd │ │ │ │ ├── usedFontFaces.dtd │ │ │ │ └── xblBindings.dtd │ │ │ ├── fi/ │ │ │ │ ├── editing.dtd │ │ │ │ ├── inspector.dtd │ │ │ │ ├── inspector.properties │ │ │ │ ├── prefs.dtd │ │ │ │ ├── tasksOverlay.dtd │ │ │ │ ├── viewer-registry.dtd │ │ │ │ └── viewers/ │ │ │ │ ├── accessibleEvent.dtd │ │ │ │ ├── accessibleEvents.dtd │ │ │ │ ├── accessibleEvents.properties │ │ │ │ ├── accessibleEventsHandlerHelpDialog.dtd │ │ │ │ ├── accessibleProps.dtd │ │ │ │ ├── accessibleProps.properties │ │ │ │ ├── accessibleRelations.dtd │ │ │ │ ├── accessibleTree.dtd │ │ │ │ ├── accessibleTreeEvalJSDialog.dtd │ │ │ │ ├── boxModel.dtd │ │ │ │ ├── computedStyle.dtd │ │ │ │ ├── dom.dtd │ │ │ │ ├── domNode.dtd │ │ │ │ ├── jsObject.dtd │ │ │ │ ├── styleRules.dtd │ │ │ │ ├── stylesheets.dtd │ │ │ │ ├── usedFontFaces.dtd │ │ │ │ └── xblBindings.dtd │ │ │ ├── fr/ │ │ │ │ ├── editing.dtd │ │ │ │ ├── inspector.dtd │ │ │ │ ├── inspector.properties │ │ │ │ ├── prefs.dtd │ │ │ │ ├── tasksOverlay.dtd │ │ │ │ ├── viewer-registry.dtd │ │ │ │ └── viewers/ │ │ │ │ ├── accessibleEvent.dtd │ │ │ │ ├── accessibleEvents.dtd │ │ │ │ ├── accessibleEvents.properties │ │ │ │ ├── accessibleEventsHandlerHelpDialog.dtd │ │ │ │ ├── accessibleProps.dtd │ │ │ │ ├── accessibleProps.properties │ │ │ │ ├── accessibleRelations.dtd │ │ │ │ ├── accessibleTree.dtd │ │ │ │ ├── accessibleTreeEvalJSDialog.dtd │ │ │ │ ├── boxModel.dtd │ │ │ │ ├── computedStyle.dtd │ │ │ │ ├── dom.dtd │ │ │ │ ├── domNode.dtd │ │ │ │ ├── jsObject.dtd │ │ │ │ ├── styleRules.dtd │ │ │ │ ├── stylesheets.dtd │ │ │ │ └── xblBindings.dtd │ │ │ ├── ga-IE/ │ │ │ │ ├── editing.dtd │ │ │ │ ├── inspector.dtd │ │ │ │ ├── inspector.properties │ │ │ │ ├── prefs.dtd │ │ │ │ ├── search/ │ │ │ │ │ ├── findFiles.dtd │ │ │ │ │ └── junkImgs.dtd │ │ │ │ ├── tasksOverlay.dtd │ │ │ │ └── viewers/ │ │ │ │ ├── boxModel.dtd │ │ │ │ ├── computedStyle.dtd │ │ │ │ ├── dom.dtd │ │ │ │ ├── domNode.dtd │ │ │ │ ├── jsObject.dtd │ │ │ │ ├── styleRules.dtd │ │ │ │ ├── stylesheets.dtd │ │ │ │ └── xblBindings.dtd │ │ │ ├── hu/ │ │ │ │ ├── editing.dtd │ │ │ │ ├── inspector.dtd │ │ │ │ ├── inspector.properties │ │ │ │ ├── prefs.dtd │ │ │ │ ├── search/ │ │ │ │ │ ├── findFiles.dtd │ │ │ │ │ └── junkImgs.dtd │ │ │ │ ├── tasksOverlay.dtd │ │ │ │ └── viewers/ │ │ │ │ ├── boxModel.dtd │ │ │ │ ├── computedStyle.dtd │ │ │ │ ├── dom.dtd │ │ │ │ ├── domNode.dtd │ │ │ │ ├── jsObject.dtd │ │ │ │ ├── styleRules.dtd │ │ │ │ ├── stylesheets.dtd │ │ │ │ └── xblBindings.dtd │ │ │ ├── jar.mn │ │ │ ├── moz.build │ │ │ ├── nb-NO/ │ │ │ │ ├── editing.dtd │ │ │ │ ├── inspector.dtd │ │ │ │ ├── inspector.properties │ │ │ │ ├── prefs.dtd │ │ │ │ ├── tasksOverlay.dtd │ │ │ │ └── viewers/ │ │ │ │ ├── accessibleEvents.dtd │ │ │ │ ├── accessibleProps.dtd │ │ │ │ ├── accessibleTree.dtd │ │ │ │ ├── boxModel.dtd │ │ │ │ ├── computedStyle.dtd │ │ │ │ ├── dom.dtd │ │ │ │ ├── domNode.dtd │ │ │ │ ├── jsObject.dtd │ │ │ │ ├── styleRules.dtd │ │ │ │ ├── stylesheets.dtd │ │ │ │ └── xblBindings.dtd │ │ │ ├── pl/ │ │ │ │ ├── editing.dtd │ │ │ │ ├── inspector.dtd │ │ │ │ ├── inspector.properties │ │ │ │ ├── prefs.dtd │ │ │ │ ├── tasksOverlay.dtd │ │ │ │ ├── viewer-registry.dtd │ │ │ │ └── viewers/ │ │ │ │ ├── accessibleEvent.dtd │ │ │ │ ├── accessibleEvents.dtd │ │ │ │ ├── accessibleEvents.properties │ │ │ │ ├── accessibleEventsHandlerHelpDialog.dtd │ │ │ │ ├── accessibleProps.dtd │ │ │ │ ├── accessibleProps.properties │ │ │ │ ├── accessibleRelations.dtd │ │ │ │ ├── accessibleTree.dtd │ │ │ │ ├── accessibleTreeEvalJSDialog.dtd │ │ │ │ ├── boxModel.dtd │ │ │ │ ├── computedStyle.dtd │ │ │ │ ├── dom.dtd │ │ │ │ ├── domNode.dtd │ │ │ │ ├── jsObject.dtd │ │ │ │ ├── styleRules.dtd │ │ │ │ ├── stylesheets.dtd │ │ │ │ ├── usedFontFaces.dtd │ │ │ │ └── xblBindings.dtd │ │ │ ├── pt-BR/ │ │ │ │ ├── editing.dtd │ │ │ │ ├── inspector.dtd │ │ │ │ ├── inspector.properties │ │ │ │ ├── prefs.dtd │ │ │ │ ├── search/ │ │ │ │ │ ├── findFiles.dtd │ │ │ │ │ └── junkImgs.dtd │ │ │ │ ├── tasksOverlay.dtd │ │ │ │ └── viewers/ │ │ │ │ ├── boxModel.dtd │ │ │ │ ├── computedStyle.dtd │ │ │ │ ├── dom.dtd │ │ │ │ ├── domNode.dtd │ │ │ │ ├── jsObject.dtd │ │ │ │ ├── styleRules.dtd │ │ │ │ ├── stylesheets.dtd │ │ │ │ └── xblBindings.dtd │ │ │ ├── ru/ │ │ │ │ ├── editing.dtd │ │ │ │ ├── inspector.dtd │ │ │ │ ├── inspector.properties │ │ │ │ ├── prefs.dtd │ │ │ │ ├── tasksOverlay.dtd │ │ │ │ ├── viewer-registry.dtd │ │ │ │ └── viewers/ │ │ │ │ ├── accessibleEvent.dtd │ │ │ │ ├── accessibleEvents.dtd │ │ │ │ ├── accessibleEvents.properties │ │ │ │ ├── accessibleEventsHandlerHelpDialog.dtd │ │ │ │ ├── accessibleProps.dtd │ │ │ │ ├── accessibleProps.properties │ │ │ │ ├── accessibleRelations.dtd │ │ │ │ ├── accessibleTree.dtd │ │ │ │ ├── accessibleTreeEvalJSDialog.dtd │ │ │ │ ├── boxModel.dtd │ │ │ │ ├── computedStyle.dtd │ │ │ │ ├── dom.dtd │ │ │ │ ├── domNode.dtd │ │ │ │ ├── jsObject.dtd │ │ │ │ ├── styleRules.dtd │ │ │ │ ├── stylesheets.dtd │ │ │ │ ├── usedFontFaces.dtd │ │ │ │ └── xblBindings.dtd │ │ │ ├── sk/ │ │ │ │ ├── editing.dtd │ │ │ │ ├── inspector.dtd │ │ │ │ ├── inspector.properties │ │ │ │ ├── prefs.dtd │ │ │ │ ├── tasksOverlay.dtd │ │ │ │ ├── viewer-registry.dtd │ │ │ │ └── viewers/ │ │ │ │ ├── accessibleEvent.dtd │ │ │ │ ├── accessibleEvents.dtd │ │ │ │ ├── accessibleEvents.properties │ │ │ │ ├── accessibleEventsHandlerHelpDialog.dtd │ │ │ │ ├── accessibleProps.dtd │ │ │ │ ├── accessibleProps.properties │ │ │ │ ├── accessibleRelations.dtd │ │ │ │ ├── accessibleTree.dtd │ │ │ │ ├── accessibleTreeEvalJSDialog.dtd │ │ │ │ ├── boxModel.dtd │ │ │ │ ├── computedStyle.dtd │ │ │ │ ├── dom.dtd │ │ │ │ ├── domNode.dtd │ │ │ │ ├── jsObject.dtd │ │ │ │ ├── styleRules.dtd │ │ │ │ ├── stylesheets.dtd │ │ │ │ ├── usedFontFaces.dtd │ │ │ │ └── xblBindings.dtd │ │ │ ├── sv-SE/ │ │ │ │ ├── editing.dtd │ │ │ │ ├── inspector.dtd │ │ │ │ ├── inspector.properties │ │ │ │ ├── prefs.dtd │ │ │ │ ├── tasksOverlay.dtd │ │ │ │ ├── viewer-registry.dtd │ │ │ │ └── viewers/ │ │ │ │ ├── accessibleEvent.dtd │ │ │ │ ├── accessibleEvents.dtd │ │ │ │ ├── accessibleEvents.properties │ │ │ │ ├── accessibleEventsHandlerHelpDialog.dtd │ │ │ │ ├── accessibleProps.dtd │ │ │ │ ├── accessibleProps.properties │ │ │ │ ├── accessibleRelations.dtd │ │ │ │ ├── accessibleTree.dtd │ │ │ │ ├── accessibleTreeEvalJSDialog.dtd │ │ │ │ ├── boxModel.dtd │ │ │ │ ├── computedStyle.dtd │ │ │ │ ├── dom.dtd │ │ │ │ ├── domNode.dtd │ │ │ │ ├── jsObject.dtd │ │ │ │ ├── styleRules.dtd │ │ │ │ ├── stylesheets.dtd │ │ │ │ ├── usedFontFaces.dtd │ │ │ │ └── xblBindings.dtd │ │ │ ├── zh-CN/ │ │ │ │ ├── editing.dtd │ │ │ │ ├── inspector.dtd │ │ │ │ ├── inspector.properties │ │ │ │ ├── prefs.dtd │ │ │ │ ├── search/ │ │ │ │ │ ├── findFiles.dtd │ │ │ │ │ └── junkImgs.dtd │ │ │ │ ├── tasksOverlay.dtd │ │ │ │ └── viewers/ │ │ │ │ ├── boxModel.dtd │ │ │ │ ├── computedStyle.dtd │ │ │ │ ├── dom.dtd │ │ │ │ ├── domNode.dtd │ │ │ │ ├── jsObject.dtd │ │ │ │ ├── styleRules.dtd │ │ │ │ ├── stylesheets.dtd │ │ │ │ └── xblBindings.dtd │ │ │ └── zh-TW/ │ │ │ ├── editing.dtd │ │ │ ├── inspector.dtd │ │ │ ├── inspector.properties │ │ │ ├── prefs.dtd │ │ │ ├── search/ │ │ │ │ ├── findFiles.dtd │ │ │ │ └── junkImgs.dtd │ │ │ ├── tasksOverlay.dtd │ │ │ └── viewers/ │ │ │ ├── boxModel.dtd │ │ │ ├── computedStyle.dtd │ │ │ ├── dom.dtd │ │ │ ├── domNode.dtd │ │ │ ├── jsObject.dtd │ │ │ ├── styleRules.dtd │ │ │ ├── stylesheets.dtd │ │ │ └── xblBindings.dtd │ │ ├── moz.build │ │ └── skin/ │ │ ├── classic/ │ │ │ ├── inspector.css │ │ │ ├── inspectorWindow.css │ │ │ ├── panelset.css │ │ │ ├── sidebar.css │ │ │ ├── titledSplitter.css │ │ │ └── viewers/ │ │ │ ├── accessibleEvent/ │ │ │ │ └── accessibleEvent.css │ │ │ ├── accessibleEvents/ │ │ │ │ └── accessibleEvents.css │ │ │ ├── accessibleProps/ │ │ │ │ └── accessibleProps.css │ │ │ ├── accessibleTree/ │ │ │ │ └── accessibleTree.css │ │ │ ├── boxModel/ │ │ │ │ └── boxModel.css │ │ │ ├── dom/ │ │ │ │ ├── columnsDialog.css │ │ │ │ ├── dom.css │ │ │ │ └── findDialog.css │ │ │ ├── domNode/ │ │ │ │ └── domNode.css │ │ │ ├── styleRules/ │ │ │ │ └── styleRules.css │ │ │ └── xblBindings/ │ │ │ └── xblBindings.css │ │ └── modern/ │ │ ├── inspector.css │ │ ├── inspectorWindow.css │ │ ├── panelset.css │ │ ├── sidebar.css │ │ ├── titledSplitter.css │ │ └── viewers/ │ │ ├── accessibleEvent/ │ │ │ └── accessibleEvent.css │ │ ├── accessibleEvents/ │ │ │ └── accessibleEvents.css │ │ ├── accessibleProps/ │ │ │ └── accessibleProps.css │ │ ├── accessibleTree/ │ │ │ └── accessibleTree.css │ │ ├── boxModel/ │ │ │ └── boxModel.css │ │ ├── dom/ │ │ │ ├── columnsDialog.css │ │ │ ├── dom.css │ │ │ └── findDialog.css │ │ ├── domNode/ │ │ │ └── domNode.css │ │ ├── styleRules/ │ │ │ └── styleRules.css │ │ └── xblBindings/ │ │ └── xblBindings.css │ ├── markdown/ │ │ ├── Makefile.in │ │ ├── content/ │ │ │ ├── js-markdown-extra.js │ │ │ ├── markdown.js │ │ │ ├── markdown.xul │ │ │ ├── markdownOverlay.js │ │ │ └── markdownOverlay.xul │ │ ├── install.rdf │ │ ├── jar.mn │ │ ├── jar.mn.in │ │ └── moz.build │ ├── moz.build │ ├── op1/ │ │ ├── Makefile.in │ │ ├── content/ │ │ │ ├── a11yFirstStep.js │ │ │ ├── op1.js │ │ │ ├── op1.xul │ │ │ ├── op1Overlay.js │ │ │ └── op1Overlay.xul │ │ ├── install.rdf │ │ ├── jar.mn │ │ ├── jar.mn.in │ │ ├── moz.build │ │ └── skin/ │ │ └── op1.css │ ├── scripteditor/ │ │ ├── Makefile.in │ │ ├── content/ │ │ │ ├── editor.js │ │ │ ├── editor.xul │ │ │ ├── scripteditor.js │ │ │ ├── scripteditor.xul │ │ │ ├── scripteditorOverlay.js │ │ │ └── scripteditorOverlay.xul │ │ ├── install.rdf │ │ ├── jar.mn.in │ │ └── skin/ │ │ ├── editor.css │ │ └── scripteditor.css │ └── svg-edit/ │ ├── Makefile.in │ ├── chrome.manifest │ ├── content/ │ │ ├── editor/ │ │ │ ├── canvg/ │ │ │ │ ├── canvg.js │ │ │ │ └── rgbcolor.js │ │ │ ├── contextmenu/ │ │ │ │ └── jquery.contextMenu.js │ │ │ ├── embedapi.html │ │ │ ├── embedapi.js │ │ │ ├── extensions/ │ │ │ │ ├── ext-arrows.js │ │ │ │ ├── ext-closepath.js │ │ │ │ ├── ext-connector.js │ │ │ │ ├── ext-eyedropper.js │ │ │ │ ├── ext-foreignobject.js │ │ │ │ ├── ext-grid.js │ │ │ │ ├── ext-helloworld.js │ │ │ │ ├── ext-imagelib.js │ │ │ │ ├── ext-imagelib.xml │ │ │ │ ├── ext-markers.js │ │ │ │ ├── ext-server_opensave.js │ │ │ │ ├── ext-shapes.js │ │ │ │ ├── ext-shapes.xml │ │ │ │ ├── eyedropper-icon.xml │ │ │ │ ├── fileopen.php │ │ │ │ ├── filesave.php │ │ │ │ ├── foreignobject-icons.xml │ │ │ │ ├── grid-icon.xml │ │ │ │ ├── helloworld-icon.xml │ │ │ │ ├── imagelib/ │ │ │ │ │ └── index.html │ │ │ │ ├── markers-icons.xml │ │ │ │ └── shapelib/ │ │ │ │ ├── animal.json │ │ │ │ ├── arrow.json │ │ │ │ ├── dialog_balloon.json │ │ │ │ ├── electronics.json │ │ │ │ ├── flowchart.json │ │ │ │ ├── game.json │ │ │ │ ├── math.json │ │ │ │ ├── misc.json │ │ │ │ ├── music.json │ │ │ │ ├── object.json │ │ │ │ └── symbol.json │ │ │ ├── images/ │ │ │ │ ├── README.txt │ │ │ │ └── svg_edit_icons.svgz │ │ │ ├── jgraduate/ │ │ │ │ ├── LICENSE │ │ │ │ ├── README │ │ │ │ ├── css/ │ │ │ │ │ ├── jGraduate-0.2.0.css │ │ │ │ │ ├── jPicker-1.0.12.css │ │ │ │ │ ├── jPicker-1.0.9.css │ │ │ │ │ └── jgraduate.css │ │ │ │ └── jquery.jgraduate.js │ │ │ ├── jquery.js │ │ │ ├── js-hotkeys/ │ │ │ │ └── README.md │ │ │ ├── locale/ │ │ │ │ ├── README.txt │ │ │ │ ├── lang.af.js │ │ │ │ ├── lang.ar.js │ │ │ │ ├── lang.az.js │ │ │ │ ├── lang.be.js │ │ │ │ ├── lang.bg.js │ │ │ │ ├── lang.ca.js │ │ │ │ ├── lang.cs.js │ │ │ │ ├── lang.cy.js │ │ │ │ ├── lang.da.js │ │ │ │ ├── lang.de.js │ │ │ │ ├── lang.el.js │ │ │ │ ├── lang.en.js │ │ │ │ ├── lang.es.js │ │ │ │ ├── lang.et.js │ │ │ │ ├── lang.fa.js │ │ │ │ ├── lang.fi.js │ │ │ │ ├── lang.fr.js │ │ │ │ ├── lang.fy.js │ │ │ │ ├── lang.ga.js │ │ │ │ ├── lang.gl.js │ │ │ │ ├── lang.he.js │ │ │ │ ├── lang.hi.js │ │ │ │ ├── lang.hr.js │ │ │ │ ├── lang.hu.js │ │ │ │ ├── lang.hy.js │ │ │ │ ├── lang.id.js │ │ │ │ ├── lang.is.js │ │ │ │ ├── lang.it.js │ │ │ │ ├── lang.ja.js │ │ │ │ ├── lang.ko.js │ │ │ │ ├── lang.lt.js │ │ │ │ ├── lang.lv.js │ │ │ │ ├── lang.mk.js │ │ │ │ ├── lang.ms.js │ │ │ │ ├── lang.mt.js │ │ │ │ ├── lang.nl.js │ │ │ │ ├── lang.no.js │ │ │ │ ├── lang.pl.js │ │ │ │ ├── lang.pt-BR.js │ │ │ │ ├── lang.pt-PT.js │ │ │ │ ├── lang.ro.js │ │ │ │ ├── lang.ru.js │ │ │ │ ├── lang.sk.js │ │ │ │ ├── lang.sl.js │ │ │ │ ├── lang.sq.js │ │ │ │ ├── lang.sr.js │ │ │ │ ├── lang.sv.js │ │ │ │ ├── lang.sw.js │ │ │ │ ├── lang.th.js │ │ │ │ ├── lang.tl.js │ │ │ │ ├── lang.tr.js │ │ │ │ ├── lang.uk.js │ │ │ │ ├── lang.vi.js │ │ │ │ ├── lang.yi.js │ │ │ │ ├── lang.zh-CN.js │ │ │ │ ├── lang.zh-HK.js │ │ │ │ ├── lang.zh-TW.js │ │ │ │ ├── lang.zh.js │ │ │ │ └── locale.js │ │ │ ├── spinbtn/ │ │ │ │ ├── JQuerySpinBtn.css │ │ │ │ └── JQuerySpinBtn.js │ │ │ ├── svg-editor.css │ │ │ ├── svg-editor.html │ │ │ ├── svg-editor.js │ │ │ ├── svgcanvas.js │ │ │ └── svgicons/ │ │ │ └── jquery.svgicons.js │ │ ├── svg-edit-overlay.css │ │ ├── svg-edit-overlay.js │ │ ├── svg-edit-overlay.xul │ │ ├── svg-edit.js │ │ └── svg-edit.xul │ ├── handlers.js │ ├── install.rdf │ ├── jar.mn │ └── moz.build ├── installer/ │ ├── Makefile.in │ ├── linux/ │ │ ├── bluegriffon.desktop │ │ └── template.desktop │ ├── package-manifest.in │ ├── removed-files.in │ └── windows/ │ ├── Makefile.in │ ├── app.tag.in │ ├── moz.build │ └── nsis/ │ ├── defines.nsi.in │ ├── installer.nsi │ ├── shared.nsh │ ├── uninstaller.nsi │ └── updater_append.ini ├── langpacks/ │ ├── Makefile.in │ ├── cs/ │ │ ├── bluegriffon/ │ │ │ └── chrome.manifest │ │ ├── browser/ │ │ │ ├── chrome/ │ │ │ │ ├── cs/ │ │ │ │ │ └── locale/ │ │ │ │ │ ├── branding/ │ │ │ │ │ │ ├── brand.dtd │ │ │ │ │ │ ├── brand.properties │ │ │ │ │ │ └── browserconfig.properties │ │ │ │ │ ├── browser/ │ │ │ │ │ │ ├── aboutAccounts.dtd │ │ │ │ │ │ ├── aboutCertError.dtd │ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ │ ├── aboutHealthReport.dtd │ │ │ │ │ │ ├── aboutHome.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.properties │ │ │ │ │ │ ├── aboutRobots.dtd │ │ │ │ │ │ ├── aboutSearchReset.dtd │ │ │ │ │ │ ├── aboutSessionRestore.dtd │ │ │ │ │ │ ├── aboutSyncTabs.dtd │ │ │ │ │ │ ├── aboutTabCrashed.dtd │ │ │ │ │ │ ├── accounts.properties │ │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ │ ├── baseMenuOverlay.dtd │ │ │ │ │ │ ├── bookmarks.html │ │ │ │ │ │ ├── browser.dtd │ │ │ │ │ │ ├── browser.properties │ │ │ │ │ │ ├── customizableui/ │ │ │ │ │ │ │ └── customizableWidgets.properties │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ ├── app-manager.dtd │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ ├── profiler.dtd │ │ │ │ │ │ │ ├── profiler.properties │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ ├── styleinspector.properties │ │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ │ ├── timeline.dtd │ │ │ │ │ │ │ ├── timeline.properties │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ │ └── settingsChange.dtd │ │ │ │ │ │ ├── engineManager.dtd │ │ │ │ │ │ ├── engineManager.properties │ │ │ │ │ │ ├── feeds/ │ │ │ │ │ │ │ ├── subscribe.dtd │ │ │ │ │ │ │ └── subscribe.properties │ │ │ │ │ │ ├── lightweightThemes.properties │ │ │ │ │ │ ├── loop/ │ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ │ ├── migration/ │ │ │ │ │ │ │ ├── migration.dtd │ │ │ │ │ │ │ └── migration.properties │ │ │ │ │ │ ├── netError.dtd │ │ │ │ │ │ ├── newTab.dtd │ │ │ │ │ │ ├── newTab.properties │ │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ │ ├── pageInfo.dtd │ │ │ │ │ │ ├── pageInfo.properties │ │ │ │ │ │ ├── places/ │ │ │ │ │ │ │ ├── bookmarkProperties.properties │ │ │ │ │ │ │ ├── editBookmarkOverlay.dtd │ │ │ │ │ │ │ ├── moveBookmarks.dtd │ │ │ │ │ │ │ ├── places.dtd │ │ │ │ │ │ │ └── places.properties │ │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ │ ├── aboutPermissions.dtd │ │ │ │ │ │ │ ├── aboutPermissions.properties │ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ │ ├── applicationManager.dtd │ │ │ │ │ │ │ ├── applicationManager.properties │ │ │ │ │ │ │ ├── applications.dtd │ │ │ │ │ │ │ ├── blocklists.dtd │ │ │ │ │ │ │ ├── colors.dtd │ │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ │ ├── containers.dtd │ │ │ │ │ │ │ ├── containers.properties │ │ │ │ │ │ │ ├── content.dtd │ │ │ │ │ │ │ ├── cookies.dtd │ │ │ │ │ │ │ ├── donottrack.dtd │ │ │ │ │ │ │ ├── fonts.dtd │ │ │ │ │ │ │ ├── languages.dtd │ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ │ ├── permissions.dtd │ │ │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ │ ├── privacy.dtd │ │ │ │ │ │ │ ├── search.dtd │ │ │ │ │ │ │ ├── security.dtd │ │ │ │ │ │ │ ├── selectBookmark.dtd │ │ │ │ │ │ │ ├── siteDataSettings.dtd │ │ │ │ │ │ │ ├── sync.dtd │ │ │ │ │ │ │ ├── tabs.dtd │ │ │ │ │ │ │ └── translation.dtd │ │ │ │ │ │ ├── quitDialog.properties │ │ │ │ │ │ ├── safeMode.dtd │ │ │ │ │ │ ├── safebrowsing/ │ │ │ │ │ │ │ ├── phishing-afterload-warning-message.dtd │ │ │ │ │ │ │ └── report-phishing.dtd │ │ │ │ │ │ ├── sanitize.dtd │ │ │ │ │ │ ├── search.properties │ │ │ │ │ │ ├── searchbar.dtd │ │ │ │ │ │ ├── searchplugins/ │ │ │ │ │ │ │ ├── ddg.xml │ │ │ │ │ │ │ ├── google-nocodes.xml │ │ │ │ │ │ │ ├── google.xml │ │ │ │ │ │ │ ├── heureka-cz.xml │ │ │ │ │ │ │ ├── list.json │ │ │ │ │ │ │ ├── mapy-cz.xml │ │ │ │ │ │ │ ├── seznam-cz.xml │ │ │ │ │ │ │ └── wikipedia-cz.xml │ │ │ │ │ │ ├── setDesktopBackground.dtd │ │ │ │ │ │ ├── shellservice.properties │ │ │ │ │ │ ├── sitePermissions.properties │ │ │ │ │ │ ├── syncBrand.dtd │ │ │ │ │ │ ├── syncCustomize.dtd │ │ │ │ │ │ ├── syncGenericChange.properties │ │ │ │ │ │ ├── syncKey.dtd │ │ │ │ │ │ ├── syncProgress.dtd │ │ │ │ │ │ ├── syncQuota.dtd │ │ │ │ │ │ ├── syncQuota.properties │ │ │ │ │ │ ├── syncSetup.dtd │ │ │ │ │ │ ├── syncSetup.properties │ │ │ │ │ │ ├── tabbrowser.dtd │ │ │ │ │ │ ├── tabbrowser.properties │ │ │ │ │ │ ├── tabview.properties │ │ │ │ │ │ ├── taskbar.properties │ │ │ │ │ │ ├── translation.dtd │ │ │ │ │ │ ├── translation.properties │ │ │ │ │ │ └── webrtcIndicator.properties │ │ │ │ │ ├── browser-region/ │ │ │ │ │ │ └── region.properties │ │ │ │ │ ├── cs/ │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── client/ │ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ │ ├── aboutdebugging.dtd │ │ │ │ │ │ │ │ ├── aboutdebugging.properties │ │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ │ ├── boxmodel.properties │ │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ │ ├── components.properties │ │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ │ ├── dom.properties │ │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ │ ├── filterwidget.dtd │ │ │ │ │ │ │ │ ├── filterwidget.properties │ │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ │ ├── font-inspector.properties │ │ │ │ │ │ │ │ ├── graphs.properties │ │ │ │ │ │ │ │ ├── har.properties │ │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ │ ├── jit-optimizations.properties │ │ │ │ │ │ │ │ ├── jsonview.properties │ │ │ │ │ │ │ │ ├── layout.properties │ │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ │ ├── markers.properties │ │ │ │ │ │ │ │ ├── memory.properties │ │ │ │ │ │ │ │ ├── menus.properties │ │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ │ ├── performance.dtd │ │ │ │ │ │ │ │ ├── performance.properties │ │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ │ ├── promisedebugger.dtd │ │ │ │ │ │ │ │ ├── promisedebugger.properties │ │ │ │ │ │ │ │ ├── responsive.properties │ │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ │ ├── startup.properties │ │ │ │ │ │ │ │ ├── storage.dtd │ │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ │ └── shared/ │ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ │ └── formautofill.properties │ │ │ │ │ ├── feedback/ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ └── main.properties │ │ │ │ │ └── pdfviewer/ │ │ │ │ │ ├── chrome.properties │ │ │ │ │ └── viewer.properties │ │ │ │ └── cs.manifest │ │ │ ├── chrome.manifest │ │ │ ├── crashreporter-override.ini │ │ │ ├── defaults/ │ │ │ │ ├── preferences/ │ │ │ │ │ └── firefox-l10n.js │ │ │ │ └── profile/ │ │ │ │ ├── bookmarks.html │ │ │ │ ├── chrome/ │ │ │ │ │ ├── userChrome-example.css │ │ │ │ │ └── userContent-example.css │ │ │ │ ├── localstore.rdf │ │ │ │ └── mimeTypes.rdf │ │ │ ├── features/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── firefox@getpocket.com/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── cs/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── cs/ │ │ │ │ │ │ └── pocket.properties │ │ │ │ │ └── cs.manifest │ │ │ │ ├── loop@mozilla.org/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── cs/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── cs/ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ └── cs.manifest │ │ │ │ └── presentation@mozilla.org/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── cs/ │ │ │ │ │ └── locale/ │ │ │ │ │ └── cs/ │ │ │ │ │ └── presentation.properties │ │ │ │ └── cs.manifest │ │ │ └── searchplugins/ │ │ │ ├── google.xml │ │ │ ├── heureka-cz.xml │ │ │ ├── jyxo-cz.xml │ │ │ ├── seznam-cz.xml │ │ │ ├── slunecnice-cz.xml │ │ │ └── wikipedia-cz.xml │ │ ├── chrome/ │ │ │ ├── cs/ │ │ │ │ └── locale/ │ │ │ │ └── cs/ │ │ │ │ ├── alerts/ │ │ │ │ │ ├── alert.dtd │ │ │ │ │ ├── alert.properties │ │ │ │ │ └── notificationNames.properties │ │ │ │ ├── autoconfig/ │ │ │ │ │ └── autoconfig.properties │ │ │ │ ├── cookie/ │ │ │ │ │ ├── cookieAcceptDialog.dtd │ │ │ │ │ └── cookieAcceptDialog.properties │ │ │ │ ├── formautofill/ │ │ │ │ │ └── requestAutocomplete.dtd │ │ │ │ ├── global/ │ │ │ │ │ ├── AccessFu.properties │ │ │ │ │ ├── about.dtd │ │ │ │ │ ├── aboutAbout.dtd │ │ │ │ │ ├── aboutNetworking.dtd │ │ │ │ │ ├── aboutProfiles.dtd │ │ │ │ │ ├── aboutProfiles.properties │ │ │ │ │ ├── aboutReader.properties │ │ │ │ │ ├── aboutRights.dtd │ │ │ │ │ ├── aboutRights.properties │ │ │ │ │ ├── aboutServiceWorkers.dtd │ │ │ │ │ ├── aboutServiceWorkers.properties │ │ │ │ │ ├── aboutSupport.dtd │ │ │ │ │ ├── aboutSupport.properties │ │ │ │ │ ├── aboutTelemetry.dtd │ │ │ │ │ ├── aboutTelemetry.properties │ │ │ │ │ ├── aboutWebrtc.properties │ │ │ │ │ ├── actions.dtd │ │ │ │ │ ├── appPicker.dtd │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ ├── autocomplete.properties │ │ │ │ │ ├── brand.dtd │ │ │ │ │ ├── browser.properties │ │ │ │ │ ├── charsetMenu.dtd │ │ │ │ │ ├── charsetMenu.properties │ │ │ │ │ ├── charsetOverlay.dtd │ │ │ │ │ ├── charsetTitles.properties │ │ │ │ │ ├── commonDialog.dtd │ │ │ │ │ ├── commonDialogs.properties │ │ │ │ │ ├── config.dtd │ │ │ │ │ ├── config.properties │ │ │ │ │ ├── console.dtd │ │ │ │ │ ├── console.properties │ │ │ │ │ ├── contentAreaCommands.properties │ │ │ │ │ ├── crashes.dtd │ │ │ │ │ ├── crashes.properties │ │ │ │ │ ├── css.properties │ │ │ │ │ ├── customizeCharset.dtd │ │ │ │ │ ├── customizeToolbar.dtd │ │ │ │ │ ├── customizeToolbar.properties │ │ │ │ │ ├── dateFormat.properties │ │ │ │ │ ├── datetimepicker.dtd │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ ├── dialog.properties │ │ │ │ │ ├── dialogOverlay.dtd │ │ │ │ │ ├── dom/ │ │ │ │ │ │ └── dom.properties │ │ │ │ │ ├── downloadProgress.properties │ │ │ │ │ ├── editMenuOverlay.dtd │ │ │ │ │ ├── extensions.properties │ │ │ │ │ ├── fallbackMenubar.properties │ │ │ │ │ ├── filefield.properties │ │ │ │ │ ├── filepicker.dtd │ │ │ │ │ ├── filepicker.properties │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── findbar.properties │ │ │ │ │ ├── finddialog.dtd │ │ │ │ │ ├── finddialog.properties │ │ │ │ │ ├── global-strres.properties │ │ │ │ │ ├── global.dtd │ │ │ │ │ ├── globalKeys.dtd │ │ │ │ │ ├── headsUpDisplay.properties │ │ │ │ │ ├── intl.css │ │ │ │ │ ├── intl.properties │ │ │ │ │ ├── keys.properties │ │ │ │ │ ├── languageNames.properties │ │ │ │ │ ├── layout/ │ │ │ │ │ │ ├── HtmlForm.properties │ │ │ │ │ │ ├── MediaDocument.properties │ │ │ │ │ │ ├── htmlparser.properties │ │ │ │ │ │ └── xmlparser.properties │ │ │ │ │ ├── layout_errors.properties │ │ │ │ │ ├── mathml/ │ │ │ │ │ │ └── mathml.properties │ │ │ │ │ ├── mozilla.dtd │ │ │ │ │ ├── narrate.properties │ │ │ │ │ ├── netError.dtd │ │ │ │ │ ├── netErrorApp.dtd │ │ │ │ │ ├── notification.dtd │ │ │ │ │ ├── nsWebBrowserPersist.properties │ │ │ │ │ ├── plugins.properties │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ ├── printPageSetup.dtd │ │ │ │ │ ├── printPreview.dtd │ │ │ │ │ ├── printPreviewProgress.dtd │ │ │ │ │ ├── printProgress.dtd │ │ │ │ │ ├── printdialog.dtd │ │ │ │ │ ├── printdialog.properties │ │ │ │ │ ├── printing.properties │ │ │ │ │ ├── printjoboptions.dtd │ │ │ │ │ ├── regionNames.properties │ │ │ │ │ ├── resetProfile.dtd │ │ │ │ │ ├── resetProfile.properties │ │ │ │ │ ├── search/ │ │ │ │ │ │ └── search.properties │ │ │ │ │ ├── security/ │ │ │ │ │ │ ├── caps.properties │ │ │ │ │ │ ├── csp.properties │ │ │ │ │ │ └── security.properties │ │ │ │ │ ├── storage.properties │ │ │ │ │ ├── svg/ │ │ │ │ │ │ └── svg.properties │ │ │ │ │ ├── textcontext.dtd │ │ │ │ │ ├── tree.dtd │ │ │ │ │ ├── videocontrols.dtd │ │ │ │ │ ├── viewSource.dtd │ │ │ │ │ ├── viewSource.properties │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ ├── webapps.properties │ │ │ │ │ ├── wizard.dtd │ │ │ │ │ ├── wizard.properties │ │ │ │ │ ├── xbl.properties │ │ │ │ │ ├── xml/ │ │ │ │ │ │ └── prettyprint.dtd │ │ │ │ │ ├── xpinstall/ │ │ │ │ │ │ └── xpinstall.properties │ │ │ │ │ ├── xslt/ │ │ │ │ │ │ └── xslt.properties │ │ │ │ │ └── xul.properties │ │ │ │ ├── global-platform/ │ │ │ │ │ ├── mac/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ ├── unix/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ └── win/ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ ├── intl.properties │ │ │ │ │ └── platformKeys.properties │ │ │ │ ├── global-region/ │ │ │ │ │ └── region.properties │ │ │ │ ├── mozapps/ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ ├── settingsChange.dtd │ │ │ │ │ │ ├── unknownContentType.dtd │ │ │ │ │ │ └── unknownContentType.properties │ │ │ │ │ ├── extensions/ │ │ │ │ │ │ ├── about.dtd │ │ │ │ │ │ ├── blocklist.dtd │ │ │ │ │ │ ├── extensions.dtd │ │ │ │ │ │ ├── extensions.properties │ │ │ │ │ │ ├── newaddon.dtd │ │ │ │ │ │ ├── newaddon.properties │ │ │ │ │ │ ├── selectAddons.dtd │ │ │ │ │ │ ├── selectAddons.properties │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── handling/ │ │ │ │ │ │ ├── handling.dtd │ │ │ │ │ │ └── handling.properties │ │ │ │ │ ├── plugins/ │ │ │ │ │ │ ├── plugins.dtd │ │ │ │ │ │ └── plugins.properties │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ ├── changemp.dtd │ │ │ │ │ │ ├── ocsp.dtd │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ └── removemp.dtd │ │ │ │ │ ├── profile/ │ │ │ │ │ │ ├── createProfileWizard.dtd │ │ │ │ │ │ ├── profileSelection.dtd │ │ │ │ │ │ └── profileSelection.properties │ │ │ │ │ ├── update/ │ │ │ │ │ │ ├── history.dtd │ │ │ │ │ │ ├── updates.dtd │ │ │ │ │ │ └── updates.properties │ │ │ │ │ └── xpinstall/ │ │ │ │ │ ├── xpinstallConfirm.dtd │ │ │ │ │ └── xpinstallConfirm.properties │ │ │ │ ├── necko/ │ │ │ │ │ └── necko.properties │ │ │ │ ├── passwordmgr/ │ │ │ │ │ ├── passwordManager.dtd │ │ │ │ │ └── passwordmgr.properties │ │ │ │ ├── pipnss/ │ │ │ │ │ ├── nsserrors.properties │ │ │ │ │ ├── pipnss.properties │ │ │ │ │ └── security.properties │ │ │ │ ├── pippki/ │ │ │ │ │ ├── certManager.dtd │ │ │ │ │ ├── deviceManager.dtd │ │ │ │ │ ├── pippki.dtd │ │ │ │ │ ├── pippki.properties │ │ │ │ │ └── validation.dtd │ │ │ │ ├── places/ │ │ │ │ │ └── places.properties │ │ │ │ ├── pluginproblem/ │ │ │ │ │ └── pluginproblem.dtd │ │ │ │ └── services/ │ │ │ │ ├── errors.properties │ │ │ │ └── sync.properties │ │ │ └── cs.manifest │ │ ├── chrome.manifest │ │ └── install.rdf │ ├── de/ │ │ ├── bluegriffon/ │ │ │ └── chrome.manifest │ │ ├── browser/ │ │ │ ├── chrome/ │ │ │ │ ├── de/ │ │ │ │ │ └── locale/ │ │ │ │ │ ├── branding/ │ │ │ │ │ │ ├── brand.dtd │ │ │ │ │ │ ├── brand.properties │ │ │ │ │ │ └── browserconfig.properties │ │ │ │ │ ├── browser/ │ │ │ │ │ │ ├── aboutAccounts.dtd │ │ │ │ │ │ ├── aboutCertError.dtd │ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ │ ├── aboutHealthReport.dtd │ │ │ │ │ │ ├── aboutHome.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.properties │ │ │ │ │ │ ├── aboutRobots.dtd │ │ │ │ │ │ ├── aboutSearchReset.dtd │ │ │ │ │ │ ├── aboutSessionRestore.dtd │ │ │ │ │ │ ├── aboutSyncTabs.dtd │ │ │ │ │ │ ├── aboutTabCrashed.dtd │ │ │ │ │ │ ├── accounts.properties │ │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ │ ├── baseMenuOverlay.dtd │ │ │ │ │ │ ├── bookmarks.html │ │ │ │ │ │ ├── browser.dtd │ │ │ │ │ │ ├── browser.properties │ │ │ │ │ │ ├── customizableui/ │ │ │ │ │ │ │ └── customizableWidgets.properties │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ ├── app-manager.dtd │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ ├── profiler.dtd │ │ │ │ │ │ │ ├── profiler.properties │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ ├── styleinspector.properties │ │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ │ ├── timeline.dtd │ │ │ │ │ │ │ ├── timeline.properties │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ │ └── settingsChange.dtd │ │ │ │ │ │ ├── engineManager.dtd │ │ │ │ │ │ ├── engineManager.properties │ │ │ │ │ │ ├── feeds/ │ │ │ │ │ │ │ ├── subscribe.dtd │ │ │ │ │ │ │ └── subscribe.properties │ │ │ │ │ │ ├── lightweightThemes.properties │ │ │ │ │ │ ├── loop/ │ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ │ ├── migration/ │ │ │ │ │ │ │ ├── migration.dtd │ │ │ │ │ │ │ └── migration.properties │ │ │ │ │ │ ├── netError.dtd │ │ │ │ │ │ ├── newTab.dtd │ │ │ │ │ │ ├── newTab.properties │ │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ │ ├── pageInfo.dtd │ │ │ │ │ │ ├── pageInfo.properties │ │ │ │ │ │ ├── places/ │ │ │ │ │ │ │ ├── bookmarkProperties.properties │ │ │ │ │ │ │ ├── editBookmarkOverlay.dtd │ │ │ │ │ │ │ ├── moveBookmarks.dtd │ │ │ │ │ │ │ ├── places.dtd │ │ │ │ │ │ │ └── places.properties │ │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ │ ├── aboutPermissions.dtd │ │ │ │ │ │ │ ├── aboutPermissions.properties │ │ │ │ │ │ │ ├── advanced-scripts.dtd │ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ │ ├── applicationManager.dtd │ │ │ │ │ │ │ ├── applicationManager.properties │ │ │ │ │ │ │ ├── applications.dtd │ │ │ │ │ │ │ ├── blocklists.dtd │ │ │ │ │ │ │ ├── colors.dtd │ │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ │ ├── containers.dtd │ │ │ │ │ │ │ ├── containers.properties │ │ │ │ │ │ │ ├── content.dtd │ │ │ │ │ │ │ ├── cookies.dtd │ │ │ │ │ │ │ ├── donottrack.dtd │ │ │ │ │ │ │ ├── fonts.dtd │ │ │ │ │ │ │ ├── languages.dtd │ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ │ ├── permissions.dtd │ │ │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ │ ├── privacy.dtd │ │ │ │ │ │ │ ├── search.dtd │ │ │ │ │ │ │ ├── security.dtd │ │ │ │ │ │ │ ├── selectBookmark.dtd │ │ │ │ │ │ │ ├── siteDataSettings.dtd │ │ │ │ │ │ │ ├── sync.dtd │ │ │ │ │ │ │ ├── tabs.dtd │ │ │ │ │ │ │ └── translation.dtd │ │ │ │ │ │ ├── quitDialog.properties │ │ │ │ │ │ ├── safeMode.dtd │ │ │ │ │ │ ├── safebrowsing/ │ │ │ │ │ │ │ ├── phishing-afterload-warning-message.dtd │ │ │ │ │ │ │ └── report-phishing.dtd │ │ │ │ │ │ ├── sanitize.dtd │ │ │ │ │ │ ├── search.properties │ │ │ │ │ │ ├── searchbar.dtd │ │ │ │ │ │ ├── searchplugins/ │ │ │ │ │ │ │ ├── amazondotcom-de.xml │ │ │ │ │ │ │ ├── bing.xml │ │ │ │ │ │ │ ├── ddg.xml │ │ │ │ │ │ │ ├── google-nocodes.xml │ │ │ │ │ │ │ ├── google.xml │ │ │ │ │ │ │ ├── leo_ende_de.xml │ │ │ │ │ │ │ ├── list.json │ │ │ │ │ │ │ ├── wikipedia-de.xml │ │ │ │ │ │ │ └── yahoo-de.xml │ │ │ │ │ │ ├── setDesktopBackground.dtd │ │ │ │ │ │ ├── shellservice.properties │ │ │ │ │ │ ├── sitePermissions.properties │ │ │ │ │ │ ├── syncBrand.dtd │ │ │ │ │ │ ├── syncCustomize.dtd │ │ │ │ │ │ ├── syncGenericChange.properties │ │ │ │ │ │ ├── syncKey.dtd │ │ │ │ │ │ ├── syncProgress.dtd │ │ │ │ │ │ ├── syncQuota.dtd │ │ │ │ │ │ ├── syncQuota.properties │ │ │ │ │ │ ├── syncSetup.dtd │ │ │ │ │ │ ├── syncSetup.properties │ │ │ │ │ │ ├── tabbrowser.dtd │ │ │ │ │ │ ├── tabbrowser.properties │ │ │ │ │ │ ├── tabview.properties │ │ │ │ │ │ ├── taskbar.properties │ │ │ │ │ │ ├── translation.dtd │ │ │ │ │ │ ├── translation.properties │ │ │ │ │ │ └── webrtcIndicator.properties │ │ │ │ │ ├── browser-region/ │ │ │ │ │ │ └── region.properties │ │ │ │ │ ├── de/ │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── client/ │ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ │ ├── aboutdebugging.dtd │ │ │ │ │ │ │ │ ├── aboutdebugging.properties │ │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ │ ├── boxmodel.properties │ │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ │ ├── components.properties │ │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ │ ├── dom.properties │ │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ │ ├── filterwidget.dtd │ │ │ │ │ │ │ │ ├── filterwidget.properties │ │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ │ ├── font-inspector.properties │ │ │ │ │ │ │ │ ├── graphs.properties │ │ │ │ │ │ │ │ ├── har.properties │ │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ │ ├── jit-optimizations.properties │ │ │ │ │ │ │ │ ├── jsonview.properties │ │ │ │ │ │ │ │ ├── layout.properties │ │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ │ ├── markers.properties │ │ │ │ │ │ │ │ ├── memory.properties │ │ │ │ │ │ │ │ ├── menus.properties │ │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ │ ├── performance.dtd │ │ │ │ │ │ │ │ ├── performance.properties │ │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ │ ├── promisedebugger.dtd │ │ │ │ │ │ │ │ ├── promisedebugger.properties │ │ │ │ │ │ │ │ ├── responsive.properties │ │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ │ ├── startup.properties │ │ │ │ │ │ │ │ ├── storage.dtd │ │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ │ └── shared/ │ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ │ └── formautofill.properties │ │ │ │ │ ├── feedback/ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ └── main.properties │ │ │ │ │ └── pdfviewer/ │ │ │ │ │ ├── chrome.properties │ │ │ │ │ └── viewer.properties │ │ │ │ └── de.manifest │ │ │ ├── chrome.manifest │ │ │ ├── crashreporter-override.ini │ │ │ ├── defaults/ │ │ │ │ ├── preferences/ │ │ │ │ │ └── firefox-l10n.js │ │ │ │ └── profile/ │ │ │ │ ├── bookmarks.html │ │ │ │ ├── chrome/ │ │ │ │ │ ├── userChrome-example.css │ │ │ │ │ └── userContent-example.css │ │ │ │ ├── localstore.rdf │ │ │ │ └── mimeTypes.rdf │ │ │ ├── features/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── firefox@getpocket.com/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── de/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── de/ │ │ │ │ │ │ └── pocket.properties │ │ │ │ │ └── de.manifest │ │ │ │ ├── loop@mozilla.org/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── de/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── de/ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ └── de.manifest │ │ │ │ └── presentation@mozilla.org/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── de/ │ │ │ │ │ └── locale/ │ │ │ │ │ └── de/ │ │ │ │ │ └── presentation.properties │ │ │ │ └── de.manifest │ │ │ └── searchplugins/ │ │ │ ├── amazondotcom-de.xml │ │ │ ├── bing.xml │ │ │ ├── eBay-de.xml │ │ │ ├── google.xml │ │ │ ├── leo_ende_de.xml │ │ │ ├── wikipedia-de.xml │ │ │ └── yahoo-de.xml │ │ ├── chrome/ │ │ │ ├── de/ │ │ │ │ └── locale/ │ │ │ │ └── de/ │ │ │ │ ├── alerts/ │ │ │ │ │ ├── alert.dtd │ │ │ │ │ ├── alert.properties │ │ │ │ │ └── notificationNames.properties │ │ │ │ ├── autoconfig/ │ │ │ │ │ └── autoconfig.properties │ │ │ │ ├── cookie/ │ │ │ │ │ ├── cookieAcceptDialog.dtd │ │ │ │ │ └── cookieAcceptDialog.properties │ │ │ │ ├── formautofill/ │ │ │ │ │ └── requestAutocomplete.dtd │ │ │ │ ├── global/ │ │ │ │ │ ├── AccessFu.properties │ │ │ │ │ ├── about.dtd │ │ │ │ │ ├── aboutAbout.dtd │ │ │ │ │ ├── aboutNetworking.dtd │ │ │ │ │ ├── aboutProfiles.dtd │ │ │ │ │ ├── aboutProfiles.properties │ │ │ │ │ ├── aboutReader.properties │ │ │ │ │ ├── aboutRights.dtd │ │ │ │ │ ├── aboutRights.properties │ │ │ │ │ ├── aboutServiceWorkers.dtd │ │ │ │ │ ├── aboutServiceWorkers.properties │ │ │ │ │ ├── aboutSupport.dtd │ │ │ │ │ ├── aboutSupport.properties │ │ │ │ │ ├── aboutTelemetry.dtd │ │ │ │ │ ├── aboutTelemetry.properties │ │ │ │ │ ├── aboutWebrtc.properties │ │ │ │ │ ├── actions.dtd │ │ │ │ │ ├── appPicker.dtd │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ ├── autocomplete.properties │ │ │ │ │ ├── brand.dtd │ │ │ │ │ ├── browser.properties │ │ │ │ │ ├── charsetMenu.dtd │ │ │ │ │ ├── charsetMenu.properties │ │ │ │ │ ├── charsetOverlay.dtd │ │ │ │ │ ├── charsetTitles.properties │ │ │ │ │ ├── commonDialog.dtd │ │ │ │ │ ├── commonDialogs.properties │ │ │ │ │ ├── config.dtd │ │ │ │ │ ├── config.properties │ │ │ │ │ ├── console.dtd │ │ │ │ │ ├── console.properties │ │ │ │ │ ├── contentAreaCommands.properties │ │ │ │ │ ├── crashes.dtd │ │ │ │ │ ├── crashes.properties │ │ │ │ │ ├── css.properties │ │ │ │ │ ├── customizeCharset.dtd │ │ │ │ │ ├── customizeToolbar.dtd │ │ │ │ │ ├── customizeToolbar.properties │ │ │ │ │ ├── dateFormat.properties │ │ │ │ │ ├── datetimepicker.dtd │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ ├── dialog.properties │ │ │ │ │ ├── dialogOverlay.dtd │ │ │ │ │ ├── dom/ │ │ │ │ │ │ └── dom.properties │ │ │ │ │ ├── downloadProgress.properties │ │ │ │ │ ├── editMenuOverlay.dtd │ │ │ │ │ ├── extensions.properties │ │ │ │ │ ├── fallbackMenubar.properties │ │ │ │ │ ├── filefield.properties │ │ │ │ │ ├── filepicker.dtd │ │ │ │ │ ├── filepicker.properties │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── findbar.properties │ │ │ │ │ ├── finddialog.dtd │ │ │ │ │ ├── finddialog.properties │ │ │ │ │ ├── global-strres.properties │ │ │ │ │ ├── global.dtd │ │ │ │ │ ├── globalKeys.dtd │ │ │ │ │ ├── headsUpDisplay.properties │ │ │ │ │ ├── intl.css │ │ │ │ │ ├── intl.properties │ │ │ │ │ ├── keys.properties │ │ │ │ │ ├── languageNames.properties │ │ │ │ │ ├── layout/ │ │ │ │ │ │ ├── HtmlForm.properties │ │ │ │ │ │ ├── MediaDocument.properties │ │ │ │ │ │ ├── htmlparser.properties │ │ │ │ │ │ └── xmlparser.properties │ │ │ │ │ ├── layout_errors.properties │ │ │ │ │ ├── mathml/ │ │ │ │ │ │ └── mathml.properties │ │ │ │ │ ├── mozilla.dtd │ │ │ │ │ ├── narrate.properties │ │ │ │ │ ├── netError.dtd │ │ │ │ │ ├── netErrorApp.dtd │ │ │ │ │ ├── notification.dtd │ │ │ │ │ ├── nsWebBrowserPersist.properties │ │ │ │ │ ├── plugins.properties │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ ├── printPageSetup.dtd │ │ │ │ │ ├── printPreview.dtd │ │ │ │ │ ├── printPreviewProgress.dtd │ │ │ │ │ ├── printProgress.dtd │ │ │ │ │ ├── printdialog.dtd │ │ │ │ │ ├── printdialog.properties │ │ │ │ │ ├── printing.properties │ │ │ │ │ ├── printjoboptions.dtd │ │ │ │ │ ├── regionNames.properties │ │ │ │ │ ├── resetProfile.dtd │ │ │ │ │ ├── resetProfile.properties │ │ │ │ │ ├── search/ │ │ │ │ │ │ └── search.properties │ │ │ │ │ ├── security/ │ │ │ │ │ │ ├── caps.properties │ │ │ │ │ │ ├── csp.properties │ │ │ │ │ │ └── security.properties │ │ │ │ │ ├── storage.properties │ │ │ │ │ ├── svg/ │ │ │ │ │ │ └── svg.properties │ │ │ │ │ ├── textcontext.dtd │ │ │ │ │ ├── tree.dtd │ │ │ │ │ ├── videocontrols.dtd │ │ │ │ │ ├── viewSource.dtd │ │ │ │ │ ├── viewSource.properties │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ ├── webapps.properties │ │ │ │ │ ├── wizard.dtd │ │ │ │ │ ├── wizard.properties │ │ │ │ │ ├── xbl.properties │ │ │ │ │ ├── xml/ │ │ │ │ │ │ └── prettyprint.dtd │ │ │ │ │ ├── xpinstall/ │ │ │ │ │ │ └── xpinstall.properties │ │ │ │ │ ├── xslt/ │ │ │ │ │ │ └── xslt.properties │ │ │ │ │ └── xul.properties │ │ │ │ ├── global-platform/ │ │ │ │ │ ├── mac/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ ├── unix/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ └── win/ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ ├── intl.properties │ │ │ │ │ └── platformKeys.properties │ │ │ │ ├── global-region/ │ │ │ │ │ └── region.properties │ │ │ │ ├── mozapps/ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ ├── settingsChange.dtd │ │ │ │ │ │ ├── unknownContentType.dtd │ │ │ │ │ │ └── unknownContentType.properties │ │ │ │ │ ├── extensions/ │ │ │ │ │ │ ├── about.dtd │ │ │ │ │ │ ├── blocklist.dtd │ │ │ │ │ │ ├── extensions.dtd │ │ │ │ │ │ ├── extensions.properties │ │ │ │ │ │ ├── newaddon.dtd │ │ │ │ │ │ ├── newaddon.properties │ │ │ │ │ │ ├── selectAddons.dtd │ │ │ │ │ │ ├── selectAddons.properties │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── handling/ │ │ │ │ │ │ ├── handling.dtd │ │ │ │ │ │ └── handling.properties │ │ │ │ │ ├── plugins/ │ │ │ │ │ │ ├── plugins.dtd │ │ │ │ │ │ └── plugins.properties │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ ├── changemp.dtd │ │ │ │ │ │ ├── ocsp.dtd │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ └── removemp.dtd │ │ │ │ │ ├── profile/ │ │ │ │ │ │ ├── createProfileWizard.dtd │ │ │ │ │ │ ├── profileSelection.dtd │ │ │ │ │ │ └── profileSelection.properties │ │ │ │ │ ├── update/ │ │ │ │ │ │ ├── history.dtd │ │ │ │ │ │ ├── updates.dtd │ │ │ │ │ │ └── updates.properties │ │ │ │ │ └── xpinstall/ │ │ │ │ │ ├── xpinstallConfirm.dtd │ │ │ │ │ └── xpinstallConfirm.properties │ │ │ │ ├── necko/ │ │ │ │ │ └── necko.properties │ │ │ │ ├── passwordmgr/ │ │ │ │ │ ├── passwordManager.dtd │ │ │ │ │ └── passwordmgr.properties │ │ │ │ ├── pipnss/ │ │ │ │ │ ├── nsserrors.properties │ │ │ │ │ ├── pipnss.properties │ │ │ │ │ └── security.properties │ │ │ │ ├── pippki/ │ │ │ │ │ ├── certManager.dtd │ │ │ │ │ ├── deviceManager.dtd │ │ │ │ │ ├── pippki.dtd │ │ │ │ │ ├── pippki.properties │ │ │ │ │ └── validation.dtd │ │ │ │ ├── places/ │ │ │ │ │ └── places.properties │ │ │ │ ├── pluginproblem/ │ │ │ │ │ └── pluginproblem.dtd │ │ │ │ └── services/ │ │ │ │ ├── errors.properties │ │ │ │ └── sync.properties │ │ │ └── de.manifest │ │ ├── chrome.manifest │ │ └── install.rdf │ ├── en-US/ │ │ ├── bluegriffon/ │ │ │ └── chrome.manifest │ │ ├── browser/ │ │ │ ├── chrome/ │ │ │ │ ├── en-US/ │ │ │ │ │ └── locale/ │ │ │ │ │ ├── branding/ │ │ │ │ │ │ ├── brand.dtd │ │ │ │ │ │ ├── brand.properties │ │ │ │ │ │ └── browserconfig.properties │ │ │ │ │ ├── browser/ │ │ │ │ │ │ ├── aboutAccounts.dtd │ │ │ │ │ │ ├── aboutCertError.dtd │ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ │ ├── aboutHealthReport.dtd │ │ │ │ │ │ ├── aboutHome.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.properties │ │ │ │ │ │ ├── aboutRobots.dtd │ │ │ │ │ │ ├── aboutSearchReset.dtd │ │ │ │ │ │ ├── aboutSessionRestore.dtd │ │ │ │ │ │ ├── aboutSyncTabs.dtd │ │ │ │ │ │ ├── aboutTabCrashed.dtd │ │ │ │ │ │ ├── accounts.properties │ │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ │ ├── baseMenuOverlay.dtd │ │ │ │ │ │ ├── bookmarks.html │ │ │ │ │ │ ├── browser.dtd │ │ │ │ │ │ ├── browser.properties │ │ │ │ │ │ ├── customizableui/ │ │ │ │ │ │ │ └── customizableWidgets.properties │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ ├── app-manager.dtd │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ ├── profiler.dtd │ │ │ │ │ │ │ ├── profiler.properties │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ ├── styleinspector.properties │ │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ │ ├── timeline.dtd │ │ │ │ │ │ │ ├── timeline.properties │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ │ └── settingsChange.dtd │ │ │ │ │ │ ├── engineManager.dtd │ │ │ │ │ │ ├── engineManager.properties │ │ │ │ │ │ ├── feeds/ │ │ │ │ │ │ │ ├── subscribe.dtd │ │ │ │ │ │ │ └── subscribe.properties │ │ │ │ │ │ ├── lightweightThemes.properties │ │ │ │ │ │ ├── loop/ │ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ │ ├── migration/ │ │ │ │ │ │ │ ├── migration.dtd │ │ │ │ │ │ │ └── migration.properties │ │ │ │ │ │ ├── netError.dtd │ │ │ │ │ │ ├── newTab.dtd │ │ │ │ │ │ ├── newTab.properties │ │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ │ ├── pageInfo.dtd │ │ │ │ │ │ ├── pageInfo.properties │ │ │ │ │ │ ├── places/ │ │ │ │ │ │ │ ├── bookmarkProperties.properties │ │ │ │ │ │ │ ├── editBookmarkOverlay.dtd │ │ │ │ │ │ │ ├── moveBookmarks.dtd │ │ │ │ │ │ │ ├── places.dtd │ │ │ │ │ │ │ └── places.properties │ │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ │ ├── aboutPermissions.dtd │ │ │ │ │ │ │ ├── aboutPermissions.properties │ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ │ ├── applicationManager.dtd │ │ │ │ │ │ │ ├── applicationManager.properties │ │ │ │ │ │ │ ├── applications.dtd │ │ │ │ │ │ │ ├── blocklists.dtd │ │ │ │ │ │ │ ├── colors.dtd │ │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ │ ├── containers.dtd │ │ │ │ │ │ │ ├── containers.properties │ │ │ │ │ │ │ ├── content.dtd │ │ │ │ │ │ │ ├── cookies.dtd │ │ │ │ │ │ │ ├── donottrack.dtd │ │ │ │ │ │ │ ├── fonts.dtd │ │ │ │ │ │ │ ├── languages.dtd │ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ │ ├── permissions.dtd │ │ │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ │ ├── privacy.dtd │ │ │ │ │ │ │ ├── search.dtd │ │ │ │ │ │ │ ├── security.dtd │ │ │ │ │ │ │ ├── selectBookmark.dtd │ │ │ │ │ │ │ ├── siteDataSettings.dtd │ │ │ │ │ │ │ ├── sync.dtd │ │ │ │ │ │ │ ├── tabs.dtd │ │ │ │ │ │ │ └── translation.dtd │ │ │ │ │ │ ├── quitDialog.properties │ │ │ │ │ │ ├── safeMode.dtd │ │ │ │ │ │ ├── safebrowsing/ │ │ │ │ │ │ │ ├── phishing-afterload-warning-message.dtd │ │ │ │ │ │ │ └── report-phishing.dtd │ │ │ │ │ │ ├── sanitize.dtd │ │ │ │ │ │ ├── search.properties │ │ │ │ │ │ ├── searchbar.dtd │ │ │ │ │ │ ├── searchplugins/ │ │ │ │ │ │ │ ├── amazondotcom.xml │ │ │ │ │ │ │ ├── bing.xml │ │ │ │ │ │ │ ├── ddg.xml │ │ │ │ │ │ │ ├── google-nocodes.xml │ │ │ │ │ │ │ ├── google.xml │ │ │ │ │ │ │ ├── list.json │ │ │ │ │ │ │ ├── twitter.xml │ │ │ │ │ │ │ ├── wikipedia.xml │ │ │ │ │ │ │ ├── yahoo-en-CA.xml │ │ │ │ │ │ │ ├── yahoo.xml │ │ │ │ │ │ │ └── yandex-en.xml │ │ │ │ │ │ ├── setDesktopBackground.dtd │ │ │ │ │ │ ├── shellservice.properties │ │ │ │ │ │ ├── sitePermissions.properties │ │ │ │ │ │ ├── syncBrand.dtd │ │ │ │ │ │ ├── syncCustomize.dtd │ │ │ │ │ │ ├── syncGenericChange.properties │ │ │ │ │ │ ├── syncKey.dtd │ │ │ │ │ │ ├── syncProgress.dtd │ │ │ │ │ │ ├── syncQuota.dtd │ │ │ │ │ │ ├── syncQuota.properties │ │ │ │ │ │ ├── syncSetup.dtd │ │ │ │ │ │ ├── syncSetup.properties │ │ │ │ │ │ ├── tabbrowser.dtd │ │ │ │ │ │ ├── tabbrowser.properties │ │ │ │ │ │ ├── tabview.properties │ │ │ │ │ │ ├── taskbar.properties │ │ │ │ │ │ ├── translation.dtd │ │ │ │ │ │ ├── translation.properties │ │ │ │ │ │ └── webrtcIndicator.properties │ │ │ │ │ ├── browser-region/ │ │ │ │ │ │ └── region.properties │ │ │ │ │ ├── en-US/ │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── client/ │ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ │ ├── aboutdebugging.dtd │ │ │ │ │ │ │ │ ├── aboutdebugging.properties │ │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ │ ├── boxmodel.properties │ │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ │ ├── components.properties │ │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ │ ├── dom.properties │ │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ │ ├── filterwidget.dtd │ │ │ │ │ │ │ │ ├── filterwidget.properties │ │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ │ ├── font-inspector.properties │ │ │ │ │ │ │ │ ├── graphs.properties │ │ │ │ │ │ │ │ ├── har.properties │ │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ │ ├── jit-optimizations.properties │ │ │ │ │ │ │ │ ├── jsonview.properties │ │ │ │ │ │ │ │ ├── layout.properties │ │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ │ ├── markers.properties │ │ │ │ │ │ │ │ ├── memory.properties │ │ │ │ │ │ │ │ ├── menus.properties │ │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ │ ├── performance.dtd │ │ │ │ │ │ │ │ ├── performance.properties │ │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ │ ├── promisedebugger.dtd │ │ │ │ │ │ │ │ ├── promisedebugger.properties │ │ │ │ │ │ │ │ ├── responsive.properties │ │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ │ ├── startup.properties │ │ │ │ │ │ │ │ ├── storage.dtd │ │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ │ └── shared/ │ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ │ └── formautofill.properties │ │ │ │ │ ├── feedback/ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ └── main.properties │ │ │ │ │ └── pdfviewer/ │ │ │ │ │ ├── chrome.properties │ │ │ │ │ └── viewer.properties │ │ │ │ └── en-US.manifest │ │ │ ├── chrome.manifest │ │ │ ├── crashreporter-override.ini │ │ │ ├── defaults/ │ │ │ │ ├── preferences/ │ │ │ │ │ └── firefox-l10n.js │ │ │ │ └── profile/ │ │ │ │ ├── bookmarks.html │ │ │ │ ├── chrome/ │ │ │ │ │ ├── userChrome-example.css │ │ │ │ │ └── userContent-example.css │ │ │ │ ├── localstore.rdf │ │ │ │ └── mimeTypes.rdf │ │ │ ├── features/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── firefox@getpocket.com/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── en-US/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── en-US/ │ │ │ │ │ │ └── pocket.properties │ │ │ │ │ └── en-US.manifest │ │ │ │ ├── loop@mozilla.org/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── en-US/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── en-US/ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ └── en-US.manifest │ │ │ │ └── presentation@mozilla.org/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── en-US/ │ │ │ │ │ └── locale/ │ │ │ │ │ └── en-US/ │ │ │ │ │ └── presentation.properties │ │ │ │ └── en-US.manifest │ │ │ └── searchplugins/ │ │ │ ├── amazondotcom.xml │ │ │ ├── bing.xml │ │ │ ├── eBay.xml │ │ │ ├── google.xml │ │ │ ├── twitter.xml │ │ │ ├── wikipedia.xml │ │ │ └── yahoo.xml │ │ ├── chrome/ │ │ │ ├── en-US/ │ │ │ │ └── locale/ │ │ │ │ └── en-US/ │ │ │ │ ├── alerts/ │ │ │ │ │ ├── alert.dtd │ │ │ │ │ ├── alert.properties │ │ │ │ │ └── notificationNames.properties │ │ │ │ ├── autoconfig/ │ │ │ │ │ └── autoconfig.properties │ │ │ │ ├── cookie/ │ │ │ │ │ ├── cookieAcceptDialog.dtd │ │ │ │ │ └── cookieAcceptDialog.properties │ │ │ │ ├── formautofill/ │ │ │ │ │ └── requestAutocomplete.dtd │ │ │ │ ├── global/ │ │ │ │ │ ├── AccessFu.properties │ │ │ │ │ ├── about.dtd │ │ │ │ │ ├── aboutAbout.dtd │ │ │ │ │ ├── aboutNetworking.dtd │ │ │ │ │ ├── aboutProfiles.dtd │ │ │ │ │ ├── aboutProfiles.properties │ │ │ │ │ ├── aboutReader.properties │ │ │ │ │ ├── aboutRights.dtd │ │ │ │ │ ├── aboutRights.properties │ │ │ │ │ ├── aboutServiceWorkers.dtd │ │ │ │ │ ├── aboutServiceWorkers.properties │ │ │ │ │ ├── aboutSupport.dtd │ │ │ │ │ ├── aboutSupport.properties │ │ │ │ │ ├── aboutTelemetry.dtd │ │ │ │ │ ├── aboutTelemetry.properties │ │ │ │ │ ├── aboutWebrtc.properties │ │ │ │ │ ├── actions.dtd │ │ │ │ │ ├── appPicker.dtd │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ ├── autocomplete.properties │ │ │ │ │ ├── brand.dtd │ │ │ │ │ ├── browser.properties │ │ │ │ │ ├── charsetMenu.dtd │ │ │ │ │ ├── charsetMenu.properties │ │ │ │ │ ├── charsetOverlay.dtd │ │ │ │ │ ├── charsetTitles.properties │ │ │ │ │ ├── commonDialog.dtd │ │ │ │ │ ├── commonDialogs.properties │ │ │ │ │ ├── config.dtd │ │ │ │ │ ├── config.properties │ │ │ │ │ ├── console.dtd │ │ │ │ │ ├── console.properties │ │ │ │ │ ├── contentAreaCommands.properties │ │ │ │ │ ├── crashes.dtd │ │ │ │ │ ├── crashes.properties │ │ │ │ │ ├── css.properties │ │ │ │ │ ├── customizeCharset.dtd │ │ │ │ │ ├── customizeToolbar.dtd │ │ │ │ │ ├── customizeToolbar.properties │ │ │ │ │ ├── dateFormat.properties │ │ │ │ │ ├── datetimepicker.dtd │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ ├── dialog.properties │ │ │ │ │ ├── dialogOverlay.dtd │ │ │ │ │ ├── dom/ │ │ │ │ │ │ └── dom.properties │ │ │ │ │ ├── downloadProgress.properties │ │ │ │ │ ├── editMenuOverlay.dtd │ │ │ │ │ ├── extensions.properties │ │ │ │ │ ├── fallbackMenubar.properties │ │ │ │ │ ├── filefield.properties │ │ │ │ │ ├── filepicker.dtd │ │ │ │ │ ├── filepicker.properties │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── findbar.properties │ │ │ │ │ ├── finddialog.dtd │ │ │ │ │ ├── finddialog.properties │ │ │ │ │ ├── global-strres.properties │ │ │ │ │ ├── global.dtd │ │ │ │ │ ├── globalKeys.dtd │ │ │ │ │ ├── headsUpDisplay.properties │ │ │ │ │ ├── intl.css │ │ │ │ │ ├── intl.properties │ │ │ │ │ ├── keys.properties │ │ │ │ │ ├── languageNames.properties │ │ │ │ │ ├── layout/ │ │ │ │ │ │ ├── HtmlForm.properties │ │ │ │ │ │ ├── MediaDocument.properties │ │ │ │ │ │ ├── htmlparser.properties │ │ │ │ │ │ └── xmlparser.properties │ │ │ │ │ ├── layout_errors.properties │ │ │ │ │ ├── mathml/ │ │ │ │ │ │ └── mathml.properties │ │ │ │ │ ├── mozilla.dtd │ │ │ │ │ ├── narrate.properties │ │ │ │ │ ├── netError.dtd │ │ │ │ │ ├── netErrorApp.dtd │ │ │ │ │ ├── notification.dtd │ │ │ │ │ ├── nsWebBrowserPersist.properties │ │ │ │ │ ├── plugins.properties │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ ├── printPageSetup.dtd │ │ │ │ │ ├── printPreview.dtd │ │ │ │ │ ├── printPreviewProgress.dtd │ │ │ │ │ ├── printProgress.dtd │ │ │ │ │ ├── printdialog.dtd │ │ │ │ │ ├── printdialog.properties │ │ │ │ │ ├── printing.properties │ │ │ │ │ ├── printjoboptions.dtd │ │ │ │ │ ├── regionNames.properties │ │ │ │ │ ├── resetProfile.dtd │ │ │ │ │ ├── resetProfile.properties │ │ │ │ │ ├── search/ │ │ │ │ │ │ └── search.properties │ │ │ │ │ ├── security/ │ │ │ │ │ │ ├── caps.properties │ │ │ │ │ │ ├── csp.properties │ │ │ │ │ │ └── security.properties │ │ │ │ │ ├── storage.properties │ │ │ │ │ ├── svg/ │ │ │ │ │ │ └── svg.properties │ │ │ │ │ ├── textcontext.dtd │ │ │ │ │ ├── tree.dtd │ │ │ │ │ ├── videocontrols.dtd │ │ │ │ │ ├── viewSource.dtd │ │ │ │ │ ├── viewSource.properties │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ ├── webapps.properties │ │ │ │ │ ├── wizard.dtd │ │ │ │ │ ├── wizard.properties │ │ │ │ │ ├── xbl.properties │ │ │ │ │ ├── xml/ │ │ │ │ │ │ └── prettyprint.dtd │ │ │ │ │ ├── xpinstall/ │ │ │ │ │ │ └── xpinstall.properties │ │ │ │ │ ├── xslt/ │ │ │ │ │ │ └── xslt.properties │ │ │ │ │ └── xul.properties │ │ │ │ ├── global-platform/ │ │ │ │ │ ├── mac/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ ├── unix/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ └── win/ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ ├── intl.properties │ │ │ │ │ └── platformKeys.properties │ │ │ │ ├── global-region/ │ │ │ │ │ └── region.properties │ │ │ │ ├── mozapps/ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ ├── settingsChange.dtd │ │ │ │ │ │ ├── unknownContentType.dtd │ │ │ │ │ │ └── unknownContentType.properties │ │ │ │ │ ├── extensions/ │ │ │ │ │ │ ├── about.dtd │ │ │ │ │ │ ├── blocklist.dtd │ │ │ │ │ │ ├── extensions.dtd │ │ │ │ │ │ ├── extensions.properties │ │ │ │ │ │ ├── newaddon.dtd │ │ │ │ │ │ ├── newaddon.properties │ │ │ │ │ │ ├── selectAddons.dtd │ │ │ │ │ │ ├── selectAddons.properties │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── handling/ │ │ │ │ │ │ ├── handling.dtd │ │ │ │ │ │ └── handling.properties │ │ │ │ │ ├── plugins/ │ │ │ │ │ │ ├── plugins.dtd │ │ │ │ │ │ └── plugins.properties │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ ├── changemp.dtd │ │ │ │ │ │ ├── ocsp.dtd │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ └── removemp.dtd │ │ │ │ │ ├── profile/ │ │ │ │ │ │ ├── createProfileWizard.dtd │ │ │ │ │ │ ├── profileSelection.dtd │ │ │ │ │ │ └── profileSelection.properties │ │ │ │ │ ├── update/ │ │ │ │ │ │ ├── history.dtd │ │ │ │ │ │ ├── updates.dtd │ │ │ │ │ │ └── updates.properties │ │ │ │ │ └── xpinstall/ │ │ │ │ │ ├── xpinstallConfirm.dtd │ │ │ │ │ └── xpinstallConfirm.properties │ │ │ │ ├── necko/ │ │ │ │ │ └── necko.properties │ │ │ │ ├── passwordmgr/ │ │ │ │ │ ├── passwordManager.dtd │ │ │ │ │ └── passwordmgr.properties │ │ │ │ ├── pipnss/ │ │ │ │ │ ├── nsserrors.properties │ │ │ │ │ ├── pipnss.properties │ │ │ │ │ └── security.properties │ │ │ │ ├── pippki/ │ │ │ │ │ ├── certManager.dtd │ │ │ │ │ ├── deviceManager.dtd │ │ │ │ │ ├── pippki.dtd │ │ │ │ │ ├── pippki.properties │ │ │ │ │ └── validation.dtd │ │ │ │ ├── places/ │ │ │ │ │ └── places.properties │ │ │ │ ├── pluginproblem/ │ │ │ │ │ └── pluginproblem.dtd │ │ │ │ └── services/ │ │ │ │ ├── errors.properties │ │ │ │ └── sync.properties │ │ │ └── en-US.manifest │ │ ├── chrome.manifest │ │ └── install.rdf │ ├── es-ES/ │ │ ├── bluegriffon/ │ │ │ └── chrome.manifest │ │ ├── browser/ │ │ │ ├── chrome/ │ │ │ │ ├── es-ES/ │ │ │ │ │ └── locale/ │ │ │ │ │ ├── branding/ │ │ │ │ │ │ ├── brand.dtd │ │ │ │ │ │ ├── brand.properties │ │ │ │ │ │ └── browserconfig.properties │ │ │ │ │ ├── browser/ │ │ │ │ │ │ ├── aboutAccounts.dtd │ │ │ │ │ │ ├── aboutCertError.dtd │ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ │ ├── aboutHealthReport.dtd │ │ │ │ │ │ ├── aboutHome.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.properties │ │ │ │ │ │ ├── aboutRobots.dtd │ │ │ │ │ │ ├── aboutSearchReset.dtd │ │ │ │ │ │ ├── aboutSessionRestore.dtd │ │ │ │ │ │ ├── aboutSyncTabs.dtd │ │ │ │ │ │ ├── aboutTabCrashed.dtd │ │ │ │ │ │ ├── accounts.properties │ │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ │ ├── baseMenuOverlay.dtd │ │ │ │ │ │ ├── bookmarks.html │ │ │ │ │ │ ├── browser.dtd │ │ │ │ │ │ ├── browser.properties │ │ │ │ │ │ ├── customizableui/ │ │ │ │ │ │ │ └── customizableWidgets.properties │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ ├── app-manager.dtd │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ ├── profiler.dtd │ │ │ │ │ │ │ ├── profiler.properties │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ ├── styleinspector.properties │ │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ │ ├── timeline.dtd │ │ │ │ │ │ │ ├── timeline.properties │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ │ └── settingsChange.dtd │ │ │ │ │ │ ├── engineManager.dtd │ │ │ │ │ │ ├── engineManager.properties │ │ │ │ │ │ ├── feeds/ │ │ │ │ │ │ │ ├── subscribe.dtd │ │ │ │ │ │ │ └── subscribe.properties │ │ │ │ │ │ ├── lightweightThemes.properties │ │ │ │ │ │ ├── loop/ │ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ │ ├── migration/ │ │ │ │ │ │ │ ├── migration.dtd │ │ │ │ │ │ │ └── migration.properties │ │ │ │ │ │ ├── netError.dtd │ │ │ │ │ │ ├── newTab.dtd │ │ │ │ │ │ ├── newTab.properties │ │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ │ ├── pageInfo.dtd │ │ │ │ │ │ ├── pageInfo.properties │ │ │ │ │ │ ├── places/ │ │ │ │ │ │ │ ├── bookmarkProperties.properties │ │ │ │ │ │ │ ├── editBookmarkOverlay.dtd │ │ │ │ │ │ │ ├── moveBookmarks.dtd │ │ │ │ │ │ │ ├── places.dtd │ │ │ │ │ │ │ └── places.properties │ │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ │ ├── aboutPermissions.dtd │ │ │ │ │ │ │ ├── aboutPermissions.properties │ │ │ │ │ │ │ ├── advanced-scripts.dtd │ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ │ ├── applicationManager.dtd │ │ │ │ │ │ │ ├── applicationManager.properties │ │ │ │ │ │ │ ├── applications.dtd │ │ │ │ │ │ │ ├── blocklists.dtd │ │ │ │ │ │ │ ├── colors.dtd │ │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ │ ├── containers.dtd │ │ │ │ │ │ │ ├── containers.properties │ │ │ │ │ │ │ ├── content.dtd │ │ │ │ │ │ │ ├── cookies.dtd │ │ │ │ │ │ │ ├── donottrack.dtd │ │ │ │ │ │ │ ├── fonts.dtd │ │ │ │ │ │ │ ├── languages.dtd │ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ │ ├── permissions.dtd │ │ │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ │ ├── privacy.dtd │ │ │ │ │ │ │ ├── search.dtd │ │ │ │ │ │ │ ├── security.dtd │ │ │ │ │ │ │ ├── selectBookmark.dtd │ │ │ │ │ │ │ ├── siteDataSettings.dtd │ │ │ │ │ │ │ ├── sync.dtd │ │ │ │ │ │ │ ├── tabs.dtd │ │ │ │ │ │ │ └── translation.dtd │ │ │ │ │ │ ├── quitDialog.properties │ │ │ │ │ │ ├── safeMode.dtd │ │ │ │ │ │ ├── safebrowsing/ │ │ │ │ │ │ │ ├── phishing-afterload-warning-message.dtd │ │ │ │ │ │ │ └── report-phishing.dtd │ │ │ │ │ │ ├── sanitize.dtd │ │ │ │ │ │ ├── search.properties │ │ │ │ │ │ ├── searchbar.dtd │ │ │ │ │ │ ├── searchplugins/ │ │ │ │ │ │ │ ├── bing.xml │ │ │ │ │ │ │ ├── ddg.xml │ │ │ │ │ │ │ ├── drae.xml │ │ │ │ │ │ │ ├── google-nocodes.xml │ │ │ │ │ │ │ ├── google.xml │ │ │ │ │ │ │ ├── list.json │ │ │ │ │ │ │ ├── twitter.xml │ │ │ │ │ │ │ ├── wikipedia-es.xml │ │ │ │ │ │ │ └── yahoo-es.xml │ │ │ │ │ │ ├── setDesktopBackground.dtd │ │ │ │ │ │ ├── shellservice.properties │ │ │ │ │ │ ├── sitePermissions.properties │ │ │ │ │ │ ├── syncBrand.dtd │ │ │ │ │ │ ├── syncCustomize.dtd │ │ │ │ │ │ ├── syncGenericChange.properties │ │ │ │ │ │ ├── syncKey.dtd │ │ │ │ │ │ ├── syncProgress.dtd │ │ │ │ │ │ ├── syncQuota.dtd │ │ │ │ │ │ ├── syncQuota.properties │ │ │ │ │ │ ├── syncSetup.dtd │ │ │ │ │ │ ├── syncSetup.properties │ │ │ │ │ │ ├── tabbrowser.dtd │ │ │ │ │ │ ├── tabbrowser.properties │ │ │ │ │ │ ├── tabview.properties │ │ │ │ │ │ ├── taskbar.properties │ │ │ │ │ │ ├── translation.dtd │ │ │ │ │ │ ├── translation.properties │ │ │ │ │ │ └── webrtcIndicator.properties │ │ │ │ │ ├── browser-region/ │ │ │ │ │ │ └── region.properties │ │ │ │ │ ├── es-ES/ │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── client/ │ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ │ ├── aboutdebugging.dtd │ │ │ │ │ │ │ │ ├── aboutdebugging.properties │ │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ │ ├── boxmodel.properties │ │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ │ ├── components.properties │ │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ │ ├── dom.properties │ │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ │ ├── filterwidget.dtd │ │ │ │ │ │ │ │ ├── filterwidget.properties │ │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ │ ├── font-inspector.properties │ │ │ │ │ │ │ │ ├── graphs.properties │ │ │ │ │ │ │ │ ├── har.properties │ │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ │ ├── jit-optimizations.properties │ │ │ │ │ │ │ │ ├── jsonview.properties │ │ │ │ │ │ │ │ ├── layout.properties │ │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ │ ├── markers.properties │ │ │ │ │ │ │ │ ├── memory.properties │ │ │ │ │ │ │ │ ├── menus.properties │ │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ │ ├── performance.dtd │ │ │ │ │ │ │ │ ├── performance.properties │ │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ │ ├── promisedebugger.dtd │ │ │ │ │ │ │ │ ├── promisedebugger.properties │ │ │ │ │ │ │ │ ├── responsive.properties │ │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ │ ├── startup.properties │ │ │ │ │ │ │ │ ├── storage.dtd │ │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ │ └── shared/ │ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ │ └── formautofill.properties │ │ │ │ │ ├── feedback/ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ └── main.properties │ │ │ │ │ └── pdfviewer/ │ │ │ │ │ ├── chrome.properties │ │ │ │ │ └── viewer.properties │ │ │ │ └── es-ES.manifest │ │ │ ├── chrome.manifest │ │ │ ├── crashreporter-override.ini │ │ │ ├── defaults/ │ │ │ │ ├── preferences/ │ │ │ │ │ └── firefox-l10n.js │ │ │ │ └── profile/ │ │ │ │ ├── bookmarks.html │ │ │ │ ├── chrome/ │ │ │ │ │ ├── userChrome-example.css │ │ │ │ │ └── userContent-example.css │ │ │ │ ├── localstore.rdf │ │ │ │ └── mimeTypes.rdf │ │ │ ├── features/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── firefox@getpocket.com/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── es-ES/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── es-ES/ │ │ │ │ │ │ └── pocket.properties │ │ │ │ │ └── es-ES.manifest │ │ │ │ ├── loop@mozilla.org/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── es-ES/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── es-ES/ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ └── es-ES.manifest │ │ │ │ └── presentation@mozilla.org/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── es-ES/ │ │ │ │ │ └── locale/ │ │ │ │ │ └── es-ES/ │ │ │ │ │ └── presentation.properties │ │ │ │ └── es-ES.manifest │ │ │ └── searchplugins/ │ │ │ ├── bing.xml │ │ │ ├── drae.xml │ │ │ ├── eBay-es.xml │ │ │ ├── google.xml │ │ │ ├── twitter.xml │ │ │ ├── wikipedia-es.xml │ │ │ └── yahoo-es.xml │ │ ├── chrome/ │ │ │ ├── es-ES/ │ │ │ │ └── locale/ │ │ │ │ └── es-ES/ │ │ │ │ ├── alerts/ │ │ │ │ │ ├── alert.dtd │ │ │ │ │ ├── alert.properties │ │ │ │ │ └── notificationNames.properties │ │ │ │ ├── autoconfig/ │ │ │ │ │ └── autoconfig.properties │ │ │ │ ├── cookie/ │ │ │ │ │ ├── cookieAcceptDialog.dtd │ │ │ │ │ └── cookieAcceptDialog.properties │ │ │ │ ├── formautofill/ │ │ │ │ │ └── requestAutocomplete.dtd │ │ │ │ ├── global/ │ │ │ │ │ ├── AccessFu.properties │ │ │ │ │ ├── about.dtd │ │ │ │ │ ├── aboutAbout.dtd │ │ │ │ │ ├── aboutNetworking.dtd │ │ │ │ │ ├── aboutProfiles.dtd │ │ │ │ │ ├── aboutProfiles.properties │ │ │ │ │ ├── aboutReader.properties │ │ │ │ │ ├── aboutRights.dtd │ │ │ │ │ ├── aboutRights.properties │ │ │ │ │ ├── aboutServiceWorkers.dtd │ │ │ │ │ ├── aboutServiceWorkers.properties │ │ │ │ │ ├── aboutSupport.dtd │ │ │ │ │ ├── aboutSupport.properties │ │ │ │ │ ├── aboutTelemetry.dtd │ │ │ │ │ ├── aboutTelemetry.properties │ │ │ │ │ ├── aboutWebrtc.properties │ │ │ │ │ ├── actions.dtd │ │ │ │ │ ├── appPicker.dtd │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ ├── autocomplete.properties │ │ │ │ │ ├── brand.dtd │ │ │ │ │ ├── browser.properties │ │ │ │ │ ├── charsetMenu.dtd │ │ │ │ │ ├── charsetMenu.properties │ │ │ │ │ ├── charsetOverlay.dtd │ │ │ │ │ ├── charsetTitles.properties │ │ │ │ │ ├── commonDialog.dtd │ │ │ │ │ ├── commonDialogs.properties │ │ │ │ │ ├── config.dtd │ │ │ │ │ ├── config.properties │ │ │ │ │ ├── console.dtd │ │ │ │ │ ├── console.properties │ │ │ │ │ ├── contentAreaCommands.properties │ │ │ │ │ ├── crashes.dtd │ │ │ │ │ ├── crashes.properties │ │ │ │ │ ├── css.properties │ │ │ │ │ ├── customizeCharset.dtd │ │ │ │ │ ├── customizeToolbar.dtd │ │ │ │ │ ├── customizeToolbar.properties │ │ │ │ │ ├── dateFormat.properties │ │ │ │ │ ├── datetimepicker.dtd │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ ├── dialog.properties │ │ │ │ │ ├── dialogOverlay.dtd │ │ │ │ │ ├── dom/ │ │ │ │ │ │ └── dom.properties │ │ │ │ │ ├── downloadProgress.properties │ │ │ │ │ ├── editMenuOverlay.dtd │ │ │ │ │ ├── extensions.properties │ │ │ │ │ ├── fallbackMenubar.properties │ │ │ │ │ ├── filefield.properties │ │ │ │ │ ├── filepicker.dtd │ │ │ │ │ ├── filepicker.properties │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── findbar.properties │ │ │ │ │ ├── finddialog.dtd │ │ │ │ │ ├── finddialog.properties │ │ │ │ │ ├── global-strres.properties │ │ │ │ │ ├── global.dtd │ │ │ │ │ ├── globalKeys.dtd │ │ │ │ │ ├── headsUpDisplay.properties │ │ │ │ │ ├── intl.css │ │ │ │ │ ├── intl.properties │ │ │ │ │ ├── keys.properties │ │ │ │ │ ├── languageNames.properties │ │ │ │ │ ├── layout/ │ │ │ │ │ │ ├── HtmlForm.properties │ │ │ │ │ │ ├── MediaDocument.properties │ │ │ │ │ │ ├── htmlparser.properties │ │ │ │ │ │ └── xmlparser.properties │ │ │ │ │ ├── layout_errors.properties │ │ │ │ │ ├── mathml/ │ │ │ │ │ │ └── mathml.properties │ │ │ │ │ ├── mozilla.dtd │ │ │ │ │ ├── narrate.properties │ │ │ │ │ ├── netError.dtd │ │ │ │ │ ├── netErrorApp.dtd │ │ │ │ │ ├── notification.dtd │ │ │ │ │ ├── nsWebBrowserPersist.properties │ │ │ │ │ ├── plugins.properties │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ ├── printPageSetup.dtd │ │ │ │ │ ├── printPreview.dtd │ │ │ │ │ ├── printPreviewProgress.dtd │ │ │ │ │ ├── printProgress.dtd │ │ │ │ │ ├── printdialog.dtd │ │ │ │ │ ├── printdialog.properties │ │ │ │ │ ├── printing.properties │ │ │ │ │ ├── printjoboptions.dtd │ │ │ │ │ ├── regionNames.properties │ │ │ │ │ ├── resetProfile.dtd │ │ │ │ │ ├── resetProfile.properties │ │ │ │ │ ├── search/ │ │ │ │ │ │ └── search.properties │ │ │ │ │ ├── security/ │ │ │ │ │ │ ├── caps.properties │ │ │ │ │ │ ├── csp.properties │ │ │ │ │ │ └── security.properties │ │ │ │ │ ├── storage.properties │ │ │ │ │ ├── svg/ │ │ │ │ │ │ └── svg.properties │ │ │ │ │ ├── textcontext.dtd │ │ │ │ │ ├── tree.dtd │ │ │ │ │ ├── videocontrols.dtd │ │ │ │ │ ├── viewSource.dtd │ │ │ │ │ ├── viewSource.properties │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ ├── webapps.properties │ │ │ │ │ ├── wizard.dtd │ │ │ │ │ ├── wizard.properties │ │ │ │ │ ├── xbl.properties │ │ │ │ │ ├── xml/ │ │ │ │ │ │ └── prettyprint.dtd │ │ │ │ │ ├── xpinstall/ │ │ │ │ │ │ └── xpinstall.properties │ │ │ │ │ ├── xslt/ │ │ │ │ │ │ └── xslt.properties │ │ │ │ │ └── xul.properties │ │ │ │ ├── global-platform/ │ │ │ │ │ ├── mac/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ ├── unix/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ └── win/ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ ├── intl.properties │ │ │ │ │ └── platformKeys.properties │ │ │ │ ├── global-region/ │ │ │ │ │ └── region.properties │ │ │ │ ├── mozapps/ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ ├── settingsChange.dtd │ │ │ │ │ │ ├── unknownContentType.dtd │ │ │ │ │ │ └── unknownContentType.properties │ │ │ │ │ ├── extensions/ │ │ │ │ │ │ ├── about.dtd │ │ │ │ │ │ ├── blocklist.dtd │ │ │ │ │ │ ├── extensions.dtd │ │ │ │ │ │ ├── extensions.properties │ │ │ │ │ │ ├── newaddon.dtd │ │ │ │ │ │ ├── newaddon.properties │ │ │ │ │ │ ├── selectAddons.dtd │ │ │ │ │ │ ├── selectAddons.properties │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── handling/ │ │ │ │ │ │ ├── handling.dtd │ │ │ │ │ │ └── handling.properties │ │ │ │ │ ├── plugins/ │ │ │ │ │ │ ├── plugins.dtd │ │ │ │ │ │ └── plugins.properties │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ ├── changemp.dtd │ │ │ │ │ │ ├── ocsp.dtd │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ └── removemp.dtd │ │ │ │ │ ├── profile/ │ │ │ │ │ │ ├── createProfileWizard.dtd │ │ │ │ │ │ ├── profileSelection.dtd │ │ │ │ │ │ └── profileSelection.properties │ │ │ │ │ ├── update/ │ │ │ │ │ │ ├── history.dtd │ │ │ │ │ │ ├── updates.dtd │ │ │ │ │ │ └── updates.properties │ │ │ │ │ └── xpinstall/ │ │ │ │ │ ├── xpinstallConfirm.dtd │ │ │ │ │ └── xpinstallConfirm.properties │ │ │ │ ├── necko/ │ │ │ │ │ └── necko.properties │ │ │ │ ├── passwordmgr/ │ │ │ │ │ ├── passwordManager.dtd │ │ │ │ │ └── passwordmgr.properties │ │ │ │ ├── pipnss/ │ │ │ │ │ ├── nsserrors.properties │ │ │ │ │ ├── pipnss.properties │ │ │ │ │ └── security.properties │ │ │ │ ├── pippki/ │ │ │ │ │ ├── certManager.dtd │ │ │ │ │ ├── deviceManager.dtd │ │ │ │ │ ├── pippki.dtd │ │ │ │ │ ├── pippki.properties │ │ │ │ │ └── validation.dtd │ │ │ │ ├── places/ │ │ │ │ │ └── places.properties │ │ │ │ ├── pluginproblem/ │ │ │ │ │ └── pluginproblem.dtd │ │ │ │ └── services/ │ │ │ │ ├── errors.properties │ │ │ │ └── sync.properties │ │ │ └── es-ES.manifest │ │ ├── chrome.manifest │ │ └── install.rdf │ ├── fi/ │ │ ├── bluegriffon/ │ │ │ └── chrome.manifest │ │ ├── browser/ │ │ │ ├── chrome/ │ │ │ │ ├── fi/ │ │ │ │ │ └── locale/ │ │ │ │ │ ├── branding/ │ │ │ │ │ │ ├── brand.dtd │ │ │ │ │ │ ├── brand.properties │ │ │ │ │ │ └── browserconfig.properties │ │ │ │ │ ├── browser/ │ │ │ │ │ │ ├── aboutAccounts.dtd │ │ │ │ │ │ ├── aboutCertError.dtd │ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ │ ├── aboutHealthReport.dtd │ │ │ │ │ │ ├── aboutHome.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.properties │ │ │ │ │ │ ├── aboutRobots.dtd │ │ │ │ │ │ ├── aboutSearchReset.dtd │ │ │ │ │ │ ├── aboutSessionRestore.dtd │ │ │ │ │ │ ├── aboutSyncTabs.dtd │ │ │ │ │ │ ├── aboutTabCrashed.dtd │ │ │ │ │ │ ├── accounts.properties │ │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ │ ├── baseMenuOverlay.dtd │ │ │ │ │ │ ├── bookmarks.html │ │ │ │ │ │ ├── browser.dtd │ │ │ │ │ │ ├── browser.properties │ │ │ │ │ │ ├── customizableui/ │ │ │ │ │ │ │ └── customizableWidgets.properties │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ ├── app-manager.dtd │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ ├── profiler.dtd │ │ │ │ │ │ │ ├── profiler.properties │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ ├── styleinspector.properties │ │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ │ ├── timeline.dtd │ │ │ │ │ │ │ ├── timeline.properties │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ │ └── settingsChange.dtd │ │ │ │ │ │ ├── engineManager.dtd │ │ │ │ │ │ ├── engineManager.properties │ │ │ │ │ │ ├── feeds/ │ │ │ │ │ │ │ ├── subscribe.dtd │ │ │ │ │ │ │ └── subscribe.properties │ │ │ │ │ │ ├── lightweightThemes.properties │ │ │ │ │ │ ├── loop/ │ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ │ ├── migration/ │ │ │ │ │ │ │ ├── migration.dtd │ │ │ │ │ │ │ └── migration.properties │ │ │ │ │ │ ├── netError.dtd │ │ │ │ │ │ ├── newTab.dtd │ │ │ │ │ │ ├── newTab.properties │ │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ │ ├── pageInfo.dtd │ │ │ │ │ │ ├── pageInfo.properties │ │ │ │ │ │ ├── places/ │ │ │ │ │ │ │ ├── bookmarkProperties.properties │ │ │ │ │ │ │ ├── editBookmarkOverlay.dtd │ │ │ │ │ │ │ ├── moveBookmarks.dtd │ │ │ │ │ │ │ ├── places.dtd │ │ │ │ │ │ │ └── places.properties │ │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ │ ├── aboutPermissions.dtd │ │ │ │ │ │ │ ├── aboutPermissions.properties │ │ │ │ │ │ │ ├── advanced-scripts.dtd │ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ │ ├── applicationManager.dtd │ │ │ │ │ │ │ ├── applicationManager.properties │ │ │ │ │ │ │ ├── applications.dtd │ │ │ │ │ │ │ ├── blocklists.dtd │ │ │ │ │ │ │ ├── colors.dtd │ │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ │ ├── containers.dtd │ │ │ │ │ │ │ ├── containers.properties │ │ │ │ │ │ │ ├── content.dtd │ │ │ │ │ │ │ ├── cookies.dtd │ │ │ │ │ │ │ ├── donottrack.dtd │ │ │ │ │ │ │ ├── fonts.dtd │ │ │ │ │ │ │ ├── languages.dtd │ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ │ ├── permissions.dtd │ │ │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ │ ├── privacy.dtd │ │ │ │ │ │ │ ├── search.dtd │ │ │ │ │ │ │ ├── security.dtd │ │ │ │ │ │ │ ├── selectBookmark.dtd │ │ │ │ │ │ │ ├── siteDataSettings.dtd │ │ │ │ │ │ │ ├── sync.dtd │ │ │ │ │ │ │ ├── tabs.dtd │ │ │ │ │ │ │ └── translation.dtd │ │ │ │ │ │ ├── quitDialog.properties │ │ │ │ │ │ ├── safeMode.dtd │ │ │ │ │ │ ├── safebrowsing/ │ │ │ │ │ │ │ ├── phishing-afterload-warning-message.dtd │ │ │ │ │ │ │ └── report-phishing.dtd │ │ │ │ │ │ ├── sanitize.dtd │ │ │ │ │ │ ├── search.properties │ │ │ │ │ │ ├── searchbar.dtd │ │ │ │ │ │ ├── searchplugins/ │ │ │ │ │ │ │ ├── bing.xml │ │ │ │ │ │ │ ├── bookplus-fi.xml │ │ │ │ │ │ │ ├── ddg.xml │ │ │ │ │ │ │ ├── google-nocodes.xml │ │ │ │ │ │ │ ├── google.xml │ │ │ │ │ │ │ ├── list.json │ │ │ │ │ │ │ ├── wikipedia-fi.xml │ │ │ │ │ │ │ └── yahoo-fi.xml │ │ │ │ │ │ ├── setDesktopBackground.dtd │ │ │ │ │ │ ├── shellservice.properties │ │ │ │ │ │ ├── sitePermissions.properties │ │ │ │ │ │ ├── syncBrand.dtd │ │ │ │ │ │ ├── syncCustomize.dtd │ │ │ │ │ │ ├── syncGenericChange.properties │ │ │ │ │ │ ├── syncKey.dtd │ │ │ │ │ │ ├── syncProgress.dtd │ │ │ │ │ │ ├── syncQuota.dtd │ │ │ │ │ │ ├── syncQuota.properties │ │ │ │ │ │ ├── syncSetup.dtd │ │ │ │ │ │ ├── syncSetup.properties │ │ │ │ │ │ ├── tabbrowser.dtd │ │ │ │ │ │ ├── tabbrowser.properties │ │ │ │ │ │ ├── tabview.properties │ │ │ │ │ │ ├── taskbar.properties │ │ │ │ │ │ ├── translation.dtd │ │ │ │ │ │ ├── translation.properties │ │ │ │ │ │ └── webrtcIndicator.properties │ │ │ │ │ ├── browser-region/ │ │ │ │ │ │ └── region.properties │ │ │ │ │ ├── feedback/ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ └── main.properties │ │ │ │ │ ├── fi/ │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── client/ │ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ │ ├── aboutdebugging.dtd │ │ │ │ │ │ │ │ ├── aboutdebugging.properties │ │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ │ ├── boxmodel.properties │ │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ │ ├── components.properties │ │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ │ ├── dom.properties │ │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ │ ├── filterwidget.dtd │ │ │ │ │ │ │ │ ├── filterwidget.properties │ │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ │ ├── font-inspector.properties │ │ │ │ │ │ │ │ ├── graphs.properties │ │ │ │ │ │ │ │ ├── har.properties │ │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ │ ├── jit-optimizations.properties │ │ │ │ │ │ │ │ ├── jsonview.properties │ │ │ │ │ │ │ │ ├── layout.properties │ │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ │ ├── markers.properties │ │ │ │ │ │ │ │ ├── memory.properties │ │ │ │ │ │ │ │ ├── menus.properties │ │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ │ ├── performance.dtd │ │ │ │ │ │ │ │ ├── performance.properties │ │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ │ ├── promisedebugger.dtd │ │ │ │ │ │ │ │ ├── promisedebugger.properties │ │ │ │ │ │ │ │ ├── responsive.properties │ │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ │ ├── startup.properties │ │ │ │ │ │ │ │ ├── storage.dtd │ │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ │ └── shared/ │ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ │ └── formautofill.properties │ │ │ │ │ └── pdfviewer/ │ │ │ │ │ ├── chrome.properties │ │ │ │ │ └── viewer.properties │ │ │ │ └── fi.manifest │ │ │ ├── chrome.manifest │ │ │ ├── crashreporter-override.ini │ │ │ ├── defaults/ │ │ │ │ ├── preferences/ │ │ │ │ │ └── firefox-l10n.js │ │ │ │ └── profile/ │ │ │ │ ├── bookmarks.html │ │ │ │ ├── chrome/ │ │ │ │ │ ├── userChrome-example.css │ │ │ │ │ └── userContent-example.css │ │ │ │ ├── localstore.rdf │ │ │ │ └── mimeTypes.rdf │ │ │ ├── features/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── firefox@getpocket.com/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── fi/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── fi/ │ │ │ │ │ │ └── pocket.properties │ │ │ │ │ └── fi.manifest │ │ │ │ ├── loop@mozilla.org/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── fi/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── fi/ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ └── fi.manifest │ │ │ │ └── presentation@mozilla.org/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── fi/ │ │ │ │ │ └── locale/ │ │ │ │ │ └── fi/ │ │ │ │ │ └── presentation.properties │ │ │ │ └── fi.manifest │ │ │ └── searchplugins/ │ │ │ ├── bing.xml │ │ │ ├── bookplus-fi.xml │ │ │ ├── eBay-fi.xml │ │ │ ├── google.xml │ │ │ ├── wikipedia-fi.xml │ │ │ └── yahoo-fi.xml │ │ ├── chrome/ │ │ │ ├── fi/ │ │ │ │ └── locale/ │ │ │ │ └── fi/ │ │ │ │ ├── alerts/ │ │ │ │ │ ├── alert.dtd │ │ │ │ │ ├── alert.properties │ │ │ │ │ └── notificationNames.properties │ │ │ │ ├── autoconfig/ │ │ │ │ │ └── autoconfig.properties │ │ │ │ ├── cookie/ │ │ │ │ │ ├── cookieAcceptDialog.dtd │ │ │ │ │ └── cookieAcceptDialog.properties │ │ │ │ ├── formautofill/ │ │ │ │ │ └── requestAutocomplete.dtd │ │ │ │ ├── global/ │ │ │ │ │ ├── AccessFu.properties │ │ │ │ │ ├── about.dtd │ │ │ │ │ ├── aboutAbout.dtd │ │ │ │ │ ├── aboutNetworking.dtd │ │ │ │ │ ├── aboutProfiles.dtd │ │ │ │ │ ├── aboutProfiles.properties │ │ │ │ │ ├── aboutReader.properties │ │ │ │ │ ├── aboutRights.dtd │ │ │ │ │ ├── aboutRights.properties │ │ │ │ │ ├── aboutServiceWorkers.dtd │ │ │ │ │ ├── aboutServiceWorkers.properties │ │ │ │ │ ├── aboutSupport.dtd │ │ │ │ │ ├── aboutSupport.properties │ │ │ │ │ ├── aboutTelemetry.dtd │ │ │ │ │ ├── aboutTelemetry.properties │ │ │ │ │ ├── aboutWebrtc.properties │ │ │ │ │ ├── actions.dtd │ │ │ │ │ ├── appPicker.dtd │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ ├── autocomplete.properties │ │ │ │ │ ├── brand.dtd │ │ │ │ │ ├── browser.properties │ │ │ │ │ ├── charsetMenu.dtd │ │ │ │ │ ├── charsetMenu.properties │ │ │ │ │ ├── charsetOverlay.dtd │ │ │ │ │ ├── charsetTitles.properties │ │ │ │ │ ├── commonDialog.dtd │ │ │ │ │ ├── commonDialogs.properties │ │ │ │ │ ├── config.dtd │ │ │ │ │ ├── config.properties │ │ │ │ │ ├── console.dtd │ │ │ │ │ ├── console.properties │ │ │ │ │ ├── contentAreaCommands.properties │ │ │ │ │ ├── crashes.dtd │ │ │ │ │ ├── crashes.properties │ │ │ │ │ ├── css.properties │ │ │ │ │ ├── customizeCharset.dtd │ │ │ │ │ ├── customizeToolbar.dtd │ │ │ │ │ ├── customizeToolbar.properties │ │ │ │ │ ├── dateFormat.properties │ │ │ │ │ ├── datetimepicker.dtd │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ ├── dialog.properties │ │ │ │ │ ├── dialogOverlay.dtd │ │ │ │ │ ├── dom/ │ │ │ │ │ │ └── dom.properties │ │ │ │ │ ├── downloadProgress.properties │ │ │ │ │ ├── editMenuOverlay.dtd │ │ │ │ │ ├── extensions.properties │ │ │ │ │ ├── fallbackMenubar.properties │ │ │ │ │ ├── filefield.properties │ │ │ │ │ ├── filepicker.dtd │ │ │ │ │ ├── filepicker.properties │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── findbar.properties │ │ │ │ │ ├── finddialog.dtd │ │ │ │ │ ├── finddialog.properties │ │ │ │ │ ├── global-strres.properties │ │ │ │ │ ├── global.dtd │ │ │ │ │ ├── globalKeys.dtd │ │ │ │ │ ├── headsUpDisplay.properties │ │ │ │ │ ├── intl.css │ │ │ │ │ ├── intl.properties │ │ │ │ │ ├── keys.properties │ │ │ │ │ ├── languageNames.properties │ │ │ │ │ ├── layout/ │ │ │ │ │ │ ├── HtmlForm.properties │ │ │ │ │ │ ├── MediaDocument.properties │ │ │ │ │ │ ├── htmlparser.properties │ │ │ │ │ │ └── xmlparser.properties │ │ │ │ │ ├── layout_errors.properties │ │ │ │ │ ├── mathml/ │ │ │ │ │ │ └── mathml.properties │ │ │ │ │ ├── mozilla.dtd │ │ │ │ │ ├── narrate.properties │ │ │ │ │ ├── netError.dtd │ │ │ │ │ ├── netErrorApp.dtd │ │ │ │ │ ├── notification.dtd │ │ │ │ │ ├── nsWebBrowserPersist.properties │ │ │ │ │ ├── plugins.properties │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ ├── printPageSetup.dtd │ │ │ │ │ ├── printPreview.dtd │ │ │ │ │ ├── printPreviewProgress.dtd │ │ │ │ │ ├── printProgress.dtd │ │ │ │ │ ├── printdialog.dtd │ │ │ │ │ ├── printdialog.properties │ │ │ │ │ ├── printing.properties │ │ │ │ │ ├── printjoboptions.dtd │ │ │ │ │ ├── regionNames.properties │ │ │ │ │ ├── resetProfile.dtd │ │ │ │ │ ├── resetProfile.properties │ │ │ │ │ ├── search/ │ │ │ │ │ │ └── search.properties │ │ │ │ │ ├── security/ │ │ │ │ │ │ ├── caps.properties │ │ │ │ │ │ ├── csp.properties │ │ │ │ │ │ └── security.properties │ │ │ │ │ ├── svg/ │ │ │ │ │ │ └── svg.properties │ │ │ │ │ ├── textcontext.dtd │ │ │ │ │ ├── tree.dtd │ │ │ │ │ ├── videocontrols.dtd │ │ │ │ │ ├── viewSource.dtd │ │ │ │ │ ├── viewSource.properties │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ ├── webapps.properties │ │ │ │ │ ├── wizard.dtd │ │ │ │ │ ├── wizard.properties │ │ │ │ │ ├── xbl.properties │ │ │ │ │ ├── xml/ │ │ │ │ │ │ └── prettyprint.dtd │ │ │ │ │ ├── xpinstall/ │ │ │ │ │ │ └── xpinstall.properties │ │ │ │ │ ├── xslt/ │ │ │ │ │ │ └── xslt.properties │ │ │ │ │ └── xul.properties │ │ │ │ ├── global-platform/ │ │ │ │ │ ├── mac/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ ├── unix/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ └── win/ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ ├── intl.properties │ │ │ │ │ └── platformKeys.properties │ │ │ │ ├── global-region/ │ │ │ │ │ └── region.properties │ │ │ │ ├── mozapps/ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ ├── settingsChange.dtd │ │ │ │ │ │ ├── unknownContentType.dtd │ │ │ │ │ │ └── unknownContentType.properties │ │ │ │ │ ├── extensions/ │ │ │ │ │ │ ├── about.dtd │ │ │ │ │ │ ├── blocklist.dtd │ │ │ │ │ │ ├── extensions.dtd │ │ │ │ │ │ ├── extensions.properties │ │ │ │ │ │ ├── newaddon.dtd │ │ │ │ │ │ ├── newaddon.properties │ │ │ │ │ │ ├── selectAddons.dtd │ │ │ │ │ │ ├── selectAddons.properties │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── handling/ │ │ │ │ │ │ ├── handling.dtd │ │ │ │ │ │ └── handling.properties │ │ │ │ │ ├── plugins/ │ │ │ │ │ │ ├── plugins.dtd │ │ │ │ │ │ └── plugins.properties │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ ├── changemp.dtd │ │ │ │ │ │ ├── ocsp.dtd │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ └── removemp.dtd │ │ │ │ │ ├── profile/ │ │ │ │ │ │ ├── createProfileWizard.dtd │ │ │ │ │ │ ├── profileSelection.dtd │ │ │ │ │ │ └── profileSelection.properties │ │ │ │ │ ├── update/ │ │ │ │ │ │ ├── history.dtd │ │ │ │ │ │ ├── updates.dtd │ │ │ │ │ │ └── updates.properties │ │ │ │ │ └── xpinstall/ │ │ │ │ │ ├── xpinstallConfirm.dtd │ │ │ │ │ └── xpinstallConfirm.properties │ │ │ │ ├── necko/ │ │ │ │ │ └── necko.properties │ │ │ │ ├── passwordmgr/ │ │ │ │ │ ├── passwordManager.dtd │ │ │ │ │ └── passwordmgr.properties │ │ │ │ ├── pipnss/ │ │ │ │ │ ├── nsserrors.properties │ │ │ │ │ ├── pipnss.properties │ │ │ │ │ └── security.properties │ │ │ │ ├── pippki/ │ │ │ │ │ ├── certManager.dtd │ │ │ │ │ ├── deviceManager.dtd │ │ │ │ │ ├── pippki.dtd │ │ │ │ │ ├── pippki.properties │ │ │ │ │ └── validation.dtd │ │ │ │ ├── places/ │ │ │ │ │ └── places.properties │ │ │ │ ├── pluginproblem/ │ │ │ │ │ └── pluginproblem.dtd │ │ │ │ └── services/ │ │ │ │ ├── errors.properties │ │ │ │ └── sync.properties │ │ │ └── fi.manifest │ │ ├── chrome.manifest │ │ └── install.rdf │ ├── fr/ │ │ ├── bluegriffon/ │ │ │ └── chrome.manifest │ │ ├── browser/ │ │ │ ├── chrome/ │ │ │ │ ├── fr/ │ │ │ │ │ └── locale/ │ │ │ │ │ ├── branding/ │ │ │ │ │ │ ├── brand.dtd │ │ │ │ │ │ ├── brand.properties │ │ │ │ │ │ └── browserconfig.properties │ │ │ │ │ ├── browser/ │ │ │ │ │ │ ├── aboutAccounts.dtd │ │ │ │ │ │ ├── aboutCertError.dtd │ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ │ ├── aboutHealthReport.dtd │ │ │ │ │ │ ├── aboutHome.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.properties │ │ │ │ │ │ ├── aboutRobots.dtd │ │ │ │ │ │ ├── aboutSearchReset.dtd │ │ │ │ │ │ ├── aboutSessionRestore.dtd │ │ │ │ │ │ ├── aboutSyncTabs.dtd │ │ │ │ │ │ ├── aboutTabCrashed.dtd │ │ │ │ │ │ ├── accounts.properties │ │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ │ ├── baseMenuOverlay.dtd │ │ │ │ │ │ ├── bookmarks.html │ │ │ │ │ │ ├── browser.dtd │ │ │ │ │ │ ├── browser.properties │ │ │ │ │ │ ├── customizableui/ │ │ │ │ │ │ │ └── customizableWidgets.properties │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ ├── app-manager.dtd │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ ├── profiler.dtd │ │ │ │ │ │ │ ├── profiler.properties │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ ├── styleinspector.properties │ │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ │ ├── timeline.dtd │ │ │ │ │ │ │ ├── timeline.properties │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ │ └── settingsChange.dtd │ │ │ │ │ │ ├── engineManager.dtd │ │ │ │ │ │ ├── engineManager.properties │ │ │ │ │ │ ├── feeds/ │ │ │ │ │ │ │ ├── subscribe.dtd │ │ │ │ │ │ │ └── subscribe.properties │ │ │ │ │ │ ├── lightweightThemes.properties │ │ │ │ │ │ ├── loop/ │ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ │ ├── migration/ │ │ │ │ │ │ │ ├── migration.dtd │ │ │ │ │ │ │ └── migration.properties │ │ │ │ │ │ ├── netError.dtd │ │ │ │ │ │ ├── newTab.dtd │ │ │ │ │ │ ├── newTab.properties │ │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ │ ├── pageInfo.dtd │ │ │ │ │ │ ├── pageInfo.properties │ │ │ │ │ │ ├── places/ │ │ │ │ │ │ │ ├── bookmarkProperties.properties │ │ │ │ │ │ │ ├── editBookmarkOverlay.dtd │ │ │ │ │ │ │ ├── moveBookmarks.dtd │ │ │ │ │ │ │ ├── places.dtd │ │ │ │ │ │ │ └── places.properties │ │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ │ ├── aboutPermissions.dtd │ │ │ │ │ │ │ ├── aboutPermissions.properties │ │ │ │ │ │ │ ├── advanced-scripts.dtd │ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ │ ├── applicationManager.dtd │ │ │ │ │ │ │ ├── applicationManager.properties │ │ │ │ │ │ │ ├── applications.dtd │ │ │ │ │ │ │ ├── blocklists.dtd │ │ │ │ │ │ │ ├── colors.dtd │ │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ │ ├── containers.dtd │ │ │ │ │ │ │ ├── containers.properties │ │ │ │ │ │ │ ├── content.dtd │ │ │ │ │ │ │ ├── cookies.dtd │ │ │ │ │ │ │ ├── donottrack.dtd │ │ │ │ │ │ │ ├── fonts.dtd │ │ │ │ │ │ │ ├── languages.dtd │ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ │ ├── permissions.dtd │ │ │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ │ ├── privacy.dtd │ │ │ │ │ │ │ ├── search.dtd │ │ │ │ │ │ │ ├── security.dtd │ │ │ │ │ │ │ ├── selectBookmark.dtd │ │ │ │ │ │ │ ├── siteDataSettings.dtd │ │ │ │ │ │ │ ├── sync.dtd │ │ │ │ │ │ │ ├── tabs.dtd │ │ │ │ │ │ │ └── translation.dtd │ │ │ │ │ │ ├── quitDialog.properties │ │ │ │ │ │ ├── safeMode.dtd │ │ │ │ │ │ ├── safebrowsing/ │ │ │ │ │ │ │ ├── phishing-afterload-warning-message.dtd │ │ │ │ │ │ │ └── report-phishing.dtd │ │ │ │ │ │ ├── sanitize.dtd │ │ │ │ │ │ ├── search.properties │ │ │ │ │ │ ├── searchbar.dtd │ │ │ │ │ │ ├── searchplugins/ │ │ │ │ │ │ │ ├── amazon-france.xml │ │ │ │ │ │ │ ├── bing.xml │ │ │ │ │ │ │ ├── cnrtl-tlfi-fr.xml │ │ │ │ │ │ │ ├── ddg.xml │ │ │ │ │ │ │ ├── google-nocodes.xml │ │ │ │ │ │ │ ├── google.xml │ │ │ │ │ │ │ ├── list.json │ │ │ │ │ │ │ ├── wikipedia-fr.xml │ │ │ │ │ │ │ └── yahoo-france.xml │ │ │ │ │ │ ├── setDesktopBackground.dtd │ │ │ │ │ │ ├── shellservice.properties │ │ │ │ │ │ ├── sitePermissions.properties │ │ │ │ │ │ ├── syncBrand.dtd │ │ │ │ │ │ ├── syncCustomize.dtd │ │ │ │ │ │ ├── syncGenericChange.properties │ │ │ │ │ │ ├── syncKey.dtd │ │ │ │ │ │ ├── syncProgress.dtd │ │ │ │ │ │ ├── syncQuota.dtd │ │ │ │ │ │ ├── syncQuota.properties │ │ │ │ │ │ ├── syncSetup.dtd │ │ │ │ │ │ ├── syncSetup.properties │ │ │ │ │ │ ├── tabbrowser.dtd │ │ │ │ │ │ ├── tabbrowser.properties │ │ │ │ │ │ ├── tabview.properties │ │ │ │ │ │ ├── taskbar.properties │ │ │ │ │ │ ├── translation.dtd │ │ │ │ │ │ ├── translation.properties │ │ │ │ │ │ └── webrtcIndicator.properties │ │ │ │ │ ├── browser-region/ │ │ │ │ │ │ └── region.properties │ │ │ │ │ ├── feedback/ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ └── main.properties │ │ │ │ │ ├── fr/ │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── client/ │ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ │ ├── aboutdebugging.dtd │ │ │ │ │ │ │ │ ├── aboutdebugging.properties │ │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ │ ├── boxmodel.properties │ │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ │ ├── components.properties │ │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ │ ├── dom.properties │ │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ │ ├── filterwidget.dtd │ │ │ │ │ │ │ │ ├── filterwidget.properties │ │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ │ ├── font-inspector.properties │ │ │ │ │ │ │ │ ├── graphs.properties │ │ │ │ │ │ │ │ ├── har.properties │ │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ │ ├── jit-optimizations.properties │ │ │ │ │ │ │ │ ├── jsonview.properties │ │ │ │ │ │ │ │ ├── layout.properties │ │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ │ ├── markers.properties │ │ │ │ │ │ │ │ ├── memory.properties │ │ │ │ │ │ │ │ ├── menus.properties │ │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ │ ├── performance.dtd │ │ │ │ │ │ │ │ ├── performance.properties │ │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ │ ├── promisedebugger.dtd │ │ │ │ │ │ │ │ ├── promisedebugger.properties │ │ │ │ │ │ │ │ ├── responsive.properties │ │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ │ ├── startup.properties │ │ │ │ │ │ │ │ ├── storage.dtd │ │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ │ └── shared/ │ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ │ └── formautofill.properties │ │ │ │ │ └── pdfviewer/ │ │ │ │ │ ├── chrome.properties │ │ │ │ │ └── viewer.properties │ │ │ │ └── fr.manifest │ │ │ ├── chrome.manifest │ │ │ ├── crashreporter-override.ini │ │ │ ├── defaults/ │ │ │ │ ├── preferences/ │ │ │ │ │ └── firefox-l10n.js │ │ │ │ └── profile/ │ │ │ │ ├── bookmarks.html │ │ │ │ ├── chrome/ │ │ │ │ │ ├── userChrome-example.css │ │ │ │ │ └── userContent-example.css │ │ │ │ ├── localstore.rdf │ │ │ │ └── mimeTypes.rdf │ │ │ ├── features/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── firefox@getpocket.com/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── fr/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── fr/ │ │ │ │ │ │ └── pocket.properties │ │ │ │ │ └── fr.manifest │ │ │ │ ├── loop@mozilla.org/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── fr/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── fr/ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ └── fr.manifest │ │ │ │ └── presentation@mozilla.org/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── fr/ │ │ │ │ │ └── locale/ │ │ │ │ │ └── fr/ │ │ │ │ │ └── presentation.properties │ │ │ │ └── fr.manifest │ │ │ └── searchplugins/ │ │ │ ├── amazon-france.xml │ │ │ ├── bing.xml │ │ │ ├── cnrtl-tlfi-fr.xml │ │ │ ├── eBay-france.xml │ │ │ ├── google.xml │ │ │ ├── wikipedia-fr.xml │ │ │ └── yahoo-france.xml │ │ ├── chrome/ │ │ │ ├── fr/ │ │ │ │ └── locale/ │ │ │ │ └── fr/ │ │ │ │ ├── alerts/ │ │ │ │ │ ├── alert.dtd │ │ │ │ │ ├── alert.properties │ │ │ │ │ └── notificationNames.properties │ │ │ │ ├── autoconfig/ │ │ │ │ │ └── autoconfig.properties │ │ │ │ ├── cookie/ │ │ │ │ │ ├── cookieAcceptDialog.dtd │ │ │ │ │ └── cookieAcceptDialog.properties │ │ │ │ ├── formautofill/ │ │ │ │ │ └── requestAutocomplete.dtd │ │ │ │ ├── global/ │ │ │ │ │ ├── AccessFu.properties │ │ │ │ │ ├── about.dtd │ │ │ │ │ ├── aboutAbout.dtd │ │ │ │ │ ├── aboutNetworking.dtd │ │ │ │ │ ├── aboutProfiles.dtd │ │ │ │ │ ├── aboutProfiles.properties │ │ │ │ │ ├── aboutReader.properties │ │ │ │ │ ├── aboutRights.dtd │ │ │ │ │ ├── aboutRights.properties │ │ │ │ │ ├── aboutServiceWorkers.dtd │ │ │ │ │ ├── aboutServiceWorkers.properties │ │ │ │ │ ├── aboutSupport.dtd │ │ │ │ │ ├── aboutSupport.properties │ │ │ │ │ ├── aboutTelemetry.dtd │ │ │ │ │ ├── aboutTelemetry.properties │ │ │ │ │ ├── aboutWebrtc.properties │ │ │ │ │ ├── actions.dtd │ │ │ │ │ ├── appPicker.dtd │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ ├── autocomplete.properties │ │ │ │ │ ├── brand.dtd │ │ │ │ │ ├── browser.properties │ │ │ │ │ ├── charsetMenu.dtd │ │ │ │ │ ├── charsetMenu.properties │ │ │ │ │ ├── charsetOverlay.dtd │ │ │ │ │ ├── charsetTitles.properties │ │ │ │ │ ├── commonDialog.dtd │ │ │ │ │ ├── commonDialogs.properties │ │ │ │ │ ├── config.dtd │ │ │ │ │ ├── config.properties │ │ │ │ │ ├── console.dtd │ │ │ │ │ ├── console.properties │ │ │ │ │ ├── contentAreaCommands.properties │ │ │ │ │ ├── crashes.dtd │ │ │ │ │ ├── crashes.properties │ │ │ │ │ ├── css.properties │ │ │ │ │ ├── customizeCharset.dtd │ │ │ │ │ ├── customizeToolbar.dtd │ │ │ │ │ ├── customizeToolbar.properties │ │ │ │ │ ├── dateFormat.properties │ │ │ │ │ ├── datetimepicker.dtd │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ ├── dialog.properties │ │ │ │ │ ├── dialogOverlay.dtd │ │ │ │ │ ├── dom/ │ │ │ │ │ │ └── dom.properties │ │ │ │ │ ├── downloadProgress.properties │ │ │ │ │ ├── editMenuOverlay.dtd │ │ │ │ │ ├── extensions.properties │ │ │ │ │ ├── fallbackMenubar.properties │ │ │ │ │ ├── filefield.properties │ │ │ │ │ ├── filepicker.dtd │ │ │ │ │ ├── filepicker.properties │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── findbar.properties │ │ │ │ │ ├── finddialog.dtd │ │ │ │ │ ├── finddialog.properties │ │ │ │ │ ├── global-strres.properties │ │ │ │ │ ├── global.dtd │ │ │ │ │ ├── globalKeys.dtd │ │ │ │ │ ├── headsUpDisplay.properties │ │ │ │ │ ├── intl.css │ │ │ │ │ ├── intl.properties │ │ │ │ │ ├── keys.properties │ │ │ │ │ ├── languageNames.properties │ │ │ │ │ ├── layout/ │ │ │ │ │ │ ├── HtmlForm.properties │ │ │ │ │ │ ├── MediaDocument.properties │ │ │ │ │ │ ├── htmlparser.properties │ │ │ │ │ │ └── xmlparser.properties │ │ │ │ │ ├── layout_errors.properties │ │ │ │ │ ├── mathml/ │ │ │ │ │ │ └── mathml.properties │ │ │ │ │ ├── mozilla.dtd │ │ │ │ │ ├── narrate.properties │ │ │ │ │ ├── netError.dtd │ │ │ │ │ ├── netErrorApp.dtd │ │ │ │ │ ├── notification.dtd │ │ │ │ │ ├── nsWebBrowserPersist.properties │ │ │ │ │ ├── plugins.properties │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ ├── printPageSetup.dtd │ │ │ │ │ ├── printPreview.dtd │ │ │ │ │ ├── printPreviewProgress.dtd │ │ │ │ │ ├── printProgress.dtd │ │ │ │ │ ├── printdialog.dtd │ │ │ │ │ ├── printdialog.properties │ │ │ │ │ ├── printing.properties │ │ │ │ │ ├── printjoboptions.dtd │ │ │ │ │ ├── regionNames.properties │ │ │ │ │ ├── resetProfile.dtd │ │ │ │ │ ├── resetProfile.properties │ │ │ │ │ ├── search/ │ │ │ │ │ │ └── search.properties │ │ │ │ │ ├── security/ │ │ │ │ │ │ ├── caps.properties │ │ │ │ │ │ ├── csp.properties │ │ │ │ │ │ └── security.properties │ │ │ │ │ ├── storage.properties │ │ │ │ │ ├── svg/ │ │ │ │ │ │ └── svg.properties │ │ │ │ │ ├── textcontext.dtd │ │ │ │ │ ├── tree.dtd │ │ │ │ │ ├── videocontrols.dtd │ │ │ │ │ ├── viewSource.dtd │ │ │ │ │ ├── viewSource.properties │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ ├── webapps.properties │ │ │ │ │ ├── wizard.dtd │ │ │ │ │ ├── wizard.properties │ │ │ │ │ ├── xbl.properties │ │ │ │ │ ├── xml/ │ │ │ │ │ │ └── prettyprint.dtd │ │ │ │ │ ├── xpinstall/ │ │ │ │ │ │ └── xpinstall.properties │ │ │ │ │ ├── xslt/ │ │ │ │ │ │ └── xslt.properties │ │ │ │ │ └── xul.properties │ │ │ │ ├── global-platform/ │ │ │ │ │ ├── mac/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ ├── unix/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ └── win/ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ ├── intl.properties │ │ │ │ │ └── platformKeys.properties │ │ │ │ ├── global-region/ │ │ │ │ │ └── region.properties │ │ │ │ ├── mozapps/ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ ├── settingsChange.dtd │ │ │ │ │ │ ├── unknownContentType.dtd │ │ │ │ │ │ └── unknownContentType.properties │ │ │ │ │ ├── extensions/ │ │ │ │ │ │ ├── about.dtd │ │ │ │ │ │ ├── blocklist.dtd │ │ │ │ │ │ ├── extensions.dtd │ │ │ │ │ │ ├── extensions.properties │ │ │ │ │ │ ├── newaddon.dtd │ │ │ │ │ │ ├── newaddon.properties │ │ │ │ │ │ ├── selectAddons.dtd │ │ │ │ │ │ ├── selectAddons.properties │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── handling/ │ │ │ │ │ │ ├── handling.dtd │ │ │ │ │ │ └── handling.properties │ │ │ │ │ ├── plugins/ │ │ │ │ │ │ ├── plugins.dtd │ │ │ │ │ │ └── plugins.properties │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ ├── changemp.dtd │ │ │ │ │ │ ├── ocsp.dtd │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ └── removemp.dtd │ │ │ │ │ ├── profile/ │ │ │ │ │ │ ├── createProfileWizard.dtd │ │ │ │ │ │ ├── profileSelection.dtd │ │ │ │ │ │ └── profileSelection.properties │ │ │ │ │ ├── update/ │ │ │ │ │ │ ├── history.dtd │ │ │ │ │ │ ├── updates.dtd │ │ │ │ │ │ └── updates.properties │ │ │ │ │ └── xpinstall/ │ │ │ │ │ ├── xpinstallConfirm.dtd │ │ │ │ │ └── xpinstallConfirm.properties │ │ │ │ ├── necko/ │ │ │ │ │ └── necko.properties │ │ │ │ ├── passwordmgr/ │ │ │ │ │ ├── passwordManager.dtd │ │ │ │ │ └── passwordmgr.properties │ │ │ │ ├── pipnss/ │ │ │ │ │ ├── nsserrors.properties │ │ │ │ │ ├── pipnss.properties │ │ │ │ │ └── security.properties │ │ │ │ ├── pippki/ │ │ │ │ │ ├── certManager.dtd │ │ │ │ │ ├── deviceManager.dtd │ │ │ │ │ ├── pippki.dtd │ │ │ │ │ ├── pippki.properties │ │ │ │ │ └── validation.dtd │ │ │ │ ├── places/ │ │ │ │ │ └── places.properties │ │ │ │ ├── pluginproblem/ │ │ │ │ │ └── pluginproblem.dtd │ │ │ │ └── services/ │ │ │ │ ├── errors.properties │ │ │ │ └── sync.properties │ │ │ └── fr.manifest │ │ ├── chrome.manifest │ │ └── install.rdf │ ├── getlangpacks.sh │ ├── gl/ │ │ ├── bluegriffon/ │ │ │ └── chrome.manifest │ │ ├── browser/ │ │ │ ├── chrome/ │ │ │ │ ├── gl/ │ │ │ │ │ └── locale/ │ │ │ │ │ ├── branding/ │ │ │ │ │ │ ├── brand.dtd │ │ │ │ │ │ ├── brand.properties │ │ │ │ │ │ └── browserconfig.properties │ │ │ │ │ ├── browser/ │ │ │ │ │ │ ├── aboutAccounts.dtd │ │ │ │ │ │ ├── aboutCertError.dtd │ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ │ ├── aboutHealthReport.dtd │ │ │ │ │ │ ├── aboutHome.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.properties │ │ │ │ │ │ ├── aboutRobots.dtd │ │ │ │ │ │ ├── aboutSearchReset.dtd │ │ │ │ │ │ ├── aboutSessionRestore.dtd │ │ │ │ │ │ ├── aboutSyncTabs.dtd │ │ │ │ │ │ ├── aboutTabCrashed.dtd │ │ │ │ │ │ ├── accounts.properties │ │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ │ ├── baseMenuOverlay.dtd │ │ │ │ │ │ ├── bookmarks.html │ │ │ │ │ │ ├── browser.dtd │ │ │ │ │ │ ├── browser.properties │ │ │ │ │ │ ├── customizableui/ │ │ │ │ │ │ │ └── customizableWidgets.properties │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ ├── app-manager.dtd │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ ├── profiler.dtd │ │ │ │ │ │ │ ├── profiler.properties │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ ├── styleinspector.properties │ │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ │ ├── timeline.dtd │ │ │ │ │ │ │ ├── timeline.properties │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ │ └── settingsChange.dtd │ │ │ │ │ │ ├── engineManager.dtd │ │ │ │ │ │ ├── engineManager.properties │ │ │ │ │ │ ├── feeds/ │ │ │ │ │ │ │ ├── subscribe.dtd │ │ │ │ │ │ │ └── subscribe.properties │ │ │ │ │ │ ├── lightweightThemes.properties │ │ │ │ │ │ ├── loop/ │ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ │ ├── migration/ │ │ │ │ │ │ │ ├── migration.dtd │ │ │ │ │ │ │ └── migration.properties │ │ │ │ │ │ ├── netError.dtd │ │ │ │ │ │ ├── newTab.dtd │ │ │ │ │ │ ├── newTab.properties │ │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ │ ├── pageInfo.dtd │ │ │ │ │ │ ├── pageInfo.properties │ │ │ │ │ │ ├── places/ │ │ │ │ │ │ │ ├── bookmarkProperties.properties │ │ │ │ │ │ │ ├── editBookmarkOverlay.dtd │ │ │ │ │ │ │ ├── moveBookmarks.dtd │ │ │ │ │ │ │ ├── places.dtd │ │ │ │ │ │ │ └── places.properties │ │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ │ ├── aboutPermissions.dtd │ │ │ │ │ │ │ ├── aboutPermissions.properties │ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ │ ├── applicationManager.dtd │ │ │ │ │ │ │ ├── applicationManager.properties │ │ │ │ │ │ │ ├── applications.dtd │ │ │ │ │ │ │ ├── blocklists.dtd │ │ │ │ │ │ │ ├── colors.dtd │ │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ │ ├── containers.dtd │ │ │ │ │ │ │ ├── containers.properties │ │ │ │ │ │ │ ├── content.dtd │ │ │ │ │ │ │ ├── cookies.dtd │ │ │ │ │ │ │ ├── donottrack.dtd │ │ │ │ │ │ │ ├── fonts.dtd │ │ │ │ │ │ │ ├── languages.dtd │ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ │ ├── permissions.dtd │ │ │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ │ ├── privacy.dtd │ │ │ │ │ │ │ ├── search.dtd │ │ │ │ │ │ │ ├── security.dtd │ │ │ │ │ │ │ ├── selectBookmark.dtd │ │ │ │ │ │ │ ├── siteDataSettings.dtd │ │ │ │ │ │ │ ├── sync.dtd │ │ │ │ │ │ │ ├── tabs.dtd │ │ │ │ │ │ │ └── translation.dtd │ │ │ │ │ │ ├── quitDialog.properties │ │ │ │ │ │ ├── safeMode.dtd │ │ │ │ │ │ ├── safebrowsing/ │ │ │ │ │ │ │ ├── phishing-afterload-warning-message.dtd │ │ │ │ │ │ │ └── report-phishing.dtd │ │ │ │ │ │ ├── sanitize.dtd │ │ │ │ │ │ ├── search.properties │ │ │ │ │ │ ├── searchbar.dtd │ │ │ │ │ │ ├── searchplugins/ │ │ │ │ │ │ │ ├── amazon-en-GB.xml │ │ │ │ │ │ │ ├── ddg.xml │ │ │ │ │ │ │ ├── google-nocodes.xml │ │ │ │ │ │ │ ├── google.xml │ │ │ │ │ │ │ ├── list.json │ │ │ │ │ │ │ ├── wikipedia-gl.xml │ │ │ │ │ │ │ └── yahoo-es.xml │ │ │ │ │ │ ├── setDesktopBackground.dtd │ │ │ │ │ │ ├── shellservice.properties │ │ │ │ │ │ ├── sitePermissions.properties │ │ │ │ │ │ ├── syncBrand.dtd │ │ │ │ │ │ ├── syncCustomize.dtd │ │ │ │ │ │ ├── syncGenericChange.properties │ │ │ │ │ │ ├── syncKey.dtd │ │ │ │ │ │ ├── syncProgress.dtd │ │ │ │ │ │ ├── syncQuota.dtd │ │ │ │ │ │ ├── syncQuota.properties │ │ │ │ │ │ ├── syncSetup.dtd │ │ │ │ │ │ ├── syncSetup.properties │ │ │ │ │ │ ├── tabbrowser.dtd │ │ │ │ │ │ ├── tabbrowser.properties │ │ │ │ │ │ ├── tabview.properties │ │ │ │ │ │ ├── taskbar.properties │ │ │ │ │ │ ├── translation.dtd │ │ │ │ │ │ ├── translation.properties │ │ │ │ │ │ └── webrtcIndicator.properties │ │ │ │ │ ├── browser-region/ │ │ │ │ │ │ └── region.properties │ │ │ │ │ ├── feedback/ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ └── main.properties │ │ │ │ │ ├── gl/ │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── client/ │ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ │ ├── aboutdebugging.dtd │ │ │ │ │ │ │ │ ├── aboutdebugging.properties │ │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ │ ├── app-manager.dtd │ │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ │ ├── boxmodel.properties │ │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ │ ├── components.properties │ │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ │ ├── dom.properties │ │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ │ ├── filterwidget.dtd │ │ │ │ │ │ │ │ ├── filterwidget.properties │ │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ │ ├── font-inspector.properties │ │ │ │ │ │ │ │ ├── graphs.properties │ │ │ │ │ │ │ │ ├── har.properties │ │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ │ ├── jit-optimizations.properties │ │ │ │ │ │ │ │ ├── jsonview.properties │ │ │ │ │ │ │ │ ├── layout.properties │ │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ │ ├── markers.properties │ │ │ │ │ │ │ │ ├── memory.properties │ │ │ │ │ │ │ │ ├── menus.properties │ │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ │ ├── performance.dtd │ │ │ │ │ │ │ │ ├── performance.properties │ │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ │ ├── promisedebugger.dtd │ │ │ │ │ │ │ │ ├── promisedebugger.properties │ │ │ │ │ │ │ │ ├── responsive.properties │ │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ │ ├── startup.properties │ │ │ │ │ │ │ │ ├── storage.dtd │ │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ │ └── shared/ │ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ │ └── formautofill.properties │ │ │ │ │ └── pdfviewer/ │ │ │ │ │ ├── chrome.properties │ │ │ │ │ └── viewer.properties │ │ │ │ └── gl.manifest │ │ │ ├── chrome.manifest │ │ │ ├── crashreporter-override.ini │ │ │ ├── defaults/ │ │ │ │ ├── preferences/ │ │ │ │ │ └── firefox-l10n.js │ │ │ │ └── profile/ │ │ │ │ ├── bookmarks.html │ │ │ │ ├── chrome/ │ │ │ │ │ ├── userChrome-example.css │ │ │ │ │ └── userContent-example.css │ │ │ │ ├── localstore.rdf │ │ │ │ └── mimeTypes.rdf │ │ │ ├── features/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── firefox@getpocket.com/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── gl/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── gl/ │ │ │ │ │ │ └── pocket.properties │ │ │ │ │ └── gl.manifest │ │ │ │ ├── loop@mozilla.org/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── gl/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── gl/ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ └── gl.manifest │ │ │ │ └── presentation@mozilla.org/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── gl/ │ │ │ │ │ └── locale/ │ │ │ │ │ └── gl/ │ │ │ │ │ └── presentation.properties │ │ │ │ └── gl.manifest │ │ │ └── searchplugins/ │ │ │ ├── amazon-en-GB.xml │ │ │ ├── creativecommons.xml │ │ │ ├── eBay-es.xml │ │ │ ├── google.xml │ │ │ ├── wikipedia-gl.xml │ │ │ └── yahoo-es.xml │ │ ├── chrome/ │ │ │ ├── gl/ │ │ │ │ └── locale/ │ │ │ │ ├── gl/ │ │ │ │ │ ├── alerts/ │ │ │ │ │ │ ├── alert.dtd │ │ │ │ │ │ ├── alert.properties │ │ │ │ │ │ └── notificationNames.properties │ │ │ │ │ ├── autoconfig/ │ │ │ │ │ │ └── autoconfig.properties │ │ │ │ │ ├── cookie/ │ │ │ │ │ │ ├── cookieAcceptDialog.dtd │ │ │ │ │ │ └── cookieAcceptDialog.properties │ │ │ │ │ ├── formautofill/ │ │ │ │ │ │ └── requestAutocomplete.dtd │ │ │ │ │ ├── global/ │ │ │ │ │ │ ├── AccessFu.properties │ │ │ │ │ │ ├── about.dtd │ │ │ │ │ │ ├── aboutAbout.dtd │ │ │ │ │ │ ├── aboutNetworking.dtd │ │ │ │ │ │ ├── aboutProfiles.dtd │ │ │ │ │ │ ├── aboutProfiles.properties │ │ │ │ │ │ ├── aboutReader.properties │ │ │ │ │ │ ├── aboutRights.dtd │ │ │ │ │ │ ├── aboutRights.properties │ │ │ │ │ │ ├── aboutServiceWorkers.dtd │ │ │ │ │ │ ├── aboutServiceWorkers.properties │ │ │ │ │ │ ├── aboutSupport.dtd │ │ │ │ │ │ ├── aboutSupport.properties │ │ │ │ │ │ ├── aboutTelemetry.dtd │ │ │ │ │ │ ├── aboutTelemetry.properties │ │ │ │ │ │ ├── aboutWebrtc.properties │ │ │ │ │ │ ├── actions.dtd │ │ │ │ │ │ ├── appPicker.dtd │ │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ │ ├── autocomplete.properties │ │ │ │ │ │ ├── brand.dtd │ │ │ │ │ │ ├── browser.properties │ │ │ │ │ │ ├── charsetMenu.dtd │ │ │ │ │ │ ├── charsetMenu.properties │ │ │ │ │ │ ├── charsetOverlay.dtd │ │ │ │ │ │ ├── charsetTitles.properties │ │ │ │ │ │ ├── commonDialog.dtd │ │ │ │ │ │ ├── commonDialogs.properties │ │ │ │ │ │ ├── config.dtd │ │ │ │ │ │ ├── config.properties │ │ │ │ │ │ ├── console.dtd │ │ │ │ │ │ ├── console.properties │ │ │ │ │ │ ├── contentAreaCommands.properties │ │ │ │ │ │ ├── crashes.dtd │ │ │ │ │ │ ├── crashes.properties │ │ │ │ │ │ ├── css.properties │ │ │ │ │ │ ├── customizeCharset.dtd │ │ │ │ │ │ ├── customizeToolbar.dtd │ │ │ │ │ │ ├── customizeToolbar.properties │ │ │ │ │ │ ├── dateFormat.properties │ │ │ │ │ │ ├── datetimepicker.dtd │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ │ ├── dialog.properties │ │ │ │ │ │ ├── dialogOverlay.dtd │ │ │ │ │ │ ├── dom/ │ │ │ │ │ │ │ └── dom.properties │ │ │ │ │ │ ├── downloadProgress.properties │ │ │ │ │ │ ├── editMenuOverlay.dtd │ │ │ │ │ │ ├── extensions.properties │ │ │ │ │ │ ├── fallbackMenubar.properties │ │ │ │ │ │ ├── filefield.properties │ │ │ │ │ │ ├── filepicker.dtd │ │ │ │ │ │ ├── filepicker.properties │ │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ │ ├── findbar.properties │ │ │ │ │ │ ├── finddialog.dtd │ │ │ │ │ │ ├── finddialog.properties │ │ │ │ │ │ ├── global-strres.properties │ │ │ │ │ │ ├── global.dtd │ │ │ │ │ │ ├── globalKeys.dtd │ │ │ │ │ │ ├── headsUpDisplay.properties │ │ │ │ │ │ ├── intl.css │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ ├── keys.properties │ │ │ │ │ │ ├── languageNames.properties │ │ │ │ │ │ ├── layout/ │ │ │ │ │ │ │ ├── HtmlForm.properties │ │ │ │ │ │ │ ├── MediaDocument.properties │ │ │ │ │ │ │ ├── htmlparser.properties │ │ │ │ │ │ │ └── xmlparser.properties │ │ │ │ │ │ ├── layout_errors.properties │ │ │ │ │ │ ├── mathml/ │ │ │ │ │ │ │ └── mathml.properties │ │ │ │ │ │ ├── mozilla.dtd │ │ │ │ │ │ ├── narrate.properties │ │ │ │ │ │ ├── netError.dtd │ │ │ │ │ │ ├── netErrorApp.dtd │ │ │ │ │ │ ├── notification.dtd │ │ │ │ │ │ ├── nsWebBrowserPersist.properties │ │ │ │ │ │ ├── plugins.properties │ │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ │ ├── printPageSetup.dtd │ │ │ │ │ │ ├── printPreview.dtd │ │ │ │ │ │ ├── printPreviewProgress.dtd │ │ │ │ │ │ ├── printProgress.dtd │ │ │ │ │ │ ├── printdialog.dtd │ │ │ │ │ │ ├── printdialog.properties │ │ │ │ │ │ ├── printing.properties │ │ │ │ │ │ ├── printjoboptions.dtd │ │ │ │ │ │ ├── regionNames.properties │ │ │ │ │ │ ├── resetProfile.dtd │ │ │ │ │ │ ├── resetProfile.properties │ │ │ │ │ │ ├── search/ │ │ │ │ │ │ │ └── search.properties │ │ │ │ │ │ ├── security/ │ │ │ │ │ │ │ ├── caps.properties │ │ │ │ │ │ │ ├── csp.properties │ │ │ │ │ │ │ └── security.properties │ │ │ │ │ │ ├── svg/ │ │ │ │ │ │ │ └── svg.properties │ │ │ │ │ │ ├── textcontext.dtd │ │ │ │ │ │ ├── tree.dtd │ │ │ │ │ │ ├── videocontrols.dtd │ │ │ │ │ │ ├── viewSource.dtd │ │ │ │ │ │ ├── viewSource.properties │ │ │ │ │ │ ├── webapps.properties │ │ │ │ │ │ ├── wizard.dtd │ │ │ │ │ │ ├── wizard.properties │ │ │ │ │ │ ├── xbl.properties │ │ │ │ │ │ ├── xml/ │ │ │ │ │ │ │ └── prettyprint.dtd │ │ │ │ │ │ ├── xpinstall/ │ │ │ │ │ │ │ └── xpinstall.properties │ │ │ │ │ │ ├── xslt/ │ │ │ │ │ │ │ └── xslt.properties │ │ │ │ │ │ └── xul.properties │ │ │ │ │ ├── global-platform/ │ │ │ │ │ │ ├── mac/ │ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ │ ├── unix/ │ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ │ └── win/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ ├── global-region/ │ │ │ │ │ │ └── region.properties │ │ │ │ │ ├── mozapps/ │ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ │ ├── settingsChange.dtd │ │ │ │ │ │ │ ├── unknownContentType.dtd │ │ │ │ │ │ │ └── unknownContentType.properties │ │ │ │ │ │ ├── extensions/ │ │ │ │ │ │ │ ├── about.dtd │ │ │ │ │ │ │ ├── blocklist.dtd │ │ │ │ │ │ │ ├── extensions.dtd │ │ │ │ │ │ │ ├── extensions.properties │ │ │ │ │ │ │ ├── newaddon.dtd │ │ │ │ │ │ │ ├── newaddon.properties │ │ │ │ │ │ │ ├── selectAddons.dtd │ │ │ │ │ │ │ ├── selectAddons.properties │ │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ │ └── update.properties │ │ │ │ │ │ ├── handling/ │ │ │ │ │ │ │ ├── handling.dtd │ │ │ │ │ │ │ └── handling.properties │ │ │ │ │ │ ├── plugins/ │ │ │ │ │ │ │ ├── plugins.dtd │ │ │ │ │ │ │ └── plugins.properties │ │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ │ ├── changemp.dtd │ │ │ │ │ │ │ ├── ocsp.dtd │ │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ │ └── removemp.dtd │ │ │ │ │ │ ├── profile/ │ │ │ │ │ │ │ ├── createProfileWizard.dtd │ │ │ │ │ │ │ ├── profileSelection.dtd │ │ │ │ │ │ │ └── profileSelection.properties │ │ │ │ │ │ ├── update/ │ │ │ │ │ │ │ ├── history.dtd │ │ │ │ │ │ │ ├── updates.dtd │ │ │ │ │ │ │ └── updates.properties │ │ │ │ │ │ └── xpinstall/ │ │ │ │ │ │ ├── xpinstallConfirm.dtd │ │ │ │ │ │ └── xpinstallConfirm.properties │ │ │ │ │ ├── necko/ │ │ │ │ │ │ └── necko.properties │ │ │ │ │ ├── passwordmgr/ │ │ │ │ │ │ ├── passwordManager.dtd │ │ │ │ │ │ └── passwordmgr.properties │ │ │ │ │ ├── pipnss/ │ │ │ │ │ │ ├── nsserrors.properties │ │ │ │ │ │ ├── pipnss.properties │ │ │ │ │ │ └── security.properties │ │ │ │ │ ├── pippki/ │ │ │ │ │ │ ├── certManager.dtd │ │ │ │ │ │ ├── deviceManager.dtd │ │ │ │ │ │ ├── pippki.dtd │ │ │ │ │ │ ├── pippki.properties │ │ │ │ │ │ └── validation.dtd │ │ │ │ │ ├── places/ │ │ │ │ │ │ └── places.properties │ │ │ │ │ ├── pluginproblem/ │ │ │ │ │ │ └── pluginproblem.dtd │ │ │ │ │ └── services/ │ │ │ │ │ ├── errors.properties │ │ │ │ │ └── sync.properties │ │ │ │ └── webapprt/ │ │ │ │ ├── webapp.dtd │ │ │ │ └── webapp.properties │ │ │ └── gl.manifest │ │ ├── chrome.manifest │ │ └── install.rdf │ ├── he/ │ │ ├── bluegriffon/ │ │ │ └── chrome.manifest │ │ ├── browser/ │ │ │ ├── chrome/ │ │ │ │ ├── he/ │ │ │ │ │ └── locale/ │ │ │ │ │ ├── branding/ │ │ │ │ │ │ ├── brand.dtd │ │ │ │ │ │ ├── brand.properties │ │ │ │ │ │ └── browserconfig.properties │ │ │ │ │ ├── browser/ │ │ │ │ │ │ ├── aboutAccounts.dtd │ │ │ │ │ │ ├── aboutCertError.dtd │ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ │ ├── aboutHealthReport.dtd │ │ │ │ │ │ ├── aboutHome.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.properties │ │ │ │ │ │ ├── aboutRobots.dtd │ │ │ │ │ │ ├── aboutSearchReset.dtd │ │ │ │ │ │ ├── aboutSessionRestore.dtd │ │ │ │ │ │ ├── aboutSyncTabs.dtd │ │ │ │ │ │ ├── aboutTabCrashed.dtd │ │ │ │ │ │ ├── accounts.properties │ │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ │ ├── baseMenuOverlay.dtd │ │ │ │ │ │ ├── bookmarks.html │ │ │ │ │ │ ├── browser.dtd │ │ │ │ │ │ ├── browser.properties │ │ │ │ │ │ ├── customizableui/ │ │ │ │ │ │ │ └── customizableWidgets.properties │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ ├── app-manager.dtd │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ ├── profiler.dtd │ │ │ │ │ │ │ ├── profiler.properties │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ ├── styleinspector.properties │ │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ │ ├── timeline.dtd │ │ │ │ │ │ │ ├── timeline.properties │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ │ └── settingsChange.dtd │ │ │ │ │ │ ├── engineManager.dtd │ │ │ │ │ │ ├── engineManager.properties │ │ │ │ │ │ ├── feeds/ │ │ │ │ │ │ │ ├── subscribe.dtd │ │ │ │ │ │ │ └── subscribe.properties │ │ │ │ │ │ ├── lightweightThemes.properties │ │ │ │ │ │ ├── loop/ │ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ │ ├── migration/ │ │ │ │ │ │ │ ├── migration.dtd │ │ │ │ │ │ │ └── migration.properties │ │ │ │ │ │ ├── netError.dtd │ │ │ │ │ │ ├── newTab.dtd │ │ │ │ │ │ ├── newTab.properties │ │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ │ ├── pageInfo.dtd │ │ │ │ │ │ ├── pageInfo.properties │ │ │ │ │ │ ├── places/ │ │ │ │ │ │ │ ├── bookmarkProperties.properties │ │ │ │ │ │ │ ├── editBookmarkOverlay.dtd │ │ │ │ │ │ │ ├── moveBookmarks.dtd │ │ │ │ │ │ │ ├── places.dtd │ │ │ │ │ │ │ └── places.properties │ │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ │ ├── aboutPermissions.dtd │ │ │ │ │ │ │ ├── aboutPermissions.properties │ │ │ │ │ │ │ ├── advanced-scripts.dtd │ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ │ ├── applicationManager.dtd │ │ │ │ │ │ │ ├── applicationManager.properties │ │ │ │ │ │ │ ├── applications.dtd │ │ │ │ │ │ │ ├── blocklists.dtd │ │ │ │ │ │ │ ├── colors.dtd │ │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ │ ├── containers.dtd │ │ │ │ │ │ │ ├── containers.properties │ │ │ │ │ │ │ ├── content.dtd │ │ │ │ │ │ │ ├── cookies.dtd │ │ │ │ │ │ │ ├── donottrack.dtd │ │ │ │ │ │ │ ├── fonts.dtd │ │ │ │ │ │ │ ├── languages.dtd │ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ │ ├── permissions.dtd │ │ │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ │ ├── privacy.dtd │ │ │ │ │ │ │ ├── search.dtd │ │ │ │ │ │ │ ├── security.dtd │ │ │ │ │ │ │ ├── selectBookmark.dtd │ │ │ │ │ │ │ ├── siteDataSettings.dtd │ │ │ │ │ │ │ ├── sync.dtd │ │ │ │ │ │ │ ├── tabs.dtd │ │ │ │ │ │ │ └── translation.dtd │ │ │ │ │ │ ├── quitDialog.properties │ │ │ │ │ │ ├── safeMode.dtd │ │ │ │ │ │ ├── safebrowsing/ │ │ │ │ │ │ │ ├── phishing-afterload-warning-message.dtd │ │ │ │ │ │ │ └── report-phishing.dtd │ │ │ │ │ │ ├── sanitize.dtd │ │ │ │ │ │ ├── search.properties │ │ │ │ │ │ ├── searchbar.dtd │ │ │ │ │ │ ├── searchplugins/ │ │ │ │ │ │ │ ├── ddg.xml │ │ │ │ │ │ │ ├── google-nocodes.xml │ │ │ │ │ │ │ ├── google.xml │ │ │ │ │ │ │ ├── list.json │ │ │ │ │ │ │ ├── morfix-dic.xml │ │ │ │ │ │ │ ├── wikipedia-he.xml │ │ │ │ │ │ │ └── yahoo.xml │ │ │ │ │ │ ├── setDesktopBackground.dtd │ │ │ │ │ │ ├── shellservice.properties │ │ │ │ │ │ ├── sitePermissions.properties │ │ │ │ │ │ ├── syncBrand.dtd │ │ │ │ │ │ ├── syncCustomize.dtd │ │ │ │ │ │ ├── syncGenericChange.properties │ │ │ │ │ │ ├── syncKey.dtd │ │ │ │ │ │ ├── syncProgress.dtd │ │ │ │ │ │ ├── syncQuota.dtd │ │ │ │ │ │ ├── syncQuota.properties │ │ │ │ │ │ ├── syncSetup.dtd │ │ │ │ │ │ ├── syncSetup.properties │ │ │ │ │ │ ├── tabbrowser.dtd │ │ │ │ │ │ ├── tabbrowser.properties │ │ │ │ │ │ ├── tabview.properties │ │ │ │ │ │ ├── taskbar.properties │ │ │ │ │ │ ├── translation.dtd │ │ │ │ │ │ ├── translation.properties │ │ │ │ │ │ └── webrtcIndicator.properties │ │ │ │ │ ├── browser-region/ │ │ │ │ │ │ └── region.properties │ │ │ │ │ ├── feedback/ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ └── main.properties │ │ │ │ │ ├── he/ │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── client/ │ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ │ ├── aboutdebugging.dtd │ │ │ │ │ │ │ │ ├── aboutdebugging.properties │ │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ │ ├── app-manager.dtd │ │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ │ ├── boxmodel.properties │ │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ │ ├── components.properties │ │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ │ ├── dom.properties │ │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ │ ├── filterwidget.dtd │ │ │ │ │ │ │ │ ├── filterwidget.properties │ │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ │ ├── font-inspector.properties │ │ │ │ │ │ │ │ ├── graphs.properties │ │ │ │ │ │ │ │ ├── har.properties │ │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ │ ├── jit-optimizations.properties │ │ │ │ │ │ │ │ ├── jsonview.properties │ │ │ │ │ │ │ │ ├── layout.properties │ │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ │ ├── markers.properties │ │ │ │ │ │ │ │ ├── memory.properties │ │ │ │ │ │ │ │ ├── menus.properties │ │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ │ ├── performance.dtd │ │ │ │ │ │ │ │ ├── performance.properties │ │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ │ ├── promisedebugger.dtd │ │ │ │ │ │ │ │ ├── promisedebugger.properties │ │ │ │ │ │ │ │ ├── responsive.properties │ │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ │ ├── startup.properties │ │ │ │ │ │ │ │ ├── storage.dtd │ │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ │ └── shared/ │ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ │ └── formautofill.properties │ │ │ │ │ └── pdfviewer/ │ │ │ │ │ ├── chrome.properties │ │ │ │ │ └── viewer.properties │ │ │ │ └── he.manifest │ │ │ ├── chrome.manifest │ │ │ ├── crashreporter-override.ini │ │ │ ├── defaults/ │ │ │ │ ├── preferences/ │ │ │ │ │ └── firefox-l10n.js │ │ │ │ └── profile/ │ │ │ │ ├── bookmarks.html │ │ │ │ ├── chrome/ │ │ │ │ │ ├── userChrome-example.css │ │ │ │ │ └── userContent-example.css │ │ │ │ ├── localstore.rdf │ │ │ │ └── mimeTypes.rdf │ │ │ ├── features/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── firefox@getpocket.com/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── he/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── he/ │ │ │ │ │ │ └── pocket.properties │ │ │ │ │ └── he.manifest │ │ │ │ ├── loop@mozilla.org/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── he/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── he/ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ └── he.manifest │ │ │ │ └── presentation@mozilla.org/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── he/ │ │ │ │ │ └── locale/ │ │ │ │ │ └── he/ │ │ │ │ │ └── presentation.properties │ │ │ │ └── he.manifest │ │ │ └── searchplugins/ │ │ │ ├── google.xml │ │ │ ├── morfix-dic.xml │ │ │ ├── wikipedia-he.xml │ │ │ └── yahoo.xml │ │ ├── chrome/ │ │ │ ├── he/ │ │ │ │ └── locale/ │ │ │ │ └── he/ │ │ │ │ ├── alerts/ │ │ │ │ │ ├── alert.dtd │ │ │ │ │ ├── alert.properties │ │ │ │ │ └── notificationNames.properties │ │ │ │ ├── autoconfig/ │ │ │ │ │ └── autoconfig.properties │ │ │ │ ├── cookie/ │ │ │ │ │ ├── cookieAcceptDialog.dtd │ │ │ │ │ └── cookieAcceptDialog.properties │ │ │ │ ├── formautofill/ │ │ │ │ │ └── requestAutocomplete.dtd │ │ │ │ ├── global/ │ │ │ │ │ ├── AccessFu.properties │ │ │ │ │ ├── about.dtd │ │ │ │ │ ├── aboutAbout.dtd │ │ │ │ │ ├── aboutNetworking.dtd │ │ │ │ │ ├── aboutProfiles.dtd │ │ │ │ │ ├── aboutProfiles.properties │ │ │ │ │ ├── aboutReader.properties │ │ │ │ │ ├── aboutRights.dtd │ │ │ │ │ ├── aboutRights.properties │ │ │ │ │ ├── aboutServiceWorkers.dtd │ │ │ │ │ ├── aboutServiceWorkers.properties │ │ │ │ │ ├── aboutSupport.dtd │ │ │ │ │ ├── aboutSupport.properties │ │ │ │ │ ├── aboutTelemetry.dtd │ │ │ │ │ ├── aboutTelemetry.properties │ │ │ │ │ ├── aboutWebrtc.properties │ │ │ │ │ ├── actions.dtd │ │ │ │ │ ├── appPicker.dtd │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ ├── autocomplete.properties │ │ │ │ │ ├── brand.dtd │ │ │ │ │ ├── browser.properties │ │ │ │ │ ├── charsetMenu.dtd │ │ │ │ │ ├── charsetMenu.properties │ │ │ │ │ ├── charsetOverlay.dtd │ │ │ │ │ ├── charsetTitles.properties │ │ │ │ │ ├── commonDialog.dtd │ │ │ │ │ ├── commonDialogs.properties │ │ │ │ │ ├── config.dtd │ │ │ │ │ ├── config.properties │ │ │ │ │ ├── console.dtd │ │ │ │ │ ├── console.properties │ │ │ │ │ ├── contentAreaCommands.properties │ │ │ │ │ ├── crashes.dtd │ │ │ │ │ ├── crashes.properties │ │ │ │ │ ├── css.properties │ │ │ │ │ ├── customizeCharset.dtd │ │ │ │ │ ├── customizeToolbar.dtd │ │ │ │ │ ├── customizeToolbar.properties │ │ │ │ │ ├── dateFormat.properties │ │ │ │ │ ├── datetimepicker.dtd │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ ├── dialog.properties │ │ │ │ │ ├── dialogOverlay.dtd │ │ │ │ │ ├── dom/ │ │ │ │ │ │ └── dom.properties │ │ │ │ │ ├── downloadProgress.properties │ │ │ │ │ ├── editMenuOverlay.dtd │ │ │ │ │ ├── extensions.properties │ │ │ │ │ ├── fallbackMenubar.properties │ │ │ │ │ ├── filefield.properties │ │ │ │ │ ├── filepicker.dtd │ │ │ │ │ ├── filepicker.properties │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── findbar.properties │ │ │ │ │ ├── finddialog.dtd │ │ │ │ │ ├── finddialog.properties │ │ │ │ │ ├── global-strres.properties │ │ │ │ │ ├── global.dtd │ │ │ │ │ ├── globalKeys.dtd │ │ │ │ │ ├── headsUpDisplay.properties │ │ │ │ │ ├── intl.css │ │ │ │ │ ├── intl.properties │ │ │ │ │ ├── keys.properties │ │ │ │ │ ├── languageNames.properties │ │ │ │ │ ├── layout/ │ │ │ │ │ │ ├── HtmlForm.properties │ │ │ │ │ │ ├── MediaDocument.properties │ │ │ │ │ │ ├── htmlparser.properties │ │ │ │ │ │ └── xmlparser.properties │ │ │ │ │ ├── layout_errors.properties │ │ │ │ │ ├── mathml/ │ │ │ │ │ │ └── mathml.properties │ │ │ │ │ ├── mozilla.dtd │ │ │ │ │ ├── narrate.properties │ │ │ │ │ ├── netError.dtd │ │ │ │ │ ├── netErrorApp.dtd │ │ │ │ │ ├── notification.dtd │ │ │ │ │ ├── nsWebBrowserPersist.properties │ │ │ │ │ ├── plugins.properties │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ ├── printPageSetup.dtd │ │ │ │ │ ├── printPreview.dtd │ │ │ │ │ ├── printPreviewProgress.dtd │ │ │ │ │ ├── printProgress.dtd │ │ │ │ │ ├── printdialog.dtd │ │ │ │ │ ├── printdialog.properties │ │ │ │ │ ├── printing.properties │ │ │ │ │ ├── printjoboptions.dtd │ │ │ │ │ ├── regionNames.properties │ │ │ │ │ ├── resetProfile.dtd │ │ │ │ │ ├── resetProfile.properties │ │ │ │ │ ├── search/ │ │ │ │ │ │ └── search.properties │ │ │ │ │ ├── security/ │ │ │ │ │ │ ├── caps.properties │ │ │ │ │ │ ├── csp.properties │ │ │ │ │ │ └── security.properties │ │ │ │ │ ├── storage.properties │ │ │ │ │ ├── svg/ │ │ │ │ │ │ └── svg.properties │ │ │ │ │ ├── textcontext.dtd │ │ │ │ │ ├── tree.dtd │ │ │ │ │ ├── videocontrols.dtd │ │ │ │ │ ├── viewSource.dtd │ │ │ │ │ ├── viewSource.properties │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ ├── webapps.properties │ │ │ │ │ ├── wizard.dtd │ │ │ │ │ ├── wizard.properties │ │ │ │ │ ├── xbl.properties │ │ │ │ │ ├── xml/ │ │ │ │ │ │ └── prettyprint.dtd │ │ │ │ │ ├── xpinstall/ │ │ │ │ │ │ └── xpinstall.properties │ │ │ │ │ ├── xslt/ │ │ │ │ │ │ └── xslt.properties │ │ │ │ │ └── xul.properties │ │ │ │ ├── global-platform/ │ │ │ │ │ ├── mac/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ ├── unix/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ └── win/ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ ├── intl.properties │ │ │ │ │ └── platformKeys.properties │ │ │ │ ├── global-region/ │ │ │ │ │ └── region.properties │ │ │ │ ├── mozapps/ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ ├── settingsChange.dtd │ │ │ │ │ │ ├── unknownContentType.dtd │ │ │ │ │ │ └── unknownContentType.properties │ │ │ │ │ ├── extensions/ │ │ │ │ │ │ ├── about.dtd │ │ │ │ │ │ ├── blocklist.dtd │ │ │ │ │ │ ├── extensions.dtd │ │ │ │ │ │ ├── extensions.properties │ │ │ │ │ │ ├── newaddon.dtd │ │ │ │ │ │ ├── newaddon.properties │ │ │ │ │ │ ├── selectAddons.dtd │ │ │ │ │ │ ├── selectAddons.properties │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── handling/ │ │ │ │ │ │ ├── handling.dtd │ │ │ │ │ │ └── handling.properties │ │ │ │ │ ├── plugins/ │ │ │ │ │ │ ├── plugins.dtd │ │ │ │ │ │ └── plugins.properties │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ ├── changemp.dtd │ │ │ │ │ │ ├── ocsp.dtd │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ └── removemp.dtd │ │ │ │ │ ├── profile/ │ │ │ │ │ │ ├── createProfileWizard.dtd │ │ │ │ │ │ ├── profileSelection.dtd │ │ │ │ │ │ └── profileSelection.properties │ │ │ │ │ ├── update/ │ │ │ │ │ │ ├── history.dtd │ │ │ │ │ │ ├── updates.dtd │ │ │ │ │ │ └── updates.properties │ │ │ │ │ └── xpinstall/ │ │ │ │ │ ├── xpinstallConfirm.dtd │ │ │ │ │ └── xpinstallConfirm.properties │ │ │ │ ├── necko/ │ │ │ │ │ └── necko.properties │ │ │ │ ├── passwordmgr/ │ │ │ │ │ ├── passwordManager.dtd │ │ │ │ │ └── passwordmgr.properties │ │ │ │ ├── pipnss/ │ │ │ │ │ ├── nsserrors.properties │ │ │ │ │ ├── pipnss.properties │ │ │ │ │ └── security.properties │ │ │ │ ├── pippki/ │ │ │ │ │ ├── certManager.dtd │ │ │ │ │ ├── deviceManager.dtd │ │ │ │ │ ├── pippki.dtd │ │ │ │ │ ├── pippki.properties │ │ │ │ │ └── validation.dtd │ │ │ │ ├── places/ │ │ │ │ │ └── places.properties │ │ │ │ ├── pluginproblem/ │ │ │ │ │ └── pluginproblem.dtd │ │ │ │ └── services/ │ │ │ │ ├── errors.properties │ │ │ │ └── sync.properties │ │ │ └── he.manifest │ │ ├── chrome.manifest │ │ └── install.rdf │ ├── hu/ │ │ ├── bluegriffon/ │ │ │ └── chrome.manifest │ │ ├── browser/ │ │ │ ├── chrome/ │ │ │ │ ├── hu/ │ │ │ │ │ └── locale/ │ │ │ │ │ ├── branding/ │ │ │ │ │ │ ├── brand.dtd │ │ │ │ │ │ ├── brand.properties │ │ │ │ │ │ └── browserconfig.properties │ │ │ │ │ ├── browser/ │ │ │ │ │ │ ├── aboutAccounts.dtd │ │ │ │ │ │ ├── aboutCertError.dtd │ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ │ ├── aboutHealthReport.dtd │ │ │ │ │ │ ├── aboutHome.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.properties │ │ │ │ │ │ ├── aboutRobots.dtd │ │ │ │ │ │ ├── aboutSearchReset.dtd │ │ │ │ │ │ ├── aboutSessionRestore.dtd │ │ │ │ │ │ ├── aboutSyncTabs.dtd │ │ │ │ │ │ ├── aboutTabCrashed.dtd │ │ │ │ │ │ ├── accounts.properties │ │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ │ ├── baseMenuOverlay.dtd │ │ │ │ │ │ ├── bookmarks.html │ │ │ │ │ │ ├── browser.dtd │ │ │ │ │ │ ├── browser.properties │ │ │ │ │ │ ├── customizableui/ │ │ │ │ │ │ │ └── customizableWidgets.properties │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ ├── app-manager.dtd │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ ├── profiler.dtd │ │ │ │ │ │ │ ├── profiler.properties │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ ├── styleinspector.properties │ │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ │ ├── timeline.dtd │ │ │ │ │ │ │ ├── timeline.properties │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ │ └── settingsChange.dtd │ │ │ │ │ │ ├── engineManager.dtd │ │ │ │ │ │ ├── engineManager.properties │ │ │ │ │ │ ├── feeds/ │ │ │ │ │ │ │ ├── subscribe.dtd │ │ │ │ │ │ │ └── subscribe.properties │ │ │ │ │ │ ├── lightweightThemes.properties │ │ │ │ │ │ ├── loop/ │ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ │ ├── migration/ │ │ │ │ │ │ │ ├── migration.dtd │ │ │ │ │ │ │ └── migration.properties │ │ │ │ │ │ ├── netError.dtd │ │ │ │ │ │ ├── newTab.dtd │ │ │ │ │ │ ├── newTab.properties │ │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ │ ├── pageInfo.dtd │ │ │ │ │ │ ├── pageInfo.properties │ │ │ │ │ │ ├── places/ │ │ │ │ │ │ │ ├── bookmarkProperties.properties │ │ │ │ │ │ │ ├── editBookmarkOverlay.dtd │ │ │ │ │ │ │ ├── moveBookmarks.dtd │ │ │ │ │ │ │ ├── places.dtd │ │ │ │ │ │ │ └── places.properties │ │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ │ ├── aboutPermissions.dtd │ │ │ │ │ │ │ ├── aboutPermissions.properties │ │ │ │ │ │ │ ├── advanced-scripts.dtd │ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ │ ├── applicationManager.dtd │ │ │ │ │ │ │ ├── applicationManager.properties │ │ │ │ │ │ │ ├── applications.dtd │ │ │ │ │ │ │ ├── blocklists.dtd │ │ │ │ │ │ │ ├── colors.dtd │ │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ │ ├── containers.dtd │ │ │ │ │ │ │ ├── containers.properties │ │ │ │ │ │ │ ├── content.dtd │ │ │ │ │ │ │ ├── cookies.dtd │ │ │ │ │ │ │ ├── donottrack.dtd │ │ │ │ │ │ │ ├── fonts.dtd │ │ │ │ │ │ │ ├── languages.dtd │ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ │ ├── permissions.dtd │ │ │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ │ ├── privacy.dtd │ │ │ │ │ │ │ ├── search.dtd │ │ │ │ │ │ │ ├── security.dtd │ │ │ │ │ │ │ ├── selectBookmark.dtd │ │ │ │ │ │ │ ├── siteDataSettings.dtd │ │ │ │ │ │ │ ├── sync.dtd │ │ │ │ │ │ │ ├── tabs.dtd │ │ │ │ │ │ │ └── translation.dtd │ │ │ │ │ │ ├── quitDialog.properties │ │ │ │ │ │ ├── safeMode.dtd │ │ │ │ │ │ ├── safebrowsing/ │ │ │ │ │ │ │ ├── phishing-afterload-warning-message.dtd │ │ │ │ │ │ │ └── report-phishing.dtd │ │ │ │ │ │ ├── sanitize.dtd │ │ │ │ │ │ ├── search.properties │ │ │ │ │ │ ├── searchbar.dtd │ │ │ │ │ │ ├── searchplugins/ │ │ │ │ │ │ │ ├── ddg.xml │ │ │ │ │ │ │ ├── google-nocodes.xml │ │ │ │ │ │ │ ├── google.xml │ │ │ │ │ │ │ ├── list.json │ │ │ │ │ │ │ ├── sztaki-en-hu.xml │ │ │ │ │ │ │ ├── vatera.xml │ │ │ │ │ │ │ └── wikipedia-hu.xml │ │ │ │ │ │ ├── setDesktopBackground.dtd │ │ │ │ │ │ ├── shellservice.properties │ │ │ │ │ │ ├── sitePermissions.properties │ │ │ │ │ │ ├── syncBrand.dtd │ │ │ │ │ │ ├── syncCustomize.dtd │ │ │ │ │ │ ├── syncGenericChange.properties │ │ │ │ │ │ ├── syncKey.dtd │ │ │ │ │ │ ├── syncProgress.dtd │ │ │ │ │ │ ├── syncQuota.dtd │ │ │ │ │ │ ├── syncQuota.properties │ │ │ │ │ │ ├── syncSetup.dtd │ │ │ │ │ │ ├── syncSetup.properties │ │ │ │ │ │ ├── tabbrowser.dtd │ │ │ │ │ │ ├── tabbrowser.properties │ │ │ │ │ │ ├── tabview.properties │ │ │ │ │ │ ├── taskbar.properties │ │ │ │ │ │ ├── translation.dtd │ │ │ │ │ │ ├── translation.properties │ │ │ │ │ │ └── webrtcIndicator.properties │ │ │ │ │ ├── browser-region/ │ │ │ │ │ │ └── region.properties │ │ │ │ │ ├── feedback/ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ └── main.properties │ │ │ │ │ ├── hu/ │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── client/ │ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ │ ├── aboutdebugging.dtd │ │ │ │ │ │ │ │ ├── aboutdebugging.properties │ │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ │ ├── boxmodel.properties │ │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ │ ├── components.properties │ │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ │ ├── dom.properties │ │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ │ ├── filterwidget.dtd │ │ │ │ │ │ │ │ ├── filterwidget.properties │ │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ │ ├── font-inspector.properties │ │ │ │ │ │ │ │ ├── graphs.properties │ │ │ │ │ │ │ │ ├── har.properties │ │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ │ ├── jit-optimizations.properties │ │ │ │ │ │ │ │ ├── jsonview.properties │ │ │ │ │ │ │ │ ├── layout.properties │ │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ │ ├── markers.properties │ │ │ │ │ │ │ │ ├── memory.properties │ │ │ │ │ │ │ │ ├── menus.properties │ │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ │ ├── performance.dtd │ │ │ │ │ │ │ │ ├── performance.properties │ │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ │ ├── promisedebugger.dtd │ │ │ │ │ │ │ │ ├── promisedebugger.properties │ │ │ │ │ │ │ │ ├── responsive.properties │ │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ │ ├── startup.properties │ │ │ │ │ │ │ │ ├── storage.dtd │ │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ │ └── shared/ │ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ │ └── formautofill.properties │ │ │ │ │ └── pdfviewer/ │ │ │ │ │ ├── chrome.properties │ │ │ │ │ └── viewer.properties │ │ │ │ └── hu.manifest │ │ │ ├── chrome.manifest │ │ │ ├── crashreporter-override.ini │ │ │ ├── defaults/ │ │ │ │ ├── preferences/ │ │ │ │ │ └── firefox-l10n.js │ │ │ │ └── profile/ │ │ │ │ ├── bookmarks.html │ │ │ │ ├── chrome/ │ │ │ │ │ ├── userChrome-example.css │ │ │ │ │ └── userContent-example.css │ │ │ │ ├── localstore.rdf │ │ │ │ └── mimeTypes.rdf │ │ │ ├── features/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── firefox@getpocket.com/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── hu/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── hu/ │ │ │ │ │ │ └── pocket.properties │ │ │ │ │ └── hu.manifest │ │ │ │ ├── loop@mozilla.org/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── hu/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── hu/ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ └── hu.manifest │ │ │ │ └── presentation@mozilla.org/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── hu/ │ │ │ │ │ └── locale/ │ │ │ │ │ └── hu/ │ │ │ │ │ └── presentation.properties │ │ │ │ └── hu.manifest │ │ │ └── searchplugins/ │ │ │ ├── creativecommons.xml │ │ │ ├── eBay-hu.xml │ │ │ ├── google.xml │ │ │ ├── sztaki-en-hu.xml │ │ │ ├── vatera.xml │ │ │ └── wikipedia-hu.xml │ │ ├── chrome/ │ │ │ ├── hu/ │ │ │ │ └── locale/ │ │ │ │ └── hu/ │ │ │ │ ├── alerts/ │ │ │ │ │ ├── alert.dtd │ │ │ │ │ ├── alert.properties │ │ │ │ │ └── notificationNames.properties │ │ │ │ ├── autoconfig/ │ │ │ │ │ └── autoconfig.properties │ │ │ │ ├── cookie/ │ │ │ │ │ ├── cookieAcceptDialog.dtd │ │ │ │ │ └── cookieAcceptDialog.properties │ │ │ │ ├── formautofill/ │ │ │ │ │ └── requestAutocomplete.dtd │ │ │ │ ├── global/ │ │ │ │ │ ├── AccessFu.properties │ │ │ │ │ ├── about.dtd │ │ │ │ │ ├── aboutAbout.dtd │ │ │ │ │ ├── aboutNetworking.dtd │ │ │ │ │ ├── aboutProfiles.dtd │ │ │ │ │ ├── aboutProfiles.properties │ │ │ │ │ ├── aboutReader.properties │ │ │ │ │ ├── aboutRights.dtd │ │ │ │ │ ├── aboutRights.properties │ │ │ │ │ ├── aboutServiceWorkers.dtd │ │ │ │ │ ├── aboutServiceWorkers.properties │ │ │ │ │ ├── aboutSupport.dtd │ │ │ │ │ ├── aboutSupport.properties │ │ │ │ │ ├── aboutTelemetry.dtd │ │ │ │ │ ├── aboutTelemetry.properties │ │ │ │ │ ├── aboutWebrtc.properties │ │ │ │ │ ├── actions.dtd │ │ │ │ │ ├── appPicker.dtd │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ ├── autocomplete.properties │ │ │ │ │ ├── brand.dtd │ │ │ │ │ ├── browser.properties │ │ │ │ │ ├── charsetMenu.dtd │ │ │ │ │ ├── charsetMenu.properties │ │ │ │ │ ├── charsetOverlay.dtd │ │ │ │ │ ├── charsetTitles.properties │ │ │ │ │ ├── commonDialog.dtd │ │ │ │ │ ├── commonDialogs.properties │ │ │ │ │ ├── config.dtd │ │ │ │ │ ├── config.properties │ │ │ │ │ ├── console.dtd │ │ │ │ │ ├── console.properties │ │ │ │ │ ├── contentAreaCommands.properties │ │ │ │ │ ├── crashes.dtd │ │ │ │ │ ├── crashes.properties │ │ │ │ │ ├── css.properties │ │ │ │ │ ├── customizeCharset.dtd │ │ │ │ │ ├── customizeToolbar.dtd │ │ │ │ │ ├── customizeToolbar.properties │ │ │ │ │ ├── dateFormat.properties │ │ │ │ │ ├── datetimepicker.dtd │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ ├── dialog.properties │ │ │ │ │ ├── dialogOverlay.dtd │ │ │ │ │ ├── dom/ │ │ │ │ │ │ └── dom.properties │ │ │ │ │ ├── downloadProgress.properties │ │ │ │ │ ├── editMenuOverlay.dtd │ │ │ │ │ ├── extensions.properties │ │ │ │ │ ├── fallbackMenubar.properties │ │ │ │ │ ├── filefield.properties │ │ │ │ │ ├── filepicker.dtd │ │ │ │ │ ├── filepicker.properties │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── findbar.properties │ │ │ │ │ ├── finddialog.dtd │ │ │ │ │ ├── finddialog.properties │ │ │ │ │ ├── global-strres.properties │ │ │ │ │ ├── global.dtd │ │ │ │ │ ├── globalKeys.dtd │ │ │ │ │ ├── headsUpDisplay.properties │ │ │ │ │ ├── intl.css │ │ │ │ │ ├── intl.properties │ │ │ │ │ ├── keys.properties │ │ │ │ │ ├── languageNames.properties │ │ │ │ │ ├── layout/ │ │ │ │ │ │ ├── HtmlForm.properties │ │ │ │ │ │ ├── MediaDocument.properties │ │ │ │ │ │ ├── htmlparser.properties │ │ │ │ │ │ └── xmlparser.properties │ │ │ │ │ ├── layout_errors.properties │ │ │ │ │ ├── mathml/ │ │ │ │ │ │ └── mathml.properties │ │ │ │ │ ├── mozilla.dtd │ │ │ │ │ ├── narrate.properties │ │ │ │ │ ├── netError.dtd │ │ │ │ │ ├── netErrorApp.dtd │ │ │ │ │ ├── notification.dtd │ │ │ │ │ ├── nsWebBrowserPersist.properties │ │ │ │ │ ├── plugins.properties │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ ├── printPageSetup.dtd │ │ │ │ │ ├── printPreview.dtd │ │ │ │ │ ├── printPreviewProgress.dtd │ │ │ │ │ ├── printProgress.dtd │ │ │ │ │ ├── printdialog.dtd │ │ │ │ │ ├── printdialog.properties │ │ │ │ │ ├── printing.properties │ │ │ │ │ ├── printjoboptions.dtd │ │ │ │ │ ├── regionNames.properties │ │ │ │ │ ├── resetProfile.dtd │ │ │ │ │ ├── resetProfile.properties │ │ │ │ │ ├── search/ │ │ │ │ │ │ └── search.properties │ │ │ │ │ ├── security/ │ │ │ │ │ │ ├── caps.properties │ │ │ │ │ │ ├── csp.properties │ │ │ │ │ │ └── security.properties │ │ │ │ │ ├── svg/ │ │ │ │ │ │ └── svg.properties │ │ │ │ │ ├── textcontext.dtd │ │ │ │ │ ├── tree.dtd │ │ │ │ │ ├── videocontrols.dtd │ │ │ │ │ ├── viewSource.dtd │ │ │ │ │ ├── viewSource.properties │ │ │ │ │ ├── webapps.properties │ │ │ │ │ ├── wizard.dtd │ │ │ │ │ ├── wizard.properties │ │ │ │ │ ├── xbl.properties │ │ │ │ │ ├── xml/ │ │ │ │ │ │ └── prettyprint.dtd │ │ │ │ │ ├── xpinstall/ │ │ │ │ │ │ └── xpinstall.properties │ │ │ │ │ ├── xslt/ │ │ │ │ │ │ └── xslt.properties │ │ │ │ │ └── xul.properties │ │ │ │ ├── global-platform/ │ │ │ │ │ ├── mac/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ ├── unix/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ └── win/ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ ├── intl.properties │ │ │ │ │ └── platformKeys.properties │ │ │ │ ├── global-region/ │ │ │ │ │ └── region.properties │ │ │ │ ├── mozapps/ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ ├── settingsChange.dtd │ │ │ │ │ │ ├── unknownContentType.dtd │ │ │ │ │ │ └── unknownContentType.properties │ │ │ │ │ ├── extensions/ │ │ │ │ │ │ ├── about.dtd │ │ │ │ │ │ ├── blocklist.dtd │ │ │ │ │ │ ├── extensions.dtd │ │ │ │ │ │ ├── extensions.properties │ │ │ │ │ │ ├── newaddon.dtd │ │ │ │ │ │ ├── newaddon.properties │ │ │ │ │ │ ├── selectAddons.dtd │ │ │ │ │ │ ├── selectAddons.properties │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── handling/ │ │ │ │ │ │ ├── handling.dtd │ │ │ │ │ │ └── handling.properties │ │ │ │ │ ├── plugins/ │ │ │ │ │ │ ├── plugins.dtd │ │ │ │ │ │ └── plugins.properties │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ ├── changemp.dtd │ │ │ │ │ │ ├── ocsp.dtd │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ └── removemp.dtd │ │ │ │ │ ├── profile/ │ │ │ │ │ │ ├── createProfileWizard.dtd │ │ │ │ │ │ ├── profileSelection.dtd │ │ │ │ │ │ └── profileSelection.properties │ │ │ │ │ ├── update/ │ │ │ │ │ │ ├── history.dtd │ │ │ │ │ │ ├── updates.dtd │ │ │ │ │ │ └── updates.properties │ │ │ │ │ └── xpinstall/ │ │ │ │ │ ├── xpinstallConfirm.dtd │ │ │ │ │ └── xpinstallConfirm.properties │ │ │ │ ├── necko/ │ │ │ │ │ └── necko.properties │ │ │ │ ├── passwordmgr/ │ │ │ │ │ ├── passwordManager.dtd │ │ │ │ │ └── passwordmgr.properties │ │ │ │ ├── pipnss/ │ │ │ │ │ ├── nsserrors.properties │ │ │ │ │ ├── pipnss.properties │ │ │ │ │ └── security.properties │ │ │ │ ├── pippki/ │ │ │ │ │ ├── certManager.dtd │ │ │ │ │ ├── deviceManager.dtd │ │ │ │ │ ├── pippki.dtd │ │ │ │ │ ├── pippki.properties │ │ │ │ │ └── validation.dtd │ │ │ │ ├── places/ │ │ │ │ │ └── places.properties │ │ │ │ ├── pluginproblem/ │ │ │ │ │ └── pluginproblem.dtd │ │ │ │ └── services/ │ │ │ │ ├── errors.properties │ │ │ │ └── sync.properties │ │ │ └── hu.manifest │ │ ├── chrome.manifest │ │ └── install.rdf │ ├── it/ │ │ ├── bluegriffon/ │ │ │ └── chrome.manifest │ │ ├── browser/ │ │ │ ├── chrome/ │ │ │ │ ├── it/ │ │ │ │ │ └── locale/ │ │ │ │ │ ├── branding/ │ │ │ │ │ │ ├── brand.dtd │ │ │ │ │ │ ├── brand.properties │ │ │ │ │ │ └── browserconfig.properties │ │ │ │ │ ├── browser/ │ │ │ │ │ │ ├── aboutAccounts.dtd │ │ │ │ │ │ ├── aboutCertError.dtd │ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ │ ├── aboutHealthReport.dtd │ │ │ │ │ │ ├── aboutHome.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.properties │ │ │ │ │ │ ├── aboutRobots.dtd │ │ │ │ │ │ ├── aboutSearchReset.dtd │ │ │ │ │ │ ├── aboutSessionRestore.dtd │ │ │ │ │ │ ├── aboutSyncTabs.dtd │ │ │ │ │ │ ├── aboutTabCrashed.dtd │ │ │ │ │ │ ├── accounts.properties │ │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ │ ├── baseMenuOverlay.dtd │ │ │ │ │ │ ├── bookmarks.html │ │ │ │ │ │ ├── browser.dtd │ │ │ │ │ │ ├── browser.properties │ │ │ │ │ │ ├── customizableui/ │ │ │ │ │ │ │ └── customizableWidgets.properties │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ ├── app-manager.dtd │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ ├── profiler.dtd │ │ │ │ │ │ │ ├── profiler.properties │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ ├── styleinspector.properties │ │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ │ ├── timeline.dtd │ │ │ │ │ │ │ ├── timeline.properties │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ │ └── settingsChange.dtd │ │ │ │ │ │ ├── engineManager.dtd │ │ │ │ │ │ ├── engineManager.properties │ │ │ │ │ │ ├── feeds/ │ │ │ │ │ │ │ ├── subscribe.dtd │ │ │ │ │ │ │ └── subscribe.properties │ │ │ │ │ │ ├── lightweightThemes.properties │ │ │ │ │ │ ├── loop/ │ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ │ ├── migration/ │ │ │ │ │ │ │ ├── migration.dtd │ │ │ │ │ │ │ └── migration.properties │ │ │ │ │ │ ├── netError.dtd │ │ │ │ │ │ ├── newTab.dtd │ │ │ │ │ │ ├── newTab.properties │ │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ │ ├── pageInfo.dtd │ │ │ │ │ │ ├── pageInfo.properties │ │ │ │ │ │ ├── places/ │ │ │ │ │ │ │ ├── bookmarkProperties.properties │ │ │ │ │ │ │ ├── editBookmarkOverlay.dtd │ │ │ │ │ │ │ ├── moveBookmarks.dtd │ │ │ │ │ │ │ ├── places.dtd │ │ │ │ │ │ │ └── places.properties │ │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ │ ├── aboutPermissions.dtd │ │ │ │ │ │ │ ├── aboutPermissions.properties │ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ │ ├── applicationManager.dtd │ │ │ │ │ │ │ ├── applicationManager.properties │ │ │ │ │ │ │ ├── applications.dtd │ │ │ │ │ │ │ ├── blocklists.dtd │ │ │ │ │ │ │ ├── colors.dtd │ │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ │ ├── containers.dtd │ │ │ │ │ │ │ ├── containers.properties │ │ │ │ │ │ │ ├── content.dtd │ │ │ │ │ │ │ ├── cookies.dtd │ │ │ │ │ │ │ ├── donottrack.dtd │ │ │ │ │ │ │ ├── fonts.dtd │ │ │ │ │ │ │ ├── languages.dtd │ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ │ ├── permissions.dtd │ │ │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ │ ├── privacy.dtd │ │ │ │ │ │ │ ├── search.dtd │ │ │ │ │ │ │ ├── security.dtd │ │ │ │ │ │ │ ├── selectBookmark.dtd │ │ │ │ │ │ │ ├── siteDataSettings.dtd │ │ │ │ │ │ │ ├── sync.dtd │ │ │ │ │ │ │ ├── tabs.dtd │ │ │ │ │ │ │ └── translation.dtd │ │ │ │ │ │ ├── quitDialog.properties │ │ │ │ │ │ ├── safeMode.dtd │ │ │ │ │ │ ├── safebrowsing/ │ │ │ │ │ │ │ ├── phishing-afterload-warning-message.dtd │ │ │ │ │ │ │ └── report-phishing.dtd │ │ │ │ │ │ ├── sanitize.dtd │ │ │ │ │ │ ├── search.properties │ │ │ │ │ │ ├── searchbar.dtd │ │ │ │ │ │ ├── searchplugins/ │ │ │ │ │ │ │ ├── amazon-it.xml │ │ │ │ │ │ │ ├── bing.xml │ │ │ │ │ │ │ ├── ddg.xml │ │ │ │ │ │ │ ├── google-nocodes.xml │ │ │ │ │ │ │ ├── google.xml │ │ │ │ │ │ │ ├── hoepli.xml │ │ │ │ │ │ │ ├── list.json │ │ │ │ │ │ │ ├── wikipedia-it.xml │ │ │ │ │ │ │ └── yahoo-it.xml │ │ │ │ │ │ ├── setDesktopBackground.dtd │ │ │ │ │ │ ├── shellservice.properties │ │ │ │ │ │ ├── sitePermissions.properties │ │ │ │ │ │ ├── syncBrand.dtd │ │ │ │ │ │ ├── syncCustomize.dtd │ │ │ │ │ │ ├── syncGenericChange.properties │ │ │ │ │ │ ├── syncKey.dtd │ │ │ │ │ │ ├── syncProgress.dtd │ │ │ │ │ │ ├── syncQuota.dtd │ │ │ │ │ │ ├── syncQuota.properties │ │ │ │ │ │ ├── syncSetup.dtd │ │ │ │ │ │ ├── syncSetup.properties │ │ │ │ │ │ ├── tabbrowser.dtd │ │ │ │ │ │ ├── tabbrowser.properties │ │ │ │ │ │ ├── tabview.properties │ │ │ │ │ │ ├── taskbar.properties │ │ │ │ │ │ ├── translation.dtd │ │ │ │ │ │ ├── translation.properties │ │ │ │ │ │ └── webrtcIndicator.properties │ │ │ │ │ ├── browser-region/ │ │ │ │ │ │ └── region.properties │ │ │ │ │ ├── feedback/ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ └── main.properties │ │ │ │ │ ├── it/ │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── client/ │ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ │ ├── aboutdebugging.dtd │ │ │ │ │ │ │ │ ├── aboutdebugging.properties │ │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ │ ├── boxmodel.properties │ │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ │ ├── components.properties │ │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ │ ├── dom.properties │ │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ │ ├── filterwidget.dtd │ │ │ │ │ │ │ │ ├── filterwidget.properties │ │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ │ ├── font-inspector.properties │ │ │ │ │ │ │ │ ├── graphs.properties │ │ │ │ │ │ │ │ ├── har.properties │ │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ │ ├── jit-optimizations.properties │ │ │ │ │ │ │ │ ├── jsonview.properties │ │ │ │ │ │ │ │ ├── layout.properties │ │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ │ ├── markers.properties │ │ │ │ │ │ │ │ ├── memory.properties │ │ │ │ │ │ │ │ ├── menus.properties │ │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ │ ├── performance.dtd │ │ │ │ │ │ │ │ ├── performance.properties │ │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ │ ├── promisedebugger.dtd │ │ │ │ │ │ │ │ ├── promisedebugger.properties │ │ │ │ │ │ │ │ ├── responsive.properties │ │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ │ ├── startup.properties │ │ │ │ │ │ │ │ ├── storage.dtd │ │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ │ └── shared/ │ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ │ └── formautofill.properties │ │ │ │ │ └── pdfviewer/ │ │ │ │ │ ├── chrome.properties │ │ │ │ │ └── viewer.properties │ │ │ │ └── it.manifest │ │ │ ├── chrome.manifest │ │ │ ├── crashreporter-override.ini │ │ │ ├── defaults/ │ │ │ │ ├── preferences/ │ │ │ │ │ └── firefox-l10n.js │ │ │ │ └── profile/ │ │ │ │ ├── bookmarks.html │ │ │ │ ├── chrome/ │ │ │ │ │ ├── userChrome-example.css │ │ │ │ │ └── userContent-example.css │ │ │ │ ├── localstore.rdf │ │ │ │ └── mimeTypes.rdf │ │ │ ├── features/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── firefox@getpocket.com/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── it/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── it/ │ │ │ │ │ │ └── pocket.properties │ │ │ │ │ └── it.manifest │ │ │ │ ├── loop@mozilla.org/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── it/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── it/ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ └── it.manifest │ │ │ │ └── presentation@mozilla.org/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── it/ │ │ │ │ │ └── locale/ │ │ │ │ │ └── it/ │ │ │ │ │ └── presentation.properties │ │ │ │ └── it.manifest │ │ │ └── searchplugins/ │ │ │ ├── amazon-it.xml │ │ │ ├── bing.xml │ │ │ ├── eBay-it.xml │ │ │ ├── google.xml │ │ │ ├── hoepli.xml │ │ │ ├── wikipedia-it.xml │ │ │ └── yahoo-it.xml │ │ ├── chrome/ │ │ │ ├── it/ │ │ │ │ └── locale/ │ │ │ │ └── it/ │ │ │ │ ├── alerts/ │ │ │ │ │ ├── alert.dtd │ │ │ │ │ ├── alert.properties │ │ │ │ │ └── notificationNames.properties │ │ │ │ ├── autoconfig/ │ │ │ │ │ └── autoconfig.properties │ │ │ │ ├── cookie/ │ │ │ │ │ ├── cookieAcceptDialog.dtd │ │ │ │ │ └── cookieAcceptDialog.properties │ │ │ │ ├── formautofill/ │ │ │ │ │ └── requestAutocomplete.dtd │ │ │ │ ├── global/ │ │ │ │ │ ├── AccessFu.properties │ │ │ │ │ ├── about.dtd │ │ │ │ │ ├── aboutAbout.dtd │ │ │ │ │ ├── aboutNetworking.dtd │ │ │ │ │ ├── aboutProfiles.dtd │ │ │ │ │ ├── aboutProfiles.properties │ │ │ │ │ ├── aboutReader.properties │ │ │ │ │ ├── aboutRights.dtd │ │ │ │ │ ├── aboutRights.properties │ │ │ │ │ ├── aboutServiceWorkers.dtd │ │ │ │ │ ├── aboutServiceWorkers.properties │ │ │ │ │ ├── aboutSupport.dtd │ │ │ │ │ ├── aboutSupport.properties │ │ │ │ │ ├── aboutTelemetry.dtd │ │ │ │ │ ├── aboutTelemetry.properties │ │ │ │ │ ├── aboutWebrtc.properties │ │ │ │ │ ├── actions.dtd │ │ │ │ │ ├── appPicker.dtd │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ ├── autocomplete.properties │ │ │ │ │ ├── brand.dtd │ │ │ │ │ ├── browser.properties │ │ │ │ │ ├── charsetMenu.dtd │ │ │ │ │ ├── charsetMenu.properties │ │ │ │ │ ├── charsetOverlay.dtd │ │ │ │ │ ├── charsetTitles.properties │ │ │ │ │ ├── commonDialog.dtd │ │ │ │ │ ├── commonDialogs.properties │ │ │ │ │ ├── config.dtd │ │ │ │ │ ├── config.properties │ │ │ │ │ ├── console.dtd │ │ │ │ │ ├── console.properties │ │ │ │ │ ├── contentAreaCommands.properties │ │ │ │ │ ├── crashes.dtd │ │ │ │ │ ├── crashes.properties │ │ │ │ │ ├── css.properties │ │ │ │ │ ├── customizeCharset.dtd │ │ │ │ │ ├── customizeToolbar.dtd │ │ │ │ │ ├── customizeToolbar.properties │ │ │ │ │ ├── dateFormat.properties │ │ │ │ │ ├── datetimepicker.dtd │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ ├── dialog.properties │ │ │ │ │ ├── dialogOverlay.dtd │ │ │ │ │ ├── dom/ │ │ │ │ │ │ └── dom.properties │ │ │ │ │ ├── downloadProgress.properties │ │ │ │ │ ├── editMenuOverlay.dtd │ │ │ │ │ ├── extensions.properties │ │ │ │ │ ├── fallbackMenubar.properties │ │ │ │ │ ├── filefield.properties │ │ │ │ │ ├── filepicker.dtd │ │ │ │ │ ├── filepicker.properties │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── findbar.properties │ │ │ │ │ ├── finddialog.dtd │ │ │ │ │ ├── finddialog.properties │ │ │ │ │ ├── global-strres.properties │ │ │ │ │ ├── global.dtd │ │ │ │ │ ├── globalKeys.dtd │ │ │ │ │ ├── headsUpDisplay.properties │ │ │ │ │ ├── intl.css │ │ │ │ │ ├── intl.properties │ │ │ │ │ ├── keys.properties │ │ │ │ │ ├── languageNames.properties │ │ │ │ │ ├── layout/ │ │ │ │ │ │ ├── HtmlForm.properties │ │ │ │ │ │ ├── MediaDocument.properties │ │ │ │ │ │ ├── htmlparser.properties │ │ │ │ │ │ └── xmlparser.properties │ │ │ │ │ ├── layout_errors.properties │ │ │ │ │ ├── mathml/ │ │ │ │ │ │ └── mathml.properties │ │ │ │ │ ├── mozilla.dtd │ │ │ │ │ ├── narrate.properties │ │ │ │ │ ├── netError.dtd │ │ │ │ │ ├── netErrorApp.dtd │ │ │ │ │ ├── notification.dtd │ │ │ │ │ ├── nsWebBrowserPersist.properties │ │ │ │ │ ├── plugins.properties │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ ├── printPageSetup.dtd │ │ │ │ │ ├── printPreview.dtd │ │ │ │ │ ├── printPreviewProgress.dtd │ │ │ │ │ ├── printProgress.dtd │ │ │ │ │ ├── printdialog.dtd │ │ │ │ │ ├── printdialog.properties │ │ │ │ │ ├── printing.properties │ │ │ │ │ ├── printjoboptions.dtd │ │ │ │ │ ├── regionNames.properties │ │ │ │ │ ├── resetProfile.dtd │ │ │ │ │ ├── resetProfile.properties │ │ │ │ │ ├── search/ │ │ │ │ │ │ └── search.properties │ │ │ │ │ ├── security/ │ │ │ │ │ │ ├── caps.properties │ │ │ │ │ │ ├── csp.properties │ │ │ │ │ │ └── security.properties │ │ │ │ │ ├── storage.properties │ │ │ │ │ ├── svg/ │ │ │ │ │ │ └── svg.properties │ │ │ │ │ ├── textcontext.dtd │ │ │ │ │ ├── tree.dtd │ │ │ │ │ ├── videocontrols.dtd │ │ │ │ │ ├── viewSource.dtd │ │ │ │ │ ├── viewSource.properties │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ ├── webapps.properties │ │ │ │ │ ├── wizard.dtd │ │ │ │ │ ├── wizard.properties │ │ │ │ │ ├── xbl.properties │ │ │ │ │ ├── xml/ │ │ │ │ │ │ └── prettyprint.dtd │ │ │ │ │ ├── xpinstall/ │ │ │ │ │ │ └── xpinstall.properties │ │ │ │ │ ├── xslt/ │ │ │ │ │ │ └── xslt.properties │ │ │ │ │ └── xul.properties │ │ │ │ ├── global-platform/ │ │ │ │ │ ├── mac/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ ├── unix/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ └── win/ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ ├── intl.properties │ │ │ │ │ └── platformKeys.properties │ │ │ │ ├── global-region/ │ │ │ │ │ └── region.properties │ │ │ │ ├── mozapps/ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ ├── settingsChange.dtd │ │ │ │ │ │ ├── unknownContentType.dtd │ │ │ │ │ │ └── unknownContentType.properties │ │ │ │ │ ├── extensions/ │ │ │ │ │ │ ├── about.dtd │ │ │ │ │ │ ├── blocklist.dtd │ │ │ │ │ │ ├── extensions.dtd │ │ │ │ │ │ ├── extensions.properties │ │ │ │ │ │ ├── newaddon.dtd │ │ │ │ │ │ ├── newaddon.properties │ │ │ │ │ │ ├── selectAddons.dtd │ │ │ │ │ │ ├── selectAddons.properties │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── handling/ │ │ │ │ │ │ ├── handling.dtd │ │ │ │ │ │ └── handling.properties │ │ │ │ │ ├── plugins/ │ │ │ │ │ │ ├── plugins.dtd │ │ │ │ │ │ └── plugins.properties │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ ├── changemp.dtd │ │ │ │ │ │ ├── ocsp.dtd │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ └── removemp.dtd │ │ │ │ │ ├── profile/ │ │ │ │ │ │ ├── createProfileWizard.dtd │ │ │ │ │ │ ├── profileSelection.dtd │ │ │ │ │ │ └── profileSelection.properties │ │ │ │ │ ├── update/ │ │ │ │ │ │ ├── history.dtd │ │ │ │ │ │ ├── updates.dtd │ │ │ │ │ │ └── updates.properties │ │ │ │ │ └── xpinstall/ │ │ │ │ │ ├── xpinstallConfirm.dtd │ │ │ │ │ └── xpinstallConfirm.properties │ │ │ │ ├── necko/ │ │ │ │ │ └── necko.properties │ │ │ │ ├── passwordmgr/ │ │ │ │ │ ├── passwordManager.dtd │ │ │ │ │ └── passwordmgr.properties │ │ │ │ ├── pipnss/ │ │ │ │ │ ├── nsserrors.properties │ │ │ │ │ ├── pipnss.properties │ │ │ │ │ └── security.properties │ │ │ │ ├── pippki/ │ │ │ │ │ ├── certManager.dtd │ │ │ │ │ ├── deviceManager.dtd │ │ │ │ │ ├── pippki.dtd │ │ │ │ │ ├── pippki.properties │ │ │ │ │ └── validation.dtd │ │ │ │ ├── places/ │ │ │ │ │ └── places.properties │ │ │ │ ├── pluginproblem/ │ │ │ │ │ └── pluginproblem.dtd │ │ │ │ └── services/ │ │ │ │ ├── errors.properties │ │ │ │ └── sync.properties │ │ │ └── it.manifest │ │ ├── chrome.manifest │ │ └── install.rdf │ ├── ja/ │ │ ├── bluegriffon/ │ │ │ └── chrome.manifest │ │ ├── browser/ │ │ │ ├── chrome/ │ │ │ │ ├── ja/ │ │ │ │ │ └── locale/ │ │ │ │ │ ├── branding/ │ │ │ │ │ │ ├── brand.dtd │ │ │ │ │ │ ├── brand.properties │ │ │ │ │ │ └── browserconfig.properties │ │ │ │ │ ├── browser/ │ │ │ │ │ │ ├── aboutAccounts.dtd │ │ │ │ │ │ ├── aboutCertError.dtd │ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ │ ├── aboutHealthReport.dtd │ │ │ │ │ │ ├── aboutHome.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.properties │ │ │ │ │ │ ├── aboutRobots.dtd │ │ │ │ │ │ ├── aboutSearchReset.dtd │ │ │ │ │ │ ├── aboutSessionRestore.dtd │ │ │ │ │ │ ├── aboutSyncTabs.dtd │ │ │ │ │ │ ├── aboutTabCrashed.dtd │ │ │ │ │ │ ├── accounts.properties │ │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ │ ├── baseMenuOverlay.dtd │ │ │ │ │ │ ├── bookmarks.html │ │ │ │ │ │ ├── browser.dtd │ │ │ │ │ │ ├── browser.properties │ │ │ │ │ │ ├── customizableui/ │ │ │ │ │ │ │ └── customizableWidgets.properties │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ ├── app-manager.dtd │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ ├── profiler.dtd │ │ │ │ │ │ │ ├── profiler.properties │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ ├── styleinspector.properties │ │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ │ ├── timeline.dtd │ │ │ │ │ │ │ ├── timeline.properties │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ │ └── settingsChange.dtd │ │ │ │ │ │ ├── engineManager.dtd │ │ │ │ │ │ ├── engineManager.properties │ │ │ │ │ │ ├── feeds/ │ │ │ │ │ │ │ ├── subscribe.dtd │ │ │ │ │ │ │ └── subscribe.properties │ │ │ │ │ │ ├── lightweightThemes.properties │ │ │ │ │ │ ├── loop/ │ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ │ ├── migration/ │ │ │ │ │ │ │ ├── migration.dtd │ │ │ │ │ │ │ └── migration.properties │ │ │ │ │ │ ├── netError.dtd │ │ │ │ │ │ ├── newTab.dtd │ │ │ │ │ │ ├── newTab.properties │ │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ │ ├── pageInfo.dtd │ │ │ │ │ │ ├── pageInfo.properties │ │ │ │ │ │ ├── places/ │ │ │ │ │ │ │ ├── bookmarkProperties.properties │ │ │ │ │ │ │ ├── editBookmarkOverlay.dtd │ │ │ │ │ │ │ ├── moveBookmarks.dtd │ │ │ │ │ │ │ ├── places.dtd │ │ │ │ │ │ │ └── places.properties │ │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ │ ├── aboutPermissions.dtd │ │ │ │ │ │ │ ├── aboutPermissions.properties │ │ │ │ │ │ │ ├── advanced-scripts.dtd │ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ │ ├── applicationManager.dtd │ │ │ │ │ │ │ ├── applicationManager.properties │ │ │ │ │ │ │ ├── applications.dtd │ │ │ │ │ │ │ ├── blocklists.dtd │ │ │ │ │ │ │ ├── colors.dtd │ │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ │ ├── containers.dtd │ │ │ │ │ │ │ ├── containers.properties │ │ │ │ │ │ │ ├── content.dtd │ │ │ │ │ │ │ ├── cookies.dtd │ │ │ │ │ │ │ ├── donottrack.dtd │ │ │ │ │ │ │ ├── fonts.dtd │ │ │ │ │ │ │ ├── languages.dtd │ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ │ ├── permissions.dtd │ │ │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ │ ├── privacy.dtd │ │ │ │ │ │ │ ├── search.dtd │ │ │ │ │ │ │ ├── security.dtd │ │ │ │ │ │ │ ├── selectBookmark.dtd │ │ │ │ │ │ │ ├── siteDataSettings.dtd │ │ │ │ │ │ │ ├── sync.dtd │ │ │ │ │ │ │ ├── tabs.dtd │ │ │ │ │ │ │ └── translation.dtd │ │ │ │ │ │ ├── quitDialog.properties │ │ │ │ │ │ ├── safeMode.dtd │ │ │ │ │ │ ├── safebrowsing/ │ │ │ │ │ │ │ ├── phishing-afterload-warning-message.dtd │ │ │ │ │ │ │ └── report-phishing.dtd │ │ │ │ │ │ ├── sanitize.dtd │ │ │ │ │ │ ├── search.properties │ │ │ │ │ │ ├── searchbar.dtd │ │ │ │ │ │ ├── searchplugins/ │ │ │ │ │ │ │ ├── amazon-jp.xml │ │ │ │ │ │ │ ├── bing.xml │ │ │ │ │ │ │ ├── ddg.xml │ │ │ │ │ │ │ ├── google-nocodes.xml │ │ │ │ │ │ │ ├── google.xml │ │ │ │ │ │ │ ├── list.json │ │ │ │ │ │ │ ├── oshiete-goo.xml │ │ │ │ │ │ │ ├── rakuten.xml │ │ │ │ │ │ │ ├── twitter-ja.xml │ │ │ │ │ │ │ ├── wikipedia-ja.xml │ │ │ │ │ │ │ ├── yahoo-jp-auctions.xml │ │ │ │ │ │ │ └── yahoo-jp.xml │ │ │ │ │ │ ├── setDesktopBackground.dtd │ │ │ │ │ │ ├── shellservice.properties │ │ │ │ │ │ ├── sitePermissions.properties │ │ │ │ │ │ ├── syncBrand.dtd │ │ │ │ │ │ ├── syncCustomize.dtd │ │ │ │ │ │ ├── syncGenericChange.properties │ │ │ │ │ │ ├── syncKey.dtd │ │ │ │ │ │ ├── syncProgress.dtd │ │ │ │ │ │ ├── syncQuota.dtd │ │ │ │ │ │ ├── syncQuota.properties │ │ │ │ │ │ ├── syncSetup.dtd │ │ │ │ │ │ ├── syncSetup.properties │ │ │ │ │ │ ├── tabbrowser.dtd │ │ │ │ │ │ ├── tabbrowser.properties │ │ │ │ │ │ ├── tabview.properties │ │ │ │ │ │ ├── taskbar.properties │ │ │ │ │ │ ├── translation.dtd │ │ │ │ │ │ ├── translation.properties │ │ │ │ │ │ └── webrtcIndicator.properties │ │ │ │ │ ├── browser-region/ │ │ │ │ │ │ └── region.properties │ │ │ │ │ ├── feedback/ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ └── main.properties │ │ │ │ │ ├── ja/ │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── client/ │ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ │ ├── aboutdebugging.dtd │ │ │ │ │ │ │ │ ├── aboutdebugging.properties │ │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ │ ├── boxmodel.properties │ │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ │ ├── components.properties │ │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ │ ├── dom.properties │ │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ │ ├── filterwidget.dtd │ │ │ │ │ │ │ │ ├── filterwidget.properties │ │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ │ ├── font-inspector.properties │ │ │ │ │ │ │ │ ├── graphs.properties │ │ │ │ │ │ │ │ ├── har.properties │ │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ │ ├── jit-optimizations.properties │ │ │ │ │ │ │ │ ├── jsonview.properties │ │ │ │ │ │ │ │ ├── layout.properties │ │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ │ ├── markers.properties │ │ │ │ │ │ │ │ ├── memory.properties │ │ │ │ │ │ │ │ ├── menus.properties │ │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ │ ├── performance.dtd │ │ │ │ │ │ │ │ ├── performance.properties │ │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ │ ├── promisedebugger.dtd │ │ │ │ │ │ │ │ ├── promisedebugger.properties │ │ │ │ │ │ │ │ ├── responsive.properties │ │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ │ ├── startup.properties │ │ │ │ │ │ │ │ ├── storage.dtd │ │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ │ └── shared/ │ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ │ └── formautofill.properties │ │ │ │ │ └── pdfviewer/ │ │ │ │ │ ├── chrome.properties │ │ │ │ │ └── viewer.properties │ │ │ │ └── ja.manifest │ │ │ ├── chrome.manifest │ │ │ ├── crashreporter-override.ini │ │ │ ├── defaults/ │ │ │ │ ├── preferences/ │ │ │ │ │ └── firefox-l10n.js │ │ │ │ └── profile/ │ │ │ │ ├── bookmarks.html │ │ │ │ ├── chrome/ │ │ │ │ │ ├── userChrome-example.css │ │ │ │ │ └── userContent-example.css │ │ │ │ ├── localstore.rdf │ │ │ │ └── mimeTypes.rdf │ │ │ ├── features/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── firefox@getpocket.com/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── ja/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── ja/ │ │ │ │ │ │ └── pocket.properties │ │ │ │ │ └── ja.manifest │ │ │ │ ├── loop@mozilla.org/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── ja/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── ja/ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ └── ja.manifest │ │ │ │ └── presentation@mozilla.org/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── ja/ │ │ │ │ │ └── locale/ │ │ │ │ │ └── ja/ │ │ │ │ │ └── presentation.properties │ │ │ │ └── ja.manifest │ │ │ └── searchplugins/ │ │ │ ├── amazon-jp.xml │ │ │ ├── google-jp.xml │ │ │ ├── oshiete-goo.xml │ │ │ ├── rakuten.xml │ │ │ ├── twitter-ja.xml │ │ │ ├── wikipedia-ja.xml │ │ │ ├── yahoo-jp-auctions.xml │ │ │ └── yahoo-jp.xml │ │ ├── chrome/ │ │ │ ├── ja/ │ │ │ │ └── locale/ │ │ │ │ └── ja/ │ │ │ │ ├── alerts/ │ │ │ │ │ ├── alert.dtd │ │ │ │ │ ├── alert.properties │ │ │ │ │ └── notificationNames.properties │ │ │ │ ├── autoconfig/ │ │ │ │ │ └── autoconfig.properties │ │ │ │ ├── cookie/ │ │ │ │ │ ├── cookieAcceptDialog.dtd │ │ │ │ │ └── cookieAcceptDialog.properties │ │ │ │ ├── formautofill/ │ │ │ │ │ └── requestAutocomplete.dtd │ │ │ │ ├── global/ │ │ │ │ │ ├── AccessFu.properties │ │ │ │ │ ├── about.dtd │ │ │ │ │ ├── aboutAbout.dtd │ │ │ │ │ ├── aboutNetworking.dtd │ │ │ │ │ ├── aboutProfiles.dtd │ │ │ │ │ ├── aboutProfiles.properties │ │ │ │ │ ├── aboutReader.properties │ │ │ │ │ ├── aboutRights.dtd │ │ │ │ │ ├── aboutRights.properties │ │ │ │ │ ├── aboutServiceWorkers.dtd │ │ │ │ │ ├── aboutServiceWorkers.properties │ │ │ │ │ ├── aboutSupport.dtd │ │ │ │ │ ├── aboutSupport.properties │ │ │ │ │ ├── aboutTelemetry.dtd │ │ │ │ │ ├── aboutTelemetry.properties │ │ │ │ │ ├── aboutWebrtc.properties │ │ │ │ │ ├── actions.dtd │ │ │ │ │ ├── appPicker.dtd │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ ├── autocomplete.properties │ │ │ │ │ ├── brand.dtd │ │ │ │ │ ├── browser.properties │ │ │ │ │ ├── charsetMenu.dtd │ │ │ │ │ ├── charsetMenu.properties │ │ │ │ │ ├── charsetOverlay.dtd │ │ │ │ │ ├── charsetTitles.properties │ │ │ │ │ ├── commonDialog.dtd │ │ │ │ │ ├── commonDialogs.properties │ │ │ │ │ ├── config.dtd │ │ │ │ │ ├── config.properties │ │ │ │ │ ├── console.dtd │ │ │ │ │ ├── console.properties │ │ │ │ │ ├── contentAreaCommands.properties │ │ │ │ │ ├── crashes.dtd │ │ │ │ │ ├── crashes.properties │ │ │ │ │ ├── css.properties │ │ │ │ │ ├── customizeCharset.dtd │ │ │ │ │ ├── customizeToolbar.dtd │ │ │ │ │ ├── customizeToolbar.properties │ │ │ │ │ ├── dateFormat.properties │ │ │ │ │ ├── datetimepicker.dtd │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ ├── dialog.properties │ │ │ │ │ ├── dialogOverlay.dtd │ │ │ │ │ ├── dom/ │ │ │ │ │ │ └── dom.properties │ │ │ │ │ ├── downloadProgress.properties │ │ │ │ │ ├── editMenuOverlay.dtd │ │ │ │ │ ├── extensions.properties │ │ │ │ │ ├── fallbackMenubar.properties │ │ │ │ │ ├── filefield.properties │ │ │ │ │ ├── filepicker.dtd │ │ │ │ │ ├── filepicker.properties │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── findbar.properties │ │ │ │ │ ├── finddialog.dtd │ │ │ │ │ ├── finddialog.properties │ │ │ │ │ ├── global-strres.properties │ │ │ │ │ ├── global.dtd │ │ │ │ │ ├── globalKeys.dtd │ │ │ │ │ ├── headsUpDisplay.properties │ │ │ │ │ ├── intl.css │ │ │ │ │ ├── intl.properties │ │ │ │ │ ├── keys.properties │ │ │ │ │ ├── languageNames.properties │ │ │ │ │ ├── layout/ │ │ │ │ │ │ ├── HtmlForm.properties │ │ │ │ │ │ ├── MediaDocument.properties │ │ │ │ │ │ ├── htmlparser.properties │ │ │ │ │ │ └── xmlparser.properties │ │ │ │ │ ├── layout_errors.properties │ │ │ │ │ ├── mathml/ │ │ │ │ │ │ └── mathml.properties │ │ │ │ │ ├── mozilla.dtd │ │ │ │ │ ├── narrate.properties │ │ │ │ │ ├── netError.dtd │ │ │ │ │ ├── netErrorApp.dtd │ │ │ │ │ ├── notification.dtd │ │ │ │ │ ├── nsWebBrowserPersist.properties │ │ │ │ │ ├── plugins.properties │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ ├── printPageSetup.dtd │ │ │ │ │ ├── printPreview.dtd │ │ │ │ │ ├── printPreviewProgress.dtd │ │ │ │ │ ├── printProgress.dtd │ │ │ │ │ ├── printdialog.dtd │ │ │ │ │ ├── printdialog.properties │ │ │ │ │ ├── printing.properties │ │ │ │ │ ├── printjoboptions.dtd │ │ │ │ │ ├── regionNames.properties │ │ │ │ │ ├── resetProfile.dtd │ │ │ │ │ ├── resetProfile.properties │ │ │ │ │ ├── search/ │ │ │ │ │ │ └── search.properties │ │ │ │ │ ├── security/ │ │ │ │ │ │ ├── caps.properties │ │ │ │ │ │ ├── csp.properties │ │ │ │ │ │ └── security.properties │ │ │ │ │ ├── storage.properties │ │ │ │ │ ├── svg/ │ │ │ │ │ │ └── svg.properties │ │ │ │ │ ├── textcontext.dtd │ │ │ │ │ ├── tree.dtd │ │ │ │ │ ├── videocontrols.dtd │ │ │ │ │ ├── viewSource.dtd │ │ │ │ │ ├── viewSource.properties │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ ├── webapps.properties │ │ │ │ │ ├── wizard.dtd │ │ │ │ │ ├── wizard.properties │ │ │ │ │ ├── xbl.properties │ │ │ │ │ ├── xml/ │ │ │ │ │ │ └── prettyprint.dtd │ │ │ │ │ ├── xpinstall/ │ │ │ │ │ │ └── xpinstall.properties │ │ │ │ │ ├── xslt/ │ │ │ │ │ │ └── xslt.properties │ │ │ │ │ └── xul.properties │ │ │ │ ├── global-platform/ │ │ │ │ │ ├── mac/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ ├── unix/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ └── win/ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ ├── intl.properties │ │ │ │ │ └── platformKeys.properties │ │ │ │ ├── global-region/ │ │ │ │ │ └── region.properties │ │ │ │ ├── mozapps/ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ ├── settingsChange.dtd │ │ │ │ │ │ ├── unknownContentType.dtd │ │ │ │ │ │ └── unknownContentType.properties │ │ │ │ │ ├── extensions/ │ │ │ │ │ │ ├── about.dtd │ │ │ │ │ │ ├── blocklist.dtd │ │ │ │ │ │ ├── extensions.dtd │ │ │ │ │ │ ├── extensions.properties │ │ │ │ │ │ ├── newaddon.dtd │ │ │ │ │ │ ├── newaddon.properties │ │ │ │ │ │ ├── selectAddons.dtd │ │ │ │ │ │ ├── selectAddons.properties │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── handling/ │ │ │ │ │ │ ├── handling.dtd │ │ │ │ │ │ └── handling.properties │ │ │ │ │ ├── plugins/ │ │ │ │ │ │ ├── plugins.dtd │ │ │ │ │ │ └── plugins.properties │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ ├── changemp.dtd │ │ │ │ │ │ ├── ocsp.dtd │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ └── removemp.dtd │ │ │ │ │ ├── profile/ │ │ │ │ │ │ ├── createProfileWizard.dtd │ │ │ │ │ │ ├── profileSelection.dtd │ │ │ │ │ │ └── profileSelection.properties │ │ │ │ │ ├── update/ │ │ │ │ │ │ ├── history.dtd │ │ │ │ │ │ ├── updates.dtd │ │ │ │ │ │ └── updates.properties │ │ │ │ │ └── xpinstall/ │ │ │ │ │ ├── xpinstallConfirm.dtd │ │ │ │ │ └── xpinstallConfirm.properties │ │ │ │ ├── necko/ │ │ │ │ │ └── necko.properties │ │ │ │ ├── passwordmgr/ │ │ │ │ │ ├── passwordManager.dtd │ │ │ │ │ └── passwordmgr.properties │ │ │ │ ├── pipnss/ │ │ │ │ │ ├── nsserrors.properties │ │ │ │ │ ├── pipnss.properties │ │ │ │ │ └── security.properties │ │ │ │ ├── pippki/ │ │ │ │ │ ├── certManager.dtd │ │ │ │ │ ├── deviceManager.dtd │ │ │ │ │ ├── pippki.dtd │ │ │ │ │ ├── pippki.properties │ │ │ │ │ └── validation.dtd │ │ │ │ ├── places/ │ │ │ │ │ └── places.properties │ │ │ │ ├── pluginproblem/ │ │ │ │ │ └── pluginproblem.dtd │ │ │ │ └── services/ │ │ │ │ ├── errors.properties │ │ │ │ └── sync.properties │ │ │ └── ja.manifest │ │ ├── chrome.manifest │ │ └── install.rdf │ ├── ko/ │ │ ├── bluegriffon/ │ │ │ └── chrome.manifest │ │ ├── browser/ │ │ │ ├── chrome/ │ │ │ │ ├── ko/ │ │ │ │ │ └── locale/ │ │ │ │ │ ├── branding/ │ │ │ │ │ │ ├── brand.dtd │ │ │ │ │ │ ├── brand.properties │ │ │ │ │ │ └── browserconfig.properties │ │ │ │ │ ├── browser/ │ │ │ │ │ │ ├── aboutAccounts.dtd │ │ │ │ │ │ ├── aboutCertError.dtd │ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ │ ├── aboutHealthReport.dtd │ │ │ │ │ │ ├── aboutHome.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.properties │ │ │ │ │ │ ├── aboutRobots.dtd │ │ │ │ │ │ ├── aboutSearchReset.dtd │ │ │ │ │ │ ├── aboutSessionRestore.dtd │ │ │ │ │ │ ├── aboutSyncTabs.dtd │ │ │ │ │ │ ├── aboutTabCrashed.dtd │ │ │ │ │ │ ├── accounts.properties │ │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ │ ├── baseMenuOverlay.dtd │ │ │ │ │ │ ├── bookmarks.html │ │ │ │ │ │ ├── browser.dtd │ │ │ │ │ │ ├── browser.properties │ │ │ │ │ │ ├── customizableui/ │ │ │ │ │ │ │ └── customizableWidgets.properties │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ ├── app-manager.dtd │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ ├── profiler.dtd │ │ │ │ │ │ │ ├── profiler.properties │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ ├── styleinspector.properties │ │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ │ ├── timeline.dtd │ │ │ │ │ │ │ ├── timeline.properties │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ │ └── settingsChange.dtd │ │ │ │ │ │ ├── engineManager.dtd │ │ │ │ │ │ ├── engineManager.properties │ │ │ │ │ │ ├── feeds/ │ │ │ │ │ │ │ ├── subscribe.dtd │ │ │ │ │ │ │ └── subscribe.properties │ │ │ │ │ │ ├── lightweightThemes.properties │ │ │ │ │ │ ├── loop/ │ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ │ ├── migration/ │ │ │ │ │ │ │ ├── migration.dtd │ │ │ │ │ │ │ └── migration.properties │ │ │ │ │ │ ├── netError.dtd │ │ │ │ │ │ ├── newTab.dtd │ │ │ │ │ │ ├── newTab.properties │ │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ │ ├── pageInfo.dtd │ │ │ │ │ │ ├── pageInfo.properties │ │ │ │ │ │ ├── places/ │ │ │ │ │ │ │ ├── bookmarkProperties.properties │ │ │ │ │ │ │ ├── editBookmarkOverlay.dtd │ │ │ │ │ │ │ ├── moveBookmarks.dtd │ │ │ │ │ │ │ ├── places.dtd │ │ │ │ │ │ │ └── places.properties │ │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ │ ├── aboutPermissions.dtd │ │ │ │ │ │ │ ├── aboutPermissions.properties │ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ │ ├── applicationManager.dtd │ │ │ │ │ │ │ ├── applicationManager.properties │ │ │ │ │ │ │ ├── applications.dtd │ │ │ │ │ │ │ ├── blocklists.dtd │ │ │ │ │ │ │ ├── colors.dtd │ │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ │ ├── containers.dtd │ │ │ │ │ │ │ ├── containers.properties │ │ │ │ │ │ │ ├── content.dtd │ │ │ │ │ │ │ ├── cookies.dtd │ │ │ │ │ │ │ ├── donottrack.dtd │ │ │ │ │ │ │ ├── fonts.dtd │ │ │ │ │ │ │ ├── languages.dtd │ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ │ ├── permissions.dtd │ │ │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ │ ├── privacy.dtd │ │ │ │ │ │ │ ├── search.dtd │ │ │ │ │ │ │ ├── security.dtd │ │ │ │ │ │ │ ├── selectBookmark.dtd │ │ │ │ │ │ │ ├── siteDataSettings.dtd │ │ │ │ │ │ │ ├── sync.dtd │ │ │ │ │ │ │ ├── tabs.dtd │ │ │ │ │ │ │ └── translation.dtd │ │ │ │ │ │ ├── quitDialog.properties │ │ │ │ │ │ ├── safeMode.dtd │ │ │ │ │ │ ├── safebrowsing/ │ │ │ │ │ │ │ ├── phishing-afterload-warning-message.dtd │ │ │ │ │ │ │ └── report-phishing.dtd │ │ │ │ │ │ ├── sanitize.dtd │ │ │ │ │ │ ├── search.properties │ │ │ │ │ │ ├── searchbar.dtd │ │ │ │ │ │ ├── searchplugins/ │ │ │ │ │ │ │ ├── danawa-kr.xml │ │ │ │ │ │ │ ├── daum-kr.xml │ │ │ │ │ │ │ ├── ddg.xml │ │ │ │ │ │ │ ├── google-nocodes.xml │ │ │ │ │ │ │ ├── google.xml │ │ │ │ │ │ │ ├── list.json │ │ │ │ │ │ │ ├── naver-kr.xml │ │ │ │ │ │ │ └── wikipedia-kr.xml │ │ │ │ │ │ ├── setDesktopBackground.dtd │ │ │ │ │ │ ├── shellservice.properties │ │ │ │ │ │ ├── sitePermissions.properties │ │ │ │ │ │ ├── syncBrand.dtd │ │ │ │ │ │ ├── syncCustomize.dtd │ │ │ │ │ │ ├── syncGenericChange.properties │ │ │ │ │ │ ├── syncKey.dtd │ │ │ │ │ │ ├── syncProgress.dtd │ │ │ │ │ │ ├── syncQuota.dtd │ │ │ │ │ │ ├── syncQuota.properties │ │ │ │ │ │ ├── syncSetup.dtd │ │ │ │ │ │ ├── syncSetup.properties │ │ │ │ │ │ ├── tabbrowser.dtd │ │ │ │ │ │ ├── tabbrowser.properties │ │ │ │ │ │ ├── tabview.properties │ │ │ │ │ │ ├── taskbar.properties │ │ │ │ │ │ ├── translation.dtd │ │ │ │ │ │ ├── translation.properties │ │ │ │ │ │ └── webrtcIndicator.properties │ │ │ │ │ ├── browser-region/ │ │ │ │ │ │ └── region.properties │ │ │ │ │ ├── feedback/ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ └── main.properties │ │ │ │ │ ├── ko/ │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── client/ │ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ │ ├── aboutdebugging.dtd │ │ │ │ │ │ │ │ ├── aboutdebugging.properties │ │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ │ ├── app-manager.dtd │ │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ │ ├── boxmodel.properties │ │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ │ ├── components.properties │ │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ │ ├── dom.properties │ │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ │ ├── filterwidget.dtd │ │ │ │ │ │ │ │ ├── filterwidget.properties │ │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ │ ├── font-inspector.properties │ │ │ │ │ │ │ │ ├── graphs.properties │ │ │ │ │ │ │ │ ├── har.properties │ │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ │ ├── jit-optimizations.properties │ │ │ │ │ │ │ │ ├── jsonview.properties │ │ │ │ │ │ │ │ ├── layout.properties │ │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ │ ├── markers.properties │ │ │ │ │ │ │ │ ├── memory.properties │ │ │ │ │ │ │ │ ├── menus.properties │ │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ │ ├── performance.dtd │ │ │ │ │ │ │ │ ├── performance.properties │ │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ │ ├── promisedebugger.dtd │ │ │ │ │ │ │ │ ├── promisedebugger.properties │ │ │ │ │ │ │ │ ├── responsive.properties │ │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ │ ├── startup.properties │ │ │ │ │ │ │ │ ├── storage.dtd │ │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ │ └── shared/ │ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ │ └── formautofill.properties │ │ │ │ │ └── pdfviewer/ │ │ │ │ │ ├── chrome.properties │ │ │ │ │ └── viewer.properties │ │ │ │ └── ko.manifest │ │ │ ├── chrome.manifest │ │ │ ├── crashreporter-override.ini │ │ │ ├── defaults/ │ │ │ │ ├── preferences/ │ │ │ │ │ └── firefox-l10n.js │ │ │ │ └── profile/ │ │ │ │ ├── bookmarks.html │ │ │ │ ├── chrome/ │ │ │ │ │ ├── userChrome-example.css │ │ │ │ │ └── userContent-example.css │ │ │ │ ├── localstore.rdf │ │ │ │ └── mimeTypes.rdf │ │ │ ├── features/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── firefox@getpocket.com/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── ko/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── ko/ │ │ │ │ │ │ └── pocket.properties │ │ │ │ │ └── ko.manifest │ │ │ │ ├── loop@mozilla.org/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── ko/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── ko/ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ └── ko.manifest │ │ │ │ └── presentation@mozilla.org/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── ko/ │ │ │ │ │ └── locale/ │ │ │ │ │ └── ko/ │ │ │ │ │ └── presentation.properties │ │ │ │ └── ko.manifest │ │ │ └── searchplugins/ │ │ │ ├── danawa-kr.xml │ │ │ ├── daum-kr.xml │ │ │ ├── google.xml │ │ │ ├── naver-kr.xml │ │ │ └── wikipedia-kr.xml │ │ ├── chrome/ │ │ │ ├── ko/ │ │ │ │ └── locale/ │ │ │ │ └── ko/ │ │ │ │ ├── alerts/ │ │ │ │ │ ├── alert.dtd │ │ │ │ │ ├── alert.properties │ │ │ │ │ └── notificationNames.properties │ │ │ │ ├── autoconfig/ │ │ │ │ │ └── autoconfig.properties │ │ │ │ ├── cookie/ │ │ │ │ │ ├── cookieAcceptDialog.dtd │ │ │ │ │ └── cookieAcceptDialog.properties │ │ │ │ ├── formautofill/ │ │ │ │ │ └── requestAutocomplete.dtd │ │ │ │ ├── global/ │ │ │ │ │ ├── AccessFu.properties │ │ │ │ │ ├── about.dtd │ │ │ │ │ ├── aboutAbout.dtd │ │ │ │ │ ├── aboutNetworking.dtd │ │ │ │ │ ├── aboutProfiles.dtd │ │ │ │ │ ├── aboutProfiles.properties │ │ │ │ │ ├── aboutReader.properties │ │ │ │ │ ├── aboutRights.dtd │ │ │ │ │ ├── aboutRights.properties │ │ │ │ │ ├── aboutServiceWorkers.dtd │ │ │ │ │ ├── aboutServiceWorkers.properties │ │ │ │ │ ├── aboutSupport.dtd │ │ │ │ │ ├── aboutSupport.properties │ │ │ │ │ ├── aboutTelemetry.dtd │ │ │ │ │ ├── aboutTelemetry.properties │ │ │ │ │ ├── aboutWebrtc.properties │ │ │ │ │ ├── actions.dtd │ │ │ │ │ ├── appPicker.dtd │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ ├── autocomplete.properties │ │ │ │ │ ├── brand.dtd │ │ │ │ │ ├── browser.properties │ │ │ │ │ ├── charsetMenu.dtd │ │ │ │ │ ├── charsetMenu.properties │ │ │ │ │ ├── charsetOverlay.dtd │ │ │ │ │ ├── charsetTitles.properties │ │ │ │ │ ├── commonDialog.dtd │ │ │ │ │ ├── commonDialogs.properties │ │ │ │ │ ├── config.dtd │ │ │ │ │ ├── config.properties │ │ │ │ │ ├── console.dtd │ │ │ │ │ ├── console.properties │ │ │ │ │ ├── contentAreaCommands.properties │ │ │ │ │ ├── crashes.dtd │ │ │ │ │ ├── crashes.properties │ │ │ │ │ ├── css.properties │ │ │ │ │ ├── customizeCharset.dtd │ │ │ │ │ ├── customizeToolbar.dtd │ │ │ │ │ ├── customizeToolbar.properties │ │ │ │ │ ├── dateFormat.properties │ │ │ │ │ ├── datetimepicker.dtd │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ ├── dialog.properties │ │ │ │ │ ├── dialogOverlay.dtd │ │ │ │ │ ├── dom/ │ │ │ │ │ │ └── dom.properties │ │ │ │ │ ├── downloadProgress.properties │ │ │ │ │ ├── editMenuOverlay.dtd │ │ │ │ │ ├── extensions.properties │ │ │ │ │ ├── fallbackMenubar.properties │ │ │ │ │ ├── filefield.properties │ │ │ │ │ ├── filepicker.dtd │ │ │ │ │ ├── filepicker.properties │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── findbar.properties │ │ │ │ │ ├── finddialog.dtd │ │ │ │ │ ├── finddialog.properties │ │ │ │ │ ├── global-strres.properties │ │ │ │ │ ├── global.dtd │ │ │ │ │ ├── globalKeys.dtd │ │ │ │ │ ├── headsUpDisplay.properties │ │ │ │ │ ├── intl.css │ │ │ │ │ ├── intl.properties │ │ │ │ │ ├── keys.properties │ │ │ │ │ ├── languageNames.properties │ │ │ │ │ ├── layout/ │ │ │ │ │ │ ├── HtmlForm.properties │ │ │ │ │ │ ├── MediaDocument.properties │ │ │ │ │ │ ├── htmlparser.properties │ │ │ │ │ │ └── xmlparser.properties │ │ │ │ │ ├── layout_errors.properties │ │ │ │ │ ├── mathml/ │ │ │ │ │ │ └── mathml.properties │ │ │ │ │ ├── mozilla.dtd │ │ │ │ │ ├── narrate.properties │ │ │ │ │ ├── netError.dtd │ │ │ │ │ ├── netErrorApp.dtd │ │ │ │ │ ├── notification.dtd │ │ │ │ │ ├── nsWebBrowserPersist.properties │ │ │ │ │ ├── plugins.properties │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ ├── printPageSetup.dtd │ │ │ │ │ ├── printPreview.dtd │ │ │ │ │ ├── printPreviewProgress.dtd │ │ │ │ │ ├── printProgress.dtd │ │ │ │ │ ├── printdialog.dtd │ │ │ │ │ ├── printdialog.properties │ │ │ │ │ ├── printing.properties │ │ │ │ │ ├── printjoboptions.dtd │ │ │ │ │ ├── regionNames.properties │ │ │ │ │ ├── resetProfile.dtd │ │ │ │ │ ├── resetProfile.properties │ │ │ │ │ ├── search/ │ │ │ │ │ │ └── search.properties │ │ │ │ │ ├── security/ │ │ │ │ │ │ ├── caps.properties │ │ │ │ │ │ ├── csp.properties │ │ │ │ │ │ └── security.properties │ │ │ │ │ ├── storage.properties │ │ │ │ │ ├── svg/ │ │ │ │ │ │ └── svg.properties │ │ │ │ │ ├── textcontext.dtd │ │ │ │ │ ├── tree.dtd │ │ │ │ │ ├── videocontrols.dtd │ │ │ │ │ ├── viewSource.dtd │ │ │ │ │ ├── viewSource.properties │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ ├── webapps.properties │ │ │ │ │ ├── wizard.dtd │ │ │ │ │ ├── wizard.properties │ │ │ │ │ ├── xbl.properties │ │ │ │ │ ├── xml/ │ │ │ │ │ │ └── prettyprint.dtd │ │ │ │ │ ├── xpinstall/ │ │ │ │ │ │ └── xpinstall.properties │ │ │ │ │ ├── xslt/ │ │ │ │ │ │ └── xslt.properties │ │ │ │ │ └── xul.properties │ │ │ │ ├── global-platform/ │ │ │ │ │ ├── mac/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ ├── unix/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ └── win/ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ ├── intl.properties │ │ │ │ │ └── platformKeys.properties │ │ │ │ ├── global-region/ │ │ │ │ │ └── region.properties │ │ │ │ ├── mozapps/ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ ├── settingsChange.dtd │ │ │ │ │ │ ├── unknownContentType.dtd │ │ │ │ │ │ └── unknownContentType.properties │ │ │ │ │ ├── extensions/ │ │ │ │ │ │ ├── about.dtd │ │ │ │ │ │ ├── blocklist.dtd │ │ │ │ │ │ ├── extensions.dtd │ │ │ │ │ │ ├── extensions.properties │ │ │ │ │ │ ├── newaddon.dtd │ │ │ │ │ │ ├── newaddon.properties │ │ │ │ │ │ ├── selectAddons.dtd │ │ │ │ │ │ ├── selectAddons.properties │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── handling/ │ │ │ │ │ │ ├── handling.dtd │ │ │ │ │ │ └── handling.properties │ │ │ │ │ ├── plugins/ │ │ │ │ │ │ ├── plugins.dtd │ │ │ │ │ │ └── plugins.properties │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ ├── changemp.dtd │ │ │ │ │ │ ├── ocsp.dtd │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ └── removemp.dtd │ │ │ │ │ ├── profile/ │ │ │ │ │ │ ├── createProfileWizard.dtd │ │ │ │ │ │ ├── profileSelection.dtd │ │ │ │ │ │ └── profileSelection.properties │ │ │ │ │ ├── update/ │ │ │ │ │ │ ├── history.dtd │ │ │ │ │ │ ├── updates.dtd │ │ │ │ │ │ └── updates.properties │ │ │ │ │ └── xpinstall/ │ │ │ │ │ ├── xpinstallConfirm.dtd │ │ │ │ │ └── xpinstallConfirm.properties │ │ │ │ ├── necko/ │ │ │ │ │ └── necko.properties │ │ │ │ ├── passwordmgr/ │ │ │ │ │ ├── passwordManager.dtd │ │ │ │ │ └── passwordmgr.properties │ │ │ │ ├── pipnss/ │ │ │ │ │ ├── nsserrors.properties │ │ │ │ │ ├── pipnss.properties │ │ │ │ │ └── security.properties │ │ │ │ ├── pippki/ │ │ │ │ │ ├── certManager.dtd │ │ │ │ │ ├── deviceManager.dtd │ │ │ │ │ ├── pippki.dtd │ │ │ │ │ ├── pippki.properties │ │ │ │ │ └── validation.dtd │ │ │ │ ├── places/ │ │ │ │ │ └── places.properties │ │ │ │ ├── pluginproblem/ │ │ │ │ │ └── pluginproblem.dtd │ │ │ │ └── services/ │ │ │ │ ├── errors.properties │ │ │ │ └── sync.properties │ │ │ └── ko.manifest │ │ ├── chrome.manifest │ │ └── install.rdf │ ├── moz.build │ ├── nl/ │ │ ├── bluegriffon/ │ │ │ └── chrome.manifest │ │ ├── browser/ │ │ │ ├── chrome/ │ │ │ │ ├── nl/ │ │ │ │ │ └── locale/ │ │ │ │ │ ├── branding/ │ │ │ │ │ │ ├── brand.dtd │ │ │ │ │ │ ├── brand.properties │ │ │ │ │ │ └── browserconfig.properties │ │ │ │ │ ├── browser/ │ │ │ │ │ │ ├── aboutAccounts.dtd │ │ │ │ │ │ ├── aboutCertError.dtd │ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ │ ├── aboutHealthReport.dtd │ │ │ │ │ │ ├── aboutHome.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.properties │ │ │ │ │ │ ├── aboutRobots.dtd │ │ │ │ │ │ ├── aboutSearchReset.dtd │ │ │ │ │ │ ├── aboutSessionRestore.dtd │ │ │ │ │ │ ├── aboutSyncTabs.dtd │ │ │ │ │ │ ├── aboutTabCrashed.dtd │ │ │ │ │ │ ├── accounts.properties │ │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ │ ├── baseMenuOverlay.dtd │ │ │ │ │ │ ├── bookmarks.html │ │ │ │ │ │ ├── browser.dtd │ │ │ │ │ │ ├── browser.properties │ │ │ │ │ │ ├── customizableui/ │ │ │ │ │ │ │ └── customizableWidgets.properties │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ ├── app-manager.dtd │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ ├── profiler.dtd │ │ │ │ │ │ │ ├── profiler.properties │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ ├── styleinspector.properties │ │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ │ ├── timeline.dtd │ │ │ │ │ │ │ ├── timeline.properties │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ │ └── settingsChange.dtd │ │ │ │ │ │ ├── engineManager.dtd │ │ │ │ │ │ ├── engineManager.properties │ │ │ │ │ │ ├── feeds/ │ │ │ │ │ │ │ ├── subscribe.dtd │ │ │ │ │ │ │ └── subscribe.properties │ │ │ │ │ │ ├── lightweightThemes.properties │ │ │ │ │ │ ├── loop/ │ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ │ ├── migration/ │ │ │ │ │ │ │ ├── migration.dtd │ │ │ │ │ │ │ └── migration.properties │ │ │ │ │ │ ├── netError.dtd │ │ │ │ │ │ ├── newTab.dtd │ │ │ │ │ │ ├── newTab.properties │ │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ │ ├── pageInfo.dtd │ │ │ │ │ │ ├── pageInfo.properties │ │ │ │ │ │ ├── places/ │ │ │ │ │ │ │ ├── bookmarkProperties.properties │ │ │ │ │ │ │ ├── editBookmarkOverlay.dtd │ │ │ │ │ │ │ ├── moveBookmarks.dtd │ │ │ │ │ │ │ ├── places.dtd │ │ │ │ │ │ │ └── places.properties │ │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ │ ├── aboutPermissions.dtd │ │ │ │ │ │ │ ├── aboutPermissions.properties │ │ │ │ │ │ │ ├── advanced-scripts.dtd │ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ │ ├── applicationManager.dtd │ │ │ │ │ │ │ ├── applicationManager.properties │ │ │ │ │ │ │ ├── applications.dtd │ │ │ │ │ │ │ ├── blocklists.dtd │ │ │ │ │ │ │ ├── colors.dtd │ │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ │ ├── containers.dtd │ │ │ │ │ │ │ ├── containers.properties │ │ │ │ │ │ │ ├── content.dtd │ │ │ │ │ │ │ ├── cookies.dtd │ │ │ │ │ │ │ ├── donottrack.dtd │ │ │ │ │ │ │ ├── fonts.dtd │ │ │ │ │ │ │ ├── languages.dtd │ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ │ ├── permissions.dtd │ │ │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ │ ├── privacy.dtd │ │ │ │ │ │ │ ├── search.dtd │ │ │ │ │ │ │ ├── security.dtd │ │ │ │ │ │ │ ├── selectBookmark.dtd │ │ │ │ │ │ │ ├── siteDataSettings.dtd │ │ │ │ │ │ │ ├── sync.dtd │ │ │ │ │ │ │ ├── tabs.dtd │ │ │ │ │ │ │ └── translation.dtd │ │ │ │ │ │ ├── quitDialog.properties │ │ │ │ │ │ ├── safeMode.dtd │ │ │ │ │ │ ├── safebrowsing/ │ │ │ │ │ │ │ ├── phishing-afterload-warning-message.dtd │ │ │ │ │ │ │ └── report-phishing.dtd │ │ │ │ │ │ ├── sanitize.dtd │ │ │ │ │ │ ├── search.properties │ │ │ │ │ │ ├── searchbar.dtd │ │ │ │ │ │ ├── searchplugins/ │ │ │ │ │ │ │ ├── bing.xml │ │ │ │ │ │ │ ├── bolcom-nl.xml │ │ │ │ │ │ │ ├── ddg.xml │ │ │ │ │ │ │ ├── google-nocodes.xml │ │ │ │ │ │ │ ├── google.xml │ │ │ │ │ │ │ ├── list.json │ │ │ │ │ │ │ ├── marktplaats-nl.xml │ │ │ │ │ │ │ └── wikipedia-nl.xml │ │ │ │ │ │ ├── setDesktopBackground.dtd │ │ │ │ │ │ ├── shellservice.properties │ │ │ │ │ │ ├── sitePermissions.properties │ │ │ │ │ │ ├── syncBrand.dtd │ │ │ │ │ │ ├── syncCustomize.dtd │ │ │ │ │ │ ├── syncGenericChange.properties │ │ │ │ │ │ ├── syncKey.dtd │ │ │ │ │ │ ├── syncProgress.dtd │ │ │ │ │ │ ├── syncQuota.dtd │ │ │ │ │ │ ├── syncQuota.properties │ │ │ │ │ │ ├── syncSetup.dtd │ │ │ │ │ │ ├── syncSetup.properties │ │ │ │ │ │ ├── tabbrowser.dtd │ │ │ │ │ │ ├── tabbrowser.properties │ │ │ │ │ │ ├── tabview.properties │ │ │ │ │ │ ├── taskbar.properties │ │ │ │ │ │ ├── translation.dtd │ │ │ │ │ │ ├── translation.properties │ │ │ │ │ │ └── webrtcIndicator.properties │ │ │ │ │ ├── browser-region/ │ │ │ │ │ │ └── region.properties │ │ │ │ │ ├── feedback/ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ └── main.properties │ │ │ │ │ ├── nl/ │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── client/ │ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ │ ├── aboutdebugging.dtd │ │ │ │ │ │ │ │ ├── aboutdebugging.properties │ │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ │ ├── boxmodel.properties │ │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ │ ├── components.properties │ │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ │ ├── dom.properties │ │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ │ ├── filterwidget.dtd │ │ │ │ │ │ │ │ ├── filterwidget.properties │ │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ │ ├── font-inspector.properties │ │ │ │ │ │ │ │ ├── graphs.properties │ │ │ │ │ │ │ │ ├── har.properties │ │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ │ ├── jit-optimizations.properties │ │ │ │ │ │ │ │ ├── jsonview.properties │ │ │ │ │ │ │ │ ├── layout.properties │ │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ │ ├── markers.properties │ │ │ │ │ │ │ │ ├── memory.properties │ │ │ │ │ │ │ │ ├── menus.properties │ │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ │ ├── performance.dtd │ │ │ │ │ │ │ │ ├── performance.properties │ │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ │ ├── promisedebugger.dtd │ │ │ │ │ │ │ │ ├── promisedebugger.properties │ │ │ │ │ │ │ │ ├── responsive.properties │ │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ │ ├── startup.properties │ │ │ │ │ │ │ │ ├── storage.dtd │ │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ │ └── shared/ │ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ │ └── formautofill.properties │ │ │ │ │ └── pdfviewer/ │ │ │ │ │ ├── chrome.properties │ │ │ │ │ └── viewer.properties │ │ │ │ └── nl.manifest │ │ │ ├── chrome.manifest │ │ │ ├── crashreporter-override.ini │ │ │ ├── defaults/ │ │ │ │ ├── preferences/ │ │ │ │ │ └── firefox-l10n.js │ │ │ │ └── profile/ │ │ │ │ ├── bookmarks.html │ │ │ │ ├── chrome/ │ │ │ │ │ ├── userChrome-example.css │ │ │ │ │ └── userContent-example.css │ │ │ │ ├── localstore.rdf │ │ │ │ └── mimeTypes.rdf │ │ │ ├── features/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── firefox@getpocket.com/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── nl/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── nl/ │ │ │ │ │ │ └── pocket.properties │ │ │ │ │ └── nl.manifest │ │ │ │ ├── loop@mozilla.org/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── nl/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── nl/ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ └── nl.manifest │ │ │ │ └── presentation@mozilla.org/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── nl/ │ │ │ │ │ └── locale/ │ │ │ │ │ └── nl/ │ │ │ │ │ └── presentation.properties │ │ │ │ └── nl.manifest │ │ │ └── searchplugins/ │ │ │ ├── bing.xml │ │ │ ├── bolcom-nl.xml │ │ │ ├── google.xml │ │ │ ├── marktplaats-nl.xml │ │ │ └── wikipedia-nl.xml │ │ ├── chrome/ │ │ │ ├── nl/ │ │ │ │ └── locale/ │ │ │ │ └── nl/ │ │ │ │ ├── alerts/ │ │ │ │ │ ├── alert.dtd │ │ │ │ │ ├── alert.properties │ │ │ │ │ └── notificationNames.properties │ │ │ │ ├── autoconfig/ │ │ │ │ │ └── autoconfig.properties │ │ │ │ ├── cookie/ │ │ │ │ │ ├── cookieAcceptDialog.dtd │ │ │ │ │ └── cookieAcceptDialog.properties │ │ │ │ ├── formautofill/ │ │ │ │ │ └── requestAutocomplete.dtd │ │ │ │ ├── global/ │ │ │ │ │ ├── AccessFu.properties │ │ │ │ │ ├── about.dtd │ │ │ │ │ ├── aboutAbout.dtd │ │ │ │ │ ├── aboutNetworking.dtd │ │ │ │ │ ├── aboutProfiles.dtd │ │ │ │ │ ├── aboutProfiles.properties │ │ │ │ │ ├── aboutReader.properties │ │ │ │ │ ├── aboutRights.dtd │ │ │ │ │ ├── aboutRights.properties │ │ │ │ │ ├── aboutServiceWorkers.dtd │ │ │ │ │ ├── aboutServiceWorkers.properties │ │ │ │ │ ├── aboutSupport.dtd │ │ │ │ │ ├── aboutSupport.properties │ │ │ │ │ ├── aboutTelemetry.dtd │ │ │ │ │ ├── aboutTelemetry.properties │ │ │ │ │ ├── aboutWebrtc.properties │ │ │ │ │ ├── actions.dtd │ │ │ │ │ ├── appPicker.dtd │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ ├── autocomplete.properties │ │ │ │ │ ├── brand.dtd │ │ │ │ │ ├── browser.properties │ │ │ │ │ ├── charsetMenu.dtd │ │ │ │ │ ├── charsetMenu.properties │ │ │ │ │ ├── charsetOverlay.dtd │ │ │ │ │ ├── charsetTitles.properties │ │ │ │ │ ├── commonDialog.dtd │ │ │ │ │ ├── commonDialogs.properties │ │ │ │ │ ├── config.dtd │ │ │ │ │ ├── config.properties │ │ │ │ │ ├── console.dtd │ │ │ │ │ ├── console.properties │ │ │ │ │ ├── contentAreaCommands.properties │ │ │ │ │ ├── crashes.dtd │ │ │ │ │ ├── crashes.properties │ │ │ │ │ ├── css.properties │ │ │ │ │ ├── customizeCharset.dtd │ │ │ │ │ ├── customizeToolbar.dtd │ │ │ │ │ ├── customizeToolbar.properties │ │ │ │ │ ├── dateFormat.properties │ │ │ │ │ ├── datetimepicker.dtd │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ ├── dialog.properties │ │ │ │ │ ├── dialogOverlay.dtd │ │ │ │ │ ├── dom/ │ │ │ │ │ │ └── dom.properties │ │ │ │ │ ├── downloadProgress.properties │ │ │ │ │ ├── editMenuOverlay.dtd │ │ │ │ │ ├── extensions.properties │ │ │ │ │ ├── fallbackMenubar.properties │ │ │ │ │ ├── filefield.properties │ │ │ │ │ ├── filepicker.dtd │ │ │ │ │ ├── filepicker.properties │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── findbar.properties │ │ │ │ │ ├── finddialog.dtd │ │ │ │ │ ├── finddialog.properties │ │ │ │ │ ├── global-strres.properties │ │ │ │ │ ├── global.dtd │ │ │ │ │ ├── globalKeys.dtd │ │ │ │ │ ├── headsUpDisplay.properties │ │ │ │ │ ├── intl.css │ │ │ │ │ ├── intl.properties │ │ │ │ │ ├── keys.properties │ │ │ │ │ ├── languageNames.properties │ │ │ │ │ ├── layout/ │ │ │ │ │ │ ├── HtmlForm.properties │ │ │ │ │ │ ├── MediaDocument.properties │ │ │ │ │ │ ├── htmlparser.properties │ │ │ │ │ │ └── xmlparser.properties │ │ │ │ │ ├── layout_errors.properties │ │ │ │ │ ├── mathml/ │ │ │ │ │ │ └── mathml.properties │ │ │ │ │ ├── mozilla.dtd │ │ │ │ │ ├── narrate.properties │ │ │ │ │ ├── netError.dtd │ │ │ │ │ ├── netErrorApp.dtd │ │ │ │ │ ├── notification.dtd │ │ │ │ │ ├── nsWebBrowserPersist.properties │ │ │ │ │ ├── plugins.properties │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ ├── printPageSetup.dtd │ │ │ │ │ ├── printPreview.dtd │ │ │ │ │ ├── printPreviewProgress.dtd │ │ │ │ │ ├── printProgress.dtd │ │ │ │ │ ├── printdialog.dtd │ │ │ │ │ ├── printdialog.properties │ │ │ │ │ ├── printing.properties │ │ │ │ │ ├── printjoboptions.dtd │ │ │ │ │ ├── regionNames.properties │ │ │ │ │ ├── resetProfile.dtd │ │ │ │ │ ├── resetProfile.properties │ │ │ │ │ ├── search/ │ │ │ │ │ │ └── search.properties │ │ │ │ │ ├── security/ │ │ │ │ │ │ ├── caps.properties │ │ │ │ │ │ ├── csp.properties │ │ │ │ │ │ └── security.properties │ │ │ │ │ ├── storage.properties │ │ │ │ │ ├── svg/ │ │ │ │ │ │ └── svg.properties │ │ │ │ │ ├── textcontext.dtd │ │ │ │ │ ├── tree.dtd │ │ │ │ │ ├── videocontrols.dtd │ │ │ │ │ ├── viewSource.dtd │ │ │ │ │ ├── viewSource.properties │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ ├── webapps.properties │ │ │ │ │ ├── wizard.dtd │ │ │ │ │ ├── wizard.properties │ │ │ │ │ ├── xbl.properties │ │ │ │ │ ├── xml/ │ │ │ │ │ │ └── prettyprint.dtd │ │ │ │ │ ├── xpinstall/ │ │ │ │ │ │ └── xpinstall.properties │ │ │ │ │ ├── xslt/ │ │ │ │ │ │ └── xslt.properties │ │ │ │ │ └── xul.properties │ │ │ │ ├── global-platform/ │ │ │ │ │ ├── mac/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ ├── unix/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ └── win/ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ ├── intl.properties │ │ │ │ │ └── platformKeys.properties │ │ │ │ ├── global-region/ │ │ │ │ │ └── region.properties │ │ │ │ ├── mozapps/ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ ├── settingsChange.dtd │ │ │ │ │ │ ├── unknownContentType.dtd │ │ │ │ │ │ └── unknownContentType.properties │ │ │ │ │ ├── extensions/ │ │ │ │ │ │ ├── about.dtd │ │ │ │ │ │ ├── blocklist.dtd │ │ │ │ │ │ ├── extensions.dtd │ │ │ │ │ │ ├── extensions.properties │ │ │ │ │ │ ├── newaddon.dtd │ │ │ │ │ │ ├── newaddon.properties │ │ │ │ │ │ ├── selectAddons.dtd │ │ │ │ │ │ ├── selectAddons.properties │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── handling/ │ │ │ │ │ │ ├── handling.dtd │ │ │ │ │ │ └── handling.properties │ │ │ │ │ ├── plugins/ │ │ │ │ │ │ ├── plugins.dtd │ │ │ │ │ │ └── plugins.properties │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ ├── changemp.dtd │ │ │ │ │ │ ├── ocsp.dtd │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ └── removemp.dtd │ │ │ │ │ ├── profile/ │ │ │ │ │ │ ├── createProfileWizard.dtd │ │ │ │ │ │ ├── profileSelection.dtd │ │ │ │ │ │ └── profileSelection.properties │ │ │ │ │ ├── update/ │ │ │ │ │ │ ├── history.dtd │ │ │ │ │ │ ├── updates.dtd │ │ │ │ │ │ └── updates.properties │ │ │ │ │ └── xpinstall/ │ │ │ │ │ ├── xpinstallConfirm.dtd │ │ │ │ │ └── xpinstallConfirm.properties │ │ │ │ ├── necko/ │ │ │ │ │ └── necko.properties │ │ │ │ ├── passwordmgr/ │ │ │ │ │ ├── passwordManager.dtd │ │ │ │ │ └── passwordmgr.properties │ │ │ │ ├── pipnss/ │ │ │ │ │ ├── nsserrors.properties │ │ │ │ │ ├── pipnss.properties │ │ │ │ │ └── security.properties │ │ │ │ ├── pippki/ │ │ │ │ │ ├── certManager.dtd │ │ │ │ │ ├── deviceManager.dtd │ │ │ │ │ ├── pippki.dtd │ │ │ │ │ ├── pippki.properties │ │ │ │ │ └── validation.dtd │ │ │ │ ├── places/ │ │ │ │ │ └── places.properties │ │ │ │ ├── pluginproblem/ │ │ │ │ │ └── pluginproblem.dtd │ │ │ │ └── services/ │ │ │ │ ├── errors.properties │ │ │ │ └── sync.properties │ │ │ └── nl.manifest │ │ ├── chrome.manifest │ │ └── install.rdf │ ├── pl/ │ │ ├── bluegriffon/ │ │ │ └── chrome.manifest │ │ ├── browser/ │ │ │ ├── chrome/ │ │ │ │ ├── pl/ │ │ │ │ │ └── locale/ │ │ │ │ │ ├── branding/ │ │ │ │ │ │ ├── brand.dtd │ │ │ │ │ │ ├── brand.properties │ │ │ │ │ │ └── browserconfig.properties │ │ │ │ │ ├── browser/ │ │ │ │ │ │ ├── aboutAccounts.dtd │ │ │ │ │ │ ├── aboutCertError.dtd │ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ │ ├── aboutHealthReport.dtd │ │ │ │ │ │ ├── aboutHome.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.properties │ │ │ │ │ │ ├── aboutRobots.dtd │ │ │ │ │ │ ├── aboutSearchReset.dtd │ │ │ │ │ │ ├── aboutSessionRestore.dtd │ │ │ │ │ │ ├── aboutSyncTabs.dtd │ │ │ │ │ │ ├── aboutTabCrashed.dtd │ │ │ │ │ │ ├── accounts.properties │ │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ │ ├── baseMenuOverlay.dtd │ │ │ │ │ │ ├── bookmarks.html │ │ │ │ │ │ ├── browser.dtd │ │ │ │ │ │ ├── browser.properties │ │ │ │ │ │ ├── customizableui/ │ │ │ │ │ │ │ └── customizableWidgets.properties │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ ├── app-manager.dtd │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ ├── profiler.dtd │ │ │ │ │ │ │ ├── profiler.properties │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ ├── styleinspector.properties │ │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ │ ├── timeline.dtd │ │ │ │ │ │ │ ├── timeline.properties │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ │ └── settingsChange.dtd │ │ │ │ │ │ ├── engineManager.dtd │ │ │ │ │ │ ├── engineManager.properties │ │ │ │ │ │ ├── feeds/ │ │ │ │ │ │ │ ├── subscribe.dtd │ │ │ │ │ │ │ └── subscribe.properties │ │ │ │ │ │ ├── lightweightThemes.properties │ │ │ │ │ │ ├── loop/ │ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ │ ├── migration/ │ │ │ │ │ │ │ ├── migration.dtd │ │ │ │ │ │ │ └── migration.properties │ │ │ │ │ │ ├── netError.dtd │ │ │ │ │ │ ├── newTab.dtd │ │ │ │ │ │ ├── newTab.properties │ │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ │ ├── pageInfo.dtd │ │ │ │ │ │ ├── pageInfo.properties │ │ │ │ │ │ ├── places/ │ │ │ │ │ │ │ ├── bookmarkProperties.properties │ │ │ │ │ │ │ ├── editBookmarkOverlay.dtd │ │ │ │ │ │ │ ├── moveBookmarks.dtd │ │ │ │ │ │ │ ├── places.dtd │ │ │ │ │ │ │ └── places.properties │ │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ │ ├── aboutPermissions.dtd │ │ │ │ │ │ │ ├── aboutPermissions.properties │ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ │ ├── applicationManager.dtd │ │ │ │ │ │ │ ├── applicationManager.properties │ │ │ │ │ │ │ ├── applications.dtd │ │ │ │ │ │ │ ├── blocklists.dtd │ │ │ │ │ │ │ ├── colors.dtd │ │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ │ ├── containers.dtd │ │ │ │ │ │ │ ├── containers.properties │ │ │ │ │ │ │ ├── content.dtd │ │ │ │ │ │ │ ├── cookies.dtd │ │ │ │ │ │ │ ├── donottrack.dtd │ │ │ │ │ │ │ ├── fonts.dtd │ │ │ │ │ │ │ ├── languages.dtd │ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ │ ├── permissions.dtd │ │ │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ │ ├── privacy.dtd │ │ │ │ │ │ │ ├── search.dtd │ │ │ │ │ │ │ ├── security.dtd │ │ │ │ │ │ │ ├── selectBookmark.dtd │ │ │ │ │ │ │ ├── siteDataSettings.dtd │ │ │ │ │ │ │ ├── sync.dtd │ │ │ │ │ │ │ ├── tabs.dtd │ │ │ │ │ │ │ └── translation.dtd │ │ │ │ │ │ ├── quitDialog.properties │ │ │ │ │ │ ├── safeMode.dtd │ │ │ │ │ │ ├── safebrowsing/ │ │ │ │ │ │ │ ├── phishing-afterload-warning-message.dtd │ │ │ │ │ │ │ └── report-phishing.dtd │ │ │ │ │ │ ├── sanitize.dtd │ │ │ │ │ │ ├── search.properties │ │ │ │ │ │ ├── searchbar.dtd │ │ │ │ │ │ ├── searchplugins/ │ │ │ │ │ │ │ ├── allegro-pl.xml │ │ │ │ │ │ │ ├── ddg.xml │ │ │ │ │ │ │ ├── google-nocodes.xml │ │ │ │ │ │ │ ├── google.xml │ │ │ │ │ │ │ ├── list.json │ │ │ │ │ │ │ ├── pwn-pl.xml │ │ │ │ │ │ │ ├── wikipedia-pl.xml │ │ │ │ │ │ │ └── wolnelektury-pl.xml │ │ │ │ │ │ ├── setDesktopBackground.dtd │ │ │ │ │ │ ├── shellservice.properties │ │ │ │ │ │ ├── sitePermissions.properties │ │ │ │ │ │ ├── syncBrand.dtd │ │ │ │ │ │ ├── syncCustomize.dtd │ │ │ │ │ │ ├── syncGenericChange.properties │ │ │ │ │ │ ├── syncKey.dtd │ │ │ │ │ │ ├── syncProgress.dtd │ │ │ │ │ │ ├── syncQuota.dtd │ │ │ │ │ │ ├── syncQuota.properties │ │ │ │ │ │ ├── syncSetup.dtd │ │ │ │ │ │ ├── syncSetup.properties │ │ │ │ │ │ ├── tabbrowser.dtd │ │ │ │ │ │ ├── tabbrowser.properties │ │ │ │ │ │ ├── tabview.properties │ │ │ │ │ │ ├── taskbar.properties │ │ │ │ │ │ ├── translation.dtd │ │ │ │ │ │ ├── translation.properties │ │ │ │ │ │ └── webrtcIndicator.properties │ │ │ │ │ ├── browser-region/ │ │ │ │ │ │ └── region.properties │ │ │ │ │ ├── feedback/ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ └── main.properties │ │ │ │ │ ├── pdfviewer/ │ │ │ │ │ │ ├── chrome.properties │ │ │ │ │ │ └── viewer.properties │ │ │ │ │ └── pl/ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ ├── client/ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ ├── aboutdebugging.dtd │ │ │ │ │ │ │ ├── aboutdebugging.properties │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ ├── boxmodel.properties │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ ├── components.properties │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ ├── dom.properties │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ ├── filterwidget.dtd │ │ │ │ │ │ │ ├── filterwidget.properties │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ ├── font-inspector.properties │ │ │ │ │ │ │ ├── graphs.properties │ │ │ │ │ │ │ ├── har.properties │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ ├── jit-optimizations.properties │ │ │ │ │ │ │ ├── jsonview.properties │ │ │ │ │ │ │ ├── layout.properties │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ ├── markers.properties │ │ │ │ │ │ │ ├── memory.properties │ │ │ │ │ │ │ ├── menus.properties │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ ├── performance.dtd │ │ │ │ │ │ │ ├── performance.properties │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ ├── promisedebugger.dtd │ │ │ │ │ │ │ ├── promisedebugger.properties │ │ │ │ │ │ │ ├── responsive.properties │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ ├── startup.properties │ │ │ │ │ │ │ ├── storage.dtd │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ └── shared/ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ └── formautofill.properties │ │ │ │ └── pl.manifest │ │ │ ├── chrome.manifest │ │ │ ├── crashreporter-override.ini │ │ │ ├── defaults/ │ │ │ │ ├── preferences/ │ │ │ │ │ └── firefox-l10n.js │ │ │ │ └── profile/ │ │ │ │ ├── bookmarks.html │ │ │ │ ├── chrome/ │ │ │ │ │ ├── userChrome-example.css │ │ │ │ │ └── userContent-example.css │ │ │ │ ├── localstore.rdf │ │ │ │ └── mimeTypes.rdf │ │ │ ├── features/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── firefox@getpocket.com/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── pl/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── pl/ │ │ │ │ │ │ └── pocket.properties │ │ │ │ │ └── pl.manifest │ │ │ │ ├── loop@mozilla.org/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── pl/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── pl/ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ └── pl.manifest │ │ │ │ └── presentation@mozilla.org/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── pl/ │ │ │ │ │ └── locale/ │ │ │ │ │ └── pl/ │ │ │ │ │ └── presentation.properties │ │ │ │ └── pl.manifest │ │ │ └── searchplugins/ │ │ │ ├── allegro-pl.xml │ │ │ ├── fbc-pl.xml │ │ │ ├── google.xml │ │ │ ├── merlin-pl.xml │ │ │ ├── pwn-pl.xml │ │ │ ├── wikipedia-pl.xml │ │ │ └── wp-pl.xml │ │ ├── chrome/ │ │ │ ├── pl/ │ │ │ │ └── locale/ │ │ │ │ └── pl/ │ │ │ │ ├── alerts/ │ │ │ │ │ ├── alert.dtd │ │ │ │ │ ├── alert.properties │ │ │ │ │ └── notificationNames.properties │ │ │ │ ├── autoconfig/ │ │ │ │ │ └── autoconfig.properties │ │ │ │ ├── cookie/ │ │ │ │ │ ├── cookieAcceptDialog.dtd │ │ │ │ │ └── cookieAcceptDialog.properties │ │ │ │ ├── formautofill/ │ │ │ │ │ └── requestAutocomplete.dtd │ │ │ │ ├── global/ │ │ │ │ │ ├── AccessFu.properties │ │ │ │ │ ├── about.dtd │ │ │ │ │ ├── aboutAbout.dtd │ │ │ │ │ ├── aboutNetworking.dtd │ │ │ │ │ ├── aboutProfiles.dtd │ │ │ │ │ ├── aboutProfiles.properties │ │ │ │ │ ├── aboutReader.properties │ │ │ │ │ ├── aboutRights.dtd │ │ │ │ │ ├── aboutRights.properties │ │ │ │ │ ├── aboutServiceWorkers.dtd │ │ │ │ │ ├── aboutServiceWorkers.properties │ │ │ │ │ ├── aboutSupport.dtd │ │ │ │ │ ├── aboutSupport.properties │ │ │ │ │ ├── aboutTelemetry.dtd │ │ │ │ │ ├── aboutTelemetry.properties │ │ │ │ │ ├── aboutWebrtc.properties │ │ │ │ │ ├── actions.dtd │ │ │ │ │ ├── appPicker.dtd │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ ├── autocomplete.properties │ │ │ │ │ ├── brand.dtd │ │ │ │ │ ├── browser.properties │ │ │ │ │ ├── charsetMenu.dtd │ │ │ │ │ ├── charsetMenu.properties │ │ │ │ │ ├── charsetOverlay.dtd │ │ │ │ │ ├── charsetTitles.properties │ │ │ │ │ ├── commonDialog.dtd │ │ │ │ │ ├── commonDialogs.properties │ │ │ │ │ ├── config.dtd │ │ │ │ │ ├── config.properties │ │ │ │ │ ├── console.dtd │ │ │ │ │ ├── console.properties │ │ │ │ │ ├── contentAreaCommands.properties │ │ │ │ │ ├── crashes.dtd │ │ │ │ │ ├── crashes.properties │ │ │ │ │ ├── css.properties │ │ │ │ │ ├── customizeCharset.dtd │ │ │ │ │ ├── customizeToolbar.dtd │ │ │ │ │ ├── customizeToolbar.properties │ │ │ │ │ ├── dateFormat.properties │ │ │ │ │ ├── datetimepicker.dtd │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ ├── dialog.properties │ │ │ │ │ ├── dialogOverlay.dtd │ │ │ │ │ ├── dom/ │ │ │ │ │ │ └── dom.properties │ │ │ │ │ ├── downloadProgress.properties │ │ │ │ │ ├── editMenuOverlay.dtd │ │ │ │ │ ├── extensions.properties │ │ │ │ │ ├── fallbackMenubar.properties │ │ │ │ │ ├── filefield.properties │ │ │ │ │ ├── filepicker.dtd │ │ │ │ │ ├── filepicker.properties │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── findbar.properties │ │ │ │ │ ├── finddialog.dtd │ │ │ │ │ ├── finddialog.properties │ │ │ │ │ ├── global-strres.properties │ │ │ │ │ ├── global.dtd │ │ │ │ │ ├── globalKeys.dtd │ │ │ │ │ ├── headsUpDisplay.properties │ │ │ │ │ ├── intl.css │ │ │ │ │ ├── intl.properties │ │ │ │ │ ├── keys.properties │ │ │ │ │ ├── languageNames.properties │ │ │ │ │ ├── layout/ │ │ │ │ │ │ ├── HtmlForm.properties │ │ │ │ │ │ ├── MediaDocument.properties │ │ │ │ │ │ ├── htmlparser.properties │ │ │ │ │ │ └── xmlparser.properties │ │ │ │ │ ├── layout_errors.properties │ │ │ │ │ ├── mathml/ │ │ │ │ │ │ └── mathml.properties │ │ │ │ │ ├── mozilla.dtd │ │ │ │ │ ├── narrate.properties │ │ │ │ │ ├── netError.dtd │ │ │ │ │ ├── netErrorApp.dtd │ │ │ │ │ ├── notification.dtd │ │ │ │ │ ├── nsWebBrowserPersist.properties │ │ │ │ │ ├── plugins.properties │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ ├── printPageSetup.dtd │ │ │ │ │ ├── printPreview.dtd │ │ │ │ │ ├── printPreviewProgress.dtd │ │ │ │ │ ├── printProgress.dtd │ │ │ │ │ ├── printdialog.dtd │ │ │ │ │ ├── printdialog.properties │ │ │ │ │ ├── printing.properties │ │ │ │ │ ├── printjoboptions.dtd │ │ │ │ │ ├── regionNames.properties │ │ │ │ │ ├── resetProfile.dtd │ │ │ │ │ ├── resetProfile.properties │ │ │ │ │ ├── search/ │ │ │ │ │ │ └── search.properties │ │ │ │ │ ├── security/ │ │ │ │ │ │ ├── caps.properties │ │ │ │ │ │ ├── csp.properties │ │ │ │ │ │ └── security.properties │ │ │ │ │ ├── svg/ │ │ │ │ │ │ └── svg.properties │ │ │ │ │ ├── textcontext.dtd │ │ │ │ │ ├── tree.dtd │ │ │ │ │ ├── videocontrols.dtd │ │ │ │ │ ├── viewSource.dtd │ │ │ │ │ ├── viewSource.properties │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ ├── webapps.properties │ │ │ │ │ ├── wizard.dtd │ │ │ │ │ ├── wizard.properties │ │ │ │ │ ├── xbl.properties │ │ │ │ │ ├── xml/ │ │ │ │ │ │ └── prettyprint.dtd │ │ │ │ │ ├── xpinstall/ │ │ │ │ │ │ └── xpinstall.properties │ │ │ │ │ ├── xslt/ │ │ │ │ │ │ └── xslt.properties │ │ │ │ │ └── xul.properties │ │ │ │ ├── global-platform/ │ │ │ │ │ ├── mac/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ ├── unix/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ └── win/ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ ├── intl.properties │ │ │ │ │ └── platformKeys.properties │ │ │ │ ├── global-region/ │ │ │ │ │ └── region.properties │ │ │ │ ├── mozapps/ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ ├── settingsChange.dtd │ │ │ │ │ │ ├── unknownContentType.dtd │ │ │ │ │ │ └── unknownContentType.properties │ │ │ │ │ ├── extensions/ │ │ │ │ │ │ ├── about.dtd │ │ │ │ │ │ ├── blocklist.dtd │ │ │ │ │ │ ├── extensions.dtd │ │ │ │ │ │ ├── extensions.properties │ │ │ │ │ │ ├── newaddon.dtd │ │ │ │ │ │ ├── newaddon.properties │ │ │ │ │ │ ├── selectAddons.dtd │ │ │ │ │ │ ├── selectAddons.properties │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── handling/ │ │ │ │ │ │ ├── handling.dtd │ │ │ │ │ │ └── handling.properties │ │ │ │ │ ├── plugins/ │ │ │ │ │ │ ├── plugins.dtd │ │ │ │ │ │ └── plugins.properties │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ ├── changemp.dtd │ │ │ │ │ │ ├── ocsp.dtd │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ └── removemp.dtd │ │ │ │ │ ├── profile/ │ │ │ │ │ │ ├── createProfileWizard.dtd │ │ │ │ │ │ ├── profileSelection.dtd │ │ │ │ │ │ └── profileSelection.properties │ │ │ │ │ ├── update/ │ │ │ │ │ │ ├── history.dtd │ │ │ │ │ │ ├── updates.dtd │ │ │ │ │ │ └── updates.properties │ │ │ │ │ └── xpinstall/ │ │ │ │ │ ├── xpinstallConfirm.dtd │ │ │ │ │ └── xpinstallConfirm.properties │ │ │ │ ├── necko/ │ │ │ │ │ └── necko.properties │ │ │ │ ├── passwordmgr/ │ │ │ │ │ ├── passwordManager.dtd │ │ │ │ │ └── passwordmgr.properties │ │ │ │ ├── pipnss/ │ │ │ │ │ ├── nsserrors.properties │ │ │ │ │ ├── pipnss.properties │ │ │ │ │ └── security.properties │ │ │ │ ├── pippki/ │ │ │ │ │ ├── certManager.dtd │ │ │ │ │ ├── deviceManager.dtd │ │ │ │ │ ├── pippki.dtd │ │ │ │ │ ├── pippki.properties │ │ │ │ │ └── validation.dtd │ │ │ │ ├── places/ │ │ │ │ │ └── places.properties │ │ │ │ ├── pluginproblem/ │ │ │ │ │ └── pluginproblem.dtd │ │ │ │ └── services/ │ │ │ │ ├── errors.properties │ │ │ │ └── sync.properties │ │ │ └── pl.manifest │ │ ├── chrome.manifest │ │ └── install.rdf │ ├── ru/ │ │ ├── bluegriffon/ │ │ │ └── chrome.manifest │ │ ├── browser/ │ │ │ ├── chrome/ │ │ │ │ ├── .mkdir.done │ │ │ │ ├── ru/ │ │ │ │ │ └── locale/ │ │ │ │ │ ├── branding/ │ │ │ │ │ │ ├── brand.dtd │ │ │ │ │ │ ├── brand.properties │ │ │ │ │ │ └── browserconfig.properties │ │ │ │ │ ├── browser/ │ │ │ │ │ │ ├── aboutAccounts.dtd │ │ │ │ │ │ ├── aboutCertError.dtd │ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ │ ├── aboutHealthReport.dtd │ │ │ │ │ │ ├── aboutHome.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.properties │ │ │ │ │ │ ├── aboutRobots.dtd │ │ │ │ │ │ ├── aboutSearchReset.dtd │ │ │ │ │ │ ├── aboutSessionRestore.dtd │ │ │ │ │ │ ├── aboutSyncTabs.dtd │ │ │ │ │ │ ├── aboutTabCrashed.dtd │ │ │ │ │ │ ├── accounts.properties │ │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ │ ├── baseMenuOverlay.dtd │ │ │ │ │ │ ├── bookmarks.html │ │ │ │ │ │ ├── browser.dtd │ │ │ │ │ │ ├── browser.properties │ │ │ │ │ │ ├── customizableui/ │ │ │ │ │ │ │ └── customizableWidgets.properties │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ ├── app-manager.dtd │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ ├── profiler.dtd │ │ │ │ │ │ │ ├── profiler.properties │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ │ ├── timeline.dtd │ │ │ │ │ │ │ ├── timeline.properties │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ │ └── settingsChange.dtd │ │ │ │ │ │ ├── engineManager.dtd │ │ │ │ │ │ ├── engineManager.properties │ │ │ │ │ │ ├── feeds/ │ │ │ │ │ │ │ ├── subscribe.dtd │ │ │ │ │ │ │ └── subscribe.properties │ │ │ │ │ │ ├── lightweightThemes.properties │ │ │ │ │ │ ├── loop/ │ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ │ ├── migration/ │ │ │ │ │ │ │ ├── migration.dtd │ │ │ │ │ │ │ └── migration.properties │ │ │ │ │ │ ├── netError.dtd │ │ │ │ │ │ ├── newTab.dtd │ │ │ │ │ │ ├── newTab.properties │ │ │ │ │ │ ├── pageInfo.dtd │ │ │ │ │ │ ├── pageInfo.properties │ │ │ │ │ │ ├── places/ │ │ │ │ │ │ │ ├── bookmarkProperties.properties │ │ │ │ │ │ │ ├── editBookmarkOverlay.dtd │ │ │ │ │ │ │ ├── moveBookmarks.dtd │ │ │ │ │ │ │ ├── places.dtd │ │ │ │ │ │ │ └── places.properties │ │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ │ ├── aboutPermissions.dtd │ │ │ │ │ │ │ ├── aboutPermissions.properties │ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ │ ├── applicationManager.dtd │ │ │ │ │ │ │ ├── applicationManager.properties │ │ │ │ │ │ │ ├── applications.dtd │ │ │ │ │ │ │ ├── blocklists.dtd │ │ │ │ │ │ │ ├── colors.dtd │ │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ │ ├── containers.dtd │ │ │ │ │ │ │ ├── containers.properties │ │ │ │ │ │ │ ├── content.dtd │ │ │ │ │ │ │ ├── cookies.dtd │ │ │ │ │ │ │ ├── donottrack.dtd │ │ │ │ │ │ │ ├── fonts.dtd │ │ │ │ │ │ │ ├── languages.dtd │ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ │ ├── permissions.dtd │ │ │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ │ ├── privacy.dtd │ │ │ │ │ │ │ ├── search.dtd │ │ │ │ │ │ │ ├── security.dtd │ │ │ │ │ │ │ ├── selectBookmark.dtd │ │ │ │ │ │ │ ├── siteDataSettings.dtd │ │ │ │ │ │ │ ├── sync.dtd │ │ │ │ │ │ │ ├── tabs.dtd │ │ │ │ │ │ │ └── translation.dtd │ │ │ │ │ │ ├── quitDialog.properties │ │ │ │ │ │ ├── safeMode.dtd │ │ │ │ │ │ ├── safebrowsing/ │ │ │ │ │ │ │ ├── phishing-afterload-warning-message.dtd │ │ │ │ │ │ │ └── report-phishing.dtd │ │ │ │ │ │ ├── sanitize.dtd │ │ │ │ │ │ ├── search.properties │ │ │ │ │ │ ├── searchbar.dtd │ │ │ │ │ │ ├── searchplugins/ │ │ │ │ │ │ │ ├── ddg.xml │ │ │ │ │ │ │ ├── google-nocodes.xml │ │ │ │ │ │ │ ├── google.xml │ │ │ │ │ │ │ ├── list.json │ │ │ │ │ │ │ ├── mailru.xml │ │ │ │ │ │ │ ├── ozonru.xml │ │ │ │ │ │ │ ├── priceru.xml │ │ │ │ │ │ │ ├── wikipedia-ru.xml │ │ │ │ │ │ │ └── yandex-ru.xml │ │ │ │ │ │ ├── setDesktopBackground.dtd │ │ │ │ │ │ ├── shellservice.properties │ │ │ │ │ │ ├── sitePermissions.properties │ │ │ │ │ │ ├── syncBrand.dtd │ │ │ │ │ │ ├── syncCustomize.dtd │ │ │ │ │ │ ├── syncGenericChange.properties │ │ │ │ │ │ ├── syncKey.dtd │ │ │ │ │ │ ├── syncProgress.dtd │ │ │ │ │ │ ├── syncQuota.dtd │ │ │ │ │ │ ├── syncQuota.properties │ │ │ │ │ │ ├── syncSetup.dtd │ │ │ │ │ │ ├── syncSetup.properties │ │ │ │ │ │ ├── tabbrowser.dtd │ │ │ │ │ │ ├── tabbrowser.properties │ │ │ │ │ │ ├── tabview.properties │ │ │ │ │ │ ├── taskbar.properties │ │ │ │ │ │ ├── translation.dtd │ │ │ │ │ │ ├── translation.properties │ │ │ │ │ │ └── webrtcIndicator.properties │ │ │ │ │ ├── browser-region/ │ │ │ │ │ │ └── region.properties │ │ │ │ │ ├── pdfviewer/ │ │ │ │ │ │ ├── chrome.properties │ │ │ │ │ │ └── viewer.properties │ │ │ │ │ └── ru/ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ ├── client/ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ ├── aboutdebugging.dtd │ │ │ │ │ │ │ ├── aboutdebugging.properties │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ ├── boxmodel.properties │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ ├── components.properties │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ ├── dom.properties │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ ├── filterwidget.dtd │ │ │ │ │ │ │ ├── filterwidget.properties │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ ├── font-inspector.properties │ │ │ │ │ │ │ ├── graphs.properties │ │ │ │ │ │ │ ├── har.properties │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ ├── jit-optimizations.properties │ │ │ │ │ │ │ ├── jsonview.properties │ │ │ │ │ │ │ ├── layout.properties │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ ├── markers.properties │ │ │ │ │ │ │ ├── memory.properties │ │ │ │ │ │ │ ├── menus.properties │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ ├── performance.dtd │ │ │ │ │ │ │ ├── performance.properties │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ ├── promisedebugger.dtd │ │ │ │ │ │ │ ├── promisedebugger.properties │ │ │ │ │ │ │ ├── responsive.properties │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ ├── startup.properties │ │ │ │ │ │ │ ├── storage.dtd │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ └── shared/ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ └── formautofill.properties │ │ │ │ └── ru.manifest │ │ │ ├── chrome.manifest │ │ │ ├── crashreporter-override.ini │ │ │ ├── defaults/ │ │ │ │ ├── preferences/ │ │ │ │ │ └── firefox-l10n.js │ │ │ │ └── profile/ │ │ │ │ ├── bookmarks.html │ │ │ │ ├── chrome/ │ │ │ │ │ ├── userChrome-example.css │ │ │ │ │ └── userContent-example.css │ │ │ │ ├── localstore.rdf │ │ │ │ └── mimeTypes.rdf │ │ │ ├── features/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── firefox@getpocket.com/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── ru/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── ru/ │ │ │ │ │ │ └── pocket.properties │ │ │ │ │ └── ru.manifest │ │ │ │ ├── loop@mozilla.org/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── ru/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── ru/ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ └── ru.manifest │ │ │ │ └── presentation@mozilla.org/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── ru/ │ │ │ │ │ └── locale/ │ │ │ │ │ └── ru/ │ │ │ │ │ └── presentation.properties │ │ │ │ └── ru.manifest │ │ │ └── searchplugins/ │ │ │ ├── ddg.xml │ │ │ ├── google.xml │ │ │ ├── mailru.xml │ │ │ ├── ozonru.xml │ │ │ ├── priceru.xml │ │ │ ├── wikipedia-ru.xml │ │ │ ├── yandex-slovari.xml │ │ │ └── yandex.xml │ │ ├── chrome/ │ │ │ ├── .mkdir.done │ │ │ ├── ru/ │ │ │ │ └── locale/ │ │ │ │ └── ru/ │ │ │ │ ├── alerts/ │ │ │ │ │ ├── alert.dtd │ │ │ │ │ ├── alert.properties │ │ │ │ │ └── notificationNames.properties │ │ │ │ ├── autoconfig/ │ │ │ │ │ └── autoconfig.properties │ │ │ │ ├── cookie/ │ │ │ │ │ ├── cookieAcceptDialog.dtd │ │ │ │ │ └── cookieAcceptDialog.properties │ │ │ │ ├── formautofill/ │ │ │ │ │ └── requestAutocomplete.dtd │ │ │ │ ├── global/ │ │ │ │ │ ├── AccessFu.properties │ │ │ │ │ ├── about.dtd │ │ │ │ │ ├── aboutAbout.dtd │ │ │ │ │ ├── aboutNetworking.dtd │ │ │ │ │ ├── aboutProfiles.dtd │ │ │ │ │ ├── aboutProfiles.properties │ │ │ │ │ ├── aboutReader.properties │ │ │ │ │ ├── aboutRights.dtd │ │ │ │ │ ├── aboutServiceWorkers.dtd │ │ │ │ │ ├── aboutServiceWorkers.properties │ │ │ │ │ ├── aboutSupport.dtd │ │ │ │ │ ├── aboutSupport.properties │ │ │ │ │ ├── aboutTelemetry.dtd │ │ │ │ │ ├── aboutTelemetry.properties │ │ │ │ │ ├── aboutWebrtc.properties │ │ │ │ │ ├── appPicker.dtd │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ ├── autocomplete.properties │ │ │ │ │ ├── brand.dtd │ │ │ │ │ ├── browser.properties │ │ │ │ │ ├── charsetMenu.dtd │ │ │ │ │ ├── charsetMenu.properties │ │ │ │ │ ├── commonDialog.dtd │ │ │ │ │ ├── commonDialogs.properties │ │ │ │ │ ├── config.dtd │ │ │ │ │ ├── config.properties │ │ │ │ │ ├── console.dtd │ │ │ │ │ ├── console.properties │ │ │ │ │ ├── contentAreaCommands.properties │ │ │ │ │ ├── crashes.dtd │ │ │ │ │ ├── crashes.properties │ │ │ │ │ ├── css.properties │ │ │ │ │ ├── customizeToolbar.dtd │ │ │ │ │ ├── customizeToolbar.properties │ │ │ │ │ ├── dateFormat.properties │ │ │ │ │ ├── datetimepicker.dtd │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ ├── dialog.properties │ │ │ │ │ ├── dialogOverlay.dtd │ │ │ │ │ ├── dom/ │ │ │ │ │ │ └── dom.properties │ │ │ │ │ ├── editMenuOverlay.dtd │ │ │ │ │ ├── extensions.properties │ │ │ │ │ ├── fallbackMenubar.properties │ │ │ │ │ ├── filefield.properties │ │ │ │ │ ├── filepicker.dtd │ │ │ │ │ ├── filepicker.properties │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── findbar.properties │ │ │ │ │ ├── finddialog.dtd │ │ │ │ │ ├── finddialog.properties │ │ │ │ │ ├── global-strres.properties │ │ │ │ │ ├── global.dtd │ │ │ │ │ ├── globalKeys.dtd │ │ │ │ │ ├── headsUpDisplay.properties │ │ │ │ │ ├── intl.css │ │ │ │ │ ├── intl.properties │ │ │ │ │ ├── keys.properties │ │ │ │ │ ├── languageNames.properties │ │ │ │ │ ├── layout/ │ │ │ │ │ │ ├── HtmlForm.properties │ │ │ │ │ │ ├── MediaDocument.properties │ │ │ │ │ │ ├── htmlparser.properties │ │ │ │ │ │ └── xmlparser.properties │ │ │ │ │ ├── layout_errors.properties │ │ │ │ │ ├── mathml/ │ │ │ │ │ │ └── mathml.properties │ │ │ │ │ ├── mozilla.dtd │ │ │ │ │ ├── narrate.properties │ │ │ │ │ ├── netError.dtd │ │ │ │ │ ├── netErrorApp.dtd │ │ │ │ │ ├── notification.dtd │ │ │ │ │ ├── nsWebBrowserPersist.properties │ │ │ │ │ ├── plugins.properties │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ ├── printPageSetup.dtd │ │ │ │ │ ├── printPreview.dtd │ │ │ │ │ ├── printPreviewProgress.dtd │ │ │ │ │ ├── printProgress.dtd │ │ │ │ │ ├── printdialog.dtd │ │ │ │ │ ├── printdialog.properties │ │ │ │ │ ├── printing.properties │ │ │ │ │ ├── printjoboptions.dtd │ │ │ │ │ ├── regionNames.properties │ │ │ │ │ ├── resetProfile.dtd │ │ │ │ │ ├── resetProfile.properties │ │ │ │ │ ├── search/ │ │ │ │ │ │ └── search.properties │ │ │ │ │ ├── security/ │ │ │ │ │ │ ├── caps.properties │ │ │ │ │ │ ├── csp.properties │ │ │ │ │ │ └── security.properties │ │ │ │ │ ├── svg/ │ │ │ │ │ │ └── svg.properties │ │ │ │ │ ├── textcontext.dtd │ │ │ │ │ ├── tree.dtd │ │ │ │ │ ├── videocontrols.dtd │ │ │ │ │ ├── viewSource.dtd │ │ │ │ │ ├── viewSource.properties │ │ │ │ │ ├── webapps.properties │ │ │ │ │ ├── wizard.dtd │ │ │ │ │ ├── wizard.properties │ │ │ │ │ ├── xbl.properties │ │ │ │ │ ├── xml/ │ │ │ │ │ │ └── prettyprint.dtd │ │ │ │ │ ├── xslt/ │ │ │ │ │ │ └── xslt.properties │ │ │ │ │ └── xul.properties │ │ │ │ ├── global-platform/ │ │ │ │ │ ├── mac/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ ├── unix/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ └── win/ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ ├── intl.properties │ │ │ │ │ └── platformKeys.properties │ │ │ │ ├── global-region/ │ │ │ │ │ └── region.properties │ │ │ │ ├── mozapps/ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ ├── settingsChange.dtd │ │ │ │ │ │ ├── unknownContentType.dtd │ │ │ │ │ │ └── unknownContentType.properties │ │ │ │ │ ├── extensions/ │ │ │ │ │ │ ├── about.dtd │ │ │ │ │ │ ├── blocklist.dtd │ │ │ │ │ │ ├── extensions.dtd │ │ │ │ │ │ ├── extensions.properties │ │ │ │ │ │ ├── newaddon.dtd │ │ │ │ │ │ ├── newaddon.properties │ │ │ │ │ │ ├── selectAddons.dtd │ │ │ │ │ │ ├── selectAddons.properties │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── handling/ │ │ │ │ │ │ ├── handling.dtd │ │ │ │ │ │ └── handling.properties │ │ │ │ │ ├── plugins/ │ │ │ │ │ │ └── plugins.dtd │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ ├── changemp.dtd │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ └── removemp.dtd │ │ │ │ │ ├── profile/ │ │ │ │ │ │ ├── createProfileWizard.dtd │ │ │ │ │ │ ├── profileSelection.dtd │ │ │ │ │ │ └── profileSelection.properties │ │ │ │ │ ├── update/ │ │ │ │ │ │ ├── history.dtd │ │ │ │ │ │ ├── updates.dtd │ │ │ │ │ │ └── updates.properties │ │ │ │ │ └── xpinstall/ │ │ │ │ │ ├── xpinstallConfirm.dtd │ │ │ │ │ └── xpinstallConfirm.properties │ │ │ │ ├── necko/ │ │ │ │ │ └── necko.properties │ │ │ │ ├── passwordmgr/ │ │ │ │ │ ├── passwordManager.dtd │ │ │ │ │ └── passwordmgr.properties │ │ │ │ ├── pipnss/ │ │ │ │ │ ├── nsserrors.properties │ │ │ │ │ └── pipnss.properties │ │ │ │ ├── pippki/ │ │ │ │ │ ├── certManager.dtd │ │ │ │ │ ├── deviceManager.dtd │ │ │ │ │ ├── pippki.dtd │ │ │ │ │ └── pippki.properties │ │ │ │ ├── places/ │ │ │ │ │ └── places.properties │ │ │ │ ├── pluginproblem/ │ │ │ │ │ └── pluginproblem.dtd │ │ │ │ └── services/ │ │ │ │ ├── errors.properties │ │ │ │ └── sync.properties │ │ │ └── ru.manifest │ │ ├── chrome.manifest │ │ └── install.rdf │ ├── sl/ │ │ ├── bluegriffon/ │ │ │ └── chrome.manifest │ │ ├── browser/ │ │ │ ├── chrome/ │ │ │ │ ├── sl/ │ │ │ │ │ └── locale/ │ │ │ │ │ ├── branding/ │ │ │ │ │ │ ├── brand.dtd │ │ │ │ │ │ ├── brand.properties │ │ │ │ │ │ └── browserconfig.properties │ │ │ │ │ ├── browser/ │ │ │ │ │ │ ├── aboutAccounts.dtd │ │ │ │ │ │ ├── aboutCertError.dtd │ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ │ ├── aboutHealthReport.dtd │ │ │ │ │ │ ├── aboutHome.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.properties │ │ │ │ │ │ ├── aboutRobots.dtd │ │ │ │ │ │ ├── aboutSearchReset.dtd │ │ │ │ │ │ ├── aboutSessionRestore.dtd │ │ │ │ │ │ ├── aboutSyncTabs.dtd │ │ │ │ │ │ ├── aboutTabCrashed.dtd │ │ │ │ │ │ ├── accounts.properties │ │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ │ ├── baseMenuOverlay.dtd │ │ │ │ │ │ ├── bookmarks.html │ │ │ │ │ │ ├── browser.dtd │ │ │ │ │ │ ├── browser.properties │ │ │ │ │ │ ├── customizableui/ │ │ │ │ │ │ │ └── customizableWidgets.properties │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ ├── app-manager.dtd │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ ├── profiler.dtd │ │ │ │ │ │ │ ├── profiler.properties │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ ├── styleinspector.properties │ │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ │ ├── timeline.dtd │ │ │ │ │ │ │ ├── timeline.properties │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ │ └── settingsChange.dtd │ │ │ │ │ │ ├── engineManager.dtd │ │ │ │ │ │ ├── engineManager.properties │ │ │ │ │ │ ├── feeds/ │ │ │ │ │ │ │ ├── subscribe.dtd │ │ │ │ │ │ │ └── subscribe.properties │ │ │ │ │ │ ├── lightweightThemes.properties │ │ │ │ │ │ ├── loop/ │ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ │ ├── migration/ │ │ │ │ │ │ │ ├── migration.dtd │ │ │ │ │ │ │ └── migration.properties │ │ │ │ │ │ ├── netError.dtd │ │ │ │ │ │ ├── newTab.dtd │ │ │ │ │ │ ├── newTab.properties │ │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ │ ├── pageInfo.dtd │ │ │ │ │ │ ├── pageInfo.properties │ │ │ │ │ │ ├── places/ │ │ │ │ │ │ │ ├── bookmarkProperties.properties │ │ │ │ │ │ │ ├── editBookmarkOverlay.dtd │ │ │ │ │ │ │ ├── moveBookmarks.dtd │ │ │ │ │ │ │ ├── places.dtd │ │ │ │ │ │ │ └── places.properties │ │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ │ ├── aboutPermissions.dtd │ │ │ │ │ │ │ ├── aboutPermissions.properties │ │ │ │ │ │ │ ├── advanced-scripts.dtd │ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ │ ├── applicationManager.dtd │ │ │ │ │ │ │ ├── applicationManager.properties │ │ │ │ │ │ │ ├── applications.dtd │ │ │ │ │ │ │ ├── blocklists.dtd │ │ │ │ │ │ │ ├── colors.dtd │ │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ │ ├── containers.dtd │ │ │ │ │ │ │ ├── containers.properties │ │ │ │ │ │ │ ├── content.dtd │ │ │ │ │ │ │ ├── cookies.dtd │ │ │ │ │ │ │ ├── donottrack.dtd │ │ │ │ │ │ │ ├── fonts.dtd │ │ │ │ │ │ │ ├── languages.dtd │ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ │ ├── permissions.dtd │ │ │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ │ ├── privacy.dtd │ │ │ │ │ │ │ ├── search.dtd │ │ │ │ │ │ │ ├── security.dtd │ │ │ │ │ │ │ ├── selectBookmark.dtd │ │ │ │ │ │ │ ├── siteDataSettings.dtd │ │ │ │ │ │ │ ├── sync.dtd │ │ │ │ │ │ │ ├── tabs.dtd │ │ │ │ │ │ │ └── translation.dtd │ │ │ │ │ │ ├── quitDialog.properties │ │ │ │ │ │ ├── safeMode.dtd │ │ │ │ │ │ ├── safebrowsing/ │ │ │ │ │ │ │ ├── phishing-afterload-warning-message.dtd │ │ │ │ │ │ │ └── report-phishing.dtd │ │ │ │ │ │ ├── sanitize.dtd │ │ │ │ │ │ ├── search.properties │ │ │ │ │ │ ├── searchbar.dtd │ │ │ │ │ │ ├── searchplugins/ │ │ │ │ │ │ │ ├── ceneji.xml │ │ │ │ │ │ │ ├── ddg.xml │ │ │ │ │ │ │ ├── google-nocodes.xml │ │ │ │ │ │ │ ├── google.xml │ │ │ │ │ │ │ ├── list.json │ │ │ │ │ │ │ ├── najdi-si.xml │ │ │ │ │ │ │ ├── odpiralni.xml │ │ │ │ │ │ │ ├── twitter.xml │ │ │ │ │ │ │ └── wikipedia-sl.xml │ │ │ │ │ │ ├── setDesktopBackground.dtd │ │ │ │ │ │ ├── shellservice.properties │ │ │ │ │ │ ├── sitePermissions.properties │ │ │ │ │ │ ├── syncBrand.dtd │ │ │ │ │ │ ├── syncCustomize.dtd │ │ │ │ │ │ ├── syncGenericChange.properties │ │ │ │ │ │ ├── syncKey.dtd │ │ │ │ │ │ ├── syncProgress.dtd │ │ │ │ │ │ ├── syncQuota.dtd │ │ │ │ │ │ ├── syncQuota.properties │ │ │ │ │ │ ├── syncSetup.dtd │ │ │ │ │ │ ├── syncSetup.properties │ │ │ │ │ │ ├── tabbrowser.dtd │ │ │ │ │ │ ├── tabbrowser.properties │ │ │ │ │ │ ├── tabview.properties │ │ │ │ │ │ ├── taskbar.properties │ │ │ │ │ │ ├── translation.dtd │ │ │ │ │ │ ├── translation.properties │ │ │ │ │ │ └── webrtcIndicator.properties │ │ │ │ │ ├── browser-region/ │ │ │ │ │ │ └── region.properties │ │ │ │ │ ├── feedback/ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ └── main.properties │ │ │ │ │ ├── pdfviewer/ │ │ │ │ │ │ ├── chrome.properties │ │ │ │ │ │ └── viewer.properties │ │ │ │ │ └── sl/ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ ├── client/ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ ├── aboutdebugging.dtd │ │ │ │ │ │ │ ├── aboutdebugging.properties │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ ├── app-manager.dtd │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ ├── boxmodel.properties │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ ├── components.properties │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ ├── dom.properties │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ ├── filterwidget.dtd │ │ │ │ │ │ │ ├── filterwidget.properties │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ ├── font-inspector.properties │ │ │ │ │ │ │ ├── graphs.properties │ │ │ │ │ │ │ ├── har.properties │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ ├── jit-optimizations.properties │ │ │ │ │ │ │ ├── jsonview.properties │ │ │ │ │ │ │ ├── layout.properties │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ ├── markers.properties │ │ │ │ │ │ │ ├── memory.properties │ │ │ │ │ │ │ ├── menus.properties │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ ├── performance.dtd │ │ │ │ │ │ │ ├── performance.properties │ │ │ │ │ │ │ ├── profiler.dtd │ │ │ │ │ │ │ ├── profiler.properties │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ ├── promisedebugger.dtd │ │ │ │ │ │ │ ├── promisedebugger.properties │ │ │ │ │ │ │ ├── responsive.properties │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ ├── startup.properties │ │ │ │ │ │ │ ├── storage.dtd │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ │ ├── timeline.dtd │ │ │ │ │ │ │ ├── timeline.properties │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ └── shared/ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ └── formautofill.properties │ │ │ │ └── sl.manifest │ │ │ ├── chrome.manifest │ │ │ ├── crashreporter-override.ini │ │ │ ├── defaults/ │ │ │ │ ├── preferences/ │ │ │ │ │ └── firefox-l10n.js │ │ │ │ └── profile/ │ │ │ │ ├── bookmarks.html │ │ │ │ ├── chrome/ │ │ │ │ │ ├── userChrome-example.css │ │ │ │ │ └── userContent-example.css │ │ │ │ ├── localstore.rdf │ │ │ │ └── mimeTypes.rdf │ │ │ ├── features/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── firefox@getpocket.com/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── sl/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── sl/ │ │ │ │ │ │ └── pocket.properties │ │ │ │ │ └── sl.manifest │ │ │ │ ├── loop@mozilla.org/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── sl/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── sl/ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ └── sl.manifest │ │ │ │ └── presentation@mozilla.org/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── sl/ │ │ │ │ │ └── locale/ │ │ │ │ │ └── sl/ │ │ │ │ │ └── presentation.properties │ │ │ │ └── sl.manifest │ │ │ └── searchplugins/ │ │ │ ├── ceneji.xml │ │ │ ├── google.xml │ │ │ ├── najdi-si.xml │ │ │ ├── odpiralni.xml │ │ │ ├── twitter.xml │ │ │ └── wikipedia-sl.xml │ │ ├── chrome/ │ │ │ ├── sl/ │ │ │ │ └── locale/ │ │ │ │ └── sl/ │ │ │ │ ├── alerts/ │ │ │ │ │ ├── alert.dtd │ │ │ │ │ ├── alert.properties │ │ │ │ │ └── notificationNames.properties │ │ │ │ ├── autoconfig/ │ │ │ │ │ └── autoconfig.properties │ │ │ │ ├── cookie/ │ │ │ │ │ ├── cookieAcceptDialog.dtd │ │ │ │ │ └── cookieAcceptDialog.properties │ │ │ │ ├── formautofill/ │ │ │ │ │ └── requestAutocomplete.dtd │ │ │ │ ├── global/ │ │ │ │ │ ├── AccessFu.properties │ │ │ │ │ ├── about.dtd │ │ │ │ │ ├── aboutAbout.dtd │ │ │ │ │ ├── aboutNetworking.dtd │ │ │ │ │ ├── aboutProfiles.dtd │ │ │ │ │ ├── aboutProfiles.properties │ │ │ │ │ ├── aboutReader.properties │ │ │ │ │ ├── aboutRights.dtd │ │ │ │ │ ├── aboutRights.properties │ │ │ │ │ ├── aboutServiceWorkers.dtd │ │ │ │ │ ├── aboutServiceWorkers.properties │ │ │ │ │ ├── aboutSupport.dtd │ │ │ │ │ ├── aboutSupport.properties │ │ │ │ │ ├── aboutTelemetry.dtd │ │ │ │ │ ├── aboutTelemetry.properties │ │ │ │ │ ├── aboutWebrtc.properties │ │ │ │ │ ├── actions.dtd │ │ │ │ │ ├── appPicker.dtd │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ ├── autocomplete.properties │ │ │ │ │ ├── brand.dtd │ │ │ │ │ ├── browser.properties │ │ │ │ │ ├── charsetMenu.dtd │ │ │ │ │ ├── charsetMenu.properties │ │ │ │ │ ├── charsetOverlay.dtd │ │ │ │ │ ├── charsetTitles.properties │ │ │ │ │ ├── commonDialog.dtd │ │ │ │ │ ├── commonDialogs.properties │ │ │ │ │ ├── config.dtd │ │ │ │ │ ├── config.properties │ │ │ │ │ ├── console.dtd │ │ │ │ │ ├── console.properties │ │ │ │ │ ├── contentAreaCommands.properties │ │ │ │ │ ├── crashes.dtd │ │ │ │ │ ├── crashes.properties │ │ │ │ │ ├── css.properties │ │ │ │ │ ├── customizeCharset.dtd │ │ │ │ │ ├── customizeToolbar.dtd │ │ │ │ │ ├── customizeToolbar.properties │ │ │ │ │ ├── dateFormat.properties │ │ │ │ │ ├── datetimepicker.dtd │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ ├── dialog.properties │ │ │ │ │ ├── dialogOverlay.dtd │ │ │ │ │ ├── dom/ │ │ │ │ │ │ └── dom.properties │ │ │ │ │ ├── downloadProgress.properties │ │ │ │ │ ├── editMenuOverlay.dtd │ │ │ │ │ ├── extensions.properties │ │ │ │ │ ├── fallbackMenubar.properties │ │ │ │ │ ├── filefield.properties │ │ │ │ │ ├── filepicker.dtd │ │ │ │ │ ├── filepicker.properties │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── findbar.properties │ │ │ │ │ ├── finddialog.dtd │ │ │ │ │ ├── finddialog.properties │ │ │ │ │ ├── global-strres.properties │ │ │ │ │ ├── global.dtd │ │ │ │ │ ├── globalKeys.dtd │ │ │ │ │ ├── headsUpDisplay.properties │ │ │ │ │ ├── intl.css │ │ │ │ │ ├── intl.properties │ │ │ │ │ ├── keys.properties │ │ │ │ │ ├── languageNames.properties │ │ │ │ │ ├── layout/ │ │ │ │ │ │ ├── HtmlForm.properties │ │ │ │ │ │ ├── MediaDocument.properties │ │ │ │ │ │ ├── htmlparser.properties │ │ │ │ │ │ └── xmlparser.properties │ │ │ │ │ ├── layout_errors.properties │ │ │ │ │ ├── mathml/ │ │ │ │ │ │ └── mathml.properties │ │ │ │ │ ├── mozilla.dtd │ │ │ │ │ ├── narrate.properties │ │ │ │ │ ├── netError.dtd │ │ │ │ │ ├── netErrorApp.dtd │ │ │ │ │ ├── notification.dtd │ │ │ │ │ ├── nsWebBrowserPersist.properties │ │ │ │ │ ├── plugins.properties │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ ├── printPageSetup.dtd │ │ │ │ │ ├── printPreview.dtd │ │ │ │ │ ├── printPreviewProgress.dtd │ │ │ │ │ ├── printProgress.dtd │ │ │ │ │ ├── printdialog.dtd │ │ │ │ │ ├── printdialog.properties │ │ │ │ │ ├── printing.properties │ │ │ │ │ ├── printjoboptions.dtd │ │ │ │ │ ├── regionNames.properties │ │ │ │ │ ├── resetProfile.dtd │ │ │ │ │ ├── resetProfile.properties │ │ │ │ │ ├── search/ │ │ │ │ │ │ └── search.properties │ │ │ │ │ ├── security/ │ │ │ │ │ │ ├── caps.properties │ │ │ │ │ │ ├── csp.properties │ │ │ │ │ │ └── security.properties │ │ │ │ │ ├── storage.properties │ │ │ │ │ ├── svg/ │ │ │ │ │ │ └── svg.properties │ │ │ │ │ ├── textcontext.dtd │ │ │ │ │ ├── tree.dtd │ │ │ │ │ ├── videocontrols.dtd │ │ │ │ │ ├── viewSource.dtd │ │ │ │ │ ├── viewSource.properties │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ ├── webapps.properties │ │ │ │ │ ├── wizard.dtd │ │ │ │ │ ├── wizard.properties │ │ │ │ │ ├── xbl.properties │ │ │ │ │ ├── xml/ │ │ │ │ │ │ └── prettyprint.dtd │ │ │ │ │ ├── xpinstall/ │ │ │ │ │ │ └── xpinstall.properties │ │ │ │ │ ├── xslt/ │ │ │ │ │ │ └── xslt.properties │ │ │ │ │ └── xul.properties │ │ │ │ ├── global-platform/ │ │ │ │ │ ├── mac/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ ├── unix/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ └── win/ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ ├── intl.properties │ │ │ │ │ └── platformKeys.properties │ │ │ │ ├── global-region/ │ │ │ │ │ └── region.properties │ │ │ │ ├── mozapps/ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ ├── settingsChange.dtd │ │ │ │ │ │ ├── unknownContentType.dtd │ │ │ │ │ │ └── unknownContentType.properties │ │ │ │ │ ├── extensions/ │ │ │ │ │ │ ├── about.dtd │ │ │ │ │ │ ├── blocklist.dtd │ │ │ │ │ │ ├── extensions.dtd │ │ │ │ │ │ ├── extensions.properties │ │ │ │ │ │ ├── newaddon.dtd │ │ │ │ │ │ ├── newaddon.properties │ │ │ │ │ │ ├── selectAddons.dtd │ │ │ │ │ │ ├── selectAddons.properties │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── handling/ │ │ │ │ │ │ ├── handling.dtd │ │ │ │ │ │ └── handling.properties │ │ │ │ │ ├── plugins/ │ │ │ │ │ │ ├── plugins.dtd │ │ │ │ │ │ └── plugins.properties │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ ├── changemp.dtd │ │ │ │ │ │ ├── ocsp.dtd │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ └── removemp.dtd │ │ │ │ │ ├── profile/ │ │ │ │ │ │ ├── createProfileWizard.dtd │ │ │ │ │ │ ├── profileSelection.dtd │ │ │ │ │ │ └── profileSelection.properties │ │ │ │ │ ├── update/ │ │ │ │ │ │ ├── history.dtd │ │ │ │ │ │ ├── updates.dtd │ │ │ │ │ │ └── updates.properties │ │ │ │ │ └── xpinstall/ │ │ │ │ │ ├── xpinstallConfirm.dtd │ │ │ │ │ └── xpinstallConfirm.properties │ │ │ │ ├── necko/ │ │ │ │ │ └── necko.properties │ │ │ │ ├── passwordmgr/ │ │ │ │ │ ├── passwordManager.dtd │ │ │ │ │ └── passwordmgr.properties │ │ │ │ ├── pipnss/ │ │ │ │ │ ├── nsserrors.properties │ │ │ │ │ ├── pipnss.properties │ │ │ │ │ └── security.properties │ │ │ │ ├── pippki/ │ │ │ │ │ ├── certManager.dtd │ │ │ │ │ ├── deviceManager.dtd │ │ │ │ │ ├── pippki.dtd │ │ │ │ │ ├── pippki.properties │ │ │ │ │ └── validation.dtd │ │ │ │ ├── places/ │ │ │ │ │ └── places.properties │ │ │ │ ├── pluginproblem/ │ │ │ │ │ └── pluginproblem.dtd │ │ │ │ └── services/ │ │ │ │ ├── errors.properties │ │ │ │ └── sync.properties │ │ │ └── sl.manifest │ │ ├── chrome.manifest │ │ └── install.rdf │ ├── sr/ │ │ ├── bluegriffon/ │ │ │ └── chrome.manifest │ │ ├── browser/ │ │ │ ├── chrome/ │ │ │ │ ├── sr/ │ │ │ │ │ └── locale/ │ │ │ │ │ ├── branding/ │ │ │ │ │ │ ├── brand.dtd │ │ │ │ │ │ ├── brand.properties │ │ │ │ │ │ └── browserconfig.properties │ │ │ │ │ ├── browser/ │ │ │ │ │ │ ├── aboutAccounts.dtd │ │ │ │ │ │ ├── aboutCertError.dtd │ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ │ ├── aboutHealthReport.dtd │ │ │ │ │ │ ├── aboutHome.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.properties │ │ │ │ │ │ ├── aboutRobots.dtd │ │ │ │ │ │ ├── aboutSearchReset.dtd │ │ │ │ │ │ ├── aboutSessionRestore.dtd │ │ │ │ │ │ ├── aboutSyncTabs.dtd │ │ │ │ │ │ ├── aboutTabCrashed.dtd │ │ │ │ │ │ ├── accounts.properties │ │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ │ ├── baseMenuOverlay.dtd │ │ │ │ │ │ ├── bookmarks.html │ │ │ │ │ │ ├── browser.dtd │ │ │ │ │ │ ├── browser.properties │ │ │ │ │ │ ├── customizableui/ │ │ │ │ │ │ │ └── customizableWidgets.properties │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ ├── app-manager.dtd │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ ├── profiler.dtd │ │ │ │ │ │ │ ├── profiler.properties │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ ├── styleinspector.properties │ │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ │ ├── timeline.dtd │ │ │ │ │ │ │ ├── timeline.properties │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ │ └── settingsChange.dtd │ │ │ │ │ │ ├── engineManager.dtd │ │ │ │ │ │ ├── engineManager.properties │ │ │ │ │ │ ├── feeds/ │ │ │ │ │ │ │ ├── subscribe.dtd │ │ │ │ │ │ │ └── subscribe.properties │ │ │ │ │ │ ├── lightweightThemes.properties │ │ │ │ │ │ ├── loop/ │ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ │ ├── migration/ │ │ │ │ │ │ │ ├── migration.dtd │ │ │ │ │ │ │ └── migration.properties │ │ │ │ │ │ ├── netError.dtd │ │ │ │ │ │ ├── newTab.dtd │ │ │ │ │ │ ├── newTab.properties │ │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ │ ├── pageInfo.dtd │ │ │ │ │ │ ├── pageInfo.properties │ │ │ │ │ │ ├── places/ │ │ │ │ │ │ │ ├── bookmarkProperties.properties │ │ │ │ │ │ │ ├── editBookmarkOverlay.dtd │ │ │ │ │ │ │ ├── moveBookmarks.dtd │ │ │ │ │ │ │ ├── places.dtd │ │ │ │ │ │ │ └── places.properties │ │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ │ ├── aboutPermissions.dtd │ │ │ │ │ │ │ ├── aboutPermissions.properties │ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ │ ├── applicationManager.dtd │ │ │ │ │ │ │ ├── applicationManager.properties │ │ │ │ │ │ │ ├── applications.dtd │ │ │ │ │ │ │ ├── blocklists.dtd │ │ │ │ │ │ │ ├── colors.dtd │ │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ │ ├── containers.dtd │ │ │ │ │ │ │ ├── containers.properties │ │ │ │ │ │ │ ├── content.dtd │ │ │ │ │ │ │ ├── cookies.dtd │ │ │ │ │ │ │ ├── donottrack.dtd │ │ │ │ │ │ │ ├── fonts.dtd │ │ │ │ │ │ │ ├── languages.dtd │ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ │ ├── permissions.dtd │ │ │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ │ ├── privacy.dtd │ │ │ │ │ │ │ ├── search.dtd │ │ │ │ │ │ │ ├── security.dtd │ │ │ │ │ │ │ ├── selectBookmark.dtd │ │ │ │ │ │ │ ├── siteDataSettings.dtd │ │ │ │ │ │ │ ├── sync.dtd │ │ │ │ │ │ │ ├── tabs.dtd │ │ │ │ │ │ │ └── translation.dtd │ │ │ │ │ │ ├── quitDialog.properties │ │ │ │ │ │ ├── safeMode.dtd │ │ │ │ │ │ ├── safebrowsing/ │ │ │ │ │ │ │ ├── phishing-afterload-warning-message.dtd │ │ │ │ │ │ │ └── report-phishing.dtd │ │ │ │ │ │ ├── sanitize.dtd │ │ │ │ │ │ ├── search.properties │ │ │ │ │ │ ├── searchbar.dtd │ │ │ │ │ │ ├── searchplugins/ │ │ │ │ │ │ │ ├── amazon-en-GB.xml │ │ │ │ │ │ │ ├── bing.xml │ │ │ │ │ │ │ ├── ddg.xml │ │ │ │ │ │ │ ├── google-nocodes.xml │ │ │ │ │ │ │ ├── google.xml │ │ │ │ │ │ │ ├── list.json │ │ │ │ │ │ │ ├── pogodak.xml │ │ │ │ │ │ │ └── wikipedia-sr.xml │ │ │ │ │ │ ├── setDesktopBackground.dtd │ │ │ │ │ │ ├── shellservice.properties │ │ │ │ │ │ ├── sitePermissions.properties │ │ │ │ │ │ ├── syncBrand.dtd │ │ │ │ │ │ ├── syncCustomize.dtd │ │ │ │ │ │ ├── syncGenericChange.properties │ │ │ │ │ │ ├── syncKey.dtd │ │ │ │ │ │ ├── syncProgress.dtd │ │ │ │ │ │ ├── syncQuota.dtd │ │ │ │ │ │ ├── syncQuota.properties │ │ │ │ │ │ ├── syncSetup.dtd │ │ │ │ │ │ ├── syncSetup.properties │ │ │ │ │ │ ├── tabbrowser.dtd │ │ │ │ │ │ ├── tabbrowser.properties │ │ │ │ │ │ ├── tabview.properties │ │ │ │ │ │ ├── taskbar.properties │ │ │ │ │ │ ├── translation.dtd │ │ │ │ │ │ ├── translation.properties │ │ │ │ │ │ └── webrtcIndicator.properties │ │ │ │ │ ├── browser-region/ │ │ │ │ │ │ └── region.properties │ │ │ │ │ ├── feedback/ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ └── main.properties │ │ │ │ │ ├── pdfviewer/ │ │ │ │ │ │ ├── chrome.properties │ │ │ │ │ │ └── viewer.properties │ │ │ │ │ └── sr/ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ ├── client/ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ ├── aboutdebugging.dtd │ │ │ │ │ │ │ ├── aboutdebugging.properties │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ ├── boxmodel.properties │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ ├── components.properties │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ ├── dom.properties │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ ├── filterwidget.dtd │ │ │ │ │ │ │ ├── filterwidget.properties │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ ├── font-inspector.properties │ │ │ │ │ │ │ ├── graphs.properties │ │ │ │ │ │ │ ├── har.properties │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ ├── jit-optimizations.properties │ │ │ │ │ │ │ ├── jsonview.properties │ │ │ │ │ │ │ ├── layout.properties │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ ├── markers.properties │ │ │ │ │ │ │ ├── memory.properties │ │ │ │ │ │ │ ├── menus.properties │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ ├── performance.dtd │ │ │ │ │ │ │ ├── performance.properties │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ ├── promisedebugger.dtd │ │ │ │ │ │ │ ├── promisedebugger.properties │ │ │ │ │ │ │ ├── responsive.properties │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ ├── startup.properties │ │ │ │ │ │ │ ├── storage.dtd │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ └── shared/ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ └── formautofill.properties │ │ │ │ └── sr.manifest │ │ │ ├── chrome.manifest │ │ │ ├── crashreporter-override.ini │ │ │ ├── defaults/ │ │ │ │ ├── preferences/ │ │ │ │ │ └── firefox-l10n.js │ │ │ │ └── profile/ │ │ │ │ ├── bookmarks.html │ │ │ │ ├── chrome/ │ │ │ │ │ ├── userChrome-example.css │ │ │ │ │ └── userContent-example.css │ │ │ │ ├── localstore.rdf │ │ │ │ └── mimeTypes.rdf │ │ │ ├── features/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── firefox@getpocket.com/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── sr/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── sr/ │ │ │ │ │ │ └── pocket.properties │ │ │ │ │ └── sr.manifest │ │ │ │ ├── loop@mozilla.org/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── sr/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── sr/ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ └── sr.manifest │ │ │ │ └── presentation@mozilla.org/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── sr/ │ │ │ │ │ └── locale/ │ │ │ │ │ └── sr/ │ │ │ │ │ └── presentation.properties │ │ │ │ └── sr.manifest │ │ │ └── searchplugins/ │ │ │ ├── amazon-en-GB.xml │ │ │ ├── bing.xml │ │ │ ├── eBay-en-GB.xml │ │ │ ├── google.xml │ │ │ ├── pogodakyu.xml │ │ │ ├── vokabular.xml │ │ │ └── wikipedia-sr.xml │ │ ├── chrome/ │ │ │ ├── sr/ │ │ │ │ └── locale/ │ │ │ │ └── sr/ │ │ │ │ ├── alerts/ │ │ │ │ │ ├── alert.dtd │ │ │ │ │ ├── alert.properties │ │ │ │ │ └── notificationNames.properties │ │ │ │ ├── autoconfig/ │ │ │ │ │ └── autoconfig.properties │ │ │ │ ├── cookie/ │ │ │ │ │ ├── cookieAcceptDialog.dtd │ │ │ │ │ └── cookieAcceptDialog.properties │ │ │ │ ├── formautofill/ │ │ │ │ │ └── requestAutocomplete.dtd │ │ │ │ ├── global/ │ │ │ │ │ ├── AccessFu.properties │ │ │ │ │ ├── about.dtd │ │ │ │ │ ├── aboutAbout.dtd │ │ │ │ │ ├── aboutNetworking.dtd │ │ │ │ │ ├── aboutProfiles.dtd │ │ │ │ │ ├── aboutProfiles.properties │ │ │ │ │ ├── aboutReader.properties │ │ │ │ │ ├── aboutRights.dtd │ │ │ │ │ ├── aboutRights.properties │ │ │ │ │ ├── aboutServiceWorkers.dtd │ │ │ │ │ ├── aboutServiceWorkers.properties │ │ │ │ │ ├── aboutSupport.dtd │ │ │ │ │ ├── aboutSupport.properties │ │ │ │ │ ├── aboutTelemetry.dtd │ │ │ │ │ ├── aboutTelemetry.properties │ │ │ │ │ ├── aboutWebrtc.properties │ │ │ │ │ ├── actions.dtd │ │ │ │ │ ├── appPicker.dtd │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ ├── autocomplete.properties │ │ │ │ │ ├── brand.dtd │ │ │ │ │ ├── browser.properties │ │ │ │ │ ├── charsetMenu.dtd │ │ │ │ │ ├── charsetMenu.properties │ │ │ │ │ ├── charsetOverlay.dtd │ │ │ │ │ ├── charsetTitles.properties │ │ │ │ │ ├── commonDialog.dtd │ │ │ │ │ ├── commonDialogs.properties │ │ │ │ │ ├── config.dtd │ │ │ │ │ ├── config.properties │ │ │ │ │ ├── console.dtd │ │ │ │ │ ├── console.properties │ │ │ │ │ ├── contentAreaCommands.properties │ │ │ │ │ ├── crashes.dtd │ │ │ │ │ ├── crashes.properties │ │ │ │ │ ├── css.properties │ │ │ │ │ ├── customizeCharset.dtd │ │ │ │ │ ├── customizeToolbar.dtd │ │ │ │ │ ├── customizeToolbar.properties │ │ │ │ │ ├── dateFormat.properties │ │ │ │ │ ├── datetimepicker.dtd │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ ├── dialog.properties │ │ │ │ │ ├── dialogOverlay.dtd │ │ │ │ │ ├── dom/ │ │ │ │ │ │ └── dom.properties │ │ │ │ │ ├── downloadProgress.properties │ │ │ │ │ ├── editMenuOverlay.dtd │ │ │ │ │ ├── extensions.properties │ │ │ │ │ ├── fallbackMenubar.properties │ │ │ │ │ ├── filefield.properties │ │ │ │ │ ├── filepicker.dtd │ │ │ │ │ ├── filepicker.properties │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── findbar.properties │ │ │ │ │ ├── finddialog.dtd │ │ │ │ │ ├── finddialog.properties │ │ │ │ │ ├── global-strres.properties │ │ │ │ │ ├── global.dtd │ │ │ │ │ ├── globalKeys.dtd │ │ │ │ │ ├── headsUpDisplay.properties │ │ │ │ │ ├── intl.css │ │ │ │ │ ├── intl.properties │ │ │ │ │ ├── keys.properties │ │ │ │ │ ├── languageNames.properties │ │ │ │ │ ├── layout/ │ │ │ │ │ │ ├── HtmlForm.properties │ │ │ │ │ │ ├── MediaDocument.properties │ │ │ │ │ │ ├── htmlparser.properties │ │ │ │ │ │ └── xmlparser.properties │ │ │ │ │ ├── layout_errors.properties │ │ │ │ │ ├── mathml/ │ │ │ │ │ │ └── mathml.properties │ │ │ │ │ ├── mozilla.dtd │ │ │ │ │ ├── narrate.properties │ │ │ │ │ ├── netError.dtd │ │ │ │ │ ├── netErrorApp.dtd │ │ │ │ │ ├── notification.dtd │ │ │ │ │ ├── nsWebBrowserPersist.properties │ │ │ │ │ ├── plugins.properties │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ ├── printPageSetup.dtd │ │ │ │ │ ├── printPreview.dtd │ │ │ │ │ ├── printPreviewProgress.dtd │ │ │ │ │ ├── printProgress.dtd │ │ │ │ │ ├── printdialog.dtd │ │ │ │ │ ├── printdialog.properties │ │ │ │ │ ├── printing.properties │ │ │ │ │ ├── printjoboptions.dtd │ │ │ │ │ ├── regionNames.properties │ │ │ │ │ ├── resetProfile.dtd │ │ │ │ │ ├── resetProfile.properties │ │ │ │ │ ├── search/ │ │ │ │ │ │ └── search.properties │ │ │ │ │ ├── security/ │ │ │ │ │ │ ├── caps.properties │ │ │ │ │ │ ├── csp.properties │ │ │ │ │ │ └── security.properties │ │ │ │ │ ├── svg/ │ │ │ │ │ │ └── svg.properties │ │ │ │ │ ├── textcontext.dtd │ │ │ │ │ ├── tree.dtd │ │ │ │ │ ├── videocontrols.dtd │ │ │ │ │ ├── viewSource.dtd │ │ │ │ │ ├── viewSource.properties │ │ │ │ │ ├── webapps.properties │ │ │ │ │ ├── wizard.dtd │ │ │ │ │ ├── wizard.properties │ │ │ │ │ ├── xbl.properties │ │ │ │ │ ├── xml/ │ │ │ │ │ │ └── prettyprint.dtd │ │ │ │ │ ├── xpinstall/ │ │ │ │ │ │ └── xpinstall.properties │ │ │ │ │ ├── xslt/ │ │ │ │ │ │ └── xslt.properties │ │ │ │ │ └── xul.properties │ │ │ │ ├── global-platform/ │ │ │ │ │ ├── mac/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ ├── unix/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ └── win/ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ ├── intl.properties │ │ │ │ │ └── platformKeys.properties │ │ │ │ ├── global-region/ │ │ │ │ │ └── region.properties │ │ │ │ ├── mozapps/ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ ├── settingsChange.dtd │ │ │ │ │ │ ├── unknownContentType.dtd │ │ │ │ │ │ └── unknownContentType.properties │ │ │ │ │ ├── extensions/ │ │ │ │ │ │ ├── about.dtd │ │ │ │ │ │ ├── blocklist.dtd │ │ │ │ │ │ ├── extensions.dtd │ │ │ │ │ │ ├── extensions.properties │ │ │ │ │ │ ├── newaddon.dtd │ │ │ │ │ │ ├── newaddon.properties │ │ │ │ │ │ ├── selectAddons.dtd │ │ │ │ │ │ ├── selectAddons.properties │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── handling/ │ │ │ │ │ │ ├── handling.dtd │ │ │ │ │ │ └── handling.properties │ │ │ │ │ ├── plugins/ │ │ │ │ │ │ ├── plugins.dtd │ │ │ │ │ │ └── plugins.properties │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ ├── changemp.dtd │ │ │ │ │ │ ├── ocsp.dtd │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ └── removemp.dtd │ │ │ │ │ ├── profile/ │ │ │ │ │ │ ├── createProfileWizard.dtd │ │ │ │ │ │ ├── profileSelection.dtd │ │ │ │ │ │ └── profileSelection.properties │ │ │ │ │ ├── update/ │ │ │ │ │ │ ├── history.dtd │ │ │ │ │ │ ├── updates.dtd │ │ │ │ │ │ └── updates.properties │ │ │ │ │ └── xpinstall/ │ │ │ │ │ ├── xpinstallConfirm.dtd │ │ │ │ │ └── xpinstallConfirm.properties │ │ │ │ ├── necko/ │ │ │ │ │ └── necko.properties │ │ │ │ ├── passwordmgr/ │ │ │ │ │ ├── passwordManager.dtd │ │ │ │ │ └── passwordmgr.properties │ │ │ │ ├── pipnss/ │ │ │ │ │ ├── nsserrors.properties │ │ │ │ │ ├── pipnss.properties │ │ │ │ │ └── security.properties │ │ │ │ ├── pippki/ │ │ │ │ │ ├── certManager.dtd │ │ │ │ │ ├── deviceManager.dtd │ │ │ │ │ ├── pippki.dtd │ │ │ │ │ ├── pippki.properties │ │ │ │ │ └── validation.dtd │ │ │ │ ├── places/ │ │ │ │ │ └── places.properties │ │ │ │ ├── pluginproblem/ │ │ │ │ │ └── pluginproblem.dtd │ │ │ │ └── services/ │ │ │ │ ├── errors.properties │ │ │ │ └── sync.properties │ │ │ └── sr.manifest │ │ ├── chrome.manifest │ │ └── install.rdf │ ├── sv-SE/ │ │ ├── bluegriffon/ │ │ │ └── chrome.manifest │ │ ├── browser/ │ │ │ ├── chrome/ │ │ │ │ ├── sv-SE/ │ │ │ │ │ └── locale/ │ │ │ │ │ ├── branding/ │ │ │ │ │ │ ├── brand.dtd │ │ │ │ │ │ ├── brand.properties │ │ │ │ │ │ └── browserconfig.properties │ │ │ │ │ ├── browser/ │ │ │ │ │ │ ├── aboutAccounts.dtd │ │ │ │ │ │ ├── aboutCertError.dtd │ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ │ ├── aboutHealthReport.dtd │ │ │ │ │ │ ├── aboutHome.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.properties │ │ │ │ │ │ ├── aboutRobots.dtd │ │ │ │ │ │ ├── aboutSearchReset.dtd │ │ │ │ │ │ ├── aboutSessionRestore.dtd │ │ │ │ │ │ ├── aboutSyncTabs.dtd │ │ │ │ │ │ ├── aboutTabCrashed.dtd │ │ │ │ │ │ ├── accounts.properties │ │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ │ ├── baseMenuOverlay.dtd │ │ │ │ │ │ ├── bookmarks.html │ │ │ │ │ │ ├── browser.dtd │ │ │ │ │ │ ├── browser.properties │ │ │ │ │ │ ├── customizableui/ │ │ │ │ │ │ │ └── customizableWidgets.properties │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ ├── app-manager.dtd │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ ├── profiler.dtd │ │ │ │ │ │ │ ├── profiler.properties │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ ├── styleinspector.properties │ │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ │ ├── timeline.dtd │ │ │ │ │ │ │ ├── timeline.properties │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ │ └── settingsChange.dtd │ │ │ │ │ │ ├── engineManager.dtd │ │ │ │ │ │ ├── engineManager.properties │ │ │ │ │ │ ├── feeds/ │ │ │ │ │ │ │ ├── subscribe.dtd │ │ │ │ │ │ │ └── subscribe.properties │ │ │ │ │ │ ├── lightweightThemes.properties │ │ │ │ │ │ ├── loop/ │ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ │ ├── migration/ │ │ │ │ │ │ │ ├── migration.dtd │ │ │ │ │ │ │ └── migration.properties │ │ │ │ │ │ ├── netError.dtd │ │ │ │ │ │ ├── newTab.dtd │ │ │ │ │ │ ├── newTab.properties │ │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ │ ├── pageInfo.dtd │ │ │ │ │ │ ├── pageInfo.properties │ │ │ │ │ │ ├── places/ │ │ │ │ │ │ │ ├── bookmarkProperties.properties │ │ │ │ │ │ │ ├── editBookmarkOverlay.dtd │ │ │ │ │ │ │ ├── moveBookmarks.dtd │ │ │ │ │ │ │ ├── places.dtd │ │ │ │ │ │ │ └── places.properties │ │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ │ ├── aboutPermissions.dtd │ │ │ │ │ │ │ ├── aboutPermissions.properties │ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ │ ├── applicationManager.dtd │ │ │ │ │ │ │ ├── applicationManager.properties │ │ │ │ │ │ │ ├── applications.dtd │ │ │ │ │ │ │ ├── blocklists.dtd │ │ │ │ │ │ │ ├── colors.dtd │ │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ │ ├── containers.dtd │ │ │ │ │ │ │ ├── containers.properties │ │ │ │ │ │ │ ├── content.dtd │ │ │ │ │ │ │ ├── cookies.dtd │ │ │ │ │ │ │ ├── donottrack.dtd │ │ │ │ │ │ │ ├── fonts.dtd │ │ │ │ │ │ │ ├── languages.dtd │ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ │ ├── permissions.dtd │ │ │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ │ ├── privacy.dtd │ │ │ │ │ │ │ ├── search.dtd │ │ │ │ │ │ │ ├── security.dtd │ │ │ │ │ │ │ ├── selectBookmark.dtd │ │ │ │ │ │ │ ├── siteDataSettings.dtd │ │ │ │ │ │ │ ├── sync.dtd │ │ │ │ │ │ │ ├── tabs.dtd │ │ │ │ │ │ │ └── translation.dtd │ │ │ │ │ │ ├── quitDialog.properties │ │ │ │ │ │ ├── safeMode.dtd │ │ │ │ │ │ ├── safebrowsing/ │ │ │ │ │ │ │ ├── phishing-afterload-warning-message.dtd │ │ │ │ │ │ │ └── report-phishing.dtd │ │ │ │ │ │ ├── sanitize.dtd │ │ │ │ │ │ ├── search.properties │ │ │ │ │ │ ├── searchbar.dtd │ │ │ │ │ │ ├── searchplugins/ │ │ │ │ │ │ │ ├── allaannonser-sv-SE.xml │ │ │ │ │ │ │ ├── bing.xml │ │ │ │ │ │ │ ├── ddg.xml │ │ │ │ │ │ │ ├── google-nocodes.xml │ │ │ │ │ │ │ ├── google.xml │ │ │ │ │ │ │ ├── list.json │ │ │ │ │ │ │ ├── prisjakt-sv-SE.xml │ │ │ │ │ │ │ ├── tyda-sv-SE.xml │ │ │ │ │ │ │ ├── wikipedia-sv-SE.xml │ │ │ │ │ │ │ └── yahoo-sv-SE.xml │ │ │ │ │ │ ├── setDesktopBackground.dtd │ │ │ │ │ │ ├── shellservice.properties │ │ │ │ │ │ ├── sitePermissions.properties │ │ │ │ │ │ ├── syncBrand.dtd │ │ │ │ │ │ ├── syncCustomize.dtd │ │ │ │ │ │ ├── syncGenericChange.properties │ │ │ │ │ │ ├── syncKey.dtd │ │ │ │ │ │ ├── syncProgress.dtd │ │ │ │ │ │ ├── syncQuota.dtd │ │ │ │ │ │ ├── syncQuota.properties │ │ │ │ │ │ ├── syncSetup.dtd │ │ │ │ │ │ ├── syncSetup.properties │ │ │ │ │ │ ├── tabbrowser.dtd │ │ │ │ │ │ ├── tabbrowser.properties │ │ │ │ │ │ ├── tabview.properties │ │ │ │ │ │ ├── taskbar.properties │ │ │ │ │ │ ├── translation.dtd │ │ │ │ │ │ ├── translation.properties │ │ │ │ │ │ └── webrtcIndicator.properties │ │ │ │ │ ├── browser-region/ │ │ │ │ │ │ └── region.properties │ │ │ │ │ ├── feedback/ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ └── main.properties │ │ │ │ │ ├── pdfviewer/ │ │ │ │ │ │ ├── chrome.properties │ │ │ │ │ │ └── viewer.properties │ │ │ │ │ └── sv-SE/ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ ├── client/ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ ├── aboutdebugging.dtd │ │ │ │ │ │ │ ├── aboutdebugging.properties │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ ├── boxmodel.properties │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ ├── components.properties │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ ├── dom.properties │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ ├── filterwidget.dtd │ │ │ │ │ │ │ ├── filterwidget.properties │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ ├── font-inspector.properties │ │ │ │ │ │ │ ├── graphs.properties │ │ │ │ │ │ │ ├── har.properties │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ ├── jit-optimizations.properties │ │ │ │ │ │ │ ├── jsonview.properties │ │ │ │ │ │ │ ├── layout.properties │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ ├── markers.properties │ │ │ │ │ │ │ ├── memory.properties │ │ │ │ │ │ │ ├── menus.properties │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ ├── performance.dtd │ │ │ │ │ │ │ ├── performance.properties │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ ├── promisedebugger.dtd │ │ │ │ │ │ │ ├── promisedebugger.properties │ │ │ │ │ │ │ ├── responsive.properties │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ ├── startup.properties │ │ │ │ │ │ │ ├── storage.dtd │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ └── shared/ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ └── formautofill.properties │ │ │ │ └── sv-SE.manifest │ │ │ ├── chrome.manifest │ │ │ ├── crashreporter-override.ini │ │ │ ├── defaults/ │ │ │ │ ├── preferences/ │ │ │ │ │ └── firefox-l10n.js │ │ │ │ └── profile/ │ │ │ │ ├── bookmarks.html │ │ │ │ ├── chrome/ │ │ │ │ │ ├── userChrome-example.css │ │ │ │ │ └── userContent-example.css │ │ │ │ ├── localstore.rdf │ │ │ │ └── mimeTypes.rdf │ │ │ ├── features/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── firefox@getpocket.com/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── sv-SE/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── sv-SE/ │ │ │ │ │ │ └── pocket.properties │ │ │ │ │ └── sv-SE.manifest │ │ │ │ ├── loop@mozilla.org/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── sv-SE/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── sv-SE/ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ └── sv-SE.manifest │ │ │ │ └── presentation@mozilla.org/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── sv-SE/ │ │ │ │ │ └── locale/ │ │ │ │ │ └── sv-SE/ │ │ │ │ │ └── presentation.properties │ │ │ │ └── sv-SE.manifest │ │ │ └── searchplugins/ │ │ │ ├── allaannonser-sv-SE.xml │ │ │ ├── bing.xml │ │ │ ├── google.xml │ │ │ ├── prisjakt-sv-SE.xml │ │ │ ├── tyda-sv-SE.xml │ │ │ ├── wikipedia-sv-SE.xml │ │ │ └── yahoo-sv-SE.xml │ │ ├── chrome/ │ │ │ ├── sv-SE/ │ │ │ │ └── locale/ │ │ │ │ └── sv-SE/ │ │ │ │ ├── alerts/ │ │ │ │ │ ├── alert.dtd │ │ │ │ │ ├── alert.properties │ │ │ │ │ └── notificationNames.properties │ │ │ │ ├── autoconfig/ │ │ │ │ │ └── autoconfig.properties │ │ │ │ ├── cookie/ │ │ │ │ │ ├── cookieAcceptDialog.dtd │ │ │ │ │ └── cookieAcceptDialog.properties │ │ │ │ ├── formautofill/ │ │ │ │ │ └── requestAutocomplete.dtd │ │ │ │ ├── global/ │ │ │ │ │ ├── AccessFu.properties │ │ │ │ │ ├── about.dtd │ │ │ │ │ ├── aboutAbout.dtd │ │ │ │ │ ├── aboutNetworking.dtd │ │ │ │ │ ├── aboutProfiles.dtd │ │ │ │ │ ├── aboutProfiles.properties │ │ │ │ │ ├── aboutReader.properties │ │ │ │ │ ├── aboutRights.dtd │ │ │ │ │ ├── aboutRights.properties │ │ │ │ │ ├── aboutServiceWorkers.dtd │ │ │ │ │ ├── aboutServiceWorkers.properties │ │ │ │ │ ├── aboutSupport.dtd │ │ │ │ │ ├── aboutSupport.properties │ │ │ │ │ ├── aboutTelemetry.dtd │ │ │ │ │ ├── aboutTelemetry.properties │ │ │ │ │ ├── aboutWebrtc.properties │ │ │ │ │ ├── actions.dtd │ │ │ │ │ ├── appPicker.dtd │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ ├── autocomplete.properties │ │ │ │ │ ├── brand.dtd │ │ │ │ │ ├── browser.properties │ │ │ │ │ ├── charsetMenu.dtd │ │ │ │ │ ├── charsetMenu.properties │ │ │ │ │ ├── charsetOverlay.dtd │ │ │ │ │ ├── charsetTitles.properties │ │ │ │ │ ├── commonDialog.dtd │ │ │ │ │ ├── commonDialogs.properties │ │ │ │ │ ├── config.dtd │ │ │ │ │ ├── config.properties │ │ │ │ │ ├── console.dtd │ │ │ │ │ ├── console.properties │ │ │ │ │ ├── contentAreaCommands.properties │ │ │ │ │ ├── crashes.dtd │ │ │ │ │ ├── crashes.properties │ │ │ │ │ ├── css.properties │ │ │ │ │ ├── customizeCharset.dtd │ │ │ │ │ ├── customizeToolbar.dtd │ │ │ │ │ ├── customizeToolbar.properties │ │ │ │ │ ├── dateFormat.properties │ │ │ │ │ ├── datetimepicker.dtd │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ ├── dialog.properties │ │ │ │ │ ├── dialogOverlay.dtd │ │ │ │ │ ├── dom/ │ │ │ │ │ │ └── dom.properties │ │ │ │ │ ├── downloadProgress.properties │ │ │ │ │ ├── editMenuOverlay.dtd │ │ │ │ │ ├── extensions.properties │ │ │ │ │ ├── fallbackMenubar.properties │ │ │ │ │ ├── filefield.properties │ │ │ │ │ ├── filepicker.dtd │ │ │ │ │ ├── filepicker.properties │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── findbar.properties │ │ │ │ │ ├── finddialog.dtd │ │ │ │ │ ├── finddialog.properties │ │ │ │ │ ├── global-strres.properties │ │ │ │ │ ├── global.dtd │ │ │ │ │ ├── globalKeys.dtd │ │ │ │ │ ├── headsUpDisplay.properties │ │ │ │ │ ├── intl.css │ │ │ │ │ ├── intl.properties │ │ │ │ │ ├── keys.properties │ │ │ │ │ ├── languageNames.properties │ │ │ │ │ ├── layout/ │ │ │ │ │ │ ├── HtmlForm.properties │ │ │ │ │ │ ├── MediaDocument.properties │ │ │ │ │ │ ├── htmlparser.properties │ │ │ │ │ │ └── xmlparser.properties │ │ │ │ │ ├── layout_errors.properties │ │ │ │ │ ├── mathml/ │ │ │ │ │ │ └── mathml.properties │ │ │ │ │ ├── mozilla.dtd │ │ │ │ │ ├── narrate.properties │ │ │ │ │ ├── netError.dtd │ │ │ │ │ ├── netErrorApp.dtd │ │ │ │ │ ├── notification.dtd │ │ │ │ │ ├── nsWebBrowserPersist.properties │ │ │ │ │ ├── plugins.properties │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ ├── printPageSetup.dtd │ │ │ │ │ ├── printPreview.dtd │ │ │ │ │ ├── printPreviewProgress.dtd │ │ │ │ │ ├── printProgress.dtd │ │ │ │ │ ├── printdialog.dtd │ │ │ │ │ ├── printdialog.properties │ │ │ │ │ ├── printing.properties │ │ │ │ │ ├── printjoboptions.dtd │ │ │ │ │ ├── regionNames.properties │ │ │ │ │ ├── resetProfile.dtd │ │ │ │ │ ├── resetProfile.properties │ │ │ │ │ ├── search/ │ │ │ │ │ │ └── search.properties │ │ │ │ │ ├── security/ │ │ │ │ │ │ ├── caps.properties │ │ │ │ │ │ ├── csp.properties │ │ │ │ │ │ └── security.properties │ │ │ │ │ ├── svg/ │ │ │ │ │ │ └── svg.properties │ │ │ │ │ ├── textcontext.dtd │ │ │ │ │ ├── tree.dtd │ │ │ │ │ ├── videocontrols.dtd │ │ │ │ │ ├── viewSource.dtd │ │ │ │ │ ├── viewSource.properties │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ ├── webapps.properties │ │ │ │ │ ├── wizard.dtd │ │ │ │ │ ├── wizard.properties │ │ │ │ │ ├── xbl.properties │ │ │ │ │ ├── xml/ │ │ │ │ │ │ └── prettyprint.dtd │ │ │ │ │ ├── xpinstall/ │ │ │ │ │ │ └── xpinstall.properties │ │ │ │ │ ├── xslt/ │ │ │ │ │ │ └── xslt.properties │ │ │ │ │ └── xul.properties │ │ │ │ ├── global-platform/ │ │ │ │ │ ├── mac/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ ├── unix/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ └── win/ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ ├── intl.properties │ │ │ │ │ └── platformKeys.properties │ │ │ │ ├── global-region/ │ │ │ │ │ └── region.properties │ │ │ │ ├── mozapps/ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ ├── settingsChange.dtd │ │ │ │ │ │ ├── unknownContentType.dtd │ │ │ │ │ │ └── unknownContentType.properties │ │ │ │ │ ├── extensions/ │ │ │ │ │ │ ├── about.dtd │ │ │ │ │ │ ├── blocklist.dtd │ │ │ │ │ │ ├── extensions.dtd │ │ │ │ │ │ ├── extensions.properties │ │ │ │ │ │ ├── newaddon.dtd │ │ │ │ │ │ ├── newaddon.properties │ │ │ │ │ │ ├── selectAddons.dtd │ │ │ │ │ │ ├── selectAddons.properties │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── handling/ │ │ │ │ │ │ ├── handling.dtd │ │ │ │ │ │ └── handling.properties │ │ │ │ │ ├── plugins/ │ │ │ │ │ │ ├── plugins.dtd │ │ │ │ │ │ └── plugins.properties │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ ├── changemp.dtd │ │ │ │ │ │ ├── ocsp.dtd │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ └── removemp.dtd │ │ │ │ │ ├── profile/ │ │ │ │ │ │ ├── createProfileWizard.dtd │ │ │ │ │ │ ├── profileSelection.dtd │ │ │ │ │ │ └── profileSelection.properties │ │ │ │ │ ├── update/ │ │ │ │ │ │ ├── history.dtd │ │ │ │ │ │ ├── updates.dtd │ │ │ │ │ │ └── updates.properties │ │ │ │ │ └── xpinstall/ │ │ │ │ │ ├── xpinstallConfirm.dtd │ │ │ │ │ └── xpinstallConfirm.properties │ │ │ │ ├── necko/ │ │ │ │ │ └── necko.properties │ │ │ │ ├── passwordmgr/ │ │ │ │ │ ├── passwordManager.dtd │ │ │ │ │ └── passwordmgr.properties │ │ │ │ ├── pipnss/ │ │ │ │ │ ├── nsserrors.properties │ │ │ │ │ ├── pipnss.properties │ │ │ │ │ └── security.properties │ │ │ │ ├── pippki/ │ │ │ │ │ ├── certManager.dtd │ │ │ │ │ ├── deviceManager.dtd │ │ │ │ │ ├── pippki.dtd │ │ │ │ │ ├── pippki.properties │ │ │ │ │ └── validation.dtd │ │ │ │ ├── places/ │ │ │ │ │ └── places.properties │ │ │ │ ├── pluginproblem/ │ │ │ │ │ └── pluginproblem.dtd │ │ │ │ └── services/ │ │ │ │ ├── errors.properties │ │ │ │ └── sync.properties │ │ │ └── sv-SE.manifest │ │ ├── chrome.manifest │ │ └── install.rdf │ ├── zh-CN/ │ │ ├── bluegriffon/ │ │ │ └── chrome.manifest │ │ ├── browser/ │ │ │ ├── chrome/ │ │ │ │ ├── zh-CN/ │ │ │ │ │ └── locale/ │ │ │ │ │ ├── branding/ │ │ │ │ │ │ ├── brand.dtd │ │ │ │ │ │ ├── brand.properties │ │ │ │ │ │ └── browserconfig.properties │ │ │ │ │ ├── browser/ │ │ │ │ │ │ ├── aboutAccounts.dtd │ │ │ │ │ │ ├── aboutCertError.dtd │ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ │ ├── aboutHealthReport.dtd │ │ │ │ │ │ ├── aboutHome.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.dtd │ │ │ │ │ │ ├── aboutPrivateBrowsing.properties │ │ │ │ │ │ ├── aboutRobots.dtd │ │ │ │ │ │ ├── aboutSearchReset.dtd │ │ │ │ │ │ ├── aboutSessionRestore.dtd │ │ │ │ │ │ ├── aboutSyncTabs.dtd │ │ │ │ │ │ ├── aboutTabCrashed.dtd │ │ │ │ │ │ ├── accounts.properties │ │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ │ ├── baseMenuOverlay.dtd │ │ │ │ │ │ ├── bookmarks.html │ │ │ │ │ │ ├── browser.dtd │ │ │ │ │ │ ├── browser.properties │ │ │ │ │ │ ├── customizableui/ │ │ │ │ │ │ │ └── customizableWidgets.properties │ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ ├── app-manager.dtd │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ ├── profiler.dtd │ │ │ │ │ │ │ ├── profiler.properties │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ ├── styleinspector.properties │ │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ │ ├── timeline.dtd │ │ │ │ │ │ │ ├── timeline.properties │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ │ └── settingsChange.dtd │ │ │ │ │ │ ├── engineManager.dtd │ │ │ │ │ │ ├── engineManager.properties │ │ │ │ │ │ ├── feeds/ │ │ │ │ │ │ │ ├── subscribe.dtd │ │ │ │ │ │ │ └── subscribe.properties │ │ │ │ │ │ ├── lightweightThemes.properties │ │ │ │ │ │ ├── loop/ │ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ │ ├── migration/ │ │ │ │ │ │ │ ├── migration.dtd │ │ │ │ │ │ │ └── migration.properties │ │ │ │ │ │ ├── netError.dtd │ │ │ │ │ │ ├── newTab.dtd │ │ │ │ │ │ ├── newTab.properties │ │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ │ ├── pageInfo.dtd │ │ │ │ │ │ ├── pageInfo.properties │ │ │ │ │ │ ├── places/ │ │ │ │ │ │ │ ├── bookmarkProperties.properties │ │ │ │ │ │ │ ├── editBookmarkOverlay.dtd │ │ │ │ │ │ │ ├── moveBookmarks.dtd │ │ │ │ │ │ │ ├── places.dtd │ │ │ │ │ │ │ └── places.properties │ │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ │ ├── aboutPermissions.dtd │ │ │ │ │ │ │ ├── aboutPermissions.properties │ │ │ │ │ │ │ ├── advanced-scripts.dtd │ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ │ ├── applicationManager.dtd │ │ │ │ │ │ │ ├── applicationManager.properties │ │ │ │ │ │ │ ├── applications.dtd │ │ │ │ │ │ │ ├── blocklists.dtd │ │ │ │ │ │ │ ├── colors.dtd │ │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ │ ├── containers.dtd │ │ │ │ │ │ │ ├── containers.properties │ │ │ │ │ │ │ ├── content.dtd │ │ │ │ │ │ │ ├── cookies.dtd │ │ │ │ │ │ │ ├── donottrack.dtd │ │ │ │ │ │ │ ├── fonts.dtd │ │ │ │ │ │ │ ├── languages.dtd │ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ │ ├── permissions.dtd │ │ │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ │ ├── privacy.dtd │ │ │ │ │ │ │ ├── search.dtd │ │ │ │ │ │ │ ├── security.dtd │ │ │ │ │ │ │ ├── selectBookmark.dtd │ │ │ │ │ │ │ ├── siteDataSettings.dtd │ │ │ │ │ │ │ ├── sync.dtd │ │ │ │ │ │ │ ├── tabs.dtd │ │ │ │ │ │ │ └── translation.dtd │ │ │ │ │ │ ├── quitDialog.properties │ │ │ │ │ │ ├── safeMode.dtd │ │ │ │ │ │ ├── safebrowsing/ │ │ │ │ │ │ │ ├── phishing-afterload-warning-message.dtd │ │ │ │ │ │ │ └── report-phishing.dtd │ │ │ │ │ │ ├── sanitize.dtd │ │ │ │ │ │ ├── search.properties │ │ │ │ │ │ ├── searchbar.dtd │ │ │ │ │ │ ├── searchplugins/ │ │ │ │ │ │ │ ├── amazondotcn.xml │ │ │ │ │ │ │ ├── baidu.xml │ │ │ │ │ │ │ ├── bing.xml │ │ │ │ │ │ │ ├── ddg.xml │ │ │ │ │ │ │ ├── google-nocodes.xml │ │ │ │ │ │ │ ├── google.xml │ │ │ │ │ │ │ ├── list.json │ │ │ │ │ │ │ └── wikipedia-zh-CN.xml │ │ │ │ │ │ ├── setDesktopBackground.dtd │ │ │ │ │ │ ├── shellservice.properties │ │ │ │ │ │ ├── sitePermissions.properties │ │ │ │ │ │ ├── syncBrand.dtd │ │ │ │ │ │ ├── syncCustomize.dtd │ │ │ │ │ │ ├── syncGenericChange.properties │ │ │ │ │ │ ├── syncKey.dtd │ │ │ │ │ │ ├── syncProgress.dtd │ │ │ │ │ │ ├── syncQuota.dtd │ │ │ │ │ │ ├── syncQuota.properties │ │ │ │ │ │ ├── syncSetup.dtd │ │ │ │ │ │ ├── syncSetup.properties │ │ │ │ │ │ ├── tabbrowser.dtd │ │ │ │ │ │ ├── tabbrowser.properties │ │ │ │ │ │ ├── tabview.properties │ │ │ │ │ │ ├── taskbar.properties │ │ │ │ │ │ ├── translation.dtd │ │ │ │ │ │ ├── translation.properties │ │ │ │ │ │ └── webrtcIndicator.properties │ │ │ │ │ ├── browser-region/ │ │ │ │ │ │ └── region.properties │ │ │ │ │ ├── feedback/ │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ └── main.properties │ │ │ │ │ ├── pdfviewer/ │ │ │ │ │ │ ├── chrome.properties │ │ │ │ │ │ └── viewer.properties │ │ │ │ │ └── zh-CN/ │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ ├── client/ │ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ │ ├── aboutdebugging.dtd │ │ │ │ │ │ │ ├── aboutdebugging.properties │ │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ │ ├── boxmodel.properties │ │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ │ ├── components.properties │ │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ │ ├── dom.properties │ │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ │ ├── filterwidget.dtd │ │ │ │ │ │ │ ├── filterwidget.properties │ │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ │ ├── font-inspector.properties │ │ │ │ │ │ │ ├── graphs.properties │ │ │ │ │ │ │ ├── har.properties │ │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ │ ├── jit-optimizations.properties │ │ │ │ │ │ │ ├── jsonview.properties │ │ │ │ │ │ │ ├── layout.properties │ │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ │ ├── markers.properties │ │ │ │ │ │ │ ├── memory.properties │ │ │ │ │ │ │ ├── menus.properties │ │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ │ ├── performance.dtd │ │ │ │ │ │ │ ├── performance.properties │ │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ │ ├── promisedebugger.dtd │ │ │ │ │ │ │ ├── promisedebugger.properties │ │ │ │ │ │ │ ├── responsive.properties │ │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ │ ├── startup.properties │ │ │ │ │ │ │ ├── storage.dtd │ │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ │ └── webide.properties │ │ │ │ │ │ └── shared/ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ └── formautofill.properties │ │ │ │ └── zh-CN.manifest │ │ │ ├── chrome.manifest │ │ │ ├── crashreporter-override.ini │ │ │ ├── defaults/ │ │ │ │ ├── preferences/ │ │ │ │ │ └── firefox-l10n.js │ │ │ │ └── profile/ │ │ │ │ ├── bookmarks.html │ │ │ │ ├── chrome/ │ │ │ │ │ ├── userChrome-example.css │ │ │ │ │ └── userContent-example.css │ │ │ │ ├── localstore.rdf │ │ │ │ └── mimeTypes.rdf │ │ │ ├── features/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── firefox@getpocket.com/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── zh-CN/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── zh-CN/ │ │ │ │ │ │ └── pocket.properties │ │ │ │ │ └── zh-CN.manifest │ │ │ │ ├── loop@mozilla.org/ │ │ │ │ │ ├── chrome.manifest │ │ │ │ │ ├── zh-CN/ │ │ │ │ │ │ └── locale/ │ │ │ │ │ │ └── zh-CN/ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ └── zh-CN.manifest │ │ │ │ └── presentation@mozilla.org/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── zh-CN/ │ │ │ │ │ └── locale/ │ │ │ │ │ └── zh-CN/ │ │ │ │ │ └── presentation.properties │ │ │ │ └── zh-CN.manifest │ │ │ └── searchplugins/ │ │ │ ├── amazondotcn.xml │ │ │ ├── baidu.xml │ │ │ ├── baiduzhidao.xml │ │ │ ├── bing.xml │ │ │ ├── creativecommons.xml │ │ │ ├── eachnet.xml │ │ │ ├── google.xml │ │ │ ├── paipai.xml │ │ │ └── wikipedia-zh-CN.xml │ │ ├── chrome/ │ │ │ ├── zh-CN/ │ │ │ │ └── locale/ │ │ │ │ └── zh-CN/ │ │ │ │ ├── alerts/ │ │ │ │ │ ├── alert.dtd │ │ │ │ │ ├── alert.properties │ │ │ │ │ └── notificationNames.properties │ │ │ │ ├── autoconfig/ │ │ │ │ │ └── autoconfig.properties │ │ │ │ ├── cookie/ │ │ │ │ │ ├── cookieAcceptDialog.dtd │ │ │ │ │ └── cookieAcceptDialog.properties │ │ │ │ ├── formautofill/ │ │ │ │ │ └── requestAutocomplete.dtd │ │ │ │ ├── global/ │ │ │ │ │ ├── AccessFu.properties │ │ │ │ │ ├── about.dtd │ │ │ │ │ ├── aboutAbout.dtd │ │ │ │ │ ├── aboutNetworking.dtd │ │ │ │ │ ├── aboutProfiles.dtd │ │ │ │ │ ├── aboutProfiles.properties │ │ │ │ │ ├── aboutReader.properties │ │ │ │ │ ├── aboutRights.dtd │ │ │ │ │ ├── aboutRights.properties │ │ │ │ │ ├── aboutServiceWorkers.dtd │ │ │ │ │ ├── aboutServiceWorkers.properties │ │ │ │ │ ├── aboutSupport.dtd │ │ │ │ │ ├── aboutSupport.properties │ │ │ │ │ ├── aboutTelemetry.dtd │ │ │ │ │ ├── aboutTelemetry.properties │ │ │ │ │ ├── aboutWebrtc.properties │ │ │ │ │ ├── actions.dtd │ │ │ │ │ ├── appPicker.dtd │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ ├── autocomplete.properties │ │ │ │ │ ├── brand.dtd │ │ │ │ │ ├── browser.properties │ │ │ │ │ ├── charsetMenu.dtd │ │ │ │ │ ├── charsetMenu.properties │ │ │ │ │ ├── charsetOverlay.dtd │ │ │ │ │ ├── charsetTitles.properties │ │ │ │ │ ├── commonDialog.dtd │ │ │ │ │ ├── commonDialogs.properties │ │ │ │ │ ├── config.dtd │ │ │ │ │ ├── config.properties │ │ │ │ │ ├── console.dtd │ │ │ │ │ ├── console.properties │ │ │ │ │ ├── contentAreaCommands.properties │ │ │ │ │ ├── crashes.dtd │ │ │ │ │ ├── crashes.properties │ │ │ │ │ ├── css.properties │ │ │ │ │ ├── customizeCharset.dtd │ │ │ │ │ ├── customizeToolbar.dtd │ │ │ │ │ ├── customizeToolbar.properties │ │ │ │ │ ├── dateFormat.properties │ │ │ │ │ ├── datetimepicker.dtd │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ └── styleinspector.properties │ │ │ │ │ ├── dialog.properties │ │ │ │ │ ├── dialogOverlay.dtd │ │ │ │ │ ├── dom/ │ │ │ │ │ │ └── dom.properties │ │ │ │ │ ├── downloadProgress.properties │ │ │ │ │ ├── editMenuOverlay.dtd │ │ │ │ │ ├── extensions.properties │ │ │ │ │ ├── fallbackMenubar.properties │ │ │ │ │ ├── filefield.properties │ │ │ │ │ ├── filepicker.dtd │ │ │ │ │ ├── filepicker.properties │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── findbar.properties │ │ │ │ │ ├── finddialog.dtd │ │ │ │ │ ├── finddialog.properties │ │ │ │ │ ├── global-strres.properties │ │ │ │ │ ├── global.dtd │ │ │ │ │ ├── globalKeys.dtd │ │ │ │ │ ├── headsUpDisplay.properties │ │ │ │ │ ├── intl.css │ │ │ │ │ ├── intl.properties │ │ │ │ │ ├── keys.properties │ │ │ │ │ ├── languageNames.properties │ │ │ │ │ ├── layout/ │ │ │ │ │ │ ├── HtmlForm.properties │ │ │ │ │ │ ├── MediaDocument.properties │ │ │ │ │ │ ├── htmlparser.properties │ │ │ │ │ │ └── xmlparser.properties │ │ │ │ │ ├── layout_errors.properties │ │ │ │ │ ├── mathml/ │ │ │ │ │ │ └── mathml.properties │ │ │ │ │ ├── mozilla.dtd │ │ │ │ │ ├── narrate.properties │ │ │ │ │ ├── netError.dtd │ │ │ │ │ ├── netErrorApp.dtd │ │ │ │ │ ├── notification.dtd │ │ │ │ │ ├── nsWebBrowserPersist.properties │ │ │ │ │ ├── plugins.properties │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ ├── printPageSetup.dtd │ │ │ │ │ ├── printPreview.dtd │ │ │ │ │ ├── printPreviewProgress.dtd │ │ │ │ │ ├── printProgress.dtd │ │ │ │ │ ├── printdialog.dtd │ │ │ │ │ ├── printdialog.properties │ │ │ │ │ ├── printing.properties │ │ │ │ │ ├── printjoboptions.dtd │ │ │ │ │ ├── regionNames.properties │ │ │ │ │ ├── resetProfile.dtd │ │ │ │ │ ├── resetProfile.properties │ │ │ │ │ ├── search/ │ │ │ │ │ │ └── search.properties │ │ │ │ │ ├── security/ │ │ │ │ │ │ ├── caps.properties │ │ │ │ │ │ ├── csp.properties │ │ │ │ │ │ └── security.properties │ │ │ │ │ ├── storage.properties │ │ │ │ │ ├── svg/ │ │ │ │ │ │ └── svg.properties │ │ │ │ │ ├── textcontext.dtd │ │ │ │ │ ├── tree.dtd │ │ │ │ │ ├── videocontrols.dtd │ │ │ │ │ ├── viewSource.dtd │ │ │ │ │ ├── viewSource.properties │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ ├── webapps.properties │ │ │ │ │ ├── wizard.dtd │ │ │ │ │ ├── wizard.properties │ │ │ │ │ ├── xbl.properties │ │ │ │ │ ├── xml/ │ │ │ │ │ │ └── prettyprint.dtd │ │ │ │ │ ├── xpinstall/ │ │ │ │ │ │ └── xpinstall.properties │ │ │ │ │ ├── xslt/ │ │ │ │ │ │ └── xslt.properties │ │ │ │ │ └── xul.properties │ │ │ │ ├── global-platform/ │ │ │ │ │ ├── mac/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ ├── unix/ │ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ │ ├── intl.properties │ │ │ │ │ │ └── platformKeys.properties │ │ │ │ │ └── win/ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ ├── intl.properties │ │ │ │ │ └── platformKeys.properties │ │ │ │ ├── global-region/ │ │ │ │ │ └── region.properties │ │ │ │ ├── mozapps/ │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ ├── settingsChange.dtd │ │ │ │ │ │ ├── unknownContentType.dtd │ │ │ │ │ │ └── unknownContentType.properties │ │ │ │ │ ├── extensions/ │ │ │ │ │ │ ├── about.dtd │ │ │ │ │ │ ├── blocklist.dtd │ │ │ │ │ │ ├── extensions.dtd │ │ │ │ │ │ ├── extensions.properties │ │ │ │ │ │ ├── newaddon.dtd │ │ │ │ │ │ ├── newaddon.properties │ │ │ │ │ │ ├── selectAddons.dtd │ │ │ │ │ │ ├── selectAddons.properties │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── handling/ │ │ │ │ │ │ ├── handling.dtd │ │ │ │ │ │ └── handling.properties │ │ │ │ │ ├── plugins/ │ │ │ │ │ │ ├── plugins.dtd │ │ │ │ │ │ └── plugins.properties │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ ├── changemp.dtd │ │ │ │ │ │ ├── ocsp.dtd │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ └── removemp.dtd │ │ │ │ │ ├── profile/ │ │ │ │ │ │ ├── createProfileWizard.dtd │ │ │ │ │ │ ├── profileSelection.dtd │ │ │ │ │ │ └── profileSelection.properties │ │ │ │ │ ├── update/ │ │ │ │ │ │ ├── history.dtd │ │ │ │ │ │ ├── updates.dtd │ │ │ │ │ │ └── updates.properties │ │ │ │ │ └── xpinstall/ │ │ │ │ │ ├── xpinstallConfirm.dtd │ │ │ │ │ └── xpinstallConfirm.properties │ │ │ │ ├── necko/ │ │ │ │ │ └── necko.properties │ │ │ │ ├── passwordmgr/ │ │ │ │ │ ├── passwordManager.dtd │ │ │ │ │ └── passwordmgr.properties │ │ │ │ ├── pipnss/ │ │ │ │ │ ├── nsserrors.properties │ │ │ │ │ ├── pipnss.properties │ │ │ │ │ └── security.properties │ │ │ │ ├── pippki/ │ │ │ │ │ ├── certManager.dtd │ │ │ │ │ ├── deviceManager.dtd │ │ │ │ │ ├── pippki.dtd │ │ │ │ │ ├── pippki.properties │ │ │ │ │ └── validation.dtd │ │ │ │ ├── places/ │ │ │ │ │ └── places.properties │ │ │ │ ├── pluginproblem/ │ │ │ │ │ └── pluginproblem.dtd │ │ │ │ └── services/ │ │ │ │ ├── errors.properties │ │ │ │ └── sync.properties │ │ │ └── zh-CN.manifest │ │ ├── chrome.manifest │ │ └── install.rdf │ └── zh-TW/ │ ├── bluegriffon/ │ │ └── chrome.manifest │ ├── browser/ │ │ ├── chrome/ │ │ │ ├── zh-TW/ │ │ │ │ └── locale/ │ │ │ │ ├── branding/ │ │ │ │ │ ├── brand.dtd │ │ │ │ │ ├── brand.properties │ │ │ │ │ └── browserconfig.properties │ │ │ │ ├── browser/ │ │ │ │ │ ├── aboutAccounts.dtd │ │ │ │ │ ├── aboutCertError.dtd │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ ├── aboutHealthReport.dtd │ │ │ │ │ ├── aboutHome.dtd │ │ │ │ │ ├── aboutPrivateBrowsing.dtd │ │ │ │ │ ├── aboutPrivateBrowsing.properties │ │ │ │ │ ├── aboutRobots.dtd │ │ │ │ │ ├── aboutSearchReset.dtd │ │ │ │ │ ├── aboutSessionRestore.dtd │ │ │ │ │ ├── aboutSyncTabs.dtd │ │ │ │ │ ├── aboutTabCrashed.dtd │ │ │ │ │ ├── accounts.properties │ │ │ │ │ ├── appstrings.properties │ │ │ │ │ ├── baseMenuOverlay.dtd │ │ │ │ │ ├── bookmarks.html │ │ │ │ │ ├── browser.dtd │ │ │ │ │ ├── browser.properties │ │ │ │ │ ├── customizableui/ │ │ │ │ │ │ └── customizableWidgets.properties │ │ │ │ │ ├── devtools/ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ ├── app-manager.dtd │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ ├── gcli.properties │ │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ ├── profiler.dtd │ │ │ │ │ │ ├── profiler.properties │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ ├── styleinspector.properties │ │ │ │ │ │ ├── tilt.properties │ │ │ │ │ │ ├── timeline.dtd │ │ │ │ │ │ ├── timeline.properties │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ └── webide.properties │ │ │ │ │ ├── downloads/ │ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ │ ├── downloads.properties │ │ │ │ │ │ └── settingsChange.dtd │ │ │ │ │ ├── engineManager.dtd │ │ │ │ │ ├── engineManager.properties │ │ │ │ │ ├── feeds/ │ │ │ │ │ │ ├── subscribe.dtd │ │ │ │ │ │ └── subscribe.properties │ │ │ │ │ ├── lightweightThemes.properties │ │ │ │ │ ├── loop/ │ │ │ │ │ │ └── loop.properties │ │ │ │ │ ├── migration/ │ │ │ │ │ │ ├── migration.dtd │ │ │ │ │ │ └── migration.properties │ │ │ │ │ ├── netError.dtd │ │ │ │ │ ├── newTab.dtd │ │ │ │ │ ├── newTab.properties │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ ├── pageInfo.dtd │ │ │ │ │ ├── pageInfo.properties │ │ │ │ │ ├── places/ │ │ │ │ │ │ ├── bookmarkProperties.properties │ │ │ │ │ │ ├── editBookmarkOverlay.dtd │ │ │ │ │ │ ├── moveBookmarks.dtd │ │ │ │ │ │ ├── places.dtd │ │ │ │ │ │ └── places.properties │ │ │ │ │ ├── preferences/ │ │ │ │ │ │ ├── aboutPermissions.dtd │ │ │ │ │ │ ├── aboutPermissions.properties │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ ├── applicationManager.dtd │ │ │ │ │ │ ├── applicationManager.properties │ │ │ │ │ │ ├── applications.dtd │ │ │ │ │ │ ├── blocklists.dtd │ │ │ │ │ │ ├── colors.dtd │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ ├── containers.dtd │ │ │ │ │ │ ├── containers.properties │ │ │ │ │ │ ├── content.dtd │ │ │ │ │ │ ├── cookies.dtd │ │ │ │ │ │ ├── donottrack.dtd │ │ │ │ │ │ ├── fonts.dtd │ │ │ │ │ │ ├── languages.dtd │ │ │ │ │ │ ├── main.dtd │ │ │ │ │ │ ├── permissions.dtd │ │ │ │ │ │ ├── preferences.dtd │ │ │ │ │ │ ├── preferences.properties │ │ │ │ │ │ ├── privacy.dtd │ │ │ │ │ │ ├── search.dtd │ │ │ │ │ │ ├── security.dtd │ │ │ │ │ │ ├── selectBookmark.dtd │ │ │ │ │ │ ├── siteDataSettings.dtd │ │ │ │ │ │ ├── sync.dtd │ │ │ │ │ │ ├── tabs.dtd │ │ │ │ │ │ └── translation.dtd │ │ │ │ │ ├── quitDialog.properties │ │ │ │ │ ├── safeMode.dtd │ │ │ │ │ ├── safebrowsing/ │ │ │ │ │ │ ├── phishing-afterload-warning-message.dtd │ │ │ │ │ │ └── report-phishing.dtd │ │ │ │ │ ├── sanitize.dtd │ │ │ │ │ ├── search.properties │ │ │ │ │ ├── searchbar.dtd │ │ │ │ │ ├── searchplugins/ │ │ │ │ │ │ ├── ddg.xml │ │ │ │ │ │ ├── findbook-zh-TW.xml │ │ │ │ │ │ ├── google-nocodes.xml │ │ │ │ │ │ ├── google.xml │ │ │ │ │ │ ├── list.json │ │ │ │ │ │ ├── wikipedia-zh-TW.xml │ │ │ │ │ │ ├── yahoo-answer-zh-TW.xml │ │ │ │ │ │ ├── yahoo-bid-zh-TW.xml │ │ │ │ │ │ ├── yahoo-zh-TW-HK.xml │ │ │ │ │ │ └── yahoo-zh-TW.xml │ │ │ │ │ ├── setDesktopBackground.dtd │ │ │ │ │ ├── shellservice.properties │ │ │ │ │ ├── sitePermissions.properties │ │ │ │ │ ├── syncBrand.dtd │ │ │ │ │ ├── syncCustomize.dtd │ │ │ │ │ ├── syncGenericChange.properties │ │ │ │ │ ├── syncKey.dtd │ │ │ │ │ ├── syncProgress.dtd │ │ │ │ │ ├── syncQuota.dtd │ │ │ │ │ ├── syncQuota.properties │ │ │ │ │ ├── syncSetup.dtd │ │ │ │ │ ├── syncSetup.properties │ │ │ │ │ ├── tabbrowser.dtd │ │ │ │ │ ├── tabbrowser.properties │ │ │ │ │ ├── tabview.properties │ │ │ │ │ ├── taskbar.properties │ │ │ │ │ ├── translation.dtd │ │ │ │ │ ├── translation.properties │ │ │ │ │ └── webrtcIndicator.properties │ │ │ │ ├── browser-region/ │ │ │ │ │ └── region.properties │ │ │ │ ├── feedback/ │ │ │ │ │ ├── main.dtd │ │ │ │ │ └── main.properties │ │ │ │ ├── pdfviewer/ │ │ │ │ │ ├── chrome.properties │ │ │ │ │ └── viewer.properties │ │ │ │ └── zh-TW/ │ │ │ │ ├── devtools/ │ │ │ │ │ ├── client/ │ │ │ │ │ │ ├── VariablesView.dtd │ │ │ │ │ │ ├── aboutdebugging.dtd │ │ │ │ │ │ ├── aboutdebugging.properties │ │ │ │ │ │ ├── animationinspector.dtd │ │ │ │ │ │ ├── animationinspector.properties │ │ │ │ │ │ ├── app-manager.properties │ │ │ │ │ │ ├── appcacheutils.properties │ │ │ │ │ │ ├── boxmodel.properties │ │ │ │ │ │ ├── canvasdebugger.dtd │ │ │ │ │ │ ├── canvasdebugger.properties │ │ │ │ │ │ ├── components.properties │ │ │ │ │ │ ├── connection-screen.dtd │ │ │ │ │ │ ├── connection-screen.properties │ │ │ │ │ │ ├── debugger.dtd │ │ │ │ │ │ ├── debugger.properties │ │ │ │ │ │ ├── device.properties │ │ │ │ │ │ ├── dom.properties │ │ │ │ │ │ ├── eyedropper.properties │ │ │ │ │ │ ├── filterwidget.dtd │ │ │ │ │ │ ├── filterwidget.properties │ │ │ │ │ │ ├── font-inspector.dtd │ │ │ │ │ │ ├── font-inspector.properties │ │ │ │ │ │ ├── graphs.properties │ │ │ │ │ │ ├── har.properties │ │ │ │ │ │ ├── inspector.dtd │ │ │ │ │ │ ├── inspector.properties │ │ │ │ │ │ ├── jit-optimizations.properties │ │ │ │ │ │ ├── jsonview.properties │ │ │ │ │ │ ├── layout.properties │ │ │ │ │ │ ├── layoutview.dtd │ │ │ │ │ │ ├── markers.properties │ │ │ │ │ │ ├── memory.properties │ │ │ │ │ │ ├── menus.properties │ │ │ │ │ │ ├── netmonitor.dtd │ │ │ │ │ │ ├── netmonitor.properties │ │ │ │ │ │ ├── performance.dtd │ │ │ │ │ │ ├── performance.properties │ │ │ │ │ │ ├── projecteditor.properties │ │ │ │ │ │ ├── promisedebugger.dtd │ │ │ │ │ │ ├── promisedebugger.properties │ │ │ │ │ │ ├── responsive.properties │ │ │ │ │ │ ├── responsiveUI.properties │ │ │ │ │ │ ├── scratchpad.dtd │ │ │ │ │ │ ├── scratchpad.properties │ │ │ │ │ │ ├── shadereditor.dtd │ │ │ │ │ │ ├── shadereditor.properties │ │ │ │ │ │ ├── shared.properties │ │ │ │ │ │ ├── sourceeditor.dtd │ │ │ │ │ │ ├── sourceeditor.properties │ │ │ │ │ │ ├── startup.properties │ │ │ │ │ │ ├── storage.dtd │ │ │ │ │ │ ├── storage.properties │ │ │ │ │ │ ├── styleeditor.dtd │ │ │ │ │ │ ├── styleeditor.properties │ │ │ │ │ │ ├── styleinspector.dtd │ │ │ │ │ │ ├── toolbox.dtd │ │ │ │ │ │ ├── toolbox.properties │ │ │ │ │ │ ├── webConsole.dtd │ │ │ │ │ │ ├── webaudioeditor.dtd │ │ │ │ │ │ ├── webaudioeditor.properties │ │ │ │ │ │ ├── webconsole.properties │ │ │ │ │ │ ├── webide.dtd │ │ │ │ │ │ └── webide.properties │ │ │ │ │ └── shared/ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ ├── debugger.properties │ │ │ │ │ ├── gcli.properties │ │ │ │ │ ├── gclicommands.properties │ │ │ │ │ ├── shared.properties │ │ │ │ │ └── styleinspector.properties │ │ │ │ └── formautofill.properties │ │ │ └── zh-TW.manifest │ │ ├── chrome.manifest │ │ ├── crashreporter-override.ini │ │ ├── defaults/ │ │ │ ├── preferences/ │ │ │ │ └── firefox-l10n.js │ │ │ └── profile/ │ │ │ ├── bookmarks.html │ │ │ ├── chrome/ │ │ │ │ ├── userChrome-example.css │ │ │ │ └── userContent-example.css │ │ │ ├── localstore.rdf │ │ │ └── mimeTypes.rdf │ │ ├── features/ │ │ │ ├── chrome.manifest │ │ │ ├── firefox@getpocket.com/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── zh-TW/ │ │ │ │ │ └── locale/ │ │ │ │ │ └── zh-TW/ │ │ │ │ │ └── pocket.properties │ │ │ │ └── zh-TW.manifest │ │ │ ├── loop@mozilla.org/ │ │ │ │ ├── chrome.manifest │ │ │ │ ├── zh-TW/ │ │ │ │ │ └── locale/ │ │ │ │ │ └── zh-TW/ │ │ │ │ │ └── loop.properties │ │ │ │ └── zh-TW.manifest │ │ │ └── presentation@mozilla.org/ │ │ │ ├── chrome.manifest │ │ │ ├── zh-TW/ │ │ │ │ └── locale/ │ │ │ │ └── zh-TW/ │ │ │ │ └── presentation.properties │ │ │ └── zh-TW.manifest │ │ └── searchplugins/ │ │ ├── creativecommons.xml │ │ ├── findbook-zh-TW.xml │ │ ├── google.xml │ │ ├── wikipedia-zh-TW.xml │ │ ├── yahoo-answer-zh-TW.xml │ │ ├── yahoo-bid-zh-TW.xml │ │ └── yahoo-zh-TW.xml │ ├── chrome/ │ │ ├── zh-TW/ │ │ │ └── locale/ │ │ │ └── zh-TW/ │ │ │ ├── alerts/ │ │ │ │ ├── alert.dtd │ │ │ │ ├── alert.properties │ │ │ │ └── notificationNames.properties │ │ │ ├── autoconfig/ │ │ │ │ └── autoconfig.properties │ │ │ ├── cookie/ │ │ │ │ ├── cookieAcceptDialog.dtd │ │ │ │ └── cookieAcceptDialog.properties │ │ │ ├── formautofill/ │ │ │ │ └── requestAutocomplete.dtd │ │ │ ├── global/ │ │ │ │ ├── AccessFu.properties │ │ │ │ ├── about.dtd │ │ │ │ ├── aboutAbout.dtd │ │ │ │ ├── aboutNetworking.dtd │ │ │ │ ├── aboutProfiles.dtd │ │ │ │ ├── aboutProfiles.properties │ │ │ │ ├── aboutReader.properties │ │ │ │ ├── aboutRights.dtd │ │ │ │ ├── aboutRights.properties │ │ │ │ ├── aboutServiceWorkers.dtd │ │ │ │ ├── aboutServiceWorkers.properties │ │ │ │ ├── aboutSupport.dtd │ │ │ │ ├── aboutSupport.properties │ │ │ │ ├── aboutTelemetry.dtd │ │ │ │ ├── aboutTelemetry.properties │ │ │ │ ├── aboutWebrtc.properties │ │ │ │ ├── actions.dtd │ │ │ │ ├── appPicker.dtd │ │ │ │ ├── appstrings.properties │ │ │ │ ├── autocomplete.properties │ │ │ │ ├── brand.dtd │ │ │ │ ├── browser.properties │ │ │ │ ├── charsetMenu.dtd │ │ │ │ ├── charsetMenu.properties │ │ │ │ ├── charsetOverlay.dtd │ │ │ │ ├── charsetTitles.properties │ │ │ │ ├── commonDialog.dtd │ │ │ │ ├── commonDialogs.properties │ │ │ │ ├── config.dtd │ │ │ │ ├── config.properties │ │ │ │ ├── console.dtd │ │ │ │ ├── console.properties │ │ │ │ ├── contentAreaCommands.properties │ │ │ │ ├── crashes.dtd │ │ │ │ ├── crashes.properties │ │ │ │ ├── css.properties │ │ │ │ ├── customizeCharset.dtd │ │ │ │ ├── customizeToolbar.dtd │ │ │ │ ├── customizeToolbar.properties │ │ │ │ ├── dateFormat.properties │ │ │ │ ├── datetimepicker.dtd │ │ │ │ ├── devtools/ │ │ │ │ │ ├── csscoverage.dtd │ │ │ │ │ ├── csscoverage.properties │ │ │ │ │ ├── debugger.properties │ │ │ │ │ └── styleinspector.properties │ │ │ │ ├── dialog.properties │ │ │ │ ├── dialogOverlay.dtd │ │ │ │ ├── dom/ │ │ │ │ │ └── dom.properties │ │ │ │ ├── downloadProgress.properties │ │ │ │ ├── editMenuOverlay.dtd │ │ │ │ ├── extensions.properties │ │ │ │ ├── fallbackMenubar.properties │ │ │ │ ├── filefield.properties │ │ │ │ ├── filepicker.dtd │ │ │ │ ├── filepicker.properties │ │ │ │ ├── findbar.dtd │ │ │ │ ├── findbar.properties │ │ │ │ ├── finddialog.dtd │ │ │ │ ├── finddialog.properties │ │ │ │ ├── global-strres.properties │ │ │ │ ├── global.dtd │ │ │ │ ├── globalKeys.dtd │ │ │ │ ├── headsUpDisplay.properties │ │ │ │ ├── intl.css │ │ │ │ ├── intl.properties │ │ │ │ ├── keys.properties │ │ │ │ ├── languageNames.properties │ │ │ │ ├── layout/ │ │ │ │ │ ├── HtmlForm.properties │ │ │ │ │ ├── MediaDocument.properties │ │ │ │ │ ├── htmlparser.properties │ │ │ │ │ └── xmlparser.properties │ │ │ │ ├── layout_errors.properties │ │ │ │ ├── mathml/ │ │ │ │ │ └── mathml.properties │ │ │ │ ├── mozilla.dtd │ │ │ │ ├── narrate.properties │ │ │ │ ├── netError.dtd │ │ │ │ ├── netErrorApp.dtd │ │ │ │ ├── notification.dtd │ │ │ │ ├── nsWebBrowserPersist.properties │ │ │ │ ├── plugins.properties │ │ │ │ ├── preferences.dtd │ │ │ │ ├── printPageSetup.dtd │ │ │ │ ├── printPreview.dtd │ │ │ │ ├── printPreviewProgress.dtd │ │ │ │ ├── printProgress.dtd │ │ │ │ ├── printdialog.dtd │ │ │ │ ├── printdialog.properties │ │ │ │ ├── printing.properties │ │ │ │ ├── printjoboptions.dtd │ │ │ │ ├── regionNames.properties │ │ │ │ ├── resetProfile.dtd │ │ │ │ ├── resetProfile.properties │ │ │ │ ├── search/ │ │ │ │ │ └── search.properties │ │ │ │ ├── security/ │ │ │ │ │ ├── caps.properties │ │ │ │ │ ├── csp.properties │ │ │ │ │ └── security.properties │ │ │ │ ├── storage.properties │ │ │ │ ├── svg/ │ │ │ │ │ └── svg.properties │ │ │ │ ├── textcontext.dtd │ │ │ │ ├── tree.dtd │ │ │ │ ├── videocontrols.dtd │ │ │ │ ├── viewSource.dtd │ │ │ │ ├── viewSource.properties │ │ │ │ ├── webConsole.dtd │ │ │ │ ├── webapps.properties │ │ │ │ ├── wizard.dtd │ │ │ │ ├── wizard.properties │ │ │ │ ├── xbl.properties │ │ │ │ ├── xml/ │ │ │ │ │ └── prettyprint.dtd │ │ │ │ ├── xpinstall/ │ │ │ │ │ └── xpinstall.properties │ │ │ │ ├── xslt/ │ │ │ │ │ └── xslt.properties │ │ │ │ └── xul.properties │ │ │ ├── global-platform/ │ │ │ │ ├── mac/ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ ├── intl.properties │ │ │ │ │ └── platformKeys.properties │ │ │ │ ├── unix/ │ │ │ │ │ ├── accessible.properties │ │ │ │ │ ├── intl.properties │ │ │ │ │ └── platformKeys.properties │ │ │ │ └── win/ │ │ │ │ ├── accessible.properties │ │ │ │ ├── intl.properties │ │ │ │ └── platformKeys.properties │ │ │ ├── global-region/ │ │ │ │ └── region.properties │ │ │ ├── mozapps/ │ │ │ │ ├── downloads/ │ │ │ │ │ ├── downloads.dtd │ │ │ │ │ ├── downloads.properties │ │ │ │ │ ├── settingsChange.dtd │ │ │ │ │ ├── unknownContentType.dtd │ │ │ │ │ └── unknownContentType.properties │ │ │ │ ├── extensions/ │ │ │ │ │ ├── about.dtd │ │ │ │ │ ├── blocklist.dtd │ │ │ │ │ ├── extensions.dtd │ │ │ │ │ ├── extensions.properties │ │ │ │ │ ├── newaddon.dtd │ │ │ │ │ ├── newaddon.properties │ │ │ │ │ ├── selectAddons.dtd │ │ │ │ │ ├── selectAddons.properties │ │ │ │ │ ├── update.dtd │ │ │ │ │ └── update.properties │ │ │ │ ├── handling/ │ │ │ │ │ ├── handling.dtd │ │ │ │ │ └── handling.properties │ │ │ │ ├── plugins/ │ │ │ │ │ ├── plugins.dtd │ │ │ │ │ └── plugins.properties │ │ │ │ ├── preferences/ │ │ │ │ │ ├── changemp.dtd │ │ │ │ │ ├── ocsp.dtd │ │ │ │ │ ├── preferences.properties │ │ │ │ │ └── removemp.dtd │ │ │ │ ├── profile/ │ │ │ │ │ ├── createProfileWizard.dtd │ │ │ │ │ ├── profileSelection.dtd │ │ │ │ │ └── profileSelection.properties │ │ │ │ ├── update/ │ │ │ │ │ ├── history.dtd │ │ │ │ │ ├── updates.dtd │ │ │ │ │ └── updates.properties │ │ │ │ └── xpinstall/ │ │ │ │ ├── xpinstallConfirm.dtd │ │ │ │ └── xpinstallConfirm.properties │ │ │ ├── necko/ │ │ │ │ └── necko.properties │ │ │ ├── passwordmgr/ │ │ │ │ ├── passwordManager.dtd │ │ │ │ └── passwordmgr.properties │ │ │ ├── pipnss/ │ │ │ │ ├── nsserrors.properties │ │ │ │ ├── pipnss.properties │ │ │ │ └── security.properties │ │ │ ├── pippki/ │ │ │ │ ├── certManager.dtd │ │ │ │ ├── deviceManager.dtd │ │ │ │ ├── pippki.dtd │ │ │ │ ├── pippki.properties │ │ │ │ └── validation.dtd │ │ │ ├── places/ │ │ │ │ └── places.properties │ │ │ ├── pluginproblem/ │ │ │ │ └── pluginproblem.dtd │ │ │ └── services/ │ │ │ ├── errors.properties │ │ │ └── sync.properties │ │ └── zh-TW.manifest │ ├── chrome.manifest │ └── install.rdf ├── locales/ │ ├── Makefile.in │ ├── cs/ │ │ ├── aria.mn │ │ ├── base.mn │ │ ├── bluegriffon/ │ │ │ ├── base/ │ │ │ │ └── locale/ │ │ │ │ ├── bluegriffon/ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ ├── aria.dtd │ │ │ │ │ ├── bluegriffon.dtd │ │ │ │ │ ├── bluegriffon.properties │ │ │ │ │ ├── colourPicker.dtd │ │ │ │ │ ├── convertToTable.dtd │ │ │ │ │ ├── credits.dtd │ │ │ │ │ ├── cssClassPicker.dtd │ │ │ │ │ ├── dictionary.dtd │ │ │ │ │ ├── editStylesheet.dtd │ │ │ │ │ ├── filePicking.dtd │ │ │ │ │ ├── filepickerbutton.dtd │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── html5.properties │ │ │ │ │ ├── insertAnchor.dtd │ │ │ │ │ ├── insertAudio.dtd │ │ │ │ │ ├── insertButton.dtd │ │ │ │ │ ├── insertChars.dtd │ │ │ │ │ ├── insertCommentOrPI.dtd │ │ │ │ │ ├── insertDatalist.dtd │ │ │ │ │ ├── insertFieldset.dtd │ │ │ │ │ ├── insertForm.dtd │ │ │ │ │ ├── insertFormInput.dtd │ │ │ │ │ ├── insertHR.dtd │ │ │ │ │ ├── insertHTML.dtd │ │ │ │ │ ├── insertImage.dtd │ │ │ │ │ ├── insertKeygen.dtd │ │ │ │ │ ├── insertLabel.dtd │ │ │ │ │ ├── insertLink.dtd │ │ │ │ │ ├── insertLink.properties │ │ │ │ │ ├── insertMeter.dtd │ │ │ │ │ ├── insertOutput.dtd │ │ │ │ │ ├── insertProgress.dtd │ │ │ │ │ ├── insertSelect.dtd │ │ │ │ │ ├── insertStylesheet.dtd │ │ │ │ │ ├── insertTOC.dtd │ │ │ │ │ ├── insertTable.dtd │ │ │ │ │ ├── insertTable.properties │ │ │ │ │ ├── insertTextarea.dtd │ │ │ │ │ ├── insertVideo.dtd │ │ │ │ │ ├── insertVideo.properties │ │ │ │ │ ├── language.properties │ │ │ │ │ ├── languages.dtd │ │ │ │ │ ├── listProperties.dtd │ │ │ │ │ ├── markupCleaner.dtd │ │ │ │ │ ├── masterPasswordQuery.properties │ │ │ │ │ ├── media.dtd │ │ │ │ │ ├── media.properties │ │ │ │ │ ├── newDocument.dtd │ │ │ │ │ ├── newPageWizard.dtd │ │ │ │ │ ├── newPageWizard.properties │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ ├── pageProperties.dtd │ │ │ │ │ ├── pagePropertiesPreview.html │ │ │ │ │ ├── panels.dtd │ │ │ │ │ ├── parsingError.dtd │ │ │ │ │ ├── polyglot.dtd │ │ │ │ │ ├── prefs/ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ ├── deactivateLicense.dtd │ │ │ │ │ │ ├── file.dtd │ │ │ │ │ │ ├── general.dtd │ │ │ │ │ │ ├── license.dtd │ │ │ │ │ │ ├── license.properties │ │ │ │ │ │ ├── newPage.dtd │ │ │ │ │ │ ├── osx.dtd │ │ │ │ │ │ ├── shortcuts.dtd │ │ │ │ │ │ ├── shortcuts.properties │ │ │ │ │ │ ├── source.dtd │ │ │ │ │ │ ├── styles.dtd │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── prefs.dtd │ │ │ │ │ ├── propertiesDeck.dtd │ │ │ │ │ ├── rotator.dtd │ │ │ │ │ ├── spellCheck.dtd │ │ │ │ │ ├── spellCheck.properties │ │ │ │ │ ├── structurebar.dtd │ │ │ │ │ ├── svg-edit.properties │ │ │ │ │ ├── tabeditor.dtd │ │ │ │ │ ├── updateAvailable.dtd │ │ │ │ │ └── updates.properties │ │ │ │ └── branding/ │ │ │ │ ├── brand.dtd │ │ │ │ └── brand.properties │ │ │ ├── extensions/ │ │ │ │ ├── fs/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── fs.dtd │ │ │ │ │ ├── fs.properties │ │ │ │ │ └── fsOverlay.dtd │ │ │ │ ├── gfd/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── gfd.dtd │ │ │ │ │ └── gfdOverlay.dtd │ │ │ │ ├── markdown/ │ │ │ │ │ ├── markdown.dtd │ │ │ │ │ └── markdownOverlay.dtd │ │ │ │ ├── op1/ │ │ │ │ │ ├── a11yFirstStep.properties │ │ │ │ │ ├── op1.dtd │ │ │ │ │ └── op1Overlay.dtd │ │ │ │ └── tipoftheday/ │ │ │ │ ├── tipoftheday.dtd │ │ │ │ ├── tipoftheday.rdf │ │ │ │ └── tipofthedayOverlay.dtd │ │ │ └── sidebars/ │ │ │ ├── aria/ │ │ │ │ ├── aria.dtd │ │ │ │ ├── aria.properties │ │ │ │ └── ariaOverlay.dtd │ │ │ ├── cssproperties/ │ │ │ │ ├── backgrounditem.dtd │ │ │ │ ├── backgrounditem.properties │ │ │ │ ├── colorstopitem.dtd │ │ │ │ ├── cssproperties.dtd │ │ │ │ ├── cssproperties.properties │ │ │ │ ├── csspropertiesOverlay.dtd │ │ │ │ ├── editGridTemplate.dtd │ │ │ │ ├── fontFeatures.properties │ │ │ │ ├── griditemposition.dtd │ │ │ │ ├── textshadowitem.dtd │ │ │ │ ├── transformationitem.dtd │ │ │ │ └── transitionitem.dtd │ │ │ ├── domexplorer/ │ │ │ │ ├── domexplorer.dtd │ │ │ │ └── domexplorerOverlay.dtd │ │ │ ├── its20/ │ │ │ │ ├── its20.dtd │ │ │ │ ├── its20.properties │ │ │ │ ├── its20Overlay.dtd │ │ │ │ ├── locNoteRule.dtd │ │ │ │ ├── selector.dtd │ │ │ │ ├── termRule.dtd │ │ │ │ └── translateRule.dtd │ │ │ ├── scripteditor/ │ │ │ │ ├── editor.dtd │ │ │ │ ├── scripteditor.dtd │ │ │ │ ├── scripteditor.properties │ │ │ │ └── scripteditorOverlay.dtd │ │ │ └── stylesheets/ │ │ │ ├── editor.dtd │ │ │ ├── stylesheets.dtd │ │ │ └── stylesheetsOverlay.dtd │ │ ├── cssproperties.mn │ │ ├── domexplorer.mn │ │ ├── fs.mn │ │ ├── gfd.mn │ │ ├── its20.mn │ │ ├── markdown.mn │ │ ├── op1.mn │ │ ├── scripteditor.mn │ │ ├── stylesheets.mn │ │ └── tipoftheday.mn │ ├── de/ │ │ ├── aria.mn │ │ ├── base.mn │ │ ├── bluegriffon/ │ │ │ ├── base/ │ │ │ │ └── locale/ │ │ │ │ ├── bluegriffon/ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ ├── aria.dtd │ │ │ │ │ ├── bluegriffon.dtd │ │ │ │ │ ├── bluegriffon.properties │ │ │ │ │ ├── colourPicker.dtd │ │ │ │ │ ├── convertToTable.dtd │ │ │ │ │ ├── credits.dtd │ │ │ │ │ ├── cssClassPicker.dtd │ │ │ │ │ ├── dictionary.dtd │ │ │ │ │ ├── editStylesheet.dtd │ │ │ │ │ ├── filePicking.dtd │ │ │ │ │ ├── filepickerbutton.dtd │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── html5.properties │ │ │ │ │ ├── insertAnchor.dtd │ │ │ │ │ ├── insertAudio.dtd │ │ │ │ │ ├── insertButton.dtd │ │ │ │ │ ├── insertChars.dtd │ │ │ │ │ ├── insertCommentOrPI.dtd │ │ │ │ │ ├── insertDatalist.dtd │ │ │ │ │ ├── insertFieldset.dtd │ │ │ │ │ ├── insertForm.dtd │ │ │ │ │ ├── insertFormInput.dtd │ │ │ │ │ ├── insertHR.dtd │ │ │ │ │ ├── insertHTML.dtd │ │ │ │ │ ├── insertImage.dtd │ │ │ │ │ ├── insertKeygen.dtd │ │ │ │ │ ├── insertLabel.dtd │ │ │ │ │ ├── insertLink.dtd │ │ │ │ │ ├── insertLink.properties │ │ │ │ │ ├── insertMeter.dtd │ │ │ │ │ ├── insertOutput.dtd │ │ │ │ │ ├── insertProgress.dtd │ │ │ │ │ ├── insertSelect.dtd │ │ │ │ │ ├── insertStylesheet.dtd │ │ │ │ │ ├── insertTOC.dtd │ │ │ │ │ ├── insertTable.dtd │ │ │ │ │ ├── insertTable.properties │ │ │ │ │ ├── insertTextarea.dtd │ │ │ │ │ ├── insertVideo.dtd │ │ │ │ │ ├── insertVideo.properties │ │ │ │ │ ├── language.properties │ │ │ │ │ ├── languages.dtd │ │ │ │ │ ├── listProperties.dtd │ │ │ │ │ ├── markupCleaner.dtd │ │ │ │ │ ├── masterPasswordQuery.properties │ │ │ │ │ ├── media.dtd │ │ │ │ │ ├── media.properties │ │ │ │ │ ├── newDocument.dtd │ │ │ │ │ ├── newPageWizard.dtd │ │ │ │ │ ├── newPageWizard.properties │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ ├── pageProperties.dtd │ │ │ │ │ ├── pagePropertiesPreview.html │ │ │ │ │ ├── panels.dtd │ │ │ │ │ ├── parsingError.dtd │ │ │ │ │ ├── polyglot.dtd │ │ │ │ │ ├── prefs/ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ ├── deactivateLicense.dtd │ │ │ │ │ │ ├── file.dtd │ │ │ │ │ │ ├── general.dtd │ │ │ │ │ │ ├── license.dtd │ │ │ │ │ │ ├── license.properties │ │ │ │ │ │ ├── newPage.dtd │ │ │ │ │ │ ├── osx.dtd │ │ │ │ │ │ ├── shortcuts.dtd │ │ │ │ │ │ ├── shortcuts.properties │ │ │ │ │ │ ├── source.dtd │ │ │ │ │ │ ├── styles.dtd │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── prefs.dtd │ │ │ │ │ ├── propertiesDeck.dtd │ │ │ │ │ ├── rotator.dtd │ │ │ │ │ ├── spellCheck.dtd │ │ │ │ │ ├── spellCheck.properties │ │ │ │ │ ├── structurebar.dtd │ │ │ │ │ ├── svg-edit.properties │ │ │ │ │ ├── tabeditor.dtd │ │ │ │ │ ├── updateAvailable.dtd │ │ │ │ │ └── updates.properties │ │ │ │ └── branding/ │ │ │ │ ├── brand.dtd │ │ │ │ └── brand.properties │ │ │ ├── extensions/ │ │ │ │ ├── fs/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── fs.dtd │ │ │ │ │ ├── fs.properties │ │ │ │ │ └── fsOverlay.dtd │ │ │ │ ├── gfd/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── gfd.dtd │ │ │ │ │ └── gfdOverlay.dtd │ │ │ │ ├── markdown/ │ │ │ │ │ ├── markdown.dtd │ │ │ │ │ └── markdownOverlay.dtd │ │ │ │ ├── op1/ │ │ │ │ │ ├── a11yFirstStep.properties │ │ │ │ │ ├── op1.dtd │ │ │ │ │ └── op1Overlay.dtd │ │ │ │ └── tipoftheday/ │ │ │ │ ├── tipoftheday.dtd │ │ │ │ ├── tipoftheday.rdf │ │ │ │ └── tipofthedayOverlay.dtd │ │ │ └── sidebars/ │ │ │ ├── aria/ │ │ │ │ ├── aria.dtd │ │ │ │ ├── aria.properties │ │ │ │ └── ariaOverlay.dtd │ │ │ ├── cssproperties/ │ │ │ │ ├── backgrounditem.dtd │ │ │ │ ├── backgrounditem.properties │ │ │ │ ├── colorstopitem.dtd │ │ │ │ ├── cssproperties.dtd │ │ │ │ ├── cssproperties.properties │ │ │ │ ├── csspropertiesOverlay.dtd │ │ │ │ ├── editGridTemplate.dtd │ │ │ │ ├── fontFeatures.properties │ │ │ │ ├── griditemposition.dtd │ │ │ │ ├── textshadowitem.dtd │ │ │ │ ├── transformationitem.dtd │ │ │ │ └── transitionitem.dtd │ │ │ ├── domexplorer/ │ │ │ │ ├── domexplorer.dtd │ │ │ │ └── domexplorerOverlay.dtd │ │ │ ├── its20/ │ │ │ │ ├── its20.dtd │ │ │ │ ├── its20.properties │ │ │ │ ├── its20Overlay.dtd │ │ │ │ ├── locNoteRule.dtd │ │ │ │ ├── selector.dtd │ │ │ │ ├── termRule.dtd │ │ │ │ └── translateRule.dtd │ │ │ ├── scripteditor/ │ │ │ │ ├── editor.dtd │ │ │ │ ├── scripteditor.dtd │ │ │ │ ├── scripteditor.properties │ │ │ │ └── scripteditorOverlay.dtd │ │ │ └── stylesheets/ │ │ │ ├── editor.dtd │ │ │ ├── stylesheets.dtd │ │ │ └── stylesheetsOverlay.dtd │ │ ├── cssproperties.mn │ │ ├── domexplorer.mn │ │ ├── fs.mn │ │ ├── gfd.mn │ │ ├── its20.mn │ │ ├── markdown.mn │ │ ├── op1.mn │ │ ├── scripteditor.mn │ │ ├── stylesheets.mn │ │ └── tipoftheday.mn │ ├── en-US/ │ │ ├── aria.mn │ │ ├── base.mn │ │ ├── bluegriffon/ │ │ │ ├── base/ │ │ │ │ └── locale/ │ │ │ │ ├── bluegriffon/ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ ├── aria.dtd │ │ │ │ │ ├── bluegriffon.dtd │ │ │ │ │ ├── bluegriffon.properties │ │ │ │ │ ├── colourPicker.dtd │ │ │ │ │ ├── convertToTable.dtd │ │ │ │ │ ├── credits.dtd │ │ │ │ │ ├── cssClassPicker.dtd │ │ │ │ │ ├── dictionary.dtd │ │ │ │ │ ├── editStylesheet.dtd │ │ │ │ │ ├── filePicking.dtd │ │ │ │ │ ├── filepickerbutton.dtd │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── html5.properties │ │ │ │ │ ├── insertAnchor.dtd │ │ │ │ │ ├── insertAudio.dtd │ │ │ │ │ ├── insertButton.dtd │ │ │ │ │ ├── insertChars.dtd │ │ │ │ │ ├── insertCommentOrPI.dtd │ │ │ │ │ ├── insertDatalist.dtd │ │ │ │ │ ├── insertFieldset.dtd │ │ │ │ │ ├── insertForm.dtd │ │ │ │ │ ├── insertFormInput.dtd │ │ │ │ │ ├── insertHR.dtd │ │ │ │ │ ├── insertHTML.dtd │ │ │ │ │ ├── insertImage.dtd │ │ │ │ │ ├── insertKeygen.dtd │ │ │ │ │ ├── insertLabel.dtd │ │ │ │ │ ├── insertLink.dtd │ │ │ │ │ ├── insertLink.properties │ │ │ │ │ ├── insertMeter.dtd │ │ │ │ │ ├── insertOutput.dtd │ │ │ │ │ ├── insertProgress.dtd │ │ │ │ │ ├── insertSelect.dtd │ │ │ │ │ ├── insertStylesheet.dtd │ │ │ │ │ ├── insertTOC.dtd │ │ │ │ │ ├── insertTable.dtd │ │ │ │ │ ├── insertTable.properties │ │ │ │ │ ├── insertTextarea.dtd │ │ │ │ │ ├── insertVideo.dtd │ │ │ │ │ ├── insertVideo.properties │ │ │ │ │ ├── language.properties │ │ │ │ │ ├── languages.dtd │ │ │ │ │ ├── listProperties.dtd │ │ │ │ │ ├── markupCleaner.dtd │ │ │ │ │ ├── masterPasswordQuery.properties │ │ │ │ │ ├── media.dtd │ │ │ │ │ ├── media.properties │ │ │ │ │ ├── newDocument.dtd │ │ │ │ │ ├── newPageWizard.dtd │ │ │ │ │ ├── newPageWizard.properties │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ ├── pageProperties.dtd │ │ │ │ │ ├── pagePropertiesPreview.html │ │ │ │ │ ├── panels.dtd │ │ │ │ │ ├── parsingError.dtd │ │ │ │ │ ├── polyglot.dtd │ │ │ │ │ ├── prefs/ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ ├── deactivateLicense.dtd │ │ │ │ │ │ ├── file.dtd │ │ │ │ │ │ ├── general.dtd │ │ │ │ │ │ ├── license.dtd │ │ │ │ │ │ ├── license.properties │ │ │ │ │ │ ├── newPage.dtd │ │ │ │ │ │ ├── osx.dtd │ │ │ │ │ │ ├── shortcuts.dtd │ │ │ │ │ │ ├── shortcuts.properties │ │ │ │ │ │ ├── source.dtd │ │ │ │ │ │ ├── styles.dtd │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── prefs.dtd │ │ │ │ │ ├── propertiesDeck.dtd │ │ │ │ │ ├── rotator.dtd │ │ │ │ │ ├── spellCheck.dtd │ │ │ │ │ ├── spellCheck.properties │ │ │ │ │ ├── structurebar.dtd │ │ │ │ │ ├── svg-edit.properties │ │ │ │ │ ├── tabeditor.dtd │ │ │ │ │ ├── updateAvailable.dtd │ │ │ │ │ └── updates.properties │ │ │ │ └── branding/ │ │ │ │ ├── brand.dtd │ │ │ │ └── brand.properties │ │ │ ├── extensions/ │ │ │ │ ├── fs/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── fs.dtd │ │ │ │ │ ├── fs.properties │ │ │ │ │ └── fsOverlay.dtd │ │ │ │ ├── gfd/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── gfd.dtd │ │ │ │ │ └── gfdOverlay.dtd │ │ │ │ ├── markdown/ │ │ │ │ │ ├── markdown.dtd │ │ │ │ │ └── markdownOverlay.dtd │ │ │ │ ├── op1/ │ │ │ │ │ ├── a11yFirstStep.properties │ │ │ │ │ ├── op1.dtd │ │ │ │ │ └── op1Overlay.dtd │ │ │ │ └── tipoftheday/ │ │ │ │ ├── tipoftheday.dtd │ │ │ │ ├── tipoftheday.rdf │ │ │ │ └── tipofthedayOverlay.dtd │ │ │ └── sidebars/ │ │ │ ├── aria/ │ │ │ │ ├── aria.dtd │ │ │ │ ├── aria.properties │ │ │ │ └── ariaOverlay.dtd │ │ │ ├── cssproperties/ │ │ │ │ ├── backgrounditem.dtd │ │ │ │ ├── backgrounditem.properties │ │ │ │ ├── colorstopitem.dtd │ │ │ │ ├── cssproperties.dtd │ │ │ │ ├── cssproperties.properties │ │ │ │ ├── csspropertiesOverlay.dtd │ │ │ │ ├── editGridTemplate.dtd │ │ │ │ ├── fontFeatures.properties │ │ │ │ ├── griditemposition.dtd │ │ │ │ ├── textshadowitem.dtd │ │ │ │ ├── transformationitem.dtd │ │ │ │ └── transitionitem.dtd │ │ │ ├── domexplorer/ │ │ │ │ ├── domexplorer.dtd │ │ │ │ └── domexplorerOverlay.dtd │ │ │ ├── its20/ │ │ │ │ ├── its20.dtd │ │ │ │ ├── its20.properties │ │ │ │ ├── its20Overlay.dtd │ │ │ │ ├── locNoteRule.dtd │ │ │ │ ├── selector.dtd │ │ │ │ ├── termRule.dtd │ │ │ │ └── translateRule.dtd │ │ │ ├── scripteditor/ │ │ │ │ ├── editor.dtd │ │ │ │ ├── scripteditor.dtd │ │ │ │ ├── scripteditor.properties │ │ │ │ └── scripteditorOverlay.dtd │ │ │ └── stylesheets/ │ │ │ ├── editor.dtd │ │ │ ├── stylesheets.dtd │ │ │ └── stylesheetsOverlay.dtd │ │ ├── cssproperties.mn │ │ ├── domexplorer.mn │ │ ├── fs.mn │ │ ├── gfd.mn │ │ ├── its20.mn │ │ ├── markdown.mn │ │ ├── op1.mn │ │ ├── scripteditor.mn │ │ ├── stylesheets.mn │ │ └── tipoftheday.mn │ ├── es-ES/ │ │ ├── aria.mn │ │ ├── base.mn │ │ ├── bluegriffon/ │ │ │ ├── base/ │ │ │ │ └── locale/ │ │ │ │ ├── bluegriffon/ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ ├── aria.dtd │ │ │ │ │ ├── bluegriffon.dtd │ │ │ │ │ ├── bluegriffon.properties │ │ │ │ │ ├── colourPicker.dtd │ │ │ │ │ ├── convertToTable.dtd │ │ │ │ │ ├── credits.dtd │ │ │ │ │ ├── cssClassPicker.dtd │ │ │ │ │ ├── dictionary.dtd │ │ │ │ │ ├── editStylesheet.dtd │ │ │ │ │ ├── filePicking.dtd │ │ │ │ │ ├── filepickerbutton.dtd │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── html5.properties │ │ │ │ │ ├── insertAnchor.dtd │ │ │ │ │ ├── insertAudio.dtd │ │ │ │ │ ├── insertButton.dtd │ │ │ │ │ ├── insertChars.dtd │ │ │ │ │ ├── insertCommentOrPI.dtd │ │ │ │ │ ├── insertDatalist.dtd │ │ │ │ │ ├── insertFieldset.dtd │ │ │ │ │ ├── insertForm.dtd │ │ │ │ │ ├── insertFormInput.dtd │ │ │ │ │ ├── insertHR.dtd │ │ │ │ │ ├── insertHTML.dtd │ │ │ │ │ ├── insertImage.dtd │ │ │ │ │ ├── insertKeygen.dtd │ │ │ │ │ ├── insertLabel.dtd │ │ │ │ │ ├── insertLink.dtd │ │ │ │ │ ├── insertLink.properties │ │ │ │ │ ├── insertMeter.dtd │ │ │ │ │ ├── insertOutput.dtd │ │ │ │ │ ├── insertProgress.dtd │ │ │ │ │ ├── insertSelect.dtd │ │ │ │ │ ├── insertStylesheet.dtd │ │ │ │ │ ├── insertTOC.dtd │ │ │ │ │ ├── insertTable.dtd │ │ │ │ │ ├── insertTable.properties │ │ │ │ │ ├── insertTextarea.dtd │ │ │ │ │ ├── insertVideo.dtd │ │ │ │ │ ├── insertVideo.properties │ │ │ │ │ ├── language.properties │ │ │ │ │ ├── languages.dtd │ │ │ │ │ ├── listProperties.dtd │ │ │ │ │ ├── markupCleaner.dtd │ │ │ │ │ ├── masterPasswordQuery.properties │ │ │ │ │ ├── media.dtd │ │ │ │ │ ├── media.properties │ │ │ │ │ ├── newDocument.dtd │ │ │ │ │ ├── newPageWizard.dtd │ │ │ │ │ ├── newPageWizard.properties │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ ├── pageProperties.dtd │ │ │ │ │ ├── pagePropertiesPreview.html │ │ │ │ │ ├── panels.dtd │ │ │ │ │ ├── parsingError.dtd │ │ │ │ │ ├── polyglot.dtd │ │ │ │ │ ├── prefs/ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ ├── deactivateLicense.dtd │ │ │ │ │ │ ├── file.dtd │ │ │ │ │ │ ├── general.dtd │ │ │ │ │ │ ├── license.dtd │ │ │ │ │ │ ├── license.properties │ │ │ │ │ │ ├── newPage.dtd │ │ │ │ │ │ ├── osx.dtd │ │ │ │ │ │ ├── shortcuts.dtd │ │ │ │ │ │ ├── shortcuts.properties │ │ │ │ │ │ ├── source.dtd │ │ │ │ │ │ ├── styles.dtd │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── prefs.dtd │ │ │ │ │ ├── propertiesDeck.dtd │ │ │ │ │ ├── rotator.dtd │ │ │ │ │ ├── spellCheck.dtd │ │ │ │ │ ├── spellCheck.properties │ │ │ │ │ ├── structurebar.dtd │ │ │ │ │ ├── svg-edit.properties │ │ │ │ │ ├── tabeditor.dtd │ │ │ │ │ ├── updateAvailable.dtd │ │ │ │ │ └── updates.properties │ │ │ │ └── branding/ │ │ │ │ ├── brand.dtd │ │ │ │ └── brand.properties │ │ │ ├── extensions/ │ │ │ │ ├── fs/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── fs.dtd │ │ │ │ │ ├── fs.properties │ │ │ │ │ └── fsOverlay.dtd │ │ │ │ ├── gfd/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── gfd.dtd │ │ │ │ │ └── gfdOverlay.dtd │ │ │ │ ├── markdown/ │ │ │ │ │ ├── markdown.dtd │ │ │ │ │ └── markdownOverlay.dtd │ │ │ │ ├── op1/ │ │ │ │ │ ├── a11yFirstStep.properties │ │ │ │ │ ├── op1.dtd │ │ │ │ │ └── op1Overlay.dtd │ │ │ │ └── tipoftheday/ │ │ │ │ ├── tipoftheday.dtd │ │ │ │ ├── tipoftheday.rdf │ │ │ │ └── tipofthedayOverlay.dtd │ │ │ └── sidebars/ │ │ │ ├── aria/ │ │ │ │ ├── aria.dtd │ │ │ │ ├── aria.properties │ │ │ │ └── ariaOverlay.dtd │ │ │ ├── cssproperties/ │ │ │ │ ├── backgrounditem.dtd │ │ │ │ ├── backgrounditem.properties │ │ │ │ ├── colorstopitem.dtd │ │ │ │ ├── cssproperties.dtd │ │ │ │ ├── cssproperties.properties │ │ │ │ ├── csspropertiesOverlay.dtd │ │ │ │ ├── editGridTemplate.dtd │ │ │ │ ├── fontFeatures.properties │ │ │ │ ├── griditemposition.dtd │ │ │ │ ├── textshadowitem.dtd │ │ │ │ ├── transformationitem.dtd │ │ │ │ └── transitionitem.dtd │ │ │ ├── domexplorer/ │ │ │ │ ├── domexplorer.dtd │ │ │ │ └── domexplorerOverlay.dtd │ │ │ ├── its20/ │ │ │ │ ├── its20.dtd │ │ │ │ ├── its20.properties │ │ │ │ ├── its20Overlay.dtd │ │ │ │ ├── locNoteRule.dtd │ │ │ │ ├── selector.dtd │ │ │ │ ├── termRule.dtd │ │ │ │ └── translateRule.dtd │ │ │ ├── scripteditor/ │ │ │ │ ├── editor.dtd │ │ │ │ ├── scripteditor.dtd │ │ │ │ ├── scripteditor.properties │ │ │ │ └── scripteditorOverlay.dtd │ │ │ └── stylesheets/ │ │ │ ├── editor.dtd │ │ │ ├── stylesheets.dtd │ │ │ └── stylesheetsOverlay.dtd │ │ ├── cssproperties.mn │ │ ├── domexplorer.mn │ │ ├── fs.mn │ │ ├── gfd.mn │ │ ├── its20.mn │ │ ├── markdown.mn │ │ ├── op1.mn │ │ ├── scripteditor.mn │ │ ├── stylesheets.mn │ │ └── tipoftheday.mn │ ├── fi/ │ │ ├── aria.mn │ │ ├── base.mn │ │ ├── bluegriffon/ │ │ │ ├── base/ │ │ │ │ └── locale/ │ │ │ │ ├── bluegriffon/ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ ├── aria.dtd │ │ │ │ │ ├── bluegriffon.dtd │ │ │ │ │ ├── bluegriffon.properties │ │ │ │ │ ├── colourPicker.dtd │ │ │ │ │ ├── convertToTable.dtd │ │ │ │ │ ├── credits.dtd │ │ │ │ │ ├── cssClassPicker.dtd │ │ │ │ │ ├── dictionary.dtd │ │ │ │ │ ├── editStylesheet.dtd │ │ │ │ │ ├── filePicking.dtd │ │ │ │ │ ├── filepickerbutton.dtd │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── html5.properties │ │ │ │ │ ├── insertAnchor.dtd │ │ │ │ │ ├── insertAudio.dtd │ │ │ │ │ ├── insertButton.dtd │ │ │ │ │ ├── insertChars.dtd │ │ │ │ │ ├── insertCommentOrPI.dtd │ │ │ │ │ ├── insertDatalist.dtd │ │ │ │ │ ├── insertFieldset.dtd │ │ │ │ │ ├── insertForm.dtd │ │ │ │ │ ├── insertFormInput.dtd │ │ │ │ │ ├── insertHR.dtd │ │ │ │ │ ├── insertHTML.dtd │ │ │ │ │ ├── insertImage.dtd │ │ │ │ │ ├── insertKeygen.dtd │ │ │ │ │ ├── insertLabel.dtd │ │ │ │ │ ├── insertLink.dtd │ │ │ │ │ ├── insertLink.properties │ │ │ │ │ ├── insertMeter.dtd │ │ │ │ │ ├── insertOutput.dtd │ │ │ │ │ ├── insertProgress.dtd │ │ │ │ │ ├── insertSelect.dtd │ │ │ │ │ ├── insertStylesheet.dtd │ │ │ │ │ ├── insertTOC.dtd │ │ │ │ │ ├── insertTable.dtd │ │ │ │ │ ├── insertTable.properties │ │ │ │ │ ├── insertTextarea.dtd │ │ │ │ │ ├── insertVideo.dtd │ │ │ │ │ ├── insertVideo.properties │ │ │ │ │ ├── language.properties │ │ │ │ │ ├── languages.dtd │ │ │ │ │ ├── listProperties.dtd │ │ │ │ │ ├── markupCleaner.dtd │ │ │ │ │ ├── masterPasswordQuery.properties │ │ │ │ │ ├── media.dtd │ │ │ │ │ ├── media.properties │ │ │ │ │ ├── newDocument.dtd │ │ │ │ │ ├── newPageWizard.dtd │ │ │ │ │ ├── newPageWizard.properties │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ ├── pageProperties.dtd │ │ │ │ │ ├── pagePropertiesPreview.html │ │ │ │ │ ├── panels.dtd │ │ │ │ │ ├── parsingError.dtd │ │ │ │ │ ├── polyglot.dtd │ │ │ │ │ ├── prefs/ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ ├── deactivateLicense.dtd │ │ │ │ │ │ ├── file.dtd │ │ │ │ │ │ ├── general.dtd │ │ │ │ │ │ ├── license.dtd │ │ │ │ │ │ ├── license.properties │ │ │ │ │ │ ├── newPage.dtd │ │ │ │ │ │ ├── osx.dtd │ │ │ │ │ │ ├── shortcuts.dtd │ │ │ │ │ │ ├── shortcuts.properties │ │ │ │ │ │ ├── source.dtd │ │ │ │ │ │ ├── styles.dtd │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── prefs.dtd │ │ │ │ │ ├── propertiesDeck.dtd │ │ │ │ │ ├── rotator.dtd │ │ │ │ │ ├── spellCheck.dtd │ │ │ │ │ ├── spellCheck.properties │ │ │ │ │ ├── structurebar.dtd │ │ │ │ │ ├── svg-edit.properties │ │ │ │ │ ├── tabeditor.dtd │ │ │ │ │ ├── updateAvailable.dtd │ │ │ │ │ └── updates.properties │ │ │ │ └── branding/ │ │ │ │ ├── brand.dtd │ │ │ │ └── brand.properties │ │ │ ├── extensions/ │ │ │ │ ├── fs/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── fs.dtd │ │ │ │ │ ├── fs.properties │ │ │ │ │ └── fsOverlay.dtd │ │ │ │ ├── gfd/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── gfd.dtd │ │ │ │ │ └── gfdOverlay.dtd │ │ │ │ ├── markdown/ │ │ │ │ │ ├── markdown.dtd │ │ │ │ │ └── markdownOverlay.dtd │ │ │ │ ├── op1/ │ │ │ │ │ ├── a11yFirstStep.properties │ │ │ │ │ ├── op1.dtd │ │ │ │ │ └── op1Overlay.dtd │ │ │ │ └── tipoftheday/ │ │ │ │ ├── tipoftheday.dtd │ │ │ │ ├── tipoftheday.rdf │ │ │ │ └── tipofthedayOverlay.dtd │ │ │ └── sidebars/ │ │ │ ├── aria/ │ │ │ │ ├── aria.dtd │ │ │ │ ├── aria.properties │ │ │ │ └── ariaOverlay.dtd │ │ │ ├── cssproperties/ │ │ │ │ ├── backgrounditem.dtd │ │ │ │ ├── backgrounditem.properties │ │ │ │ ├── colorstopitem.dtd │ │ │ │ ├── cssproperties.dtd │ │ │ │ ├── cssproperties.properties │ │ │ │ ├── csspropertiesOverlay.dtd │ │ │ │ ├── editGridTemplate.dtd │ │ │ │ ├── fontFeatures.properties │ │ │ │ ├── griditemposition.dtd │ │ │ │ ├── textshadowitem.dtd │ │ │ │ ├── transformationitem.dtd │ │ │ │ └── transitionitem.dtd │ │ │ ├── domexplorer/ │ │ │ │ ├── domexplorer.dtd │ │ │ │ └── domexplorerOverlay.dtd │ │ │ ├── its20/ │ │ │ │ ├── its20.dtd │ │ │ │ ├── its20.properties │ │ │ │ ├── its20Overlay.dtd │ │ │ │ ├── locNoteRule.dtd │ │ │ │ ├── selector.dtd │ │ │ │ ├── termRule.dtd │ │ │ │ └── translateRule.dtd │ │ │ ├── scripteditor/ │ │ │ │ ├── editor.dtd │ │ │ │ ├── scripteditor.dtd │ │ │ │ ├── scripteditor.properties │ │ │ │ └── scripteditorOverlay.dtd │ │ │ └── stylesheets/ │ │ │ ├── editor.dtd │ │ │ ├── stylesheets.dtd │ │ │ └── stylesheetsOverlay.dtd │ │ ├── cssproperties.mn │ │ ├── domexplorer.mn │ │ ├── fs.mn │ │ ├── gfd.mn │ │ ├── its20.mn │ │ ├── markdown.mn │ │ ├── op1.mn │ │ ├── scripteditor.mn │ │ ├── stylesheets.mn │ │ └── tipoftheday.mn │ ├── fr/ │ │ ├── aria.mn │ │ ├── base.mn │ │ ├── bluegriffon/ │ │ │ ├── base/ │ │ │ │ └── locale/ │ │ │ │ ├── bluegriffon/ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ ├── aria.dtd │ │ │ │ │ ├── bluegriffon.dtd │ │ │ │ │ ├── bluegriffon.properties │ │ │ │ │ ├── colourPicker.dtd │ │ │ │ │ ├── convertToTable.dtd │ │ │ │ │ ├── credits.dtd │ │ │ │ │ ├── cssClassPicker.dtd │ │ │ │ │ ├── dictionary.dtd │ │ │ │ │ ├── editStylesheet.dtd │ │ │ │ │ ├── filePicking.dtd │ │ │ │ │ ├── filepickerbutton.dtd │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── html5.properties │ │ │ │ │ ├── insertAnchor.dtd │ │ │ │ │ ├── insertAudio.dtd │ │ │ │ │ ├── insertButton.dtd │ │ │ │ │ ├── insertChars.dtd │ │ │ │ │ ├── insertCommentOrPI.dtd │ │ │ │ │ ├── insertDatalist.dtd │ │ │ │ │ ├── insertFieldset.dtd │ │ │ │ │ ├── insertForm.dtd │ │ │ │ │ ├── insertFormInput.dtd │ │ │ │ │ ├── insertHR.dtd │ │ │ │ │ ├── insertHTML.dtd │ │ │ │ │ ├── insertImage.dtd │ │ │ │ │ ├── insertKeygen.dtd │ │ │ │ │ ├── insertLabel.dtd │ │ │ │ │ ├── insertLink.dtd │ │ │ │ │ ├── insertLink.properties │ │ │ │ │ ├── insertMeter.dtd │ │ │ │ │ ├── insertOutput.dtd │ │ │ │ │ ├── insertProgress.dtd │ │ │ │ │ ├── insertSelect.dtd │ │ │ │ │ ├── insertStylesheet.dtd │ │ │ │ │ ├── insertTOC.dtd │ │ │ │ │ ├── insertTable.dtd │ │ │ │ │ ├── insertTable.properties │ │ │ │ │ ├── insertTextarea.dtd │ │ │ │ │ ├── insertVideo.dtd │ │ │ │ │ ├── insertVideo.properties │ │ │ │ │ ├── language.properties │ │ │ │ │ ├── languages.dtd │ │ │ │ │ ├── listProperties.dtd │ │ │ │ │ ├── markupCleaner.dtd │ │ │ │ │ ├── masterPasswordQuery.properties │ │ │ │ │ ├── media.dtd │ │ │ │ │ ├── media.properties │ │ │ │ │ ├── newDocument.dtd │ │ │ │ │ ├── newPageWizard.dtd │ │ │ │ │ ├── newPageWizard.properties │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ ├── pageProperties.dtd │ │ │ │ │ ├── pagePropertiesPreview.html │ │ │ │ │ ├── panels.dtd │ │ │ │ │ ├── parsingError.dtd │ │ │ │ │ ├── polyglot.dtd │ │ │ │ │ ├── prefs/ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ ├── deactivateLicense.dtd │ │ │ │ │ │ ├── file.dtd │ │ │ │ │ │ ├── general.dtd │ │ │ │ │ │ ├── license.dtd │ │ │ │ │ │ ├── license.properties │ │ │ │ │ │ ├── newPage.dtd │ │ │ │ │ │ ├── osx.dtd │ │ │ │ │ │ ├── shortcuts.dtd │ │ │ │ │ │ ├── shortcuts.properties │ │ │ │ │ │ ├── source.dtd │ │ │ │ │ │ ├── styles.dtd │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── prefs.dtd │ │ │ │ │ ├── propertiesDeck.dtd │ │ │ │ │ ├── rotator.dtd │ │ │ │ │ ├── spellCheck.dtd │ │ │ │ │ ├── spellCheck.properties │ │ │ │ │ ├── structurebar.dtd │ │ │ │ │ ├── svg-edit.properties │ │ │ │ │ ├── tabeditor.dtd │ │ │ │ │ ├── updateAvailable.dtd │ │ │ │ │ └── updates.properties │ │ │ │ └── branding/ │ │ │ │ ├── brand.dtd │ │ │ │ └── brand.properties │ │ │ ├── extensions/ │ │ │ │ ├── fs/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── fs.dtd │ │ │ │ │ ├── fs.properties │ │ │ │ │ └── fsOverlay.dtd │ │ │ │ ├── gfd/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── gfd.dtd │ │ │ │ │ └── gfdOverlay.dtd │ │ │ │ ├── markdown/ │ │ │ │ │ ├── markdown.dtd │ │ │ │ │ └── markdownOverlay.dtd │ │ │ │ ├── op1/ │ │ │ │ │ ├── a11yFirstStep.properties │ │ │ │ │ ├── op1.dtd │ │ │ │ │ └── op1Overlay.dtd │ │ │ │ └── tipoftheday/ │ │ │ │ ├── tipoftheday.dtd │ │ │ │ ├── tipoftheday.rdf │ │ │ │ └── tipofthedayOverlay.dtd │ │ │ └── sidebars/ │ │ │ ├── aria/ │ │ │ │ ├── aria.dtd │ │ │ │ ├── aria.properties │ │ │ │ └── ariaOverlay.dtd │ │ │ ├── cssproperties/ │ │ │ │ ├── backgrounditem.dtd │ │ │ │ ├── backgrounditem.properties │ │ │ │ ├── colorstopitem.dtd │ │ │ │ ├── cssproperties.dtd │ │ │ │ ├── cssproperties.properties │ │ │ │ ├── csspropertiesOverlay.dtd │ │ │ │ ├── editGridTemplate.dtd │ │ │ │ ├── fontFeatures.properties │ │ │ │ ├── griditemposition.dtd │ │ │ │ ├── textshadowitem.dtd │ │ │ │ ├── transformationitem.dtd │ │ │ │ └── transitionitem.dtd │ │ │ ├── domexplorer/ │ │ │ │ ├── domexplorer.dtd │ │ │ │ └── domexplorerOverlay.dtd │ │ │ ├── its20/ │ │ │ │ ├── its20.dtd │ │ │ │ ├── its20.properties │ │ │ │ ├── its20Overlay.dtd │ │ │ │ ├── locNoteRule.dtd │ │ │ │ ├── selector.dtd │ │ │ │ ├── termRule.dtd │ │ │ │ └── translateRule.dtd │ │ │ ├── scripteditor/ │ │ │ │ ├── editor.dtd │ │ │ │ ├── scripteditor.dtd │ │ │ │ ├── scripteditor.properties │ │ │ │ └── scripteditorOverlay.dtd │ │ │ └── stylesheets/ │ │ │ ├── editor.dtd │ │ │ ├── stylesheets.dtd │ │ │ └── stylesheetsOverlay.dtd │ │ ├── cssproperties.mn │ │ ├── domexplorer.mn │ │ ├── fs.mn │ │ ├── gfd.mn │ │ ├── its20.mn │ │ ├── markdown.mn │ │ ├── op1.mn │ │ ├── scripteditor.mn │ │ ├── stylesheets.mn │ │ └── tipoftheday.mn │ ├── gl/ │ │ ├── aria.mn │ │ ├── base.mn │ │ ├── bluegriffon/ │ │ │ ├── base/ │ │ │ │ └── locale/ │ │ │ │ ├── bluegriffon/ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ ├── aria.dtd │ │ │ │ │ ├── bluegriffon.dtd │ │ │ │ │ ├── bluegriffon.properties │ │ │ │ │ ├── colourPicker.dtd │ │ │ │ │ ├── convertToTable.dtd │ │ │ │ │ ├── credits.dtd │ │ │ │ │ ├── cssClassPicker.dtd │ │ │ │ │ ├── dictionary.dtd │ │ │ │ │ ├── editStylesheet.dtd │ │ │ │ │ ├── filePicking.dtd │ │ │ │ │ ├── filepickerbutton.dtd │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── html5.properties │ │ │ │ │ ├── insertAnchor.dtd │ │ │ │ │ ├── insertAudio.dtd │ │ │ │ │ ├── insertButton.dtd │ │ │ │ │ ├── insertChars.dtd │ │ │ │ │ ├── insertCommentOrPI.dtd │ │ │ │ │ ├── insertDatalist.dtd │ │ │ │ │ ├── insertFieldset.dtd │ │ │ │ │ ├── insertForm.dtd │ │ │ │ │ ├── insertFormInput.dtd │ │ │ │ │ ├── insertHR.dtd │ │ │ │ │ ├── insertHTML.dtd │ │ │ │ │ ├── insertImage.dtd │ │ │ │ │ ├── insertKeygen.dtd │ │ │ │ │ ├── insertLabel.dtd │ │ │ │ │ ├── insertLink.dtd │ │ │ │ │ ├── insertLink.properties │ │ │ │ │ ├── insertMeter.dtd │ │ │ │ │ ├── insertOutput.dtd │ │ │ │ │ ├── insertProgress.dtd │ │ │ │ │ ├── insertSelect.dtd │ │ │ │ │ ├── insertStylesheet.dtd │ │ │ │ │ ├── insertTOC.dtd │ │ │ │ │ ├── insertTable.dtd │ │ │ │ │ ├── insertTable.properties │ │ │ │ │ ├── insertTextarea.dtd │ │ │ │ │ ├── insertVideo.dtd │ │ │ │ │ ├── insertVideo.properties │ │ │ │ │ ├── language.properties │ │ │ │ │ ├── languages.dtd │ │ │ │ │ ├── listProperties.dtd │ │ │ │ │ ├── markupCleaner.dtd │ │ │ │ │ ├── masterPasswordQuery.properties │ │ │ │ │ ├── media.dtd │ │ │ │ │ ├── media.properties │ │ │ │ │ ├── newDocument.dtd │ │ │ │ │ ├── newPageWizard.dtd │ │ │ │ │ ├── newPageWizard.properties │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ ├── pageProperties.dtd │ │ │ │ │ ├── pagePropertiesPreview.html │ │ │ │ │ ├── panels.dtd │ │ │ │ │ ├── parsingError.dtd │ │ │ │ │ ├── polyglot.dtd │ │ │ │ │ ├── prefs/ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ ├── deactivateLicense.dtd │ │ │ │ │ │ ├── file.dtd │ │ │ │ │ │ ├── general.dtd │ │ │ │ │ │ ├── license.dtd │ │ │ │ │ │ ├── license.properties │ │ │ │ │ │ ├── newPage.dtd │ │ │ │ │ │ ├── osx.dtd │ │ │ │ │ │ ├── shortcuts.dtd │ │ │ │ │ │ ├── shortcuts.properties │ │ │ │ │ │ ├── source.dtd │ │ │ │ │ │ ├── styles.dtd │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── prefs.dtd │ │ │ │ │ ├── propertiesDeck.dtd │ │ │ │ │ ├── rotator.dtd │ │ │ │ │ ├── spellCheck.dtd │ │ │ │ │ ├── spellCheck.properties │ │ │ │ │ ├── structurebar.dtd │ │ │ │ │ ├── svg-edit.properties │ │ │ │ │ ├── tabeditor.dtd │ │ │ │ │ ├── updateAvailable.dtd │ │ │ │ │ └── updates.properties │ │ │ │ └── branding/ │ │ │ │ ├── brand.dtd │ │ │ │ └── brand.properties │ │ │ ├── extensions/ │ │ │ │ ├── fs/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── fs.dtd │ │ │ │ │ ├── fs.properties │ │ │ │ │ └── fsOverlay.dtd │ │ │ │ ├── gfd/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── gfd.dtd │ │ │ │ │ └── gfdOverlay.dtd │ │ │ │ ├── markdown/ │ │ │ │ │ ├── markdown.dtd │ │ │ │ │ └── markdownOverlay.dtd │ │ │ │ ├── op1/ │ │ │ │ │ ├── a11yFirstStep.properties │ │ │ │ │ ├── op1.dtd │ │ │ │ │ └── op1Overlay.dtd │ │ │ │ └── tipoftheday/ │ │ │ │ ├── tipoftheday.dtd │ │ │ │ ├── tipoftheday.rdf │ │ │ │ └── tipofthedayOverlay.dtd │ │ │ └── sidebars/ │ │ │ ├── aria/ │ │ │ │ ├── aria.dtd │ │ │ │ ├── aria.properties │ │ │ │ └── ariaOverlay.dtd │ │ │ ├── cssproperties/ │ │ │ │ ├── backgrounditem.dtd │ │ │ │ ├── backgrounditem.properties │ │ │ │ ├── colorstopitem.dtd │ │ │ │ ├── cssproperties.dtd │ │ │ │ ├── cssproperties.properties │ │ │ │ ├── csspropertiesOverlay.dtd │ │ │ │ ├── editGridTemplate.dtd │ │ │ │ ├── fontFeatures.properties │ │ │ │ ├── griditemposition.dtd │ │ │ │ ├── textshadowitem.dtd │ │ │ │ ├── transformationitem.dtd │ │ │ │ └── transitionitem.dtd │ │ │ ├── domexplorer/ │ │ │ │ ├── domexplorer.dtd │ │ │ │ └── domexplorerOverlay.dtd │ │ │ ├── its20/ │ │ │ │ ├── its20.dtd │ │ │ │ ├── its20.properties │ │ │ │ ├── its20Overlay.dtd │ │ │ │ ├── locNoteRule.dtd │ │ │ │ ├── selector.dtd │ │ │ │ ├── termRule.dtd │ │ │ │ └── translateRule.dtd │ │ │ ├── scripteditor/ │ │ │ │ ├── editor.dtd │ │ │ │ ├── scripteditor.dtd │ │ │ │ ├── scripteditor.properties │ │ │ │ └── scripteditorOverlay.dtd │ │ │ └── stylesheets/ │ │ │ ├── editor.dtd │ │ │ ├── stylesheets.dtd │ │ │ └── stylesheetsOverlay.dtd │ │ ├── cssproperties.mn │ │ ├── domexplorer.mn │ │ ├── fs.mn │ │ ├── gfd.mn │ │ ├── its20.mn │ │ ├── markdown.mn │ │ ├── op1.mn │ │ ├── scripteditor.mn │ │ ├── stylesheets.mn │ │ └── tipoftheday.mn │ ├── he/ │ │ ├── aria.mn │ │ ├── base.mn │ │ ├── bluegriffon/ │ │ │ ├── base/ │ │ │ │ └── locale/ │ │ │ │ ├── bluegriffon/ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ ├── aria.dtd │ │ │ │ │ ├── bluegriffon.dtd │ │ │ │ │ ├── bluegriffon.properties │ │ │ │ │ ├── colourPicker.dtd │ │ │ │ │ ├── convertToTable.dtd │ │ │ │ │ ├── credits.dtd │ │ │ │ │ ├── cssClassPicker.dtd │ │ │ │ │ ├── dictionary.dtd │ │ │ │ │ ├── editStylesheet.dtd │ │ │ │ │ ├── filePicking.dtd │ │ │ │ │ ├── filepickerbutton.dtd │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── html5.properties │ │ │ │ │ ├── insertAnchor.dtd │ │ │ │ │ ├── insertAudio.dtd │ │ │ │ │ ├── insertButton.dtd │ │ │ │ │ ├── insertChars.dtd │ │ │ │ │ ├── insertCommentOrPI.dtd │ │ │ │ │ ├── insertDatalist.dtd │ │ │ │ │ ├── insertFieldset.dtd │ │ │ │ │ ├── insertForm.dtd │ │ │ │ │ ├── insertFormInput.dtd │ │ │ │ │ ├── insertHR.dtd │ │ │ │ │ ├── insertHTML.dtd │ │ │ │ │ ├── insertImage.dtd │ │ │ │ │ ├── insertKeygen.dtd │ │ │ │ │ ├── insertLabel.dtd │ │ │ │ │ ├── insertLink.dtd │ │ │ │ │ ├── insertLink.properties │ │ │ │ │ ├── insertMeter.dtd │ │ │ │ │ ├── insertOutput.dtd │ │ │ │ │ ├── insertProgress.dtd │ │ │ │ │ ├── insertSelect.dtd │ │ │ │ │ ├── insertStylesheet.dtd │ │ │ │ │ ├── insertTOC.dtd │ │ │ │ │ ├── insertTable.dtd │ │ │ │ │ ├── insertTable.properties │ │ │ │ │ ├── insertTextarea.dtd │ │ │ │ │ ├── insertVideo.dtd │ │ │ │ │ ├── insertVideo.properties │ │ │ │ │ ├── language.properties │ │ │ │ │ ├── languages.dtd │ │ │ │ │ ├── listProperties.dtd │ │ │ │ │ ├── markupCleaner.dtd │ │ │ │ │ ├── masterPasswordQuery.properties │ │ │ │ │ ├── media.dtd │ │ │ │ │ ├── media.properties │ │ │ │ │ ├── newDocument.dtd │ │ │ │ │ ├── newPageWizard.dtd │ │ │ │ │ ├── newPageWizard.properties │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ ├── pageProperties.dtd │ │ │ │ │ ├── pagePropertiesPreview.html │ │ │ │ │ ├── panels.dtd │ │ │ │ │ ├── parsingError.dtd │ │ │ │ │ ├── polyglot.dtd │ │ │ │ │ ├── prefs/ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ ├── deactivateLicense.dtd │ │ │ │ │ │ ├── file.dtd │ │ │ │ │ │ ├── general.dtd │ │ │ │ │ │ ├── license.dtd │ │ │ │ │ │ ├── license.properties │ │ │ │ │ │ ├── newPage.dtd │ │ │ │ │ │ ├── osx.dtd │ │ │ │ │ │ ├── shortcuts.dtd │ │ │ │ │ │ ├── shortcuts.properties │ │ │ │ │ │ ├── source.dtd │ │ │ │ │ │ ├── styles.dtd │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── prefs.dtd │ │ │ │ │ ├── propertiesDeck.dtd │ │ │ │ │ ├── rotator.dtd │ │ │ │ │ ├── spellCheck.dtd │ │ │ │ │ ├── spellCheck.properties │ │ │ │ │ ├── structurebar.dtd │ │ │ │ │ ├── svg-edit.properties │ │ │ │ │ ├── tabeditor.dtd │ │ │ │ │ ├── updateAvailable.dtd │ │ │ │ │ └── updates.properties │ │ │ │ └── branding/ │ │ │ │ ├── brand.dtd │ │ │ │ └── brand.properties │ │ │ ├── extensions/ │ │ │ │ ├── fs/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── fs.dtd │ │ │ │ │ ├── fs.properties │ │ │ │ │ └── fsOverlay.dtd │ │ │ │ ├── gfd/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── gfd.dtd │ │ │ │ │ └── gfdOverlay.dtd │ │ │ │ ├── markdown/ │ │ │ │ │ ├── markdown.dtd │ │ │ │ │ └── markdownOverlay.dtd │ │ │ │ ├── op1/ │ │ │ │ │ ├── a11yFirstStep.properties │ │ │ │ │ ├── op1.dtd │ │ │ │ │ └── op1Overlay.dtd │ │ │ │ └── tipoftheday/ │ │ │ │ ├── tipoftheday.dtd │ │ │ │ ├── tipoftheday.rdf │ │ │ │ └── tipofthedayOverlay.dtd │ │ │ └── sidebars/ │ │ │ ├── aria/ │ │ │ │ ├── aria.dtd │ │ │ │ ├── aria.properties │ │ │ │ └── ariaOverlay.dtd │ │ │ ├── cssproperties/ │ │ │ │ ├── backgrounditem.dtd │ │ │ │ ├── backgrounditem.properties │ │ │ │ ├── colorstopitem.dtd │ │ │ │ ├── cssproperties.dtd │ │ │ │ ├── cssproperties.properties │ │ │ │ ├── csspropertiesOverlay.dtd │ │ │ │ ├── editGridTemplate.dtd │ │ │ │ ├── fontFeatures.properties │ │ │ │ ├── griditemposition.dtd │ │ │ │ ├── textshadowitem.dtd │ │ │ │ ├── transformationitem.dtd │ │ │ │ └── transitionitem.dtd │ │ │ ├── domexplorer/ │ │ │ │ ├── domexplorer.dtd │ │ │ │ └── domexplorerOverlay.dtd │ │ │ ├── its20/ │ │ │ │ ├── its20.dtd │ │ │ │ ├── its20.properties │ │ │ │ ├── its20Overlay.dtd │ │ │ │ ├── locNoteRule.dtd │ │ │ │ ├── selector.dtd │ │ │ │ ├── termRule.dtd │ │ │ │ └── translateRule.dtd │ │ │ ├── scripteditor/ │ │ │ │ ├── editor.dtd │ │ │ │ ├── scripteditor.dtd │ │ │ │ ├── scripteditor.properties │ │ │ │ └── scripteditorOverlay.dtd │ │ │ └── stylesheets/ │ │ │ ├── editor.dtd │ │ │ ├── stylesheets.dtd │ │ │ └── stylesheetsOverlay.dtd │ │ ├── cssproperties.mn │ │ ├── domexplorer.mn │ │ ├── fs.mn │ │ ├── gfd.mn │ │ ├── its20.mn │ │ ├── markdown.mn │ │ ├── op1.mn │ │ ├── scripteditor.mn │ │ ├── stylesheets.mn │ │ └── tipoftheday.mn │ ├── hu/ │ │ ├── aria.mn │ │ ├── base.mn │ │ ├── bluegriffon/ │ │ │ ├── base/ │ │ │ │ └── locale/ │ │ │ │ ├── bluegriffon/ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ ├── aria.dtd │ │ │ │ │ ├── bluegriffon.dtd │ │ │ │ │ ├── bluegriffon.properties │ │ │ │ │ ├── colourPicker.dtd │ │ │ │ │ ├── convertToTable.dtd │ │ │ │ │ ├── credits.dtd │ │ │ │ │ ├── cssClassPicker.dtd │ │ │ │ │ ├── dictionary.dtd │ │ │ │ │ ├── editStylesheet.dtd │ │ │ │ │ ├── filePicking.dtd │ │ │ │ │ ├── filepickerbutton.dtd │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── html5.properties │ │ │ │ │ ├── insertAnchor.dtd │ │ │ │ │ ├── insertAudio.dtd │ │ │ │ │ ├── insertButton.dtd │ │ │ │ │ ├── insertChars.dtd │ │ │ │ │ ├── insertCommentOrPI.dtd │ │ │ │ │ ├── insertDatalist.dtd │ │ │ │ │ ├── insertFieldset.dtd │ │ │ │ │ ├── insertForm.dtd │ │ │ │ │ ├── insertFormInput.dtd │ │ │ │ │ ├── insertHR.dtd │ │ │ │ │ ├── insertHTML.dtd │ │ │ │ │ ├── insertImage.dtd │ │ │ │ │ ├── insertKeygen.dtd │ │ │ │ │ ├── insertLabel.dtd │ │ │ │ │ ├── insertLink.dtd │ │ │ │ │ ├── insertLink.properties │ │ │ │ │ ├── insertMeter.dtd │ │ │ │ │ ├── insertOutput.dtd │ │ │ │ │ ├── insertProgress.dtd │ │ │ │ │ ├── insertSelect.dtd │ │ │ │ │ ├── insertStylesheet.dtd │ │ │ │ │ ├── insertTOC.dtd │ │ │ │ │ ├── insertTable.dtd │ │ │ │ │ ├── insertTable.properties │ │ │ │ │ ├── insertTextarea.dtd │ │ │ │ │ ├── insertVideo.dtd │ │ │ │ │ ├── insertVideo.properties │ │ │ │ │ ├── language.properties │ │ │ │ │ ├── languages.dtd │ │ │ │ │ ├── listProperties.dtd │ │ │ │ │ ├── markupCleaner.dtd │ │ │ │ │ ├── masterPasswordQuery.properties │ │ │ │ │ ├── media.dtd │ │ │ │ │ ├── media.properties │ │ │ │ │ ├── newDocument.dtd │ │ │ │ │ ├── newPageWizard.dtd │ │ │ │ │ ├── newPageWizard.properties │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ ├── pageProperties.dtd │ │ │ │ │ ├── pagePropertiesPreview.html │ │ │ │ │ ├── panels.dtd │ │ │ │ │ ├── parsingError.dtd │ │ │ │ │ ├── polyglot.dtd │ │ │ │ │ ├── prefs/ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ ├── deactivateLicense.dtd │ │ │ │ │ │ ├── file.dtd │ │ │ │ │ │ ├── general.dtd │ │ │ │ │ │ ├── license.dtd │ │ │ │ │ │ ├── license.properties │ │ │ │ │ │ ├── newPage.dtd │ │ │ │ │ │ ├── osx.dtd │ │ │ │ │ │ ├── shortcuts.dtd │ │ │ │ │ │ ├── shortcuts.properties │ │ │ │ │ │ ├── source.dtd │ │ │ │ │ │ ├── styles.dtd │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── prefs.dtd │ │ │ │ │ ├── propertiesDeck.dtd │ │ │ │ │ ├── rotator.dtd │ │ │ │ │ ├── spellCheck.dtd │ │ │ │ │ ├── spellCheck.properties │ │ │ │ │ ├── structurebar.dtd │ │ │ │ │ ├── svg-edit.properties │ │ │ │ │ ├── tabeditor.dtd │ │ │ │ │ ├── updateAvailable.dtd │ │ │ │ │ └── updates.properties │ │ │ │ └── branding/ │ │ │ │ ├── brand.dtd │ │ │ │ └── brand.properties │ │ │ ├── extensions/ │ │ │ │ ├── fs/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── fs.dtd │ │ │ │ │ ├── fs.properties │ │ │ │ │ └── fsOverlay.dtd │ │ │ │ ├── gfd/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── gfd.dtd │ │ │ │ │ └── gfdOverlay.dtd │ │ │ │ ├── markdown/ │ │ │ │ │ ├── markdown.dtd │ │ │ │ │ └── markdownOverlay.dtd │ │ │ │ ├── op1/ │ │ │ │ │ ├── a11yFirstStep.properties │ │ │ │ │ ├── op1.dtd │ │ │ │ │ └── op1Overlay.dtd │ │ │ │ └── tipoftheday/ │ │ │ │ ├── tipoftheday.dtd │ │ │ │ ├── tipoftheday.rdf │ │ │ │ └── tipofthedayOverlay.dtd │ │ │ └── sidebars/ │ │ │ ├── aria/ │ │ │ │ ├── aria.dtd │ │ │ │ ├── aria.properties │ │ │ │ └── ariaOverlay.dtd │ │ │ ├── cssproperties/ │ │ │ │ ├── backgrounditem.dtd │ │ │ │ ├── backgrounditem.properties │ │ │ │ ├── colorstopitem.dtd │ │ │ │ ├── cssproperties.dtd │ │ │ │ ├── cssproperties.properties │ │ │ │ ├── csspropertiesOverlay.dtd │ │ │ │ ├── editGridTemplate.dtd │ │ │ │ ├── fontFeatures.properties │ │ │ │ ├── griditemposition.dtd │ │ │ │ ├── textshadowitem.dtd │ │ │ │ ├── transformationitem.dtd │ │ │ │ └── transitionitem.dtd │ │ │ ├── domexplorer/ │ │ │ │ ├── domexplorer.dtd │ │ │ │ └── domexplorerOverlay.dtd │ │ │ ├── its20/ │ │ │ │ ├── its20.dtd │ │ │ │ ├── its20.properties │ │ │ │ ├── its20Overlay.dtd │ │ │ │ ├── locNoteRule.dtd │ │ │ │ ├── selector.dtd │ │ │ │ ├── termRule.dtd │ │ │ │ └── translateRule.dtd │ │ │ ├── scripteditor/ │ │ │ │ ├── editor.dtd │ │ │ │ ├── scripteditor.dtd │ │ │ │ ├── scripteditor.properties │ │ │ │ └── scripteditorOverlay.dtd │ │ │ └── stylesheets/ │ │ │ ├── editor.dtd │ │ │ ├── stylesheets.dtd │ │ │ └── stylesheetsOverlay.dtd │ │ ├── cssproperties.mn │ │ ├── domexplorer.mn │ │ ├── fs.mn │ │ ├── gfd.mn │ │ ├── its20.mn │ │ ├── markdown.mn │ │ ├── op1.mn │ │ ├── scripteditor.mn │ │ ├── stylesheets.mn │ │ └── tipoftheday.mn │ ├── it/ │ │ ├── aria.mn │ │ ├── base.mn │ │ ├── bluegriffon/ │ │ │ ├── base/ │ │ │ │ └── locale/ │ │ │ │ ├── bluegriffon/ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ ├── aria.dtd │ │ │ │ │ ├── bluegriffon.dtd │ │ │ │ │ ├── bluegriffon.properties │ │ │ │ │ ├── colourPicker.dtd │ │ │ │ │ ├── convertToTable.dtd │ │ │ │ │ ├── credits.dtd │ │ │ │ │ ├── cssClassPicker.dtd │ │ │ │ │ ├── dictionary.dtd │ │ │ │ │ ├── editStylesheet.dtd │ │ │ │ │ ├── filePicking.dtd │ │ │ │ │ ├── filepickerbutton.dtd │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── html5.properties │ │ │ │ │ ├── insertAnchor.dtd │ │ │ │ │ ├── insertAudio.dtd │ │ │ │ │ ├── insertButton.dtd │ │ │ │ │ ├── insertChars.dtd │ │ │ │ │ ├── insertCommentOrPI.dtd │ │ │ │ │ ├── insertDatalist.dtd │ │ │ │ │ ├── insertFieldset.dtd │ │ │ │ │ ├── insertForm.dtd │ │ │ │ │ ├── insertFormInput.dtd │ │ │ │ │ ├── insertHR.dtd │ │ │ │ │ ├── insertHTML.dtd │ │ │ │ │ ├── insertImage.dtd │ │ │ │ │ ├── insertKeygen.dtd │ │ │ │ │ ├── insertLabel.dtd │ │ │ │ │ ├── insertLink.dtd │ │ │ │ │ ├── insertLink.properties │ │ │ │ │ ├── insertMeter.dtd │ │ │ │ │ ├── insertOutput.dtd │ │ │ │ │ ├── insertProgress.dtd │ │ │ │ │ ├── insertSelect.dtd │ │ │ │ │ ├── insertStylesheet.dtd │ │ │ │ │ ├── insertTOC.dtd │ │ │ │ │ ├── insertTable.dtd │ │ │ │ │ ├── insertTable.properties │ │ │ │ │ ├── insertTextarea.dtd │ │ │ │ │ ├── insertVideo.dtd │ │ │ │ │ ├── insertVideo.properties │ │ │ │ │ ├── language.properties │ │ │ │ │ ├── languages.dtd │ │ │ │ │ ├── listProperties.dtd │ │ │ │ │ ├── markupCleaner.dtd │ │ │ │ │ ├── masterPasswordQuery.properties │ │ │ │ │ ├── media.dtd │ │ │ │ │ ├── media.properties │ │ │ │ │ ├── newDocument.dtd │ │ │ │ │ ├── newPageWizard.dtd │ │ │ │ │ ├── newPageWizard.properties │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ ├── pageProperties.dtd │ │ │ │ │ ├── pagePropertiesPreview.html │ │ │ │ │ ├── panels.dtd │ │ │ │ │ ├── parsingError.dtd │ │ │ │ │ ├── polyglot.dtd │ │ │ │ │ ├── prefs/ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ ├── deactivateLicense.dtd │ │ │ │ │ │ ├── file.dtd │ │ │ │ │ │ ├── general.dtd │ │ │ │ │ │ ├── license.dtd │ │ │ │ │ │ ├── license.properties │ │ │ │ │ │ ├── newPage.dtd │ │ │ │ │ │ ├── osx.dtd │ │ │ │ │ │ ├── shortcuts.dtd │ │ │ │ │ │ ├── shortcuts.properties │ │ │ │ │ │ ├── source.dtd │ │ │ │ │ │ ├── styles.dtd │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── prefs.dtd │ │ │ │ │ ├── propertiesDeck.dtd │ │ │ │ │ ├── rotator.dtd │ │ │ │ │ ├── spellCheck.dtd │ │ │ │ │ ├── spellCheck.properties │ │ │ │ │ ├── structurebar.dtd │ │ │ │ │ ├── svg-edit.properties │ │ │ │ │ ├── tabeditor.dtd │ │ │ │ │ ├── updateAvailable.dtd │ │ │ │ │ └── updates.properties │ │ │ │ └── branding/ │ │ │ │ ├── brand.dtd │ │ │ │ └── brand.properties │ │ │ ├── extensions/ │ │ │ │ ├── fs/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── fs.dtd │ │ │ │ │ ├── fs.properties │ │ │ │ │ └── fsOverlay.dtd │ │ │ │ ├── gfd/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── gfd.dtd │ │ │ │ │ └── gfdOverlay.dtd │ │ │ │ ├── markdown/ │ │ │ │ │ ├── markdown.dtd │ │ │ │ │ └── markdownOverlay.dtd │ │ │ │ ├── op1/ │ │ │ │ │ ├── a11yFirstStep.properties │ │ │ │ │ ├── op1.dtd │ │ │ │ │ └── op1Overlay.dtd │ │ │ │ └── tipoftheday/ │ │ │ │ ├── tipoftheday.dtd │ │ │ │ ├── tipoftheday.rdf │ │ │ │ └── tipofthedayOverlay.dtd │ │ │ └── sidebars/ │ │ │ ├── aria/ │ │ │ │ ├── aria.dtd │ │ │ │ ├── aria.properties │ │ │ │ └── ariaOverlay.dtd │ │ │ ├── cssproperties/ │ │ │ │ ├── backgrounditem.dtd │ │ │ │ ├── backgrounditem.properties │ │ │ │ ├── colorstopitem.dtd │ │ │ │ ├── cssproperties.dtd │ │ │ │ ├── cssproperties.properties │ │ │ │ ├── csspropertiesOverlay.dtd │ │ │ │ ├── editGridTemplate.dtd │ │ │ │ ├── fontFeatures.properties │ │ │ │ ├── griditemposition.dtd │ │ │ │ ├── textshadowitem.dtd │ │ │ │ ├── transformationitem.dtd │ │ │ │ └── transitionitem.dtd │ │ │ ├── domexplorer/ │ │ │ │ ├── domexplorer.dtd │ │ │ │ └── domexplorerOverlay.dtd │ │ │ ├── its20/ │ │ │ │ ├── its20.dtd │ │ │ │ ├── its20.properties │ │ │ │ ├── its20Overlay.dtd │ │ │ │ ├── locNoteRule.dtd │ │ │ │ ├── selector.dtd │ │ │ │ ├── termRule.dtd │ │ │ │ └── translateRule.dtd │ │ │ ├── scripteditor/ │ │ │ │ ├── editor.dtd │ │ │ │ ├── scripteditor.dtd │ │ │ │ ├── scripteditor.properties │ │ │ │ └── scripteditorOverlay.dtd │ │ │ └── stylesheets/ │ │ │ ├── editor.dtd │ │ │ ├── stylesheets.dtd │ │ │ └── stylesheetsOverlay.dtd │ │ ├── cssproperties.mn │ │ ├── domexplorer.mn │ │ ├── fs.mn │ │ ├── gfd.mn │ │ ├── its20.mn │ │ ├── markdown.mn │ │ ├── op1.mn │ │ ├── scripteditor.mn │ │ ├── stylesheets.mn │ │ └── tipoftheday.mn │ ├── ja/ │ │ ├── aria.mn │ │ ├── base.mn │ │ ├── bluegriffon/ │ │ │ ├── base/ │ │ │ │ └── locale/ │ │ │ │ ├── bluegriffon/ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ ├── aria.dtd │ │ │ │ │ ├── bluegriffon.dtd │ │ │ │ │ ├── bluegriffon.properties │ │ │ │ │ ├── colourPicker.dtd │ │ │ │ │ ├── convertToTable.dtd │ │ │ │ │ ├── credits.dtd │ │ │ │ │ ├── cssClassPicker.dtd │ │ │ │ │ ├── dictionary.dtd │ │ │ │ │ ├── editStylesheet.dtd │ │ │ │ │ ├── filePicking.dtd │ │ │ │ │ ├── filepickerbutton.dtd │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── html5.properties │ │ │ │ │ ├── insertAnchor.dtd │ │ │ │ │ ├── insertAudio.dtd │ │ │ │ │ ├── insertButton.dtd │ │ │ │ │ ├── insertChars.dtd │ │ │ │ │ ├── insertCommentOrPI.dtd │ │ │ │ │ ├── insertDatalist.dtd │ │ │ │ │ ├── insertFieldset.dtd │ │ │ │ │ ├── insertForm.dtd │ │ │ │ │ ├── insertFormInput.dtd │ │ │ │ │ ├── insertHR.dtd │ │ │ │ │ ├── insertHTML.dtd │ │ │ │ │ ├── insertImage.dtd │ │ │ │ │ ├── insertKeygen.dtd │ │ │ │ │ ├── insertLabel.dtd │ │ │ │ │ ├── insertLink.dtd │ │ │ │ │ ├── insertLink.properties │ │ │ │ │ ├── insertMeter.dtd │ │ │ │ │ ├── insertOutput.dtd │ │ │ │ │ ├── insertProgress.dtd │ │ │ │ │ ├── insertSelect.dtd │ │ │ │ │ ├── insertStylesheet.dtd │ │ │ │ │ ├── insertTOC.dtd │ │ │ │ │ ├── insertTable.dtd │ │ │ │ │ ├── insertTable.properties │ │ │ │ │ ├── insertTextarea.dtd │ │ │ │ │ ├── insertVideo.dtd │ │ │ │ │ ├── insertVideo.properties │ │ │ │ │ ├── language.properties │ │ │ │ │ ├── languages.dtd │ │ │ │ │ ├── listProperties.dtd │ │ │ │ │ ├── markupCleaner.dtd │ │ │ │ │ ├── masterPasswordQuery.properties │ │ │ │ │ ├── media.dtd │ │ │ │ │ ├── media.properties │ │ │ │ │ ├── newDocument.dtd │ │ │ │ │ ├── newPageWizard.dtd │ │ │ │ │ ├── newPageWizard.properties │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ ├── pageProperties.dtd │ │ │ │ │ ├── pagePropertiesPreview.html │ │ │ │ │ ├── panels.dtd │ │ │ │ │ ├── parsingError.dtd │ │ │ │ │ ├── polyglot.dtd │ │ │ │ │ ├── prefs/ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ ├── deactivateLicense.dtd │ │ │ │ │ │ ├── file.dtd │ │ │ │ │ │ ├── general.dtd │ │ │ │ │ │ ├── license.dtd │ │ │ │ │ │ ├── license.properties │ │ │ │ │ │ ├── newPage.dtd │ │ │ │ │ │ ├── osx.dtd │ │ │ │ │ │ ├── shortcuts.dtd │ │ │ │ │ │ ├── shortcuts.properties │ │ │ │ │ │ ├── source.dtd │ │ │ │ │ │ ├── styles.dtd │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── prefs.dtd │ │ │ │ │ ├── propertiesDeck.dtd │ │ │ │ │ ├── rotator.dtd │ │ │ │ │ ├── spellCheck.dtd │ │ │ │ │ ├── spellCheck.properties │ │ │ │ │ ├── structurebar.dtd │ │ │ │ │ ├── svg-edit.properties │ │ │ │ │ ├── tabeditor.dtd │ │ │ │ │ ├── updateAvailable.dtd │ │ │ │ │ └── updates.properties │ │ │ │ └── branding/ │ │ │ │ ├── brand.dtd │ │ │ │ └── brand.properties │ │ │ ├── extensions/ │ │ │ │ ├── fs/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── fs.dtd │ │ │ │ │ ├── fs.properties │ │ │ │ │ └── fsOverlay.dtd │ │ │ │ ├── gfd/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── gfd.dtd │ │ │ │ │ └── gfdOverlay.dtd │ │ │ │ ├── markdown/ │ │ │ │ │ ├── markdown.dtd │ │ │ │ │ └── markdownOverlay.dtd │ │ │ │ ├── op1/ │ │ │ │ │ ├── a11yFirstStep.properties │ │ │ │ │ ├── op1.dtd │ │ │ │ │ └── op1Overlay.dtd │ │ │ │ └── tipoftheday/ │ │ │ │ ├── tipoftheday.dtd │ │ │ │ ├── tipoftheday.rdf │ │ │ │ └── tipofthedayOverlay.dtd │ │ │ └── sidebars/ │ │ │ ├── aria/ │ │ │ │ ├── aria.dtd │ │ │ │ ├── aria.properties │ │ │ │ └── ariaOverlay.dtd │ │ │ ├── cssproperties/ │ │ │ │ ├── backgrounditem.dtd │ │ │ │ ├── backgrounditem.properties │ │ │ │ ├── colorstopitem.dtd │ │ │ │ ├── cssproperties.dtd │ │ │ │ ├── cssproperties.properties │ │ │ │ ├── csspropertiesOverlay.dtd │ │ │ │ ├── editGridTemplate.dtd │ │ │ │ ├── fontFeatures.properties │ │ │ │ ├── griditemposition.dtd │ │ │ │ ├── textshadowitem.dtd │ │ │ │ ├── transformationitem.dtd │ │ │ │ └── transitionitem.dtd │ │ │ ├── domexplorer/ │ │ │ │ ├── domexplorer.dtd │ │ │ │ └── domexplorerOverlay.dtd │ │ │ ├── its20/ │ │ │ │ ├── its20.dtd │ │ │ │ ├── its20.properties │ │ │ │ ├── its20Overlay.dtd │ │ │ │ ├── locNoteRule.dtd │ │ │ │ ├── selector.dtd │ │ │ │ ├── termRule.dtd │ │ │ │ └── translateRule.dtd │ │ │ ├── scripteditor/ │ │ │ │ ├── editor.dtd │ │ │ │ ├── scripteditor.dtd │ │ │ │ ├── scripteditor.properties │ │ │ │ └── scripteditorOverlay.dtd │ │ │ └── stylesheets/ │ │ │ ├── editor.dtd │ │ │ ├── stylesheets.dtd │ │ │ └── stylesheetsOverlay.dtd │ │ ├── cssproperties.mn │ │ ├── domexplorer.mn │ │ ├── fs.mn │ │ ├── gfd.mn │ │ ├── its20.mn │ │ ├── markdown.mn │ │ ├── op1.mn │ │ ├── scripteditor.mn │ │ ├── stylesheets.mn │ │ └── tipoftheday.mn │ ├── ko/ │ │ ├── aria.mn │ │ ├── base.mn │ │ ├── bluegriffon/ │ │ │ ├── base/ │ │ │ │ └── locale/ │ │ │ │ ├── bluegriffon/ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ ├── aria.dtd │ │ │ │ │ ├── bluegriffon.dtd │ │ │ │ │ ├── bluegriffon.properties │ │ │ │ │ ├── colourPicker.dtd │ │ │ │ │ ├── convertToTable.dtd │ │ │ │ │ ├── credits.dtd │ │ │ │ │ ├── cssClassPicker.dtd │ │ │ │ │ ├── dictionary.dtd │ │ │ │ │ ├── editStylesheet.dtd │ │ │ │ │ ├── filePicking.dtd │ │ │ │ │ ├── filepickerbutton.dtd │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── html5.properties │ │ │ │ │ ├── insertAnchor.dtd │ │ │ │ │ ├── insertAudio.dtd │ │ │ │ │ ├── insertButton.dtd │ │ │ │ │ ├── insertChars.dtd │ │ │ │ │ ├── insertCommentOrPI.dtd │ │ │ │ │ ├── insertDatalist.dtd │ │ │ │ │ ├── insertFieldset.dtd │ │ │ │ │ ├── insertForm.dtd │ │ │ │ │ ├── insertFormInput.dtd │ │ │ │ │ ├── insertHR.dtd │ │ │ │ │ ├── insertHTML.dtd │ │ │ │ │ ├── insertImage.dtd │ │ │ │ │ ├── insertKeygen.dtd │ │ │ │ │ ├── insertLabel.dtd │ │ │ │ │ ├── insertLink.dtd │ │ │ │ │ ├── insertLink.properties │ │ │ │ │ ├── insertMeter.dtd │ │ │ │ │ ├── insertOutput.dtd │ │ │ │ │ ├── insertProgress.dtd │ │ │ │ │ ├── insertSelect.dtd │ │ │ │ │ ├── insertStylesheet.dtd │ │ │ │ │ ├── insertTOC.dtd │ │ │ │ │ ├── insertTable.dtd │ │ │ │ │ ├── insertTable.properties │ │ │ │ │ ├── insertTextarea.dtd │ │ │ │ │ ├── insertVideo.dtd │ │ │ │ │ ├── insertVideo.properties │ │ │ │ │ ├── language.properties │ │ │ │ │ ├── languages.dtd │ │ │ │ │ ├── listProperties.dtd │ │ │ │ │ ├── markupCleaner.dtd │ │ │ │ │ ├── masterPasswordQuery.properties │ │ │ │ │ ├── media.dtd │ │ │ │ │ ├── media.properties │ │ │ │ │ ├── newDocument.dtd │ │ │ │ │ ├── newPageWizard.dtd │ │ │ │ │ ├── newPageWizard.properties │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ ├── pageProperties.dtd │ │ │ │ │ ├── pagePropertiesPreview.html │ │ │ │ │ ├── panels.dtd │ │ │ │ │ ├── parsingError.dtd │ │ │ │ │ ├── polyglot.dtd │ │ │ │ │ ├── prefs/ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ ├── deactivateLicense.dtd │ │ │ │ │ │ ├── file.dtd │ │ │ │ │ │ ├── general.dtd │ │ │ │ │ │ ├── license.dtd │ │ │ │ │ │ ├── license.properties │ │ │ │ │ │ ├── newPage.dtd │ │ │ │ │ │ ├── osx.dtd │ │ │ │ │ │ ├── shortcuts.dtd │ │ │ │ │ │ ├── shortcuts.properties │ │ │ │ │ │ ├── source.dtd │ │ │ │ │ │ ├── styles.dtd │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── prefs.dtd │ │ │ │ │ ├── propertiesDeck.dtd │ │ │ │ │ ├── rotator.dtd │ │ │ │ │ ├── spellCheck.dtd │ │ │ │ │ ├── spellCheck.properties │ │ │ │ │ ├── structurebar.dtd │ │ │ │ │ ├── svg-edit.properties │ │ │ │ │ ├── tabeditor.dtd │ │ │ │ │ ├── updateAvailable.dtd │ │ │ │ │ └── updates.properties │ │ │ │ └── branding/ │ │ │ │ ├── brand.dtd │ │ │ │ └── brand.properties │ │ │ ├── extensions/ │ │ │ │ ├── fs/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── fs.dtd │ │ │ │ │ ├── fs.properties │ │ │ │ │ └── fsOverlay.dtd │ │ │ │ ├── gfd/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── gfd.dtd │ │ │ │ │ └── gfdOverlay.dtd │ │ │ │ ├── markdown/ │ │ │ │ │ ├── markdown.dtd │ │ │ │ │ └── markdownOverlay.dtd │ │ │ │ ├── op1/ │ │ │ │ │ ├── a11yFirstStep.properties │ │ │ │ │ ├── op1.dtd │ │ │ │ │ └── op1Overlay.dtd │ │ │ │ └── tipoftheday/ │ │ │ │ ├── tipoftheday.dtd │ │ │ │ ├── tipoftheday.rdf │ │ │ │ └── tipofthedayOverlay.dtd │ │ │ └── sidebars/ │ │ │ ├── aria/ │ │ │ │ ├── aria.dtd │ │ │ │ ├── aria.properties │ │ │ │ └── ariaOverlay.dtd │ │ │ ├── cssproperties/ │ │ │ │ ├── backgrounditem.dtd │ │ │ │ ├── backgrounditem.properties │ │ │ │ ├── colorstopitem.dtd │ │ │ │ ├── cssproperties.dtd │ │ │ │ ├── cssproperties.properties │ │ │ │ ├── csspropertiesOverlay.dtd │ │ │ │ ├── editGridTemplate.dtd │ │ │ │ ├── fontFeatures.properties │ │ │ │ ├── griditemposition.dtd │ │ │ │ ├── textshadowitem.dtd │ │ │ │ ├── transformationitem.dtd │ │ │ │ └── transitionitem.dtd │ │ │ ├── domexplorer/ │ │ │ │ ├── domexplorer.dtd │ │ │ │ └── domexplorerOverlay.dtd │ │ │ ├── its20/ │ │ │ │ ├── its20.dtd │ │ │ │ ├── its20.properties │ │ │ │ ├── its20Overlay.dtd │ │ │ │ ├── locNoteRule.dtd │ │ │ │ ├── selector.dtd │ │ │ │ ├── termRule.dtd │ │ │ │ └── translateRule.dtd │ │ │ ├── scripteditor/ │ │ │ │ ├── editor.dtd │ │ │ │ ├── scripteditor.dtd │ │ │ │ ├── scripteditor.properties │ │ │ │ └── scripteditorOverlay.dtd │ │ │ └── stylesheets/ │ │ │ ├── editor.dtd │ │ │ ├── stylesheets.dtd │ │ │ └── stylesheetsOverlay.dtd │ │ ├── cssproperties.mn │ │ ├── domexplorer.mn │ │ ├── fs.mn │ │ ├── gfd.mn │ │ ├── its20.mn │ │ ├── markdown.mn │ │ ├── op1.mn │ │ ├── scripteditor.mn │ │ ├── stylesheets.mn │ │ └── tipoftheday.mn │ ├── moz.build │ ├── nl/ │ │ ├── aria.mn │ │ ├── base.mn │ │ ├── bluegriffon/ │ │ │ ├── base/ │ │ │ │ └── locale/ │ │ │ │ ├── bluegriffon/ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ ├── aria.dtd │ │ │ │ │ ├── bluegriffon.dtd │ │ │ │ │ ├── bluegriffon.properties │ │ │ │ │ ├── colourPicker.dtd │ │ │ │ │ ├── convertToTable.dtd │ │ │ │ │ ├── credits.dtd │ │ │ │ │ ├── cssClassPicker.dtd │ │ │ │ │ ├── dictionary.dtd │ │ │ │ │ ├── editStylesheet.dtd │ │ │ │ │ ├── filePicking.dtd │ │ │ │ │ ├── filepickerbutton.dtd │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── html5.properties │ │ │ │ │ ├── insertAnchor.dtd │ │ │ │ │ ├── insertAudio.dtd │ │ │ │ │ ├── insertButton.dtd │ │ │ │ │ ├── insertChars.dtd │ │ │ │ │ ├── insertCommentOrPI.dtd │ │ │ │ │ ├── insertDatalist.dtd │ │ │ │ │ ├── insertFieldset.dtd │ │ │ │ │ ├── insertForm.dtd │ │ │ │ │ ├── insertFormInput.dtd │ │ │ │ │ ├── insertHR.dtd │ │ │ │ │ ├── insertHTML.dtd │ │ │ │ │ ├── insertImage.dtd │ │ │ │ │ ├── insertKeygen.dtd │ │ │ │ │ ├── insertLabel.dtd │ │ │ │ │ ├── insertLink.dtd │ │ │ │ │ ├── insertLink.properties │ │ │ │ │ ├── insertMeter.dtd │ │ │ │ │ ├── insertOutput.dtd │ │ │ │ │ ├── insertProgress.dtd │ │ │ │ │ ├── insertSelect.dtd │ │ │ │ │ ├── insertStylesheet.dtd │ │ │ │ │ ├── insertTOC.dtd │ │ │ │ │ ├── insertTable.dtd │ │ │ │ │ ├── insertTable.properties │ │ │ │ │ ├── insertTextarea.dtd │ │ │ │ │ ├── insertVideo.dtd │ │ │ │ │ ├── insertVideo.properties │ │ │ │ │ ├── language.properties │ │ │ │ │ ├── languages.dtd │ │ │ │ │ ├── listProperties.dtd │ │ │ │ │ ├── markupCleaner.dtd │ │ │ │ │ ├── masterPasswordQuery.properties │ │ │ │ │ ├── media.dtd │ │ │ │ │ ├── media.properties │ │ │ │ │ ├── newDocument.dtd │ │ │ │ │ ├── newPageWizard.dtd │ │ │ │ │ ├── newPageWizard.properties │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ ├── pageProperties.dtd │ │ │ │ │ ├── pagePropertiesPreview.html │ │ │ │ │ ├── panels.dtd │ │ │ │ │ ├── parsingError.dtd │ │ │ │ │ ├── polyglot.dtd │ │ │ │ │ ├── prefs/ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ ├── deactivateLicense.dtd │ │ │ │ │ │ ├── file.dtd │ │ │ │ │ │ ├── general.dtd │ │ │ │ │ │ ├── license.dtd │ │ │ │ │ │ ├── license.properties │ │ │ │ │ │ ├── newPage.dtd │ │ │ │ │ │ ├── osx.dtd │ │ │ │ │ │ ├── shortcuts.dtd │ │ │ │ │ │ ├── shortcuts.properties │ │ │ │ │ │ ├── source.dtd │ │ │ │ │ │ ├── styles.dtd │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── prefs.dtd │ │ │ │ │ ├── propertiesDeck.dtd │ │ │ │ │ ├── rotator.dtd │ │ │ │ │ ├── spellCheck.dtd │ │ │ │ │ ├── spellCheck.properties │ │ │ │ │ ├── structurebar.dtd │ │ │ │ │ ├── svg-edit.properties │ │ │ │ │ ├── tabeditor.dtd │ │ │ │ │ ├── updateAvailable.dtd │ │ │ │ │ └── updates.properties │ │ │ │ └── branding/ │ │ │ │ ├── brand.dtd │ │ │ │ └── brand.properties │ │ │ ├── extensions/ │ │ │ │ ├── fs/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── fs.dtd │ │ │ │ │ ├── fs.properties │ │ │ │ │ └── fsOverlay.dtd │ │ │ │ ├── gfd/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── gfd.dtd │ │ │ │ │ └── gfdOverlay.dtd │ │ │ │ ├── markdown/ │ │ │ │ │ ├── markdown.dtd │ │ │ │ │ └── markdownOverlay.dtd │ │ │ │ ├── op1/ │ │ │ │ │ ├── a11yFirstStep.properties │ │ │ │ │ ├── op1.dtd │ │ │ │ │ └── op1Overlay.dtd │ │ │ │ └── tipoftheday/ │ │ │ │ ├── tipoftheday.dtd │ │ │ │ ├── tipoftheday.rdf │ │ │ │ └── tipofthedayOverlay.dtd │ │ │ └── sidebars/ │ │ │ ├── aria/ │ │ │ │ ├── aria.dtd │ │ │ │ ├── aria.properties │ │ │ │ └── ariaOverlay.dtd │ │ │ ├── cssproperties/ │ │ │ │ ├── backgrounditem.dtd │ │ │ │ ├── backgrounditem.properties │ │ │ │ ├── colorstopitem.dtd │ │ │ │ ├── cssproperties.dtd │ │ │ │ ├── cssproperties.properties │ │ │ │ ├── csspropertiesOverlay.dtd │ │ │ │ ├── editGridTemplate.dtd │ │ │ │ ├── fontFeatures.properties │ │ │ │ ├── griditemposition.dtd │ │ │ │ ├── textshadowitem.dtd │ │ │ │ ├── transformationitem.dtd │ │ │ │ └── transitionitem.dtd │ │ │ ├── domexplorer/ │ │ │ │ ├── domexplorer.dtd │ │ │ │ └── domexplorerOverlay.dtd │ │ │ ├── its20/ │ │ │ │ ├── its20.dtd │ │ │ │ ├── its20.properties │ │ │ │ ├── its20Overlay.dtd │ │ │ │ ├── locNoteRule.dtd │ │ │ │ ├── selector.dtd │ │ │ │ ├── termRule.dtd │ │ │ │ └── translateRule.dtd │ │ │ ├── scripteditor/ │ │ │ │ ├── editor.dtd │ │ │ │ ├── scripteditor.dtd │ │ │ │ ├── scripteditor.properties │ │ │ │ └── scripteditorOverlay.dtd │ │ │ └── stylesheets/ │ │ │ ├── editor.dtd │ │ │ ├── stylesheets.dtd │ │ │ └── stylesheetsOverlay.dtd │ │ ├── cssproperties.mn │ │ ├── domexplorer.mn │ │ ├── fs.mn │ │ ├── gfd.mn │ │ ├── its20.mn │ │ ├── markdown.mn │ │ ├── op1.mn │ │ ├── scripteditor.mn │ │ ├── stylesheets.mn │ │ └── tipoftheday.mn │ ├── pl/ │ │ ├── aria.mn │ │ ├── base.mn │ │ ├── bluegriffon/ │ │ │ ├── base/ │ │ │ │ └── locale/ │ │ │ │ ├── bluegriffon/ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ ├── aria.dtd │ │ │ │ │ ├── bluegriffon.dtd │ │ │ │ │ ├── bluegriffon.properties │ │ │ │ │ ├── colourPicker.dtd │ │ │ │ │ ├── convertToTable.dtd │ │ │ │ │ ├── credits.dtd │ │ │ │ │ ├── cssClassPicker.dtd │ │ │ │ │ ├── dictionary.dtd │ │ │ │ │ ├── editStylesheet.dtd │ │ │ │ │ ├── filePicking.dtd │ │ │ │ │ ├── filepickerbutton.dtd │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── html5.properties │ │ │ │ │ ├── insertAnchor.dtd │ │ │ │ │ ├── insertAudio.dtd │ │ │ │ │ ├── insertButton.dtd │ │ │ │ │ ├── insertChars.dtd │ │ │ │ │ ├── insertCommentOrPI.dtd │ │ │ │ │ ├── insertDatalist.dtd │ │ │ │ │ ├── insertFieldset.dtd │ │ │ │ │ ├── insertForm.dtd │ │ │ │ │ ├── insertFormInput.dtd │ │ │ │ │ ├── insertHR.dtd │ │ │ │ │ ├── insertHTML.dtd │ │ │ │ │ ├── insertImage.dtd │ │ │ │ │ ├── insertKeygen.dtd │ │ │ │ │ ├── insertLabel.dtd │ │ │ │ │ ├── insertLink.dtd │ │ │ │ │ ├── insertLink.properties │ │ │ │ │ ├── insertMeter.dtd │ │ │ │ │ ├── insertOutput.dtd │ │ │ │ │ ├── insertProgress.dtd │ │ │ │ │ ├── insertSelect.dtd │ │ │ │ │ ├── insertStylesheet.dtd │ │ │ │ │ ├── insertTOC.dtd │ │ │ │ │ ├── insertTable.dtd │ │ │ │ │ ├── insertTable.properties │ │ │ │ │ ├── insertTextarea.dtd │ │ │ │ │ ├── insertVideo.dtd │ │ │ │ │ ├── insertVideo.properties │ │ │ │ │ ├── language.properties │ │ │ │ │ ├── languages.dtd │ │ │ │ │ ├── listProperties.dtd │ │ │ │ │ ├── markupCleaner.dtd │ │ │ │ │ ├── masterPasswordQuery.properties │ │ │ │ │ ├── media.dtd │ │ │ │ │ ├── media.properties │ │ │ │ │ ├── newDocument.dtd │ │ │ │ │ ├── newPageWizard.dtd │ │ │ │ │ ├── newPageWizard.properties │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ ├── pageProperties.dtd │ │ │ │ │ ├── pagePropertiesPreview.html │ │ │ │ │ ├── panels.dtd │ │ │ │ │ ├── parsingError.dtd │ │ │ │ │ ├── polyglot.dtd │ │ │ │ │ ├── prefs/ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ ├── deactivateLicense.dtd │ │ │ │ │ │ ├── file.dtd │ │ │ │ │ │ ├── general.dtd │ │ │ │ │ │ ├── license.dtd │ │ │ │ │ │ ├── license.properties │ │ │ │ │ │ ├── newPage.dtd │ │ │ │ │ │ ├── osx.dtd │ │ │ │ │ │ ├── shortcuts.dtd │ │ │ │ │ │ ├── shortcuts.properties │ │ │ │ │ │ ├── source.dtd │ │ │ │ │ │ ├── styles.dtd │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── prefs.dtd │ │ │ │ │ ├── propertiesDeck.dtd │ │ │ │ │ ├── rotator.dtd │ │ │ │ │ ├── spellCheck.dtd │ │ │ │ │ ├── spellCheck.properties │ │ │ │ │ ├── structurebar.dtd │ │ │ │ │ ├── svg-edit.properties │ │ │ │ │ ├── tabeditor.dtd │ │ │ │ │ ├── updateAvailable.dtd │ │ │ │ │ └── updates.properties │ │ │ │ └── branding/ │ │ │ │ ├── brand.dtd │ │ │ │ └── brand.properties │ │ │ ├── extensions/ │ │ │ │ ├── fs/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── fs.dtd │ │ │ │ │ ├── fs.properties │ │ │ │ │ └── fsOverlay.dtd │ │ │ │ ├── gfd/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── gfd.dtd │ │ │ │ │ └── gfdOverlay.dtd │ │ │ │ ├── markdown/ │ │ │ │ │ ├── markdown.dtd │ │ │ │ │ └── markdownOverlay.dtd │ │ │ │ ├── op1/ │ │ │ │ │ ├── a11yFirstStep.properties │ │ │ │ │ ├── op1.dtd │ │ │ │ │ └── op1Overlay.dtd │ │ │ │ └── tipoftheday/ │ │ │ │ ├── tipoftheday.dtd │ │ │ │ ├── tipoftheday.rdf │ │ │ │ └── tipofthedayOverlay.dtd │ │ │ └── sidebars/ │ │ │ ├── aria/ │ │ │ │ ├── aria.dtd │ │ │ │ ├── aria.properties │ │ │ │ └── ariaOverlay.dtd │ │ │ ├── cssproperties/ │ │ │ │ ├── backgrounditem.dtd │ │ │ │ ├── backgrounditem.properties │ │ │ │ ├── colorstopitem.dtd │ │ │ │ ├── cssproperties.dtd │ │ │ │ ├── cssproperties.properties │ │ │ │ ├── csspropertiesOverlay.dtd │ │ │ │ ├── editGridTemplate.dtd │ │ │ │ ├── fontFeatures.properties │ │ │ │ ├── griditemposition.dtd │ │ │ │ ├── textshadowitem.dtd │ │ │ │ ├── transformationitem.dtd │ │ │ │ └── transitionitem.dtd │ │ │ ├── domexplorer/ │ │ │ │ ├── domexplorer.dtd │ │ │ │ └── domexplorerOverlay.dtd │ │ │ ├── its20/ │ │ │ │ ├── its20.dtd │ │ │ │ ├── its20.properties │ │ │ │ ├── its20Overlay.dtd │ │ │ │ ├── locNoteRule.dtd │ │ │ │ ├── selector.dtd │ │ │ │ ├── termRule.dtd │ │ │ │ └── translateRule.dtd │ │ │ ├── scripteditor/ │ │ │ │ ├── editor.dtd │ │ │ │ ├── scripteditor.dtd │ │ │ │ ├── scripteditor.properties │ │ │ │ └── scripteditorOverlay.dtd │ │ │ └── stylesheets/ │ │ │ ├── editor.dtd │ │ │ ├── stylesheets.dtd │ │ │ └── stylesheetsOverlay.dtd │ │ ├── cssproperties.mn │ │ ├── domexplorer.mn │ │ ├── fs.mn │ │ ├── gfd.mn │ │ ├── its20.mn │ │ ├── markdown.mn │ │ ├── op1.mn │ │ ├── scripteditor.mn │ │ ├── stylesheets.mn │ │ └── tipoftheday.mn │ ├── pt-PT/ │ │ ├── aria.mn │ │ ├── base/ │ │ │ └── locale/ │ │ │ ├── bluegriffon/ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ ├── aria.dtd │ │ │ │ ├── bluegriffon.dtd │ │ │ │ ├── bluegriffon.properties │ │ │ │ ├── colourPicker.dtd │ │ │ │ ├── convertToTable.dtd │ │ │ │ ├── credits.dtd │ │ │ │ ├── cssClassPicker.dtd │ │ │ │ ├── dictionary.dtd │ │ │ │ ├── editStylesheet.dtd │ │ │ │ ├── filePicking.dtd │ │ │ │ ├── filepickerbutton.dtd │ │ │ │ ├── html5.properties │ │ │ │ ├── insertAnchor.dtd │ │ │ │ ├── insertAudio.dtd │ │ │ │ ├── insertButton.dtd │ │ │ │ ├── insertChars.dtd │ │ │ │ ├── insertDatalist.dtd │ │ │ │ ├── insertFieldset.dtd │ │ │ │ ├── insertForm.dtd │ │ │ │ ├── insertFormInput.dtd │ │ │ │ ├── insertHR.dtd │ │ │ │ ├── insertHTML.dtd │ │ │ │ ├── insertImage.dtd │ │ │ │ ├── insertKeygen.dtd │ │ │ │ ├── insertLabel.dtd │ │ │ │ ├── insertLink.dtd │ │ │ │ ├── insertLink.properties │ │ │ │ ├── insertMeter.dtd │ │ │ │ ├── insertOutput.dtd │ │ │ │ ├── insertProgress.dtd │ │ │ │ ├── insertSelect.dtd │ │ │ │ ├── insertStylesheet.dtd │ │ │ │ ├── insertTable.dtd │ │ │ │ ├── insertTable.properties │ │ │ │ ├── insertTextarea.dtd │ │ │ │ ├── insertVideo.dtd │ │ │ │ ├── insertVideo.properties │ │ │ │ ├── language.properties │ │ │ │ ├── languages.dtd │ │ │ │ ├── markupCleaner.dtd │ │ │ │ ├── masterPasswordQuery.properties │ │ │ │ ├── media.dtd │ │ │ │ ├── media.properties │ │ │ │ ├── newDocument.dtd │ │ │ │ ├── newPageWizard.dtd │ │ │ │ ├── newPageWizard.properties │ │ │ │ ├── openLocation.dtd │ │ │ │ ├── openLocation.properties │ │ │ │ ├── pageProperties.dtd │ │ │ │ ├── pagePropertiesPreview.html │ │ │ │ ├── parsingError.dtd │ │ │ │ ├── prefs/ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ ├── connection.dtd │ │ │ │ │ ├── general.dtd │ │ │ │ │ ├── newPage.dtd │ │ │ │ │ ├── shortcuts.dtd │ │ │ │ │ ├── shortcuts.properties │ │ │ │ │ ├── styles.dtd │ │ │ │ │ └── update.dtd │ │ │ │ ├── prefs.dtd │ │ │ │ ├── propertiesDeck.dtd │ │ │ │ ├── rotator.dtd │ │ │ │ ├── spellCheck.dtd │ │ │ │ ├── spellCheck.properties │ │ │ │ ├── structurebar.dtd │ │ │ │ ├── tabeditor.dtd │ │ │ │ └── updateAvailable.dtd │ │ │ └── branding/ │ │ │ ├── brand.dtd │ │ │ └── brand.properties │ │ ├── base.mn │ │ ├── bluegriffon/ │ │ │ └── sidebars/ │ │ │ └── aria/ │ │ │ ├── aria.dtd │ │ │ ├── aria.properties │ │ │ └── ariaOverlay.dtd │ │ ├── cssproperties.mn │ │ ├── domexplorer.mn │ │ ├── extensions/ │ │ │ ├── fs/ │ │ │ │ ├── addFont.dtd │ │ │ │ ├── fs.dtd │ │ │ │ ├── fs.properties │ │ │ │ └── fsOverlay.dtd │ │ │ ├── gfd/ │ │ │ │ ├── addFont.dtd │ │ │ │ ├── gfd.dtd │ │ │ │ └── gfdOverlay.dtd │ │ │ ├── op1/ │ │ │ │ ├── a11yFirstStep.properties │ │ │ │ ├── op1.dtd │ │ │ │ └── op1Overlay.dtd │ │ │ └── tipoftheday/ │ │ │ ├── tipoftheday.dtd │ │ │ ├── tipoftheday.rdf │ │ │ └── tipofthedayOverlay.dtd │ │ ├── fs.mn │ │ ├── gfd.mn │ │ └── sidebars/ │ │ ├── cssproperties/ │ │ │ ├── backgrounditem.dtd │ │ │ ├── backgrounditem.properties │ │ │ ├── colorstopitem.dtd │ │ │ ├── cssproperties.dtd │ │ │ ├── cssproperties.properties │ │ │ ├── csspropertiesOverlay.dtd │ │ │ ├── griditemposition.dtd │ │ │ ├── textshadowitem.dtd │ │ │ ├── transformationitem.dtd │ │ │ └── transitionitem.dtd │ │ ├── domexplorer/ │ │ │ ├── domexplorer.dtd │ │ │ └── domexplorerOverlay.dtd │ │ └── stylesheets/ │ │ ├── stylesheets.dtd │ │ └── stylesheetsOverlay.dtd │ ├── ru/ │ │ ├── aria.mn │ │ ├── base.mn │ │ ├── bluegriffon/ │ │ │ ├── base/ │ │ │ │ └── locale/ │ │ │ │ ├── bluegriffon/ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ ├── aria.dtd │ │ │ │ │ ├── bluegriffon.dtd │ │ │ │ │ ├── bluegriffon.properties │ │ │ │ │ ├── colourPicker.dtd │ │ │ │ │ ├── convertToTable.dtd │ │ │ │ │ ├── credits.dtd │ │ │ │ │ ├── cssClassPicker.dtd │ │ │ │ │ ├── dictionary.dtd │ │ │ │ │ ├── editStylesheet.dtd │ │ │ │ │ ├── filePicking.dtd │ │ │ │ │ ├── filepickerbutton.dtd │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── html5.properties │ │ │ │ │ ├── insertAnchor.dtd │ │ │ │ │ ├── insertAudio.dtd │ │ │ │ │ ├── insertButton.dtd │ │ │ │ │ ├── insertChars.dtd │ │ │ │ │ ├── insertCommentOrPI.dtd │ │ │ │ │ ├── insertDatalist.dtd │ │ │ │ │ ├── insertFieldset.dtd │ │ │ │ │ ├── insertForm.dtd │ │ │ │ │ ├── insertFormInput.dtd │ │ │ │ │ ├── insertHR.dtd │ │ │ │ │ ├── insertHTML.dtd │ │ │ │ │ ├── insertImage.dtd │ │ │ │ │ ├── insertKeygen.dtd │ │ │ │ │ ├── insertLabel.dtd │ │ │ │ │ ├── insertLink.dtd │ │ │ │ │ ├── insertLink.properties │ │ │ │ │ ├── insertMeter.dtd │ │ │ │ │ ├── insertOutput.dtd │ │ │ │ │ ├── insertProgress.dtd │ │ │ │ │ ├── insertSelect.dtd │ │ │ │ │ ├── insertStylesheet.dtd │ │ │ │ │ ├── insertTOC.dtd │ │ │ │ │ ├── insertTable.dtd │ │ │ │ │ ├── insertTable.properties │ │ │ │ │ ├── insertTextarea.dtd │ │ │ │ │ ├── insertVideo.dtd │ │ │ │ │ ├── insertVideo.properties │ │ │ │ │ ├── language.properties │ │ │ │ │ ├── languages.dtd │ │ │ │ │ ├── listProperties.dtd │ │ │ │ │ ├── markupCleaner.dtd │ │ │ │ │ ├── masterPasswordQuery.properties │ │ │ │ │ ├── media.dtd │ │ │ │ │ ├── media.properties │ │ │ │ │ ├── newDocument.dtd │ │ │ │ │ ├── newPageWizard.dtd │ │ │ │ │ ├── newPageWizard.properties │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ ├── pageProperties.dtd │ │ │ │ │ ├── pagePropertiesPreview.html │ │ │ │ │ ├── panels.dtd │ │ │ │ │ ├── parsingError.dtd │ │ │ │ │ ├── polyglot.dtd │ │ │ │ │ ├── prefs/ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ ├── deactivateLicense.dtd │ │ │ │ │ │ ├── file.dtd │ │ │ │ │ │ ├── general.dtd │ │ │ │ │ │ ├── license.dtd │ │ │ │ │ │ ├── license.properties │ │ │ │ │ │ ├── newPage.dtd │ │ │ │ │ │ ├── osx.dtd │ │ │ │ │ │ ├── prefs.dtd │ │ │ │ │ │ ├── shortcuts.dtd │ │ │ │ │ │ ├── shortcuts.properties │ │ │ │ │ │ ├── source.dtd │ │ │ │ │ │ ├── styles.dtd │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── prefs.dtd │ │ │ │ │ ├── propertiesDeck.dtd │ │ │ │ │ ├── rotator.dtd │ │ │ │ │ ├── spellCheck.dtd │ │ │ │ │ ├── spellCheck.properties │ │ │ │ │ ├── structurebar.dtd │ │ │ │ │ ├── svg-edit.properties │ │ │ │ │ ├── tabeditor.dtd │ │ │ │ │ ├── updateAvailable.dtd │ │ │ │ │ └── updates.properties │ │ │ │ └── branding/ │ │ │ │ ├── brand.dtd │ │ │ │ └── brand.properties │ │ │ ├── extensions/ │ │ │ │ ├── fs/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── fs.dtd │ │ │ │ │ ├── fs.properties │ │ │ │ │ └── fsOverlay.dtd │ │ │ │ ├── gfd/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── gfd.dtd │ │ │ │ │ └── gfdOverlay.dtd │ │ │ │ ├── markdown/ │ │ │ │ │ ├── markdown.dtd │ │ │ │ │ └── markdownOverlay.dtd │ │ │ │ ├── op1/ │ │ │ │ │ ├── a11yFirstStep.properties │ │ │ │ │ ├── op1.dtd │ │ │ │ │ └── op1Overlay.dtd │ │ │ │ └── tipoftheday/ │ │ │ │ ├── tipoftheday.dtd │ │ │ │ ├── tipoftheday.rdf │ │ │ │ └── tipofthedayOverlay.dtd │ │ │ └── sidebars/ │ │ │ ├── aria/ │ │ │ │ ├── aria.dtd │ │ │ │ ├── aria.properties │ │ │ │ └── ariaOverlay.dtd │ │ │ ├── cssproperties/ │ │ │ │ ├── backgrounditem.dtd │ │ │ │ ├── backgrounditem.properties │ │ │ │ ├── colorstopitem.dtd │ │ │ │ ├── cssproperties.dtd │ │ │ │ ├── cssproperties.properties │ │ │ │ ├── csspropertiesOverlay.dtd │ │ │ │ ├── editGridTemplate.dtd │ │ │ │ ├── fontFeatures.properties │ │ │ │ ├── griditemposition.dtd │ │ │ │ ├── textshadowitem.dtd │ │ │ │ ├── transformationitem.dtd │ │ │ │ └── transitionitem.dtd │ │ │ ├── domexplorer/ │ │ │ │ ├── domexplorer.dtd │ │ │ │ └── domexplorerOverlay.dtd │ │ │ ├── its20/ │ │ │ │ ├── its20.dtd │ │ │ │ ├── its20.properties │ │ │ │ ├── its20Overlay.dtd │ │ │ │ ├── locNoteRule.dtd │ │ │ │ ├── selector.dtd │ │ │ │ ├── termRule.dtd │ │ │ │ └── translateRule.dtd │ │ │ ├── scripteditor/ │ │ │ │ ├── editor.dtd │ │ │ │ ├── scripteditor.dtd │ │ │ │ ├── scripteditor.properties │ │ │ │ └── scripteditorOverlay.dtd │ │ │ └── stylesheets/ │ │ │ ├── editor.dtd │ │ │ ├── stylesheets.dtd │ │ │ └── stylesheetsOverlay.dtd │ │ ├── cssproperties.mn │ │ ├── domexplorer.mn │ │ ├── fs.mn │ │ ├── gfd.mn │ │ ├── its20.mn │ │ ├── markdown.mn │ │ ├── op1.mn │ │ ├── scripteditor.mn │ │ ├── stylesheets.mn │ │ └── tipoftheday.mn │ ├── sl/ │ │ ├── aria.mn │ │ ├── base.mn │ │ ├── bluegriffon/ │ │ │ ├── base/ │ │ │ │ └── locale/ │ │ │ │ ├── bluegriffon/ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ ├── aria.dtd │ │ │ │ │ ├── bluegriffon.dtd │ │ │ │ │ ├── bluegriffon.properties │ │ │ │ │ ├── colourPicker.dtd │ │ │ │ │ ├── convertToTable.dtd │ │ │ │ │ ├── credits.dtd │ │ │ │ │ ├── cssClassPicker.dtd │ │ │ │ │ ├── dictionary.dtd │ │ │ │ │ ├── editStylesheet.dtd │ │ │ │ │ ├── filePicking.dtd │ │ │ │ │ ├── filepickerbutton.dtd │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── html5.properties │ │ │ │ │ ├── insertAnchor.dtd │ │ │ │ │ ├── insertAudio.dtd │ │ │ │ │ ├── insertButton.dtd │ │ │ │ │ ├── insertChars.dtd │ │ │ │ │ ├── insertCommentOrPI.dtd │ │ │ │ │ ├── insertDatalist.dtd │ │ │ │ │ ├── insertFieldset.dtd │ │ │ │ │ ├── insertForm.dtd │ │ │ │ │ ├── insertFormInput.dtd │ │ │ │ │ ├── insertHR.dtd │ │ │ │ │ ├── insertHTML.dtd │ │ │ │ │ ├── insertImage.dtd │ │ │ │ │ ├── insertKeygen.dtd │ │ │ │ │ ├── insertLabel.dtd │ │ │ │ │ ├── insertLink.dtd │ │ │ │ │ ├── insertLink.properties │ │ │ │ │ ├── insertMeter.dtd │ │ │ │ │ ├── insertOutput.dtd │ │ │ │ │ ├── insertProgress.dtd │ │ │ │ │ ├── insertSelect.dtd │ │ │ │ │ ├── insertStylesheet.dtd │ │ │ │ │ ├── insertTOC.dtd │ │ │ │ │ ├── insertTable.dtd │ │ │ │ │ ├── insertTable.properties │ │ │ │ │ ├── insertTextarea.dtd │ │ │ │ │ ├── insertVideo.dtd │ │ │ │ │ ├── insertVideo.properties │ │ │ │ │ ├── language.properties │ │ │ │ │ ├── languages.dtd │ │ │ │ │ ├── listProperties.dtd │ │ │ │ │ ├── markupCleaner.dtd │ │ │ │ │ ├── masterPasswordQuery.properties │ │ │ │ │ ├── media.dtd │ │ │ │ │ ├── media.properties │ │ │ │ │ ├── newDocument.dtd │ │ │ │ │ ├── newPageWizard.dtd │ │ │ │ │ ├── newPageWizard.properties │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ ├── pageProperties.dtd │ │ │ │ │ ├── pagePropertiesPreview.html │ │ │ │ │ ├── panels.dtd │ │ │ │ │ ├── parsingError.dtd │ │ │ │ │ ├── polyglot.dtd │ │ │ │ │ ├── prefs/ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ ├── deactivateLicense.dtd │ │ │ │ │ │ ├── file.dtd │ │ │ │ │ │ ├── general.dtd │ │ │ │ │ │ ├── license.dtd │ │ │ │ │ │ ├── license.properties │ │ │ │ │ │ ├── newPage.dtd │ │ │ │ │ │ ├── osx.dtd │ │ │ │ │ │ ├── shortcuts.dtd │ │ │ │ │ │ ├── shortcuts.properties │ │ │ │ │ │ ├── source.dtd │ │ │ │ │ │ ├── styles.dtd │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── prefs.dtd │ │ │ │ │ ├── propertiesDeck.dtd │ │ │ │ │ ├── rotator.dtd │ │ │ │ │ ├── spellCheck.dtd │ │ │ │ │ ├── spellCheck.properties │ │ │ │ │ ├── structurebar.dtd │ │ │ │ │ ├── svg-edit.properties │ │ │ │ │ ├── tabeditor.dtd │ │ │ │ │ ├── updateAvailable.dtd │ │ │ │ │ └── updates.properties │ │ │ │ └── branding/ │ │ │ │ ├── brand.dtd │ │ │ │ └── brand.properties │ │ │ ├── extensions/ │ │ │ │ ├── fs/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── fs.dtd │ │ │ │ │ ├── fs.properties │ │ │ │ │ └── fsOverlay.dtd │ │ │ │ ├── gfd/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── gfd.dtd │ │ │ │ │ └── gfdOverlay.dtd │ │ │ │ ├── markdown/ │ │ │ │ │ ├── markdown.dtd │ │ │ │ │ └── markdownOverlay.dtd │ │ │ │ ├── op1/ │ │ │ │ │ ├── a11yFirstStep.properties │ │ │ │ │ ├── op1.dtd │ │ │ │ │ └── op1Overlay.dtd │ │ │ │ └── tipoftheday/ │ │ │ │ ├── tipoftheday.dtd │ │ │ │ ├── tipoftheday.rdf │ │ │ │ └── tipofthedayOverlay.dtd │ │ │ └── sidebars/ │ │ │ ├── aria/ │ │ │ │ ├── aria.dtd │ │ │ │ ├── aria.properties │ │ │ │ └── ariaOverlay.dtd │ │ │ ├── cssproperties/ │ │ │ │ ├── backgrounditem.dtd │ │ │ │ ├── backgrounditem.properties │ │ │ │ ├── colorstopitem.dtd │ │ │ │ ├── cssproperties.dtd │ │ │ │ ├── cssproperties.properties │ │ │ │ ├── csspropertiesOverlay.dtd │ │ │ │ ├── editGridTemplate.dtd │ │ │ │ ├── fontFeatures.properties │ │ │ │ ├── griditemposition.dtd │ │ │ │ ├── textshadowitem.dtd │ │ │ │ ├── transformationitem.dtd │ │ │ │ └── transitionitem.dtd │ │ │ ├── domexplorer/ │ │ │ │ ├── domexplorer.dtd │ │ │ │ └── domexplorerOverlay.dtd │ │ │ ├── its20/ │ │ │ │ ├── its20.dtd │ │ │ │ ├── its20.properties │ │ │ │ ├── its20Overlay.dtd │ │ │ │ ├── locNoteRule.dtd │ │ │ │ ├── selector.dtd │ │ │ │ ├── termRule.dtd │ │ │ │ └── translateRule.dtd │ │ │ ├── scripteditor/ │ │ │ │ ├── editor.dtd │ │ │ │ ├── scripteditor.dtd │ │ │ │ ├── scripteditor.properties │ │ │ │ └── scripteditorOverlay.dtd │ │ │ └── stylesheets/ │ │ │ ├── editor.dtd │ │ │ ├── stylesheets.dtd │ │ │ └── stylesheetsOverlay.dtd │ │ ├── cssproperties.mn │ │ ├── domexplorer.mn │ │ ├── fs.mn │ │ ├── gfd.mn │ │ ├── its20.mn │ │ ├── markdown.mn │ │ ├── op1.mn │ │ ├── scripteditor.mn │ │ ├── stylesheets.mn │ │ └── tipoftheday.mn │ ├── sr/ │ │ ├── aria.mn │ │ ├── base.mn │ │ ├── bluegriffon/ │ │ │ ├── base/ │ │ │ │ └── locale/ │ │ │ │ ├── bluegriffon/ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ ├── aria.dtd │ │ │ │ │ ├── bluegriffon.dtd │ │ │ │ │ ├── bluegriffon.properties │ │ │ │ │ ├── colourPicker.dtd │ │ │ │ │ ├── convertToTable.dtd │ │ │ │ │ ├── credits.dtd │ │ │ │ │ ├── cssClassPicker.dtd │ │ │ │ │ ├── dictionary.dtd │ │ │ │ │ ├── editStylesheet.dtd │ │ │ │ │ ├── filePicking.dtd │ │ │ │ │ ├── filepickerbutton.dtd │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── html5.properties │ │ │ │ │ ├── insertAnchor.dtd │ │ │ │ │ ├── insertAudio.dtd │ │ │ │ │ ├── insertButton.dtd │ │ │ │ │ ├── insertChars.dtd │ │ │ │ │ ├── insertCommentOrPI.dtd │ │ │ │ │ ├── insertDatalist.dtd │ │ │ │ │ ├── insertFieldset.dtd │ │ │ │ │ ├── insertForm.dtd │ │ │ │ │ ├── insertFormInput.dtd │ │ │ │ │ ├── insertHR.dtd │ │ │ │ │ ├── insertHTML.dtd │ │ │ │ │ ├── insertImage.dtd │ │ │ │ │ ├── insertKeygen.dtd │ │ │ │ │ ├── insertLabel.dtd │ │ │ │ │ ├── insertLink.dtd │ │ │ │ │ ├── insertLink.properties │ │ │ │ │ ├── insertMeter.dtd │ │ │ │ │ ├── insertOutput.dtd │ │ │ │ │ ├── insertProgress.dtd │ │ │ │ │ ├── insertSelect.dtd │ │ │ │ │ ├── insertStylesheet.dtd │ │ │ │ │ ├── insertTOC.dtd │ │ │ │ │ ├── insertTable.dtd │ │ │ │ │ ├── insertTable.properties │ │ │ │ │ ├── insertTextarea.dtd │ │ │ │ │ ├── insertVideo.dtd │ │ │ │ │ ├── insertVideo.properties │ │ │ │ │ ├── language.properties │ │ │ │ │ ├── languages.dtd │ │ │ │ │ ├── listProperties.dtd │ │ │ │ │ ├── markupCleaner.dtd │ │ │ │ │ ├── masterPasswordQuery.properties │ │ │ │ │ ├── media.dtd │ │ │ │ │ ├── media.properties │ │ │ │ │ ├── newDocument.dtd │ │ │ │ │ ├── newPageWizard.dtd │ │ │ │ │ ├── newPageWizard.properties │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ ├── pageProperties.dtd │ │ │ │ │ ├── pagePropertiesPreview.html │ │ │ │ │ ├── panels.dtd │ │ │ │ │ ├── parsingError.dtd │ │ │ │ │ ├── polyglot.dtd │ │ │ │ │ ├── prefs/ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ ├── deactivateLicense.dtd │ │ │ │ │ │ ├── file.dtd │ │ │ │ │ │ ├── general.dtd │ │ │ │ │ │ ├── license.dtd │ │ │ │ │ │ ├── license.properties │ │ │ │ │ │ ├── newPage.dtd │ │ │ │ │ │ ├── osx.dtd │ │ │ │ │ │ ├── shortcuts.dtd │ │ │ │ │ │ ├── shortcuts.properties │ │ │ │ │ │ ├── source.dtd │ │ │ │ │ │ ├── styles.dtd │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── prefs.dtd │ │ │ │ │ ├── propertiesDeck.dtd │ │ │ │ │ ├── rotator.dtd │ │ │ │ │ ├── spellCheck.dtd │ │ │ │ │ ├── spellCheck.properties │ │ │ │ │ ├── structurebar.dtd │ │ │ │ │ ├── svg-edit.properties │ │ │ │ │ ├── tabeditor.dtd │ │ │ │ │ ├── updateAvailable.dtd │ │ │ │ │ └── updates.properties │ │ │ │ └── branding/ │ │ │ │ ├── brand.dtd │ │ │ │ └── brand.properties │ │ │ ├── extensions/ │ │ │ │ ├── fs/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── fs.dtd │ │ │ │ │ ├── fs.properties │ │ │ │ │ └── fsOverlay.dtd │ │ │ │ ├── gfd/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── gfd.dtd │ │ │ │ │ └── gfdOverlay.dtd │ │ │ │ ├── markdown/ │ │ │ │ │ ├── markdown.dtd │ │ │ │ │ └── markdownOverlay.dtd │ │ │ │ ├── op1/ │ │ │ │ │ ├── a11yFirstStep.properties │ │ │ │ │ ├── op1.dtd │ │ │ │ │ └── op1Overlay.dtd │ │ │ │ └── tipoftheday/ │ │ │ │ ├── tipoftheday.dtd │ │ │ │ ├── tipoftheday.rdf │ │ │ │ └── tipofthedayOverlay.dtd │ │ │ └── sidebars/ │ │ │ ├── aria/ │ │ │ │ ├── aria.dtd │ │ │ │ ├── aria.properties │ │ │ │ └── ariaOverlay.dtd │ │ │ ├── cssproperties/ │ │ │ │ ├── backgrounditem.dtd │ │ │ │ ├── backgrounditem.properties │ │ │ │ ├── colorstopitem.dtd │ │ │ │ ├── cssproperties.dtd │ │ │ │ ├── cssproperties.properties │ │ │ │ ├── csspropertiesOverlay.dtd │ │ │ │ ├── editGridTemplate.dtd │ │ │ │ ├── fontFeatures.properties │ │ │ │ ├── foo │ │ │ │ ├── griditemposition.dtd │ │ │ │ ├── textshadowitem.dtd │ │ │ │ ├── transformationitem.dtd │ │ │ │ └── transitionitem.dtd │ │ │ ├── domexplorer/ │ │ │ │ ├── domexplorer.dtd │ │ │ │ └── domexplorerOverlay.dtd │ │ │ ├── its20/ │ │ │ │ ├── its20.dtd │ │ │ │ ├── its20.properties │ │ │ │ ├── its20Overlay.dtd │ │ │ │ ├── locNoteRule.dtd │ │ │ │ ├── selector.dtd │ │ │ │ ├── termRule.dtd │ │ │ │ └── translateRule.dtd │ │ │ ├── scripteditor/ │ │ │ │ ├── editor.dtd │ │ │ │ ├── scripteditor.dtd │ │ │ │ ├── scripteditor.properties │ │ │ │ └── scripteditorOverlay.dtd │ │ │ └── stylesheets/ │ │ │ ├── editor.dtd │ │ │ ├── stylesheets.dtd │ │ │ └── stylesheetsOverlay.dtd │ │ ├── cssproperties.mn │ │ ├── domexplorer.mn │ │ ├── fs.mn │ │ ├── gfd.mn │ │ ├── its20.mn │ │ ├── markdown.mn │ │ ├── op1.mn │ │ ├── scripteditor.mn │ │ ├── stylesheets.mn │ │ └── tipoftheday.mn │ ├── sv-SE/ │ │ ├── aria.mn │ │ ├── base.mn │ │ ├── bluegriffon/ │ │ │ ├── base/ │ │ │ │ └── locale/ │ │ │ │ ├── bluegriffon/ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ ├── aria.dtd │ │ │ │ │ ├── bluegriffon.dtd │ │ │ │ │ ├── bluegriffon.properties │ │ │ │ │ ├── colourPicker.dtd │ │ │ │ │ ├── convertToTable.dtd │ │ │ │ │ ├── credits.dtd │ │ │ │ │ ├── cssClassPicker.dtd │ │ │ │ │ ├── dictionary.dtd │ │ │ │ │ ├── editStylesheet.dtd │ │ │ │ │ ├── filePicking.dtd │ │ │ │ │ ├── filepickerbutton.dtd │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── html5.properties │ │ │ │ │ ├── insertAnchor.dtd │ │ │ │ │ ├── insertAudio.dtd │ │ │ │ │ ├── insertButton.dtd │ │ │ │ │ ├── insertChars.dtd │ │ │ │ │ ├── insertCommentOrPI.dtd │ │ │ │ │ ├── insertDatalist.dtd │ │ │ │ │ ├── insertFieldset.dtd │ │ │ │ │ ├── insertForm.dtd │ │ │ │ │ ├── insertFormInput.dtd │ │ │ │ │ ├── insertHR.dtd │ │ │ │ │ ├── insertHTML.dtd │ │ │ │ │ ├── insertImage.dtd │ │ │ │ │ ├── insertKeygen.dtd │ │ │ │ │ ├── insertLabel.dtd │ │ │ │ │ ├── insertLink.dtd │ │ │ │ │ ├── insertLink.properties │ │ │ │ │ ├── insertMeter.dtd │ │ │ │ │ ├── insertOutput.dtd │ │ │ │ │ ├── insertProgress.dtd │ │ │ │ │ ├── insertSelect.dtd │ │ │ │ │ ├── insertStylesheet.dtd │ │ │ │ │ ├── insertTOC.dtd │ │ │ │ │ ├── insertTable.dtd │ │ │ │ │ ├── insertTable.properties │ │ │ │ │ ├── insertTextarea.dtd │ │ │ │ │ ├── insertVideo.dtd │ │ │ │ │ ├── insertVideo.properties │ │ │ │ │ ├── language.properties │ │ │ │ │ ├── languages.dtd │ │ │ │ │ ├── listProperties.dtd │ │ │ │ │ ├── markupCleaner.dtd │ │ │ │ │ ├── masterPasswordQuery.properties │ │ │ │ │ ├── media.dtd │ │ │ │ │ ├── media.properties │ │ │ │ │ ├── newDocument.dtd │ │ │ │ │ ├── newPageWizard.dtd │ │ │ │ │ ├── newPageWizard.properties │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ ├── pageProperties.dtd │ │ │ │ │ ├── pagePropertiesPreview.html │ │ │ │ │ ├── panels.dtd │ │ │ │ │ ├── parsingError.dtd │ │ │ │ │ ├── polyglot.dtd │ │ │ │ │ ├── prefs/ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ ├── deactivateLicense.dtd │ │ │ │ │ │ ├── file.dtd │ │ │ │ │ │ ├── general.dtd │ │ │ │ │ │ ├── license.dtd │ │ │ │ │ │ ├── license.properties │ │ │ │ │ │ ├── newPage.dtd │ │ │ │ │ │ ├── osx.dtd │ │ │ │ │ │ ├── shortcuts.dtd │ │ │ │ │ │ ├── shortcuts.properties │ │ │ │ │ │ ├── source.dtd │ │ │ │ │ │ ├── styles.dtd │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── prefs.dtd │ │ │ │ │ ├── propertiesDeck.dtd │ │ │ │ │ ├── rotator.dtd │ │ │ │ │ ├── spellCheck.dtd │ │ │ │ │ ├── spellCheck.properties │ │ │ │ │ ├── structurebar.dtd │ │ │ │ │ ├── svg-edit.properties │ │ │ │ │ ├── tabeditor.dtd │ │ │ │ │ ├── updateAvailable.dtd │ │ │ │ │ └── updates.properties │ │ │ │ └── branding/ │ │ │ │ ├── brand.dtd │ │ │ │ └── brand.properties │ │ │ ├── extensions/ │ │ │ │ ├── fs/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── fs.dtd │ │ │ │ │ ├── fs.properties │ │ │ │ │ └── fsOverlay.dtd │ │ │ │ ├── gfd/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── gfd.dtd │ │ │ │ │ └── gfdOverlay.dtd │ │ │ │ ├── markdown/ │ │ │ │ │ ├── markdown.dtd │ │ │ │ │ └── markdownOverlay.dtd │ │ │ │ ├── op1/ │ │ │ │ │ ├── a11yFirstStep.properties │ │ │ │ │ ├── op1.dtd │ │ │ │ │ └── op1Overlay.dtd │ │ │ │ └── tipoftheday/ │ │ │ │ ├── tipoftheday.dtd │ │ │ │ ├── tipoftheday.rdf │ │ │ │ └── tipofthedayOverlay.dtd │ │ │ └── sidebars/ │ │ │ ├── aria/ │ │ │ │ ├── aria.dtd │ │ │ │ ├── aria.properties │ │ │ │ └── ariaOverlay.dtd │ │ │ ├── cssproperties/ │ │ │ │ ├── backgrounditem.dtd │ │ │ │ ├── backgrounditem.properties │ │ │ │ ├── colorstopitem.dtd │ │ │ │ ├── cssproperties.dtd │ │ │ │ ├── cssproperties.properties │ │ │ │ ├── csspropertiesOverlay.dtd │ │ │ │ ├── editGridTemplate.dtd │ │ │ │ ├── fontFeatures.properties │ │ │ │ ├── griditemposition.dtd │ │ │ │ ├── textshadowitem.dtd │ │ │ │ ├── transformationitem.dtd │ │ │ │ └── transitionitem.dtd │ │ │ ├── domexplorer/ │ │ │ │ ├── domexplorer.dtd │ │ │ │ └── domexplorerOverlay.dtd │ │ │ ├── its20/ │ │ │ │ ├── its20.dtd │ │ │ │ ├── its20.properties │ │ │ │ ├── its20Overlay.dtd │ │ │ │ ├── locNoteRule.dtd │ │ │ │ ├── selector.dtd │ │ │ │ ├── termRule.dtd │ │ │ │ └── translateRule.dtd │ │ │ ├── scripteditor/ │ │ │ │ ├── editor.dtd │ │ │ │ ├── scripteditor.dtd │ │ │ │ ├── scripteditor.properties │ │ │ │ └── scripteditorOverlay.dtd │ │ │ └── stylesheets/ │ │ │ ├── editor.dtd │ │ │ ├── stylesheets.dtd │ │ │ └── stylesheetsOverlay.dtd │ │ ├── cssproperties.mn │ │ ├── domexplorer.mn │ │ ├── fs.mn │ │ ├── gfd.mn │ │ ├── its20.mn │ │ ├── markdown.mn │ │ ├── op1.mn │ │ ├── scripteditor.mn │ │ ├── stylesheets.mn │ │ └── tipoftheday.mn │ ├── zh-CN/ │ │ ├── aria.mn │ │ ├── base.mn │ │ ├── bluegriffon/ │ │ │ ├── base/ │ │ │ │ └── locale/ │ │ │ │ ├── bluegriffon/ │ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ │ ├── aria.dtd │ │ │ │ │ ├── bluegriffon.dtd │ │ │ │ │ ├── bluegriffon.properties │ │ │ │ │ ├── colourPicker.dtd │ │ │ │ │ ├── convertToTable.dtd │ │ │ │ │ ├── credits.dtd │ │ │ │ │ ├── cssClassPicker.dtd │ │ │ │ │ ├── dictionary.dtd │ │ │ │ │ ├── editStylesheet.dtd │ │ │ │ │ ├── filePicking.dtd │ │ │ │ │ ├── filepickerbutton.dtd │ │ │ │ │ ├── findbar.dtd │ │ │ │ │ ├── html5.properties │ │ │ │ │ ├── insertAnchor.dtd │ │ │ │ │ ├── insertAudio.dtd │ │ │ │ │ ├── insertButton.dtd │ │ │ │ │ ├── insertChars.dtd │ │ │ │ │ ├── insertCommentOrPI.dtd │ │ │ │ │ ├── insertDatalist.dtd │ │ │ │ │ ├── insertFieldset.dtd │ │ │ │ │ ├── insertForm.dtd │ │ │ │ │ ├── insertFormInput.dtd │ │ │ │ │ ├── insertHR.dtd │ │ │ │ │ ├── insertHTML.dtd │ │ │ │ │ ├── insertImage.dtd │ │ │ │ │ ├── insertKeygen.dtd │ │ │ │ │ ├── insertLabel.dtd │ │ │ │ │ ├── insertLink.dtd │ │ │ │ │ ├── insertLink.properties │ │ │ │ │ ├── insertMeter.dtd │ │ │ │ │ ├── insertOutput.dtd │ │ │ │ │ ├── insertProgress.dtd │ │ │ │ │ ├── insertSelect.dtd │ │ │ │ │ ├── insertStylesheet.dtd │ │ │ │ │ ├── insertTOC.dtd │ │ │ │ │ ├── insertTable.dtd │ │ │ │ │ ├── insertTable.properties │ │ │ │ │ ├── insertTextarea.dtd │ │ │ │ │ ├── insertVideo.dtd │ │ │ │ │ ├── insertVideo.properties │ │ │ │ │ ├── language.properties │ │ │ │ │ ├── languages.dtd │ │ │ │ │ ├── listProperties.dtd │ │ │ │ │ ├── markupCleaner.dtd │ │ │ │ │ ├── masterPasswordQuery.properties │ │ │ │ │ ├── media.dtd │ │ │ │ │ ├── media.properties │ │ │ │ │ ├── newDocument.dtd │ │ │ │ │ ├── newPageWizard.dtd │ │ │ │ │ ├── newPageWizard.properties │ │ │ │ │ ├── openLocation.dtd │ │ │ │ │ ├── openLocation.properties │ │ │ │ │ ├── pageProperties.dtd │ │ │ │ │ ├── pagePropertiesPreview.html │ │ │ │ │ ├── panels.dtd │ │ │ │ │ ├── parsingError.dtd │ │ │ │ │ ├── polyglot.dtd │ │ │ │ │ ├── prefs/ │ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ │ ├── connection.dtd │ │ │ │ │ │ ├── deactivateLicense.dtd │ │ │ │ │ │ ├── file.dtd │ │ │ │ │ │ ├── general.dtd │ │ │ │ │ │ ├── license.dtd │ │ │ │ │ │ ├── license.properties │ │ │ │ │ │ ├── newPage.dtd │ │ │ │ │ │ ├── osx.dtd │ │ │ │ │ │ ├── shortcuts.dtd │ │ │ │ │ │ ├── shortcuts.properties │ │ │ │ │ │ ├── source.dtd │ │ │ │ │ │ ├── styles.dtd │ │ │ │ │ │ ├── update.dtd │ │ │ │ │ │ └── update.properties │ │ │ │ │ ├── prefs.dtd │ │ │ │ │ ├── propertiesDeck.dtd │ │ │ │ │ ├── rotator.dtd │ │ │ │ │ ├── spellCheck.dtd │ │ │ │ │ ├── spellCheck.properties │ │ │ │ │ ├── structurebar.dtd │ │ │ │ │ ├── svg-edit.properties │ │ │ │ │ ├── tabeditor.dtd │ │ │ │ │ ├── updateAvailable.dtd │ │ │ │ │ └── updates.properties │ │ │ │ └── branding/ │ │ │ │ ├── brand.dtd │ │ │ │ └── brand.properties │ │ │ ├── extensions/ │ │ │ │ ├── fs/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── fs.dtd │ │ │ │ │ ├── fs.properties │ │ │ │ │ └── fsOverlay.dtd │ │ │ │ ├── gfd/ │ │ │ │ │ ├── addFont.dtd │ │ │ │ │ ├── gfd.dtd │ │ │ │ │ └── gfdOverlay.dtd │ │ │ │ ├── markdown/ │ │ │ │ │ ├── markdown.dtd │ │ │ │ │ └── markdownOverlay.dtd │ │ │ │ ├── op1/ │ │ │ │ │ ├── a11yFirstStep.properties │ │ │ │ │ ├── op1.dtd │ │ │ │ │ └── op1Overlay.dtd │ │ │ │ └── tipoftheday/ │ │ │ │ ├── tipoftheday.dtd │ │ │ │ ├── tipoftheday.rdf │ │ │ │ └── tipofthedayOverlay.dtd │ │ │ └── sidebars/ │ │ │ ├── aria/ │ │ │ │ ├── aria.dtd │ │ │ │ ├── aria.properties │ │ │ │ └── ariaOverlay.dtd │ │ │ ├── cssproperties/ │ │ │ │ ├── backgrounditem.dtd │ │ │ │ ├── backgrounditem.properties │ │ │ │ ├── colorstopitem.dtd │ │ │ │ ├── cssproperties.dtd │ │ │ │ ├── cssproperties.properties │ │ │ │ ├── csspropertiesOverlay.dtd │ │ │ │ ├── editGridTemplate.dtd │ │ │ │ ├── fontFeatures.properties │ │ │ │ ├── griditemposition.dtd │ │ │ │ ├── textshadowitem.dtd │ │ │ │ ├── transformationitem.dtd │ │ │ │ └── transitionitem.dtd │ │ │ ├── domexplorer/ │ │ │ │ ├── domexplorer.dtd │ │ │ │ └── domexplorerOverlay.dtd │ │ │ ├── its20/ │ │ │ │ ├── its20.dtd │ │ │ │ ├── its20.properties │ │ │ │ ├── its20Overlay.dtd │ │ │ │ ├── locNoteRule.dtd │ │ │ │ ├── selector.dtd │ │ │ │ ├── termRule.dtd │ │ │ │ └── translateRule.dtd │ │ │ ├── scripteditor/ │ │ │ │ ├── editor.dtd │ │ │ │ ├── scripteditor.dtd │ │ │ │ ├── scripteditor.properties │ │ │ │ └── scripteditorOverlay.dtd │ │ │ └── stylesheets/ │ │ │ ├── editor.dtd │ │ │ ├── stylesheets.dtd │ │ │ └── stylesheetsOverlay.dtd │ │ ├── cssproperties.mn │ │ ├── domexplorer.mn │ │ ├── fs.mn │ │ ├── gfd.mn │ │ ├── its20.mn │ │ ├── markdown.mn │ │ ├── op1.mn │ │ ├── scripteditor.mn │ │ ├── stylesheets.mn │ │ └── tipoftheday.mn │ └── zh-TW/ │ ├── aria.mn │ ├── base.mn │ ├── bluegriffon/ │ │ ├── base/ │ │ │ └── locale/ │ │ │ ├── bluegriffon/ │ │ │ │ ├── aboutDialog.dtd │ │ │ │ ├── aria.dtd │ │ │ │ ├── bluegriffon.dtd │ │ │ │ ├── bluegriffon.properties │ │ │ │ ├── colourPicker.dtd │ │ │ │ ├── convertToTable.dtd │ │ │ │ ├── credits.dtd │ │ │ │ ├── cssClassPicker.dtd │ │ │ │ ├── dictionary.dtd │ │ │ │ ├── editStylesheet.dtd │ │ │ │ ├── filePicking.dtd │ │ │ │ ├── filepickerbutton.dtd │ │ │ │ ├── findbar.dtd │ │ │ │ ├── html5.properties │ │ │ │ ├── insertAnchor.dtd │ │ │ │ ├── insertAudio.dtd │ │ │ │ ├── insertButton.dtd │ │ │ │ ├── insertChars.dtd │ │ │ │ ├── insertCommentOrPI.dtd │ │ │ │ ├── insertDatalist.dtd │ │ │ │ ├── insertFieldset.dtd │ │ │ │ ├── insertForm.dtd │ │ │ │ ├── insertFormInput.dtd │ │ │ │ ├── insertHR.dtd │ │ │ │ ├── insertHTML.dtd │ │ │ │ ├── insertImage.dtd │ │ │ │ ├── insertKeygen.dtd │ │ │ │ ├── insertLabel.dtd │ │ │ │ ├── insertLink.dtd │ │ │ │ ├── insertLink.properties │ │ │ │ ├── insertMeter.dtd │ │ │ │ ├── insertOutput.dtd │ │ │ │ ├── insertProgress.dtd │ │ │ │ ├── insertSelect.dtd │ │ │ │ ├── insertStylesheet.dtd │ │ │ │ ├── insertTOC.dtd │ │ │ │ ├── insertTable.dtd │ │ │ │ ├── insertTable.properties │ │ │ │ ├── insertTextarea.dtd │ │ │ │ ├── insertVideo.dtd │ │ │ │ ├── insertVideo.properties │ │ │ │ ├── language.properties │ │ │ │ ├── languages.dtd │ │ │ │ ├── listProperties.dtd │ │ │ │ ├── markupCleaner.dtd │ │ │ │ ├── masterPasswordQuery.properties │ │ │ │ ├── media.dtd │ │ │ │ ├── media.properties │ │ │ │ ├── newDocument.dtd │ │ │ │ ├── newPageWizard.dtd │ │ │ │ ├── newPageWizard.properties │ │ │ │ ├── openLocation.dtd │ │ │ │ ├── openLocation.properties │ │ │ │ ├── pageProperties.dtd │ │ │ │ ├── pagePropertiesPreview.html │ │ │ │ ├── panels.dtd │ │ │ │ ├── parsingError.dtd │ │ │ │ ├── polyglot.dtd │ │ │ │ ├── prefs/ │ │ │ │ │ ├── advanced.dtd │ │ │ │ │ ├── connection.dtd │ │ │ │ │ ├── deactivateLicense.dtd │ │ │ │ │ ├── file.dtd │ │ │ │ │ ├── general.dtd │ │ │ │ │ ├── license.dtd │ │ │ │ │ ├── license.properties │ │ │ │ │ ├── newPage.dtd │ │ │ │ │ ├── osx.dtd │ │ │ │ │ ├── shortcuts.dtd │ │ │ │ │ ├── shortcuts.properties │ │ │ │ │ ├── source.dtd │ │ │ │ │ ├── styles.dtd │ │ │ │ │ ├── update.dtd │ │ │ │ │ └── update.properties │ │ │ │ ├── prefs.dtd │ │ │ │ ├── propertiesDeck.dtd │ │ │ │ ├── rotator.dtd │ │ │ │ ├── spellCheck.dtd │ │ │ │ ├── spellCheck.properties │ │ │ │ ├── structurebar.dtd │ │ │ │ ├── svg-edit.properties │ │ │ │ ├── tabeditor.dtd │ │ │ │ ├── updateAvailable.dtd │ │ │ │ └── updates.properties │ │ │ └── branding/ │ │ │ ├── brand.dtd │ │ │ └── brand.properties │ │ ├── extensions/ │ │ │ ├── fs/ │ │ │ │ ├── addFont.dtd │ │ │ │ ├── fs.dtd │ │ │ │ ├── fs.properties │ │ │ │ └── fsOverlay.dtd │ │ │ ├── gfd/ │ │ │ │ ├── addFont.dtd │ │ │ │ ├── gfd.dtd │ │ │ │ └── gfdOverlay.dtd │ │ │ ├── markdown/ │ │ │ │ ├── markdown.dtd │ │ │ │ └── markdownOverlay.dtd │ │ │ ├── op1/ │ │ │ │ ├── a11yFirstStep.properties │ │ │ │ ├── op1.dtd │ │ │ │ └── op1Overlay.dtd │ │ │ └── tipoftheday/ │ │ │ ├── tipoftheday.dtd │ │ │ ├── tipoftheday.rdf │ │ │ └── tipofthedayOverlay.dtd │ │ └── sidebars/ │ │ ├── aria/ │ │ │ ├── aria.dtd │ │ │ ├── aria.properties │ │ │ └── ariaOverlay.dtd │ │ ├── cssproperties/ │ │ │ ├── backgrounditem.dtd │ │ │ ├── backgrounditem.properties │ │ │ ├── colorstopitem.dtd │ │ │ ├── cssproperties.dtd │ │ │ ├── cssproperties.properties │ │ │ ├── csspropertiesOverlay.dtd │ │ │ ├── editGridTemplate.dtd │ │ │ ├── fontFeatures.properties │ │ │ ├── griditemposition.dtd │ │ │ ├── textshadowitem.dtd │ │ │ ├── transformationitem.dtd │ │ │ └── transitionitem.dtd │ │ ├── domexplorer/ │ │ │ ├── domexplorer.dtd │ │ │ └── domexplorerOverlay.dtd │ │ ├── its20/ │ │ │ ├── its20.dtd │ │ │ ├── its20.properties │ │ │ ├── its20Overlay.dtd │ │ │ ├── locNoteRule.dtd │ │ │ ├── selector.dtd │ │ │ ├── termRule.dtd │ │ │ └── translateRule.dtd │ │ ├── scripteditor/ │ │ │ ├── editor.dtd │ │ │ ├── scripteditor.dtd │ │ │ ├── scripteditor.properties │ │ │ └── scripteditorOverlay.dtd │ │ └── stylesheets/ │ │ ├── editor.dtd │ │ ├── stylesheets.dtd │ │ └── stylesheetsOverlay.dtd │ ├── cssproperties.mn │ ├── domexplorer.mn │ ├── fs.mn │ ├── gfd.mn │ ├── its20.mn │ ├── markdown.mn │ ├── op1.mn │ ├── scripteditor.mn │ ├── stylesheets.mn │ └── tipoftheday.mn ├── makefiles.sh ├── modules/ │ ├── Makefile.in │ ├── bgQuit.jsm │ ├── colourPickerHelper.jsm │ ├── cssHelper.jsm │ ├── cssInspector.jsm │ ├── cssProperties.jsm │ ├── editorHelper.jsm │ ├── fileChanges.jsm │ ├── fileHelper.jsm │ ├── filePicker.jsm │ ├── fireFtp.jsm │ ├── handlersManager.jsm │ ├── l10nHelper.jsm │ ├── moz.build │ ├── printHelper.jsm │ ├── projectManager.jsm │ ├── prompterHelper.jsm │ ├── screens.jsm │ ├── unicodeHelper.jsm │ └── urlHelper.jsm ├── moz.build ├── moz.configure ├── sidebars/ │ ├── Makefile.in │ ├── aria/ │ │ ├── Makefile.in │ │ ├── content/ │ │ │ ├── aria-properties.js │ │ │ ├── aria-roles.js │ │ │ ├── aria.js │ │ │ ├── aria.xml │ │ │ ├── aria.xul │ │ │ ├── ariaOverlay.xul │ │ │ └── foo.js │ │ ├── jar.mn │ │ ├── jar.mn.in │ │ ├── moz.build │ │ └── skin/ │ │ └── aria.css │ ├── cssproperties/ │ │ ├── Makefile.in │ │ ├── content/ │ │ │ ├── all.js │ │ │ ├── all.xul │ │ │ ├── backgrounditem.xml │ │ │ ├── bezier.js │ │ │ ├── borders.js │ │ │ ├── borders.xul │ │ │ ├── boxshadowitem.xml │ │ │ ├── colors.js │ │ │ ├── colors.xul │ │ │ ├── colorstopitem.xml │ │ │ ├── columns.js │ │ │ ├── columns.xul │ │ │ ├── common.js │ │ │ ├── cssproperties.js │ │ │ ├── cssproperties.xul │ │ │ ├── csspropertiesOverlay.xul │ │ │ ├── cssproperty.xml │ │ │ ├── editGridTemplateEntry.js │ │ │ ├── editGridTemplateEntry.xul │ │ │ ├── flexbox.js │ │ │ ├── flexbox.xul │ │ │ ├── fonts.js │ │ │ ├── fonts.xul │ │ │ ├── general.js │ │ │ ├── general.xul │ │ │ ├── geometry.js │ │ │ ├── geometry.xul │ │ │ ├── griditemposition.xml │ │ │ ├── griditems.js │ │ │ ├── griditems.xul │ │ │ ├── grids.js │ │ │ ├── grids.xul │ │ │ ├── images.js │ │ │ ├── images.xul │ │ │ ├── lists.js │ │ │ ├── lists.xul │ │ │ ├── misc.js │ │ │ ├── misc.xul │ │ │ ├── popups.xul │ │ │ ├── position.js │ │ │ ├── position.xul │ │ │ ├── shadows.js │ │ │ ├── shadows.xul │ │ │ ├── styles/ │ │ │ │ ├── cssproperties.css │ │ │ │ ├── flexbox.inc │ │ │ │ ├── float.inc │ │ │ │ ├── font-style.inc │ │ │ │ ├── font-weight.inc │ │ │ │ ├── text-align.inc │ │ │ │ ├── text-decoration.inc │ │ │ │ └── writing-mode.inc │ │ │ ├── tables.js │ │ │ ├── tables.xul │ │ │ ├── textshadowitem.xml │ │ │ ├── transformationitem.xml │ │ │ ├── transforms.js │ │ │ ├── transforms.xul │ │ │ ├── transitionitem.xml │ │ │ ├── transitions.js │ │ │ ├── transitions.xul │ │ │ ├── variables.js │ │ │ └── variables.xul │ │ ├── jar.mn │ │ ├── jar.mn.in │ │ ├── moz.build │ │ └── skin/ │ │ ├── backgrounditem.css │ │ ├── borders.css │ │ ├── colors.css │ │ ├── colorstopitem.css │ │ ├── columns.css │ │ ├── cssproperties.css │ │ ├── flexbox.css │ │ ├── general.css │ │ ├── geometry.css │ │ ├── griditems.css │ │ ├── grids.css │ │ ├── position.css │ │ ├── shadows.css │ │ ├── transformationitem.css │ │ ├── transforms.css │ │ ├── transitionitem.css │ │ └── transitions.css │ ├── domexplorer/ │ │ ├── Makefile.in │ │ ├── content/ │ │ │ ├── context.js │ │ │ ├── domexplorer.js │ │ │ ├── domexplorer.xul │ │ │ ├── domexplorerOverlay.js │ │ │ └── domexplorerOverlay.xul │ │ ├── jar.mn │ │ ├── jar.mn.in │ │ ├── moz.build │ │ └── skin/ │ │ └── domexplorer.css │ ├── its20/ │ │ ├── Makefile.in │ │ ├── content/ │ │ │ ├── common.js │ │ │ ├── global.js │ │ │ ├── global.xul │ │ │ ├── implemented.js │ │ │ ├── its20.js │ │ │ ├── its20.xul │ │ │ ├── its20Overlay.js │ │ │ ├── its20Overlay.xul │ │ │ ├── localAttrs/ │ │ │ │ ├── annotatorsRef.js │ │ │ │ ├── annotatorsRef.xul │ │ │ │ ├── locNote.js │ │ │ │ ├── locNote.xul │ │ │ │ ├── popups1.xul │ │ │ │ ├── term.js │ │ │ │ ├── term.xul │ │ │ │ ├── translate.js │ │ │ │ └── translate.xul │ │ │ └── ruleDialogs/ │ │ │ ├── common.js │ │ │ ├── locNoteRule.js │ │ │ ├── locNoteRule.xul │ │ │ ├── selector.js │ │ │ ├── selector.xul │ │ │ ├── termRule.js │ │ │ ├── termRule.xul │ │ │ ├── translateRule.js │ │ │ └── translateRule.xul │ │ ├── jar.mn │ │ ├── jar.mn.in │ │ ├── locale/ │ │ │ └── dummy │ │ ├── moz.build │ │ └── skin/ │ │ └── its20.css │ ├── moz.build │ ├── scripteditor/ │ │ ├── Makefile.in │ │ ├── content/ │ │ │ ├── editor.js │ │ │ ├── editor.xul │ │ │ ├── scripteditor.js │ │ │ ├── scripteditor.xul │ │ │ ├── scripteditorOverlay.js │ │ │ └── scripteditorOverlay.xul │ │ ├── jar.mn │ │ ├── jar.mn.in │ │ ├── moz.build │ │ └── skin/ │ │ ├── editor.css │ │ └── scripteditor.css │ └── stylesheets/ │ ├── Makefile.in │ ├── content/ │ │ ├── editor.js │ │ ├── editor.xul │ │ ├── stylesheets.js │ │ ├── stylesheets.xul │ │ ├── stylesheetsOverlay.js │ │ └── stylesheetsOverlay.xul │ ├── jar.mn │ ├── jar.mn.in │ ├── moz.build │ └── skin/ │ ├── editor.css │ └── stylesheets.css ├── src/ │ ├── Makefile.in │ ├── diOSIntegration.mac/ │ │ ├── Makefile.in │ │ ├── diIOSIntegration.idl │ │ ├── diOSIntegration.h │ │ ├── diOSIntegration.mm │ │ ├── diOSIntegrationCIID.h │ │ ├── diOSIntegrationFactory.cpp │ │ ├── dibadge.manifest │ │ └── moz.build │ ├── dibgutils/ │ │ ├── Makefile.in │ │ ├── diIAttrChangedTxn.idl │ │ ├── diIAttrNameChangedTxn.idl │ │ ├── diIChangeFileStylesheetTxn.idl │ │ ├── diIInnerHtmlChangedTxn.idl │ │ ├── diINodeInsertionTxn.idl │ │ ├── diIRemoveAttributeNSTxn.idl │ │ ├── diISetAttributeNSTxn.idl │ │ ├── diIStyleAttrChangeTxn.idl │ │ ├── diITextNodeChangedTxn.idl │ │ └── moz.build │ └── moz.build └── themes/ ├── Makefile.in ├── mac/ │ ├── Makefile.in │ ├── classic/ │ │ ├── aboutDialog.css │ │ ├── black.css │ │ ├── bluegriffon.css │ │ ├── bluegriffonDialogs.css │ │ ├── colourPicker.css │ │ ├── ebm/ │ │ │ ├── ebm.css │ │ │ ├── filepicker.css │ │ │ ├── metadata2.css │ │ │ └── metadata3.css │ │ ├── ecolorpicker.css │ │ ├── extensionsOverlay.css │ │ ├── formatToolbar.css │ │ ├── inContext.css │ │ ├── insertAudio.css │ │ ├── insertChars.css │ │ ├── insertImage.css │ │ ├── insertTable.css │ │ ├── insertVideo.css │ │ ├── languages.css │ │ ├── listboxBg.css │ │ ├── mainToolbar.css │ │ ├── medium.css │ │ ├── newPageWizard.css │ │ ├── pageProperties.css │ │ ├── panels/ │ │ │ ├── deckedPanelsTabs.css │ │ │ └── floatingpanel.css │ │ ├── prefs/ │ │ │ └── prefs.css │ │ ├── rotator.css │ │ ├── rulers.css │ │ ├── scrollbars.css │ │ ├── structurebar.css │ │ └── tabeditor.css │ ├── jar.mn │ └── moz.build ├── moz.build ├── win/ │ ├── Makefile.in │ ├── classic/ │ │ ├── aboutDialog.css │ │ ├── black/ │ │ │ └── menulist.css │ │ ├── black.css │ │ ├── bluegriffon-aero.css │ │ ├── bluegriffon.css │ │ ├── bluegriffonDialogs.css │ │ ├── colourPicker.css │ │ ├── ebm/ │ │ │ ├── ebm.css │ │ │ ├── filepicker.css │ │ │ ├── metadata2.css │ │ │ └── metadata3.css │ │ ├── ecolorpicker.css │ │ ├── extensionsOverlay.css │ │ ├── formatToolbar.css │ │ ├── inContext.css │ │ ├── insertAudio.css │ │ ├── insertChars.css │ │ ├── insertImage.css │ │ ├── insertTable.css │ │ ├── insertVideo.css │ │ ├── languages.css │ │ ├── listboxBg.css │ │ ├── mainToolbar.css │ │ ├── medium.css │ │ ├── newPageWizard.css │ │ ├── pageProperties.css │ │ ├── panels/ │ │ │ ├── deckedPanelsTabs.css │ │ │ └── floatingpanel.css │ │ ├── prefs/ │ │ │ └── prefs.css │ │ ├── rotator.css │ │ ├── rulers.css │ │ ├── scrollbars.css │ │ ├── structurebar.css │ │ ├── tabeditor.css │ │ └── titlebar.css │ ├── jar.mn │ └── moz.build └── win.old/ ├── Makefile.in ├── classic/ │ ├── aboutDialog.css │ ├── bluegriffon.css │ ├── bluegriffonDialogs.css │ ├── colourPicker.css │ ├── ecolorpicker.css │ ├── formatToolbar.css │ ├── inContext.css │ ├── insertAudio.css │ ├── insertChars.css │ ├── insertImage.css │ ├── insertTable.css │ ├── insertVideo.css │ ├── languages.css │ ├── listboxBg.css │ ├── mainToolbar.css │ ├── medium.css │ ├── newPageWizard.css │ ├── pageProperties.css │ ├── panels/ │ │ ├── deckedPanelsTabs.css │ │ └── floatingpanel.css │ ├── prefs/ │ │ └── prefs.css │ ├── rotator.css │ ├── rulers.css │ ├── structurebar.css │ └── tabeditor.css ├── jar.mn └── moz.build ================================================ FILE CONTENTS ================================================ ================================================ FILE: LICENSE ================================================ Mozilla Public License, version 2.0 1. Definitions 1.1. "Contributor" means each individual or legal entity that creates, contributes to the creation of, or owns Covered Software. 1.2. "Contributor Version" means the combination of the Contributions of others (if any) used by a Contributor and that particular Contributor's Contribution. 1.3. "Contribution" means Covered Software of a particular Contributor. 1.4. "Covered Software" means Source Code Form to which the initial Contributor has attached the notice in Exhibit A, the Executable Form of such Source Code Form, and Modifications of such Source Code Form, in each case including portions thereof. 1.5. "Incompatible With Secondary Licenses" means a. that the initial Contributor has attached the notice described in Exhibit B to the Covered Software; or b. that the Covered Software was made available under the terms of version 1.1 or earlier of the License, but not also under the terms of a Secondary License. 1.6. "Executable Form" means any form of the work other than Source Code Form. 1.7. "Larger Work" means a work that combines Covered Software with other material, in a separate file or files, that is not Covered Software. 1.8. "License" means this document. 1.9. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently, any and all of the rights conveyed by this License. 1.10. "Modifications" means any of the following: a. any file in Source Code Form that results from an addition to, deletion from, or modification of the contents of Covered Software; or b. any new file in Source Code Form that contains any Covered Software. 1.11. "Patent Claims" of a Contributor means any patent claim(s), including without limitation, method, process, and apparatus claims, in any patent Licensable by such Contributor that would be infringed, but for the grant of the License, by the making, using, selling, offering for sale, having made, import, or transfer of either its Contributions or its Contributor Version. 1.12. "Secondary License" means either the GNU General Public License, Version 2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General Public License, Version 3.0, or any later versions of those licenses. 1.13. "Source Code Form" means the form of the work preferred for making modifications. 1.14. "You" (or "Your") means an individual or a legal entity exercising rights under this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. 2. License Grants and Conditions 2.1. Grants Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: a. under intellectual property rights (other than patent or trademark) Licensable by such Contributor to use, reproduce, make available, modify, display, perform, distribute, and otherwise exploit its Contributions, either on an unmodified basis, with Modifications, or as part of a Larger Work; and b. under Patent Claims of such Contributor to make, use, sell, offer for sale, have made, import, and otherwise transfer either its Contributions or its Contributor Version. 2.2. Effective Date The licenses granted in Section 2.1 with respect to any Contribution become effective for each Contribution on the date the Contributor first distributes such Contribution. 2.3. Limitations on Grant Scope The licenses granted in this Section 2 are the only rights granted under this License. No additional rights or licenses will be implied from the distribution or licensing of Covered Software under this License. Notwithstanding Section 2.1(b) above, no patent license is granted by a Contributor: a. for any code that a Contributor has removed from Covered Software; or b. for infringements caused by: (i) Your and any other third party's modifications of Covered Software, or (ii) the combination of its Contributions with other software (except as part of its Contributor Version); or c. under Patent Claims infringed by Covered Software in the absence of its Contributions. This License does not grant any rights in the trademarks, service marks, or logos of any Contributor (except as may be necessary to comply with the notice requirements in Section 3.4). 2.4. Subsequent Licenses No Contributor makes additional grants as a result of Your choice to distribute the Covered Software under a subsequent version of this License (see Section 10.2) or under the terms of a Secondary License (if permitted under the terms of Section 3.3). 2.5. Representation Each Contributor represents that the Contributor believes its Contributions are its original creation(s) or it has sufficient rights to grant the rights to its Contributions conveyed by this License. 2.6. Fair Use This License is not intended to limit any rights You have under applicable copyright doctrines of fair use, fair dealing, or other equivalents. 2.7. Conditions Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in Section 2.1. 3. Responsibilities 3.1. Distribution of Source Form All distribution of Covered Software in Source Code Form, including any Modifications that You create or to which You contribute, must be under the terms of this License. You must inform recipients that the Source Code Form of the Covered Software is governed by the terms of this License, and how they can obtain a copy of this License. You may not attempt to alter or restrict the recipients' rights in the Source Code Form. 3.2. Distribution of Executable Form If You distribute Covered Software in Executable Form then: a. such Covered Software must also be made available in Source Code Form, as described in Section 3.1, and You must inform recipients of the Executable Form how they can obtain a copy of such Source Code Form by reasonable means in a timely manner, at a charge no more than the cost of distribution to the recipient; and b. You may distribute such Executable Form under the terms of this License, or sublicense it under different terms, provided that the license for the Executable Form does not attempt to limit or alter the recipients' rights in the Source Code Form under this License. 3.3. Distribution of a Larger Work You may create and distribute a Larger Work under terms of Your choice, provided that You also comply with the requirements of this License for the Covered Software. If the Larger Work is a combination of Covered Software with a work governed by one or more Secondary Licenses, and the Covered Software is not Incompatible With Secondary Licenses, this License permits You to additionally distribute such Covered Software under the terms of such Secondary License(s), so that the recipient of the Larger Work may, at their option, further distribute the Covered Software under the terms of either this License or such Secondary License(s). 3.4. Notices You may not remove or alter the substance of any license notices (including copyright notices, patent notices, disclaimers of warranty, or limitations of liability) contained within the Source Code Form of the Covered Software, except that You may alter any license notices to the extent required to remedy known factual inaccuracies. 3.5. Application of Additional Terms You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, You may do so only on Your own behalf, and not on behalf of any Contributor. You must make it absolutely clear that any such warranty, support, indemnity, or liability obligation is offered by You alone, and You hereby agree to indemnify every Contributor for any liability incurred by such Contributor as a result of warranty, support, indemnity or liability terms You offer. You may include additional disclaimers of warranty and limitations of liability specific to any jurisdiction. 4. Inability to Comply Due to Statute or Regulation If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be placed in a text file included with all distributions of the Covered Software under this License. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. 5. Termination 5.1. The rights granted under this License will terminate automatically if You fail to comply with any of its terms. However, if You become compliant, then the rights granted under this License from a particular Contributor are reinstated (a) provisionally, unless and until such Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor fails to notify You of the non-compliance by some reasonable means prior to 60 days after You have come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this is the first time You have received notice of non-compliance with this License from such Contributor, and You become compliant prior to 30 days after Your receipt of the notice. 5.2. If You initiate litigation against any entity by asserting a patent infringement claim (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a Contributor Version directly or indirectly infringes any patent, then the rights granted to You by any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate. 5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or Your distributors under this License prior to termination shall survive termination. 6. Disclaimer of Warranty Covered Software is provided under this License on an "as is" basis, without warranty of any kind, either expressed, implied, or statutory, including, without limitation, warranties that the Covered Software is free of defects, merchantable, fit for a particular purpose or non-infringing. The entire risk as to the quality and performance of the Covered Software is with You. Should any Covered Software prove defective in any respect, You (not any Contributor) assume the cost of any necessary servicing, repair, or correction. This disclaimer of warranty constitutes an essential part of this License. No use of any Covered Software is authorized under this License except under this disclaimer. 7. Limitation of Liability Under no circumstances and under no legal theory, whether tort (including negligence), contract, or otherwise, shall any Contributor, or anyone who distributes Covered Software as permitted above, be liable to You for any direct, indirect, special, incidental, or consequential damages of any character including, without limitation, damages for lost profits, loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses, even if such party shall have been informed of the possibility of such damages. This limitation of liability shall not apply to liability for death or personal injury resulting from such party's negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You. 8. Litigation Any litigation relating to this License may be brought only in the courts of a jurisdiction where the defendant maintains its principal place of business and such litigation shall be governed by laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this Section shall prevent a party's ability to bring cross-claims or counter-claims. 9. Miscellaneous This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not be used to construe this License against a Contributor. 10. Versions of the License 10.1. New Versions Mozilla Foundation is the license steward. Except as provided in Section 10.3, no one other than the license steward has the right to modify or publish new versions of this License. Each version will be given a distinguishing version number. 10.2. Effect of New Versions You may distribute the Covered Software under the terms of the version of the License under which You originally received the Covered Software, or under the terms of any subsequent version published by the license steward. 10.3. Modified Versions If you create software not governed by this License, and you want to create a new license for such software, you may create and use a modified version of this License if you rename the license and remove any references to the name of the license steward (except to note that such modified license differs from this License). 10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the terms of this version of the License, the notice described in Exhibit B of this License must be attached. Exhibit A - Source Code Form License Notice This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice. You may add additional accurate notices of copyright ownership. Exhibit B - "Incompatible With Secondary Licenses" Notice This Source Code Form is "Incompatible With Secondary Licenses", as defined by the Mozilla Public License, v. 2.0. ================================================ FILE: Makefile.in ================================================ # ***** BEGIN LICENSE BLOCK ***** # Version: MPL 1.1/GPL 2.0/LGPL 2.1 # # The contents of this file are subject to the Mozilla Public License Version # 1.1 (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. # # The Original Code is BlueGriffon. # # The Initial Developer of the Original Code is # Disruptive Innovations SARL. # Portions created by the Initial Developer are Copyright (C) 2006 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Daniel Glazman , Original author # # Alternatively, the contents of this file may be used under the terms of # either the GNU General Public License Version 2 or later (the "GPL"), or # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), # in which case the provisions of the GPL or the LGPL are applicable instead # of those above. If you wish to allow use of your version of this file only # under the terms of either the GPL or the LGPL, and not to allow others to # use your version of this file under the terms of the MPL, indicate your # decision by deleting the provisions above and replace them with the notice # and other provisions required by the GPL or the LGPL. If you do not delete # the provisions above, a recipient may use your version of this file under # the terms of any one of the MPL, the GPL or the LGPL. # # ***** END LICENSE BLOCK ***** */ DEPTH = .. topsrcdir = @top_srcdir@ srcdir = @srcdir@ VPATH = @srcdir@ include $(DEPTH)/config/autoconf.mk include $(topsrcdir)/config/rules.mk ifeq ($(OS_ARCH),WINNT) ifdef MOZ_INSTALLER # For Windows build the uninstaller during the application build since the # uninstaller is included with the application for mar file generation. libs:: $(MAKE) -C installer/windows uninstaller endif endif ================================================ FILE: README.md ================================================ # Bluegriffon The Open Source next-generation Web Editor based on the rendering engine of Firefox ## To prepare the build USING MERCURIAL * make sure to have installed the environment to build Mozilla: [windows](https://developer.mozilla.org/En/Developer_Guide/Build_Instructions/Windows_Prerequisites), [MacOS X](https://developer.mozilla.org/En/Developer_Guide/Build_Instructions/Mac_OS_X_Prerequisites), [linux](https://developer.mozilla.org/En/Developer_Guide/Build_Instructions/Linux_Prerequisites) * get mozilla-central from Mozilla through Mercurial: `hg clone http://hg.mozilla.org/mozilla-central bluegriffon-source` Warning: on Windows, it's HIGHLY recommended to have both Windows and Visual Studio in the same locale, preferably en-US. If for instance you have a fr-FR Windows10 and a en-US VS, build will miserably fail... * get BlueGriffon's tree through: `cd bluegriffon-source` `git clone https://github.com/therealglazou/bluegriffon` * update the mozilla tree ```hg update -r `cat bluegriffon/config/mozilla_central_revision.txt` ``` `patch -p 1 < bluegriffon/config/gecko_dev_content.patch` `patch -p 1 < bluegriffon/config/gecko_dev_idl.patch` * create a `.mozconfig` file inside your `bluegriffon-source` directory. The settings I am using on a daily basis on OS X (Sierra) can be found in `bluegriffon/config/mozconfig.macosx` ## To prepare the build USING GIT * make sure to have installed the environment to build Mozilla: [windows](https://developer.mozilla.org/En/Developer_Guide/Build_Instructions/Windows_Prerequisites), [MacOS X](https://developer.mozilla.org/En/Developer_Guide/Build_Instructions/Mac_OS_X_Prerequisites), [linux](https://developer.mozilla.org/En/Developer_Guide/Build_Instructions/Linux_Prerequisites) * get gecko-dev from github through git: `git clone https://github.com/mozilla/gecko-dev bluegriffon-source` Warning: on Windows, it's HIGHLY recommended to have both Windows and Visual Studio in the same locale, preferably en-US. If for instance you have a fr-FR Windows10 and a en-US VS, build will miserably fail... * get BlueGriffon's tree through: `cd bluegriffon-source` `git clone https://github.com/therealglazou/bluegriffon` * update the mozilla tree ```git reset --hard `cat bluegriffon/config/gecko_dev_revision.txt` ``` `patch -p 1 < bluegriffon/config/gecko_dev_content.patch` `patch -p 1 < bluegriffon/config/gecko_dev_idl.patch` * create a `.mozconfig` file inside your `bluegriffon-source` directory. The settings I am using on a daily basis on OS X (Sierra) can be found in `bluegriffon/config/mozconfig.macosx` ## My own builds * OS X: OS X 10.12.6 with Xcode version 9.0 (9A235) * Windows: Windows 10 Pro with Visual Studio Community 2015 * Linux: Ubuntu 16.04.1 LTS ## Build BlueGriffon `./mach build` ## Run BlueGriffon in a temporary profile `./mach run` ## Package the build `./mach package` ## Want to contribute to BlueGriffon? There are two ways to contribute: 1. Contribute code. That's just another OSS project, we're waiting for your Pull Requests! 2. Contribute L10N. All happens only in the 'locales' directory. You can review the existing locales and proposed changes/fixes or submit a new locale in a Pull Request. In that case, you need to translate everything from en-US into a new locale beforeI can accept the PR. ================================================ FILE: app/Makefile.in ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. dist_dest = $(DIST)/$(MOZ_MACBUNDLE_NAME) # hardcode en-US for the moment AB_CD = en-US DEFINES += \ -DCOMPOSER_ICO='"$(srcdir)/icons/bluegriffon.ico"' \ -DDOCUMENT_ICO='"$(srcdir)/icons/bluegriffon.ico"' \ $(NULL) # Build a binary bootstrapping with XRE_main ifndef MOZ_WINCONSOLE ifneq (,$(MOZ_DEBUG)$(MOZ_ASAN)) MOZ_WINCONSOLE = 1 else MOZ_WINCONSOLE = 0 endif endif # This switches $(INSTALL) to copy mode, like $(SYSINSTALL), so things that # shouldn't get 755 perms need $(IFLAGS1) for either way of calling nsinstall. NSDISTMODE = copy include $(topsrcdir)/config/config.mk ifeq ($(OS_ARCH),WINNT) # Rebuild firefox.exe if the manifest changes - it's included by splash.rc. # (this dependency should really be just for firefox.exe, not other targets) # Note the manifest file exists in the tree, so we use the explicit filename # here. EXTRA_DEPS += bluegriffon.exe.manifest endif PROGRAMS_DEST = $(DIST)/bin include $(topsrcdir)/config/rules.mk ifneq (,$(filter-out WINNT,$(OS_ARCH))) ifdef COMPILE_ENVIRONMENT libs:: cp -p $(MOZ_APP_NAME)$(BIN_SUFFIX) $(DIST)/bin/$(MOZ_APP_NAME)-bin$(BIN_SUFFIX) endif GARBAGE += $(addprefix $(FINAL_TARGET)/defaults/pref/, bluegriffon-prefs.js) endif ifdef MOZ_WIDGET_GTK libs:: $(INSTALL) $(IFLAGS1) $(srcdir)/icons/default16.png $(FINAL_TARGET)/icons $(INSTALL) $(IFLAGS1) $(DIST)/branding/default16.png $(FINAL_TARGET)/chrome/icons/default $(INSTALL) $(IFLAGS1) $(srcdir)/icons/default32.png $(FINAL_TARGET)/chrome/icons/default $(INSTALL) $(IFLAGS1) $(srcdir)/icons/default48.png $(FINAL_TARGET)/chrome/icons/default endif ifndef LIBXUL_SDK #channel-prefs.js is handled separate from other prefs due to bug 756325 libs:: $(srcdir)/profile/channel-prefs.js $(NSINSTALL) -D $(DIST)/bin/defaults/pref $(call py_action,preprocessor,-Fsubstitution $(PREF_PPFLAGS) $(ACDEFINES) $^ -o $(DIST)/bin/defaults/pref/channel-prefs.js) endif ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT)) MAC_APP_NAME = $(MOZ_APP_DISPLAYNAME) ifdef MOZ_DEBUG MAC_APP_NAME := $(MAC_APP_NAME)Debug endif AB_CD = $(MOZ_UI_LOCALE) AB := $(firstword $(subst -, ,$(AB_CD))) clean clobber repackage:: $(RM) -r $(dist_dest) .PHONY: repackage tools repackage:: $(PROGRAM) $(MKDIR) -p $(dist_dest)/Contents/MacOS $(MKDIR) -p $(dist_dest)/Contents/Resources/$(AB).lproj rsync -a --exclude '*.in' $(srcdir)/macbuild/Contents $(dist_dest) --exclude English.lproj rsync -a --exclude '*.in' $(srcdir)/macbuild/Contents/Resources/English.lproj/ $(dist_dest)/Contents/Resources/$(AB).lproj sed -e 's/%APP_VERSION%/$(MOZ_APP_VERSION)/' -e 's/%MAC_APP_NAME%/$(MAC_APP_NAME)/' -e 's/%MOZ_MACBUNDLE_ID%/$(MOZ_MACBUNDLE_ID)/' $(srcdir)/macbuild/Contents/Info.plist.in > $(dist_dest)/Contents/Info.plist sed -e 's/%MAC_APP_NAME%/$(MAC_APP_NAME)/' $(srcdir)/macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in | iconv -f UTF-8 -t UTF-16 > $(dist_dest)/Contents/Resources/$(AB).lproj/InfoPlist.strings rsync -a --exclude-from='$(srcdir)/macbuild/Contents/MacOS-files.in' $(DIST)/bin/ $(dist_dest)/Contents/Resources rsync -a --include-from='$(srcdir)/macbuild/Contents/MacOS-files.in' --exclude '*' $(DIST)/bin/ $(dist_dest)/Contents/MacOS $(RM) $(dist_dest)/Contents/MacOS/$(PROGRAM) rsync -aL $(PROGRAM) $(dist_dest)/Contents/MacOS cp -RL $(srcdir)/macbuild/Contents/Resources/bluegriffon.icns $(DIST)/$(MAC_APP_NAME).app/Contents/Resources/bluegriffon.icns printf APPLMOZB > $(dist_dest)/Contents/PkgInfo #$(INSTALL) $(DIST)/xpi-stage/*.xpi $(DIST)/$(MAC_APP_NAME).app/Contents/MacOS/extensions else #.PHONY: repackage #tools repackage:: $(PROGRAM) # cp $(DIST)/xpi-stage/*.xpi $(DIST)/bin/extensions # $(INSTALL) $(DIST)/xpi-stage/*.xpi $(DIST)/bin/distribution/extensions endif ifdef LIBXUL_SDK #{ libs:: ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT)) #{ rsync -a --copy-unsafe-links $(LIBXUL_DIST)/XUL.framework $(dist_dest)/Contents/Frameworks else $(NSINSTALL) -D $(DIST)/bin/xulrunner (cd $(LIBXUL_SDK)/bin && tar $(TAR_CREATE_FLAGS) - .) | (cd $(DIST)/bin/xulrunner && tar -xf -) endif #} cocoa endif #} LIBXUL_SDK ================================================ FILE: app/Makefile.in.debug ================================================ # ***** BEGIN LICENSE BLOCK ***** # Version: MPL 1.1/GPL 2.0/LGPL 2.1 # # The contents of this file are subject to the Mozilla Public License Version # 1.1 (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. # # The Original Code is mozilla.org code. # # The Initial Developer of the Original Code is # Netscape Communications. # Portions created by the Initial Developer are Copyright (C) 2001 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Brian Ryner # Jonathan Wilson # Dan Mosedale # Benjamin Smedberg # # Alternatively, the contents of this file may be used under the terms of # either the GNU General Public License Version 2 or later (the "GPL"), or # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), # in which case the provisions of the GPL or the LGPL are applicable instead # of those above. If you wish to allow use of your version of this file only # under the terms of either the GPL or the LGPL, and not to allow others to # use your version of this file under the terms of the MPL, indicate your # decision by deleting the provisions above and replace them with the notice # and other provisions required by the GPL or the LGPL. If you do not delete # the provisions above, a recipient may use your version of this file under # the terms of any one of the MPL, the GPL or the LGPL. # # ***** END LICENSE BLOCK ***** DEPTH = ../.. topsrcdir = @top_srcdir@ srcdir = @srcdir@ VPATH = @srcdir@ include $(DEPTH)/config/autoconf.mk PREF_JS_EXPORTS = $(srcdir)/profile/bluegriffon-prefs.js \ $(NULL) # hardcode en-US for the moment AB_CD = en-US DEFINES += -DAB_CD=$(AB_CD) APP_VERSION = $(shell cat $(srcdir)/../config/version.txt) DEFINES += -DAPP_VERSION="$(APP_VERSION)" DIST_FILES = application.ini GRE_MILESTONE = $(shell $(PYTHON) $(topsrcdir)/config/printconfigsetting.py $(LIBXUL_DIST)/bin/platform.ini Build Milestone) GRE_BUILDID = $(shell $(PYTHON) $(topsrcdir)/config/printconfigsetting.py $(LIBXUL_DIST)/bin/platform.ini Build BuildID) DEFINES += -DGRE_MILESTONE=$(GRE_MILESTONE) -DGRE_BUILDID=$(GRE_BUILDID) MOZ_SOURCE_STAMP ?= $(shell hg -R $(topsrcdir) parent --template="{node|short}\n" 2>/dev/null) ifdef MOZ_SOURCE_STAMP DEFINES += -DMOZ_SOURCE_STAMP="$(MOZ_SOURCE_STAMP)" endif SOURCE_REPO := $(shell hg -R $(topsrcdir) showconfig paths.default 2>/dev/null | sed -e "s/^ssh:/http:/") ifdef SOURCE_REPO DEFINES += -DMOZ_SOURCE_REPO="$(SOURCE_REPO)" endif DEFINES += \ -DMOZ_APP_NAME=$(MOZ_APP_DISPLAYNAME) \ -DMOZ_APP_VERSION=$(APP_VERSION) \ -DAPP_NAME=$(MOZ_APP_DISPLAYNAME) \ -DAPP_VERSION=$(APP_VERSION) \ -DAPP_UA_NAME="$(APP_UA_NAME)" \ -DGRE_BUILDID=$(GRE_BUILDID) \ -DGRE_MILESTONE=$(GRE_MILESTONE) \ -DMOZ_APP_NAME=$(MOZ_APP_NAME) \ -DAB_CD=$(AB_CD) \ $(NULL) DEFINES += -DMOZ_APP_BASENAME="$(MOZ_APP_BASENAME)" \ -DMOZ_APP_VENDOR="$(MOZ_APP_VENDOR)" ifdef MOZ_APP_PROFILE DEFINES += -DMOZ_APP_PROFILE="$(MOZ_APP_PROFILE)" endif LIBS += $(JEMALLOC_LIBS) ifdef LIBXUL_SDK include $(topsrcdir)/config/rules.mk else # Build a binary bootstrapping with XRE_main ifneq (,$(filter OS2 WINNT,$(OS_ARCH))) PROGRAM = $(MOZ_APP_NAME)$(BIN_SUFFIX) else PROGRAM = $(MOZ_APP_NAME)-bin$(BIN_SUFFIX) endif CPPSRCS = nsEditorApp.cpp LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/xre LOCAL_INCLUDES += -I$(topsrcdir)/xpcom/base ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT)) LIBS += $(DIST)/bin/XUL TK_LIBS := $(TK_LIBS) else EXTRA_DSO_LIBS += xul endif LIBS += \ $(STATIC_COMPONENTS_LINKER_PATH) \ $(EXTRA_DSO_LIBS) \ $(XPCOM_GLUE_LDOPTS) \ $(NSPR_LIBS) \ $(NULL) ifdef MOZ_JPROF LIBS += -ljprof endif ifndef MOZ_WINCONSOLE ifdef MOZ_DEBUG MOZ_WINCONSOLE = 1 else MOZ_WINCONSOLE = 0 endif endif # This switches $(INSTALL) to copy mode, like $(SYSINSTALL), so things that # shouldn't get 755 perms need $(IFLAGS1) for either way of calling nsinstall. NSDISTMODE = copy include $(topsrcdir)/config/config.mk ifdef _MSC_VER # Always enter a Windows program through wmain, whether or not we're # a console application. WIN32_EXE_LDFLAGS += -ENTRY:wmainCRTStartup endif ifeq ($(OS_ARCH),WINNT) OS_LIBS += $(call EXPAND_LIBNAME,comctl32 comdlg32 uuid shell32 ole32 oleaut32 version winspool) OS_LIBS += $(call EXPAND_LIBNAME,usp10 msimg32) endif ifeq ($(OS_ARCH),WINNT) RCINCLUDE = splash.rc ifndef GNU_CC RCFLAGS += -DMOZ_PHOENIX -I$(srcdir) else RCFLAGS += -DMOZ_PHOENIX --include-dir $(srcdir) endif ifdef DEBUG RCFLAGS += -DDEBUG endif endif ifeq ($(OS_ARCH),OS2) RESFILE=splashos2.res RCFLAGS += -DMOZ_PHOENIX ifdef DEBUG RCFLAGS += -DDEBUG endif RCFLAGS += -DCOMPOSER_ICO=\"$(srcdir)/icons/bluegriffon-os2.ico\" -DDOCUMENT_ICO=\"$(srcdir)/icons/bluegriffon.ico\" endif include $(topsrcdir)/config/rules.mk ifeq ($(MOZ_WIDGET_TOOLKIT),photon) LIBS += -lphexlib endif ifeq ($(OS_ARCH),WINNT) # # Control the default heap size. # This is the heap returned by GetProcessHeap(). # As we use the CRT heap, the default size is too large and wastes VM. # # The default heap size is 1MB on Win32. # The heap will grow if need be. # # Set it to 256k. See bug 127069. # ifndef GNU_CC LDFLAGS += /HEAP:0x40000 ifeq ($(OS_TEST),x86_64) # set stack to 2MB on x64 build. See bug 582910 LDFLAGS += -STACK:2097152 endif endif endif ifneq (,$(filter-out OS2 WINNT,$(OS_ARCH))) $(MOZ_APP_NAME):: $(topsrcdir)/build/unix/mozilla.in $(GLOBAL_DEPS) cat $< | sed -e "s|%MOZAPPDIR%|$(installdir)|" \ -e "s|%MOZ_APP_DISPLAYNAME%|$(MOZ_APP_DISPLAYNAME)|" > $@ chmod +x $@ libs:: $(MOZ_APP_NAME) $(INSTALL) $< $(DIST)/bin install:: $(MOZ_APP_NAME) $(SYSINSTALL) $< $(DESTDIR)$(bindir) GARBAGE += $(MOZ_APP_NAME) GARBAGE += $(addprefix $(DIST)/bin/defaults/pref/, bluegriffon-prefs.js) endif endif # LIBXUL_SDK DEFINES += -DCOMPOSER_ICO=\"$(srcdir)/icons/bluegriffon.ico\" -DDOCUMENT_ICO=\"$(srcdir)/icons/bluegriffon.ico\" ifdef MOZILLA_OFFICIAL DEFINES += -DMOZILLA_OFFICIAL endif ifeq ($(MOZ_WIDGET_TOOLKIT),gtk2) libs:: $(INSTALL) $(IFLAGS1) $(srcdir)/icons/default16.png $(DIST)/bin/chrome/icons/default $(INSTALL) $(IFLAGS1) $(srcdir)/icons/default32.png $(DIST)/bin/chrome/icons/default $(INSTALL) $(IFLAGS1) $(srcdir)/icons/default48.png $(DIST)/bin/chrome/icons/default endif ifdef MOZ_SPLASHSCREEN ifeq ($(MOZ_WIDGET_TOOLKIT),windows) libs:: $(INSTALL) $(IFLAGS1) $(DIST)/branding/splash.bmp $(DIST)/bin endif endif libs:: $(srcdir)/profile/bluegriffon-prefs.js $(INSTALL) $(IFLAGS1) $^ $(DIST)/bin/defaults/profile ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT)) APP_NAME = $(MOZ_APP_DISPLAYNAME) ifdef MOZ_DEBUG APP_NAME := $(APP_NAME)Debug endif LOWER_APP_NAME = $(shell echo $(APP_NAME) | tr '[A-Z]' '[a-z]') AB_CD = $(MOZ_UI_LOCALE) AB := $(firstword $(subst -, ,$(AB_CD))) clean clobber repackage:: $(RM) -r $(DIST)/$(APP_NAME).app ifdef LIBXUL_SDK APPFILES = Resources else APPFILES = MacOS endif libs repackage:: $(PROGRAM) application.ini mkdir -p $(DIST)/$(APP_NAME).app/Contents/MacOS rsync -a --exclude CVS --exclude "*.in" $(srcdir)/macbuild/Contents $(DIST)/$(APP_NAME).app --exclude English.lproj mkdir -p $(DIST)/$(APP_NAME).app/Contents/Resources/$(AB).lproj rsync -a --exclude CVS --exclude "*.in" $(srcdir)/macbuild/Contents/Resources/English.lproj/ $(DIST)/$(APP_NAME).app/Contents/Resources/$(AB).lproj sed -e "s/%APP_VERSION%/$(APP_VERSION)/" -e "s/%APP_NAME%/$(APP_NAME)/" -e "s/%LOWER_APP_NAME%/$(LOWER_APP_NAME)/" $(srcdir)/macbuild/Contents/Info.plist.in > $(DIST)/$(APP_NAME).app/Contents/Info.plist sed -e "s/%APP_NAME%/$(APP_NAME)/" $(srcdir)/macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in | iconv -f UTF-8 -t UTF-16 > $(DIST)/$(APP_NAME).app/Contents/Resources/$(AB).lproj/InfoPlist.strings rsync -a $(DIST)/bin/ $(DIST)/$(APP_NAME).app/Contents/$(APPFILES) $(RM) $(DIST)/$(APP_NAME).app/Contents/$(APPFILES)/mangle $(DIST)/$(APP_NAME).app/Contents/$(APPFILES)/shlibsign ifdef LIBXUL_SDK cp $(LIBXUL_DIST)/bin/$(XR_STUB_NAME) $(DIST)/$(APP_NAME).app/Contents/MacOS/bluegriffon-bin else rm -f $(DIST)/$(APP_NAME).app/Contents/MacOS/$(PROGRAM) rsync -aL $(PROGRAM) $(DIST)/$(APP_NAME).app/Contents/MacOS endif -cp -L $(DIST)/bin/mangle $(DIST)/bin/shlibsign $(DIST)/$(APP_NAME).app/Contents/$(APPFILES) cp -RL $(srcdir)/macbuild/Contents/Resources/bluegriffon.icns $(DIST)/$(APP_NAME).app/Contents/Resources/bluegriffon.icns cp -L /Users/glazou/Desktop/add-ons/venkman-0.9.88.2.xpi $(DIST)/$(APP_NAME).app/Contents/MacOS/distribution/extensions/\{f13b157f-b174-47e7-a34d-4815ddfdfeb8\}.xpi cp -L /Users/glazou/Desktop/add-ons/inspector.xpi $(DIST)/$(APP_NAME).app/Contents/MacOS/distribution/extensions/inspector\@mozilla.org.xpi printf APPLDIBG > $(DIST)/$(APP_NAME).app/Contents/PkgInfo # remove CVS dirs from packaged app find $(DIST)/$(APP_NAME).app -type d -name ".svn" -prune -exec rm -rf {} \; else ifdef LIBXUL_SDK libs:: cp $(LIBXUL_DIST)/bin/$(XULRUNNER_STUB_NAME)$(BIN_SUFFIX) $(DIST)/bin/bluegriffon$(BIN_SUFFIX) endif endif ifdef LIBXUL_SDK ifndef SKIP_COPY_XULRUNNER libs:: ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT)) rsync -a --copy-unsafe-links $(LIBXUL_DIST)/XUL.framework $(DIST)/$(APP_NAME).app/Contents/Frameworks else $(NSINSTALL) -D $(DIST)/bin/xulrunner (cd $(LIBXUL_SDK)/bin && tar $(TAR_CREATE_FLAGS) - .) | (cd $(DIST)/bin/xulrunner && tar -xf -) endif # cocoa endif # SKIP_COPY_XULRUNNER endif # LIBXUL_SDK libs:: ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT)) $(INSTALL) $(DIST)/$(APP_NAME).app/Contents/MacOS/extensions/* $(DIST)/$(APP_NAME).app/Contents/MacOS/distribution/extensions rm -fr $(DIST)/$(APP_NAME).app/Contents/MacOS/extensions/* else $(INSTALL) $(DIST)/xpi-stage/*.xpi $(DIST)/bin/distribution/extensions rm -fr $(DIST)/bin/extensions/* endif rm -rf $(DIST)/xpi-stage/* ================================================ FILE: app/Makefile.in.test ================================================ # ***** BEGIN LICENSE BLOCK ***** # Version: MPL 1.1/GPL 2.0/LGPL 2.1 # # The contents of this file are subject to the Mozilla Public License Version # 1.1 (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. # # The Original Code is mozilla.org code. # # The Initial Developer of the Original Code is # Netscape Communications. # Portions created by the Initial Developer are Copyright (C) 2001 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Brian Ryner # Jonathan Wilson # Dan Mosedale # Benjamin Smedberg # # Alternatively, the contents of this file may be used under the terms of # either the GNU General Public License Version 2 or later (the "GPL"), or # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), # in which case the provisions of the GPL or the LGPL are applicable instead # of those above. If you wish to allow use of your version of this file only # under the terms of either the GPL or the LGPL, and not to allow others to # use your version of this file under the terms of the MPL, indicate your # decision by deleting the provisions above and replace them with the notice # and other provisions required by the GPL or the LGPL. If you do not delete # the provisions above, a recipient may use your version of this file under # the terms of any one of the MPL, the GPL or the LGPL. # # ***** END LICENSE BLOCK ***** DEPTH = ../.. topsrcdir = @top_srcdir@ srcdir = @srcdir@ VPATH = @srcdir@ include $(DEPTH)/config/autoconf.mk PREF_JS_EXPORTS = $(srcdir)/profile/bluegriffon-prefs.js \ $(NULL) # hardcode en-US for the moment AB_CD = en-US DEFINES += -DAB_CD=$(AB_CD) APP_VERSION = $(shell cat $(srcdir)/../config/version.txt) DEFINES += -DAPP_VERSION="$(APP_VERSION)" DIST_FILES = application.ini GRE_MILESTONE = $(shell $(PYTHON) $(topsrcdir)/config/printconfigsetting.py $(LIBXUL_DIST)/bin/platform.ini Build Milestone) GRE_BUILDID = $(shell $(PYTHON) $(topsrcdir)/config/printconfigsetting.py $(LIBXUL_DIST)/bin/platform.ini Build BuildID) DEFINES += \ -DAPP_NAME=$(MOZ_APP_DISPLAYNAME) \ -DAPP_VERSION=$(APP_VERSION) \ -DAPP_UA_NAME="$(APP_UA_NAME)" \ -DGRE_BUILDID=$(GRE_BUILDID) \ -DGRE_MILESTONE=$(GRE_MILESTONE) \ -DMOZ_APP_NAME=$(MOZ_APP_NAME) \ -DAB_CD=$(AB_CD) \ $(NULL) DEFINES += -DGRE_MILESTONE=$(GRE_MILESTONE) -DGRE_BUILDID=$(GRE_BUILDID) MOZ_SOURCE_STAMP ?= $(shell hg -R $(topsrcdir) parent --template="{node|short}\n" 2>/dev/null) ifdef MOZ_SOURCE_STAMP DEFINES += -DMOZ_SOURCE_STAMP="$(MOZ_SOURCE_STAMP)" endif SOURCE_REPO := $(shell hg -R $(topsrcdir) showconfig paths.default 2>/dev/null | sed -e "s/^ssh:/http:/") ifdef SOURCE_REPO DEFINES += -DMOZ_SOURCE_REPO="$(SOURCE_REPO)" endif LIBS += $(JEMALLOC_LIBS) ifdef LIBXUL_SDK include $(topsrcdir)/config/rules.mk else # Build a binary bootstrapping with XRE_main ifneq (,$(filter OS2 WINCE WINNT,$(OS_ARCH))) PROGRAM = $(MOZ_APP_NAME)$(BIN_SUFFIX) else PROGRAM = $(MOZ_APP_NAME)-bin$(BIN_SUFFIX) endif CPPSRCS = nsEditorApp.cpp LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/xre LOCAL_INCLUDES += -I$(topsrcdir)/xpcom/base ifdef BUILD_STATIC_LIBS ifdef _MSC_VER STATIC_COMPONENTS_LINKER_PATH = -LIBPATH:$(DEPTH)/staticlib else STATIC_COMPONENTS_LINKER_PATH = -L$(DEPTH)/staticlib endif LIBS += $(DEPTH)/toolkit/xre/$(LIB_PREFIX)xulapp_s.$(LIB_SUFFIX) else ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT)) LIBS += $(DIST)/bin/XUL else EXTRA_DSO_LIBS += xul endif endif ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT)) TK_LIBS := $(TK_LIBS) endif ifdef MOZ_ENABLE_LIBXUL APP_XPCOM_LIBS = $(XPCOM_GLUE_LDOPTS) else MOZILLA_INTERNAL_API = 1 APP_XPCOM_LIBS = $(XPCOM_LIBS) endif LIBS += \ $(STATIC_COMPONENTS_LINKER_PATH) \ $(EXTRA_DSO_LIBS) \ $(MOZ_JS_LIBS) \ $(APP_XPCOM_LIBS) \ $(NSPR_LIBS) \ $(TK_LIBS) \ $(NULL) # Add explicit X11 dependency when building against X11 toolkits ifneq (,$(filter gtk2,$(MOZ_WIDGET_TOOLKIT))) LIBS += $(XLDFLAGS) $(XLIBS) $(ZLIB_LIBS) endif ifdef MOZ_JPROF LIBS += -ljprof endif ifndef MOZ_WINCONSOLE ifdef MOZ_DEBUG MOZ_WINCONSOLE = 1 else MOZ_WINCONSOLE = 0 endif endif # This switches $(INSTALL) to copy mode, like $(SYSINSTALL), so things that # shouldn't get 755 perms need $(IFLAGS1) for either way of calling nsinstall. NSDISTMODE = copy include $(topsrcdir)/config/config.mk ifdef _MSC_VER # Always enter a Windows program through wmain, whether or not we're # a console application. ifdef WINCE WIN32_EXE_LDFLAGS += -ENTRY:mainWCRTStartup else WIN32_EXE_LDFLAGS += -ENTRY:wmainCRTStartup endif endif ifdef WINCE EXTRA_DSO_LDOPTS += $(call EXPAND_LIBNAME,corelibc) endif ifdef BUILD_STATIC_LIBS include $(topsrcdir)/config/static-config.mk EXTRA_DEPS += \ $(STATIC_EXTRA_DEPS) \ $(NULL) DEFINES += $(STATIC_DEFINES) CPPSRCS += $(STATIC_CPPSRCS) EXTRA_DSO_LIBS += $(STATIC_EXTRA_DSO_LIBS) EXTRA_LIBS += $(STATIC_EXTRA_LIBS) endif ifeq ($(OS_ARCH),WINNT) OS_LIBS += $(call EXPAND_LIBNAME,comctl32 comdlg32 uuid shell32 ole32 oleaut32 version winspool) OS_LIBS += $(call EXPAND_LIBNAME,usp10 msimg32) endif ifneq (,$(filter WINNT WINCE,$(OS_ARCH))) RCINCLUDE = splash.rc ifndef GNU_CC RCFLAGS += -DMOZ_PHOENIX -I$(srcdir) else RCFLAGS += -DMOZ_PHOENIX --include-dir $(srcdir) endif ifdef BUILD_STATIC_LIBS RCFLAGS += -DMOZ_STATIC_BUILD endif ifdef DEBUG RCFLAGS += -DDEBUG endif endif ifeq ($(OS_ARCH),BeOS) BEOS_PROGRAM_RESOURCE = $(srcdir)/apprunner-beos.rsrc ifdef BUILD_STATIC_LIBS OS_LIBS += -ltracker -lgame endif endif ifeq ($(OS_ARCH),OS2) RESFILE=splashos2.res RCFLAGS += -DMOZ_PHOENIX ifdef BUILD_STATIC_LIBS RCFLAGS += -DMOZ_STATIC_BUILD -i $(DIST)/include endif ifdef DEBUG RCFLAGS += -DDEBUG endif RCFLAGS += -DCOMPOSER_ICO=\"$(srcdir)/icons/bluegriffon.ico\" -DDOCUMENT_ICO=\"$(srcdir)/icons/bluegriffon.ico\" endif include $(topsrcdir)/config/rules.mk ifdef BUILD_STATIC_LIBS include $(topsrcdir)/config/static-rules.mk DEFINES += -DIMPL_XREAPI endif ifeq ($(MOZ_WIDGET_TOOLKIT),photon) LIBS += -lphexlib endif ifeq ($(OS_ARCH),WINNT) # # Control the default heap size. # This is the heap returned by GetProcessHeap(). # As we use the CRT heap, the default size is too large and wastes VM. # # The default heap size is 1MB on Win32. # The heap will grow if need be. # # Set it to 256k. See bug 127069. # ifndef GNU_CC LDFLAGS += /HEAP:0x40000 ifeq ($(OS_TEST),x86_64) # set stack to 2MB on x64 build. See bug 582910 LDFLAGS += -STACK:2097152 endif endif endif $(PROGRAM): $(DEPTH)/toolkit/xre/$(LIB_PREFIX)xulapp_s.$(LIB_SUFFIX) ifneq (,$(filter-out OS2 WINNT WINCE,$(OS_ARCH))) $(MOZ_APP_NAME):: $(topsrcdir)/build/unix/mozilla.in $(GLOBAL_DEPS) cat $< | sed -e "s|%MOZAPPDIR%|$(installdir)|" \ -e "s|%MOZ_APP_DISPLAYNAME%|$(MOZ_APP_DISPLAYNAME)|" > $@ chmod +x $@ libs:: $(MOZ_APP_NAME) $(INSTALL) $< $(DIST)/bin install:: $(MOZ_APP_NAME) $(SYSINSTALL) $< $(DESTDIR)$(bindir) GARBAGE += $(MOZ_APP_NAME) GARBAGE += $(addprefix $(DIST)/bin/defaults/pref/, bluegriffon-prefs.js) endif endif # LIBXUL_SDK DEFINES += -DCOMPOSER_ICO=\"$(srcdir)/icons/bluegriffon.ico\" -DDOCUMENT_ICO=\"$(srcdir)/icons/bluegriffon.ico\" ifdef MOZILLA_OFFICIAL DEFINES += -DMOZILLA_OFFICIAL endif ifeq ($(MOZ_WIDGET_TOOLKIT),gtk2) libs:: $(INSTALL) $(IFLAGS1) $(DIST)/branding/mozicon128.png $(DIST)/bin/icons $(INSTALL) $(IFLAGS1) $(DIST)/branding/document.png $(DIST)/bin/icons $(INSTALL) $(IFLAGS1) $(DIST)/branding/default16.png $(DIST)/bin/chrome/icons/default $(INSTALL) $(IFLAGS1) $(DIST)/branding/default32.png $(DIST)/bin/chrome/icons/default $(INSTALL) $(IFLAGS1) $(DIST)/branding/default48.png $(DIST)/bin/chrome/icons/default endif ifdef MOZ_SPLASHSCREEN ifeq ($(MOZ_WIDGET_TOOLKIT),windows) libs:: $(INSTALL) $(IFLAGS1) $(DIST)/branding/splash.bmp $(DIST)/bin endif endif ifdef WINCE ifdef MOZ_FASTSTART libs:: cp -f $(DIST)/bin/faststartstub.exe $(DIST)/bin/$(MOZ_APP_NAME)faststart.exe endif endif libs:: $(srcdir)/profile/bluegriffon-prefs.js $(INSTALL) $(IFLAGS1) $^ $(DIST)/bin/defaults/profile ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT)) APP_NAME = $(MOZ_APP_DISPLAYNAME) ifdef MOZ_DEBUG APP_NAME := $(APP_NAME)Debug endif LOWER_APP_NAME = $(shell echo $(APP_NAME) | tr '[A-Z]' '[a-z]') AB_CD = $(MOZ_UI_LOCALE) AB := $(firstword $(subst -, ,$(AB_CD))) clean clobber repackage:: rm -rf $(DIST)/$(APP_NAME).app ifdef LIBXUL_SDK APPFILES = Resources else APPFILES = MacOS endif libs repackage:: $(PROGRAM) application.ini mkdir -p $(DIST)/$(APP_NAME).app/Contents/MacOS rsync -a --exclude CVS --exclude "*.in" $(srcdir)/macbuild/Contents $(DIST)/$(APP_NAME).app --exclude English.lproj mkdir -p $(DIST)/$(APP_NAME).app/Contents/Resources/$(AB).lproj rsync -a --exclude CVS --exclude "*.in" $(srcdir)/macbuild/Contents/Resources/English.lproj/ $(DIST)/$(APP_NAME).app/Contents/Resources/$(AB).lproj sed -e "s/%APP_VERSION%/$(APP_VERSION)/" -e "s/%APP_NAME%/$(APP_NAME)/" -e "s/%LOWER_APP_NAME%/$(LOWER_APP_NAME)/" $(srcdir)/macbuild/Contents/Info.plist.in > $(DIST)/$(APP_NAME).app/Contents/Info.plist sed -e "s/%APP_NAME%/$(APP_NAME)/" $(srcdir)/macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in | iconv -f UTF-8 -t UTF-16 > $(DIST)/$(APP_NAME).app/Contents/Resources/$(AB).lproj/InfoPlist.strings rsync -a $(DIST)/bin/ $(DIST)/$(APP_NAME).app/Contents/$(APPFILES) $(RM) $(DIST)/$(APP_NAME).app/Contents/$(APPFILES)/mangle $(DIST)/$(APP_NAME).app/Contents/$(APPFILES)/shlibsign ifdef LIBXUL_SDK cp $(LIBXUL_DIST)/bin/$(XR_STUB_NAME) $(DIST)/$(APP_NAME).app/Contents/MacOS/bluegriffon-bin else rm -f $(DIST)/$(APP_NAME).app/Contents/MacOS/$(PROGRAM) rsync -aL $(PROGRAM) $(DIST)/$(APP_NAME).app/Contents/MacOS endif -cp -L $(DIST)/bin/mangle $(DIST)/bin/shlibsign $(DIST)/$(APP_NAME).app/Contents/$(APPFILES) cp -RL $(srcdir)/macbuild/Contents/Resources/bluegriffon.icns $(DIST)/$(APP_NAME).app/Contents/Resources/bluegriffon.icns cp -RL $(DIST)/branding/document.icns $(DIST)/$(APP_NAME).app/Contents/Resources/document.icns printf APPLMOZB > $(DIST)/$(APP_NAME).app/Contents/PkgInfo # remove CVS dirs from packaged app find $(DIST)/$(APP_NAME).app -type d -name "CVS" -prune -exec rm -rf {} \; else ifdef LIBXUL_SDK libs:: cp $(LIBXUL_DIST)/bin/$(XULRUNNER_STUB_NAME)$(BIN_SUFFIX) $(DIST)/bin/bluegriffon$(BIN_SUFFIX) endif endif ifdef LIBXUL_SDK ifndef SKIP_COPY_XULRUNNER libs:: ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT)) rsync -a --copy-unsafe-links $(LIBXUL_DIST)/XUL.framework $(DIST)/$(APP_NAME).app/Contents/Frameworks else $(NSINSTALL) -D $(DIST)/bin/xulrunner (cd $(LIBXUL_SDK)/bin && tar $(TAR_CREATE_FLAGS) - .) | (cd $(DIST)/bin/xulrunner && tar -xf -) endif # cocoa endif # SKIP_COPY_XULRUNNER endif # LIBXUL_SDK ================================================ FILE: app/application.ini ================================================ ; ***** BEGIN LICENSE BLOCK ***** ; Version: MPL 1.1/GPL 2.0/LGPL 2.1 ; ; The contents of this file are subject to the Mozilla Public License Version ; 1.1 (the "License"); you may not use this file except in compliance with ; the License. You may obtain a copy of the License at ; http://www.mozilla.org/MPL/ ; ; Software distributed under the License is distributed on an "AS IS" basis, ; WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License ; for the specific language governing rights and limitations under the ; License. ; ; The Original Code is BlueGriffon. ; ; The Initial Developer of the Original Code is ; Disruptive Innovations. ; ; Portions created by the Initial Developer are Copyright (C) 2008 ; Disruptive Innovations SARL. All Rights Reserved. ; ; Contributor(s): ; Daniel Glazman ; Laurent Jouanneau ; ; Contributor(s): ; ; Alternatively, the contents of this file may be used under the terms of ; either the GNU General Public License Version 2 or later (the "GPL"), or ; the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), ; in which case the provisions of the GPL or the LGPL are applicable instead ; of those above. If you wish to allow use of your version of this file only ; under the terms of either the GPL or the LGPL, and not to allow others to ; use your version of this file under the terms of the MPL, indicate your ; decision by deleting the provisions above and replace them with the notice ; and other provisions required by the GPL or the LGPL. If you do not delete ; the provisions above, a recipient may use your version of this file under ; the terms of any one of the MPL, the GPL or the LGPL. ; ; ***** END LICENSE BLOCK ***** #filter substitution [App] Name=@APP_NAME@ RemotingName=@APP_NAME@ Version=@MOZ_APP_VERSION@ ID=bluegriffon@bluegriffon.com BuildID=@GRE_BUILDID@ Copyright=Copyright (c) 2009-2017 Disruptive Innovations SARL Vendor=Disruptive Innovations SARL [Gecko] MinVersion=@GRE_MILESTONE@ MaxVersion=@GRE_MILESTONE@ [Shell] Icon=chrome/skin/classic/bluegriffon/bluegriffon [XRE] EnableExtensionManager=1 ================================================ FILE: app/bluegriffon.exe.manifest ================================================ BlueGriffon true ================================================ FILE: app/icons/bluegriffon16.xpm ================================================ /* XPM */ static char * bluegriffon16_xpm[] = { "16 16 135 2", " c None", ". c #59FD22", "+ c #5AFE21", "@ c #59FE20", "# c #55FE1C", "$ c #58FE20", "% c #59FD20", "& c #56FE1D", "* c #4DFD10", "= c #56FF1D", "- c #5BFF1E", "; c #0E0072", "> c #43FE03", ", c #C3FFAE", "' c #C3FFAF", ") c #4CFF06", "! c #61FF11", "~ c #1D1F5F", "{ c #140078", "] c #59FE21", "^ c #57FE1D", "/ c #42FE04", "( c #C2FFAB", "_ c #FFFFFF", ": c #F8F2F9", "< c #48516A", "[ c #235242", "} c #2A564C", "| c #1A1867", "1 c #15007D", "2 c #5AFE22", "3 c #57FE1E", "4 c #42FD03", "5 c #D2FFBC", "6 c #C0BAC7", "7 c #343344", "8 c #00000F", "9 c #8F8AA9", "0 c #07004E", "a c #191A57", "b c #191564", "c c #1C196F", "d c #57FF1D", "e c #45FF07", "f c #CCFFB6", "g c #554F5B", "h c #32282F", "i c #060008", "j c #514F64", "k c #E9E8EF", "l c #00003F", "m c #0E0058", "n c #1F2A55", "o c #15096D", "p c #336957", "q c #5AFD22", "r c #45D512", "s c #91A67A", "t c #FFC2C1", "u c #FF8281", "v c #303543", "w c #747284", "x c #4D496B", "y c #070041", "z c #110154", "A c #2C226F", "B c #150868", "C c #347D49", "D c #5CFF1F", "E c #5BFF22", "F c #43A313", "G c #336207", "H c #7F7C68", "I c #A99DA4", "J c #EBF6F5", "K c #69667A", "L c #00001C", "M c #040031", "N c #0D0041", "O c #160952", "P c #0B0058", "Q c #1D1F5C", "R c #4CD928", "S c #5AFF20", "T c #58FF21", "U c #2A2105", "V c #253300", "W c #A2E388", "X c #C2C2C5", "Y c #000009", "Z c #070028", "` c #080031", " . c #0B003B", ".. c #0C0048", "+. c #0F0053", "@. c #100061", "#. c #55E729", "$. c #48A518", "%. c #2B2506", "&. c #4BFF0A", "*. c #C1FFAA", "=. c #4E4757", "-. c #010014", ";. c #050021", ">. c #08002C", ",. c #0B0437", "'. c #1F3D39", "). c #1A2A45", "!. c #3D9B36", "~. c #396A0E", "{. c #281104", "]. c #2B9A05", "^. c #07110A", "/. c #030013", "(. c #05001D", "_. c #050028", ":. c #0F1231", "<. c #09003D", "[. c #2B5E3C", "}. c #5AFF22", "|. c #51E91A", "1. c #173C0A", "2. c #02000E", "3. c #070817", "4. c #070622", "5. c #296926", "6. c #43B329", "7. c #59FF21", "8. c #58FF1D", "9. c #40BA17", "0. c #39A41A", "a. c #52F31D", "b. c #59FF22", "c. c #57FF1C", "d. c #5AFF21", " . + ", " @ # # $ ", " % & * * = - ; ", " @ & > , ' ) ! ~ { ", " ] ^ / ( _ : < [ } | 1 ", " 2 3 4 5 6 7 8 9 0 a b c ", " ] d e f g h i j k l m n o p ", "q d r s _ t u v w x y z A B C D ", "E F G H I _ J K L M N O P Q R S ", " T U V W _ X Y Z ` ...+.@.#. ", " $.%.&.*.=.-.;.>.,.'.).!. ", " ~.{.].^./.(._.:.<.[. ", " }.|.1.2.3.4.5.6. ", " 7.8.9.0.a.] ", " b.c.c.d. ", " . 2 "}; ================================================ FILE: app/icons/bluegriffon50.xpm ================================================ /* XPM */ static char * bluegriffon50_xpm[] = { "50 50 899 2", " c None", ". c #59FD21", "+ c #5AFE22", "@ c #60FE2C", "# c #56FE1E", "$ c #55FE1C", "% c #56FE1C", "& c #61FD2C", "* c #61FE2C", "= c #56FE1D", "- c #56FD1E", "; c #60FD2C", "> c #55FF1B", ", c #61FE2B", "' c #57FE1E", ") c #55FE1B", "! c #55FE1D", "~ c #57FE1D", "{ c #56FD1D", "] c #55FD1D", "^ c #60FC2C", "/ c #56FD1C", "( c #58FD20", "_ c #55FD1C", ": c #56FC1E", "< c #1F0B6A", "[ c #10006C", "} c #60FE2B", "| c #57FD1E", "1 c #48FD0A", "2 c #48FE0A", "3 c #57FF1B", "4 c #52ED21", "5 c #252B5A", "6 c #11006E", "7 c #12006E", "8 c #17007B", "9 c #54FE1B", "0 c #41FE00", "a c #95FE71", "b c #92FD6F", "c c #40FE01", "d c #55FD1B", "e c #55FA1E", "f c #5DFF14", "g c #2B524D", "h c #15006C", "i c #130070", "j c #17007A", "k c #15007D", "l c #56FF1D", "m c #3CFE00", "n c #8FFE68", "o c #FCFEFB", "p c #FAFDFA", "q c #8CFD66", "r c #3DFE00", "s c #56FF1C", "t c #55FB1D", "u c #5AFF17", "v c #46BE2D", "w c #1B0964", "x c #12006F", "y c #160073", "z c #160078", "A c #16007B", "B c #60FD2B", "C c #57FD1D", "D c #43FE04", "E c #94FE6F", "F c #FBFEFA", "G c #FFFFFF", "H c #FFFEFF", "I c #FBFDFA", "J c #94FD70", "K c #42FE03", "L c #54FF19", "M c #5EFF13", "N c #284750", "O c #100071", "P c #140077", "Q c #3CFD00", "R c #93FD6F", "S c #FCFEFA", "T c #FEFEFD", "U c #FFFDFF", "V c #96FE73", "W c #49FF0C", "X c #5AFF18", "Y c #5AFF19", "Z c #5CFF17", "` c #60FF12", " . c #36873D", ".. c #170068", "+. c #11006D", "@. c #1F2664", "#. c #150673", "$. c #150078", "%. c #16007C", "&. c #62FE2C", "*. c #8EFD68", "=. c #FAFDF9", "-. c #FDFEFD", ";. c #EEF3EF", ">. c #0D213A", ",. c #1D3B40", "'. c #4CDA23", "). c #337E3B", "!. c #162453", "~. c #43BD2E", "{. c #43BB2E", "]. c #130067", "^. c #15006D", "/. c #284C55", "(. c #170F6E", "_. c #130078", ":. c #64FE2F", "<. c #43FE05", "[. c #FBFDF9", "}. c #FCFCFC", "|. c #FBFBFB", "1. c #D4D4D8", "2. c #DBDBDF", "3. c #EAE5EF", "4. c #2F1C68", "5. c #00004B", "6. c #1A2A48", "7. c #306B3C", "8. c #05005F", "9. c #1E3E4E", "0. c #44B92F", "a. c #0F0464", "b. c #17006A", "c. c #274C53", "d. c #150F6B", "e. c #130076", "f. c #150079", "g. c #15007E", "h. c #17017F", "i. c #FCFDFB", "j. c #CFCFD1", "k. c #494555", "l. c #09051E", "m. c #757381", "n. c #A2A0AD", "o. c #6D6A80", "p. c #7A7699", "q. c #000040", "r. c #110052", "s. c #1A2E49", "t. c #110256", "u. c #131E54", "v. c #3B9737", "w. c #120760", "x. c #11006A", "y. c #2A4A53", "z. c #151169", "A. c #110075", "B. c #20256C", "C. c #1A0E77", "D. c #14007F", "E. c #63FE2F", "F. c #3BFE00", "G. c #8FFE69", "H. c #484755", "I. c #000000", "J. c #242036", "K. c #403D55", "L. c #000011", "M. c #717080", "N. c #BDB9CC", "O. c #00003A", "P. c #120251", "Q. c #0C0052", "R. c #110055", "S. c #121155", "T. c #336C3F", "U. c #16055F", "V. c #0F0065", "W. c #294753", "X. c #150E68", "Y. c #100073", "Z. c #27455E", "`. c #1D1A70", " + c #140080", ".+ c #64FE30", "++ c #93FF6D", "@+ c #CCCBCD", "#+ c #97989C", "$+ c #768A8C", "%+ c #596770", "&+ c #18152A", "*+ c #06001A", "=+ c #0A0420", "-+ c #000016", ";+ c #000014", ">+ c #B9B7BF", ",+ c #E3E3EA", "'+ c #241957", ")+ c #090048", "!+ c #0F014F", "~+ c #0D0054", "{+ c #130455", "]+ c #23494A", "^+ c #160060", "/+ c #1B2956", "(+ c #212D5A", "_+ c #181D65", ":+ c #1F2E64", "<+ c #140078", "[+ c #17007C", "}+ c #63FE2E", "|+ c #44FE04", "1+ c #96FE72", "2+ c #FDFFFD", "3+ c #C9C3CC", "4+ c #B7B6B7", "5+ c #505156", "6+ c #430000", "7+ c #2B0003", "8+ c #08011B", "9+ c #06001C", "0+ c #000010", "a+ c #1B1837", "b+ c #F4F5F4", "c+ c #564D7C", "d+ c #10004F", "e+ c #0E0051", "f+ c #100055", "g+ c #0F0D56", "h+ c #0F0061", "i+ c #233852", "j+ c #191F5D", "k+ c #1E315E", "l+ c #1C2366", "m+ c #0F007B", "n+ c #1D196F", "o+ c #408553", "p+ c #63FD2E", "q+ c #54FD1B", "r+ c #3BFD00", "s+ c #91FA6E", "t+ c #C0BAC2", "u+ c #060810", "v+ c #000002", "w+ c #890003", "x+ c #62000A", "y+ c #000017", "z+ c #050018", "A+ c #09031F", "B+ c #33304A", "C+ c #C1BFC8", "D+ c #8885A4", "E+ c #000038", "F+ c #0C004C", "G+ c #0F004F", "H+ c #0E0053", "I+ c #100057", "J+ c #0B005E", "K+ c #212A55", "L+ c #120F60", "M+ c #1B0F61", "N+ c #2B5050", "O+ c #0F0071", "P+ c #110077", "Q+ c #263F61", "R+ c #2F6156", "S+ c #346162", "T+ c #56FD1F", "U+ c #90FD6A", "V+ c #F6F8F6", "W+ c #6B6C6B", "X+ c #0D0A0D", "Y+ c #100F16", "Z+ c #000003", "`+ c #000004", " @ c #040017", ".@ c #010016", "+@ c #020019", "@@ c #82828F", "#@ c #9B98B3", "$@ c #070041", "%@ c #090047", "&@ c #0E0052", "*@ c #100056", "=@ c #100B57", "-@ c #171659", ";@ c #120062", ">@ c #264D50", ",@ c #20235E", "'@ c #0E0070", ")@ c #16096E", "!@ c #2F5E54", "~@ c #15007C", "{@ c #336E54", "]@ c #6AFF27", "^@ c #5AFF1E", "/@ c #54FF1A", "(@ c #43FF05", "_@ c #96FD72", ":@ c #FBFEFB", "<@ c #FFFAFF", "[@ c #929392", "}@ c #747171", "|@ c #EFEBEB", "1@ c #F8FEFD", "2@ c #C6D8DA", "3@ c #364A53", "4@ c #000007", "5@ c #030017", "6@ c #050019", "7@ c #0B0421", "8@ c #0C0828", "9@ c #211D3B", "0@ c #898798", "a@ c #908AA6", "b@ c #000035", "c@ c #0B0046", "d@ c #0E004D", "e@ c #0E0050", "f@ c #0F0054", "g@ c #100456", "h@ c #0B005D", "i@ c #181B51", "j@ c #25554C", "k@ c #170069", "l@ c #12006D", "m@ c #1F395E", "n@ c #1F2A66", "o@ c #0F0080", "p@ c #316B52", "q@ c #64FF2C", "r@ c #62FD2D", "s@ c #57FF1D", "t@ c #55FA1C", "u@ c #4BDD19", "v@ c #44E30A", "w@ c #94F771", "x@ c #FDFEFB", "y@ c #FFF5F5", "z@ c #FFD2D1", "A@ c #E68A8B", "B@ c #1D111F", "C@ c #08031B", "D@ c #312E4A", "E@ c #09042A", "F@ c #706D84", "G@ c #7F7B99", "H@ c #00002C", "I@ c #0E0046", "J@ c #0D004A", "K@ c #0F004E", "L@ c #0D0151", "M@ c #110054", "N@ c #11005F", "O@ c #40605F", "P@ c #1A1061", "Q@ c #0F0067", "R@ c #1C0F64", "S@ c #20385C", "T@ c #140171", "U@ c #0F007E", "V@ c #398A46", "W@ c #5DFF10", "X@ c #39A613", "Y@ c #3AAB14", "Z@ c #306A01", "`@ c #332D12", " # c #F7F9F5", ".# c #FEFEFE", "+# c #FDFEFE", "@# c #FFCCCC", "## c #FE5C5C", "$# c #FF1C1B", "%# c #FF1514", "&# c #F03333", "*# c #201523", "=# c #99989F", "-# c #919099", ";# c #8B8B97", "># c #B4B3BC", ",# c #737082", "'# c #58547C", ")# c #000032", "!# c #0D0047", "~# c #100050", "{# c #000048", "]# c #4F4682", "^# c #574A8E", "/# c #0F005C", "(# c #0D0063", "_# c #232F5A", ":# c #140969", "<# c #160572", "[# c #47BF32", "}# c #5DFF13", "|# c #59FE21", "1# c #58FF1E", "2# c #4FF01B", "3# c #429F13", "4# c #170000", "5# c #502D39", "6# c #F6F7F6", "7# c #F2F2F2", "8# c #FEFCFC", "9# c #FE8989", "0# c #FE2828", "a# c #FE4949", "b# c #FF9898", "c# c #BA8F90", "d# c #2F2831", "e# c #000009", "f# c #898990", "g# c #D4D3DA", "h# c #78768B", "i# c #4F496D", "j# c #4C466B", "k# c #50486E", "l# c #231B4F", "m# c #07003B", "n# c #0E0044", "o# c #0D0046", "p# c #0D004B", "q# c #09004B", "r# c #1B115C", "s# c #5C548A", "t# c #181063", "u# c #0D005B", "v# c #140A5F", "w# c #160C63", "x# c #180069", "y# c #0C0074", "z# c #284C56", "A# c #59FF19", "B# c #55FC1C", "C# c #53F31B", "D# c #54F41C", "E# c #61FF22", "F# c #3A720E", "G# c #130000", "H# c #827475", "I# c #FCFFFE", "J# c #949595", "K# c #D6DDDD", "L# c #FFE8E8", "M# c #FEBEBE", "N# c #FEEEEE", "O# c #C5D8DA", "P# c #6F8285", "Q# c #8B9296", "R# c #E8E7E9", "S# c #F3F2F5", "T# c #545168", "U# c #000020", "V# c #000021", "W# c #00001E", "X# c #000028", "Y# c #02002F", "Z# c #070035", "`# c #0C013F", " $ c #0E0042", ".$ c #0D0045", "+$ c #0D0048", "@$ c #080048", "#$ c #291F64", "$$ c #34296D", "%$ c #030050", "&$ c #10015F", "*$ c #150060", "=$ c #100064", "-$ c #1A1865", ";$ c #50EB23", ">$ c #5BFF15", ",$ c #59FE22", "'$ c #59FF1E", ")$ c #34560B", "!$ c #2E3708", "~$ c #54F01C", "{$ c #37640C", "]$ c #73A252", "^$ c #E0F5D7", "/$ c #BCAFB3", "($ c #9E9B9B", "_$ c #CCCDCD", ":$ c #FEFFFF", "<$ c #FDFFFF", "[$ c #EAEAED", "}$ c #2B2841", "|$ c #000012", "1$ c #010022", "2$ c #06002A", "3$ c #07002D", "4$ c #080031", "5$ c #090034", "6$ c #0A0037", "7$ c #0B003B", "8$ c #0C0040", "9$ c #0E0043", "0$ c #130552", "a$ c #0F0254", "b$ c #0B015C", "c$ c #17005F", "d$ c #0D0065", "e$ c #180F62", "f$ c #47B830", "g$ c #4BD029", "h$ c #50E324", "i$ c #54FD1C", "j$ c #62FE2D", "k$ c #54FF1C", "l$ c #3B9C12", "m$ c #281204", "n$ c #1D0000", "o$ c #375C0C", "p$ c #3A6B0E", "q$ c #1F0000", "r$ c #44AD0F", "s$ c #3B3A17", "t$ c #37151C", "u$ c #C6BEBF", "v$ c #FDFDFD", "w$ c #3F3B4D", "x$ c #00000C", "y$ c #080327", "z$ c #070026", "A$ c #08002A", "B$ c #090030", "C$ c #090035", "D$ c #0A0036", "E$ c #0B0039", "F$ c #0B003E", "G$ c #0D0042", "H$ c #0E0048", "I$ c #0D0050", "J$ c #100054", "K$ c #0F0158", "L$ c #0E0060", "M$ c #212955", "N$ c #35853D", "O$ c #2A4C52", "P$ c #202E5D", "Q$ c #4FDE26", "R$ c #59FF17", "S$ c #61FE2D", "T$ c #66FF2F", "U$ c #4FE71B", "V$ c #36A111", "W$ c #4AB015", "X$ c #2B2806", "Y$ c #260903", "Z$ c #2D2D07", "`$ c #250402", " % c #2B1A07", ".% c #1C0000", "+% c #3C2022", "@% c #E5DBE3", "#% c #919097", "$% c #00000A", "%% c #05001E", "&% c #050021", "*% c #050026", "=% c #080029", "-% c #08012C", ";% c #08002E", ">% c #090033", ",% c #0B0035", "'% c #0A0038", ")% c #0C003C", "!% c #0C0041", "~% c #0D0044", "{% c #100156", "]% c #20444B", "^% c #2C514A", "/% c #15155D", "(% c #2A4A54", "_% c #5AFF15", ":% c #57FF1C", "<% c #60F62D", "[% c #53F11D", "}% c #5CFF1F", "|% c #4FD41A", "1% c #240202", "2% c #210000", "3% c #230001", "4% c #33460B", "5% c #3BAE06", "6% c #8FFF68", "7% c #FBFFF9", "8% c #F4F3F3", "9% c #151425", "0% c #00000B", "a% c #07001B", "b% c #03001F", "c% c #050024", "d% c #070027", "e% c #08012B", "f% c #0B0036", "g% c #0A003A", "h% c #0C003F", "i% c #0D0049", "j% c #0D0051", "k% c #120254", "l% c #10005F", "m% c #110065", "n% c #0F0066", "o% c #44AE32", "p% c #5BFF17", "q% c #62FD2F", "r% c #63FF2E", "s% c #57FF1E", "t% c #5BFF1F", "u% c #37640D", "v% c #200000", "w% c #220000", "x% c #314309", "y% c #5DFF20", "z% c #5AFF20", "A% c #42FF01", "B% c #88FE61", "C% c #F6FDF3", "D% c #FCFDFC", "E% c #FAFAFA", "F% c #8C8B91", "G% c #000006", "H% c #05001D", "I% c #040022", "J% c #050025", "K% c #08002B", "L% c #08002F", "M% c #0B0038", "N% c #0B003C", "O% c #0D0041", "P% c #0E0054", "Q% c #0E0057", "R% c #0B005F", "S% c #120063", "T% c #317640", "U% c #5CFF18", "V% c #61FC2D", "W% c #4EDA18", "X% c #271203", "Y% c #34540A", "Z% c #5CFF20", "`% c #57FF1F", " & c #46FE07", ".& c #89FD61", "+& c #F6FEF3", "@& c #423F49", "#& c #020017", "$& c #05001A", "%& c #07001C", "&& c #040020", "*& c #08002D", "=& c #090135", "-& c #0B0037", ";& c #0C0043", ">& c #0A0047", ",& c #09004C", "'& c #0C0050", ")& c #0E0351", "!& c #140B53", "~& c #1B324E", "{& c #3DA832", "]& c #5CFF19", "^& c #63FF2D", "/& c #59FF1F", "(& c #35540B", "_& c #250502", ":& c #45A513", "<& c #5BFF20", "[& c #56FA1D", "}& c #3FFD00", "|& c #83FF5A", "1& c #EEF8EB", "2& c #BBBCBB", "3& c #0B0914", "4& c #000008", "5& c #020014", "6& c #030018", "7& c #07001A", "8& c #050023", "9& c #060026", "0& c #07002C", "a& c #09002F", "b& c #0A0136", "c& c #090039", "d& c #07003E", "e& c #0F0840", "f& c #151C40", "g& c #1C333F", "h& c #234A3F", "i& c #2D683A", "j& c #398C33", "k& c #2A5F40", "l& c #51E722", "m& c #429313", "n& c #230002", "o& c #3C760F", "p& c #56FB1E", "q& c #36E100", "r& c #6BC54C", "s& c #89838F", "t& c #050010", "u& c #040013", "v& c #020016", "w& c #06001B", "x& c #090031", "y& c #101435", "z& c #214732", "A& c #31772E", "B& c #3A982C", "C& c #3D9F2B", "D& c #2F7235", "E& c #1C2E45", "F& c #080055", "G& c #1B254E", "H& c #5AD934", "I& c #4FA023", "J& c #281405", "K& c #303F09", "L& c #281404", "M& c #2D2C07", "N& c #4BCA17", "O& c #3AAE13", "P& c #239100", "Q& c #90FF66", "R& c #4F5851", "S& c #03010F", "T& c #050011", "U& c #020015", "V& c #040023", "W& c #07012C", "X& c #06002F", "Y& c #070034", "Z& c #111534", "`& c #1D3831", " * c #192D36", ".* c #13153E", "+* c #080047", "@* c #05004C", "#* c #080051", "$* c #19224A", "%* c #48A73F", "&* c #240003", "** c #37600C", "=* c #50DF19", "-* c #2E3307", ";* c #250903", ">* c #4BB016", ",* c #37AC13", "'* c #246A0B", ")* c #42D10F", "!* c #17370B", "~* c #00010D", "{* c #030012", "]* c #050020", "^* c #080028", "/* c #0C0F2D", "(* c #0C0C31", "_* c #080036", ":* c #050039", "<* c #08003C", "[* c #120C41", "}* c #111042", "|* c #2A6139", "1* c #58D634", "2* c #2A2006", "3* c #5EFF22", "4* c #303D08", "5* c #2C1D05", "6* c #2E7B0E", "7* c #226C0B", "8* c #349A11", "9* c #163807", "0* c #03000F", "a* c #010014", "b* c #030019", "c* c #04001E", "d* c #070126", "e* c #255827", "f* c #1F4A2B", "g* c #0D0F32", "h* c #0D0935", "i* c #0F1138", "j* c #172B38", "k* c #204437", "l* c #4ACB24", "m* c #5CFF21", "n* c #54F61B", "o* c #280D03", "p* c #2D650C", "q* c #22710C", "r* c #3BAE15", "s* c #1D4F0C", "t* c #01010D", "u* c #030013", "v* c #020018", "w* c #050120", "x* c #020025", "y* c #030029", "z* c #05002C", "A* c #07002F", "B* c #0A0431", "C* c #0B0535", "D* c #090038", "E* c #0D0A3A", "F* c #296534", "G* c #57D633", "H* c #250002", "I* c #220001", "J* c #65FF2F", "K* c #58FF1F", "L* c #55FB1B", "M* c #4BC517", "N* c #4EDE1A", "O* c #3FBB15", "P* c #5CFF1E", "Q* c #297410", "R* c #01000A", "S* c #00010E", "T* c #03000E", "U* c #040012", "V* c #04001B", "W* c #03001E", "X* c #173822", "Y* c #328222", "Z* c #338923", "`* c #286426", " = c #214A2B", ".= c #224B2D", "+= c #2D742A", "@= c #44BE25", "#= c #67FF2B", "$= c #62FC2F", "%= c #5AFF1F", "&= c #5DFF1E", "*= c #49D419", "== c #0A1506", "-= c #000005", ";= c #00000D", ">= c #0F2810", ",= c #090C11", "'= c #0E2518", ")= c #101F1B", "!= c #00001C", "~= c #050221", "{= c #0D1624", "]= c #204E24", "^= c #43BB20", "/= c #5CFF1C", "(= c #59FF1B", "_= c #5EFF1C", ":= c #54F91C", "<= c #5FFF1F", "[= c #369E14", "}= c #040505", "|= c #102E11", "1= c #215514", "2= c #070D15", "3= c #338C1C", "4= c #22571C", "5= c #0B121F", "6= c #040024", "7= c #070327", "8= c #256026", "9= c #5BFF1B", "0= c #59FF1D", "a= c #64FF2D", "b= c #5EFF20", "c= c #3FB616", "d= c #215E0F", "e= c #174211", "f= c #4CD71B", "g= c #2F8117", "h= c #081114", "i= c #2C7E1A", "j= c #62FF1D", "k= c #49D41D", "l= c #3CAC1F", "m= c #44C31F", "n= c #58FF1D", "o= c #62FD2E", "p= c #5DFF1F", "q= c #52F01C", "r= c #5CFF1D", "s= c #4FE51C", "t= c #4EE41C", "u= c #54F71D", "v= c #5DFF1C", "w= c #59FF1A", "x= c #63FC2E", "y= c #5AFF1D", "z= c #55FF1C", "A= c #55FF1D", "B= c #56FE1B", "C= c #64FD2F", "D= c #54FE1C", "E= c #5BFE25", "F= c #5CFD25", " . + ", " @ # $ % # & ", " * # % = = $ - ; ", " * # $ = % = % > = * ", " , ' ) ! = % ~ % % ) - , ", " * ' $ ! % $ = = $ % { $ ~ @ ", " & # $ { = $ % = { $ $ ] = $ = ^ ", " ; - $ % = { ] / ( ( _ { ! / = ) : < [ ", " } | $ % % = { $ ' 1 2 ' { { / = % 3 4 5 6 7 8 ", " } - _ = = $ = = 9 0 a b c d { / % ! e f g h 6 i j k ", " } # $ % % l $ ' = m n o p q r = ' s = t u v w 6 x y z A ", " B - $ = C = = % % D E F G H I J K L { ] { - M N h 6 O P j k ", " B - $ % ] { = { d Q R S H T T U p V W X Y Y Z ` ...+.@.#.$.%. ", " &.~ = = = = = ' % m *.=.U -.G G G G ;.>.,.'.).!.~.{.].^./.(._.j ", " :.' $ = = = l = = <.E [.H }.G |.1.2.G 3.4.5.6.7.8.9.0.a.b.c.d.e.f.g.h. ", " :.' $ = = = = # $ r a i.H |.G j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D. ", " E.' = = = = # ' $ F.G.o G G G G H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. + ", " .+' % = = ' = ' ~ Q ++G G @+#+$+%+&+*+=+-+;+>+,+'+)+!+~+{+]+^+/+(+x _+:+<+[+ ", " }+= $ = = ] = - _ |+1+2+3+4+5+I.6+7+;+8+9+0+a+b+G c+O.d+e+f+g+h+i+j+h k+l+m+n+o+ ", " p+~ ) = = ! { = q+r+s+G t+I.I.u+v+w+x+y+z+A+B+C+G G D+E+F+G+H+I+J+K+L+M+N+O+P+Q+R+S+ ", " :.# $ = = ~ = T+_ m U+V+G W+I.X+Y+Z+`+;+ @.@+@@@G G G #@$@%@G+&@*@=@-@;@>@,@'@)@!@~@{@]@ ", " }+# 9 = _ l ^@- /@(@_@:@<@G [@}@|@1@2@3@4@5@6@7@8@9@0@G a@b@c@d@e@f@g@h@i@j@k@l@m@n@o@p@Y q@ ", " r@| $ = ~ s@t@u@> v@w@x@U -.}.G G G y@z@A@B@L.C@4@4@D@E@F@G@H@I@J@K@L@M@N@O@P@Q@R@S@T@U@V@W@s@}+ ", " ' % { # s@s@X@Y@Z@`@ #G G .#+#G @###$#%#&#*#4@=#-#;#G >#,#'#)#I@!#d@~#{#]#^#/#(#_#:#O <#[#}#] ' ", "|#$ = ! ] 1#1#2#3#4#5#G 6#7#G 8#9#0#a#b#c#d#e#f#G g#h#i#j#k#l#m#n#o#p#q#r#s#t#u#v#w#x#y#z#A#3 l $ . ", "+ _ = B#s@C#D#E#F#G#H#G I#J#K#L#M#N#G O#P#Q#R#S#T#U#V#W#X#Y#Z#`# $.$+$@$#$$$%$&$*$=$h -$;$>$t ! ) ,$", " # _ 1#'$)$!$~${$4#]$^$/$($_$G :$:$<$G G G [$}$|$1$2$3$4$5$6$7$8$9$o#p#0$a$M@b$c$d$e$f$g$h$3 i$= ", " j$1#k$l$m$n$o$p$q$r$s$n$t$u$G G .#.#v$G v$w$x$y$z$A$3$B$C$D$E$F$G$.$H$d@I$J$K$L$M$N$O$P$Q$R$# S$ ", " T$U$V$W$X$Y$Z$`$ %n$.%+%@%G .#.#.#.#G #%$%%%&%*%=%-%;%>%,%'%)%!%~%o#d@G+~+{%]%^%/%'@(%_%:%j$ ", " <%[%}%|%1%2%3%2%4%5%6%7%U -.v$v$G 8%9%0%a%b%c%d%e%3$B$C$f%g%h%G$.$i%K@j%k%=@l%m%n%o%p%q% ", " r%s%t%u%v%w%x%y%z%A%B%C%H D%E%G F%G%;+a%H%I%J%=%K%L%>%D$M%N%O%~%!#d@G+P%Q%R%S%T%U%V% ", " j$z%W%X%2%Y%Z%`%] &.&+&G .#G @&I.#&$&%&&&c%d%e%*&4$=&-&g%h%;&>&,&'&)&!&~&{&]&^& ", " /&(&q$_&:&<&`%[&}&|&1&G 2&3&4&5&6&7&H%8&9&=%0&a&>%b&c&d&e&f&g&h&i&j&k&l& ", " m&v%2%n&o&p&<&:%q&r&G s&I.t&u&v&*+w&&&J%d%e%*&x&C$y&z&A&B&C&D&E&F&G&H& ", " I&J&K&L&q$M&N&E#O&P&Q&R&I.S&T&U&6&a%H%V&9&A$W&X&Y&Z&`& *.*+*@*#*$*%* ", " &***=*-*n$;*>*,*'*)*!*0%~*T&{*#&w&9+]*J%^*K%/*(*_*:*<*8$[*}*|*1* ", " 2%2*3*_ 4*.%5*6*7*8*9*4&~*0*T&a*b*%&c*8&d*2$e*f*g*h*i*j*k*l* ", " 3%n& m*n*x%o*p*q*r*s*`+~*t*t&u*v*w&9+w*x*y*z*A*B*C*D*E*F*G* ", " H*I* J*K*L*M*N*O*P*Q*v+R*S*T*U*U&b*V*W*X*Y*Z*`* =.=+=@=#= ", " $=K*%=%='$&=*===-=;=>=,=|$'=)=!=~={=]=^=/=(=_= ", " E.' _ l :=<=[=}=G%|=1=|$2=3=4=5=6=7=8=9=0=a= ", " p+C $ = = b=c=d=e=f=g=h=i=j=k=l=m=9=n=o= ", " }+# ) C t@p=P*q== r=s=t=u=0=v=w=p&x= ", " ' $ = ! s%y=l s@r=y== = z=# ", " E.' $ = A=s % # = % = B=' E. ", " E.' i$$ s % l $ % ) ' E. ", " # $ ! % s % ) ' ", " E.| $ = l $ - E. ", " C=' D=D=| E. ", " E=F= "}; ================================================ FILE: app/macbuild/Contents/Info.plist.in ================================================ CFBundleDevelopmentRegion English CFBundleDocumentTypes CFBundleTypeExtensions html htm shtml xml xhtml shtm xhtm CFBundleTypeName HTML Document CFBundleTypeOSTypes HTML CFBundleTypeRole Editor CFBundleExecutable bluegriffon-bin CFBundleGetInfoString %MAC_APP_NAME% %APP_VERSION%, © 2007-2017 Disruptive Innovations CFBundleIconFile bluegriffon CFBundleIdentifier com.disruptive-innovations.bluegriffon2 CFBundleInfoDictionaryVersion 6.0 CFBundleName %MAC_APP_NAME% CFBundlePackageType APPL CFBundleShortVersionString %APP_VERSION% CFBundleSignature MOZB CFBundleVersion %APP_VERSION% NSAppleScriptEnabled CFBundleURLTypes CFBundleURLIconFile document.icns CFBundleURLName http URL CFBundleURLSchemes http CFBundleURLIconFile document.icns CFBundleURLName https URL CFBundleURLSchemes https CFBundleURLName ftp URL CFBundleURLSchemes ftp CFBundleURLName file URL CFBundleURLSchemes file CGDisableCoalescedUpdates LSMinimumSystemVersion 10.6 LSMinimumSystemVersionByArchitecture i386 10.6.0 x86_64 10.6.0 NSSupportsAutomaticGraphicsSwitching NSPrincipalClass GeckoNSApplication NSHighResolutionCapable ================================================ FILE: app/macbuild/Contents/MacOS-files.in ================================================ /*.app/*** /*.dylib /certutil /bluegriffon-bin /gtest/*** /pk12util /ssltunnel /xpcshell /XUL ================================================ FILE: app/macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in ================================================ CFBundleName = "%MAC_APP_NAME%"; NSHumanReadableCopyright = "Copyright © 2008 Disruptive Innovations"; ================================================ FILE: app/macversion.py ================================================ #!/usr/bin/python # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. from optparse import OptionParser import sys import re o = OptionParser() o.add_option("--buildid", dest="buildid") o.add_option("--version", dest="version") (options, args) = o.parse_args() if not options.buildid: print >>sys.stderr, "--buildid is required" sys.exit(1) if not options.version: print >>sys.stderr, "--version is required" sys.exit(1) # We want to build a version number that matches the format allowed for # CFBundleVersion (nnnnn[.nn[.nn]]). We'll incorporate both the version # number as well as the date, so that it changes at least daily (for nightly # builds), but also so that newly-built older versions (e.g. beta build) aren't # considered "newer" than previously-built newer versions (e.g. a trunk nightly) buildid = open(options.buildid, 'r').read() # extract only the major version (i.e. "14" from "14.0b1") majorVersion = re.match(r'^(\d+)[^\d].*', options.version).group(1) # last two digits of the year twodigityear = buildid[2:4] month = buildid[4:6] if month[0] == '0': month = month[1] day = buildid[6:8] if day[0] == '0': day = day[1] print '%s.%s.%s' % (majorVersion + twodigityear, month, day) ================================================ FILE: app/moz.build ================================================ # -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*- # vim: set filetype=python: # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. #DIRS += ['profile/extensions'] if CONFIG['OS_ARCH'] == 'WINNT' and (CONFIG['MOZ_METRO'] or CONFIG['MOZ_ASAN']): GeckoProgram(CONFIG['MOZ_APP_NAME']) else: GeckoProgram(CONFIG['MOZ_APP_NAME'], msvcrt='static') JS_PREFERENCE_FILES += [ 'profile/bluegriffon-prefs.js', ] if CONFIG['LIBXUL_SDK']: PREF_JS_EXPORTS += [ 'profile/channel-prefs.js', ] SOURCES += [ 'nsEditorApp.cpp', ] #FINAL_TARGET_FILES += ['blocklist.xml'] FINAL_TARGET_FILES.defaults.profile += ['profile/prefs.js'] DEFINES['APP_VERSION'] = CONFIG['MOZ_APP_VERSION'] for var in ('MOZILLA_OFFICIAL', 'LIBXUL_SDK'): if CONFIG[var]: DEFINES[var] = True LOCAL_INCLUDES += [ '!/build', '/toolkit/xre', '/xpcom/base', '/xpcom/build', ] if not CONFIG['MOZ_METRO']: DELAYLOAD_DLLS += [ 'mozglue.dll', ] USE_LIBS += [ 'mozglue', ] if CONFIG['_MSC_VER']: # Always enter a Windows program through wmain, whether or not we're # a console application. WIN32_EXE_LDFLAGS += ['-ENTRY:wmainCRTStartup'] if CONFIG['OS_ARCH'] == 'WINNT': RCINCLUDE = 'splash.rc' DEFINES['MOZ_PHOENIX'] = True # Control the default heap size. # This is the heap returned by GetProcessHeap(). # As we use the CRT heap, the default size is too large and wastes VM. # # The default heap size is 1MB on Win32. # The heap will grow if need be. # # Set it to 256k. See bug 127069. if CONFIG['OS_ARCH'] == 'WINNT' and not CONFIG['GNU_CC']: LDFLAGS += ['/HEAP:0x40000'] DISABLE_STL_WRAPPING = True if CONFIG['MOZ_LINKER']: OS_LIBS += CONFIG['MOZ_ZLIB_LIBS'] if CONFIG['HAVE_CLOCK_MONOTONIC']: OS_LIBS += CONFIG['REALTIME_LIBS'] #JAR_MANIFESTS += ['jar.mn'] #FAIL_ON_WARNINGS = True ================================================ FILE: app/mozilla.in ================================================ #!/bin/sh # # ***** BEGIN LICENSE BLOCK ***** # Version: MPL 1.1/GPL 2.0/LGPL 2.1 # # The contents of this file are subject to the Mozilla Public License Version # 1.1 (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. # # The Original Code is mozilla.org Code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 1998 # the Initial Developer. All Rights Reserved. # # Contributor(s): # # Alternatively, the contents of this file may be used under the terms of # either the GNU General Public License Version 2 or later (the "GPL"), or # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), # in which case the provisions of the GPL or the LGPL are applicable instead # of those above. If you wish to allow use of your version of this file only # under the terms of either the GPL or the LGPL, and not to allow others to # use your version of this file under the terms of the MPL, indicate your # decision by deleting the provisions above and replace them with the notice # and other provisions required by the GPL or the LGPL. If you do not delete # the provisions above, a recipient may use your version of this file under # the terms of any one of the MPL, the GPL or the LGPL. # # ***** END LICENSE BLOCK ***** ## $Id: mozilla.in,v 1.16 2007/10/05 07:29:26 reed%reedloden.com Exp $ ## ## Usage: ## ## $ mozilla [args] ## ## This script is meant to run the mozilla-bin binary from either ## mozilla/xpfe/bootstrap or mozilla/dist/bin. ## ## The script will setup all the environment voodoo needed to make ## the mozilla-bin binary to work. ## #uncomment for debugging #set -x moz_libdir=%MOZAPPDIR% # Use run-mozilla.sh in the current dir if it exists # If not, then start resolving symlinks until we find run-mozilla.sh found=0 progname="$0" curdir=`dirname "$progname"` progbase=`basename "$progname"` run_moz="$curdir/run-mozilla.sh" if test -x "$run_moz"; then dist_bin="$curdir" found=1 else here=`/bin/pwd` while [ -h "$progname" ]; do bn=`basename "$progname"` cd `dirname "$progname"` progname=`/bin/ls -l "$bn" | sed -e 's/^.* -> //' ` progbase=`basename "$progname"` if [ ! -x "$progname" ]; then break fi curdir=`dirname "$progname"` run_moz="$curdir/run-mozilla.sh" if [ -x "$run_moz" ]; then cd "$curdir" dist_bin=`pwd` run_moz="$dist_bin/run-mozilla.sh" found=1 break fi done cd "$here" fi if [ $found = 0 ]; then # Check default compile-time libdir if [ -x "$moz_libdir/run-mozilla.sh" ]; then dist_bin="$moz_libdir" else echo "Cannot find mozilla runtime directory. Exiting." exit 1 fi fi script_args="" debugging=0 MOZILLA_BIN="${progbase}-bin" if [ "$OSTYPE" = "beos" ]; then mimeset -F "$MOZILLA_BIN" fi pass_arg_count=0 while [ $# -gt $pass_arg_count ] do case "$1" in -p | --pure | -pure) MOZILLA_BIN="${MOZILLA_BIN}.pure" shift ;; -g | --debug) script_args="$script_args -g" debugging=1 shift ;; -d | --debugger) script_args="$script_args -d $2" shift 2 ;; *) # Move the unrecognized argument to the end of the list. arg="$1" shift set -- "$@" "$arg" pass_arg_count=`expr $pass_arg_count + 1` ;; esac done if [ $debugging = 1 ] then echo $dist_bin/run-mozilla.sh $script_args $dist_bin/$MOZILLA_BIN "$@" fi "$dist_bin/run-mozilla.sh" $script_args "$dist_bin/$MOZILLA_BIN" "$@" exitcode=$? exit $exitcode # EOF. ================================================ FILE: app/nsEditorApp.cpp ================================================ /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "nsXULAppAPI.h" #include "mozilla/XREAppData.h" #include "application.ini.h" #include "mozilla/Bootstrap.h" #if defined(XP_WIN) #include #include #elif defined(XP_UNIX) #include #include #endif #include #include #include #include "nsCOMPtr.h" #include "nsIFile.h" #ifdef XP_WIN #ifdef MOZ_ASAN // ASAN requires firefox.exe to be built with -MD, and it's OK if we don't // support Windows XP SP2 in ASAN builds. #define XRE_DONT_SUPPORT_XPSP2 #endif #define XRE_WANT_ENVIRON #define strcasecmp _stricmp #ifdef MOZ_SANDBOX #include "mozilla/sandboxing/SandboxInitialization.h" #endif #endif #include "BinaryPath.h" #include "nsXPCOMPrivate.h" // for MAXPATHLEN and XPCOM_DLL #include "mozilla/Sprintf.h" #include "mozilla/StartupTimeline.h" #include "mozilla/WindowsDllBlocklist.h" #ifdef LIBFUZZER #include "FuzzerDefs.h" #endif #ifdef MOZ_LINUX_32_SSE2_STARTUP_ERROR #include #include "mozilla/Unused.h" static bool IsSSE2Available() { // The rest of the app has been compiled to assume that SSE2 is present // unconditionally, so we can't use the normal copy of SSE.cpp here. // Since SSE.cpp caches the results and we need them only transiently, // instead of #including SSE.cpp here, let's just inline the specific check // that's needed. unsigned int level = 1u; unsigned int eax, ebx, ecx, edx; unsigned int bits = (1u<<26); unsigned int max = __get_cpuid_max(0, nullptr); if (level > max) { return false; } __cpuid_count(level, 0, eax, ebx, ecx, edx); return (edx & bits) == bits; } static const char sSSE2Message[] = "This browser version requires a processor with the SSE2 instruction " "set extension.\nYou may be able to obtain a version that does not " "require SSE2 from your Linux distribution.\n"; __attribute__((constructor)) static void SSE2Check() { if (IsSSE2Available()) { return; } // Using write() in order to avoid jemalloc-based buffering. Ignoring return // values, since there isn't much we could do on failure and there is no // point in trying to recover from errors. MOZ_UNUSED(write(STDERR_FILENO, sSSE2Message, MOZ_ARRAY_LENGTH(sSSE2Message) - 1)); // _exit() instead of exit() to avoid running the usual "at exit" code. _exit(255); } #endif #if !defined(MOZ_WIDGET_COCOA) && !defined(MOZ_WIDGET_ANDROID) #define MOZ_BROWSER_CAN_BE_CONTENTPROC #include "../../ipc/contentproc/plugin-container.cpp" #endif using namespace mozilla; #ifdef XP_MACOSX #define kOSXResourcesFolder "Resources" #endif #define kDesktopFolder "browser" static void Output(const char *fmt, ... ) { va_list ap; va_start(ap, fmt); #ifndef XP_WIN vfprintf(stderr, fmt, ap); #else char msg[2048]; vsnprintf_s(msg, _countof(msg), _TRUNCATE, fmt, ap); wchar_t wide_msg[2048]; MultiByteToWideChar(CP_UTF8, 0, msg, -1, wide_msg, _countof(wide_msg)); #if MOZ_WINCONSOLE fwprintf_s(stderr, wide_msg); #else // Linking user32 at load-time interferes with the DLL blocklist (bug 932100). // This is a rare codepath, so we can load user32 at run-time instead. HMODULE user32 = LoadLibraryW(L"user32.dll"); if (user32) { decltype(MessageBoxW)* messageBoxW = (decltype(MessageBoxW)*) GetProcAddress(user32, "MessageBoxW"); if (messageBoxW) { messageBoxW(nullptr, wide_msg, L"BlueGriffon", MB_OK | MB_ICONERROR | MB_SETFOREGROUND); } FreeLibrary(user32); } #endif #endif va_end(ap); } /** * Return true if |arg| matches the given argument name. */ static bool IsArg(const char* arg, const char* s) { if (*arg == '-') { if (*++arg == '-') ++arg; return !strcasecmp(arg, s); } #if defined(XP_WIN) if (*arg == '/') return !strcasecmp(++arg, s); #endif return false; } Bootstrap::UniquePtr gBootstrap; static int do_main(int argc, char* argv[], char* envp[]) { // Allow firefox.exe to launch XULRunner apps via -app // Note that -app must be the *first* argument. const char *appDataFile = getenv("XUL_APP_FILE"); if ((!appDataFile || !*appDataFile) && (argc > 1 && IsArg(argv[1], "app"))) { if (argc == 2) { Output("Incorrect number of arguments passed to -app"); return 255; } appDataFile = argv[2]; char appEnv[MAXPATHLEN]; SprintfLiteral(appEnv, "XUL_APP_FILE=%s", argv[2]); if (putenv(strdup(appEnv))) { Output("Couldn't set %s.\n", appEnv); return 255; } argv[2] = argv[0]; argv += 2; argc -= 2; } else if (argc > 1 && IsArg(argv[1], "xpcshell")) { for (int i = 1; i < argc; i++) { argv[i] = argv[i + 1]; } XREShellData shellData; #if defined(XP_WIN) && defined(MOZ_SANDBOX) shellData.sandboxBrokerServices = sandboxing::GetInitializedBrokerServices(); #endif return gBootstrap->XRE_XPCShellMain(--argc, argv, envp, &shellData); } BootstrapConfig config; if (appDataFile && *appDataFile) { config.appData = nullptr; config.appDataPath = appDataFile; } else { // no -app flag so we use the compiled-in app data config.appData = &sAppData; config.appDataPath = kDesktopFolder; } #if defined(XP_WIN) && defined(MOZ_SANDBOX) sandbox::BrokerServices* brokerServices = sandboxing::GetInitializedBrokerServices(); sandboxing::PermissionsService* permissionsService = sandboxing::GetPermissionsService(); #if defined(MOZ_CONTENT_SANDBOX) if (!brokerServices) { Output("Couldn't initialize the broker services.\n"); return 255; } #endif config.sandboxBrokerServices = brokerServices; config.sandboxPermissionsService = permissionsService; #endif #ifdef LIBFUZZER if (getenv("LIBFUZZER")) gBootstrap->XRE_LibFuzzerSetDriver(fuzzer::FuzzerDriver); #endif return gBootstrap->XRE_main(argc, argv, config); } static nsresult InitXPCOMGlue(const char *argv0) { UniqueFreePtr exePath = BinaryPath::Get(argv0); if (!exePath) { Output("Couldn't find the application directory.\n"); return NS_ERROR_FAILURE; } gBootstrap = mozilla::GetBootstrap(exePath.get()); if (!gBootstrap) { Output("Couldn't load XPCOM.\n"); return NS_ERROR_FAILURE; } // This will set this thread as the main thread. gBootstrap->NS_LogInit(); return NS_OK; } int main(int argc, char* argv[], char* envp[]) { mozilla::TimeStamp start = mozilla::TimeStamp::Now(); #ifdef HAS_DLL_BLOCKLIST DllBlocklist_Initialize(); #endif #ifdef MOZ_BROWSER_CAN_BE_CONTENTPROC // We are launching as a content process, delegate to the appropriate // main if (argc > 1 && IsArg(argv[1], "contentproc")) { #if defined(XP_WIN) && defined(MOZ_SANDBOX) // We need to initialize the sandbox TargetServices before InitXPCOMGlue // because we might need the sandbox broker to give access to some files. if (IsSandboxedProcess() && !sandboxing::GetInitializedTargetServices()) { Output("Failed to initialize the sandbox target services."); return 255; } #endif nsresult rv = InitXPCOMGlue(argv[0]); if (NS_FAILED(rv)) { return 255; } int result = content_process_main(gBootstrap.get(), argc, argv); // InitXPCOMGlue calls NS_LogInit, so we need to balance it here. gBootstrap->NS_LogTerm(); return result; } #endif nsresult rv = InitXPCOMGlue(argv[0]); if (NS_FAILED(rv)) { return 255; } gBootstrap->XRE_StartupTimelineRecord(mozilla::StartupTimeline::START, start); #ifdef MOZ_BROWSER_CAN_BE_CONTENTPROC gBootstrap->XRE_EnableSameExecutableForContentProc(); #endif int result = do_main(argc, argv, envp); gBootstrap->NS_LogTerm(); #ifdef XP_MACOSX // Allow writes again. While we would like to catch writes from static // destructors to allow early exits to use _exit, we know that there is // at least one such write that we don't control (see bug 826029). For // now we enable writes again and early exits will have to use exit instead // of _exit. gBootstrap->XRE_StopLateWriteChecks(); #endif gBootstrap.reset(); return result; } ================================================ FILE: app/profile/bluegriffon-prefs.js ================================================ #filter substitution pref("toolkit.defaultChromeURI", "chrome://bluegriffon/content/xul/bluegriffon.xul"); pref("browser.chromeURL", "chrome://bluegriffon/content/xul/bluegriffon.xul"); pref("browser.hiddenWindowChromeURL", "chrome://bluegriffon/content/xul/hiddenWindow.xul"); pref("toolkit.singletonWindowType", "bluegriffon"); pref("bluegriffon.singletonWindowType", "bluegriffon"); // mandatory for XULrunner apps // see https://developer.mozilla.org/en/XUL/prefwindow pref("browser.preferences.instantApply", true); #ifdef XP_MACOSX pref("toolbar.customization.usesheet", true); // true for Mac #else pref("toolbar.customization.usesheet", false); // false otherwise #endif /* disable telemetry */ pref("toolkit.telemetry.enabled", false); pref("toolkit.telemetry.archive.enabled", false); /* main theme */ pref("bluegriffon.wysiwyg.theme", "black"); /* debugging prefs */ pref("browser.dom.window.dump.enabled", false); pref("javascript.options.showInConsole", false); pref("javascript.options.strict", false); pref("bluegriffon.console.showInvalidVariables", false); pref("nglayout.debug.disable_xul_cache", true); pref("nglayout.debug.disable_xul_fastload", true); pref("general.useragent.extra.mybrowser", "bluegriffon/1.8"); pref("intl.accept_charsets", "iso-8859-1,*,utf-8"); pref("browser.display.use_document_fonts", 1); pref("extensions.update.autoUpdateDefault", false); pref("extensions.update.enabled", false); pref("extensions.update.url", "chrome://mozapps/locale/extensions/extensions.properties"); pref("extensions.update.interval", 86400); // Check for updates to Extensions and // Themes every week // Non-symmetric (not shared by extensions) extension-specific [update] preferences pref("extensions.getMoreExtensionsURL", "chrome://mozapps/locale/extensions/extensions.properties"); pref("extensions.getMoreThemesURL", "chrome://mozapps/locale/extensions/extensions.properties"); pref("extensions.dss.enabled", false); // Dynamic Skin Switching pref("extensions.dss.switchPending", false); // Non-dynamic switch pending after next // restart. pref("extensions.closeOnEscape", true); pref("extensions.ui.lastCategory", "addons://list/extension"); pref("extensions.shownSelectionUI", false); pref("extensions.showMismatchUI", false); pref("extensions.logging.enabled", true); // browser preferences pref("image.animation_mode", "none"); pref("bluegriffon.display.use_system_colors", true); pref("bluegriffon.display.foreground_color", "#000000"); pref("bluegriffon.display.background_color", "#ffffff"); pref("bluegriffon.display.active_color", "#ee0000"); pref("bluegriffon.display.anchor_color", "#0000ee"); pref("bluegriffon.display.visited_color", "#551a8b"); pref("bluegriffon.display.underline_links", true); pref("bluegriffon.returnKey.createsParagraph", true); pref("bluegriffon.spellCheck.enabled", true); pref("bluegriffon.spellCheck.suggestions", 10); pref("bluegriffon.display.comments", true); pref("bluegriffon.display.php", true); pref("bluegriffon.display.pi", true); pref("bluegriffon.display.anchors", true); // document preferences pref("bluegriffon.author", ""); // table preferences pref("bluegriffon.defaults.table.halign", ""); pref("bluegriffon.defaults.table.valign", ""); pref("bluegriffon.defaults.table.border", "1"); pref("bluegriffon.defaults.table.rows", "2"); pref("bluegriffon.defaults.table.cols", "2"); pref("bluegriffon.defaults.table.width", "100"); pref("bluegriffon.defaults.table.width_unit", "percentage"); pref("bluegriffon.defaults.table.text_wrap", ""); pref("bluegriffon.defaults.table.cell_spacing", "2"); pref("bluegriffon.defaults.table.cell_padding", "2"); // file extension preferences pref("bluegriffon.defaults.extension.application-xhtml+xml", "xhtml"); pref("bluegriffon.defaults.extension.text-html", "html"); // CSS policy pref("editor.use_css", true); pref("bluegriffon.css.policy", "manual"); pref("bluegriffon.css.prefix", "BG_"); pref("bluegriffon.css.serialization", "shorthands"); pref("bluegriffon.css.support.blink", true); pref("bluegriffon.css.support.gecko", true); pref("bluegriffon.css.support.servo", true); pref("bluegriffon.css.support.webkit", true); pref("bluegriffon.css.support.vivliostyle", true); pref("bluegriffon.css.support.weasyprint", true); pref("bluegriffon.prettyprint", true); pref("bluegriffon.encode_entity", "html"); pref("bluegriffon.zoom.default", "1"); pref("bluegriffon.history.url_maximum", 10); pref("signon.rememberSignons", true); pref("signon.expireMasterPassword", false); pref("signon.SignonFileName", "signons.txt"); // suppress external-load warning for standard browser schemes pref("network.protocol-handler.warn-external.http", true); pref("network.protocol-handler.warn-external.https", true); pref("network.protocol-handler.warn-external.ftp", true); pref("network.protocol-handler.expose-all", false); // XPI pref("xpinstall.dialog.confirm", "chrome://mozapps/content/xpinstall/xpinstallConfirm.xul"); pref("xpinstall.dialog.progress.skin", "chrome://mozapps/content/extensions/extensions.xul"); pref("xpinstall.dialog.progress.chrome", "chrome://mozapps/content/extensions/extensions.xul"); pref("xpinstall.dialog.progress.type.skin", "Extension:Manager"); pref("xpinstall.dialog.progress.type.chrome", "Extension:Manager"); pref("dom.storage.enabled", true); // structurebar pref("bluegriffon.structurebar.id.show", true); pref("bluegriffon.structurebar.class.show", true); pref("bluegriffon.structurebar.lang.show", false); pref("bluegriffon.structurebar.role.show", true); // UI visibility pref("bluegriffon.ui.structurebar.show", true); pref("bluegriffon.ui.statusbar.show", true); pref("bluegriffon.ui.vertical_toolbar.show", true); pref("bluegriffon.ui.horizontal_toolbars.show", true); // updates pref("bluegriffon.updates.check.enabled", true); pref("bluegriffon.updates.frequency", "launch"); pref("html5.enable", true); pref("bluegriffon.defaults.doctype", "kHTML5"); pref("bluegriffon.defaults.html5.polyglot", false); pref("media.autoplay.enabled", false); pref("bluegriffon.defaults.forceLF", false); pref("bluegriffon.defaults.backups", true); pref("bluegriffon.source.theme", "eclipse"); pref("bluegriffon.source.entities", "basic"); pref("bluegriffon.source.auto-indent", true); pref("bluegriffon.source.wrap", true); pref("bluegriffon.source.wrap.maxColumn", 80); pref("bluegriffon.source.wrap.exclude-languages", true); pref("bluegriffon.source.wrap.language-exclusions", ""); pref("bluegriffon.source.zoom.default", "1"); pref("bluegriffon.toolbar.enabled", true); pref("bluegriffon.toolbar.icons", "medium"); pref("bluegriffon.tabs.position", "center"); pref("bluegriffon.osx.dock-integration", true); pref("bluegriffon.osx.clipboard.rtf.enabled", true); pref("extensions.getAddons.cache.enabled", false); pref("bluegriffon.css.colors.names.enabled", true); pref("bluegriffon.css.colors.type", "hex"); // make links absolute when copied pref("clipboard.absoluteLinks", false); pref("extensions.venkman.enableChromeFilter", false); // Print header customization // Use the following codes: // &T - Title // &U - Document URL // &D - Date/Time // &P - Page Number // &PT - Page Number "of" Page total // Set each header to a string containing zero or one of these codes // and the code will be replaced in that string by the corresponding data pref("print.print_headerleft", "&T"); pref("print.print_headercenter", ""); pref("print.print_headerright", "&U"); pref("print.print_footerleft", "&PT"); pref("print.print_footercenter", ""); pref("print.print_footerright", "&D"); pref("print.show_print_progress", true); // When this is set to false each window has its own PrintSettings // and a change in one window does not affect the others pref("print.use_global_printsettings", true); // Save the Printings after each print job pref("print.save_print_settings", true); pref("print.whileInPrintPreview", true); // Cache old Presentation when going into Print Preview pref("print.always_cache_old_pres", false); // Enables you to specify the amount of the paper that is to be treated // as unwriteable. The print_edge_XXX and print_margin_XXX preferences // are treated as offsets that are added to this pref. // Default is "-1", which means "use the system default". (If there is // no system default, then the -1 is treated as if it were 0.) // This is used by both Printing and Print Preview. // Units are in 1/100ths of an inch. pref("print.print_unwriteable_margin_top", -1); pref("print.print_unwriteable_margin_left", -1); pref("print.print_unwriteable_margin_right", -1); pref("print.print_unwriteable_margin_bottom", -1); // Enables you to specify the gap from the edge of the paper's // unwriteable area to the margin. // This is used by both Printing and Print Preview // Units are in 1/100ths of an inch. pref("print.print_edge_top", 0); pref("print.print_edge_left", 0); pref("print.print_edge_right", 0); pref("print.print_edge_bottom", 0); pref("layout.css.flexbox.enabled", true); pref("general.useragent.locale", "en-US"); pref("intl.locale.matchOS", true); pref("app.support.baseURL", "http://bluegriffon.org/"); pref("bluegriffon.responsive.default", "min"); // min, max, minmax // Blocklist preferences pref("extensions.blocklist.enabled", false); // ARIA pref("bluegriffon.aria.epub-type", false); // File URI Origin policy pref("security.fileuri.strict_origin_policy", false); // Developer Tools related preferences pref("devtools.debugger.log", false); pref("devtools.chrome.enabled", true); pref("devtools.selfxss.count", 5); // paste dropped images as normal relative URLs instead of data URLs pref("bluegriffon.drag_n_drop.images.as_url", true); // kung fu death grips pref("bluegriffon.kungfudeathgrip.shortcuts2017", false); // last message pref("bluegriffon.release_notes.last", ""); pref("browser.preferences.defaultPerformanceSettings.enabled", "false"); pref("layers.acceleration.disabled", "true"); ================================================ FILE: app/profile/channel-prefs.js ================================================ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ pref("app.update.channel", "@MOZ_UPDATE_CHANNEL@"); ================================================ FILE: app/profile/prefs.js ================================================ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ # Mozilla User Preferences /* Do not edit this file. * * If you make changes to this file while the browser is running, * the changes will be overwritten when the browser exits. * * To make a manual change to preferences, you can visit the URL about:config */ ================================================ FILE: app/splash.rc ================================================ /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Mozilla Communicator client code. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1998 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Bill Law law@netscape.com * Jonathan Wilson * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #include #include "nsNativeAppSupportWin.h" 1 24 "bluegriffon.exe.manifest" IDI_APPICON ICON COMPOSER_ICO IDI_DOCUMENT ICON DOCUMENT_ICO IDI_APPLICATION ICON COMPOSER_ICO STRINGTABLE DISCARDABLE BEGIN #ifdef DEBUG IDS_STARTMENU_APPNAME, "BlueGriffon Debug" #else IDS_STARTMENU_APPNAME, "BlueGriffon" #endif END #ifdef MOZ_STATIC_BUILD // XXX This code is copied from resource.h and widget.rc. It's a work-around // for the limitation that only one resource file can be used in an .exe. We // should develop a method, for static builds only, to combine multiple .rc // files into a single .rc file, and then use that to build the single .res // file for the .exe. #define IDC_GRAB 4101 #define IDC_GRABBING 4102 #define IDC_CELL 4103 #define IDC_COPY 4104 #define IDC_ALIAS 4105 #define IDC_ZOOMIN 4106 #define IDC_ZOOMOUT 4107 #define IDC_COLRESIZE 4108 #define IDC_ROWRESIZE 4109 #define IDC_VERTICALTEXT 4110 #define IDC_NONE 4112 IDC_GRAB CURSOR DISCARDABLE "..\\..\\widget\\src\\build\\res\\grab.cur" IDC_GRABBING CURSOR DISCARDABLE "..\\..\\widget\\src\\build\\res\\grabbing.cur" IDC_CELL CURSOR DISCARDABLE "..\\..\\widget\\src\\build\\res\\cell.cur" IDC_COPY CURSOR DISCARDABLE "..\\..\\widget\\src\\build\\res\\copy.cur" IDC_ALIAS CURSOR DISCARDABLE "..\\..\\widget\\src\\build\\res\\aliasb.cur" IDC_ZOOMIN CURSOR DISCARDABLE "..\\..\\widget\\src\\build\\res\\zoom_in.cur" IDC_ZOOMOUT CURSOR DISCARDABLE "..\\..\\widget\\src\\build\\res\\zoom_out.cur" IDC_COLRESIZE CURSOR DISCARDABLE "..\\..\\widget\\src\\build\\res\\col_resize.cur" IDC_ROWRESIZE CURSOR DISCARDABLE "..\\..\\widget\\src\\build\\res\\row_resize.cur" IDC_VERTICALTEXT CURSOR DISCARDABLE "..\\..\\widget\\src\\build\\res\\vertical_text.cur" IDC_NONE CURSOR DISCARDABLE "..\\..\\widget\\src\\build\\res\\none.cur" #endif ================================================ FILE: app/splashos2.rc ================================================ /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- * * ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Mozilla Communicator client code. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1998 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Bill Law law@netscape.com * IBM Corp. * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #include // Splash screen dialog ID. #define IDD_SPLASH 100 // Splash screen bitmap ID. #define IDB_SPLASH 101 ICON 1 COMPOSER_ICO DLGTEMPLATE IDD_SPLASH DISCARDABLE BEGIN DIALOG "", IDD_SPLASH, 0, 0, 390, 261, , FCF_BORDER BEGIN END END //BITMAP IDB_SPLASH "splash.bmp" #ifdef MOZ_STATIC_BUILD #include "wdgtos2rc.h" POINTER IDC_SELECTANCHOR "..\\..\\widget\\src\\os2\\res\\select.ptr" POINTER IDC_GRAB "..\\..\\widget\\src\\os2\\res\\grab.ptr" POINTER IDC_GRABBING "..\\..\\widget\\src\\os2\\res\\grabbing.ptr" POINTER IDC_CELL "..\\..\\widget\\src\\os2\\res\\cell.ptr" POINTER IDC_COPY "..\\..\\widget\\src\\os2\\res\\copy.ptr" POINTER IDC_ALIAS "..\\..\\widget\\src\\os2\\res\\aliasb.ptr" POINTER IDC_ZOOMIN "..\\..\\widget\\src\\os2\\res\\zoom_in.ptr" POINTER IDC_ZOOMOUT "..\\..\\widget\\src\\os2\\res\\zoom_out.ptr" POINTER IDC_ARROWWAIT "..\\..\\widget\\src\\os2\\res\\arrow_wait.ptr" POINTER IDC_CROSS "..\\..\\widget\\src\\os2\\res\\crosshair.ptr" POINTER IDC_HELP "..\\..\\widget\\src\\os2\\res\\help.ptr" POINTER IDC_NONE "..\\..\\widget\\src\\os2\\res\\none.ptr" ICON IDC_DNDURL "..\\..\\widget\\src\\os2\\res\\dndurl.ico" ICON IDC_DNDTEXT "..\\..\\widget\\src\\os2\\res\\dndtext.ico" #endif ================================================ FILE: app-rules.mk ================================================ PURGECACHES_DIRS = $(DIST)/bin/bluegriffon ifdef MOZ_METRO PURGECACHES_DIRS += $(DIST)/bin/metro endif ================================================ FILE: app.mozbuild ================================================ # vim: set filetype=python: # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # vim: set filetype=python: # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. if not CONFIG['LIBXUL_SDK']: include('/toolkit/toolkit.mozbuild') if CONFIG['MOZ_EXTENSIONS']: DIRS += ['/extensions'] # Never add dirs after browser because they apparently won't get # packaged properly on Mac. DIRS += ['/bluegriffon'] ================================================ FILE: base/Makefile.in ================================================ # ***** BEGIN LICENSE BLOCK ***** # Version: MPL 1.1/GPL 2.0/LGPL 2.1 # # The contents of this file are subject to the Mozilla Public License Version # 1.1 (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. # # The Original Code is Mozilla.org # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 2003 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Daniel Glazman (daniel@glazman.org), on behalf of Lindows.com # # Alternatively, the contents of this file may be used under the terms of # either the GNU General Public License Version 2 or later (the "GPL"), or # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), # in which case the provisions of the GPL or the LGPL are applicable instead # of those above. If you wish to allow use of your version of this file only # under the terms of either the GPL or the LGPL, and not to allow others to # use your version of this file under the terms of the MPL, indicate your # decision by deleting the provisions above and replace them with the notice # and other provisions required by the GPL or the LGPL. If you do not delete # the provisions above, a recipient may use your version of this file under # the terms of any one of the MPL, the GPL or the LGPL. # # ***** END LICENSE BLOCK ***** DEPTH = ../.. topsrcdir = @top_srcdir@ srcdir = @srcdir@ VPATH = @srcdir@ include $(DEPTH)/config/autoconf.mk APP_VERSION = $(shell cat $(srcdir)/../config/version.txt) CODE_NAME = $(shell cat $(srcdir)/../config/codename.txt) GRE_BUILDID = $(shell $(PYTHON) $(topsrcdir)/config/printconfigsetting.py $(DIST)/bin/platform.ini Build BuildID) DEFINES += \ -DAPP_NAME=$(MOZ_APP_DISPLAYNAME) \ -DAPP_VERSION=$(APP_VERSION) \ -DCODE_NAME=$(CODE_NAME) \ -DGRE_BUILDID=$(GRE_BUILDID) \ $(NULL) ifneq (,$(filter mac cocoa, $(MOZ_WIDGET_TOOLKIT))) DEFINES += -DTOOLBAR_CUSTOMIZATION_SHEET endif include $(topsrcdir)/config/rules.mk ================================================ FILE: base/content/bluegriffon/EditorAllTags.css ================================================ *:not([\_moz_anonclass])::before { font-family: monospace; font-size: 12px; font-weight: normal; font-style: normal; color: #050505; padding: 0px 5px; background: -moz-linear-gradient( top, #f7ff00 0%, #ffbf00); border-radius: 30px; border: 1px solid #918491; box-shadow: 0px 1px 3px rgba(000,000,000,0.5), inset 0px 0px 1px rgba(255,255,255,0.7); text-shadow: 0px -1px 0px rgba(000,000,000,0.2), 0px 0px 0px rgba(255,255,255,0); -moz-margin-end: 6px; } a::before { content: 'A'; } abbr::before { content: 'ABBR'; } address::before { content: 'ADDRESS'; } area::before { content: 'AREA'; } article::before { content: 'ARTICLE'; } aside::before { content: 'ASIDE'; } audio::before { content: 'AUDIO'; } b::before { content: 'B'; } base::before { content: 'BASE'; } bdi::before { content: 'BDI'; } bdo::before { content: 'BDO'; } blockquote::before { content: 'BLOCKQUOTE'; } body::before { content: 'BODY'; } br::before { content: 'BR'; } /* the generated content appears inside the button :-( button::before { content: 'BUTTON'; } */ canvas::before { content: 'CANVAS'; } caption::before { content: 'CAPTION'; } cite::before { content: 'CITE'; } code::before { content: 'CODE'; } col::before { content: 'COL'; } colgroup::before { content: 'COLGROUP'; } command::before { content: 'COMMAND'; } datalist::before { content: 'DATALIST'; } dd::before { content: 'DD'; } del::before { content: 'DEL'; } details::before { content: 'DETAILS'; } div::before { content: 'DIV'; } dl::before { content: 'DL'; } dt::before { content: 'DT'; } em::before { content: 'EM'; } embed::before { content: 'EMBED'; } fieldset::before { content: 'FIELDSET'; } figcaption::before { content: 'FIGCAPTION'; } figure::before { content: 'FIGURE'; } footer::before { content: 'FOOTER'; } form::before { content: 'FORM'; } head::before { content: 'HEAD'; } h1::before { content: 'H1'; } h2::before { content: 'H2'; } h3::before { content: 'H3'; } h4::before { content: 'H4'; } h5::before { content: 'H5'; } h6::before { content: 'H6'; } header::before { content: 'HEADER'; } hgroup::before { content: 'HGROUP'; } hr::before { content: 'HR'; } html::before { content: 'HTML'; } i::before { content: 'I'; } iframe::before { content: 'IFRAME'; } img::before { content: 'IMG'; } input::before { content: 'INPUT'; } ins::before { content: 'INS'; } kbd::before { content: 'KBD'; } keygen::before { content: 'KEYGEN'; } label::before { content: 'LABEL'; } legend::before { content: 'LEGEND'; } li::before { content: 'LI'; } link::before { content: 'LINK'; } map::before { content: 'MAP'; } mark::before { content: 'MARK'; } meter::before { content: 'METER'; } nav::before { content: 'NAV'; } noscript::before { content: 'NOSCRIPT'; } object::before { content: 'OBJECT'; } ol::before { content: 'OL'; } optgroup::before { content: 'OPTGROUP'; } option::before { content: 'OPTION'; } output::before { content: 'OUTPUT'; } p::before { content: 'P'; } param::before { content: 'PARAM'; } pre::before { content: 'PRE'; } progress::before { content: 'PROGRESS'; } q::before { content: 'Q'; } rp::before { content: 'RP'; } rt::before { content: 'RT'; } ruby::before { content: 'RUBY'; } s::before { content: 'S'; } samp::before { content: 'SAMP'; } section::before { content: 'SECTION'; } select::before { content: 'SELECT'; } small::before { content: 'SMALL'; } source::before { content: 'SOURCE'; } span::before { content: 'SPAN'; } strong::before { content: 'STRONG'; } style::before { content: 'STYLE'; } sub::before { content: 'SUB'; } summary::before { content: 'SUMMARY'; } sup::before { content: 'SUP'; } table::before { content: 'TABLE'; } tbody::before { content: 'TBODY'; } td::before { content: 'TD'; } textarea::before { content: 'TEXTAREA'; } tfoot::before { content: 'TFOOT'; } th::before { content: 'TH'; } thead::before { content: 'THEAD'; } time::before { content: 'TIME'; } title::before { content: 'TITLE'; } /* corrupts the table adding a first column :-( tr::before { content: 'TR'; } */ track::before { content: 'TRACK'; } ul::before { content: 'UL'; } var::before { content: 'VAR'; } video::before { content: 'VIDEO'; } wbr::before { content: 'WBR'; } *[\_moz_anonclass]::before { content: none !important; } ================================================ FILE: base/content/bluegriffon/EditorContent.css ================================================ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Mozilla Communicator client code, released * March 31, 1998. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1998-1999 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Daniel Glazman * Daniel Glazman , on behalf of Linspire Inc. * * Alternatively, the contents of this file may be used under the terms of * either of the GNU General Public License Version 2 or later (the "GPL"), * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ /* Styles to alter look of things in the Editor content window * for the "Normal Edit Mode" These settings will be removed * when we display in completely WYSIWYG "Edit Preview" mode * Anything that should never change, like cursors, should be * place in EditorOverride.css, instead of here. */ @namespace bluegriffon url("http://disruptive-innovations.com/zoo/bluegriffon"); @namespace svg url("http://www.w3.org/2000/svg"); /* Force border display for empty cells and tables with 0 border */ table { empty-cells: show; } /* give a red dotted border to tables and cells with no border otherwise they are invisible */ table[empty-cells], table[border="0"], /* next two selectors on line below for the case where tbody is omitted */ table[border="0"] > tr > td, table[border="0"] > tr > th, table[border="0"] > thead > tr > td, table[border="0"] > tbody > tr > td, table[border="0"] > tfoot > tr > td, table[border="0"] > thead > tr > th, table[border="0"] > tbody > tr > th, table[border="0"] > tfoot > tr > th, /* next two selectors on line below for the case where tbody is omitted */ table:not([border]) > tr > td, table:not([border]) > tr > th, table:not([border]) > thead > tr > td, table:not([border]) > tbody > tr > td, table:not([border]) > tfoot > tr > td, table:not([border]) > thead > tr > th, table:not([border]) > tbody > tr > th, table:not([border]) > tfoot > tr > th { outline: 1px dotted; } /* give a green dashed border to forms otherwise they are invisible */ form { outline: 1px dashed #66cccc; min-height: 1em; } /* give a green dotted border to labels otherwise they are invisible */ label { outline: 1px dotted green; } img { -moz-force-broken-image-icon: 1; } bluegriffon|comment, bluegriffon|php, bluegriffon|pi { font-family: monospace; font-size: 12px; font-weight: normal; font-style: normal; color: #050505; padding: 0px 5px; background: -moz-linear-gradient( top, #f7ff00 0%, #ffbf00); border-radius: 30px; border: 1px solid #918491; box-shadow: 0px 1px 3px rgba(000,000,000,0.5), inset 0px 0px 1px rgba(255,255,255,0.7); text-shadow: 0px -1px 0px rgba(000,000,000,0.2), 0px 0px 0px rgba(255,255,255,0); -moz-margin-end: 5px; -moz-margin-start: 5px; -moz-user-select: all; -moz-user-focus: normal; -moz-user-input: disabled; -moz-user-modify: read-only; display: inline; } bluegriffon|comment::before { content: ""; } bluegriffon|php::before { content: ""; } bluegriffon|pi::before { content: ""; } html[\_moz_hide*="comment"] bluegriffon|comment, html[\_moz_hide*="php"] bluegriffon|php, html[\_moz_hide*="pi"] bluegriffon|pi { display: none; } table > bluegriffon|*, tbody > bluegriffon|*, thead > bluegriffon|*, tfoot > bluegriffon|*, tr > bluegriffon|* { display: none ! important} svg|svg:hover, video:hover, audio:hover { outline: black dashed thin; } audio { min-height: 40px; background-color: silver; background-image: url("chrome://bluegriffon/skin/icons/audio.png"); background-position: center center; background-repeat: no-repeat; } audio:not([controls]) { display: inline-block !important; } output, progress, meter { outline: thin red dotted; } output:empty, progress:empty, meter:empty { display: inline-block; width: 1em; height: 16px; } ================================================ FILE: base/content/bluegriffon/EditorContentAnchors.css ================================================ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Mozilla Communicator client code, released * March 31, 1998. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1998-1999 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Daniel Glazman * Daniel Glazman , on behalf of Linspire Inc. * * Alternatively, the contents of this file may be used under the terms of * either of the GNU General Public License Version 2 or later (the "GPL"), * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ /* Styles to alter look of things in the Editor content window * for the "Normal Edit Mode" These settings will be removed * when we display in completely WYSIWYG "Edit Preview" mode * Anything that should never change, like cursors, should be * place in EditorOverride.css, instead of here. */ @namespace bluegriffon url("http://disruptive-innovations.com/zoo/bluegriffon"); @namespace svg url("http://www.w3.org/2000/svg"); html[\_moz_showanchors] a[name], html[\_moz_showanchors] a[id] { min-height: 17px; margin-left: 2px; margin-top: 2px; padding-left: 20px; background-image: url("chrome://bluegriffon/skin/tags/tag-anchor.gif"); background-repeat: no-repeat; background-position: top left; } ================================================ FILE: base/content/bluegriffon/EditorOverride.css ================================================ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Mozilla Communicator client code, released * March 31, 1998. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1998-1999 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Daniel Glazman , on behalf of Linspire Inc. * * Alternatively, the contents of this file may be used under the terms of * either of the GNU General Public License Version 2 or later (the "GPL"), * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ /* Styles to alter look of things in the Editor content window * that should NOT be removed when we display in completely WYSIWYG * "Browser Preview" mode. * Anything that should change, like appearance of table borders * and Named Anchors, should be placed in EditorContent.css instead of here. */ @namespace nvu url("http://disruptive-innovations.com/zoo/nvu"); @namespace svg url("http://www.w3.org/2000/svg"); /* Primary cursor is text I-beam */ ::-moz-canvas, a:link { cursor: text; } /* Use default arrow over objects with size that are selected when clicked on. Override the browser's pointer cursor over links */ img, img[usemap], area, object, object[usemap], applet, hr, button, input, isindex, textarea, select, a:link img, a:visited img, a:active img, a[name]:empty { cursor: default; } a:visited, a:active { cursor: text; color : inherit; } /* Prevent clicking on links from going to link */ a:link img, a:visited img { -moz-user-input: none; } /* We suppress user/author's prefs for link underline, so we must set explicitly. This isn't good! */ /* BlueGriffon should allow to see document styles for links */ /*a:link { text-decoration: underline -moz-anchor-decoration; color: -moz-hyperlinktext; }*/ /* Allow double-clicks on these widgets to open properties dialogs XXX except when the widget has disabled attribute */ input, textarea, keygen, select, option { -moz-user-select: all !important; -moz-user-input: auto !important; -moz-user-focus: ignore !important; } textarea { resize: none; } keygen { min-width: 5em; min-height: 20px; display: inline-block; outline: dotted red thin; background-color: lightgray; background-image: url("chrome://bluegriffon/skin/icons/lock.png"); background-position: center center; background-repeat: no-repeat; } datalist { min-width: 5em; min-height: 20px; display: inline-block; outline: dotted red thin; background-color: lightgray; background-image: url("chrome://bluegriffon/skin/icons/datalist.png"); background-position: center center; background-repeat: no-repeat; } datalist * { display: none; } /* XXX Still need a better way of blocking other events to these widgets */ input[disabled], input[type="checkbox"], input[type="radio"], input[type="file"] { -moz-user-select: all !important; -moz-user-input: none !important; -moz-user-focus: none !important; } isindex[prompt] { -moz-user-select: none !important; -moz-user-input: none !important; -moz-user-focus: none !important; } input[type="hidden"] { border: 1px solid black !important; visibility: visible !important; } label, button { -moz-user-select: text !important; } ::-moz-display-comboboxcontrol-frame { -moz-user-select: text !important; } #mozToc.readonly { -moz-user-select: all !important; -moz-user-input: none !important; } /* the following rules are for Image Resizing */ span[\_moz_anonclass="mozResizer"] { width: 5px; height: 5px; position: absolute; border: 1px black solid; background-color: white; -moz-user-select: none; z-index: 2147483646; /* max value -1 for this property */ } /* we can't use :active below */ span[\_moz_anonclass="mozResizer"][\_moz_activated], span[\_moz_anonclass="mozResizer"]:hover { background-color: black; } span[\_moz_anonclass="mozResizer"].hidden, span[\_moz_anonclass="mozResizingShadow"].hidden, img[\_moz_anonclass="mozResizingShadow"].hidden, span[\_moz_anonclass="mozGrabber"].hidden, span[\_moz_anonclass="mozResizingInfo"].hidden, a[\_moz_anonclass="mozTableRemoveRow"].hidden, a[\_moz_anonclass="mozTableRemoveColumn"].hidden { display: none !important; } span[\_moz_anonclass="mozResizer"][anonlocation="nw"] { cursor: nw-resize; } span[\_moz_anonclass="mozResizer"][anonlocation="n"] { cursor: n-resize; } span[\_moz_anonclass="mozResizer"][anonlocation="ne"] { cursor: ne-resize; } span[\_moz_anonclass="mozResizer"][anonlocation="w"] { cursor: w-resize; } span[\_moz_anonclass="mozResizer"][anonlocation="e"] { cursor: e-resize; } span[\_moz_anonclass="mozResizer"][anonlocation="sw"] { cursor: sw-resize; } span[\_moz_anonclass="mozResizer"][anonlocation="s"] { cursor: s-resize; } span[\_moz_anonclass="mozResizer"][anonlocation="se"] { cursor: se-resize; } span[\_moz_anonclass="mozResizingShadow"], img[\_moz_anonclass="mozResizingShadow"] { outline: thin dashed black; -moz-user-select: none; -moz-opacity: 0.5; position: absolute; z-index: 2147483647; /* max value for this property */ } span[\_moz_anonclass="mozResizingInfo"] { font-family: sans-serif; font-size: x-small; color: black; background-color: #d0d0d0; border: ridge 2px #d0d0d0; padding: 2px; position: absolute; z-index: 2147483647; /* max value for this property */ } img[\_moz_resizing] { outline: thin solid black; } *[\_moz_abspos] { outline: silver ridge 2px; z-index: 2147483645 !important; /* max value -2 for this property */ } *[\_moz_abspos="white"] { background-color: white !important; } *[\_moz_abspos="black"] { background-color: black !important; } span[\_moz_anonclass="mozGrabber"] { outline: ridge 2px silver; padding: 2px; position: absolute; width: 12px; height: 12px; background-image: url("resource:/res/grabber.gif"); background-repeat: no-repeat; background-position: center center; -moz-user-select: none; cursor: move; } /* INLINE TABLE EDITING */ a[\_moz_anonclass="mozTableAddColumnBefore"] { position: absolute; z-index: 2147483647; /* max value for this property */ text-decoration: none !important; border: none 0px !important; width: 4px; height: 8px; background-image: url("resource:/res/table-add-column-before.gif"); background-repeat: no-repeat; background-position: center center; -moz-user-select: none !important; -moz-user-focus: none !important; } a[\_moz_anonclass="mozTableAddColumnBefore"]:hover { background-image: url("resource:/res/table-add-column-before-hover.gif"); } a[\_moz_anonclass="mozTableAddColumnBefore"]:active { background-image: url("resource:/res/table-add-column-before-active.gif"); } a[\_moz_anonclass="mozTableAddColumnAfter"] { position: absolute; z-index: 2147483647; /* max value for this property */ text-decoration: none !important; border: none 0px !important; width: 4px; height: 8px; background-image: url("resource:/res/table-add-column-after.gif"); background-repeat: no-repeat; background-position: center center; -moz-user-select: none !important; -moz-user-focus: none !important; } a[\_moz_anonclass="mozTableAddColumnAfter"]:hover { background-image: url("resource:/res/table-add-column-after-hover.gif"); } a[\_moz_anonclass="mozTableAddColumnAfter"]:active { background-image: url("resource:/res/table-add-column-after-active.gif"); } a[\_moz_anonclass="mozTableRemoveColumn"] { position: absolute; z-index: 2147483647; /* max value for this property */ text-decoration: none !important; border: none 0px !important; width: 8px; height: 8px; background-image: url("resource:/res/table-remove-column.gif"); background-repeat: no-repeat; background-position: center center; -moz-user-select: none !important; -moz-user-focus: none !important; } a[\_moz_anonclass="mozTableRemoveColumn"]:hover { background-image: url("resource:/res/table-remove-column-hover.gif"); } a[\_moz_anonclass="mozTableRemoveColumn"]:active { background-image: url("resource:/res/table-remove-column-active.gif"); } a[\_moz_anonclass="mozTableAddRowBefore"] { position: absolute; z-index: 2147483647; /* max value for this property */ text-decoration: none !important; border: none 0px !important; width: 8px; height: 4px; background-image: url("resource:/res/table-add-row-before.gif"); background-repeat: no-repeat; background-position: center center; -moz-user-select: none !important; -moz-user-focus: none !important; } a[\_moz_anonclass="mozTableAddRowBefore"]:hover { background-image: url("resource:/res/table-add-row-before-hover.gif"); } a[\_moz_anonclass="mozTableAddRowBefore"]:active { background-image: url("resource:/res/table-add-row-before-active.gif"); } a[\_moz_anonclass="mozTableAddRowAfter"] { position: absolute; z-index: 2147483647; /* max value for this property */ text-decoration: none !important; border: none 0px !important; width: 8px; height: 4px; background-image: url("resource:/res/table-add-row-after.gif"); background-repeat: no-repeat; background-position: center center; -moz-user-select: none !important; -moz-user-focus: none !important; } a[\_moz_anonclass="mozTableAddRowAfter"]:hover { background-image: url("resource:/res/table-add-row-after-hover.gif"); } a[\_moz_anonclass="mozTableAddRowAfter"]:active { background-image: url("resource:/res/table-add-row-after-active.gif"); } a[\_moz_anonclass="mozTableRemoveRow"] { position: absolute; z-index: 2147483647; /* max value for this property */ text-decoration: none !important; border: none 0px !important; width: 8px; height: 8px; background-image: url("resource:/res/table-remove-row.gif"); background-repeat: no-repeat; background-position: center center; -moz-user-select: none !important; -moz-user-focus: none !important; } a[\_moz_anonclass="mozTableRemoveRow"]:hover { background-image: url("resource:/res/table-remove-row-hover.gif"); } a[\_moz_anonclass="mozTableRemoveRow"]:active { background-image: url("resource:/res/table-remove-row-active.gif"); } nvu|php, nvu|comment { display: none ! important; } * { /* Do NOT allow animations and transitions to run in an editor */ /* if you except the ones blow this current rule */ animation: none ! important; transition: none ! important; } @keyframes flasher { from { outline-color: red ; } 50% { outline-color: green; } to { outline-color: white; } } *[\_moz_flasher] { animation-iteration-count: 5 !important; animation-duration: 0.2s !important; animation-name: flasher !important; outline: transparent solid 2px; } /***** TABLES ****/ thead, tbody, tfoot { cursor: row-resize } tr { cursor: col-resize } th, td { cursor: default } div[\_moz_anonclass="tableRowResizer"] { position: absolute; height: 4px; background-color: gray; z-index: 2147483647; /* max value for this property */ } div[\_moz_anonclass="tableColResizer"] { position: absolute; width: 4px; background-color: gray; z-index: 2147483647; /* max value for this property */ } div[\_moz_anonclass="tableResizerInfo"] { position: absolute; background-color: silver; color: black; font-family: Lucida Grande; font-size: small; font-weight: bold; padding: 2px; border-radius: 2px; white-space: pre; z-index: 2147483647; /* max value for this property */ } ================================================ FILE: base/content/bluegriffon/bindings/cssClassPicker.xml ================================================ %cssClassPickerDTD; ]> ================================================ FILE: base/content/bluegriffon/bindings/deckedPanelsTabs.xml ================================================ %deckedPanelsTabsBindingsDTD; ]> ================================================ FILE: base/content/bluegriffon/bindings/ecolorpicker.xml ================================================ #ifndef XP_MACOSX #else #endif try { Components.utils.import("resource://gre/modules/colourPickerHelper.jsm"); } catch (e) {} #ifdef XP_MACOSX var colorpicker = this.getChild("colorbox"); if (this.hasAttribute("color")) colorpicker.setAttribute("value", this.getAttribute("color")); if (this.hasAttribute("showTransparency")) colorpicker.setAttribute("showTransparency", this.getAttribute("showTransparency")); #endif #else onset="this.getChild('colorbox').value = val; this.setAttribute('color', val); this.setAttribute('tooltiptext', val); this.mColorBox.style.backgroundColor = val;"/> #endif #else onset="SetEnabledElement(this.getChild('colorbox'), !val); SetEnabledElement(this, !val)"/> #endif #ifdef XP_MACOSX #endif #ifndef XP_MACOSX #endif ================================================ FILE: base/content/bluegriffon/bindings/filepickerbutton.css ================================================ @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); filepickerbutton { margin: 0px; padding: 0px; list-style-image: url('chrome://bluegriffon/skin/icons/filePicking.png'); } filepickerbutton:not([disabled]):hover { list-style-image: url('chrome://bluegriffon/skin/icons/filePicking-hover.png'); } filepickerbutton[disabled="true"] { list-style-image: url('chrome://bluegriffon/skin/icons/filePicking-disabled.png'); } .toolbarbutton-icon { min-width: 0px; padding: 0px; margin: 2px ! important; } .toolbarbutton-text { display: none; } ================================================ FILE: base/content/bluegriffon/bindings/filepickerbutton.xml ================================================ %filepickerbuttonDTD; ]> null Components.interfaces.nsIFilePicker 0) { var spec = this.fp.fileURL.spec; if (this.hasAttribute("processor")) spec = eval(this.getAttribute("processor") + "(spec)"); this.setAttribute("value", spec); if (this.hasAttribute("control")) { var c = document.getElementById(this.getAttribute("control")); c.inputField.value = spec; } } } catch(e) {} ]]> ================================================ FILE: base/content/bluegriffon/bindings/floatingpanel.xml ================================================ %floatingpanelBindingsDTD; ]> false 0 0 0 menuitem[panel='" + this.id + "']"); menuitem.setAttribute("decked", "true"); menuitem.setAttribute("checked", "true"); var iframe = this.firstElementChild; var src = iframe.getAttribute("src"); var wjo = iframe.contentWindow.wrappedJSObject; if (wjo && "Shutdown" in wjo) wjo.Shutdown(); iframe.setAttribute("src", "about:blank"); document.persist(this.id, "open"); document.persist(menuitem.id, "decked"); document.persist(menuitem.id, "checked"); gDialog.deckedPanelsTabs.addPanel(this.getAttribute("label"), src, this.id); ]]> this.persistPosition(); r2.x1 && r1.y1 < r2.y2 && r1.y2 > r2.y1); intersecting = intersecting || overlap; } } if (!intersecting) { // we can take an early way out BlueGriffonVars.lastPanelRaisedDidNotIntersect = true; return; } BlueGriffonVars.lastPanelRaisedDidNotIntersect = false; this.hidePopup(); this.openPanel(null, false); } ]]> ================================================ FILE: base/content/bluegriffon/bindings/inContext.xml ================================================ ================================================ FILE: base/content/bluegriffon/bindings/lengthbox.xml ================================================ %lengthBoxDTD; ]> [] ================================================ FILE: base/content/bluegriffon/bindings/media.xml ================================================ %mediaDTD; ]> ================================================ FILE: base/content/bluegriffon/bindings/menulist.xml ================================================ 0)) { // Moving relative to an item: start from the currently selected item this.menuBoxObject.activeChild = this.mSelectedInternal; if (this.menuBoxObject.handleKeyPress(event)) { this.menuBoxObject.activeChild.doCommand(); event.preventDefault(); } } ]]> this.setInitialSelection() this.boxObject.QueryInterface(Components.interfaces.nsIMenuBoxObject) null = 0 && index < children.length) return children[index]; } return null; ]]> = 0 && index < popup.childNodes.length) popup.insertBefore(item, popup.childNodes[index]); else popup.appendChild(item); return item; ]]> return (this.getAttribute("droppable") == "false") ? Components.interfaces.nsIAccessibleProvider.XULTextBox : Components.interfaces.nsIAccessibleProvider.XULCombobox; ]]> null this.inputField.select(); ================================================ FILE: base/content/bluegriffon/bindings/multistate.css ================================================ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is BlueGriffon. * * The Initial Developer of the Original Code is * Disruptive Innovations SARL. * Portions created by the Initial Developer are Copyright (C) 2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Daniel Glazman (daniel.glazman@disruptive-innovations.com), Original Author * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the LGPL or the GPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ state { display: none; } ================================================ FILE: base/content/bluegriffon/bindings/multistate.xml ================================================ ================================================ FILE: base/content/bluegriffon/bindings/rotator.xml ================================================ %rotatorDTD; ]> 0 0 0 0 false 0 null false c (b) var p1c = sqrt(pow(this.mCenterX - x,2) + pow(this.mCenterY - y,2)); // p1->c (a) var p0p1 = sqrt(pow(x - this.mStartX,2) + pow(y - this.mStartY,2)); // p0->p1 (c) this.mAngle = floor(acos((p1c*p1c + p0c*p0c - p0p1*p0p1)/(2*p1c*p0c)) * 180 / PI); if (x <= this.mCenterX) this.mAngle = 360 - this.mAngle; } this.parentNode.style.MozTransform = "rotate(" + (this.mAngle-90) + "deg)"; this.mRotator.getChild("textbox").value = this.mAngle; this.mRotator.callCallback(this.mAngle, false); ]]> c (b) var p1c = sqrt(pow(this.mCenterX - x,2) + pow(this.mCenterY - y,2)); // p1->c (a) var p0p1 = sqrt(pow(x - this.mStartX,2) + pow(y - this.mStartY,2)); // p0->p1 (c) this.mAngle = floor(acos((p1c*p1c + p0c*p0c - p0p1*p0p1)/(2*p1c*p0c)) * 180 / PI); if (x <= this.mCenterX) this.mAngle = 360 - this.mAngle; } this.parentNode.style.MozTransform = "rotate(" + (this.mAngle-90) + "deg)"; this.mRotator.getChild("textbox").value = this.mAngle; this.mRotator.callCallback(this.mAngle, true); ]]> ================================================ FILE: base/content/bluegriffon/bindings/rulers.xml ================================================ "http://www.w3.org/2000/svg" null false null 0 0 ================================================ FILE: base/content/bluegriffon/bindings/structurebar.css ================================================ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is BlueGriffon. * * The Initial Developer of the Original Code is * Disruptive Innovations SARL. * Portions created by the Initial Developer are Copyright (C) 2006 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Daniel Glazman , Original author * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); structurebar { -moz-binding: url("chrome://bluegriffon/content/bindings/structurebar.xml#structurebar"); overflow: -moz-hidden-unscrollable; min-width: 1px; margin-bottom: 1px; -moz-box-pack: end; } structurebar toolbarbutton { padding: 0px; text-shadow: none; } structurebar .struct-textbox { -moz-appearance: none !important; padding: 0px !important; margin: 0px !important; border: none !important; } /********* LTR *********/ window[rtl="false"] structurebar { margin-right: 10px; margin-left: 24px; } window[rtl="false"] structurebar .autorepeatbutton-up { list-style-image: url("chrome://bluegriffon/skin/structurebar/arrow-left.png"); -moz-image-region: auto; /* cut off inheritance */ filter: grayscale(100%); } window[rtl="false"] structurebar .autorepeatbutton-down { list-style-image: url("chrome://bluegriffon/skin/structurebar/arrow-right.png"); -moz-image-region: auto; /* cut off inheritance */ filter: grayscale(100%); } window[rtl="false"] structurebar autorepeatbutton:not([disabled]):hover { filter: none; } window[rtl="false"] structurebar .autorepeatbutton-up:not([disabled="true"]) { margin-right: 10px; } window[rtl="false"] structurebar .autorepeatbutton-down { margin-left: 10px; } /********* RTL *********/ window[rtl="true"] structurebar { margin-left: 10px; margin-right: 24px; } window[rtl="true"] structurebar .autorepeatbutton-up { list-style-image: url("chrome://bluegriffon/skin/structurebar/arrow-right.png"); -moz-image-region: auto; /* cut off inheritance */ } window[rtl="true"] structurebar .autorepeatbutton-down { list-style-image: url("chrome://bluegriffon/skin/structurebar/arrow-left.png"); -moz-image-region: auto; /* cut off inheritance */ } window[rtl="true"] structurebar autorepeatbutton[disabled="true"] { filter: grayscale(100%); } window[rtl="true"] structurebar autorepeatbutton:not([disabled]):hover { filter: grayscale(100%) contrast(600%); } window[rtl="true"] structurebar .autorepeatbutton-up:not([disabled="true"]) { margin-left: 10px; } window[rtl="true"] structurebar .autorepeatbutton-down { margin-right: 10px; } ================================================ FILE: base/content/bluegriffon/bindings/structurebar.xml ================================================ %structurebarDTD; ]> null false ") newLabel.setAttribute("label", text); if (aOneElementSelected && aNode == node) newLabel.setAttribute("checked", "true"); newLabel.setUserData("node", node, null); newLabel.setAttribute("value", node.nodeName.toLowerCase()); newLabel.setAttribute("context", "structureBarContextMenu"); newLabel.setAttribute("oncommand", "this.parentNode.selectNode(this)"); this.insertBefore(newLabel, this.firstChild); node = node.parentNode; } // make sure the deepest element is visible; // we always have a lastChild here var lastButton = this.lastChild.previousSibling; if (lastButton) this.ensureElementIsVisible(lastButton); ]]> ================================================ FILE: base/content/bluegriffon/bindings/tab.xml ================================================ false ================================================ FILE: base/content/bluegriffon/bindings/tabeditor.xml ================================================ %tabEditorDTD; %bluegriffonDTD; ]> 1) { var value = (100 * this._requestsFinished) / this._requestsStarted; if (progress) { progress.setAttribute("mode", "determined"); progress.setAttribute("value", value + "%"); } } } if (aStateFlags & nsIWebProgressListener.STATE_IS_NETWORK) { if (aStateFlags & nsIWebProgressListener.STATE_START) { if (statusbarDeck) statusbarDeck.selectedPanel = document.getElementById("progressBar"); if (progress) progress.setAttribute("style", ""); } else if (aStateFlags & nsIWebProgressListener.STATE_STOP) { if (this._requestsStarted && this._requestsFinished && this._requestsStarted == this._requestsFinished ) { // finished ! this.mEditorSheets = false; } if (progress) progress.setAttribute("style", "display: none"); this.onStatusChange(aWebProgress, aRequest, 0, "Done"); this._requestsStarted = this._requestsFinished = 0; this.mTab.removeAttribute("busy"); try { var thisURI = Components.classes["@mozilla.org/network/io-service;1"] .getService(Components.interfaces.nsIIOService) .newURI(this.mURL, null, null); var scheme = thisURI.scheme; if (scheme == "resource") this.mTab.setAttribute("image", "chrome://mozapps/skin/places/defaultFavicon.png"); else { this.mTab.setAttribute("image", thisURI.prePath + "/favicon.ico"); } } catch(e) {} if (statusbarDeck) statusbarDeck.selectedPanel = document.getElementById("editorBar"); var editor = this.mEditor.getEditor(this.mEditor.contentWindow); if (editor) { var valueArray = []; if (!Services.prefs.getBoolPref("bluegriffon.display.comments")) valueArray.push("comment"); if (!Services.prefs.getBoolPref("bluegriffon.display.php")) valueArray.push("php"); if (!Services.prefs.getBoolPref("bluegriffon.display.pi")) valueArray.push("pi"); var value = valueArray.join(" "); editor.document.documentElement.setAttribute("_moz_hide", value); MakePhpAndCommentsVisible(editor.document); editor.resetModificationCount(); editor.transactionManager.clear(); var links = editor.document.querySelectorAll("link"); for (var i = 0; i < links.length; i++) { var l = links[i]; var rel = l.getAttribute("rel").toLowerCase(); if (rel == "shortcut icon" || rel == "icon") { this.mTab.setAttribute("image", l.href); } } if (UrlUtils.isUrlOfBlankDocument(editor.document.QueryInterface(Components.interfaces.nsIDOMHTMLDocument).URL)) { var authorMeta = editor.document.querySelector("meta[name='author']"); if (!authorMeta) try { // add author's meta var author = GetPrefs().getComplexValue("bluegriffon.author", Components.interfaces.nsISupportsString).data; if (author) { var meta = editor.document.createElement("meta"); meta.setAttribute("name", "author"); meta.setAttribute("content", author); editor.document.querySelector("head").appendChild(meta); } } catch(e) {} } try { var returnKeyInPCreatesP = GetPrefs().getBoolPref("bluegriffon.returnKey.createsParagraph"); editor.returnInParagraphCreatesNewParagraph = returnKeyInPCreatesP; } catch(e) {} } if (editor && !this.mEditorSheets) { this.mEditorSheets = true; editor instanceof Components.interfaces.nsIPlaintextEditor; editor instanceof Components.interfaces.nsIHTMLEditor; editor instanceof Components.interfaces.nsIEditor; editor instanceof Components.interfaces.nsIEditorStyleSheets; editor.addOverrideStyleSheet("chrome://bluegriffon/content/EditorAllTags.css"); editor.enableStyleSheet("chrome://bluegriffon/content/EditorAllTags.css", false); editor.addOverrideStyleSheet("chrome://bluegriffon/content/EditorContentAnchors.css"); if (Services.prefs.getBoolPref("bluegriffon.display.anchors")) { if (editor.document) // sanity case editor.document.documentElement.setAttribute("_moz_showanchors", "true"); } editor.addOverrideStyleSheet("chrome://bluegriffon/content/EditorContent.css"); editor.addOverrideStyleSheet("chrome://bluegriffon/content/EditorOverride.css"); editor.selection.QueryInterface(Components.interfaces.nsISelectionPrivate) .addSelectionListener(ComposerCommands.selectionListener); editor.addEditorObserver(ComposerCommands.selectionListener); editor.addEditorMouseObserver(ComposerCommands.selectionListener); editor.transactionManager .AddListener(ComposerCommands.selectionListener); editor.transactionManager .AddListener(liveViewTransactionListener); } if (editor && "ActiveViewManager" in window && aStateFlags & nsIWebProgressListener.STATE_IS_WINDOW) { ActiveViewManager.newDocument(this.mEditor); } } if (editor && editor.document) { try { var charset = ""; var metas = editor.document.querySelectorAll("meta"); for (var i = 0; !charset && i < metas.length; i++) { var meta = metas[i]; if (meta.getAttribute("http-equiv") && meta.getAttribute("http-equiv").toLowerCase() == "content-type") { var match = meta.getAttribute("content").match( /charset\s*=\s*(.*)$/i ); if (match) charset = match[1].trim(); } else if (meta.hasAttribute("charset")) charset = meta.getAttribute("charset"); } if (!charset) { // do we deal with a newly created document? if (this.mURL.substr(0, 11) == "resource://") charset = "UTF-8"; else charset = this.mEditor.docShell.charset; } editor.documentCharacterSet = charset; var metaElts = editor.document.querySelectorAll('meta'); if (metaElts && metaElts.length) { for (var i = 0; i < metaElts.length; i++) { var m = metaElts[i]; if ((m.hasAttribute("http-equiv") && m.getAttribute("http-equiv").toLowerCase() == "content-type") || m.hasAttribute("charset")) m.parentNode.removeChild(m); } } var meta = editor.document.createElement("meta"); var head = editor.document.querySelector("head"); if (editor.document.doctype && editor.document.doctype.publicId == "" && editor.document.documentElement.getAttribute("xmlns") == "http://www.w3.org/1999/xhtml") { // XHTML5 meta.setAttribute("charset", charset); head.insertBefore(meta, head.firstChild); } else { meta.setAttribute("http-equiv", "content-type"); var doctype = editor.document.doctype; var systemId = doctype ? doctype.systemId : null; var isXML = false; switch (systemId) { case "http://www.w3.org/TR/html4/strict.dtd": // HTML 4 case "http://www.w3.org/TR/html4/loose.dtd": case "http://www.w3.org/TR/REC-html40/strict.dtd": case "http://www.w3.org/TR/REC-html40/loose.dtd": isXML = false; break; case "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd": // XHTML 1 case "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd": case "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd": isXML = true; break; case "": case "about:legacy-compat": isXML = (editor.document.documentElement.getAttribute("xmlns") == "http://www.w3.org/1999/xhtml"); break; case null: isXML = (editor.document.compatMode == "CSS1Compat"); break; } meta.setAttribute("content", (isXML ? "application/xhtml+xml" : "text/html") + "; charset=" + charset); head.insertBefore(meta, head.firstChild); } editor.resetModificationCount(); editor.transactionManager.clear(); } catch(e) { // uncomment the following line only for debuggin reasons // alert("tabeditor: " + e); } window.updateCommands("navigation"); window.updateCommands("create"); NotifierUtils.notify("tabCreated"); RecentPagesHandler.saveRecentFilesPrefs(); RecentPagesHandler.buildRecentPagesMenu(); editor.beginningOfDocument(); // force editor to acquire focus and show caret... workaround for bug 351 gDialog["menulist-zoompanel"].focus(); this.mEditor.contentWindow.focus(); editor.resetModificationCount(); editor.transactionManager.clear(); } } }, onProgressChange : function(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress) { }, onLocationChange : function(aWebProgress, aRequest, aLocation) { }, onStatusChange : function(aWebProgress, aRequest, aStatus, aMessage) { var status = document.getElementById("status"); if (status) status.setAttribute("label", aMessage); }, onSecurityChange : function(aWebProgress, aRequest, aState) { }, _requestsStarted: 0, _requestsFinished: 0, mTabeditor: null, mEditor: null, mEditorSheets: true, mURL: null, mTab: null }; this.mHruler.removeAttribute("disabled"); this.mHruler.addObject("foo", 50, 200); this.mVruler.removeAttribute("disabled"); var newBox = this._newEditor(); var newEditorElement = newBox.firstChild; var newTab = this.mTabs.appendItem(aTitle, UrlUtils.stripUsernamePassword(aURL, null, null)); newTab.setAttribute("label", aTitle); newTab.setAttribute("context", "tabContextPopup"); newTab.setAttribute("class", "tabeditor-tab"); newTab.setAttribute("maxwidth", 200); newTab.setAttribute("width", 0); newTab.setAttribute("minwidth", 30); newTab.setAttribute("flex", 100); newTab.setAttribute("crop", "end"); newTab.setAttribute("busy", "true"); newTab.setAttribute("tooltip", "tab-tooltip"); this.mTabpanels.appendChild(newBox); newEditorElement.makeEditable("html", true); var docShell = newEditorElement.docShell; var progress = docShell.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIWebProgress); var progressListener = new EditorContentListener(this, newEditorElement, aURL, newTab); progress.addProgressListener(progressListener, Components.interfaces.nsIWebProgress.NOTIFY_ALL); var _self = this; newEditorElement.addEventListener("load", function(evt) { if (evt.originalTarget == GetWindowContent().document){ _self.finishInstall(progressListener); } }, true); newEditorElement.addEventListener("DOMTitleChanged", this.changeTabTitle, false); newEditorElement.addEventListener("dblclick", function(evt) { OnDoubleClick(evt) }, true); newEditorElement.addEventListener("click", function(evt) { OnClick(evt) }, true); // select that new tab this.selectedTab = newTab; this.selectedIndex = this.mTabpanels.childNodes.length - 1; window.EditorLoadUrl(newEditorElement, aURL); this.setAttribute("visibility", "visible"); ComposerCommands.setupFormatCommands(); return {tab: newTab, panel: newEditorElement}; ]]> ================================================ FILE: base/content/bluegriffon/credits.xhtml ================================================ %brandDTD; %creditsDTD; ] > &brandFullName; Credits

&credit.leads;

  • Daniel Glazman

&credit.contributors;

  • Laurent Jouanneau
  • Jean-Yves Cronier
  • Alex Bodnaru
  • Frédéric Bezies
  • Dave Yeo
  • Philippe Goetz
  • Charles Cooke
  • Yu Tang
  • Eventric.com

&credit.translation;

fr-FR (Français, France) Daniel Glazman
Goofy
Pascal Cuissinat
es-ES (Español, España) Antonio Paniaga
cs (Čeština) Michal Stanke
de-DE (Deutsch, Deutschland) André Frick
Simon Speich
he-IL(עברית, ישראל) Alex Bodnaru
ja-JP(日本語, 日本) Koji Ishii
Yu Tang
sl (Slovenščina) Vito Smolej
it (Italiano) Andrea Sanavia
nl (Nederlands) Martijn Weisbeek
Alexander van Oosten
ko (한국어) Jungoo Lee
zh-CN (汉语, 中国) Dean Lee
zh-TW (中文, 中國) Jimmy John
pl (Polski) Stefan Plewako
Zbigniew Braniecki
Rafał Piotrowski
fi (Suomi) Aki Laaksovirta
sv-SE (Svenska, Sverige) Martin Karlsson
sr (српски) Snežana Lukić
Ivan Starčević
gl (Galego) Enrique Estévez
ru (Русский) AVB

&brandFullName; &tm.part0; Disruptive Innovations SAS.

BlueGriffon is copyright ©1998-2019 by its contributors, according to terms set out in the Mozilla Public License and Netscape Public License documents. All Rights Reserved.

Portions of this software are Copyright ©1994 The Regents of the University of California. All Rights Reserved.

Main toolbar's icons inside BlueGriffon borrowed from http://free-icon-rainbow.com/. Icons free even for commercial use and available in SVG..

Some icons inside BlueGriffon borrowed from The Glaze Icons iconset and used under the terms of the GNU Lesser General Public License.

The Bezier Curve editor in the CSS Properties panel is a contribution from Jean-Yves Cronier, used with permission.

Some icons are a work of FatCow Web Hosting and used under the terms of the CC BY 3.0 license.

Beautify-html.js is a code written by Nochum Sossonko, based on code initially developed by Einar Lielmanis.

Copyright (c) 2009 - 2011, Einar Lielmanis

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

CodeMirror is copyright (C) 2011 by Marijn Haverbeke

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Contextual CodeMirror Completions is copyright (C) 2012 by Domestika LLC

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

boxcutter is copyright (c) 2008-2011 Matt Rasmussen and used under the terms of the Gnu Lesser General Public License (LGPL) 2.1.

FireFTP is copyright (c) 2004-2010 Mime Cuvalo.

Code from FireFTP is reused under the Mozilla Public License inside file fireFtp.jsm. We would like to thank Mime Cuvalo giving us his formal authorization to reuse his code in BlueGriffon.

The Yahoo! UI Library is copyright (c) 2008, Yahoo! Inc.

Copyright (c) 2008, Yahoo! Inc. All rights reserved.

Redistribution and use of this software in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Yahoo! Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission of Yahoo! Inc.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

jQuery is copyright (c) 2008 John Resig.

Copyright (c) 2008 John Resig, http://jquery.com/

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Eric Meyer's Color Blender is copyright Eric Meyer.

BlueGriffon's color blender is adapted from Eric Meyer's Color Blender, used under the terms of the Creative Commons Attribution-ShareAlike 1.0 License and with Eric's agreement.

Icons made by Freepik from www.flaticon.com are licensed by CC 3.0 BY

This software may contain portions that are Copyright ©1998-2005 SupportSoft, Inc. All Rights Reserved.

U.S. GOVERNMENT END USERS. The Software is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire the Software with only those rights set forth herein.

================================================ FILE: base/content/bluegriffon/dialogs/aboutDialog.js ================================================ Components.utils.import("resource://gre/modules/Services.jsm"); function Startup() { var windowElt = document.documentElement; /*if (!windowElt.hasAttribute("width") && !windowElt.hasAttribute("height")) window.sizeToContent();*/ document.getElementById("iframe").addEventListener( "pageshow", onIframeLoaded, false); document.getElementById("iframe").setAttribute("src", "chrome://bluegriffon/content/credits.xhtml"); #ifndef XP_MACOSX CenterDialogOnOpener(); #endif } function onIframeLoaded() { ApplyWysiwygThemeChange(document, Services.prefs.getCharPref("bluegriffon.wysiwyg.theme")); document.getElementById("iframe").contentWindow. setCallback(onUrlClicked); } function onUrlClicked(url) { loadExternalURL(url); } ================================================ FILE: base/content/bluegriffon/dialogs/aboutDialog.xul ================================================ # ***** BEGIN LICENSE BLOCK ***** # Version: MPL 1.1/GPL 2.0/LGPL 2.1 # # The contents of this file are subject to the Mozilla Public License Version # 1.1 (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. # # The Original Code is Mozilla Firebird about dialog. # # The Initial Developer of the Original Code is # Blake Ross (blaker@netscape.com). # Portions created by the Initial Developer are Copyright (C) 2002 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Daniel Glazman # # Alternatively, the contents of this file may be used under the terms of # either the GNU General Public License Version 2 or later (the "GPL"), or # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), # in which case the provisions of the GPL or the LGPL are applicable instead # of those above. If you wish to allow use of your version of this file only # under the terms of either the GPL or the LGPL, and not to allow others to # use your version of this file under the terms of the MPL, indicate your # decision by deleting the provisions above and replace them with the notice # and other provisions required by the LGPL or the GPL. If you do not delete # the provisions above, a recipient may use your version of this file under # the terms of any one of the MPL, the GPL or the LGPL. # # ***** END LICENSE BLOCK ***** --> #filter substitution %brandDTD; %aboutDialogDTD; ]> #include scripts.inc #include sets.inc #include menubar.inc ================================================ FILE: base/content/bluegriffon/xul/macWindowMenu.inc ================================================ ================================================ FILE: base/res/codemirror/addon/comment/comment.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var noOptions = {}; var nonWS = /[^\s\u00a0]/; var Pos = CodeMirror.Pos; function firstNonWS(str) { var found = str.search(nonWS); return found == -1 ? 0 : found; } CodeMirror.commands.toggleComment = function(cm) { var minLine = Infinity, ranges = cm.listSelections(), mode = null; for (var i = ranges.length - 1; i >= 0; i--) { var from = ranges[i].from(), to = ranges[i].to(); if (from.line >= minLine) continue; if (to.line >= minLine) to = Pos(minLine, 0); minLine = from.line; if (mode == null) { if (cm.uncomment(from, to)) mode = "un"; else { cm.lineComment(from, to); mode = "line"; } } else if (mode == "un") { cm.uncomment(from, to); } else { cm.lineComment(from, to); } } }; CodeMirror.defineExtension("lineComment", function(from, to, options) { if (!options) options = noOptions; var self = this, mode = self.getModeAt(from); var commentString = options.lineComment || mode.lineComment; if (!commentString) { if (options.blockCommentStart || mode.blockCommentStart) { options.fullLines = true; self.blockComment(from, to, options); } return; } var firstLine = self.getLine(from.line); if (firstLine == null) return; var end = Math.min(to.ch != 0 || to.line == from.line ? to.line + 1 : to.line, self.lastLine() + 1); var pad = options.padding == null ? " " : options.padding; var blankLines = options.commentBlankLines || from.line == to.line; self.operation(function() { if (options.indent) { var baseString = firstLine.slice(0, firstNonWS(firstLine)); for (var i = from.line; i < end; ++i) { var line = self.getLine(i), cut = baseString.length; if (!blankLines && !nonWS.test(line)) continue; if (line.slice(0, cut) != baseString) cut = firstNonWS(line); self.replaceRange(baseString + commentString + pad, Pos(i, 0), Pos(i, cut)); } } else { for (var i = from.line; i < end; ++i) { if (blankLines || nonWS.test(self.getLine(i))) self.replaceRange(commentString + pad, Pos(i, 0)); } } }); }); CodeMirror.defineExtension("blockComment", function(from, to, options) { if (!options) options = noOptions; var self = this, mode = self.getModeAt(from); var startString = options.blockCommentStart || mode.blockCommentStart; var endString = options.blockCommentEnd || mode.blockCommentEnd; if (!startString || !endString) { if ((options.lineComment || mode.lineComment) && options.fullLines != false) self.lineComment(from, to, options); return; } var end = Math.min(to.line, self.lastLine()); if (end != from.line && to.ch == 0 && nonWS.test(self.getLine(end))) --end; var pad = options.padding == null ? " " : options.padding; if (from.line > end) return; self.operation(function() { if (options.fullLines != false) { var lastLineHasText = nonWS.test(self.getLine(end)); self.replaceRange(pad + endString, Pos(end)); self.replaceRange(startString + pad, Pos(from.line, 0)); var lead = options.blockCommentLead || mode.blockCommentLead; if (lead != null) for (var i = from.line + 1; i <= end; ++i) if (i != end || lastLineHasText) self.replaceRange(lead + pad, Pos(i, 0)); } else { self.replaceRange(endString, to); self.replaceRange(startString, from); } }); }); CodeMirror.defineExtension("uncomment", function(from, to, options) { if (!options) options = noOptions; var self = this, mode = self.getModeAt(from); var end = Math.min(to.ch != 0 || to.line == from.line ? to.line : to.line - 1, self.lastLine()), start = Math.min(from.line, end); // Try finding line comments var lineString = options.lineComment || mode.lineComment, lines = []; var pad = options.padding == null ? " " : options.padding, didSomething; lineComment: { if (!lineString) break lineComment; for (var i = start; i <= end; ++i) { var line = self.getLine(i); var found = line.indexOf(lineString); if (found > -1 && !/comment/.test(self.getTokenTypeAt(Pos(i, found + 1)))) found = -1; if (found == -1 && (i != end || i == start) && nonWS.test(line)) break lineComment; if (found > -1 && nonWS.test(line.slice(0, found))) break lineComment; lines.push(line); } self.operation(function() { for (var i = start; i <= end; ++i) { var line = lines[i - start]; var pos = line.indexOf(lineString), endPos = pos + lineString.length; if (pos < 0) continue; if (line.slice(endPos, endPos + pad.length) == pad) endPos += pad.length; didSomething = true; self.replaceRange("", Pos(i, pos), Pos(i, endPos)); } }); if (didSomething) return true; } // Try block comments var startString = options.blockCommentStart || mode.blockCommentStart; var endString = options.blockCommentEnd || mode.blockCommentEnd; if (!startString || !endString) return false; var lead = options.blockCommentLead || mode.blockCommentLead; var startLine = self.getLine(start), endLine = end == start ? startLine : self.getLine(end); var open = startLine.indexOf(startString), close = endLine.lastIndexOf(endString); if (close == -1 && start != end) { endLine = self.getLine(--end); close = endLine.lastIndexOf(endString); } if (open == -1 || close == -1 || !/comment/.test(self.getTokenTypeAt(Pos(start, open + 1))) || !/comment/.test(self.getTokenTypeAt(Pos(end, close + 1)))) return false; // Avoid killing block comments completely outside the selection. // Positions of the last startString before the start of the selection, and the first endString after it. var lastStart = startLine.lastIndexOf(startString, from.ch); var firstEnd = lastStart == -1 ? -1 : startLine.slice(0, from.ch).indexOf(endString, lastStart + startString.length); if (lastStart != -1 && firstEnd != -1 && firstEnd + endString.length != from.ch) return false; // Positions of the first endString after the end of the selection, and the last startString before it. firstEnd = endLine.indexOf(endString, to.ch); var almostLastStart = endLine.slice(to.ch).lastIndexOf(startString, firstEnd - to.ch); lastStart = (firstEnd == -1 || almostLastStart == -1) ? -1 : to.ch + almostLastStart; if (firstEnd != -1 && lastStart != -1 && lastStart != to.ch) return false; self.operation(function() { self.replaceRange("", Pos(end, close - (pad && endLine.slice(close - pad.length, close) == pad ? pad.length : 0)), Pos(end, close + endString.length)); var openEnd = open + startString.length; if (pad && startLine.slice(openEnd, openEnd + pad.length) == pad) openEnd += pad.length; self.replaceRange("", Pos(start, open), Pos(start, openEnd)); if (lead) for (var i = start + 1; i <= end; ++i) { var line = self.getLine(i), found = line.indexOf(lead); if (found == -1 || nonWS.test(line.slice(0, found))) continue; var foundEnd = found + lead.length; if (pad && line.slice(foundEnd, foundEnd + pad.length) == pad) foundEnd += pad.length; self.replaceRange("", Pos(i, found), Pos(i, foundEnd)); } }); return true; }); }); ================================================ FILE: base/res/codemirror/addon/comment/continuecomment.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { var modes = ["clike", "css", "javascript"]; for (var i = 0; i < modes.length; ++i) CodeMirror.extendMode(modes[i], {blockCommentContinue: " * "}); function continueComment(cm) { if (cm.getOption("disableInput")) return CodeMirror.Pass; var ranges = cm.listSelections(), mode, inserts = []; for (var i = 0; i < ranges.length; i++) { var pos = ranges[i].head, token = cm.getTokenAt(pos); if (token.type != "comment") return CodeMirror.Pass; var modeHere = CodeMirror.innerMode(cm.getMode(), token.state).mode; if (!mode) mode = modeHere; else if (mode != modeHere) return CodeMirror.Pass; var insert = null; if (mode.blockCommentStart && mode.blockCommentContinue) { var end = token.string.indexOf(mode.blockCommentEnd); var full = cm.getRange(CodeMirror.Pos(pos.line, 0), CodeMirror.Pos(pos.line, token.end)), found; if (end != -1 && end == token.string.length - mode.blockCommentEnd.length && pos.ch >= end) { // Comment ended, don't continue it } else if (token.string.indexOf(mode.blockCommentStart) == 0) { insert = full.slice(0, token.start); if (!/^\s*$/.test(insert)) { insert = ""; for (var j = 0; j < token.start; ++j) insert += " "; } } else if ((found = full.indexOf(mode.blockCommentContinue)) != -1 && found + mode.blockCommentContinue.length > token.start && /^\s*$/.test(full.slice(0, found))) { insert = full.slice(0, found); } if (insert != null) insert += mode.blockCommentContinue; } if (insert == null && mode.lineComment && continueLineCommentEnabled(cm)) { var line = cm.getLine(pos.line), found = line.indexOf(mode.lineComment); if (found > -1) { insert = line.slice(0, found); if (/\S/.test(insert)) insert = null; else insert += mode.lineComment + line.slice(found + mode.lineComment.length).match(/^\s*/)[0]; } } if (insert == null) return CodeMirror.Pass; inserts[i] = "\n" + insert; } cm.operation(function() { for (var i = ranges.length - 1; i >= 0; i--) cm.replaceRange(inserts[i], ranges[i].from(), ranges[i].to(), "+insert"); }); } function continueLineCommentEnabled(cm) { var opt = cm.getOption("continueComments"); if (opt && typeof opt == "object") return opt.continueLineComment !== false; return true; } CodeMirror.defineOption("continueComments", null, function(cm, val, prev) { if (prev && prev != CodeMirror.Init) cm.removeKeyMap("continueComment"); if (val) { var key = "Enter"; if (typeof val == "string") key = val; else if (typeof val == "object" && val.key) key = val.key; var map = {name: "continueComment"}; map[key] = continueComment; cm.addKeyMap(map); } }); }); ================================================ FILE: base/res/codemirror/addon/dialog/dialog.css ================================================ .CodeMirror-dialog { position: absolute; left: 0; right: 0; background: white; z-index: 15; padding: .1em .8em; overflow: hidden; color: #333; } .CodeMirror-dialog-top { border-bottom: 1px solid #eee; top: 0; } .CodeMirror-dialog-bottom { border-top: 1px solid #eee; bottom: 0; } .CodeMirror-dialog input { border: none; outline: none; background: transparent; width: 20em; color: inherit; font-family: monospace; } .CodeMirror-dialog button { font-size: 70%; } ================================================ FILE: base/res/codemirror/addon/dialog/dialog.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Open simple dialogs on top of an editor. Relies on dialog.css. (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { function dialogDiv(cm, template, bottom) { var wrap = cm.getWrapperElement(); var dialog; dialog = wrap.appendChild(document.createElement("div")); if (bottom) dialog.className = "CodeMirror-dialog CodeMirror-dialog-bottom"; else dialog.className = "CodeMirror-dialog CodeMirror-dialog-top"; if (typeof template == "string") { dialog.innerHTML = template; } else { // Assuming it's a detached DOM element. dialog.appendChild(template); } return dialog; } function closeNotification(cm, newVal) { if (cm.state.currentNotificationClose) cm.state.currentNotificationClose(); cm.state.currentNotificationClose = newVal; } CodeMirror.defineExtension("openDialog", function(template, callback, options) { if (!options) options = {}; closeNotification(this, null); var dialog = dialogDiv(this, template, options.bottom); var closed = false, me = this; function close(newVal) { if (typeof newVal == 'string') { inp.value = newVal; } else { if (closed) return; closed = true; dialog.parentNode.removeChild(dialog); me.focus(); if (options.onClose) options.onClose(dialog); } } var inp = dialog.getElementsByTagName("input")[0], button; if (inp) { if (options.value) { inp.value = options.value; if (options.selectValueOnOpen !== false) { inp.select(); } } if (options.onInput) CodeMirror.on(inp, "input", function(e) { options.onInput(e, inp.value, close);}); if (options.onKeyUp) CodeMirror.on(inp, "keyup", function(e) {options.onKeyUp(e, inp.value, close);}); CodeMirror.on(inp, "keydown", function(e) { if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; } if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) { inp.blur(); CodeMirror.e_stop(e); close(); } if (e.keyCode == 13) callback(inp.value, e); }); if (options.closeOnBlur !== false) CodeMirror.on(inp, "blur", close); inp.focus(); } else if (button = dialog.getElementsByTagName("button")[0]) { CodeMirror.on(button, "click", function() { close(); me.focus(); }); if (options.closeOnBlur !== false) CodeMirror.on(button, "blur", close); button.focus(); } return close; }); CodeMirror.defineExtension("openConfirm", function(template, callbacks, options) { closeNotification(this, null); var dialog = dialogDiv(this, template, options && options.bottom); var buttons = dialog.getElementsByTagName("button"); var closed = false, me = this, blurring = 1; function close() { if (closed) return; closed = true; dialog.parentNode.removeChild(dialog); me.focus(); } buttons[0].focus(); for (var i = 0; i < buttons.length; ++i) { var b = buttons[i]; (function(callback) { CodeMirror.on(b, "click", function(e) { CodeMirror.e_preventDefault(e); close(); if (callback) callback(me); }); })(callbacks[i]); CodeMirror.on(b, "blur", function() { --blurring; setTimeout(function() { if (blurring <= 0) close(); }, 200); }); CodeMirror.on(b, "focus", function() { ++blurring; }); } }); /* * openNotification * Opens a notification, that can be closed with an optional timer * (default 5000ms timer) and always closes on click. * * If a notification is opened while another is opened, it will close the * currently opened one and open the new one immediately. */ CodeMirror.defineExtension("openNotification", function(template, options) { closeNotification(this, close); var dialog = dialogDiv(this, template, options && options.bottom); var closed = false, doneTimer; var duration = options && typeof options.duration !== "undefined" ? options.duration : 5000; function close() { if (closed) return; closed = true; clearTimeout(doneTimer); dialog.parentNode.removeChild(dialog); } CodeMirror.on(dialog, 'click', function(e) { CodeMirror.e_preventDefault(e); close(); }); if (duration) doneTimer = setTimeout(close, duration); return close; }); }); ================================================ FILE: base/res/codemirror/addon/display/fullscreen.css ================================================ .CodeMirror-fullscreen { position: fixed; top: 0; left: 0; right: 0; bottom: 0; height: auto; z-index: 9; } ================================================ FILE: base/res/codemirror/addon/display/fullscreen.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineOption("fullScreen", false, function(cm, val, old) { if (old == CodeMirror.Init) old = false; if (!old == !val) return; if (val) setFullscreen(cm); else setNormal(cm); }); function setFullscreen(cm) { var wrap = cm.getWrapperElement(); cm.state.fullScreenRestore = {scrollTop: window.pageYOffset, scrollLeft: window.pageXOffset, width: wrap.style.width, height: wrap.style.height}; wrap.style.width = ""; wrap.style.height = "auto"; wrap.className += " CodeMirror-fullscreen"; document.documentElement.style.overflow = "hidden"; cm.refresh(); } function setNormal(cm) { var wrap = cm.getWrapperElement(); wrap.className = wrap.className.replace(/\s*CodeMirror-fullscreen\b/, ""); document.documentElement.style.overflow = ""; var info = cm.state.fullScreenRestore; wrap.style.width = info.width; wrap.style.height = info.height; window.scrollTo(info.scrollLeft, info.scrollTop); cm.refresh(); } }); ================================================ FILE: base/res/codemirror/addon/display/panel.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { CodeMirror.defineExtension("addPanel", function(node, options) { options = options || {}; if (!this.state.panels) initPanels(this); var info = this.state.panels; var wrapper = info.wrapper; var cmWrapper = this.getWrapperElement(); if (options.after instanceof Panel && !options.after.cleared) { wrapper.insertBefore(node, options.before.node.nextSibling); } else if (options.before instanceof Panel && !options.before.cleared) { wrapper.insertBefore(node, options.before.node); } else if (options.replace instanceof Panel && !options.replace.cleared) { wrapper.insertBefore(node, options.replace.node); options.replace.clear(); } else if (options.position == "bottom") { wrapper.appendChild(node); } else if (options.position == "before-bottom") { wrapper.insertBefore(node, cmWrapper.nextSibling); } else if (options.position == "after-top") { wrapper.insertBefore(node, cmWrapper); } else { wrapper.insertBefore(node, wrapper.firstChild); } var height = (options && options.height) || node.offsetHeight; this._setSize(null, info.heightLeft -= height); info.panels++; return new Panel(this, node, options, height); }); function Panel(cm, node, options, height) { this.cm = cm; this.node = node; this.options = options; this.height = height; this.cleared = false; } Panel.prototype.clear = function() { if (this.cleared) return; this.cleared = true; var info = this.cm.state.panels; this.cm._setSize(null, info.heightLeft += this.height); info.wrapper.removeChild(this.node); if (--info.panels == 0) removePanels(this.cm); }; Panel.prototype.changed = function(height) { var newHeight = height == null ? this.node.offsetHeight : height; var info = this.cm.state.panels; this.cm._setSize(null, info.height += (newHeight - this.height)); this.height = newHeight; }; function initPanels(cm) { var wrap = cm.getWrapperElement(); var style = window.getComputedStyle ? window.getComputedStyle(wrap) : wrap.currentStyle; var height = parseInt(style.height); var info = cm.state.panels = { setHeight: wrap.style.height, heightLeft: height, panels: 0, wrapper: document.createElement("div") }; wrap.parentNode.insertBefore(info.wrapper, wrap); var hasFocus = cm.hasFocus(); info.wrapper.appendChild(wrap); if (hasFocus) cm.focus(); cm._setSize = cm.setSize; if (height != null) cm.setSize = function(width, newHeight) { if (newHeight == null) return this._setSize(width, newHeight); info.setHeight = newHeight; if (typeof newHeight != "number") { var px = /^(\d+\.?\d*)px$/.exec(newHeight); if (px) { newHeight = Number(px[1]); } else { info.wrapper.style.height = newHeight; newHeight = info.wrapper.offsetHeight; info.wrapper.style.height = ""; } } cm._setSize(width, info.heightLeft += (newHeight - height)); height = newHeight; }; } function removePanels(cm) { var info = cm.state.panels; cm.state.panels = null; var wrap = cm.getWrapperElement(); info.wrapper.parentNode.replaceChild(wrap, info.wrapper); wrap.style.height = info.setHeight; cm.setSize = cm._setSize; cm.setSize(); } }); ================================================ FILE: base/res/codemirror/addon/display/placeholder.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { CodeMirror.defineOption("placeholder", "", function(cm, val, old) { var prev = old && old != CodeMirror.Init; if (val && !prev) { cm.on("blur", onBlur); cm.on("change", onChange); onChange(cm); } else if (!val && prev) { cm.off("blur", onBlur); cm.off("change", onChange); clearPlaceholder(cm); var wrapper = cm.getWrapperElement(); wrapper.className = wrapper.className.replace(" CodeMirror-empty", ""); } if (val && !cm.hasFocus()) onBlur(cm); }); function clearPlaceholder(cm) { if (cm.state.placeholder) { cm.state.placeholder.parentNode.removeChild(cm.state.placeholder); cm.state.placeholder = null; } } function setPlaceholder(cm) { clearPlaceholder(cm); var elt = cm.state.placeholder = document.createElement("pre"); elt.style.cssText = "height: 0; overflow: visible"; elt.className = "CodeMirror-placeholder"; elt.appendChild(document.createTextNode(cm.getOption("placeholder"))); cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild); } function onBlur(cm) { if (isEmpty(cm)) setPlaceholder(cm); } function onChange(cm) { var wrapper = cm.getWrapperElement(), empty = isEmpty(cm); wrapper.className = wrapper.className.replace(" CodeMirror-empty", "") + (empty ? " CodeMirror-empty" : ""); if (empty) setPlaceholder(cm); else clearPlaceholder(cm); } function isEmpty(cm) { return (cm.lineCount() === 1) && (cm.getLine(0) === ""); } }); ================================================ FILE: base/res/codemirror/addon/display/rulers.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineOption("rulers", false, function(cm, val, old) { if (old && old != CodeMirror.Init) { clearRulers(cm); cm.off("refresh", refreshRulers); } if (val && val.length) { setRulers(cm); cm.on("refresh", refreshRulers); } }); function clearRulers(cm) { for (var i = cm.display.lineSpace.childNodes.length - 1; i >= 0; i--) { var node = cm.display.lineSpace.childNodes[i]; if (/(^|\s)CodeMirror-ruler($|\s)/.test(node.className)) node.parentNode.removeChild(node); } } function setRulers(cm) { var val = cm.getOption("rulers"); var cw = cm.defaultCharWidth(); var left = cm.charCoords(CodeMirror.Pos(cm.firstLine(), 0), "div").left; var minH = cm.display.scroller.offsetHeight + 30; for (var i = 0; i < val.length; i++) { var elt = document.createElement("div"); elt.className = "CodeMirror-ruler"; var col, cls = null, conf = val[i]; if (typeof conf == "number") { col = conf; } else { col = conf.column; if (conf.className) elt.className += " " + conf.className; if (conf.color) elt.style.borderColor = conf.color; if (conf.lineStyle) elt.style.borderLeftStyle = conf.lineStyle; if (conf.width) elt.style.borderLeftWidth = conf.width; cls = val[i].className; } elt.style.left = (left + col * cw) + "px"; elt.style.top = "-50px"; elt.style.bottom = "-20px"; elt.style.minHeight = minH + "px"; cm.display.lineSpace.insertBefore(elt, cm.display.cursorDiv); } } function refreshRulers(cm) { clearRulers(cm); setRulers(cm); } }); ================================================ FILE: base/res/codemirror/addon/edit/closebrackets.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { var defaults = { pairs: "()[]{}''\"\"", triples: "", explode: "[]{}" }; var Pos = CodeMirror.Pos; CodeMirror.defineOption("autoCloseBrackets", false, function(cm, val, old) { if (old && old != CodeMirror.Init) { cm.removeKeyMap(keyMap); cm.state.closeBrackets = null; } if (val) { cm.state.closeBrackets = val; cm.addKeyMap(keyMap); } }); function getOption(conf, name) { if (name == "pairs" && typeof conf == "string") return conf; if (typeof conf == "object" && conf[name] != null) return conf[name]; return defaults[name]; } var bind = defaults.pairs + "`"; var keyMap = {Backspace: handleBackspace, Enter: handleEnter}; for (var i = 0; i < bind.length; i++) keyMap["'" + bind.charAt(i) + "'"] = handler(bind.charAt(i)); function handler(ch) { return function(cm) { return handleChar(cm, ch); }; } function getConfig(cm) { var deflt = cm.state.closeBrackets; if (!deflt) return null; var mode = cm.getModeAt(cm.getCursor()); return mode.closeBrackets || deflt; } function handleBackspace(cm) { var conf = getConfig(cm); if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass; var pairs = getOption(conf, "pairs"); var ranges = cm.listSelections(); for (var i = 0; i < ranges.length; i++) { if (!ranges[i].empty()) return CodeMirror.Pass; var around = charsAround(cm, ranges[i].head); if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass; } for (var i = ranges.length - 1; i >= 0; i--) { var cur = ranges[i].head; cm.replaceRange("", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1)); } } function handleEnter(cm) { var conf = getConfig(cm); var explode = conf && getOption(conf, "explode"); if (!explode || cm.getOption("disableInput")) return CodeMirror.Pass; var ranges = cm.listSelections(); for (var i = 0; i < ranges.length; i++) { if (!ranges[i].empty()) return CodeMirror.Pass; var around = charsAround(cm, ranges[i].head); if (!around || explode.indexOf(around) % 2 != 0) return CodeMirror.Pass; } cm.operation(function() { cm.replaceSelection("\n\n", null); cm.execCommand("goCharLeft"); ranges = cm.listSelections(); for (var i = 0; i < ranges.length; i++) { var line = ranges[i].head.line; cm.indentLine(line, null, true); cm.indentLine(line + 1, null, true); } }); } function handleChar(cm, ch) { var conf = getConfig(cm); if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass; var pairs = getOption(conf, "pairs"); var pos = pairs.indexOf(ch); if (pos == -1) return CodeMirror.Pass; var triples = getOption(conf, "triples"); var identical = pairs.charAt(pos + 1) == ch; var ranges = cm.listSelections(); var opening = pos % 2 == 0; var type, next; for (var i = 0; i < ranges.length; i++) { var range = ranges[i], cur = range.head, curType; var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1)); if (opening && !range.empty()) { curType = "surround"; } else if ((identical || !opening) && next == ch) { if (triples.indexOf(ch) >= 0 && cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == ch + ch + ch) curType = "skipThree"; else curType = "skip"; } else if (identical && cur.ch > 1 && triples.indexOf(ch) >= 0 && cm.getRange(Pos(cur.line, cur.ch - 2), cur) == ch + ch && (cur.ch <= 2 || cm.getRange(Pos(cur.line, cur.ch - 3), Pos(cur.line, cur.ch - 2)) != ch)) { curType = "addFour"; } else if (identical) { if (!CodeMirror.isWordChar(next) && enteringString(cm, cur, ch)) curType = "both"; else return CodeMirror.Pass; } else if (opening && (cm.getLine(cur.line).length == cur.ch || isClosingBracket(next, pairs) || /\s/.test(next))) { curType = "both"; } else { return CodeMirror.Pass; } if (!type) type = curType; else if (type != curType) return CodeMirror.Pass; } var left = pos % 2 ? pairs.charAt(pos - 1) : ch; var right = pos % 2 ? ch : pairs.charAt(pos + 1); cm.operation(function() { if (type == "skip") { cm.execCommand("goCharRight"); } else if (type == "skipThree") { for (var i = 0; i < 3; i++) cm.execCommand("goCharRight"); } else if (type == "surround") { var sels = cm.getSelections(); for (var i = 0; i < sels.length; i++) sels[i] = left + sels[i] + right; cm.replaceSelections(sels, "around"); } else if (type == "both") { cm.replaceSelection(left + right, null); cm.execCommand("goCharLeft"); } else if (type == "addFour") { cm.replaceSelection(left + left + left + left, "before"); cm.execCommand("goCharRight"); } }); } function isClosingBracket(ch, pairs) { var pos = pairs.lastIndexOf(ch); return pos > -1 && pos % 2 == 1; } function charsAround(cm, pos) { var str = cm.getRange(Pos(pos.line, pos.ch - 1), Pos(pos.line, pos.ch + 1)); return str.length == 2 ? str : null; } // Project the token type that will exists after the given char is // typed, and use it to determine whether it would cause the start // of a string token. function enteringString(cm, pos, ch) { var line = cm.getLine(pos.line); var token = cm.getTokenAt(pos); if (/\bstring2?\b/.test(token.type)) return false; var stream = new CodeMirror.StringStream(line.slice(0, pos.ch) + ch + line.slice(pos.ch), 4); stream.pos = stream.start = token.start; for (;;) { var type1 = cm.getMode().token(stream, token.state); if (stream.pos >= pos.ch + 1) return /\bstring2?\b/.test(type1); stream.start = stream.pos; } } }); ================================================ FILE: base/res/codemirror/addon/edit/closetag.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /** * Tag-closer extension for CodeMirror. * * This extension adds an "autoCloseTags" option that can be set to * either true to get the default behavior, or an object to further * configure its behavior. * * These are supported options: * * `whenClosing` (default true) * Whether to autoclose when the '/' of a closing tag is typed. * `whenOpening` (default true) * Whether to autoclose the tag when the final '>' of an opening * tag is typed. * `dontCloseTags` (default is empty tags for HTML, none for XML) * An array of tag names that should not be autoclosed. * `indentTags` (default is block tags for HTML, none for XML) * An array of tag names that should, when opened, cause a * blank line to be added inside the tag, and the blank line and * closing line to be indented. * * See demos/closetag.html for a usage example. */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../fold/xml-fold")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../fold/xml-fold"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { CodeMirror.defineOption("autoCloseTags", false, function(cm, val, old) { if (old != CodeMirror.Init && old) cm.removeKeyMap("autoCloseTags"); if (!val) return; var map = {name: "autoCloseTags"}; if (typeof val != "object" || val.whenClosing) map["'/'"] = function(cm) { return autoCloseSlash(cm); }; if (typeof val != "object" || val.whenOpening) map["'>'"] = function(cm) { return autoCloseGT(cm); }; cm.addKeyMap(map); }); var htmlDontClose = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr"]; var htmlIndent = ["applet", "blockquote", "body", "button", "div", "dl", "fieldset", "form", "frameset", "h1", "h2", "h3", "h4", "h5", "h6", "head", "html", "iframe", "layer", "legend", "object", "ol", "p", "select", "table", "ul"]; function autoCloseGT(cm) { if (cm.getOption("disableInput")) return CodeMirror.Pass; var ranges = cm.listSelections(), replacements = []; for (var i = 0; i < ranges.length; i++) { if (!ranges[i].empty()) return CodeMirror.Pass; var pos = ranges[i].head, tok = cm.getTokenAt(pos); var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state; if (inner.mode.name != "xml" || !state.tagName) return CodeMirror.Pass; var opt = cm.getOption("autoCloseTags"), html = inner.mode.configuration == "html"; var dontCloseTags = (typeof opt == "object" && opt.dontCloseTags) || (html && htmlDontClose); var indentTags = (typeof opt == "object" && opt.indentTags) || (html && htmlIndent); var tagName = state.tagName; if (tok.end > pos.ch) tagName = tagName.slice(0, tagName.length - tok.end + pos.ch); var lowerTagName = tagName.toLowerCase(); // Don't process the '>' at the end of an end-tag or self-closing tag if (!tagName || tok.type == "string" && (tok.end != pos.ch || !/[\"\']/.test(tok.string.charAt(tok.string.length - 1)) || tok.string.length == 1) || tok.type == "tag" && state.type == "closeTag" || tok.string.indexOf("/") == (tok.string.length - 1) || // match something like dontCloseTags && indexOf(dontCloseTags, lowerTagName) > -1 || closingTagExists(cm, tagName, pos, state, true)) return CodeMirror.Pass; var indent = indentTags && indexOf(indentTags, lowerTagName) > -1; replacements[i] = {indent: indent, text: ">" + (indent ? "\n\n" : "") + "", newPos: indent ? CodeMirror.Pos(pos.line + 1, 0) : CodeMirror.Pos(pos.line, pos.ch + 1)}; } for (var i = ranges.length - 1; i >= 0; i--) { var info = replacements[i]; cm.replaceRange(info.text, ranges[i].head, ranges[i].anchor, "+insert"); var sel = cm.listSelections().slice(0); sel[i] = {head: info.newPos, anchor: info.newPos}; cm.setSelections(sel); if (info.indent) { cm.indentLine(info.newPos.line, null, true); cm.indentLine(info.newPos.line + 1, null, true); } } } function autoCloseCurrent(cm, typingSlash) { var ranges = cm.listSelections(), replacements = []; var head = typingSlash ? "/" : ""; else if (cm.getMode().name == "htmlmixed" && inner.mode.name == "css") replacements[i] = head + "style>"; else return CodeMirror.Pass; } else { if (!state.context || !state.context.tagName || closingTagExists(cm, state.context.tagName, pos, state)) return CodeMirror.Pass; replacements[i] = head + state.context.tagName + ">"; } } cm.replaceSelections(replacements); ranges = cm.listSelections(); for (var i = 0; i < ranges.length; i++) if (i == ranges.length - 1 || ranges[i].head.line < ranges[i + 1].head.line) cm.indentLine(ranges[i].head.line); } function autoCloseSlash(cm) { if (cm.getOption("disableInput")) return CodeMirror.Pass; return autoCloseCurrent(cm, true); } CodeMirror.commands.closeTag = function(cm) { return autoCloseCurrent(cm); }; function indexOf(collection, elt) { if (collection.indexOf) return collection.indexOf(elt); for (var i = 0, e = collection.length; i < e; ++i) if (collection[i] == elt) return i; return -1; } // If xml-fold is loaded, we use its functionality to try and verify // whether a given tag is actually unclosed. function closingTagExists(cm, tagName, pos, state, newTag) { if (!CodeMirror.scanForClosingTag) return false; var end = Math.min(cm.lastLine() + 1, pos.line + 500); var nextClose = CodeMirror.scanForClosingTag(cm, pos, null, end); if (!nextClose || nextClose.tag != tagName) return false; var cx = state.context; // If the immediate wrapping context contains onCx instances of // the same tag, a closing tag only exists if there are at least // that many closing tags of that type following. for (var onCx = newTag ? 1 : 0; cx && cx.tagName == tagName; cx = cx.prev) ++onCx; pos = nextClose.to; for (var i = 1; i < onCx; i++) { var next = CodeMirror.scanForClosingTag(cm, pos, null, end); if (!next || next.tag != tagName) return false; pos = next.to; } return true; } }); ================================================ FILE: base/res/codemirror/addon/edit/continuelist.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var listRE = /^(\s*)(>[> ]*|[*+-]\s|(\d+)\.)(\s*)/, emptyListRE = /^(\s*)(>[> ]*|[*+-]|(\d+)\.)(\s*)$/, unorderedListRE = /[*+-]\s/; CodeMirror.commands.newlineAndIndentContinueMarkdownList = function(cm) { if (cm.getOption("disableInput")) return CodeMirror.Pass; var ranges = cm.listSelections(), replacements = []; for (var i = 0; i < ranges.length; i++) { var pos = ranges[i].head; var eolState = cm.getStateAfter(pos.line); var inList = eolState.list !== false; var inQuote = eolState.quote !== 0; var line = cm.getLine(pos.line), match = listRE.exec(line); if (!ranges[i].empty() || (!inList && !inQuote) || !match) { cm.execCommand("newlineAndIndent"); return; } if (emptyListRE.test(line)) { cm.replaceRange("", { line: pos.line, ch: 0 }, { line: pos.line, ch: pos.ch + 1 }); replacements[i] = "\n"; } else { var indent = match[1], after = match[4]; var bullet = unorderedListRE.test(match[2]) || match[2].indexOf(">") >= 0 ? match[2] : (parseInt(match[3], 10) + 1) + "."; replacements[i] = "\n" + indent + bullet + after; } } cm.replaceSelections(replacements); }; }); ================================================ FILE: base/res/codemirror/addon/edit/matchbrackets.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { var ie_lt8 = /MSIE \d/.test(navigator.userAgent) && (document.documentMode == null || document.documentMode < 8); var Pos = CodeMirror.Pos; var matching = {"(": ")>", ")": "(<", "[": "]>", "]": "[<", "{": "}>", "}": "{<"}; function findMatchingBracket(cm, where, strict, config) { var line = cm.getLineHandle(where.line), pos = where.ch - 1; var match = (pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)]; if (!match) return null; var dir = match.charAt(1) == ">" ? 1 : -1; if (strict && (dir > 0) != (pos == where.ch)) return null; var style = cm.getTokenTypeAt(Pos(where.line, pos + 1)); var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style || null, config); if (found == null) return null; return {from: Pos(where.line, pos), to: found && found.pos, match: found && found.ch == match.charAt(0), forward: dir > 0}; } // bracketRegex is used to specify which type of bracket to scan // should be a regexp, e.g. /[[\]]/ // // Note: If "where" is on an open bracket, then this bracket is ignored. // // Returns false when no bracket was found, null when it reached // maxScanLines and gave up function scanForBracket(cm, where, dir, style, config) { var maxScanLen = (config && config.maxScanLineLength) || 10000; var maxScanLines = (config && config.maxScanLines) || 1000; var stack = []; var re = config && config.bracketRegex ? config.bracketRegex : /[(){}[\]]/; var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1) : Math.max(cm.firstLine() - 1, where.line - maxScanLines); for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) { var line = cm.getLine(lineNo); if (!line) continue; var pos = dir > 0 ? 0 : line.length - 1, end = dir > 0 ? line.length : -1; if (line.length > maxScanLen) continue; if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0); for (; pos != end; pos += dir) { var ch = line.charAt(pos); if (re.test(ch) && (style === undefined || cm.getTokenTypeAt(Pos(lineNo, pos + 1)) == style)) { var match = matching[ch]; if ((match.charAt(1) == ">") == (dir > 0)) stack.push(ch); else if (!stack.length) return {pos: Pos(lineNo, pos), ch: ch}; else stack.pop(); } } } return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null; } function matchBrackets(cm, autoclear, config) { // Disable brace matching in long lines, since it'll cause hugely slow updates var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000; var marks = [], ranges = cm.listSelections(); for (var i = 0; i < ranges.length; i++) { var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, false, config); if (match && cm.getLine(match.from.line).length <= maxHighlightLen) { var style = match.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket"; marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), {className: style})); if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen) marks.push(cm.markText(match.to, Pos(match.to.line, match.to.ch + 1), {className: style})); } } if (marks.length) { // Kludge to work around the IE bug from issue #1193, where text // input stops going to the textare whever this fires. if (ie_lt8 && cm.state.focused) cm.focus(); var clear = function() { cm.operation(function() { for (var i = 0; i < marks.length; i++) marks[i].clear(); }); }; if (autoclear) setTimeout(clear, 800); else return clear; } } var currentlyHighlighted = null; function doMatchBrackets(cm) { cm.operation(function() { if (currentlyHighlighted) {currentlyHighlighted(); currentlyHighlighted = null;} currentlyHighlighted = matchBrackets(cm, false, cm.state.matchBrackets); }); } CodeMirror.defineOption("matchBrackets", false, function(cm, val, old) { if (old && old != CodeMirror.Init) cm.off("cursorActivity", doMatchBrackets); if (val) { cm.state.matchBrackets = typeof val == "object" ? val : {}; cm.on("cursorActivity", doMatchBrackets); } }); CodeMirror.defineExtension("matchBrackets", function() {matchBrackets(this, true);}); CodeMirror.defineExtension("findMatchingBracket", function(pos, strict, config){ return findMatchingBracket(this, pos, strict, config); }); CodeMirror.defineExtension("scanForBracket", function(pos, dir, style, config){ return scanForBracket(this, pos, dir, style, config); }); }); ================================================ FILE: base/res/codemirror/addon/edit/matchtags.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../fold/xml-fold")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../fold/xml-fold"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineOption("matchTags", false, function(cm, val, old) { if (old && old != CodeMirror.Init) { cm.off("cursorActivity", doMatchTags); cm.off("viewportChange", maybeUpdateMatch); clear(cm); } if (val) { cm.state.matchBothTags = typeof val == "object" && val.bothTags; cm.on("cursorActivity", doMatchTags); cm.on("viewportChange", maybeUpdateMatch); doMatchTags(cm); } }); function clear(cm) { if (cm.state.tagHit) cm.state.tagHit.clear(); if (cm.state.tagOther) cm.state.tagOther.clear(); cm.state.tagHit = cm.state.tagOther = null; } function doMatchTags(cm) { cm.state.failedTagMatch = false; cm.operation(function() { clear(cm); if (cm.somethingSelected()) return; var cur = cm.getCursor(), range = cm.getViewport(); range.from = Math.min(range.from, cur.line); range.to = Math.max(cur.line + 1, range.to); var match = CodeMirror.findMatchingTag(cm, cur, range); if (!match) return; if (cm.state.matchBothTags) { var hit = match.at == "open" ? match.open : match.close; if (hit) cm.state.tagHit = cm.markText(hit.from, hit.to, {className: "CodeMirror-matchingtag"}); } var other = match.at == "close" ? match.open : match.close; if (other) cm.state.tagOther = cm.markText(other.from, other.to, {className: "CodeMirror-matchingtag"}); else cm.state.failedTagMatch = true; }); } function maybeUpdateMatch(cm) { if (cm.state.failedTagMatch) doMatchTags(cm); } CodeMirror.commands.toMatchingTag = function(cm) { var found = CodeMirror.findMatchingTag(cm, cm.getCursor()); if (found) { var other = found.at == "close" ? found.open : found.close; if (other) cm.extendSelection(other.to, other.from); } }; }); ================================================ FILE: base/res/codemirror/addon/edit/trailingspace.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { CodeMirror.defineOption("showTrailingSpace", false, function(cm, val, prev) { if (prev == CodeMirror.Init) prev = false; if (prev && !val) cm.removeOverlay("trailingspace"); else if (!prev && val) cm.addOverlay({ token: function(stream) { for (var l = stream.string.length, i = l; i && /\s/.test(stream.string.charAt(i - 1)); --i) {} if (i > stream.pos) { stream.pos = i; return null; } stream.pos = l; return "trailingspace"; }, name: "trailingspace" }); }); }); ================================================ FILE: base/res/codemirror/addon/fold/brace-fold.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.registerHelper("fold", "brace", function(cm, start) { var line = start.line, lineText = cm.getLine(line); var startCh, tokenType; function findOpening(openCh) { for (var at = start.ch, pass = 0;;) { var found = at <= 0 ? -1 : lineText.lastIndexOf(openCh, at - 1); if (found == -1) { if (pass == 1) break; pass = 1; at = lineText.length; continue; } if (pass == 1 && found < start.ch) break; tokenType = cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1)); if (!/^(comment|string)/.test(tokenType)) return found + 1; at = found - 1; } } var startToken = "{", endToken = "}", startCh = findOpening("{"); if (startCh == null) { startToken = "[", endToken = "]"; startCh = findOpening("["); } if (startCh == null) return; var count = 1, lastLine = cm.lastLine(), end, endCh; outer: for (var i = line; i <= lastLine; ++i) { var text = cm.getLine(i), pos = i == line ? startCh : 0; for (;;) { var nextOpen = text.indexOf(startToken, pos), nextClose = text.indexOf(endToken, pos); if (nextOpen < 0) nextOpen = text.length; if (nextClose < 0) nextClose = text.length; pos = Math.min(nextOpen, nextClose); if (pos == text.length) break; if (cm.getTokenTypeAt(CodeMirror.Pos(i, pos + 1)) == tokenType) { if (pos == nextOpen) ++count; else if (!--count) { end = i; endCh = pos; break outer; } } ++pos; } } if (end == null || line == end && endCh == startCh) return; return {from: CodeMirror.Pos(line, startCh), to: CodeMirror.Pos(end, endCh)}; }); CodeMirror.registerHelper("fold", "import", function(cm, start) { function hasImport(line) { if (line < cm.firstLine() || line > cm.lastLine()) return null; var start = cm.getTokenAt(CodeMirror.Pos(line, 1)); if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1)); if (start.type != "keyword" || start.string != "import") return null; // Now find closing semicolon, return its position for (var i = line, e = Math.min(cm.lastLine(), line + 10); i <= e; ++i) { var text = cm.getLine(i), semi = text.indexOf(";"); if (semi != -1) return {startCh: start.end, end: CodeMirror.Pos(i, semi)}; } } var start = start.line, has = hasImport(start), prev; if (!has || hasImport(start - 1) || ((prev = hasImport(start - 2)) && prev.end.line == start - 1)) return null; for (var end = has.end;;) { var next = hasImport(end.line + 1); if (next == null) break; end = next.end; } return {from: cm.clipPos(CodeMirror.Pos(start, has.startCh + 1)), to: end}; }); CodeMirror.registerHelper("fold", "include", function(cm, start) { function hasInclude(line) { if (line < cm.firstLine() || line > cm.lastLine()) return null; var start = cm.getTokenAt(CodeMirror.Pos(line, 1)); if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1)); if (start.type == "meta" && start.string.slice(0, 8) == "#include") return start.start + 8; } var start = start.line, has = hasInclude(start); if (has == null || hasInclude(start - 1) != null) return null; for (var end = start;;) { var next = hasInclude(end + 1); if (next == null) break; ++end; } return {from: CodeMirror.Pos(start, has + 1), to: cm.clipPos(CodeMirror.Pos(end))}; }); }); ================================================ FILE: base/res/codemirror/addon/fold/comment-fold.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.registerGlobalHelper("fold", "comment", function(mode) { return mode.blockCommentStart && mode.blockCommentEnd; }, function(cm, start) { var mode = cm.getModeAt(start), startToken = mode.blockCommentStart, endToken = mode.blockCommentEnd; if (!startToken || !endToken) return; var line = start.line, lineText = cm.getLine(line); var startCh; for (var at = start.ch, pass = 0;;) { var found = at <= 0 ? -1 : lineText.lastIndexOf(startToken, at - 1); if (found == -1) { if (pass == 1) return; pass = 1; at = lineText.length; continue; } if (pass == 1 && found < start.ch) return; if (/comment/.test(cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1)))) { startCh = found + startToken.length; break; } at = found - 1; } var depth = 1, lastLine = cm.lastLine(), end, endCh; outer: for (var i = line; i <= lastLine; ++i) { var text = cm.getLine(i), pos = i == line ? startCh : 0; for (;;) { var nextOpen = text.indexOf(startToken, pos), nextClose = text.indexOf(endToken, pos); if (nextOpen < 0) nextOpen = text.length; if (nextClose < 0) nextClose = text.length; pos = Math.min(nextOpen, nextClose); if (pos == text.length) break; if (pos == nextOpen) ++depth; else if (!--depth) { end = i; endCh = pos; break outer; } ++pos; } } if (end == null || line == end && endCh == startCh) return; return {from: CodeMirror.Pos(line, startCh), to: CodeMirror.Pos(end, endCh)}; }); }); ================================================ FILE: base/res/codemirror/addon/fold/foldcode.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; function doFold(cm, pos, options, force) { if (options && options.call) { var finder = options; options = null; } else { var finder = getOption(cm, options, "rangeFinder"); } if (typeof pos == "number") pos = CodeMirror.Pos(pos, 0); var minSize = getOption(cm, options, "minFoldSize"); function getRange(allowFolded) { var range = finder(cm, pos); if (!range || range.to.line - range.from.line < minSize) return null; var marks = cm.findMarksAt(range.from); for (var i = 0; i < marks.length; ++i) { if (marks[i].__isFold && force !== "fold") { if (!allowFolded) return null; range.cleared = true; marks[i].clear(); } } return range; } var range = getRange(true); if (getOption(cm, options, "scanUp")) while (!range && pos.line > cm.firstLine()) { pos = CodeMirror.Pos(pos.line - 1, 0); range = getRange(false); } if (!range || range.cleared || force === "unfold") return; var myWidget = makeWidget(cm, options); CodeMirror.on(myWidget, "mousedown", function(e) { myRange.clear(); CodeMirror.e_preventDefault(e); }); var myRange = cm.markText(range.from, range.to, { replacedWith: myWidget, clearOnEnter: true, __isFold: true }); myRange.on("clear", function(from, to) { CodeMirror.signal(cm, "unfold", cm, from, to); }); CodeMirror.signal(cm, "fold", cm, range.from, range.to); } function makeWidget(cm, options) { var widget = getOption(cm, options, "widget"); if (typeof widget == "string") { var text = document.createTextNode("++++++"); widget = document.createElement("span"); widget.appendChild(text); widget.className = "CodeMirror-foldmarker"; } return widget; } // Clumsy backwards-compatible interface CodeMirror.newFoldFunction = function(rangeFinder, widget) { return function(cm, pos) { doFold(cm, pos, {rangeFinder: rangeFinder, widget: widget}); }; }; // New-style interface CodeMirror.defineExtension("foldCode", function(pos, options, force) { doFold(this, pos, options, force); }); CodeMirror.defineExtension("isFolded", function(pos) { var marks = this.findMarksAt(pos); for (var i = 0; i < marks.length; ++i) if (marks[i].__isFold) return true; }); CodeMirror.commands.toggleFold = function(cm) { cm.foldCode(cm.getCursor()); }; CodeMirror.commands.fold = function(cm) { cm.foldCode(cm.getCursor(), null, "fold"); }; CodeMirror.commands.unfold = function(cm) { cm.foldCode(cm.getCursor(), null, "unfold"); }; CodeMirror.commands.foldAll = function(cm) { cm.operation(function() { for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++) cm.foldCode(CodeMirror.Pos(i, 0), null, "fold"); }); }; CodeMirror.commands.unfoldAll = function(cm) { cm.operation(function() { for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++) cm.foldCode(CodeMirror.Pos(i, 0), null, "unfold"); }); }; CodeMirror.registerHelper("fold", "combine", function() { var funcs = Array.prototype.slice.call(arguments, 0); return function(cm, start) { for (var i = 0; i < funcs.length; ++i) { var found = funcs[i](cm, start); if (found) return found; } }; }); CodeMirror.registerHelper("fold", "auto", function(cm, start) { var helpers = cm.getHelpers(start, "fold"); for (var i = 0; i < helpers.length; i++) { var cur = helpers[i](cm, start); if (cur) return cur; } }); var defaultOptions = { rangeFinder: CodeMirror.fold.auto, widget: "\u2194", minFoldSize: 0, scanUp: false }; CodeMirror.defineOption("foldOptions", null); function getOption(cm, options, name) { if (options && options[name] !== undefined) return options[name]; var editorOptions = cm.options.foldOptions; if (editorOptions && editorOptions[name] !== undefined) return editorOptions[name]; return defaultOptions[name]; } CodeMirror.defineExtension("foldOption", function(options, name) { return getOption(this, options, name); }); }); ================================================ FILE: base/res/codemirror/addon/fold/foldgutter.css ================================================ .CodeMirror-foldmarker { color: red; text-shadow: #b9f 1px 1px 2px, #b9f -1px -1px 2px, #b9f 1px -1px 2px, #b9f -1px 1px 2px; font-family: arial; line-height: .3; cursor: pointer; } .CodeMirror-foldgutter { width: 2em; text-align: center; } .CodeMirror-foldgutter-open, .CodeMirror-foldgutter-folded { cursor: pointer; } .CodeMirror-foldgutter-open:after { content: "\25BE"; } .CodeMirror-foldgutter-folded:after { content: "\25B8"; } ================================================ FILE: base/res/codemirror/addon/fold/foldgutter.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("./foldcode")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "./foldcode"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineOption("foldGutter", false, function(cm, val, old) { if (old && old != CodeMirror.Init) { cm.clearGutter(cm.state.foldGutter.options.gutter); cm.state.foldGutter = null; cm.off("gutterClick", onGutterClick); cm.off("change", onChange); cm.off("viewportChange", onViewportChange); cm.off("fold", onFold); cm.off("unfold", onFold); cm.off("swapDoc", updateInViewport); } if (val) { cm.state.foldGutter = new State(parseOptions(val)); updateInViewport(cm); cm.on("gutterClick", onGutterClick); cm.on("change", onChange); cm.on("viewportChange", onViewportChange); cm.on("fold", onFold); cm.on("unfold", onFold); cm.on("swapDoc", updateInViewport); } }); var Pos = CodeMirror.Pos; function State(options) { this.options = options; this.from = this.to = 0; } function parseOptions(opts) { if (opts === true) opts = {}; if (opts.gutter == null) opts.gutter = "CodeMirror-foldgutter"; if (opts.indicatorOpen == null) opts.indicatorOpen = "CodeMirror-foldgutter-open"; if (opts.indicatorFolded == null) opts.indicatorFolded = "CodeMirror-foldgutter-folded"; return opts; } function isFolded(cm, line) { var marks = cm.findMarksAt(Pos(line)); for (var i = 0; i < marks.length; ++i) if (marks[i].__isFold && marks[i].find().from.line == line) return marks[i]; } function marker(spec) { if (typeof spec == "string") { var elt = document.createElement("div"); elt.className = spec + " CodeMirror-guttermarker-subtle"; return elt; } else { return spec.cloneNode(true); } } function updateFoldInfo(cm, from, to) { var opts = cm.state.foldGutter.options, cur = from; var minSize = cm.foldOption(opts, "minFoldSize"); var func = cm.foldOption(opts, "rangeFinder"); cm.eachLine(from, to, function(line) { var mark = null; if (isFolded(cm, cur)) { mark = marker(opts.indicatorFolded); } else { var pos = Pos(cur, 0); var range = func && func(cm, pos); if (range && range.to.line - range.from.line >= minSize) mark = marker(opts.indicatorOpen); } cm.setGutterMarker(line, opts.gutter, mark); ++cur; }); } function updateInViewport(cm) { var vp = cm.getViewport(), state = cm.state.foldGutter; if (!state) return; cm.operation(function() { updateFoldInfo(cm, vp.from, vp.to); }); state.from = vp.from; state.to = vp.to; } function onGutterClick(cm, line, gutter) { var state = cm.state.foldGutter; if (!state) return; var opts = state.options; if (gutter != opts.gutter) return; var folded = isFolded(cm, line); if (folded) folded.clear(); else cm.foldCode(Pos(line, 0), opts.rangeFinder); } function onChange(cm) { var state = cm.state.foldGutter; if (!state) return; var opts = state.options; state.from = state.to = 0; clearTimeout(state.changeUpdate); state.changeUpdate = setTimeout(function() { updateInViewport(cm); }, opts.foldOnChangeTimeSpan || 600); } function onViewportChange(cm) { var state = cm.state.foldGutter; if (!state) return; var opts = state.options; clearTimeout(state.changeUpdate); state.changeUpdate = setTimeout(function() { var vp = cm.getViewport(); if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) { updateInViewport(cm); } else { cm.operation(function() { if (vp.from < state.from) { updateFoldInfo(cm, vp.from, state.from); state.from = vp.from; } if (vp.to > state.to) { updateFoldInfo(cm, state.to, vp.to); state.to = vp.to; } }); } }, opts.updateViewportTimeSpan || 400); } function onFold(cm, from) { var state = cm.state.foldGutter; if (!state) return; var line = from.line; if (line >= state.from && line < state.to) updateFoldInfo(cm, line, line + 1); } }); ================================================ FILE: base/res/codemirror/addon/fold/indent-fold.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.registerHelper("fold", "indent", function(cm, start) { var tabSize = cm.getOption("tabSize"), firstLine = cm.getLine(start.line); if (!/\S/.test(firstLine)) return; var getIndent = function(line) { return CodeMirror.countColumn(line, null, tabSize); }; var myIndent = getIndent(firstLine); var lastLineInFold = null; // Go through lines until we find a line that definitely doesn't belong in // the block we're folding, or to the end. for (var i = start.line + 1, end = cm.lastLine(); i <= end; ++i) { var curLine = cm.getLine(i); var curIndent = getIndent(curLine); if (curIndent > myIndent) { // Lines with a greater indent are considered part of the block. lastLineInFold = i; } else if (!/\S/.test(curLine)) { // Empty lines might be breaks within the block we're trying to fold. } else { // A non-empty line at an indent equal to or less than ours marks the // start of another block. break; } } if (lastLineInFold) return { from: CodeMirror.Pos(start.line, firstLine.length), to: CodeMirror.Pos(lastLineInFold, cm.getLine(lastLineInFold).length) }; }); }); ================================================ FILE: base/res/codemirror/addon/fold/markdown-fold.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.registerHelper("fold", "markdown", function(cm, start) { var maxDepth = 100; function isHeader(lineNo) { var tokentype = cm.getTokenTypeAt(CodeMirror.Pos(lineNo, 0)); return tokentype && /\bheader\b/.test(tokentype); } function headerLevel(lineNo, line, nextLine) { var match = line && line.match(/^#+/); if (match && isHeader(lineNo)) return match[0].length; match = nextLine && nextLine.match(/^[=\-]+\s*$/); if (match && isHeader(lineNo + 1)) return nextLine[0] == "=" ? 1 : 2; return maxDepth; } var firstLine = cm.getLine(start.line), nextLine = cm.getLine(start.line + 1); var level = headerLevel(start.line, firstLine, nextLine); if (level === maxDepth) return undefined; var lastLineNo = cm.lastLine(); var end = start.line, nextNextLine = cm.getLine(end + 2); while (end < lastLineNo) { if (headerLevel(end + 1, nextLine, nextNextLine) <= level) break; ++end; nextLine = nextNextLine; nextNextLine = cm.getLine(end + 2); } return { from: CodeMirror.Pos(start.line, firstLine.length), to: CodeMirror.Pos(end, cm.getLine(end).length) }; }); }); ================================================ FILE: base/res/codemirror/addon/fold/xml-fold.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var Pos = CodeMirror.Pos; function cmp(a, b) { return a.line - b.line || a.ch - b.ch; } var nameStartChar = "A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD"; var nameChar = nameStartChar + "\-\:\.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040"; var xmlTagStart = new RegExp("<(/?)([" + nameStartChar + "][" + nameChar + "]*)", "g"); function Iter(cm, line, ch, range) { this.line = line; this.ch = ch; this.cm = cm; this.text = cm.getLine(line); this.min = range ? range.from : cm.firstLine(); this.max = range ? range.to - 1 : cm.lastLine(); } function tagAt(iter, ch) { var type = iter.cm.getTokenTypeAt(Pos(iter.line, ch)); return type && /\btag\b/.test(type); } function nextLine(iter) { if (iter.line >= iter.max) return; iter.ch = 0; iter.text = iter.cm.getLine(++iter.line); return true; } function prevLine(iter) { if (iter.line <= iter.min) return; iter.text = iter.cm.getLine(--iter.line); iter.ch = iter.text.length; return true; } function toTagEnd(iter) { for (;;) { var gt = iter.text.indexOf(">", iter.ch); if (gt == -1) { if (nextLine(iter)) continue; else return; } if (!tagAt(iter, gt + 1)) { iter.ch = gt + 1; continue; } var lastSlash = iter.text.lastIndexOf("/", gt); var selfClose = lastSlash > -1 && !/\S/.test(iter.text.slice(lastSlash + 1, gt)); iter.ch = gt + 1; return selfClose ? "selfClose" : "regular"; } } function toTagStart(iter) { for (;;) { var lt = iter.ch ? iter.text.lastIndexOf("<", iter.ch - 1) : -1; if (lt == -1) { if (prevLine(iter)) continue; else return; } if (!tagAt(iter, lt + 1)) { iter.ch = lt; continue; } xmlTagStart.lastIndex = lt; iter.ch = lt; var match = xmlTagStart.exec(iter.text); if (match && match.index == lt) return match; } } function toNextTag(iter) { for (;;) { xmlTagStart.lastIndex = iter.ch; var found = xmlTagStart.exec(iter.text); if (!found) { if (nextLine(iter)) continue; else return; } if (!tagAt(iter, found.index + 1)) { iter.ch = found.index + 1; continue; } iter.ch = found.index + found[0].length; return found; } } function toPrevTag(iter) { for (;;) { var gt = iter.ch ? iter.text.lastIndexOf(">", iter.ch - 1) : -1; if (gt == -1) { if (prevLine(iter)) continue; else return; } if (!tagAt(iter, gt + 1)) { iter.ch = gt; continue; } var lastSlash = iter.text.lastIndexOf("/", gt); var selfClose = lastSlash > -1 && !/\S/.test(iter.text.slice(lastSlash + 1, gt)); iter.ch = gt + 1; return selfClose ? "selfClose" : "regular"; } } function findMatchingClose(iter, tag) { var stack = []; for (;;) { var next = toNextTag(iter), end, startLine = iter.line, startCh = iter.ch - (next ? next[0].length : 0); if (!next || !(end = toTagEnd(iter))) return; if (end == "selfClose") continue; if (next[1]) { // closing tag for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == next[2]) { stack.length = i; break; } if (i < 0 && (!tag || tag == next[2])) return { tag: next[2], from: Pos(startLine, startCh), to: Pos(iter.line, iter.ch) }; } else { // opening tag stack.push(next[2]); } } } function findMatchingOpen(iter, tag) { var stack = []; for (;;) { var prev = toPrevTag(iter); if (!prev) return; if (prev == "selfClose") { toTagStart(iter); continue; } var endLine = iter.line, endCh = iter.ch; var start = toTagStart(iter); if (!start) return; if (start[1]) { // closing tag stack.push(start[2]); } else { // opening tag for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == start[2]) { stack.length = i; break; } if (i < 0 && (!tag || tag == start[2])) return { tag: start[2], from: Pos(iter.line, iter.ch), to: Pos(endLine, endCh) }; } } } CodeMirror.registerHelper("fold", "xml", function(cm, start) { var iter = new Iter(cm, start.line, 0); for (;;) { var openTag = toNextTag(iter), end; if (!openTag || iter.line != start.line || !(end = toTagEnd(iter))) return; if (!openTag[1] && end != "selfClose") { var start = Pos(iter.line, iter.ch); var close = findMatchingClose(iter, openTag[2]); return close && {from: start, to: close.from}; } } }); CodeMirror.findMatchingTag = function(cm, pos, range) { var iter = new Iter(cm, pos.line, pos.ch, range); if (iter.text.indexOf(">") == -1 && iter.text.indexOf("<") == -1) return; var end = toTagEnd(iter), to = end && Pos(iter.line, iter.ch); var start = end && toTagStart(iter); if (!end || !start || cmp(iter, pos) > 0) return; var here = {from: Pos(iter.line, iter.ch), to: to, tag: start[2]}; if (end == "selfClose") return {open: here, close: null, at: "open"}; if (start[1]) { // closing tag return {open: findMatchingOpen(iter, start[2]), close: here, at: "close"}; } else { // opening tag iter = new Iter(cm, to.line, to.ch, range); return {open: here, close: findMatchingClose(iter, start[2]), at: "open"}; } }; CodeMirror.findEnclosingTag = function(cm, pos, range) { var iter = new Iter(cm, pos.line, pos.ch, range); for (;;) { var open = findMatchingOpen(iter); if (!open) break; var forward = new Iter(cm, pos.line, pos.ch, range); var close = findMatchingClose(forward, open.tag); if (close) return {open: open, close: close}; } }; // Used by addon/edit/closetag.js CodeMirror.scanForClosingTag = function(cm, pos, name, end) { var iter = new Iter(cm, pos.line, pos.ch, end ? {from: 0, to: end} : null); return findMatchingClose(iter, name); }; }); ================================================ FILE: base/res/codemirror/addon/hint/anyword-hint.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var WORD = /[\w$]+/, RANGE = 500; CodeMirror.registerHelper("hint", "anyword", function(editor, options) { var word = options && options.word || WORD; var range = options && options.range || RANGE; var cur = editor.getCursor(), curLine = editor.getLine(cur.line); var end = cur.ch, start = end; while (start && word.test(curLine.charAt(start - 1))) --start; var curWord = start != end && curLine.slice(start, end); var list = [], seen = {}; var re = new RegExp(word.source, "g"); for (var dir = -1; dir <= 1; dir += 2) { var line = cur.line, endLine = Math.min(Math.max(line + dir * range, editor.firstLine()), editor.lastLine()) + dir; for (; line != endLine; line += dir) { var text = editor.getLine(line), m; while (m = re.exec(text)) { if (line == cur.line && m[0] === curWord) continue; if ((!curWord || m[0].lastIndexOf(curWord, 0) == 0) && !Object.prototype.hasOwnProperty.call(seen, m[0])) { seen[m[0]] = true; list.push(m[0]); } } } } return {list: list, from: CodeMirror.Pos(cur.line, start), to: CodeMirror.Pos(cur.line, end)}; }); }); ================================================ FILE: base/res/codemirror/addon/hint/css-hint.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../../mode/css/css")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../../mode/css/css"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var pseudoClasses = {link: 1, visited: 1, active: 1, hover: 1, focus: 1, "first-letter": 1, "first-line": 1, "first-child": 1, before: 1, after: 1, lang: 1}; CodeMirror.registerHelper("hint", "css", function(cm) { var cur = cm.getCursor(), token = cm.getTokenAt(cur); var inner = CodeMirror.innerMode(cm.getMode(), token.state); if (inner.mode.name != "css") return; if (token.type == "keyword" && "!important".indexOf(token.string) == 0) return {list: ["!important"], from: CodeMirror.Pos(cur.line, token.start), to: CodeMirror.Pos(cur.line, token.end)}; var start = token.start, end = cur.ch, word = token.string.slice(0, end - start); if (/[^\w$_-]/.test(word)) { word = ""; start = end = cur.ch; } var spec = CodeMirror.resolveMode("text/css"); var result = []; function add(keywords) { for (var name in keywords) if (!word || name.lastIndexOf(word, 0) == 0) result.push(name); } var st = inner.state.state; if (st == "pseudo" || token.type == "variable-3") { add(pseudoClasses); } else if (st == "block" || st == "maybeprop") { add(spec.propertyKeywords); } else if (st == "prop" || st == "parens" || st == "at" || st == "params") { add(spec.valueKeywords); add(spec.colorKeywords); } else if (st == "media" || st == "media_parens") { add(spec.mediaTypes); add(spec.mediaFeatures); } if (result.length) return { list: result, from: CodeMirror.Pos(cur.line, start), to: CodeMirror.Pos(cur.line, end) }; }); }); ================================================ FILE: base/res/codemirror/addon/hint/html-hint.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("./xml-hint")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "./xml-hint"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var langs = "ab aa af ak sq am ar an hy as av ae ay az bm ba eu be bn bh bi bs br bg my ca ch ce ny zh cv kw co cr hr cs da dv nl dz en eo et ee fo fj fi fr ff gl ka de el gn gu ht ha he hz hi ho hu ia id ie ga ig ik io is it iu ja jv kl kn kr ks kk km ki rw ky kv kg ko ku kj la lb lg li ln lo lt lu lv gv mk mg ms ml mt mi mr mh mn na nv nb nd ne ng nn no ii nr oc oj cu om or os pa pi fa pl ps pt qu rm rn ro ru sa sc sd se sm sg sr gd sn si sk sl so st es su sw ss sv ta te tg th ti bo tk tl tn to tr ts tt tw ty ug uk ur uz ve vi vo wa cy wo fy xh yi yo za zu".split(" "); var targets = ["_blank", "_self", "_top", "_parent"]; var charsets = ["ascii", "utf-8", "utf-16", "latin1", "latin1"]; var methods = ["get", "post", "put", "delete"]; var encs = ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"]; var media = ["all", "screen", "print", "embossed", "braille", "handheld", "print", "projection", "screen", "tty", "tv", "speech", "3d-glasses", "resolution [>][<][=] [X]", "device-aspect-ratio: X/Y", "orientation:portrait", "orientation:landscape", "device-height: [X]", "device-width: [X]"]; var s = { attrs: {} }; // Simple tag, reused for a whole lot of tags var data = { a: { attrs: { href: null, ping: null, type: null, media: media, target: targets, hreflang: langs } }, abbr: s, acronym: s, address: s, applet: s, area: { attrs: { alt: null, coords: null, href: null, target: null, ping: null, media: media, hreflang: langs, type: null, shape: ["default", "rect", "circle", "poly"] } }, article: s, aside: s, audio: { attrs: { src: null, mediagroup: null, crossorigin: ["anonymous", "use-credentials"], preload: ["none", "metadata", "auto"], autoplay: ["", "autoplay"], loop: ["", "loop"], controls: ["", "controls"] } }, b: s, base: { attrs: { href: null, target: targets } }, basefont: s, bdi: s, bdo: s, big: s, blockquote: { attrs: { cite: null } }, body: s, br: s, button: { attrs: { form: null, formaction: null, name: null, value: null, autofocus: ["", "autofocus"], disabled: ["", "autofocus"], formenctype: encs, formmethod: methods, formnovalidate: ["", "novalidate"], formtarget: targets, type: ["submit", "reset", "button"] } }, canvas: { attrs: { width: null, height: null } }, caption: s, center: s, cite: s, code: s, col: { attrs: { span: null } }, colgroup: { attrs: { span: null } }, command: { attrs: { type: ["command", "checkbox", "radio"], label: null, icon: null, radiogroup: null, command: null, title: null, disabled: ["", "disabled"], checked: ["", "checked"] } }, data: { attrs: { value: null } }, datagrid: { attrs: { disabled: ["", "disabled"], multiple: ["", "multiple"] } }, datalist: { attrs: { data: null } }, dd: s, del: { attrs: { cite: null, datetime: null } }, details: { attrs: { open: ["", "open"] } }, dfn: s, dir: s, div: s, dl: s, dt: s, em: s, embed: { attrs: { src: null, type: null, width: null, height: null } }, eventsource: { attrs: { src: null } }, fieldset: { attrs: { disabled: ["", "disabled"], form: null, name: null } }, figcaption: s, figure: s, font: s, footer: s, form: { attrs: { action: null, name: null, "accept-charset": charsets, autocomplete: ["on", "off"], enctype: encs, method: methods, novalidate: ["", "novalidate"], target: targets } }, frame: s, frameset: s, h1: s, h2: s, h3: s, h4: s, h5: s, h6: s, head: { attrs: {}, children: ["title", "base", "link", "style", "meta", "script", "noscript", "command"] }, header: s, hgroup: s, hr: s, html: { attrs: { manifest: null }, children: ["head", "body"] }, i: s, iframe: { attrs: { src: null, srcdoc: null, name: null, width: null, height: null, sandbox: ["allow-top-navigation", "allow-same-origin", "allow-forms", "allow-scripts"], seamless: ["", "seamless"] } }, img: { attrs: { alt: null, src: null, ismap: null, usemap: null, width: null, height: null, crossorigin: ["anonymous", "use-credentials"] } }, input: { attrs: { alt: null, dirname: null, form: null, formaction: null, height: null, list: null, max: null, maxlength: null, min: null, name: null, pattern: null, placeholder: null, size: null, src: null, step: null, value: null, width: null, accept: ["audio/*", "video/*", "image/*"], autocomplete: ["on", "off"], autofocus: ["", "autofocus"], checked: ["", "checked"], disabled: ["", "disabled"], formenctype: encs, formmethod: methods, formnovalidate: ["", "novalidate"], formtarget: targets, multiple: ["", "multiple"], readonly: ["", "readonly"], required: ["", "required"], type: ["hidden", "text", "search", "tel", "url", "email", "password", "datetime", "date", "month", "week", "time", "datetime-local", "number", "range", "color", "checkbox", "radio", "file", "submit", "image", "reset", "button"] } }, ins: { attrs: { cite: null, datetime: null } }, kbd: s, keygen: { attrs: { challenge: null, form: null, name: null, autofocus: ["", "autofocus"], disabled: ["", "disabled"], keytype: ["RSA"] } }, label: { attrs: { "for": null, form: null } }, legend: s, li: { attrs: { value: null } }, link: { attrs: { href: null, type: null, hreflang: langs, media: media, sizes: ["all", "16x16", "16x16 32x32", "16x16 32x32 64x64"] } }, map: { attrs: { name: null } }, mark: s, menu: { attrs: { label: null, type: ["list", "context", "toolbar"] } }, meta: { attrs: { content: null, charset: charsets, name: ["viewport", "application-name", "author", "description", "generator", "keywords"], "http-equiv": ["content-language", "content-type", "default-style", "refresh"] } }, meter: { attrs: { value: null, min: null, low: null, high: null, max: null, optimum: null } }, nav: s, noframes: s, noscript: s, object: { attrs: { data: null, type: null, name: null, usemap: null, form: null, width: null, height: null, typemustmatch: ["", "typemustmatch"] } }, ol: { attrs: { reversed: ["", "reversed"], start: null, type: ["1", "a", "A", "i", "I"] } }, optgroup: { attrs: { disabled: ["", "disabled"], label: null } }, option: { attrs: { disabled: ["", "disabled"], label: null, selected: ["", "selected"], value: null } }, output: { attrs: { "for": null, form: null, name: null } }, p: s, param: { attrs: { name: null, value: null } }, pre: s, progress: { attrs: { value: null, max: null } }, q: { attrs: { cite: null } }, rp: s, rt: s, ruby: s, s: s, samp: s, script: { attrs: { type: ["text/javascript"], src: null, async: ["", "async"], defer: ["", "defer"], charset: charsets } }, section: s, select: { attrs: { form: null, name: null, size: null, autofocus: ["", "autofocus"], disabled: ["", "disabled"], multiple: ["", "multiple"] } }, small: s, source: { attrs: { src: null, type: null, media: null } }, span: s, strike: s, strong: s, style: { attrs: { type: ["text/css"], media: media, scoped: null } }, sub: s, summary: s, sup: s, table: s, tbody: s, td: { attrs: { colspan: null, rowspan: null, headers: null } }, textarea: { attrs: { dirname: null, form: null, maxlength: null, name: null, placeholder: null, rows: null, cols: null, autofocus: ["", "autofocus"], disabled: ["", "disabled"], readonly: ["", "readonly"], required: ["", "required"], wrap: ["soft", "hard"] } }, tfoot: s, th: { attrs: { colspan: null, rowspan: null, headers: null, scope: ["row", "col", "rowgroup", "colgroup"] } }, thead: s, time: { attrs: { datetime: null } }, title: s, tr: s, track: { attrs: { src: null, label: null, "default": null, kind: ["subtitles", "captions", "descriptions", "chapters", "metadata"], srclang: langs } }, tt: s, u: s, ul: s, "var": s, video: { attrs: { src: null, poster: null, width: null, height: null, crossorigin: ["anonymous", "use-credentials"], preload: ["auto", "metadata", "none"], autoplay: ["", "autoplay"], mediagroup: ["movie"], muted: ["", "muted"], controls: ["", "controls"] } }, wbr: s }; var globalAttrs = { accesskey: ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"], "class": null, contenteditable: ["true", "false"], contextmenu: null, dir: ["ltr", "rtl", "auto"], draggable: ["true", "false", "auto"], dropzone: ["copy", "move", "link", "string:", "file:"], hidden: ["hidden"], id: null, inert: ["inert"], itemid: null, itemprop: null, itemref: null, itemscope: ["itemscope"], itemtype: null, lang: ["en", "es"], spellcheck: ["true", "false"], style: null, tabindex: ["1", "2", "3", "4", "5", "6", "7", "8", "9"], title: null, translate: ["yes", "no"], onclick: null, rel: ["stylesheet", "alternate", "author", "bookmark", "help", "license", "next", "nofollow", "noreferrer", "prefetch", "prev", "search", "tag"] }; function populate(obj) { for (var attr in globalAttrs) if (globalAttrs.hasOwnProperty(attr)) obj.attrs[attr] = globalAttrs[attr]; } populate(s); for (var tag in data) if (data.hasOwnProperty(tag) && data[tag] != s) populate(data[tag]); CodeMirror.htmlSchema = data; function htmlHint(cm, options) { var local = {schemaInfo: data}; if (options) for (var opt in options) local[opt] = options[opt]; return CodeMirror.hint.xml(cm, local); } CodeMirror.registerHelper("hint", "html", htmlHint); }); ================================================ FILE: base/res/codemirror/addon/hint/javascript-hint.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { var Pos = CodeMirror.Pos; function forEach(arr, f) { for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]); } function arrayContains(arr, item) { if (!Array.prototype.indexOf) { var i = arr.length; while (i--) { if (arr[i] === item) { return true; } } return false; } return arr.indexOf(item) != -1; } function scriptHint(editor, keywords, getToken, options) { // Find the token at the cursor var cur = editor.getCursor(), token = getToken(editor, cur); if (/\b(?:string|comment)\b/.test(token.type)) return; token.state = CodeMirror.innerMode(editor.getMode(), token.state).state; // If it's not a 'word-style' token, ignore the token. if (!/^[\w$_]*$/.test(token.string)) { token = {start: cur.ch, end: cur.ch, string: "", state: token.state, type: token.string == "." ? "property" : null}; } else if (token.end > cur.ch) { token.end = cur.ch; token.string = token.string.slice(0, cur.ch - token.start); } var tprop = token; // If it is a property, find out what it is a property of. while (tprop.type == "property") { tprop = getToken(editor, Pos(cur.line, tprop.start)); if (tprop.string != ".") return; tprop = getToken(editor, Pos(cur.line, tprop.start)); if (!context) var context = []; context.push(tprop); } return {list: getCompletions(token, context, keywords, options), from: Pos(cur.line, token.start), to: Pos(cur.line, token.end)}; } function javascriptHint(editor, options) { return scriptHint(editor, javascriptKeywords, function (e, cur) {return e.getTokenAt(cur);}, options); }; CodeMirror.registerHelper("hint", "javascript", javascriptHint); function getCoffeeScriptToken(editor, cur) { // This getToken, it is for coffeescript, imitates the behavior of // getTokenAt method in javascript.js, that is, returning "property" // type and treat "." as indepenent token. var token = editor.getTokenAt(cur); if (cur.ch == token.start + 1 && token.string.charAt(0) == '.') { token.end = token.start; token.string = '.'; token.type = "property"; } else if (/^\.[\w$_]*$/.test(token.string)) { token.type = "property"; token.start++; token.string = token.string.replace(/\./, ''); } return token; } function coffeescriptHint(editor, options) { return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken, options); } CodeMirror.registerHelper("hint", "coffeescript", coffeescriptHint); var stringProps = ("charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight " + "toUpperCase toLowerCase split concat match replace search").split(" "); var arrayProps = ("length concat join splice push pop shift unshift slice reverse sort indexOf " + "lastIndexOf every some filter forEach map reduce reduceRight ").split(" "); var funcProps = "prototype apply call bind".split(" "); var javascriptKeywords = ("break case catch continue debugger default delete do else false finally for function " + "if in instanceof new null return switch throw true try typeof var void while with").split(" "); var coffeescriptKeywords = ("and break catch class continue delete do else extends false finally for " + "if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes").split(" "); function getCompletions(token, context, keywords, options) { var found = [], start = token.string, global = options && options.globalScope || window; function maybeAdd(str) { if (str.lastIndexOf(start, 0) == 0 && !arrayContains(found, str)) found.push(str); } function gatherCompletions(obj) { if (typeof obj == "string") forEach(stringProps, maybeAdd); else if (obj instanceof Array) forEach(arrayProps, maybeAdd); else if (obj instanceof Function) forEach(funcProps, maybeAdd); for (var name in obj) maybeAdd(name); } if (context && context.length) { // If this is a property, see if it belongs to some object we can // find in the current environment. var obj = context.pop(), base; if (obj.type && obj.type.indexOf("variable") === 0) { if (options && options.additionalContext) base = options.additionalContext[obj.string]; if (!options || options.useGlobalScope !== false) base = base || global[obj.string]; } else if (obj.type == "string") { base = ""; } else if (obj.type == "atom") { base = 1; } else if (obj.type == "function") { if (global.jQuery != null && (obj.string == '$' || obj.string == 'jQuery') && (typeof global.jQuery == 'function')) base = global.jQuery(); else if (global._ != null && (obj.string == '_') && (typeof global._ == 'function')) base = global._(); } while (base != null && context.length) base = base[context.pop().string]; if (base != null) gatherCompletions(base); } else { // If not, just look in the global object and any local scope // (reading into JS mode internals to get at the local and global variables) for (var v = token.state.localVars; v; v = v.next) maybeAdd(v.name); for (var v = token.state.globalVars; v; v = v.next) maybeAdd(v.name); if (!options || options.useGlobalScope !== false) gatherCompletions(global); forEach(keywords, maybeAdd); } return found; } }); ================================================ FILE: base/res/codemirror/addon/hint/show-hint.css ================================================ .CodeMirror-hints { position: absolute; z-index: 10; overflow: hidden; list-style: none; margin: 0; padding: 2px; -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2); -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2); box-shadow: 2px 3px 5px rgba(0,0,0,.2); border-radius: 3px; border: 1px solid silver; background: white; font-size: 90%; font-family: monospace; max-height: 20em; overflow-y: auto; } .CodeMirror-hint { margin: 0; padding: 0 4px; border-radius: 2px; max-width: 19em; overflow: hidden; white-space: pre; color: black; cursor: pointer; } li.CodeMirror-hint-active { background: #08f; color: white; } ================================================ FILE: base/res/codemirror/addon/hint/show-hint.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var HINT_ELEMENT_CLASS = "CodeMirror-hint"; var ACTIVE_HINT_ELEMENT_CLASS = "CodeMirror-hint-active"; // This is the old interface, kept around for now to stay // backwards-compatible. CodeMirror.showHint = function(cm, getHints, options) { if (!getHints) return cm.showHint(options); if (options && options.async) getHints.async = true; var newOpts = {hint: getHints}; if (options) for (var prop in options) newOpts[prop] = options[prop]; return cm.showHint(newOpts); }; CodeMirror.defineExtension("showHint", function(options) { // We want a single cursor position. if (this.listSelections().length > 1 || this.somethingSelected()) return; if (this.state.completionActive) this.state.completionActive.close(); var completion = this.state.completionActive = new Completion(this, options); if (!completion.options.hint) return; CodeMirror.signal(this, "startCompletion", this); completion.update(); }); function Completion(cm, options) { this.cm = cm; this.options = this.buildOptions(options); this.widget = null; this.debounce = 0; this.tick = 0; this.startPos = this.cm.getCursor(); this.startLen = this.cm.getLine(this.startPos.line).length; var self = this; cm.on("cursorActivity", this.activityFunc = function() { self.cursorActivity(); }); } var requestAnimationFrame = window.requestAnimationFrame || function(fn) { return setTimeout(fn, 1000/60); }; var cancelAnimationFrame = window.cancelAnimationFrame || clearTimeout; Completion.prototype = { close: function() { if (!this.active()) return; this.cm.state.completionActive = null; this.tick = null; this.cm.off("cursorActivity", this.activityFunc); if (this.widget) this.widget.close(); CodeMirror.signal(this.cm, "endCompletion", this.cm); }, active: function() { return this.cm.state.completionActive == this; }, pick: function(data, i) { var completion = data.list[i]; if (completion.hint) completion.hint(this.cm, data, completion); else this.cm.replaceRange(getText(completion), completion.from || data.from, completion.to || data.to, "complete"); CodeMirror.signal(data, "pick", completion); this.close(); }, showHints: function(data) { if (!data || !data.list.length || !this.active()) return this.close(); if (this.options.completeSingle && data.list.length == 1) this.pick(data, 0); else this.showWidget(data); }, cursorActivity: function() { if (this.debounce) { cancelAnimationFrame(this.debounce); this.debounce = 0; } var pos = this.cm.getCursor(), line = this.cm.getLine(pos.line); if (pos.line != this.startPos.line || line.length - pos.ch != this.startLen - this.startPos.ch || pos.ch < this.startPos.ch || this.cm.somethingSelected() || (pos.ch && this.options.closeCharacters.test(line.charAt(pos.ch - 1)))) { this.close(); } else { var self = this; this.debounce = requestAnimationFrame(function() {self.update();}); if (this.widget) this.widget.disable(); } }, update: function() { if (this.tick == null) return; if (this.data) CodeMirror.signal(this.data, "update"); if (!this.options.hint.async) { this.finishUpdate(this.options.hint(this.cm, this.options), myTick); } else { var myTick = ++this.tick, self = this; this.options.hint(this.cm, function(data) { if (self.tick == myTick) self.finishUpdate(data); }, this.options); } }, finishUpdate: function(data) { this.data = data; var picked = this.widget && this.widget.picked; if (this.widget) this.widget.close(); if (data && data.list.length) { if (picked && data.list.length == 1) this.pick(data, 0); else this.widget = new Widget(this, data); } }, showWidget: function(data) { this.data = data; this.widget = new Widget(this, data); CodeMirror.signal(data, "shown"); }, buildOptions: function(options) { var editor = this.cm.options.hintOptions; var out = {}; for (var prop in defaultOptions) out[prop] = defaultOptions[prop]; if (editor) for (var prop in editor) if (editor[prop] !== undefined) out[prop] = editor[prop]; if (options) for (var prop in options) if (options[prop] !== undefined) out[prop] = options[prop]; return out; } }; function getText(completion) { if (typeof completion == "string") return completion; else return completion.text; } function buildKeyMap(completion, handle) { var baseMap = { Up: function() {handle.moveFocus(-1);}, Down: function() {handle.moveFocus(1);}, PageUp: function() {handle.moveFocus(-handle.menuSize() + 1, true);}, PageDown: function() {handle.moveFocus(handle.menuSize() - 1, true);}, Home: function() {handle.setFocus(0);}, End: function() {handle.setFocus(handle.length - 1);}, Enter: handle.pick, Tab: handle.pick, Esc: handle.close }; var custom = completion.options.customKeys; var ourMap = custom ? {} : baseMap; function addBinding(key, val) { var bound; if (typeof val != "string") bound = function(cm) { return val(cm, handle); }; // This mechanism is deprecated else if (baseMap.hasOwnProperty(val)) bound = baseMap[val]; else bound = val; ourMap[key] = bound; } if (custom) for (var key in custom) if (custom.hasOwnProperty(key)) addBinding(key, custom[key]); var extra = completion.options.extraKeys; if (extra) for (var key in extra) if (extra.hasOwnProperty(key)) addBinding(key, extra[key]); return ourMap; } function getHintElement(hintsElement, el) { while (el && el != hintsElement) { if (el.nodeName.toUpperCase() === "LI" && el.parentNode == hintsElement) return el; el = el.parentNode; } } function Widget(completion, data) { this.completion = completion; this.data = data; this.picked = false; var widget = this, cm = completion.cm; var hints = this.hints = document.createElement("ul"); hints.className = "CodeMirror-hints"; this.selectedHint = data.selectedHint || 0; var completions = data.list; for (var i = 0; i < completions.length; ++i) { var elt = hints.appendChild(document.createElement("li")), cur = completions[i]; var className = HINT_ELEMENT_CLASS + (i != this.selectedHint ? "" : " " + ACTIVE_HINT_ELEMENT_CLASS); if (cur.className != null) className = cur.className + " " + className; elt.className = className; if (cur.render) cur.render(elt, data, cur); else elt.appendChild(document.createTextNode(cur.displayText || getText(cur))); elt.hintId = i; } var pos = cm.cursorCoords(completion.options.alignWithWord ? data.from : null); var left = pos.left, top = pos.bottom, below = true; hints.style.left = left + "px"; hints.style.top = top + "px"; // If we're at the edge of the screen, then we want the menu to appear on the left of the cursor. var winW = window.innerWidth || Math.max(document.body.offsetWidth, document.documentElement.offsetWidth); var winH = window.innerHeight || Math.max(document.body.offsetHeight, document.documentElement.offsetHeight); (completion.options.container || document.body).appendChild(hints); var box = hints.getBoundingClientRect(), overlapY = box.bottom - winH; if (overlapY > 0) { var height = box.bottom - box.top, curTop = pos.top - (pos.bottom - box.top); if (curTop - height > 0) { // Fits above cursor hints.style.top = (top = pos.top - height) + "px"; below = false; } else if (height > winH) { hints.style.height = (winH - 5) + "px"; hints.style.top = (top = pos.bottom - box.top) + "px"; var cursor = cm.getCursor(); if (data.from.ch != cursor.ch) { pos = cm.cursorCoords(cursor); hints.style.left = (left = pos.left) + "px"; box = hints.getBoundingClientRect(); } } } var overlapX = box.right - winW; if (overlapX > 0) { if (box.right - box.left > winW) { hints.style.width = (winW - 5) + "px"; overlapX -= (box.right - box.left) - winW; } hints.style.left = (left = pos.left - overlapX) + "px"; } cm.addKeyMap(this.keyMap = buildKeyMap(completion, { moveFocus: function(n, avoidWrap) { widget.changeActive(widget.selectedHint + n, avoidWrap); }, setFocus: function(n) { widget.changeActive(n); }, menuSize: function() { return widget.screenAmount(); }, length: completions.length, close: function() { completion.close(); }, pick: function() { widget.pick(); }, data: data })); if (completion.options.closeOnUnfocus) { var closingOnBlur; cm.on("blur", this.onBlur = function() { closingOnBlur = setTimeout(function() { completion.close(); }, 100); }); cm.on("focus", this.onFocus = function() { clearTimeout(closingOnBlur); }); } var startScroll = cm.getScrollInfo(); cm.on("scroll", this.onScroll = function() { var curScroll = cm.getScrollInfo(), editor = cm.getWrapperElement().getBoundingClientRect(); var newTop = top + startScroll.top - curScroll.top; var point = newTop - (window.pageYOffset || (document.documentElement || document.body).scrollTop); if (!below) point += hints.offsetHeight; if (point <= editor.top || point >= editor.bottom) return completion.close(); hints.style.top = newTop + "px"; hints.style.left = (left + startScroll.left - curScroll.left) + "px"; }); CodeMirror.on(hints, "dblclick", function(e) { var t = getHintElement(hints, e.target || e.srcElement); if (t && t.hintId != null) {widget.changeActive(t.hintId); widget.pick();} }); CodeMirror.on(hints, "click", function(e) { var t = getHintElement(hints, e.target || e.srcElement); if (t && t.hintId != null) { widget.changeActive(t.hintId); if (completion.options.completeOnSingleClick) widget.pick(); } }); CodeMirror.on(hints, "mousedown", function() { setTimeout(function(){cm.focus();}, 20); }); CodeMirror.signal(data, "select", completions[0], hints.firstChild); return true; } Widget.prototype = { close: function() { if (this.completion.widget != this) return; this.completion.widget = null; this.hints.parentNode.removeChild(this.hints); this.completion.cm.removeKeyMap(this.keyMap); var cm = this.completion.cm; if (this.completion.options.closeOnUnfocus) { cm.off("blur", this.onBlur); cm.off("focus", this.onFocus); } cm.off("scroll", this.onScroll); }, disable: function() { this.completion.cm.removeKeyMap(this.keyMap); var widget = this; this.keyMap = {Enter: function() { widget.picked = true; }}; this.completion.cm.addKeyMap(this.keyMap); }, pick: function() { this.completion.pick(this.data, this.selectedHint); }, changeActive: function(i, avoidWrap) { if (i >= this.data.list.length) i = avoidWrap ? this.data.list.length - 1 : 0; else if (i < 0) i = avoidWrap ? 0 : this.data.list.length - 1; if (this.selectedHint == i) return; var node = this.hints.childNodes[this.selectedHint]; node.className = node.className.replace(" " + ACTIVE_HINT_ELEMENT_CLASS, ""); node = this.hints.childNodes[this.selectedHint = i]; node.className += " " + ACTIVE_HINT_ELEMENT_CLASS; if (node.offsetTop < this.hints.scrollTop) this.hints.scrollTop = node.offsetTop - 3; else if (node.offsetTop + node.offsetHeight > this.hints.scrollTop + this.hints.clientHeight) this.hints.scrollTop = node.offsetTop + node.offsetHeight - this.hints.clientHeight + 3; CodeMirror.signal(this.data, "select", this.data.list[this.selectedHint], node); }, screenAmount: function() { return Math.floor(this.hints.clientHeight / this.hints.firstChild.offsetHeight) || 1; } }; CodeMirror.registerHelper("hint", "auto", function(cm, options) { var helpers = cm.getHelpers(cm.getCursor(), "hint"), words; if (helpers.length) { for (var i = 0; i < helpers.length; i++) { var cur = helpers[i](cm, options); if (cur && cur.list.length) return cur; } } else if (words = cm.getHelper(cm.getCursor(), "hintWords")) { if (words) return CodeMirror.hint.fromList(cm, {words: words}); } else if (CodeMirror.hint.anyword) { return CodeMirror.hint.anyword(cm, options); } }); CodeMirror.registerHelper("hint", "fromList", function(cm, options) { var cur = cm.getCursor(), token = cm.getTokenAt(cur); var found = []; for (var i = 0; i < options.words.length; i++) { var word = options.words[i]; if (word.slice(0, token.string.length) == token.string) found.push(word); } if (found.length) return { list: found, from: CodeMirror.Pos(cur.line, token.start), to: CodeMirror.Pos(cur.line, token.end) }; }); CodeMirror.commands.autocomplete = CodeMirror.showHint; var defaultOptions = { hint: CodeMirror.hint.auto, completeSingle: true, alignWithWord: true, closeCharacters: /[\s()\[\]{};:>,]/, closeOnUnfocus: true, completeOnSingleClick: false, container: null, customKeys: null, extraKeys: null }; CodeMirror.defineOption("hintOptions", null); }); ================================================ FILE: base/res/codemirror/addon/hint/sql-hint.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../../mode/sql/sql")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../../mode/sql/sql"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var tables; var defaultTable; var keywords; var CONS = { QUERY_DIV: ";", ALIAS_KEYWORD: "AS" }; var Pos = CodeMirror.Pos; function getKeywords(editor) { var mode = editor.doc.modeOption; if (mode === "sql") mode = "text/x-sql"; return CodeMirror.resolveMode(mode).keywords; } function getText(item) { return typeof item == "string" ? item : item.text; } function getItem(list, item) { if (!list.slice) return list[item]; for (var i = list.length - 1; i >= 0; i--) if (getText(list[i]) == item) return list[i]; } function shallowClone(object) { var result = {}; for (var key in object) if (object.hasOwnProperty(key)) result[key] = object[key]; return result; } function match(string, word) { var len = string.length; var sub = getText(word).substr(0, len); return string.toUpperCase() === sub.toUpperCase(); } function addMatches(result, search, wordlist, formatter) { for (var word in wordlist) { if (!wordlist.hasOwnProperty(word)) continue; if (wordlist.slice) word = wordlist[word]; if (match(search, word)) result.push(formatter(word)); } } function cleanName(name) { // Get rid name from backticks(`) and preceding dot(.) if (name.charAt(0) == ".") { name = name.substr(1); } return name.replace(/`/g, ""); } function insertBackticks(name) { var nameParts = getText(name).split("."); for (var i = 0; i < nameParts.length; i++) nameParts[i] = "`" + nameParts[i] + "`"; var escaped = nameParts.join("."); if (typeof name == "string") return escaped; name = shallowClone(name); name.text = escaped; return name; } function nameCompletion(cur, token, result, editor) { // Try to complete table, colunm names and return start position of completion var useBacktick = false; var nameParts = []; var start = token.start; var cont = true; while (cont) { cont = (token.string.charAt(0) == "."); useBacktick = useBacktick || (token.string.charAt(0) == "`"); start = token.start; nameParts.unshift(cleanName(token.string)); token = editor.getTokenAt(Pos(cur.line, token.start)); if (token.string == ".") { cont = true; token = editor.getTokenAt(Pos(cur.line, token.start)); } } // Try to complete table names var string = nameParts.join("."); addMatches(result, string, tables, function(w) { return useBacktick ? insertBackticks(w) : w; }); // Try to complete columns from defaultTable addMatches(result, string, defaultTable, function(w) { return useBacktick ? insertBackticks(w) : w; }); // Try to complete columns string = nameParts.pop(); var table = nameParts.join("."); // Check if table is available. If not, find table by Alias if (!getItem(tables, table)) table = findTableByAlias(table, editor); var columns = getItem(tables, table); if (columns && columns.columns) columns = columns.columns; if (columns) { addMatches(result, string, columns, function(w) { if (typeof w == "string") { w = table + "." + w; } else { w = shallowClone(w); w.text = table + "." + w.text; } return useBacktick ? insertBackticks(w) : w; }); } return start; } function eachWord(lineText, f) { if (!lineText) return; var excepted = /[,;]/g; var words = lineText.split(" "); for (var i = 0; i < words.length; i++) { f(words[i]?words[i].replace(excepted, '') : ''); } } function convertCurToNumber(cur) { // max characters of a line is 999,999. return cur.line + cur.ch / Math.pow(10, 6); } function convertNumberToCur(num) { return Pos(Math.floor(num), +num.toString().split('.').pop()); } function findTableByAlias(alias, editor) { var doc = editor.doc; var fullQuery = doc.getValue(); var aliasUpperCase = alias.toUpperCase(); var previousWord = ""; var table = ""; var separator = []; var validRange = { start: Pos(0, 0), end: Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).length) }; //add separator var indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV); while(indexOfSeparator != -1) { separator.push(doc.posFromIndex(indexOfSeparator)); indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV, indexOfSeparator+1); } separator.unshift(Pos(0, 0)); separator.push(Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).text.length)); //find valid range var prevItem = 0; var current = convertCurToNumber(editor.getCursor()); for (var i=0; i< separator.length; i++) { var _v = convertCurToNumber(separator[i]); if (current > prevItem && current <= _v) { validRange = { start: convertNumberToCur(prevItem), end: convertNumberToCur(_v) }; break; } prevItem = _v; } var query = doc.getRange(validRange.start, validRange.end, false); for (var i = 0; i < query.length; i++) { var lineText = query[i]; eachWord(lineText, function(word) { var wordUpperCase = word.toUpperCase(); if (wordUpperCase === aliasUpperCase && getItem(tables, previousWord)) table = previousWord; if (wordUpperCase !== CONS.ALIAS_KEYWORD) previousWord = word; }); if (table) break; } return table; } CodeMirror.registerHelper("hint", "sql", function(editor, options) { tables = (options && options.tables) || {}; var defaultTableName = options && options.defaultTable; defaultTable = defaultTableName && getItem(tables, defaultTableName); keywords = keywords || getKeywords(editor); if (defaultTableName && !defaultTable) defaultTable = findTableByAlias(defaultTableName, editor); defaultTable = defaultTable || []; if (defaultTable.columns) defaultTable = defaultTable.columns; var cur = editor.getCursor(); var result = []; var token = editor.getTokenAt(cur), start, end, search; if (token.end > cur.ch) { token.end = cur.ch; token.string = token.string.slice(0, cur.ch - token.start); } if (token.string.match(/^[.`\w@]\w*$/)) { search = token.string; start = token.start; end = token.end; } else { start = end = cur.ch; search = ""; } if (search.charAt(0) == "." || search.charAt(0) == "`") { start = nameCompletion(cur, token, result, editor); } else { addMatches(result, search, tables, function(w) {return w;}); addMatches(result, search, defaultTable, function(w) {return w;}); addMatches(result, search, keywords, function(w) {return w.toUpperCase();}); } return {list: result, from: Pos(cur.line, start), to: Pos(cur.line, end)}; }); }); ================================================ FILE: base/res/codemirror/addon/hint/xml-hint.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var Pos = CodeMirror.Pos; function getHints(cm, options) { var tags = options && options.schemaInfo; var quote = (options && options.quoteChar) || '"'; if (!tags) return; var cur = cm.getCursor(), token = cm.getTokenAt(cur); if (token.end > cur.ch) { token.end = cur.ch; token.string = token.string.slice(0, cur.ch - token.start); } var inner = CodeMirror.innerMode(cm.getMode(), token.state); if (inner.mode.name != "xml") return; var result = [], replaceToken = false, prefix; var tag = /\btag\b/.test(token.type) && !/>$/.test(token.string); var tagName = tag && /^\w/.test(token.string), tagStart; if (tagName) { var before = cm.getLine(cur.line).slice(Math.max(0, token.start - 2), token.start); var tagType = /<\/$/.test(before) ? "close" : /<$/.test(before) ? "open" : null; if (tagType) tagStart = token.start - (tagType == "close" ? 2 : 1); } else if (tag && token.string == "<") { tagType = "open"; } else if (tag && token.string == ""); } else { // Attribute completion var curTag = tags[inner.state.tagName], attrs = curTag && curTag.attrs; var globalAttrs = tags["!attrs"]; if (!attrs && !globalAttrs) return; if (!attrs) { attrs = globalAttrs; } else if (globalAttrs) { // Combine tag-local and global attributes var set = {}; for (var nm in globalAttrs) if (globalAttrs.hasOwnProperty(nm)) set[nm] = globalAttrs[nm]; for (var nm in attrs) if (attrs.hasOwnProperty(nm)) set[nm] = attrs[nm]; attrs = set; } if (token.type == "string" || token.string == "=") { // A value var before = cm.getRange(Pos(cur.line, Math.max(0, cur.ch - 60)), Pos(cur.line, token.type == "string" ? token.start : token.end)); var atName = before.match(/([^\s\u00a0=<>\"\']+)=$/), atValues; if (!atName || !attrs.hasOwnProperty(atName[1]) || !(atValues = attrs[atName[1]])) return; if (typeof atValues == 'function') atValues = atValues.call(this, cm); // Functions can be used to supply values for autocomplete widget if (token.type == "string") { prefix = token.string; var n = 0; if (/['"]/.test(token.string.charAt(0))) { quote = token.string.charAt(0); prefix = token.string.slice(1); n++; } var len = token.string.length; if (/['"]/.test(token.string.charAt(len - 1))) { quote = token.string.charAt(len - 1); prefix = token.string.substr(n, len - 2); } replaceToken = true; } for (var i = 0; i < atValues.length; ++i) if (!prefix || atValues[i].lastIndexOf(prefix, 0) == 0) result.push(quote + atValues[i] + quote); } else { // An attribute name if (token.type == "attribute") { prefix = token.string; replaceToken = true; } for (var attr in attrs) if (attrs.hasOwnProperty(attr) && (!prefix || attr.lastIndexOf(prefix, 0) == 0)) result.push(attr); } } return { list: result, from: replaceToken ? Pos(cur.line, tagStart == null ? token.start : tagStart) : cur, to: replaceToken ? Pos(cur.line, token.end) : cur }; } CodeMirror.registerHelper("hint", "xml", getHints); }); ================================================ FILE: base/res/codemirror/addon/lint/coffeescript-lint.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Depends on coffeelint.js from http://www.coffeelint.org/js/coffeelint.js // declare global: coffeelint (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.registerHelper("lint", "coffeescript", function(text) { var found = []; var parseError = function(err) { var loc = err.lineNumber; found.push({from: CodeMirror.Pos(loc-1, 0), to: CodeMirror.Pos(loc, 0), severity: err.level, message: err.message}); }; try { var res = coffeelint.lint(text); for(var i = 0; i < res.length; i++) { parseError(res[i]); } } catch(e) { found.push({from: CodeMirror.Pos(e.location.first_line, 0), to: CodeMirror.Pos(e.location.last_line, e.location.last_column), severity: 'error', message: e.message}); } return found; }); }); ================================================ FILE: base/res/codemirror/addon/lint/css-lint.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Depends on csslint.js from https://github.com/stubbornella/csslint // declare global: CSSLint (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.registerHelper("lint", "css", function(text) { var found = []; if (!window.CSSLint) return found; var results = CSSLint.verify(text), messages = results.messages, message = null; for ( var i = 0; i < messages.length; i++) { message = messages[i]; var startLine = message.line -1, endLine = message.line -1, startCol = message.col -1, endCol = message.col; found.push({ from: CodeMirror.Pos(startLine, startCol), to: CodeMirror.Pos(endLine, endCol), message: message.message, severity : message.type }); } return found; }); }); ================================================ FILE: base/res/codemirror/addon/lint/javascript-lint.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; // declare global: JSHINT var bogus = [ "Dangerous comment" ]; var warnings = [ [ "Expected '{'", "Statement body should be inside '{ }' braces." ] ]; var errors = [ "Missing semicolon", "Extra comma", "Missing property name", "Unmatched ", " and instead saw", " is not defined", "Unclosed string", "Stopping, unable to continue" ]; function validator(text, options) { if (!window.JSHINT) return []; JSHINT(text, options, options.globals); var errors = JSHINT.data().errors, result = []; if (errors) parseErrors(errors, result); return result; } CodeMirror.registerHelper("lint", "javascript", validator); function cleanup(error) { // All problems are warnings by default fixWith(error, warnings, "warning", true); fixWith(error, errors, "error"); return isBogus(error) ? null : error; } function fixWith(error, fixes, severity, force) { var description, fix, find, replace, found; description = error.description; for ( var i = 0; i < fixes.length; i++) { fix = fixes[i]; find = (typeof fix === "string" ? fix : fix[0]); replace = (typeof fix === "string" ? null : fix[1]); found = description.indexOf(find) !== -1; if (force || found) { error.severity = severity; } if (found && replace) { error.description = replace; } } } function isBogus(error) { var description = error.description; for ( var i = 0; i < bogus.length; i++) { if (description.indexOf(bogus[i]) !== -1) { return true; } } return false; } function parseErrors(errors, output) { for ( var i = 0; i < errors.length; i++) { var error = errors[i]; if (error) { var linetabpositions, index; linetabpositions = []; // This next block is to fix a problem in jshint. Jshint // replaces // all tabs with spaces then performs some checks. The error // positions (character/space) are then reported incorrectly, // not taking the replacement step into account. Here we look // at the evidence line and try to adjust the character position // to the correct value. if (error.evidence) { // Tab positions are computed once per line and cached var tabpositions = linetabpositions[error.line]; if (!tabpositions) { var evidence = error.evidence; tabpositions = []; // ugggh phantomjs does not like this // forEachChar(evidence, function(item, index) { Array.prototype.forEach.call(evidence, function(item, index) { if (item === '\t') { // First col is 1 (not 0) to match error // positions tabpositions.push(index + 1); } }); linetabpositions[error.line] = tabpositions; } if (tabpositions.length > 0) { var pos = error.character; tabpositions.forEach(function(tabposition) { if (pos > tabposition) pos -= 1; }); error.character = pos; } } var start = error.character - 1, end = start + 1; if (error.evidence) { index = error.evidence.substring(start).search(/.\b/); if (index > -1) { end += index; } } // Convert to format expected by validation service error.description = error.reason;// + "(jshint)"; error.start = error.character; error.end = end; error = cleanup(error); if (error) output.push({message: error.description, severity: error.severity, from: CodeMirror.Pos(error.line - 1, start), to: CodeMirror.Pos(error.line - 1, end)}); } } } }); ================================================ FILE: base/res/codemirror/addon/lint/json-lint.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Depends on jsonlint.js from https://github.com/zaach/jsonlint // declare global: jsonlint (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.registerHelper("lint", "json", function(text) { var found = []; jsonlint.parseError = function(str, hash) { var loc = hash.loc; found.push({from: CodeMirror.Pos(loc.first_line - 1, loc.first_column), to: CodeMirror.Pos(loc.last_line - 1, loc.last_column), message: str}); }; try { jsonlint.parse(text); } catch(e) {} return found; }); }); ================================================ FILE: base/res/codemirror/addon/lint/lint.css ================================================ /* The lint marker gutter */ .CodeMirror-lint-markers { width: 16px; } .CodeMirror-lint-tooltip { background-color: infobackground; border: 1px solid black; border-radius: 4px 4px 4px 4px; color: infotext; font-family: monospace; font-size: 10pt; overflow: hidden; padding: 2px 5px; position: fixed; white-space: pre; white-space: pre-wrap; z-index: 100; max-width: 600px; opacity: 0; transition: opacity .4s; transition: opacity .4s; -webkit-transition: opacity .4s; -o-transition: opacity .4s; -ms-transition: opacity .4s; } .CodeMirror-lint-mark-error, .CodeMirror-lint-mark-warning { background-position: left bottom; background-repeat: repeat-x; } .CodeMirror-lint-mark-error { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==") ; } .CodeMirror-lint-mark-warning { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII="); } .CodeMirror-lint-marker-error, .CodeMirror-lint-marker-warning { background-position: center center; background-repeat: no-repeat; cursor: pointer; display: inline-block; height: 16px; width: 16px; vertical-align: middle; position: relative; } .CodeMirror-lint-message-error, .CodeMirror-lint-message-warning { padding-left: 18px; background-position: top left; background-repeat: no-repeat; } .CodeMirror-lint-marker-error, .CodeMirror-lint-message-error { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII="); } .CodeMirror-lint-marker-warning, .CodeMirror-lint-message-warning { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII="); } .CodeMirror-lint-marker-multiple { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC"); background-repeat: no-repeat; background-position: right bottom; width: 100%; height: 100%; } ================================================ FILE: base/res/codemirror/addon/lint/lint.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var GUTTER_ID = "CodeMirror-lint-markers"; function showTooltip(e, content) { var tt = document.createElement("div"); tt.className = "CodeMirror-lint-tooltip"; tt.appendChild(content.cloneNode(true)); document.body.appendChild(tt); function position(e) { if (!tt.parentNode) return CodeMirror.off(document, "mousemove", position); tt.style.top = Math.max(0, e.clientY - tt.offsetHeight - 5) + "px"; tt.style.left = (e.clientX + 5) + "px"; } CodeMirror.on(document, "mousemove", position); position(e); if (tt.style.opacity != null) tt.style.opacity = 1; return tt; } function rm(elt) { if (elt.parentNode) elt.parentNode.removeChild(elt); } function hideTooltip(tt) { if (!tt.parentNode) return; if (tt.style.opacity == null) rm(tt); tt.style.opacity = 0; setTimeout(function() { rm(tt); }, 600); } function showTooltipFor(e, content, node) { var tooltip = showTooltip(e, content); function hide() { CodeMirror.off(node, "mouseout", hide); if (tooltip) { hideTooltip(tooltip); tooltip = null; } } var poll = setInterval(function() { if (tooltip) for (var n = node;; n = n.parentNode) { if (n && n.nodeType == 11) n = n.host; if (n == document.body) return; if (!n) { hide(); break; } } if (!tooltip) return clearInterval(poll); }, 400); CodeMirror.on(node, "mouseout", hide); } function LintState(cm, options, hasGutter) { this.marked = []; this.options = options; this.timeout = null; this.hasGutter = hasGutter; this.onMouseOver = function(e) { onMouseOver(cm, e); }; } function parseOptions(cm, options) { if (options instanceof Function) return {getAnnotations: options}; if (!options || options === true) options = {}; if (!options.getAnnotations) options.getAnnotations = cm.getHelper(CodeMirror.Pos(0, 0), "lint"); if (!options.getAnnotations) throw new Error("Required option 'getAnnotations' missing (lint addon)"); return options; } function clearMarks(cm) { var state = cm.state.lint; if (state.hasGutter) cm.clearGutter(GUTTER_ID); for (var i = 0; i < state.marked.length; ++i) state.marked[i].clear(); state.marked.length = 0; } function makeMarker(labels, severity, multiple, tooltips) { var marker = document.createElement("div"), inner = marker; marker.className = "CodeMirror-lint-marker-" + severity; if (multiple) { inner = marker.appendChild(document.createElement("div")); inner.className = "CodeMirror-lint-marker-multiple"; } if (tooltips != false) CodeMirror.on(inner, "mouseover", function(e) { showTooltipFor(e, labels, inner); }); return marker; } function getMaxSeverity(a, b) { if (a == "error") return a; else return b; } function groupByLine(annotations) { var lines = []; for (var i = 0; i < annotations.length; ++i) { var ann = annotations[i], line = ann.from.line; (lines[line] || (lines[line] = [])).push(ann); } return lines; } function annotationTooltip(ann) { var severity = ann.severity; if (!severity) severity = "error"; var tip = document.createElement("div"); tip.className = "CodeMirror-lint-message-" + severity; tip.appendChild(document.createTextNode(ann.message)); return tip; } function startLinting(cm) { var state = cm.state.lint, options = state.options; var passOptions = options.options || options; // Support deprecated passing of `options` property in options if (options.async || options.getAnnotations.async) options.getAnnotations(cm.getValue(), updateLinting, passOptions, cm); else updateLinting(cm, options.getAnnotations(cm.getValue(), passOptions, cm)); } function updateLinting(cm, annotationsNotSorted) { clearMarks(cm); var state = cm.state.lint, options = state.options; var annotations = groupByLine(annotationsNotSorted); for (var line = 0; line < annotations.length; ++line) { var anns = annotations[line]; if (!anns) continue; var maxSeverity = null; var tipLabel = state.hasGutter && document.createDocumentFragment(); for (var i = 0; i < anns.length; ++i) { var ann = anns[i]; var severity = ann.severity; if (!severity) severity = "error"; maxSeverity = getMaxSeverity(maxSeverity, severity); if (options.formatAnnotation) ann = options.formatAnnotation(ann); if (state.hasGutter) tipLabel.appendChild(annotationTooltip(ann)); if (ann.to) state.marked.push(cm.markText(ann.from, ann.to, { className: "CodeMirror-lint-mark-" + severity, __annotation: ann })); } if (state.hasGutter) cm.setGutterMarker(line, GUTTER_ID, makeMarker(tipLabel, maxSeverity, anns.length > 1, state.options.tooltips)); } if (options.onUpdateLinting) options.onUpdateLinting(annotationsNotSorted, annotations, cm); } function onChange(cm) { var state = cm.state.lint; if (!state) return; clearTimeout(state.timeout); state.timeout = setTimeout(function(){startLinting(cm);}, state.options.delay || 500); } function popupSpanTooltip(ann, e) { var target = e.target || e.srcElement; showTooltipFor(e, annotationTooltip(ann), target); } function onMouseOver(cm, e) { var target = e.target || e.srcElement; if (!/\bCodeMirror-lint-mark-/.test(target.className)) return; var box = target.getBoundingClientRect(), x = (box.left + box.right) / 2, y = (box.top + box.bottom) / 2; var spans = cm.findMarksAt(cm.coordsChar({left: x, top: y}, "client")); for (var i = 0; i < spans.length; ++i) { var ann = spans[i].__annotation; if (ann) return popupSpanTooltip(ann, e); } } CodeMirror.defineOption("lint", false, function(cm, val, old) { if (old && old != CodeMirror.Init) { clearMarks(cm); cm.off("change", onChange); CodeMirror.off(cm.getWrapperElement(), "mouseover", cm.state.lint.onMouseOver); clearTimeout(cm.state.lint.timeout); delete cm.state.lint; } if (val) { var gutters = cm.getOption("gutters"), hasLintGutter = false; for (var i = 0; i < gutters.length; ++i) if (gutters[i] == GUTTER_ID) hasLintGutter = true; var state = cm.state.lint = new LintState(cm, parseOptions(cm, val), hasLintGutter); cm.on("change", onChange); if (state.options.tooltips != false) CodeMirror.on(cm.getWrapperElement(), "mouseover", state.onMouseOver); startLinting(cm); } }); }); ================================================ FILE: base/res/codemirror/addon/lint/yaml-lint.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; // Depends on js-yaml.js from https://github.com/nodeca/js-yaml // declare global: jsyaml CodeMirror.registerHelper("lint", "yaml", function(text) { var found = []; try { jsyaml.load(text); } catch(e) { var loc = e.mark; found.push({ from: CodeMirror.Pos(loc.line, loc.column), to: CodeMirror.Pos(loc.line, loc.column), message: e.message }); } return found; }); }); ================================================ FILE: base/res/codemirror/addon/merge/merge.css ================================================ .CodeMirror-merge { position: relative; border: 1px solid #ddd; white-space: pre; } .CodeMirror-merge, .CodeMirror-merge .CodeMirror { height: 350px; } .CodeMirror-merge-2pane .CodeMirror-merge-pane { width: 47%; } .CodeMirror-merge-2pane .CodeMirror-merge-gap { width: 6%; } .CodeMirror-merge-3pane .CodeMirror-merge-pane { width: 31%; } .CodeMirror-merge-3pane .CodeMirror-merge-gap { width: 3.5%; } .CodeMirror-merge-pane { display: inline-block; white-space: normal; vertical-align: top; } .CodeMirror-merge-pane-rightmost { position: absolute; right: 0px; z-index: 1; } .CodeMirror-merge-gap { z-index: 2; display: inline-block; height: 100%; -moz-box-sizing: border-box; box-sizing: border-box; overflow: hidden; border-left: 1px solid #ddd; border-right: 1px solid #ddd; position: relative; background: #f8f8f8; } .CodeMirror-merge-scrolllock-wrap { position: absolute; bottom: 0; left: 50%; } .CodeMirror-merge-scrolllock { position: relative; left: -50%; cursor: pointer; color: #555; line-height: 1; } .CodeMirror-merge-copybuttons-left, .CodeMirror-merge-copybuttons-right { position: absolute; left: 0; top: 0; right: 0; bottom: 0; line-height: 1; } .CodeMirror-merge-copy { position: absolute; cursor: pointer; color: #44c; } .CodeMirror-merge-copy-reverse { position: absolute; cursor: pointer; color: #44c; } .CodeMirror-merge-copybuttons-left .CodeMirror-merge-copy { left: 2px; } .CodeMirror-merge-copybuttons-right .CodeMirror-merge-copy { right: 2px; } .CodeMirror-merge-r-inserted, .CodeMirror-merge-l-inserted { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12MwuCXy3+CWyH8GBgYGJgYkAABZbAQ9ELXurwAAAABJRU5ErkJggg==); background-position: bottom left; background-repeat: repeat-x; } .CodeMirror-merge-r-deleted, .CodeMirror-merge-l-deleted { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12M4Kyb2/6yY2H8GBgYGJgYkAABURgPz6Ks7wQAAAABJRU5ErkJggg==); background-position: bottom left; background-repeat: repeat-x; } .CodeMirror-merge-r-chunk { background: #ffffe0; } .CodeMirror-merge-r-chunk-start { border-top: 1px solid #ee8; } .CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #ee8; } .CodeMirror-merge-r-connect { fill: #ffffe0; stroke: #ee8; stroke-width: 1px; } .CodeMirror-merge-l-chunk { background: #eef; } .CodeMirror-merge-l-chunk-start { border-top: 1px solid #88e; } .CodeMirror-merge-l-chunk-end { border-bottom: 1px solid #88e; } .CodeMirror-merge-l-connect { fill: #eef; stroke: #88e; stroke-width: 1px; } .CodeMirror-merge-l-chunk.CodeMirror-merge-r-chunk { background: #dfd; } .CodeMirror-merge-l-chunk-start.CodeMirror-merge-r-chunk-start { border-top: 1px solid #4e4; } .CodeMirror-merge-l-chunk-end.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #4e4; } .CodeMirror-merge-collapsed-widget:before { content: "(...)"; } .CodeMirror-merge-collapsed-widget { cursor: pointer; color: #88b; background: #eef; border: 1px solid #ddf; font-size: 90%; padding: 0 3px; border-radius: 4px; } .CodeMirror-merge-collapsed-line .CodeMirror-gutter-elt { display: none; } ================================================ FILE: base/res/codemirror/addon/merge/merge.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // declare global: diff_match_patch, DIFF_INSERT, DIFF_DELETE, DIFF_EQUAL (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("diff_match_patch")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "diff_match_patch"], mod); else // Plain browser env mod(CodeMirror, diff_match_patch); })(function(CodeMirror, diff_match_patch) { "use strict"; var Pos = CodeMirror.Pos; var svgNS = "http://www.w3.org/2000/svg"; function DiffView(mv, type) { this.mv = mv; this.type = type; this.classes = type == "left" ? {chunk: "CodeMirror-merge-l-chunk", start: "CodeMirror-merge-l-chunk-start", end: "CodeMirror-merge-l-chunk-end", insert: "CodeMirror-merge-l-inserted", del: "CodeMirror-merge-l-deleted", connect: "CodeMirror-merge-l-connect"} : {chunk: "CodeMirror-merge-r-chunk", start: "CodeMirror-merge-r-chunk-start", end: "CodeMirror-merge-r-chunk-end", insert: "CodeMirror-merge-r-inserted", del: "CodeMirror-merge-r-deleted", connect: "CodeMirror-merge-r-connect"}; } DiffView.prototype = { constructor: DiffView, init: function(pane, orig, options) { this.edit = this.mv.edit; (this.edit.state.diffViews || (this.edit.state.diffViews = [])).push(this); this.orig = CodeMirror(pane, copyObj({value: orig, readOnly: !this.mv.options.allowEditingOriginals}, copyObj(options))); this.orig.state.diffViews = [this]; this.diff = getDiff(asString(orig), asString(options.value)); this.chunks = getChunks(this.diff); this.diffOutOfDate = this.dealigned = false; this.showDifferences = options.showDifferences !== false; this.forceUpdate = registerUpdate(this); setScrollLock(this, true, false); registerScroll(this); }, setShowDifferences: function(val) { val = val !== false; if (val != this.showDifferences) { this.showDifferences = val; this.forceUpdate("full"); } } }; function ensureDiff(dv) { if (dv.diffOutOfDate) { dv.diff = getDiff(dv.orig.getValue(), dv.edit.getValue()); dv.chunks = getChunks(dv.diff); dv.diffOutOfDate = false; CodeMirror.signal(dv.edit, "updateDiff", dv.diff); } } var updating = false; function registerUpdate(dv) { var edit = {from: 0, to: 0, marked: []}; var orig = {from: 0, to: 0, marked: []}; var debounceChange, updatingFast = false; function update(mode) { updating = true; updatingFast = false; if (mode == "full") { if (dv.svg) clear(dv.svg); if (dv.copyButtons) clear(dv.copyButtons); clearMarks(dv.edit, edit.marked, dv.classes); clearMarks(dv.orig, orig.marked, dv.classes); edit.from = edit.to = orig.from = orig.to = 0; } ensureDiff(dv); if (dv.showDifferences) { updateMarks(dv.edit, dv.diff, edit, DIFF_INSERT, dv.classes); updateMarks(dv.orig, dv.diff, orig, DIFF_DELETE, dv.classes); } makeConnections(dv); if (dv.mv.options.connect == "align") alignChunks(dv); updating = false; } function setDealign(fast) { if (updating) return; dv.dealigned = true; set(fast); } function set(fast) { if (updating || updatingFast) return; clearTimeout(debounceChange); if (fast === true) updatingFast = true; debounceChange = setTimeout(update, fast === true ? 20 : 250); } function change(_cm, change) { if (!dv.diffOutOfDate) { dv.diffOutOfDate = true; edit.from = edit.to = orig.from = orig.to = 0; } // Update faster when a line was added/removed setDealign(change.text.length - 1 != change.to.line - change.from.line); } dv.edit.on("change", change); dv.orig.on("change", change); dv.edit.on("markerAdded", setDealign); dv.edit.on("markerCleared", setDealign); dv.orig.on("markerAdded", setDealign); dv.orig.on("markerCleared", setDealign); dv.edit.on("viewportChange", function() { set(false); }); dv.orig.on("viewportChange", function() { set(false); }); update(); return update; } function registerScroll(dv) { dv.edit.on("scroll", function() { syncScroll(dv, DIFF_INSERT) && makeConnections(dv); }); dv.orig.on("scroll", function() { syncScroll(dv, DIFF_DELETE) && makeConnections(dv); }); } function syncScroll(dv, type) { // Change handler will do a refresh after a timeout when diff is out of date if (dv.diffOutOfDate) return false; if (!dv.lockScroll) return true; var editor, other, now = +new Date; if (type == DIFF_INSERT) { editor = dv.edit; other = dv.orig; } else { editor = dv.orig; other = dv.edit; } // Don't take action if the position of this editor was recently set // (to prevent feedback loops) if (editor.state.scrollSetBy == dv && (editor.state.scrollSetAt || 0) + 50 > now) return false; var sInfo = editor.getScrollInfo(); if (dv.mv.options.connect == "align") { targetPos = sInfo.top; } else { var halfScreen = .5 * sInfo.clientHeight, midY = sInfo.top + halfScreen; var mid = editor.lineAtHeight(midY, "local"); var around = chunkBoundariesAround(dv.chunks, mid, type == DIFF_INSERT); var off = getOffsets(editor, type == DIFF_INSERT ? around.edit : around.orig); var offOther = getOffsets(other, type == DIFF_INSERT ? around.orig : around.edit); var ratio = (midY - off.top) / (off.bot - off.top); var targetPos = (offOther.top - halfScreen) + ratio * (offOther.bot - offOther.top); var botDist, mix; // Some careful tweaking to make sure no space is left out of view // when scrolling to top or bottom. if (targetPos > sInfo.top && (mix = sInfo.top / halfScreen) < 1) { targetPos = targetPos * mix + sInfo.top * (1 - mix); } else if ((botDist = sInfo.height - sInfo.clientHeight - sInfo.top) < halfScreen) { var otherInfo = other.getScrollInfo(); var botDistOther = otherInfo.height - otherInfo.clientHeight - targetPos; if (botDistOther > botDist && (mix = botDist / halfScreen) < 1) targetPos = targetPos * mix + (otherInfo.height - otherInfo.clientHeight - botDist) * (1 - mix); } } other.scrollTo(sInfo.left, targetPos); other.state.scrollSetAt = now; other.state.scrollSetBy = dv; return true; } function getOffsets(editor, around) { var bot = around.after; if (bot == null) bot = editor.lastLine() + 1; return {top: editor.heightAtLine(around.before || 0, "local"), bot: editor.heightAtLine(bot, "local")}; } function setScrollLock(dv, val, action) { dv.lockScroll = val; if (val && action != false) syncScroll(dv, DIFF_INSERT) && makeConnections(dv); dv.lockButton.innerHTML = val ? "\u21db\u21da" : "\u21db  \u21da"; } // Updating the marks for editor content function clearMarks(editor, arr, classes) { for (var i = 0; i < arr.length; ++i) { var mark = arr[i]; if (mark instanceof CodeMirror.TextMarker) { mark.clear(); } else if (mark.parent) { editor.removeLineClass(mark, "background", classes.chunk); editor.removeLineClass(mark, "background", classes.start); editor.removeLineClass(mark, "background", classes.end); } } arr.length = 0; } // FIXME maybe add a margin around viewport to prevent too many updates function updateMarks(editor, diff, state, type, classes) { var vp = editor.getViewport(); editor.operation(function() { if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) { clearMarks(editor, state.marked, classes); markChanges(editor, diff, type, state.marked, vp.from, vp.to, classes); state.from = vp.from; state.to = vp.to; } else { if (vp.from < state.from) { markChanges(editor, diff, type, state.marked, vp.from, state.from, classes); state.from = vp.from; } if (vp.to > state.to) { markChanges(editor, diff, type, state.marked, state.to, vp.to, classes); state.to = vp.to; } } }); } function markChanges(editor, diff, type, marks, from, to, classes) { var pos = Pos(0, 0); var top = Pos(from, 0), bot = editor.clipPos(Pos(to - 1)); var cls = type == DIFF_DELETE ? classes.del : classes.insert; function markChunk(start, end) { var bfrom = Math.max(from, start), bto = Math.min(to, end); for (var i = bfrom; i < bto; ++i) { var line = editor.addLineClass(i, "background", classes.chunk); if (i == start) editor.addLineClass(line, "background", classes.start); if (i == end - 1) editor.addLineClass(line, "background", classes.end); marks.push(line); } // When the chunk is empty, make sure a horizontal line shows up if (start == end && bfrom == end && bto == end) { if (bfrom) marks.push(editor.addLineClass(bfrom - 1, "background", classes.end)); else marks.push(editor.addLineClass(bfrom, "background", classes.start)); } } var chunkStart = 0; for (var i = 0; i < diff.length; ++i) { var part = diff[i], tp = part[0], str = part[1]; if (tp == DIFF_EQUAL) { var cleanFrom = pos.line + (startOfLineClean(diff, i) ? 0 : 1); moveOver(pos, str); var cleanTo = pos.line + (endOfLineClean(diff, i) ? 1 : 0); if (cleanTo > cleanFrom) { if (i) markChunk(chunkStart, cleanFrom); chunkStart = cleanTo; } } else { if (tp == type) { var end = moveOver(pos, str, true); var a = posMax(top, pos), b = posMin(bot, end); if (!posEq(a, b)) marks.push(editor.markText(a, b, {className: cls})); pos = end; } } } if (chunkStart <= pos.line) markChunk(chunkStart, pos.line + 1); } // Updating the gap between editor and original function makeConnections(dv) { if (!dv.showDifferences) return; if (dv.svg) { clear(dv.svg); var w = dv.gap.offsetWidth; attrs(dv.svg, "width", w, "height", dv.gap.offsetHeight); } if (dv.copyButtons) clear(dv.copyButtons); var vpEdit = dv.edit.getViewport(), vpOrig = dv.orig.getViewport(); var sTopEdit = dv.edit.getScrollInfo().top, sTopOrig = dv.orig.getScrollInfo().top; for (var i = 0; i < dv.chunks.length; i++) { var ch = dv.chunks[i]; if (ch.editFrom <= vpEdit.to && ch.editTo >= vpEdit.from && ch.origFrom <= vpOrig.to && ch.origTo >= vpOrig.from) drawConnectorsForChunk(dv, ch, sTopOrig, sTopEdit, w); } } function getMatchingOrigLine(editLine, chunks) { var editStart = 0, origStart = 0; for (var i = 0; i < chunks.length; i++) { var chunk = chunks[i]; if (chunk.editTo > editLine && chunk.editFrom <= editLine) return null; if (chunk.editFrom > editLine) break; editStart = chunk.editTo; origStart = chunk.origTo; } return origStart + (editLine - editStart); } function findAlignedLines(dv, other) { var linesToAlign = []; for (var i = 0; i < dv.chunks.length; i++) { var chunk = dv.chunks[i]; linesToAlign.push([chunk.origTo, chunk.editTo, other ? getMatchingOrigLine(chunk.editTo, other.chunks) : null]); } if (other) { for (var i = 0; i < other.chunks.length; i++) { var chunk = other.chunks[i]; for (var j = 0; j < linesToAlign.length; j++) { var align = linesToAlign[j]; if (align[1] == chunk.editTo) { j = -1; break; } else if (align[1] > chunk.editTo) { break; } } if (j > -1) linesToAlign.splice(j - 1, 0, [getMatchingOrigLine(chunk.editTo, dv.chunks), chunk.editTo, chunk.origTo]); } } return linesToAlign; } function alignChunks(dv, force) { if (!dv.dealigned && !force) return; if (!dv.orig.curOp) return dv.orig.operation(function() { alignChunks(dv, force); }); dv.dealigned = false; var other = dv.mv.left == dv ? dv.mv.right : dv.mv.left; if (other) { ensureDiff(other); other.dealigned = false; } var linesToAlign = findAlignedLines(dv, other); // Clear old aligners var aligners = dv.mv.aligners; for (var i = 0; i < aligners.length; i++) aligners[i].clear(); aligners.length = 0; var cm = [dv.orig, dv.edit], scroll = []; if (other) cm.push(other.orig); for (var i = 0; i < cm.length; i++) scroll.push(cm[i].getScrollInfo().top); for (var ln = 0; ln < linesToAlign.length; ln++) alignLines(cm, linesToAlign[ln], aligners); for (var i = 0; i < cm.length; i++) cm[i].scrollTo(null, scroll[i]); } function alignLines(cm, lines, aligners) { var maxOffset = 0, offset = []; for (var i = 0; i < cm.length; i++) if (lines[i] != null) { var off = cm[i].heightAtLine(lines[i], "local"); offset[i] = off; maxOffset = Math.max(maxOffset, off); } for (var i = 0; i < cm.length; i++) if (lines[i] != null) { var diff = maxOffset - offset[i]; if (diff > 1) aligners.push(padAbove(cm[i], lines[i], diff)); } } function padAbove(cm, line, size) { var above = true; if (line > cm.lastLine()) { line--; above = false; } var elt = document.createElement("div"); elt.className = "CodeMirror-merge-spacer"; elt.style.height = size + "px"; elt.style.minWidth = "1px"; return cm.addLineWidget(line, elt, {height: size, above: above}); } function drawConnectorsForChunk(dv, chunk, sTopOrig, sTopEdit, w) { var flip = dv.type == "left"; var top = dv.orig.heightAtLine(chunk.origFrom, "local") - sTopOrig; if (dv.svg) { var topLpx = top; var topRpx = dv.edit.heightAtLine(chunk.editFrom, "local") - sTopEdit; if (flip) { var tmp = topLpx; topLpx = topRpx; topRpx = tmp; } var botLpx = dv.orig.heightAtLine(chunk.origTo, "local") - sTopOrig; var botRpx = dv.edit.heightAtLine(chunk.editTo, "local") - sTopEdit; if (flip) { var tmp = botLpx; botLpx = botRpx; botRpx = tmp; } var curveTop = " C " + w/2 + " " + topRpx + " " + w/2 + " " + topLpx + " " + (w + 2) + " " + topLpx; var curveBot = " C " + w/2 + " " + botLpx + " " + w/2 + " " + botRpx + " -1 " + botRpx; attrs(dv.svg.appendChild(document.createElementNS(svgNS, "path")), "d", "M -1 " + topRpx + curveTop + " L " + (w + 2) + " " + botLpx + curveBot + " z", "class", dv.classes.connect); } if (dv.copyButtons) { var copy = dv.copyButtons.appendChild(elt("div", dv.type == "left" ? "\u21dd" : "\u21dc", "CodeMirror-merge-copy")); var editOriginals = dv.mv.options.allowEditingOriginals; copy.title = editOriginals ? "Push to left" : "Revert chunk"; copy.chunk = chunk; copy.style.top = top + "px"; if (editOriginals) { var topReverse = dv.orig.heightAtLine(chunk.editFrom, "local") - sTopEdit; var copyReverse = dv.copyButtons.appendChild(elt("div", dv.type == "right" ? "\u21dd" : "\u21dc", "CodeMirror-merge-copy-reverse")); copyReverse.title = "Push to right"; copyReverse.chunk = {editFrom: chunk.origFrom, editTo: chunk.origTo, origFrom: chunk.editFrom, origTo: chunk.editTo}; copyReverse.style.top = topReverse + "px"; dv.type == "right" ? copyReverse.style.left = "2px" : copyReverse.style.right = "2px"; } } } function copyChunk(dv, to, from, chunk) { if (dv.diffOutOfDate) return; to.replaceRange(from.getRange(Pos(chunk.origFrom, 0), Pos(chunk.origTo, 0)), Pos(chunk.editFrom, 0), Pos(chunk.editTo, 0)); } // Merge view, containing 0, 1, or 2 diff views. var MergeView = CodeMirror.MergeView = function(node, options) { if (!(this instanceof MergeView)) return new MergeView(node, options); this.options = options; var origLeft = options.origLeft, origRight = options.origRight == null ? options.orig : options.origRight; var hasLeft = origLeft != null, hasRight = origRight != null; var panes = 1 + (hasLeft ? 1 : 0) + (hasRight ? 1 : 0); var wrap = [], left = this.left = null, right = this.right = null; var self = this; if (hasLeft) { left = this.left = new DiffView(this, "left"); var leftPane = elt("div", null, "CodeMirror-merge-pane"); wrap.push(leftPane); wrap.push(buildGap(left)); } var editPane = elt("div", null, "CodeMirror-merge-pane"); wrap.push(editPane); if (hasRight) { right = this.right = new DiffView(this, "right"); wrap.push(buildGap(right)); var rightPane = elt("div", null, "CodeMirror-merge-pane"); wrap.push(rightPane); } (hasRight ? rightPane : editPane).className += " CodeMirror-merge-pane-rightmost"; wrap.push(elt("div", null, null, "height: 0; clear: both;")); var wrapElt = this.wrap = node.appendChild(elt("div", wrap, "CodeMirror-merge CodeMirror-merge-" + panes + "pane")); this.edit = CodeMirror(editPane, copyObj(options)); if (left) left.init(leftPane, origLeft, options); if (right) right.init(rightPane, origRight, options); if (options.collapseIdentical) { updating = true; this.editor().operation(function() { collapseIdenticalStretches(self, options.collapseIdentical); }); updating = false; } if (options.connect == "align") { this.aligners = []; alignChunks(this.left || this.right, true); } var onResize = function() { if (left) makeConnections(left); if (right) makeConnections(right); }; CodeMirror.on(window, "resize", onResize); var resizeInterval = setInterval(function() { for (var p = wrapElt.parentNode; p && p != document.body; p = p.parentNode) {} if (!p) { clearInterval(resizeInterval); CodeMirror.off(window, "resize", onResize); } }, 5000); }; function buildGap(dv) { var lock = dv.lockButton = elt("div", null, "CodeMirror-merge-scrolllock"); lock.title = "Toggle locked scrolling"; var lockWrap = elt("div", [lock], "CodeMirror-merge-scrolllock-wrap"); CodeMirror.on(lock, "click", function() { setScrollLock(dv, !dv.lockScroll); }); var gapElts = [lockWrap]; if (dv.mv.options.revertButtons !== false) { dv.copyButtons = elt("div", null, "CodeMirror-merge-copybuttons-" + dv.type); CodeMirror.on(dv.copyButtons, "click", function(e) { var node = e.target || e.srcElement; if (!node.chunk) return; if (node.className == "CodeMirror-merge-copy-reverse") { copyChunk(dv, dv.orig, dv.edit, node.chunk); return; } copyChunk(dv, dv.edit, dv.orig, node.chunk); }); gapElts.unshift(dv.copyButtons); } if (dv.mv.options.connect != "align") { var svg = document.createElementNS && document.createElementNS(svgNS, "svg"); if (svg && !svg.createSVGRect) svg = null; dv.svg = svg; if (svg) gapElts.push(svg); } return dv.gap = elt("div", gapElts, "CodeMirror-merge-gap"); } MergeView.prototype = { constuctor: MergeView, editor: function() { return this.edit; }, rightOriginal: function() { return this.right && this.right.orig; }, leftOriginal: function() { return this.left && this.left.orig; }, setShowDifferences: function(val) { if (this.right) this.right.setShowDifferences(val); if (this.left) this.left.setShowDifferences(val); }, rightChunks: function() { if (this.right) { ensureDiff(this.right); return this.right.chunks; } }, leftChunks: function() { if (this.left) { ensureDiff(this.left); return this.left.chunks; } } }; function asString(obj) { if (typeof obj == "string") return obj; else return obj.getValue(); } // Operations on diffs var dmp = new diff_match_patch(); function getDiff(a, b) { var diff = dmp.diff_main(a, b); dmp.diff_cleanupSemantic(diff); // The library sometimes leaves in empty parts, which confuse the algorithm for (var i = 0; i < diff.length; ++i) { var part = diff[i]; if (!part[1]) { diff.splice(i--, 1); } else if (i && diff[i - 1][0] == part[0]) { diff.splice(i--, 1); diff[i][1] += part[1]; } } return diff; } function getChunks(diff) { var chunks = []; var startEdit = 0, startOrig = 0; var edit = Pos(0, 0), orig = Pos(0, 0); for (var i = 0; i < diff.length; ++i) { var part = diff[i], tp = part[0]; if (tp == DIFF_EQUAL) { var startOff = startOfLineClean(diff, i) ? 0 : 1; var cleanFromEdit = edit.line + startOff, cleanFromOrig = orig.line + startOff; moveOver(edit, part[1], null, orig); var endOff = endOfLineClean(diff, i) ? 1 : 0; var cleanToEdit = edit.line + endOff, cleanToOrig = orig.line + endOff; if (cleanToEdit > cleanFromEdit) { if (i) chunks.push({origFrom: startOrig, origTo: cleanFromOrig, editFrom: startEdit, editTo: cleanFromEdit}); startEdit = cleanToEdit; startOrig = cleanToOrig; } } else { moveOver(tp == DIFF_INSERT ? edit : orig, part[1]); } } if (startEdit <= edit.line || startOrig <= orig.line) chunks.push({origFrom: startOrig, origTo: orig.line + 1, editFrom: startEdit, editTo: edit.line + 1}); return chunks; } function endOfLineClean(diff, i) { if (i == diff.length - 1) return true; var next = diff[i + 1][1]; if (next.length == 1 || next.charCodeAt(0) != 10) return false; if (i == diff.length - 2) return true; next = diff[i + 2][1]; return next.length > 1 && next.charCodeAt(0) == 10; } function startOfLineClean(diff, i) { if (i == 0) return true; var last = diff[i - 1][1]; if (last.charCodeAt(last.length - 1) != 10) return false; if (i == 1) return true; last = diff[i - 2][1]; return last.charCodeAt(last.length - 1) == 10; } function chunkBoundariesAround(chunks, n, nInEdit) { var beforeE, afterE, beforeO, afterO; for (var i = 0; i < chunks.length; i++) { var chunk = chunks[i]; var fromLocal = nInEdit ? chunk.editFrom : chunk.origFrom; var toLocal = nInEdit ? chunk.editTo : chunk.origTo; if (afterE == null) { if (fromLocal > n) { afterE = chunk.editFrom; afterO = chunk.origFrom; } else if (toLocal > n) { afterE = chunk.editTo; afterO = chunk.origTo; } } if (toLocal <= n) { beforeE = chunk.editTo; beforeO = chunk.origTo; } else if (fromLocal <= n) { beforeE = chunk.editFrom; beforeO = chunk.origFrom; } } return {edit: {before: beforeE, after: afterE}, orig: {before: beforeO, after: afterO}}; } function collapseSingle(cm, from, to) { cm.addLineClass(from, "wrap", "CodeMirror-merge-collapsed-line"); var widget = document.createElement("span"); widget.className = "CodeMirror-merge-collapsed-widget"; widget.title = "Identical text collapsed. Click to expand."; var mark = cm.markText(Pos(from, 0), Pos(to - 1), { inclusiveLeft: true, inclusiveRight: true, replacedWith: widget, clearOnEnter: true }); function clear() { mark.clear(); cm.removeLineClass(from, "wrap", "CodeMirror-merge-collapsed-line"); } widget.addEventListener("click", clear); return {mark: mark, clear: clear}; } function collapseStretch(size, editors) { var marks = []; function clear() { for (var i = 0; i < marks.length; i++) marks[i].clear(); } for (var i = 0; i < editors.length; i++) { var editor = editors[i]; var mark = collapseSingle(editor.cm, editor.line, editor.line + size); marks.push(mark); mark.mark.on("clear", clear); } return marks[0].mark; } function unclearNearChunks(dv, margin, off, clear) { for (var i = 0; i < dv.chunks.length; i++) { var chunk = dv.chunks[i]; for (var l = chunk.editFrom - margin; l < chunk.editTo + margin; l++) { var pos = l + off; if (pos >= 0 && pos < clear.length) clear[pos] = false; } } } function collapseIdenticalStretches(mv, margin) { if (typeof margin != "number") margin = 2; var clear = [], edit = mv.editor(), off = edit.firstLine(); for (var l = off, e = edit.lastLine(); l <= e; l++) clear.push(true); if (mv.left) unclearNearChunks(mv.left, margin, off, clear); if (mv.right) unclearNearChunks(mv.right, margin, off, clear); for (var i = 0; i < clear.length; i++) { if (clear[i]) { var line = i + off; for (var size = 1; i < clear.length - 1 && clear[i + 1]; i++, size++) {} if (size > margin) { var editors = [{line: line, cm: edit}]; if (mv.left) editors.push({line: getMatchingOrigLine(line, mv.left.chunks), cm: mv.left.orig}); if (mv.right) editors.push({line: getMatchingOrigLine(line, mv.right.chunks), cm: mv.right.orig}); var mark = collapseStretch(size, editors); if (mv.options.onCollapse) mv.options.onCollapse(mv, line, size, mark); } } } } // General utilities function elt(tag, content, className, style) { var e = document.createElement(tag); if (className) e.className = className; if (style) e.style.cssText = style; if (typeof content == "string") e.appendChild(document.createTextNode(content)); else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]); return e; } function clear(node) { for (var count = node.childNodes.length; count > 0; --count) node.removeChild(node.firstChild); } function attrs(elt) { for (var i = 1; i < arguments.length; i += 2) elt.setAttribute(arguments[i], arguments[i+1]); } function copyObj(obj, target) { if (!target) target = {}; for (var prop in obj) if (obj.hasOwnProperty(prop)) target[prop] = obj[prop]; return target; } function moveOver(pos, str, copy, other) { var out = copy ? Pos(pos.line, pos.ch) : pos, at = 0; for (;;) { var nl = str.indexOf("\n", at); if (nl == -1) break; ++out.line; if (other) ++other.line; at = nl + 1; } out.ch = (at ? 0 : out.ch) + (str.length - at); if (other) other.ch = (at ? 0 : other.ch) + (str.length - at); return out; } function posMin(a, b) { return (a.line - b.line || a.ch - b.ch) < 0 ? a : b; } function posMax(a, b) { return (a.line - b.line || a.ch - b.ch) > 0 ? a : b; } function posEq(a, b) { return a.line == b.line && a.ch == b.ch; } function findPrevDiff(chunks, start, isOrig) { for (var i = chunks.length - 1; i >= 0; i--) { var chunk = chunks[i]; var to = (isOrig ? chunk.origTo : chunk.editTo) - 1; if (to < start) return to; } } function findNextDiff(chunks, start, isOrig) { for (var i = 0; i < chunks.length; i++) { var chunk = chunks[i]; var from = (isOrig ? chunk.origFrom : chunk.editFrom); if (from > start) return from; } } function goNearbyDiff(cm, dir) { var found = null, views = cm.state.diffViews, line = cm.getCursor().line; if (views) for (var i = 0; i < views.length; i++) { var dv = views[i], isOrig = cm == dv.orig; ensureDiff(dv); var pos = dir < 0 ? findPrevDiff(dv.chunks, line, isOrig) : findNextDiff(dv.chunks, line, isOrig); if (pos != null && (found == null || (dir < 0 ? pos > found : pos < found))) found = pos; } if (found != null) cm.setCursor(found, 0); else return CodeMirror.Pass; } CodeMirror.commands.goNextDiff = function(cm) { return goNearbyDiff(cm, 1); }; CodeMirror.commands.goPrevDiff = function(cm) { return goNearbyDiff(cm, -1); }; }); ================================================ FILE: base/res/codemirror/addon/mode/loadmode.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), "cjs"); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], function(CM) { mod(CM, "amd"); }); else // Plain browser env mod(CodeMirror, "plain"); })(function(CodeMirror, env) { if (!CodeMirror.modeURL) CodeMirror.modeURL = "../mode/%N/%N.js"; var loading = {}; function splitCallback(cont, n) { var countDown = n; return function() { if (--countDown == 0) cont(); }; } function ensureDeps(mode, cont) { var deps = CodeMirror.modes[mode].dependencies; if (!deps) return cont(); var missing = []; for (var i = 0; i < deps.length; ++i) { if (!CodeMirror.modes.hasOwnProperty(deps[i])) missing.push(deps[i]); } if (!missing.length) return cont(); var split = splitCallback(cont, missing.length); for (var i = 0; i < missing.length; ++i) CodeMirror.requireMode(missing[i], split); } CodeMirror.requireMode = function(mode, cont) { if (typeof mode != "string") mode = mode.name; if (CodeMirror.modes.hasOwnProperty(mode)) return ensureDeps(mode, cont); if (loading.hasOwnProperty(mode)) return loading[mode].push(cont); var file = CodeMirror.modeURL.replace(/%N/g, mode); if (env == "plain") { var script = document.createElement("script"); script.src = file; var others = document.getElementsByTagName("script")[0]; var list = loading[mode] = [cont]; CodeMirror.on(script, "load", function() { ensureDeps(mode, function() { for (var i = 0; i < list.length; ++i) list[i](); }); }); others.parentNode.insertBefore(script, others); } else if (env == "cjs") { require(file); cont(); } else if (env == "amd") { requirejs([file], cont); } }; CodeMirror.autoLoadMode = function(instance, mode) { if (!CodeMirror.modes.hasOwnProperty(mode)) CodeMirror.requireMode(mode, function() { instance.setOption("mode", instance.getOption("mode")); }); }; }); ================================================ FILE: base/res/codemirror/addon/mode/multiplex.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.multiplexingMode = function(outer /*, others */) { // Others should be {open, close, mode [, delimStyle] [, innerStyle]} objects var others = Array.prototype.slice.call(arguments, 1); function indexOf(string, pattern, from, returnEnd) { if (typeof pattern == "string") { var found = string.indexOf(pattern, from); return returnEnd && found > -1 ? found + pattern.length : found; } var m = pattern.exec(from ? string.slice(from) : string); return m ? m.index + from + (returnEnd ? m[0].length : 0) : -1; } return { startState: function() { return { outer: CodeMirror.startState(outer), innerActive: null, inner: null }; }, copyState: function(state) { return { outer: CodeMirror.copyState(outer, state.outer), innerActive: state.innerActive, inner: state.innerActive && CodeMirror.copyState(state.innerActive.mode, state.inner) }; }, token: function(stream, state) { if (!state.innerActive) { var cutOff = Infinity, oldContent = stream.string; for (var i = 0; i < others.length; ++i) { var other = others[i]; var found = indexOf(oldContent, other.open, stream.pos); if (found == stream.pos) { if (!other.parseDelimiters) stream.match(other.open); state.innerActive = other; state.inner = CodeMirror.startState(other.mode, outer.indent ? outer.indent(state.outer, "") : 0); return other.delimStyle; } else if (found != -1 && found < cutOff) { cutOff = found; } } if (cutOff != Infinity) stream.string = oldContent.slice(0, cutOff); var outerToken = outer.token(stream, state.outer); if (cutOff != Infinity) stream.string = oldContent; return outerToken; } else { var curInner = state.innerActive, oldContent = stream.string; if (!curInner.close && stream.sol()) { state.innerActive = state.inner = null; return this.token(stream, state); } var found = curInner.close ? indexOf(oldContent, curInner.close, stream.pos, curInner.parseDelimiters) : -1; if (found == stream.pos && !curInner.parseDelimiters) { stream.match(curInner.close); state.innerActive = state.inner = null; return curInner.delimStyle; } if (found > -1) stream.string = oldContent.slice(0, found); var innerToken = curInner.mode.token(stream, state.inner); if (found > -1) stream.string = oldContent; if (found == stream.pos && curInner.parseDelimiters) state.innerActive = state.inner = null; if (curInner.innerStyle) { if (innerToken) innerToken = innerToken + ' ' + curInner.innerStyle; else innerToken = curInner.innerStyle; } return innerToken; } }, indent: function(state, textAfter) { var mode = state.innerActive ? state.innerActive.mode : outer; if (!mode.indent) return CodeMirror.Pass; return mode.indent(state.innerActive ? state.inner : state.outer, textAfter); }, blankLine: function(state) { var mode = state.innerActive ? state.innerActive.mode : outer; if (mode.blankLine) { mode.blankLine(state.innerActive ? state.inner : state.outer); } if (!state.innerActive) { for (var i = 0; i < others.length; ++i) { var other = others[i]; if (other.open === "\n") { state.innerActive = other; state.inner = CodeMirror.startState(other.mode, mode.indent ? mode.indent(state.outer, "") : 0); } } } else if (state.innerActive.close === "\n") { state.innerActive = state.inner = null; } }, electricChars: outer.electricChars, innerMode: function(state) { return state.inner ? {state: state.inner, mode: state.innerActive.mode} : {state: state.outer, mode: outer}; } }; }; }); ================================================ FILE: base/res/codemirror/addon/mode/multiplex_test.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { CodeMirror.defineMode("markdown_with_stex", function(){ var inner = CodeMirror.getMode({}, "stex"); var outer = CodeMirror.getMode({}, "markdown"); var innerOptions = { open: '$', close: '$', mode: inner, delimStyle: 'delim', innerStyle: 'inner' }; return CodeMirror.multiplexingMode(outer, innerOptions); }); var mode = CodeMirror.getMode({}, "markdown_with_stex"); function MT(name) { test.mode( name, mode, Array.prototype.slice.call(arguments, 1), 'multiplexing'); } MT( "stexInsideMarkdown", "[strong **Equation:**] [delim $][inner&tag \\pi][delim $]"); })(); ================================================ FILE: base/res/codemirror/addon/mode/overlay.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Utility function that allows modes to be combined. The mode given // as the base argument takes care of most of the normal mode // functionality, but a second (typically simple) mode is used, which // can override the style of text. Both modes get to parse all of the // text, but when both assign a non-null style to a piece of code, the // overlay wins, unless the combine argument was true and not overridden, // or state.overlay.combineTokens was true, in which case the styles are // combined. (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.overlayMode = function(base, overlay, combine) { return { startState: function() { return { base: CodeMirror.startState(base), overlay: CodeMirror.startState(overlay), basePos: 0, baseCur: null, overlayPos: 0, overlayCur: null, streamSeen: null }; }, copyState: function(state) { return { base: CodeMirror.copyState(base, state.base), overlay: CodeMirror.copyState(overlay, state.overlay), basePos: state.basePos, baseCur: null, overlayPos: state.overlayPos, overlayCur: null }; }, token: function(stream, state) { if (stream != state.streamSeen || Math.min(state.basePos, state.overlayPos) < stream.start) { state.streamSeen = stream; state.basePos = state.overlayPos = stream.start; } if (stream.start == state.basePos) { state.baseCur = base.token(stream, state.base); state.basePos = stream.pos; } if (stream.start == state.overlayPos) { stream.pos = stream.start; state.overlayCur = overlay.token(stream, state.overlay); state.overlayPos = stream.pos; } stream.pos = Math.min(state.basePos, state.overlayPos); // state.overlay.combineTokens always takes precedence over combine, // unless set to null if (state.overlayCur == null) return state.baseCur; else if (state.baseCur != null && state.overlay.combineTokens || combine && state.overlay.combineTokens == null) return state.baseCur + " " + state.overlayCur; else return state.overlayCur; }, indent: base.indent && function(state, textAfter) { return base.indent(state.base, textAfter); }, electricChars: base.electricChars, innerMode: function(state) { return {state: state.base, mode: base}; }, blankLine: function(state) { if (base.blankLine) base.blankLine(state.base); if (overlay.blankLine) overlay.blankLine(state.overlay); } }; }; }); ================================================ FILE: base/res/codemirror/addon/mode/simple.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineSimpleMode = function(name, states) { CodeMirror.defineMode(name, function(config) { return CodeMirror.simpleMode(config, states); }); }; CodeMirror.simpleMode = function(config, states) { ensureState(states, "start"); var states_ = {}, meta = states.meta || {}, hasIndentation = false; for (var state in states) if (state != meta && states.hasOwnProperty(state)) { var list = states_[state] = [], orig = states[state]; for (var i = 0; i < orig.length; i++) { var data = orig[i]; list.push(new Rule(data, states)); if (data.indent || data.dedent) hasIndentation = true; } } var mode = { startState: function() { return {state: "start", pending: null, local: null, localState: null, indent: hasIndentation ? [] : null}; }, copyState: function(state) { var s = {state: state.state, pending: state.pending, local: state.local, localState: null, indent: state.indent && state.indent.slice(0)}; if (state.localState) s.localState = CodeMirror.copyState(state.local.mode, state.localState); if (state.stack) s.stack = state.stack.slice(0); for (var pers = state.persistentStates; pers; pers = pers.next) s.persistentStates = {mode: pers.mode, spec: pers.spec, state: pers.state == state.localState ? s.localState : CodeMirror.copyState(pers.mode, pers.state), next: s.persistentStates}; return s; }, token: tokenFunction(states_, config), innerMode: function(state) { return state.local && {mode: state.local.mode, state: state.localState}; }, indent: indentFunction(states_, meta) }; if (meta) for (var prop in meta) if (meta.hasOwnProperty(prop)) mode[prop] = meta[prop]; return mode; }; function ensureState(states, name) { if (!states.hasOwnProperty(name)) throw new Error("Undefined state " + name + "in simple mode"); } function toRegex(val, caret) { if (!val) return /(?:)/; var flags = ""; if (val instanceof RegExp) { if (val.ignoreCase) flags = "i"; val = val.source; } else { val = String(val); } return new RegExp((caret === false ? "" : "^") + "(?:" + val + ")", flags); } function asToken(val) { if (!val) return null; if (typeof val == "string") return val.replace(/\./g, " "); var result = []; for (var i = 0; i < val.length; i++) result.push(val[i] && val[i].replace(/\./g, " ")); return result; } function Rule(data, states) { if (data.next || data.push) ensureState(states, data.next || data.push); this.regex = toRegex(data.regex); this.token = asToken(data.token); this.data = data; } function tokenFunction(states, config) { return function(stream, state) { if (state.pending) { var pend = state.pending.shift(); if (state.pending.length == 0) state.pending = null; stream.pos += pend.text.length; return pend.token; } if (state.local) { if (state.local.end && stream.match(state.local.end)) { var tok = state.local.endToken || null; state.local = state.localState = null; return tok; } else { var tok = state.local.mode.token(stream, state.localState), m; if (state.local.endScan && (m = state.local.endScan.exec(stream.current()))) stream.pos = stream.start + m.index; return tok; } } var curState = states[state.state]; for (var i = 0; i < curState.length; i++) { var rule = curState[i]; var matches = (!rule.data.sol || stream.sol()) && stream.match(rule.regex); if (matches) { if (rule.data.next) { state.state = rule.data.next; } else if (rule.data.push) { (state.stack || (state.stack = [])).push(state.state); state.state = rule.data.push; } else if (rule.data.pop && state.stack && state.stack.length) { state.state = state.stack.pop(); } if (rule.data.mode) enterLocalMode(config, state, rule.data.mode, rule.token); if (rule.data.indent) state.indent.push(stream.indentation() + config.indentUnit); if (rule.data.dedent) state.indent.pop(); if (matches.length > 2) { state.pending = []; for (var j = 2; j < matches.length; j++) if (matches[j]) state.pending.push({text: matches[j], token: rule.token[j - 1]}); stream.backUp(matches[0].length - (matches[1] ? matches[1].length : 0)); return rule.token[0]; } else if (rule.token && rule.token.join) { return rule.token[0]; } else { return rule.token; } } } stream.next(); return null; }; } function cmp(a, b) { if (a === b) return true; if (!a || typeof a != "object" || !b || typeof b != "object") return false; var props = 0; for (var prop in a) if (a.hasOwnProperty(prop)) { if (!b.hasOwnProperty(prop) || !cmp(a[prop], b[prop])) return false; props++; } for (var prop in b) if (b.hasOwnProperty(prop)) props--; return props == 0; } function enterLocalMode(config, state, spec, token) { var pers; if (spec.persistent) for (var p = state.persistentStates; p && !pers; p = p.next) if (spec.spec ? cmp(spec.spec, p.spec) : spec.mode == p.mode) pers = p; var mode = pers ? pers.mode : spec.mode || CodeMirror.getMode(config, spec.spec); var lState = pers ? pers.state : CodeMirror.startState(mode); if (spec.persistent && !pers) state.persistentStates = {mode: mode, spec: spec.spec, state: lState, next: state.persistentStates}; state.localState = lState; state.local = {mode: mode, end: spec.end && toRegex(spec.end), endScan: spec.end && spec.forceEnd !== false && toRegex(spec.end, false), endToken: token && token.join ? token[token.length - 1] : token}; } function indexOf(val, arr) { for (var i = 0; i < arr.length; i++) if (arr[i] === val) return true; } function indentFunction(states, meta) { return function(state, textAfter, line) { if (state.local && state.local.mode.indent) return state.local.mode.indent(state.localState, textAfter, line); if (state.indent == null || state.local || meta.dontIndentStates && indexOf(state.state, meta.dontIndentStates) > -1) return CodeMirror.Pass; var pos = state.indent.length - 1, rules = states[state.state]; scan: for (;;) { for (var i = 0; i < rules.length; i++) { var rule = rules[i]; if (rule.data.dedent && rule.data.dedentIfLineStart !== false) { var m = rule.regex.exec(textAfter); if (m && m[0]) { pos--; if (rule.next || rule.push) rules = states[rule.next || rule.push]; textAfter = textAfter.slice(m[0].length); continue scan; } } } break; } return pos < 0 ? 0 : state.indent[pos]; }; } }); ================================================ FILE: base/res/codemirror/addon/runmode/colorize.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("./runmode")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "./runmode"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var isBlock = /^(p|li|div|h\\d|pre|blockquote|td)$/; function textContent(node, out) { if (node.nodeType == 3) return out.push(node.nodeValue); for (var ch = node.firstChild; ch; ch = ch.nextSibling) { textContent(ch, out); if (isBlock.test(node.nodeType)) out.push("\n"); } } CodeMirror.colorize = function(collection, defaultMode) { if (!collection) collection = document.body.getElementsByTagName("pre"); for (var i = 0; i < collection.length; ++i) { var node = collection[i]; var mode = node.getAttribute("data-lang") || defaultMode; if (!mode) continue; var text = []; textContent(node, text); node.innerHTML = ""; CodeMirror.runMode(text.join(""), mode, node); node.className += " cm-s-default"; } }; }); ================================================ FILE: base/res/codemirror/addon/runmode/runmode-standalone.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE window.CodeMirror = {}; (function() { "use strict"; function splitLines(string){ return string.split(/\r?\n|\r/); }; function StringStream(string) { this.pos = this.start = 0; this.string = string; this.lineStart = 0; } StringStream.prototype = { eol: function() {return this.pos >= this.string.length;}, sol: function() {return this.pos == 0;}, peek: function() {return this.string.charAt(this.pos) || null;}, next: function() { if (this.pos < this.string.length) return this.string.charAt(this.pos++); }, eat: function(match) { var ch = this.string.charAt(this.pos); if (typeof match == "string") var ok = ch == match; else var ok = ch && (match.test ? match.test(ch) : match(ch)); if (ok) {++this.pos; return ch;} }, eatWhile: function(match) { var start = this.pos; while (this.eat(match)){} return this.pos > start; }, eatSpace: function() { var start = this.pos; while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos; return this.pos > start; }, skipToEnd: function() {this.pos = this.string.length;}, skipTo: function(ch) { var found = this.string.indexOf(ch, this.pos); if (found > -1) {this.pos = found; return true;} }, backUp: function(n) {this.pos -= n;}, column: function() {return this.start - this.lineStart;}, indentation: function() {return 0;}, match: function(pattern, consume, caseInsensitive) { if (typeof pattern == "string") { var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;}; var substr = this.string.substr(this.pos, pattern.length); if (cased(substr) == cased(pattern)) { if (consume !== false) this.pos += pattern.length; return true; } } else { var match = this.string.slice(this.pos).match(pattern); if (match && match.index > 0) return null; if (match && consume !== false) this.pos += match[0].length; return match; } }, current: function(){return this.string.slice(this.start, this.pos);}, hideFirstChars: function(n, inner) { this.lineStart += n; try { return inner(); } finally { this.lineStart -= n; } } }; CodeMirror.StringStream = StringStream; CodeMirror.startState = function (mode, a1, a2) { return mode.startState ? mode.startState(a1, a2) : true; }; var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {}; CodeMirror.defineMode = function (name, mode) { if (arguments.length > 2) mode.dependencies = Array.prototype.slice.call(arguments, 2); modes[name] = mode; }; CodeMirror.defineMIME = function (mime, spec) { mimeModes[mime] = spec; }; CodeMirror.resolveMode = function(spec) { if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { spec = mimeModes[spec]; } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) { spec = mimeModes[spec.name]; } if (typeof spec == "string") return {name: spec}; else return spec || {name: "null"}; }; CodeMirror.getMode = function (options, spec) { spec = CodeMirror.resolveMode(spec); var mfactory = modes[spec.name]; if (!mfactory) throw new Error("Unknown mode: " + spec); return mfactory(options, spec); }; CodeMirror.registerHelper = CodeMirror.registerGlobalHelper = Math.min; CodeMirror.defineMode("null", function() { return {token: function(stream) {stream.skipToEnd();}}; }); CodeMirror.defineMIME("text/plain", "null"); CodeMirror.runMode = function (string, modespec, callback, options) { var mode = CodeMirror.getMode({ indentUnit: 2 }, modespec); if (callback.nodeType == 1) { var tabSize = (options && options.tabSize) || 4; var node = callback, col = 0; node.innerHTML = ""; callback = function (text, style) { if (text == "\n") { node.appendChild(document.createElement("br")); col = 0; return; } var content = ""; // replace tabs for (var pos = 0; ;) { var idx = text.indexOf("\t", pos); if (idx == -1) { content += text.slice(pos); col += text.length - pos; break; } else { col += idx - pos; content += text.slice(pos, idx); var size = tabSize - col % tabSize; col += size; for (var i = 0; i < size; ++i) content += " "; pos = idx + 1; } } if (style) { var sp = node.appendChild(document.createElement("span")); sp.className = "cm-" + style.replace(/ +/g, " cm-"); sp.appendChild(document.createTextNode(content)); } else { node.appendChild(document.createTextNode(content)); } }; } var lines = splitLines(string), state = (options && options.state) || CodeMirror.startState(mode); for (var i = 0, e = lines.length; i < e; ++i) { if (i) callback("\n"); var stream = new CodeMirror.StringStream(lines[i]); if (!stream.string && mode.blankLine) mode.blankLine(state); while (!stream.eol()) { var style = mode.token(stream, state); callback(stream.current(), style, i, stream.start, state); stream.start = stream.pos; } } }; })(); ================================================ FILE: base/res/codemirror/addon/runmode/runmode.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.runMode = function(string, modespec, callback, options) { var mode = CodeMirror.getMode(CodeMirror.defaults, modespec); var ie = /MSIE \d/.test(navigator.userAgent); var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9); if (callback.nodeType == 1) { var tabSize = (options && options.tabSize) || CodeMirror.defaults.tabSize; var node = callback, col = 0; node.innerHTML = ""; callback = function(text, style) { if (text == "\n") { // Emitting LF or CRLF on IE8 or earlier results in an incorrect display. // Emitting a carriage return makes everything ok. node.appendChild(document.createTextNode(ie_lt9 ? '\r' : text)); col = 0; return; } var content = ""; // replace tabs for (var pos = 0;;) { var idx = text.indexOf("\t", pos); if (idx == -1) { content += text.slice(pos); col += text.length - pos; break; } else { col += idx - pos; content += text.slice(pos, idx); var size = tabSize - col % tabSize; col += size; for (var i = 0; i < size; ++i) content += " "; pos = idx + 1; } } if (style) { var sp = node.appendChild(document.createElement("span")); sp.className = "cm-" + style.replace(/ +/g, " cm-"); sp.appendChild(document.createTextNode(content)); } else { node.appendChild(document.createTextNode(content)); } }; } var lines = CodeMirror.splitLines(string), state = (options && options.state) || CodeMirror.startState(mode); for (var i = 0, e = lines.length; i < e; ++i) { if (i) callback("\n"); var stream = new CodeMirror.StringStream(lines[i]); if (!stream.string && mode.blankLine) mode.blankLine(state); while (!stream.eol()) { var style = mode.token(stream, state); callback(stream.current(), style, i, stream.start, state); stream.start = stream.pos; } } }; }); ================================================ FILE: base/res/codemirror/addon/runmode/runmode.node.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /* Just enough of CodeMirror to run runMode under node.js */ // declare global: StringStream function splitLines(string){ return string.split(/\r?\n|\r/); }; function StringStream(string) { this.pos = this.start = 0; this.string = string; this.lineStart = 0; } StringStream.prototype = { eol: function() {return this.pos >= this.string.length;}, sol: function() {return this.pos == 0;}, peek: function() {return this.string.charAt(this.pos) || null;}, next: function() { if (this.pos < this.string.length) return this.string.charAt(this.pos++); }, eat: function(match) { var ch = this.string.charAt(this.pos); if (typeof match == "string") var ok = ch == match; else var ok = ch && (match.test ? match.test(ch) : match(ch)); if (ok) {++this.pos; return ch;} }, eatWhile: function(match) { var start = this.pos; while (this.eat(match)){} return this.pos > start; }, eatSpace: function() { var start = this.pos; while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos; return this.pos > start; }, skipToEnd: function() {this.pos = this.string.length;}, skipTo: function(ch) { var found = this.string.indexOf(ch, this.pos); if (found > -1) {this.pos = found; return true;} }, backUp: function(n) {this.pos -= n;}, column: function() {return this.start - this.lineStart;}, indentation: function() {return 0;}, match: function(pattern, consume, caseInsensitive) { if (typeof pattern == "string") { var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;}; var substr = this.string.substr(this.pos, pattern.length); if (cased(substr) == cased(pattern)) { if (consume !== false) this.pos += pattern.length; return true; } } else { var match = this.string.slice(this.pos).match(pattern); if (match && match.index > 0) return null; if (match && consume !== false) this.pos += match[0].length; return match; } }, current: function(){return this.string.slice(this.start, this.pos);}, hideFirstChars: function(n, inner) { this.lineStart += n; try { return inner(); } finally { this.lineStart -= n; } } }; exports.StringStream = StringStream; exports.startState = function(mode, a1, a2) { return mode.startState ? mode.startState(a1, a2) : true; }; var modes = exports.modes = {}, mimeModes = exports.mimeModes = {}; exports.defineMode = function(name, mode) { if (arguments.length > 2) mode.dependencies = Array.prototype.slice.call(arguments, 2); modes[name] = mode; }; exports.defineMIME = function(mime, spec) { mimeModes[mime] = spec; }; exports.defineMode("null", function() { return {token: function(stream) {stream.skipToEnd();}}; }); exports.defineMIME("text/plain", "null"); exports.resolveMode = function(spec) { if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { spec = mimeModes[spec]; } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) { spec = mimeModes[spec.name]; } if (typeof spec == "string") return {name: spec}; else return spec || {name: "null"}; }; exports.getMode = function(options, spec) { spec = exports.resolveMode(spec); var mfactory = modes[spec.name]; if (!mfactory) throw new Error("Unknown mode: " + spec); return mfactory(options, spec); }; exports.registerHelper = exports.registerGlobalHelper = Math.min; exports.runMode = function(string, modespec, callback, options) { var mode = exports.getMode({indentUnit: 2}, modespec); var lines = splitLines(string), state = (options && options.state) || exports.startState(mode); for (var i = 0, e = lines.length; i < e; ++i) { if (i) callback("\n"); var stream = new exports.StringStream(lines[i]); if (!stream.string && mode.blankLine) mode.blankLine(state); while (!stream.eol()) { var style = mode.token(stream, state); callback(stream.current(), style, i, stream.start, state); stream.start = stream.pos; } } }; require.cache[require.resolve("../../lib/codemirror")] = require.cache[require.resolve("./runmode.node")]; ================================================ FILE: base/res/codemirror/addon/scroll/annotatescrollbar.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineExtension("annotateScrollbar", function(options) { if (typeof options == "string") options = {className: options}; return new Annotation(this, options); }); CodeMirror.defineOption("scrollButtonHeight", 0); function Annotation(cm, options) { this.cm = cm; this.options = options; this.buttonHeight = options.scrollButtonHeight || cm.getOption("scrollButtonHeight"); this.annotations = []; this.doRedraw = this.doUpdate = null; this.div = cm.getWrapperElement().appendChild(document.createElement("div")); this.div.style.cssText = "position: absolute; right: 0; top: 0; z-index: 7; pointer-events: none"; this.computeScale(); function scheduleRedraw(delay) { clearTimeout(self.doRedraw); self.doRedraw = setTimeout(function() { self.redraw(); }, delay); } var self = this; cm.on("refresh", this.resizeHandler = function() { clearTimeout(self.doUpdate); self.doUpdate = setTimeout(function() { if (self.computeScale()) scheduleRedraw(20); }, 100); }); cm.on("markerAdded", this.resizeHandler); cm.on("markerCleared", this.resizeHandler); if (options.listenForChanges !== false) cm.on("change", this.changeHandler = function() { scheduleRedraw(250); }); } Annotation.prototype.computeScale = function() { var cm = this.cm; var hScale = (cm.getWrapperElement().clientHeight - cm.display.barHeight - this.buttonHeight * 2) / cm.heightAtLine(cm.lastLine() + 1, "local"); if (hScale != this.hScale) { this.hScale = hScale; return true; } }; Annotation.prototype.update = function(annotations) { this.annotations = annotations; this.redraw(); }; Annotation.prototype.redraw = function(compute) { if (compute !== false) this.computeScale(); var cm = this.cm, hScale = this.hScale; var frag = document.createDocumentFragment(), anns = this.annotations; var wrapping = cm.getOption("lineWrapping"); var singleLineH = wrapping && cm.defaultTextHeight() * 1.5; var curLine = null, curLineObj = null; function getY(pos, top) { if (curLine != pos.line) { curLine = pos.line; curLineObj = cm.getLineHandle(curLine); } if (wrapping && curLineObj.height > singleLineH) return cm.charCoords(pos, "local")[top ? "top" : "bottom"]; var topY = cm.heightAtLine(curLineObj, "local"); return topY + (top ? 0 : curLineObj.height); } if (cm.display.barWidth) for (var i = 0, nextTop; i < anns.length; i++) { var ann = anns[i]; var top = nextTop || getY(ann.from, true) * hScale; var bottom = getY(ann.to, false) * hScale; while (i < anns.length - 1) { nextTop = getY(anns[i + 1].from, true) * hScale; if (nextTop > bottom + .9) break; ann = anns[++i]; bottom = getY(ann.to, false) * hScale; } if (bottom == top) continue; var height = Math.max(bottom - top, 3); var elt = frag.appendChild(document.createElement("div")); elt.style.cssText = "position: absolute; right: 0px; width: " + Math.max(cm.display.barWidth - 1, 2) + "px; top: " + (top + this.buttonHeight) + "px; height: " + height + "px"; elt.className = this.options.className; } this.div.textContent = ""; this.div.appendChild(frag); }; Annotation.prototype.clear = function() { this.cm.off("refresh", this.resizeHandler); this.cm.off("markerAdded", this.resizeHandler); this.cm.off("markerCleared", this.resizeHandler); if (this.changeHandler) this.cm.off("change", this.changeHandler); this.div.parentNode.removeChild(this.div); }; }); ================================================ FILE: base/res/codemirror/addon/scroll/scrollpastend.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineOption("scrollPastEnd", false, function(cm, val, old) { if (old && old != CodeMirror.Init) { cm.off("change", onChange); cm.off("refresh", updateBottomMargin); cm.display.lineSpace.parentNode.style.paddingBottom = ""; cm.state.scrollPastEndPadding = null; } if (val) { cm.on("change", onChange); cm.on("refresh", updateBottomMargin); updateBottomMargin(cm); } }); function onChange(cm, change) { if (CodeMirror.changeEnd(change).line == cm.lastLine()) updateBottomMargin(cm); } function updateBottomMargin(cm) { var padding = ""; if (cm.lineCount() > 1) { var totalH = cm.display.scroller.clientHeight - 30, lastLineH = cm.getLineHandle(cm.lastLine()).height; padding = (totalH - lastLineH) + "px"; } if (cm.state.scrollPastEndPadding != padding) { cm.state.scrollPastEndPadding = padding; cm.display.lineSpace.parentNode.style.paddingBottom = padding; cm.setSize(); } } }); ================================================ FILE: base/res/codemirror/addon/scroll/simplescrollbars.css ================================================ .CodeMirror-simplescroll-horizontal div, .CodeMirror-simplescroll-vertical div { position: absolute; background: #ccc; -moz-box-sizing: border-box; box-sizing: border-box; border: 1px solid #bbb; border-radius: 2px; } .CodeMirror-simplescroll-horizontal, .CodeMirror-simplescroll-vertical { position: absolute; z-index: 6; background: #eee; } .CodeMirror-simplescroll-horizontal { bottom: 0; left: 0; height: 8px; } .CodeMirror-simplescroll-horizontal div { bottom: 0; height: 100%; } .CodeMirror-simplescroll-vertical { right: 0; top: 0; width: 8px; } .CodeMirror-simplescroll-vertical div { right: 0; width: 100%; } .CodeMirror-overlayscroll .CodeMirror-scrollbar-filler, .CodeMirror-overlayscroll .CodeMirror-gutter-filler { display: none; } .CodeMirror-overlayscroll-horizontal div, .CodeMirror-overlayscroll-vertical div { position: absolute; background: #bcd; border-radius: 3px; } .CodeMirror-overlayscroll-horizontal, .CodeMirror-overlayscroll-vertical { position: absolute; z-index: 6; } .CodeMirror-overlayscroll-horizontal { bottom: 0; left: 0; height: 6px; } .CodeMirror-overlayscroll-horizontal div { bottom: 0; height: 100%; } .CodeMirror-overlayscroll-vertical { right: 0; top: 0; width: 6px; } .CodeMirror-overlayscroll-vertical div { right: 0; width: 100%; } ================================================ FILE: base/res/codemirror/addon/scroll/simplescrollbars.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; function Bar(cls, orientation, scroll) { this.orientation = orientation; this.scroll = scroll; this.screen = this.total = this.size = 1; this.pos = 0; this.node = document.createElement("div"); this.node.className = cls + "-" + orientation; this.inner = this.node.appendChild(document.createElement("div")); var self = this; CodeMirror.on(this.inner, "mousedown", function(e) { if (e.which != 1) return; CodeMirror.e_preventDefault(e); var axis = self.orientation == "horizontal" ? "pageX" : "pageY"; var start = e[axis], startpos = self.pos; function done() { CodeMirror.off(document, "mousemove", move); CodeMirror.off(document, "mouseup", done); } function move(e) { if (e.which != 1) return done(); self.moveTo(startpos + (e[axis] - start) * (self.total / self.size)); } CodeMirror.on(document, "mousemove", move); CodeMirror.on(document, "mouseup", done); }); CodeMirror.on(this.node, "click", function(e) { CodeMirror.e_preventDefault(e); var innerBox = self.inner.getBoundingClientRect(), where; if (self.orientation == "horizontal") where = e.clientX < innerBox.left ? -1 : e.clientX > innerBox.right ? 1 : 0; else where = e.clientY < innerBox.top ? -1 : e.clientY > innerBox.bottom ? 1 : 0; self.moveTo(self.pos + where * self.screen); }); function onWheel(e) { var moved = CodeMirror.wheelEventPixels(e)[self.orientation == "horizontal" ? "x" : "y"]; var oldPos = self.pos; self.moveTo(self.pos + moved); if (self.pos != oldPos) CodeMirror.e_preventDefault(e); } CodeMirror.on(this.node, "mousewheel", onWheel); CodeMirror.on(this.node, "DOMMouseScroll", onWheel); } Bar.prototype.moveTo = function(pos, update) { if (pos < 0) pos = 0; if (pos > this.total - this.screen) pos = this.total - this.screen; if (pos == this.pos) return; this.pos = pos; this.inner.style[this.orientation == "horizontal" ? "left" : "top"] = (pos * (this.size / this.total)) + "px"; if (update !== false) this.scroll(pos, this.orientation); }; var minButtonSize = 10; Bar.prototype.update = function(scrollSize, clientSize, barSize) { this.screen = clientSize; this.total = scrollSize; this.size = barSize; var buttonSize = this.screen * (this.size / this.total); if (buttonSize < minButtonSize) { this.size -= minButtonSize - buttonSize; buttonSize = minButtonSize; } this.inner.style[this.orientation == "horizontal" ? "width" : "height"] = buttonSize + "px"; this.inner.style[this.orientation == "horizontal" ? "left" : "top"] = this.pos * (this.size / this.total) + "px"; }; function SimpleScrollbars(cls, place, scroll) { this.addClass = cls; this.horiz = new Bar(cls, "horizontal", scroll); place(this.horiz.node); this.vert = new Bar(cls, "vertical", scroll); place(this.vert.node); this.width = null; } SimpleScrollbars.prototype.update = function(measure) { if (this.width == null) { var style = window.getComputedStyle ? window.getComputedStyle(this.horiz.node) : this.horiz.node.currentStyle; if (style) this.width = parseInt(style.height); } var width = this.width || 0; var needsH = measure.scrollWidth > measure.clientWidth + 1; var needsV = measure.scrollHeight > measure.clientHeight + 1; this.vert.node.style.display = needsV ? "block" : "none"; this.horiz.node.style.display = needsH ? "block" : "none"; if (needsV) { this.vert.update(measure.scrollHeight, measure.clientHeight, measure.viewHeight - (needsH ? width : 0)); this.vert.node.style.display = "block"; this.vert.node.style.bottom = needsH ? width + "px" : "0"; } if (needsH) { this.horiz.update(measure.scrollWidth, measure.clientWidth, measure.viewWidth - (needsV ? width : 0) - measure.barLeft); this.horiz.node.style.right = needsV ? width + "px" : "0"; this.horiz.node.style.left = measure.barLeft + "px"; } return {right: needsV ? width : 0, bottom: needsH ? width : 0}; }; SimpleScrollbars.prototype.setScrollTop = function(pos) { this.vert.moveTo(pos, false); }; SimpleScrollbars.prototype.setScrollLeft = function(pos) { this.horiz.moveTo(pos, false); }; SimpleScrollbars.prototype.clear = function() { var parent = this.horiz.node.parentNode; parent.removeChild(this.horiz.node); parent.removeChild(this.vert.node); }; CodeMirror.scrollbarModel.simple = function(place, scroll) { return new SimpleScrollbars("CodeMirror-simplescroll", place, scroll); }; CodeMirror.scrollbarModel.overlay = function(place, scroll) { return new SimpleScrollbars("CodeMirror-overlayscroll", place, scroll); }; }); ================================================ FILE: base/res/codemirror/addon/search/match-highlighter.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Highlighting text that matches the selection // // Defines an option highlightSelectionMatches, which, when enabled, // will style strings that match the selection throughout the // document. // // The option can be set to true to simply enable it, or to a // {minChars, style, wordsOnly, showToken, delay} object to explicitly // configure it. minChars is the minimum amount of characters that should be // selected for the behavior to occur, and style is the token style to // apply to the matches. This will be prefixed by "cm-" to create an // actual CSS class name. If wordsOnly is enabled, the matches will be // highlighted only if the selected text is a word. showToken, when enabled, // will cause the current token to be highlighted when nothing is selected. // delay is used to specify how much time to wait, in milliseconds, before // highlighting the matches. (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var DEFAULT_MIN_CHARS = 2; var DEFAULT_TOKEN_STYLE = "matchhighlight"; var DEFAULT_DELAY = 100; var DEFAULT_WORDS_ONLY = false; function State(options) { if (typeof options == "object") { this.minChars = options.minChars; this.style = options.style; this.showToken = options.showToken; this.delay = options.delay; this.wordsOnly = options.wordsOnly; } if (this.style == null) this.style = DEFAULT_TOKEN_STYLE; if (this.minChars == null) this.minChars = DEFAULT_MIN_CHARS; if (this.delay == null) this.delay = DEFAULT_DELAY; if (this.wordsOnly == null) this.wordsOnly = DEFAULT_WORDS_ONLY; this.overlay = this.timeout = null; } CodeMirror.defineOption("highlightSelectionMatches", false, function(cm, val, old) { if (old && old != CodeMirror.Init) { var over = cm.state.matchHighlighter.overlay; if (over) cm.removeOverlay(over); clearTimeout(cm.state.matchHighlighter.timeout); cm.state.matchHighlighter = null; cm.off("cursorActivity", cursorActivity); } if (val) { cm.state.matchHighlighter = new State(val); highlightMatches(cm); cm.on("cursorActivity", cursorActivity); } }); function cursorActivity(cm) { var state = cm.state.matchHighlighter; clearTimeout(state.timeout); state.timeout = setTimeout(function() {highlightMatches(cm);}, state.delay); } function highlightMatches(cm) { cm.operation(function() { var state = cm.state.matchHighlighter; if (state.overlay) { cm.removeOverlay(state.overlay); state.overlay = null; } if (!cm.somethingSelected() && state.showToken) { var re = state.showToken === true ? /[\w$]/ : state.showToken; var cur = cm.getCursor(), line = cm.getLine(cur.line), start = cur.ch, end = start; while (start && re.test(line.charAt(start - 1))) --start; while (end < line.length && re.test(line.charAt(end))) ++end; if (start < end) cm.addOverlay(state.overlay = makeOverlay(line.slice(start, end), re, state.style)); return; } var from = cm.getCursor("from"), to = cm.getCursor("to"); if (from.line != to.line) return; if (state.wordsOnly && !isWord(cm, from, to)) return; var selection = cm.getRange(from, to).replace(/^\s+|\s+$/g, ""); if (selection.length >= state.minChars) cm.addOverlay(state.overlay = makeOverlay(selection, false, state.style)); }); } function isWord(cm, from, to) { var str = cm.getRange(from, to); if (str.match(/^\w+$/) !== null) { if (from.ch > 0) { var pos = {line: from.line, ch: from.ch - 1}; var chr = cm.getRange(pos, from); if (chr.match(/\W/) === null) return false; } if (to.ch < cm.getLine(from.line).length) { var pos = {line: to.line, ch: to.ch + 1}; var chr = cm.getRange(to, pos); if (chr.match(/\W/) === null) return false; } return true; } else return false; } function boundariesAround(stream, re) { return (!stream.start || !re.test(stream.string.charAt(stream.start - 1))) && (stream.pos == stream.string.length || !re.test(stream.string.charAt(stream.pos))); } function makeOverlay(query, hasBoundary, style) { return {token: function(stream) { if (stream.match(query) && (!hasBoundary || boundariesAround(stream, hasBoundary))) return style; stream.next(); stream.skipTo(query.charAt(0)) || stream.skipToEnd(); }}; } }); ================================================ FILE: base/res/codemirror/addon/search/matchesonscrollbar.css ================================================ .CodeMirror-search-match { background: gold; border-top: 1px solid orange; border-bottom: 1px solid orange; -moz-box-sizing: border-box; box-sizing: border-box; opacity: .5; } ================================================ FILE: base/res/codemirror/addon/search/matchesonscrollbar.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("./searchcursor"), require("../scroll/annotatescrollbar")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "./searchcursor", "../scroll/annotatescrollbar"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineExtension("showMatchesOnScrollbar", function(query, caseFold, options) { if (typeof options == "string") options = {className: options}; if (!options) options = {}; return new SearchAnnotation(this, query, caseFold, options); }); function SearchAnnotation(cm, query, caseFold, options) { this.cm = cm; this.options = options; var annotateOptions = {listenForChanges: false}; for (var prop in options) annotateOptions[prop] = options[prop]; if (!annotateOptions.className) annotateOptions.className = "CodeMirror-search-match"; this.annotation = cm.annotateScrollbar(annotateOptions); this.query = query; this.caseFold = caseFold; this.gap = {from: cm.firstLine(), to: cm.lastLine() + 1}; this.matches = []; this.update = null; this.findMatches(); this.annotation.update(this.matches); var self = this; cm.on("change", this.changeHandler = function(_cm, change) { self.onChange(change); }); } var MAX_MATCHES = 1000; SearchAnnotation.prototype.findMatches = function() { if (!this.gap) return; for (var i = 0; i < this.matches.length; i++) { var match = this.matches[i]; if (match.from.line >= this.gap.to) break; if (match.to.line >= this.gap.from) this.matches.splice(i--, 1); } var cursor = this.cm.getSearchCursor(this.query, CodeMirror.Pos(this.gap.from, 0), this.caseFold); var maxMatches = this.options && this.options.maxMatches || MAX_MATCHES; while (cursor.findNext()) { var match = {from: cursor.from(), to: cursor.to()}; if (match.from.line >= this.gap.to) break; this.matches.splice(i++, 0, match); if (this.matches.length > maxMatches) break; } this.gap = null; }; function offsetLine(line, changeStart, sizeChange) { if (line <= changeStart) return line; return Math.max(changeStart, line + sizeChange); } SearchAnnotation.prototype.onChange = function(change) { var startLine = change.from.line; var endLine = CodeMirror.changeEnd(change).line; var sizeChange = endLine - change.to.line; if (this.gap) { this.gap.from = Math.min(offsetLine(this.gap.from, startLine, sizeChange), change.from.line); this.gap.to = Math.max(offsetLine(this.gap.to, startLine, sizeChange), change.from.line); } else { this.gap = {from: change.from.line, to: endLine + 1}; } if (sizeChange) for (var i = 0; i < this.matches.length; i++) { var match = this.matches[i]; var newFrom = offsetLine(match.from.line, startLine, sizeChange); if (newFrom != match.from.line) match.from = CodeMirror.Pos(newFrom, match.from.ch); var newTo = offsetLine(match.to.line, startLine, sizeChange); if (newTo != match.to.line) match.to = CodeMirror.Pos(newTo, match.to.ch); } clearTimeout(this.update); var self = this; this.update = setTimeout(function() { self.updateAfterChange(); }, 250); }; SearchAnnotation.prototype.updateAfterChange = function() { this.findMatches(); this.annotation.update(this.matches); }; SearchAnnotation.prototype.clear = function() { this.cm.off("change", this.changeHandler); this.annotation.clear(); }; }); ================================================ FILE: base/res/codemirror/addon/search/search.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Define search commands. Depends on dialog.js or another // implementation of the openDialog method. // Replace works a little oddly -- it will do the replace on the next // Ctrl-G (or whatever is bound to findNext) press. You prevent a // replace by making sure the match is no longer selected when hitting // Ctrl-G. (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("./searchcursor"), require("../dialog/dialog")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "./searchcursor", "../dialog/dialog"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; function searchOverlay(query, caseInsensitive) { if (typeof query == "string") query = new RegExp(query.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"), caseInsensitive ? "gi" : "g"); else if (!query.global) query = new RegExp(query.source, query.ignoreCase ? "gi" : "g"); return {token: function(stream) { query.lastIndex = stream.pos; var match = query.exec(stream.string); if (match && match.index == stream.pos) { stream.pos += match[0].length; return "searching"; } else if (match) { stream.pos = match.index; } else { stream.skipToEnd(); } }}; } function SearchState() { this.posFrom = this.posTo = this.lastQuery = this.query = null; this.overlay = null; } function getSearchState(cm) { return cm.state.search || (cm.state.search = new SearchState()); } function queryCaseInsensitive(query) { return typeof query == "string" && query == query.toLowerCase(); } function getSearchCursor(cm, query, pos) { // Heuristic: if the query string is all lowercase, do a case insensitive search. return cm.getSearchCursor(query, pos, queryCaseInsensitive(query)); } function dialog(cm, text, shortText, deflt, f) { if (cm.openDialog) cm.openDialog(text, f, {value: deflt, selectValueOnOpen: true}); else f(prompt(shortText, deflt)); } function confirmDialog(cm, text, shortText, fs) { if (cm.openConfirm) cm.openConfirm(text, fs); else if (confirm(shortText)) fs[0](); } function parseQuery(query) { var isRE = query.match(/^\/(.*)\/([a-z]*)$/); if (isRE) { try { query = new RegExp(isRE[1], isRE[2].indexOf("i") == -1 ? "" : "i"); } catch(e) {} // Not a regular expression after all, do a string search } if (typeof query == "string" ? query == "" : query.test("")) query = /x^/; return query; } var queryDialog = 'Search: (Use /re/ syntax for regexp search)'; function doSearch(cm, rev) { var state = getSearchState(cm); if (state.query) return findNext(cm, rev); var q = cm.getSelection() || state.lastQuery; dialog(cm, queryDialog, "Search for:", q, function(query) { cm.operation(function() { if (!query || state.query) return; state.query = parseQuery(query); cm.removeOverlay(state.overlay, queryCaseInsensitive(state.query)); state.overlay = searchOverlay(state.query, queryCaseInsensitive(state.query)); cm.addOverlay(state.overlay); if (cm.showMatchesOnScrollbar) { if (state.annotate) { state.annotate.clear(); state.annotate = null; } state.annotate = cm.showMatchesOnScrollbar(state.query, queryCaseInsensitive(state.query)); } state.posFrom = state.posTo = cm.getCursor(); findNext(cm, rev); }); }); } function findNext(cm, rev) {cm.operation(function() { var state = getSearchState(cm); var cursor = getSearchCursor(cm, state.query, rev ? state.posFrom : state.posTo); if (!cursor.find(rev)) { cursor = getSearchCursor(cm, state.query, rev ? CodeMirror.Pos(cm.lastLine()) : CodeMirror.Pos(cm.firstLine(), 0)); if (!cursor.find(rev)) return; } cm.setSelection(cursor.from(), cursor.to()); cm.scrollIntoView({from: cursor.from(), to: cursor.to()}); state.posFrom = cursor.from(); state.posTo = cursor.to(); });} function clearSearch(cm) {cm.operation(function() { var state = getSearchState(cm); state.lastQuery = state.query; if (!state.query) return; state.query = null; cm.removeOverlay(state.overlay); if (state.annotate) { state.annotate.clear(); state.annotate = null; } });} var replaceQueryDialog = 'Replace: (Use /re/ syntax for regexp search)'; var replacementQueryDialog = 'With: '; var doReplaceConfirm = "Replace? "; function replace(cm, all) { if (cm.getOption("readOnly")) return; var query = cm.getSelection() || getSearchState().lastQuery; dialog(cm, replaceQueryDialog, "Replace:", query, function(query) { if (!query) return; query = parseQuery(query); dialog(cm, replacementQueryDialog, "Replace with:", "", function(text) { if (all) { cm.operation(function() { for (var cursor = getSearchCursor(cm, query); cursor.findNext();) { if (typeof query != "string") { var match = cm.getRange(cursor.from(), cursor.to()).match(query); cursor.replace(text.replace(/\$(\d)/g, function(_, i) {return match[i];})); } else cursor.replace(text); } }); } else { clearSearch(cm); var cursor = getSearchCursor(cm, query, cm.getCursor()); var advance = function() { var start = cursor.from(), match; if (!(match = cursor.findNext())) { cursor = getSearchCursor(cm, query); if (!(match = cursor.findNext()) || (start && cursor.from().line == start.line && cursor.from().ch == start.ch)) return; } cm.setSelection(cursor.from(), cursor.to()); cm.scrollIntoView({from: cursor.from(), to: cursor.to()}); confirmDialog(cm, doReplaceConfirm, "Replace?", [function() {doReplace(match);}, advance]); }; var doReplace = function(match) { cursor.replace(typeof query == "string" ? text : text.replace(/\$(\d)/g, function(_, i) {return match[i];})); advance(); }; advance(); } }); }); } CodeMirror.commands.find = function(cm) {clearSearch(cm); doSearch(cm);}; CodeMirror.commands.findNext = doSearch; CodeMirror.commands.findPrev = function(cm) {doSearch(cm, true);}; CodeMirror.commands.clearSearch = clearSearch; CodeMirror.commands.replace = replace; CodeMirror.commands.replaceAll = function(cm) {replace(cm, true);}; }); ================================================ FILE: base/res/codemirror/addon/search/searchcursor.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var Pos = CodeMirror.Pos; function SearchCursor(doc, query, pos, caseFold) { this.atOccurrence = false; this.doc = doc; if (caseFold == null && typeof query == "string") caseFold = false; pos = pos ? doc.clipPos(pos) : Pos(0, 0); this.pos = {from: pos, to: pos}; // The matches method is filled in based on the type of query. // It takes a position and a direction, and returns an object // describing the next occurrence of the query, or null if no // more matches were found. if (typeof query != "string") { // Regexp match if (!query.global) query = new RegExp(query.source, query.ignoreCase ? "ig" : "g"); this.matches = function(reverse, pos) { if (reverse) { query.lastIndex = 0; var line = doc.getLine(pos.line).slice(0, pos.ch), cutOff = 0, match, start; for (;;) { query.lastIndex = cutOff; var newMatch = query.exec(line); if (!newMatch) break; match = newMatch; start = match.index; cutOff = match.index + (match[0].length || 1); if (cutOff == line.length) break; } var matchLen = (match && match[0].length) || 0; if (!matchLen) { if (start == 0 && line.length == 0) {match = undefined;} else if (start != doc.getLine(pos.line).length) { matchLen++; } } } else { query.lastIndex = pos.ch; var line = doc.getLine(pos.line), match = query.exec(line); var matchLen = (match && match[0].length) || 0; var start = match && match.index; if (start + matchLen != line.length && !matchLen) matchLen = 1; } if (match && matchLen) return {from: Pos(pos.line, start), to: Pos(pos.line, start + matchLen), match: match}; }; } else { // String query var origQuery = query; if (caseFold) query = query.toLowerCase(); var fold = caseFold ? function(str){return str.toLowerCase();} : function(str){return str;}; var target = query.split("\n"); // Different methods for single-line and multi-line queries if (target.length == 1) { if (!query.length) { // Empty string would match anything and never progress, so // we define it to match nothing instead. this.matches = function() {}; } else { this.matches = function(reverse, pos) { if (reverse) { var orig = doc.getLine(pos.line).slice(0, pos.ch), line = fold(orig); var match = line.lastIndexOf(query); if (match > -1) { match = adjustPos(orig, line, match); return {from: Pos(pos.line, match), to: Pos(pos.line, match + origQuery.length)}; } } else { var orig = doc.getLine(pos.line).slice(pos.ch), line = fold(orig); var match = line.indexOf(query); if (match > -1) { match = adjustPos(orig, line, match) + pos.ch; return {from: Pos(pos.line, match), to: Pos(pos.line, match + origQuery.length)}; } } }; } } else { var origTarget = origQuery.split("\n"); this.matches = function(reverse, pos) { var last = target.length - 1; if (reverse) { if (pos.line - (target.length - 1) < doc.firstLine()) return; if (fold(doc.getLine(pos.line).slice(0, origTarget[last].length)) != target[target.length - 1]) return; var to = Pos(pos.line, origTarget[last].length); for (var ln = pos.line - 1, i = last - 1; i >= 1; --i, --ln) if (target[i] != fold(doc.getLine(ln))) return; var line = doc.getLine(ln), cut = line.length - origTarget[0].length; if (fold(line.slice(cut)) != target[0]) return; return {from: Pos(ln, cut), to: to}; } else { if (pos.line + (target.length - 1) > doc.lastLine()) return; var line = doc.getLine(pos.line), cut = line.length - origTarget[0].length; if (fold(line.slice(cut)) != target[0]) return; var from = Pos(pos.line, cut); for (var ln = pos.line + 1, i = 1; i < last; ++i, ++ln) if (target[i] != fold(doc.getLine(ln))) return; if (fold(doc.getLine(ln).slice(0, origTarget[last].length)) != target[last]) return; return {from: from, to: Pos(ln, origTarget[last].length)}; } }; } } } SearchCursor.prototype = { findNext: function() {return this.find(false);}, findPrevious: function() {return this.find(true);}, find: function(reverse) { var self = this, pos = this.doc.clipPos(reverse ? this.pos.from : this.pos.to); function savePosAndFail(line) { var pos = Pos(line, 0); self.pos = {from: pos, to: pos}; self.atOccurrence = false; return false; } for (;;) { if (this.pos = this.matches(reverse, pos)) { this.atOccurrence = true; return this.pos.match || true; } if (reverse) { if (!pos.line) return savePosAndFail(0); pos = Pos(pos.line-1, this.doc.getLine(pos.line-1).length); } else { var maxLine = this.doc.lineCount(); if (pos.line == maxLine - 1) return savePosAndFail(maxLine); pos = Pos(pos.line + 1, 0); } } }, from: function() {if (this.atOccurrence) return this.pos.from;}, to: function() {if (this.atOccurrence) return this.pos.to;}, replace: function(newText, origin) { if (!this.atOccurrence) return; var lines = CodeMirror.splitLines(newText); this.doc.replaceRange(lines, this.pos.from, this.pos.to, origin); this.pos.to = Pos(this.pos.from.line + lines.length - 1, lines[lines.length - 1].length + (lines.length == 1 ? this.pos.from.ch : 0)); } }; // Maps a position in a case-folded line back to a position in the original line // (compensating for codepoints increasing in number during folding) function adjustPos(orig, folded, pos) { if (orig.length == folded.length) return pos; for (var pos1 = Math.min(pos, orig.length);;) { var len1 = orig.slice(0, pos1).toLowerCase().length; if (len1 < pos) ++pos1; else if (len1 > pos) --pos1; else return pos1; } } CodeMirror.defineExtension("getSearchCursor", function(query, pos, caseFold) { return new SearchCursor(this.doc, query, pos, caseFold); }); CodeMirror.defineDocExtension("getSearchCursor", function(query, pos, caseFold) { return new SearchCursor(this, query, pos, caseFold); }); CodeMirror.defineExtension("selectMatches", function(query, caseFold) { var ranges = [], next; var cur = this.getSearchCursor(query, this.getCursor("from"), caseFold); while (next = cur.findNext()) { if (CodeMirror.cmpPos(cur.to(), this.getCursor("to")) > 0) break; ranges.push({anchor: cur.from(), head: cur.to()}); } if (ranges.length) this.setSelections(ranges, 0); }); }); ================================================ FILE: base/res/codemirror/addon/selection/active-line.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Because sometimes you need to style the cursor's line. // // Adds an option 'styleActiveLine' which, when enabled, gives the // active line's wrapping
the CSS class "CodeMirror-activeline", // and gives its background
the class "CodeMirror-activeline-background". (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var WRAP_CLASS = "CodeMirror-activeline"; var BACK_CLASS = "CodeMirror-activeline-background"; CodeMirror.defineOption("styleActiveLine", false, function(cm, val, old) { var prev = old && old != CodeMirror.Init; if (val && !prev) { cm.state.activeLines = []; updateActiveLines(cm, cm.listSelections()); cm.on("beforeSelectionChange", selectionChange); } else if (!val && prev) { cm.off("beforeSelectionChange", selectionChange); clearActiveLines(cm); delete cm.state.activeLines; } }); function clearActiveLines(cm) { for (var i = 0; i < cm.state.activeLines.length; i++) { cm.removeLineClass(cm.state.activeLines[i], "wrap", WRAP_CLASS); cm.removeLineClass(cm.state.activeLines[i], "background", BACK_CLASS); } } function sameArray(a, b) { if (a.length != b.length) return false; for (var i = 0; i < a.length; i++) if (a[i] != b[i]) return false; return true; } function updateActiveLines(cm, ranges) { var active = []; for (var i = 0; i < ranges.length; i++) { var range = ranges[i]; if (!range.empty()) continue; var line = cm.getLineHandleVisualStart(range.head.line); if (active[active.length - 1] != line) active.push(line); } if (sameArray(cm.state.activeLines, active)) return; cm.operation(function() { clearActiveLines(cm); for (var i = 0; i < active.length; i++) { cm.addLineClass(active[i], "wrap", WRAP_CLASS); cm.addLineClass(active[i], "background", BACK_CLASS); } cm.state.activeLines = active; }); } function selectionChange(cm, sel) { updateActiveLines(cm, sel.ranges); } }); ================================================ FILE: base/res/codemirror/addon/selection/mark-selection.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Because sometimes you need to mark the selected *text*. // // Adds an option 'styleSelectedText' which, when enabled, gives // selected text the CSS class given as option value, or // "CodeMirror-selectedtext" when the value is not a string. (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineOption("styleSelectedText", false, function(cm, val, old) { var prev = old && old != CodeMirror.Init; if (val && !prev) { cm.state.markedSelection = []; cm.state.markedSelectionStyle = typeof val == "string" ? val : "CodeMirror-selectedtext"; reset(cm); cm.on("cursorActivity", onCursorActivity); cm.on("change", onChange); } else if (!val && prev) { cm.off("cursorActivity", onCursorActivity); cm.off("change", onChange); clear(cm); cm.state.markedSelection = cm.state.markedSelectionStyle = null; } }); function onCursorActivity(cm) { cm.operation(function() { update(cm); }); } function onChange(cm) { if (cm.state.markedSelection.length) cm.operation(function() { clear(cm); }); } var CHUNK_SIZE = 8; var Pos = CodeMirror.Pos; var cmp = CodeMirror.cmpPos; function coverRange(cm, from, to, addAt) { if (cmp(from, to) == 0) return; var array = cm.state.markedSelection; var cls = cm.state.markedSelectionStyle; for (var line = from.line;;) { var start = line == from.line ? from : Pos(line, 0); var endLine = line + CHUNK_SIZE, atEnd = endLine >= to.line; var end = atEnd ? to : Pos(endLine, 0); var mark = cm.markText(start, end, {className: cls}); if (addAt == null) array.push(mark); else array.splice(addAt++, 0, mark); if (atEnd) break; line = endLine; } } function clear(cm) { var array = cm.state.markedSelection; for (var i = 0; i < array.length; ++i) array[i].clear(); array.length = 0; } function reset(cm) { clear(cm); var ranges = cm.listSelections(); for (var i = 0; i < ranges.length; i++) coverRange(cm, ranges[i].from(), ranges[i].to()); } function update(cm) { if (!cm.somethingSelected()) return clear(cm); if (cm.listSelections().length > 1) return reset(cm); var from = cm.getCursor("start"), to = cm.getCursor("end"); var array = cm.state.markedSelection; if (!array.length) return coverRange(cm, from, to); var coverStart = array[0].find(), coverEnd = array[array.length - 1].find(); if (!coverStart || !coverEnd || to.line - from.line < CHUNK_SIZE || cmp(from, coverEnd.to) >= 0 || cmp(to, coverStart.from) <= 0) return reset(cm); while (cmp(from, coverStart.from) > 0) { array.shift().clear(); coverStart = array[0].find(); } if (cmp(from, coverStart.from) < 0) { if (coverStart.to.line - from.line < CHUNK_SIZE) { array.shift().clear(); coverRange(cm, from, coverStart.to, 0); } else { coverRange(cm, from, coverStart.from, 0); } } while (cmp(to, coverEnd.to) < 0) { array.pop().clear(); coverEnd = array[array.length - 1].find(); } if (cmp(to, coverEnd.to) > 0) { if (to.line - coverEnd.from.line < CHUNK_SIZE) { array.pop().clear(); coverRange(cm, coverEnd.from, to); } else { coverRange(cm, coverEnd.to, to); } } } }); ================================================ FILE: base/res/codemirror/addon/selection/selection-pointer.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineOption("selectionPointer", false, function(cm, val) { var data = cm.state.selectionPointer; if (data) { CodeMirror.off(cm.getWrapperElement(), "mousemove", data.mousemove); CodeMirror.off(cm.getWrapperElement(), "mouseout", data.mouseout); CodeMirror.off(window, "scroll", data.windowScroll); cm.off("cursorActivity", reset); cm.off("scroll", reset); cm.state.selectionPointer = null; cm.display.lineDiv.style.cursor = ""; } if (val) { data = cm.state.selectionPointer = { value: typeof val == "string" ? val : "default", mousemove: function(event) { mousemove(cm, event); }, mouseout: function(event) { mouseout(cm, event); }, windowScroll: function() { reset(cm); }, rects: null, mouseX: null, mouseY: null, willUpdate: false }; CodeMirror.on(cm.getWrapperElement(), "mousemove", data.mousemove); CodeMirror.on(cm.getWrapperElement(), "mouseout", data.mouseout); CodeMirror.on(window, "scroll", data.windowScroll); cm.on("cursorActivity", reset); cm.on("scroll", reset); } }); function mousemove(cm, event) { var data = cm.state.selectionPointer; if (event.buttons == null ? event.which : event.buttons) { data.mouseX = data.mouseY = null; } else { data.mouseX = event.clientX; data.mouseY = event.clientY; } scheduleUpdate(cm); } function mouseout(cm, event) { if (!cm.getWrapperElement().contains(event.relatedTarget)) { var data = cm.state.selectionPointer; data.mouseX = data.mouseY = null; scheduleUpdate(cm); } } function reset(cm) { cm.state.selectionPointer.rects = null; scheduleUpdate(cm); } function scheduleUpdate(cm) { if (!cm.state.selectionPointer.willUpdate) { cm.state.selectionPointer.willUpdate = true; setTimeout(function() { update(cm); cm.state.selectionPointer.willUpdate = false; }, 50); } } function update(cm) { var data = cm.state.selectionPointer; if (!data) return; if (data.rects == null && data.mouseX != null) { data.rects = []; if (cm.somethingSelected()) { for (var sel = cm.display.selectionDiv.firstChild; sel; sel = sel.nextSibling) data.rects.push(sel.getBoundingClientRect()); } } var inside = false; if (data.mouseX != null) for (var i = 0; i < data.rects.length; i++) { var rect = data.rects[i]; if (rect.left <= data.mouseX && rect.right >= data.mouseX && rect.top <= data.mouseY && rect.bottom >= data.mouseY) inside = true; } var cursor = inside ? data.value : ""; if (cm.display.lineDiv.style.cursor != cursor) cm.display.lineDiv.style.cursor = cursor; } }); ================================================ FILE: base/res/codemirror/addon/tern/tern.css ================================================ .CodeMirror-Tern-completion { padding-left: 22px; position: relative; } .CodeMirror-Tern-completion:before { position: absolute; left: 2px; bottom: 2px; border-radius: 50%; font-size: 12px; font-weight: bold; height: 15px; width: 15px; line-height: 16px; text-align: center; color: white; -moz-box-sizing: border-box; box-sizing: border-box; } .CodeMirror-Tern-completion-unknown:before { content: "?"; background: #4bb; } .CodeMirror-Tern-completion-object:before { content: "O"; background: #77c; } .CodeMirror-Tern-completion-fn:before { content: "F"; background: #7c7; } .CodeMirror-Tern-completion-array:before { content: "A"; background: #c66; } .CodeMirror-Tern-completion-number:before { content: "1"; background: #999; } .CodeMirror-Tern-completion-string:before { content: "S"; background: #999; } .CodeMirror-Tern-completion-bool:before { content: "B"; background: #999; } .CodeMirror-Tern-completion-guess { color: #999; } .CodeMirror-Tern-tooltip { border: 1px solid silver; border-radius: 3px; color: #444; padding: 2px 5px; font-size: 90%; font-family: monospace; background-color: white; white-space: pre-wrap; max-width: 40em; position: absolute; z-index: 10; -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2); -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2); box-shadow: 2px 3px 5px rgba(0,0,0,.2); transition: opacity 1s; transition: opacity 1s; -webkit-transition: opacity 1s; -o-transition: opacity 1s; -ms-transition: opacity 1s; } .CodeMirror-Tern-hint-doc { max-width: 25em; margin-top: -3px; } .CodeMirror-Tern-fname { color: black; } .CodeMirror-Tern-farg { color: #70a; } .CodeMirror-Tern-farg-current { text-decoration: underline; } .CodeMirror-Tern-type { color: #07c; } .CodeMirror-Tern-fhint-guess { opacity: .7; } ================================================ FILE: base/res/codemirror/addon/tern/tern.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Glue code between CodeMirror and Tern. // // Create a CodeMirror.TernServer to wrap an actual Tern server, // register open documents (CodeMirror.Doc instances) with it, and // call its methods to activate the assisting functions that Tern // provides. // // Options supported (all optional): // * defs: An array of JSON definition data structures. // * plugins: An object mapping plugin names to configuration // options. // * getFile: A function(name, c) that can be used to access files in // the project that haven't been loaded yet. Simply do c(null) to // indicate that a file is not available. // * fileFilter: A function(value, docName, doc) that will be applied // to documents before passing them on to Tern. // * switchToDoc: A function(name, doc) that should, when providing a // multi-file view, switch the view or focus to the named file. // * showError: A function(editor, message) that can be used to // override the way errors are displayed. // * completionTip: Customize the content in tooltips for completions. // Is passed a single argument—the completion's data as returned by // Tern—and may return a string, DOM node, or null to indicate that // no tip should be shown. By default the docstring is shown. // * typeTip: Like completionTip, but for the tooltips shown for type // queries. // * responseFilter: A function(doc, query, request, error, data) that // will be applied to the Tern responses before treating them // // // It is possible to run the Tern server in a web worker by specifying // these additional options: // * useWorker: Set to true to enable web worker mode. You'll probably // want to feature detect the actual value you use here, for example // !!window.Worker. // * workerScript: The main script of the worker. Point this to // wherever you are hosting worker.js from this directory. // * workerDeps: An array of paths pointing (relative to workerScript) // to the Acorn and Tern libraries and any Tern plugins you want to // load. Or, if you minified those into a single script and included // them in the workerScript, simply leave this undefined. (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; // declare global: tern CodeMirror.TernServer = function(options) { var self = this; this.options = options || {}; var plugins = this.options.plugins || (this.options.plugins = {}); if (!plugins.doc_comment) plugins.doc_comment = true; if (this.options.useWorker) { this.server = new WorkerServer(this); } else { this.server = new tern.Server({ getFile: function(name, c) { return getFile(self, name, c); }, async: true, defs: this.options.defs || [], plugins: plugins }); } this.docs = Object.create(null); this.trackChange = function(doc, change) { trackChange(self, doc, change); }; this.cachedArgHints = null; this.activeArgHints = null; this.jumpStack = []; this.getHint = function(cm, c) { return hint(self, cm, c); }; this.getHint.async = true; }; CodeMirror.TernServer.prototype = { addDoc: function(name, doc) { var data = {doc: doc, name: name, changed: null}; this.server.addFile(name, docValue(this, data)); CodeMirror.on(doc, "change", this.trackChange); return this.docs[name] = data; }, delDoc: function(id) { var found = resolveDoc(this, id); if (!found) return; CodeMirror.off(found.doc, "change", this.trackChange); delete this.docs[found.name]; this.server.delFile(found.name); }, hideDoc: function(id) { closeArgHints(this); var found = resolveDoc(this, id); if (found && found.changed) sendDoc(this, found); }, complete: function(cm) { cm.showHint({hint: this.getHint}); }, showType: function(cm, pos, c) { showContextInfo(this, cm, pos, "type", c); }, showDocs: function(cm, pos, c) { showContextInfo(this, cm, pos, "documentation", c); }, updateArgHints: function(cm) { updateArgHints(this, cm); }, jumpToDef: function(cm) { jumpToDef(this, cm); }, jumpBack: function(cm) { jumpBack(this, cm); }, rename: function(cm) { rename(this, cm); }, selectName: function(cm) { selectName(this, cm); }, request: function (cm, query, c, pos) { var self = this; var doc = findDoc(this, cm.getDoc()); var request = buildRequest(this, doc, query, pos); this.server.request(request, function (error, data) { if (!error && self.options.responseFilter) data = self.options.responseFilter(doc, query, request, error, data); c(error, data); }); }, destroy: function () { if (this.worker) { this.worker.terminate(); this.worker = null; } } }; var Pos = CodeMirror.Pos; var cls = "CodeMirror-Tern-"; var bigDoc = 250; function getFile(ts, name, c) { var buf = ts.docs[name]; if (buf) c(docValue(ts, buf)); else if (ts.options.getFile) ts.options.getFile(name, c); else c(null); } function findDoc(ts, doc, name) { for (var n in ts.docs) { var cur = ts.docs[n]; if (cur.doc == doc) return cur; } if (!name) for (var i = 0;; ++i) { n = "[doc" + (i || "") + "]"; if (!ts.docs[n]) { name = n; break; } } return ts.addDoc(name, doc); } function resolveDoc(ts, id) { if (typeof id == "string") return ts.docs[id]; if (id instanceof CodeMirror) id = id.getDoc(); if (id instanceof CodeMirror.Doc) return findDoc(ts, id); } function trackChange(ts, doc, change) { var data = findDoc(ts, doc); var argHints = ts.cachedArgHints; if (argHints && argHints.doc == doc && cmpPos(argHints.start, change.to) <= 0) ts.cachedArgHints = null; var changed = data.changed; if (changed == null) data.changed = changed = {from: change.from.line, to: change.from.line}; var end = change.from.line + (change.text.length - 1); if (change.from.line < changed.to) changed.to = changed.to - (change.to.line - end); if (end >= changed.to) changed.to = end + 1; if (changed.from > change.from.line) changed.from = change.from.line; if (doc.lineCount() > bigDoc && change.to - changed.from > 100) setTimeout(function() { if (data.changed && data.changed.to - data.changed.from > 100) sendDoc(ts, data); }, 200); } function sendDoc(ts, doc) { ts.server.request({files: [{type: "full", name: doc.name, text: docValue(ts, doc)}]}, function(error) { if (error) window.console.error(error); else doc.changed = null; }); } // Completion function hint(ts, cm, c) { ts.request(cm, {type: "completions", types: true, docs: true, urls: true}, function(error, data) { if (error) return showError(ts, cm, error); var completions = [], after = ""; var from = data.start, to = data.end; if (cm.getRange(Pos(from.line, from.ch - 2), from) == "[\"" && cm.getRange(to, Pos(to.line, to.ch + 2)) != "\"]") after = "\"]"; for (var i = 0; i < data.completions.length; ++i) { var completion = data.completions[i], className = typeToIcon(completion.type); if (data.guess) className += " " + cls + "guess"; completions.push({text: completion.name + after, displayText: completion.name, className: className, data: completion}); } var obj = {from: from, to: to, list: completions}; var tooltip = null; CodeMirror.on(obj, "close", function() { remove(tooltip); }); CodeMirror.on(obj, "update", function() { remove(tooltip); }); CodeMirror.on(obj, "select", function(cur, node) { remove(tooltip); var content = ts.options.completionTip ? ts.options.completionTip(cur.data) : cur.data.doc; if (content) { tooltip = makeTooltip(node.parentNode.getBoundingClientRect().right + window.pageXOffset, node.getBoundingClientRect().top + window.pageYOffset, content); tooltip.className += " " + cls + "hint-doc"; } }); c(obj); }); } function typeToIcon(type) { var suffix; if (type == "?") suffix = "unknown"; else if (type == "number" || type == "string" || type == "bool") suffix = type; else if (/^fn\(/.test(type)) suffix = "fn"; else if (/^\[/.test(type)) suffix = "array"; else suffix = "object"; return cls + "completion " + cls + "completion-" + suffix; } // Type queries function showContextInfo(ts, cm, pos, queryName, c) { ts.request(cm, queryName, function(error, data) { if (error) return showError(ts, cm, error); if (ts.options.typeTip) { var tip = ts.options.typeTip(data); } else { var tip = elt("span", null, elt("strong", null, data.type || "not found")); if (data.doc) tip.appendChild(document.createTextNode(" — " + data.doc)); if (data.url) { tip.appendChild(document.createTextNode(" ")); var child = tip.appendChild(elt("a", null, "[docs]")); child.href = data.url; child.target = "_blank"; } } tempTooltip(cm, tip); if (c) c(); }, pos); } // Maintaining argument hints function updateArgHints(ts, cm) { closeArgHints(ts); if (cm.somethingSelected()) return; var state = cm.getTokenAt(cm.getCursor()).state; var inner = CodeMirror.innerMode(cm.getMode(), state); if (inner.mode.name != "javascript") return; var lex = inner.state.lexical; if (lex.info != "call") return; var ch, argPos = lex.pos || 0, tabSize = cm.getOption("tabSize"); for (var line = cm.getCursor().line, e = Math.max(0, line - 9), found = false; line >= e; --line) { var str = cm.getLine(line), extra = 0; for (var pos = 0;;) { var tab = str.indexOf("\t", pos); if (tab == -1) break; extra += tabSize - (tab + extra) % tabSize - 1; pos = tab + 1; } ch = lex.column - extra; if (str.charAt(ch) == "(") {found = true; break;} } if (!found) return; var start = Pos(line, ch); var cache = ts.cachedArgHints; if (cache && cache.doc == cm.getDoc() && cmpPos(start, cache.start) == 0) return showArgHints(ts, cm, argPos); ts.request(cm, {type: "type", preferFunction: true, end: start}, function(error, data) { if (error || !data.type || !(/^fn\(/).test(data.type)) return; ts.cachedArgHints = { start: pos, type: parseFnType(data.type), name: data.exprName || data.name || "fn", guess: data.guess, doc: cm.getDoc() }; showArgHints(ts, cm, argPos); }); } function showArgHints(ts, cm, pos) { closeArgHints(ts); var cache = ts.cachedArgHints, tp = cache.type; var tip = elt("span", cache.guess ? cls + "fhint-guess" : null, elt("span", cls + "fname", cache.name), "("); for (var i = 0; i < tp.args.length; ++i) { if (i) tip.appendChild(document.createTextNode(", ")); var arg = tp.args[i]; tip.appendChild(elt("span", cls + "farg" + (i == pos ? " " + cls + "farg-current" : ""), arg.name || "?")); if (arg.type != "?") { tip.appendChild(document.createTextNode(":\u00a0")); tip.appendChild(elt("span", cls + "type", arg.type)); } } tip.appendChild(document.createTextNode(tp.rettype ? ") ->\u00a0" : ")")); if (tp.rettype) tip.appendChild(elt("span", cls + "type", tp.rettype)); var place = cm.cursorCoords(null, "page"); ts.activeArgHints = makeTooltip(place.right + 1, place.bottom, tip); } function parseFnType(text) { var args = [], pos = 3; function skipMatching(upto) { var depth = 0, start = pos; for (;;) { var next = text.charAt(pos); if (upto.test(next) && !depth) return text.slice(start, pos); if (/[{\[\(]/.test(next)) ++depth; else if (/[}\]\)]/.test(next)) --depth; ++pos; } } // Parse arguments if (text.charAt(pos) != ")") for (;;) { var name = text.slice(pos).match(/^([^, \(\[\{]+): /); if (name) { pos += name[0].length; name = name[1]; } args.push({name: name, type: skipMatching(/[\),]/)}); if (text.charAt(pos) == ")") break; pos += 2; } var rettype = text.slice(pos).match(/^\) -> (.*)$/); return {args: args, rettype: rettype && rettype[1]}; } // Moving to the definition of something function jumpToDef(ts, cm) { function inner(varName) { var req = {type: "definition", variable: varName || null}; var doc = findDoc(ts, cm.getDoc()); ts.server.request(buildRequest(ts, doc, req), function(error, data) { if (error) return showError(ts, cm, error); if (!data.file && data.url) { window.open(data.url); return; } if (data.file) { var localDoc = ts.docs[data.file], found; if (localDoc && (found = findContext(localDoc.doc, data))) { ts.jumpStack.push({file: doc.name, start: cm.getCursor("from"), end: cm.getCursor("to")}); moveTo(ts, doc, localDoc, found.start, found.end); return; } } showError(ts, cm, "Could not find a definition."); }); } if (!atInterestingExpression(cm)) dialog(cm, "Jump to variable", function(name) { if (name) inner(name); }); else inner(); } function jumpBack(ts, cm) { var pos = ts.jumpStack.pop(), doc = pos && ts.docs[pos.file]; if (!doc) return; moveTo(ts, findDoc(ts, cm.getDoc()), doc, pos.start, pos.end); } function moveTo(ts, curDoc, doc, start, end) { doc.doc.setSelection(start, end); if (curDoc != doc && ts.options.switchToDoc) { closeArgHints(ts); ts.options.switchToDoc(doc.name, doc.doc); } } // The {line,ch} representation of positions makes this rather awkward. function findContext(doc, data) { var before = data.context.slice(0, data.contextOffset).split("\n"); var startLine = data.start.line - (before.length - 1); var start = Pos(startLine, (before.length == 1 ? data.start.ch : doc.getLine(startLine).length) - before[0].length); var text = doc.getLine(startLine).slice(start.ch); for (var cur = startLine + 1; cur < doc.lineCount() && text.length < data.context.length; ++cur) text += "\n" + doc.getLine(cur); if (text.slice(0, data.context.length) == data.context) return data; var cursor = doc.getSearchCursor(data.context, 0, false); var nearest, nearestDist = Infinity; while (cursor.findNext()) { var from = cursor.from(), dist = Math.abs(from.line - start.line) * 10000; if (!dist) dist = Math.abs(from.ch - start.ch); if (dist < nearestDist) { nearest = from; nearestDist = dist; } } if (!nearest) return null; if (before.length == 1) nearest.ch += before[0].length; else nearest = Pos(nearest.line + (before.length - 1), before[before.length - 1].length); if (data.start.line == data.end.line) var end = Pos(nearest.line, nearest.ch + (data.end.ch - data.start.ch)); else var end = Pos(nearest.line + (data.end.line - data.start.line), data.end.ch); return {start: nearest, end: end}; } function atInterestingExpression(cm) { var pos = cm.getCursor("end"), tok = cm.getTokenAt(pos); if (tok.start < pos.ch && (tok.type == "comment" || tok.type == "string")) return false; return /[\w)\]]/.test(cm.getLine(pos.line).slice(Math.max(pos.ch - 1, 0), pos.ch + 1)); } // Variable renaming function rename(ts, cm) { var token = cm.getTokenAt(cm.getCursor()); if (!/\w/.test(token.string)) return showError(ts, cm, "Not at a variable"); dialog(cm, "New name for " + token.string, function(newName) { ts.request(cm, {type: "rename", newName: newName, fullDocs: true}, function(error, data) { if (error) return showError(ts, cm, error); applyChanges(ts, data.changes); }); }); } function selectName(ts, cm) { var name = findDoc(ts, cm.doc).name; ts.request(cm, {type: "refs"}, function(error, data) { if (error) return showError(ts, cm, error); var ranges = [], cur = 0; for (var i = 0; i < data.refs.length; i++) { var ref = data.refs[i]; if (ref.file == name) { ranges.push({anchor: ref.start, head: ref.end}); if (cmpPos(cur, ref.start) >= 0 && cmpPos(cur, ref.end) <= 0) cur = ranges.length - 1; } } cm.setSelections(ranges, cur); }); } var nextChangeOrig = 0; function applyChanges(ts, changes) { var perFile = Object.create(null); for (var i = 0; i < changes.length; ++i) { var ch = changes[i]; (perFile[ch.file] || (perFile[ch.file] = [])).push(ch); } for (var file in perFile) { var known = ts.docs[file], chs = perFile[file];; if (!known) continue; chs.sort(function(a, b) { return cmpPos(b.start, a.start); }); var origin = "*rename" + (++nextChangeOrig); for (var i = 0; i < chs.length; ++i) { var ch = chs[i]; known.doc.replaceRange(ch.text, ch.start, ch.end, origin); } } } // Generic request-building helper function buildRequest(ts, doc, query, pos) { var files = [], offsetLines = 0, allowFragments = !query.fullDocs; if (!allowFragments) delete query.fullDocs; if (typeof query == "string") query = {type: query}; query.lineCharPositions = true; if (query.end == null) { query.end = pos || doc.doc.getCursor("end"); if (doc.doc.somethingSelected()) query.start = doc.doc.getCursor("start"); } var startPos = query.start || query.end; if (doc.changed) { if (doc.doc.lineCount() > bigDoc && allowFragments !== false && doc.changed.to - doc.changed.from < 100 && doc.changed.from <= startPos.line && doc.changed.to > query.end.line) { files.push(getFragmentAround(doc, startPos, query.end)); query.file = "#0"; var offsetLines = files[0].offsetLines; if (query.start != null) query.start = Pos(query.start.line - -offsetLines, query.start.ch); query.end = Pos(query.end.line - offsetLines, query.end.ch); } else { files.push({type: "full", name: doc.name, text: docValue(ts, doc)}); query.file = doc.name; doc.changed = null; } } else { query.file = doc.name; } for (var name in ts.docs) { var cur = ts.docs[name]; if (cur.changed && cur != doc) { files.push({type: "full", name: cur.name, text: docValue(ts, cur)}); cur.changed = null; } } return {query: query, files: files}; } function getFragmentAround(data, start, end) { var doc = data.doc; var minIndent = null, minLine = null, endLine, tabSize = 4; for (var p = start.line - 1, min = Math.max(0, p - 50); p >= min; --p) { var line = doc.getLine(p), fn = line.search(/\bfunction\b/); if (fn < 0) continue; var indent = CodeMirror.countColumn(line, null, tabSize); if (minIndent != null && minIndent <= indent) continue; minIndent = indent; minLine = p; } if (minLine == null) minLine = min; var max = Math.min(doc.lastLine(), end.line + 20); if (minIndent == null || minIndent == CodeMirror.countColumn(doc.getLine(start.line), null, tabSize)) endLine = max; else for (endLine = end.line + 1; endLine < max; ++endLine) { var indent = CodeMirror.countColumn(doc.getLine(endLine), null, tabSize); if (indent <= minIndent) break; } var from = Pos(minLine, 0); return {type: "part", name: data.name, offsetLines: from.line, text: doc.getRange(from, Pos(endLine, 0))}; } // Generic utilities var cmpPos = CodeMirror.cmpPos; function elt(tagname, cls /*, ... elts*/) { var e = document.createElement(tagname); if (cls) e.className = cls; for (var i = 2; i < arguments.length; ++i) { var elt = arguments[i]; if (typeof elt == "string") elt = document.createTextNode(elt); e.appendChild(elt); } return e; } function dialog(cm, text, f) { if (cm.openDialog) cm.openDialog(text + ": ", f); else f(prompt(text, "")); } // Tooltips function tempTooltip(cm, content) { if (cm.state.ternTooltip) remove(cm.state.ternTooltip); var where = cm.cursorCoords(); var tip = cm.state.ternTooltip = makeTooltip(where.right + 1, where.bottom, content); function maybeClear() { old = true; if (!mouseOnTip) clear(); } function clear() { cm.state.ternTooltip = null; if (!tip.parentNode) return; cm.off("cursorActivity", clear); cm.off('blur', clear); cm.off('scroll', clear); fadeOut(tip); } var mouseOnTip = false, old = false; CodeMirror.on(tip, "mousemove", function() { mouseOnTip = true; }); CodeMirror.on(tip, "mouseout", function(e) { if (!CodeMirror.contains(tip, e.relatedTarget || e.toElement)) { if (old) clear(); else mouseOnTip = false; } }); setTimeout(maybeClear, 1700); cm.on("cursorActivity", clear); cm.on('blur', clear); cm.on('scroll', clear); } function makeTooltip(x, y, content) { var node = elt("div", cls + "tooltip", content); node.style.left = x + "px"; node.style.top = y + "px"; document.body.appendChild(node); return node; } function remove(node) { var p = node && node.parentNode; if (p) p.removeChild(node); } function fadeOut(tooltip) { tooltip.style.opacity = "0"; setTimeout(function() { remove(tooltip); }, 1100); } function showError(ts, cm, msg) { if (ts.options.showError) ts.options.showError(cm, msg); else tempTooltip(cm, String(msg)); } function closeArgHints(ts) { if (ts.activeArgHints) { remove(ts.activeArgHints); ts.activeArgHints = null; } } function docValue(ts, doc) { var val = doc.doc.getValue(); if (ts.options.fileFilter) val = ts.options.fileFilter(val, doc.name, doc.doc); return val; } // Worker wrapper function WorkerServer(ts) { var worker = ts.worker = new Worker(ts.options.workerScript); worker.postMessage({type: "init", defs: ts.options.defs, plugins: ts.options.plugins, scripts: ts.options.workerDeps}); var msgId = 0, pending = {}; function send(data, c) { if (c) { data.id = ++msgId; pending[msgId] = c; } worker.postMessage(data); } worker.onmessage = function(e) { var data = e.data; if (data.type == "getFile") { getFile(ts, data.name, function(err, text) { send({type: "getFile", err: String(err), text: text, id: data.id}); }); } else if (data.type == "debug") { window.console.log(data.message); } else if (data.id && pending[data.id]) { pending[data.id](data.err, data.body); delete pending[data.id]; } }; worker.onerror = function(e) { for (var id in pending) pending[id](e); pending = {}; }; this.addFile = function(name, text) { send({type: "add", name: name, text: text}); }; this.delFile = function(name) { send({type: "del", name: name}); }; this.request = function(body, c) { send({type: "req", body: body}, c); }; } }); ================================================ FILE: base/res/codemirror/addon/tern/worker.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // declare global: tern, server var server; this.onmessage = function(e) { var data = e.data; switch (data.type) { case "init": return startServer(data.defs, data.plugins, data.scripts); case "add": return server.addFile(data.name, data.text); case "del": return server.delFile(data.name); case "req": return server.request(data.body, function(err, reqData) { postMessage({id: data.id, body: reqData, err: err && String(err)}); }); case "getFile": var c = pending[data.id]; delete pending[data.id]; return c(data.err, data.text); default: throw new Error("Unknown message type: " + data.type); } }; var nextId = 0, pending = {}; function getFile(file, c) { postMessage({type: "getFile", name: file, id: ++nextId}); pending[nextId] = c; } function startServer(defs, plugins, scripts) { if (scripts) importScripts.apply(null, scripts); server = new tern.Server({ getFile: getFile, async: true, defs: defs, plugins: plugins }); } var console = { log: function(v) { postMessage({type: "debug", message: v}); } }; ================================================ FILE: base/res/codemirror/addon/wrap/hardwrap.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var Pos = CodeMirror.Pos; function findParagraph(cm, pos, options) { var startRE = options.paragraphStart || cm.getHelper(pos, "paragraphStart"); for (var start = pos.line, first = cm.firstLine(); start > first; --start) { var line = cm.getLine(start); if (startRE && startRE.test(line)) break; if (!/\S/.test(line)) { ++start; break; } } var endRE = options.paragraphEnd || cm.getHelper(pos, "paragraphEnd"); for (var end = pos.line + 1, last = cm.lastLine(); end <= last; ++end) { var line = cm.getLine(end); if (endRE && endRE.test(line)) { ++end; break; } if (!/\S/.test(line)) break; } return {from: start, to: end}; } function findBreakPoint(text, column, wrapOn, killTrailingSpace) { for (var at = column; at > 0; --at) if (wrapOn.test(text.slice(at - 1, at + 1))) break; if (at == 0) at = column; var endOfText = at; if (killTrailingSpace) while (text.charAt(endOfText - 1) == " ") --endOfText; return {from: endOfText, to: at}; } function wrapRange(cm, from, to, options) { from = cm.clipPos(from); to = cm.clipPos(to); var column = options.column || 80; var wrapOn = options.wrapOn || /\s\S|-[^\.\d]/; var killTrailing = options.killTrailingSpace !== false; var changes = [], curLine = "", curNo = from.line; var lines = cm.getRange(from, to, false); if (!lines.length) return null; var leadingSpace = lines[0].match(/^[ \t]*/)[0]; for (var i = 0; i < lines.length; ++i) { var text = lines[i], oldLen = curLine.length, spaceInserted = 0; if (curLine && text && !wrapOn.test(curLine.charAt(curLine.length - 1) + text.charAt(0))) { curLine += " "; spaceInserted = 1; } var spaceTrimmed = ""; if (i) { spaceTrimmed = text.match(/^\s*/)[0]; text = text.slice(spaceTrimmed.length); } curLine += text; if (i) { var firstBreak = curLine.length > column && leadingSpace == spaceTrimmed && findBreakPoint(curLine, column, wrapOn, killTrailing); // If this isn't broken, or is broken at a different point, remove old break if (!firstBreak || firstBreak.from != oldLen || firstBreak.to != oldLen + spaceInserted) { changes.push({text: [spaceInserted ? " " : ""], from: Pos(curNo, oldLen), to: Pos(curNo + 1, spaceTrimmed.length)}); } else { curLine = leadingSpace + text; ++curNo; } } while (curLine.length > column) { var bp = findBreakPoint(curLine, column, wrapOn, killTrailing); changes.push({text: ["", leadingSpace], from: Pos(curNo, bp.from), to: Pos(curNo, bp.to)}); curLine = leadingSpace + curLine.slice(bp.to); ++curNo; } } if (changes.length) cm.operation(function() { for (var i = 0; i < changes.length; ++i) { var change = changes[i]; cm.replaceRange(change.text, change.from, change.to); } }); return changes.length ? {from: changes[0].from, to: CodeMirror.changeEnd(changes[changes.length - 1])} : null; } CodeMirror.defineExtension("wrapParagraph", function(pos, options) { options = options || {}; if (!pos) pos = this.getCursor(); var para = findParagraph(this, pos, options); return wrapRange(this, Pos(para.from, 0), Pos(para.to - 1), options); }); CodeMirror.commands.wrapLines = function(cm) { cm.operation(function() { var ranges = cm.listSelections(), at = cm.lastLine() + 1; for (var i = ranges.length - 1; i >= 0; i--) { var range = ranges[i], span; if (range.empty()) { var para = findParagraph(cm, range.head, {}); span = {from: Pos(para.from, 0), to: Pos(para.to - 1)}; } else { span = {from: range.from(), to: range.to()}; } if (span.to.line >= at) continue; at = span.from.line; wrapRange(cm, span.from, span.to, {}); } }); }; CodeMirror.defineExtension("wrapRange", function(from, to, options) { return wrapRange(this, from, to, options || {}); }); CodeMirror.defineExtension("wrapParagraphsInRange", function(from, to, options) { options = options || {}; var cm = this, paras = []; for (var line = from.line; line <= to.line;) { var para = findParagraph(cm, Pos(line, 0), options); paras.push(para); line = para.to; } var madeChange = false; if (paras.length) cm.operation(function() { for (var i = paras.length - 1; i >= 0; --i) madeChange = madeChange || wrapRange(cm, Pos(paras[i].from, 0), Pos(paras[i].to - 1), options); }); return madeChange; }); }); ================================================ FILE: base/res/codemirror/lib/codemirror.css ================================================ /* BASICS */ .CodeMirror { /* Set height, width, borders, and global font properties here */ font-family: monospace; height: 300px; color: black; } /* PADDING */ .CodeMirror-lines { padding: 4px 0; /* Vertical padding around content */ } .CodeMirror pre { padding: 0 4px; /* Horizontal padding of content */ } .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { background-color: white; /* The little square between H and V scrollbars */ } /* GUTTER */ .CodeMirror-gutters { border-right: 1px solid #ddd; background-color: #f7f7f7; white-space: nowrap; } .CodeMirror-linenumbers {} .CodeMirror-linenumber { padding: 0 3px 0 5px; min-width: 20px; text-align: right; color: #999; white-space: nowrap; } .CodeMirror-guttermarker { color: black; } .CodeMirror-guttermarker-subtle { color: #999; } /* CURSOR */ .CodeMirror div.CodeMirror-cursor { border-left: 1px solid black; } /* Shown when moving in bi-directional text */ .CodeMirror div.CodeMirror-secondarycursor { border-left: 1px solid silver; } .CodeMirror.cm-fat-cursor div.CodeMirror-cursor { width: auto; border: 0; background: #7e7; } .CodeMirror.cm-fat-cursor div.CodeMirror-cursors { z-index: 1; } .cm-animate-fat-cursor { width: auto; border: 0; -webkit-animation: blink 1.06s steps(1) infinite; -moz-animation: blink 1.06s steps(1) infinite; animation: blink 1.06s steps(1) infinite; } @-moz-keyframes blink { 0% { background: #7e7; } 50% { background: none; } 100% { background: #7e7; } } @-webkit-keyframes blink { 0% { background: #7e7; } 50% { background: none; } 100% { background: #7e7; } } @keyframes blink { 0% { background: #7e7; } 50% { background: none; } 100% { background: #7e7; } } /* Can style cursor different in overwrite (non-insert) mode */ div.CodeMirror-overwrite div.CodeMirror-cursor {} .cm-tab { display: inline-block; text-decoration: inherit; } .CodeMirror-ruler { border-left: 1px solid #ccc; position: absolute; } /* DEFAULT THEME */ .cm-s-default .cm-keyword {color: #708;} .cm-s-default .cm-atom {color: #219;} .cm-s-default .cm-number {color: #164;} .cm-s-default .cm-def {color: #00f;} .cm-s-default .cm-variable, .cm-s-default .cm-punctuation, .cm-s-default .cm-property, .cm-s-default .cm-operator {} .cm-s-default .cm-variable-2 {color: #05a;} .cm-s-default .cm-variable-3 {color: #085;} .cm-s-default .cm-comment {color: #a50;} .cm-s-default .cm-string {color: #a11;} .cm-s-default .cm-string-2 {color: #f50;} .cm-s-default .cm-meta {color: #555;} .cm-s-default .cm-qualifier {color: #555;} .cm-s-default .cm-builtin {color: #30a;} .cm-s-default .cm-bracket {color: #997;} .cm-s-default .cm-tag {color: #170;} .cm-s-default .cm-attribute {color: #00c;} .cm-s-default .cm-header {color: blue;} .cm-s-default .cm-quote {color: #090;} .cm-s-default .cm-hr {color: #999;} .cm-s-default .cm-link {color: #00c;} .cm-negative {color: #d44;} .cm-positive {color: #292;} .cm-header, .cm-strong {font-weight: bold;} .cm-em {font-style: italic;} .cm-link {text-decoration: underline;} .cm-strikethrough {text-decoration: line-through;} .cm-s-default .cm-error {color: #f00;} .cm-invalidchar {color: #f00;} .CodeMirror-composing { border-bottom: 2px solid; } /* Default styles for common addons */ div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;} div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} .CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); } .CodeMirror-activeline-background {background: #e8f2ff;} /* STOP */ /* The rest of this file contains styles related to the mechanics of the editor. You probably shouldn't touch them. */ .CodeMirror { position: relative; overflow: hidden; background: white; } .CodeMirror-scroll { overflow: scroll !important; /* Things will break if this is overridden */ /* 30px is the magic margin used to hide the element's real scrollbars */ /* See overflow: hidden in .CodeMirror */ margin-bottom: -30px; margin-right: -30px; padding-bottom: 30px; height: 100%; outline: none; /* Prevent dragging from highlighting the element */ position: relative; } .CodeMirror-sizer { position: relative; border-right: 30px solid transparent; } /* The fake, visible scrollbars. Used to force redraw during scrolling before actuall scrolling happens, thus preventing shaking and flickering artifacts. */ .CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { position: absolute; z-index: 6; display: none; } .CodeMirror-vscrollbar { right: 0; top: 0; overflow-x: hidden; overflow-y: scroll; } .CodeMirror-hscrollbar { bottom: 0; left: 0; overflow-y: hidden; overflow-x: scroll; } .CodeMirror-scrollbar-filler { right: 0; bottom: 0; } .CodeMirror-gutter-filler { left: 0; bottom: 0; } .CodeMirror-gutters { position: absolute; left: 0; top: 0; z-index: 3; } .CodeMirror-gutter { white-space: normal; height: 100%; display: inline-block; margin-bottom: -30px; /* Hack to make IE7 behave */ *zoom:1; *display:inline; } .CodeMirror-gutter-wrapper { position: absolute; z-index: 4; height: 100%; } .CodeMirror-gutter-elt { position: absolute; cursor: default; z-index: 4; } .CodeMirror-gutter-wrapper { -webkit-user-select: none; -moz-user-select: none; user-select: none; } .CodeMirror-lines { cursor: text; min-height: 1px; /* prevents collapsing before first draw */ } .CodeMirror pre { /* Reset some styles that the rest of the page might have set */ -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; border-width: 0; background: transparent; font-family: inherit; font-size: inherit; margin: 0; white-space: pre; word-wrap: normal; line-height: inherit; color: inherit; z-index: 2; position: relative; overflow: visible; -webkit-tap-highlight-color: transparent; } .CodeMirror-wrap pre { word-wrap: break-word; white-space: pre-wrap; word-break: normal; } .CodeMirror-linebackground { position: absolute; left: 0; right: 0; top: 0; bottom: 0; z-index: 0; } .CodeMirror-linewidget { position: relative; z-index: 2; overflow: auto; } .CodeMirror-widget {} .CodeMirror-code { outline: none; } /* Force content-box sizing for the elements where we expect it */ .CodeMirror-scroll, .CodeMirror-sizer, .CodeMirror-gutter, .CodeMirror-gutters, .CodeMirror-linenumber { -moz-box-sizing: content-box; box-sizing: content-box; } .CodeMirror-measure { position: absolute; width: 100%; height: 0; overflow: hidden; visibility: hidden; } .CodeMirror-measure pre { position: static; } .CodeMirror div.CodeMirror-cursor { position: absolute; border-right: none; width: 0; } div.CodeMirror-cursors { visibility: hidden; position: relative; z-index: 3; } .CodeMirror-focused div.CodeMirror-cursors { visibility: visible; } .CodeMirror-selected { background: #d9d9d9; } .CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; } .CodeMirror-crosshair { cursor: crosshair; } .CodeMirror ::selection { background: #d7d4f0; } .CodeMirror ::-moz-selection { background: #d7d4f0; } .cm-searching { background: #ffa; background: rgba(255, 255, 0, .4); } /* IE7 hack to prevent it from returning funny offsetTops on the spans */ .CodeMirror span { *vertical-align: text-bottom; } /* Used to force a border model for a node */ .cm-force-border { padding-right: .1px; } @media print { /* Hide the cursor when printing */ .CodeMirror div.CodeMirror-cursors { visibility: hidden; } } /* See issue #2901 */ .cm-tab-wrap-hack:after { content: ''; } /* Help users use markselection to safely style text background */ span.CodeMirror-selectedtext { background: none; } ================================================ FILE: base/res/codemirror/lib/codemirror.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // This is CodeMirror (http://codemirror.net), a code editor // implemented in JavaScript on top of the browser's DOM. // // You can find some technical background for some of the code below // at http://marijnhaverbeke.nl/blog/#cm-internals . (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS module.exports = mod(); else if (typeof define == "function" && define.amd) // AMD return define([], mod); else // Plain browser env this.CodeMirror = mod(); })(function() { "use strict"; // BROWSER SNIFFING // Kludges for bugs and behavior differences that can't be feature // detected are enabled based on userAgent etc sniffing. var gecko = /gecko\/\d/i.test(navigator.userAgent); var ie_upto10 = /MSIE \d/.test(navigator.userAgent); var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent); var ie = ie_upto10 || ie_11up; var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : ie_11up[1]); var webkit = /WebKit\//.test(navigator.userAgent); var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(navigator.userAgent); var chrome = /Chrome\//.test(navigator.userAgent); var presto = /Opera\//.test(navigator.userAgent); var safari = /Apple Computer/.test(navigator.vendor); var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent); var phantom = /PhantomJS/.test(navigator.userAgent); var ios = /AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent); // This is woefully incomplete. Suggestions for alternative methods welcome. var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent); var mac = ios || /Mac/.test(navigator.platform); var windows = /win/i.test(navigator.platform); var presto_version = presto && navigator.userAgent.match(/Version\/(\d*\.\d*)/); if (presto_version) presto_version = Number(presto_version[1]); if (presto_version && presto_version >= 15) { presto = false; webkit = true; } // Some browsers use the wrong event properties to signal cmd/ctrl on OS X var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11)); var captureRightClick = gecko || (ie && ie_version >= 9); // Optimize some code when these features are not used. var sawReadOnlySpans = false, sawCollapsedSpans = false; // EDITOR CONSTRUCTOR // A CodeMirror instance represents an editor. This is the object // that user code is usually dealing with. function CodeMirror(place, options) { if (!(this instanceof CodeMirror)) return new CodeMirror(place, options); this.options = options = options ? copyObj(options) : {}; // Determine effective options based on given values and defaults. copyObj(defaults, options, false); setGuttersForLineNumbers(options); var doc = options.value; if (typeof doc == "string") doc = new Doc(doc, options.mode); this.doc = doc; var input = new CodeMirror.inputStyles[options.inputStyle](this); var display = this.display = new Display(place, doc, input); display.wrapper.CodeMirror = this; updateGutters(this); themeChanged(this); if (options.lineWrapping) this.display.wrapper.className += " CodeMirror-wrap"; if (options.autofocus && !mobile) display.input.focus(); initScrollbars(this); this.state = { keyMaps: [], // stores maps added by addKeyMap overlays: [], // highlighting overlays, as added by addOverlay modeGen: 0, // bumped when mode/overlay changes, used to invalidate highlighting info overwrite: false, delayingBlurEvent: false, focused: false, suppressEdits: false, // used to disable editing during key handlers when in readOnly mode pasteIncoming: false, cutIncoming: false, // help recognize paste/cut edits in input.poll draggingText: false, highlight: new Delayed(), // stores highlight worker timeout keySeq: null, // Unfinished key sequence specialChars: null }; var cm = this; // Override magic textarea content restore that IE sometimes does // on our hidden textarea on reload if (ie && ie_version < 11) setTimeout(function() { cm.display.input.reset(true); }, 20); registerEventHandlers(this); ensureGlobalHandlers(); startOperation(this); this.curOp.forceUpdate = true; attachDoc(this, doc); if ((options.autofocus && !mobile) || cm.hasFocus()) setTimeout(bind(onFocus, this), 20); else onBlur(this); for (var opt in optionHandlers) if (optionHandlers.hasOwnProperty(opt)) optionHandlers[opt](this, options[opt], Init); maybeUpdateLineNumberWidth(this); if (options.finishInit) options.finishInit(this); for (var i = 0; i < initHooks.length; ++i) initHooks[i](this); endOperation(this); // Suppress optimizelegibility in Webkit, since it breaks text // measuring on line wrapping boundaries. if (webkit && options.lineWrapping && getComputedStyle(display.lineDiv).textRendering == "optimizelegibility") display.lineDiv.style.textRendering = "auto"; } // DISPLAY CONSTRUCTOR // The display handles the DOM integration, both for input reading // and content drawing. It holds references to DOM nodes and // display-related state. function Display(place, doc, input) { var d = this; this.input = input; // Covers bottom-right square when both scrollbars are present. d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler"); d.scrollbarFiller.setAttribute("cm-not-content", "true"); // Covers bottom of gutter when coverGutterNextToScrollbar is on // and h scrollbar is present. d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler"); d.gutterFiller.setAttribute("cm-not-content", "true"); // Will contain the actual code, positioned to cover the viewport. d.lineDiv = elt("div", null, "CodeMirror-code"); // Elements are added to these to represent selection and cursors. d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1"); d.cursorDiv = elt("div", null, "CodeMirror-cursors"); // A visibility: hidden element used to find the size of things. d.measure = elt("div", null, "CodeMirror-measure"); // When lines outside of the viewport are measured, they are drawn in this. d.lineMeasure = elt("div", null, "CodeMirror-measure"); // Wraps everything that needs to exist inside the vertically-padded coordinate system d.lineSpace = elt("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv], null, "position: relative; outline: none"); // Moved around its parent to cover visible view. d.mover = elt("div", [elt("div", [d.lineSpace], "CodeMirror-lines")], null, "position: relative"); // Set to the height of the document, allowing scrolling. d.sizer = elt("div", [d.mover], "CodeMirror-sizer"); d.sizerWidth = null; // Behavior of elts with overflow: auto and padding is // inconsistent across browsers. This is used to ensure the // scrollable area is big enough. d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;"); // Will contain the gutters, if any. d.gutters = elt("div", null, "CodeMirror-gutters"); d.lineGutter = null; // Actual scrollable element. d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll"); d.scroller.setAttribute("tabIndex", "-1"); // The element in which the editor lives. d.wrapper = elt("div", [d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror"); // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported) if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; } if (!webkit && !(gecko && mobile)) d.scroller.draggable = true; if (place) { if (place.appendChild) place.appendChild(d.wrapper); else place(d.wrapper); } // Current rendered range (may be bigger than the view window). d.viewFrom = d.viewTo = doc.first; d.reportedViewFrom = d.reportedViewTo = doc.first; // Information about the rendered lines. d.view = []; d.renderedView = null; // Holds info about a single rendered line when it was rendered // for measurement, while not in view. d.externalMeasured = null; // Empty space (in pixels) above the view d.viewOffset = 0; d.lastWrapHeight = d.lastWrapWidth = 0; d.updateLineNumbers = null; d.nativeBarWidth = d.barHeight = d.barWidth = 0; d.scrollbarsClipped = false; // Used to only resize the line number gutter when necessary (when // the amount of lines crosses a boundary that makes its width change) d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null; // Set to true when a non-horizontal-scrolling line widget is // added. As an optimization, line widget aligning is skipped when // this is false. d.alignWidgets = false; d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; // Tracks the maximum line length so that the horizontal scrollbar // can be kept static when scrolling. d.maxLine = null; d.maxLineLength = 0; d.maxLineChanged = false; // Used for measuring wheel scrolling granularity d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null; // True when shift is held down. d.shift = false; // Used to track whether anything happened since the context menu // was opened. d.selForContextMenu = null; d.activeTouch = null; input.init(d); } // STATE UPDATES // Used to get the editor into a consistent state again when options change. function loadMode(cm) { cm.doc.mode = CodeMirror.getMode(cm.options, cm.doc.modeOption); resetModeState(cm); } function resetModeState(cm) { cm.doc.iter(function(line) { if (line.stateAfter) line.stateAfter = null; if (line.styles) line.styles = null; }); cm.doc.frontier = cm.doc.first; startWorker(cm, 100); cm.state.modeGen++; if (cm.curOp) regChange(cm); } function wrappingChanged(cm) { if (cm.options.lineWrapping) { addClass(cm.display.wrapper, "CodeMirror-wrap"); cm.display.sizer.style.minWidth = ""; cm.display.sizerWidth = null; } else { rmClass(cm.display.wrapper, "CodeMirror-wrap"); findMaxLine(cm); } estimateLineHeights(cm); regChange(cm); clearCaches(cm); setTimeout(function(){updateScrollbars(cm);}, 100); } // Returns a function that estimates the height of a line, to use as // first approximation until the line becomes visible (and is thus // properly measurable). function estimateHeight(cm) { var th = textHeight(cm.display), wrapping = cm.options.lineWrapping; var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3); return function(line) { if (lineIsHidden(cm.doc, line)) return 0; var widgetsHeight = 0; if (line.widgets) for (var i = 0; i < line.widgets.length; i++) { if (line.widgets[i].height) widgetsHeight += line.widgets[i].height; } if (wrapping) return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th; else return widgetsHeight + th; }; } function estimateLineHeights(cm) { var doc = cm.doc, est = estimateHeight(cm); doc.iter(function(line) { var estHeight = est(line); if (estHeight != line.height) updateLineHeight(line, estHeight); }); } function themeChanged(cm) { cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-"); clearCaches(cm); } function guttersChanged(cm) { updateGutters(cm); regChange(cm); setTimeout(function(){alignHorizontally(cm);}, 20); } // Rebuild the gutter elements, ensure the margin to the left of the // code matches their width. function updateGutters(cm) { var gutters = cm.display.gutters, specs = cm.options.gutters; removeChildren(gutters); for (var i = 0; i < specs.length; ++i) { var gutterClass = specs[i]; var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + gutterClass)); if (gutterClass == "CodeMirror-linenumbers") { cm.display.lineGutter = gElt; gElt.style.width = (cm.display.lineNumWidth || 1) + "px"; } } gutters.style.display = i ? "" : "none"; updateGutterSpace(cm); } function updateGutterSpace(cm) { var width = cm.display.gutters.offsetWidth; cm.display.sizer.style.marginLeft = width + "px"; } // Compute the character length of a line, taking into account // collapsed ranges (see markText) that might hide parts, and join // other lines onto it. function lineLength(line) { if (line.height == 0) return 0; var len = line.text.length, merged, cur = line; while (merged = collapsedSpanAtStart(cur)) { var found = merged.find(0, true); cur = found.from.line; len += found.from.ch - found.to.ch; } cur = line; while (merged = collapsedSpanAtEnd(cur)) { var found = merged.find(0, true); len -= cur.text.length - found.from.ch; cur = found.to.line; len += cur.text.length - found.to.ch; } return len; } // Find the longest line in the document. function findMaxLine(cm) { var d = cm.display, doc = cm.doc; d.maxLine = getLine(doc, doc.first); d.maxLineLength = lineLength(d.maxLine); d.maxLineChanged = true; doc.iter(function(line) { var len = lineLength(line); if (len > d.maxLineLength) { d.maxLineLength = len; d.maxLine = line; } }); } // Make sure the gutters options contains the element // "CodeMirror-linenumbers" when the lineNumbers option is true. function setGuttersForLineNumbers(options) { var found = indexOf(options.gutters, "CodeMirror-linenumbers"); if (found == -1 && options.lineNumbers) { options.gutters = options.gutters.concat(["CodeMirror-linenumbers"]); } else if (found > -1 && !options.lineNumbers) { options.gutters = options.gutters.slice(0); options.gutters.splice(found, 1); } } // SCROLLBARS // Prepare DOM reads needed to update the scrollbars. Done in one // shot to minimize update/measure roundtrips. function measureForScrollbars(cm) { var d = cm.display, gutterW = d.gutters.offsetWidth; var docH = Math.round(cm.doc.height + paddingVert(cm.display)); return { clientHeight: d.scroller.clientHeight, viewHeight: d.wrapper.clientHeight, scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth, viewWidth: d.wrapper.clientWidth, barLeft: cm.options.fixedGutter ? gutterW : 0, docHeight: docH, scrollHeight: docH + scrollGap(cm) + d.barHeight, nativeBarWidth: d.nativeBarWidth, gutterWidth: gutterW }; } function NativeScrollbars(place, scroll, cm) { this.cm = cm; var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar"); var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar"); place(vert); place(horiz); on(vert, "scroll", function() { if (vert.clientHeight) scroll(vert.scrollTop, "vertical"); }); on(horiz, "scroll", function() { if (horiz.clientWidth) scroll(horiz.scrollLeft, "horizontal"); }); this.checkedOverlay = false; // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8). if (ie && ie_version < 8) this.horiz.style.minHeight = this.vert.style.minWidth = "18px"; } NativeScrollbars.prototype = copyObj({ update: function(measure) { var needsH = measure.scrollWidth > measure.clientWidth + 1; var needsV = measure.scrollHeight > measure.clientHeight + 1; var sWidth = measure.nativeBarWidth; if (needsV) { this.vert.style.display = "block"; this.vert.style.bottom = needsH ? sWidth + "px" : "0"; var totalHeight = measure.viewHeight - (needsH ? sWidth : 0); // A bug in IE8 can cause this value to be negative, so guard it. this.vert.firstChild.style.height = Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px"; } else { this.vert.style.display = ""; this.vert.firstChild.style.height = "0"; } if (needsH) { this.horiz.style.display = "block"; this.horiz.style.right = needsV ? sWidth + "px" : "0"; this.horiz.style.left = measure.barLeft + "px"; var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0); this.horiz.firstChild.style.width = (measure.scrollWidth - measure.clientWidth + totalWidth) + "px"; } else { this.horiz.style.display = ""; this.horiz.firstChild.style.width = "0"; } if (!this.checkedOverlay && measure.clientHeight > 0) { if (sWidth == 0) this.overlayHack(); this.checkedOverlay = true; } return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0}; }, setScrollLeft: function(pos) { if (this.horiz.scrollLeft != pos) this.horiz.scrollLeft = pos; }, setScrollTop: function(pos) { if (this.vert.scrollTop != pos) this.vert.scrollTop = pos; }, overlayHack: function() { var w = mac && !mac_geMountainLion ? "12px" : "18px"; this.horiz.style.minHeight = this.vert.style.minWidth = w; var self = this; var barMouseDown = function(e) { if (e_target(e) != self.vert && e_target(e) != self.horiz) operation(self.cm, onMouseDown)(e); }; on(this.vert, "mousedown", barMouseDown); on(this.horiz, "mousedown", barMouseDown); }, clear: function() { var parent = this.horiz.parentNode; parent.removeChild(this.horiz); parent.removeChild(this.vert); } }, NativeScrollbars.prototype); function NullScrollbars() {} NullScrollbars.prototype = copyObj({ update: function() { return {bottom: 0, right: 0}; }, setScrollLeft: function() {}, setScrollTop: function() {}, clear: function() {} }, NullScrollbars.prototype); CodeMirror.scrollbarModel = {"native": NativeScrollbars, "null": NullScrollbars}; function initScrollbars(cm) { if (cm.display.scrollbars) { cm.display.scrollbars.clear(); if (cm.display.scrollbars.addClass) rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); } cm.display.scrollbars = new CodeMirror.scrollbarModel[cm.options.scrollbarStyle](function(node) { cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller); // Prevent clicks in the scrollbars from killing focus on(node, "mousedown", function() { if (cm.state.focused) setTimeout(function() { cm.display.input.focus(); }, 0); }); node.setAttribute("cm-not-content", "true"); }, function(pos, axis) { if (axis == "horizontal") setScrollLeft(cm, pos); else setScrollTop(cm, pos); }, cm); if (cm.display.scrollbars.addClass) addClass(cm.display.wrapper, cm.display.scrollbars.addClass); } function updateScrollbars(cm, measure) { if (!measure) measure = measureForScrollbars(cm); var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight; updateScrollbarsInner(cm, measure); for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) { if (startWidth != cm.display.barWidth && cm.options.lineWrapping) updateHeightsInViewport(cm); updateScrollbarsInner(cm, measureForScrollbars(cm)); startWidth = cm.display.barWidth; startHeight = cm.display.barHeight; } } // Re-synchronize the fake scrollbars with the actual size of the // content. function updateScrollbarsInner(cm, measure) { var d = cm.display; var sizes = d.scrollbars.update(measure); d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px"; d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px"; if (sizes.right && sizes.bottom) { d.scrollbarFiller.style.display = "block"; d.scrollbarFiller.style.height = sizes.bottom + "px"; d.scrollbarFiller.style.width = sizes.right + "px"; } else d.scrollbarFiller.style.display = ""; if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) { d.gutterFiller.style.display = "block"; d.gutterFiller.style.height = sizes.bottom + "px"; d.gutterFiller.style.width = measure.gutterWidth + "px"; } else d.gutterFiller.style.display = ""; } // Compute the lines that are visible in a given viewport (defaults // the the current scroll position). viewport may contain top, // height, and ensure (see op.scrollToPos) properties. function visibleLines(display, doc, viewport) { var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop; top = Math.floor(top - paddingTop(display)); var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight; var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom); // Ensure is a {from: {line, ch}, to: {line, ch}} object, and // forces those lines into the viewport (if possible). if (viewport && viewport.ensure) { var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line; if (ensureFrom < from) { from = ensureFrom; to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight); } else if (Math.min(ensureTo, doc.lastLine()) >= to) { from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight); to = ensureTo; } } return {from: from, to: Math.max(to, from + 1)}; } // LINE NUMBERS // Re-align line numbers and gutter marks to compensate for // horizontal scrolling. function alignHorizontally(cm) { var display = cm.display, view = display.view; if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) return; var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft; var gutterW = display.gutters.offsetWidth, left = comp + "px"; for (var i = 0; i < view.length; i++) if (!view[i].hidden) { if (cm.options.fixedGutter && view[i].gutter) view[i].gutter.style.left = left; var align = view[i].alignable; if (align) for (var j = 0; j < align.length; j++) align[j].style.left = left; } if (cm.options.fixedGutter) display.gutters.style.left = (comp + gutterW) + "px"; } // Used to ensure that the line number gutter is still the right // size for the current document size. Returns true when an update // is needed. function maybeUpdateLineNumberWidth(cm) { if (!cm.options.lineNumbers) return false; var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display; if (last.length != display.lineNumChars) { var test = display.measure.appendChild(elt("div", [elt("div", last)], "CodeMirror-linenumber CodeMirror-gutter-elt")); var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW; display.lineGutter.style.width = ""; display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1; display.lineNumWidth = display.lineNumInnerWidth + padding; display.lineNumChars = display.lineNumInnerWidth ? last.length : -1; display.lineGutter.style.width = display.lineNumWidth + "px"; updateGutterSpace(cm); return true; } return false; } function lineNumberFor(options, i) { return String(options.lineNumberFormatter(i + options.firstLineNumber)); } // Computes display.scroller.scrollLeft + display.gutters.offsetWidth, // but using getBoundingClientRect to get a sub-pixel-accurate // result. function compensateForHScroll(display) { return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left; } // DISPLAY DRAWING function DisplayUpdate(cm, viewport, force) { var display = cm.display; this.viewport = viewport; // Store some values that we'll need later (but don't want to force a relayout for) this.visible = visibleLines(display, cm.doc, viewport); this.editorIsHidden = !display.wrapper.offsetWidth; this.wrapperHeight = display.wrapper.clientHeight; this.wrapperWidth = display.wrapper.clientWidth; this.oldDisplayWidth = displayWidth(cm); this.force = force; this.dims = getDimensions(cm); this.events = []; } DisplayUpdate.prototype.signal = function(emitter, type) { if (hasHandler(emitter, type)) this.events.push(arguments); }; DisplayUpdate.prototype.finish = function() { for (var i = 0; i < this.events.length; i++) signal.apply(null, this.events[i]); }; function maybeClipScrollbars(cm) { var display = cm.display; if (!display.scrollbarsClipped && display.scroller.offsetWidth) { display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth; display.heightForcer.style.height = scrollGap(cm) + "px"; display.sizer.style.marginBottom = -display.nativeBarWidth + "px"; display.sizer.style.borderRightWidth = scrollGap(cm) + "px"; display.scrollbarsClipped = true; } } // Does the actual updating of the line display. Bails out // (returning false) when there is nothing to be done and forced is // false. function updateDisplayIfNeeded(cm, update) { var display = cm.display, doc = cm.doc; if (update.editorIsHidden) { resetView(cm); return false; } // Bail out if the visible area is already rendered and nothing changed. if (!update.force && update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo && (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) && display.renderedView == display.view && countDirtyView(cm) == 0) return false; if (maybeUpdateLineNumberWidth(cm)) { resetView(cm); update.dims = getDimensions(cm); } // Compute a suitable new viewport (from & to) var end = doc.first + doc.size; var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first); var to = Math.min(end, update.visible.to + cm.options.viewportMargin); if (display.viewFrom < from && from - display.viewFrom < 20) from = Math.max(doc.first, display.viewFrom); if (display.viewTo > to && display.viewTo - to < 20) to = Math.min(end, display.viewTo); if (sawCollapsedSpans) { from = visualLineNo(cm.doc, from); to = visualLineEndNo(cm.doc, to); } var different = from != display.viewFrom || to != display.viewTo || display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth; adjustView(cm, from, to); display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom)); // Position the mover div to align with the current scroll position cm.display.mover.style.top = display.viewOffset + "px"; var toUpdate = countDirtyView(cm); if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view && (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo)) return false; // For big changes, we hide the enclosing element during the // update, since that speeds up the operations on most browsers. var focused = activeElt(); if (toUpdate > 4) display.lineDiv.style.display = "none"; patchDisplay(cm, display.updateLineNumbers, update.dims); if (toUpdate > 4) display.lineDiv.style.display = ""; display.renderedView = display.view; // There might have been a widget with a focused element that got // hidden or updated, if so re-focus it. if (focused && activeElt() != focused && focused.offsetHeight) focused.focus(); // Prevent selection and cursors from interfering with the scroll // width and height. removeChildren(display.cursorDiv); removeChildren(display.selectionDiv); display.gutters.style.height = 0; if (different) { display.lastWrapHeight = update.wrapperHeight; display.lastWrapWidth = update.wrapperWidth; startWorker(cm, 400); } display.updateLineNumbers = null; return true; } function postUpdateDisplay(cm, update) { var force = update.force, viewport = update.viewport; for (var first = true;; first = false) { if (first && cm.options.lineWrapping && update.oldDisplayWidth != displayWidth(cm)) { force = true; } else { force = false; // Clip forced viewport to actual scrollable area. if (viewport && viewport.top != null) viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}; // Updated line heights might result in the drawn area not // actually covering the viewport. Keep looping until it does. update.visible = visibleLines(cm.display, cm.doc, viewport); if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo) break; } if (!updateDisplayIfNeeded(cm, update)) break; updateHeightsInViewport(cm); var barMeasure = measureForScrollbars(cm); updateSelection(cm); setDocumentHeight(cm, barMeasure); updateScrollbars(cm, barMeasure); } update.signal(cm, "update", cm); if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) { update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo); cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo; } } function updateDisplaySimple(cm, viewport) { var update = new DisplayUpdate(cm, viewport); if (updateDisplayIfNeeded(cm, update)) { updateHeightsInViewport(cm); postUpdateDisplay(cm, update); var barMeasure = measureForScrollbars(cm); updateSelection(cm); setDocumentHeight(cm, barMeasure); updateScrollbars(cm, barMeasure); update.finish(); } } function setDocumentHeight(cm, measure) { cm.display.sizer.style.minHeight = measure.docHeight + "px"; var total = measure.docHeight + cm.display.barHeight; cm.display.heightForcer.style.top = total + "px"; cm.display.gutters.style.height = Math.max(total + scrollGap(cm), measure.clientHeight) + "px"; } // Read the actual heights of the rendered lines, and update their // stored heights to match. function updateHeightsInViewport(cm) { var display = cm.display; var prevBottom = display.lineDiv.offsetTop; for (var i = 0; i < display.view.length; i++) { var cur = display.view[i], height; if (cur.hidden) continue; if (ie && ie_version < 8) { var bot = cur.node.offsetTop + cur.node.offsetHeight; height = bot - prevBottom; prevBottom = bot; } else { var box = cur.node.getBoundingClientRect(); height = box.bottom - box.top; } var diff = cur.line.height - height; if (height < 2) height = textHeight(display); if (diff > .001 || diff < -.001) { updateLineHeight(cur.line, height); updateWidgetHeight(cur.line); if (cur.rest) for (var j = 0; j < cur.rest.length; j++) updateWidgetHeight(cur.rest[j]); } } } // Read and store the height of line widgets associated with the // given line. function updateWidgetHeight(line) { if (line.widgets) for (var i = 0; i < line.widgets.length; ++i) line.widgets[i].height = line.widgets[i].node.offsetHeight; } // Do a bulk-read of the DOM positions and sizes needed to draw the // view, so that we don't interleave reading and writing to the DOM. function getDimensions(cm) { var d = cm.display, left = {}, width = {}; var gutterLeft = d.gutters.clientLeft; for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) { left[cm.options.gutters[i]] = n.offsetLeft + n.clientLeft + gutterLeft; width[cm.options.gutters[i]] = n.clientWidth; } return {fixedPos: compensateForHScroll(d), gutterTotalWidth: d.gutters.offsetWidth, gutterLeft: left, gutterWidth: width, wrapperWidth: d.wrapper.clientWidth}; } // Sync the actual display DOM structure with display.view, removing // nodes for lines that are no longer in view, and creating the ones // that are not there yet, and updating the ones that are out of // date. function patchDisplay(cm, updateNumbersFrom, dims) { var display = cm.display, lineNumbers = cm.options.lineNumbers; var container = display.lineDiv, cur = container.firstChild; function rm(node) { var next = node.nextSibling; // Works around a throw-scroll bug in OS X Webkit if (webkit && mac && cm.display.currentWheelTarget == node) node.style.display = "none"; else node.parentNode.removeChild(node); return next; } var view = display.view, lineN = display.viewFrom; // Loop over the elements in the view, syncing cur (the DOM nodes // in display.lineDiv) with the view as we go. for (var i = 0; i < view.length; i++) { var lineView = view[i]; if (lineView.hidden) { } else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet var node = buildLineElement(cm, lineView, lineN, dims); container.insertBefore(node, cur); } else { // Already drawn while (cur != lineView.node) cur = rm(cur); var updateNumber = lineNumbers && updateNumbersFrom != null && updateNumbersFrom <= lineN && lineView.lineNumber; if (lineView.changes) { if (indexOf(lineView.changes, "gutter") > -1) updateNumber = false; updateLineForChanges(cm, lineView, lineN, dims); } if (updateNumber) { removeChildren(lineView.lineNumber); lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN))); } cur = lineView.node.nextSibling; } lineN += lineView.size; } while (cur) cur = rm(cur); } // When an aspect of a line changes, a string is added to // lineView.changes. This updates the relevant part of the line's // DOM structure. function updateLineForChanges(cm, lineView, lineN, dims) { for (var j = 0; j < lineView.changes.length; j++) { var type = lineView.changes[j]; if (type == "text") updateLineText(cm, lineView); else if (type == "gutter") updateLineGutter(cm, lineView, lineN, dims); else if (type == "class") updateLineClasses(lineView); else if (type == "widget") updateLineWidgets(cm, lineView, dims); } lineView.changes = null; } // Lines with gutter elements, widgets or a background class need to // be wrapped, and have the extra elements added to the wrapper div function ensureLineWrapped(lineView) { if (lineView.node == lineView.text) { lineView.node = elt("div", null, null, "position: relative"); if (lineView.text.parentNode) lineView.text.parentNode.replaceChild(lineView.node, lineView.text); lineView.node.appendChild(lineView.text); if (ie && ie_version < 8) lineView.node.style.zIndex = 2; } return lineView.node; } function updateLineBackground(lineView) { var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass; if (cls) cls += " CodeMirror-linebackground"; if (lineView.background) { if (cls) lineView.background.className = cls; else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; } } else if (cls) { var wrap = ensureLineWrapped(lineView); lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild); } } // Wrapper around buildLineContent which will reuse the structure // in display.externalMeasured when possible. function getLineContent(cm, lineView) { var ext = cm.display.externalMeasured; if (ext && ext.line == lineView.line) { cm.display.externalMeasured = null; lineView.measure = ext.measure; return ext.built; } return buildLineContent(cm, lineView); } // Redraw the line's text. Interacts with the background and text // classes because the mode may output tokens that influence these // classes. function updateLineText(cm, lineView) { var cls = lineView.text.className; var built = getLineContent(cm, lineView); if (lineView.text == lineView.node) lineView.node = built.pre; lineView.text.parentNode.replaceChild(built.pre, lineView.text); lineView.text = built.pre; if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) { lineView.bgClass = built.bgClass; lineView.textClass = built.textClass; updateLineClasses(lineView); } else if (cls) { lineView.text.className = cls; } } function updateLineClasses(lineView) { updateLineBackground(lineView); if (lineView.line.wrapClass) ensureLineWrapped(lineView).className = lineView.line.wrapClass; else if (lineView.node != lineView.text) lineView.node.className = ""; var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass; lineView.text.className = textClass || ""; } function updateLineGutter(cm, lineView, lineN, dims) { if (lineView.gutter) { lineView.node.removeChild(lineView.gutter); lineView.gutter = null; } var markers = lineView.line.gutterMarkers; if (cm.options.lineNumbers || markers) { var wrap = ensureLineWrapped(lineView); var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", "left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px; width: " + dims.gutterTotalWidth + "px"); cm.display.input.setUneditable(gutterWrap); wrap.insertBefore(gutterWrap, lineView.text); if (lineView.line.gutterClass) gutterWrap.className += " " + lineView.line.gutterClass; if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"])) lineView.lineNumber = gutterWrap.appendChild( elt("div", lineNumberFor(cm.options, lineN), "CodeMirror-linenumber CodeMirror-gutter-elt", "left: " + dims.gutterLeft["CodeMirror-linenumbers"] + "px; width: " + cm.display.lineNumInnerWidth + "px")); if (markers) for (var k = 0; k < cm.options.gutters.length; ++k) { var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id]; if (found) gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", "left: " + dims.gutterLeft[id] + "px; width: " + dims.gutterWidth[id] + "px")); } } } function updateLineWidgets(cm, lineView, dims) { if (lineView.alignable) lineView.alignable = null; for (var node = lineView.node.firstChild, next; node; node = next) { var next = node.nextSibling; if (node.className == "CodeMirror-linewidget") lineView.node.removeChild(node); } insertLineWidgets(cm, lineView, dims); } // Build a line's DOM representation from scratch function buildLineElement(cm, lineView, lineN, dims) { var built = getLineContent(cm, lineView); lineView.text = lineView.node = built.pre; if (built.bgClass) lineView.bgClass = built.bgClass; if (built.textClass) lineView.textClass = built.textClass; updateLineClasses(lineView); updateLineGutter(cm, lineView, lineN, dims); insertLineWidgets(cm, lineView, dims); return lineView.node; } // A lineView may contain multiple logical lines (when merged by // collapsed spans). The widgets for all of them need to be drawn. function insertLineWidgets(cm, lineView, dims) { insertLineWidgetsFor(cm, lineView.line, lineView, dims, true); if (lineView.rest) for (var i = 0; i < lineView.rest.length; i++) insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); } function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) { if (!line.widgets) return; var wrap = ensureLineWrapped(lineView); for (var i = 0, ws = line.widgets; i < ws.length; ++i) { var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget"); if (!widget.handleMouseEvents) node.setAttribute("cm-ignore-events", "true"); positionLineWidget(widget, node, lineView, dims); cm.display.input.setUneditable(node); if (allowAbove && widget.above) wrap.insertBefore(node, lineView.gutter || lineView.text); else wrap.appendChild(node); signalLater(widget, "redraw"); } } function positionLineWidget(widget, node, lineView, dims) { if (widget.noHScroll) { (lineView.alignable || (lineView.alignable = [])).push(node); var width = dims.wrapperWidth; node.style.left = dims.fixedPos + "px"; if (!widget.coverGutter) { width -= dims.gutterTotalWidth; node.style.paddingLeft = dims.gutterTotalWidth + "px"; } node.style.width = width + "px"; } if (widget.coverGutter) { node.style.zIndex = 5; node.style.position = "relative"; if (!widget.noHScroll) node.style.marginLeft = -dims.gutterTotalWidth + "px"; } } // POSITION OBJECT // A Pos instance represents a position within the text. var Pos = CodeMirror.Pos = function(line, ch) { if (!(this instanceof Pos)) return new Pos(line, ch); this.line = line; this.ch = ch; }; // Compare two positions, return 0 if they are the same, a negative // number when a is less, and a positive number otherwise. var cmp = CodeMirror.cmpPos = function(a, b) { return a.line - b.line || a.ch - b.ch; }; function copyPos(x) {return Pos(x.line, x.ch);} function maxPos(a, b) { return cmp(a, b) < 0 ? b : a; } function minPos(a, b) { return cmp(a, b) < 0 ? a : b; } // INPUT HANDLING function ensureFocus(cm) { if (!cm.state.focused) { cm.display.input.focus(); onFocus(cm); } } function isReadOnly(cm) { return cm.options.readOnly || cm.doc.cantEdit; } // This will be set to an array of strings when copying, so that, // when pasting, we know what kind of selections the copied text // was made out of. var lastCopied = null; function applyTextInput(cm, inserted, deleted, sel, origin) { var doc = cm.doc; cm.display.shift = false; if (!sel) sel = doc.sel; var textLines = splitLines(inserted), multiPaste = null; // When pasing N lines into N selections, insert one line per selection if (cm.state.pasteIncoming && sel.ranges.length > 1) { if (lastCopied && lastCopied.join("\n") == inserted) multiPaste = sel.ranges.length % lastCopied.length == 0 && map(lastCopied, splitLines); else if (textLines.length == sel.ranges.length) multiPaste = map(textLines, function(l) { return [l]; }); } // Normal behavior is to insert the new text into every selection for (var i = sel.ranges.length - 1; i >= 0; i--) { var range = sel.ranges[i]; var from = range.from(), to = range.to(); if (range.empty()) { if (deleted && deleted > 0) // Handle deletion from = Pos(from.line, from.ch - deleted); else if (cm.state.overwrite && !cm.state.pasteIncoming) // Handle overwrite to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); } var updateInput = cm.curOp.updateInput; var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i % multiPaste.length] : textLines, origin: origin || (cm.state.pasteIncoming ? "paste" : cm.state.cutIncoming ? "cut" : "+input")}; makeChange(cm.doc, changeEvent); signalLater(cm, "inputRead", cm, changeEvent); // When an 'electric' character is inserted, immediately trigger a reindent if (inserted && !cm.state.pasteIncoming && cm.options.electricChars && cm.options.smartIndent && range.head.ch < 100 && (!i || sel.ranges[i - 1].head.line != range.head.line)) { var mode = cm.getModeAt(range.head); var end = changeEnd(changeEvent); var indented = false; if (mode.electricChars) { for (var j = 0; j < mode.electricChars.length; j++) if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) { indented = indentLine(cm, end.line, "smart"); break; } } else if (mode.electricInput) { if (mode.electricInput.test(getLine(doc, end.line).text.slice(0, end.ch))) indented = indentLine(cm, end.line, "smart"); } if (indented) signalLater(cm, "electricInput", cm, end.line); } } ensureCursorVisible(cm); cm.curOp.updateInput = updateInput; cm.curOp.typing = true; cm.state.pasteIncoming = cm.state.cutIncoming = false; } function copyableRanges(cm) { var text = [], ranges = []; for (var i = 0; i < cm.doc.sel.ranges.length; i++) { var line = cm.doc.sel.ranges[i].head.line; var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)}; ranges.push(lineRange); text.push(cm.getRange(lineRange.anchor, lineRange.head)); } return {text: text, ranges: ranges}; } function disableBrowserMagic(field) { field.setAttribute("autocorrect", "off"); field.setAttribute("autocapitalize", "off"); field.setAttribute("spellcheck", "false"); } // TEXTAREA INPUT STYLE function TextareaInput(cm) { this.cm = cm; // See input.poll and input.reset this.prevInput = ""; // Flag that indicates whether we expect input to appear real soon // now (after some event like 'keypress' or 'input') and are // polling intensively. this.pollingFast = false; // Self-resetting timeout for the poller this.polling = new Delayed(); // Tracks when input.reset has punted to just putting a short // string into the textarea instead of the full selection. this.inaccurateSelection = false; // Used to work around IE issue with selection being forgotten when focus moves away from textarea this.hasSelection = false; this.composing = null; }; function hiddenTextarea() { var te = elt("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none"); var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"); // The textarea is kept positioned near the cursor to prevent the // fact that it'll be scrolled into view on input from scrolling // our fake cursor out of view. On webkit, when wrap=off, paste is // very slow. So make the area wide instead. if (webkit) te.style.width = "1000px"; else te.setAttribute("wrap", "off"); // If border: 0; -- iOS fails to open keyboard (issue #1287) if (ios) te.style.border = "1px solid black"; disableBrowserMagic(te); return div; } TextareaInput.prototype = copyObj({ init: function(display) { var input = this, cm = this.cm; // Wraps and hides input textarea var div = this.wrapper = hiddenTextarea(); // The semihidden textarea that is focused when the editor is // focused, and receives input. var te = this.textarea = div.firstChild; display.wrapper.insertBefore(div, display.wrapper.firstChild); // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore) if (ios) te.style.width = "0px"; on(te, "input", function() { if (ie && ie_version >= 9 && input.hasSelection) input.hasSelection = null; input.poll(); }); on(te, "paste", function() { // Workaround for webkit bug https://bugs.webkit.org/show_bug.cgi?id=90206 // Add a char to the end of textarea before paste occur so that // selection doesn't span to the end of textarea. if (webkit && !cm.state.fakedLastChar && !(new Date - cm.state.lastMiddleDown < 200)) { var start = te.selectionStart, end = te.selectionEnd; te.value += "$"; // The selection end needs to be set before the start, otherwise there // can be an intermediate non-empty selection between the two, which // can override the middle-click paste buffer on linux and cause the // wrong thing to get pasted. te.selectionEnd = end; te.selectionStart = start; cm.state.fakedLastChar = true; } cm.state.pasteIncoming = true; input.fastPoll(); }); function prepareCopyCut(e) { if (cm.somethingSelected()) { lastCopied = cm.getSelections(); if (input.inaccurateSelection) { input.prevInput = ""; input.inaccurateSelection = false; te.value = lastCopied.join("\n"); selectInput(te); } } else if (!cm.options.lineWiseCopyCut) { return; } else { var ranges = copyableRanges(cm); lastCopied = ranges.text; if (e.type == "cut") { cm.setSelections(ranges.ranges, null, sel_dontScroll); } else { input.prevInput = ""; te.value = ranges.text.join("\n"); selectInput(te); } } if (e.type == "cut") cm.state.cutIncoming = true; } on(te, "cut", prepareCopyCut); on(te, "copy", prepareCopyCut); on(display.scroller, "paste", function(e) { if (eventInWidget(display, e)) return; cm.state.pasteIncoming = true; input.focus(); }); // Prevent normal selection in the editor (we handle our own) on(display.lineSpace, "selectstart", function(e) { if (!eventInWidget(display, e)) e_preventDefault(e); }); on(te, "compositionstart", function() { var start = cm.getCursor("from"); input.composing = { start: start, range: cm.markText(start, cm.getCursor("to"), {className: "CodeMirror-composing"}) }; }); on(te, "compositionend", function() { if (input.composing) { input.poll(); input.composing.range.clear(); input.composing = null; } }); }, prepareSelection: function() { // Redraw the selection and/or cursor var cm = this.cm, display = cm.display, doc = cm.doc; var result = prepareSelection(cm); // Move the hidden textarea near the cursor to prevent scrolling artifacts if (cm.options.moveInputWithCursor) { var headPos = cursorCoords(cm, doc.sel.primary().head, "div"); var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect(); result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10, headPos.top + lineOff.top - wrapOff.top)); result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10, headPos.left + lineOff.left - wrapOff.left)); } return result; }, showSelection: function(drawn) { var cm = this.cm, display = cm.display; removeChildrenAndAdd(display.cursorDiv, drawn.cursors); removeChildrenAndAdd(display.selectionDiv, drawn.selection); if (drawn.teTop != null) { this.wrapper.style.top = drawn.teTop + "px"; this.wrapper.style.left = drawn.teLeft + "px"; } }, // Reset the input to correspond to the selection (or to be empty, // when not typing and nothing is selected) reset: function(typing) { if (this.contextMenuPending) return; var minimal, selected, cm = this.cm, doc = cm.doc; if (cm.somethingSelected()) { this.prevInput = ""; var range = doc.sel.primary(); minimal = hasCopyEvent && (range.to().line - range.from().line > 100 || (selected = cm.getSelection()).length > 1000); var content = minimal ? "-" : selected || cm.getSelection(); this.textarea.value = content; if (cm.state.focused) selectInput(this.textarea); if (ie && ie_version >= 9) this.hasSelection = content; } else if (!typing) { this.prevInput = this.textarea.value = ""; if (ie && ie_version >= 9) this.hasSelection = null; } this.inaccurateSelection = minimal; }, getField: function() { return this.textarea; }, supportsTouch: function() { return false; }, focus: function() { if (this.cm.options.readOnly != "nocursor" && (!mobile || activeElt() != this.textarea)) { try { this.textarea.focus(); } catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM } }, blur: function() { this.textarea.blur(); }, resetPosition: function() { this.wrapper.style.top = this.wrapper.style.left = 0; }, receivedFocus: function() { this.slowPoll(); }, // Poll for input changes, using the normal rate of polling. This // runs as long as the editor is focused. slowPoll: function() { var input = this; if (input.pollingFast) return; input.polling.set(this.cm.options.pollInterval, function() { input.poll(); if (input.cm.state.focused) input.slowPoll(); }); }, // When an event has just come in that is likely to add or change // something in the input textarea, we poll faster, to ensure that // the change appears on the screen quickly. fastPoll: function() { var missed = false, input = this; input.pollingFast = true; function p() { var changed = input.poll(); if (!changed && !missed) {missed = true; input.polling.set(60, p);} else {input.pollingFast = false; input.slowPoll();} } input.polling.set(20, p); }, // Read input from the textarea, and update the document to match. // When something is selected, it is present in the textarea, and // selected (unless it is huge, in which case a placeholder is // used). When nothing is selected, the cursor sits after previously // seen text (can be empty), which is stored in prevInput (we must // not reset the textarea when typing, because that breaks IME). poll: function() { var cm = this.cm, input = this.textarea, prevInput = this.prevInput; // Since this is called a *lot*, try to bail out as cheaply as // possible when it is clear that nothing happened. hasSelection // will be the case when there is a lot of text in the textarea, // in which case reading its value would be expensive. if (!cm.state.focused || (hasSelection(input) && !prevInput) || isReadOnly(cm) || cm.options.disableInput || cm.state.keySeq) return false; // See paste handler for more on the fakedLastChar kludge if (cm.state.pasteIncoming && cm.state.fakedLastChar) { input.value = input.value.substring(0, input.value.length - 1); cm.state.fakedLastChar = false; } var text = input.value; // If nothing changed, bail. if (text == prevInput && !cm.somethingSelected()) return false; // Work around nonsensical selection resetting in IE9/10, and // inexplicable appearance of private area unicode characters on // some key combos in Mac (#2689). if (ie && ie_version >= 9 && this.hasSelection === text || mac && /[\uf700-\uf7ff]/.test(text)) { cm.display.input.reset(); return false; } if (cm.doc.sel == cm.display.selForContextMenu) { var first = text.charCodeAt(0); if (first == 0x200b && !prevInput) prevInput = "\u200b"; if (first == 0x21da) { this.reset(); return this.cm.execCommand("undo"); } } // Find the part of the input that is actually new var same = 0, l = Math.min(prevInput.length, text.length); while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) ++same; var self = this; runInOp(cm, function() { applyTextInput(cm, text.slice(same), prevInput.length - same, null, self.composing ? "*compose" : null); // Don't leave long text in the textarea, since it makes further polling slow if (text.length > 1000 || text.indexOf("\n") > -1) input.value = self.prevInput = ""; else self.prevInput = text; if (self.composing) { self.composing.range.clear(); self.composing.range = cm.markText(self.composing.start, cm.getCursor("to"), {className: "CodeMirror-composing"}); } }); return true; }, ensurePolled: function() { if (this.pollingFast && this.poll()) this.pollingFast = false; }, onKeyPress: function() { if (ie && ie_version >= 9) this.hasSelection = null; this.fastPoll(); }, onContextMenu: function(e) { var input = this, cm = input.cm, display = cm.display, te = input.textarea; var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop; if (!pos || presto) return; // Opera is difficult. // Reset the current text selection only if the click is done outside of the selection // and 'resetSelectionOnContextMenu' option is true. var reset = cm.options.resetSelectionOnContextMenu; if (reset && cm.doc.sel.contains(pos) == -1) operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); var oldCSS = te.style.cssText; input.wrapper.style.position = "absolute"; te.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (e.clientY - 5) + "px; left: " + (e.clientX - 5) + "px; z-index: 1000; background: " + (ie ? "rgba(255, 255, 255, .05)" : "transparent") + "; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);"; if (webkit) var oldScrollY = window.scrollY; // Work around Chrome issue (#2712) display.input.focus(); if (webkit) window.scrollTo(null, oldScrollY); display.input.reset(); // Adds "Select all" to context menu in FF if (!cm.somethingSelected()) te.value = input.prevInput = " "; input.contextMenuPending = true; display.selForContextMenu = cm.doc.sel; clearTimeout(display.detectingSelectAll); // Select-all will be greyed out if there's nothing to select, so // this adds a zero-width space so that we can later check whether // it got selected. function prepareSelectAllHack() { if (te.selectionStart != null) { var selected = cm.somethingSelected(); var extval = "\u200b" + (selected ? te.value : ""); te.value = "\u21da"; // Used to catch context-menu undo te.value = extval; input.prevInput = selected ? "" : "\u200b"; te.selectionStart = 1; te.selectionEnd = extval.length; // Re-set this, in case some other handler touched the // selection in the meantime. display.selForContextMenu = cm.doc.sel; } } function rehide() { input.contextMenuPending = false; input.wrapper.style.position = "relative"; te.style.cssText = oldCSS; if (ie && ie_version < 9) display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); // Try to detect the user choosing select-all if (te.selectionStart != null) { if (!ie || (ie && ie_version < 9)) prepareSelectAllHack(); var i = 0, poll = function() { if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 && te.selectionEnd > 0 && input.prevInput == "\u200b") operation(cm, commands.selectAll)(cm); else if (i++ < 10) display.detectingSelectAll = setTimeout(poll, 500); else display.input.reset(); }; display.detectingSelectAll = setTimeout(poll, 200); } } if (ie && ie_version >= 9) prepareSelectAllHack(); if (captureRightClick) { e_stop(e); var mouseup = function() { off(window, "mouseup", mouseup); setTimeout(rehide, 20); }; on(window, "mouseup", mouseup); } else { setTimeout(rehide, 50); } }, setUneditable: nothing, needsContentAttribute: false }, TextareaInput.prototype); // CONTENTEDITABLE INPUT STYLE function ContentEditableInput(cm) { this.cm = cm; this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null; this.polling = new Delayed(); this.gracePeriod = false; } ContentEditableInput.prototype = copyObj({ init: function(display) { var input = this, cm = input.cm; var div = input.div = display.lineDiv; div.contentEditable = "true"; disableBrowserMagic(div); on(div, "paste", function(e) { var pasted = e.clipboardData && e.clipboardData.getData("text/plain"); if (pasted) { e.preventDefault(); cm.replaceSelection(pasted, null, "paste"); } }); on(div, "compositionstart", function(e) { var data = e.data; input.composing = {sel: cm.doc.sel, data: data, startData: data}; if (!data) return; var prim = cm.doc.sel.primary(); var line = cm.getLine(prim.head.line); var found = line.indexOf(data, Math.max(0, prim.head.ch - data.length)); if (found > -1 && found <= prim.head.ch) input.composing.sel = simpleSelection(Pos(prim.head.line, found), Pos(prim.head.line, found + data.length)); }); on(div, "compositionupdate", function(e) { input.composing.data = e.data; }); on(div, "compositionend", function(e) { var ours = input.composing; if (!ours) return; if (e.data != ours.startData && !/\u200b/.test(e.data)) ours.data = e.data; // Need a small delay to prevent other code (input event, // selection polling) from doing damage when fired right after // compositionend. setTimeout(function() { if (!ours.handled) input.applyComposition(ours); if (input.composing == ours) input.composing = null; }, 50); }); on(div, "touchstart", function() { input.forceCompositionEnd(); }); on(div, "input", function() { if (input.composing) return; if (!input.pollContent()) runInOp(input.cm, function() {regChange(cm);}); }); function onCopyCut(e) { if (cm.somethingSelected()) { lastCopied = cm.getSelections(); if (e.type == "cut") cm.replaceSelection("", null, "cut"); } else if (!cm.options.lineWiseCopyCut) { return; } else { var ranges = copyableRanges(cm); lastCopied = ranges.text; if (e.type == "cut") { cm.operation(function() { cm.setSelections(ranges.ranges, 0, sel_dontScroll); cm.replaceSelection("", null, "cut"); }); } } // iOS exposes the clipboard API, but seems to discard content inserted into it if (e.clipboardData && !ios) { e.preventDefault(); e.clipboardData.clearData(); e.clipboardData.setData("text/plain", lastCopied.join("\n")); } else { // Old-fashioned briefly-focus-a-textarea hack var kludge = hiddenTextarea(), te = kludge.firstChild; cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild); te.value = lastCopied.join("\n"); var hadFocus = document.activeElement; selectInput(te); setTimeout(function() { cm.display.lineSpace.removeChild(kludge); hadFocus.focus(); }, 50); } } on(div, "copy", onCopyCut); on(div, "cut", onCopyCut); }, prepareSelection: function() { var result = prepareSelection(this.cm, false); result.focus = this.cm.state.focused; return result; }, showSelection: function(info) { if (!info || !this.cm.display.view.length) return; if (info.focus) this.showPrimarySelection(); this.showMultipleSelections(info); }, showPrimarySelection: function() { var sel = window.getSelection(), prim = this.cm.doc.sel.primary(); var curAnchor = domToPos(this.cm, sel.anchorNode, sel.anchorOffset); var curFocus = domToPos(this.cm, sel.focusNode, sel.focusOffset); if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad && cmp(minPos(curAnchor, curFocus), prim.from()) == 0 && cmp(maxPos(curAnchor, curFocus), prim.to()) == 0) return; var start = posToDOM(this.cm, prim.from()); var end = posToDOM(this.cm, prim.to()); if (!start && !end) return; var view = this.cm.display.view; var old = sel.rangeCount && sel.getRangeAt(0); if (!start) { start = {node: view[0].measure.map[2], offset: 0}; } else if (!end) { // FIXME dangerously hacky var measure = view[view.length - 1].measure; var map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map; end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]}; } try { var rng = range(start.node, start.offset, end.offset, end.node); } catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible if (rng) { sel.removeAllRanges(); sel.addRange(rng); if (old && sel.anchorNode == null) sel.addRange(old); else if (gecko) this.startGracePeriod(); } this.rememberSelection(); }, startGracePeriod: function() { var input = this; clearTimeout(this.gracePeriod); this.gracePeriod = setTimeout(function() { input.gracePeriod = false; if (input.selectionChanged()) input.cm.operation(function() { input.cm.curOp.selectionChanged = true; }); }, 20); }, showMultipleSelections: function(info) { removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors); removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection); }, rememberSelection: function() { var sel = window.getSelection(); this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset; this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset; }, selectionInEditor: function() { var sel = window.getSelection(); if (!sel.rangeCount) return false; var node = sel.getRangeAt(0).commonAncestorContainer; return contains(this.div, node); }, focus: function() { if (this.cm.options.readOnly != "nocursor") this.div.focus(); }, blur: function() { this.div.blur(); }, getField: function() { return this.div; }, supportsTouch: function() { return true; }, receivedFocus: function() { var input = this; if (this.selectionInEditor()) this.pollSelection(); else runInOp(this.cm, function() { input.cm.curOp.selectionChanged = true; }); function poll() { if (input.cm.state.focused) { input.pollSelection(); input.polling.set(input.cm.options.pollInterval, poll); } } this.polling.set(this.cm.options.pollInterval, poll); }, selectionChanged: function() { var sel = window.getSelection(); return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset || sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset; }, pollSelection: function() { if (!this.composing && !this.gracePeriod && this.selectionChanged()) { var sel = window.getSelection(), cm = this.cm; this.rememberSelection(); var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); var head = domToPos(cm, sel.focusNode, sel.focusOffset); if (anchor && head) runInOp(cm, function() { setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll); if (anchor.bad || head.bad) cm.curOp.selectionChanged = true; }); } }, pollContent: function() { var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary(); var from = sel.from(), to = sel.to(); if (from.line < display.viewFrom || to.line > display.viewTo - 1) return false; var fromIndex; if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) { var fromLine = lineNo(display.view[0].line); var fromNode = display.view[0].node; } else { var fromLine = lineNo(display.view[fromIndex].line); var fromNode = display.view[fromIndex - 1].node.nextSibling; } var toIndex = findViewIndex(cm, to.line); if (toIndex == display.view.length - 1) { var toLine = display.viewTo - 1; var toNode = display.view[toIndex].node; } else { var toLine = lineNo(display.view[toIndex + 1].line) - 1; var toNode = display.view[toIndex + 1].node.previousSibling; } var newText = splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine)); var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length)); while (newText.length > 1 && oldText.length > 1) { if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; } else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; } else break; } var cutFront = 0, cutEnd = 0; var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length); while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront)) ++cutFront; var newBot = lst(newText), oldBot = lst(oldText); var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0), oldBot.length - (oldText.length == 1 ? cutFront : 0)); while (cutEnd < maxCutEnd && newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) ++cutEnd; newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd); newText[0] = newText[0].slice(cutFront); var chFrom = Pos(fromLine, cutFront); var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0); if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) { replaceRange(cm.doc, newText, chFrom, chTo, "+input"); return true; } }, ensurePolled: function() { this.forceCompositionEnd(); }, reset: function() { this.forceCompositionEnd(); }, forceCompositionEnd: function() { if (!this.composing || this.composing.handled) return; this.applyComposition(this.composing); this.composing.handled = true; this.div.blur(); this.div.focus(); }, applyComposition: function(composing) { if (composing.data && composing.data != composing.startData) operation(this.cm, applyTextInput)(this.cm, composing.data, 0, composing.sel); }, setUneditable: function(node) { node.setAttribute("contenteditable", "false"); }, onKeyPress: function(e) { e.preventDefault(); operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); }, onContextMenu: nothing, resetPosition: nothing, needsContentAttribute: true }, ContentEditableInput.prototype); function posToDOM(cm, pos) { var view = findViewForLine(cm, pos.line); if (!view || view.hidden) return null; var line = getLine(cm.doc, pos.line); var info = mapFromLineView(view, line, pos.line); var order = getOrder(line), side = "left"; if (order) { var partPos = getBidiPartAt(order, pos.ch); side = partPos % 2 ? "right" : "left"; } var result = nodeAndOffsetInLineMap(info.map, pos.ch, "left"); result.offset = result.collapse == "right" ? result.end : result.start; return result; } function badPos(pos, bad) { if (bad) pos.bad = true; return pos; } function domToPos(cm, node, offset) { var lineNode; if (node == cm.display.lineDiv) { lineNode = cm.display.lineDiv.childNodes[offset]; if (!lineNode) return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true); node = null; offset = 0; } else { for (lineNode = node;; lineNode = lineNode.parentNode) { if (!lineNode || lineNode == cm.display.lineDiv) return null; if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) break; } } for (var i = 0; i < cm.display.view.length; i++) { var lineView = cm.display.view[i]; if (lineView.node == lineNode) return locateNodeInLineView(lineView, node, offset); } } function locateNodeInLineView(lineView, node, offset) { var wrapper = lineView.text.firstChild, bad = false; if (!node || !contains(wrapper, node)) return badPos(Pos(lineNo(lineView.line), 0), true); if (node == wrapper) { bad = true; node = wrapper.childNodes[offset]; offset = 0; if (!node) { var line = lineView.rest ? lst(lineView.rest) : lineView.line; return badPos(Pos(lineNo(line), line.text.length), bad); } } var textNode = node.nodeType == 3 ? node : null, topNode = node; if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) { textNode = node.firstChild; if (offset) offset = textNode.nodeValue.length; } while (topNode.parentNode != wrapper) topNode = topNode.parentNode; var measure = lineView.measure, maps = measure.maps; function find(textNode, topNode, offset) { for (var i = -1; i < (maps ? maps.length : 0); i++) { var map = i < 0 ? measure.map : maps[i]; for (var j = 0; j < map.length; j += 3) { var curNode = map[j + 2]; if (curNode == textNode || curNode == topNode) { var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]); var ch = map[j] + offset; if (offset < 0 || curNode != textNode) ch = map[j + (offset ? 1 : 0)]; return Pos(line, ch); } } } } var found = find(textNode, topNode, offset); if (found) return badPos(found, bad); // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) { found = find(after, after.firstChild, 0); if (found) return badPos(Pos(found.line, found.ch - dist), bad); else dist += after.textContent.length; } for (var before = topNode.previousSibling, dist = offset; before; before = before.previousSibling) { found = find(before, before.firstChild, -1); if (found) return badPos(Pos(found.line, found.ch + dist), bad); else dist += after.textContent.length; } } function domTextBetween(cm, from, to, fromLine, toLine) { var text = "", closing = false; function recognizeMarker(id) { return function(marker) { return marker.id == id; }; } function walk(node) { if (node.nodeType == 1) { var cmText = node.getAttribute("cm-text"); if (cmText != null) { if (cmText == "") cmText = node.textContent.replace(/\u200b/g, ""); text += cmText; return; } var markerID = node.getAttribute("cm-marker"), range; if (markerID) { var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID)); if (found.length && (range = found[0].find())) text += getBetween(cm.doc, range.from, range.to).join("\n"); return; } if (node.getAttribute("contenteditable") == "false") return; for (var i = 0; i < node.childNodes.length; i++) walk(node.childNodes[i]); if (/^(pre|div|p)$/i.test(node.nodeName)) closing = true; } else if (node.nodeType == 3) { var val = node.nodeValue; if (!val) return; if (closing) { text += "\n"; closing = false; } text += val; } } for (;;) { walk(from); if (from == to) break; from = from.nextSibling; } return text; } CodeMirror.inputStyles = {"textarea": TextareaInput, "contenteditable": ContentEditableInput}; // SELECTION / CURSOR // Selection objects are immutable. A new one is created every time // the selection changes. A selection is one or more non-overlapping // (and non-touching) ranges, sorted, and an integer that indicates // which one is the primary selection (the one that's scrolled into // view, that getCursor returns, etc). function Selection(ranges, primIndex) { this.ranges = ranges; this.primIndex = primIndex; } Selection.prototype = { primary: function() { return this.ranges[this.primIndex]; }, equals: function(other) { if (other == this) return true; if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) return false; for (var i = 0; i < this.ranges.length; i++) { var here = this.ranges[i], there = other.ranges[i]; if (cmp(here.anchor, there.anchor) != 0 || cmp(here.head, there.head) != 0) return false; } return true; }, deepCopy: function() { for (var out = [], i = 0; i < this.ranges.length; i++) out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head)); return new Selection(out, this.primIndex); }, somethingSelected: function() { for (var i = 0; i < this.ranges.length; i++) if (!this.ranges[i].empty()) return true; return false; }, contains: function(pos, end) { if (!end) end = pos; for (var i = 0; i < this.ranges.length; i++) { var range = this.ranges[i]; if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0) return i; } return -1; } }; function Range(anchor, head) { this.anchor = anchor; this.head = head; } Range.prototype = { from: function() { return minPos(this.anchor, this.head); }, to: function() { return maxPos(this.anchor, this.head); }, empty: function() { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch; } }; // Take an unsorted, potentially overlapping set of ranges, and // build a selection out of it. 'Consumes' ranges array (modifying // it). function normalizeSelection(ranges, primIndex) { var prim = ranges[primIndex]; ranges.sort(function(a, b) { return cmp(a.from(), b.from()); }); primIndex = indexOf(ranges, prim); for (var i = 1; i < ranges.length; i++) { var cur = ranges[i], prev = ranges[i - 1]; if (cmp(prev.to(), cur.from()) >= 0) { var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to()); var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head; if (i <= primIndex) --primIndex; ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to)); } } return new Selection(ranges, primIndex); } function simpleSelection(anchor, head) { return new Selection([new Range(anchor, head || anchor)], 0); } // Most of the external API clips given positions to make sure they // actually exist within the document. function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1));} function clipPos(doc, pos) { if (pos.line < doc.first) return Pos(doc.first, 0); var last = doc.first + doc.size - 1; if (pos.line > last) return Pos(last, getLine(doc, last).text.length); return clipToLen(pos, getLine(doc, pos.line).text.length); } function clipToLen(pos, linelen) { var ch = pos.ch; if (ch == null || ch > linelen) return Pos(pos.line, linelen); else if (ch < 0) return Pos(pos.line, 0); else return pos; } function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size;} function clipPosArray(doc, array) { for (var out = [], i = 0; i < array.length; i++) out[i] = clipPos(doc, array[i]); return out; } // SELECTION UPDATES // The 'scroll' parameter given to many of these indicated whether // the new cursor position should be scrolled into view after // modifying the selection. // If shift is held or the extend flag is set, extends a range to // include a given position (and optionally a second position). // Otherwise, simply returns the range between the given positions. // Used for cursor motion and such. function extendRange(doc, range, head, other) { if (doc.cm && doc.cm.display.shift || doc.extend) { var anchor = range.anchor; if (other) { var posBefore = cmp(head, anchor) < 0; if (posBefore != (cmp(other, anchor) < 0)) { anchor = head; head = other; } else if (posBefore != (cmp(head, other) < 0)) { head = other; } } return new Range(anchor, head); } else { return new Range(other || head, head); } } // Extend the primary selection range, discard the rest. function extendSelection(doc, head, other, options) { setSelection(doc, new Selection([extendRange(doc, doc.sel.primary(), head, other)], 0), options); } // Extend all selections (pos is an array of selections with length // equal the number of selections) function extendSelections(doc, heads, options) { for (var out = [], i = 0; i < doc.sel.ranges.length; i++) out[i] = extendRange(doc, doc.sel.ranges[i], heads[i], null); var newSel = normalizeSelection(out, doc.sel.primIndex); setSelection(doc, newSel, options); } // Updates a single range in the selection. function replaceOneSelection(doc, i, range, options) { var ranges = doc.sel.ranges.slice(0); ranges[i] = range; setSelection(doc, normalizeSelection(ranges, doc.sel.primIndex), options); } // Reset the selection to a single range. function setSimpleSelection(doc, anchor, head, options) { setSelection(doc, simpleSelection(anchor, head), options); } // Give beforeSelectionChange handlers a change to influence a // selection update. function filterSelectionChange(doc, sel) { var obj = { ranges: sel.ranges, update: function(ranges) { this.ranges = []; for (var i = 0; i < ranges.length; i++) this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor), clipPos(doc, ranges[i].head)); } }; signal(doc, "beforeSelectionChange", doc, obj); if (doc.cm) signal(doc.cm, "beforeSelectionChange", doc.cm, obj); if (obj.ranges != sel.ranges) return normalizeSelection(obj.ranges, obj.ranges.length - 1); else return sel; } function setSelectionReplaceHistory(doc, sel, options) { var done = doc.history.done, last = lst(done); if (last && last.ranges) { done[done.length - 1] = sel; setSelectionNoUndo(doc, sel, options); } else { setSelection(doc, sel, options); } } // Set a new selection. function setSelection(doc, sel, options) { setSelectionNoUndo(doc, sel, options); addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options); } function setSelectionNoUndo(doc, sel, options) { if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange")) sel = filterSelectionChange(doc, sel); var bias = options && options.bias || (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1); setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true)); if (!(options && options.scroll === false) && doc.cm) ensureCursorVisible(doc.cm); } function setSelectionInner(doc, sel) { if (sel.equals(doc.sel)) return; doc.sel = sel; if (doc.cm) { doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged = true; signalCursorActivity(doc.cm); } signalLater(doc, "cursorActivity", doc); } // Verify that the selection does not partially select any atomic // marked ranges. function reCheckSelection(doc) { setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false), sel_dontScroll); } // Return a selection that does not partially select any atomic // ranges. function skipAtomicInSelection(doc, sel, bias, mayClear) { var out; for (var i = 0; i < sel.ranges.length; i++) { var range = sel.ranges[i]; var newAnchor = skipAtomic(doc, range.anchor, bias, mayClear); var newHead = skipAtomic(doc, range.head, bias, mayClear); if (out || newAnchor != range.anchor || newHead != range.head) { if (!out) out = sel.ranges.slice(0, i); out[i] = new Range(newAnchor, newHead); } } return out ? normalizeSelection(out, sel.primIndex) : sel; } // Ensure a given position is not inside an atomic range. function skipAtomic(doc, pos, bias, mayClear) { var flipped = false, curPos = pos; var dir = bias || 1; doc.cantEdit = false; search: for (;;) { var line = getLine(doc, curPos.line); if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) { var sp = line.markedSpans[i], m = sp.marker; if ((sp.from == null || (m.inclusiveLeft ? sp.from <= curPos.ch : sp.from < curPos.ch)) && (sp.to == null || (m.inclusiveRight ? sp.to >= curPos.ch : sp.to > curPos.ch))) { if (mayClear) { signal(m, "beforeCursorEnter"); if (m.explicitlyCleared) { if (!line.markedSpans) break; else {--i; continue;} } } if (!m.atomic) continue; var newPos = m.find(dir < 0 ? -1 : 1); if (cmp(newPos, curPos) == 0) { newPos.ch += dir; if (newPos.ch < 0) { if (newPos.line > doc.first) newPos = clipPos(doc, Pos(newPos.line - 1)); else newPos = null; } else if (newPos.ch > line.text.length) { if (newPos.line < doc.first + doc.size - 1) newPos = Pos(newPos.line + 1, 0); else newPos = null; } if (!newPos) { if (flipped) { // Driven in a corner -- no valid cursor position found at all // -- try again *with* clearing, if we didn't already if (!mayClear) return skipAtomic(doc, pos, bias, true); // Otherwise, turn off editing until further notice, and return the start of the doc doc.cantEdit = true; return Pos(doc.first, 0); } flipped = true; newPos = pos; dir = -dir; } } curPos = newPos; continue search; } } } return curPos; } } // SELECTION DRAWING function updateSelection(cm) { cm.display.input.showSelection(cm.display.input.prepareSelection()); } function prepareSelection(cm, primary) { var doc = cm.doc, result = {}; var curFragment = result.cursors = document.createDocumentFragment(); var selFragment = result.selection = document.createDocumentFragment(); for (var i = 0; i < doc.sel.ranges.length; i++) { if (primary === false && i == doc.sel.primIndex) continue; var range = doc.sel.ranges[i]; var collapsed = range.empty(); if (collapsed || cm.options.showCursorWhenSelecting) drawSelectionCursor(cm, range, curFragment); if (!collapsed) drawSelectionRange(cm, range, selFragment); } return result; } // Draws a cursor for the given range function drawSelectionCursor(cm, range, output) { var pos = cursorCoords(cm, range.head, "div", null, null, !cm.options.singleCursorHeightPerLine); var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor")); cursor.style.left = pos.left + "px"; cursor.style.top = pos.top + "px"; cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px"; if (pos.other) { // Secondary cursor, shown when on a 'jump' in bi-directional text var otherCursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor")); otherCursor.style.display = ""; otherCursor.style.left = pos.other.left + "px"; otherCursor.style.top = pos.other.top + "px"; otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px"; } } // Draws the given range as a highlighted selection function drawSelectionRange(cm, range, output) { var display = cm.display, doc = cm.doc; var fragment = document.createDocumentFragment(); var padding = paddingH(cm.display), leftSide = padding.left; var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right; function add(left, top, width, bottom) { if (top < 0) top = 0; top = Math.round(top); bottom = Math.round(bottom); fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left + "px; top: " + top + "px; width: " + (width == null ? rightSide - left : width) + "px; height: " + (bottom - top) + "px")); } function drawForLine(line, fromArg, toArg) { var lineObj = getLine(doc, line); var lineLen = lineObj.text.length; var start, end; function coords(ch, bias) { return charCoords(cm, Pos(line, ch), "div", lineObj, bias); } iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir) { var leftPos = coords(from, "left"), rightPos, left, right; if (from == to) { rightPos = leftPos; left = right = leftPos.left; } else { rightPos = coords(to - 1, "right"); if (dir == "rtl") { var tmp = leftPos; leftPos = rightPos; rightPos = tmp; } left = leftPos.left; right = rightPos.right; } if (fromArg == null && from == 0) left = leftSide; if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part add(left, leftPos.top, null, leftPos.bottom); left = leftSide; if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top); } if (toArg == null && to == lineLen) right = rightSide; if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left) start = leftPos; if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right) end = rightPos; if (left < leftSide + 1) left = leftSide; add(left, rightPos.top, right - left, rightPos.bottom); }); return {start: start, end: end}; } var sFrom = range.from(), sTo = range.to(); if (sFrom.line == sTo.line) { drawForLine(sFrom.line, sFrom.ch, sTo.ch); } else { var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line); var singleVLine = visualLine(fromLine) == visualLine(toLine); var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end; var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start; if (singleVLine) { if (leftEnd.top < rightStart.top - 2) { add(leftEnd.right, leftEnd.top, null, leftEnd.bottom); add(leftSide, rightStart.top, rightStart.left, rightStart.bottom); } else { add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom); } } if (leftEnd.bottom < rightStart.top) add(leftSide, leftEnd.bottom, null, rightStart.top); } output.appendChild(fragment); } // Cursor-blinking function restartBlink(cm) { if (!cm.state.focused) return; var display = cm.display; clearInterval(display.blinker); var on = true; display.cursorDiv.style.visibility = ""; if (cm.options.cursorBlinkRate > 0) display.blinker = setInterval(function() { display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden"; }, cm.options.cursorBlinkRate); else if (cm.options.cursorBlinkRate < 0) display.cursorDiv.style.visibility = "hidden"; } // HIGHLIGHT WORKER function startWorker(cm, time) { if (cm.doc.mode.startState && cm.doc.frontier < cm.display.viewTo) cm.state.highlight.set(time, bind(highlightWorker, cm)); } function highlightWorker(cm) { var doc = cm.doc; if (doc.frontier < doc.first) doc.frontier = doc.first; if (doc.frontier >= cm.display.viewTo) return; var end = +new Date + cm.options.workTime; var state = copyState(doc.mode, getStateBefore(cm, doc.frontier)); var changedLines = []; doc.iter(doc.frontier, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function(line) { if (doc.frontier >= cm.display.viewFrom) { // Visible var oldStyles = line.styles; var highlighted = highlightLine(cm, line, state, true); line.styles = highlighted.styles; var oldCls = line.styleClasses, newCls = highlighted.classes; if (newCls) line.styleClasses = newCls; else if (oldCls) line.styleClasses = null; var ischange = !oldStyles || oldStyles.length != line.styles.length || oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass); for (var i = 0; !ischange && i < oldStyles.length; ++i) ischange = oldStyles[i] != line.styles[i]; if (ischange) changedLines.push(doc.frontier); line.stateAfter = copyState(doc.mode, state); } else { processLine(cm, line.text, state); line.stateAfter = doc.frontier % 5 == 0 ? copyState(doc.mode, state) : null; } ++doc.frontier; if (+new Date > end) { startWorker(cm, cm.options.workDelay); return true; } }); if (changedLines.length) runInOp(cm, function() { for (var i = 0; i < changedLines.length; i++) regLineChange(cm, changedLines[i], "text"); }); } // Finds the line to start with when starting a parse. Tries to // find a line with a stateAfter, so that it can start with a // valid state. If that fails, it returns the line with the // smallest indentation, which tends to need the least context to // parse correctly. function findStartLine(cm, n, precise) { var minindent, minline, doc = cm.doc; var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100); for (var search = n; search > lim; --search) { if (search <= doc.first) return doc.first; var line = getLine(doc, search - 1); if (line.stateAfter && (!precise || search <= doc.frontier)) return search; var indented = countColumn(line.text, null, cm.options.tabSize); if (minline == null || minindent > indented) { minline = search - 1; minindent = indented; } } return minline; } function getStateBefore(cm, n, precise) { var doc = cm.doc, display = cm.display; if (!doc.mode.startState) return true; var pos = findStartLine(cm, n, precise), state = pos > doc.first && getLine(doc, pos-1).stateAfter; if (!state) state = startState(doc.mode); else state = copyState(doc.mode, state); doc.iter(pos, n, function(line) { processLine(cm, line.text, state); var save = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo; line.stateAfter = save ? copyState(doc.mode, state) : null; ++pos; }); if (precise) doc.frontier = pos; return state; } // POSITION MEASUREMENT function paddingTop(display) {return display.lineSpace.offsetTop;} function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight;} function paddingH(display) { if (display.cachedPaddingH) return display.cachedPaddingH; var e = removeChildrenAndAdd(display.measure, elt("pre", "x")); var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle; var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)}; if (!isNaN(data.left) && !isNaN(data.right)) display.cachedPaddingH = data; return data; } function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth; } function displayWidth(cm) { return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth; } function displayHeight(cm) { return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight; } // Ensure the lineView.wrapping.heights array is populated. This is // an array of bottom offsets for the lines that make up a drawn // line. When lineWrapping is on, there might be more than one // height. function ensureLineHeights(cm, lineView, rect) { var wrapping = cm.options.lineWrapping; var curWidth = wrapping && displayWidth(cm); if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) { var heights = lineView.measure.heights = []; if (wrapping) { lineView.measure.width = curWidth; var rects = lineView.text.firstChild.getClientRects(); for (var i = 0; i < rects.length - 1; i++) { var cur = rects[i], next = rects[i + 1]; if (Math.abs(cur.bottom - next.bottom) > 2) heights.push((cur.bottom + next.top) / 2 - rect.top); } } heights.push(rect.bottom - rect.top); } } // Find a line map (mapping character offsets to text nodes) and a // measurement cache for the given line number. (A line view might // contain multiple lines when collapsed ranges are present.) function mapFromLineView(lineView, line, lineN) { if (lineView.line == line) return {map: lineView.measure.map, cache: lineView.measure.cache}; for (var i = 0; i < lineView.rest.length; i++) if (lineView.rest[i] == line) return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]}; for (var i = 0; i < lineView.rest.length; i++) if (lineNo(lineView.rest[i]) > lineN) return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i], before: true}; } // Render a line into the hidden node display.externalMeasured. Used // when measurement is needed for a line that's not in the viewport. function updateExternalMeasurement(cm, line) { line = visualLine(line); var lineN = lineNo(line); var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN); view.lineN = lineN; var built = view.built = buildLineContent(cm, view); view.text = built.pre; removeChildrenAndAdd(cm.display.lineMeasure, built.pre); return view; } // Get a {top, bottom, left, right} box (in line-local coordinates) // for a given character. function measureChar(cm, line, ch, bias) { return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias); } // Find a line view that corresponds to the given line number. function findViewForLine(cm, lineN) { if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo) return cm.display.view[findViewIndex(cm, lineN)]; var ext = cm.display.externalMeasured; if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size) return ext; } // Measurement can be split in two steps, the set-up work that // applies to the whole line, and the measurement of the actual // character. Functions like coordsChar, that need to do a lot of // measurements in a row, can thus ensure that the set-up work is // only done once. function prepareMeasureForLine(cm, line) { var lineN = lineNo(line); var view = findViewForLine(cm, lineN); if (view && !view.text) view = null; else if (view && view.changes) updateLineForChanges(cm, view, lineN, getDimensions(cm)); if (!view) view = updateExternalMeasurement(cm, line); var info = mapFromLineView(view, line, lineN); return { line: line, view: view, rect: null, map: info.map, cache: info.cache, before: info.before, hasHeights: false }; } // Given a prepared measurement object, measures the position of an // actual character (or fetches it from the cache). function measureCharPrepared(cm, prepared, ch, bias, varHeight) { if (prepared.before) ch = -1; var key = ch + (bias || ""), found; if (prepared.cache.hasOwnProperty(key)) { found = prepared.cache[key]; } else { if (!prepared.rect) prepared.rect = prepared.view.text.getBoundingClientRect(); if (!prepared.hasHeights) { ensureLineHeights(cm, prepared.view, prepared.rect); prepared.hasHeights = true; } found = measureCharInner(cm, prepared, ch, bias); if (!found.bogus) prepared.cache[key] = found; } return {left: found.left, right: found.right, top: varHeight ? found.rtop : found.top, bottom: varHeight ? found.rbottom : found.bottom}; } var nullRect = {left: 0, right: 0, top: 0, bottom: 0}; function nodeAndOffsetInLineMap(map, ch, bias) { var node, start, end, collapse; // First, search the line map for the text node corresponding to, // or closest to, the target character. for (var i = 0; i < map.length; i += 3) { var mStart = map[i], mEnd = map[i + 1]; if (ch < mStart) { start = 0; end = 1; collapse = "left"; } else if (ch < mEnd) { start = ch - mStart; end = start + 1; } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) { end = mEnd - mStart; start = end - 1; if (ch >= mEnd) collapse = "right"; } if (start != null) { node = map[i + 2]; if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right")) collapse = bias; if (bias == "left" && start == 0) while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) { node = map[(i -= 3) + 2]; collapse = "left"; } if (bias == "right" && start == mEnd - mStart) while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) { node = map[(i += 3) + 2]; collapse = "right"; } break; } } return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd}; } function measureCharInner(cm, prepared, ch, bias) { var place = nodeAndOffsetInLineMap(prepared.map, ch, bias); var node = place.node, start = place.start, end = place.end, collapse = place.collapse; var rect; if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates. for (var i = 0; i < 4; i++) { // Retry a maximum of 4 times when nonsense rectangles are returned while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) --start; while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) ++end; if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart) { rect = node.parentNode.getBoundingClientRect(); } else if (ie && cm.options.lineWrapping) { var rects = range(node, start, end).getClientRects(); if (rects.length) rect = rects[bias == "right" ? rects.length - 1 : 0]; else rect = nullRect; } else { rect = range(node, start, end).getBoundingClientRect() || nullRect; } if (rect.left || rect.right || start == 0) break; end = start; start = start - 1; collapse = "right"; } if (ie && ie_version < 11) rect = maybeUpdateRectForZooming(cm.display.measure, rect); } else { // If it is a widget, simply get the box for the whole widget. if (start > 0) collapse = bias = "right"; var rects; if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1) rect = rects[bias == "right" ? rects.length - 1 : 0]; else rect = node.getBoundingClientRect(); } if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) { var rSpan = node.parentNode.getClientRects()[0]; if (rSpan) rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; else rect = nullRect; } var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top; var mid = (rtop + rbot) / 2; var heights = prepared.view.measure.heights; for (var i = 0; i < heights.length - 1; i++) if (mid < heights[i]) break; var top = i ? heights[i - 1] : 0, bot = heights[i]; var result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left, right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left, top: top, bottom: bot}; if (!rect.left && !rect.right) result.bogus = true; if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; } return result; } // Work around problem with bounding client rects on ranges being // returned incorrectly when zoomed on IE10 and below. function maybeUpdateRectForZooming(measure, rect) { if (!window.screen || screen.logicalXDPI == null || screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure)) return rect; var scaleX = screen.logicalXDPI / screen.deviceXDPI; var scaleY = screen.logicalYDPI / screen.deviceYDPI; return {left: rect.left * scaleX, right: rect.right * scaleX, top: rect.top * scaleY, bottom: rect.bottom * scaleY}; } function clearLineMeasurementCacheFor(lineView) { if (lineView.measure) { lineView.measure.cache = {}; lineView.measure.heights = null; if (lineView.rest) for (var i = 0; i < lineView.rest.length; i++) lineView.measure.caches[i] = {}; } } function clearLineMeasurementCache(cm) { cm.display.externalMeasure = null; removeChildren(cm.display.lineMeasure); for (var i = 0; i < cm.display.view.length; i++) clearLineMeasurementCacheFor(cm.display.view[i]); } function clearCaches(cm) { clearLineMeasurementCache(cm); cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null; if (!cm.options.lineWrapping) cm.display.maxLineChanged = true; cm.display.lineNumChars = null; } function pageScrollX() { return window.pageXOffset || (document.documentElement || document.body).scrollLeft; } function pageScrollY() { return window.pageYOffset || (document.documentElement || document.body).scrollTop; } // Converts a {top, bottom, left, right} box from line-local // coordinates into another coordinate system. Context may be one of // "line", "div" (display.lineDiv), "local"/null (editor), "window", // or "page". function intoCoordSystem(cm, lineObj, rect, context) { if (lineObj.widgets) for (var i = 0; i < lineObj.widgets.length; ++i) if (lineObj.widgets[i].above) { var size = widgetHeight(lineObj.widgets[i]); rect.top += size; rect.bottom += size; } if (context == "line") return rect; if (!context) context = "local"; var yOff = heightAtLine(lineObj); if (context == "local") yOff += paddingTop(cm.display); else yOff -= cm.display.viewOffset; if (context == "page" || context == "window") { var lOff = cm.display.lineSpace.getBoundingClientRect(); yOff += lOff.top + (context == "window" ? 0 : pageScrollY()); var xOff = lOff.left + (context == "window" ? 0 : pageScrollX()); rect.left += xOff; rect.right += xOff; } rect.top += yOff; rect.bottom += yOff; return rect; } // Coverts a box from "div" coords to another coordinate system. // Context may be "window", "page", "div", or "local"/null. function fromCoordSystem(cm, coords, context) { if (context == "div") return coords; var left = coords.left, top = coords.top; // First move into "page" coordinate system if (context == "page") { left -= pageScrollX(); top -= pageScrollY(); } else if (context == "local" || !context) { var localBox = cm.display.sizer.getBoundingClientRect(); left += localBox.left; top += localBox.top; } var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect(); return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top}; } function charCoords(cm, pos, context, lineObj, bias) { if (!lineObj) lineObj = getLine(cm.doc, pos.line); return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context); } // Returns a box for a given cursor position, which may have an // 'other' property containing the position of the secondary cursor // on a bidi boundary. function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) { lineObj = lineObj || getLine(cm.doc, pos.line); if (!preparedMeasure) preparedMeasure = prepareMeasureForLine(cm, lineObj); function get(ch, right) { var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight); if (right) m.left = m.right; else m.right = m.left; return intoCoordSystem(cm, lineObj, m, context); } function getBidi(ch, partPos) { var part = order[partPos], right = part.level % 2; if (ch == bidiLeft(part) && partPos && part.level < order[partPos - 1].level) { part = order[--partPos]; ch = bidiRight(part) - (part.level % 2 ? 0 : 1); right = true; } else if (ch == bidiRight(part) && partPos < order.length - 1 && part.level < order[partPos + 1].level) { part = order[++partPos]; ch = bidiLeft(part) - part.level % 2; right = false; } if (right && ch == part.to && ch > part.from) return get(ch - 1); return get(ch, right); } var order = getOrder(lineObj), ch = pos.ch; if (!order) return get(ch); var partPos = getBidiPartAt(order, ch); var val = getBidi(ch, partPos); if (bidiOther != null) val.other = getBidi(ch, bidiOther); return val; } // Used to cheaply estimate the coordinates for a position. Used for // intermediate scroll updates. function estimateCoords(cm, pos) { var left = 0, pos = clipPos(cm.doc, pos); if (!cm.options.lineWrapping) left = charWidth(cm.display) * pos.ch; var lineObj = getLine(cm.doc, pos.line); var top = heightAtLine(lineObj) + paddingTop(cm.display); return {left: left, right: left, top: top, bottom: top + lineObj.height}; } // Positions returned by coordsChar contain some extra information. // xRel is the relative x position of the input coordinates compared // to the found position (so xRel > 0 means the coordinates are to // the right of the character position, for example). When outside // is true, that means the coordinates lie outside the line's // vertical range. function PosWithInfo(line, ch, outside, xRel) { var pos = Pos(line, ch); pos.xRel = xRel; if (outside) pos.outside = true; return pos; } // Compute the character position closest to the given coordinates. // Input must be lineSpace-local ("div" coordinate system). function coordsChar(cm, x, y) { var doc = cm.doc; y += cm.display.viewOffset; if (y < 0) return PosWithInfo(doc.first, 0, true, -1); var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1; if (lineN > last) return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, true, 1); if (x < 0) x = 0; var lineObj = getLine(doc, lineN); for (;;) { var found = coordsCharInner(cm, lineObj, lineN, x, y); var merged = collapsedSpanAtEnd(lineObj); var mergedPos = merged && merged.find(0, true); if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0)) lineN = lineNo(lineObj = mergedPos.to.line); else return found; } } function coordsCharInner(cm, lineObj, lineNo, x, y) { var innerOff = y - heightAtLine(lineObj); var wrongLine = false, adjust = 2 * cm.display.wrapper.clientWidth; var preparedMeasure = prepareMeasureForLine(cm, lineObj); function getX(ch) { var sp = cursorCoords(cm, Pos(lineNo, ch), "line", lineObj, preparedMeasure); wrongLine = true; if (innerOff > sp.bottom) return sp.left - adjust; else if (innerOff < sp.top) return sp.left + adjust; else wrongLine = false; return sp.left; } var bidi = getOrder(lineObj), dist = lineObj.text.length; var from = lineLeft(lineObj), to = lineRight(lineObj); var fromX = getX(from), fromOutside = wrongLine, toX = getX(to), toOutside = wrongLine; if (x > toX) return PosWithInfo(lineNo, to, toOutside, 1); // Do a binary search between these bounds. for (;;) { if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) { var ch = x < fromX || x - fromX <= toX - x ? from : to; var xDiff = x - (ch == from ? fromX : toX); while (isExtendingChar(lineObj.text.charAt(ch))) ++ch; var pos = PosWithInfo(lineNo, ch, ch == from ? fromOutside : toOutside, xDiff < -1 ? -1 : xDiff > 1 ? 1 : 0); return pos; } var step = Math.ceil(dist / 2), middle = from + step; if (bidi) { middle = from; for (var i = 0; i < step; ++i) middle = moveVisually(lineObj, middle, 1); } var middleX = getX(middle); if (middleX > x) {to = middle; toX = middleX; if (toOutside = wrongLine) toX += 1000; dist = step;} else {from = middle; fromX = middleX; fromOutside = wrongLine; dist -= step;} } } var measureText; // Compute the default text height. function textHeight(display) { if (display.cachedTextHeight != null) return display.cachedTextHeight; if (measureText == null) { measureText = elt("pre"); // Measure a bunch of lines, for browsers that compute // fractional heights. for (var i = 0; i < 49; ++i) { measureText.appendChild(document.createTextNode("x")); measureText.appendChild(elt("br")); } measureText.appendChild(document.createTextNode("x")); } removeChildrenAndAdd(display.measure, measureText); var height = measureText.offsetHeight / 50; if (height > 3) display.cachedTextHeight = height; removeChildren(display.measure); return height || 1; } // Compute the default character width. function charWidth(display) { if (display.cachedCharWidth != null) return display.cachedCharWidth; var anchor = elt("span", "xxxxxxxxxx"); var pre = elt("pre", [anchor]); removeChildrenAndAdd(display.measure, pre); var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10; if (width > 2) display.cachedCharWidth = width; return width || 10; } // OPERATIONS // Operations are used to wrap a series of changes to the editor // state in such a way that each change won't have to update the // cursor and display (which would be awkward, slow, and // error-prone). Instead, display updates are batched and then all // combined and executed at once. var operationGroup = null; var nextOpId = 0; // Start a new operation. function startOperation(cm) { cm.curOp = { cm: cm, viewChanged: false, // Flag that indicates that lines might need to be redrawn startHeight: cm.doc.height, // Used to detect need to update scrollbar forceUpdate: false, // Used to force a redraw updateInput: null, // Whether to reset the input textarea typing: false, // Whether this reset should be careful to leave existing text (for compositing) changeObjs: null, // Accumulated changes, for firing change events cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already selectionChanged: false, // Whether the selection needs to be redrawn updateMaxLine: false, // Set when the widest line needs to be determined anew scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet scrollToPos: null, // Used to scroll to a specific position focus: false, id: ++nextOpId // Unique ID }; if (operationGroup) { operationGroup.ops.push(cm.curOp); } else { cm.curOp.ownsGroup = operationGroup = { ops: [cm.curOp], delayedCallbacks: [] }; } } function fireCallbacksForOps(group) { // Calls delayed callbacks and cursorActivity handlers until no // new ones appear var callbacks = group.delayedCallbacks, i = 0; do { for (; i < callbacks.length; i++) callbacks[i](); for (var j = 0; j < group.ops.length; j++) { var op = group.ops[j]; if (op.cursorActivityHandlers) while (op.cursorActivityCalled < op.cursorActivityHandlers.length) op.cursorActivityHandlers[op.cursorActivityCalled++](op.cm); } } while (i < callbacks.length); } // Finish an operation, updating the display and signalling delayed events function endOperation(cm) { var op = cm.curOp, group = op.ownsGroup; if (!group) return; try { fireCallbacksForOps(group); } finally { operationGroup = null; for (var i = 0; i < group.ops.length; i++) group.ops[i].cm.curOp = null; endOperations(group); } } // The DOM updates done when an operation finishes are batched so // that the minimum number of relayouts are required. function endOperations(group) { var ops = group.ops; for (var i = 0; i < ops.length; i++) // Read DOM endOperation_R1(ops[i]); for (var i = 0; i < ops.length; i++) // Write DOM (maybe) endOperation_W1(ops[i]); for (var i = 0; i < ops.length; i++) // Read DOM endOperation_R2(ops[i]); for (var i = 0; i < ops.length; i++) // Write DOM (maybe) endOperation_W2(ops[i]); for (var i = 0; i < ops.length; i++) // Read DOM endOperation_finish(ops[i]); } function endOperation_R1(op) { var cm = op.cm, display = cm.display; maybeClipScrollbars(cm); if (op.updateMaxLine) findMaxLine(cm); op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null || op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom || op.scrollToPos.to.line >= display.viewTo) || display.maxLineChanged && cm.options.lineWrapping; op.update = op.mustUpdate && new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate); } function endOperation_W1(op) { op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update); } function endOperation_R2(op) { var cm = op.cm, display = cm.display; if (op.updatedDisplay) updateHeightsInViewport(cm); op.barMeasure = measureForScrollbars(cm); // If the max line changed since it was last measured, measure it, // and ensure the document's width matches it. // updateDisplay_W2 will use these properties to do the actual resizing if (display.maxLineChanged && !cm.options.lineWrapping) { op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3; cm.display.sizerWidth = op.adjustWidthTo; op.barMeasure.scrollWidth = Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth); op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm)); } if (op.updatedDisplay || op.selectionChanged) op.preparedSelection = display.input.prepareSelection(); } function endOperation_W2(op) { var cm = op.cm; if (op.adjustWidthTo != null) { cm.display.sizer.style.minWidth = op.adjustWidthTo + "px"; if (op.maxScrollLeft < cm.doc.scrollLeft) setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); cm.display.maxLineChanged = false; } if (op.preparedSelection) cm.display.input.showSelection(op.preparedSelection); if (op.updatedDisplay) setDocumentHeight(cm, op.barMeasure); if (op.updatedDisplay || op.startHeight != cm.doc.height) updateScrollbars(cm, op.barMeasure); if (op.selectionChanged) restartBlink(cm); if (cm.state.focused && op.updateInput) cm.display.input.reset(op.typing); if (op.focus && op.focus == activeElt()) ensureFocus(op.cm); } function endOperation_finish(op) { var cm = op.cm, display = cm.display, doc = cm.doc; if (op.updatedDisplay) postUpdateDisplay(cm, op.update); // Abort mouse wheel delta measurement, when scrolling explicitly if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos)) display.wheelStartX = display.wheelStartY = null; // Propagate the scroll position to the actual DOM scroller if (op.scrollTop != null && (display.scroller.scrollTop != op.scrollTop || op.forceScroll)) { doc.scrollTop = Math.max(0, Math.min(display.scroller.scrollHeight - display.scroller.clientHeight, op.scrollTop)); display.scrollbars.setScrollTop(doc.scrollTop); display.scroller.scrollTop = doc.scrollTop; } if (op.scrollLeft != null && (display.scroller.scrollLeft != op.scrollLeft || op.forceScroll)) { doc.scrollLeft = Math.max(0, Math.min(display.scroller.scrollWidth - displayWidth(cm), op.scrollLeft)); display.scrollbars.setScrollLeft(doc.scrollLeft); display.scroller.scrollLeft = doc.scrollLeft; alignHorizontally(cm); } // If we need to scroll a specific position into view, do so. if (op.scrollToPos) { var coords = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from), clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin); if (op.scrollToPos.isCursor && cm.state.focused) maybeScrollWindow(cm, coords); } // Fire events for markers that are hidden/unidden by editing or // undoing var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers; if (hidden) for (var i = 0; i < hidden.length; ++i) if (!hidden[i].lines.length) signal(hidden[i], "hide"); if (unhidden) for (var i = 0; i < unhidden.length; ++i) if (unhidden[i].lines.length) signal(unhidden[i], "unhide"); if (display.wrapper.offsetHeight) doc.scrollTop = cm.display.scroller.scrollTop; // Fire change events, and delayed event handlers if (op.changeObjs) signal(cm, "changes", cm, op.changeObjs); if (op.update) op.update.finish(); } // Run the given function in an operation function runInOp(cm, f) { if (cm.curOp) return f(); startOperation(cm); try { return f(); } finally { endOperation(cm); } } // Wraps a function in an operation. Returns the wrapped function. function operation(cm, f) { return function() { if (cm.curOp) return f.apply(cm, arguments); startOperation(cm); try { return f.apply(cm, arguments); } finally { endOperation(cm); } }; } // Used to add methods to editor and doc instances, wrapping them in // operations. function methodOp(f) { return function() { if (this.curOp) return f.apply(this, arguments); startOperation(this); try { return f.apply(this, arguments); } finally { endOperation(this); } }; } function docMethodOp(f) { return function() { var cm = this.cm; if (!cm || cm.curOp) return f.apply(this, arguments); startOperation(cm); try { return f.apply(this, arguments); } finally { endOperation(cm); } }; } // VIEW TRACKING // These objects are used to represent the visible (currently drawn) // part of the document. A LineView may correspond to multiple // logical lines, if those are connected by collapsed ranges. function LineView(doc, line, lineN) { // The starting line this.line = line; // Continuing lines, if any this.rest = visualLineContinued(line); // Number of logical lines in this visual line this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1; this.node = this.text = null; this.hidden = lineIsHidden(doc, line); } // Create a range of LineView objects for the given lines. function buildViewArray(cm, from, to) { var array = [], nextPos; for (var pos = from; pos < to; pos = nextPos) { var view = new LineView(cm.doc, getLine(cm.doc, pos), pos); nextPos = pos + view.size; array.push(view); } return array; } // Updates the display.view data structure for a given change to the // document. From and to are in pre-change coordinates. Lendiff is // the amount of lines added or subtracted by the change. This is // used for changes that span multiple lines, or change the way // lines are divided into visual lines. regLineChange (below) // registers single-line changes. function regChange(cm, from, to, lendiff) { if (from == null) from = cm.doc.first; if (to == null) to = cm.doc.first + cm.doc.size; if (!lendiff) lendiff = 0; var display = cm.display; if (lendiff && to < display.viewTo && (display.updateLineNumbers == null || display.updateLineNumbers > from)) display.updateLineNumbers = from; cm.curOp.viewChanged = true; if (from >= display.viewTo) { // Change after if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo) resetView(cm); } else if (to <= display.viewFrom) { // Change before if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) { resetView(cm); } else { display.viewFrom += lendiff; display.viewTo += lendiff; } } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap resetView(cm); } else if (from <= display.viewFrom) { // Top overlap var cut = viewCuttingPoint(cm, to, to + lendiff, 1); if (cut) { display.view = display.view.slice(cut.index); display.viewFrom = cut.lineN; display.viewTo += lendiff; } else { resetView(cm); } } else if (to >= display.viewTo) { // Bottom overlap var cut = viewCuttingPoint(cm, from, from, -1); if (cut) { display.view = display.view.slice(0, cut.index); display.viewTo = cut.lineN; } else { resetView(cm); } } else { // Gap in the middle var cutTop = viewCuttingPoint(cm, from, from, -1); var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1); if (cutTop && cutBot) { display.view = display.view.slice(0, cutTop.index) .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN)) .concat(display.view.slice(cutBot.index)); display.viewTo += lendiff; } else { resetView(cm); } } var ext = display.externalMeasured; if (ext) { if (to < ext.lineN) ext.lineN += lendiff; else if (from < ext.lineN + ext.size) display.externalMeasured = null; } } // Register a change to a single line. Type must be one of "text", // "gutter", "class", "widget" function regLineChange(cm, line, type) { cm.curOp.viewChanged = true; var display = cm.display, ext = cm.display.externalMeasured; if (ext && line >= ext.lineN && line < ext.lineN + ext.size) display.externalMeasured = null; if (line < display.viewFrom || line >= display.viewTo) return; var lineView = display.view[findViewIndex(cm, line)]; if (lineView.node == null) return; var arr = lineView.changes || (lineView.changes = []); if (indexOf(arr, type) == -1) arr.push(type); } // Clear the view. function resetView(cm) { cm.display.viewFrom = cm.display.viewTo = cm.doc.first; cm.display.view = []; cm.display.viewOffset = 0; } // Find the view element corresponding to a given line. Return null // when the line isn't visible. function findViewIndex(cm, n) { if (n >= cm.display.viewTo) return null; n -= cm.display.viewFrom; if (n < 0) return null; var view = cm.display.view; for (var i = 0; i < view.length; i++) { n -= view[i].size; if (n < 0) return i; } } function viewCuttingPoint(cm, oldN, newN, dir) { var index = findViewIndex(cm, oldN), diff, view = cm.display.view; if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size) return {index: index, lineN: newN}; for (var i = 0, n = cm.display.viewFrom; i < index; i++) n += view[i].size; if (n != oldN) { if (dir > 0) { if (index == view.length - 1) return null; diff = (n + view[index].size) - oldN; index++; } else { diff = n - oldN; } oldN += diff; newN += diff; } while (visualLineNo(cm.doc, newN) != newN) { if (index == (dir < 0 ? 0 : view.length - 1)) return null; newN += dir * view[index - (dir < 0 ? 1 : 0)].size; index += dir; } return {index: index, lineN: newN}; } // Force the view to cover a given range, adding empty view element // or clipping off existing ones as needed. function adjustView(cm, from, to) { var display = cm.display, view = display.view; if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) { display.view = buildViewArray(cm, from, to); display.viewFrom = from; } else { if (display.viewFrom > from) display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); else if (display.viewFrom < from) display.view = display.view.slice(findViewIndex(cm, from)); display.viewFrom = from; if (display.viewTo < to) display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); else if (display.viewTo > to) display.view = display.view.slice(0, findViewIndex(cm, to)); } display.viewTo = to; } // Count the number of lines in the view whose DOM representation is // out of date (or nonexistent). function countDirtyView(cm) { var view = cm.display.view, dirty = 0; for (var i = 0; i < view.length; i++) { var lineView = view[i]; if (!lineView.hidden && (!lineView.node || lineView.changes)) ++dirty; } return dirty; } // EVENT HANDLERS // Attach the necessary event handlers when initializing the editor function registerEventHandlers(cm) { var d = cm.display; on(d.scroller, "mousedown", operation(cm, onMouseDown)); // Older IE's will not fire a second mousedown for a double click if (ie && ie_version < 11) on(d.scroller, "dblclick", operation(cm, function(e) { if (signalDOMEvent(cm, e)) return; var pos = posFromMouse(cm, e); if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) return; e_preventDefault(e); var word = cm.findWordAt(pos); extendSelection(cm.doc, word.anchor, word.head); })); else on(d.scroller, "dblclick", function(e) { signalDOMEvent(cm, e) || e_preventDefault(e); }); // Some browsers fire contextmenu *after* opening the menu, at // which point we can't mess with it anymore. Context menu is // handled in onMouseDown for these browsers. if (!captureRightClick) on(d.scroller, "contextmenu", function(e) {onContextMenu(cm, e);}); // Used to suppress mouse event handling when a touch happens var touchFinished, prevTouch = {end: 0}; function finishTouch() { if (d.activeTouch) { touchFinished = setTimeout(function() {d.activeTouch = null;}, 1000); prevTouch = d.activeTouch; prevTouch.end = +new Date; } }; function isMouseLikeTouchEvent(e) { if (e.touches.length != 1) return false; var touch = e.touches[0]; return touch.radiusX <= 1 && touch.radiusY <= 1; } function farAway(touch, other) { if (other.left == null) return true; var dx = other.left - touch.left, dy = other.top - touch.top; return dx * dx + dy * dy > 20 * 20; } on(d.scroller, "touchstart", function(e) { if (!isMouseLikeTouchEvent(e)) { clearTimeout(touchFinished); var now = +new Date; d.activeTouch = {start: now, moved: false, prev: now - prevTouch.end <= 300 ? prevTouch : null}; if (e.touches.length == 1) { d.activeTouch.left = e.touches[0].pageX; d.activeTouch.top = e.touches[0].pageY; } } }); on(d.scroller, "touchmove", function() { if (d.activeTouch) d.activeTouch.moved = true; }); on(d.scroller, "touchend", function(e) { var touch = d.activeTouch; if (touch && !eventInWidget(d, e) && touch.left != null && !touch.moved && new Date - touch.start < 300) { var pos = cm.coordsChar(d.activeTouch, "page"), range; if (!touch.prev || farAway(touch, touch.prev)) // Single tap range = new Range(pos, pos); else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap range = cm.findWordAt(pos); else // Triple tap range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); cm.setSelection(range.anchor, range.head); cm.focus(); e_preventDefault(e); } finishTouch(); }); on(d.scroller, "touchcancel", finishTouch); // Sync scrolling between fake scrollbars and real scrollable // area, ensure viewport is updated when scrolling. on(d.scroller, "scroll", function() { if (d.scroller.clientHeight) { setScrollTop(cm, d.scroller.scrollTop); setScrollLeft(cm, d.scroller.scrollLeft, true); signal(cm, "scroll", cm); } }); // Listen to wheel events in order to try and update the viewport on time. on(d.scroller, "mousewheel", function(e){onScrollWheel(cm, e);}); on(d.scroller, "DOMMouseScroll", function(e){onScrollWheel(cm, e);}); // Prevent wrapper from ever scrolling on(d.wrapper, "scroll", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; }); d.dragFunctions = { simple: function(e) {if (!signalDOMEvent(cm, e)) e_stop(e);}, start: function(e){onDragStart(cm, e);}, drop: operation(cm, onDrop) }; var inp = d.input.getField(); on(inp, "keyup", function(e) { onKeyUp.call(cm, e); }); on(inp, "keydown", operation(cm, onKeyDown)); on(inp, "keypress", operation(cm, onKeyPress)); on(inp, "focus", bind(onFocus, cm)); on(inp, "blur", bind(onBlur, cm)); } function dragDropChanged(cm, value, old) { var wasOn = old && old != CodeMirror.Init; if (!value != !wasOn) { var funcs = cm.display.dragFunctions; var toggle = value ? on : off; toggle(cm.display.scroller, "dragstart", funcs.start); toggle(cm.display.scroller, "dragenter", funcs.simple); toggle(cm.display.scroller, "dragover", funcs.simple); toggle(cm.display.scroller, "drop", funcs.drop); } } // Called when the window resizes function onResize(cm) { var d = cm.display; if (d.lastWrapHeight == d.wrapper.clientHeight && d.lastWrapWidth == d.wrapper.clientWidth) return; // Might be a text scaling operation, clear size caches. d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; d.scrollbarsClipped = false; cm.setSize(); } // MOUSE EVENTS // Return true when the given mouse event happened in a widget function eventInWidget(display, e) { for (var n = e_target(e); n != display.wrapper; n = n.parentNode) { if (!n || (n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true") || (n.parentNode == display.sizer && n != display.mover)) return true; } } // Given a mouse event, find the corresponding position. If liberal // is false, it checks whether a gutter or scrollbar was clicked, // and returns null if it was. forRect is used by rectangular // selections, and tries to estimate a character position even for // coordinates beyond the right of the text. function posFromMouse(cm, e, liberal, forRect) { var display = cm.display; if (!liberal && e_target(e).getAttribute("cm-not-content") == "true") return null; var x, y, space = display.lineSpace.getBoundingClientRect(); // Fails unpredictably on IE[67] when mouse is dragged around quickly. try { x = e.clientX - space.left; y = e.clientY - space.top; } catch (e) { return null; } var coords = coordsChar(cm, x, y), line; if (forRect && coords.xRel == 1 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) { var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length; coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff)); } return coords; } // A mouse down can be a single click, double click, triple click, // start of selection drag, start of text drag, new cursor // (ctrl-click), rectangle drag (alt-drag), or xwin // middle-click-paste. Or it might be a click on something we should // not interfere with, such as a scrollbar or widget. function onMouseDown(e) { var cm = this, display = cm.display; if (display.activeTouch && display.input.supportsTouch() || signalDOMEvent(cm, e)) return; display.shift = e.shiftKey; if (eventInWidget(display, e)) { if (!webkit) { // Briefly turn off draggability, to allow widgets to do // normal dragging things. display.scroller.draggable = false; setTimeout(function(){display.scroller.draggable = true;}, 100); } return; } if (clickInGutter(cm, e)) return; var start = posFromMouse(cm, e); window.focus(); switch (e_button(e)) { case 1: if (start) leftButtonDown(cm, e, start); else if (e_target(e) == display.scroller) e_preventDefault(e); break; case 2: if (webkit) cm.state.lastMiddleDown = +new Date; if (start) extendSelection(cm.doc, start); setTimeout(function() {display.input.focus();}, 20); e_preventDefault(e); break; case 3: if (captureRightClick) onContextMenu(cm, e); else delayBlurEvent(cm); break; } } var lastClick, lastDoubleClick; function leftButtonDown(cm, e, start) { if (ie) setTimeout(bind(ensureFocus, cm), 0); else cm.curOp.focus = activeElt(); var now = +new Date, type; if (lastDoubleClick && lastDoubleClick.time > now - 400 && cmp(lastDoubleClick.pos, start) == 0) { type = "triple"; } else if (lastClick && lastClick.time > now - 400 && cmp(lastClick.pos, start) == 0) { type = "double"; lastDoubleClick = {time: now, pos: start}; } else { type = "single"; lastClick = {time: now, pos: start}; } var sel = cm.doc.sel, modifier = mac ? e.metaKey : e.ctrlKey, contained; if (cm.options.dragDrop && dragAndDrop && !isReadOnly(cm) && type == "single" && (contained = sel.contains(start)) > -1 && !sel.ranges[contained].empty()) leftButtonStartDrag(cm, e, start, modifier); else leftButtonSelect(cm, e, start, type, modifier); } // Start a text drag. When it ends, see if any dragging actually // happen, and treat as a click if it didn't. function leftButtonStartDrag(cm, e, start, modifier) { var display = cm.display, startTime = +new Date; var dragEnd = operation(cm, function(e2) { if (webkit) display.scroller.draggable = false; cm.state.draggingText = false; off(document, "mouseup", dragEnd); off(display.scroller, "drop", dragEnd); if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) { e_preventDefault(e2); if (!modifier && +new Date - 200 < startTime) extendSelection(cm.doc, start); // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081) if (webkit || ie && ie_version == 9) setTimeout(function() {document.body.focus(); display.input.focus();}, 20); else display.input.focus(); } }); // Let the drag handler handle this. if (webkit) display.scroller.draggable = true; cm.state.draggingText = dragEnd; // IE's approach to draggable if (display.scroller.dragDrop) display.scroller.dragDrop(); on(document, "mouseup", dragEnd); on(display.scroller, "drop", dragEnd); } // Normal selection, as opposed to text dragging. function leftButtonSelect(cm, e, start, type, addNew) { var display = cm.display, doc = cm.doc; e_preventDefault(e); var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges; if (addNew && !e.shiftKey) { ourIndex = doc.sel.contains(start); if (ourIndex > -1) ourRange = ranges[ourIndex]; else ourRange = new Range(start, start); } else { ourRange = doc.sel.primary(); ourIndex = doc.sel.primIndex; } if (e.altKey) { type = "rect"; if (!addNew) ourRange = new Range(start, start); start = posFromMouse(cm, e, true, true); ourIndex = -1; } else if (type == "double") { var word = cm.findWordAt(start); if (cm.display.shift || doc.extend) ourRange = extendRange(doc, ourRange, word.anchor, word.head); else ourRange = word; } else if (type == "triple") { var line = new Range(Pos(start.line, 0), clipPos(doc, Pos(start.line + 1, 0))); if (cm.display.shift || doc.extend) ourRange = extendRange(doc, ourRange, line.anchor, line.head); else ourRange = line; } else { ourRange = extendRange(doc, ourRange, start); } if (!addNew) { ourIndex = 0; setSelection(doc, new Selection([ourRange], 0), sel_mouse); startSel = doc.sel; } else if (ourIndex == -1) { ourIndex = ranges.length; setSelection(doc, normalizeSelection(ranges.concat([ourRange]), ourIndex), {scroll: false, origin: "*mouse"}); } else if (ranges.length > 1 && ranges[ourIndex].empty() && type == "single" && !e.shiftKey) { setSelection(doc, normalizeSelection(ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0)); startSel = doc.sel; } else { replaceOneSelection(doc, ourIndex, ourRange, sel_mouse); } var lastPos = start; function extendTo(pos) { if (cmp(lastPos, pos) == 0) return; lastPos = pos; if (type == "rect") { var ranges = [], tabSize = cm.options.tabSize; var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize); var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize); var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol); for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line)); line <= end; line++) { var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize); if (left == right) ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); else if (text.length > leftPos) ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); } if (!ranges.length) ranges.push(new Range(start, start)); setSelection(doc, normalizeSelection(startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex), {origin: "*mouse", scroll: false}); cm.scrollIntoView(pos); } else { var oldRange = ourRange; var anchor = oldRange.anchor, head = pos; if (type != "single") { if (type == "double") var range = cm.findWordAt(pos); else var range = new Range(Pos(pos.line, 0), clipPos(doc, Pos(pos.line + 1, 0))); if (cmp(range.anchor, anchor) > 0) { head = range.head; anchor = minPos(oldRange.from(), range.anchor); } else { head = range.anchor; anchor = maxPos(oldRange.to(), range.head); } } var ranges = startSel.ranges.slice(0); ranges[ourIndex] = new Range(clipPos(doc, anchor), head); setSelection(doc, normalizeSelection(ranges, ourIndex), sel_mouse); } } var editorSize = display.wrapper.getBoundingClientRect(); // Used to ensure timeout re-tries don't fire when another extend // happened in the meantime (clearTimeout isn't reliable -- at // least on Chrome, the timeouts still happen even when cleared, // if the clear happens after their scheduled firing time). var counter = 0; function extend(e) { var curCount = ++counter; var cur = posFromMouse(cm, e, true, type == "rect"); if (!cur) return; if (cmp(cur, lastPos) != 0) { cm.curOp.focus = activeElt(); extendTo(cur); var visible = visibleLines(display, doc); if (cur.line >= visible.to || cur.line < visible.from) setTimeout(operation(cm, function(){if (counter == curCount) extend(e);}), 150); } else { var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0; if (outside) setTimeout(operation(cm, function() { if (counter != curCount) return; display.scroller.scrollTop += outside; extend(e); }), 50); } } function done(e) { counter = Infinity; e_preventDefault(e); display.input.focus(); off(document, "mousemove", move); off(document, "mouseup", up); doc.history.lastSelOrigin = null; } var move = operation(cm, function(e) { if (!e_button(e)) done(e); else extend(e); }); var up = operation(cm, done); on(document, "mousemove", move); on(document, "mouseup", up); } // Determines whether an event happened in the gutter, and fires the // handlers for the corresponding event. function gutterEvent(cm, e, type, prevent, signalfn) { try { var mX = e.clientX, mY = e.clientY; } catch(e) { return false; } if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) return false; if (prevent) e_preventDefault(e); var display = cm.display; var lineBox = display.lineDiv.getBoundingClientRect(); if (mY > lineBox.bottom || !hasHandler(cm, type)) return e_defaultPrevented(e); mY -= lineBox.top - display.viewOffset; for (var i = 0; i < cm.options.gutters.length; ++i) { var g = display.gutters.childNodes[i]; if (g && g.getBoundingClientRect().right >= mX) { var line = lineAtHeight(cm.doc, mY); var gutter = cm.options.gutters[i]; signalfn(cm, type, cm, line, gutter, e); return e_defaultPrevented(e); } } } function clickInGutter(cm, e) { return gutterEvent(cm, e, "gutterClick", true, signalLater); } // Kludge to work around strange IE behavior where it'll sometimes // re-fire a series of drag-related events right after the drop (#1551) var lastDrop = 0; function onDrop(e) { var cm = this; if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return; e_preventDefault(e); if (ie) lastDrop = +new Date; var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files; if (!pos || isReadOnly(cm)) return; // Might be a file drop, in which case we simply extract the text // and insert it. if (files && files.length && window.FileReader && window.File) { var n = files.length, text = Array(n), read = 0; var loadFile = function(file, i) { var reader = new FileReader; reader.onload = operation(cm, function() { text[i] = reader.result; if (++read == n) { pos = clipPos(cm.doc, pos); var change = {from: pos, to: pos, text: splitLines(text.join("\n")), origin: "paste"}; makeChange(cm.doc, change); setSelectionReplaceHistory(cm.doc, simpleSelection(pos, changeEnd(change))); } }); reader.readAsText(file); }; for (var i = 0; i < n; ++i) loadFile(files[i], i); } else { // Normal drop // Don't do a replace if the drop happened inside of the selected text. if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) { cm.state.draggingText(e); // Ensure the editor is re-focused setTimeout(function() {cm.display.input.focus();}, 20); return; } try { var text = e.dataTransfer.getData("Text"); if (text) { if (cm.state.draggingText && !(mac ? e.altKey : e.ctrlKey)) var selected = cm.listSelections(); setSelectionNoUndo(cm.doc, simpleSelection(pos, pos)); if (selected) for (var i = 0; i < selected.length; ++i) replaceRange(cm.doc, "", selected[i].anchor, selected[i].head, "drag"); cm.replaceSelection(text, "around", "paste"); cm.display.input.focus(); } } catch(e){} } } function onDragStart(cm, e) { if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return; } if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return; e.dataTransfer.setData("Text", cm.getSelection()); // Use dummy image instead of default browsers image. // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there. if (e.dataTransfer.setDragImage && !safari) { var img = elt("img", null, null, "position: fixed; left: 0; top: 0;"); img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; if (presto) { img.width = img.height = 1; cm.display.wrapper.appendChild(img); // Force a relayout, or Opera won't use our image for some obscure reason img._top = img.offsetTop; } e.dataTransfer.setDragImage(img, 0, 0); if (presto) img.parentNode.removeChild(img); } } // SCROLL EVENTS // Sync the scrollable area and scrollbars, ensure the viewport // covers the visible area. function setScrollTop(cm, val) { if (Math.abs(cm.doc.scrollTop - val) < 2) return; cm.doc.scrollTop = val; if (!gecko) updateDisplaySimple(cm, {top: val}); if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val; cm.display.scrollbars.setScrollTop(val); if (gecko) updateDisplaySimple(cm); startWorker(cm, 100); } // Sync scroller and scrollbar, ensure the gutter elements are // aligned. function setScrollLeft(cm, val, isScroller) { if (isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) return; val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth); cm.doc.scrollLeft = val; alignHorizontally(cm); if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val; cm.display.scrollbars.setScrollLeft(val); } // Since the delta values reported on mouse wheel events are // unstandardized between browsers and even browser versions, and // generally horribly unpredictable, this code starts by measuring // the scroll effect that the first few mouse wheel events have, // and, from that, detects the way it can convert deltas to pixel // offsets afterwards. // // The reason we want to know the amount a wheel event will scroll // is that it gives us a chance to update the display before the // actual scrolling happens, reducing flickering. var wheelSamples = 0, wheelPixelsPerUnit = null; // Fill in a browser-detected starting value on browsers where we // know one. These don't have to be accurate -- the result of them // being wrong would just be a slight flicker on the first wheel // scroll (if it is large enough). if (ie) wheelPixelsPerUnit = -.53; else if (gecko) wheelPixelsPerUnit = 15; else if (chrome) wheelPixelsPerUnit = -.7; else if (safari) wheelPixelsPerUnit = -1/3; var wheelEventDelta = function(e) { var dx = e.wheelDeltaX, dy = e.wheelDeltaY; if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) dx = e.detail; if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) dy = e.detail; else if (dy == null) dy = e.wheelDelta; return {x: dx, y: dy}; }; CodeMirror.wheelEventPixels = function(e) { var delta = wheelEventDelta(e); delta.x *= wheelPixelsPerUnit; delta.y *= wheelPixelsPerUnit; return delta; }; function onScrollWheel(cm, e) { var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y; var display = cm.display, scroll = display.scroller; // Quit if there's nothing to scroll here if (!(dx && scroll.scrollWidth > scroll.clientWidth || dy && scroll.scrollHeight > scroll.clientHeight)) return; // Webkit browsers on OS X abort momentum scrolls when the target // of the scroll event is removed from the scrollable element. // This hack (see related code in patchDisplay) makes sure the // element is kept around. if (dy && mac && webkit) { outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) { for (var i = 0; i < view.length; i++) { if (view[i].node == cur) { cm.display.currentWheelTarget = cur; break outer; } } } } // On some browsers, horizontal scrolling will cause redraws to // happen before the gutter has been realigned, causing it to // wriggle around in a most unseemly way. When we have an // estimated pixels/delta value, we just handle horizontal // scrolling entirely here. It'll be slightly off from native, but // better than glitching out. if (dx && !gecko && !presto && wheelPixelsPerUnit != null) { if (dy) setScrollTop(cm, Math.max(0, Math.min(scroll.scrollTop + dy * wheelPixelsPerUnit, scroll.scrollHeight - scroll.clientHeight))); setScrollLeft(cm, Math.max(0, Math.min(scroll.scrollLeft + dx * wheelPixelsPerUnit, scroll.scrollWidth - scroll.clientWidth))); e_preventDefault(e); display.wheelStartX = null; // Abort measurement, if in progress return; } // 'Project' the visible viewport to cover the area that is being // scrolled into view (if we know enough to estimate it). if (dy && wheelPixelsPerUnit != null) { var pixels = dy * wheelPixelsPerUnit; var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight; if (pixels < 0) top = Math.max(0, top + pixels - 50); else bot = Math.min(cm.doc.height, bot + pixels + 50); updateDisplaySimple(cm, {top: top, bottom: bot}); } if (wheelSamples < 20) { if (display.wheelStartX == null) { display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop; display.wheelDX = dx; display.wheelDY = dy; setTimeout(function() { if (display.wheelStartX == null) return; var movedX = scroll.scrollLeft - display.wheelStartX; var movedY = scroll.scrollTop - display.wheelStartY; var sample = (movedY && display.wheelDY && movedY / display.wheelDY) || (movedX && display.wheelDX && movedX / display.wheelDX); display.wheelStartX = display.wheelStartY = null; if (!sample) return; wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1); ++wheelSamples; }, 200); } else { display.wheelDX += dx; display.wheelDY += dy; } } } // KEY EVENTS // Run a handler that was bound to a key. function doHandleBinding(cm, bound, dropShift) { if (typeof bound == "string") { bound = commands[bound]; if (!bound) return false; } // Ensure previous input has been read, so that the handler sees a // consistent view of the document cm.display.input.ensurePolled(); var prevShift = cm.display.shift, done = false; try { if (isReadOnly(cm)) cm.state.suppressEdits = true; if (dropShift) cm.display.shift = false; done = bound(cm) != Pass; } finally { cm.display.shift = prevShift; cm.state.suppressEdits = false; } return done; } function lookupKeyForEditor(cm, name, handle) { for (var i = 0; i < cm.state.keyMaps.length; i++) { var result = lookupKey(name, cm.state.keyMaps[i], handle, cm); if (result) return result; } return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm)) || lookupKey(name, cm.options.keyMap, handle, cm); } var stopSeq = new Delayed; function dispatchKey(cm, name, e, handle) { var seq = cm.state.keySeq; if (seq) { if (isModifierKey(name)) return "handled"; stopSeq.set(50, function() { if (cm.state.keySeq == seq) { cm.state.keySeq = null; cm.display.input.reset(); } }); name = seq + " " + name; } var result = lookupKeyForEditor(cm, name, handle); if (result == "multi") cm.state.keySeq = name; if (result == "handled") signalLater(cm, "keyHandled", cm, name, e); if (result == "handled" || result == "multi") { e_preventDefault(e); restartBlink(cm); } if (seq && !result && /\'$/.test(name)) { e_preventDefault(e); return true; } return !!result; } // Handle a key from the keydown event. function handleKeyBinding(cm, e) { var name = keyName(e, true); if (!name) return false; if (e.shiftKey && !cm.state.keySeq) { // First try to resolve full name (including 'Shift-'). Failing // that, see if there is a cursor-motion command (starting with // 'go') bound to the keyname without 'Shift-'. return dispatchKey(cm, "Shift-" + name, e, function(b) {return doHandleBinding(cm, b, true);}) || dispatchKey(cm, name, e, function(b) { if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion) return doHandleBinding(cm, b); }); } else { return dispatchKey(cm, name, e, function(b) { return doHandleBinding(cm, b); }); } } // Handle a key from the keypress event function handleCharBinding(cm, e, ch) { return dispatchKey(cm, "'" + ch + "'", e, function(b) { return doHandleBinding(cm, b, true); }); } var lastStoppedKey = null; function onKeyDown(e) { var cm = this; cm.curOp.focus = activeElt(); if (signalDOMEvent(cm, e)) return; // IE does strange things with escape. if (ie && ie_version < 11 && e.keyCode == 27) e.returnValue = false; var code = e.keyCode; cm.display.shift = code == 16 || e.shiftKey; var handled = handleKeyBinding(cm, e); if (presto) { lastStoppedKey = handled ? code : null; // Opera has no cut event... we try to at least catch the key combo if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey)) cm.replaceSelection("", null, "cut"); } // Turn mouse into crosshair when Alt is held on Mac. if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className)) showCrossHair(cm); } function showCrossHair(cm) { var lineDiv = cm.display.lineDiv; addClass(lineDiv, "CodeMirror-crosshair"); function up(e) { if (e.keyCode == 18 || !e.altKey) { rmClass(lineDiv, "CodeMirror-crosshair"); off(document, "keyup", up); off(document, "mouseover", up); } } on(document, "keyup", up); on(document, "mouseover", up); } function onKeyUp(e) { if (e.keyCode == 16) this.doc.sel.shift = false; signalDOMEvent(this, e); } function onKeyPress(e) { var cm = this; if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) return; var keyCode = e.keyCode, charCode = e.charCode; if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;} if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) return; var ch = String.fromCharCode(charCode == null ? keyCode : charCode); if (handleCharBinding(cm, e, ch)) return; cm.display.input.onKeyPress(e); } // FOCUS/BLUR EVENTS function delayBlurEvent(cm) { cm.state.delayingBlurEvent = true; setTimeout(function() { if (cm.state.delayingBlurEvent) { cm.state.delayingBlurEvent = false; onBlur(cm); } }, 100); } function onFocus(cm) { if (cm.state.delayingBlurEvent) cm.state.delayingBlurEvent = false; if (cm.options.readOnly == "nocursor") return; if (!cm.state.focused) { signal(cm, "focus", cm); cm.state.focused = true; addClass(cm.display.wrapper, "CodeMirror-focused"); // This test prevents this from firing when a context // menu is closed (since the input reset would kill the // select-all detection hack) if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) { cm.display.input.reset(); if (webkit) setTimeout(function() { cm.display.input.reset(true); }, 20); // Issue #1730 } cm.display.input.receivedFocus(); } restartBlink(cm); } function onBlur(cm) { if (cm.state.delayingBlurEvent) return; if (cm.state.focused) { signal(cm, "blur", cm); cm.state.focused = false; rmClass(cm.display.wrapper, "CodeMirror-focused"); } clearInterval(cm.display.blinker); setTimeout(function() {if (!cm.state.focused) cm.display.shift = false;}, 150); } // CONTEXT MENU HANDLING // To make the context menu work, we need to briefly unhide the // textarea (making it as unobtrusive as possible) to let the // right-click take effect on it. function onContextMenu(cm, e) { if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) return; cm.display.input.onContextMenu(e); } function contextMenuInGutter(cm, e) { if (!hasHandler(cm, "gutterContextMenu")) return false; return gutterEvent(cm, e, "gutterContextMenu", false, signal); } // UPDATING // Compute the position of the end of a change (its 'to' property // refers to the pre-change end). var changeEnd = CodeMirror.changeEnd = function(change) { if (!change.text) return change.to; return Pos(change.from.line + change.text.length - 1, lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0)); }; // Adjust a position to refer to the post-change position of the // same text, or the end of the change if the change covers it. function adjustForChange(pos, change) { if (cmp(pos, change.from) < 0) return pos; if (cmp(pos, change.to) <= 0) return changeEnd(change); var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch; if (pos.line == change.to.line) ch += changeEnd(change).ch - change.to.ch; return Pos(line, ch); } function computeSelAfterChange(doc, change) { var out = []; for (var i = 0; i < doc.sel.ranges.length; i++) { var range = doc.sel.ranges[i]; out.push(new Range(adjustForChange(range.anchor, change), adjustForChange(range.head, change))); } return normalizeSelection(out, doc.sel.primIndex); } function offsetPos(pos, old, nw) { if (pos.line == old.line) return Pos(nw.line, pos.ch - old.ch + nw.ch); else return Pos(nw.line + (pos.line - old.line), pos.ch); } // Used by replaceSelections to allow moving the selection to the // start or around the replaced test. Hint may be "start" or "around". function computeReplacedSel(doc, changes, hint) { var out = []; var oldPrev = Pos(doc.first, 0), newPrev = oldPrev; for (var i = 0; i < changes.length; i++) { var change = changes[i]; var from = offsetPos(change.from, oldPrev, newPrev); var to = offsetPos(changeEnd(change), oldPrev, newPrev); oldPrev = change.to; newPrev = to; if (hint == "around") { var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0; out[i] = new Range(inv ? to : from, inv ? from : to); } else { out[i] = new Range(from, from); } } return new Selection(out, doc.sel.primIndex); } // Allow "beforeChange" event handlers to influence a change function filterChange(doc, change, update) { var obj = { canceled: false, from: change.from, to: change.to, text: change.text, origin: change.origin, cancel: function() { this.canceled = true; } }; if (update) obj.update = function(from, to, text, origin) { if (from) this.from = clipPos(doc, from); if (to) this.to = clipPos(doc, to); if (text) this.text = text; if (origin !== undefined) this.origin = origin; }; signal(doc, "beforeChange", doc, obj); if (doc.cm) signal(doc.cm, "beforeChange", doc.cm, obj); if (obj.canceled) return null; return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin}; } // Apply a change to a document, and add it to the document's // history, and propagating it to all linked documents. function makeChange(doc, change, ignoreReadOnly) { if (doc.cm) { if (!doc.cm.curOp) return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly); if (doc.cm.state.suppressEdits) return; } if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) { change = filterChange(doc, change, true); if (!change) return; } // Possibly split or suppress the update based on the presence // of read-only spans in its range. var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to); if (split) { for (var i = split.length - 1; i >= 0; --i) makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [""] : change.text}); } else { makeChangeInner(doc, change); } } function makeChangeInner(doc, change) { if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) return; var selAfter = computeSelAfterChange(doc, change); addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN); makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change)); var rebased = []; linkedDocs(doc, function(doc, sharedHist) { if (!sharedHist && indexOf(rebased, doc.history) == -1) { rebaseHist(doc.history, change); rebased.push(doc.history); } makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change)); }); } // Revert a change stored in a document's history. function makeChangeFromHistory(doc, type, allowSelectionOnly) { if (doc.cm && doc.cm.state.suppressEdits) return; var hist = doc.history, event, selAfter = doc.sel; var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done; // Verify that there is a useable event (so that ctrl-z won't // needlessly clear selection events) for (var i = 0; i < source.length; i++) { event = source[i]; if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges) break; } if (i == source.length) return; hist.lastOrigin = hist.lastSelOrigin = null; for (;;) { event = source.pop(); if (event.ranges) { pushSelectionToHistory(event, dest); if (allowSelectionOnly && !event.equals(doc.sel)) { setSelection(doc, event, {clearRedo: false}); return; } selAfter = event; } else break; } // Build up a reverse change object to add to the opposite history // stack (redo when undoing, and vice versa). var antiChanges = []; pushSelectionToHistory(selAfter, dest); dest.push({changes: antiChanges, generation: hist.generation}); hist.generation = event.generation || ++hist.maxGeneration; var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange"); for (var i = event.changes.length - 1; i >= 0; --i) { var change = event.changes[i]; change.origin = type; if (filter && !filterChange(doc, change, false)) { source.length = 0; return; } antiChanges.push(historyChangeFromChange(doc, change)); var after = i ? computeSelAfterChange(doc, change) : lst(source); makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change)); if (!i && doc.cm) doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}); var rebased = []; // Propagate to the linked documents linkedDocs(doc, function(doc, sharedHist) { if (!sharedHist && indexOf(rebased, doc.history) == -1) { rebaseHist(doc.history, change); rebased.push(doc.history); } makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change)); }); } } // Sub-views need their line numbers shifted when text is added // above or below them in the parent document. function shiftDoc(doc, distance) { if (distance == 0) return; doc.first += distance; doc.sel = new Selection(map(doc.sel.ranges, function(range) { return new Range(Pos(range.anchor.line + distance, range.anchor.ch), Pos(range.head.line + distance, range.head.ch)); }), doc.sel.primIndex); if (doc.cm) { regChange(doc.cm, doc.first, doc.first - distance, distance); for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++) regLineChange(doc.cm, l, "gutter"); } } // More lower-level change function, handling only a single document // (not linked ones). function makeChangeSingleDoc(doc, change, selAfter, spans) { if (doc.cm && !doc.cm.curOp) return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans); if (change.to.line < doc.first) { shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line)); return; } if (change.from.line > doc.lastLine()) return; // Clip the change to the size of this doc if (change.from.line < doc.first) { var shift = change.text.length - 1 - (doc.first - change.from.line); shiftDoc(doc, shift); change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch), text: [lst(change.text)], origin: change.origin}; } var last = doc.lastLine(); if (change.to.line > last) { change = {from: change.from, to: Pos(last, getLine(doc, last).text.length), text: [change.text[0]], origin: change.origin}; } change.removed = getBetween(doc, change.from, change.to); if (!selAfter) selAfter = computeSelAfterChange(doc, change); if (doc.cm) makeChangeSingleDocInEditor(doc.cm, change, spans); else updateDoc(doc, change, spans); setSelectionNoUndo(doc, selAfter, sel_dontScroll); } // Handle the interaction of a change to a document with the editor // that this document is part of. function makeChangeSingleDocInEditor(cm, change, spans) { var doc = cm.doc, display = cm.display, from = change.from, to = change.to; var recomputeMaxLength = false, checkWidthStart = from.line; if (!cm.options.lineWrapping) { checkWidthStart = lineNo(visualLine(getLine(doc, from.line))); doc.iter(checkWidthStart, to.line + 1, function(line) { if (line == display.maxLine) { recomputeMaxLength = true; return true; } }); } if (doc.sel.contains(change.from, change.to) > -1) signalCursorActivity(cm); updateDoc(doc, change, spans, estimateHeight(cm)); if (!cm.options.lineWrapping) { doc.iter(checkWidthStart, from.line + change.text.length, function(line) { var len = lineLength(line); if (len > display.maxLineLength) { display.maxLine = line; display.maxLineLength = len; display.maxLineChanged = true; recomputeMaxLength = false; } }); if (recomputeMaxLength) cm.curOp.updateMaxLine = true; } // Adjust frontier, schedule worker doc.frontier = Math.min(doc.frontier, from.line); startWorker(cm, 400); var lendiff = change.text.length - (to.line - from.line) - 1; // Remember that these lines changed, for updating the display if (change.full) regChange(cm); else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change)) regLineChange(cm, from.line, "text"); else regChange(cm, from.line, to.line + 1, lendiff); var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change"); if (changeHandler || changesHandler) { var obj = { from: from, to: to, text: change.text, removed: change.removed, origin: change.origin }; if (changeHandler) signalLater(cm, "change", cm, obj); if (changesHandler) (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); } cm.display.selForContextMenu = null; } function replaceRange(doc, code, from, to, origin) { if (!to) to = from; if (cmp(to, from) < 0) { var tmp = to; to = from; from = tmp; } if (typeof code == "string") code = splitLines(code); makeChange(doc, {from: from, to: to, text: code, origin: origin}); } // SCROLLING THINGS INTO VIEW // If an editor sits on the top or bottom of the window, partially // scrolled out of view, this ensures that the cursor is visible. function maybeScrollWindow(cm, coords) { if (signalDOMEvent(cm, "scrollCursorIntoView")) return; var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null; if (coords.top + box.top < 0) doScroll = true; else if (coords.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false; if (doScroll != null && !phantom) { var scrollNode = elt("div", "\u200b", null, "position: absolute; top: " + (coords.top - display.viewOffset - paddingTop(cm.display)) + "px; height: " + (coords.bottom - coords.top + scrollGap(cm) + display.barHeight) + "px; left: " + coords.left + "px; width: 2px;"); cm.display.lineSpace.appendChild(scrollNode); scrollNode.scrollIntoView(doScroll); cm.display.lineSpace.removeChild(scrollNode); } } // Scroll a given position into view (immediately), verifying that // it actually became visible (as line heights are accurately // measured, the position of something may 'drift' during drawing). function scrollPosIntoView(cm, pos, end, margin) { if (margin == null) margin = 0; for (var limit = 0; limit < 5; limit++) { var changed = false, coords = cursorCoords(cm, pos); var endCoords = !end || end == pos ? coords : cursorCoords(cm, end); var scrollPos = calculateScrollPos(cm, Math.min(coords.left, endCoords.left), Math.min(coords.top, endCoords.top) - margin, Math.max(coords.left, endCoords.left), Math.max(coords.bottom, endCoords.bottom) + margin); var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft; if (scrollPos.scrollTop != null) { setScrollTop(cm, scrollPos.scrollTop); if (Math.abs(cm.doc.scrollTop - startTop) > 1) changed = true; } if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft); if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) changed = true; } if (!changed) break; } return coords; } // Scroll a given set of coordinates into view (immediately). function scrollIntoView(cm, x1, y1, x2, y2) { var scrollPos = calculateScrollPos(cm, x1, y1, x2, y2); if (scrollPos.scrollTop != null) setScrollTop(cm, scrollPos.scrollTop); if (scrollPos.scrollLeft != null) setScrollLeft(cm, scrollPos.scrollLeft); } // Calculate a new scroll position needed to scroll the given // rectangle into view. Returns an object with scrollTop and // scrollLeft properties. When these are undefined, the // vertical/horizontal position does not need to be adjusted. function calculateScrollPos(cm, x1, y1, x2, y2) { var display = cm.display, snapMargin = textHeight(cm.display); if (y1 < 0) y1 = 0; var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop; var screen = displayHeight(cm), result = {}; if (y2 - y1 > screen) y2 = y1 + screen; var docBottom = cm.doc.height + paddingVert(display); var atTop = y1 < snapMargin, atBottom = y2 > docBottom - snapMargin; if (y1 < screentop) { result.scrollTop = atTop ? 0 : y1; } else if (y2 > screentop + screen) { var newTop = Math.min(y1, (atBottom ? docBottom : y2) - screen); if (newTop != screentop) result.scrollTop = newTop; } var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft; var screenw = displayWidth(cm) - (cm.options.fixedGutter ? display.gutters.offsetWidth : 0); var tooWide = x2 - x1 > screenw; if (tooWide) x2 = x1 + screenw; if (x1 < 10) result.scrollLeft = 0; else if (x1 < screenleft) result.scrollLeft = Math.max(0, x1 - (tooWide ? 0 : 10)); else if (x2 > screenw + screenleft - 3) result.scrollLeft = x2 + (tooWide ? 0 : 10) - screenw; return result; } // Store a relative adjustment to the scroll position in the current // operation (to be applied when the operation finishes). function addToScrollPos(cm, left, top) { if (left != null || top != null) resolveScrollToPos(cm); if (left != null) cm.curOp.scrollLeft = (cm.curOp.scrollLeft == null ? cm.doc.scrollLeft : cm.curOp.scrollLeft) + left; if (top != null) cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top; } // Make sure that at the end of the operation the current cursor is // shown. function ensureCursorVisible(cm) { resolveScrollToPos(cm); var cur = cm.getCursor(), from = cur, to = cur; if (!cm.options.lineWrapping) { from = cur.ch ? Pos(cur.line, cur.ch - 1) : cur; to = Pos(cur.line, cur.ch + 1); } cm.curOp.scrollToPos = {from: from, to: to, margin: cm.options.cursorScrollMargin, isCursor: true}; } // When an operation has its scrollToPos property set, and another // scroll action is applied before the end of the operation, this // 'simulates' scrolling that position into view in a cheap way, so // that the effect of intermediate scroll commands is not ignored. function resolveScrollToPos(cm) { var range = cm.curOp.scrollToPos; if (range) { cm.curOp.scrollToPos = null; var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to); var sPos = calculateScrollPos(cm, Math.min(from.left, to.left), Math.min(from.top, to.top) - range.margin, Math.max(from.right, to.right), Math.max(from.bottom, to.bottom) + range.margin); cm.scrollTo(sPos.scrollLeft, sPos.scrollTop); } } // API UTILITIES // Indent the given line. The how parameter can be "smart", // "add"/null, "subtract", or "prev". When aggressive is false // (typically set to true for forced single-line indents), empty // lines are not indented, and places where the mode returns Pass // are left alone. function indentLine(cm, n, how, aggressive) { var doc = cm.doc, state; if (how == null) how = "add"; if (how == "smart") { // Fall back to "prev" when the mode doesn't have an indentation // method. if (!doc.mode.indent) how = "prev"; else state = getStateBefore(cm, n); } var tabSize = cm.options.tabSize; var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize); if (line.stateAfter) line.stateAfter = null; var curSpaceString = line.text.match(/^\s*/)[0], indentation; if (!aggressive && !/\S/.test(line.text)) { indentation = 0; how = "not"; } else if (how == "smart") { indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text); if (indentation == Pass || indentation > 150) { if (!aggressive) return; how = "prev"; } } if (how == "prev") { if (n > doc.first) indentation = countColumn(getLine(doc, n-1).text, null, tabSize); else indentation = 0; } else if (how == "add") { indentation = curSpace + cm.options.indentUnit; } else if (how == "subtract") { indentation = curSpace - cm.options.indentUnit; } else if (typeof how == "number") { indentation = curSpace + how; } indentation = Math.max(0, indentation); var indentString = "", pos = 0; if (cm.options.indentWithTabs) for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";} if (pos < indentation) indentString += spaceStr(indentation - pos); if (indentString != curSpaceString) { replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input"); line.stateAfter = null; return true; } else { // Ensure that, if the cursor was in the whitespace at the start // of the line, it is moved to the end of that space. for (var i = 0; i < doc.sel.ranges.length; i++) { var range = doc.sel.ranges[i]; if (range.head.line == n && range.head.ch < curSpaceString.length) { var pos = Pos(n, curSpaceString.length); replaceOneSelection(doc, i, new Range(pos, pos)); break; } } } } // Utility for applying a change to a line by handle or number, // returning the number and optionally registering the line as // changed. function changeLine(doc, handle, changeType, op) { var no = handle, line = handle; if (typeof handle == "number") line = getLine(doc, clipLine(doc, handle)); else no = lineNo(handle); if (no == null) return null; if (op(line, no) && doc.cm) regLineChange(doc.cm, no, changeType); return line; } // Helper for deleting text near the selection(s), used to implement // backspace, delete, and similar functionality. function deleteNearSelection(cm, compute) { var ranges = cm.doc.sel.ranges, kill = []; // Build up a set of ranges to kill first, merging overlapping // ranges. for (var i = 0; i < ranges.length; i++) { var toKill = compute(ranges[i]); while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) { var replaced = kill.pop(); if (cmp(replaced.from, toKill.from) < 0) { toKill.from = replaced.from; break; } } kill.push(toKill); } // Next, remove those actual ranges. runInOp(cm, function() { for (var i = kill.length - 1; i >= 0; i--) replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete"); ensureCursorVisible(cm); }); } // Used for horizontal relative motion. Dir is -1 or 1 (left or // right), unit can be "char", "column" (like char, but doesn't // cross line boundaries), "word" (across next word), or "group" (to // the start of next group of word or non-word-non-whitespace // chars). The visually param controls whether, in right-to-left // text, direction 1 means to move towards the next index in the // string, or towards the character to the right of the current // position. The resulting position will have a hitSide=true // property if it reached the end of the document. function findPosH(doc, pos, dir, unit, visually) { var line = pos.line, ch = pos.ch, origDir = dir; var lineObj = getLine(doc, line); var possible = true; function findNextLine() { var l = line + dir; if (l < doc.first || l >= doc.first + doc.size) return (possible = false); line = l; return lineObj = getLine(doc, l); } function moveOnce(boundToLine) { var next = (visually ? moveVisually : moveLogically)(lineObj, ch, dir, true); if (next == null) { if (!boundToLine && findNextLine()) { if (visually) ch = (dir < 0 ? lineRight : lineLeft)(lineObj); else ch = dir < 0 ? lineObj.text.length : 0; } else return (possible = false); } else ch = next; return true; } if (unit == "char") moveOnce(); else if (unit == "column") moveOnce(true); else if (unit == "word" || unit == "group") { var sawType = null, group = unit == "group"; var helper = doc.cm && doc.cm.getHelper(pos, "wordChars"); for (var first = true;; first = false) { if (dir < 0 && !moveOnce(!first)) break; var cur = lineObj.text.charAt(ch) || "\n"; var type = isWordChar(cur, helper) ? "w" : group && cur == "\n" ? "n" : !group || /\s/.test(cur) ? null : "p"; if (group && !first && !type) type = "s"; if (sawType && sawType != type) { if (dir < 0) {dir = 1; moveOnce();} break; } if (type) sawType = type; if (dir > 0 && !moveOnce(!first)) break; } } var result = skipAtomic(doc, Pos(line, ch), origDir, true); if (!possible) result.hitSide = true; return result; } // For relative vertical movement. Dir may be -1 or 1. Unit can be // "page" or "line". The resulting position will have a hitSide=true // property if it reached the end of the document. function findPosV(cm, pos, dir, unit) { var doc = cm.doc, x = pos.left, y; if (unit == "page") { var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight); y = pos.top + dir * (pageSize - (dir < 0 ? 1.5 : .5) * textHeight(cm.display)); } else if (unit == "line") { y = dir > 0 ? pos.bottom + 3 : pos.top - 3; } for (;;) { var target = coordsChar(cm, x, y); if (!target.outside) break; if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break; } y += dir * 5; } return target; } // EDITOR METHODS // The publicly visible API. Note that methodOp(f) means // 'wrap f in an operation, performed on its `this` parameter'. // This is not the complete set of editor methods. Most of the // methods defined on the Doc type are also injected into // CodeMirror.prototype, for backwards compatibility and // convenience. CodeMirror.prototype = { constructor: CodeMirror, focus: function(){window.focus(); this.display.input.focus();}, setOption: function(option, value) { var options = this.options, old = options[option]; if (options[option] == value && option != "mode") return; options[option] = value; if (optionHandlers.hasOwnProperty(option)) operation(this, optionHandlers[option])(this, value, old); }, getOption: function(option) {return this.options[option];}, getDoc: function() {return this.doc;}, addKeyMap: function(map, bottom) { this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map)); }, removeKeyMap: function(map) { var maps = this.state.keyMaps; for (var i = 0; i < maps.length; ++i) if (maps[i] == map || maps[i].name == map) { maps.splice(i, 1); return true; } }, addOverlay: methodOp(function(spec, options) { var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec); if (mode.startState) throw new Error("Overlays may not be stateful."); this.state.overlays.push({mode: mode, modeSpec: spec, opaque: options && options.opaque}); this.state.modeGen++; regChange(this); }), removeOverlay: methodOp(function(spec) { var overlays = this.state.overlays; for (var i = 0; i < overlays.length; ++i) { var cur = overlays[i].modeSpec; if (cur == spec || typeof spec == "string" && cur.name == spec) { overlays.splice(i, 1); this.state.modeGen++; regChange(this); return; } } }), indentLine: methodOp(function(n, dir, aggressive) { if (typeof dir != "string" && typeof dir != "number") { if (dir == null) dir = this.options.smartIndent ? "smart" : "prev"; else dir = dir ? "add" : "subtract"; } if (isLine(this.doc, n)) indentLine(this, n, dir, aggressive); }), indentSelection: methodOp(function(how) { var ranges = this.doc.sel.ranges, end = -1; for (var i = 0; i < ranges.length; i++) { var range = ranges[i]; if (!range.empty()) { var from = range.from(), to = range.to(); var start = Math.max(end, from.line); end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1; for (var j = start; j < end; ++j) indentLine(this, j, how); var newRanges = this.doc.sel.ranges; if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0) replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll); } else if (range.head.line > end) { indentLine(this, range.head.line, how, true); end = range.head.line; if (i == this.doc.sel.primIndex) ensureCursorVisible(this); } } }), // Fetch the parser token for a given character. Useful for hacks // that want to inspect the mode state (say, for completion). getTokenAt: function(pos, precise) { return takeToken(this, pos, precise); }, getLineTokens: function(line, precise) { return takeToken(this, Pos(line), precise, true); }, getTokenTypeAt: function(pos) { pos = clipPos(this.doc, pos); var styles = getLineStyles(this, getLine(this.doc, pos.line)); var before = 0, after = (styles.length - 1) / 2, ch = pos.ch; var type; if (ch == 0) type = styles[2]; else for (;;) { var mid = (before + after) >> 1; if ((mid ? styles[mid * 2 - 1] : 0) >= ch) after = mid; else if (styles[mid * 2 + 1] < ch) before = mid + 1; else { type = styles[mid * 2 + 2]; break; } } var cut = type ? type.indexOf("cm-overlay ") : -1; return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1); }, getModeAt: function(pos) { var mode = this.doc.mode; if (!mode.innerMode) return mode; return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode; }, getHelper: function(pos, type) { return this.getHelpers(pos, type)[0]; }, getHelpers: function(pos, type) { var found = []; if (!helpers.hasOwnProperty(type)) return found; var help = helpers[type], mode = this.getModeAt(pos); if (typeof mode[type] == "string") { if (help[mode[type]]) found.push(help[mode[type]]); } else if (mode[type]) { for (var i = 0; i < mode[type].length; i++) { var val = help[mode[type][i]]; if (val) found.push(val); } } else if (mode.helperType && help[mode.helperType]) { found.push(help[mode.helperType]); } else if (help[mode.name]) { found.push(help[mode.name]); } for (var i = 0; i < help._global.length; i++) { var cur = help._global[i]; if (cur.pred(mode, this) && indexOf(found, cur.val) == -1) found.push(cur.val); } return found; }, getStateAfter: function(line, precise) { var doc = this.doc; line = clipLine(doc, line == null ? doc.first + doc.size - 1: line); return getStateBefore(this, line + 1, precise); }, cursorCoords: function(start, mode) { var pos, range = this.doc.sel.primary(); if (start == null) pos = range.head; else if (typeof start == "object") pos = clipPos(this.doc, start); else pos = start ? range.from() : range.to(); return cursorCoords(this, pos, mode || "page"); }, charCoords: function(pos, mode) { return charCoords(this, clipPos(this.doc, pos), mode || "page"); }, coordsChar: function(coords, mode) { coords = fromCoordSystem(this, coords, mode || "page"); return coordsChar(this, coords.left, coords.top); }, lineAtHeight: function(height, mode) { height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top; return lineAtHeight(this.doc, height + this.display.viewOffset); }, heightAtLine: function(line, mode) { var end = false, lineObj; if (typeof line == "number") { var last = this.doc.first + this.doc.size - 1; if (line < this.doc.first) line = this.doc.first; else if (line > last) { line = last; end = true; } lineObj = getLine(this.doc, line); } else { lineObj = line; } return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || "page").top + (end ? this.doc.height - heightAtLine(lineObj) : 0); }, defaultTextHeight: function() { return textHeight(this.display); }, defaultCharWidth: function() { return charWidth(this.display); }, setGutterMarker: methodOp(function(line, gutterID, value) { return changeLine(this.doc, line, "gutter", function(line) { var markers = line.gutterMarkers || (line.gutterMarkers = {}); markers[gutterID] = value; if (!value && isEmpty(markers)) line.gutterMarkers = null; return true; }); }), clearGutter: methodOp(function(gutterID) { var cm = this, doc = cm.doc, i = doc.first; doc.iter(function(line) { if (line.gutterMarkers && line.gutterMarkers[gutterID]) { line.gutterMarkers[gutterID] = null; regLineChange(cm, i, "gutter"); if (isEmpty(line.gutterMarkers)) line.gutterMarkers = null; } ++i; }); }), lineInfo: function(line) { if (typeof line == "number") { if (!isLine(this.doc, line)) return null; var n = line; line = getLine(this.doc, line); if (!line) return null; } else { var n = lineNo(line); if (n == null) return null; } return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers, textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass, widgets: line.widgets}; }, getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo};}, addWidget: function(pos, node, scroll, vert, horiz) { var display = this.display; pos = cursorCoords(this, clipPos(this.doc, pos)); var top = pos.bottom, left = pos.left; node.style.position = "absolute"; node.setAttribute("cm-ignore-events", "true"); this.display.input.setUneditable(node); display.sizer.appendChild(node); if (vert == "over") { top = pos.top; } else if (vert == "above" || vert == "near") { var vspace = Math.max(display.wrapper.clientHeight, this.doc.height), hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth); // Default to positioning above (if specified and possible); otherwise default to positioning below if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight) top = pos.top - node.offsetHeight; else if (pos.bottom + node.offsetHeight <= vspace) top = pos.bottom; if (left + node.offsetWidth > hspace) left = hspace - node.offsetWidth; } node.style.top = top + "px"; node.style.left = node.style.right = ""; if (horiz == "right") { left = display.sizer.clientWidth - node.offsetWidth; node.style.right = "0px"; } else { if (horiz == "left") left = 0; else if (horiz == "middle") left = (display.sizer.clientWidth - node.offsetWidth) / 2; node.style.left = left + "px"; } if (scroll) scrollIntoView(this, left, top, left + node.offsetWidth, top + node.offsetHeight); }, triggerOnKeyDown: methodOp(onKeyDown), triggerOnKeyPress: methodOp(onKeyPress), triggerOnKeyUp: onKeyUp, execCommand: function(cmd) { if (commands.hasOwnProperty(cmd)) return commands[cmd](this); }, findPosH: function(from, amount, unit, visually) { var dir = 1; if (amount < 0) { dir = -1; amount = -amount; } for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) { cur = findPosH(this.doc, cur, dir, unit, visually); if (cur.hitSide) break; } return cur; }, moveH: methodOp(function(dir, unit) { var cm = this; cm.extendSelectionsBy(function(range) { if (cm.display.shift || cm.doc.extend || range.empty()) return findPosH(cm.doc, range.head, dir, unit, cm.options.rtlMoveVisually); else return dir < 0 ? range.from() : range.to(); }, sel_move); }), deleteH: methodOp(function(dir, unit) { var sel = this.doc.sel, doc = this.doc; if (sel.somethingSelected()) doc.replaceSelection("", null, "+delete"); else deleteNearSelection(this, function(range) { var other = findPosH(doc, range.head, dir, unit, false); return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other}; }); }), findPosV: function(from, amount, unit, goalColumn) { var dir = 1, x = goalColumn; if (amount < 0) { dir = -1; amount = -amount; } for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) { var coords = cursorCoords(this, cur, "div"); if (x == null) x = coords.left; else coords.left = x; cur = findPosV(this, coords, dir, unit); if (cur.hitSide) break; } return cur; }, moveV: methodOp(function(dir, unit) { var cm = this, doc = this.doc, goals = []; var collapse = !cm.display.shift && !doc.extend && doc.sel.somethingSelected(); doc.extendSelectionsBy(function(range) { if (collapse) return dir < 0 ? range.from() : range.to(); var headPos = cursorCoords(cm, range.head, "div"); if (range.goalColumn != null) headPos.left = range.goalColumn; goals.push(headPos.left); var pos = findPosV(cm, headPos, dir, unit); if (unit == "page" && range == doc.sel.primary()) addToScrollPos(cm, null, charCoords(cm, pos, "div").top - headPos.top); return pos; }, sel_move); if (goals.length) for (var i = 0; i < doc.sel.ranges.length; i++) doc.sel.ranges[i].goalColumn = goals[i]; }), // Find the word at the given position (as returned by coordsChar). findWordAt: function(pos) { var doc = this.doc, line = getLine(doc, pos.line).text; var start = pos.ch, end = pos.ch; if (line) { var helper = this.getHelper(pos, "wordChars"); if ((pos.xRel < 0 || end == line.length) && start) --start; else ++end; var startChar = line.charAt(start); var check = isWordChar(startChar, helper) ? function(ch) { return isWordChar(ch, helper); } : /\s/.test(startChar) ? function(ch) {return /\s/.test(ch);} : function(ch) {return !/\s/.test(ch) && !isWordChar(ch);}; while (start > 0 && check(line.charAt(start - 1))) --start; while (end < line.length && check(line.charAt(end))) ++end; } return new Range(Pos(pos.line, start), Pos(pos.line, end)); }, toggleOverwrite: function(value) { if (value != null && value == this.state.overwrite) return; if (this.state.overwrite = !this.state.overwrite) addClass(this.display.cursorDiv, "CodeMirror-overwrite"); else rmClass(this.display.cursorDiv, "CodeMirror-overwrite"); signal(this, "overwriteToggle", this, this.state.overwrite); }, hasFocus: function() { return this.display.input.getField() == activeElt(); }, scrollTo: methodOp(function(x, y) { if (x != null || y != null) resolveScrollToPos(this); if (x != null) this.curOp.scrollLeft = x; if (y != null) this.curOp.scrollTop = y; }), getScrollInfo: function() { var scroller = this.display.scroller; return {left: scroller.scrollLeft, top: scroller.scrollTop, height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight, width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth, clientHeight: displayHeight(this), clientWidth: displayWidth(this)}; }, scrollIntoView: methodOp(function(range, margin) { if (range == null) { range = {from: this.doc.sel.primary().head, to: null}; if (margin == null) margin = this.options.cursorScrollMargin; } else if (typeof range == "number") { range = {from: Pos(range, 0), to: null}; } else if (range.from == null) { range = {from: range, to: null}; } if (!range.to) range.to = range.from; range.margin = margin || 0; if (range.from.line != null) { resolveScrollToPos(this); this.curOp.scrollToPos = range; } else { var sPos = calculateScrollPos(this, Math.min(range.from.left, range.to.left), Math.min(range.from.top, range.to.top) - range.margin, Math.max(range.from.right, range.to.right), Math.max(range.from.bottom, range.to.bottom) + range.margin); this.scrollTo(sPos.scrollLeft, sPos.scrollTop); } }), setSize: methodOp(function(width, height) { var cm = this; function interpret(val) { return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; } if (width != null) cm.display.wrapper.style.width = interpret(width); if (height != null) cm.display.wrapper.style.height = interpret(height); if (cm.options.lineWrapping) clearLineMeasurementCache(this); var lineNo = cm.display.viewFrom; cm.doc.iter(lineNo, cm.display.viewTo, function(line) { if (line.widgets) for (var i = 0; i < line.widgets.length; i++) if (line.widgets[i].noHScroll) { regLineChange(cm, lineNo, "widget"); break; } ++lineNo; }); cm.curOp.forceUpdate = true; signal(cm, "refresh", this); }), operation: function(f){return runInOp(this, f);}, refresh: methodOp(function() { var oldHeight = this.display.cachedTextHeight; regChange(this); this.curOp.forceUpdate = true; clearCaches(this); this.scrollTo(this.doc.scrollLeft, this.doc.scrollTop); updateGutterSpace(this); if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5) estimateLineHeights(this); signal(this, "refresh", this); }), swapDoc: methodOp(function(doc) { var old = this.doc; old.cm = null; attachDoc(this, doc); clearCaches(this); this.display.input.reset(); this.scrollTo(doc.scrollLeft, doc.scrollTop); this.curOp.forceScroll = true; signalLater(this, "swapDoc", this, old); return old; }), getInputField: function(){return this.display.input.getField();}, getWrapperElement: function(){return this.display.wrapper;}, getScrollerElement: function(){return this.display.scroller;}, getGutterElement: function(){return this.display.gutters;} }; eventMixin(CodeMirror); // OPTION DEFAULTS // The default configuration options. var defaults = CodeMirror.defaults = {}; // Functions to run when options are changed. var optionHandlers = CodeMirror.optionHandlers = {}; function option(name, deflt, handle, notOnInit) { CodeMirror.defaults[name] = deflt; if (handle) optionHandlers[name] = notOnInit ? function(cm, val, old) {if (old != Init) handle(cm, val, old);} : handle; } // Passed to option handlers when there is no old value. var Init = CodeMirror.Init = {toString: function(){return "CodeMirror.Init";}}; // These two are, on init, called from the constructor because they // have to be initialized before the editor can start at all. option("value", "", function(cm, val) { cm.setValue(val); }, true); option("mode", null, function(cm, val) { cm.doc.modeOption = val; loadMode(cm); }, true); option("indentUnit", 2, loadMode, true); option("indentWithTabs", false); option("smartIndent", true); option("tabSize", 4, function(cm) { resetModeState(cm); clearCaches(cm); regChange(cm); }, true); option("specialChars", /[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g, function(cm, val, old) { cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g"); if (old != CodeMirror.Init) cm.refresh(); }); option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function(cm) {cm.refresh();}, true); option("electricChars", true); option("inputStyle", mobile ? "contenteditable" : "textarea", function() { throw new Error("inputStyle can not (yet) be changed in a running editor"); // FIXME }, true); option("rtlMoveVisually", !windows); option("wholeLineUpdateBefore", true); option("theme", "default", function(cm) { themeChanged(cm); guttersChanged(cm); }, true); option("keyMap", "default", function(cm, val, old) { var next = getKeyMap(val); var prev = old != CodeMirror.Init && getKeyMap(old); if (prev && prev.detach) prev.detach(cm, next); if (next.attach) next.attach(cm, prev || null); }); option("extraKeys", null); option("lineWrapping", false, wrappingChanged, true); option("gutters", [], function(cm) { setGuttersForLineNumbers(cm.options); guttersChanged(cm); }, true); option("fixedGutter", true, function(cm, val) { cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0"; cm.refresh(); }, true); option("coverGutterNextToScrollbar", false, function(cm) {updateScrollbars(cm);}, true); option("scrollbarStyle", "native", function(cm) { initScrollbars(cm); updateScrollbars(cm); cm.display.scrollbars.setScrollTop(cm.doc.scrollTop); cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft); }, true); option("lineNumbers", false, function(cm) { setGuttersForLineNumbers(cm.options); guttersChanged(cm); }, true); option("firstLineNumber", 1, guttersChanged, true); option("lineNumberFormatter", function(integer) {return integer;}, guttersChanged, true); option("showCursorWhenSelecting", false, updateSelection, true); option("resetSelectionOnContextMenu", true); option("lineWiseCopyCut", true); option("readOnly", false, function(cm, val) { if (val == "nocursor") { onBlur(cm); cm.display.input.blur(); cm.display.disabled = true; } else { cm.display.disabled = false; if (!val) cm.display.input.reset(); } }); option("disableInput", false, function(cm, val) {if (!val) cm.display.input.reset();}, true); option("dragDrop", true, dragDropChanged); option("cursorBlinkRate", 530); option("cursorScrollMargin", 0); option("cursorHeight", 1, updateSelection, true); option("singleCursorHeightPerLine", true, updateSelection, true); option("workTime", 100); option("workDelay", 100); option("flattenSpans", true, resetModeState, true); option("addModeClass", false, resetModeState, true); option("pollInterval", 100); option("undoDepth", 200, function(cm, val){cm.doc.history.undoDepth = val;}); option("historyEventDelay", 1250); option("viewportMargin", 10, function(cm){cm.refresh();}, true); option("maxHighlightLength", 10000, resetModeState, true); option("moveInputWithCursor", true, function(cm, val) { if (!val) cm.display.input.resetPosition(); }); option("tabindex", null, function(cm, val) { cm.display.input.getField().tabIndex = val || ""; }); option("autofocus", null); // MODE DEFINITION AND QUERYING // Known modes, by name and by MIME var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {}; // Extra arguments are stored as the mode's dependencies, which is // used by (legacy) mechanisms like loadmode.js to automatically // load a mode. (Preferred mechanism is the require/define calls.) CodeMirror.defineMode = function(name, mode) { if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name; if (arguments.length > 2) mode.dependencies = Array.prototype.slice.call(arguments, 2); modes[name] = mode; }; CodeMirror.defineMIME = function(mime, spec) { mimeModes[mime] = spec; }; // Given a MIME type, a {name, ...options} config object, or a name // string, return a mode config object. CodeMirror.resolveMode = function(spec) { if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { spec = mimeModes[spec]; } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) { var found = mimeModes[spec.name]; if (typeof found == "string") found = {name: found}; spec = createObj(found, spec); spec.name = found.name; } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) { return CodeMirror.resolveMode("application/xml"); } if (typeof spec == "string") return {name: spec}; else return spec || {name: "null"}; }; // Given a mode spec (anything that resolveMode accepts), find and // initialize an actual mode object. CodeMirror.getMode = function(options, spec) { var spec = CodeMirror.resolveMode(spec); var mfactory = modes[spec.name]; if (!mfactory) return CodeMirror.getMode(options, "text/plain"); var modeObj = mfactory(options, spec); if (modeExtensions.hasOwnProperty(spec.name)) { var exts = modeExtensions[spec.name]; for (var prop in exts) { if (!exts.hasOwnProperty(prop)) continue; if (modeObj.hasOwnProperty(prop)) modeObj["_" + prop] = modeObj[prop]; modeObj[prop] = exts[prop]; } } modeObj.name = spec.name; if (spec.helperType) modeObj.helperType = spec.helperType; if (spec.modeProps) for (var prop in spec.modeProps) modeObj[prop] = spec.modeProps[prop]; return modeObj; }; // Minimal default mode. CodeMirror.defineMode("null", function() { return {token: function(stream) {stream.skipToEnd();}}; }); CodeMirror.defineMIME("text/plain", "null"); // This can be used to attach properties to mode objects from // outside the actual mode definition. var modeExtensions = CodeMirror.modeExtensions = {}; CodeMirror.extendMode = function(mode, properties) { var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {}); copyObj(properties, exts); }; // EXTENSIONS CodeMirror.defineExtension = function(name, func) { CodeMirror.prototype[name] = func; }; CodeMirror.defineDocExtension = function(name, func) { Doc.prototype[name] = func; }; CodeMirror.defineOption = option; var initHooks = []; CodeMirror.defineInitHook = function(f) {initHooks.push(f);}; var helpers = CodeMirror.helpers = {}; CodeMirror.registerHelper = function(type, name, value) { if (!helpers.hasOwnProperty(type)) helpers[type] = CodeMirror[type] = {_global: []}; helpers[type][name] = value; }; CodeMirror.registerGlobalHelper = function(type, name, predicate, value) { CodeMirror.registerHelper(type, name, value); helpers[type]._global.push({pred: predicate, val: value}); }; // MODE STATE HANDLING // Utility functions for working with state. Exported because nested // modes need to do this for their inner modes. var copyState = CodeMirror.copyState = function(mode, state) { if (state === true) return state; if (mode.copyState) return mode.copyState(state); var nstate = {}; for (var n in state) { var val = state[n]; if (val instanceof Array) val = val.concat([]); nstate[n] = val; } return nstate; }; var startState = CodeMirror.startState = function(mode, a1, a2) { return mode.startState ? mode.startState(a1, a2) : true; }; // Given a mode and a state (for that mode), find the inner mode and // state at the position that the state refers to. CodeMirror.innerMode = function(mode, state) { while (mode.innerMode) { var info = mode.innerMode(state); if (!info || info.mode == mode) break; state = info.state; mode = info.mode; } return info || {mode: mode, state: state}; }; // STANDARD COMMANDS // Commands are parameter-less actions that can be performed on an // editor, mostly used for keybindings. var commands = CodeMirror.commands = { selectAll: function(cm) {cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);}, singleSelection: function(cm) { cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll); }, killLine: function(cm) { deleteNearSelection(cm, function(range) { if (range.empty()) { var len = getLine(cm.doc, range.head.line).text.length; if (range.head.ch == len && range.head.line < cm.lastLine()) return {from: range.head, to: Pos(range.head.line + 1, 0)}; else return {from: range.head, to: Pos(range.head.line, len)}; } else { return {from: range.from(), to: range.to()}; } }); }, deleteLine: function(cm) { deleteNearSelection(cm, function(range) { return {from: Pos(range.from().line, 0), to: clipPos(cm.doc, Pos(range.to().line + 1, 0))}; }); }, delLineLeft: function(cm) { deleteNearSelection(cm, function(range) { return {from: Pos(range.from().line, 0), to: range.from()}; }); }, delWrappedLineLeft: function(cm) { deleteNearSelection(cm, function(range) { var top = cm.charCoords(range.head, "div").top + 5; var leftPos = cm.coordsChar({left: 0, top: top}, "div"); return {from: leftPos, to: range.from()}; }); }, delWrappedLineRight: function(cm) { deleteNearSelection(cm, function(range) { var top = cm.charCoords(range.head, "div").top + 5; var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div"); return {from: range.from(), to: rightPos }; }); }, undo: function(cm) {cm.undo();}, redo: function(cm) {cm.redo();}, undoSelection: function(cm) {cm.undoSelection();}, redoSelection: function(cm) {cm.redoSelection();}, goDocStart: function(cm) {cm.extendSelection(Pos(cm.firstLine(), 0));}, goDocEnd: function(cm) {cm.extendSelection(Pos(cm.lastLine()));}, goLineStart: function(cm) { cm.extendSelectionsBy(function(range) { return lineStart(cm, range.head.line); }, {origin: "+move", bias: 1}); }, goLineStartSmart: function(cm) { cm.extendSelectionsBy(function(range) { return lineStartSmart(cm, range.head); }, {origin: "+move", bias: 1}); }, goLineEnd: function(cm) { cm.extendSelectionsBy(function(range) { return lineEnd(cm, range.head.line); }, {origin: "+move", bias: -1}); }, goLineRight: function(cm) { cm.extendSelectionsBy(function(range) { var top = cm.charCoords(range.head, "div").top + 5; return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div"); }, sel_move); }, goLineLeft: function(cm) { cm.extendSelectionsBy(function(range) { var top = cm.charCoords(range.head, "div").top + 5; return cm.coordsChar({left: 0, top: top}, "div"); }, sel_move); }, goLineLeftSmart: function(cm) { cm.extendSelectionsBy(function(range) { var top = cm.charCoords(range.head, "div").top + 5; var pos = cm.coordsChar({left: 0, top: top}, "div"); if (pos.ch < cm.getLine(pos.line).search(/\S/)) return lineStartSmart(cm, range.head); return pos; }, sel_move); }, goLineUp: function(cm) {cm.moveV(-1, "line");}, goLineDown: function(cm) {cm.moveV(1, "line");}, goPageUp: function(cm) {cm.moveV(-1, "page");}, goPageDown: function(cm) {cm.moveV(1, "page");}, goCharLeft: function(cm) {cm.moveH(-1, "char");}, goCharRight: function(cm) {cm.moveH(1, "char");}, goColumnLeft: function(cm) {cm.moveH(-1, "column");}, goColumnRight: function(cm) {cm.moveH(1, "column");}, goWordLeft: function(cm) {cm.moveH(-1, "word");}, goGroupRight: function(cm) {cm.moveH(1, "group");}, goGroupLeft: function(cm) {cm.moveH(-1, "group");}, goWordRight: function(cm) {cm.moveH(1, "word");}, delCharBefore: function(cm) {cm.deleteH(-1, "char");}, delCharAfter: function(cm) {cm.deleteH(1, "char");}, delWordBefore: function(cm) {cm.deleteH(-1, "word");}, delWordAfter: function(cm) {cm.deleteH(1, "word");}, delGroupBefore: function(cm) {cm.deleteH(-1, "group");}, delGroupAfter: function(cm) {cm.deleteH(1, "group");}, indentAuto: function(cm) {cm.indentSelection("smart");}, indentMore: function(cm) {cm.indentSelection("add");}, indentLess: function(cm) {cm.indentSelection("subtract");}, insertTab: function(cm) {cm.replaceSelection("\t");}, insertSoftTab: function(cm) { var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize; for (var i = 0; i < ranges.length; i++) { var pos = ranges[i].from(); var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize); spaces.push(new Array(tabSize - col % tabSize + 1).join(" ")); } cm.replaceSelections(spaces); }, defaultTab: function(cm) { if (cm.somethingSelected()) cm.indentSelection("add"); else cm.execCommand("insertTab"); }, transposeChars: function(cm) { runInOp(cm, function() { var ranges = cm.listSelections(), newSel = []; for (var i = 0; i < ranges.length; i++) { var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text; if (line) { if (cur.ch == line.length) cur = new Pos(cur.line, cur.ch - 1); if (cur.ch > 0) { cur = new Pos(cur.line, cur.ch + 1); cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2), Pos(cur.line, cur.ch - 2), cur, "+transpose"); } else if (cur.line > cm.doc.first) { var prev = getLine(cm.doc, cur.line - 1).text; if (prev) cm.replaceRange(line.charAt(0) + "\n" + prev.charAt(prev.length - 1), Pos(cur.line - 1, prev.length - 1), Pos(cur.line, 1), "+transpose"); } } newSel.push(new Range(cur, cur)); } cm.setSelections(newSel); }); }, newlineAndIndent: function(cm) { runInOp(cm, function() { var len = cm.listSelections().length; for (var i = 0; i < len; i++) { var range = cm.listSelections()[i]; cm.replaceRange("\n", range.anchor, range.head, "+input"); cm.indentLine(range.from().line + 1, null, true); ensureCursorVisible(cm); } }); }, toggleOverwrite: function(cm) {cm.toggleOverwrite();} }; // STANDARD KEYMAPS var keyMap = CodeMirror.keyMap = {}; keyMap.basic = { "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown", "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown", "Delete": "delCharAfter", "Backspace": "delCharBefore", "Shift-Backspace": "delCharBefore", "Tab": "defaultTab", "Shift-Tab": "indentAuto", "Enter": "newlineAndIndent", "Insert": "toggleOverwrite", "Esc": "singleSelection" }; // Note that the save and find-related commands aren't defined by // default. User code or addons can define them. Unknown commands // are simply ignored. keyMap.pcDefault = { "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo", "Ctrl-Home": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Up": "goLineUp", "Ctrl-Down": "goLineDown", "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd", "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find", "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll", "Ctrl-[": "indentLess", "Ctrl-]": "indentMore", "Ctrl-U": "undoSelection", "Shift-Ctrl-U": "redoSelection", "Alt-U": "redoSelection", fallthrough: "basic" }; // Very basic readline/emacs-style bindings, which are standard on Mac. keyMap.emacsy = { "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown", "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd", "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore", "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars" }; keyMap.macDefault = { "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo", "Cmd-Home": "goDocStart", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft", "Alt-Right": "goGroupRight", "Cmd-Left": "goLineLeft", "Cmd-Right": "goLineRight", "Alt-Backspace": "delGroupBefore", "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find", "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll", "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight", "Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Ctrl-Up": "goDocStart", "Ctrl-Down": "goDocEnd", fallthrough: ["basic", "emacsy"] }; keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault; // KEYMAP DISPATCH function normalizeKeyName(name) { var parts = name.split(/-(?!$)/), name = parts[parts.length - 1]; var alt, ctrl, shift, cmd; for (var i = 0; i < parts.length - 1; i++) { var mod = parts[i]; if (/^(cmd|meta|m)$/i.test(mod)) cmd = true; else if (/^a(lt)?$/i.test(mod)) alt = true; else if (/^(c|ctrl|control)$/i.test(mod)) ctrl = true; else if (/^s(hift)$/i.test(mod)) shift = true; else throw new Error("Unrecognized modifier name: " + mod); } if (alt) name = "Alt-" + name; if (ctrl) name = "Ctrl-" + name; if (cmd) name = "Cmd-" + name; if (shift) name = "Shift-" + name; return name; } // This is a kludge to keep keymaps mostly working as raw objects // (backwards compatibility) while at the same time support features // like normalization and multi-stroke key bindings. It compiles a // new normalized keymap, and then updates the old object to reflect // this. CodeMirror.normalizeKeyMap = function(keymap) { var copy = {}; for (var keyname in keymap) if (keymap.hasOwnProperty(keyname)) { var value = keymap[keyname]; if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) continue; if (value == "...") { delete keymap[keyname]; continue; } var keys = map(keyname.split(" "), normalizeKeyName); for (var i = 0; i < keys.length; i++) { var val, name; if (i == keys.length - 1) { name = keyname; val = value; } else { name = keys.slice(0, i + 1).join(" "); val = "..."; } var prev = copy[name]; if (!prev) copy[name] = val; else if (prev != val) throw new Error("Inconsistent bindings for " + name); } delete keymap[keyname]; } for (var prop in copy) keymap[prop] = copy[prop]; return keymap; }; var lookupKey = CodeMirror.lookupKey = function(key, map, handle, context) { map = getKeyMap(map); var found = map.call ? map.call(key, context) : map[key]; if (found === false) return "nothing"; if (found === "...") return "multi"; if (found != null && handle(found)) return "handled"; if (map.fallthrough) { if (Object.prototype.toString.call(map.fallthrough) != "[object Array]") return lookupKey(key, map.fallthrough, handle, context); for (var i = 0; i < map.fallthrough.length; i++) { var result = lookupKey(key, map.fallthrough[i], handle, context); if (result) return result; } } }; // Modifier key presses don't count as 'real' key presses for the // purpose of keymap fallthrough. var isModifierKey = CodeMirror.isModifierKey = function(value) { var name = typeof value == "string" ? value : keyNames[value.keyCode]; return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod"; }; // Look up the name of a key as indicated by an event object. var keyName = CodeMirror.keyName = function(event, noShift) { if (presto && event.keyCode == 34 && event["char"]) return false; var base = keyNames[event.keyCode], name = base; if (name == null || event.altGraphKey) return false; if (event.altKey && base != "Alt") name = "Alt-" + name; if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") name = "Ctrl-" + name; if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Cmd") name = "Cmd-" + name; if (!noShift && event.shiftKey && base != "Shift") name = "Shift-" + name; return name; }; function getKeyMap(val) { return typeof val == "string" ? keyMap[val] : val; } // FROMTEXTAREA CodeMirror.fromTextArea = function(textarea, options) { options = options ? copyObj(options) : {}; options.value = textarea.value; if (!options.tabindex && textarea.tabIndex) options.tabindex = textarea.tabIndex; if (!options.placeholder && textarea.placeholder) options.placeholder = textarea.placeholder; // Set autofocus to true if this textarea is focused, or if it has // autofocus and no other element is focused. if (options.autofocus == null) { var hasFocus = activeElt(); options.autofocus = hasFocus == textarea || textarea.getAttribute("autofocus") != null && hasFocus == document.body; } function save() {textarea.value = cm.getValue();} if (textarea.form) { on(textarea.form, "submit", save); // Deplorable hack to make the submit method do the right thing. if (!options.leaveSubmitMethodAlone) { var form = textarea.form, realSubmit = form.submit; try { var wrappedSubmit = form.submit = function() { save(); form.submit = realSubmit; form.submit(); form.submit = wrappedSubmit; }; } catch(e) {} } } options.finishInit = function(cm) { cm.save = save; cm.getTextArea = function() { return textarea; }; cm.toTextArea = function() { cm.toTextArea = isNaN; // Prevent this from being ran twice save(); textarea.parentNode.removeChild(cm.getWrapperElement()); textarea.style.display = ""; if (textarea.form) { off(textarea.form, "submit", save); if (typeof textarea.form.submit == "function") textarea.form.submit = realSubmit; } }; }; textarea.style.display = "none"; var cm = CodeMirror(function(node) { textarea.parentNode.insertBefore(node, textarea.nextSibling); }, options); return cm; }; // STRING STREAM // Fed to the mode parsers, provides helper functions to make // parsers more succinct. var StringStream = CodeMirror.StringStream = function(string, tabSize) { this.pos = this.start = 0; this.string = string; this.tabSize = tabSize || 8; this.lastColumnPos = this.lastColumnValue = 0; this.lineStart = 0; }; StringStream.prototype = { eol: function() {return this.pos >= this.string.length;}, sol: function() {return this.pos == this.lineStart;}, peek: function() {return this.string.charAt(this.pos) || undefined;}, next: function() { if (this.pos < this.string.length) return this.string.charAt(this.pos++); }, eat: function(match) { var ch = this.string.charAt(this.pos); if (typeof match == "string") var ok = ch == match; else var ok = ch && (match.test ? match.test(ch) : match(ch)); if (ok) {++this.pos; return ch;} }, eatWhile: function(match) { var start = this.pos; while (this.eat(match)){} return this.pos > start; }, eatSpace: function() { var start = this.pos; while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos; return this.pos > start; }, skipToEnd: function() {this.pos = this.string.length;}, skipTo: function(ch) { var found = this.string.indexOf(ch, this.pos); if (found > -1) {this.pos = found; return true;} }, backUp: function(n) {this.pos -= n;}, column: function() { if (this.lastColumnPos < this.start) { this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue); this.lastColumnPos = this.start; } return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0); }, indentation: function() { return countColumn(this.string, null, this.tabSize) - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0); }, match: function(pattern, consume, caseInsensitive) { if (typeof pattern == "string") { var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;}; var substr = this.string.substr(this.pos, pattern.length); if (cased(substr) == cased(pattern)) { if (consume !== false) this.pos += pattern.length; return true; } } else { var match = this.string.slice(this.pos).match(pattern); if (match && match.index > 0) return null; if (match && consume !== false) this.pos += match[0].length; return match; } }, current: function(){return this.string.slice(this.start, this.pos);}, hideFirstChars: function(n, inner) { this.lineStart += n; try { return inner(); } finally { this.lineStart -= n; } } }; // TEXTMARKERS // Created with markText and setBookmark methods. A TextMarker is a // handle that can be used to clear or find a marked position in the // document. Line objects hold arrays (markedSpans) containing // {from, to, marker} object pointing to such marker objects, and // indicating that such a marker is present on that line. Multiple // lines may point to the same marker when it spans across lines. // The spans will have null for their from/to properties when the // marker continues beyond the start/end of the line. Markers have // links back to the lines they currently touch. var nextMarkerId = 0; var TextMarker = CodeMirror.TextMarker = function(doc, type) { this.lines = []; this.type = type; this.doc = doc; this.id = ++nextMarkerId; }; eventMixin(TextMarker); // Clear the marker. TextMarker.prototype.clear = function() { if (this.explicitlyCleared) return; var cm = this.doc.cm, withOp = cm && !cm.curOp; if (withOp) startOperation(cm); if (hasHandler(this, "clear")) { var found = this.find(); if (found) signalLater(this, "clear", found.from, found.to); } var min = null, max = null; for (var i = 0; i < this.lines.length; ++i) { var line = this.lines[i]; var span = getMarkedSpanFor(line.markedSpans, this); if (cm && !this.collapsed) regLineChange(cm, lineNo(line), "text"); else if (cm) { if (span.to != null) max = lineNo(line); if (span.from != null) min = lineNo(line); } line.markedSpans = removeMarkedSpan(line.markedSpans, span); if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm) updateLineHeight(line, textHeight(cm.display)); } if (cm && this.collapsed && !cm.options.lineWrapping) for (var i = 0; i < this.lines.length; ++i) { var visual = visualLine(this.lines[i]), len = lineLength(visual); if (len > cm.display.maxLineLength) { cm.display.maxLine = visual; cm.display.maxLineLength = len; cm.display.maxLineChanged = true; } } if (min != null && cm && this.collapsed) regChange(cm, min, max + 1); this.lines.length = 0; this.explicitlyCleared = true; if (this.atomic && this.doc.cantEdit) { this.doc.cantEdit = false; if (cm) reCheckSelection(cm.doc); } if (cm) signalLater(cm, "markerCleared", cm, this); if (withOp) endOperation(cm); if (this.parent) this.parent.clear(); }; // Find the position of the marker in the document. Returns a {from, // to} object by default. Side can be passed to get a specific side // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the // Pos objects returned contain a line object, rather than a line // number (used to prevent looking up the same line twice). TextMarker.prototype.find = function(side, lineObj) { if (side == null && this.type == "bookmark") side = 1; var from, to; for (var i = 0; i < this.lines.length; ++i) { var line = this.lines[i]; var span = getMarkedSpanFor(line.markedSpans, this); if (span.from != null) { from = Pos(lineObj ? line : lineNo(line), span.from); if (side == -1) return from; } if (span.to != null) { to = Pos(lineObj ? line : lineNo(line), span.to); if (side == 1) return to; } } return from && {from: from, to: to}; }; // Signals that the marker's widget changed, and surrounding layout // should be recomputed. TextMarker.prototype.changed = function() { var pos = this.find(-1, true), widget = this, cm = this.doc.cm; if (!pos || !cm) return; runInOp(cm, function() { var line = pos.line, lineN = lineNo(pos.line); var view = findViewForLine(cm, lineN); if (view) { clearLineMeasurementCacheFor(view); cm.curOp.selectionChanged = cm.curOp.forceUpdate = true; } cm.curOp.updateMaxLine = true; if (!lineIsHidden(widget.doc, line) && widget.height != null) { var oldHeight = widget.height; widget.height = null; var dHeight = widgetHeight(widget) - oldHeight; if (dHeight) updateLineHeight(line, line.height + dHeight); } }); }; TextMarker.prototype.attachLine = function(line) { if (!this.lines.length && this.doc.cm) { var op = this.doc.cm.curOp; if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1) (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); } this.lines.push(line); }; TextMarker.prototype.detachLine = function(line) { this.lines.splice(indexOf(this.lines, line), 1); if (!this.lines.length && this.doc.cm) { var op = this.doc.cm.curOp; (op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this); } }; // Collapsed markers have unique ids, in order to be able to order // them, which is needed for uniquely determining an outer marker // when they overlap (they may nest, but not partially overlap). var nextMarkerId = 0; // Create a marker, wire it up to the right lines, and function markText(doc, from, to, options, type) { // Shared markers (across linked documents) are handled separately // (markTextShared will call out to this again, once per // document). if (options && options.shared) return markTextShared(doc, from, to, options, type); // Ensure we are in an operation. if (doc.cm && !doc.cm.curOp) return operation(doc.cm, markText)(doc, from, to, options, type); var marker = new TextMarker(doc, type), diff = cmp(from, to); if (options) copyObj(options, marker, false); // Don't connect empty markers unless clearWhenEmpty is false if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false) return marker; if (marker.replacedWith) { // Showing up as a widget implies collapsed (widget replaces text) marker.collapsed = true; marker.widgetNode = elt("span", [marker.replacedWith], "CodeMirror-widget"); if (!options.handleMouseEvents) marker.widgetNode.setAttribute("cm-ignore-events", "true"); if (options.insertLeft) marker.widgetNode.insertLeft = true; } if (marker.collapsed) { if (conflictingCollapsedRange(doc, from.line, from, to, marker) || from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker)) throw new Error("Inserting collapsed marker partially overlapping an existing one"); sawCollapsedSpans = true; } if (marker.addToHistory) addChangeToHistory(doc, {from: from, to: to, origin: "markText"}, doc.sel, NaN); var curLine = from.line, cm = doc.cm, updateMaxLine; doc.iter(curLine, to.line + 1, function(line) { if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine) updateMaxLine = true; if (marker.collapsed && curLine != from.line) updateLineHeight(line, 0); addMarkedSpan(line, new MarkedSpan(marker, curLine == from.line ? from.ch : null, curLine == to.line ? to.ch : null)); ++curLine; }); // lineIsHidden depends on the presence of the spans, so needs a second pass if (marker.collapsed) doc.iter(from.line, to.line + 1, function(line) { if (lineIsHidden(doc, line)) updateLineHeight(line, 0); }); if (marker.clearOnEnter) on(marker, "beforeCursorEnter", function() { marker.clear(); }); if (marker.readOnly) { sawReadOnlySpans = true; if (doc.history.done.length || doc.history.undone.length) doc.clearHistory(); } if (marker.collapsed) { marker.id = ++nextMarkerId; marker.atomic = true; } if (cm) { // Sync editor state if (updateMaxLine) cm.curOp.updateMaxLine = true; if (marker.collapsed) regChange(cm, from.line, to.line + 1); else if (marker.className || marker.title || marker.startStyle || marker.endStyle || marker.css) for (var i = from.line; i <= to.line; i++) regLineChange(cm, i, "text"); if (marker.atomic) reCheckSelection(cm.doc); signalLater(cm, "markerAdded", cm, marker); } return marker; } // SHARED TEXTMARKERS // A shared marker spans multiple linked documents. It is // implemented as a meta-marker-object controlling multiple normal // markers. var SharedTextMarker = CodeMirror.SharedTextMarker = function(markers, primary) { this.markers = markers; this.primary = primary; for (var i = 0; i < markers.length; ++i) markers[i].parent = this; }; eventMixin(SharedTextMarker); SharedTextMarker.prototype.clear = function() { if (this.explicitlyCleared) return; this.explicitlyCleared = true; for (var i = 0; i < this.markers.length; ++i) this.markers[i].clear(); signalLater(this, "clear"); }; SharedTextMarker.prototype.find = function(side, lineObj) { return this.primary.find(side, lineObj); }; function markTextShared(doc, from, to, options, type) { options = copyObj(options); options.shared = false; var markers = [markText(doc, from, to, options, type)], primary = markers[0]; var widget = options.widgetNode; linkedDocs(doc, function(doc) { if (widget) options.widgetNode = widget.cloneNode(true); markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type)); for (var i = 0; i < doc.linked.length; ++i) if (doc.linked[i].isParent) return; primary = lst(markers); }); return new SharedTextMarker(markers, primary); } function findSharedMarkers(doc) { return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function(m) { return m.parent; }); } function copySharedMarkers(doc, markers) { for (var i = 0; i < markers.length; i++) { var marker = markers[i], pos = marker.find(); var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to); if (cmp(mFrom, mTo)) { var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type); marker.markers.push(subMark); subMark.parent = marker; } } } function detachSharedMarkers(markers) { for (var i = 0; i < markers.length; i++) { var marker = markers[i], linked = [marker.primary.doc];; linkedDocs(marker.primary.doc, function(d) { linked.push(d); }); for (var j = 0; j < marker.markers.length; j++) { var subMarker = marker.markers[j]; if (indexOf(linked, subMarker.doc) == -1) { subMarker.parent = null; marker.markers.splice(j--, 1); } } } } // TEXTMARKER SPANS function MarkedSpan(marker, from, to) { this.marker = marker; this.from = from; this.to = to; } // Search an array of spans for a span matching the given marker. function getMarkedSpanFor(spans, marker) { if (spans) for (var i = 0; i < spans.length; ++i) { var span = spans[i]; if (span.marker == marker) return span; } } // Remove a span from an array, returning undefined if no spans are // left (we don't store arrays for lines without spans). function removeMarkedSpan(spans, span) { for (var r, i = 0; i < spans.length; ++i) if (spans[i] != span) (r || (r = [])).push(spans[i]); return r; } // Add a span to a line. function addMarkedSpan(line, span) { line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span]; span.marker.attachLine(line); } // Used for the algorithm that adjusts markers for a change in the // document. These functions cut an array of spans at a given // character position, returning an array of remaining chunks (or // undefined if nothing remains). function markedSpansBefore(old, startCh, isInsert) { if (old) for (var i = 0, nw; i < old.length; ++i) { var span = old[i], marker = span.marker; var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh); if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) { var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh); (nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to)); } } return nw; } function markedSpansAfter(old, endCh, isInsert) { if (old) for (var i = 0, nw; i < old.length; ++i) { var span = old[i], marker = span.marker; var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh); if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) { var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh); (nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh, span.to == null ? null : span.to - endCh)); } } return nw; } // Given a change object, compute the new set of marker spans that // cover the line in which the change took place. Removes spans // entirely within the change, reconnects spans belonging to the // same marker that appear on both sides of the change, and cuts off // spans partially within the change. Returns an array of span // arrays with one element for each line in (after) the change. function stretchSpansOverChange(doc, change) { if (change.full) return null; var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans; var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans; if (!oldFirst && !oldLast) return null; var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0; // Get the spans that 'stick out' on both sides var first = markedSpansBefore(oldFirst, startCh, isInsert); var last = markedSpansAfter(oldLast, endCh, isInsert); // Next, merge those two ends var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0); if (first) { // Fix up .to properties of first for (var i = 0; i < first.length; ++i) { var span = first[i]; if (span.to == null) { var found = getMarkedSpanFor(last, span.marker); if (!found) span.to = startCh; else if (sameLine) span.to = found.to == null ? null : found.to + offset; } } } if (last) { // Fix up .from in last (or move them into first in case of sameLine) for (var i = 0; i < last.length; ++i) { var span = last[i]; if (span.to != null) span.to += offset; if (span.from == null) { var found = getMarkedSpanFor(first, span.marker); if (!found) { span.from = offset; if (sameLine) (first || (first = [])).push(span); } } else { span.from += offset; if (sameLine) (first || (first = [])).push(span); } } } // Make sure we didn't create any zero-length spans if (first) first = clearEmptySpans(first); if (last && last != first) last = clearEmptySpans(last); var newMarkers = [first]; if (!sameLine) { // Fill gap with whole-line-spans var gap = change.text.length - 2, gapMarkers; if (gap > 0 && first) for (var i = 0; i < first.length; ++i) if (first[i].to == null) (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i].marker, null, null)); for (var i = 0; i < gap; ++i) newMarkers.push(gapMarkers); newMarkers.push(last); } return newMarkers; } // Remove spans that are empty and don't have a clearWhenEmpty // option of false. function clearEmptySpans(spans) { for (var i = 0; i < spans.length; ++i) { var span = spans[i]; if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false) spans.splice(i--, 1); } if (!spans.length) return null; return spans; } // Used for un/re-doing changes from the history. Combines the // result of computing the existing spans with the set of spans that // existed in the history (so that deleting around a span and then // undoing brings back the span). function mergeOldSpans(doc, change) { var old = getOldSpans(doc, change); var stretched = stretchSpansOverChange(doc, change); if (!old) return stretched; if (!stretched) return old; for (var i = 0; i < old.length; ++i) { var oldCur = old[i], stretchCur = stretched[i]; if (oldCur && stretchCur) { spans: for (var j = 0; j < stretchCur.length; ++j) { var span = stretchCur[j]; for (var k = 0; k < oldCur.length; ++k) if (oldCur[k].marker == span.marker) continue spans; oldCur.push(span); } } else if (stretchCur) { old[i] = stretchCur; } } return old; } // Used to 'clip' out readOnly ranges when making a change. function removeReadOnlyRanges(doc, from, to) { var markers = null; doc.iter(from.line, to.line + 1, function(line) { if (line.markedSpans) for (var i = 0; i < line.markedSpans.length; ++i) { var mark = line.markedSpans[i].marker; if (mark.readOnly && (!markers || indexOf(markers, mark) == -1)) (markers || (markers = [])).push(mark); } }); if (!markers) return null; var parts = [{from: from, to: to}]; for (var i = 0; i < markers.length; ++i) { var mk = markers[i], m = mk.find(0); for (var j = 0; j < parts.length; ++j) { var p = parts[j]; if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) continue; var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to); if (dfrom < 0 || !mk.inclusiveLeft && !dfrom) newParts.push({from: p.from, to: m.from}); if (dto > 0 || !mk.inclusiveRight && !dto) newParts.push({from: m.to, to: p.to}); parts.splice.apply(parts, newParts); j += newParts.length - 1; } } return parts; } // Connect or disconnect spans from a line. function detachMarkedSpans(line) { var spans = line.markedSpans; if (!spans) return; for (var i = 0; i < spans.length; ++i) spans[i].marker.detachLine(line); line.markedSpans = null; } function attachMarkedSpans(line, spans) { if (!spans) return; for (var i = 0; i < spans.length; ++i) spans[i].marker.attachLine(line); line.markedSpans = spans; } // Helpers used when computing which overlapping collapsed span // counts as the larger one. function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0; } function extraRight(marker) { return marker.inclusiveRight ? 1 : 0; } // Returns a number indicating which of two overlapping collapsed // spans is larger (and thus includes the other). Falls back to // comparing ids when the spans cover exactly the same range. function compareCollapsedMarkers(a, b) { var lenDiff = a.lines.length - b.lines.length; if (lenDiff != 0) return lenDiff; var aPos = a.find(), bPos = b.find(); var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b); if (fromCmp) return -fromCmp; var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b); if (toCmp) return toCmp; return b.id - a.id; } // Find out whether a line ends or starts in a collapsed span. If // so, return the marker for that span. function collapsedSpanAtSide(line, start) { var sps = sawCollapsedSpans && line.markedSpans, found; if (sps) for (var sp, i = 0; i < sps.length; ++i) { sp = sps[i]; if (sp.marker.collapsed && (start ? sp.from : sp.to) == null && (!found || compareCollapsedMarkers(found, sp.marker) < 0)) found = sp.marker; } return found; } function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true); } function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false); } // Test whether there exists a collapsed span that partially // overlaps (covers the start or end, but not both) of a new span. // Such overlap is not allowed. function conflictingCollapsedRange(doc, lineNo, from, to, marker) { var line = getLine(doc, lineNo); var sps = sawCollapsedSpans && line.markedSpans; if (sps) for (var i = 0; i < sps.length; ++i) { var sp = sps[i]; if (!sp.marker.collapsed) continue; var found = sp.marker.find(0); var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker); var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker); if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) continue; if (fromCmp <= 0 && (cmp(found.to, from) > 0 || (sp.marker.inclusiveRight && marker.inclusiveLeft)) || fromCmp >= 0 && (cmp(found.from, to) < 0 || (sp.marker.inclusiveLeft && marker.inclusiveRight))) return true; } } // A visual line is a line as drawn on the screen. Folding, for // example, can cause multiple logical lines to appear on the same // visual line. This finds the start of the visual line that the // given line is part of (usually that is the line itself). function visualLine(line) { var merged; while (merged = collapsedSpanAtStart(line)) line = merged.find(-1, true).line; return line; } // Returns an array of logical lines that continue the visual line // started by the argument, or undefined if there are no such lines. function visualLineContinued(line) { var merged, lines; while (merged = collapsedSpanAtEnd(line)) { line = merged.find(1, true).line; (lines || (lines = [])).push(line); } return lines; } // Get the line number of the start of the visual line that the // given line number is part of. function visualLineNo(doc, lineN) { var line = getLine(doc, lineN), vis = visualLine(line); if (line == vis) return lineN; return lineNo(vis); } // Get the line number of the start of the next visual line after // the given line. function visualLineEndNo(doc, lineN) { if (lineN > doc.lastLine()) return lineN; var line = getLine(doc, lineN), merged; if (!lineIsHidden(doc, line)) return lineN; while (merged = collapsedSpanAtEnd(line)) line = merged.find(1, true).line; return lineNo(line) + 1; } // Compute whether a line is hidden. Lines count as hidden when they // are part of a visual line that starts with another line, or when // they are entirely covered by collapsed, non-widget span. function lineIsHidden(doc, line) { var sps = sawCollapsedSpans && line.markedSpans; if (sps) for (var sp, i = 0; i < sps.length; ++i) { sp = sps[i]; if (!sp.marker.collapsed) continue; if (sp.from == null) return true; if (sp.marker.widgetNode) continue; if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp)) return true; } } function lineIsHiddenInner(doc, line, span) { if (span.to == null) { var end = span.marker.find(1, true); return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker)); } if (span.marker.inclusiveRight && span.to == line.text.length) return true; for (var sp, i = 0; i < line.markedSpans.length; ++i) { sp = line.markedSpans[i]; if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to && (sp.to == null || sp.to != span.from) && (sp.marker.inclusiveLeft || span.marker.inclusiveRight) && lineIsHiddenInner(doc, line, sp)) return true; } } // LINE WIDGETS // Line widgets are block elements displayed above or below a line. var LineWidget = CodeMirror.LineWidget = function(doc, node, options) { if (options) for (var opt in options) if (options.hasOwnProperty(opt)) this[opt] = options[opt]; this.doc = doc; this.node = node; }; eventMixin(LineWidget); function adjustScrollWhenAboveVisible(cm, line, diff) { if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop)) addToScrollPos(cm, null, diff); } LineWidget.prototype.clear = function() { var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line); if (no == null || !ws) return; for (var i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1); if (!ws.length) line.widgets = null; var height = widgetHeight(this); updateLineHeight(line, Math.max(0, line.height - height)); if (cm) runInOp(cm, function() { adjustScrollWhenAboveVisible(cm, line, -height); regLineChange(cm, no, "widget"); }); }; LineWidget.prototype.changed = function() { var oldH = this.height, cm = this.doc.cm, line = this.line; this.height = null; var diff = widgetHeight(this) - oldH; if (!diff) return; updateLineHeight(line, line.height + diff); if (cm) runInOp(cm, function() { cm.curOp.forceUpdate = true; adjustScrollWhenAboveVisible(cm, line, diff); }); }; function widgetHeight(widget) { if (widget.height != null) return widget.height; var cm = widget.doc.cm; if (!cm) return 0; if (!contains(document.body, widget.node)) { var parentStyle = "position: relative;"; if (widget.coverGutter) parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;"; if (widget.noHScroll) parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;"; removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle)); } return widget.height = widget.node.offsetHeight; } function addLineWidget(doc, handle, node, options) { var widget = new LineWidget(doc, node, options); var cm = doc.cm; if (cm && widget.noHScroll) cm.display.alignWidgets = true; changeLine(doc, handle, "widget", function(line) { var widgets = line.widgets || (line.widgets = []); if (widget.insertAt == null) widgets.push(widget); else widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget); widget.line = line; if (cm && !lineIsHidden(doc, line)) { var aboveVisible = heightAtLine(line) < doc.scrollTop; updateLineHeight(line, line.height + widgetHeight(widget)); if (aboveVisible) addToScrollPos(cm, null, widget.height); cm.curOp.forceUpdate = true; } return true; }); return widget; } // LINE DATA STRUCTURE // Line objects. These hold state related to a line, including // highlighting info (the styles array). var Line = CodeMirror.Line = function(text, markedSpans, estimateHeight) { this.text = text; attachMarkedSpans(this, markedSpans); this.height = estimateHeight ? estimateHeight(this) : 1; }; eventMixin(Line); Line.prototype.lineNo = function() { return lineNo(this); }; // Change the content (text, markers) of a line. Automatically // invalidates cached information and tries to re-estimate the // line's height. function updateLine(line, text, markedSpans, estimateHeight) { line.text = text; if (line.stateAfter) line.stateAfter = null; if (line.styles) line.styles = null; if (line.order != null) line.order = null; detachMarkedSpans(line); attachMarkedSpans(line, markedSpans); var estHeight = estimateHeight ? estimateHeight(line) : 1; if (estHeight != line.height) updateLineHeight(line, estHeight); } // Detach a line from the document tree and its markers. function cleanUpLine(line) { line.parent = null; detachMarkedSpans(line); } function extractLineClasses(type, output) { if (type) for (;;) { var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/); if (!lineClass) break; type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length); var prop = lineClass[1] ? "bgClass" : "textClass"; if (output[prop] == null) output[prop] = lineClass[2]; else if (!(new RegExp("(?:^|\s)" + lineClass[2] + "(?:$|\s)")).test(output[prop])) output[prop] += " " + lineClass[2]; } return type; } function callBlankLine(mode, state) { if (mode.blankLine) return mode.blankLine(state); if (!mode.innerMode) return; var inner = CodeMirror.innerMode(mode, state); if (inner.mode.blankLine) return inner.mode.blankLine(inner.state); } function readToken(mode, stream, state, inner) { for (var i = 0; i < 10; i++) { if (inner) inner[0] = CodeMirror.innerMode(mode, state).mode; var style = mode.token(stream, state); if (stream.pos > stream.start) return style; } throw new Error("Mode " + mode.name + " failed to advance stream."); } // Utility for getTokenAt and getLineTokens function takeToken(cm, pos, precise, asArray) { function getObj(copy) { return {start: stream.start, end: stream.pos, string: stream.current(), type: style || null, state: copy ? copyState(doc.mode, state) : state}; } var doc = cm.doc, mode = doc.mode, style; pos = clipPos(doc, pos); var line = getLine(doc, pos.line), state = getStateBefore(cm, pos.line, precise); var stream = new StringStream(line.text, cm.options.tabSize), tokens; if (asArray) tokens = []; while ((asArray || stream.pos < pos.ch) && !stream.eol()) { stream.start = stream.pos; style = readToken(mode, stream, state); if (asArray) tokens.push(getObj(true)); } return asArray ? tokens : getObj(); } // Run the given mode's parser over a line, calling f for each token. function runMode(cm, text, mode, state, f, lineClasses, forceToEnd) { var flattenSpans = mode.flattenSpans; if (flattenSpans == null) flattenSpans = cm.options.flattenSpans; var curStart = 0, curStyle = null; var stream = new StringStream(text, cm.options.tabSize), style; var inner = cm.options.addModeClass && [null]; if (text == "") extractLineClasses(callBlankLine(mode, state), lineClasses); while (!stream.eol()) { if (stream.pos > cm.options.maxHighlightLength) { flattenSpans = false; if (forceToEnd) processLine(cm, text, state, stream.pos); stream.pos = text.length; style = null; } else { style = extractLineClasses(readToken(mode, stream, state, inner), lineClasses); } if (inner) { var mName = inner[0].name; if (mName) style = "m-" + (style ? mName + " " + style : mName); } if (!flattenSpans || curStyle != style) { while (curStart < stream.start) { curStart = Math.min(stream.start, curStart + 50000); f(curStart, curStyle); } curStyle = style; } stream.start = stream.pos; } while (curStart < stream.pos) { // Webkit seems to refuse to render text nodes longer than 57444 characters var pos = Math.min(stream.pos, curStart + 50000); f(pos, curStyle); curStart = pos; } } // Compute a style array (an array starting with a mode generation // -- for invalidation -- followed by pairs of end positions and // style strings), which is used to highlight the tokens on the // line. function highlightLine(cm, line, state, forceToEnd) { // A styles array always starts with a number identifying the // mode/overlays that it is based on (for easy invalidation). var st = [cm.state.modeGen], lineClasses = {}; // Compute the base array of styles runMode(cm, line.text, cm.doc.mode, state, function(end, style) { st.push(end, style); }, lineClasses, forceToEnd); // Run overlays, adjust style array. for (var o = 0; o < cm.state.overlays.length; ++o) { var overlay = cm.state.overlays[o], i = 1, at = 0; runMode(cm, line.text, overlay.mode, true, function(end, style) { var start = i; // Ensure there's a token end at the current position, and that i points at it while (at < end) { var i_end = st[i]; if (i_end > end) st.splice(i, 1, end, st[i+1], i_end); i += 2; at = Math.min(end, i_end); } if (!style) return; if (overlay.opaque) { st.splice(start, i - start, end, "cm-overlay " + style); i = start + 2; } else { for (; start < i; start += 2) { var cur = st[start+1]; st[start+1] = (cur ? cur + " " : "") + "cm-overlay " + style; } } }, lineClasses); } return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null}; } function getLineStyles(cm, line, updateFrontier) { if (!line.styles || line.styles[0] != cm.state.modeGen) { var result = highlightLine(cm, line, line.stateAfter = getStateBefore(cm, lineNo(line))); line.styles = result.styles; if (result.classes) line.styleClasses = result.classes; else if (line.styleClasses) line.styleClasses = null; if (updateFrontier === cm.doc.frontier) cm.doc.frontier++; } return line.styles; } // Lightweight form of highlight -- proceed over this line and // update state, but don't save a style array. Used for lines that // aren't currently visible. function processLine(cm, text, state, startAt) { var mode = cm.doc.mode; var stream = new StringStream(text, cm.options.tabSize); stream.start = stream.pos = startAt || 0; if (text == "") callBlankLine(mode, state); while (!stream.eol() && stream.pos <= cm.options.maxHighlightLength) { readToken(mode, stream, state); stream.start = stream.pos; } } // Convert a style as returned by a mode (either null, or a string // containing one or more styles) to a CSS style. This is cached, // and also looks for line-wide styles. var styleToClassCache = {}, styleToClassCacheWithMode = {}; function interpretTokenStyle(style, options) { if (!style || /^\s*$/.test(style)) return null; var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache; return cache[style] || (cache[style] = style.replace(/\S+/g, "cm-$&")); } // Render the DOM representation of the text of a line. Also builds // up a 'line map', which points at the DOM nodes that represent // specific stretches of text, and is used by the measuring code. // The returned object contains the DOM node, this map, and // information about line-wide styles that were set by the mode. function buildLineContent(cm, lineView) { // The padding-right forces the element to have a 'border', which // is needed on Webkit to be able to get line-level bounding // rectangles for it (in measureChar). var content = elt("span", null, null, webkit ? "padding-right: .1px" : null); var builder = {pre: elt("pre", [content]), content: content, col: 0, pos: 0, cm: cm, splitSpaces: (ie || webkit) && cm.getOption("lineWrapping")}; lineView.measure = {}; // Iterate over the logical lines that make up this visual line. for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) { var line = i ? lineView.rest[i - 1] : lineView.line, order; builder.pos = 0; builder.addToken = buildToken; // Optionally wire in some hacks into the token-rendering // algorithm, to deal with browser quirks. if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line))) builder.addToken = buildTokenBadBidi(builder.addToken, order); builder.map = []; var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line); insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate)); if (line.styleClasses) { if (line.styleClasses.bgClass) builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || ""); if (line.styleClasses.textClass) builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || ""); } // Ensure at least a single node is present, for measuring. if (builder.map.length == 0) builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); // Store the map and a cache object for the current logical line if (i == 0) { lineView.measure.map = builder.map; lineView.measure.cache = {}; } else { (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map); (lineView.measure.caches || (lineView.measure.caches = [])).push({}); } } // See issue #2901 if (webkit && /\bcm-tab\b/.test(builder.content.lastChild.className)) builder.content.className = "cm-tab-wrap-hack"; signal(cm, "renderLine", cm, lineView.line, builder.pre); if (builder.pre.className) builder.textClass = joinClasses(builder.pre.className, builder.textClass || ""); return builder; } function defaultSpecialCharPlaceholder(ch) { var token = elt("span", "\u2022", "cm-invalidchar"); token.title = "\\u" + ch.charCodeAt(0).toString(16); token.setAttribute("aria-label", token.title); return token; } // Build up the DOM representation for a single token, and add it to // the line map. Takes care to render special characters separately. function buildToken(builder, text, style, startStyle, endStyle, title, css) { if (!text) return; var displayText = builder.splitSpaces ? text.replace(/ {3,}/g, splitSpaces) : text; var special = builder.cm.state.specialChars, mustWrap = false; if (!special.test(text)) { builder.col += text.length; var content = document.createTextNode(displayText); builder.map.push(builder.pos, builder.pos + text.length, content); if (ie && ie_version < 9) mustWrap = true; builder.pos += text.length; } else { var content = document.createDocumentFragment(), pos = 0; while (true) { special.lastIndex = pos; var m = special.exec(text); var skipped = m ? m.index - pos : text.length - pos; if (skipped) { var txt = document.createTextNode(displayText.slice(pos, pos + skipped)); if (ie && ie_version < 9) content.appendChild(elt("span", [txt])); else content.appendChild(txt); builder.map.push(builder.pos, builder.pos + skipped, txt); builder.col += skipped; builder.pos += skipped; } if (!m) break; pos += skipped + 1; if (m[0] == "\t") { var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize; var txt = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab")); txt.setAttribute("role", "presentation"); txt.setAttribute("cm-text", "\t"); builder.col += tabWidth; } else { var txt = builder.cm.options.specialCharPlaceholder(m[0]); txt.setAttribute("cm-text", m[0]); if (ie && ie_version < 9) content.appendChild(elt("span", [txt])); else content.appendChild(txt); builder.col += 1; } builder.map.push(builder.pos, builder.pos + 1, txt); builder.pos++; } } if (style || startStyle || endStyle || mustWrap || css) { var fullStyle = style || ""; if (startStyle) fullStyle += startStyle; if (endStyle) fullStyle += endStyle; var token = elt("span", [content], fullStyle, css); if (title) token.title = title; return builder.content.appendChild(token); } builder.content.appendChild(content); } function splitSpaces(old) { var out = " "; for (var i = 0; i < old.length - 2; ++i) out += i % 2 ? " " : "\u00a0"; out += " "; return out; } // Work around nonsense dimensions being reported for stretches of // right-to-left text. function buildTokenBadBidi(inner, order) { return function(builder, text, style, startStyle, endStyle, title, css) { style = style ? style + " cm-force-border" : "cm-force-border"; var start = builder.pos, end = start + text.length; for (;;) { // Find the part that overlaps with the start of this text for (var i = 0; i < order.length; i++) { var part = order[i]; if (part.to > start && part.from <= start) break; } if (part.to >= end) return inner(builder, text, style, startStyle, endStyle, title, css); inner(builder, text.slice(0, part.to - start), style, startStyle, null, title, css); startStyle = null; text = text.slice(part.to - start); start = part.to; } }; } function buildCollapsedSpan(builder, size, marker, ignoreWidget) { var widget = !ignoreWidget && marker.widgetNode; if (widget) builder.map.push(builder.pos, builder.pos + size, widget); if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) { if (!widget) widget = builder.content.appendChild(document.createElement("span")); widget.setAttribute("cm-marker", marker.id); } if (widget) { builder.cm.display.input.setUneditable(widget); builder.content.appendChild(widget); } builder.pos += size; } // Outputs a number of spans to make up a line, taking highlighting // and marked text into account. function insertLineContent(line, builder, styles) { var spans = line.markedSpans, allText = line.text, at = 0; if (!spans) { for (var i = 1; i < styles.length; i+=2) builder.addToken(builder, allText.slice(at, at = styles[i]), interpretTokenStyle(styles[i+1], builder.cm.options)); return; } var len = allText.length, pos = 0, i = 1, text = "", style, css; var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, title, collapsed; for (;;) { if (nextChange == pos) { // Update current marker set spanStyle = spanEndStyle = spanStartStyle = title = css = ""; collapsed = null; nextChange = Infinity; var foundBookmarks = []; for (var j = 0; j < spans.length; ++j) { var sp = spans[j], m = sp.marker; if (m.type == "bookmark" && sp.from == pos && m.widgetNode) { foundBookmarks.push(m); } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) { if (sp.to != null && sp.to != pos && nextChange > sp.to) { nextChange = sp.to; spanEndStyle = ""; } if (m.className) spanStyle += " " + m.className; if (m.css) css = m.css; if (m.startStyle && sp.from == pos) spanStartStyle += " " + m.startStyle; if (m.endStyle && sp.to == nextChange) spanEndStyle += " " + m.endStyle; if (m.title && !title) title = m.title; if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0)) collapsed = sp; } else if (sp.from > pos && nextChange > sp.from) { nextChange = sp.from; } } if (collapsed && (collapsed.from || 0) == pos) { buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos, collapsed.marker, collapsed.from == null); if (collapsed.to == null) return; if (collapsed.to == pos) collapsed = false; } if (!collapsed && foundBookmarks.length) for (var j = 0; j < foundBookmarks.length; ++j) buildCollapsedSpan(builder, 0, foundBookmarks[j]); } if (pos >= len) break; var upto = Math.min(len, nextChange); while (true) { if (text) { var end = pos + text.length; if (!collapsed) { var tokenText = end > upto ? text.slice(0, upto - pos) : text; builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle, spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", title, css); } if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;} pos = end; spanStartStyle = ""; } text = allText.slice(at, at = styles[i++]); style = interpretTokenStyle(styles[i++], builder.cm.options); } } } // DOCUMENT DATA STRUCTURE // By default, updates that start and end at the beginning of a line // are treated specially, in order to make the association of line // widgets and marker elements with the text behave more intuitive. function isWholeLineUpdate(doc, change) { return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" && (!doc.cm || doc.cm.options.wholeLineUpdateBefore); } // Perform a change on the document data structure. function updateDoc(doc, change, markedSpans, estimateHeight) { function spansFor(n) {return markedSpans ? markedSpans[n] : null;} function update(line, text, spans) { updateLine(line, text, spans, estimateHeight); signalLater(line, "change", line, change); } function linesFor(start, end) { for (var i = start, result = []; i < end; ++i) result.push(new Line(text[i], spansFor(i), estimateHeight)); return result; } var from = change.from, to = change.to, text = change.text; var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line); var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line; // Adjust the line structure if (change.full) { doc.insert(0, linesFor(0, text.length)); doc.remove(text.length, doc.size - text.length); } else if (isWholeLineUpdate(doc, change)) { // This is a whole-line replace. Treated specially to make // sure line objects move the way they are supposed to. var added = linesFor(0, text.length - 1); update(lastLine, lastLine.text, lastSpans); if (nlines) doc.remove(from.line, nlines); if (added.length) doc.insert(from.line, added); } else if (firstLine == lastLine) { if (text.length == 1) { update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans); } else { var added = linesFor(1, text.length - 1); added.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight)); update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); doc.insert(from.line + 1, added); } } else if (text.length == 1) { update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0)); doc.remove(from.line + 1, nlines); } else { update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans); var added = linesFor(1, text.length - 1); if (nlines > 1) doc.remove(from.line + 1, nlines - 1); doc.insert(from.line + 1, added); } signalLater(doc, "change", doc, change); } // The document is represented as a BTree consisting of leaves, with // chunk of lines in them, and branches, with up to ten leaves or // other branch nodes below them. The top node is always a branch // node, and is the document object itself (meaning it has // additional methods and properties). // // All nodes have parent links. The tree is used both to go from // line numbers to line objects, and to go from objects to numbers. // It also indexes by height, and is used to convert between height // and line object, and to find the total height of the document. // // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html function LeafChunk(lines) { this.lines = lines; this.parent = null; for (var i = 0, height = 0; i < lines.length; ++i) { lines[i].parent = this; height += lines[i].height; } this.height = height; } LeafChunk.prototype = { chunkSize: function() { return this.lines.length; }, // Remove the n lines at offset 'at'. removeInner: function(at, n) { for (var i = at, e = at + n; i < e; ++i) { var line = this.lines[i]; this.height -= line.height; cleanUpLine(line); signalLater(line, "delete"); } this.lines.splice(at, n); }, // Helper used to collapse a small branch into a single leaf. collapse: function(lines) { lines.push.apply(lines, this.lines); }, // Insert the given array of lines at offset 'at', count them as // having the given height. insertInner: function(at, lines, height) { this.height += height; this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at)); for (var i = 0; i < lines.length; ++i) lines[i].parent = this; }, // Used to iterate over a part of the tree. iterN: function(at, n, op) { for (var e = at + n; at < e; ++at) if (op(this.lines[at])) return true; } }; function BranchChunk(children) { this.children = children; var size = 0, height = 0; for (var i = 0; i < children.length; ++i) { var ch = children[i]; size += ch.chunkSize(); height += ch.height; ch.parent = this; } this.size = size; this.height = height; this.parent = null; } BranchChunk.prototype = { chunkSize: function() { return this.size; }, removeInner: function(at, n) { this.size -= n; for (var i = 0; i < this.children.length; ++i) { var child = this.children[i], sz = child.chunkSize(); if (at < sz) { var rm = Math.min(n, sz - at), oldHeight = child.height; child.removeInner(at, rm); this.height -= oldHeight - child.height; if (sz == rm) { this.children.splice(i--, 1); child.parent = null; } if ((n -= rm) == 0) break; at = 0; } else at -= sz; } // If the result is smaller than 25 lines, ensure that it is a // single leaf node. if (this.size - n < 25 && (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) { var lines = []; this.collapse(lines); this.children = [new LeafChunk(lines)]; this.children[0].parent = this; } }, collapse: function(lines) { for (var i = 0; i < this.children.length; ++i) this.children[i].collapse(lines); }, insertInner: function(at, lines, height) { this.size += lines.length; this.height += height; for (var i = 0; i < this.children.length; ++i) { var child = this.children[i], sz = child.chunkSize(); if (at <= sz) { child.insertInner(at, lines, height); if (child.lines && child.lines.length > 50) { while (child.lines.length > 50) { var spilled = child.lines.splice(child.lines.length - 25, 25); var newleaf = new LeafChunk(spilled); child.height -= newleaf.height; this.children.splice(i + 1, 0, newleaf); newleaf.parent = this; } this.maybeSpill(); } break; } at -= sz; } }, // When a node has grown, check whether it should be split. maybeSpill: function() { if (this.children.length <= 10) return; var me = this; do { var spilled = me.children.splice(me.children.length - 5, 5); var sibling = new BranchChunk(spilled); if (!me.parent) { // Become the parent node var copy = new BranchChunk(me.children); copy.parent = me; me.children = [copy, sibling]; me = copy; } else { me.size -= sibling.size; me.height -= sibling.height; var myIndex = indexOf(me.parent.children, me); me.parent.children.splice(myIndex + 1, 0, sibling); } sibling.parent = me.parent; } while (me.children.length > 10); me.parent.maybeSpill(); }, iterN: function(at, n, op) { for (var i = 0; i < this.children.length; ++i) { var child = this.children[i], sz = child.chunkSize(); if (at < sz) { var used = Math.min(n, sz - at); if (child.iterN(at, used, op)) return true; if ((n -= used) == 0) break; at = 0; } else at -= sz; } } }; var nextDocId = 0; var Doc = CodeMirror.Doc = function(text, mode, firstLine) { if (!(this instanceof Doc)) return new Doc(text, mode, firstLine); if (firstLine == null) firstLine = 0; BranchChunk.call(this, [new LeafChunk([new Line("", null)])]); this.first = firstLine; this.scrollTop = this.scrollLeft = 0; this.cantEdit = false; this.cleanGeneration = 1; this.frontier = firstLine; var start = Pos(firstLine, 0); this.sel = simpleSelection(start); this.history = new History(null); this.id = ++nextDocId; this.modeOption = mode; if (typeof text == "string") text = splitLines(text); updateDoc(this, {from: start, to: start, text: text}); setSelection(this, simpleSelection(start), sel_dontScroll); }; Doc.prototype = createObj(BranchChunk.prototype, { constructor: Doc, // Iterate over the document. Supports two forms -- with only one // argument, it calls that for each line in the document. With // three, it iterates over the range given by the first two (with // the second being non-inclusive). iter: function(from, to, op) { if (op) this.iterN(from - this.first, to - from, op); else this.iterN(this.first, this.first + this.size, from); }, // Non-public interface for adding and removing lines. insert: function(at, lines) { var height = 0; for (var i = 0; i < lines.length; ++i) height += lines[i].height; this.insertInner(at - this.first, lines, height); }, remove: function(at, n) { this.removeInner(at - this.first, n); }, // From here, the methods are part of the public interface. Most // are also available from CodeMirror (editor) instances. getValue: function(lineSep) { var lines = getLines(this, this.first, this.first + this.size); if (lineSep === false) return lines; return lines.join(lineSep || "\n"); }, setValue: docMethodOp(function(code) { var top = Pos(this.first, 0), last = this.first + this.size - 1; makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length), text: splitLines(code), origin: "setValue", full: true}, true); setSelection(this, simpleSelection(top)); }), replaceRange: function(code, from, to, origin) { from = clipPos(this, from); to = to ? clipPos(this, to) : from; replaceRange(this, code, from, to, origin); }, getRange: function(from, to, lineSep) { var lines = getBetween(this, clipPos(this, from), clipPos(this, to)); if (lineSep === false) return lines; return lines.join(lineSep || "\n"); }, getLine: function(line) {var l = this.getLineHandle(line); return l && l.text;}, getLineHandle: function(line) {if (isLine(this, line)) return getLine(this, line);}, getLineNumber: function(line) {return lineNo(line);}, getLineHandleVisualStart: function(line) { if (typeof line == "number") line = getLine(this, line); return visualLine(line); }, lineCount: function() {return this.size;}, firstLine: function() {return this.first;}, lastLine: function() {return this.first + this.size - 1;}, clipPos: function(pos) {return clipPos(this, pos);}, getCursor: function(start) { var range = this.sel.primary(), pos; if (start == null || start == "head") pos = range.head; else if (start == "anchor") pos = range.anchor; else if (start == "end" || start == "to" || start === false) pos = range.to(); else pos = range.from(); return pos; }, listSelections: function() { return this.sel.ranges; }, somethingSelected: function() {return this.sel.somethingSelected();}, setCursor: docMethodOp(function(line, ch, options) { setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options); }), setSelection: docMethodOp(function(anchor, head, options) { setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options); }), extendSelection: docMethodOp(function(head, other, options) { extendSelection(this, clipPos(this, head), other && clipPos(this, other), options); }), extendSelections: docMethodOp(function(heads, options) { extendSelections(this, clipPosArray(this, heads, options)); }), extendSelectionsBy: docMethodOp(function(f, options) { extendSelections(this, map(this.sel.ranges, f), options); }), setSelections: docMethodOp(function(ranges, primary, options) { if (!ranges.length) return; for (var i = 0, out = []; i < ranges.length; i++) out[i] = new Range(clipPos(this, ranges[i].anchor), clipPos(this, ranges[i].head)); if (primary == null) primary = Math.min(ranges.length - 1, this.sel.primIndex); setSelection(this, normalizeSelection(out, primary), options); }), addSelection: docMethodOp(function(anchor, head, options) { var ranges = this.sel.ranges.slice(0); ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor))); setSelection(this, normalizeSelection(ranges, ranges.length - 1), options); }), getSelection: function(lineSep) { var ranges = this.sel.ranges, lines; for (var i = 0; i < ranges.length; i++) { var sel = getBetween(this, ranges[i].from(), ranges[i].to()); lines = lines ? lines.concat(sel) : sel; } if (lineSep === false) return lines; else return lines.join(lineSep || "\n"); }, getSelections: function(lineSep) { var parts = [], ranges = this.sel.ranges; for (var i = 0; i < ranges.length; i++) { var sel = getBetween(this, ranges[i].from(), ranges[i].to()); if (lineSep !== false) sel = sel.join(lineSep || "\n"); parts[i] = sel; } return parts; }, replaceSelection: function(code, collapse, origin) { var dup = []; for (var i = 0; i < this.sel.ranges.length; i++) dup[i] = code; this.replaceSelections(dup, collapse, origin || "+input"); }, replaceSelections: docMethodOp(function(code, collapse, origin) { var changes = [], sel = this.sel; for (var i = 0; i < sel.ranges.length; i++) { var range = sel.ranges[i]; changes[i] = {from: range.from(), to: range.to(), text: splitLines(code[i]), origin: origin}; } var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse); for (var i = changes.length - 1; i >= 0; i--) makeChange(this, changes[i]); if (newSel) setSelectionReplaceHistory(this, newSel); else if (this.cm) ensureCursorVisible(this.cm); }), undo: docMethodOp(function() {makeChangeFromHistory(this, "undo");}), redo: docMethodOp(function() {makeChangeFromHistory(this, "redo");}), undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", true);}), redoSelection: docMethodOp(function() {makeChangeFromHistory(this, "redo", true);}), setExtending: function(val) {this.extend = val;}, getExtending: function() {return this.extend;}, historySize: function() { var hist = this.history, done = 0, undone = 0; for (var i = 0; i < hist.done.length; i++) if (!hist.done[i].ranges) ++done; for (var i = 0; i < hist.undone.length; i++) if (!hist.undone[i].ranges) ++undone; return {undo: done, redo: undone}; }, clearHistory: function() {this.history = new History(this.history.maxGeneration);}, markClean: function() { this.cleanGeneration = this.changeGeneration(true); }, changeGeneration: function(forceSplit) { if (forceSplit) this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; return this.history.generation; }, isClean: function (gen) { return this.history.generation == (gen || this.cleanGeneration); }, getHistory: function() { return {done: copyHistoryArray(this.history.done), undone: copyHistoryArray(this.history.undone)}; }, setHistory: function(histData) { var hist = this.history = new History(this.history.maxGeneration); hist.done = copyHistoryArray(histData.done.slice(0), null, true); hist.undone = copyHistoryArray(histData.undone.slice(0), null, true); }, addLineClass: docMethodOp(function(handle, where, cls) { return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function(line) { var prop = where == "text" ? "textClass" : where == "background" ? "bgClass" : where == "gutter" ? "gutterClass" : "wrapClass"; if (!line[prop]) line[prop] = cls; else if (classTest(cls).test(line[prop])) return false; else line[prop] += " " + cls; return true; }); }), removeLineClass: docMethodOp(function(handle, where, cls) { return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function(line) { var prop = where == "text" ? "textClass" : where == "background" ? "bgClass" : where == "gutter" ? "gutterClass" : "wrapClass"; var cur = line[prop]; if (!cur) return false; else if (cls == null) line[prop] = null; else { var found = cur.match(classTest(cls)); if (!found) return false; var end = found.index + found[0].length; line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null; } return true; }); }), addLineWidget: docMethodOp(function(handle, node, options) { return addLineWidget(this, handle, node, options); }), removeLineWidget: function(widget) { widget.clear(); }, markText: function(from, to, options) { return markText(this, clipPos(this, from), clipPos(this, to), options, "range"); }, setBookmark: function(pos, options) { var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options), insertLeft: options && options.insertLeft, clearWhenEmpty: false, shared: options && options.shared, handleMouseEvents: options && options.handleMouseEvents}; pos = clipPos(this, pos); return markText(this, pos, pos, realOpts, "bookmark"); }, findMarksAt: function(pos) { pos = clipPos(this, pos); var markers = [], spans = getLine(this, pos.line).markedSpans; if (spans) for (var i = 0; i < spans.length; ++i) { var span = spans[i]; if ((span.from == null || span.from <= pos.ch) && (span.to == null || span.to >= pos.ch)) markers.push(span.marker.parent || span.marker); } return markers; }, findMarks: function(from, to, filter) { from = clipPos(this, from); to = clipPos(this, to); var found = [], lineNo = from.line; this.iter(from.line, to.line + 1, function(line) { var spans = line.markedSpans; if (spans) for (var i = 0; i < spans.length; i++) { var span = spans[i]; if (!(lineNo == from.line && from.ch > span.to || span.from == null && lineNo != from.line|| lineNo == to.line && span.from > to.ch) && (!filter || filter(span.marker))) found.push(span.marker.parent || span.marker); } ++lineNo; }); return found; }, getAllMarks: function() { var markers = []; this.iter(function(line) { var sps = line.markedSpans; if (sps) for (var i = 0; i < sps.length; ++i) if (sps[i].from != null) markers.push(sps[i].marker); }); return markers; }, posFromIndex: function(off) { var ch, lineNo = this.first; this.iter(function(line) { var sz = line.text.length + 1; if (sz > off) { ch = off; return true; } off -= sz; ++lineNo; }); return clipPos(this, Pos(lineNo, ch)); }, indexFromPos: function (coords) { coords = clipPos(this, coords); var index = coords.ch; if (coords.line < this.first || coords.ch < 0) return 0; this.iter(this.first, coords.line, function (line) { index += line.text.length + 1; }); return index; }, copy: function(copyHistory) { var doc = new Doc(getLines(this, this.first, this.first + this.size), this.modeOption, this.first); doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft; doc.sel = this.sel; doc.extend = false; if (copyHistory) { doc.history.undoDepth = this.history.undoDepth; doc.setHistory(this.getHistory()); } return doc; }, linkedDoc: function(options) { if (!options) options = {}; var from = this.first, to = this.first + this.size; if (options.from != null && options.from > from) from = options.from; if (options.to != null && options.to < to) to = options.to; var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from); if (options.sharedHist) copy.history = this.history; (this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist}); copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}]; copySharedMarkers(copy, findSharedMarkers(this)); return copy; }, unlinkDoc: function(other) { if (other instanceof CodeMirror) other = other.doc; if (this.linked) for (var i = 0; i < this.linked.length; ++i) { var link = this.linked[i]; if (link.doc != other) continue; this.linked.splice(i, 1); other.unlinkDoc(this); detachSharedMarkers(findSharedMarkers(this)); break; } // If the histories were shared, split them again if (other.history == this.history) { var splitIds = [other.id]; linkedDocs(other, function(doc) {splitIds.push(doc.id);}, true); other.history = new History(null); other.history.done = copyHistoryArray(this.history.done, splitIds); other.history.undone = copyHistoryArray(this.history.undone, splitIds); } }, iterLinkedDocs: function(f) {linkedDocs(this, f);}, getMode: function() {return this.mode;}, getEditor: function() {return this.cm;} }); // Public alias. Doc.prototype.eachLine = Doc.prototype.iter; // Set up methods on CodeMirror's prototype to redirect to the editor's document. var dontDelegate = "iter insert remove copy getEditor".split(" "); for (var prop in Doc.prototype) if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0) CodeMirror.prototype[prop] = (function(method) { return function() {return method.apply(this.doc, arguments);}; })(Doc.prototype[prop]); eventMixin(Doc); // Call f for all linked documents. function linkedDocs(doc, f, sharedHistOnly) { function propagate(doc, skip, sharedHist) { if (doc.linked) for (var i = 0; i < doc.linked.length; ++i) { var rel = doc.linked[i]; if (rel.doc == skip) continue; var shared = sharedHist && rel.sharedHist; if (sharedHistOnly && !shared) continue; f(rel.doc, shared); propagate(rel.doc, doc, shared); } } propagate(doc, null, true); } // Attach a document to an editor. function attachDoc(cm, doc) { if (doc.cm) throw new Error("This document is already in use."); cm.doc = doc; doc.cm = cm; estimateLineHeights(cm); loadMode(cm); if (!cm.options.lineWrapping) findMaxLine(cm); cm.options.mode = doc.modeOption; regChange(cm); } // LINE UTILITIES // Find the line object corresponding to the given line number. function getLine(doc, n) { n -= doc.first; if (n < 0 || n >= doc.size) throw new Error("There is no line " + (n + doc.first) + " in the document."); for (var chunk = doc; !chunk.lines;) { for (var i = 0;; ++i) { var child = chunk.children[i], sz = child.chunkSize(); if (n < sz) { chunk = child; break; } n -= sz; } } return chunk.lines[n]; } // Get the part of a document between two positions, as an array of // strings. function getBetween(doc, start, end) { var out = [], n = start.line; doc.iter(start.line, end.line + 1, function(line) { var text = line.text; if (n == end.line) text = text.slice(0, end.ch); if (n == start.line) text = text.slice(start.ch); out.push(text); ++n; }); return out; } // Get the lines between from and to, as array of strings. function getLines(doc, from, to) { var out = []; doc.iter(from, to, function(line) { out.push(line.text); }); return out; } // Update the height of a line, propagating the height change // upwards to parent nodes. function updateLineHeight(line, height) { var diff = height - line.height; if (diff) for (var n = line; n; n = n.parent) n.height += diff; } // Given a line object, find its line number by walking up through // its parent links. function lineNo(line) { if (line.parent == null) return null; var cur = line.parent, no = indexOf(cur.lines, line); for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) { for (var i = 0;; ++i) { if (chunk.children[i] == cur) break; no += chunk.children[i].chunkSize(); } } return no + cur.first; } // Find the line at the given vertical position, using the height // information in the document tree. function lineAtHeight(chunk, h) { var n = chunk.first; outer: do { for (var i = 0; i < chunk.children.length; ++i) { var child = chunk.children[i], ch = child.height; if (h < ch) { chunk = child; continue outer; } h -= ch; n += child.chunkSize(); } return n; } while (!chunk.lines); for (var i = 0; i < chunk.lines.length; ++i) { var line = chunk.lines[i], lh = line.height; if (h < lh) break; h -= lh; } return n + i; } // Find the height above the given line. function heightAtLine(lineObj) { lineObj = visualLine(lineObj); var h = 0, chunk = lineObj.parent; for (var i = 0; i < chunk.lines.length; ++i) { var line = chunk.lines[i]; if (line == lineObj) break; else h += line.height; } for (var p = chunk.parent; p; chunk = p, p = chunk.parent) { for (var i = 0; i < p.children.length; ++i) { var cur = p.children[i]; if (cur == chunk) break; else h += cur.height; } } return h; } // Get the bidi ordering for the given line (and cache it). Returns // false for lines that are fully left-to-right, and an array of // BidiSpan objects otherwise. function getOrder(line) { var order = line.order; if (order == null) order = line.order = bidiOrdering(line.text); return order; } // HISTORY function History(startGen) { // Arrays of change events and selections. Doing something adds an // event to done and clears undo. Undoing moves events from done // to undone, redoing moves them in the other direction. this.done = []; this.undone = []; this.undoDepth = Infinity; // Used to track when changes can be merged into a single undo // event this.lastModTime = this.lastSelTime = 0; this.lastOp = this.lastSelOp = null; this.lastOrigin = this.lastSelOrigin = null; // Used by the isClean() method this.generation = this.maxGeneration = startGen || 1; } // Create a history change event from an updateDoc-style change // object. function historyChangeFromChange(doc, change) { var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)}; attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); linkedDocs(doc, function(doc) {attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);}, true); return histChange; } // Pop all selection events off the end of a history array. Stop at // a change event. function clearSelectionEvents(array) { while (array.length) { var last = lst(array); if (last.ranges) array.pop(); else break; } } // Find the top change event in the history. Pop off selection // events that are in the way. function lastChangeEvent(hist, force) { if (force) { clearSelectionEvents(hist.done); return lst(hist.done); } else if (hist.done.length && !lst(hist.done).ranges) { return lst(hist.done); } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) { hist.done.pop(); return lst(hist.done); } } // Register a change in the history. Merges changes that are within // a single operation, ore are close together with an origin that // allows merging (starting with "+") into a single event. function addChangeToHistory(doc, change, selAfter, opId) { var hist = doc.history; hist.undone.length = 0; var time = +new Date, cur; if ((hist.lastOp == opId || hist.lastOrigin == change.origin && change.origin && ((change.origin.charAt(0) == "+" && doc.cm && hist.lastModTime > time - doc.cm.options.historyEventDelay) || change.origin.charAt(0) == "*")) && (cur = lastChangeEvent(hist, hist.lastOp == opId))) { // Merge this change into the last event var last = lst(cur.changes); if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) { // Optimized case for simple insertion -- don't want to add // new changesets for every character typed last.to = changeEnd(change); } else { // Add new sub-event cur.changes.push(historyChangeFromChange(doc, change)); } } else { // Can not be merged, start a new event. var before = lst(hist.done); if (!before || !before.ranges) pushSelectionToHistory(doc.sel, hist.done); cur = {changes: [historyChangeFromChange(doc, change)], generation: hist.generation}; hist.done.push(cur); while (hist.done.length > hist.undoDepth) { hist.done.shift(); if (!hist.done[0].ranges) hist.done.shift(); } } hist.done.push(selAfter); hist.generation = ++hist.maxGeneration; hist.lastModTime = hist.lastSelTime = time; hist.lastOp = hist.lastSelOp = opId; hist.lastOrigin = hist.lastSelOrigin = change.origin; if (!last) signal(doc, "historyAdded"); } function selectionEventCanBeMerged(doc, origin, prev, sel) { var ch = origin.charAt(0); return ch == "*" || ch == "+" && prev.ranges.length == sel.ranges.length && prev.somethingSelected() == sel.somethingSelected() && new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500); } // Called whenever the selection changes, sets the new selection as // the pending selection in the history, and pushes the old pending // selection into the 'done' array when it was significantly // different (in number of selected ranges, emptiness, or time). function addSelectionToHistory(doc, sel, opId, options) { var hist = doc.history, origin = options && options.origin; // A new event is started when the previous origin does not match // the current, or the origins don't allow matching. Origins // starting with * are always merged, those starting with + are // merged when similar and close together in time. if (opId == hist.lastSelOp || (origin && hist.lastSelOrigin == origin && (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin || selectionEventCanBeMerged(doc, origin, lst(hist.done), sel)))) hist.done[hist.done.length - 1] = sel; else pushSelectionToHistory(sel, hist.done); hist.lastSelTime = +new Date; hist.lastSelOrigin = origin; hist.lastSelOp = opId; if (options && options.clearRedo !== false) clearSelectionEvents(hist.undone); } function pushSelectionToHistory(sel, dest) { var top = lst(dest); if (!(top && top.ranges && top.equals(sel))) dest.push(sel); } // Used to store marked span information in the history. function attachLocalSpans(doc, change, from, to) { var existing = change["spans_" + doc.id], n = 0; doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function(line) { if (line.markedSpans) (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans; ++n; }); } // When un/re-doing restores text containing marked spans, those // that have been explicitly cleared should not be restored. function removeClearedSpans(spans) { if (!spans) return null; for (var i = 0, out; i < spans.length; ++i) { if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i); } else if (out) out.push(spans[i]); } return !out ? spans : out.length ? out : null; } // Retrieve and filter the old marked spans stored in a change event. function getOldSpans(doc, change) { var found = change["spans_" + doc.id]; if (!found) return null; for (var i = 0, nw = []; i < change.text.length; ++i) nw.push(removeClearedSpans(found[i])); return nw; } // Used both to provide a JSON-safe object in .getHistory, and, when // detaching a document, to split the history in two function copyHistoryArray(events, newGroup, instantiateSel) { for (var i = 0, copy = []; i < events.length; ++i) { var event = events[i]; if (event.ranges) { copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event); continue; } var changes = event.changes, newChanges = []; copy.push({changes: newChanges}); for (var j = 0; j < changes.length; ++j) { var change = changes[j], m; newChanges.push({from: change.from, to: change.to, text: change.text}); if (newGroup) for (var prop in change) if (m = prop.match(/^spans_(\d+)$/)) { if (indexOf(newGroup, Number(m[1])) > -1) { lst(newChanges)[prop] = change[prop]; delete change[prop]; } } } } return copy; } // Rebasing/resetting history to deal with externally-sourced changes function rebaseHistSelSingle(pos, from, to, diff) { if (to < pos.line) { pos.line += diff; } else if (from < pos.line) { pos.line = from; pos.ch = 0; } } // Tries to rebase an array of history events given a change in the // document. If the change touches the same lines as the event, the // event, and everything 'behind' it, is discarded. If the change is // before the event, the event's positions are updated. Uses a // copy-on-write scheme for the positions, to avoid having to // reallocate them all on every rebase, but also avoid problems with // shared position objects being unsafely updated. function rebaseHistArray(array, from, to, diff) { for (var i = 0; i < array.length; ++i) { var sub = array[i], ok = true; if (sub.ranges) { if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; } for (var j = 0; j < sub.ranges.length; j++) { rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff); rebaseHistSelSingle(sub.ranges[j].head, from, to, diff); } continue; } for (var j = 0; j < sub.changes.length; ++j) { var cur = sub.changes[j]; if (to < cur.from.line) { cur.from = Pos(cur.from.line + diff, cur.from.ch); cur.to = Pos(cur.to.line + diff, cur.to.ch); } else if (from <= cur.to.line) { ok = false; break; } } if (!ok) { array.splice(0, i + 1); i = 0; } } } function rebaseHist(hist, change) { var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1; rebaseHistArray(hist.done, from, to, diff); rebaseHistArray(hist.undone, from, to, diff); } // EVENT UTILITIES // Due to the fact that we still support jurassic IE versions, some // compatibility wrappers are needed. var e_preventDefault = CodeMirror.e_preventDefault = function(e) { if (e.preventDefault) e.preventDefault(); else e.returnValue = false; }; var e_stopPropagation = CodeMirror.e_stopPropagation = function(e) { if (e.stopPropagation) e.stopPropagation(); else e.cancelBubble = true; }; function e_defaultPrevented(e) { return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false; } var e_stop = CodeMirror.e_stop = function(e) {e_preventDefault(e); e_stopPropagation(e);}; function e_target(e) {return e.target || e.srcElement;} function e_button(e) { var b = e.which; if (b == null) { if (e.button & 1) b = 1; else if (e.button & 2) b = 3; else if (e.button & 4) b = 2; } if (mac && e.ctrlKey && b == 1) b = 3; return b; } // EVENT HANDLING // Lightweight event framework. on/off also work on DOM nodes, // registering native DOM handlers. var on = CodeMirror.on = function(emitter, type, f) { if (emitter.addEventListener) emitter.addEventListener(type, f, false); else if (emitter.attachEvent) emitter.attachEvent("on" + type, f); else { var map = emitter._handlers || (emitter._handlers = {}); var arr = map[type] || (map[type] = []); arr.push(f); } }; var off = CodeMirror.off = function(emitter, type, f) { if (emitter.removeEventListener) emitter.removeEventListener(type, f, false); else if (emitter.detachEvent) emitter.detachEvent("on" + type, f); else { var arr = emitter._handlers && emitter._handlers[type]; if (!arr) return; for (var i = 0; i < arr.length; ++i) if (arr[i] == f) { arr.splice(i, 1); break; } } }; var signal = CodeMirror.signal = function(emitter, type /*, values...*/) { var arr = emitter._handlers && emitter._handlers[type]; if (!arr) return; var args = Array.prototype.slice.call(arguments, 2); for (var i = 0; i < arr.length; ++i) arr[i].apply(null, args); }; var orphanDelayedCallbacks = null; // Often, we want to signal events at a point where we are in the // middle of some work, but don't want the handler to start calling // other methods on the editor, which might be in an inconsistent // state or simply not expect any other events to happen. // signalLater looks whether there are any handlers, and schedules // them to be executed when the last operation ends, or, if no // operation is active, when a timeout fires. function signalLater(emitter, type /*, values...*/) { var arr = emitter._handlers && emitter._handlers[type]; if (!arr) return; var args = Array.prototype.slice.call(arguments, 2), list; if (operationGroup) { list = operationGroup.delayedCallbacks; } else if (orphanDelayedCallbacks) { list = orphanDelayedCallbacks; } else { list = orphanDelayedCallbacks = []; setTimeout(fireOrphanDelayed, 0); } function bnd(f) {return function(){f.apply(null, args);};}; for (var i = 0; i < arr.length; ++i) list.push(bnd(arr[i])); } function fireOrphanDelayed() { var delayed = orphanDelayedCallbacks; orphanDelayedCallbacks = null; for (var i = 0; i < delayed.length; ++i) delayed[i](); } // The DOM events that CodeMirror handles can be overridden by // registering a (non-DOM) handler on the editor for the event name, // and preventDefault-ing the event in that handler. function signalDOMEvent(cm, e, override) { if (typeof e == "string") e = {type: e, preventDefault: function() { this.defaultPrevented = true; }}; signal(cm, override || e.type, cm, e); return e_defaultPrevented(e) || e.codemirrorIgnore; } function signalCursorActivity(cm) { var arr = cm._handlers && cm._handlers.cursorActivity; if (!arr) return; var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []); for (var i = 0; i < arr.length; ++i) if (indexOf(set, arr[i]) == -1) set.push(arr[i]); } function hasHandler(emitter, type) { var arr = emitter._handlers && emitter._handlers[type]; return arr && arr.length > 0; } // Add on and off methods to a constructor's prototype, to make // registering events on such objects more convenient. function eventMixin(ctor) { ctor.prototype.on = function(type, f) {on(this, type, f);}; ctor.prototype.off = function(type, f) {off(this, type, f);}; } // MISC UTILITIES // Number of pixels added to scroller and sizer to hide scrollbar var scrollerGap = 30; // Returned or thrown by various protocols to signal 'I'm not // handling this'. var Pass = CodeMirror.Pass = {toString: function(){return "CodeMirror.Pass";}}; // Reused option objects for setSelection & friends var sel_dontScroll = {scroll: false}, sel_mouse = {origin: "*mouse"}, sel_move = {origin: "+move"}; function Delayed() {this.id = null;} Delayed.prototype.set = function(ms, f) { clearTimeout(this.id); this.id = setTimeout(f, ms); }; // Counts the column offset in a string, taking tabs into account. // Used mostly to find indentation. var countColumn = CodeMirror.countColumn = function(string, end, tabSize, startIndex, startValue) { if (end == null) { end = string.search(/[^\s\u00a0]/); if (end == -1) end = string.length; } for (var i = startIndex || 0, n = startValue || 0;;) { var nextTab = string.indexOf("\t", i); if (nextTab < 0 || nextTab >= end) return n + (end - i); n += nextTab - i; n += tabSize - (n % tabSize); i = nextTab + 1; } }; // The inverse of countColumn -- find the offset that corresponds to // a particular column. function findColumn(string, goal, tabSize) { for (var pos = 0, col = 0;;) { var nextTab = string.indexOf("\t", pos); if (nextTab == -1) nextTab = string.length; var skipped = nextTab - pos; if (nextTab == string.length || col + skipped >= goal) return pos + Math.min(skipped, goal - col); col += nextTab - pos; col += tabSize - (col % tabSize); pos = nextTab + 1; if (col >= goal) return pos; } } var spaceStrs = [""]; function spaceStr(n) { while (spaceStrs.length <= n) spaceStrs.push(lst(spaceStrs) + " "); return spaceStrs[n]; } function lst(arr) { return arr[arr.length-1]; } var selectInput = function(node) { node.select(); }; if (ios) // Mobile Safari apparently has a bug where select() is broken. selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; }; else if (ie) // Suppress mysterious IE10 errors selectInput = function(node) { try { node.select(); } catch(_e) {} }; function indexOf(array, elt) { for (var i = 0; i < array.length; ++i) if (array[i] == elt) return i; return -1; } function map(array, f) { var out = []; for (var i = 0; i < array.length; i++) out[i] = f(array[i], i); return out; } function nothing() {} function createObj(base, props) { var inst; if (Object.create) { inst = Object.create(base); } else { nothing.prototype = base; inst = new nothing(); } if (props) copyObj(props, inst); return inst; }; function copyObj(obj, target, overwrite) { if (!target) target = {}; for (var prop in obj) if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop))) target[prop] = obj[prop]; return target; } function bind(f) { var args = Array.prototype.slice.call(arguments, 1); return function(){return f.apply(null, args);}; } var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; var isWordCharBasic = CodeMirror.isWordChar = function(ch) { return /\w/.test(ch) || ch > "\x80" && (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)); }; function isWordChar(ch, helper) { if (!helper) return isWordCharBasic(ch); if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) return true; return helper.test(ch); } function isEmpty(obj) { for (var n in obj) if (obj.hasOwnProperty(n) && obj[n]) return false; return true; } // Extending unicode characters. A series of a non-extending char + // any number of extending chars is treated as a single unit as far // as editing and measuring is concerned. This is not fully correct, // since some scripts/fonts/browsers also treat other configurations // of code points as a group. var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/; function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch); } // DOM UTILITIES function elt(tag, content, className, style) { var e = document.createElement(tag); if (className) e.className = className; if (style) e.style.cssText = style; if (typeof content == "string") e.appendChild(document.createTextNode(content)); else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]); return e; } var range; if (document.createRange) range = function(node, start, end, endNode) { var r = document.createRange(); r.setEnd(endNode || node, end); r.setStart(node, start); return r; }; else range = function(node, start, end) { var r = document.body.createTextRange(); try { r.moveToElementText(node.parentNode); } catch(e) { return r; } r.collapse(true); r.moveEnd("character", end); r.moveStart("character", start); return r; }; function removeChildren(e) { for (var count = e.childNodes.length; count > 0; --count) e.removeChild(e.firstChild); return e; } function removeChildrenAndAdd(parent, e) { return removeChildren(parent).appendChild(e); } var contains = CodeMirror.contains = function(parent, child) { if (child.nodeType == 3) // Android browser always returns false when child is a textnode child = child.parentNode; if (parent.contains) return parent.contains(child); do { if (child.nodeType == 11) child = child.host; if (child == parent) return true; } while (child = child.parentNode); }; function activeElt() { return document.activeElement; } // Older versions of IE throws unspecified error when touching // document.activeElement in some cases (during loading, in iframe) if (ie && ie_version < 11) activeElt = function() { try { return document.activeElement; } catch(e) { return document.body; } }; function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*"); } var rmClass = CodeMirror.rmClass = function(node, cls) { var current = node.className; var match = classTest(cls).exec(current); if (match) { var after = current.slice(match.index + match[0].length); node.className = current.slice(0, match.index) + (after ? match[1] + after : ""); } }; var addClass = CodeMirror.addClass = function(node, cls) { var current = node.className; if (!classTest(cls).test(current)) node.className += (current ? " " : "") + cls; }; function joinClasses(a, b) { var as = a.split(" "); for (var i = 0; i < as.length; i++) if (as[i] && !classTest(as[i]).test(b)) b += " " + as[i]; return b; } // WINDOW-WIDE EVENTS // These must be handled carefully, because naively registering a // handler for each editor will cause the editors to never be // garbage collected. function forEachCodeMirror(f) { if (!document.body.getElementsByClassName) return; var byClass = document.body.getElementsByClassName("CodeMirror"); for (var i = 0; i < byClass.length; i++) { var cm = byClass[i].CodeMirror; if (cm) f(cm); } } var globalsRegistered = false; function ensureGlobalHandlers() { if (globalsRegistered) return; registerGlobalHandlers(); globalsRegistered = true; } function registerGlobalHandlers() { // When the window resizes, we need to refresh active editors. var resizeTimer; on(window, "resize", function() { if (resizeTimer == null) resizeTimer = setTimeout(function() { resizeTimer = null; forEachCodeMirror(onResize); }, 100); }); // When the window loses focus, we want to show the editor as blurred on(window, "blur", function() { forEachCodeMirror(onBlur); }); } // FEATURE DETECTION // Detect drag-and-drop var dragAndDrop = function() { // There is *some* kind of drag-and-drop support in IE6-8, but I // couldn't get it to work yet. if (ie && ie_version < 9) return false; var div = elt('div'); return "draggable" in div || "dragDrop" in div; }(); var zwspSupported; function zeroWidthElement(measure) { if (zwspSupported == null) { var test = elt("span", "\u200b"); removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")])); if (measure.firstChild.offsetHeight != 0) zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); } var node = zwspSupported ? elt("span", "\u200b") : elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px"); node.setAttribute("cm-text", ""); return node; } // Feature-detect IE's crummy client rect reporting for bidi text var badBidiRects; function hasBadBidiRects(measure) { if (badBidiRects != null) return badBidiRects; var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA")); var r0 = range(txt, 0, 1).getBoundingClientRect(); if (!r0 || r0.left == r0.right) return false; // Safari returns null in some cases (#2780) var r1 = range(txt, 1, 2).getBoundingClientRect(); return badBidiRects = (r1.right - r0.right < 3); } // See if "".split is the broken IE version, if so, provide an // alternative way to split lines. var splitLines = CodeMirror.splitLines = "\n\nb".split(/\n/).length != 3 ? function(string) { var pos = 0, result = [], l = string.length; while (pos <= l) { var nl = string.indexOf("\n", pos); if (nl == -1) nl = string.length; var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl); var rt = line.indexOf("\r"); if (rt != -1) { result.push(line.slice(0, rt)); pos += rt + 1; } else { result.push(line); pos = nl + 1; } } return result; } : function(string){return string.split(/\r\n?|\n/);}; var hasSelection = window.getSelection ? function(te) { try { return te.selectionStart != te.selectionEnd; } catch(e) { return false; } } : function(te) { try {var range = te.ownerDocument.selection.createRange();} catch(e) {} if (!range || range.parentElement() != te) return false; return range.compareEndPoints("StartToEnd", range) != 0; }; var hasCopyEvent = (function() { var e = elt("div"); if ("oncopy" in e) return true; e.setAttribute("oncopy", "return;"); return typeof e.oncopy == "function"; })(); var badZoomedRects = null; function hasBadZoomedRects(measure) { if (badZoomedRects != null) return badZoomedRects; var node = removeChildrenAndAdd(measure, elt("span", "x")); var normal = node.getBoundingClientRect(); var fromRange = range(node, 0, 1).getBoundingClientRect(); return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1; } // KEY NAMES var keyNames = {3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt", 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert", 46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod", 107: "=", 109: "-", 127: "Delete", 173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", 221: "]", 222: "'", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete", 63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert"}; CodeMirror.keyNames = keyNames; (function() { // Number keys for (var i = 0; i < 10; i++) keyNames[i + 48] = keyNames[i + 96] = String(i); // Alphabetic keys for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i); // Function keys for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = "F" + i; })(); // BIDI HELPERS function iterateBidiSections(order, from, to, f) { if (!order) return f(from, to, "ltr"); var found = false; for (var i = 0; i < order.length; ++i) { var part = order[i]; if (part.from < to && part.to > from || from == to && part.to == from) { f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr"); found = true; } } if (!found) f(from, to, "ltr"); } function bidiLeft(part) { return part.level % 2 ? part.to : part.from; } function bidiRight(part) { return part.level % 2 ? part.from : part.to; } function lineLeft(line) { var order = getOrder(line); return order ? bidiLeft(order[0]) : 0; } function lineRight(line) { var order = getOrder(line); if (!order) return line.text.length; return bidiRight(lst(order)); } function lineStart(cm, lineN) { var line = getLine(cm.doc, lineN); var visual = visualLine(line); if (visual != line) lineN = lineNo(visual); var order = getOrder(visual); var ch = !order ? 0 : order[0].level % 2 ? lineRight(visual) : lineLeft(visual); return Pos(lineN, ch); } function lineEnd(cm, lineN) { var merged, line = getLine(cm.doc, lineN); while (merged = collapsedSpanAtEnd(line)) { line = merged.find(1, true).line; lineN = null; } var order = getOrder(line); var ch = !order ? line.text.length : order[0].level % 2 ? lineLeft(line) : lineRight(line); return Pos(lineN == null ? lineNo(line) : lineN, ch); } function lineStartSmart(cm, pos) { var start = lineStart(cm, pos.line); var line = getLine(cm.doc, start.line); var order = getOrder(line); if (!order || order[0].level == 0) { var firstNonWS = Math.max(0, line.text.search(/\S/)); var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch; return Pos(start.line, inWS ? 0 : firstNonWS); } return start; } function compareBidiLevel(order, a, b) { var linedir = order[0].level; if (a == linedir) return true; if (b == linedir) return false; return a < b; } var bidiOther; function getBidiPartAt(order, pos) { bidiOther = null; for (var i = 0, found; i < order.length; ++i) { var cur = order[i]; if (cur.from < pos && cur.to > pos) return i; if ((cur.from == pos || cur.to == pos)) { if (found == null) { found = i; } else if (compareBidiLevel(order, cur.level, order[found].level)) { if (cur.from != cur.to) bidiOther = found; return i; } else { if (cur.from != cur.to) bidiOther = i; return found; } } } return found; } function moveInLine(line, pos, dir, byUnit) { if (!byUnit) return pos + dir; do pos += dir; while (pos > 0 && isExtendingChar(line.text.charAt(pos))); return pos; } // This is needed in order to move 'visually' through bi-directional // text -- i.e., pressing left should make the cursor go left, even // when in RTL text. The tricky part is the 'jumps', where RTL and // LTR text touch each other. This often requires the cursor offset // to move more than one unit, in order to visually move one unit. function moveVisually(line, start, dir, byUnit) { var bidi = getOrder(line); if (!bidi) return moveLogically(line, start, dir, byUnit); var pos = getBidiPartAt(bidi, start), part = bidi[pos]; var target = moveInLine(line, start, part.level % 2 ? -dir : dir, byUnit); for (;;) { if (target > part.from && target < part.to) return target; if (target == part.from || target == part.to) { if (getBidiPartAt(bidi, target) == pos) return target; part = bidi[pos += dir]; return (dir > 0) == part.level % 2 ? part.to : part.from; } else { part = bidi[pos += dir]; if (!part) return null; if ((dir > 0) == part.level % 2) target = moveInLine(line, part.to, -1, byUnit); else target = moveInLine(line, part.from, 1, byUnit); } } } function moveLogically(line, start, dir, byUnit) { var target = start + dir; if (byUnit) while (target > 0 && isExtendingChar(line.text.charAt(target))) target += dir; return target < 0 || target > line.text.length ? null : target; } // Bidirectional ordering algorithm // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm // that this (partially) implements. // One-char codes used for character types: // L (L): Left-to-Right // R (R): Right-to-Left // r (AL): Right-to-Left Arabic // 1 (EN): European Number // + (ES): European Number Separator // % (ET): European Number Terminator // n (AN): Arabic Number // , (CS): Common Number Separator // m (NSM): Non-Spacing Mark // b (BN): Boundary Neutral // s (B): Paragraph Separator // t (S): Segment Separator // w (WS): Whitespace // N (ON): Other Neutrals // Returns null if characters are ordered as they appear // (left-to-right), or an array of sections ({from, to, level} // objects) in the order in which they occur visually. var bidiOrdering = (function() { // Character types for codepoints 0 to 0xff var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN"; // Character types for codepoints 0x600 to 0x6ff var arabicTypes = "rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm"; function charType(code) { if (code <= 0xf7) return lowTypes.charAt(code); else if (0x590 <= code && code <= 0x5f4) return "R"; else if (0x600 <= code && code <= 0x6ed) return arabicTypes.charAt(code - 0x600); else if (0x6ee <= code && code <= 0x8ac) return "r"; else if (0x2000 <= code && code <= 0x200b) return "w"; else if (code == 0x200c) return "b"; else return "L"; } var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/; var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/; // Browsers seem to always treat the boundaries of block elements as being L. var outerType = "L"; function BidiSpan(level, from, to) { this.level = level; this.from = from; this.to = to; } return function(str) { if (!bidiRE.test(str)) return false; var len = str.length, types = []; for (var i = 0, type; i < len; ++i) types.push(type = charType(str.charCodeAt(i))); // W1. Examine each non-spacing mark (NSM) in the level run, and // change the type of the NSM to the type of the previous // character. If the NSM is at the start of the level run, it will // get the type of sor. for (var i = 0, prev = outerType; i < len; ++i) { var type = types[i]; if (type == "m") types[i] = prev; else prev = type; } // W2. Search backwards from each instance of a European number // until the first strong type (R, L, AL, or sor) is found. If an // AL is found, change the type of the European number to Arabic // number. // W3. Change all ALs to R. for (var i = 0, cur = outerType; i < len; ++i) { var type = types[i]; if (type == "1" && cur == "r") types[i] = "n"; else if (isStrong.test(type)) { cur = type; if (type == "r") types[i] = "R"; } } // W4. A single European separator between two European numbers // changes to a European number. A single common separator between // two numbers of the same type changes to that type. for (var i = 1, prev = types[0]; i < len - 1; ++i) { var type = types[i]; if (type == "+" && prev == "1" && types[i+1] == "1") types[i] = "1"; else if (type == "," && prev == types[i+1] && (prev == "1" || prev == "n")) types[i] = prev; prev = type; } // W5. A sequence of European terminators adjacent to European // numbers changes to all European numbers. // W6. Otherwise, separators and terminators change to Other // Neutral. for (var i = 0; i < len; ++i) { var type = types[i]; if (type == ",") types[i] = "N"; else if (type == "%") { for (var end = i + 1; end < len && types[end] == "%"; ++end) {} var replace = (i && types[i-1] == "!") || (end < len && types[end] == "1") ? "1" : "N"; for (var j = i; j < end; ++j) types[j] = replace; i = end - 1; } } // W7. Search backwards from each instance of a European number // until the first strong type (R, L, or sor) is found. If an L is // found, then change the type of the European number to L. for (var i = 0, cur = outerType; i < len; ++i) { var type = types[i]; if (cur == "L" && type == "1") types[i] = "L"; else if (isStrong.test(type)) cur = type; } // N1. A sequence of neutrals takes the direction of the // surrounding strong text if the text on both sides has the same // direction. European and Arabic numbers act as if they were R in // terms of their influence on neutrals. Start-of-level-run (sor) // and end-of-level-run (eor) are used at level run boundaries. // N2. Any remaining neutrals take the embedding direction. for (var i = 0; i < len; ++i) { if (isNeutral.test(types[i])) { for (var end = i + 1; end < len && isNeutral.test(types[end]); ++end) {} var before = (i ? types[i-1] : outerType) == "L"; var after = (end < len ? types[end] : outerType) == "L"; var replace = before || after ? "L" : "R"; for (var j = i; j < end; ++j) types[j] = replace; i = end - 1; } } // Here we depart from the documented algorithm, in order to avoid // building up an actual levels array. Since there are only three // levels (0, 1, 2) in an implementation that doesn't take // explicit embedding into account, we can build up the order on // the fly, without following the level-based algorithm. var order = [], m; for (var i = 0; i < len;) { if (countsAsLeft.test(types[i])) { var start = i; for (++i; i < len && countsAsLeft.test(types[i]); ++i) {} order.push(new BidiSpan(0, start, i)); } else { var pos = i, at = order.length; for (++i; i < len && types[i] != "L"; ++i) {} for (var j = pos; j < i;) { if (countsAsNum.test(types[j])) { if (pos < j) order.splice(at, 0, new BidiSpan(1, pos, j)); var nstart = j; for (++j; j < i && countsAsNum.test(types[j]); ++j) {} order.splice(at, 0, new BidiSpan(2, nstart, j)); pos = j; } else ++j; } if (pos < i) order.splice(at, 0, new BidiSpan(1, pos, i)); } } if (order[0].level == 1 && (m = str.match(/^\s+/))) { order[0].from = m[0].length; order.unshift(new BidiSpan(0, 0, m[0].length)); } if (lst(order).level == 1 && (m = str.match(/\s+$/))) { lst(order).to -= m[0].length; order.push(new BidiSpan(0, len - m[0].length, len)); } if (order[0].level == 2) order.unshift(new BidiSpan(1, order[0].to, order[0].to)); if (order[0].level != lst(order).level) order.push(new BidiSpan(order[0].level, len, len)); return order; }; })(); // THE END CodeMirror.version = "5.2.0"; return CodeMirror; }); ================================================ FILE: base/res/codemirror/mode/apl/apl.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("apl", function() { var builtInOps = { ".": "innerProduct", "\\": "scan", "/": "reduce", "⌿": "reduce1Axis", "⍀": "scan1Axis", "¨": "each", "⍣": "power" }; var builtInFuncs = { "+": ["conjugate", "add"], "−": ["negate", "subtract"], "×": ["signOf", "multiply"], "÷": ["reciprocal", "divide"], "⌈": ["ceiling", "greaterOf"], "⌊": ["floor", "lesserOf"], "∣": ["absolute", "residue"], "⍳": ["indexGenerate", "indexOf"], "?": ["roll", "deal"], "⋆": ["exponentiate", "toThePowerOf"], "⍟": ["naturalLog", "logToTheBase"], "○": ["piTimes", "circularFuncs"], "!": ["factorial", "binomial"], "⌹": ["matrixInverse", "matrixDivide"], "<": [null, "lessThan"], "≤": [null, "lessThanOrEqual"], "=": [null, "equals"], ">": [null, "greaterThan"], "≥": [null, "greaterThanOrEqual"], "≠": [null, "notEqual"], "≡": ["depth", "match"], "≢": [null, "notMatch"], "∈": ["enlist", "membership"], "⍷": [null, "find"], "∪": ["unique", "union"], "∩": [null, "intersection"], "∼": ["not", "without"], "∨": [null, "or"], "∧": [null, "and"], "⍱": [null, "nor"], "⍲": [null, "nand"], "⍴": ["shapeOf", "reshape"], ",": ["ravel", "catenate"], "⍪": [null, "firstAxisCatenate"], "⌽": ["reverse", "rotate"], "⊖": ["axis1Reverse", "axis1Rotate"], "⍉": ["transpose", null], "↑": ["first", "take"], "↓": [null, "drop"], "⊂": ["enclose", "partitionWithAxis"], "⊃": ["diclose", "pick"], "⌷": [null, "index"], "⍋": ["gradeUp", null], "⍒": ["gradeDown", null], "⊤": ["encode", null], "⊥": ["decode", null], "⍕": ["format", "formatByExample"], "⍎": ["execute", null], "⊣": ["stop", "left"], "⊢": ["pass", "right"] }; var isOperator = /[\.\/⌿⍀¨⍣]/; var isNiladic = /⍬/; var isFunction = /[\+−×÷⌈⌊∣⍳\?⋆⍟○!⌹<≤=>≥≠≡≢∈⍷∪∩∼∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⌷⍋⍒⊤⊥⍕⍎⊣⊢]/; var isArrow = /←/; var isComment = /[⍝#].*$/; var stringEater = function(type) { var prev; prev = false; return function(c) { prev = c; if (c === type) { return prev === "\\"; } return true; }; }; return { startState: function() { return { prev: false, func: false, op: false, string: false, escape: false }; }, token: function(stream, state) { var ch, funcName, word; if (stream.eatSpace()) { return null; } ch = stream.next(); if (ch === '"' || ch === "'") { stream.eatWhile(stringEater(ch)); stream.next(); state.prev = true; return "string"; } if (/[\[{\(]/.test(ch)) { state.prev = false; return null; } if (/[\]}\)]/.test(ch)) { state.prev = true; return null; } if (isNiladic.test(ch)) { state.prev = false; return "niladic"; } if (/[¯\d]/.test(ch)) { if (state.func) { state.func = false; state.prev = false; } else { state.prev = true; } stream.eatWhile(/[\w\.]/); return "number"; } if (isOperator.test(ch)) { return "operator apl-" + builtInOps[ch]; } if (isArrow.test(ch)) { return "apl-arrow"; } if (isFunction.test(ch)) { funcName = "apl-"; if (builtInFuncs[ch] != null) { if (state.prev) { funcName += builtInFuncs[ch][1]; } else { funcName += builtInFuncs[ch][0]; } } state.func = true; state.prev = false; return "function " + funcName; } if (isComment.test(ch)) { stream.skipToEnd(); return "comment"; } if (ch === "∘" && stream.peek() === ".") { stream.next(); return "function jot-dot"; } stream.eatWhile(/[\w\$_]/); word = stream.current(); state.prev = true; return "keyword"; } }; }); CodeMirror.defineMIME("text/apl", "apl"); }); ================================================ FILE: base/res/codemirror/mode/apl/index.html ================================================ CodeMirror: APL mode

APL mode

Simple mode that tries to handle APL as well as it can.

It attempts to label functions/operators based upon monadic/dyadic usage (but this is far from fully fleshed out). This means there are meaningful classnames so hover states can have popups etc.

MIME types defined: text/apl (APL code)

================================================ FILE: base/res/codemirror/mode/asciiarmor/asciiarmor.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; function errorIfNotEmpty(stream) { var nonWS = stream.match(/^\s*\S/); stream.skipToEnd(); return nonWS ? "error" : null; } CodeMirror.defineMode("asciiarmor", function() { return { token: function(stream, state) { var m; if (state.state == "top") { if (stream.sol() && (m = stream.match(/^-----BEGIN (.*)?-----\s*$/))) { state.state = "headers"; state.type = m[1]; return "tag"; } return errorIfNotEmpty(stream); } else if (state.state == "headers") { if (stream.sol() && stream.match(/^\w+:/)) { state.state = "header"; return "atom"; } else { var result = errorIfNotEmpty(stream); if (result) state.state = "body"; return result; } } else if (state.state == "header") { stream.skipToEnd(); state.state = "headers"; return "string"; } else if (state.state == "body") { if (stream.sol() && (m = stream.match(/^-----END (.*)?-----\s*$/))) { if (m[1] != state.type) return "error"; state.state = "end"; return "tag"; } else { if (stream.eatWhile(/[A-Za-z0-9+\/=]/)) { return null; } else { stream.next(); return "error"; } } } else if (state.state == "end") { return errorIfNotEmpty(stream); } }, blankLine: function(state) { if (state.state == "headers") state.state = "body"; }, startState: function() { return {state: "top", type: null}; } }; }); CodeMirror.defineMIME("application/pgp", "asciiarmor"); CodeMirror.defineMIME("application/pgp-keys", "asciiarmor"); CodeMirror.defineMIME("application/pgp-signature", "asciiarmor"); }); ================================================ FILE: base/res/codemirror/mode/asciiarmor/index.html ================================================ CodeMirror: ASCII Armor (PGP) mode

ASCII Armor (PGP) mode

MIME types defined: application/pgp, application/pgp-keys, application/pgp-signature

================================================ FILE: base/res/codemirror/mode/asterisk/asterisk.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /* * ===================================================================================== * * Filename: mode/asterisk/asterisk.js * * Description: CodeMirror mode for Asterisk dialplan * * Created: 05/17/2012 09:20:25 PM * Revision: none * * Author: Stas Kobzar (stas@modulis.ca), * Company: Modulis.ca Inc. * * ===================================================================================== */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("asterisk", function() { var atoms = ["exten", "same", "include","ignorepat","switch"], dpcmd = ["#include","#exec"], apps = [ "addqueuemember","adsiprog","aelsub","agentlogin","agentmonitoroutgoing","agi", "alarmreceiver","amd","answer","authenticate","background","backgrounddetect", "bridge","busy","callcompletioncancel","callcompletionrequest","celgenuserevent", "changemonitor","chanisavail","channelredirect","chanspy","clearhash","confbridge", "congestion","continuewhile","controlplayback","dahdiacceptr2call","dahdibarge", "dahdiras","dahdiscan","dahdisendcallreroutingfacility","dahdisendkeypadfacility", "datetime","dbdel","dbdeltree","deadagi","dial","dictate","directory","disa", "dumpchan","eagi","echo","endwhile","exec","execif","execiftime","exitwhile","extenspy", "externalivr","festival","flash","followme","forkcdr","getcpeid","gosub","gosubif", "goto","gotoif","gotoiftime","hangup","iax2provision","ices","importvar","incomplete", "ivrdemo","jabberjoin","jabberleave","jabbersend","jabbersendgroup","jabberstatus", "jack","log","macro","macroexclusive","macroexit","macroif","mailboxexists","meetme", "meetmeadmin","meetmechanneladmin","meetmecount","milliwatt","minivmaccmess","minivmdelete", "minivmgreet","minivmmwi","minivmnotify","minivmrecord","mixmonitor","monitor","morsecode", "mp3player","mset","musiconhold","nbscat","nocdr","noop","odbc","odbc","odbcfinish", "originate","ospauth","ospfinish","osplookup","ospnext","page","park","parkandannounce", "parkedcall","pausemonitor","pausequeuemember","pickup","pickupchan","playback","playtones", "privacymanager","proceeding","progress","queue","queuelog","raiseexception","read","readexten", "readfile","receivefax","receivefax","receivefax","record","removequeuemember", "resetcdr","retrydial","return","ringing","sayalpha","saycountedadj","saycountednoun", "saycountpl","saydigits","saynumber","sayphonetic","sayunixtime","senddtmf","sendfax", "sendfax","sendfax","sendimage","sendtext","sendurl","set","setamaflags", "setcallerpres","setmusiconhold","sipaddheader","sipdtmfmode","sipremoveheader","skel", "slastation","slatrunk","sms","softhangup","speechactivategrammar","speechbackground", "speechcreate","speechdeactivategrammar","speechdestroy","speechloadgrammar","speechprocessingsound", "speechstart","speechunloadgrammar","stackpop","startmusiconhold","stopmixmonitor","stopmonitor", "stopmusiconhold","stopplaytones","system","testclient","testserver","transfer","tryexec", "trysystem","unpausemonitor","unpausequeuemember","userevent","verbose","vmauthenticate", "vmsayname","voicemail","voicemailmain","wait","waitexten","waitfornoise","waitforring", "waitforsilence","waitmusiconhold","waituntil","while","zapateller" ]; function basicToken(stream,state){ var cur = ''; var ch = ''; ch = stream.next(); // comment if(ch == ";") { stream.skipToEnd(); return "comment"; } // context if(ch == '[') { stream.skipTo(']'); stream.eat(']'); return "header"; } // string if(ch == '"') { stream.skipTo('"'); return "string"; } if(ch == "'") { stream.skipTo("'"); return "string-2"; } // dialplan commands if(ch == '#') { stream.eatWhile(/\w/); cur = stream.current(); if(dpcmd.indexOf(cur) !== -1) { stream.skipToEnd(); return "strong"; } } // application args if(ch == '$'){ var ch1 = stream.peek(); if(ch1 == '{'){ stream.skipTo('}'); stream.eat('}'); return "variable-3"; } } // extension stream.eatWhile(/\w/); cur = stream.current(); if(atoms.indexOf(cur) !== -1) { state.extenStart = true; switch(cur) { case 'same': state.extenSame = true; break; case 'include': case 'switch': case 'ignorepat': state.extenInclude = true;break; default:break; } return "atom"; } } return { startState: function() { return { extenStart: false, extenSame: false, extenInclude: false, extenExten: false, extenPriority: false, extenApplication: false }; }, token: function(stream, state) { var cur = ''; var ch = ''; if(stream.eatSpace()) return null; // extension started if(state.extenStart){ stream.eatWhile(/[^\s]/); cur = stream.current(); if(/^=>?$/.test(cur)){ state.extenExten = true; state.extenStart = false; return "strong"; } else { state.extenStart = false; stream.skipToEnd(); return "error"; } } else if(state.extenExten) { // set exten and priority state.extenExten = false; state.extenPriority = true; stream.eatWhile(/[^,]/); if(state.extenInclude) { stream.skipToEnd(); state.extenPriority = false; state.extenInclude = false; } if(state.extenSame) { state.extenPriority = false; state.extenSame = false; state.extenApplication = true; } return "tag"; } else if(state.extenPriority) { state.extenPriority = false; state.extenApplication = true; ch = stream.next(); // get comma if(state.extenSame) return null; stream.eatWhile(/[^,]/); return "number"; } else if(state.extenApplication) { stream.eatWhile(/,/); cur = stream.current(); if(cur === ',') return null; stream.eatWhile(/\w/); cur = stream.current().toLowerCase(); state.extenApplication = false; if(apps.indexOf(cur) !== -1){ return "def strong"; } } else{ return basicToken(stream,state); } return null; } }; }); CodeMirror.defineMIME("text/x-asterisk", "asterisk"); }); ================================================ FILE: base/res/codemirror/mode/asterisk/index.html ================================================ CodeMirror: Asterisk dialplan mode

Asterisk dialplan mode

MIME types defined: text/x-asterisk.

================================================ FILE: base/res/codemirror/mode/clike/clike.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("clike", function(config, parserConfig) { var indentUnit = config.indentUnit, statementIndentUnit = parserConfig.statementIndentUnit || indentUnit, dontAlignCalls = parserConfig.dontAlignCalls, keywords = parserConfig.keywords || {}, builtin = parserConfig.builtin || {}, blockKeywords = parserConfig.blockKeywords || {}, atoms = parserConfig.atoms || {}, hooks = parserConfig.hooks || {}, multiLineStrings = parserConfig.multiLineStrings, indentStatements = parserConfig.indentStatements !== false; var isOperatorChar = /[+\-*&%=<>!?|\/]/; var curPunc; function tokenBase(stream, state) { var ch = stream.next(); if (hooks[ch]) { var result = hooks[ch](stream, state); if (result !== false) return result; } if (ch == '"' || ch == "'") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } if (/[\[\]{}\(\),;\:\.]/.test(ch)) { curPunc = ch; return null; } if (/\d/.test(ch)) { stream.eatWhile(/[\w\.]/); return "number"; } if (ch == "/") { if (stream.eat("*")) { state.tokenize = tokenComment; return tokenComment(stream, state); } if (stream.eat("/")) { stream.skipToEnd(); return "comment"; } } if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return "operator"; } stream.eatWhile(/[\w\$_\xa1-\uffff]/); var cur = stream.current(); if (keywords.propertyIsEnumerable(cur)) { if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; return "keyword"; } if (builtin.propertyIsEnumerable(cur)) { if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; return "builtin"; } if (atoms.propertyIsEnumerable(cur)) return "atom"; return "variable"; } function tokenString(quote) { return function(stream, state) { var escaped = false, next, end = false; while ((next = stream.next()) != null) { if (next == quote && !escaped) {end = true; break;} escaped = !escaped && next == "\\"; } if (end || !(escaped || multiLineStrings)) state.tokenize = null; return "string"; }; } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = null; break; } maybeEnd = (ch == "*"); } return "comment"; } function Context(indented, column, type, align, prev) { this.indented = indented; this.column = column; this.type = type; this.align = align; this.prev = prev; } function pushContext(state, col, type) { var indent = state.indented; if (state.context && state.context.type == "statement") indent = state.context.indented; return state.context = new Context(indent, col, type, null, state.context); } function popContext(state) { var t = state.context.type; if (t == ")" || t == "]" || t == "}") state.indented = state.context.indented; return state.context = state.context.prev; } // Interface return { startState: function(basecolumn) { return { tokenize: null, context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), indented: 0, startOfLine: true }; }, token: function(stream, state) { var ctx = state.context; if (stream.sol()) { if (ctx.align == null) ctx.align = false; state.indented = stream.indentation(); state.startOfLine = true; } if (stream.eatSpace()) return null; curPunc = null; var style = (state.tokenize || tokenBase)(stream, state); if (style == "comment" || style == "meta") return style; if (ctx.align == null) ctx.align = true; if ((curPunc == ";" || curPunc == ":" || curPunc == ",") && ctx.type == "statement") popContext(state); else if (curPunc == "{") pushContext(state, stream.column(), "}"); else if (curPunc == "[") pushContext(state, stream.column(), "]"); else if (curPunc == "(") pushContext(state, stream.column(), ")"); else if (curPunc == "}") { while (ctx.type == "statement") ctx = popContext(state); if (ctx.type == "}") ctx = popContext(state); while (ctx.type == "statement") ctx = popContext(state); } else if (curPunc == ctx.type) popContext(state); else if (indentStatements && (((ctx.type == "}" || ctx.type == "top") && curPunc != ';') || (ctx.type == "statement" && curPunc == "newstatement"))) pushContext(state, stream.column(), "statement"); state.startOfLine = false; return style; }, indent: function(state, textAfter) { if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass; var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev; var closing = firstChar == ctx.type; if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit); else if (ctx.align && (!dontAlignCalls || ctx.type != ")")) return ctx.column + (closing ? 0 : 1); else if (ctx.type == ")" && !closing) return ctx.indented + statementIndentUnit; else return ctx.indented + (closing ? 0 : indentUnit); }, electricChars: "{}", blockCommentStart: "/*", blockCommentEnd: "*/", lineComment: "//", fold: "brace" }; }); function words(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } var cKeywords = "auto if break int case long char register continue return default short do sizeof " + "double static else struct switch extern typedef float union for unsigned " + "goto while enum void const signed volatile"; function cppHook(stream, state) { if (!state.startOfLine) return false; for (;;) { if (stream.skipTo("\\")) { stream.next(); if (stream.eol()) { state.tokenize = cppHook; break; } } else { stream.skipToEnd(); state.tokenize = null; break; } } return "meta"; } function cpp11StringHook(stream, state) { stream.backUp(1); // Raw strings. if (stream.match(/(R|u8R|uR|UR|LR)/)) { var match = stream.match(/"([^\s\\()]{0,16})\(/); if (!match) { return false; } state.cpp11RawStringDelim = match[1]; state.tokenize = tokenRawString; return tokenRawString(stream, state); } // Unicode strings/chars. if (stream.match(/(u8|u|U|L)/)) { if (stream.match(/["']/, /* eat */ false)) { return "string"; } return false; } // Ignore this hook. stream.next(); return false; } // C#-style strings where "" escapes a quote. function tokenAtString(stream, state) { var next; while ((next = stream.next()) != null) { if (next == '"' && !stream.eat('"')) { state.tokenize = null; break; } } return "string"; } // C++11 raw string literal is "( anything )", where // can be a string up to 16 characters long. function tokenRawString(stream, state) { // Escape characters that have special regex meanings. var delim = state.cpp11RawStringDelim.replace(/[^\w\s]/g, '\\$&'); var match = stream.match(new RegExp(".*?\\)" + delim + '"')); if (match) state.tokenize = null; else stream.skipToEnd(); return "string"; } function def(mimes, mode) { if (typeof mimes == "string") mimes = [mimes]; var words = []; function add(obj) { if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop)) words.push(prop); } add(mode.keywords); add(mode.builtin); add(mode.atoms); if (words.length) { mode.helperType = mimes[0]; CodeMirror.registerHelper("hintWords", mimes[0], words); } for (var i = 0; i < mimes.length; ++i) CodeMirror.defineMIME(mimes[i], mode); } def(["text/x-csrc", "text/x-c", "text/x-chdr"], { name: "clike", keywords: words(cKeywords), blockKeywords: words("case do else for if switch while struct"), atoms: words("null"), hooks: {"#": cppHook}, modeProps: {fold: ["brace", "include"]} }); def(["text/x-c++src", "text/x-c++hdr"], { name: "clike", keywords: words(cKeywords + " asm dynamic_cast namespace reinterpret_cast try bool explicit new " + "static_cast typeid catch operator template typename class friend private " + "this using const_cast inline public throw virtual delete mutable protected " + "wchar_t alignas alignof constexpr decltype nullptr noexcept thread_local final " + "static_assert override"), blockKeywords: words("catch class do else finally for if struct switch try while"), atoms: words("true false null"), hooks: { "#": cppHook, "u": cpp11StringHook, "U": cpp11StringHook, "L": cpp11StringHook, "R": cpp11StringHook }, modeProps: {fold: ["brace", "include"]} }); def("text/x-java", { name: "clike", keywords: words("abstract assert boolean break byte case catch char class const continue default " + "do double else enum extends final finally float for goto if implements import " + "instanceof int interface long native new package private protected public " + "return short static strictfp super switch synchronized this throw throws transient " + "try void volatile while"), blockKeywords: words("catch class do else finally for if switch try while"), atoms: words("true false null"), hooks: { "@": function(stream) { stream.eatWhile(/[\w\$_]/); return "meta"; } }, modeProps: {fold: ["brace", "import"]} }); def("text/x-csharp", { name: "clike", keywords: words("abstract as base break case catch checked class const continue" + " default delegate do else enum event explicit extern finally fixed for" + " foreach goto if implicit in interface internal is lock namespace new" + " operator out override params private protected public readonly ref return sealed" + " sizeof stackalloc static struct switch this throw try typeof unchecked" + " unsafe using virtual void volatile while add alias ascending descending dynamic from get" + " global group into join let orderby partial remove select set value var yield"), blockKeywords: words("catch class do else finally for foreach if struct switch try while"), builtin: words("Boolean Byte Char DateTime DateTimeOffset Decimal Double" + " Guid Int16 Int32 Int64 Object SByte Single String TimeSpan UInt16 UInt32" + " UInt64 bool byte char decimal double short int long object" + " sbyte float string ushort uint ulong"), atoms: words("true false null"), hooks: { "@": function(stream, state) { if (stream.eat('"')) { state.tokenize = tokenAtString; return tokenAtString(stream, state); } stream.eatWhile(/[\w\$_]/); return "meta"; } } }); function tokenTripleString(stream, state) { var escaped = false; while (!stream.eol()) { if (!escaped && stream.match('"""')) { state.tokenize = null; break; } escaped = stream.next() == "\\" && !escaped; } return "string"; } def("text/x-scala", { name: "clike", keywords: words( /* scala */ "abstract case catch class def do else extends false final finally for forSome if " + "implicit import lazy match new null object override package private protected return " + "sealed super this throw trait try trye type val var while with yield _ : = => <- <: " + "<% >: # @ " + /* package scala */ "assert assume require print println printf readLine readBoolean readByte readShort " + "readChar readInt readLong readFloat readDouble " + "AnyVal App Application Array BufferedIterator BigDecimal BigInt Char Console Either " + "Enumeration Equiv Error Exception Fractional Function IndexedSeq Integral Iterable " + "Iterator List Map Numeric Nil NotNull Option Ordered Ordering PartialFunction PartialOrdering " + "Product Proxy Range Responder Seq Serializable Set Specializable Stream StringBuilder " + "StringContext Symbol Throwable Traversable TraversableOnce Tuple Unit Vector :: #:: " + /* package java.lang */ "Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable " + "Compiler Double Exception Float Integer Long Math Number Object Package Pair Process " + "Runtime Runnable SecurityManager Short StackTraceElement StrictMath String " + "StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void" ), multiLineStrings: true, blockKeywords: words("catch class do else finally for forSome if match switch try while"), atoms: words("true false null"), indentStatements: false, hooks: { "@": function(stream) { stream.eatWhile(/[\w\$_]/); return "meta"; }, '"': function(stream, state) { if (!stream.match('""')) return false; state.tokenize = tokenTripleString; return state.tokenize(stream, state); }, "'": function(stream) { stream.eatWhile(/[\w\$_\xa1-\uffff]/); return "atom"; } }, modeProps: {closeBrackets: {triples: '"'}} }); def(["x-shader/x-vertex", "x-shader/x-fragment"], { name: "clike", keywords: words("float int bool void " + "vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 " + "mat2 mat3 mat4 " + "sampler1D sampler2D sampler3D samplerCube " + "sampler1DShadow sampler2DShadow " + "const attribute uniform varying " + "break continue discard return " + "for while do if else struct " + "in out inout"), blockKeywords: words("for while do if else struct"), builtin: words("radians degrees sin cos tan asin acos atan " + "pow exp log exp2 sqrt inversesqrt " + "abs sign floor ceil fract mod min max clamp mix step smoothstep " + "length distance dot cross normalize ftransform faceforward " + "reflect refract matrixCompMult " + "lessThan lessThanEqual greaterThan greaterThanEqual " + "equal notEqual any all not " + "texture1D texture1DProj texture1DLod texture1DProjLod " + "texture2D texture2DProj texture2DLod texture2DProjLod " + "texture3D texture3DProj texture3DLod texture3DProjLod " + "textureCube textureCubeLod " + "shadow1D shadow2D shadow1DProj shadow2DProj " + "shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod " + "dFdx dFdy fwidth " + "noise1 noise2 noise3 noise4"), atoms: words("true false " + "gl_FragColor gl_SecondaryColor gl_Normal gl_Vertex " + "gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 " + "gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 " + "gl_FogCoord gl_PointCoord " + "gl_Position gl_PointSize gl_ClipVertex " + "gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor " + "gl_TexCoord gl_FogFragCoord " + "gl_FragCoord gl_FrontFacing " + "gl_FragData gl_FragDepth " + "gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix " + "gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse " + "gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse " + "gl_TexureMatrixTranspose gl_ModelViewMatrixInverseTranspose " + "gl_ProjectionMatrixInverseTranspose " + "gl_ModelViewProjectionMatrixInverseTranspose " + "gl_TextureMatrixInverseTranspose " + "gl_NormalScale gl_DepthRange gl_ClipPlane " + "gl_Point gl_FrontMaterial gl_BackMaterial gl_LightSource gl_LightModel " + "gl_FrontLightModelProduct gl_BackLightModelProduct " + "gl_TextureColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ " + "gl_FogParameters " + "gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords " + "gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVaryingFloats " + "gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits " + "gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits " + "gl_MaxDrawBuffers"), hooks: {"#": cppHook}, modeProps: {fold: ["brace", "include"]} }); def("text/x-nesc", { name: "clike", keywords: words(cKeywords + "as atomic async call command component components configuration event generic " + "implementation includes interface module new norace nx_struct nx_union post provides " + "signal task uses abstract extends"), blockKeywords: words("case do else for if switch while struct"), atoms: words("null"), hooks: {"#": cppHook}, modeProps: {fold: ["brace", "include"]} }); def("text/x-objectivec", { name: "clike", keywords: words(cKeywords + "inline restrict _Bool _Complex _Imaginery BOOL Class bycopy byref id IMP in " + "inout nil oneway out Protocol SEL self super atomic nonatomic retain copy readwrite readonly"), atoms: words("YES NO NULL NILL ON OFF"), hooks: { "@": function(stream) { stream.eatWhile(/[\w\$]/); return "keyword"; }, "#": cppHook }, modeProps: {fold: "brace"} }); }); ================================================ FILE: base/res/codemirror/mode/clike/index.html ================================================ CodeMirror: C-like mode

C-like mode

C++ example

Objective-C example

Java example

Scala example

Simple mode that tries to handle C-like languages as well as it can. Takes two configuration parameters: keywords, an object whose property names are the keywords in the language, and useCPP, which determines whether C preprocessor directives are recognized.

MIME types defined: text/x-csrc (C), text/x-c++src (C++), text/x-java (Java), text/x-csharp (C#), text/x-objectivec (Objective-C), text/x-scala (Scala), text/x-vertex and x-shader/x-fragment (shader programs).

================================================ FILE: base/res/codemirror/mode/clike/scala.html ================================================ CodeMirror: Scala mode

Scala mode

================================================ FILE: base/res/codemirror/mode/clojure/clojure.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /** * Author: Hans Engel * Branched from CodeMirror's Scheme mode (by Koh Zi Han, based on implementation by Koh Zi Chun) */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("clojure", function (options) { var BUILTIN = "builtin", COMMENT = "comment", STRING = "string", CHARACTER = "string-2", ATOM = "atom", NUMBER = "number", BRACKET = "bracket", KEYWORD = "keyword", VAR = "variable"; var INDENT_WORD_SKIP = options.indentUnit || 2; var NORMAL_INDENT_UNIT = options.indentUnit || 2; function makeKeywords(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } var atoms = makeKeywords("true false nil"); var keywords = makeKeywords( "defn defn- def def- defonce defmulti defmethod defmacro defstruct deftype defprotocol defrecord defproject deftest slice defalias defhinted defmacro- defn-memo defnk defnk defonce- defunbound defunbound- defvar defvar- let letfn do case cond condp for loop recur when when-not when-let when-first if if-let if-not . .. -> ->> doto and or dosync doseq dotimes dorun doall load import unimport ns in-ns refer try catch finally throw with-open with-local-vars binding gen-class gen-and-load-class gen-and-save-class handler-case handle"); var builtins = makeKeywords( "* *' *1 *2 *3 *agent* *allow-unresolved-vars* *assert* *clojure-version* *command-line-args* *compile-files* *compile-path* *compiler-options* *data-readers* *e *err* *file* *flush-on-newline* *fn-loader* *in* *math-context* *ns* *out* *print-dup* *print-length* *print-level* *print-meta* *print-readably* *read-eval* *source-path* *unchecked-math* *use-context-classloader* *verbose-defrecords* *warn-on-reflection* + +' - -' -> ->> ->ArrayChunk ->Vec ->VecNode ->VecSeq -cache-protocol-fn -reset-methods .. / < <= = == > >= EMPTY-NODE accessor aclone add-classpath add-watch agent agent-error agent-errors aget alength alias all-ns alter alter-meta! alter-var-root amap ancestors and apply areduce array-map aset aset-boolean aset-byte aset-char aset-double aset-float aset-int aset-long aset-short assert assoc assoc! assoc-in associative? atom await await-for await1 bases bean bigdec bigint biginteger binding bit-and bit-and-not bit-clear bit-flip bit-not bit-or bit-set bit-shift-left bit-shift-right bit-test bit-xor boolean boolean-array booleans bound-fn bound-fn* bound? butlast byte byte-array bytes case cast char char-array char-escape-string char-name-string char? chars chunk chunk-append chunk-buffer chunk-cons chunk-first chunk-next chunk-rest chunked-seq? class class? clear-agent-errors clojure-version coll? comment commute comp comparator compare compare-and-set! compile complement concat cond condp conj conj! cons constantly construct-proxy contains? count counted? create-ns create-struct cycle dec dec' decimal? declare default-data-readers definline definterface defmacro defmethod defmulti defn defn- defonce defprotocol defrecord defstruct deftype delay delay? deliver denominator deref derive descendants destructure disj disj! dissoc dissoc! distinct distinct? doall dorun doseq dosync dotimes doto double double-array doubles drop drop-last drop-while empty empty? ensure enumeration-seq error-handler error-mode eval even? every-pred every? ex-data ex-info extend extend-protocol extend-type extenders extends? false? ffirst file-seq filter filterv find find-keyword find-ns find-protocol-impl find-protocol-method find-var first flatten float float-array float? floats flush fn fn? fnext fnil for force format frequencies future future-call future-cancel future-cancelled? future-done? future? gen-class gen-interface gensym get get-in get-method get-proxy-class get-thread-bindings get-validator group-by hash hash-combine hash-map hash-set identical? identity if-let if-not ifn? import in-ns inc inc' init-proxy instance? int int-array integer? interleave intern interpose into into-array ints io! isa? iterate iterator-seq juxt keep keep-indexed key keys keyword keyword? last lazy-cat lazy-seq let letfn line-seq list list* list? load load-file load-reader load-string loaded-libs locking long long-array longs loop macroexpand macroexpand-1 make-array make-hierarchy map map-indexed map? mapcat mapv max max-key memfn memoize merge merge-with meta method-sig methods min min-key mod munge name namespace namespace-munge neg? newline next nfirst nil? nnext not not-any? not-empty not-every? not= ns ns-aliases ns-imports ns-interns ns-map ns-name ns-publics ns-refers ns-resolve ns-unalias ns-unmap nth nthnext nthrest num number? numerator object-array odd? or parents partial partition partition-all partition-by pcalls peek persistent! pmap pop pop! pop-thread-bindings pos? pr pr-str prefer-method prefers primitives-classnames print print-ctor print-dup print-method print-simple print-str printf println println-str prn prn-str promise proxy proxy-call-with-super proxy-mappings proxy-name proxy-super push-thread-bindings pvalues quot rand rand-int rand-nth range ratio? rational? rationalize re-find re-groups re-matcher re-matches re-pattern re-seq read read-line read-string realized? reduce reduce-kv reductions ref ref-history-count ref-max-history ref-min-history ref-set refer refer-clojure reify release-pending-sends rem remove remove-all-methods remove-method remove-ns remove-watch repeat repeatedly replace replicate require reset! reset-meta! resolve rest restart-agent resultset-seq reverse reversible? rseq rsubseq satisfies? second select-keys send send-off seq seq? seque sequence sequential? set set-error-handler! set-error-mode! set-validator! set? short short-array shorts shuffle shutdown-agents slurp some some-fn sort sort-by sorted-map sorted-map-by sorted-set sorted-set-by sorted? special-symbol? spit split-at split-with str string? struct struct-map subs subseq subvec supers swap! symbol symbol? sync take take-last take-nth take-while test the-ns thread-bound? time to-array to-array-2d trampoline transient tree-seq true? type unchecked-add unchecked-add-int unchecked-byte unchecked-char unchecked-dec unchecked-dec-int unchecked-divide-int unchecked-double unchecked-float unchecked-inc unchecked-inc-int unchecked-int unchecked-long unchecked-multiply unchecked-multiply-int unchecked-negate unchecked-negate-int unchecked-remainder-int unchecked-short unchecked-subtract unchecked-subtract-int underive unquote unquote-splicing update-in update-proxy use val vals var-get var-set var? vary-meta vec vector vector-of vector? when when-first when-let when-not while with-bindings with-bindings* with-in-str with-loading-context with-local-vars with-meta with-open with-out-str with-precision with-redefs with-redefs-fn xml-seq zero? zipmap *default-data-reader-fn* as-> cond-> cond->> reduced reduced? send-via set-agent-send-executor! set-agent-send-off-executor! some-> some->>"); var indentKeys = makeKeywords( // Built-ins "ns fn def defn defmethod bound-fn if if-not case condp when while when-not when-first do future comment doto locking proxy with-open with-precision reify deftype defrecord defprotocol extend extend-protocol extend-type try catch " + // Binding forms "let letfn binding loop for doseq dotimes when-let if-let " + // Data structures "defstruct struct-map assoc " + // clojure.test "testing deftest " + // contrib "handler-case handle dotrace deftrace"); var tests = { digit: /\d/, digit_or_colon: /[\d:]/, hex: /[0-9a-f]/i, sign: /[+-]/, exponent: /e/i, keyword_char: /[^\s\(\[\;\)\]]/, symbol: /[\w*+!\-\._?:<>\/\xa1-\uffff]/ }; function stateStack(indent, type, prev) { // represents a state stack object this.indent = indent; this.type = type; this.prev = prev; } function pushStack(state, indent, type) { state.indentStack = new stateStack(indent, type, state.indentStack); } function popStack(state) { state.indentStack = state.indentStack.prev; } function isNumber(ch, stream){ // hex if ( ch === '0' && stream.eat(/x/i) ) { stream.eatWhile(tests.hex); return true; } // leading sign if ( ( ch == '+' || ch == '-' ) && ( tests.digit.test(stream.peek()) ) ) { stream.eat(tests.sign); ch = stream.next(); } if ( tests.digit.test(ch) ) { stream.eat(ch); stream.eatWhile(tests.digit); if ( '.' == stream.peek() ) { stream.eat('.'); stream.eatWhile(tests.digit); } if ( stream.eat(tests.exponent) ) { stream.eat(tests.sign); stream.eatWhile(tests.digit); } return true; } return false; } // Eat character that starts after backslash \ function eatCharacter(stream) { var first = stream.next(); // Read special literals: backspace, newline, space, return. // Just read all lowercase letters. if (first && first.match(/[a-z]/) && stream.match(/[a-z]+/, true)) { return; } // Read unicode character: \u1000 \uA0a1 if (first === "u") { stream.match(/[0-9a-z]{4}/i, true); } } return { startState: function () { return { indentStack: null, indentation: 0, mode: false }; }, token: function (stream, state) { if (state.indentStack == null && stream.sol()) { // update indentation, but only if indentStack is empty state.indentation = stream.indentation(); } // skip spaces if (stream.eatSpace()) { return null; } var returnType = null; switch(state.mode){ case "string": // multi-line string parsing mode var next, escaped = false; while ((next = stream.next()) != null) { if (next == "\"" && !escaped) { state.mode = false; break; } escaped = !escaped && next == "\\"; } returnType = STRING; // continue on in string mode break; default: // default parsing mode var ch = stream.next(); if (ch == "\"") { state.mode = "string"; returnType = STRING; } else if (ch == "\\") { eatCharacter(stream); returnType = CHARACTER; } else if (ch == "'" && !( tests.digit_or_colon.test(stream.peek()) )) { returnType = ATOM; } else if (ch == ";") { // comment stream.skipToEnd(); // rest of the line is a comment returnType = COMMENT; } else if (isNumber(ch,stream)){ returnType = NUMBER; } else if (ch == "(" || ch == "[" || ch == "{" ) { var keyWord = '', indentTemp = stream.column(), letter; /** Either (indent-word .. (non-indent-word .. (;something else, bracket, etc. */ if (ch == "(") while ((letter = stream.eat(tests.keyword_char)) != null) { keyWord += letter; } if (keyWord.length > 0 && (indentKeys.propertyIsEnumerable(keyWord) || /^(?:def|with)/.test(keyWord))) { // indent-word pushStack(state, indentTemp + INDENT_WORD_SKIP, ch); } else { // non-indent word // we continue eating the spaces stream.eatSpace(); if (stream.eol() || stream.peek() == ";") { // nothing significant after // we restart indentation the user defined spaces after pushStack(state, indentTemp + NORMAL_INDENT_UNIT, ch); } else { pushStack(state, indentTemp + stream.current().length, ch); // else we match } } stream.backUp(stream.current().length - 1); // undo all the eating returnType = BRACKET; } else if (ch == ")" || ch == "]" || ch == "}") { returnType = BRACKET; if (state.indentStack != null && state.indentStack.type == (ch == ")" ? "(" : (ch == "]" ? "[" :"{"))) { popStack(state); } } else if ( ch == ":" ) { stream.eatWhile(tests.symbol); return ATOM; } else { stream.eatWhile(tests.symbol); if (keywords && keywords.propertyIsEnumerable(stream.current())) { returnType = KEYWORD; } else if (builtins && builtins.propertyIsEnumerable(stream.current())) { returnType = BUILTIN; } else if (atoms && atoms.propertyIsEnumerable(stream.current())) { returnType = ATOM; } else { returnType = VAR; } } } return returnType; }, indent: function (state) { if (state.indentStack == null) return state.indentation; return state.indentStack.indent; }, closeBrackets: {pairs: "()[]{}\"\""}, lineComment: ";;" }; }); CodeMirror.defineMIME("text/x-clojure", "clojure"); }); ================================================ FILE: base/res/codemirror/mode/clojure/index.html ================================================ CodeMirror: Clojure mode

Clojure mode

MIME types defined: text/x-clojure.

================================================ FILE: base/res/codemirror/mode/cmake/cmake.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) define(["../../lib/codemirror"], mod); else mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("cmake", function () { var variable_regex = /({)?[a-zA-Z0-9_]+(})?/; function tokenString(stream, state) { var current, prev, found_var = false; while (!stream.eol() && (current = stream.next()) != state.pending) { if (current === '$' && prev != '\\' && state.pending == '"') { found_var = true; break; } prev = current; } if (found_var) { stream.backUp(1); } if (current == state.pending) { state.continueString = false; } else { state.continueString = true; } return "string"; } function tokenize(stream, state) { var ch = stream.next(); // Have we found a variable? if (ch === '$') { if (stream.match(variable_regex)) { return 'variable-2'; } return 'variable'; } // Should we still be looking for the end of a string? if (state.continueString) { // If so, go through the loop again stream.backUp(1); return tokenString(stream, state); } // Do we just have a function on our hands? // In 'cmake_minimum_required (VERSION 2.8.8)', 'cmake_minimum_required' is matched if (stream.match(/(\s+)?\w+\(/) || stream.match(/(\s+)?\w+\ \(/)) { stream.backUp(1); return 'def'; } if (ch == "#") { stream.skipToEnd(); return "comment"; } // Have we found a string? if (ch == "'" || ch == '"') { // Store the type (single or double) state.pending = ch; // Perform the looping function to find the end return tokenString(stream, state); } if (ch == '(' || ch == ')') { return 'bracket'; } if (ch.match(/[0-9]/)) { return 'number'; } stream.eatWhile(/[\w-]/); return null; } return { startState: function () { var state = {}; state.inDefinition = false; state.inInclude = false; state.continueString = false; state.pending = false; return state; }, token: function (stream, state) { if (stream.eatSpace()) return null; return tokenize(stream, state); } }; }); CodeMirror.defineMIME("text/x-cmake", "cmake"); }); ================================================ FILE: base/res/codemirror/mode/cmake/index.html ================================================ CodeMirror: CMake mode

CMake mode

MIME types defined: text/x-cmake.

================================================ FILE: base/res/codemirror/mode/cobol/cobol.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /** * Author: Gautam Mehta * Branched from CodeMirror's Scheme mode */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("cobol", function () { var BUILTIN = "builtin", COMMENT = "comment", STRING = "string", ATOM = "atom", NUMBER = "number", KEYWORD = "keyword", MODTAG = "header", COBOLLINENUM = "def", PERIOD = "link"; function makeKeywords(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } var atoms = makeKeywords("TRUE FALSE ZEROES ZEROS ZERO SPACES SPACE LOW-VALUE LOW-VALUES "); var keywords = makeKeywords( "ACCEPT ACCESS ACQUIRE ADD ADDRESS " + "ADVANCING AFTER ALIAS ALL ALPHABET " + "ALPHABETIC ALPHABETIC-LOWER ALPHABETIC-UPPER ALPHANUMERIC ALPHANUMERIC-EDITED " + "ALSO ALTER ALTERNATE AND ANY " + "ARE AREA AREAS ARITHMETIC ASCENDING " + "ASSIGN AT ATTRIBUTE AUTHOR AUTO " + "AUTO-SKIP AUTOMATIC B-AND B-EXOR B-LESS " + "B-NOT B-OR BACKGROUND-COLOR BACKGROUND-COLOUR BEEP " + "BEFORE BELL BINARY BIT BITS " + "BLANK BLINK BLOCK BOOLEAN BOTTOM " + "BY CALL CANCEL CD CF " + "CH CHARACTER CHARACTERS CLASS CLOCK-UNITS " + "CLOSE COBOL CODE CODE-SET COL " + "COLLATING COLUMN COMMA COMMIT COMMITMENT " + "COMMON COMMUNICATION COMP COMP-0 COMP-1 " + "COMP-2 COMP-3 COMP-4 COMP-5 COMP-6 " + "COMP-7 COMP-8 COMP-9 COMPUTATIONAL COMPUTATIONAL-0 " + "COMPUTATIONAL-1 COMPUTATIONAL-2 COMPUTATIONAL-3 COMPUTATIONAL-4 COMPUTATIONAL-5 " + "COMPUTATIONAL-6 COMPUTATIONAL-7 COMPUTATIONAL-8 COMPUTATIONAL-9 COMPUTE " + "CONFIGURATION CONNECT CONSOLE CONTAINED CONTAINS " + "CONTENT CONTINUE CONTROL CONTROL-AREA CONTROLS " + "CONVERTING COPY CORR CORRESPONDING COUNT " + "CRT CRT-UNDER CURRENCY CURRENT CURSOR " + "DATA DATE DATE-COMPILED DATE-WRITTEN DAY " + "DAY-OF-WEEK DB DB-ACCESS-CONTROL-KEY DB-DATA-NAME DB-EXCEPTION " + "DB-FORMAT-NAME DB-RECORD-NAME DB-SET-NAME DB-STATUS DBCS " + "DBCS-EDITED DE DEBUG-CONTENTS DEBUG-ITEM DEBUG-LINE " + "DEBUG-NAME DEBUG-SUB-1 DEBUG-SUB-2 DEBUG-SUB-3 DEBUGGING " + "DECIMAL-POINT DECLARATIVES DEFAULT DELETE DELIMITED " + "DELIMITER DEPENDING DESCENDING DESCRIBED DESTINATION " + "DETAIL DISABLE DISCONNECT DISPLAY DISPLAY-1 " + "DISPLAY-2 DISPLAY-3 DISPLAY-4 DISPLAY-5 DISPLAY-6 " + "DISPLAY-7 DISPLAY-8 DISPLAY-9 DIVIDE DIVISION " + "DOWN DROP DUPLICATE DUPLICATES DYNAMIC " + "EBCDIC EGI EJECT ELSE EMI " + "EMPTY EMPTY-CHECK ENABLE END END. END-ACCEPT END-ACCEPT. " + "END-ADD END-CALL END-COMPUTE END-DELETE END-DISPLAY " + "END-DIVIDE END-EVALUATE END-IF END-INVOKE END-MULTIPLY " + "END-OF-PAGE END-PERFORM END-READ END-RECEIVE END-RETURN " + "END-REWRITE END-SEARCH END-START END-STRING END-SUBTRACT " + "END-UNSTRING END-WRITE END-XML ENTER ENTRY " + "ENVIRONMENT EOP EQUAL EQUALS ERASE " + "ERROR ESI EVALUATE EVERY EXCEEDS " + "EXCEPTION EXCLUSIVE EXIT EXTEND EXTERNAL " + "EXTERNALLY-DESCRIBED-KEY FD FETCH FILE FILE-CONTROL " + "FILE-STREAM FILES FILLER FINAL FIND " + "FINISH FIRST FOOTING FOR FOREGROUND-COLOR " + "FOREGROUND-COLOUR FORMAT FREE FROM FULL " + "FUNCTION GENERATE GET GIVING GLOBAL " + "GO GOBACK GREATER GROUP HEADING " + "HIGH-VALUE HIGH-VALUES HIGHLIGHT I-O I-O-CONTROL " + "ID IDENTIFICATION IF IN INDEX " + "INDEX-1 INDEX-2 INDEX-3 INDEX-4 INDEX-5 " + "INDEX-6 INDEX-7 INDEX-8 INDEX-9 INDEXED " + "INDIC INDICATE INDICATOR INDICATORS INITIAL " + "INITIALIZE INITIATE INPUT INPUT-OUTPUT INSPECT " + "INSTALLATION INTO INVALID INVOKE IS " + "JUST JUSTIFIED KANJI KEEP KEY " + "LABEL LAST LD LEADING LEFT " + "LEFT-JUSTIFY LENGTH LENGTH-CHECK LESS LIBRARY " + "LIKE LIMIT LIMITS LINAGE LINAGE-COUNTER " + "LINE LINE-COUNTER LINES LINKAGE LOCAL-STORAGE " + "LOCALE LOCALLY LOCK " + "MEMBER MEMORY MERGE MESSAGE METACLASS " + "MODE MODIFIED MODIFY MODULES MOVE " + "MULTIPLE MULTIPLY NATIONAL NATIVE NEGATIVE " + "NEXT NO NO-ECHO NONE NOT " + "NULL NULL-KEY-MAP NULL-MAP NULLS NUMBER " + "NUMERIC NUMERIC-EDITED OBJECT OBJECT-COMPUTER OCCURS " + "OF OFF OMITTED ON ONLY " + "OPEN OPTIONAL OR ORDER ORGANIZATION " + "OTHER OUTPUT OVERFLOW OWNER PACKED-DECIMAL " + "PADDING PAGE PAGE-COUNTER PARSE PERFORM " + "PF PH PIC PICTURE PLUS " + "POINTER POSITION POSITIVE PREFIX PRESENT " + "PRINTING PRIOR PROCEDURE PROCEDURE-POINTER PROCEDURES " + "PROCEED PROCESS PROCESSING PROGRAM PROGRAM-ID " + "PROMPT PROTECTED PURGE QUEUE QUOTE " + "QUOTES RANDOM RD READ READY " + "REALM RECEIVE RECONNECT RECORD RECORD-NAME " + "RECORDS RECURSIVE REDEFINES REEL REFERENCE " + "REFERENCE-MONITOR REFERENCES RELATION RELATIVE RELEASE " + "REMAINDER REMOVAL RENAMES REPEATED REPLACE " + "REPLACING REPORT REPORTING REPORTS REPOSITORY " + "REQUIRED RERUN RESERVE RESET RETAINING " + "RETRIEVAL RETURN RETURN-CODE RETURNING REVERSE-VIDEO " + "REVERSED REWIND REWRITE RF RH " + "RIGHT RIGHT-JUSTIFY ROLLBACK ROLLING ROUNDED " + "RUN SAME SCREEN SD SEARCH " + "SECTION SECURE SECURITY SEGMENT SEGMENT-LIMIT " + "SELECT SEND SENTENCE SEPARATE SEQUENCE " + "SEQUENTIAL SET SHARED SIGN SIZE " + "SKIP1 SKIP2 SKIP3 SORT SORT-MERGE " + "SORT-RETURN SOURCE SOURCE-COMPUTER SPACE-FILL " + "SPECIAL-NAMES STANDARD STANDARD-1 STANDARD-2 " + "START STARTING STATUS STOP STORE " + "STRING SUB-QUEUE-1 SUB-QUEUE-2 SUB-QUEUE-3 SUB-SCHEMA " + "SUBFILE SUBSTITUTE SUBTRACT SUM SUPPRESS " + "SYMBOLIC SYNC SYNCHRONIZED SYSIN SYSOUT " + "TABLE TALLYING TAPE TENANT TERMINAL " + "TERMINATE TEST TEXT THAN THEN " + "THROUGH THRU TIME TIMES TITLE " + "TO TOP TRAILING TRAILING-SIGN TRANSACTION " + "TYPE TYPEDEF UNDERLINE UNEQUAL UNIT " + "UNSTRING UNTIL UP UPDATE UPON " + "USAGE USAGE-MODE USE USING VALID " + "VALIDATE VALUE VALUES VARYING VLR " + "WAIT WHEN WHEN-COMPILED WITH WITHIN " + "WORDS WORKING-STORAGE WRITE XML XML-CODE " + "XML-EVENT XML-NTEXT XML-TEXT ZERO ZERO-FILL " ); var builtins = makeKeywords("- * ** / + < <= = > >= "); var tests = { digit: /\d/, digit_or_colon: /[\d:]/, hex: /[0-9a-f]/i, sign: /[+-]/, exponent: /e/i, keyword_char: /[^\s\(\[\;\)\]]/, symbol: /[\w*+\-]/ }; function isNumber(ch, stream){ // hex if ( ch === '0' && stream.eat(/x/i) ) { stream.eatWhile(tests.hex); return true; } // leading sign if ( ( ch == '+' || ch == '-' ) && ( tests.digit.test(stream.peek()) ) ) { stream.eat(tests.sign); ch = stream.next(); } if ( tests.digit.test(ch) ) { stream.eat(ch); stream.eatWhile(tests.digit); if ( '.' == stream.peek()) { stream.eat('.'); stream.eatWhile(tests.digit); } if ( stream.eat(tests.exponent) ) { stream.eat(tests.sign); stream.eatWhile(tests.digit); } return true; } return false; } return { startState: function () { return { indentStack: null, indentation: 0, mode: false }; }, token: function (stream, state) { if (state.indentStack == null && stream.sol()) { // update indentation, but only if indentStack is empty state.indentation = 6 ; //stream.indentation(); } // skip spaces if (stream.eatSpace()) { return null; } var returnType = null; switch(state.mode){ case "string": // multi-line string parsing mode var next = false; while ((next = stream.next()) != null) { if (next == "\"" || next == "\'") { state.mode = false; break; } } returnType = STRING; // continue on in string mode break; default: // default parsing mode var ch = stream.next(); var col = stream.column(); if (col >= 0 && col <= 5) { returnType = COBOLLINENUM; } else if (col >= 72 && col <= 79) { stream.skipToEnd(); returnType = MODTAG; } else if (ch == "*" && col == 6) { // comment stream.skipToEnd(); // rest of the line is a comment returnType = COMMENT; } else if (ch == "\"" || ch == "\'") { state.mode = "string"; returnType = STRING; } else if (ch == "'" && !( tests.digit_or_colon.test(stream.peek()) )) { returnType = ATOM; } else if (ch == ".") { returnType = PERIOD; } else if (isNumber(ch,stream)){ returnType = NUMBER; } else { if (stream.current().match(tests.symbol)) { while (col < 71) { if (stream.eat(tests.symbol) === undefined) { break; } else { col++; } } } if (keywords && keywords.propertyIsEnumerable(stream.current().toUpperCase())) { returnType = KEYWORD; } else if (builtins && builtins.propertyIsEnumerable(stream.current().toUpperCase())) { returnType = BUILTIN; } else if (atoms && atoms.propertyIsEnumerable(stream.current().toUpperCase())) { returnType = ATOM; } else returnType = null; } } return returnType; }, indent: function (state) { if (state.indentStack == null) return state.indentation; return state.indentStack.indent; } }; }); CodeMirror.defineMIME("text/x-cobol", "cobol"); }); ================================================ FILE: base/res/codemirror/mode/cobol/index.html ================================================ CodeMirror: COBOL mode

COBOL mode

Select Theme Select Font Size

================================================ FILE: base/res/codemirror/mode/coffeescript/coffeescript.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /** * Link to the project's GitHub page: * https://github.com/pickhardt/coffeescript-codemirror-mode */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("coffeescript", function(conf, parserConf) { var ERRORCLASS = "error"; function wordRegexp(words) { return new RegExp("^((" + words.join(")|(") + "))\\b"); } var operators = /^(?:->|=>|\+[+=]?|-[\-=]?|\*[\*=]?|\/[\/=]?|[=!]=|<[><]?=?|>>?=?|%=?|&=?|\|=?|\^=?|\~|!|\?|(or|and|\|\||&&|\?)=)/; var delimiters = /^(?:[()\[\]{},:`=;]|\.\.?\.?)/; var identifiers = /^[_A-Za-z$][_A-Za-z$0-9]*/; var properties = /^(@|this\.)[_A-Za-z$][_A-Za-z$0-9]*/; var wordOperators = wordRegexp(["and", "or", "not", "is", "isnt", "in", "instanceof", "typeof"]); var indentKeywords = ["for", "while", "loop", "if", "unless", "else", "switch", "try", "catch", "finally", "class"]; var commonKeywords = ["break", "by", "continue", "debugger", "delete", "do", "in", "of", "new", "return", "then", "this", "@", "throw", "when", "until", "extends"]; var keywords = wordRegexp(indentKeywords.concat(commonKeywords)); indentKeywords = wordRegexp(indentKeywords); var stringPrefixes = /^('{3}|\"{3}|['\"])/; var regexPrefixes = /^(\/{3}|\/)/; var commonConstants = ["Infinity", "NaN", "undefined", "null", "true", "false", "on", "off", "yes", "no"]; var constants = wordRegexp(commonConstants); // Tokenizers function tokenBase(stream, state) { // Handle scope changes if (stream.sol()) { if (state.scope.align === null) state.scope.align = false; var scopeOffset = state.scope.offset; if (stream.eatSpace()) { var lineOffset = stream.indentation(); if (lineOffset > scopeOffset && state.scope.type == "coffee") { return "indent"; } else if (lineOffset < scopeOffset) { return "dedent"; } return null; } else { if (scopeOffset > 0) { dedent(stream, state); } } } if (stream.eatSpace()) { return null; } var ch = stream.peek(); // Handle docco title comment (single line) if (stream.match("####")) { stream.skipToEnd(); return "comment"; } // Handle multi line comments if (stream.match("###")) { state.tokenize = longComment; return state.tokenize(stream, state); } // Single line comment if (ch === "#") { stream.skipToEnd(); return "comment"; } // Handle number literals if (stream.match(/^-?[0-9\.]/, false)) { var floatLiteral = false; // Floats if (stream.match(/^-?\d*\.\d+(e[\+\-]?\d+)?/i)) { floatLiteral = true; } if (stream.match(/^-?\d+\.\d*/)) { floatLiteral = true; } if (stream.match(/^-?\.\d+/)) { floatLiteral = true; } if (floatLiteral) { // prevent from getting extra . on 1.. if (stream.peek() == "."){ stream.backUp(1); } return "number"; } // Integers var intLiteral = false; // Hex if (stream.match(/^-?0x[0-9a-f]+/i)) { intLiteral = true; } // Decimal if (stream.match(/^-?[1-9]\d*(e[\+\-]?\d+)?/)) { intLiteral = true; } // Zero by itself with no other piece of number. if (stream.match(/^-?0(?![\dx])/i)) { intLiteral = true; } if (intLiteral) { return "number"; } } // Handle strings if (stream.match(stringPrefixes)) { state.tokenize = tokenFactory(stream.current(), false, "string"); return state.tokenize(stream, state); } // Handle regex literals if (stream.match(regexPrefixes)) { if (stream.current() != "/" || stream.match(/^.*\//, false)) { // prevent highlight of division state.tokenize = tokenFactory(stream.current(), true, "string-2"); return state.tokenize(stream, state); } else { stream.backUp(1); } } // Handle operators and delimiters if (stream.match(operators) || stream.match(wordOperators)) { return "operator"; } if (stream.match(delimiters)) { return "punctuation"; } if (stream.match(constants)) { return "atom"; } if (stream.match(keywords)) { return "keyword"; } if (stream.match(identifiers)) { return "variable"; } if (stream.match(properties)) { return "property"; } // Handle non-detected items stream.next(); return ERRORCLASS; } function tokenFactory(delimiter, singleline, outclass) { return function(stream, state) { while (!stream.eol()) { stream.eatWhile(/[^'"\/\\]/); if (stream.eat("\\")) { stream.next(); if (singleline && stream.eol()) { return outclass; } } else if (stream.match(delimiter)) { state.tokenize = tokenBase; return outclass; } else { stream.eat(/['"\/]/); } } if (singleline) { if (parserConf.singleLineStringErrors) { outclass = ERRORCLASS; } else { state.tokenize = tokenBase; } } return outclass; }; } function longComment(stream, state) { while (!stream.eol()) { stream.eatWhile(/[^#]/); if (stream.match("###")) { state.tokenize = tokenBase; break; } stream.eatWhile("#"); } return "comment"; } function indent(stream, state, type) { type = type || "coffee"; var offset = 0, align = false, alignOffset = null; for (var scope = state.scope; scope; scope = scope.prev) { if (scope.type === "coffee" || scope.type == "}") { offset = scope.offset + conf.indentUnit; break; } } if (type !== "coffee") { align = null; alignOffset = stream.column() + stream.current().length; } else if (state.scope.align) { state.scope.align = false; } state.scope = { offset: offset, type: type, prev: state.scope, align: align, alignOffset: alignOffset }; } function dedent(stream, state) { if (!state.scope.prev) return; if (state.scope.type === "coffee") { var _indent = stream.indentation(); var matched = false; for (var scope = state.scope; scope; scope = scope.prev) { if (_indent === scope.offset) { matched = true; break; } } if (!matched) { return true; } while (state.scope.prev && state.scope.offset !== _indent) { state.scope = state.scope.prev; } return false; } else { state.scope = state.scope.prev; return false; } } function tokenLexer(stream, state) { var style = state.tokenize(stream, state); var current = stream.current(); // Handle "." connected identifiers if (current === ".") { style = state.tokenize(stream, state); current = stream.current(); if (/^\.[\w$]+$/.test(current)) { return "variable"; } else { return ERRORCLASS; } } // Handle scope changes. if (current === "return") { state.dedent = true; } if (((current === "->" || current === "=>") && !state.lambda && !stream.peek()) || style === "indent") { indent(stream, state); } var delimiter_index = "[({".indexOf(current); if (delimiter_index !== -1) { indent(stream, state, "])}".slice(delimiter_index, delimiter_index+1)); } if (indentKeywords.exec(current)){ indent(stream, state); } if (current == "then"){ dedent(stream, state); } if (style === "dedent") { if (dedent(stream, state)) { return ERRORCLASS; } } delimiter_index = "])}".indexOf(current); if (delimiter_index !== -1) { while (state.scope.type == "coffee" && state.scope.prev) state.scope = state.scope.prev; if (state.scope.type == current) state.scope = state.scope.prev; } if (state.dedent && stream.eol()) { if (state.scope.type == "coffee" && state.scope.prev) state.scope = state.scope.prev; state.dedent = false; } return style; } var external = { startState: function(basecolumn) { return { tokenize: tokenBase, scope: {offset:basecolumn || 0, type:"coffee", prev: null, align: false}, lastToken: null, lambda: false, dedent: 0 }; }, token: function(stream, state) { var fillAlign = state.scope.align === null && state.scope; if (fillAlign && stream.sol()) fillAlign.align = false; var style = tokenLexer(stream, state); if (fillAlign && style && style != "comment") fillAlign.align = true; state.lastToken = {style:style, content: stream.current()}; if (stream.eol() && stream.lambda) { state.lambda = false; } return style; }, indent: function(state, text) { if (state.tokenize != tokenBase) return 0; var scope = state.scope; var closer = text && "])}".indexOf(text.charAt(0)) > -1; if (closer) while (scope.type == "coffee" && scope.prev) scope = scope.prev; var closes = closer && scope.type === text.charAt(0); if (scope.align) return scope.alignOffset - (closes ? 1 : 0); else return (closes ? scope.prev : scope).offset; }, lineComment: "#", fold: "indent" }; return external; }); CodeMirror.defineMIME("text/x-coffeescript", "coffeescript"); }); ================================================ FILE: base/res/codemirror/mode/coffeescript/index.html ================================================ CodeMirror: CoffeeScript mode

CoffeeScript mode

MIME types defined: text/x-coffeescript.

The CoffeeScript mode was written by Jeff Pickhardt.

================================================ FILE: base/res/codemirror/mode/commonlisp/commonlisp.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("commonlisp", function (config) { var specialForm = /^(block|let*|return-from|catch|load-time-value|setq|eval-when|locally|symbol-macrolet|flet|macrolet|tagbody|function|multiple-value-call|the|go|multiple-value-prog1|throw|if|progn|unwind-protect|labels|progv|let|quote)$/; var assumeBody = /^with|^def|^do|^prog|case$|^cond$|bind$|when$|unless$/; var numLiteral = /^(?:[+\-]?(?:\d+|\d*\.\d+)(?:[efd][+\-]?\d+)?|[+\-]?\d+(?:\/[+\-]?\d+)?|#b[+\-]?[01]+|#o[+\-]?[0-7]+|#x[+\-]?[\da-f]+)/; var symbol = /[^\s'`,@()\[\]";]/; var type; function readSym(stream) { var ch; while (ch = stream.next()) { if (ch == "\\") stream.next(); else if (!symbol.test(ch)) { stream.backUp(1); break; } } return stream.current(); } function base(stream, state) { if (stream.eatSpace()) {type = "ws"; return null;} if (stream.match(numLiteral)) return "number"; var ch = stream.next(); if (ch == "\\") ch = stream.next(); if (ch == '"') return (state.tokenize = inString)(stream, state); else if (ch == "(") { type = "open"; return "bracket"; } else if (ch == ")" || ch == "]") { type = "close"; return "bracket"; } else if (ch == ";") { stream.skipToEnd(); type = "ws"; return "comment"; } else if (/['`,@]/.test(ch)) return null; else if (ch == "|") { if (stream.skipTo("|")) { stream.next(); return "symbol"; } else { stream.skipToEnd(); return "error"; } } else if (ch == "#") { var ch = stream.next(); if (ch == "[") { type = "open"; return "bracket"; } else if (/[+\-=\.']/.test(ch)) return null; else if (/\d/.test(ch) && stream.match(/^\d*#/)) return null; else if (ch == "|") return (state.tokenize = inComment)(stream, state); else if (ch == ":") { readSym(stream); return "meta"; } else return "error"; } else { var name = readSym(stream); if (name == ".") return null; type = "symbol"; if (name == "nil" || name == "t" || name.charAt(0) == ":") return "atom"; if (state.lastType == "open" && (specialForm.test(name) || assumeBody.test(name))) return "keyword"; if (name.charAt(0) == "&") return "variable-2"; return "variable"; } } function inString(stream, state) { var escaped = false, next; while (next = stream.next()) { if (next == '"' && !escaped) { state.tokenize = base; break; } escaped = !escaped && next == "\\"; } return "string"; } function inComment(stream, state) { var next, last; while (next = stream.next()) { if (next == "#" && last == "|") { state.tokenize = base; break; } last = next; } type = "ws"; return "comment"; } return { startState: function () { return {ctx: {prev: null, start: 0, indentTo: 0}, lastType: null, tokenize: base}; }, token: function (stream, state) { if (stream.sol() && typeof state.ctx.indentTo != "number") state.ctx.indentTo = state.ctx.start + 1; type = null; var style = state.tokenize(stream, state); if (type != "ws") { if (state.ctx.indentTo == null) { if (type == "symbol" && assumeBody.test(stream.current())) state.ctx.indentTo = state.ctx.start + config.indentUnit; else state.ctx.indentTo = "next"; } else if (state.ctx.indentTo == "next") { state.ctx.indentTo = stream.column(); } state.lastType = type; } if (type == "open") state.ctx = {prev: state.ctx, start: stream.column(), indentTo: null}; else if (type == "close") state.ctx = state.ctx.prev || state.ctx; return style; }, indent: function (state, _textAfter) { var i = state.ctx.indentTo; return typeof i == "number" ? i : state.ctx.start + 1; }, closeBrackets: {pairs: "()[]{}\"\""}, lineComment: ";;", blockCommentStart: "#|", blockCommentEnd: "|#" }; }); CodeMirror.defineMIME("text/x-common-lisp", "commonlisp"); }); ================================================ FILE: base/res/codemirror/mode/commonlisp/index.html ================================================ CodeMirror: Common Lisp mode

Common Lisp mode

MIME types defined: text/x-common-lisp.

================================================ FILE: base/res/codemirror/mode/css/css.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("css", function(config, parserConfig) { if (!parserConfig.propertyKeywords) parserConfig = CodeMirror.resolveMode("text/css"); var indentUnit = config.indentUnit, tokenHooks = parserConfig.tokenHooks, documentTypes = parserConfig.documentTypes || {}, mediaTypes = parserConfig.mediaTypes || {}, mediaFeatures = parserConfig.mediaFeatures || {}, propertyKeywords = parserConfig.propertyKeywords || {}, nonStandardPropertyKeywords = parserConfig.nonStandardPropertyKeywords || {}, fontProperties = parserConfig.fontProperties || {}, counterDescriptors = parserConfig.counterDescriptors || {}, colorKeywords = parserConfig.colorKeywords || {}, valueKeywords = parserConfig.valueKeywords || {}, allowNested = parserConfig.allowNested; var type, override; function ret(style, tp) { type = tp; return style; } // Tokenizers function tokenBase(stream, state) { var ch = stream.next(); if (tokenHooks[ch]) { var result = tokenHooks[ch](stream, state); if (result !== false) return result; } if (ch == "@") { stream.eatWhile(/[\w\\\-]/); return ret("def", stream.current()); } else if (ch == "=" || (ch == "~" || ch == "|") && stream.eat("=")) { return ret(null, "compare"); } else if (ch == "\"" || ch == "'") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } else if (ch == "#") { stream.eatWhile(/[\w\\\-]/); return ret("atom", "hash"); } else if (ch == "!") { stream.match(/^\s*\w*/); return ret("keyword", "important"); } else if (/\d/.test(ch) || ch == "." && stream.eat(/\d/)) { stream.eatWhile(/[\w.%]/); return ret("number", "unit"); } else if (ch === "-") { if (/[\d.]/.test(stream.peek())) { stream.eatWhile(/[\w.%]/); return ret("number", "unit"); } else if (stream.match(/^-[\w\\\-]+/)) { stream.eatWhile(/[\w\\\-]/); if (stream.match(/^\s*:/, false)) return ret("variable-2", "variable-definition"); return ret("variable-2", "variable"); } else if (stream.match(/^\w+-/)) { return ret("meta", "meta"); } } else if (/[,+>*\/]/.test(ch)) { return ret(null, "select-op"); } else if (ch == "." && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) { return ret("qualifier", "qualifier"); } else if (/[:;{}\[\]\(\)]/.test(ch)) { return ret(null, ch); } else if ((ch == "u" && stream.match(/rl(-prefix)?\(/)) || (ch == "d" && stream.match("omain(")) || (ch == "r" && stream.match("egexp("))) { stream.backUp(1); state.tokenize = tokenParenthesized; return ret("property", "word"); } else if (/[\w\\\-]/.test(ch)) { stream.eatWhile(/[\w\\\-]/); return ret("property", "word"); } else { return ret(null, null); } } function tokenString(quote) { return function(stream, state) { var escaped = false, ch; while ((ch = stream.next()) != null) { if (ch == quote && !escaped) { if (quote == ")") stream.backUp(1); break; } escaped = !escaped && ch == "\\"; } if (ch == quote || !escaped && quote != ")") state.tokenize = null; return ret("string", "string"); }; } function tokenParenthesized(stream, state) { stream.next(); // Must be '(' if (!stream.match(/\s*[\"\')]/, false)) state.tokenize = tokenString(")"); else state.tokenize = null; return ret(null, "("); } // Context management function Context(type, indent, prev) { this.type = type; this.indent = indent; this.prev = prev; } function pushContext(state, stream, type) { state.context = new Context(type, stream.indentation() + indentUnit, state.context); return type; } function popContext(state) { state.context = state.context.prev; return state.context.type; } function pass(type, stream, state) { return states[state.context.type](type, stream, state); } function popAndPass(type, stream, state, n) { for (var i = n || 1; i > 0; i--) state.context = state.context.prev; return pass(type, stream, state); } // Parser function wordAsValue(stream) { var word = stream.current().toLowerCase(); if (valueKeywords.hasOwnProperty(word)) override = "atom"; else if (colorKeywords.hasOwnProperty(word)) override = "keyword"; else override = "variable"; } var states = {}; states.top = function(type, stream, state) { if (type == "{") { return pushContext(state, stream, "block"); } else if (type == "}" && state.context.prev) { return popContext(state); } else if (/@(media|supports|(-moz-)?document)/.test(type)) { return pushContext(state, stream, "atBlock"); } else if (/@(font-face|counter-style)/.test(type)) { state.stateArg = type; return "restricted_atBlock_before"; } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(type)) { return "keyframes"; } else if (type && type.charAt(0) == "@") { return pushContext(state, stream, "at"); } else if (type == "hash") { override = "builtin"; } else if (type == "word") { override = "tag"; } else if (type == "variable-definition") { return "maybeprop"; } else if (type == "interpolation") { return pushContext(state, stream, "interpolation"); } else if (type == ":") { return "pseudo"; } else if (allowNested && type == "(") { return pushContext(state, stream, "parens"); } return state.context.type; }; states.block = function(type, stream, state) { if (type == "word") { var word = stream.current().toLowerCase(); if (propertyKeywords.hasOwnProperty(word)) { override = "property"; return "maybeprop"; } else if (nonStandardPropertyKeywords.hasOwnProperty(word)) { override = "string-2"; return "maybeprop"; } else if (allowNested) { override = stream.match(/^\s*:(?:\s|$)/, false) ? "property" : "tag"; return "block"; } else { override += " error"; return "maybeprop"; } } else if (type == "meta") { return "block"; } else if (!allowNested && (type == "hash" || type == "qualifier")) { override = "error"; return "block"; } else { return states.top(type, stream, state); } }; states.maybeprop = function(type, stream, state) { if (type == ":") return pushContext(state, stream, "prop"); return pass(type, stream, state); }; states.prop = function(type, stream, state) { if (type == ";") return popContext(state); if (type == "{" && allowNested) return pushContext(state, stream, "propBlock"); if (type == "}" || type == "{") return popAndPass(type, stream, state); if (type == "(") return pushContext(state, stream, "parens"); if (type == "hash" && !/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(stream.current())) { override += " error"; } else if (type == "word") { wordAsValue(stream); } else if (type == "interpolation") { return pushContext(state, stream, "interpolation"); } return "prop"; }; states.propBlock = function(type, _stream, state) { if (type == "}") return popContext(state); if (type == "word") { override = "property"; return "maybeprop"; } return state.context.type; }; states.parens = function(type, stream, state) { if (type == "{" || type == "}") return popAndPass(type, stream, state); if (type == ")") return popContext(state); if (type == "(") return pushContext(state, stream, "parens"); if (type == "interpolation") return pushContext(state, stream, "interpolation"); if (type == "word") wordAsValue(stream); return "parens"; }; states.pseudo = function(type, stream, state) { if (type == "word") { override = "variable-3"; return state.context.type; } return pass(type, stream, state); }; states.atBlock = function(type, stream, state) { if (type == "(") return pushContext(state, stream, "atBlock_parens"); if (type == "}") return popAndPass(type, stream, state); if (type == "{") return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top"); if (type == "word") { var word = stream.current().toLowerCase(); if (word == "only" || word == "not" || word == "and" || word == "or") override = "keyword"; else if (documentTypes.hasOwnProperty(word)) override = "tag"; else if (mediaTypes.hasOwnProperty(word)) override = "attribute"; else if (mediaFeatures.hasOwnProperty(word)) override = "property"; else if (propertyKeywords.hasOwnProperty(word)) override = "property"; else if (nonStandardPropertyKeywords.hasOwnProperty(word)) override = "string-2"; else if (valueKeywords.hasOwnProperty(word)) override = "atom"; else override = "error"; } return state.context.type; }; states.atBlock_parens = function(type, stream, state) { if (type == ")") return popContext(state); if (type == "{" || type == "}") return popAndPass(type, stream, state, 2); return states.atBlock(type, stream, state); }; states.restricted_atBlock_before = function(type, stream, state) { if (type == "{") return pushContext(state, stream, "restricted_atBlock"); if (type == "word" && state.stateArg == "@counter-style") { override = "variable"; return "restricted_atBlock_before"; } return pass(type, stream, state); }; states.restricted_atBlock = function(type, stream, state) { if (type == "}") { state.stateArg = null; return popContext(state); } if (type == "word") { if ((state.stateArg == "@font-face" && !fontProperties.hasOwnProperty(stream.current().toLowerCase())) || (state.stateArg == "@counter-style" && !counterDescriptors.hasOwnProperty(stream.current().toLowerCase()))) override = "error"; else override = "property"; return "maybeprop"; } return "restricted_atBlock"; }; states.keyframes = function(type, stream, state) { if (type == "word") { override = "variable"; return "keyframes"; } if (type == "{") return pushContext(state, stream, "top"); return pass(type, stream, state); }; states.at = function(type, stream, state) { if (type == ";") return popContext(state); if (type == "{" || type == "}") return popAndPass(type, stream, state); if (type == "word") override = "tag"; else if (type == "hash") override = "builtin"; return "at"; }; states.interpolation = function(type, stream, state) { if (type == "}") return popContext(state); if (type == "{" || type == ";") return popAndPass(type, stream, state); if (type == "word") override = "variable"; else if (type != "variable") override = "error"; return "interpolation"; }; return { startState: function(base) { return {tokenize: null, state: "top", stateArg: null, context: new Context("top", base || 0, null)}; }, token: function(stream, state) { if (!state.tokenize && stream.eatSpace()) return null; var style = (state.tokenize || tokenBase)(stream, state); if (style && typeof style == "object") { type = style[1]; style = style[0]; } override = style; state.state = states[state.state](type, stream, state); return override; }, indent: function(state, textAfter) { var cx = state.context, ch = textAfter && textAfter.charAt(0); var indent = cx.indent; if (cx.type == "prop" && (ch == "}" || ch == ")")) cx = cx.prev; if (cx.prev && (ch == "}" && (cx.type == "block" || cx.type == "top" || cx.type == "interpolation" || cx.type == "restricted_atBlock") || ch == ")" && (cx.type == "parens" || cx.type == "atBlock_parens") || ch == "{" && (cx.type == "at" || cx.type == "atBlock"))) { indent = cx.indent - indentUnit; cx = cx.prev; } return indent; }, electricChars: "}", blockCommentStart: "/*", blockCommentEnd: "*/", fold: "brace" }; }); function keySet(array) { var keys = {}; for (var i = 0; i < array.length; ++i) { keys[array[i]] = true; } return keys; } var documentTypes_ = [ "domain", "regexp", "url", "url-prefix" ], documentTypes = keySet(documentTypes_); var mediaTypes_ = [ "all", "aural", "braille", "handheld", "print", "projection", "screen", "tty", "tv", "embossed" ], mediaTypes = keySet(mediaTypes_); var mediaFeatures_ = [ "width", "min-width", "max-width", "height", "min-height", "max-height", "device-width", "min-device-width", "max-device-width", "device-height", "min-device-height", "max-device-height", "aspect-ratio", "min-aspect-ratio", "max-aspect-ratio", "device-aspect-ratio", "min-device-aspect-ratio", "max-device-aspect-ratio", "color", "min-color", "max-color", "color-index", "min-color-index", "max-color-index", "monochrome", "min-monochrome", "max-monochrome", "resolution", "min-resolution", "max-resolution", "scan", "grid" ], mediaFeatures = keySet(mediaFeatures_); var propertyKeywords_ = [ "align-content", "align-items", "align-self", "alignment-adjust", "alignment-baseline", "anchor-point", "animation", "animation-delay", "animation-direction", "animation-duration", "animation-fill-mode", "animation-iteration-count", "animation-name", "animation-play-state", "animation-timing-function", "appearance", "azimuth", "backface-visibility", "background", "background-attachment", "background-clip", "background-color", "background-image", "background-origin", "background-position", "background-repeat", "background-size", "baseline-shift", "binding", "bleed", "bookmark-label", "bookmark-level", "bookmark-state", "bookmark-target", "border", "border-bottom", "border-bottom-color", "border-bottom-left-radius", "border-bottom-right-radius", "border-bottom-style", "border-bottom-width", "border-collapse", "border-color", "border-image", "border-image-outset", "border-image-repeat", "border-image-slice", "border-image-source", "border-image-width", "border-left", "border-left-color", "border-left-style", "border-left-width", "border-radius", "border-right", "border-right-color", "border-right-style", "border-right-width", "border-spacing", "border-style", "border-top", "border-top-color", "border-top-left-radius", "border-top-right-radius", "border-top-style", "border-top-width", "border-width", "bottom", "box-decoration-break", "box-shadow", "box-sizing", "break-after", "break-before", "break-inside", "caption-side", "clear", "clip", "color", "color-profile", "column-count", "column-fill", "column-gap", "column-rule", "column-rule-color", "column-rule-style", "column-rule-width", "column-span", "column-width", "columns", "content", "counter-increment", "counter-reset", "crop", "cue", "cue-after", "cue-before", "cursor", "direction", "display", "dominant-baseline", "drop-initial-after-adjust", "drop-initial-after-align", "drop-initial-before-adjust", "drop-initial-before-align", "drop-initial-size", "drop-initial-value", "elevation", "empty-cells", "fit", "fit-position", "flex", "flex-basis", "flex-direction", "flex-flow", "flex-grow", "flex-shrink", "flex-wrap", "float", "float-offset", "flow-from", "flow-into", "font", "font-feature-settings", "font-family", "font-kerning", "font-language-override", "font-size", "font-size-adjust", "font-stretch", "font-style", "font-synthesis", "font-variant", "font-variant-alternates", "font-variant-caps", "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric", "font-variant-position", "font-weight", "grid", "grid-area", "grid-auto-columns", "grid-auto-flow", "grid-auto-position", "grid-auto-rows", "grid-column", "grid-column-end", "grid-column-start", "grid-row", "grid-row-end", "grid-row-start", "grid-template", "grid-template-areas", "grid-template-columns", "grid-template-rows", "hanging-punctuation", "height", "hyphens", "icon", "image-orientation", "image-rendering", "image-resolution", "inline-box-align", "justify-content", "left", "letter-spacing", "line-break", "line-height", "line-stacking", "line-stacking-ruby", "line-stacking-shift", "line-stacking-strategy", "list-style", "list-style-image", "list-style-position", "list-style-type", "margin", "margin-bottom", "margin-left", "margin-right", "margin-top", "marker-offset", "marks", "marquee-direction", "marquee-loop", "marquee-play-count", "marquee-speed", "marquee-style", "max-height", "max-width", "min-height", "min-width", "move-to", "nav-down", "nav-index", "nav-left", "nav-right", "nav-up", "object-fit", "object-position", "opacity", "order", "orphans", "outline", "outline-color", "outline-offset", "outline-style", "outline-width", "overflow", "overflow-style", "overflow-wrap", "overflow-x", "overflow-y", "padding", "padding-bottom", "padding-left", "padding-right", "padding-top", "page", "page-break-after", "page-break-before", "page-break-inside", "page-policy", "pause", "pause-after", "pause-before", "perspective", "perspective-origin", "pitch", "pitch-range", "play-during", "position", "presentation-level", "punctuation-trim", "quotes", "region-break-after", "region-break-before", "region-break-inside", "region-fragment", "rendering-intent", "resize", "rest", "rest-after", "rest-before", "richness", "right", "rotation", "rotation-point", "ruby-align", "ruby-overhang", "ruby-position", "ruby-span", "shape-image-threshold", "shape-inside", "shape-margin", "shape-outside", "size", "speak", "speak-as", "speak-header", "speak-numeral", "speak-punctuation", "speech-rate", "stress", "string-set", "tab-size", "table-layout", "target", "target-name", "target-new", "target-position", "text-align", "text-align-last", "text-decoration", "text-decoration-color", "text-decoration-line", "text-decoration-skip", "text-decoration-style", "text-emphasis", "text-emphasis-color", "text-emphasis-position", "text-emphasis-style", "text-height", "text-indent", "text-justify", "text-outline", "text-overflow", "text-shadow", "text-size-adjust", "text-space-collapse", "text-transform", "text-underline-position", "text-wrap", "top", "transform", "transform-origin", "transform-style", "transition", "transition-delay", "transition-duration", "transition-property", "transition-timing-function", "unicode-bidi", "vertical-align", "visibility", "voice-balance", "voice-duration", "voice-family", "voice-pitch", "voice-range", "voice-rate", "voice-stress", "voice-volume", "volume", "white-space", "widows", "width", "word-break", "word-spacing", "word-wrap", "z-index", // SVG-specific "clip-path", "clip-rule", "mask", "enable-background", "filter", "flood-color", "flood-opacity", "lighting-color", "stop-color", "stop-opacity", "pointer-events", "color-interpolation", "color-interpolation-filters", "color-rendering", "fill", "fill-opacity", "fill-rule", "image-rendering", "marker", "marker-end", "marker-mid", "marker-start", "shape-rendering", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "text-rendering", "baseline-shift", "dominant-baseline", "glyph-orientation-horizontal", "glyph-orientation-vertical", "text-anchor", "writing-mode" ], propertyKeywords = keySet(propertyKeywords_); var nonStandardPropertyKeywords_ = [ "scrollbar-arrow-color", "scrollbar-base-color", "scrollbar-dark-shadow-color", "scrollbar-face-color", "scrollbar-highlight-color", "scrollbar-shadow-color", "scrollbar-3d-light-color", "scrollbar-track-color", "shape-inside", "searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button", "searchfield-results-decoration", "zoom" ], nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_); var fontProperties_ = [ "font-family", "src", "unicode-range", "font-variant", "font-feature-settings", "font-stretch", "font-weight", "font-style" ], fontProperties = keySet(fontProperties_); var counterDescriptors_ = [ "additive-symbols", "fallback", "negative", "pad", "prefix", "range", "speak-as", "suffix", "symbols", "system" ], counterDescriptors = keySet(counterDescriptors_); var colorKeywords_ = [ "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "indianred", "indigo", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "turquoise", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen" ], colorKeywords = keySet(colorKeywords_); var valueKeywords_ = [ "above", "absolute", "activeborder", "additive", "activecaption", "afar", "after-white-space", "ahead", "alias", "all", "all-scroll", "alphabetic", "alternate", "always", "amharic", "amharic-abegede", "antialiased", "appworkspace", "arabic-indic", "armenian", "asterisks", "attr", "auto", "avoid", "avoid-column", "avoid-page", "avoid-region", "background", "backwards", "baseline", "below", "bidi-override", "binary", "bengali", "blink", "block", "block-axis", "bold", "bolder", "border", "border-box", "both", "bottom", "break", "break-all", "break-word", "bullets", "button", "button-bevel", "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "calc", "cambodian", "capitalize", "caps-lock-indicator", "caption", "captiontext", "caret", "cell", "center", "checkbox", "circle", "cjk-decimal", "cjk-earthly-branch", "cjk-heavenly-stem", "cjk-ideographic", "clear", "clip", "close-quote", "col-resize", "collapse", "column", "compact", "condensed", "contain", "content", "content-box", "context-menu", "continuous", "copy", "counter", "counters", "cover", "crop", "cross", "crosshair", "currentcolor", "cursive", "cyclic", "dashed", "decimal", "decimal-leading-zero", "default", "default-button", "destination-atop", "destination-in", "destination-out", "destination-over", "devanagari", "disc", "discard", "disclosure-closed", "disclosure-open", "document", "dot-dash", "dot-dot-dash", "dotted", "double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out", "element", "ellipse", "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede", "ethiopic-abegede-am-et", "ethiopic-abegede-gez", "ethiopic-abegede-ti-er", "ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er", "ethiopic-halehame-aa-et", "ethiopic-halehame-am-et", "ethiopic-halehame-gez", "ethiopic-halehame-om-et", "ethiopic-halehame-sid-et", "ethiopic-halehame-so-et", "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et", "ethiopic-halehame-tig", "ethiopic-numeric", "ew-resize", "expanded", "extends", "extra-condensed", "extra-expanded", "fantasy", "fast", "fill", "fixed", "flat", "flex", "footnotes", "forwards", "from", "geometricPrecision", "georgian", "graytext", "groove", "gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hebrew", "help", "hidden", "hide", "higher", "highlight", "highlighttext", "hiragana", "hiragana-iroha", "horizontal", "hsl", "hsla", "icon", "ignore", "inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite", "infobackground", "infotext", "inherit", "initial", "inline", "inline-axis", "inline-block", "inline-flex", "inline-table", "inset", "inside", "intrinsic", "invert", "italic", "japanese-formal", "japanese-informal", "justify", "kannada", "katakana", "katakana-iroha", "keep-all", "khmer", "korean-hangul-formal", "korean-hanja-formal", "korean-hanja-informal", "landscape", "lao", "large", "larger", "left", "level", "lighter", "line-through", "linear", "linear-gradient", "lines", "list-item", "listbox", "listitem", "local", "logical", "loud", "lower", "lower-alpha", "lower-armenian", "lower-greek", "lower-hexadecimal", "lower-latin", "lower-norwegian", "lower-roman", "lowercase", "ltr", "malayalam", "match", "matrix", "matrix3d", "media-controls-background", "media-current-time-display", "media-fullscreen-button", "media-mute-button", "media-play-button", "media-return-to-realtime-button", "media-rewind-button", "media-seek-back-button", "media-seek-forward-button", "media-slider", "media-sliderthumb", "media-time-remaining-display", "media-volume-slider", "media-volume-slider-container", "media-volume-sliderthumb", "medium", "menu", "menulist", "menulist-button", "menulist-text", "menulist-textfield", "menutext", "message-box", "middle", "min-intrinsic", "mix", "mongolian", "monospace", "move", "multiple", "myanmar", "n-resize", "narrower", "ne-resize", "nesw-resize", "no-close-quote", "no-drop", "no-open-quote", "no-repeat", "none", "normal", "not-allowed", "nowrap", "ns-resize", "numbers", "numeric", "nw-resize", "nwse-resize", "oblique", "octal", "open-quote", "optimizeLegibility", "optimizeSpeed", "oriya", "oromo", "outset", "outside", "outside-shape", "overlay", "overline", "padding", "padding-box", "painted", "page", "paused", "persian", "perspective", "plus-darker", "plus-lighter", "pointer", "polygon", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d", "progress", "push-button", "radial-gradient", "radio", "read-only", "read-write", "read-write-plaintext-only", "rectangle", "region", "relative", "repeat", "repeating-linear-gradient", "repeating-radial-gradient", "repeat-x", "repeat-y", "reset", "reverse", "rgb", "rgba", "ridge", "right", "rotate", "rotate3d", "rotateX", "rotateY", "rotateZ", "round", "row-resize", "rtl", "run-in", "running", "s-resize", "sans-serif", "scale", "scale3d", "scaleX", "scaleY", "scaleZ", "scroll", "scrollbar", "se-resize", "searchfield", "searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button", "searchfield-results-decoration", "semi-condensed", "semi-expanded", "separate", "serif", "show", "sidama", "simp-chinese-formal", "simp-chinese-informal", "single", "skew", "skewX", "skewY", "skip-white-space", "slide", "slider-horizontal", "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow", "small", "small-caps", "small-caption", "smaller", "solid", "somali", "source-atop", "source-in", "source-out", "source-over", "space", "spell-out", "square", "square-button", "start", "static", "status-bar", "stretch", "stroke", "sub", "subpixel-antialiased", "super", "sw-resize", "symbolic", "symbols", "table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row", "table-row-group", "tamil", "telugu", "text", "text-bottom", "text-top", "textarea", "textfield", "thai", "thick", "thin", "threeddarkshadow", "threedface", "threedhighlight", "threedlightshadow", "threedshadow", "tibetan", "tigre", "tigrinya-er", "tigrinya-er-abegede", "tigrinya-et", "tigrinya-et-abegede", "to", "top", "trad-chinese-formal", "trad-chinese-informal", "translate", "translate3d", "translateX", "translateY", "translateZ", "transparent", "ultra-condensed", "ultra-expanded", "underline", "up", "upper-alpha", "upper-armenian", "upper-greek", "upper-hexadecimal", "upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url", "var", "vertical", "vertical-text", "visible", "visibleFill", "visiblePainted", "visibleStroke", "visual", "w-resize", "wait", "wave", "wider", "window", "windowframe", "windowtext", "words", "x-large", "x-small", "xor", "xx-large", "xx-small" ], valueKeywords = keySet(valueKeywords_); var allWords = documentTypes_.concat(mediaTypes_).concat(mediaFeatures_).concat(propertyKeywords_) .concat(nonStandardPropertyKeywords_).concat(colorKeywords_).concat(valueKeywords_); CodeMirror.registerHelper("hintWords", "css", allWords); function tokenCComment(stream, state) { var maybeEnd = false, ch; while ((ch = stream.next()) != null) { if (maybeEnd && ch == "/") { state.tokenize = null; break; } maybeEnd = (ch == "*"); } return ["comment", "comment"]; } function tokenSGMLComment(stream, state) { if (stream.skipTo("-->")) { stream.match("-->"); state.tokenize = null; } else { stream.skipToEnd(); } return ["comment", "comment"]; } CodeMirror.defineMIME("text/css", { documentTypes: documentTypes, mediaTypes: mediaTypes, mediaFeatures: mediaFeatures, propertyKeywords: propertyKeywords, nonStandardPropertyKeywords: nonStandardPropertyKeywords, fontProperties: fontProperties, counterDescriptors: counterDescriptors, colorKeywords: colorKeywords, valueKeywords: valueKeywords, tokenHooks: { "<": function(stream, state) { if (!stream.match("!--")) return false; state.tokenize = tokenSGMLComment; return tokenSGMLComment(stream, state); }, "/": function(stream, state) { if (!stream.eat("*")) return false; state.tokenize = tokenCComment; return tokenCComment(stream, state); } }, name: "css" }); CodeMirror.defineMIME("text/x-scss", { mediaTypes: mediaTypes, mediaFeatures: mediaFeatures, propertyKeywords: propertyKeywords, nonStandardPropertyKeywords: nonStandardPropertyKeywords, colorKeywords: colorKeywords, valueKeywords: valueKeywords, fontProperties: fontProperties, allowNested: true, tokenHooks: { "/": function(stream, state) { if (stream.eat("/")) { stream.skipToEnd(); return ["comment", "comment"]; } else if (stream.eat("*")) { state.tokenize = tokenCComment; return tokenCComment(stream, state); } else { return ["operator", "operator"]; } }, ":": function(stream) { if (stream.match(/\s*\{/)) return [null, "{"]; return false; }, "$": function(stream) { stream.match(/^[\w-]+/); if (stream.match(/^\s*:/, false)) return ["variable-2", "variable-definition"]; return ["variable-2", "variable"]; }, "#": function(stream) { if (!stream.eat("{")) return false; return [null, "interpolation"]; } }, name: "css", helperType: "scss" }); CodeMirror.defineMIME("text/x-less", { mediaTypes: mediaTypes, mediaFeatures: mediaFeatures, propertyKeywords: propertyKeywords, nonStandardPropertyKeywords: nonStandardPropertyKeywords, colorKeywords: colorKeywords, valueKeywords: valueKeywords, fontProperties: fontProperties, allowNested: true, tokenHooks: { "/": function(stream, state) { if (stream.eat("/")) { stream.skipToEnd(); return ["comment", "comment"]; } else if (stream.eat("*")) { state.tokenize = tokenCComment; return tokenCComment(stream, state); } else { return ["operator", "operator"]; } }, "@": function(stream) { if (stream.eat("{")) return [null, "interpolation"]; if (stream.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/, false)) return false; stream.eatWhile(/[\w\\\-]/); if (stream.match(/^\s*:/, false)) return ["variable-2", "variable-definition"]; return ["variable-2", "variable"]; }, "&": function() { return ["atom", "atom"]; } }, name: "css", helperType: "less" }); }); ================================================ FILE: base/res/codemirror/mode/css/index.html ================================================ CodeMirror: CSS mode

CSS mode

MIME types defined: text/css, text/x-scss (demo), text/x-less (demo).

Parsing/Highlighting Tests: normal, verbose.

================================================ FILE: base/res/codemirror/mode/css/less.html ================================================ CodeMirror: LESS mode

LESS mode

The LESS mode is a sub-mode of the CSS mode (defined in css.js).

Parsing/Highlighting Tests: normal, verbose.

================================================ FILE: base/res/codemirror/mode/css/less_test.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { "use strict"; var mode = CodeMirror.getMode({indentUnit: 2}, "text/x-less"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), "less"); } MT("variable", "[variable-2 @base]: [atom #f04615];", "[qualifier .class] {", " [property width]: [variable percentage]([number 0.5]); [comment // returns `50%`]", " [property color]: [variable saturate]([variable-2 @base], [number 5%]);", "}"); MT("amp", "[qualifier .child], [qualifier .sibling] {", " [qualifier .parent] [atom &] {", " [property color]: [keyword black];", " }", " [atom &] + [atom &] {", " [property color]: [keyword red];", " }", "}"); MT("mixin", "[qualifier .mixin] ([variable dark]; [variable-2 @color]) {", " [property color]: [variable darken]([variable-2 @color], [number 10%]);", "}", "[qualifier .mixin] ([variable light]; [variable-2 @color]) {", " [property color]: [variable lighten]([variable-2 @color], [number 10%]);", "}", "[qualifier .mixin] ([variable-2 @_]; [variable-2 @color]) {", " [property display]: [atom block];", "}", "[variable-2 @switch]: [variable light];", "[qualifier .class] {", " [qualifier .mixin]([variable-2 @switch]; [atom #888]);", "}"); MT("nest", "[qualifier .one] {", " [def @media] ([property width]: [number 400px]) {", " [property font-size]: [number 1.2em];", " [def @media] [attribute print] [keyword and] [property color] {", " [property color]: [keyword blue];", " }", " }", "}"); MT("interpolation", ".@{[variable foo]} { [property font-weight]: [atom bold]; }"); })(); ================================================ FILE: base/res/codemirror/mode/css/scss.html ================================================ CodeMirror: SCSS mode

SCSS mode

The SCSS mode is a sub-mode of the CSS mode (defined in css.js).

Parsing/Highlighting Tests: normal, verbose.

================================================ FILE: base/res/codemirror/mode/css/scss_test.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({indentUnit: 2}, "text/x-scss"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), "scss"); } MT('url_with_quotation', "[tag foo] { [property background]:[atom url]([string test.jpg]) }"); MT('url_with_double_quotes', "[tag foo] { [property background]:[atom url]([string \"test.jpg\"]) }"); MT('url_with_single_quotes', "[tag foo] { [property background]:[atom url]([string \'test.jpg\']) }"); MT('string', "[def @import] [string \"compass/css3\"]"); MT('important_keyword', "[tag foo] { [property background]:[atom url]([string \'test.jpg\']) [keyword !important] }"); MT('variable', "[variable-2 $blue]:[atom #333]"); MT('variable_as_attribute', "[tag foo] { [property color]:[variable-2 $blue] }"); MT('numbers', "[tag foo] { [property padding]:[number 10px] [number 10] [number 10em] [number 8in] }"); MT('number_percentage', "[tag foo] { [property width]:[number 80%] }"); MT('selector', "[builtin #hello][qualifier .world]{}"); MT('singleline_comment', "[comment // this is a comment]"); MT('multiline_comment', "[comment /*foobar*/]"); MT('attribute_with_hyphen', "[tag foo] { [property font-size]:[number 10px] }"); MT('string_after_attribute', "[tag foo] { [property content]:[string \"::\"] }"); MT('directives', "[def @include] [qualifier .mixin]"); MT('basic_structure', "[tag p] { [property background]:[keyword red]; }"); MT('nested_structure', "[tag p] { [tag a] { [property color]:[keyword red]; } }"); MT('mixin', "[def @mixin] [tag table-base] {}"); MT('number_without_semicolon', "[tag p] {[property width]:[number 12]}", "[tag a] {[property color]:[keyword red];}"); MT('atom_in_nested_block', "[tag p] { [tag a] { [property color]:[atom #000]; } }"); MT('interpolation_in_property', "[tag foo] { #{[variable-2 $hello]}:[number 2]; }"); MT('interpolation_in_selector', "[tag foo]#{[variable-2 $hello]} { [property color]:[atom #000]; }"); MT('interpolation_error', "[tag foo]#{[variable foo]} { [property color]:[atom #000]; }"); MT("divide_operator", "[tag foo] { [property width]:[number 4] [operator /] [number 2] }"); MT('nested_structure_with_id_selector', "[tag p] { [builtin #hello] { [property color]:[keyword red]; } }"); MT('indent_mixin', "[def @mixin] [tag container] (", " [variable-2 $a]: [number 10],", " [variable-2 $b]: [number 10])", "{}"); MT('indent_nested', "[tag foo] {", " [tag bar] {", " }", "}"); MT('indent_parentheses', "[tag foo] {", " [property color]: [variable darken]([variable-2 $blue],", " [number 9%]);", "}"); MT('indent_vardef', "[variable-2 $name]:", " [string 'val'];", "[tag tag] {", " [tag inner] {", " [property margin]: [number 3px];", " }", "}"); })(); ================================================ FILE: base/res/codemirror/mode/css/test.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({indentUnit: 2}, "css"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } // Error, because "foobarhello" is neither a known type or property, but // property was expected (after "and"), and it should be in parenthese. MT("atMediaUnknownType", "[def @media] [attribute screen] [keyword and] [error foobarhello] { }"); // Soft error, because "foobarhello" is not a known property or type. MT("atMediaUnknownProperty", "[def @media] [attribute screen] [keyword and] ([error foobarhello]) { }"); // Make sure nesting works with media queries MT("atMediaMaxWidthNested", "[def @media] [attribute screen] [keyword and] ([property max-width]: [number 25px]) { [tag foo] { } }"); MT("tagSelector", "[tag foo] { }"); MT("classSelector", "[qualifier .foo-bar_hello] { }"); MT("idSelector", "[builtin #foo] { [error #foo] }"); MT("tagSelectorUnclosed", "[tag foo] { [property margin]: [number 0] } [tag bar] { }"); MT("tagStringNoQuotes", "[tag foo] { [property font-family]: [variable hello] [variable world]; }"); MT("tagStringDouble", "[tag foo] { [property font-family]: [string \"hello world\"]; }"); MT("tagStringSingle", "[tag foo] { [property font-family]: [string 'hello world']; }"); MT("tagColorKeyword", "[tag foo] {", " [property color]: [keyword black];", " [property color]: [keyword navy];", " [property color]: [keyword yellow];", "}"); MT("tagColorHex3", "[tag foo] { [property background]: [atom #fff]; }"); MT("tagColorHex6", "[tag foo] { [property background]: [atom #ffffff]; }"); MT("tagColorHex4", "[tag foo] { [property background]: [atom&error #ffff]; }"); MT("tagColorHexInvalid", "[tag foo] { [property background]: [atom&error #ffg]; }"); MT("tagNegativeNumber", "[tag foo] { [property margin]: [number -5px]; }"); MT("tagPositiveNumber", "[tag foo] { [property padding]: [number 5px]; }"); MT("tagVendor", "[tag foo] { [meta -foo-][property box-sizing]: [meta -foo-][atom border-box]; }"); MT("tagBogusProperty", "[tag foo] { [property&error barhelloworld]: [number 0]; }"); MT("tagTwoProperties", "[tag foo] { [property margin]: [number 0]; [property padding]: [number 0]; }"); MT("tagTwoPropertiesURL", "[tag foo] { [property background]: [atom url]([string //example.com/foo.png]); [property padding]: [number 0]; }"); MT("commentSGML", "[comment ]"); MT("commentSGML2", "[comment ] [tag div] {}"); MT("indent_tagSelector", "[tag strong], [tag em] {", " [property background]: [atom rgba](", " [number 255], [number 255], [number 0], [number .2]", " );", "}"); MT("indent_atMedia", "[def @media] {", " [tag foo] {", " [property color]:", " [keyword yellow];", " }", "}"); MT("indent_comma", "[tag foo] {", " [property font-family]: [variable verdana],", " [atom sans-serif];", "}"); MT("indent_parentheses", "[tag foo]:[variable-3 before] {", " [property background]: [atom url](", "[string blahblah]", "[string etc]", "[string ]) [keyword !important];", "}"); MT("font_face", "[def @font-face] {", " [property font-family]: [string 'myfont'];", " [error nonsense]: [string 'abc'];", " [property src]: [atom url]([string http://blah]),", " [atom url]([string http://foo]);", "}"); MT("empty_url", "[def @import] [tag url]() [tag screen];"); MT("parens", "[qualifier .foo] {", " [property background-image]: [variable fade]([atom #000], [number 20%]);", " [property border-image]: [atom linear-gradient](", " [atom to] [atom bottom],", " [variable fade]([atom #000], [number 20%]) [number 0%],", " [variable fade]([atom #000], [number 20%]) [number 100%]", " );", "}"); MT("css_variable", ":[variable-3 root] {", " [variable-2 --main-color]: [atom #06c];", "}", "[tag h1][builtin #foo] {", " [property color]: [atom var]([variable-2 --main-color]);", "}"); MT("supports", "[def @supports] ([keyword not] (([property text-align-last]: [atom justify]) [keyword or] ([meta -moz-][property text-align-last]: [atom justify])) {", " [property text-align-last]: [atom justify];", "}"); MT("document", "[def @document] [tag url]([string http://blah]),", " [tag url-prefix]([string https://]),", " [tag domain]([string blah.com]),", " [tag regexp]([string \".*blah.+\"]) {", " [builtin #id] {", " [property background-color]: [keyword white];", " }", " [tag foo] {", " [property font-family]: [variable Verdana], [atom sans-serif];", " }", " }"); MT("document_url", "[def @document] [tag url]([string http://blah]) { [qualifier .class] { } }"); MT("document_urlPrefix", "[def @document] [tag url-prefix]([string https://]) { [builtin #id] { } }"); MT("document_domain", "[def @document] [tag domain]([string blah.com]) { [tag foo] { } }"); MT("document_regexp", "[def @document] [tag regexp]([string \".*blah.+\"]) { [builtin #id] { } }"); MT("counter-style", "[def @counter-style] [variable binary] {", " [property system]: [atom numeric];", " [property symbols]: [number 0] [number 1];", " [property suffix]: [string \".\"];", " [property range]: [atom infinite];", " [property speak-as]: [atom numeric];", "}"); MT("counter-style-additive-symbols", "[def @counter-style] [variable simple-roman] {", " [property system]: [atom additive];", " [property additive-symbols]: [number 10] [variable X], [number 5] [variable V], [number 1] [variable I];", " [property range]: [number 1] [number 49];", "}"); MT("counter-style-use", "[tag ol][qualifier .roman] { [property list-style]: [variable simple-roman]; }"); MT("counter-style-symbols", "[tag ol] { [property list-style]: [atom symbols]([atom cyclic] [string \"*\"] [string \"\\2020\"] [string \"\\2021\"] [string \"\\A7\"]); }"); })(); ================================================ FILE: base/res/codemirror/mode/cypher/cypher.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // By the Neo4j Team and contributors. // https://github.com/neo4j-contrib/CodeMirror (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var wordRegexp = function(words) { return new RegExp("^(?:" + words.join("|") + ")$", "i"); }; CodeMirror.defineMode("cypher", function(config) { var tokenBase = function(stream/*, state*/) { var ch = stream.next(), curPunc = null; if (ch === "\"" || ch === "'") { stream.match(/.+?["']/); return "string"; } if (/[{}\(\),\.;\[\]]/.test(ch)) { curPunc = ch; return "node"; } else if (ch === "/" && stream.eat("/")) { stream.skipToEnd(); return "comment"; } else if (operatorChars.test(ch)) { stream.eatWhile(operatorChars); return null; } else { stream.eatWhile(/[_\w\d]/); if (stream.eat(":")) { stream.eatWhile(/[\w\d_\-]/); return "atom"; } var word = stream.current(); if (funcs.test(word)) return "builtin"; if (preds.test(word)) return "def"; if (keywords.test(word)) return "keyword"; return "variable"; } }; var pushContext = function(state, type, col) { return state.context = { prev: state.context, indent: state.indent, col: col, type: type }; }; var popContext = function(state) { state.indent = state.context.indent; return state.context = state.context.prev; }; var indentUnit = config.indentUnit; var curPunc; var funcs = wordRegexp(["abs", "acos", "allShortestPaths", "asin", "atan", "atan2", "avg", "ceil", "coalesce", "collect", "cos", "cot", "count", "degrees", "e", "endnode", "exp", "extract", "filter", "floor", "haversin", "head", "id", "keys", "labels", "last", "left", "length", "log", "log10", "lower", "ltrim", "max", "min", "node", "nodes", "percentileCont", "percentileDisc", "pi", "radians", "rand", "range", "reduce", "rel", "relationship", "relationships", "replace", "right", "round", "rtrim", "shortestPath", "sign", "sin", "split", "sqrt", "startnode", "stdev", "stdevp", "str", "substring", "sum", "tail", "tan", "timestamp", "toFloat", "toInt", "trim", "type", "upper"]); var preds = wordRegexp(["all", "and", "any", "has", "in", "none", "not", "or", "single", "xor"]); var keywords = wordRegexp(["as", "asc", "ascending", "assert", "by", "case", "commit", "constraint", "create", "csv", "cypher", "delete", "desc", "descending", "distinct", "drop", "else", "end", "explain", "false", "fieldterminator", "foreach", "from", "headers", "in", "index", "is", "limit", "load", "match", "merge", "null", "on", "optional", "order", "periodic", "profile", "remove", "return", "scan", "set", "skip", "start", "then", "true", "union", "unique", "unwind", "using", "when", "where", "with"]); var operatorChars = /[*+\-<>=&|~%^]/; return { startState: function(/*base*/) { return { tokenize: tokenBase, context: null, indent: 0, col: 0 }; }, token: function(stream, state) { if (stream.sol()) { if (state.context && (state.context.align == null)) { state.context.align = false; } state.indent = stream.indentation(); } if (stream.eatSpace()) { return null; } var style = state.tokenize(stream, state); if (style !== "comment" && state.context && (state.context.align == null) && state.context.type !== "pattern") { state.context.align = true; } if (curPunc === "(") { pushContext(state, ")", stream.column()); } else if (curPunc === "[") { pushContext(state, "]", stream.column()); } else if (curPunc === "{") { pushContext(state, "}", stream.column()); } else if (/[\]\}\)]/.test(curPunc)) { while (state.context && state.context.type === "pattern") { popContext(state); } if (state.context && curPunc === state.context.type) { popContext(state); } } else if (curPunc === "." && state.context && state.context.type === "pattern") { popContext(state); } else if (/atom|string|variable/.test(style) && state.context) { if (/[\}\]]/.test(state.context.type)) { pushContext(state, "pattern", stream.column()); } else if (state.context.type === "pattern" && !state.context.align) { state.context.align = true; state.context.col = stream.column(); } } return style; }, indent: function(state, textAfter) { var firstChar = textAfter && textAfter.charAt(0); var context = state.context; if (/[\]\}]/.test(firstChar)) { while (context && context.type === "pattern") { context = context.prev; } } var closing = context && firstChar === context.type; if (!context) return 0; if (context.type === "keywords") return CodeMirror.commands.newlineAndIndent; if (context.align) return context.col + (closing ? 0 : 1); return context.indent + (closing ? 0 : indentUnit); } }; }); CodeMirror.modeExtensions["cypher"] = { autoFormatLineBreaks: function(text) { var i, lines, reProcessedPortion; var lines = text.split("\n"); var reProcessedPortion = /\s+\b(return|where|order by|match|with|skip|limit|create|delete|set)\b\s/g; for (var i = 0; i < lines.length; i++) lines[i] = lines[i].replace(reProcessedPortion, " \n$1 ").trim(); return lines.join("\n"); } }; CodeMirror.defineMIME("application/x-cypher-query", "cypher"); }); ================================================ FILE: base/res/codemirror/mode/cypher/index.html ================================================ CodeMirror: Cypher Mode for CodeMirror

Cypher Mode for CodeMirror

MIME types defined: application/x-cypher-query

================================================ FILE: base/res/codemirror/mode/d/d.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("d", function(config, parserConfig) { var indentUnit = config.indentUnit, statementIndentUnit = parserConfig.statementIndentUnit || indentUnit, keywords = parserConfig.keywords || {}, builtin = parserConfig.builtin || {}, blockKeywords = parserConfig.blockKeywords || {}, atoms = parserConfig.atoms || {}, hooks = parserConfig.hooks || {}, multiLineStrings = parserConfig.multiLineStrings; var isOperatorChar = /[+\-*&%=<>!?|\/]/; var curPunc; function tokenBase(stream, state) { var ch = stream.next(); if (hooks[ch]) { var result = hooks[ch](stream, state); if (result !== false) return result; } if (ch == '"' || ch == "'" || ch == "`") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } if (/[\[\]{}\(\),;\:\.]/.test(ch)) { curPunc = ch; return null; } if (/\d/.test(ch)) { stream.eatWhile(/[\w\.]/); return "number"; } if (ch == "/") { if (stream.eat("+")) { state.tokenize = tokenComment; return tokenNestedComment(stream, state); } if (stream.eat("*")) { state.tokenize = tokenComment; return tokenComment(stream, state); } if (stream.eat("/")) { stream.skipToEnd(); return "comment"; } } if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return "operator"; } stream.eatWhile(/[\w\$_\xa1-\uffff]/); var cur = stream.current(); if (keywords.propertyIsEnumerable(cur)) { if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; return "keyword"; } if (builtin.propertyIsEnumerable(cur)) { if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; return "builtin"; } if (atoms.propertyIsEnumerable(cur)) return "atom"; return "variable"; } function tokenString(quote) { return function(stream, state) { var escaped = false, next, end = false; while ((next = stream.next()) != null) { if (next == quote && !escaped) {end = true; break;} escaped = !escaped && next == "\\"; } if (end || !(escaped || multiLineStrings)) state.tokenize = null; return "string"; }; } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = null; break; } maybeEnd = (ch == "*"); } return "comment"; } function tokenNestedComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = null; break; } maybeEnd = (ch == "+"); } return "comment"; } function Context(indented, column, type, align, prev) { this.indented = indented; this.column = column; this.type = type; this.align = align; this.prev = prev; } function pushContext(state, col, type) { var indent = state.indented; if (state.context && state.context.type == "statement") indent = state.context.indented; return state.context = new Context(indent, col, type, null, state.context); } function popContext(state) { var t = state.context.type; if (t == ")" || t == "]" || t == "}") state.indented = state.context.indented; return state.context = state.context.prev; } // Interface return { startState: function(basecolumn) { return { tokenize: null, context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), indented: 0, startOfLine: true }; }, token: function(stream, state) { var ctx = state.context; if (stream.sol()) { if (ctx.align == null) ctx.align = false; state.indented = stream.indentation(); state.startOfLine = true; } if (stream.eatSpace()) return null; curPunc = null; var style = (state.tokenize || tokenBase)(stream, state); if (style == "comment" || style == "meta") return style; if (ctx.align == null) ctx.align = true; if ((curPunc == ";" || curPunc == ":" || curPunc == ",") && ctx.type == "statement") popContext(state); else if (curPunc == "{") pushContext(state, stream.column(), "}"); else if (curPunc == "[") pushContext(state, stream.column(), "]"); else if (curPunc == "(") pushContext(state, stream.column(), ")"); else if (curPunc == "}") { while (ctx.type == "statement") ctx = popContext(state); if (ctx.type == "}") ctx = popContext(state); while (ctx.type == "statement") ctx = popContext(state); } else if (curPunc == ctx.type) popContext(state); else if (((ctx.type == "}" || ctx.type == "top") && curPunc != ';') || (ctx.type == "statement" && curPunc == "newstatement")) pushContext(state, stream.column(), "statement"); state.startOfLine = false; return style; }, indent: function(state, textAfter) { if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass; var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev; var closing = firstChar == ctx.type; if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit); else if (ctx.align) return ctx.column + (closing ? 0 : 1); else return ctx.indented + (closing ? 0 : indentUnit); }, electricChars: "{}" }; }); function words(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } var blockKeywords = "body catch class do else enum for foreach foreach_reverse if in interface mixin " + "out scope struct switch try union unittest version while with"; CodeMirror.defineMIME("text/x-d", { name: "d", keywords: words("abstract alias align asm assert auto break case cast cdouble cent cfloat const continue " + "debug default delegate delete deprecated export extern final finally function goto immutable " + "import inout invariant is lazy macro module new nothrow override package pragma private " + "protected public pure ref return shared short static super synchronized template this " + "throw typedef typeid typeof volatile __FILE__ __LINE__ __gshared __traits __vector __parameters " + blockKeywords), blockKeywords: words(blockKeywords), builtin: words("bool byte char creal dchar double float idouble ifloat int ireal long real short ubyte " + "ucent uint ulong ushort wchar wstring void size_t sizediff_t"), atoms: words("exit failure success true false null"), hooks: { "@": function(stream, _state) { stream.eatWhile(/[\w\$_]/); return "meta"; } } }); }); ================================================ FILE: base/res/codemirror/mode/d/index.html ================================================ CodeMirror: D mode

D mode

Simple mode that handle D-Syntax (DLang Homepage).

MIME types defined: text/x-d .

================================================ FILE: base/res/codemirror/mode/dart/dart.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../clike/clike")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../clike/clike"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var keywords = ("this super static final const abstract class extends external factory " + "implements get native operator set typedef with enum throw rethrow " + "assert break case continue default in return new deferred async await " + "try catch finally do else for if switch while import library export " + "part of show hide is").split(" "); var blockKeywords = "try catch finally do else for if switch while".split(" "); var atoms = "true false null".split(" "); var builtins = "void bool num int double dynamic var String".split(" "); function set(words) { var obj = {}; for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } CodeMirror.defineMIME("application/dart", { name: "clike", keywords: set(keywords), multiLineStrings: true, blockKeywords: set(blockKeywords), builtin: set(builtins), atoms: set(atoms), hooks: { "@": function(stream) { stream.eatWhile(/[\w\$_]/); return "meta"; } } }); CodeMirror.registerHelper("hintWords", "application/dart", keywords.concat(atoms).concat(builtins)); // This is needed to make loading through meta.js work. CodeMirror.defineMode("dart", function(conf) { return CodeMirror.getMode(conf, "application/dart"); }, "clike"); }); ================================================ FILE: base/res/codemirror/mode/dart/index.html ================================================ CodeMirror: Dart mode

Dart mode

================================================ FILE: base/res/codemirror/mode/diff/diff.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("diff", function() { var TOKEN_NAMES = { '+': 'positive', '-': 'negative', '@': 'meta' }; return { token: function(stream) { var tw_pos = stream.string.search(/[\t ]+?$/); if (!stream.sol() || tw_pos === 0) { stream.skipToEnd(); return ("error " + ( TOKEN_NAMES[stream.string.charAt(0)] || '')).replace(/ $/, ''); } var token_name = TOKEN_NAMES[stream.peek()] || stream.skipToEnd(); if (tw_pos === -1) { stream.skipToEnd(); } else { stream.pos = tw_pos; } return token_name; } }; }); CodeMirror.defineMIME("text/x-diff", "diff"); }); ================================================ FILE: base/res/codemirror/mode/diff/index.html ================================================ CodeMirror: Diff mode

Diff mode

MIME types defined: text/x-diff.

================================================ FILE: base/res/codemirror/mode/django/django.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../../addon/mode/overlay")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../../addon/mode/overlay"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("django:inner", function() { var keywords = ["block", "endblock", "for", "endfor", "true", "false", "loop", "none", "self", "super", "if", "endif", "as", "else", "import", "with", "endwith", "without", "context", "ifequal", "endifequal", "ifnotequal", "endifnotequal", "extends", "include", "load", "comment", "endcomment", "empty", "url", "static", "trans", "blocktrans", "now", "regroup", "lorem", "ifchanged", "endifchanged", "firstof", "debug", "cycle", "csrf_token", "autoescape", "endautoescape", "spaceless", "ssi", "templatetag", "verbatim", "endverbatim", "widthratio"], filters = ["add", "addslashes", "capfirst", "center", "cut", "date", "default", "default_if_none", "dictsort", "dictsortreversed", "divisibleby", "escape", "escapejs", "filesizeformat", "first", "floatformat", "force_escape", "get_digit", "iriencode", "join", "last", "length", "length_is", "linebreaks", "linebreaksbr", "linenumbers", "ljust", "lower", "make_list", "phone2numeric", "pluralize", "pprint", "random", "removetags", "rjust", "safe", "safeseq", "slice", "slugify", "stringformat", "striptags", "time", "timesince", "timeuntil", "title", "truncatechars", "truncatechars_html", "truncatewords", "truncatewords_html", "unordered_list", "upper", "urlencode", "urlize", "urlizetrunc", "wordcount", "wordwrap", "yesno"], operators = ["==", "!=", "<", ">", "<=", ">=", "in", "not", "or", "and"]; keywords = new RegExp("^\\b(" + keywords.join("|") + ")\\b"); filters = new RegExp("^\\b(" + filters.join("|") + ")\\b"); operators = new RegExp("^\\b(" + operators.join("|") + ")\\b"); // We have to return "null" instead of null, in order to avoid string // styling as the default, when using Django templates inside HTML // element attributes function tokenBase (stream, state) { // Attempt to identify a variable, template or comment tag respectively if (stream.match("{{")) { state.tokenize = inVariable; return "tag"; } else if (stream.match("{%")) { state.tokenize = inTag; return "tag"; } else if (stream.match("{#")) { state.tokenize = inComment; return "comment"; } // Ignore completely any stream series that do not match the // Django template opening tags. while (stream.next() != null && !stream.match("{{", false) && !stream.match("{%", false)) {} return null; } // A string can be included in either single or double quotes (this is // the delimeter). Mark everything as a string until the start delimeter // occurs again. function inString (delimeter, previousTokenizer) { return function (stream, state) { if (!state.escapeNext && stream.eat(delimeter)) { state.tokenize = previousTokenizer; } else { if (state.escapeNext) { state.escapeNext = false; } var ch = stream.next(); // Take into account the backslash for escaping characters, such as // the string delimeter. if (ch == "\\") { state.escapeNext = true; } } return "string"; }; } // Apply Django template variable syntax highlighting function inVariable (stream, state) { // Attempt to match a dot that precedes a property if (state.waitDot) { state.waitDot = false; if (stream.peek() != ".") { return "null"; } // Dot folowed by a non-word character should be considered an error. if (stream.match(/\.\W+/)) { return "error"; } else if (stream.eat(".")) { state.waitProperty = true; return "null"; } else { throw Error ("Unexpected error while waiting for property."); } } // Attempt to match a pipe that precedes a filter if (state.waitPipe) { state.waitPipe = false; if (stream.peek() != "|") { return "null"; } // Pipe folowed by a non-word character should be considered an error. if (stream.match(/\.\W+/)) { return "error"; } else if (stream.eat("|")) { state.waitFilter = true; return "null"; } else { throw Error ("Unexpected error while waiting for filter."); } } // Highlight properties if (state.waitProperty) { state.waitProperty = false; if (stream.match(/\b(\w+)\b/)) { state.waitDot = true; // A property can be followed by another property state.waitPipe = true; // A property can be followed by a filter return "property"; } } // Highlight filters if (state.waitFilter) { state.waitFilter = false; if (stream.match(filters)) { return "variable-2"; } } // Ignore all white spaces if (stream.eatSpace()) { state.waitProperty = false; return "null"; } // Identify numbers if (stream.match(/\b\d+(\.\d+)?\b/)) { return "number"; } // Identify strings if (stream.match("'")) { state.tokenize = inString("'", state.tokenize); return "string"; } else if (stream.match('"')) { state.tokenize = inString('"', state.tokenize); return "string"; } // Attempt to find the variable if (stream.match(/\b(\w+)\b/) && !state.foundVariable) { state.waitDot = true; state.waitPipe = true; // A property can be followed by a filter return "variable"; } // If found closing tag reset if (stream.match("}}")) { state.waitProperty = null; state.waitFilter = null; state.waitDot = null; state.waitPipe = null; state.tokenize = tokenBase; return "tag"; } // If nothing was found, advance to the next character stream.next(); return "null"; } function inTag (stream, state) { // Attempt to match a dot that precedes a property if (state.waitDot) { state.waitDot = false; if (stream.peek() != ".") { return "null"; } // Dot folowed by a non-word character should be considered an error. if (stream.match(/\.\W+/)) { return "error"; } else if (stream.eat(".")) { state.waitProperty = true; return "null"; } else { throw Error ("Unexpected error while waiting for property."); } } // Attempt to match a pipe that precedes a filter if (state.waitPipe) { state.waitPipe = false; if (stream.peek() != "|") { return "null"; } // Pipe folowed by a non-word character should be considered an error. if (stream.match(/\.\W+/)) { return "error"; } else if (stream.eat("|")) { state.waitFilter = true; return "null"; } else { throw Error ("Unexpected error while waiting for filter."); } } // Highlight properties if (state.waitProperty) { state.waitProperty = false; if (stream.match(/\b(\w+)\b/)) { state.waitDot = true; // A property can be followed by another property state.waitPipe = true; // A property can be followed by a filter return "property"; } } // Highlight filters if (state.waitFilter) { state.waitFilter = false; if (stream.match(filters)) { return "variable-2"; } } // Ignore all white spaces if (stream.eatSpace()) { state.waitProperty = false; return "null"; } // Identify numbers if (stream.match(/\b\d+(\.\d+)?\b/)) { return "number"; } // Identify strings if (stream.match("'")) { state.tokenize = inString("'", state.tokenize); return "string"; } else if (stream.match('"')) { state.tokenize = inString('"', state.tokenize); return "string"; } // Attempt to match an operator if (stream.match(operators)) { return "operator"; } // Attempt to match a keyword var keywordMatch = stream.match(keywords); if (keywordMatch) { if (keywordMatch[0] == "comment") { state.blockCommentTag = true; } return "keyword"; } // Attempt to match a variable if (stream.match(/\b(\w+)\b/)) { state.waitDot = true; state.waitPipe = true; // A property can be followed by a filter return "variable"; } // If found closing tag reset if (stream.match("%}")) { state.waitProperty = null; state.waitFilter = null; state.waitDot = null; state.waitPipe = null; // If the tag that closes is a block comment tag, we want to mark the // following code as comment, until the tag closes. if (state.blockCommentTag) { state.blockCommentTag = false; // Release the "lock" state.tokenize = inBlockComment; } else { state.tokenize = tokenBase; } return "tag"; } // If nothing was found, advance to the next character stream.next(); return "null"; } // Mark everything as comment inside the tag and the tag itself. function inComment (stream, state) { if (stream.match("#}")) { state.tokenize = tokenBase; } return "comment"; } // Mark everything as a comment until the `blockcomment` tag closes. function inBlockComment (stream, state) { if (stream.match(/\{%\s*endcomment\s*%\}/, false)) { state.tokenize = inTag; stream.match("{%"); return "tag"; } else { stream.next(); return "comment"; } } return { startState: function () { return {tokenize: tokenBase}; }, token: function (stream, state) { return state.tokenize(stream, state); }, blockCommentStart: "{% comment %}", blockCommentEnd: "{% endcomment %}" }; }); CodeMirror.defineMode("django", function(config) { var htmlBase = CodeMirror.getMode(config, "text/html"); var djangoInner = CodeMirror.getMode(config, "django:inner"); return CodeMirror.overlayMode(htmlBase, djangoInner); }); CodeMirror.defineMIME("text/x-django", "django"); }); ================================================ FILE: base/res/codemirror/mode/django/index.html ================================================ CodeMirror: Django template mode

Django template mode

Mode for HTML with embedded Django template markup.

MIME types defined: text/x-django

================================================ FILE: base/res/codemirror/mode/dockerfile/dockerfile.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../../addon/mode/simple")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../../addon/mode/simple"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; // Collect all Dockerfile directives var instructions = ["from", "maintainer", "run", "cmd", "expose", "env", "add", "copy", "entrypoint", "volume", "user", "workdir", "onbuild"], instructionRegex = "(" + instructions.join('|') + ")", instructionOnlyLine = new RegExp(instructionRegex + "\\s*$", "i"), instructionWithArguments = new RegExp(instructionRegex + "(\\s+)", "i"); CodeMirror.defineSimpleMode("dockerfile", { start: [ // Block comment: This is a line starting with a comment { regex: /#.*$/, token: "comment" }, // Highlight an instruction without any arguments (for convenience) { regex: instructionOnlyLine, token: "variable-2" }, // Highlight an instruction followed by arguments { regex: instructionWithArguments, token: ["variable-2", null], next: "arguments" }, { regex: /./, token: null } ], arguments: [ { // Line comment without instruction arguments is an error regex: /#.*$/, token: "error", next: "start" }, { regex: /[^#]+\\$/, token: null }, { // Match everything except for the inline comment regex: /[^#]+/, token: null, next: "start" }, { regex: /$/, token: null, next: "start" }, // Fail safe return to start { token: null, next: "start" } ] }); CodeMirror.defineMIME("text/x-dockerfile", "dockerfile"); }); ================================================ FILE: base/res/codemirror/mode/dockerfile/index.html ================================================ CodeMirror: Dockerfile mode

Dockerfile mode

Dockerfile syntax highlighting for CodeMirror. Depends on the simplemode addon.

MIME types defined: text/x-dockerfile

================================================ FILE: base/res/codemirror/mode/dtd/dtd.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /* DTD mode Ported to CodeMirror by Peter Kroon Report bugs/issues here: https://github.com/codemirror/CodeMirror/issues GitHub: @peterkroon */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("dtd", function(config) { var indentUnit = config.indentUnit, type; function ret(style, tp) {type = tp; return style;} function tokenBase(stream, state) { var ch = stream.next(); if (ch == "<" && stream.eat("!") ) { if (stream.eatWhile(/[\-]/)) { state.tokenize = tokenSGMLComment; return tokenSGMLComment(stream, state); } else if (stream.eatWhile(/[\w]/)) return ret("keyword", "doindent"); } else if (ch == "<" && stream.eat("?")) { //xml declaration state.tokenize = inBlock("meta", "?>"); return ret("meta", ch); } else if (ch == "#" && stream.eatWhile(/[\w]/)) return ret("atom", "tag"); else if (ch == "|") return ret("keyword", "seperator"); else if (ch.match(/[\(\)\[\]\-\.,\+\?>]/)) return ret(null, ch);//if(ch === ">") return ret(null, "endtag"); else else if (ch.match(/[\[\]]/)) return ret("rule", ch); else if (ch == "\"" || ch == "'") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } else if (stream.eatWhile(/[a-zA-Z\?\+\d]/)) { var sc = stream.current(); if( sc.substr(sc.length-1,sc.length).match(/\?|\+/) !== null )stream.backUp(1); return ret("tag", "tag"); } else if (ch == "%" || ch == "*" ) return ret("number", "number"); else { stream.eatWhile(/[\w\\\-_%.{,]/); return ret(null, null); } } function tokenSGMLComment(stream, state) { var dashes = 0, ch; while ((ch = stream.next()) != null) { if (dashes >= 2 && ch == ">") { state.tokenize = tokenBase; break; } dashes = (ch == "-") ? dashes + 1 : 0; } return ret("comment", "comment"); } function tokenString(quote) { return function(stream, state) { var escaped = false, ch; while ((ch = stream.next()) != null) { if (ch == quote && !escaped) { state.tokenize = tokenBase; break; } escaped = !escaped && ch == "\\"; } return ret("string", "tag"); }; } function inBlock(style, terminator) { return function(stream, state) { while (!stream.eol()) { if (stream.match(terminator)) { state.tokenize = tokenBase; break; } stream.next(); } return style; }; } return { startState: function(base) { return {tokenize: tokenBase, baseIndent: base || 0, stack: []}; }, token: function(stream, state) { if (stream.eatSpace()) return null; var style = state.tokenize(stream, state); var context = state.stack[state.stack.length-1]; if (stream.current() == "[" || type === "doindent" || type == "[") state.stack.push("rule"); else if (type === "endtag") state.stack[state.stack.length-1] = "endtag"; else if (stream.current() == "]" || type == "]" || (type == ">" && context == "rule")) state.stack.pop(); else if (type == "[") state.stack.push("["); return style; }, indent: function(state, textAfter) { var n = state.stack.length; if( textAfter.match(/\]\s+|\]/) )n=n-1; else if(textAfter.substr(textAfter.length-1, textAfter.length) === ">"){ if(textAfter.substr(0,1) === "<")n; else if( type == "doindent" && textAfter.length > 1 )n; else if( type == "doindent")n--; else if( type == ">" && textAfter.length > 1)n; else if( type == "tag" && textAfter !== ">")n; else if( type == "tag" && state.stack[state.stack.length-1] == "rule")n--; else if( type == "tag")n++; else if( textAfter === ">" && state.stack[state.stack.length-1] == "rule" && type === ">")n--; else if( textAfter === ">" && state.stack[state.stack.length-1] == "rule")n; else if( textAfter.substr(0,1) !== "<" && textAfter.substr(0,1) === ">" )n=n-1; else if( textAfter === ">")n; else n=n-1; //over rule them all if(type == null || type == "]")n--; } return state.baseIndent + n * indentUnit; }, electricChars: "]>" }; }); CodeMirror.defineMIME("application/xml-dtd", "dtd"); }); ================================================ FILE: base/res/codemirror/mode/dtd/index.html ================================================ CodeMirror: DTD mode

DTD mode

MIME types defined: application/xml-dtd.

================================================ FILE: base/res/codemirror/mode/dylan/dylan.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("dylan", function(_config) { // Words var words = { // Words that introduce unnamed definitions like "define interface" unnamedDefinition: ["interface"], // Words that introduce simple named definitions like "define library" namedDefinition: ["module", "library", "macro", "C-struct", "C-union", "C-function", "C-callable-wrapper" ], // Words that introduce type definitions like "define class". // These are also parameterized like "define method" and are // appended to otherParameterizedDefinitionWords typeParameterizedDefinition: ["class", "C-subtype", "C-mapped-subtype"], // Words that introduce trickier definitions like "define method". // These require special definitions to be added to startExpressions otherParameterizedDefinition: ["method", "function", "C-variable", "C-address" ], // Words that introduce module constant definitions. // These must also be simple definitions and are // appended to otherSimpleDefinitionWords constantSimpleDefinition: ["constant"], // Words that introduce module variable definitions. // These must also be simple definitions and are // appended to otherSimpleDefinitionWords variableSimpleDefinition: ["variable"], // Other words that introduce simple definitions // (without implicit bodies). otherSimpleDefinition: ["generic", "domain", "C-pointer-type", "table" ], // Words that begin statements with implicit bodies. statement: ["if", "block", "begin", "method", "case", "for", "select", "when", "unless", "until", "while", "iterate", "profiling", "dynamic-bind" ], // Patterns that act as separators in compound statements. // This may include any general pattern that must be indented // specially. separator: ["finally", "exception", "cleanup", "else", "elseif", "afterwards" ], // Keywords that do not require special indentation handling, // but which should be highlighted other: ["above", "below", "by", "from", "handler", "in", "instance", "let", "local", "otherwise", "slot", "subclass", "then", "to", "keyed-by", "virtual" ], // Condition signaling function calls signalingCalls: ["signal", "error", "cerror", "break", "check-type", "abort" ] }; words["otherDefinition"] = words["unnamedDefinition"] .concat(words["namedDefinition"]) .concat(words["otherParameterizedDefinition"]); words["definition"] = words["typeParameterizedDefinition"] .concat(words["otherDefinition"]); words["parameterizedDefinition"] = words["typeParameterizedDefinition"] .concat(words["otherParameterizedDefinition"]); words["simpleDefinition"] = words["constantSimpleDefinition"] .concat(words["variableSimpleDefinition"]) .concat(words["otherSimpleDefinition"]); words["keyword"] = words["statement"] .concat(words["separator"]) .concat(words["other"]); // Patterns var symbolPattern = "[-_a-zA-Z?!*@<>$%]+"; var symbol = new RegExp("^" + symbolPattern); var patterns = { // Symbols with special syntax symbolKeyword: symbolPattern + ":", symbolClass: "<" + symbolPattern + ">", symbolGlobal: "\\*" + symbolPattern + "\\*", symbolConstant: "\\$" + symbolPattern }; var patternStyles = { symbolKeyword: "atom", symbolClass: "tag", symbolGlobal: "variable-2", symbolConstant: "variable-3" }; // Compile all patterns to regular expressions for (var patternName in patterns) if (patterns.hasOwnProperty(patternName)) patterns[patternName] = new RegExp("^" + patterns[patternName]); // Names beginning "with-" and "without-" are commonly // used as statement macro patterns["keyword"] = [/^with(?:out)?-[-_a-zA-Z?!*@<>$%]+/]; var styles = {}; styles["keyword"] = "keyword"; styles["definition"] = "def"; styles["simpleDefinition"] = "def"; styles["signalingCalls"] = "builtin"; // protected words lookup table var wordLookup = {}; var styleLookup = {}; [ "keyword", "definition", "simpleDefinition", "signalingCalls" ].forEach(function(type) { words[type].forEach(function(word) { wordLookup[word] = type; styleLookup[word] = styles[type]; }); }); function chain(stream, state, f) { state.tokenize = f; return f(stream, state); } var type, content; function ret(_type, style, _content) { type = _type; content = _content; return style; } function tokenBase(stream, state) { // String var ch = stream.peek(); if (ch == "'" || ch == '"') { stream.next(); return chain(stream, state, tokenString(ch, "string", "string")); } // Comment else if (ch == "/") { stream.next(); if (stream.eat("*")) { return chain(stream, state, tokenComment); } else if (stream.eat("/")) { stream.skipToEnd(); return ret("comment", "comment"); } else { stream.skipTo(" "); return ret("operator", "operator"); } } // Decimal else if (/\d/.test(ch)) { stream.match(/^\d*(?:\.\d*)?(?:e[+\-]?\d+)?/); return ret("number", "number"); } // Hash else if (ch == "#") { stream.next(); // Symbol with string syntax ch = stream.peek(); if (ch == '"') { stream.next(); return chain(stream, state, tokenString('"', "symbol", "string-2")); } // Binary number else if (ch == "b") { stream.next(); stream.eatWhile(/[01]/); return ret("number", "number"); } // Hex number else if (ch == "x") { stream.next(); stream.eatWhile(/[\da-f]/i); return ret("number", "number"); } // Octal number else if (ch == "o") { stream.next(); stream.eatWhile(/[0-7]/); return ret("number", "number"); } // Hash symbol else { stream.eatWhile(/[-a-zA-Z]/); return ret("hash", "keyword"); } } else if (stream.match("end")) { return ret("end", "keyword"); } for (var name in patterns) { if (patterns.hasOwnProperty(name)) { var pattern = patterns[name]; if ((pattern instanceof Array && pattern.some(function(p) { return stream.match(p); })) || stream.match(pattern)) return ret(name, patternStyles[name], stream.current()); } } if (stream.match("define")) { return ret("definition", "def"); } else { stream.eatWhile(/[\w\-]/); // Keyword if (wordLookup[stream.current()]) { return ret(wordLookup[stream.current()], styleLookup[stream.current()], stream.current()); } else if (stream.current().match(symbol)) { return ret("variable", "variable"); } else { stream.next(); return ret("other", "variable-2"); } } } function tokenComment(stream, state) { var maybeEnd = false, ch; while ((ch = stream.next())) { if (ch == "/" && maybeEnd) { state.tokenize = tokenBase; break; } maybeEnd = (ch == "*"); } return ret("comment", "comment"); } function tokenString(quote, type, style) { return function(stream, state) { var next, end = false; while ((next = stream.next()) != null) { if (next == quote) { end = true; break; } } if (end) state.tokenize = tokenBase; return ret(type, style); }; } // Interface return { startState: function() { return { tokenize: tokenBase, currentIndent: 0 }; }, token: function(stream, state) { if (stream.eatSpace()) return null; var style = state.tokenize(stream, state); return style; }, blockCommentStart: "/*", blockCommentEnd: "*/" }; }); CodeMirror.defineMIME("text/x-dylan", "dylan"); }); ================================================ FILE: base/res/codemirror/mode/dylan/index.html ================================================ CodeMirror: Dylan mode

Dylan mode

MIME types defined: text/x-dylan.

================================================ FILE: base/res/codemirror/mode/ebnf/ebnf.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("ebnf", function (config) { var commentType = {slash: 0, parenthesis: 1}; var stateType = {comment: 0, _string: 1, characterClass: 2}; var bracesMode = null; if (config.bracesMode) bracesMode = CodeMirror.getMode(config, config.bracesMode); return { startState: function () { return { stringType: null, commentType: null, braced: 0, lhs: true, localState: null, stack: [], inDefinition: false }; }, token: function (stream, state) { if (!stream) return; //check for state changes if (state.stack.length === 0) { //strings if ((stream.peek() == '"') || (stream.peek() == "'")) { state.stringType = stream.peek(); stream.next(); // Skip quote state.stack.unshift(stateType._string); } else if (stream.match(/^\/\*/)) { //comments starting with /* state.stack.unshift(stateType.comment); state.commentType = commentType.slash; } else if (stream.match(/^\(\*/)) { //comments starting with (* state.stack.unshift(stateType.comment); state.commentType = commentType.parenthesis; } } //return state //stack has switch (state.stack[0]) { case stateType._string: while (state.stack[0] === stateType._string && !stream.eol()) { if (stream.peek() === state.stringType) { stream.next(); // Skip quote state.stack.shift(); // Clear flag } else if (stream.peek() === "\\") { stream.next(); stream.next(); } else { stream.match(/^.[^\\\"\']*/); } } return state.lhs ? "property string" : "string"; // Token style case stateType.comment: while (state.stack[0] === stateType.comment && !stream.eol()) { if (state.commentType === commentType.slash && stream.match(/\*\//)) { state.stack.shift(); // Clear flag state.commentType = null; } else if (state.commentType === commentType.parenthesis && stream.match(/\*\)/)) { state.stack.shift(); // Clear flag state.commentType = null; } else { stream.match(/^.[^\*]*/); } } return "comment"; case stateType.characterClass: while (state.stack[0] === stateType.characterClass && !stream.eol()) { if (!(stream.match(/^[^\]\\]+/) || stream.match(/^\\./))) { state.stack.shift(); } } return "operator"; } var peek = stream.peek(); if (bracesMode !== null && (state.braced || peek === "{")) { if (state.localState === null) state.localState = bracesMode.startState(); var token = bracesMode.token(stream, state.localState), text = stream.current(); if (!token) { for (var i = 0; i < text.length; i++) { if (text[i] === "{") { if (state.braced === 0) { token = "matchingbracket"; } state.braced++; } else if (text[i] === "}") { state.braced--; if (state.braced === 0) { token = "matchingbracket"; } } } } return token; } //no stack switch (peek) { case "[": stream.next(); state.stack.unshift(stateType.characterClass); return "bracket"; case ":": case "|": case ";": stream.next(); return "operator"; case "%": if (stream.match("%%")) { return "header"; } else if (stream.match(/[%][A-Za-z]+/)) { return "keyword"; } else if (stream.match(/[%][}]/)) { return "matchingbracket"; } break; case "/": if (stream.match(/[\/][A-Za-z]+/)) { return "keyword"; } case "\\": if (stream.match(/[\][a-z]+/)) { return "string-2"; } case ".": if (stream.match(".")) { return "atom"; } case "*": case "-": case "+": case "^": if (stream.match(peek)) { return "atom"; } case "$": if (stream.match("$$")) { return "builtin"; } else if (stream.match(/[$][0-9]+/)) { return "variable-3"; } case "<": if (stream.match(/<<[a-zA-Z_]+>>/)) { return "builtin"; } } if (stream.match(/^\/\//)) { stream.skipToEnd(); return "comment"; } else if (stream.match(/return/)) { return "operator"; } else if (stream.match(/^[a-zA-Z_][a-zA-Z0-9_]*/)) { if (stream.match(/(?=[\(.])/)) { return "variable"; } else if (stream.match(/(?=[\s\n]*[:=])/)) { return "def"; } return "variable-2"; } else if (["[", "]", "(", ")"].indexOf(stream.peek()) != -1) { stream.next(); return "bracket"; } else if (!stream.eatSpace()) { stream.next(); } return null; } }; }); CodeMirror.defineMIME("text/x-ebnf", "ebnf"); }); ================================================ FILE: base/res/codemirror/mode/ebnf/index.html ================================================ CodeMirror: EBNF Mode

EBNF Mode (bracesMode setting = "javascript")

The EBNF Mode

Created by Robert Plummer

================================================ FILE: base/res/codemirror/mode/ecl/ecl.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("ecl", function(config) { function words(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } function metaHook(stream, state) { if (!state.startOfLine) return false; stream.skipToEnd(); return "meta"; } var indentUnit = config.indentUnit; var keyword = words("abs acos allnodes ascii asin asstring atan atan2 ave case choose choosen choosesets clustersize combine correlation cos cosh count covariance cron dataset dedup define denormalize distribute distributed distribution ebcdic enth error evaluate event eventextra eventname exists exp failcode failmessage fetch fromunicode getisvalid global graph group hash hash32 hash64 hashcrc hashmd5 having if index intformat isvalid iterate join keyunicode length library limit ln local log loop map matched matchlength matchposition matchtext matchunicode max merge mergejoin min nolocal nonempty normalize parse pipe power preload process project pull random range rank ranked realformat recordof regexfind regexreplace regroup rejected rollup round roundup row rowdiff sample set sin sinh sizeof soapcall sort sorted sqrt stepped stored sum table tan tanh thisnode topn tounicode transfer trim truncate typeof ungroup unicodeorder variance which workunit xmldecode xmlencode xmltext xmlunicode"); var variable = words("apply assert build buildindex evaluate fail keydiff keypatch loadxml nothor notify output parallel sequential soapcall wait"); var variable_2 = words("__compressed__ all and any as atmost before beginc++ best between case const counter csv descend encrypt end endc++ endmacro except exclusive expire export extend false few first flat from full function group header heading hole ifblock import in interface joined keep keyed last left limit load local locale lookup macro many maxcount maxlength min skew module named nocase noroot noscan nosort not of only opt or outer overwrite packed partition penalty physicallength pipe quote record relationship repeat return right scan self separator service shared skew skip sql store terminator thor threshold token transform trim true type unicodeorder unsorted validate virtual whole wild within xml xpath"); var variable_3 = words("ascii big_endian boolean data decimal ebcdic integer pattern qstring real record rule set of string token udecimal unicode unsigned varstring varunicode"); var builtin = words("checkpoint deprecated failcode failmessage failure global independent onwarning persist priority recovery stored success wait when"); var blockKeywords = words("catch class do else finally for if switch try while"); var atoms = words("true false null"); var hooks = {"#": metaHook}; var multiLineStrings; var isOperatorChar = /[+\-*&%=<>!?|\/]/; var curPunc; function tokenBase(stream, state) { var ch = stream.next(); if (hooks[ch]) { var result = hooks[ch](stream, state); if (result !== false) return result; } if (ch == '"' || ch == "'") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } if (/[\[\]{}\(\),;\:\.]/.test(ch)) { curPunc = ch; return null; } if (/\d/.test(ch)) { stream.eatWhile(/[\w\.]/); return "number"; } if (ch == "/") { if (stream.eat("*")) { state.tokenize = tokenComment; return tokenComment(stream, state); } if (stream.eat("/")) { stream.skipToEnd(); return "comment"; } } if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return "operator"; } stream.eatWhile(/[\w\$_]/); var cur = stream.current().toLowerCase(); if (keyword.propertyIsEnumerable(cur)) { if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; return "keyword"; } else if (variable.propertyIsEnumerable(cur)) { if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; return "variable"; } else if (variable_2.propertyIsEnumerable(cur)) { if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; return "variable-2"; } else if (variable_3.propertyIsEnumerable(cur)) { if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; return "variable-3"; } else if (builtin.propertyIsEnumerable(cur)) { if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; return "builtin"; } else { //Data types are of from KEYWORD## var i = cur.length - 1; while(i >= 0 && (!isNaN(cur[i]) || cur[i] == '_')) --i; if (i > 0) { var cur2 = cur.substr(0, i + 1); if (variable_3.propertyIsEnumerable(cur2)) { if (blockKeywords.propertyIsEnumerable(cur2)) curPunc = "newstatement"; return "variable-3"; } } } if (atoms.propertyIsEnumerable(cur)) return "atom"; return null; } function tokenString(quote) { return function(stream, state) { var escaped = false, next, end = false; while ((next = stream.next()) != null) { if (next == quote && !escaped) {end = true; break;} escaped = !escaped && next == "\\"; } if (end || !(escaped || multiLineStrings)) state.tokenize = tokenBase; return "string"; }; } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = tokenBase; break; } maybeEnd = (ch == "*"); } return "comment"; } function Context(indented, column, type, align, prev) { this.indented = indented; this.column = column; this.type = type; this.align = align; this.prev = prev; } function pushContext(state, col, type) { return state.context = new Context(state.indented, col, type, null, state.context); } function popContext(state) { var t = state.context.type; if (t == ")" || t == "]" || t == "}") state.indented = state.context.indented; return state.context = state.context.prev; } // Interface return { startState: function(basecolumn) { return { tokenize: null, context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), indented: 0, startOfLine: true }; }, token: function(stream, state) { var ctx = state.context; if (stream.sol()) { if (ctx.align == null) ctx.align = false; state.indented = stream.indentation(); state.startOfLine = true; } if (stream.eatSpace()) return null; curPunc = null; var style = (state.tokenize || tokenBase)(stream, state); if (style == "comment" || style == "meta") return style; if (ctx.align == null) ctx.align = true; if ((curPunc == ";" || curPunc == ":") && ctx.type == "statement") popContext(state); else if (curPunc == "{") pushContext(state, stream.column(), "}"); else if (curPunc == "[") pushContext(state, stream.column(), "]"); else if (curPunc == "(") pushContext(state, stream.column(), ")"); else if (curPunc == "}") { while (ctx.type == "statement") ctx = popContext(state); if (ctx.type == "}") ctx = popContext(state); while (ctx.type == "statement") ctx = popContext(state); } else if (curPunc == ctx.type) popContext(state); else if (ctx.type == "}" || ctx.type == "top" || (ctx.type == "statement" && curPunc == "newstatement")) pushContext(state, stream.column(), "statement"); state.startOfLine = false; return style; }, indent: function(state, textAfter) { if (state.tokenize != tokenBase && state.tokenize != null) return 0; var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev; var closing = firstChar == ctx.type; if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : indentUnit); else if (ctx.align) return ctx.column + (closing ? 0 : 1); else return ctx.indented + (closing ? 0 : indentUnit); }, electricChars: "{}" }; }); CodeMirror.defineMIME("text/x-ecl", "ecl"); }); ================================================ FILE: base/res/codemirror/mode/ecl/index.html ================================================ CodeMirror: ECL mode

ECL mode

Based on CodeMirror's clike mode. For more information see HPCC Systems web site.

MIME types defined: text/x-ecl.

================================================ FILE: base/res/codemirror/mode/eiffel/eiffel.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("eiffel", function() { function wordObj(words) { var o = {}; for (var i = 0, e = words.length; i < e; ++i) o[words[i]] = true; return o; } var keywords = wordObj([ 'note', 'across', 'when', 'variant', 'until', 'unique', 'undefine', 'then', 'strip', 'select', 'retry', 'rescue', 'require', 'rename', 'reference', 'redefine', 'prefix', 'once', 'old', 'obsolete', 'loop', 'local', 'like', 'is', 'inspect', 'infix', 'include', 'if', 'frozen', 'from', 'external', 'export', 'ensure', 'end', 'elseif', 'else', 'do', 'creation', 'create', 'check', 'alias', 'agent', 'separate', 'invariant', 'inherit', 'indexing', 'feature', 'expanded', 'deferred', 'class', 'Void', 'True', 'Result', 'Precursor', 'False', 'Current', 'create', 'attached', 'detachable', 'as', 'and', 'implies', 'not', 'or' ]); var operators = wordObj([":=", "and then","and", "or","<<",">>"]); var curPunc; function chain(newtok, stream, state) { state.tokenize.push(newtok); return newtok(stream, state); } function tokenBase(stream, state) { curPunc = null; if (stream.eatSpace()) return null; var ch = stream.next(); if (ch == '"'||ch == "'") { return chain(readQuoted(ch, "string"), stream, state); } else if (ch == "-"&&stream.eat("-")) { stream.skipToEnd(); return "comment"; } else if (ch == ":"&&stream.eat("=")) { return "operator"; } else if (/[0-9]/.test(ch)) { stream.eatWhile(/[xXbBCc0-9\.]/); stream.eat(/[\?\!]/); return "ident"; } else if (/[a-zA-Z_0-9]/.test(ch)) { stream.eatWhile(/[a-zA-Z_0-9]/); stream.eat(/[\?\!]/); return "ident"; } else if (/[=+\-\/*^%<>~]/.test(ch)) { stream.eatWhile(/[=+\-\/*^%<>~]/); return "operator"; } else { return null; } } function readQuoted(quote, style, unescaped) { return function(stream, state) { var escaped = false, ch; while ((ch = stream.next()) != null) { if (ch == quote && (unescaped || !escaped)) { state.tokenize.pop(); break; } escaped = !escaped && ch == "%"; } return style; }; } return { startState: function() { return {tokenize: [tokenBase]}; }, token: function(stream, state) { var style = state.tokenize[state.tokenize.length-1](stream, state); if (style == "ident") { var word = stream.current(); style = keywords.propertyIsEnumerable(stream.current()) ? "keyword" : operators.propertyIsEnumerable(stream.current()) ? "operator" : /^[A-Z][A-Z_0-9]*$/g.test(word) ? "tag" : /^0[bB][0-1]+$/g.test(word) ? "number" : /^0[cC][0-7]+$/g.test(word) ? "number" : /^0[xX][a-fA-F0-9]+$/g.test(word) ? "number" : /^([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+)$/g.test(word) ? "number" : /^[0-9]+$/g.test(word) ? "number" : "variable"; } return style; }, lineComment: "--" }; }); CodeMirror.defineMIME("text/x-eiffel", "eiffel"); }); ================================================ FILE: base/res/codemirror/mode/eiffel/index.html ================================================ CodeMirror: Eiffel mode

Eiffel mode

MIME types defined: text/x-eiffel.

Created by YNH.

================================================ FILE: base/res/codemirror/mode/erlang/erlang.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /*jshint unused:true, eqnull:true, curly:true, bitwise:true */ /*jshint undef:true, latedef:true, trailing:true */ /*global CodeMirror:true */ // erlang mode. // tokenizer -> token types -> CodeMirror styles // tokenizer maintains a parse stack // indenter uses the parse stack // TODO indenter: // bit syntax // old guard/bif/conversion clashes (e.g. "float/1") // type/spec/opaque (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMIME("text/x-erlang", "erlang"); CodeMirror.defineMode("erlang", function(cmCfg) { "use strict"; ///////////////////////////////////////////////////////////////////////////// // constants var typeWords = [ "-type", "-spec", "-export_type", "-opaque"]; var keywordWords = [ "after","begin","catch","case","cond","end","fun","if", "let","of","query","receive","try","when"]; var separatorRE = /[\->,;]/; var separatorWords = [ "->",";",","]; var operatorAtomWords = [ "and","andalso","band","bnot","bor","bsl","bsr","bxor", "div","not","or","orelse","rem","xor"]; var operatorSymbolRE = /[\+\-\*\/<>=\|:!]/; var operatorSymbolWords = [ "=","+","-","*","/",">",">=","<","=<","=:=","==","=/=","/=","||","<-","!"]; var openParenRE = /[<\(\[\{]/; var openParenWords = [ "<<","(","[","{"]; var closeParenRE = /[>\)\]\}]/; var closeParenWords = [ "}","]",")",">>"]; var guardWords = [ "is_atom","is_binary","is_bitstring","is_boolean","is_float", "is_function","is_integer","is_list","is_number","is_pid", "is_port","is_record","is_reference","is_tuple", "atom","binary","bitstring","boolean","function","integer","list", "number","pid","port","record","reference","tuple"]; var bifWords = [ "abs","adler32","adler32_combine","alive","apply","atom_to_binary", "atom_to_list","binary_to_atom","binary_to_existing_atom", "binary_to_list","binary_to_term","bit_size","bitstring_to_list", "byte_size","check_process_code","contact_binary","crc32", "crc32_combine","date","decode_packet","delete_module", "disconnect_node","element","erase","exit","float","float_to_list", "garbage_collect","get","get_keys","group_leader","halt","hd", "integer_to_list","internal_bif","iolist_size","iolist_to_binary", "is_alive","is_atom","is_binary","is_bitstring","is_boolean", "is_float","is_function","is_integer","is_list","is_number","is_pid", "is_port","is_process_alive","is_record","is_reference","is_tuple", "length","link","list_to_atom","list_to_binary","list_to_bitstring", "list_to_existing_atom","list_to_float","list_to_integer", "list_to_pid","list_to_tuple","load_module","make_ref","module_loaded", "monitor_node","node","node_link","node_unlink","nodes","notalive", "now","open_port","pid_to_list","port_close","port_command", "port_connect","port_control","pre_loaded","process_flag", "process_info","processes","purge_module","put","register", "registered","round","self","setelement","size","spawn","spawn_link", "spawn_monitor","spawn_opt","split_binary","statistics", "term_to_binary","time","throw","tl","trunc","tuple_size", "tuple_to_list","unlink","unregister","whereis"]; // upper case: [A-Z] [Ø-Þ] [À-Ö] // lower case: [a-z] [ß-ö] [ø-ÿ] var anumRE = /[\w@Ø-ÞÀ-Öß-öø-ÿ]/; var escapesRE = /[0-7]{1,3}|[bdefnrstv\\"']|\^[a-zA-Z]|x[0-9a-zA-Z]{2}|x{[0-9a-zA-Z]+}/; ///////////////////////////////////////////////////////////////////////////// // tokenizer function tokenizer(stream,state) { // in multi-line string if (state.in_string) { state.in_string = (!doubleQuote(stream)); return rval(state,stream,"string"); } // in multi-line atom if (state.in_atom) { state.in_atom = (!singleQuote(stream)); return rval(state,stream,"atom"); } // whitespace if (stream.eatSpace()) { return rval(state,stream,"whitespace"); } // attributes and type specs if (!peekToken(state) && stream.match(/-\s*[a-zß-öø-ÿ][\wØ-ÞÀ-Öß-öø-ÿ]*/)) { if (is_member(stream.current(),typeWords)) { return rval(state,stream,"type"); }else{ return rval(state,stream,"attribute"); } } var ch = stream.next(); // comment if (ch == '%') { stream.skipToEnd(); return rval(state,stream,"comment"); } // colon if (ch == ":") { return rval(state,stream,"colon"); } // macro if (ch == '?') { stream.eatSpace(); stream.eatWhile(anumRE); return rval(state,stream,"macro"); } // record if (ch == "#") { stream.eatSpace(); stream.eatWhile(anumRE); return rval(state,stream,"record"); } // dollar escape if (ch == "$") { if (stream.next() == "\\" && !stream.match(escapesRE)) { return rval(state,stream,"error"); } return rval(state,stream,"number"); } // dot if (ch == ".") { return rval(state,stream,"dot"); } // quoted atom if (ch == '\'') { if (!(state.in_atom = (!singleQuote(stream)))) { if (stream.match(/\s*\/\s*[0-9]/,false)) { stream.match(/\s*\/\s*[0-9]/,true); return rval(state,stream,"fun"); // 'f'/0 style fun } if (stream.match(/\s*\(/,false) || stream.match(/\s*:/,false)) { return rval(state,stream,"function"); } } return rval(state,stream,"atom"); } // string if (ch == '"') { state.in_string = (!doubleQuote(stream)); return rval(state,stream,"string"); } // variable if (/[A-Z_Ø-ÞÀ-Ö]/.test(ch)) { stream.eatWhile(anumRE); return rval(state,stream,"variable"); } // atom/keyword/BIF/function if (/[a-z_ß-öø-ÿ]/.test(ch)) { stream.eatWhile(anumRE); if (stream.match(/\s*\/\s*[0-9]/,false)) { stream.match(/\s*\/\s*[0-9]/,true); return rval(state,stream,"fun"); // f/0 style fun } var w = stream.current(); if (is_member(w,keywordWords)) { return rval(state,stream,"keyword"); }else if (is_member(w,operatorAtomWords)) { return rval(state,stream,"operator"); }else if (stream.match(/\s*\(/,false)) { // 'put' and 'erlang:put' are bifs, 'foo:put' is not if (is_member(w,bifWords) && ((peekToken(state).token != ":") || (peekToken(state,2).token == "erlang"))) { return rval(state,stream,"builtin"); }else if (is_member(w,guardWords)) { return rval(state,stream,"guard"); }else{ return rval(state,stream,"function"); } }else if (is_member(w,operatorAtomWords)) { return rval(state,stream,"operator"); }else if (lookahead(stream) == ":") { if (w == "erlang") { return rval(state,stream,"builtin"); } else { return rval(state,stream,"function"); } }else if (is_member(w,["true","false"])) { return rval(state,stream,"boolean"); }else if (is_member(w,["true","false"])) { return rval(state,stream,"boolean"); }else{ return rval(state,stream,"atom"); } } // number var digitRE = /[0-9]/; var radixRE = /[0-9a-zA-Z]/; // 36#zZ style int if (digitRE.test(ch)) { stream.eatWhile(digitRE); if (stream.eat('#')) { // 36#aZ style integer if (!stream.eatWhile(radixRE)) { stream.backUp(1); //"36#" - syntax error } } else if (stream.eat('.')) { // float if (!stream.eatWhile(digitRE)) { stream.backUp(1); // "3." - probably end of function } else { if (stream.eat(/[eE]/)) { // float with exponent if (stream.eat(/[-+]/)) { if (!stream.eatWhile(digitRE)) { stream.backUp(2); // "2e-" - syntax error } } else { if (!stream.eatWhile(digitRE)) { stream.backUp(1); // "2e" - syntax error } } } } } return rval(state,stream,"number"); // normal integer } // open parens if (nongreedy(stream,openParenRE,openParenWords)) { return rval(state,stream,"open_paren"); } // close parens if (nongreedy(stream,closeParenRE,closeParenWords)) { return rval(state,stream,"close_paren"); } // separators if (greedy(stream,separatorRE,separatorWords)) { return rval(state,stream,"separator"); } // operators if (greedy(stream,operatorSymbolRE,operatorSymbolWords)) { return rval(state,stream,"operator"); } return rval(state,stream,null); } ///////////////////////////////////////////////////////////////////////////// // utilities function nongreedy(stream,re,words) { if (stream.current().length == 1 && re.test(stream.current())) { stream.backUp(1); while (re.test(stream.peek())) { stream.next(); if (is_member(stream.current(),words)) { return true; } } stream.backUp(stream.current().length-1); } return false; } function greedy(stream,re,words) { if (stream.current().length == 1 && re.test(stream.current())) { while (re.test(stream.peek())) { stream.next(); } while (0 < stream.current().length) { if (is_member(stream.current(),words)) { return true; }else{ stream.backUp(1); } } stream.next(); } return false; } function doubleQuote(stream) { return quote(stream, '"', '\\'); } function singleQuote(stream) { return quote(stream,'\'','\\'); } function quote(stream,quoteChar,escapeChar) { while (!stream.eol()) { var ch = stream.next(); if (ch == quoteChar) { return true; }else if (ch == escapeChar) { stream.next(); } } return false; } function lookahead(stream) { var m = stream.match(/([\n\s]+|%[^\n]*\n)*(.)/,false); return m ? m.pop() : ""; } function is_member(element,list) { return (-1 < list.indexOf(element)); } function rval(state,stream,type) { // parse stack pushToken(state,realToken(type,stream)); // map erlang token type to CodeMirror style class // erlang -> CodeMirror tag switch (type) { case "atom": return "atom"; case "attribute": return "attribute"; case "boolean": return "atom"; case "builtin": return "builtin"; case "close_paren": return null; case "colon": return null; case "comment": return "comment"; case "dot": return null; case "error": return "error"; case "fun": return "meta"; case "function": return "tag"; case "guard": return "property"; case "keyword": return "keyword"; case "macro": return "variable-2"; case "number": return "number"; case "open_paren": return null; case "operator": return "operator"; case "record": return "bracket"; case "separator": return null; case "string": return "string"; case "type": return "def"; case "variable": return "variable"; default: return null; } } function aToken(tok,col,ind,typ) { return {token: tok, column: col, indent: ind, type: typ}; } function realToken(type,stream) { return aToken(stream.current(), stream.column(), stream.indentation(), type); } function fakeToken(type) { return aToken(type,0,0,type); } function peekToken(state,depth) { var len = state.tokenStack.length; var dep = (depth ? depth : 1); if (len < dep) { return false; }else{ return state.tokenStack[len-dep]; } } function pushToken(state,token) { if (!(token.type == "comment" || token.type == "whitespace")) { state.tokenStack = maybe_drop_pre(state.tokenStack,token); state.tokenStack = maybe_drop_post(state.tokenStack); } } function maybe_drop_pre(s,token) { var last = s.length-1; if (0 < last && s[last].type === "record" && token.type === "dot") { s.pop(); }else if (0 < last && s[last].type === "group") { s.pop(); s.push(token); }else{ s.push(token); } return s; } function maybe_drop_post(s) { var last = s.length-1; if (s[last].type === "dot") { return []; } if (s[last].type === "fun" && s[last-1].token === "fun") { return s.slice(0,last-1); } switch (s[s.length-1].token) { case "}": return d(s,{g:["{"]}); case "]": return d(s,{i:["["]}); case ")": return d(s,{i:["("]}); case ">>": return d(s,{i:["<<"]}); case "end": return d(s,{i:["begin","case","fun","if","receive","try"]}); case ",": return d(s,{e:["begin","try","when","->", ",","(","[","{","<<"]}); case "->": return d(s,{r:["when"], m:["try","if","case","receive"]}); case ";": return d(s,{E:["case","fun","if","receive","try","when"]}); case "catch":return d(s,{e:["try"]}); case "of": return d(s,{e:["case"]}); case "after":return d(s,{e:["receive","try"]}); default: return s; } } function d(stack,tt) { // stack is a stack of Token objects. // tt is an object; {type:tokens} // type is a char, tokens is a list of token strings. // The function returns (possibly truncated) stack. // It will descend the stack, looking for a Token such that Token.token // is a member of tokens. If it does not find that, it will normally (but // see "E" below) return stack. If it does find a match, it will remove // all the Tokens between the top and the matched Token. // If type is "m", that is all it does. // If type is "i", it will also remove the matched Token and the top Token. // If type is "g", like "i", but add a fake "group" token at the top. // If type is "r", it will remove the matched Token, but not the top Token. // If type is "e", it will keep the matched Token but not the top Token. // If type is "E", it behaves as for type "e", except if there is no match, // in which case it will return an empty stack. for (var type in tt) { var len = stack.length-1; var tokens = tt[type]; for (var i = len-1; -1 < i ; i--) { if (is_member(stack[i].token,tokens)) { var ss = stack.slice(0,i); switch (type) { case "m": return ss.concat(stack[i]).concat(stack[len]); case "r": return ss.concat(stack[len]); case "i": return ss; case "g": return ss.concat(fakeToken("group")); case "E": return ss.concat(stack[i]); case "e": return ss.concat(stack[i]); } } } } return (type == "E" ? [] : stack); } ///////////////////////////////////////////////////////////////////////////// // indenter function indenter(state,textAfter) { var t; var unit = cmCfg.indentUnit; var wordAfter = wordafter(textAfter); var currT = peekToken(state,1); var prevT = peekToken(state,2); if (state.in_string || state.in_atom) { return CodeMirror.Pass; }else if (!prevT) { return 0; }else if (currT.token == "when") { return currT.column+unit; }else if (wordAfter === "when" && prevT.type === "function") { return prevT.indent+unit; }else if (wordAfter === "(" && currT.token === "fun") { return currT.column+3; }else if (wordAfter === "catch" && (t = getToken(state,["try"]))) { return t.column; }else if (is_member(wordAfter,["end","after","of"])) { t = getToken(state,["begin","case","fun","if","receive","try"]); return t ? t.column : CodeMirror.Pass; }else if (is_member(wordAfter,closeParenWords)) { t = getToken(state,openParenWords); return t ? t.column : CodeMirror.Pass; }else if (is_member(currT.token,[",","|","||"]) || is_member(wordAfter,[",","|","||"])) { t = postcommaToken(state); return t ? t.column+t.token.length : unit; }else if (currT.token == "->") { if (is_member(prevT.token, ["receive","case","if","try"])) { return prevT.column+unit+unit; }else{ return prevT.column+unit; } }else if (is_member(currT.token,openParenWords)) { return currT.column+currT.token.length; }else{ t = defaultToken(state); return truthy(t) ? t.column+unit : 0; } } function wordafter(str) { var m = str.match(/,|[a-z]+|\}|\]|\)|>>|\|+|\(/); return truthy(m) && (m.index === 0) ? m[0] : ""; } function postcommaToken(state) { var objs = state.tokenStack.slice(0,-1); var i = getTokenIndex(objs,"type",["open_paren"]); return truthy(objs[i]) ? objs[i] : false; } function defaultToken(state) { var objs = state.tokenStack; var stop = getTokenIndex(objs,"type",["open_paren","separator","keyword"]); var oper = getTokenIndex(objs,"type",["operator"]); if (truthy(stop) && truthy(oper) && stop < oper) { return objs[stop+1]; } else if (truthy(stop)) { return objs[stop]; } else { return false; } } function getToken(state,tokens) { var objs = state.tokenStack; var i = getTokenIndex(objs,"token",tokens); return truthy(objs[i]) ? objs[i] : false; } function getTokenIndex(objs,propname,propvals) { for (var i = objs.length-1; -1 < i ; i--) { if (is_member(objs[i][propname],propvals)) { return i; } } return false; } function truthy(x) { return (x !== false) && (x != null); } ///////////////////////////////////////////////////////////////////////////// // this object defines the mode return { startState: function() { return {tokenStack: [], in_string: false, in_atom: false}; }, token: function(stream, state) { return tokenizer(stream, state); }, indent: function(state, textAfter) { return indenter(state,textAfter); }, lineComment: "%" }; }); }); ================================================ FILE: base/res/codemirror/mode/erlang/index.html ================================================ CodeMirror: Erlang mode

Erlang mode

MIME types defined: text/x-erlang.

================================================ FILE: base/res/codemirror/mode/forth/forth.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Author: Aliaksei Chapyzhenka (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; function toWordList(words) { var ret = []; words.split(' ').forEach(function(e){ ret.push({name: e}); }); return ret; } var coreWordList = toWordList( 'INVERT AND OR XOR\ 2* 2/ LSHIFT RSHIFT\ 0= = 0< < > U< MIN MAX\ 2DROP 2DUP 2OVER 2SWAP ?DUP DEPTH DROP DUP OVER ROT SWAP\ >R R> R@\ + - 1+ 1- ABS NEGATE\ S>D * M* UM*\ FM/MOD SM/REM UM/MOD */ */MOD / /MOD MOD\ HERE , @ ! CELL+ CELLS C, C@ C! CHARS 2@ 2!\ ALIGN ALIGNED +! ALLOT\ CHAR [CHAR] [ ] BL\ FIND EXECUTE IMMEDIATE COUNT LITERAL STATE\ ; DOES> >BODY\ EVALUATE\ SOURCE >IN\ <# # #S #> HOLD SIGN BASE >NUMBER HEX DECIMAL\ FILL MOVE\ . CR EMIT SPACE SPACES TYPE U. .R U.R\ ACCEPT\ TRUE FALSE\ <> U> 0<> 0>\ NIP TUCK ROLL PICK\ 2>R 2R@ 2R>\ WITHIN UNUSED MARKER\ I J\ TO\ COMPILE, [COMPILE]\ SAVE-INPUT RESTORE-INPUT\ PAD ERASE\ 2LITERAL DNEGATE\ D- D+ D0< D0= D2* D2/ D< D= DMAX DMIN D>S DABS\ M+ M*/ D. D.R 2ROT DU<\ CATCH THROW\ FREE RESIZE ALLOCATE\ CS-PICK CS-ROLL\ GET-CURRENT SET-CURRENT FORTH-WORDLIST GET-ORDER SET-ORDER\ PREVIOUS SEARCH-WORDLIST WORDLIST FIND ALSO ONLY FORTH DEFINITIONS ORDER\ -TRAILING /STRING SEARCH COMPARE CMOVE CMOVE> BLANK SLITERAL'); var immediateWordList = toWordList('IF ELSE THEN BEGIN WHILE REPEAT UNTIL RECURSE [IF] [ELSE] [THEN] ?DO DO LOOP +LOOP UNLOOP LEAVE EXIT AGAIN CASE OF ENDOF ENDCASE'); CodeMirror.defineMode('forth', function() { function searchWordList (wordList, word) { var i; for (i = wordList.length - 1; i >= 0; i--) { if (wordList[i].name === word.toUpperCase()) { return wordList[i]; } } return undefined; } return { startState: function() { return { state: '', base: 10, coreWordList: coreWordList, immediateWordList: immediateWordList, wordList: [] }; }, token: function (stream, stt) { var mat; if (stream.eatSpace()) { return null; } if (stt.state === '') { // interpretation if (stream.match(/^(\]|:NONAME)(\s|$)/i)) { stt.state = ' compilation'; return 'builtin compilation'; } mat = stream.match(/^(\:)\s+(\S+)(\s|$)+/); if (mat) { stt.wordList.push({name: mat[2].toUpperCase()}); stt.state = ' compilation'; return 'def' + stt.state; } mat = stream.match(/^(VARIABLE|2VARIABLE|CONSTANT|2CONSTANT|CREATE|POSTPONE|VALUE|WORD)\s+(\S+)(\s|$)+/i); if (mat) { stt.wordList.push({name: mat[2].toUpperCase()}); return 'def' + stt.state; } mat = stream.match(/^(\'|\[\'\])\s+(\S+)(\s|$)+/); if (mat) { return 'builtin' + stt.state; } } else { // compilation // ; [ if (stream.match(/^(\;|\[)(\s)/)) { stt.state = ''; stream.backUp(1); return 'builtin compilation'; } if (stream.match(/^(\;|\[)($)/)) { stt.state = ''; return 'builtin compilation'; } if (stream.match(/^(POSTPONE)\s+\S+(\s|$)+/)) { return 'builtin'; } } // dynamic wordlist mat = stream.match(/^(\S+)(\s+|$)/); if (mat) { if (searchWordList(stt.wordList, mat[1]) !== undefined) { return 'variable' + stt.state; } // comments if (mat[1] === '\\') { stream.skipToEnd(); return 'comment' + stt.state; } // core words if (searchWordList(stt.coreWordList, mat[1]) !== undefined) { return 'builtin' + stt.state; } if (searchWordList(stt.immediateWordList, mat[1]) !== undefined) { return 'keyword' + stt.state; } if (mat[1] === '(') { stream.eatWhile(function (s) { return s !== ')'; }); stream.eat(')'); return 'comment' + stt.state; } // // strings if (mat[1] === '.(') { stream.eatWhile(function (s) { return s !== ')'; }); stream.eat(')'); return 'string' + stt.state; } if (mat[1] === 'S"' || mat[1] === '."' || mat[1] === 'C"') { stream.eatWhile(function (s) { return s !== '"'; }); stream.eat('"'); return 'string' + stt.state; } // numbers if (mat[1] - 0xfffffffff) { return 'number' + stt.state; } // if (mat[1].match(/^[-+]?[0-9]+\.[0-9]*/)) { // return 'number' + stt.state; // } return 'atom' + stt.state; } } }; }); CodeMirror.defineMIME("text/x-forth", "forth"); }); ================================================ FILE: base/res/codemirror/mode/forth/index.html ================================================ CodeMirror: Forth mode

Forth mode

Simple mode that handle Forth-Syntax (Forth on WikiPedia).

MIME types defined: text/x-forth.

================================================ FILE: base/res/codemirror/mode/fortran/fortran.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("fortran", function() { function words(array) { var keys = {}; for (var i = 0; i < array.length; ++i) { keys[array[i]] = true; } return keys; } var keywords = words([ "abstract", "accept", "allocatable", "allocate", "array", "assign", "asynchronous", "backspace", "bind", "block", "byte", "call", "case", "class", "close", "common", "contains", "continue", "cycle", "data", "deallocate", "decode", "deferred", "dimension", "do", "elemental", "else", "encode", "end", "endif", "entry", "enumerator", "equivalence", "exit", "external", "extrinsic", "final", "forall", "format", "function", "generic", "go", "goto", "if", "implicit", "import", "include", "inquire", "intent", "interface", "intrinsic", "module", "namelist", "non_intrinsic", "non_overridable", "none", "nopass", "nullify", "open", "optional", "options", "parameter", "pass", "pause", "pointer", "print", "private", "program", "protected", "public", "pure", "read", "recursive", "result", "return", "rewind", "save", "select", "sequence", "stop", "subroutine", "target", "then", "to", "type", "use", "value", "volatile", "where", "while", "write"]); var builtins = words(["abort", "abs", "access", "achar", "acos", "adjustl", "adjustr", "aimag", "aint", "alarm", "all", "allocated", "alog", "amax", "amin", "amod", "and", "anint", "any", "asin", "associated", "atan", "besj", "besjn", "besy", "besyn", "bit_size", "btest", "cabs", "ccos", "ceiling", "cexp", "char", "chdir", "chmod", "clog", "cmplx", "command_argument_count", "complex", "conjg", "cos", "cosh", "count", "cpu_time", "cshift", "csin", "csqrt", "ctime", "c_funloc", "c_loc", "c_associated", "c_null_ptr", "c_null_funptr", "c_f_pointer", "c_null_char", "c_alert", "c_backspace", "c_form_feed", "c_new_line", "c_carriage_return", "c_horizontal_tab", "c_vertical_tab", "dabs", "dacos", "dasin", "datan", "date_and_time", "dbesj", "dbesj", "dbesjn", "dbesy", "dbesy", "dbesyn", "dble", "dcos", "dcosh", "ddim", "derf", "derfc", "dexp", "digits", "dim", "dint", "dlog", "dlog", "dmax", "dmin", "dmod", "dnint", "dot_product", "dprod", "dsign", "dsinh", "dsin", "dsqrt", "dtanh", "dtan", "dtime", "eoshift", "epsilon", "erf", "erfc", "etime", "exit", "exp", "exponent", "extends_type_of", "fdate", "fget", "fgetc", "float", "floor", "flush", "fnum", "fputc", "fput", "fraction", "fseek", "fstat", "ftell", "gerror", "getarg", "get_command", "get_command_argument", "get_environment_variable", "getcwd", "getenv", "getgid", "getlog", "getpid", "getuid", "gmtime", "hostnm", "huge", "iabs", "iachar", "iand", "iargc", "ibclr", "ibits", "ibset", "ichar", "idate", "idim", "idint", "idnint", "ieor", "ierrno", "ifix", "imag", "imagpart", "index", "int", "ior", "irand", "isatty", "ishft", "ishftc", "isign", "iso_c_binding", "is_iostat_end", "is_iostat_eor", "itime", "kill", "kind", "lbound", "len", "len_trim", "lge", "lgt", "link", "lle", "llt", "lnblnk", "loc", "log", "logical", "long", "lshift", "lstat", "ltime", "matmul", "max", "maxexponent", "maxloc", "maxval", "mclock", "merge", "move_alloc", "min", "minexponent", "minloc", "minval", "mod", "modulo", "mvbits", "nearest", "new_line", "nint", "not", "or", "pack", "perror", "precision", "present", "product", "radix", "rand", "random_number", "random_seed", "range", "real", "realpart", "rename", "repeat", "reshape", "rrspacing", "rshift", "same_type_as", "scale", "scan", "second", "selected_int_kind", "selected_real_kind", "set_exponent", "shape", "short", "sign", "signal", "sinh", "sin", "sleep", "sngl", "spacing", "spread", "sqrt", "srand", "stat", "sum", "symlnk", "system", "system_clock", "tan", "tanh", "time", "tiny", "transfer", "transpose", "trim", "ttynam", "ubound", "umask", "unlink", "unpack", "verify", "xor", "zabs", "zcos", "zexp", "zlog", "zsin", "zsqrt"]); var dataTypes = words(["c_bool", "c_char", "c_double", "c_double_complex", "c_float", "c_float_complex", "c_funptr", "c_int", "c_int16_t", "c_int32_t", "c_int64_t", "c_int8_t", "c_int_fast16_t", "c_int_fast32_t", "c_int_fast64_t", "c_int_fast8_t", "c_int_least16_t", "c_int_least32_t", "c_int_least64_t", "c_int_least8_t", "c_intmax_t", "c_intptr_t", "c_long", "c_long_double", "c_long_double_complex", "c_long_long", "c_ptr", "c_short", "c_signed_char", "c_size_t", "character", "complex", "double", "integer", "logical", "real"]); var isOperatorChar = /[+\-*&=<>\/\:]/; var litOperator = new RegExp("(\.and\.|\.or\.|\.eq\.|\.lt\.|\.le\.|\.gt\.|\.ge\.|\.ne\.|\.not\.|\.eqv\.|\.neqv\.)", "i"); function tokenBase(stream, state) { if (stream.match(litOperator)){ return 'operator'; } var ch = stream.next(); if (ch == "!") { stream.skipToEnd(); return "comment"; } if (ch == '"' || ch == "'") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } if (/[\[\]\(\),]/.test(ch)) { return null; } if (/\d/.test(ch)) { stream.eatWhile(/[\w\.]/); return "number"; } if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return "operator"; } stream.eatWhile(/[\w\$_]/); var word = stream.current().toLowerCase(); if (keywords.hasOwnProperty(word)){ return 'keyword'; } if (builtins.hasOwnProperty(word) || dataTypes.hasOwnProperty(word)) { return 'builtin'; } return "variable"; } function tokenString(quote) { return function(stream, state) { var escaped = false, next, end = false; while ((next = stream.next()) != null) { if (next == quote && !escaped) { end = true; break; } escaped = !escaped && next == "\\"; } if (end || !escaped) state.tokenize = null; return "string"; }; } // Interface return { startState: function() { return {tokenize: null}; }, token: function(stream, state) { if (stream.eatSpace()) return null; var style = (state.tokenize || tokenBase)(stream, state); if (style == "comment" || style == "meta") return style; return style; } }; }); CodeMirror.defineMIME("text/x-fortran", "fortran"); }); ================================================ FILE: base/res/codemirror/mode/fortran/index.html ================================================ CodeMirror: Fortran mode

Fortran mode

MIME types defined: text/x-Fortran.

================================================ FILE: base/res/codemirror/mode/gas/gas.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("gas", function(_config, parserConfig) { 'use strict'; // If an architecture is specified, its initialization function may // populate this array with custom parsing functions which will be // tried in the event that the standard functions do not find a match. var custom = []; // The symbol used to start a line comment changes based on the target // architecture. // If no architecture is pased in "parserConfig" then only multiline // comments will have syntax support. var lineCommentStartSymbol = ""; // These directives are architecture independent. // Machine specific directives should go in their respective // architecture initialization function. // Reference: // http://sourceware.org/binutils/docs/as/Pseudo-Ops.html#Pseudo-Ops var directives = { ".abort" : "builtin", ".align" : "builtin", ".altmacro" : "builtin", ".ascii" : "builtin", ".asciz" : "builtin", ".balign" : "builtin", ".balignw" : "builtin", ".balignl" : "builtin", ".bundle_align_mode" : "builtin", ".bundle_lock" : "builtin", ".bundle_unlock" : "builtin", ".byte" : "builtin", ".cfi_startproc" : "builtin", ".comm" : "builtin", ".data" : "builtin", ".def" : "builtin", ".desc" : "builtin", ".dim" : "builtin", ".double" : "builtin", ".eject" : "builtin", ".else" : "builtin", ".elseif" : "builtin", ".end" : "builtin", ".endef" : "builtin", ".endfunc" : "builtin", ".endif" : "builtin", ".equ" : "builtin", ".equiv" : "builtin", ".eqv" : "builtin", ".err" : "builtin", ".error" : "builtin", ".exitm" : "builtin", ".extern" : "builtin", ".fail" : "builtin", ".file" : "builtin", ".fill" : "builtin", ".float" : "builtin", ".func" : "builtin", ".global" : "builtin", ".gnu_attribute" : "builtin", ".hidden" : "builtin", ".hword" : "builtin", ".ident" : "builtin", ".if" : "builtin", ".incbin" : "builtin", ".include" : "builtin", ".int" : "builtin", ".internal" : "builtin", ".irp" : "builtin", ".irpc" : "builtin", ".lcomm" : "builtin", ".lflags" : "builtin", ".line" : "builtin", ".linkonce" : "builtin", ".list" : "builtin", ".ln" : "builtin", ".loc" : "builtin", ".loc_mark_labels" : "builtin", ".local" : "builtin", ".long" : "builtin", ".macro" : "builtin", ".mri" : "builtin", ".noaltmacro" : "builtin", ".nolist" : "builtin", ".octa" : "builtin", ".offset" : "builtin", ".org" : "builtin", ".p2align" : "builtin", ".popsection" : "builtin", ".previous" : "builtin", ".print" : "builtin", ".protected" : "builtin", ".psize" : "builtin", ".purgem" : "builtin", ".pushsection" : "builtin", ".quad" : "builtin", ".reloc" : "builtin", ".rept" : "builtin", ".sbttl" : "builtin", ".scl" : "builtin", ".section" : "builtin", ".set" : "builtin", ".short" : "builtin", ".single" : "builtin", ".size" : "builtin", ".skip" : "builtin", ".sleb128" : "builtin", ".space" : "builtin", ".stab" : "builtin", ".string" : "builtin", ".struct" : "builtin", ".subsection" : "builtin", ".symver" : "builtin", ".tag" : "builtin", ".text" : "builtin", ".title" : "builtin", ".type" : "builtin", ".uleb128" : "builtin", ".val" : "builtin", ".version" : "builtin", ".vtable_entry" : "builtin", ".vtable_inherit" : "builtin", ".warning" : "builtin", ".weak" : "builtin", ".weakref" : "builtin", ".word" : "builtin" }; var registers = {}; function x86(_parserConfig) { lineCommentStartSymbol = "#"; registers.ax = "variable"; registers.eax = "variable-2"; registers.rax = "variable-3"; registers.bx = "variable"; registers.ebx = "variable-2"; registers.rbx = "variable-3"; registers.cx = "variable"; registers.ecx = "variable-2"; registers.rcx = "variable-3"; registers.dx = "variable"; registers.edx = "variable-2"; registers.rdx = "variable-3"; registers.si = "variable"; registers.esi = "variable-2"; registers.rsi = "variable-3"; registers.di = "variable"; registers.edi = "variable-2"; registers.rdi = "variable-3"; registers.sp = "variable"; registers.esp = "variable-2"; registers.rsp = "variable-3"; registers.bp = "variable"; registers.ebp = "variable-2"; registers.rbp = "variable-3"; registers.ip = "variable"; registers.eip = "variable-2"; registers.rip = "variable-3"; registers.cs = "keyword"; registers.ds = "keyword"; registers.ss = "keyword"; registers.es = "keyword"; registers.fs = "keyword"; registers.gs = "keyword"; } function armv6(_parserConfig) { // Reference: // http://infocenter.arm.com/help/topic/com.arm.doc.qrc0001l/QRC0001_UAL.pdf // http://infocenter.arm.com/help/topic/com.arm.doc.ddi0301h/DDI0301H_arm1176jzfs_r0p7_trm.pdf lineCommentStartSymbol = "@"; directives.syntax = "builtin"; registers.r0 = "variable"; registers.r1 = "variable"; registers.r2 = "variable"; registers.r3 = "variable"; registers.r4 = "variable"; registers.r5 = "variable"; registers.r6 = "variable"; registers.r7 = "variable"; registers.r8 = "variable"; registers.r9 = "variable"; registers.r10 = "variable"; registers.r11 = "variable"; registers.r12 = "variable"; registers.sp = "variable-2"; registers.lr = "variable-2"; registers.pc = "variable-2"; registers.r13 = registers.sp; registers.r14 = registers.lr; registers.r15 = registers.pc; custom.push(function(ch, stream) { if (ch === '#') { stream.eatWhile(/\w/); return "number"; } }); } var arch = (parserConfig.architecture || "x86").toLowerCase(); if (arch === "x86") { x86(parserConfig); } else if (arch === "arm" || arch === "armv6") { armv6(parserConfig); } function nextUntilUnescaped(stream, end) { var escaped = false, next; while ((next = stream.next()) != null) { if (next === end && !escaped) { return false; } escaped = !escaped && next === "\\"; } return escaped; } function clikeComment(stream, state) { var maybeEnd = false, ch; while ((ch = stream.next()) != null) { if (ch === "/" && maybeEnd) { state.tokenize = null; break; } maybeEnd = (ch === "*"); } return "comment"; } return { startState: function() { return { tokenize: null }; }, token: function(stream, state) { if (state.tokenize) { return state.tokenize(stream, state); } if (stream.eatSpace()) { return null; } var style, cur, ch = stream.next(); if (ch === "/") { if (stream.eat("*")) { state.tokenize = clikeComment; return clikeComment(stream, state); } } if (ch === lineCommentStartSymbol) { stream.skipToEnd(); return "comment"; } if (ch === '"') { nextUntilUnescaped(stream, '"'); return "string"; } if (ch === '.') { stream.eatWhile(/\w/); cur = stream.current().toLowerCase(); style = directives[cur]; return style || null; } if (ch === '=') { stream.eatWhile(/\w/); return "tag"; } if (ch === '{') { return "braket"; } if (ch === '}') { return "braket"; } if (/\d/.test(ch)) { if (ch === "0" && stream.eat("x")) { stream.eatWhile(/[0-9a-fA-F]/); return "number"; } stream.eatWhile(/\d/); return "number"; } if (/\w/.test(ch)) { stream.eatWhile(/\w/); if (stream.eat(":")) { return 'tag'; } cur = stream.current().toLowerCase(); style = registers[cur]; return style || null; } for (var i = 0; i < custom.length; i++) { style = custom[i](ch, stream, state); if (style) { return style; } } }, lineComment: lineCommentStartSymbol, blockCommentStart: "/*", blockCommentEnd: "*/" }; }); }); ================================================ FILE: base/res/codemirror/mode/gas/index.html ================================================ CodeMirror: Gas mode

Gas mode

Handles AT&T assembler syntax (more specifically this handles the GNU Assembler (gas) syntax.) It takes a single optional configuration parameter: architecture, which can be one of "ARM", "ARMv6" or "x86". Including the parameter adds syntax for the registers and special directives for the supplied architecture.

MIME types defined: text/x-gas

================================================ FILE: base/res/codemirror/mode/gfm/gfm.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../markdown/markdown"), require("../../addon/mode/overlay")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../markdown/markdown", "../../addon/mode/overlay"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("gfm", function(config, modeConfig) { var codeDepth = 0; function blankLine(state) { state.code = false; return null; } var gfmOverlay = { startState: function() { return { code: false, codeBlock: false, ateSpace: false }; }, copyState: function(s) { return { code: s.code, codeBlock: s.codeBlock, ateSpace: s.ateSpace }; }, token: function(stream, state) { state.combineTokens = null; // Hack to prevent formatting override inside code blocks (block and inline) if (state.codeBlock) { if (stream.match(/^```/)) { state.codeBlock = false; return null; } stream.skipToEnd(); return null; } if (stream.sol()) { state.code = false; } if (stream.sol() && stream.match(/^```/)) { stream.skipToEnd(); state.codeBlock = true; return null; } // If this block is changed, it may need to be updated in Markdown mode if (stream.peek() === '`') { stream.next(); var before = stream.pos; stream.eatWhile('`'); var difference = 1 + stream.pos - before; if (!state.code) { codeDepth = difference; state.code = true; } else { if (difference === codeDepth) { // Must be exact state.code = false; } } return null; } else if (state.code) { stream.next(); return null; } // Check if space. If so, links can be formatted later on if (stream.eatSpace()) { state.ateSpace = true; return null; } if (stream.sol() || state.ateSpace) { state.ateSpace = false; if(stream.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+@)?(?:[a-f0-9]{7,40}\b)/)) { // User/Project@SHA // User@SHA // SHA state.combineTokens = true; return "link"; } else if (stream.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+)?#[0-9]+\b/)) { // User/Project#Num // User#Num // #Num state.combineTokens = true; return "link"; } } if (stream.match(/^((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]|\([^\s()<>]*\))+(?:\([^\s()<>]*\)|[^\s`*!()\[\]{};:'".,<>?«»“”‘’]))/i) && stream.string.slice(stream.start - 2, stream.start) != "](") { // URLs // Taken from http://daringfireball.net/2010/07/improved_regex_for_matching_urls // And then (issue #1160) simplified to make it not crash the Chrome Regexp engine state.combineTokens = true; return "link"; } stream.next(); return null; }, blankLine: blankLine }; var markdownConfig = { underscoresBreakWords: false, taskLists: true, fencedCodeBlocks: true, strikethrough: true }; for (var attr in modeConfig) { markdownConfig[attr] = modeConfig[attr]; } markdownConfig.name = "markdown"; CodeMirror.defineMIME("gfmBase", markdownConfig); return CodeMirror.overlayMode(CodeMirror.getMode(config, "gfmBase"), gfmOverlay); }, "markdown"); }); ================================================ FILE: base/res/codemirror/mode/gfm/index.html ================================================ CodeMirror: GFM mode

GFM mode

Optionally depends on other modes for properly highlighted code blocks.

Parsing/Highlighting Tests: normal, verbose.

================================================ FILE: base/res/codemirror/mode/gfm/test.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({tabSize: 4}, "gfm"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } var modeHighlightFormatting = CodeMirror.getMode({tabSize: 4}, {name: "gfm", highlightFormatting: true}); function FT(name) { test.mode(name, modeHighlightFormatting, Array.prototype.slice.call(arguments, 1)); } FT("codeBackticks", "[comment&formatting&formatting-code `][comment foo][comment&formatting&formatting-code `]"); FT("doubleBackticks", "[comment&formatting&formatting-code ``][comment foo ` bar][comment&formatting&formatting-code ``]"); FT("codeBlock", "[comment&formatting&formatting-code-block ```css]", "[tag foo]", "[comment&formatting&formatting-code-block ```]"); FT("taskList", "[variable-2&formatting&formatting-list&formatting-list-ul - ][meta&formatting&formatting-task [ ]]][variable-2 foo]", "[variable-2&formatting&formatting-list&formatting-list-ul - ][property&formatting&formatting-task [x]]][variable-2 foo]"); FT("formatting_strikethrough", "[strikethrough&formatting&formatting-strikethrough ~~][strikethrough foo][strikethrough&formatting&formatting-strikethrough ~~]"); FT("formatting_strikethrough", "foo [strikethrough&formatting&formatting-strikethrough ~~][strikethrough bar][strikethrough&formatting&formatting-strikethrough ~~]"); MT("emInWordAsterisk", "foo[em *bar*]hello"); MT("emInWordUnderscore", "foo_bar_hello"); MT("emStrongUnderscore", "[strong __][em&strong _foo__][em _] bar"); MT("fencedCodeBlocks", "[comment ```]", "[comment foo]", "", "[comment ```]", "bar"); MT("fencedCodeBlockModeSwitching", "[comment ```javascript]", "[variable foo]", "", "[comment ```]", "bar"); MT("taskListAsterisk", "[variable-2 * []] foo]", // Invalid; must have space or x between [] "[variable-2 * [ ]]bar]", // Invalid; must have space after ] "[variable-2 * [x]]hello]", // Invalid; must have space after ] "[variable-2 * ][meta [ ]]][variable-2 [world]]]", // Valid; tests reference style links " [variable-3 * ][property [x]]][variable-3 foo]"); // Valid; can be nested MT("taskListPlus", "[variable-2 + []] foo]", // Invalid; must have space or x between [] "[variable-2 + [ ]]bar]", // Invalid; must have space after ] "[variable-2 + [x]]hello]", // Invalid; must have space after ] "[variable-2 + ][meta [ ]]][variable-2 [world]]]", // Valid; tests reference style links " [variable-3 + ][property [x]]][variable-3 foo]"); // Valid; can be nested MT("taskListDash", "[variable-2 - []] foo]", // Invalid; must have space or x between [] "[variable-2 - [ ]]bar]", // Invalid; must have space after ] "[variable-2 - [x]]hello]", // Invalid; must have space after ] "[variable-2 - ][meta [ ]]][variable-2 [world]]]", // Valid; tests reference style links " [variable-3 - ][property [x]]][variable-3 foo]"); // Valid; can be nested MT("taskListNumber", "[variable-2 1. []] foo]", // Invalid; must have space or x between [] "[variable-2 2. [ ]]bar]", // Invalid; must have space after ] "[variable-2 3. [x]]hello]", // Invalid; must have space after ] "[variable-2 4. ][meta [ ]]][variable-2 [world]]]", // Valid; tests reference style links " [variable-3 1. ][property [x]]][variable-3 foo]"); // Valid; can be nested MT("SHA", "foo [link be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2] bar"); MT("SHAEmphasis", "[em *foo ][em&link be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2][em *]"); MT("shortSHA", "foo [link be6a8cc] bar"); MT("tooShortSHA", "foo be6a8c bar"); MT("longSHA", "foo be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd22 bar"); MT("badSHA", "foo be6a8cc1c1ecfe9489fb51e4869af15a13fc2cg2 bar"); MT("userSHA", "foo [link bar@be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2] hello"); MT("userSHAEmphasis", "[em *foo ][em&link bar@be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2][em *]"); MT("userProjectSHA", "foo [link bar/hello@be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2] world"); MT("userProjectSHAEmphasis", "[em *foo ][em&link bar/hello@be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2][em *]"); MT("num", "foo [link #1] bar"); MT("numEmphasis", "[em *foo ][em&link #1][em *]"); MT("badNum", "foo #1bar hello"); MT("userNum", "foo [link bar#1] hello"); MT("userNumEmphasis", "[em *foo ][em&link bar#1][em *]"); MT("userProjectNum", "foo [link bar/hello#1] world"); MT("userProjectNumEmphasis", "[em *foo ][em&link bar/hello#1][em *]"); MT("vanillaLink", "foo [link http://www.example.com/] bar"); MT("vanillaLinkPunctuation", "foo [link http://www.example.com/]. bar"); MT("vanillaLinkExtension", "foo [link http://www.example.com/index.html] bar"); MT("vanillaLinkEmphasis", "foo [em *][em&link http://www.example.com/index.html][em *] bar"); MT("notALink", "[comment ```css]", "[tag foo] {[property color]:[keyword black];}", "[comment ```][link http://www.example.com/]"); MT("notALink", "[comment ``foo `bar` http://www.example.com/``] hello"); MT("notALink", "[comment `foo]", "[link http://www.example.com/]", "[comment `foo]", "", "[link http://www.example.com/]"); MT("headerCodeBlockGithub", "[header&header-1 # heading]", "", "[comment ```]", "[comment code]", "[comment ```]", "", "Commit: [link be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2]", "Issue: [link #1]", "Link: [link http://www.example.com/]"); MT("strikethrough", "[strikethrough ~~foo~~]"); MT("strikethroughWithStartingSpace", "~~ foo~~"); MT("strikethroughUnclosedStrayTildes", "[strikethrough ~~foo~~~]"); MT("strikethroughUnclosedStrayTildes", "[strikethrough ~~foo ~~]"); MT("strikethroughUnclosedStrayTildes", "[strikethrough ~~foo ~~ bar]"); MT("strikethroughUnclosedStrayTildes", "[strikethrough ~~foo ~~ bar~~]hello"); MT("strikethroughOneLetter", "[strikethrough ~~a~~]"); MT("strikethroughWrapped", "[strikethrough ~~foo]", "[strikethrough foo~~]"); MT("strikethroughParagraph", "[strikethrough ~~foo]", "", "foo[strikethrough ~~bar]"); MT("strikethroughEm", "[strikethrough ~~foo][em&strikethrough *bar*][strikethrough ~~]"); MT("strikethroughEm", "[em *][em&strikethrough ~~foo~~][em *]"); MT("strikethroughStrong", "[strikethrough ~~][strong&strikethrough **foo**][strikethrough ~~]"); MT("strikethroughStrong", "[strong **][strong&strikethrough ~~foo~~][strong **]"); })(); ================================================ FILE: base/res/codemirror/mode/gherkin/gherkin.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /* Gherkin mode - http://www.cukes.info/ Report bugs/issues here: https://github.com/codemirror/CodeMirror/issues */ // Following Objs from Brackets implementation: https://github.com/tregusti/brackets-gherkin/blob/master/main.js //var Quotes = { // SINGLE: 1, // DOUBLE: 2 //}; //var regex = { // keywords: /(Feature| {2}(Scenario|In order to|As|I)| {4}(Given|When|Then|And))/ //}; (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("gherkin", function () { return { startState: function () { return { lineNumber: 0, tableHeaderLine: false, allowFeature: true, allowBackground: false, allowScenario: false, allowSteps: false, allowPlaceholders: false, allowMultilineArgument: false, inMultilineString: false, inMultilineTable: false, inKeywordLine: false }; }, token: function (stream, state) { if (stream.sol()) { state.lineNumber++; state.inKeywordLine = false; if (state.inMultilineTable) { state.tableHeaderLine = false; if (!stream.match(/\s*\|/, false)) { state.allowMultilineArgument = false; state.inMultilineTable = false; } } } stream.eatSpace(); if (state.allowMultilineArgument) { // STRING if (state.inMultilineString) { if (stream.match('"""')) { state.inMultilineString = false; state.allowMultilineArgument = false; } else { stream.match(/.*/); } return "string"; } // TABLE if (state.inMultilineTable) { if (stream.match(/\|\s*/)) { return "bracket"; } else { stream.match(/[^\|]*/); return state.tableHeaderLine ? "header" : "string"; } } // DETECT START if (stream.match('"""')) { // String state.inMultilineString = true; return "string"; } else if (stream.match("|")) { // Table state.inMultilineTable = true; state.tableHeaderLine = true; return "bracket"; } } // LINE COMMENT if (stream.match(/#.*/)) { return "comment"; // TAG } else if (!state.inKeywordLine && stream.match(/@\S+/)) { return "tag"; // FEATURE } else if (!state.inKeywordLine && state.allowFeature && stream.match(/(機能|功能|フィーチャ|기능|โครงหลัก|ความสามารถ|ความต้องการทางธุรกิจ|ಹೆಚ್ಚಳ|గుణము|ਮੁਹਾਂਦਰਾ|ਨਕਸ਼ ਨੁਹਾਰ|ਖਾਸੀਅਤ|रूप लेख|وِیژگی|خاصية|תכונה|Функціонал|Функция|Функционалност|Функционал|Үзенчәлеклелек|Свойство|Особина|Мөмкинлек|Могућност|Λειτουργία|Δυνατότητα|Właściwość|Vlastnosť|Trajto|Tính năng|Savybė|Pretty much|Požiadavka|Požadavek|Potrzeba biznesowa|Özellik|Osobina|Ominaisuus|Omadus|OH HAI|Mogućnost|Mogucnost|Jellemző|Hwæt|Hwaet|Funzionalità|Funktionalitéit|Funktionalität|Funkcja|Funkcionalnost|Funkcionalitāte|Funkcia|Fungsi|Functionaliteit|Funcționalitate|Funcţionalitate|Functionalitate|Funcionalitat|Funcionalidade|Fonctionnalité|Fitur|Fīča|Feature|Eiginleiki|Egenskap|Egenskab|Característica|Caracteristica|Business Need|Aspekt|Arwedd|Ahoy matey!|Ability):/)) { state.allowScenario = true; state.allowBackground = true; state.allowPlaceholders = false; state.allowSteps = false; state.allowMultilineArgument = false; state.inKeywordLine = true; return "keyword"; // BACKGROUND } else if (!state.inKeywordLine && state.allowBackground && stream.match(/(背景|배경|แนวคิด|ಹಿನ್ನೆಲೆ|నేపథ్యం|ਪਿਛੋਕੜ|पृष्ठभूमि|زمینه|الخلفية|רקע|Тарих|Предыстория|Предистория|Позадина|Передумова|Основа|Контекст|Кереш|Υπόβαθρο|Założenia|Yo\-ho\-ho|Tausta|Taust|Situācija|Rerefons|Pozadina|Pozadie|Pozadí|Osnova|Latar Belakang|Kontext|Konteksts|Kontekstas|Kontekst|Háttér|Hannergrond|Grundlage|Geçmiş|Fundo|Fono|First off|Dis is what went down|Dasar|Contexto|Contexte|Context|Contesto|Cenário de Fundo|Cenario de Fundo|Cefndir|Bối cảnh|Bakgrunnur|Bakgrunn|Bakgrund|Baggrund|Background|B4|Antecedents|Antecedentes|Ær|Aer|Achtergrond):/)) { state.allowPlaceholders = false; state.allowSteps = true; state.allowBackground = false; state.allowMultilineArgument = false; state.inKeywordLine = true; return "keyword"; // SCENARIO OUTLINE } else if (!state.inKeywordLine && state.allowScenario && stream.match(/(場景大綱|场景大纲|劇本大綱|剧本大纲|テンプレ|シナリオテンプレート|シナリオテンプレ|シナリオアウトライン|시나리오 개요|สรุปเหตุการณ์|โครงสร้างของเหตุการณ์|ವಿವರಣೆ|కథనం|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਟਕਥਾ ਢਾਂਚਾ|परिदृश्य रूपरेखा|سيناريو مخطط|الگوی سناریو|תבנית תרחיש|Сценарийның төзелеше|Сценарий структураси|Структура сценарію|Структура сценария|Структура сценарија|Скица|Рамка на сценарий|Концепт|Περιγραφή Σεναρίου|Wharrimean is|Template Situai|Template Senario|Template Keadaan|Tapausaihio|Szenariogrundriss|Szablon scenariusza|Swa hwær swa|Swa hwaer swa|Struktura scenarija|Structură scenariu|Structura scenariu|Skica|Skenario konsep|Shiver me timbers|Senaryo taslağı|Schema dello scenario|Scenariomall|Scenariomal|Scenario Template|Scenario Outline|Scenario Amlinellol|Scenārijs pēc parauga|Scenarijaus šablonas|Reckon it's like|Raamstsenaarium|Plang vum Szenario|Plan du Scénario|Plan du scénario|Osnova scénáře|Osnova Scenára|Náčrt Scenáru|Náčrt Scénáře|Náčrt Scenára|MISHUN SRSLY|Menggariskan Senario|Lýsing Dæma|Lýsing Atburðarásar|Konturo de la scenaro|Koncept|Khung tình huống|Khung kịch bản|Forgatókönyv vázlat|Esquema do Cenário|Esquema do Cenario|Esquema del escenario|Esquema de l'escenari|Esbozo do escenario|Delineação do Cenário|Delineacao do Cenario|All y'all|Abstrakt Scenario|Abstract Scenario):/)) { state.allowPlaceholders = true; state.allowSteps = true; state.allowMultilineArgument = false; state.inKeywordLine = true; return "keyword"; // EXAMPLES } else if (state.allowScenario && stream.match(/(例子|例|サンプル|예|ชุดของเหตุการณ์|ชุดของตัวอย่าง|ಉದಾಹರಣೆಗಳು|ఉదాహరణలు|ਉਦਾਹਰਨਾਂ|उदाहरण|نمونه ها|امثلة|דוגמאות|Үрнәкләр|Сценарији|Примеры|Примери|Приклади|Мисоллар|Мисаллар|Σενάρια|Παραδείγματα|You'll wanna|Voorbeelden|Variantai|Tapaukset|Se þe|Se the|Se ðe|Scenarios|Scenariji|Scenarijai|Przykłady|Primjeri|Primeri|Příklady|Príklady|Piemēri|Példák|Pavyzdžiai|Paraugs|Örnekler|Juhtumid|Exemplos|Exemples|Exemple|Exempel|EXAMPLZ|Examples|Esempi|Enghreifftiau|Ekzemploj|Eksempler|Ejemplos|Dữ liệu|Dead men tell no tales|Dæmi|Contoh|Cenários|Cenarios|Beispiller|Beispiele|Atburðarásir):/)) { state.allowPlaceholders = false; state.allowSteps = true; state.allowBackground = false; state.allowMultilineArgument = true; return "keyword"; // SCENARIO } else if (!state.inKeywordLine && state.allowScenario && stream.match(/(場景|场景|劇本|剧本|シナリオ|시나리오|เหตุการณ์|ಕಥಾಸಾರಾಂಶ|సన్నివేశం|ਪਟਕਥਾ|परिदृश्य|سيناريو|سناریو|תרחיש|Сценарій|Сценарио|Сценарий|Пример|Σενάριο|Tình huống|The thing of it is|Tapaus|Szenario|Swa|Stsenaarium|Skenario|Situai|Senaryo|Senario|Scenaro|Scenariusz|Scenariu|Scénario|Scenario|Scenarijus|Scenārijs|Scenarij|Scenarie|Scénář|Scenár|Primer|MISHUN|Kịch bản|Keadaan|Heave to|Forgatókönyv|Escenario|Escenari|Cenário|Cenario|Awww, look mate|Atburðarás):/)) { state.allowPlaceholders = false; state.allowSteps = true; state.allowBackground = false; state.allowMultilineArgument = false; state.inKeywordLine = true; return "keyword"; // STEPS } else if (!state.inKeywordLine && state.allowSteps && stream.match(/(那麼|那么|而且|當|当|并且|同時|同时|前提|假设|假設|假定|假如|但是|但し|並且|もし|ならば|ただし|しかし|かつ|하지만|조건|먼저|만일|만약|단|그리고|그러면|และ |เมื่อ |แต่ |ดังนั้น |กำหนดให้ |ಸ್ಥಿತಿಯನ್ನು |ಮತ್ತು |ನೀಡಿದ |ನಂತರ |ಆದರೆ |మరియు |చెప్పబడినది |కాని |ఈ పరిస్థితిలో |అప్పుడు |ਪਰ |ਤਦ |ਜੇਕਰ |ਜਿਵੇਂ ਕਿ |ਜਦੋਂ |ਅਤੇ |यदि |परन्तु |पर |तब |तदा |तथा |जब |चूंकि |किन्तु |कदा |और |अगर |و |هنگامی |متى |لكن |عندما |ثم |بفرض |با فرض |اما |اذاً |آنگاه |כאשר |וגם |בהינתן |אזי |אז |אבל |Якщо |Һәм |Унда |Тоді |Тогда |То |Также |Та |Пусть |Припустимо, що |Припустимо |Онда |Но |Нехай |Нәтиҗәдә |Лекин |Ләкин |Коли |Когда |Когато |Када |Кад |К тому же |І |И |Задато |Задати |Задате |Если |Допустим |Дано |Дадено |Вә |Ва |Бирок |Әмма |Әйтик |Әгәр |Аммо |Али |Але |Агар |А також |А |Τότε |Όταν |Και |Δεδομένου |Αλλά |Þurh |Þegar |Þa þe |Þá |Þa |Zatati |Zakładając |Zadato |Zadate |Zadano |Zadani |Zadan |Za předpokladu |Za predpokladu |Youse know when youse got |Youse know like when |Yna |Yeah nah |Y'know |Y |Wun |Wtedy |When y'all |When |Wenn |WEN |wann |Ve |Và |Und |Un |ugeholl |Too right |Thurh |Thì |Then y'all |Then |Tha the |Tha |Tetapi |Tapi |Tak |Tada |Tad |Stel |Soit |Siis |Și |Şi |Si |Sed |Se |Så |Quando |Quand |Quan |Pryd |Potom |Pokud |Pokiaľ |Però |Pero |Pak |Oraz |Onda |Ond |Oletetaan |Og |Och |O zaman |Niin |Nhưng |När |Når |Mutta |Men |Mas |Maka |Majd |Mając |Mais |Maar |mä |Ma |Lorsque |Lorsqu'|Logo |Let go and haul |Kun |Kuid |Kui |Kiedy |Khi |Ketika |Kemudian |Keď |Když |Kaj |Kai |Kada |Kad |Jeżeli |Jeśli |Ja |It's just unbelievable |Ir |I CAN HAZ |I |Ha |Givun |Givet |Given y'all |Given |Gitt |Gegeven |Gegeben seien |Gegeben sei |Gdy |Gangway! |Fakat |Étant donnés |Etant donnés |Étant données |Etant données |Étant donnée |Etant donnée |Étant donné |Etant donné |Et |És |Entonces |Entón |Então |Entao |En |Eğer ki |Ef |Eeldades |E |Ðurh |Duota |Dun |Donitaĵo |Donat |Donada |Do |Diyelim ki |Diberi |Dengan |Den youse gotta |DEN |De |Dato |Dați fiind |Daţi fiind |Dati fiind |Dati |Date fiind |Date |Data |Dat fiind |Dar |Dann |dann |Dan |Dados |Dado |Dadas |Dada |Ða ðe |Ða |Cuando |Cho |Cando |Când |Cand |Cal |But y'all |But at the end of the day I reckon |BUT |But |Buh |Blimey! |Biết |Bet |Bagi |Aye |awer |Avast! |Atunci |Atesa |Atès |Apabila |Anrhegedig a |Angenommen |And y'all |And |AN |An |an |Amikor |Amennyiben |Ama |Als |Alors |Allora |Ali |Aleshores |Ale |Akkor |Ak |Adott |Ac |Aber |A zároveň |A tiež |A taktiež |A také |A |a |7 |\* )/)) { state.inStep = true; state.allowPlaceholders = true; state.allowMultilineArgument = true; state.inKeywordLine = true; return "keyword"; // INLINE STRING } else if (stream.match(/"[^"]*"?/)) { return "string"; // PLACEHOLDER } else if (state.allowPlaceholders && stream.match(/<[^>]*>?/)) { return "variable"; // Fall through } else { stream.next(); stream.eatWhile(/[^@"<#]/); return null; } } }; }); CodeMirror.defineMIME("text/x-feature", "gherkin"); }); ================================================ FILE: base/res/codemirror/mode/gherkin/index.html ================================================ CodeMirror: Gherkin mode

Gherkin mode

MIME types defined: text/x-feature.

================================================ FILE: base/res/codemirror/mode/go/go.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("go", function(config) { var indentUnit = config.indentUnit; var keywords = { "break":true, "case":true, "chan":true, "const":true, "continue":true, "default":true, "defer":true, "else":true, "fallthrough":true, "for":true, "func":true, "go":true, "goto":true, "if":true, "import":true, "interface":true, "map":true, "package":true, "range":true, "return":true, "select":true, "struct":true, "switch":true, "type":true, "var":true, "bool":true, "byte":true, "complex64":true, "complex128":true, "float32":true, "float64":true, "int8":true, "int16":true, "int32":true, "int64":true, "string":true, "uint8":true, "uint16":true, "uint32":true, "uint64":true, "int":true, "uint":true, "uintptr":true }; var atoms = { "true":true, "false":true, "iota":true, "nil":true, "append":true, "cap":true, "close":true, "complex":true, "copy":true, "imag":true, "len":true, "make":true, "new":true, "panic":true, "print":true, "println":true, "real":true, "recover":true }; var isOperatorChar = /[+\-*&^%:=<>!|\/]/; var curPunc; function tokenBase(stream, state) { var ch = stream.next(); if (ch == '"' || ch == "'" || ch == "`") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } if (/[\d\.]/.test(ch)) { if (ch == ".") { stream.match(/^[0-9]+([eE][\-+]?[0-9]+)?/); } else if (ch == "0") { stream.match(/^[xX][0-9a-fA-F]+/) || stream.match(/^0[0-7]+/); } else { stream.match(/^[0-9]*\.?[0-9]*([eE][\-+]?[0-9]+)?/); } return "number"; } if (/[\[\]{}\(\),;\:\.]/.test(ch)) { curPunc = ch; return null; } if (ch == "/") { if (stream.eat("*")) { state.tokenize = tokenComment; return tokenComment(stream, state); } if (stream.eat("/")) { stream.skipToEnd(); return "comment"; } } if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return "operator"; } stream.eatWhile(/[\w\$_\xa1-\uffff]/); var cur = stream.current(); if (keywords.propertyIsEnumerable(cur)) { if (cur == "case" || cur == "default") curPunc = "case"; return "keyword"; } if (atoms.propertyIsEnumerable(cur)) return "atom"; return "variable"; } function tokenString(quote) { return function(stream, state) { var escaped = false, next, end = false; while ((next = stream.next()) != null) { if (next == quote && !escaped) {end = true; break;} escaped = !escaped && next == "\\"; } if (end || !(escaped || quote == "`")) state.tokenize = tokenBase; return "string"; }; } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = tokenBase; break; } maybeEnd = (ch == "*"); } return "comment"; } function Context(indented, column, type, align, prev) { this.indented = indented; this.column = column; this.type = type; this.align = align; this.prev = prev; } function pushContext(state, col, type) { return state.context = new Context(state.indented, col, type, null, state.context); } function popContext(state) { if (!state.context.prev) return; var t = state.context.type; if (t == ")" || t == "]" || t == "}") state.indented = state.context.indented; return state.context = state.context.prev; } // Interface return { startState: function(basecolumn) { return { tokenize: null, context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), indented: 0, startOfLine: true }; }, token: function(stream, state) { var ctx = state.context; if (stream.sol()) { if (ctx.align == null) ctx.align = false; state.indented = stream.indentation(); state.startOfLine = true; if (ctx.type == "case") ctx.type = "}"; } if (stream.eatSpace()) return null; curPunc = null; var style = (state.tokenize || tokenBase)(stream, state); if (style == "comment") return style; if (ctx.align == null) ctx.align = true; if (curPunc == "{") pushContext(state, stream.column(), "}"); else if (curPunc == "[") pushContext(state, stream.column(), "]"); else if (curPunc == "(") pushContext(state, stream.column(), ")"); else if (curPunc == "case") ctx.type = "case"; else if (curPunc == "}" && ctx.type == "}") ctx = popContext(state); else if (curPunc == ctx.type) popContext(state); state.startOfLine = false; return style; }, indent: function(state, textAfter) { if (state.tokenize != tokenBase && state.tokenize != null) return 0; var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); if (ctx.type == "case" && /^(?:case|default)\b/.test(textAfter)) { state.context.type = "}"; return ctx.indented; } var closing = firstChar == ctx.type; if (ctx.align) return ctx.column + (closing ? 0 : 1); else return ctx.indented + (closing ? 0 : indentUnit); }, electricChars: "{}):", fold: "brace", blockCommentStart: "/*", blockCommentEnd: "*/", lineComment: "//" }; }); CodeMirror.defineMIME("text/x-go", "go"); }); ================================================ FILE: base/res/codemirror/mode/go/index.html ================================================ CodeMirror: Go mode

Go mode

MIME type: text/x-go

================================================ FILE: base/res/codemirror/mode/groovy/groovy.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("groovy", function(config) { function words(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } var keywords = words( "abstract as assert boolean break byte case catch char class const continue def default " + "do double else enum extends final finally float for goto if implements import in " + "instanceof int interface long native new package private protected public return " + "short static strictfp super switch synchronized threadsafe throw throws transient " + "try void volatile while"); var blockKeywords = words("catch class do else finally for if switch try while enum interface def"); var atoms = words("null true false this"); var curPunc; function tokenBase(stream, state) { var ch = stream.next(); if (ch == '"' || ch == "'") { return startString(ch, stream, state); } if (/[\[\]{}\(\),;\:\.]/.test(ch)) { curPunc = ch; return null; } if (/\d/.test(ch)) { stream.eatWhile(/[\w\.]/); if (stream.eat(/eE/)) { stream.eat(/\+\-/); stream.eatWhile(/\d/); } return "number"; } if (ch == "/") { if (stream.eat("*")) { state.tokenize.push(tokenComment); return tokenComment(stream, state); } if (stream.eat("/")) { stream.skipToEnd(); return "comment"; } if (expectExpression(state.lastToken)) { return startString(ch, stream, state); } } if (ch == "-" && stream.eat(">")) { curPunc = "->"; return null; } if (/[+\-*&%=<>!?|\/~]/.test(ch)) { stream.eatWhile(/[+\-*&%=<>|~]/); return "operator"; } stream.eatWhile(/[\w\$_]/); if (ch == "@") { stream.eatWhile(/[\w\$_\.]/); return "meta"; } if (state.lastToken == ".") return "property"; if (stream.eat(":")) { curPunc = "proplabel"; return "property"; } var cur = stream.current(); if (atoms.propertyIsEnumerable(cur)) { return "atom"; } if (keywords.propertyIsEnumerable(cur)) { if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; return "keyword"; } return "variable"; } tokenBase.isBase = true; function startString(quote, stream, state) { var tripleQuoted = false; if (quote != "/" && stream.eat(quote)) { if (stream.eat(quote)) tripleQuoted = true; else return "string"; } function t(stream, state) { var escaped = false, next, end = !tripleQuoted; while ((next = stream.next()) != null) { if (next == quote && !escaped) { if (!tripleQuoted) { break; } if (stream.match(quote + quote)) { end = true; break; } } if (quote == '"' && next == "$" && !escaped && stream.eat("{")) { state.tokenize.push(tokenBaseUntilBrace()); return "string"; } escaped = !escaped && next == "\\"; } if (end) state.tokenize.pop(); return "string"; } state.tokenize.push(t); return t(stream, state); } function tokenBaseUntilBrace() { var depth = 1; function t(stream, state) { if (stream.peek() == "}") { depth--; if (depth == 0) { state.tokenize.pop(); return state.tokenize[state.tokenize.length-1](stream, state); } } else if (stream.peek() == "{") { depth++; } return tokenBase(stream, state); } t.isBase = true; return t; } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize.pop(); break; } maybeEnd = (ch == "*"); } return "comment"; } function expectExpression(last) { return !last || last == "operator" || last == "->" || /[\.\[\{\(,;:]/.test(last) || last == "newstatement" || last == "keyword" || last == "proplabel"; } function Context(indented, column, type, align, prev) { this.indented = indented; this.column = column; this.type = type; this.align = align; this.prev = prev; } function pushContext(state, col, type) { return state.context = new Context(state.indented, col, type, null, state.context); } function popContext(state) { var t = state.context.type; if (t == ")" || t == "]" || t == "}") state.indented = state.context.indented; return state.context = state.context.prev; } // Interface return { startState: function(basecolumn) { return { tokenize: [tokenBase], context: new Context((basecolumn || 0) - config.indentUnit, 0, "top", false), indented: 0, startOfLine: true, lastToken: null }; }, token: function(stream, state) { var ctx = state.context; if (stream.sol()) { if (ctx.align == null) ctx.align = false; state.indented = stream.indentation(); state.startOfLine = true; // Automatic semicolon insertion if (ctx.type == "statement" && !expectExpression(state.lastToken)) { popContext(state); ctx = state.context; } } if (stream.eatSpace()) return null; curPunc = null; var style = state.tokenize[state.tokenize.length-1](stream, state); if (style == "comment") return style; if (ctx.align == null) ctx.align = true; if ((curPunc == ";" || curPunc == ":") && ctx.type == "statement") popContext(state); // Handle indentation for {x -> \n ... } else if (curPunc == "->" && ctx.type == "statement" && ctx.prev.type == "}") { popContext(state); state.context.align = false; } else if (curPunc == "{") pushContext(state, stream.column(), "}"); else if (curPunc == "[") pushContext(state, stream.column(), "]"); else if (curPunc == "(") pushContext(state, stream.column(), ")"); else if (curPunc == "}") { while (ctx.type == "statement") ctx = popContext(state); if (ctx.type == "}") ctx = popContext(state); while (ctx.type == "statement") ctx = popContext(state); } else if (curPunc == ctx.type) popContext(state); else if (ctx.type == "}" || ctx.type == "top" || (ctx.type == "statement" && curPunc == "newstatement")) pushContext(state, stream.column(), "statement"); state.startOfLine = false; state.lastToken = curPunc || style; return style; }, indent: function(state, textAfter) { if (!state.tokenize[state.tokenize.length-1].isBase) return 0; var firstChar = textAfter && textAfter.charAt(0), ctx = state.context; if (ctx.type == "statement" && !expectExpression(state.lastToken)) ctx = ctx.prev; var closing = firstChar == ctx.type; if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : config.indentUnit); else if (ctx.align) return ctx.column + (closing ? 0 : 1); else return ctx.indented + (closing ? 0 : config.indentUnit); }, electricChars: "{}", closeBrackets: {triples: "'\""}, fold: "brace" }; }); CodeMirror.defineMIME("text/x-groovy", "groovy"); }); ================================================ FILE: base/res/codemirror/mode/groovy/index.html ================================================ CodeMirror: Groovy mode

Groovy mode

MIME types defined: text/x-groovy

================================================ FILE: base/res/codemirror/mode/haml/haml.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../ruby/ruby")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../ruby/ruby"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; // full haml mode. This handled embeded ruby and html fragments too CodeMirror.defineMode("haml", function(config) { var htmlMode = CodeMirror.getMode(config, {name: "htmlmixed"}); var rubyMode = CodeMirror.getMode(config, "ruby"); function rubyInQuote(endQuote) { return function(stream, state) { var ch = stream.peek(); if (ch == endQuote && state.rubyState.tokenize.length == 1) { // step out of ruby context as it seems to complete processing all the braces stream.next(); state.tokenize = html; return "closeAttributeTag"; } else { return ruby(stream, state); } }; } function ruby(stream, state) { if (stream.match("-#")) { stream.skipToEnd(); return "comment"; } return rubyMode.token(stream, state.rubyState); } function html(stream, state) { var ch = stream.peek(); // handle haml declarations. All declarations that cant be handled here // will be passed to html mode if (state.previousToken.style == "comment" ) { if (state.indented > state.previousToken.indented) { stream.skipToEnd(); return "commentLine"; } } if (state.startOfLine) { if (ch == "!" && stream.match("!!")) { stream.skipToEnd(); return "tag"; } else if (stream.match(/^%[\w:#\.]+=/)) { state.tokenize = ruby; return "hamlTag"; } else if (stream.match(/^%[\w:]+/)) { return "hamlTag"; } else if (ch == "/" ) { stream.skipToEnd(); return "comment"; } } if (state.startOfLine || state.previousToken.style == "hamlTag") { if ( ch == "#" || ch == ".") { stream.match(/[\w-#\.]*/); return "hamlAttribute"; } } // donot handle --> as valid ruby, make it HTML close comment instead if (state.startOfLine && !stream.match("-->", false) && (ch == "=" || ch == "-" )) { state.tokenize = ruby; return state.tokenize(stream, state); } if (state.previousToken.style == "hamlTag" || state.previousToken.style == "closeAttributeTag" || state.previousToken.style == "hamlAttribute") { if (ch == "(") { state.tokenize = rubyInQuote(")"); return state.tokenize(stream, state); } else if (ch == "{") { state.tokenize = rubyInQuote("}"); return state.tokenize(stream, state); } } return htmlMode.token(stream, state.htmlState); } return { // default to html mode startState: function() { var htmlState = htmlMode.startState(); var rubyState = rubyMode.startState(); return { htmlState: htmlState, rubyState: rubyState, indented: 0, previousToken: { style: null, indented: 0}, tokenize: html }; }, copyState: function(state) { return { htmlState : CodeMirror.copyState(htmlMode, state.htmlState), rubyState: CodeMirror.copyState(rubyMode, state.rubyState), indented: state.indented, previousToken: state.previousToken, tokenize: state.tokenize }; }, token: function(stream, state) { if (stream.sol()) { state.indented = stream.indentation(); state.startOfLine = true; } if (stream.eatSpace()) return null; var style = state.tokenize(stream, state); state.startOfLine = false; // dont record comment line as we only want to measure comment line with // the opening comment block if (style && style != "commentLine") { state.previousToken = { style: style, indented: state.indented }; } // if current state is ruby and the previous token is not `,` reset the // tokenize to html if (stream.eol() && state.tokenize == ruby) { stream.backUp(1); var ch = stream.peek(); stream.next(); if (ch && ch != ",") { state.tokenize = html; } } // reprocess some of the specific style tag when finish setting previousToken if (style == "hamlTag") { style = "tag"; } else if (style == "commentLine") { style = "comment"; } else if (style == "hamlAttribute") { style = "attribute"; } else if (style == "closeAttributeTag") { style = null; } return style; } }; }, "htmlmixed", "ruby"); CodeMirror.defineMIME("text/x-haml", "haml"); }); ================================================ FILE: base/res/codemirror/mode/haml/index.html ================================================ CodeMirror: HAML mode

HAML mode

MIME types defined: text/x-haml.

Parsing/Highlighting Tests: normal, verbose.

================================================ FILE: base/res/codemirror/mode/haml/test.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({tabSize: 4, indentUnit: 2}, "haml"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } // Requires at least one media query MT("elementName", "[tag %h1] Hey There"); MT("oneElementPerLine", "[tag %h1] Hey There %h2"); MT("idSelector", "[tag %h1][attribute #test] Hey There"); MT("classSelector", "[tag %h1][attribute .hello] Hey There"); MT("docType", "[tag !!! XML]"); MT("comment", "[comment / Hello WORLD]"); MT("notComment", "[tag %h1] This is not a / comment "); MT("attributes", "[tag %a]([variable title][operator =][string \"test\"]){[atom :title] [operator =>] [string \"test\"]}"); MT("htmlCode", "[tag&bracket <][tag h1][tag&bracket >]Title[tag&bracket ]"); MT("rubyBlock", "[operator =][variable-2 @item]"); MT("selectorRubyBlock", "[tag %a.selector=] [variable-2 @item]"); MT("nestedRubyBlock", "[tag %a]", " [operator =][variable puts] [string \"test\"]"); MT("multilinePlaintext", "[tag %p]", " Hello,", " World"); MT("multilineRuby", "[tag %p]", " [comment -# this is a comment]", " [comment and this is a comment too]", " Date/Time", " [operator -] [variable now] [operator =] [tag DateTime][operator .][property now]", " [tag %strong=] [variable now]", " [operator -] [keyword if] [variable now] [operator >] [tag DateTime][operator .][property parse]([string \"December 31, 2006\"])", " [operator =][string \"Happy\"]", " [operator =][string \"Belated\"]", " [operator =][string \"Birthday\"]"); MT("multilineComment", "[comment /]", " [comment Multiline]", " [comment Comment]"); MT("hamlComment", "[comment -# this is a comment]"); MT("multilineHamlComment", "[comment -# this is a comment]", " [comment and this is a comment too]"); MT("multilineHTMLComment", "[comment ]"); MT("hamlAfterRubyTag", "[attribute .block]", " [tag %strong=] [variable now]", " [attribute .test]", " [operator =][variable now]", " [attribute .right]"); MT("stretchedRuby", "[operator =] [variable puts] [string \"Hello\"],", " [string \"World\"]"); MT("interpolationInHashAttribute", //"[tag %div]{[atom :id] [operator =>] [string \"#{][variable test][string }_#{][variable ting][string }\"]} test"); "[tag %div]{[atom :id] [operator =>] [string \"#{][variable test][string }_#{][variable ting][string }\"]} test"); MT("interpolationInHTMLAttribute", "[tag %div]([variable title][operator =][string \"#{][variable test][string }_#{][variable ting]()[string }\"]) Test"); })(); ================================================ FILE: base/res/codemirror/mode/handlebars/handlebars.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../../addon/mode/simple")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../../addon/mode/simple"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineSimpleMode("handlebars", { start: [ { regex: /\{\{!--/, push: "dash_comment", token: "comment" }, { regex: /\{\{!/, push: "comment", token: "comment" }, { regex: /\{\{/, push: "handlebars", token: "tag" } ], handlebars: [ { regex: /\}\}/, pop: true, token: "tag" }, // Double and single quotes { regex: /"(?:[^\\]|\\.)*?"/, token: "string" }, { regex: /'(?:[^\\]|\\.)*?'/, token: "string" }, // Handlebars keywords { regex: />|[#\/]([A-Za-z_]\w*)/, token: "keyword" }, { regex: /(?:else|this)\b/, token: "keyword" }, // Numeral { regex: /\d+/i, token: "number" }, // Atoms like = and . { regex: /=|~|@|true|false/, token: "atom" }, // Paths { regex: /(?:\.\.\/)*(?:[A-Za-z_][\w\.]*)+/, token: "variable-2" } ], dash_comment: [ { regex: /--\}\}/, pop: true, token: "comment" }, // Commented code { regex: /./, token: "comment"} ], comment: [ { regex: /\}\}/, pop: true, token: "comment" }, { regex: /./, token: "comment" } ] }); CodeMirror.defineMIME("text/x-handlebars-template", "handlebars"); }); ================================================ FILE: base/res/codemirror/mode/handlebars/index.html ================================================ CodeMirror: Handlebars mode

Handlebars

Handlebars syntax highlighting for CodeMirror.

MIME types defined: text/x-handlebars-template

================================================ FILE: base/res/codemirror/mode/haskell/haskell.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("haskell", function(_config, modeConfig) { function switchState(source, setState, f) { setState(f); return f(source, setState); } // These should all be Unicode extended, as per the Haskell 2010 report var smallRE = /[a-z_]/; var largeRE = /[A-Z]/; var digitRE = /\d/; var hexitRE = /[0-9A-Fa-f]/; var octitRE = /[0-7]/; var idRE = /[a-z_A-Z0-9'\xa1-\uffff]/; var symbolRE = /[-!#$%&*+.\/<=>?@\\^|~:]/; var specialRE = /[(),;[\]`{}]/; var whiteCharRE = /[ \t\v\f]/; // newlines are handled in tokenizer function normal(source, setState) { if (source.eatWhile(whiteCharRE)) { return null; } var ch = source.next(); if (specialRE.test(ch)) { if (ch == '{' && source.eat('-')) { var t = "comment"; if (source.eat('#')) { t = "meta"; } return switchState(source, setState, ncomment(t, 1)); } return null; } if (ch == '\'') { if (source.eat('\\')) { source.next(); // should handle other escapes here } else { source.next(); } if (source.eat('\'')) { return "string"; } return "error"; } if (ch == '"') { return switchState(source, setState, stringLiteral); } if (largeRE.test(ch)) { source.eatWhile(idRE); if (source.eat('.')) { return "qualifier"; } return "variable-2"; } if (smallRE.test(ch)) { source.eatWhile(idRE); return "variable"; } if (digitRE.test(ch)) { if (ch == '0') { if (source.eat(/[xX]/)) { source.eatWhile(hexitRE); // should require at least 1 return "integer"; } if (source.eat(/[oO]/)) { source.eatWhile(octitRE); // should require at least 1 return "number"; } } source.eatWhile(digitRE); var t = "number"; if (source.match(/^\.\d+/)) { t = "number"; } if (source.eat(/[eE]/)) { t = "number"; source.eat(/[-+]/); source.eatWhile(digitRE); // should require at least 1 } return t; } if (ch == "." && source.eat(".")) return "keyword"; if (symbolRE.test(ch)) { if (ch == '-' && source.eat(/-/)) { source.eatWhile(/-/); if (!source.eat(symbolRE)) { source.skipToEnd(); return "comment"; } } var t = "variable"; if (ch == ':') { t = "variable-2"; } source.eatWhile(symbolRE); return t; } return "error"; } function ncomment(type, nest) { if (nest == 0) { return normal; } return function(source, setState) { var currNest = nest; while (!source.eol()) { var ch = source.next(); if (ch == '{' && source.eat('-')) { ++currNest; } else if (ch == '-' && source.eat('}')) { --currNest; if (currNest == 0) { setState(normal); return type; } } } setState(ncomment(type, currNest)); return type; }; } function stringLiteral(source, setState) { while (!source.eol()) { var ch = source.next(); if (ch == '"') { setState(normal); return "string"; } if (ch == '\\') { if (source.eol() || source.eat(whiteCharRE)) { setState(stringGap); return "string"; } if (source.eat('&')) { } else { source.next(); // should handle other escapes here } } } setState(normal); return "error"; } function stringGap(source, setState) { if (source.eat('\\')) { return switchState(source, setState, stringLiteral); } source.next(); setState(normal); return "error"; } var wellKnownWords = (function() { var wkw = {}; function setType(t) { return function () { for (var i = 0; i < arguments.length; i++) wkw[arguments[i]] = t; }; } setType("keyword")( "case", "class", "data", "default", "deriving", "do", "else", "foreign", "if", "import", "in", "infix", "infixl", "infixr", "instance", "let", "module", "newtype", "of", "then", "type", "where", "_"); setType("keyword")( "\.\.", ":", "::", "=", "\\", "\"", "<-", "->", "@", "~", "=>"); setType("builtin")( "!!", "$!", "$", "&&", "+", "++", "-", ".", "/", "/=", "<", "<=", "=<<", "==", ">", ">=", ">>", ">>=", "^", "^^", "||", "*", "**"); setType("builtin")( "Bool", "Bounded", "Char", "Double", "EQ", "Either", "Enum", "Eq", "False", "FilePath", "Float", "Floating", "Fractional", "Functor", "GT", "IO", "IOError", "Int", "Integer", "Integral", "Just", "LT", "Left", "Maybe", "Monad", "Nothing", "Num", "Ord", "Ordering", "Rational", "Read", "ReadS", "Real", "RealFloat", "RealFrac", "Right", "Show", "ShowS", "String", "True"); setType("builtin")( "abs", "acos", "acosh", "all", "and", "any", "appendFile", "asTypeOf", "asin", "asinh", "atan", "atan2", "atanh", "break", "catch", "ceiling", "compare", "concat", "concatMap", "const", "cos", "cosh", "curry", "cycle", "decodeFloat", "div", "divMod", "drop", "dropWhile", "either", "elem", "encodeFloat", "enumFrom", "enumFromThen", "enumFromThenTo", "enumFromTo", "error", "even", "exp", "exponent", "fail", "filter", "flip", "floatDigits", "floatRadix", "floatRange", "floor", "fmap", "foldl", "foldl1", "foldr", "foldr1", "fromEnum", "fromInteger", "fromIntegral", "fromRational", "fst", "gcd", "getChar", "getContents", "getLine", "head", "id", "init", "interact", "ioError", "isDenormalized", "isIEEE", "isInfinite", "isNaN", "isNegativeZero", "iterate", "last", "lcm", "length", "lex", "lines", "log", "logBase", "lookup", "map", "mapM", "mapM_", "max", "maxBound", "maximum", "maybe", "min", "minBound", "minimum", "mod", "negate", "not", "notElem", "null", "odd", "or", "otherwise", "pi", "pred", "print", "product", "properFraction", "putChar", "putStr", "putStrLn", "quot", "quotRem", "read", "readFile", "readIO", "readList", "readLn", "readParen", "reads", "readsPrec", "realToFrac", "recip", "rem", "repeat", "replicate", "return", "reverse", "round", "scaleFloat", "scanl", "scanl1", "scanr", "scanr1", "seq", "sequence", "sequence_", "show", "showChar", "showList", "showParen", "showString", "shows", "showsPrec", "significand", "signum", "sin", "sinh", "snd", "span", "splitAt", "sqrt", "subtract", "succ", "sum", "tail", "take", "takeWhile", "tan", "tanh", "toEnum", "toInteger", "toRational", "truncate", "uncurry", "undefined", "unlines", "until", "unwords", "unzip", "unzip3", "userError", "words", "writeFile", "zip", "zip3", "zipWith", "zipWith3"); var override = modeConfig.overrideKeywords; if (override) for (var word in override) if (override.hasOwnProperty(word)) wkw[word] = override[word]; return wkw; })(); return { startState: function () { return { f: normal }; }, copyState: function (s) { return { f: s.f }; }, token: function(stream, state) { var t = state.f(stream, function(s) { state.f = s; }); var w = stream.current(); return wellKnownWords.hasOwnProperty(w) ? wellKnownWords[w] : t; }, blockCommentStart: "{-", blockCommentEnd: "-}", lineComment: "--" }; }); CodeMirror.defineMIME("text/x-haskell", "haskell"); }); ================================================ FILE: base/res/codemirror/mode/haskell/index.html ================================================ CodeMirror: Haskell mode

Haskell mode

MIME types defined: text/x-haskell.

================================================ FILE: base/res/codemirror/mode/haxe/haxe.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("haxe", function(config, parserConfig) { var indentUnit = config.indentUnit; // Tokenizer var keywords = function(){ function kw(type) {return {type: type, style: "keyword"};} var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c"); var operator = kw("operator"), atom = {type: "atom", style: "atom"}, attribute = {type:"attribute", style: "attribute"}; var type = kw("typedef"); return { "if": A, "while": A, "else": B, "do": B, "try": B, "return": C, "break": C, "continue": C, "new": C, "throw": C, "var": kw("var"), "inline":attribute, "static": attribute, "using":kw("import"), "public": attribute, "private": attribute, "cast": kw("cast"), "import": kw("import"), "macro": kw("macro"), "function": kw("function"), "catch": kw("catch"), "untyped": kw("untyped"), "callback": kw("cb"), "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"), "in": operator, "never": kw("property_access"), "trace":kw("trace"), "class": type, "abstract":type, "enum":type, "interface":type, "typedef":type, "extends":type, "implements":type, "dynamic":type, "true": atom, "false": atom, "null": atom }; }(); var isOperatorChar = /[+\-*&%=<>!?|]/; function chain(stream, state, f) { state.tokenize = f; return f(stream, state); } function nextUntilUnescaped(stream, end) { var escaped = false, next; while ((next = stream.next()) != null) { if (next == end && !escaped) return false; escaped = !escaped && next == "\\"; } return escaped; } // Used as scratch variables to communicate multiple values without // consing up tons of objects. var type, content; function ret(tp, style, cont) { type = tp; content = cont; return style; } function haxeTokenBase(stream, state) { var ch = stream.next(); if (ch == '"' || ch == "'") return chain(stream, state, haxeTokenString(ch)); else if (/[\[\]{}\(\),;\:\.]/.test(ch)) return ret(ch); else if (ch == "0" && stream.eat(/x/i)) { stream.eatWhile(/[\da-f]/i); return ret("number", "number"); } else if (/\d/.test(ch) || ch == "-" && stream.eat(/\d/)) { stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/); return ret("number", "number"); } else if (state.reAllowed && (ch == "~" && stream.eat(/\//))) { nextUntilUnescaped(stream, "/"); stream.eatWhile(/[gimsu]/); return ret("regexp", "string-2"); } else if (ch == "/") { if (stream.eat("*")) { return chain(stream, state, haxeTokenComment); } else if (stream.eat("/")) { stream.skipToEnd(); return ret("comment", "comment"); } else { stream.eatWhile(isOperatorChar); return ret("operator", null, stream.current()); } } else if (ch == "#") { stream.skipToEnd(); return ret("conditional", "meta"); } else if (ch == "@") { stream.eat(/:/); stream.eatWhile(/[\w_]/); return ret ("metadata", "meta"); } else if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return ret("operator", null, stream.current()); } else { var word; if(/[A-Z]/.test(ch)) { stream.eatWhile(/[\w_<>]/); word = stream.current(); return ret("type", "variable-3", word); } else { stream.eatWhile(/[\w_]/); var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word]; return (known && state.kwAllowed) ? ret(known.type, known.style, word) : ret("variable", "variable", word); } } } function haxeTokenString(quote) { return function(stream, state) { if (!nextUntilUnescaped(stream, quote)) state.tokenize = haxeTokenBase; return ret("string", "string"); }; } function haxeTokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = haxeTokenBase; break; } maybeEnd = (ch == "*"); } return ret("comment", "comment"); } // Parser var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true}; function HaxeLexical(indented, column, type, align, prev, info) { this.indented = indented; this.column = column; this.type = type; this.prev = prev; this.info = info; if (align != null) this.align = align; } function inScope(state, varname) { for (var v = state.localVars; v; v = v.next) if (v.name == varname) return true; } function parseHaxe(state, style, type, content, stream) { var cc = state.cc; // Communicate our context to the combinators. // (Less wasteful than consing up a hundred closures on every call.) cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; if (!state.lexical.hasOwnProperty("align")) state.lexical.align = true; while(true) { var combinator = cc.length ? cc.pop() : statement; if (combinator(type, content)) { while(cc.length && cc[cc.length - 1].lex) cc.pop()(); if (cx.marked) return cx.marked; if (type == "variable" && inScope(state, content)) return "variable-2"; if (type == "variable" && imported(state, content)) return "variable-3"; return style; } } } function imported(state, typename) { if (/[a-z]/.test(typename.charAt(0))) return false; var len = state.importedtypes.length; for (var i = 0; i= 0; i--) cx.cc.push(arguments[i]); } function cont() { pass.apply(null, arguments); return true; } function register(varname) { var state = cx.state; if (state.context) { cx.marked = "def"; for (var v = state.localVars; v; v = v.next) if (v.name == varname) return; state.localVars = {name: varname, next: state.localVars}; } } // Combinators var defaultVars = {name: "this", next: null}; function pushcontext() { if (!cx.state.context) cx.state.localVars = defaultVars; cx.state.context = {prev: cx.state.context, vars: cx.state.localVars}; } function popcontext() { cx.state.localVars = cx.state.context.vars; cx.state.context = cx.state.context.prev; } function pushlex(type, info) { var result = function() { var state = cx.state; state.lexical = new HaxeLexical(state.indented, cx.stream.column(), type, null, state.lexical, info); }; result.lex = true; return result; } function poplex() { var state = cx.state; if (state.lexical.prev) { if (state.lexical.type == ")") state.indented = state.lexical.indented; state.lexical = state.lexical.prev; } } poplex.lex = true; function expect(wanted) { function f(type) { if (type == wanted) return cont(); else if (wanted == ";") return pass(); else return cont(f); }; return f; } function statement(type) { if (type == "@") return cont(metadef); if (type == "var") return cont(pushlex("vardef"), vardef1, expect(";"), poplex); if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex); if (type == "keyword b") return cont(pushlex("form"), statement, poplex); if (type == "{") return cont(pushlex("}"), pushcontext, block, poplex, popcontext); if (type == ";") return cont(); if (type == "attribute") return cont(maybeattribute); if (type == "function") return cont(functiondef); if (type == "for") return cont(pushlex("form"), expect("("), pushlex(")"), forspec1, expect(")"), poplex, statement, poplex); if (type == "variable") return cont(pushlex("stat"), maybelabel); if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"), block, poplex, poplex); if (type == "case") return cont(expression, expect(":")); if (type == "default") return cont(expect(":")); if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"), statement, poplex, popcontext); if (type == "import") return cont(importdef, expect(";")); if (type == "typedef") return cont(typedef); return pass(pushlex("stat"), expression, expect(";"), poplex); } function expression(type) { if (atomicTypes.hasOwnProperty(type)) return cont(maybeoperator); if (type == "function") return cont(functiondef); if (type == "keyword c") return cont(maybeexpression); if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeoperator); if (type == "operator") return cont(expression); if (type == "[") return cont(pushlex("]"), commasep(expression, "]"), poplex, maybeoperator); if (type == "{") return cont(pushlex("}"), commasep(objprop, "}"), poplex, maybeoperator); return cont(); } function maybeexpression(type) { if (type.match(/[;\}\)\],]/)) return pass(); return pass(expression); } function maybeoperator(type, value) { if (type == "operator" && /\+\+|--/.test(value)) return cont(maybeoperator); if (type == "operator" || type == ":") return cont(expression); if (type == ";") return; if (type == "(") return cont(pushlex(")"), commasep(expression, ")"), poplex, maybeoperator); if (type == ".") return cont(property, maybeoperator); if (type == "[") return cont(pushlex("]"), expression, expect("]"), poplex, maybeoperator); } function maybeattribute(type) { if (type == "attribute") return cont(maybeattribute); if (type == "function") return cont(functiondef); if (type == "var") return cont(vardef1); } function metadef(type) { if(type == ":") return cont(metadef); if(type == "variable") return cont(metadef); if(type == "(") return cont(pushlex(")"), commasep(metaargs, ")"), poplex, statement); } function metaargs(type) { if(type == "variable") return cont(); } function importdef (type, value) { if(type == "variable" && /[A-Z]/.test(value.charAt(0))) { registerimport(value); return cont(); } else if(type == "variable" || type == "property" || type == "." || value == "*") return cont(importdef); } function typedef (type, value) { if(type == "variable" && /[A-Z]/.test(value.charAt(0))) { registerimport(value); return cont(); } else if (type == "type" && /[A-Z]/.test(value.charAt(0))) { return cont(); } } function maybelabel(type) { if (type == ":") return cont(poplex, statement); return pass(maybeoperator, expect(";"), poplex); } function property(type) { if (type == "variable") {cx.marked = "property"; return cont();} } function objprop(type) { if (type == "variable") cx.marked = "property"; if (atomicTypes.hasOwnProperty(type)) return cont(expect(":"), expression); } function commasep(what, end) { function proceed(type) { if (type == ",") return cont(what, proceed); if (type == end) return cont(); return cont(expect(end)); } return function(type) { if (type == end) return cont(); else return pass(what, proceed); }; } function block(type) { if (type == "}") return cont(); return pass(statement, block); } function vardef1(type, value) { if (type == "variable"){register(value); return cont(typeuse, vardef2);} return cont(); } function vardef2(type, value) { if (value == "=") return cont(expression, vardef2); if (type == ",") return cont(vardef1); } function forspec1(type, value) { if (type == "variable") { register(value); } return cont(pushlex(")"), pushcontext, forin, expression, poplex, statement, popcontext); } function forin(_type, value) { if (value == "in") return cont(); } function functiondef(type, value) { if (type == "variable") {register(value); return cont(functiondef);} if (value == "new") return cont(functiondef); if (type == "(") return cont(pushlex(")"), pushcontext, commasep(funarg, ")"), poplex, typeuse, statement, popcontext); } function typeuse(type) { if(type == ":") return cont(typestring); } function typestring(type) { if(type == "type") return cont(); if(type == "variable") return cont(); if(type == "{") return cont(pushlex("}"), commasep(typeprop, "}"), poplex); } function typeprop(type) { if(type == "variable") return cont(typeuse); } function funarg(type, value) { if (type == "variable") {register(value); return cont(typeuse);} } // Interface return { startState: function(basecolumn) { var defaulttypes = ["Int", "Float", "String", "Void", "Std", "Bool", "Dynamic", "Array"]; return { tokenize: haxeTokenBase, reAllowed: true, kwAllowed: true, cc: [], lexical: new HaxeLexical((basecolumn || 0) - indentUnit, 0, "block", false), localVars: parserConfig.localVars, importedtypes: defaulttypes, context: parserConfig.localVars && {vars: parserConfig.localVars}, indented: 0 }; }, token: function(stream, state) { if (stream.sol()) { if (!state.lexical.hasOwnProperty("align")) state.lexical.align = false; state.indented = stream.indentation(); } if (stream.eatSpace()) return null; var style = state.tokenize(stream, state); if (type == "comment") return style; state.reAllowed = !!(type == "operator" || type == "keyword c" || type.match(/^[\[{}\(,;:]$/)); state.kwAllowed = type != '.'; return parseHaxe(state, style, type, content, stream); }, indent: function(state, textAfter) { if (state.tokenize != haxeTokenBase) return 0; var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical; if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev; var type = lexical.type, closing = firstChar == type; if (type == "vardef") return lexical.indented + 4; else if (type == "form" && firstChar == "{") return lexical.indented; else if (type == "stat" || type == "form") return lexical.indented + indentUnit; else if (lexical.info == "switch" && !closing) return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit); else if (lexical.align) return lexical.column + (closing ? 0 : 1); else return lexical.indented + (closing ? 0 : indentUnit); }, electricChars: "{}", blockCommentStart: "/*", blockCommentEnd: "*/", lineComment: "//" }; }); CodeMirror.defineMIME("text/x-haxe", "haxe"); CodeMirror.defineMode("hxml", function () { return { startState: function () { return { define: false, inString: false }; }, token: function (stream, state) { var ch = stream.peek(); var sol = stream.sol(); ///* comments */ if (ch == "#") { stream.skipToEnd(); return "comment"; } if (sol && ch == "-") { var style = "variable-2"; stream.eat(/-/); if (stream.peek() == "-") { stream.eat(/-/); style = "keyword a"; } if (stream.peek() == "D") { stream.eat(/[D]/); style = "keyword c"; state.define = true; } stream.eatWhile(/[A-Z]/i); return style; } var ch = stream.peek(); if (state.inString == false && ch == "'") { state.inString = true; ch = stream.next(); } if (state.inString == true) { if (stream.skipTo("'")) { } else { stream.skipToEnd(); } if (stream.peek() == "'") { stream.next(); state.inString = false; } return "string"; } stream.next(); return null; }, lineComment: "#" }; }); CodeMirror.defineMIME("text/x-hxml", "hxml"); }); ================================================ FILE: base/res/codemirror/mode/haxe/index.html ================================================ CodeMirror: Haxe mode

Haxe mode

Hxml mode:

MIME types defined: text/x-haxe, text/x-hxml.

================================================ FILE: base/res/codemirror/mode/htmlembedded/htmlembedded.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../../addon/mode/multiplex")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../../addon/mode/multiplex"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("htmlembedded", function(config, parserConfig) { return CodeMirror.multiplexingMode(CodeMirror.getMode(config, "htmlmixed"), { open: parserConfig.open || parserConfig.scriptStartRegex || "<%", close: parserConfig.close || parserConfig.scriptEndRegex || "%>", mode: CodeMirror.getMode(config, parserConfig.scriptingModeSpec) }); }, "htmlmixed"); CodeMirror.defineMIME("application/x-ejs", {name: "htmlembedded", scriptingModeSpec:"javascript"}); CodeMirror.defineMIME("application/x-aspx", {name: "htmlembedded", scriptingModeSpec:"text/x-csharp"}); CodeMirror.defineMIME("application/x-jsp", {name: "htmlembedded", scriptingModeSpec:"text/x-java"}); CodeMirror.defineMIME("application/x-erb", {name: "htmlembedded", scriptingModeSpec:"ruby"}); }); ================================================ FILE: base/res/codemirror/mode/htmlembedded/index.html ================================================ CodeMirror: Html Embedded Scripts mode

Html Embedded Scripts mode

Mode for html embedded scripts like JSP and ASP.NET. Depends on HtmlMixed which in turn depends on JavaScript, CSS and XML.
Other dependancies include those of the scriping language chosen.

MIME types defined: application/x-aspx (ASP.NET), application/x-ejs (Embedded Javascript), application/x-jsp (JavaServer Pages)

================================================ FILE: base/res/codemirror/mode/htmlmixed/htmlmixed.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../xml/xml"), require("../javascript/javascript"), require("../css/css")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../xml/xml", "../javascript/javascript", "../css/css"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("htmlmixed", function(config, parserConfig) { var htmlMode = CodeMirror.getMode(config, {name: "xml", htmlMode: true, multilineTagIndentFactor: parserConfig.multilineTagIndentFactor, multilineTagIndentPastTag: parserConfig.multilineTagIndentPastTag}); var cssMode = CodeMirror.getMode(config, "css"); var scriptTypes = [], scriptTypesConf = parserConfig && parserConfig.scriptTypes; scriptTypes.push({matches: /^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^$/i, mode: CodeMirror.getMode(config, "javascript")}); if (scriptTypesConf) for (var i = 0; i < scriptTypesConf.length; ++i) { var conf = scriptTypesConf[i]; scriptTypes.push({matches: conf.matches, mode: conf.mode && CodeMirror.getMode(config, conf.mode)}); } scriptTypes.push({matches: /./, mode: CodeMirror.getMode(config, "text/plain")}); function html(stream, state) { var tagName = state.htmlState.tagName; if (tagName) tagName = tagName.toLowerCase(); var style = htmlMode.token(stream, state.htmlState); if (tagName == "script" && /\btag\b/.test(style) && stream.current() == ">") { // Script block: mode to change to depends on type attribute var scriptType = stream.string.slice(Math.max(0, stream.pos - 100), stream.pos).match(/\btype\s*=\s*("[^"]+"|'[^']+'|\S+)[^<]*$/i); scriptType = scriptType ? scriptType[1] : ""; if (scriptType && /[\"\']/.test(scriptType.charAt(0))) scriptType = scriptType.slice(1, scriptType.length - 1); for (var i = 0; i < scriptTypes.length; ++i) { var tp = scriptTypes[i]; if (typeof tp.matches == "string" ? scriptType == tp.matches : tp.matches.test(scriptType)) { if (tp.mode) { state.token = script; state.localMode = tp.mode; state.localState = tp.mode.startState && tp.mode.startState(htmlMode.indent(state.htmlState, "")); } break; } } } else if (tagName == "style" && /\btag\b/.test(style) && stream.current() == ">") { state.token = css; state.localMode = cssMode; state.localState = cssMode.startState(htmlMode.indent(state.htmlState, "")); } return style; } function maybeBackup(stream, pat, style) { var cur = stream.current(); var close = cur.search(pat), m; if (close > -1) stream.backUp(cur.length - close); else if (m = cur.match(/<\/?$/)) { stream.backUp(cur.length); if (!stream.match(pat, false)) stream.match(cur); } return style; } function script(stream, state) { if (stream.match(/^<\/\s*script\s*>/i, false)) { state.token = html; state.localState = state.localMode = null; return null; } return maybeBackup(stream, /<\/\s*script\s*>/, state.localMode.token(stream, state.localState)); } function css(stream, state) { if (stream.match(/^<\/\s*style\s*>/i, false)) { state.token = html; state.localState = state.localMode = null; return null; } return maybeBackup(stream, /<\/\s*style\s*>/, cssMode.token(stream, state.localState)); } return { startState: function() { var state = htmlMode.startState(); return {token: html, localMode: null, localState: null, htmlState: state}; }, copyState: function(state) { if (state.localState) var local = CodeMirror.copyState(state.localMode, state.localState); return {token: state.token, localMode: state.localMode, localState: local, htmlState: CodeMirror.copyState(htmlMode, state.htmlState)}; }, token: function(stream, state) { return state.token(stream, state); }, indent: function(state, textAfter) { if (!state.localMode || /^\s*<\//.test(textAfter)) return htmlMode.indent(state.htmlState, textAfter); else if (state.localMode.indent) return state.localMode.indent(state.localState, textAfter); else return CodeMirror.Pass; }, innerMode: function(state) { return {state: state.localState || state.htmlState, mode: state.localMode || htmlMode}; } }; }, "xml", "javascript", "css"); CodeMirror.defineMIME("text/html", "htmlmixed"); }); ================================================ FILE: base/res/codemirror/mode/htmlmixed/index.html ================================================ CodeMirror: HTML mixed mode

HTML mixed mode

The HTML mixed mode depends on the XML, JavaScript, and CSS modes.

It takes an optional mode configuration option, scriptTypes, which can be used to add custom behavior for specific <script type="..."> tags. If given, it should hold an array of {matches, mode} objects, where matches is a string or regexp that matches the script type, and mode is either null, for script types that should stay in HTML mode, or a mode spec corresponding to the mode that should be used for the script.

MIME types defined: text/html (redefined, only takes effect if you load this parser after the XML parser).

================================================ FILE: base/res/codemirror/mode/http/http.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("http", function() { function failFirstLine(stream, state) { stream.skipToEnd(); state.cur = header; return "error"; } function start(stream, state) { if (stream.match(/^HTTP\/\d\.\d/)) { state.cur = responseStatusCode; return "keyword"; } else if (stream.match(/^[A-Z]+/) && /[ \t]/.test(stream.peek())) { state.cur = requestPath; return "keyword"; } else { return failFirstLine(stream, state); } } function responseStatusCode(stream, state) { var code = stream.match(/^\d+/); if (!code) return failFirstLine(stream, state); state.cur = responseStatusText; var status = Number(code[0]); if (status >= 100 && status < 200) { return "positive informational"; } else if (status >= 200 && status < 300) { return "positive success"; } else if (status >= 300 && status < 400) { return "positive redirect"; } else if (status >= 400 && status < 500) { return "negative client-error"; } else if (status >= 500 && status < 600) { return "negative server-error"; } else { return "error"; } } function responseStatusText(stream, state) { stream.skipToEnd(); state.cur = header; return null; } function requestPath(stream, state) { stream.eatWhile(/\S/); state.cur = requestProtocol; return "string-2"; } function requestProtocol(stream, state) { if (stream.match(/^HTTP\/\d\.\d$/)) { state.cur = header; return "keyword"; } else { return failFirstLine(stream, state); } } function header(stream) { if (stream.sol() && !stream.eat(/[ \t]/)) { if (stream.match(/^.*?:/)) { return "atom"; } else { stream.skipToEnd(); return "error"; } } else { stream.skipToEnd(); return "string"; } } function body(stream) { stream.skipToEnd(); return null; } return { token: function(stream, state) { var cur = state.cur; if (cur != header && cur != body && stream.eatSpace()) return null; return cur(stream, state); }, blankLine: function(state) { state.cur = body; }, startState: function() { return {cur: start}; } }; }); CodeMirror.defineMIME("message/http", "http"); }); ================================================ FILE: base/res/codemirror/mode/http/index.html ================================================ CodeMirror: HTTP mode

HTTP mode

MIME types defined: message/http.

================================================ FILE: base/res/codemirror/mode/idl/idl.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; function wordRegexp(words) { return new RegExp('^((' + words.join(')|(') + '))\\b', 'i'); }; var builtinArray = [ 'a_correlate', 'abs', 'acos', 'adapt_hist_equal', 'alog', 'alog2', 'alog10', 'amoeba', 'annotate', 'app_user_dir', 'app_user_dir_query', 'arg_present', 'array_equal', 'array_indices', 'arrow', 'ascii_template', 'asin', 'assoc', 'atan', 'axis', 'axis', 'bandpass_filter', 'bandreject_filter', 'barplot', 'bar_plot', 'beseli', 'beselj', 'beselk', 'besely', 'beta', 'biginteger', 'bilinear', 'bin_date', 'binary_template', 'bindgen', 'binomial', 'bit_ffs', 'bit_population', 'blas_axpy', 'blk_con', 'boolarr', 'boolean', 'boxplot', 'box_cursor', 'breakpoint', 'broyden', 'bubbleplot', 'butterworth', 'bytarr', 'byte', 'byteorder', 'bytscl', 'c_correlate', 'calendar', 'caldat', 'call_external', 'call_function', 'call_method', 'call_procedure', 'canny', 'catch', 'cd', 'cdf', 'ceil', 'chebyshev', 'check_math', 'chisqr_cvf', 'chisqr_pdf', 'choldc', 'cholsol', 'cindgen', 'cir_3pnt', 'clipboard', 'close', 'clust_wts', 'cluster', 'cluster_tree', 'cmyk_convert', 'code_coverage', 'color_convert', 'color_exchange', 'color_quan', 'color_range_map', 'colorbar', 'colorize_sample', 'colormap_applicable', 'colormap_gradient', 'colormap_rotation', 'colortable', 'comfit', 'command_line_args', 'common', 'compile_opt', 'complex', 'complexarr', 'complexround', 'compute_mesh_normals', 'cond', 'congrid', 'conj', 'constrained_min', 'contour', 'contour', 'convert_coord', 'convol', 'convol_fft', 'coord2to3', 'copy_lun', 'correlate', 'cos', 'cosh', 'cpu', 'cramer', 'createboxplotdata', 'create_cursor', 'create_struct', 'create_view', 'crossp', 'crvlength', 'ct_luminance', 'cti_test', 'cursor', 'curvefit', 'cv_coord', 'cvttobm', 'cw_animate', 'cw_animate_getp', 'cw_animate_load', 'cw_animate_run', 'cw_arcball', 'cw_bgroup', 'cw_clr_index', 'cw_colorsel', 'cw_defroi', 'cw_field', 'cw_filesel', 'cw_form', 'cw_fslider', 'cw_light_editor', 'cw_light_editor_get', 'cw_light_editor_set', 'cw_orient', 'cw_palette_editor', 'cw_palette_editor_get', 'cw_palette_editor_set', 'cw_pdmenu', 'cw_rgbslider', 'cw_tmpl', 'cw_zoom', 'db_exists', 'dblarr', 'dcindgen', 'dcomplex', 'dcomplexarr', 'define_key', 'define_msgblk', 'define_msgblk_from_file', 'defroi', 'defsysv', 'delvar', 'dendro_plot', 'dendrogram', 'deriv', 'derivsig', 'determ', 'device', 'dfpmin', 'diag_matrix', 'dialog_dbconnect', 'dialog_message', 'dialog_pickfile', 'dialog_printersetup', 'dialog_printjob', 'dialog_read_image', 'dialog_write_image', 'dictionary', 'digital_filter', 'dilate', 'dindgen', 'dissolve', 'dist', 'distance_measure', 'dlm_load', 'dlm_register', 'doc_library', 'double', 'draw_roi', 'edge_dog', 'efont', 'eigenql', 'eigenvec', 'ellipse', 'elmhes', 'emboss', 'empty', 'enable_sysrtn', 'eof', 'eos', 'erase', 'erf', 'erfc', 'erfcx', 'erode', 'errorplot', 'errplot', 'estimator_filter', 'execute', 'exit', 'exp', 'expand', 'expand_path', 'expint', 'extrac', 'extract_slice', 'f_cvf', 'f_pdf', 'factorial', 'fft', 'file_basename', 'file_chmod', 'file_copy', 'file_delete', 'file_dirname', 'file_expand_path', 'file_gunzip', 'file_gzip', 'file_info', 'file_lines', 'file_link', 'file_mkdir', 'file_move', 'file_poll_input', 'file_readlink', 'file_same', 'file_search', 'file_tar', 'file_test', 'file_untar', 'file_unzip', 'file_which', 'file_zip', 'filepath', 'findgen', 'finite', 'fix', 'flick', 'float', 'floor', 'flow3', 'fltarr', 'flush', 'format_axis_values', 'forward_function', 'free_lun', 'fstat', 'fulstr', 'funct', 'function', 'fv_test', 'fx_root', 'fz_roots', 'gamma', 'gamma_ct', 'gauss_cvf', 'gauss_pdf', 'gauss_smooth', 'gauss2dfit', 'gaussfit', 'gaussian_function', 'gaussint', 'get_drive_list', 'get_dxf_objects', 'get_kbrd', 'get_login_info', 'get_lun', 'get_screen_size', 'getenv', 'getwindows', 'greg2jul', 'grib', 'grid_input', 'grid_tps', 'grid3', 'griddata', 'gs_iter', 'h_eq_ct', 'h_eq_int', 'hanning', 'hash', 'hdf', 'hdf5', 'heap_free', 'heap_gc', 'heap_nosave', 'heap_refcount', 'heap_save', 'help', 'hilbert', 'hist_2d', 'hist_equal', 'histogram', 'hls', 'hough', 'hqr', 'hsv', 'i18n_multibytetoutf8', 'i18n_multibytetowidechar', 'i18n_utf8tomultibyte', 'i18n_widechartomultibyte', 'ibeta', 'icontour', 'iconvertcoord', 'idelete', 'identity', 'idl_base64', 'idl_container', 'idl_validname', 'idlexbr_assistant', 'idlitsys_createtool', 'idlunit', 'iellipse', 'igamma', 'igetcurrent', 'igetdata', 'igetid', 'igetproperty', 'iimage', 'image', 'image_cont', 'image_statistics', 'image_threshold', 'imaginary', 'imap', 'indgen', 'int_2d', 'int_3d', 'int_tabulated', 'intarr', 'interpol', 'interpolate', 'interval_volume', 'invert', 'ioctl', 'iopen', 'ir_filter', 'iplot', 'ipolygon', 'ipolyline', 'iputdata', 'iregister', 'ireset', 'iresolve', 'irotate', 'isa', 'isave', 'iscale', 'isetcurrent', 'isetproperty', 'ishft', 'isocontour', 'isosurface', 'isurface', 'itext', 'itranslate', 'ivector', 'ivolume', 'izoom', 'journal', 'json_parse', 'json_serialize', 'jul2greg', 'julday', 'keyword_set', 'krig2d', 'kurtosis', 'kw_test', 'l64indgen', 'la_choldc', 'la_cholmprove', 'la_cholsol', 'la_determ', 'la_eigenproblem', 'la_eigenql', 'la_eigenvec', 'la_elmhes', 'la_gm_linear_model', 'la_hqr', 'la_invert', 'la_least_square_equality', 'la_least_squares', 'la_linear_equation', 'la_ludc', 'la_lumprove', 'la_lusol', 'la_svd', 'la_tridc', 'la_trimprove', 'la_triql', 'la_trired', 'la_trisol', 'label_date', 'label_region', 'ladfit', 'laguerre', 'lambda', 'lambdap', 'lambertw', 'laplacian', 'least_squares_filter', 'leefilt', 'legend', 'legendre', 'linbcg', 'lindgen', 'linfit', 'linkimage', 'list', 'll_arc_distance', 'lmfit', 'lmgr', 'lngamma', 'lnp_test', 'loadct', 'locale_get', 'logical_and', 'logical_or', 'logical_true', 'lon64arr', 'lonarr', 'long', 'long64', 'lsode', 'lu_complex', 'ludc', 'lumprove', 'lusol', 'm_correlate', 'machar', 'make_array', 'make_dll', 'make_rt', 'map', 'mapcontinents', 'mapgrid', 'map_2points', 'map_continents', 'map_grid', 'map_image', 'map_patch', 'map_proj_forward', 'map_proj_image', 'map_proj_info', 'map_proj_init', 'map_proj_inverse', 'map_set', 'matrix_multiply', 'matrix_power', 'max', 'md_test', 'mean', 'meanabsdev', 'mean_filter', 'median', 'memory', 'mesh_clip', 'mesh_decimate', 'mesh_issolid', 'mesh_merge', 'mesh_numtriangles', 'mesh_obj', 'mesh_smooth', 'mesh_surfacearea', 'mesh_validate', 'mesh_volume', 'message', 'min', 'min_curve_surf', 'mk_html_help', 'modifyct', 'moment', 'morph_close', 'morph_distance', 'morph_gradient', 'morph_hitormiss', 'morph_open', 'morph_thin', 'morph_tophat', 'multi', 'n_elements', 'n_params', 'n_tags', 'ncdf', 'newton', 'noise_hurl', 'noise_pick', 'noise_scatter', 'noise_slur', 'norm', 'obj_class', 'obj_destroy', 'obj_hasmethod', 'obj_isa', 'obj_new', 'obj_valid', 'objarr', 'on_error', 'on_ioerror', 'online_help', 'openr', 'openu', 'openw', 'oplot', 'oploterr', 'orderedhash', 'p_correlate', 'parse_url', 'particle_trace', 'path_cache', 'path_sep', 'pcomp', 'plot', 'plot3d', 'plot', 'plot_3dbox', 'plot_field', 'ploterr', 'plots', 'polar_contour', 'polar_surface', 'polyfill', 'polyshade', 'pnt_line', 'point_lun', 'polarplot', 'poly', 'poly_2d', 'poly_area', 'poly_fit', 'polyfillv', 'polygon', 'polyline', 'polywarp', 'popd', 'powell', 'pref_commit', 'pref_get', 'pref_set', 'prewitt', 'primes', 'print', 'printf', 'printd', 'pro', 'product', 'profile', 'profiler', 'profiles', 'project_vol', 'ps_show_fonts', 'psafm', 'pseudo', 'ptr_free', 'ptr_new', 'ptr_valid', 'ptrarr', 'pushd', 'qgrid3', 'qhull', 'qromb', 'qromo', 'qsimp', 'query_*', 'query_ascii', 'query_bmp', 'query_csv', 'query_dicom', 'query_gif', 'query_image', 'query_jpeg', 'query_jpeg2000', 'query_mrsid', 'query_pict', 'query_png', 'query_ppm', 'query_srf', 'query_tiff', 'query_video', 'query_wav', 'r_correlate', 'r_test', 'radon', 'randomn', 'randomu', 'ranks', 'rdpix', 'read', 'readf', 'read_ascii', 'read_binary', 'read_bmp', 'read_csv', 'read_dicom', 'read_gif', 'read_image', 'read_interfile', 'read_jpeg', 'read_jpeg2000', 'read_mrsid', 'read_pict', 'read_png', 'read_ppm', 'read_spr', 'read_srf', 'read_sylk', 'read_tiff', 'read_video', 'read_wav', 'read_wave', 'read_x11_bitmap', 'read_xwd', 'reads', 'readu', 'real_part', 'rebin', 'recall_commands', 'recon3', 'reduce_colors', 'reform', 'region_grow', 'register_cursor', 'regress', 'replicate', 'replicate_inplace', 'resolve_all', 'resolve_routine', 'restore', 'retall', 'return', 'reverse', 'rk4', 'roberts', 'rot', 'rotate', 'round', 'routine_filepath', 'routine_info', 'rs_test', 's_test', 'save', 'savgol', 'scale3', 'scale3d', 'scatterplot', 'scatterplot3d', 'scope_level', 'scope_traceback', 'scope_varfetch', 'scope_varname', 'search2d', 'search3d', 'sem_create', 'sem_delete', 'sem_lock', 'sem_release', 'set_plot', 'set_shading', 'setenv', 'sfit', 'shade_surf', 'shade_surf_irr', 'shade_volume', 'shift', 'shift_diff', 'shmdebug', 'shmmap', 'shmunmap', 'shmvar', 'show3', 'showfont', 'signum', 'simplex', 'sin', 'sindgen', 'sinh', 'size', 'skewness', 'skip_lun', 'slicer3', 'slide_image', 'smooth', 'sobel', 'socket', 'sort', 'spawn', 'sph_4pnt', 'sph_scat', 'spher_harm', 'spl_init', 'spl_interp', 'spline', 'spline_p', 'sprsab', 'sprsax', 'sprsin', 'sprstp', 'sqrt', 'standardize', 'stddev', 'stop', 'strarr', 'strcmp', 'strcompress', 'streamline', 'streamline', 'stregex', 'stretch', 'string', 'strjoin', 'strlen', 'strlowcase', 'strmatch', 'strmessage', 'strmid', 'strpos', 'strput', 'strsplit', 'strtrim', 'struct_assign', 'struct_hide', 'strupcase', 'surface', 'surface', 'surfr', 'svdc', 'svdfit', 'svsol', 'swap_endian', 'swap_endian_inplace', 'symbol', 'systime', 't_cvf', 't_pdf', 't3d', 'tag_names', 'tan', 'tanh', 'tek_color', 'temporary', 'terminal_size', 'tetra_clip', 'tetra_surface', 'tetra_volume', 'text', 'thin', 'thread', 'threed', 'tic', 'time_test2', 'timegen', 'timer', 'timestamp', 'timestamptovalues', 'tm_test', 'toc', 'total', 'trace', 'transpose', 'tri_surf', 'triangulate', 'trigrid', 'triql', 'trired', 'trisol', 'truncate_lun', 'ts_coef', 'ts_diff', 'ts_fcast', 'ts_smooth', 'tv', 'tvcrs', 'tvlct', 'tvrd', 'tvscl', 'typename', 'uindgen', 'uint', 'uintarr', 'ul64indgen', 'ulindgen', 'ulon64arr', 'ulonarr', 'ulong', 'ulong64', 'uniq', 'unsharp_mask', 'usersym', 'value_locate', 'variance', 'vector', 'vector_field', 'vel', 'velovect', 'vert_t3d', 'voigt', 'volume', 'voronoi', 'voxel_proj', 'wait', 'warp_tri', 'watershed', 'wdelete', 'wf_draw', 'where', 'widget_base', 'widget_button', 'widget_combobox', 'widget_control', 'widget_displaycontextmenu', 'widget_draw', 'widget_droplist', 'widget_event', 'widget_info', 'widget_label', 'widget_list', 'widget_propertysheet', 'widget_slider', 'widget_tab', 'widget_table', 'widget_text', 'widget_tree', 'widget_tree_move', 'widget_window', 'wiener_filter', 'window', 'window', 'write_bmp', 'write_csv', 'write_gif', 'write_image', 'write_jpeg', 'write_jpeg2000', 'write_nrif', 'write_pict', 'write_png', 'write_ppm', 'write_spr', 'write_srf', 'write_sylk', 'write_tiff', 'write_video', 'write_wav', 'write_wave', 'writeu', 'wset', 'wshow', 'wtn', 'wv_applet', 'wv_cwt', 'wv_cw_wavelet', 'wv_denoise', 'wv_dwt', 'wv_fn_coiflet', 'wv_fn_daubechies', 'wv_fn_gaussian', 'wv_fn_haar', 'wv_fn_morlet', 'wv_fn_paul', 'wv_fn_symlet', 'wv_import_data', 'wv_import_wavelet', 'wv_plot3d_wps', 'wv_plot_multires', 'wv_pwt', 'wv_tool_denoise', 'xbm_edit', 'xdisplayfile', 'xdxf', 'xfont', 'xinteranimate', 'xloadct', 'xmanager', 'xmng_tmpl', 'xmtool', 'xobjview', 'xobjview_rotate', 'xobjview_write_image', 'xpalette', 'xpcolor', 'xplot3d', 'xregistered', 'xroi', 'xsq_test', 'xsurface', 'xvaredit', 'xvolume', 'xvolume_rotate', 'xvolume_write_image', 'xyouts', 'zlib_compress', 'zlib_uncompress', 'zoom', 'zoom_24' ]; var builtins = wordRegexp(builtinArray); var keywordArray = [ 'begin', 'end', 'endcase', 'endfor', 'endwhile', 'endif', 'endrep', 'endforeach', 'break', 'case', 'continue', 'for', 'foreach', 'goto', 'if', 'then', 'else', 'repeat', 'until', 'switch', 'while', 'do', 'pro', 'function' ]; var keywords = wordRegexp(keywordArray); CodeMirror.registerHelper("hintWords", "idl", builtinArray.concat(keywordArray)); var identifiers = new RegExp('^[_a-z\xa1-\uffff][_a-z0-9\xa1-\uffff]*', 'i'); var singleOperators = /[+\-*&=<>\/@#~$]/; var boolOperators = new RegExp('(and|or|eq|lt|le|gt|ge|ne|not)', 'i'); function tokenBase(stream) { // whitespaces if (stream.eatSpace()) return null; // Handle one line Comments if (stream.match(';')) { stream.skipToEnd(); return 'comment'; } // Handle Number Literals if (stream.match(/^[0-9\.+-]/, false)) { if (stream.match(/^[+-]?0x[0-9a-fA-F]+/)) return 'number'; if (stream.match(/^[+-]?\d*\.\d+([EeDd][+-]?\d+)?/)) return 'number'; if (stream.match(/^[+-]?\d+([EeDd][+-]?\d+)?/)) return 'number'; } // Handle Strings if (stream.match(/^"([^"]|(""))*"/)) { return 'string'; } if (stream.match(/^'([^']|(''))*'/)) { return 'string'; } // Handle words if (stream.match(keywords)) { return 'keyword'; } if (stream.match(builtins)) { return 'builtin'; } if (stream.match(identifiers)) { return 'variable'; } if (stream.match(singleOperators) || stream.match(boolOperators)) { return 'operator'; } // Handle non-detected items stream.next(); return null; }; CodeMirror.defineMode('idl', function() { return { token: function(stream) { return tokenBase(stream); } }; }); CodeMirror.defineMIME('text/x-idl', 'idl'); }); ================================================ FILE: base/res/codemirror/mode/idl/index.html ================================================ CodeMirror: IDL mode

IDL mode

MIME types defined: text/x-idl.

================================================ FILE: base/res/codemirror/mode/index.html ================================================ CodeMirror: Language Modes

Language modes

This is a list of every mode in the distribution. Each mode lives in a subdirectory of the mode/ directory, and typically defines a single JavaScript file that implements the mode. Loading such file will make the language available to CodeMirror, through the mode option.

================================================ FILE: base/res/codemirror/mode/jade/index.html ================================================ CodeMirror: Jade Templating Mode

Jade Templating Mode

The Jade Templating Mode

Created by Forbes Lindesay. Managed as part of a Brackets extension at https://github.com/ForbesLindesay/jade-brackets.

MIME type defined: text/x-jade.

================================================ FILE: base/res/codemirror/mode/jade/jade.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../javascript/javascript"), require("../css/css"), require("../htmlmixed/htmlmixed")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../javascript/javascript", "../css/css", "../htmlmixed/htmlmixed"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode('jade', function (config) { // token types var KEYWORD = 'keyword'; var DOCTYPE = 'meta'; var ID = 'builtin'; var CLASS = 'qualifier'; var ATTRS_NEST = { '{': '}', '(': ')', '[': ']' }; var jsMode = CodeMirror.getMode(config, 'javascript'); function State() { this.javaScriptLine = false; this.javaScriptLineExcludesColon = false; this.javaScriptArguments = false; this.javaScriptArgumentsDepth = 0; this.isInterpolating = false; this.interpolationNesting = 0; this.jsState = jsMode.startState(); this.restOfLine = ''; this.isIncludeFiltered = false; this.isEach = false; this.lastTag = ''; this.scriptType = ''; // Attributes Mode this.isAttrs = false; this.attrsNest = []; this.inAttributeName = true; this.attributeIsType = false; this.attrValue = ''; // Indented Mode this.indentOf = Infinity; this.indentToken = ''; this.innerMode = null; this.innerState = null; this.innerModeForLine = false; } /** * Safely copy a state * * @return {State} */ State.prototype.copy = function () { var res = new State(); res.javaScriptLine = this.javaScriptLine; res.javaScriptLineExcludesColon = this.javaScriptLineExcludesColon; res.javaScriptArguments = this.javaScriptArguments; res.javaScriptArgumentsDepth = this.javaScriptArgumentsDepth; res.isInterpolating = this.isInterpolating; res.interpolationNesting = this.intpolationNesting; res.jsState = CodeMirror.copyState(jsMode, this.jsState); res.innerMode = this.innerMode; if (this.innerMode && this.innerState) { res.innerState = CodeMirror.copyState(this.innerMode, this.innerState); } res.restOfLine = this.restOfLine; res.isIncludeFiltered = this.isIncludeFiltered; res.isEach = this.isEach; res.lastTag = this.lastTag; res.scriptType = this.scriptType; res.isAttrs = this.isAttrs; res.attrsNest = this.attrsNest.slice(); res.inAttributeName = this.inAttributeName; res.attributeIsType = this.attributeIsType; res.attrValue = this.attrValue; res.indentOf = this.indentOf; res.indentToken = this.indentToken; res.innerModeForLine = this.innerModeForLine; return res; }; function javaScript(stream, state) { if (stream.sol()) { // if javaScriptLine was set at end of line, ignore it state.javaScriptLine = false; state.javaScriptLineExcludesColon = false; } if (state.javaScriptLine) { if (state.javaScriptLineExcludesColon && stream.peek() === ':') { state.javaScriptLine = false; state.javaScriptLineExcludesColon = false; return; } var tok = jsMode.token(stream, state.jsState); if (stream.eol()) state.javaScriptLine = false; return tok || true; } } function javaScriptArguments(stream, state) { if (state.javaScriptArguments) { if (state.javaScriptArgumentsDepth === 0 && stream.peek() !== '(') { state.javaScriptArguments = false; return; } if (stream.peek() === '(') { state.javaScriptArgumentsDepth++; } else if (stream.peek() === ')') { state.javaScriptArgumentsDepth--; } if (state.javaScriptArgumentsDepth === 0) { state.javaScriptArguments = false; return; } var tok = jsMode.token(stream, state.jsState); return tok || true; } } function yieldStatement(stream) { if (stream.match(/^yield\b/)) { return 'keyword'; } } function doctype(stream) { if (stream.match(/^(?:doctype) *([^\n]+)?/)) { return DOCTYPE; } } function interpolation(stream, state) { if (stream.match('#{')) { state.isInterpolating = true; state.interpolationNesting = 0; return 'punctuation'; } } function interpolationContinued(stream, state) { if (state.isInterpolating) { if (stream.peek() === '}') { state.interpolationNesting--; if (state.interpolationNesting < 0) { stream.next(); state.isInterpolating = false; return 'puncutation'; } } else if (stream.peek() === '{') { state.interpolationNesting++; } return jsMode.token(stream, state.jsState) || true; } } function caseStatement(stream, state) { if (stream.match(/^case\b/)) { state.javaScriptLine = true; return KEYWORD; } } function when(stream, state) { if (stream.match(/^when\b/)) { state.javaScriptLine = true; state.javaScriptLineExcludesColon = true; return KEYWORD; } } function defaultStatement(stream) { if (stream.match(/^default\b/)) { return KEYWORD; } } function extendsStatement(stream, state) { if (stream.match(/^extends?\b/)) { state.restOfLine = 'string'; return KEYWORD; } } function append(stream, state) { if (stream.match(/^append\b/)) { state.restOfLine = 'variable'; return KEYWORD; } } function prepend(stream, state) { if (stream.match(/^prepend\b/)) { state.restOfLine = 'variable'; return KEYWORD; } } function block(stream, state) { if (stream.match(/^block\b *(?:(prepend|append)\b)?/)) { state.restOfLine = 'variable'; return KEYWORD; } } function include(stream, state) { if (stream.match(/^include\b/)) { state.restOfLine = 'string'; return KEYWORD; } } function includeFiltered(stream, state) { if (stream.match(/^include:([a-zA-Z0-9\-]+)/, false) && stream.match('include')) { state.isIncludeFiltered = true; return KEYWORD; } } function includeFilteredContinued(stream, state) { if (state.isIncludeFiltered) { var tok = filter(stream, state); state.isIncludeFiltered = false; state.restOfLine = 'string'; return tok; } } function mixin(stream, state) { if (stream.match(/^mixin\b/)) { state.javaScriptLine = true; return KEYWORD; } } function call(stream, state) { if (stream.match(/^\+([-\w]+)/)) { if (!stream.match(/^\( *[-\w]+ *=/, false)) { state.javaScriptArguments = true; state.javaScriptArgumentsDepth = 0; } return 'variable'; } if (stream.match(/^\+#{/, false)) { stream.next(); state.mixinCallAfter = true; return interpolation(stream, state); } } function callArguments(stream, state) { if (state.mixinCallAfter) { state.mixinCallAfter = false; if (!stream.match(/^\( *[-\w]+ *=/, false)) { state.javaScriptArguments = true; state.javaScriptArgumentsDepth = 0; } return true; } } function conditional(stream, state) { if (stream.match(/^(if|unless|else if|else)\b/)) { state.javaScriptLine = true; return KEYWORD; } } function each(stream, state) { if (stream.match(/^(- *)?(each|for)\b/)) { state.isEach = true; return KEYWORD; } } function eachContinued(stream, state) { if (state.isEach) { if (stream.match(/^ in\b/)) { state.javaScriptLine = true; state.isEach = false; return KEYWORD; } else if (stream.sol() || stream.eol()) { state.isEach = false; } else if (stream.next()) { while (!stream.match(/^ in\b/, false) && stream.next()); return 'variable'; } } } function whileStatement(stream, state) { if (stream.match(/^while\b/)) { state.javaScriptLine = true; return KEYWORD; } } function tag(stream, state) { var captures; if (captures = stream.match(/^(\w(?:[-:\w]*\w)?)\/?/)) { state.lastTag = captures[1].toLowerCase(); if (state.lastTag === 'script') { state.scriptType = 'application/javascript'; } return 'tag'; } } function filter(stream, state) { if (stream.match(/^:([\w\-]+)/)) { var innerMode; if (config && config.innerModes) { innerMode = config.innerModes(stream.current().substring(1)); } if (!innerMode) { innerMode = stream.current().substring(1); } if (typeof innerMode === 'string') { innerMode = CodeMirror.getMode(config, innerMode); } setInnerMode(stream, state, innerMode); return 'atom'; } } function code(stream, state) { if (stream.match(/^(!?=|-)/)) { state.javaScriptLine = true; return 'punctuation'; } } function id(stream) { if (stream.match(/^#([\w-]+)/)) { return ID; } } function className(stream) { if (stream.match(/^\.([\w-]+)/)) { return CLASS; } } function attrs(stream, state) { if (stream.peek() == '(') { stream.next(); state.isAttrs = true; state.attrsNest = []; state.inAttributeName = true; state.attrValue = ''; state.attributeIsType = false; return 'punctuation'; } } function attrsContinued(stream, state) { if (state.isAttrs) { if (ATTRS_NEST[stream.peek()]) { state.attrsNest.push(ATTRS_NEST[stream.peek()]); } if (state.attrsNest[state.attrsNest.length - 1] === stream.peek()) { state.attrsNest.pop(); } else if (stream.eat(')')) { state.isAttrs = false; return 'punctuation'; } if (state.inAttributeName && stream.match(/^[^=,\)!]+/)) { if (stream.peek() === '=' || stream.peek() === '!') { state.inAttributeName = false; state.jsState = jsMode.startState(); if (state.lastTag === 'script' && stream.current().trim().toLowerCase() === 'type') { state.attributeIsType = true; } else { state.attributeIsType = false; } } return 'attribute'; } var tok = jsMode.token(stream, state.jsState); if (state.attributeIsType && tok === 'string') { state.scriptType = stream.current().toString(); } if (state.attrsNest.length === 0 && (tok === 'string' || tok === 'variable' || tok === 'keyword')) { try { Function('', 'var x ' + state.attrValue.replace(/,\s*$/, '').replace(/^!/, '')); state.inAttributeName = true; state.attrValue = ''; stream.backUp(stream.current().length); return attrsContinued(stream, state); } catch (ex) { //not the end of an attribute } } state.attrValue += stream.current(); return tok || true; } } function attributesBlock(stream, state) { if (stream.match(/^&attributes\b/)) { state.javaScriptArguments = true; state.javaScriptArgumentsDepth = 0; return 'keyword'; } } function indent(stream) { if (stream.sol() && stream.eatSpace()) { return 'indent'; } } function comment(stream, state) { if (stream.match(/^ *\/\/(-)?([^\n]*)/)) { state.indentOf = stream.indentation(); state.indentToken = 'comment'; return 'comment'; } } function colon(stream) { if (stream.match(/^: */)) { return 'colon'; } } function text(stream, state) { if (stream.match(/^(?:\| ?| )([^\n]+)/)) { return 'string'; } if (stream.match(/^(<[^\n]*)/, false)) { // html string setInnerMode(stream, state, 'htmlmixed'); state.innerModeForLine = true; return innerMode(stream, state, true); } } function dot(stream, state) { if (stream.eat('.')) { var innerMode = null; if (state.lastTag === 'script' && state.scriptType.toLowerCase().indexOf('javascript') != -1) { innerMode = state.scriptType.toLowerCase().replace(/"|'/g, ''); } else if (state.lastTag === 'style') { innerMode = 'css'; } setInnerMode(stream, state, innerMode); return 'dot'; } } function fail(stream) { stream.next(); return null; } function setInnerMode(stream, state, mode) { mode = CodeMirror.mimeModes[mode] || mode; mode = config.innerModes ? config.innerModes(mode) || mode : mode; mode = CodeMirror.mimeModes[mode] || mode; mode = CodeMirror.getMode(config, mode); state.indentOf = stream.indentation(); if (mode && mode.name !== 'null') { state.innerMode = mode; } else { state.indentToken = 'string'; } } function innerMode(stream, state, force) { if (stream.indentation() > state.indentOf || (state.innerModeForLine && !stream.sol()) || force) { if (state.innerMode) { if (!state.innerState) { state.innerState = state.innerMode.startState ? state.innerMode.startState(stream.indentation()) : {}; } return stream.hideFirstChars(state.indentOf + 2, function () { return state.innerMode.token(stream, state.innerState) || true; }); } else { stream.skipToEnd(); return state.indentToken; } } else if (stream.sol()) { state.indentOf = Infinity; state.indentToken = null; state.innerMode = null; state.innerState = null; } } function restOfLine(stream, state) { if (stream.sol()) { // if restOfLine was set at end of line, ignore it state.restOfLine = ''; } if (state.restOfLine) { stream.skipToEnd(); var tok = state.restOfLine; state.restOfLine = ''; return tok; } } function startState() { return new State(); } function copyState(state) { return state.copy(); } /** * Get the next token in the stream * * @param {Stream} stream * @param {State} state */ function nextToken(stream, state) { var tok = innerMode(stream, state) || restOfLine(stream, state) || interpolationContinued(stream, state) || includeFilteredContinued(stream, state) || eachContinued(stream, state) || attrsContinued(stream, state) || javaScript(stream, state) || javaScriptArguments(stream, state) || callArguments(stream, state) || yieldStatement(stream, state) || doctype(stream, state) || interpolation(stream, state) || caseStatement(stream, state) || when(stream, state) || defaultStatement(stream, state) || extendsStatement(stream, state) || append(stream, state) || prepend(stream, state) || block(stream, state) || include(stream, state) || includeFiltered(stream, state) || mixin(stream, state) || call(stream, state) || conditional(stream, state) || each(stream, state) || whileStatement(stream, state) || tag(stream, state) || filter(stream, state) || code(stream, state) || id(stream, state) || className(stream, state) || attrs(stream, state) || attributesBlock(stream, state) || indent(stream, state) || text(stream, state) || comment(stream, state) || colon(stream, state) || dot(stream, state) || fail(stream, state); return tok === true ? null : tok; } return { startState: startState, copyState: copyState, token: nextToken }; }); CodeMirror.defineMIME('text/x-jade', 'jade'); }); ================================================ FILE: base/res/codemirror/mode/javascript/index.html ================================================ CodeMirror: JavaScript mode

JavaScript mode

JavaScript mode supports several configuration options:

  • json which will set the mode to expect JSON data rather than a JavaScript program.
  • jsonld which will set the mode to expect JSON-LD linked data rather than a JavaScript program (demo).
  • typescript which will activate additional syntax highlighting and some other things for TypeScript code (demo).
  • statementIndent which (given a number) will determine the amount of indentation to use for statements continued on a new line.
  • wordCharacters, a regexp that indicates which characters should be considered part of an identifier. Defaults to /[\w$]/, which does not handle non-ASCII identifiers. Can be set to something more elaborate to improve Unicode support.

MIME types defined: text/javascript, application/json, application/ld+json, text/typescript, application/typescript.

================================================ FILE: base/res/codemirror/mode/javascript/javascript.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // TODO actually recognize syntax of TypeScript constructs (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("javascript", function(config, parserConfig) { var indentUnit = config.indentUnit; var statementIndent = parserConfig.statementIndent; var jsonldMode = parserConfig.jsonld; var jsonMode = parserConfig.json || jsonldMode; var isTS = parserConfig.typescript; var wordRE = parserConfig.wordCharacters || /[\w$\xa1-\uffff]/; // Tokenizer var keywords = function(){ function kw(type) {return {type: type, style: "keyword"};} var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c"); var operator = kw("operator"), atom = {type: "atom", style: "atom"}; var jsKeywords = { "if": kw("if"), "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B, "return": C, "break": C, "continue": C, "new": C, "delete": C, "throw": C, "debugger": C, "var": kw("var"), "const": kw("var"), "let": kw("var"), "function": kw("function"), "catch": kw("catch"), "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"), "in": operator, "typeof": operator, "instanceof": operator, "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom, "this": kw("this"), "module": kw("module"), "class": kw("class"), "super": kw("atom"), "yield": C, "export": kw("export"), "import": kw("import"), "extends": C }; // Extend the 'normal' keywords with the TypeScript language extensions if (isTS) { var type = {type: "variable", style: "variable-3"}; var tsKeywords = { // object-like things "interface": kw("interface"), "extends": kw("extends"), "constructor": kw("constructor"), // scope modifiers "public": kw("public"), "private": kw("private"), "protected": kw("protected"), "static": kw("static"), // types "string": type, "number": type, "bool": type, "any": type }; for (var attr in tsKeywords) { jsKeywords[attr] = tsKeywords[attr]; } } return jsKeywords; }(); var isOperatorChar = /[+\-*&%=<>!?|~^]/; var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/; function readRegexp(stream) { var escaped = false, next, inSet = false; while ((next = stream.next()) != null) { if (!escaped) { if (next == "/" && !inSet) return; if (next == "[") inSet = true; else if (inSet && next == "]") inSet = false; } escaped = !escaped && next == "\\"; } } // Used as scratch variables to communicate multiple values without // consing up tons of objects. var type, content; function ret(tp, style, cont) { type = tp; content = cont; return style; } function tokenBase(stream, state) { var ch = stream.next(); if (ch == '"' || ch == "'") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } else if (ch == "." && stream.match(/^\d+(?:[eE][+\-]?\d+)?/)) { return ret("number", "number"); } else if (ch == "." && stream.match("..")) { return ret("spread", "meta"); } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) { return ret(ch); } else if (ch == "=" && stream.eat(">")) { return ret("=>", "operator"); } else if (ch == "0" && stream.eat(/x/i)) { stream.eatWhile(/[\da-f]/i); return ret("number", "number"); } else if (/\d/.test(ch)) { stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/); return ret("number", "number"); } else if (ch == "/") { if (stream.eat("*")) { state.tokenize = tokenComment; return tokenComment(stream, state); } else if (stream.eat("/")) { stream.skipToEnd(); return ret("comment", "comment"); } else if (state.lastType == "operator" || state.lastType == "keyword c" || state.lastType == "sof" || /^[\[{}\(,;:]$/.test(state.lastType)) { readRegexp(stream); stream.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/); return ret("regexp", "string-2"); } else { stream.eatWhile(isOperatorChar); return ret("operator", "operator", stream.current()); } } else if (ch == "`") { state.tokenize = tokenQuasi; return tokenQuasi(stream, state); } else if (ch == "#") { stream.skipToEnd(); return ret("error", "error"); } else if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return ret("operator", "operator", stream.current()); } else if (wordRE.test(ch)) { stream.eatWhile(wordRE); var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word]; return (known && state.lastType != ".") ? ret(known.type, known.style, word) : ret("variable", "variable", word); } } function tokenString(quote) { return function(stream, state) { var escaped = false, next; if (jsonldMode && stream.peek() == "@" && stream.match(isJsonldKeyword)){ state.tokenize = tokenBase; return ret("jsonld-keyword", "meta"); } while ((next = stream.next()) != null) { if (next == quote && !escaped) break; escaped = !escaped && next == "\\"; } if (!escaped) state.tokenize = tokenBase; return ret("string", "string"); }; } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = tokenBase; break; } maybeEnd = (ch == "*"); } return ret("comment", "comment"); } function tokenQuasi(stream, state) { var escaped = false, next; while ((next = stream.next()) != null) { if (!escaped && (next == "`" || next == "$" && stream.eat("{"))) { state.tokenize = tokenBase; break; } escaped = !escaped && next == "\\"; } return ret("quasi", "string-2", stream.current()); } var brackets = "([{}])"; // This is a crude lookahead trick to try and notice that we're // parsing the argument patterns for a fat-arrow function before we // actually hit the arrow token. It only works if the arrow is on // the same line as the arguments and there's no strange noise // (comments) in between. Fallback is to only notice when we hit the // arrow, and not declare the arguments as locals for the arrow // body. function findFatArrow(stream, state) { if (state.fatArrowAt) state.fatArrowAt = null; var arrow = stream.string.indexOf("=>", stream.start); if (arrow < 0) return; var depth = 0, sawSomething = false; for (var pos = arrow - 1; pos >= 0; --pos) { var ch = stream.string.charAt(pos); var bracket = brackets.indexOf(ch); if (bracket >= 0 && bracket < 3) { if (!depth) { ++pos; break; } if (--depth == 0) break; } else if (bracket >= 3 && bracket < 6) { ++depth; } else if (wordRE.test(ch)) { sawSomething = true; } else if (/["'\/]/.test(ch)) { return; } else if (sawSomething && !depth) { ++pos; break; } } if (sawSomething && !depth) state.fatArrowAt = pos; } // Parser var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true, "this": true, "jsonld-keyword": true}; function JSLexical(indented, column, type, align, prev, info) { this.indented = indented; this.column = column; this.type = type; this.prev = prev; this.info = info; if (align != null) this.align = align; } function inScope(state, varname) { for (var v = state.localVars; v; v = v.next) if (v.name == varname) return true; for (var cx = state.context; cx; cx = cx.prev) { for (var v = cx.vars; v; v = v.next) if (v.name == varname) return true; } } function parseJS(state, style, type, content, stream) { var cc = state.cc; // Communicate our context to the combinators. // (Less wasteful than consing up a hundred closures on every call.) cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; cx.style = style; if (!state.lexical.hasOwnProperty("align")) state.lexical.align = true; while(true) { var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement; if (combinator(type, content)) { while(cc.length && cc[cc.length - 1].lex) cc.pop()(); if (cx.marked) return cx.marked; if (type == "variable" && inScope(state, content)) return "variable-2"; return style; } } } // Combinator utils var cx = {state: null, column: null, marked: null, cc: null}; function pass() { for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]); } function cont() { pass.apply(null, arguments); return true; } function register(varname) { function inList(list) { for (var v = list; v; v = v.next) if (v.name == varname) return true; return false; } var state = cx.state; if (state.context) { cx.marked = "def"; if (inList(state.localVars)) return; state.localVars = {name: varname, next: state.localVars}; } else { if (inList(state.globalVars)) return; if (parserConfig.globalVars) state.globalVars = {name: varname, next: state.globalVars}; } } // Combinators var defaultVars = {name: "this", next: {name: "arguments"}}; function pushcontext() { cx.state.context = {prev: cx.state.context, vars: cx.state.localVars}; cx.state.localVars = defaultVars; } function popcontext() { cx.state.localVars = cx.state.context.vars; cx.state.context = cx.state.context.prev; } function pushlex(type, info) { var result = function() { var state = cx.state, indent = state.indented; if (state.lexical.type == "stat") indent = state.lexical.indented; else for (var outer = state.lexical; outer && outer.type == ")" && outer.align; outer = outer.prev) indent = outer.indented; state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info); }; result.lex = true; return result; } function poplex() { var state = cx.state; if (state.lexical.prev) { if (state.lexical.type == ")") state.indented = state.lexical.indented; state.lexical = state.lexical.prev; } } poplex.lex = true; function expect(wanted) { function exp(type) { if (type == wanted) return cont(); else if (wanted == ";") return pass(); else return cont(exp); }; return exp; } function statement(type, value) { if (type == "var") return cont(pushlex("vardef", value.length), vardef, expect(";"), poplex); if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex); if (type == "keyword b") return cont(pushlex("form"), statement, poplex); if (type == "{") return cont(pushlex("}"), block, poplex); if (type == ";") return cont(); if (type == "if") { if (cx.state.lexical.info == "else" && cx.state.cc[cx.state.cc.length - 1] == poplex) cx.state.cc.pop()(); return cont(pushlex("form"), expression, statement, poplex, maybeelse); } if (type == "function") return cont(functiondef); if (type == "for") return cont(pushlex("form"), forspec, statement, poplex); if (type == "variable") return cont(pushlex("stat"), maybelabel); if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"), block, poplex, poplex); if (type == "case") return cont(expression, expect(":")); if (type == "default") return cont(expect(":")); if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"), statement, poplex, popcontext); if (type == "module") return cont(pushlex("form"), pushcontext, afterModule, popcontext, poplex); if (type == "class") return cont(pushlex("form"), className, poplex); if (type == "export") return cont(pushlex("form"), afterExport, poplex); if (type == "import") return cont(pushlex("form"), afterImport, poplex); return pass(pushlex("stat"), expression, expect(";"), poplex); } function expression(type) { return expressionInner(type, false); } function expressionNoComma(type) { return expressionInner(type, true); } function expressionInner(type, noComma) { if (cx.state.fatArrowAt == cx.stream.start) { var body = noComma ? arrowBodyNoComma : arrowBody; if (type == "(") return cont(pushcontext, pushlex(")"), commasep(pattern, ")"), poplex, expect("=>"), body, popcontext); else if (type == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext); } var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma; if (atomicTypes.hasOwnProperty(type)) return cont(maybeop); if (type == "function") return cont(functiondef, maybeop); if (type == "keyword c") return cont(noComma ? maybeexpressionNoComma : maybeexpression); if (type == "(") return cont(pushlex(")"), maybeexpression, comprehension, expect(")"), poplex, maybeop); if (type == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression); if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop); if (type == "{") return contCommasep(objprop, "}", null, maybeop); if (type == "quasi") { return pass(quasi, maybeop); } return cont(); } function maybeexpression(type) { if (type.match(/[;\}\)\],]/)) return pass(); return pass(expression); } function maybeexpressionNoComma(type) { if (type.match(/[;\}\)\],]/)) return pass(); return pass(expressionNoComma); } function maybeoperatorComma(type, value) { if (type == ",") return cont(expression); return maybeoperatorNoComma(type, value, false); } function maybeoperatorNoComma(type, value, noComma) { var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma; var expr = noComma == false ? expression : expressionNoComma; if (type == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext); if (type == "operator") { if (/\+\+|--/.test(value)) return cont(me); if (value == "?") return cont(expression, expect(":"), expr); return cont(expr); } if (type == "quasi") { return pass(quasi, me); } if (type == ";") return; if (type == "(") return contCommasep(expressionNoComma, ")", "call", me); if (type == ".") return cont(property, me); if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me); } function quasi(type, value) { if (type != "quasi") return pass(); if (value.slice(value.length - 2) != "${") return cont(quasi); return cont(expression, continueQuasi); } function continueQuasi(type) { if (type == "}") { cx.marked = "string-2"; cx.state.tokenize = tokenQuasi; return cont(quasi); } } function arrowBody(type) { findFatArrow(cx.stream, cx.state); return pass(type == "{" ? statement : expression); } function arrowBodyNoComma(type) { findFatArrow(cx.stream, cx.state); return pass(type == "{" ? statement : expressionNoComma); } function maybelabel(type) { if (type == ":") return cont(poplex, statement); return pass(maybeoperatorComma, expect(";"), poplex); } function property(type) { if (type == "variable") {cx.marked = "property"; return cont();} } function objprop(type, value) { if (type == "variable" || cx.style == "keyword") { cx.marked = "property"; if (value == "get" || value == "set") return cont(getterSetter); return cont(afterprop); } else if (type == "number" || type == "string") { cx.marked = jsonldMode ? "property" : (cx.style + " property"); return cont(afterprop); } else if (type == "jsonld-keyword") { return cont(afterprop); } else if (type == "[") { return cont(expression, expect("]"), afterprop); } } function getterSetter(type) { if (type != "variable") return pass(afterprop); cx.marked = "property"; return cont(functiondef); } function afterprop(type) { if (type == ":") return cont(expressionNoComma); if (type == "(") return pass(functiondef); } function commasep(what, end) { function proceed(type) { if (type == ",") { var lex = cx.state.lexical; if (lex.info == "call") lex.pos = (lex.pos || 0) + 1; return cont(what, proceed); } if (type == end) return cont(); return cont(expect(end)); } return function(type) { if (type == end) return cont(); return pass(what, proceed); }; } function contCommasep(what, end, info) { for (var i = 3; i < arguments.length; i++) cx.cc.push(arguments[i]); return cont(pushlex(end, info), commasep(what, end), poplex); } function block(type) { if (type == "}") return cont(); return pass(statement, block); } function maybetype(type) { if (isTS && type == ":") return cont(typedef); } function typedef(type) { if (type == "variable"){cx.marked = "variable-3"; return cont();} } function vardef() { return pass(pattern, maybetype, maybeAssign, vardefCont); } function pattern(type, value) { if (type == "variable") { register(value); return cont(); } if (type == "[") return contCommasep(pattern, "]"); if (type == "{") return contCommasep(proppattern, "}"); } function proppattern(type, value) { if (type == "variable" && !cx.stream.match(/^\s*:/, false)) { register(value); return cont(maybeAssign); } if (type == "variable") cx.marked = "property"; return cont(expect(":"), pattern, maybeAssign); } function maybeAssign(_type, value) { if (value == "=") return cont(expressionNoComma); } function vardefCont(type) { if (type == ",") return cont(vardef); } function maybeelse(type, value) { if (type == "keyword b" && value == "else") return cont(pushlex("form", "else"), statement, poplex); } function forspec(type) { if (type == "(") return cont(pushlex(")"), forspec1, expect(")"), poplex); } function forspec1(type) { if (type == "var") return cont(vardef, expect(";"), forspec2); if (type == ";") return cont(forspec2); if (type == "variable") return cont(formaybeinof); return pass(expression, expect(";"), forspec2); } function formaybeinof(_type, value) { if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); } return cont(maybeoperatorComma, forspec2); } function forspec2(type, value) { if (type == ";") return cont(forspec3); if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); } return pass(expression, expect(";"), forspec3); } function forspec3(type) { if (type != ")") cont(expression); } function functiondef(type, value) { if (value == "*") {cx.marked = "keyword"; return cont(functiondef);} if (type == "variable") {register(value); return cont(functiondef);} if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, statement, popcontext); } function funarg(type) { if (type == "spread") return cont(funarg); return pass(pattern, maybetype); } function className(type, value) { if (type == "variable") {register(value); return cont(classNameAfter);} } function classNameAfter(type, value) { if (value == "extends") return cont(expression, classNameAfter); if (type == "{") return cont(pushlex("}"), classBody, poplex); } function classBody(type, value) { if (type == "variable" || cx.style == "keyword") { if (value == "static") { cx.marked = "keyword"; return cont(classBody); } cx.marked = "property"; if (value == "get" || value == "set") return cont(classGetterSetter, functiondef, classBody); return cont(functiondef, classBody); } if (value == "*") { cx.marked = "keyword"; return cont(classBody); } if (type == ";") return cont(classBody); if (type == "}") return cont(); } function classGetterSetter(type) { if (type != "variable") return pass(); cx.marked = "property"; return cont(); } function afterModule(type, value) { if (type == "string") return cont(statement); if (type == "variable") { register(value); return cont(maybeFrom); } } function afterExport(_type, value) { if (value == "*") { cx.marked = "keyword"; return cont(maybeFrom, expect(";")); } if (value == "default") { cx.marked = "keyword"; return cont(expression, expect(";")); } return pass(statement); } function afterImport(type) { if (type == "string") return cont(); return pass(importSpec, maybeFrom); } function importSpec(type, value) { if (type == "{") return contCommasep(importSpec, "}"); if (type == "variable") register(value); if (value == "*") cx.marked = "keyword"; return cont(maybeAs); } function maybeAs(_type, value) { if (value == "as") { cx.marked = "keyword"; return cont(importSpec); } } function maybeFrom(_type, value) { if (value == "from") { cx.marked = "keyword"; return cont(expression); } } function arrayLiteral(type) { if (type == "]") return cont(); return pass(expressionNoComma, maybeArrayComprehension); } function maybeArrayComprehension(type) { if (type == "for") return pass(comprehension, expect("]")); if (type == ",") return cont(commasep(maybeexpressionNoComma, "]")); return pass(commasep(expressionNoComma, "]")); } function comprehension(type) { if (type == "for") return cont(forspec, comprehension); if (type == "if") return cont(expression, comprehension); } function isContinuedStatement(state, textAfter) { return state.lastType == "operator" || state.lastType == "," || isOperatorChar.test(textAfter.charAt(0)) || /[,.]/.test(textAfter.charAt(0)); } // Interface return { startState: function(basecolumn) { var state = { tokenize: tokenBase, lastType: "sof", cc: [], lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false), localVars: parserConfig.localVars, context: parserConfig.localVars && {vars: parserConfig.localVars}, indented: 0 }; if (parserConfig.globalVars && typeof parserConfig.globalVars == "object") state.globalVars = parserConfig.globalVars; return state; }, token: function(stream, state) { if (stream.sol()) { if (!state.lexical.hasOwnProperty("align")) state.lexical.align = false; state.indented = stream.indentation(); findFatArrow(stream, state); } if (state.tokenize != tokenComment && stream.eatSpace()) return null; var style = state.tokenize(stream, state); if (type == "comment") return style; state.lastType = type == "operator" && (content == "++" || content == "--") ? "incdec" : type; return parseJS(state, style, type, content, stream); }, indent: function(state, textAfter) { if (state.tokenize == tokenComment) return CodeMirror.Pass; if (state.tokenize != tokenBase) return 0; var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical; // Kludge to prevent 'maybelse' from blocking lexical scope pops if (!/^\s*else\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) { var c = state.cc[i]; if (c == poplex) lexical = lexical.prev; else if (c != maybeelse) break; } if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev; if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat") lexical = lexical.prev; var type = lexical.type, closing = firstChar == type; if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? lexical.info + 1 : 0); else if (type == "form" && firstChar == "{") return lexical.indented; else if (type == "form") return lexical.indented + indentUnit; else if (type == "stat") return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0); else if (lexical.info == "switch" && !closing && parserConfig.doubleIndentSwitch != false) return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit); else if (lexical.align) return lexical.column + (closing ? 0 : 1); else return lexical.indented + (closing ? 0 : indentUnit); }, electricInput: /^\s*(?:case .*?:|default:|\{|\})$/, blockCommentStart: jsonMode ? null : "/*", blockCommentEnd: jsonMode ? null : "*/", lineComment: jsonMode ? null : "//", fold: "brace", closeBrackets: "()[]{}''\"\"``", helperType: jsonMode ? "json" : "javascript", jsonldMode: jsonldMode, jsonMode: jsonMode }; }); CodeMirror.registerHelper("wordChars", "javascript", /[\w$]/); CodeMirror.defineMIME("text/javascript", "javascript"); CodeMirror.defineMIME("text/ecmascript", "javascript"); CodeMirror.defineMIME("application/javascript", "javascript"); CodeMirror.defineMIME("application/x-javascript", "javascript"); CodeMirror.defineMIME("application/ecmascript", "javascript"); CodeMirror.defineMIME("application/json", {name: "javascript", json: true}); CodeMirror.defineMIME("application/x-json", {name: "javascript", json: true}); CodeMirror.defineMIME("application/ld+json", {name: "javascript", jsonld: true}); CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true }); CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true }); }); ================================================ FILE: base/res/codemirror/mode/javascript/json-ld.html ================================================ CodeMirror: JSON-LD mode

JSON-LD mode

This is a specialization of the JavaScript mode.

================================================ FILE: base/res/codemirror/mode/javascript/test.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({indentUnit: 2}, "javascript"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } MT("locals", "[keyword function] [variable foo]([def a], [def b]) { [keyword var] [def c] [operator =] [number 10]; [keyword return] [variable-2 a] [operator +] [variable-2 c] [operator +] [variable d]; }"); MT("comma-and-binop", "[keyword function](){ [keyword var] [def x] [operator =] [number 1] [operator +] [number 2], [def y]; }"); MT("destructuring", "([keyword function]([def a], [[[def b], [def c] ]]) {", " [keyword let] {[def d], [property foo]: [def c][operator =][number 10], [def x]} [operator =] [variable foo]([variable-2 a]);", " [[[variable-2 c], [variable y] ]] [operator =] [variable-2 c];", "})();"); MT("class_body", "[keyword class] [variable Foo] {", " [property constructor]() {}", " [property sayName]() {", " [keyword return] [string-2 `foo${][variable foo][string-2 }oo`];", " }", "}"); MT("class", "[keyword class] [variable Point] [keyword extends] [variable SuperThing] {", " [property get] [property prop]() { [keyword return] [number 24]; }", " [property constructor]([def x], [def y]) {", " [keyword super]([string 'something']);", " [keyword this].[property x] [operator =] [variable-2 x];", " }", "}"); MT("module", "[keyword module] [string 'foo'] {", " [keyword export] [keyword let] [def x] [operator =] [number 42];", " [keyword export] [keyword *] [keyword from] [string 'somewhere'];", "}"); MT("import", "[keyword function] [variable foo]() {", " [keyword import] [def $] [keyword from] [string 'jquery'];", " [keyword module] [def crypto] [keyword from] [string 'crypto'];", " [keyword import] { [def encrypt], [def decrypt] } [keyword from] [string 'crypto'];", "}"); MT("const", "[keyword function] [variable f]() {", " [keyword const] [[ [def a], [def b] ]] [operator =] [[ [number 1], [number 2] ]];", "}"); MT("for/of", "[keyword for]([keyword let] [variable of] [keyword of] [variable something]) {}"); MT("generator", "[keyword function*] [variable repeat]([def n]) {", " [keyword for]([keyword var] [def i] [operator =] [number 0]; [variable-2 i] [operator <] [variable-2 n]; [operator ++][variable-2 i])", " [keyword yield] [variable-2 i];", "}"); MT("quotedStringAddition", "[keyword let] [variable f] [operator =] [variable a] [operator +] [string 'fatarrow'] [operator +] [variable c];"); MT("quotedFatArrow", "[keyword let] [variable f] [operator =] [variable a] [operator +] [string '=>'] [operator +] [variable c];"); MT("fatArrow", "[variable array].[property filter]([def a] [operator =>] [variable-2 a] [operator +] [number 1]);", "[variable a];", // No longer in scope "[keyword let] [variable f] [operator =] ([[ [def a], [def b] ]], [def c]) [operator =>] [variable-2 a] [operator +] [variable-2 c];", "[variable c];"); MT("spread", "[keyword function] [variable f]([def a], [meta ...][def b]) {", " [variable something]([variable-2 a], [meta ...][variable-2 b]);", "}"); MT("comprehension", "[keyword function] [variable f]() {", " [[([variable x] [operator +] [number 1]) [keyword for] ([keyword var] [def x] [keyword in] [variable y]) [keyword if] [variable pred]([variable-2 x]) ]];", " ([variable u] [keyword for] ([keyword var] [def u] [keyword of] [variable generateValues]()) [keyword if] ([variable-2 u].[property color] [operator ===] [string 'blue']));", "}"); MT("quasi", "[variable re][string-2 `fofdlakj${][variable x] [operator +] ([variable re][string-2 `foo`]) [operator +] [number 1][string-2 }fdsa`] [operator +] [number 2]"); MT("quasi_no_function", "[variable x] [operator =] [string-2 `fofdlakj${][variable x] [operator +] [string-2 `foo`] [operator +] [number 1][string-2 }fdsa`] [operator +] [number 2]"); MT("indent_statement", "[keyword var] [variable x] [operator =] [number 10]", "[variable x] [operator +=] [variable y] [operator +]", " [atom Infinity]", "[keyword debugger];"); MT("indent_if", "[keyword if] ([number 1])", " [keyword break];", "[keyword else] [keyword if] ([number 2])", " [keyword continue];", "[keyword else]", " [number 10];", "[keyword if] ([number 1]) {", " [keyword break];", "} [keyword else] [keyword if] ([number 2]) {", " [keyword continue];", "} [keyword else] {", " [number 10];", "}"); MT("indent_for", "[keyword for] ([keyword var] [variable i] [operator =] [number 0];", " [variable i] [operator <] [number 100];", " [variable i][operator ++])", " [variable doSomething]([variable i]);", "[keyword debugger];"); MT("indent_c_style", "[keyword function] [variable foo]()", "{", " [keyword debugger];", "}"); MT("indent_else", "[keyword for] (;;)", " [keyword if] ([variable foo])", " [keyword if] ([variable bar])", " [number 1];", " [keyword else]", " [number 2];", " [keyword else]", " [number 3];"); MT("indent_funarg", "[variable foo]([number 10000],", " [keyword function]([def a]) {", " [keyword debugger];", "};"); MT("indent_below_if", "[keyword for] (;;)", " [keyword if] ([variable foo])", " [number 1];", "[number 2];"); MT("multilinestring", "[keyword var] [variable x] [operator =] [string 'foo\\]", "[string bar'];"); MT("scary_regexp", "[string-2 /foo[[/]]bar/];"); MT("indent_strange_array", "[keyword var] [variable x] [operator =] [[", " [number 1],,", " [number 2],", "]];", "[number 10];"); var jsonld_mode = CodeMirror.getMode( {indentUnit: 2}, {name: "javascript", jsonld: true} ); function LD(name) { test.mode(name, jsonld_mode, Array.prototype.slice.call(arguments, 1)); } LD("json_ld_keywords", '{', ' [meta "@context"]: {', ' [meta "@base"]: [string "http://example.com"],', ' [meta "@vocab"]: [string "http://xmlns.com/foaf/0.1/"],', ' [property "likesFlavor"]: {', ' [meta "@container"]: [meta "@list"]', ' [meta "@reverse"]: [string "@beFavoriteOf"]', ' },', ' [property "nick"]: { [meta "@container"]: [meta "@set"] },', ' [property "nick"]: { [meta "@container"]: [meta "@index"] }', ' },', ' [meta "@graph"]: [[ {', ' [meta "@id"]: [string "http://dbpedia.org/resource/John_Lennon"],', ' [property "name"]: [string "John Lennon"],', ' [property "modified"]: {', ' [meta "@value"]: [string "2010-05-29T14:17:39+02:00"],', ' [meta "@type"]: [string "http://www.w3.org/2001/XMLSchema#dateTime"]', ' }', ' } ]]', '}'); LD("json_ld_fake", '{', ' [property "@fake"]: [string "@fake"],', ' [property "@contextual"]: [string "@identifier"],', ' [property "user@domain.com"]: [string "@graphical"],', ' [property "@ID"]: [string "@@ID"]', '}'); })(); ================================================ FILE: base/res/codemirror/mode/javascript/typescript.html ================================================ CodeMirror: TypeScript mode

TypeScript mode

This is a specialization of the JavaScript mode.

================================================ FILE: base/res/codemirror/mode/jinja2/index.html ================================================ CodeMirror: Jinja2 mode

Jinja2 mode

================================================ FILE: base/res/codemirror/mode/jinja2/jinja2.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("jinja2", function() { var keywords = ["and", "as", "block", "endblock", "by", "cycle", "debug", "else", "elif", "extends", "filter", "endfilter", "firstof", "for", "endfor", "if", "endif", "ifchanged", "endifchanged", "ifequal", "endifequal", "ifnotequal", "endifnotequal", "in", "include", "load", "not", "now", "or", "parsed", "regroup", "reversed", "spaceless", "endspaceless", "ssi", "templatetag", "openblock", "closeblock", "openvariable", "closevariable", "openbrace", "closebrace", "opencomment", "closecomment", "widthratio", "url", "with", "endwith", "get_current_language", "trans", "endtrans", "noop", "blocktrans", "endblocktrans", "get_available_languages", "get_current_language_bidi", "plural"], operator = /^[+\-*&%=<>!?|~^]/, sign = /^[:\[\(\{]/, atom = ["true", "false"], number = /^(\d[+\-\*\/])?\d+(\.\d+)?/; keywords = new RegExp("((" + keywords.join(")|(") + "))\\b"); atom = new RegExp("((" + atom.join(")|(") + "))\\b"); function tokenBase (stream, state) { var ch = stream.peek(); //Comment if (state.incomment) { if(!stream.skipTo("#}")) { stream.skipToEnd(); } else { stream.eatWhile(/\#|}/); state.incomment = false; } return "comment"; //Tag } else if (state.intag) { //After operator if(state.operator) { state.operator = false; if(stream.match(atom)) { return "atom"; } if(stream.match(number)) { return "number"; } } //After sign if(state.sign) { state.sign = false; if(stream.match(atom)) { return "atom"; } if(stream.match(number)) { return "number"; } } if(state.instring) { if(ch == state.instring) { state.instring = false; } stream.next(); return "string"; } else if(ch == "'" || ch == '"') { state.instring = ch; stream.next(); return "string"; } else if(stream.match(state.intag + "}") || stream.eat("-") && stream.match(state.intag + "}")) { state.intag = false; return "tag"; } else if(stream.match(operator)) { state.operator = true; return "operator"; } else if(stream.match(sign)) { state.sign = true; } else { if(stream.eat(" ") || stream.sol()) { if(stream.match(keywords)) { return "keyword"; } if(stream.match(atom)) { return "atom"; } if(stream.match(number)) { return "number"; } if(stream.sol()) { stream.next(); } } else { stream.next(); } } return "variable"; } else if (stream.eat("{")) { if (ch = stream.eat("#")) { state.incomment = true; if(!stream.skipTo("#}")) { stream.skipToEnd(); } else { stream.eatWhile(/\#|}/); state.incomment = false; } return "comment"; //Open tag } else if (ch = stream.eat(/\{|%/)) { //Cache close tag state.intag = ch; if(ch == "{") { state.intag = "}"; } stream.eat("-"); return "tag"; } } stream.next(); }; return { startState: function () { return {tokenize: tokenBase}; }, token: function (stream, state) { return state.tokenize(stream, state); } }; }); }); ================================================ FILE: base/res/codemirror/mode/julia/index.html ================================================ CodeMirror: Julia mode

Julia mode

MIME types defined: text/x-julia.

================================================ FILE: base/res/codemirror/mode/julia/julia.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("julia", function(_conf, parserConf) { var ERRORCLASS = 'error'; function wordRegexp(words) { return new RegExp("^((" + words.join(")|(") + "))\\b"); } var operators = parserConf.operators || /^\.?[|&^\\%*+\-<>!=\/]=?|\?|~|:|\$|\.[<>]|<<=?|>>>?=?|\.[<>=]=|->?|\/\/|\bin\b/; var delimiters = parserConf.delimiters || /^[;,()[\]{}]/; var identifiers = parserConf.identifiers|| /^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*!*/; var blockOpeners = ["begin", "function", "type", "immutable", "let", "macro", "for", "while", "quote", "if", "else", "elseif", "try", "finally", "catch", "do"]; var blockClosers = ["end", "else", "elseif", "catch", "finally"]; var keywordList = ['if', 'else', 'elseif', 'while', 'for', 'begin', 'let', 'end', 'do', 'try', 'catch', 'finally', 'return', 'break', 'continue', 'global', 'local', 'const', 'export', 'import', 'importall', 'using', 'function', 'macro', 'module', 'baremodule', 'type', 'immutable', 'quote', 'typealias', 'abstract', 'bitstype', 'ccall']; var builtinList = ['true', 'false', 'enumerate', 'open', 'close', 'nothing', 'NaN', 'Inf', 'print', 'println', 'Int', 'Int8', 'Uint8', 'Int16', 'Uint16', 'Int32', 'Uint32', 'Int64', 'Uint64', 'Int128', 'Uint128', 'Bool', 'Char', 'Float16', 'Float32', 'Float64', 'Array', 'Vector', 'Matrix', 'String', 'UTF8String', 'ASCIIString', 'error', 'warn', 'info', '@printf']; //var stringPrefixes = new RegExp("^[br]?('|\")") var stringPrefixes = /^(`|'|"{3}|([br]?"))/; var keywords = wordRegexp(keywordList); var builtins = wordRegexp(builtinList); var openers = wordRegexp(blockOpeners); var closers = wordRegexp(blockClosers); var macro = /^@[_A-Za-z][_A-Za-z0-9]*/; var symbol = /^:[_A-Za-z][_A-Za-z0-9]*/; var indentInfo = null; function in_array(state) { var ch = cur_scope(state); if(ch=="[" || ch=="{") { return true; } else { return false; } } function cur_scope(state) { if(state.scopes.length==0) { return null; } return state.scopes[state.scopes.length - 1]; } // tokenizers function tokenBase(stream, state) { // Handle scope changes var leaving_expr = state.leaving_expr; if(stream.sol()) { leaving_expr = false; } state.leaving_expr = false; if(leaving_expr) { if(stream.match(/^'+/)) { return 'operator'; } } if(stream.match(/^\.{2,3}/)) { return 'operator'; } if (stream.eatSpace()) { return null; } var ch = stream.peek(); // Handle Comments if (ch === '#') { stream.skipToEnd(); return 'comment'; } if(ch==='[') { state.scopes.push("["); } if(ch==='{') { state.scopes.push("{"); } var scope=cur_scope(state); if(scope==='[' && ch===']') { state.scopes.pop(); state.leaving_expr=true; } if(scope==='{' && ch==='}') { state.scopes.pop(); state.leaving_expr=true; } if(ch===')') { state.leaving_expr = true; } var match; if(!in_array(state) && (match=stream.match(openers, false))) { state.scopes.push(match); } if(!in_array(state) && stream.match(closers, false)) { state.scopes.pop(); } if(in_array(state)) { if(stream.match(/^end/)) { return 'number'; } } if(stream.match(/^=>/)) { return 'operator'; } // Handle Number Literals if (stream.match(/^[0-9\.]/, false)) { var imMatcher = RegExp(/^im\b/); var floatLiteral = false; // Floats if (stream.match(/^\d*\.(?!\.)\d+([ef][\+\-]?\d+)?/i)) { floatLiteral = true; } if (stream.match(/^\d+\.(?!\.)\d*/)) { floatLiteral = true; } if (stream.match(/^\.\d+/)) { floatLiteral = true; } if (floatLiteral) { // Float literals may be "imaginary" stream.match(imMatcher); state.leaving_expr = true; return 'number'; } // Integers var intLiteral = false; // Hex if (stream.match(/^0x[0-9a-f]+/i)) { intLiteral = true; } // Binary if (stream.match(/^0b[01]+/i)) { intLiteral = true; } // Octal if (stream.match(/^0o[0-7]+/i)) { intLiteral = true; } // Decimal if (stream.match(/^[1-9]\d*(e[\+\-]?\d+)?/)) { intLiteral = true; } // Zero by itself with no other piece of number. if (stream.match(/^0(?![\dx])/i)) { intLiteral = true; } if (intLiteral) { // Integer literals may be "long" stream.match(imMatcher); state.leaving_expr = true; return 'number'; } } if(stream.match(/^(::)|(<:)/)) { return 'operator'; } // Handle symbols if(!leaving_expr && stream.match(symbol)) { return 'string'; } // Handle operators and Delimiters if (stream.match(operators)) { return 'operator'; } // Handle Strings if (stream.match(stringPrefixes)) { state.tokenize = tokenStringFactory(stream.current()); return state.tokenize(stream, state); } if (stream.match(macro)) { return 'meta'; } if (stream.match(delimiters)) { return null; } if (stream.match(keywords)) { return 'keyword'; } if (stream.match(builtins)) { return 'builtin'; } if (stream.match(identifiers)) { state.leaving_expr=true; return 'variable'; } // Handle non-detected items stream.next(); return ERRORCLASS; } function tokenStringFactory(delimiter) { while ('rub'.indexOf(delimiter.charAt(0).toLowerCase()) >= 0) { delimiter = delimiter.substr(1); } var singleline = delimiter.length == 1; var OUTCLASS = 'string'; function tokenString(stream, state) { while (!stream.eol()) { stream.eatWhile(/[^'"\\]/); if (stream.eat('\\')) { stream.next(); if (singleline && stream.eol()) { return OUTCLASS; } } else if (stream.match(delimiter)) { state.tokenize = tokenBase; return OUTCLASS; } else { stream.eat(/['"]/); } } if (singleline) { if (parserConf.singleLineStringErrors) { return ERRORCLASS; } else { state.tokenize = tokenBase; } } return OUTCLASS; } tokenString.isString = true; return tokenString; } function tokenLexer(stream, state) { indentInfo = null; var style = state.tokenize(stream, state); var current = stream.current(); // Handle '.' connected identifiers if (current === '.') { style = stream.match(identifiers, false) ? null : ERRORCLASS; if (style === null && state.lastStyle === 'meta') { // Apply 'meta' style to '.' connected identifiers when // appropriate. style = 'meta'; } return style; } return style; } var external = { startState: function() { return { tokenize: tokenBase, scopes: [], leaving_expr: false }; }, token: function(stream, state) { var style = tokenLexer(stream, state); state.lastStyle = style; return style; }, indent: function(state, textAfter) { var delta = 0; if(textAfter=="end" || textAfter=="]" || textAfter=="}" || textAfter=="else" || textAfter=="elseif" || textAfter=="catch" || textAfter=="finally") { delta = -1; } return (state.scopes.length + delta) * 4; }, lineComment: "#", fold: "indent", electricChars: "edlsifyh]}" }; return external; }); CodeMirror.defineMIME("text/x-julia", "julia"); }); ================================================ FILE: base/res/codemirror/mode/kotlin/index.html ================================================ CodeMirror: Kotlin mode

Kotlin mode

Mode for Kotlin (http://kotlin.jetbrains.org/)

Developed by Hadi Hariri (https://github.com/hhariri).

MIME type defined: text/x-kotlin.

================================================ FILE: base/res/codemirror/mode/kotlin/kotlin.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("kotlin", function (config, parserConfig) { function words(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } var multiLineStrings = parserConfig.multiLineStrings; var keywords = words( "package continue return object while break class data trait throw super" + " when type this else This try val var fun for is in if do as true false null get set"); var softKeywords = words("import" + " where by get set abstract enum open annotation override private public internal" + " protected catch out vararg inline finally final ref"); var blockKeywords = words("catch class do else finally for if where try while enum"); var atoms = words("null true false this"); var curPunc; function tokenBase(stream, state) { var ch = stream.next(); if (ch == '"' || ch == "'") { return startString(ch, stream, state); } // Wildcard import w/o trailing semicolon (import smth.*) if (ch == "." && stream.eat("*")) { return "word"; } if (/[\[\]{}\(\),;\:\.]/.test(ch)) { curPunc = ch; return null; } if (/\d/.test(ch)) { if (stream.eat(/eE/)) { stream.eat(/\+\-/); stream.eatWhile(/\d/); } return "number"; } if (ch == "/") { if (stream.eat("*")) { state.tokenize.push(tokenComment); return tokenComment(stream, state); } if (stream.eat("/")) { stream.skipToEnd(); return "comment"; } if (expectExpression(state.lastToken)) { return startString(ch, stream, state); } } // Commented if (ch == "-" && stream.eat(">")) { curPunc = "->"; return null; } if (/[\-+*&%=<>!?|\/~]/.test(ch)) { stream.eatWhile(/[\-+*&%=<>|~]/); return "operator"; } stream.eatWhile(/[\w\$_]/); var cur = stream.current(); if (atoms.propertyIsEnumerable(cur)) { return "atom"; } if (softKeywords.propertyIsEnumerable(cur)) { if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; return "softKeyword"; } if (keywords.propertyIsEnumerable(cur)) { if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; return "keyword"; } return "word"; } tokenBase.isBase = true; function startString(quote, stream, state) { var tripleQuoted = false; if (quote != "/" && stream.eat(quote)) { if (stream.eat(quote)) tripleQuoted = true; else return "string"; } function t(stream, state) { var escaped = false, next, end = !tripleQuoted; while ((next = stream.next()) != null) { if (next == quote && !escaped) { if (!tripleQuoted) { break; } if (stream.match(quote + quote)) { end = true; break; } } if (quote == '"' && next == "$" && !escaped && stream.eat("{")) { state.tokenize.push(tokenBaseUntilBrace()); return "string"; } if (next == "$" && !escaped && !stream.eat(" ")) { state.tokenize.push(tokenBaseUntilSpace()); return "string"; } escaped = !escaped && next == "\\"; } if (multiLineStrings) state.tokenize.push(t); if (end) state.tokenize.pop(); return "string"; } state.tokenize.push(t); return t(stream, state); } function tokenBaseUntilBrace() { var depth = 1; function t(stream, state) { if (stream.peek() == "}") { depth--; if (depth == 0) { state.tokenize.pop(); return state.tokenize[state.tokenize.length - 1](stream, state); } } else if (stream.peek() == "{") { depth++; } return tokenBase(stream, state); } t.isBase = true; return t; } function tokenBaseUntilSpace() { function t(stream, state) { if (stream.eat(/[\w]/)) { var isWord = stream.eatWhile(/[\w]/); if (isWord) { state.tokenize.pop(); return "word"; } } state.tokenize.pop(); return "string"; } t.isBase = true; return t; } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize.pop(); break; } maybeEnd = (ch == "*"); } return "comment"; } function expectExpression(last) { return !last || last == "operator" || last == "->" || /[\.\[\{\(,;:]/.test(last) || last == "newstatement" || last == "keyword" || last == "proplabel"; } function Context(indented, column, type, align, prev) { this.indented = indented; this.column = column; this.type = type; this.align = align; this.prev = prev; } function pushContext(state, col, type) { return state.context = new Context(state.indented, col, type, null, state.context); } function popContext(state) { var t = state.context.type; if (t == ")" || t == "]" || t == "}") state.indented = state.context.indented; return state.context = state.context.prev; } // Interface return { startState: function (basecolumn) { return { tokenize: [tokenBase], context: new Context((basecolumn || 0) - config.indentUnit, 0, "top", false), indented: 0, startOfLine: true, lastToken: null }; }, token: function (stream, state) { var ctx = state.context; if (stream.sol()) { if (ctx.align == null) ctx.align = false; state.indented = stream.indentation(); state.startOfLine = true; // Automatic semicolon insertion if (ctx.type == "statement" && !expectExpression(state.lastToken)) { popContext(state); ctx = state.context; } } if (stream.eatSpace()) return null; curPunc = null; var style = state.tokenize[state.tokenize.length - 1](stream, state); if (style == "comment") return style; if (ctx.align == null) ctx.align = true; if ((curPunc == ";" || curPunc == ":") && ctx.type == "statement") popContext(state); // Handle indentation for {x -> \n ... } else if (curPunc == "->" && ctx.type == "statement" && ctx.prev.type == "}") { popContext(state); state.context.align = false; } else if (curPunc == "{") pushContext(state, stream.column(), "}"); else if (curPunc == "[") pushContext(state, stream.column(), "]"); else if (curPunc == "(") pushContext(state, stream.column(), ")"); else if (curPunc == "}") { while (ctx.type == "statement") ctx = popContext(state); if (ctx.type == "}") ctx = popContext(state); while (ctx.type == "statement") ctx = popContext(state); } else if (curPunc == ctx.type) popContext(state); else if (ctx.type == "}" || ctx.type == "top" || (ctx.type == "statement" && curPunc == "newstatement")) pushContext(state, stream.column(), "statement"); state.startOfLine = false; state.lastToken = curPunc || style; return style; }, indent: function (state, textAfter) { if (!state.tokenize[state.tokenize.length - 1].isBase) return 0; var firstChar = textAfter && textAfter.charAt(0), ctx = state.context; if (ctx.type == "statement" && !expectExpression(state.lastToken)) ctx = ctx.prev; var closing = firstChar == ctx.type; if (ctx.type == "statement") { return ctx.indented + (firstChar == "{" ? 0 : config.indentUnit); } else if (ctx.align) return ctx.column + (closing ? 0 : 1); else return ctx.indented + (closing ? 0 : config.indentUnit); }, closeBrackets: {triples: "'\""}, electricChars: "{}" }; }); CodeMirror.defineMIME("text/x-kotlin", "kotlin"); }); ================================================ FILE: base/res/codemirror/mode/livescript/index.html ================================================ CodeMirror: LiveScript mode

LiveScript mode

MIME types defined: text/x-livescript.

The LiveScript mode was written by Kenneth Bentley.

================================================ FILE: base/res/codemirror/mode/livescript/livescript.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /** * Link to the project's GitHub page: * https://github.com/duralog/CodeMirror */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode('livescript', function(){ var tokenBase = function(stream, state) { var next_rule = state.next || "start"; if (next_rule) { state.next = state.next; var nr = Rules[next_rule]; if (nr.splice) { for (var i$ = 0; i$ < nr.length; ++i$) { var r = nr[i$], m; if (r.regex && (m = stream.match(r.regex))) { state.next = r.next || state.next; return r.token; } } stream.next(); return 'error'; } if (stream.match(r = Rules[next_rule])) { if (r.regex && stream.match(r.regex)) { state.next = r.next; return r.token; } else { stream.next(); return 'error'; } } } stream.next(); return 'error'; }; var external = { startState: function(){ return { next: 'start', lastToken: null }; }, token: function(stream, state){ while (stream.pos == stream.start) var style = tokenBase(stream, state); state.lastToken = { style: style, indent: stream.indentation(), content: stream.current() }; return style.replace(/\./g, ' '); }, indent: function(state){ var indentation = state.lastToken.indent; if (state.lastToken.content.match(indenter)) { indentation += 2; } return indentation; } }; return external; }); var identifier = '(?![\\d\\s])[$\\w\\xAA-\\uFFDC](?:(?!\\s)[$\\w\\xAA-\\uFFDC]|-[A-Za-z])*'; var indenter = RegExp('(?:[({[=:]|[-~]>|\\b(?:e(?:lse|xport)|d(?:o|efault)|t(?:ry|hen)|finally|import(?:\\s*all)?|const|var|let|new|catch(?:\\s*' + identifier + ')?))\\s*$'); var keywordend = '(?![$\\w]|-[A-Za-z]|\\s*:(?![:=]))'; var stringfill = { token: 'string', regex: '.+' }; var Rules = { start: [ { token: 'comment.doc', regex: '/\\*', next: 'comment' }, { token: 'comment', regex: '#.*' }, { token: 'keyword', regex: '(?:t(?:h(?:is|row|en)|ry|ypeof!?)|c(?:on(?:tinue|st)|a(?:se|tch)|lass)|i(?:n(?:stanceof)?|mp(?:ort(?:\\s+all)?|lements)|[fs])|d(?:e(?:fault|lete|bugger)|o)|f(?:or(?:\\s+own)?|inally|unction)|s(?:uper|witch)|e(?:lse|x(?:tends|port)|val)|a(?:nd|rguments)|n(?:ew|ot)|un(?:less|til)|w(?:hile|ith)|o[fr]|return|break|let|var|loop)' + keywordend }, { token: 'constant.language', regex: '(?:true|false|yes|no|on|off|null|void|undefined)' + keywordend }, { token: 'invalid.illegal', regex: '(?:p(?:ackage|r(?:ivate|otected)|ublic)|i(?:mplements|nterface)|enum|static|yield)' + keywordend }, { token: 'language.support.class', regex: '(?:R(?:e(?:gExp|ferenceError)|angeError)|S(?:tring|yntaxError)|E(?:rror|valError)|Array|Boolean|Date|Function|Number|Object|TypeError|URIError)' + keywordend }, { token: 'language.support.function', regex: '(?:is(?:NaN|Finite)|parse(?:Int|Float)|Math|JSON|(?:en|de)codeURI(?:Component)?)' + keywordend }, { token: 'variable.language', regex: '(?:t(?:hat|il|o)|f(?:rom|allthrough)|it|by|e)' + keywordend }, { token: 'identifier', regex: identifier + '\\s*:(?![:=])' }, { token: 'variable', regex: identifier }, { token: 'keyword.operator', regex: '(?:\\.{3}|\\s+\\?)' }, { token: 'keyword.variable', regex: '(?:@+|::|\\.\\.)', next: 'key' }, { token: 'keyword.operator', regex: '\\.\\s*', next: 'key' }, { token: 'string', regex: '\\\\\\S[^\\s,;)}\\]]*' }, { token: 'string.doc', regex: '\'\'\'', next: 'qdoc' }, { token: 'string.doc', regex: '"""', next: 'qqdoc' }, { token: 'string', regex: '\'', next: 'qstring' }, { token: 'string', regex: '"', next: 'qqstring' }, { token: 'string', regex: '`', next: 'js' }, { token: 'string', regex: '<\\[', next: 'words' }, { token: 'string.regex', regex: '//', next: 'heregex' }, { token: 'string.regex', regex: '\\/(?:[^[\\/\\n\\\\]*(?:(?:\\\\.|\\[[^\\]\\n\\\\]*(?:\\\\.[^\\]\\n\\\\]*)*\\])[^[\\/\\n\\\\]*)*)\\/[gimy$]{0,4}', next: 'key' }, { token: 'constant.numeric', regex: '(?:0x[\\da-fA-F][\\da-fA-F_]*|(?:[2-9]|[12]\\d|3[0-6])r[\\da-zA-Z][\\da-zA-Z_]*|(?:\\d[\\d_]*(?:\\.\\d[\\d_]*)?|\\.\\d[\\d_]*)(?:e[+-]?\\d[\\d_]*)?[\\w$]*)' }, { token: 'lparen', regex: '[({[]' }, { token: 'rparen', regex: '[)}\\]]', next: 'key' }, { token: 'keyword.operator', regex: '\\S+' }, { token: 'text', regex: '\\s+' } ], heregex: [ { token: 'string.regex', regex: '.*?//[gimy$?]{0,4}', next: 'start' }, { token: 'string.regex', regex: '\\s*#{' }, { token: 'comment.regex', regex: '\\s+(?:#.*)?' }, { token: 'string.regex', regex: '\\S+' } ], key: [ { token: 'keyword.operator', regex: '[.?@!]+' }, { token: 'identifier', regex: identifier, next: 'start' }, { token: 'text', regex: '', next: 'start' } ], comment: [ { token: 'comment.doc', regex: '.*?\\*/', next: 'start' }, { token: 'comment.doc', regex: '.+' } ], qdoc: [ { token: 'string', regex: ".*?'''", next: 'key' }, stringfill ], qqdoc: [ { token: 'string', regex: '.*?"""', next: 'key' }, stringfill ], qstring: [ { token: 'string', regex: '[^\\\\\']*(?:\\\\.[^\\\\\']*)*\'', next: 'key' }, stringfill ], qqstring: [ { token: 'string', regex: '[^\\\\"]*(?:\\\\.[^\\\\"]*)*"', next: 'key' }, stringfill ], js: [ { token: 'string', regex: '[^\\\\`]*(?:\\\\.[^\\\\`]*)*`', next: 'key' }, stringfill ], words: [ { token: 'string', regex: '.*?\\]>', next: 'key' }, stringfill ] }; for (var idx in Rules) { var r = Rules[idx]; if (r.splice) { for (var i = 0, len = r.length; i < len; ++i) { var rr = r[i]; if (typeof rr.regex === 'string') { Rules[idx][i].regex = new RegExp('^' + rr.regex); } } } else if (typeof rr.regex === 'string') { Rules[idx].regex = new RegExp('^' + r.regex); } } CodeMirror.defineMIME('text/x-livescript', 'livescript'); }); ================================================ FILE: base/res/codemirror/mode/lua/index.html ================================================ CodeMirror: Lua mode

Lua mode

Loosely based on Franciszek Wawrzak's CodeMirror 1 mode. One configuration parameter is supported, specials, to which you can provide an array of strings to have those identifiers highlighted with the lua-special style.

MIME types defined: text/x-lua.

================================================ FILE: base/res/codemirror/mode/lua/lua.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // LUA mode. Ported to CodeMirror 2 from Franciszek Wawrzak's // CodeMirror 1 mode. // highlights keywords, strings, comments (no leveling supported! ("[==[")), tokens, basic indenting (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("lua", function(config, parserConfig) { var indentUnit = config.indentUnit; function prefixRE(words) { return new RegExp("^(?:" + words.join("|") + ")", "i"); } function wordRE(words) { return new RegExp("^(?:" + words.join("|") + ")$", "i"); } var specials = wordRE(parserConfig.specials || []); // long list of standard functions from lua manual var builtins = wordRE([ "_G","_VERSION","assert","collectgarbage","dofile","error","getfenv","getmetatable","ipairs","load", "loadfile","loadstring","module","next","pairs","pcall","print","rawequal","rawget","rawset","require", "select","setfenv","setmetatable","tonumber","tostring","type","unpack","xpcall", "coroutine.create","coroutine.resume","coroutine.running","coroutine.status","coroutine.wrap","coroutine.yield", "debug.debug","debug.getfenv","debug.gethook","debug.getinfo","debug.getlocal","debug.getmetatable", "debug.getregistry","debug.getupvalue","debug.setfenv","debug.sethook","debug.setlocal","debug.setmetatable", "debug.setupvalue","debug.traceback", "close","flush","lines","read","seek","setvbuf","write", "io.close","io.flush","io.input","io.lines","io.open","io.output","io.popen","io.read","io.stderr","io.stdin", "io.stdout","io.tmpfile","io.type","io.write", "math.abs","math.acos","math.asin","math.atan","math.atan2","math.ceil","math.cos","math.cosh","math.deg", "math.exp","math.floor","math.fmod","math.frexp","math.huge","math.ldexp","math.log","math.log10","math.max", "math.min","math.modf","math.pi","math.pow","math.rad","math.random","math.randomseed","math.sin","math.sinh", "math.sqrt","math.tan","math.tanh", "os.clock","os.date","os.difftime","os.execute","os.exit","os.getenv","os.remove","os.rename","os.setlocale", "os.time","os.tmpname", "package.cpath","package.loaded","package.loaders","package.loadlib","package.path","package.preload", "package.seeall", "string.byte","string.char","string.dump","string.find","string.format","string.gmatch","string.gsub", "string.len","string.lower","string.match","string.rep","string.reverse","string.sub","string.upper", "table.concat","table.insert","table.maxn","table.remove","table.sort" ]); var keywords = wordRE(["and","break","elseif","false","nil","not","or","return", "true","function", "end", "if", "then", "else", "do", "while", "repeat", "until", "for", "in", "local" ]); var indentTokens = wordRE(["function", "if","repeat","do", "\\(", "{"]); var dedentTokens = wordRE(["end", "until", "\\)", "}"]); var dedentPartial = prefixRE(["end", "until", "\\)", "}", "else", "elseif"]); function readBracket(stream) { var level = 0; while (stream.eat("=")) ++level; stream.eat("["); return level; } function normal(stream, state) { var ch = stream.next(); if (ch == "-" && stream.eat("-")) { if (stream.eat("[") && stream.eat("[")) return (state.cur = bracketed(readBracket(stream), "comment"))(stream, state); stream.skipToEnd(); return "comment"; } if (ch == "\"" || ch == "'") return (state.cur = string(ch))(stream, state); if (ch == "[" && /[\[=]/.test(stream.peek())) return (state.cur = bracketed(readBracket(stream), "string"))(stream, state); if (/\d/.test(ch)) { stream.eatWhile(/[\w.%]/); return "number"; } if (/[\w_]/.test(ch)) { stream.eatWhile(/[\w\\\-_.]/); return "variable"; } return null; } function bracketed(level, style) { return function(stream, state) { var curlev = null, ch; while ((ch = stream.next()) != null) { if (curlev == null) {if (ch == "]") curlev = 0;} else if (ch == "=") ++curlev; else if (ch == "]" && curlev == level) { state.cur = normal; break; } else curlev = null; } return style; }; } function string(quote) { return function(stream, state) { var escaped = false, ch; while ((ch = stream.next()) != null) { if (ch == quote && !escaped) break; escaped = !escaped && ch == "\\"; } if (!escaped) state.cur = normal; return "string"; }; } return { startState: function(basecol) { return {basecol: basecol || 0, indentDepth: 0, cur: normal}; }, token: function(stream, state) { if (stream.eatSpace()) return null; var style = state.cur(stream, state); var word = stream.current(); if (style == "variable") { if (keywords.test(word)) style = "keyword"; else if (builtins.test(word)) style = "builtin"; else if (specials.test(word)) style = "variable-2"; } if ((style != "comment") && (style != "string")){ if (indentTokens.test(word)) ++state.indentDepth; else if (dedentTokens.test(word)) --state.indentDepth; } return style; }, indent: function(state, textAfter) { var closing = dedentPartial.test(textAfter); return state.basecol + indentUnit * (state.indentDepth - (closing ? 1 : 0)); }, lineComment: "--", blockCommentStart: "--[[", blockCommentEnd: "]]" }; }); CodeMirror.defineMIME("text/x-lua", "lua"); }); ================================================ FILE: base/res/codemirror/mode/markdown/index.html ================================================ CodeMirror: Markdown mode

Markdown mode

Optionally depends on the XML mode for properly highlighted inline XML blocks.

MIME types defined: text/x-markdown.

Parsing/Highlighting Tests: normal, verbose.

================================================ FILE: base/res/codemirror/mode/markdown/markdown.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../xml/xml"), require("../meta")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../xml/xml", "../meta"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) { var htmlFound = CodeMirror.modes.hasOwnProperty("xml"); var htmlMode = CodeMirror.getMode(cmCfg, htmlFound ? {name: "xml", htmlMode: true} : "text/plain"); function getMode(name) { if (CodeMirror.findModeByName) { var found = CodeMirror.findModeByName(name); if (found) name = found.mime || found.mimes[0]; } var mode = CodeMirror.getMode(cmCfg, name); return mode.name == "null" ? null : mode; } // Should characters that affect highlighting be highlighted separate? // Does not include characters that will be output (such as `1.` and `-` for lists) if (modeCfg.highlightFormatting === undefined) modeCfg.highlightFormatting = false; // Maximum number of nested blockquotes. Set to 0 for infinite nesting. // Excess `>` will emit `error` token. if (modeCfg.maxBlockquoteDepth === undefined) modeCfg.maxBlockquoteDepth = 0; // Should underscores in words open/close em/strong? if (modeCfg.underscoresBreakWords === undefined) modeCfg.underscoresBreakWords = true; // Turn on fenced code blocks? ("```" to start/end) if (modeCfg.fencedCodeBlocks === undefined) modeCfg.fencedCodeBlocks = false; // Turn on task lists? ("- [ ] " and "- [x] ") if (modeCfg.taskLists === undefined) modeCfg.taskLists = false; // Turn on strikethrough syntax if (modeCfg.strikethrough === undefined) modeCfg.strikethrough = false; var codeDepth = 0; var header = 'header' , code = 'comment' , quote = 'quote' , list1 = 'variable-2' , list2 = 'variable-3' , list3 = 'keyword' , hr = 'hr' , image = 'tag' , formatting = 'formatting' , linkinline = 'link' , linkemail = 'link' , linktext = 'link' , linkhref = 'string' , em = 'em' , strong = 'strong' , strikethrough = 'strikethrough'; var hrRE = /^([*\-=_])(?:\s*\1){2,}\s*$/ , ulRE = /^[*\-+]\s+/ , olRE = /^[0-9]+\.\s+/ , taskListRE = /^\[(x| )\](?=\s)/ // Must follow ulRE or olRE , atxHeaderRE = /^#+ ?/ , setextHeaderRE = /^(?:\={1,}|-{1,})$/ , textRE = /^[^#!\[\]*_\\<>` "'(~]+/; function switchInline(stream, state, f) { state.f = state.inline = f; return f(stream, state); } function switchBlock(stream, state, f) { state.f = state.block = f; return f(stream, state); } // Blocks function blankLine(state) { // Reset linkTitle state state.linkTitle = false; // Reset EM state state.em = false; // Reset STRONG state state.strong = false; // Reset strikethrough state state.strikethrough = false; // Reset state.quote state.quote = 0; if (!htmlFound && state.f == htmlBlock) { state.f = inlineNormal; state.block = blockNormal; } // Reset state.trailingSpace state.trailingSpace = 0; state.trailingSpaceNewLine = false; // Mark this line as blank state.thisLineHasContent = false; return null; } function blockNormal(stream, state) { var sol = stream.sol(); var prevLineIsList = state.list !== false; if (prevLineIsList) { if (state.indentationDiff >= 0) { // Continued list if (state.indentationDiff < 4) { // Only adjust indentation if *not* a code block state.indentation -= state.indentationDiff; } state.list = null; } else if (state.indentation > 0) { state.list = null; state.listDepth = Math.floor(state.indentation / 4); } else { // No longer a list state.list = false; state.listDepth = 0; } } var match = null; if (state.indentationDiff >= 4) { state.indentation -= 4; stream.skipToEnd(); return code; } else if (stream.eatSpace()) { return null; } else if (match = stream.match(atxHeaderRE)) { state.header = Math.min(6, match[0].indexOf(" ") !== -1 ? match[0].length - 1 : match[0].length); if (modeCfg.highlightFormatting) state.formatting = "header"; state.f = state.inline; return getType(state); } else if (state.prevLineHasContent && (match = stream.match(setextHeaderRE))) { state.header = match[0].charAt(0) == '=' ? 1 : 2; if (modeCfg.highlightFormatting) state.formatting = "header"; state.f = state.inline; return getType(state); } else if (stream.eat('>')) { state.indentation++; state.quote = sol ? 1 : state.quote + 1; if (modeCfg.highlightFormatting) state.formatting = "quote"; stream.eatSpace(); return getType(state); } else if (stream.peek() === '[') { return switchInline(stream, state, footnoteLink); } else if (stream.match(hrRE, true)) { return hr; } else if ((!state.prevLineHasContent || prevLineIsList) && (stream.match(ulRE, false) || stream.match(olRE, false))) { var listType = null; if (stream.match(ulRE, true)) { listType = 'ul'; } else { stream.match(olRE, true); listType = 'ol'; } state.indentation += 4; state.list = true; state.listDepth++; if (modeCfg.taskLists && stream.match(taskListRE, false)) { state.taskList = true; } state.f = state.inline; if (modeCfg.highlightFormatting) state.formatting = ["list", "list-" + listType]; return getType(state); } else if (modeCfg.fencedCodeBlocks && stream.match(/^```[ \t]*([\w+#]*)/, true)) { // try switching mode state.localMode = getMode(RegExp.$1); if (state.localMode) state.localState = state.localMode.startState(); state.f = state.block = local; if (modeCfg.highlightFormatting) state.formatting = "code-block"; state.code = true; return getType(state); } return switchInline(stream, state, state.inline); } function htmlBlock(stream, state) { var style = htmlMode.token(stream, state.htmlState); if ((htmlFound && state.htmlState.tagStart === null && !state.htmlState.context) || (state.md_inside && stream.current().indexOf(">") > -1)) { state.f = inlineNormal; state.block = blockNormal; state.htmlState = null; } return style; } function local(stream, state) { if (stream.sol() && stream.match("```", false)) { state.localMode = state.localState = null; state.f = state.block = leavingLocal; return null; } else if (state.localMode) { return state.localMode.token(stream, state.localState); } else { stream.skipToEnd(); return code; } } function leavingLocal(stream, state) { stream.match("```"); state.block = blockNormal; state.f = inlineNormal; if (modeCfg.highlightFormatting) state.formatting = "code-block"; state.code = true; var returnType = getType(state); state.code = false; return returnType; } // Inline function getType(state) { var styles = []; if (state.formatting) { styles.push(formatting); if (typeof state.formatting === "string") state.formatting = [state.formatting]; for (var i = 0; i < state.formatting.length; i++) { styles.push(formatting + "-" + state.formatting[i]); if (state.formatting[i] === "header") { styles.push(formatting + "-" + state.formatting[i] + "-" + state.header); } // Add `formatting-quote` and `formatting-quote-#` for blockquotes // Add `error` instead if the maximum blockquote nesting depth is passed if (state.formatting[i] === "quote") { if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) { styles.push(formatting + "-" + state.formatting[i] + "-" + state.quote); } else { styles.push("error"); } } } } if (state.taskOpen) { styles.push("meta"); return styles.length ? styles.join(' ') : null; } if (state.taskClosed) { styles.push("property"); return styles.length ? styles.join(' ') : null; } if (state.linkHref) { styles.push(linkhref); return styles.length ? styles.join(' ') : null; } if (state.strong) { styles.push(strong); } if (state.em) { styles.push(em); } if (state.strikethrough) { styles.push(strikethrough); } if (state.linkText) { styles.push(linktext); } if (state.code) { styles.push(code); } if (state.header) { styles.push(header); styles.push(header + "-" + state.header); } if (state.quote) { styles.push(quote); // Add `quote-#` where the maximum for `#` is modeCfg.maxBlockquoteDepth if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) { styles.push(quote + "-" + state.quote); } else { styles.push(quote + "-" + modeCfg.maxBlockquoteDepth); } } if (state.list !== false) { var listMod = (state.listDepth - 1) % 3; if (!listMod) { styles.push(list1); } else if (listMod === 1) { styles.push(list2); } else { styles.push(list3); } } if (state.trailingSpaceNewLine) { styles.push("trailing-space-new-line"); } else if (state.trailingSpace) { styles.push("trailing-space-" + (state.trailingSpace % 2 ? "a" : "b")); } return styles.length ? styles.join(' ') : null; } function handleText(stream, state) { if (stream.match(textRE, true)) { return getType(state); } return undefined; } function inlineNormal(stream, state) { var style = state.text(stream, state); if (typeof style !== 'undefined') return style; if (state.list) { // List marker (*, +, -, 1., etc) state.list = null; return getType(state); } if (state.taskList) { var taskOpen = stream.match(taskListRE, true)[1] !== "x"; if (taskOpen) state.taskOpen = true; else state.taskClosed = true; if (modeCfg.highlightFormatting) state.formatting = "task"; state.taskList = false; return getType(state); } state.taskOpen = false; state.taskClosed = false; if (state.header && stream.match(/^#+$/, true)) { if (modeCfg.highlightFormatting) state.formatting = "header"; return getType(state); } // Get sol() value now, before character is consumed var sol = stream.sol(); var ch = stream.next(); if (ch === '\\') { stream.next(); if (modeCfg.highlightFormatting) { var type = getType(state); return type ? type + " formatting-escape" : "formatting-escape"; } } // Matches link titles present on next line if (state.linkTitle) { state.linkTitle = false; var matchCh = ch; if (ch === '(') { matchCh = ')'; } matchCh = (matchCh+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"); var regex = '^\\s*(?:[^' + matchCh + '\\\\]+|\\\\\\\\|\\\\.)' + matchCh; if (stream.match(new RegExp(regex), true)) { return linkhref; } } // If this block is changed, it may need to be updated in GFM mode if (ch === '`') { var previousFormatting = state.formatting; if (modeCfg.highlightFormatting) state.formatting = "code"; var t = getType(state); var before = stream.pos; stream.eatWhile('`'); var difference = 1 + stream.pos - before; if (!state.code) { codeDepth = difference; state.code = true; return getType(state); } else { if (difference === codeDepth) { // Must be exact state.code = false; return t; } state.formatting = previousFormatting; return getType(state); } } else if (state.code) { return getType(state); } if (ch === '!' && stream.match(/\[[^\]]*\] ?(?:\(|\[)/, false)) { stream.match(/\[[^\]]*\]/); state.inline = state.f = linkHref; return image; } if (ch === '[' && stream.match(/.*\](\(.*\)| ?\[.*\])/, false)) { state.linkText = true; if (modeCfg.highlightFormatting) state.formatting = "link"; return getType(state); } if (ch === ']' && state.linkText && stream.match(/\(.*\)| ?\[.*\]/, false)) { if (modeCfg.highlightFormatting) state.formatting = "link"; var type = getType(state); state.linkText = false; state.inline = state.f = linkHref; return type; } if (ch === '<' && stream.match(/^(https?|ftps?):\/\/(?:[^\\>]|\\.)+>/, false)) { state.f = state.inline = linkInline; if (modeCfg.highlightFormatting) state.formatting = "link"; var type = getType(state); if (type){ type += " "; } else { type = ""; } return type + linkinline; } if (ch === '<' && stream.match(/^[^> \\]+@(?:[^\\>]|\\.)+>/, false)) { state.f = state.inline = linkInline; if (modeCfg.highlightFormatting) state.formatting = "link"; var type = getType(state); if (type){ type += " "; } else { type = ""; } return type + linkemail; } if (ch === '<' && stream.match(/^\w/, false)) { if (stream.string.indexOf(">") != -1) { var atts = stream.string.substring(1,stream.string.indexOf(">")); if (/markdown\s*=\s*('|"){0,1}1('|"){0,1}/.test(atts)) { state.md_inside = true; } } stream.backUp(1); state.htmlState = CodeMirror.startState(htmlMode); return switchBlock(stream, state, htmlBlock); } if (ch === '<' && stream.match(/^\/\w*?>/)) { state.md_inside = false; return "tag"; } var ignoreUnderscore = false; if (!modeCfg.underscoresBreakWords) { if (ch === '_' && stream.peek() !== '_' && stream.match(/(\w)/, false)) { var prevPos = stream.pos - 2; if (prevPos >= 0) { var prevCh = stream.string.charAt(prevPos); if (prevCh !== '_' && prevCh.match(/(\w)/, false)) { ignoreUnderscore = true; } } } } if (ch === '*' || (ch === '_' && !ignoreUnderscore)) { if (sol && stream.peek() === ' ') { // Do nothing, surrounded by newline and space } else if (state.strong === ch && stream.eat(ch)) { // Remove STRONG if (modeCfg.highlightFormatting) state.formatting = "strong"; var t = getType(state); state.strong = false; return t; } else if (!state.strong && stream.eat(ch)) { // Add STRONG state.strong = ch; if (modeCfg.highlightFormatting) state.formatting = "strong"; return getType(state); } else if (state.em === ch) { // Remove EM if (modeCfg.highlightFormatting) state.formatting = "em"; var t = getType(state); state.em = false; return t; } else if (!state.em) { // Add EM state.em = ch; if (modeCfg.highlightFormatting) state.formatting = "em"; return getType(state); } } else if (ch === ' ') { if (stream.eat('*') || stream.eat('_')) { // Probably surrounded by spaces if (stream.peek() === ' ') { // Surrounded by spaces, ignore return getType(state); } else { // Not surrounded by spaces, back up pointer stream.backUp(1); } } } if (modeCfg.strikethrough) { if (ch === '~' && stream.eatWhile(ch)) { if (state.strikethrough) {// Remove strikethrough if (modeCfg.highlightFormatting) state.formatting = "strikethrough"; var t = getType(state); state.strikethrough = false; return t; } else if (stream.match(/^[^\s]/, false)) {// Add strikethrough state.strikethrough = true; if (modeCfg.highlightFormatting) state.formatting = "strikethrough"; return getType(state); } } else if (ch === ' ') { if (stream.match(/^~~/, true)) { // Probably surrounded by space if (stream.peek() === ' ') { // Surrounded by spaces, ignore return getType(state); } else { // Not surrounded by spaces, back up pointer stream.backUp(2); } } } } if (ch === ' ') { if (stream.match(/ +$/, false)) { state.trailingSpace++; } else if (state.trailingSpace) { state.trailingSpaceNewLine = true; } } return getType(state); } function linkInline(stream, state) { var ch = stream.next(); if (ch === ">") { state.f = state.inline = inlineNormal; if (modeCfg.highlightFormatting) state.formatting = "link"; var type = getType(state); if (type){ type += " "; } else { type = ""; } return type + linkinline; } stream.match(/^[^>]+/, true); return linkinline; } function linkHref(stream, state) { // Check if space, and return NULL if so (to avoid marking the space) if(stream.eatSpace()){ return null; } var ch = stream.next(); if (ch === '(' || ch === '[') { state.f = state.inline = getLinkHrefInside(ch === "(" ? ")" : "]"); if (modeCfg.highlightFormatting) state.formatting = "link-string"; state.linkHref = true; return getType(state); } return 'error'; } function getLinkHrefInside(endChar) { return function(stream, state) { var ch = stream.next(); if (ch === endChar) { state.f = state.inline = inlineNormal; if (modeCfg.highlightFormatting) state.formatting = "link-string"; var returnState = getType(state); state.linkHref = false; return returnState; } if (stream.match(inlineRE(endChar), true)) { stream.backUp(1); } state.linkHref = true; return getType(state); }; } function footnoteLink(stream, state) { if (stream.match(/^[^\]]*\]:/, false)) { state.f = footnoteLinkInside; stream.next(); // Consume [ if (modeCfg.highlightFormatting) state.formatting = "link"; state.linkText = true; return getType(state); } return switchInline(stream, state, inlineNormal); } function footnoteLinkInside(stream, state) { if (stream.match(/^\]:/, true)) { state.f = state.inline = footnoteUrl; if (modeCfg.highlightFormatting) state.formatting = "link"; var returnType = getType(state); state.linkText = false; return returnType; } stream.match(/^[^\]]+/, true); return linktext; } function footnoteUrl(stream, state) { // Check if space, and return NULL if so (to avoid marking the space) if(stream.eatSpace()){ return null; } // Match URL stream.match(/^[^\s]+/, true); // Check for link title if (stream.peek() === undefined) { // End of line, set flag to check next line state.linkTitle = true; } else { // More content on line, check if link title stream.match(/^(?:\s+(?:"(?:[^"\\]|\\\\|\\.)+"|'(?:[^'\\]|\\\\|\\.)+'|\((?:[^)\\]|\\\\|\\.)+\)))?/, true); } state.f = state.inline = inlineNormal; return linkhref; } var savedInlineRE = []; function inlineRE(endChar) { if (!savedInlineRE[endChar]) { // Escape endChar for RegExp (taken from http://stackoverflow.com/a/494122/526741) endChar = (endChar+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"); // Match any non-endChar, escaped character, as well as the closing // endChar. savedInlineRE[endChar] = new RegExp('^(?:[^\\\\]|\\\\.)*?(' + endChar + ')'); } return savedInlineRE[endChar]; } var mode = { startState: function() { return { f: blockNormal, prevLineHasContent: false, thisLineHasContent: false, block: blockNormal, htmlState: null, indentation: 0, inline: inlineNormal, text: handleText, formatting: false, linkText: false, linkHref: false, linkTitle: false, em: false, strong: false, header: 0, taskList: false, list: false, listDepth: 0, quote: 0, trailingSpace: 0, trailingSpaceNewLine: false, strikethrough: false }; }, copyState: function(s) { return { f: s.f, prevLineHasContent: s.prevLineHasContent, thisLineHasContent: s.thisLineHasContent, block: s.block, htmlState: s.htmlState && CodeMirror.copyState(htmlMode, s.htmlState), indentation: s.indentation, localMode: s.localMode, localState: s.localMode ? CodeMirror.copyState(s.localMode, s.localState) : null, inline: s.inline, text: s.text, formatting: false, linkTitle: s.linkTitle, em: s.em, strong: s.strong, strikethrough: s.strikethrough, header: s.header, taskList: s.taskList, list: s.list, listDepth: s.listDepth, quote: s.quote, trailingSpace: s.trailingSpace, trailingSpaceNewLine: s.trailingSpaceNewLine, md_inside: s.md_inside }; }, token: function(stream, state) { // Reset state.formatting state.formatting = false; if (stream.sol()) { var forceBlankLine = !!state.header; // Reset state.header state.header = 0; if (stream.match(/^\s*$/, true) || forceBlankLine) { state.prevLineHasContent = false; blankLine(state); return forceBlankLine ? this.token(stream, state) : null; } else { state.prevLineHasContent = state.thisLineHasContent; state.thisLineHasContent = true; } // Reset state.taskList state.taskList = false; // Reset state.code state.code = false; // Reset state.trailingSpace state.trailingSpace = 0; state.trailingSpaceNewLine = false; state.f = state.block; var indentation = stream.match(/^\s*/, true)[0].replace(/\t/g, ' ').length; var difference = Math.floor((indentation - state.indentation) / 4) * 4; if (difference > 4) difference = 4; var adjustedIndentation = state.indentation + difference; state.indentationDiff = adjustedIndentation - state.indentation; state.indentation = adjustedIndentation; if (indentation > 0) return null; } return state.f(stream, state); }, innerMode: function(state) { if (state.block == htmlBlock) return {state: state.htmlState, mode: htmlMode}; if (state.localState) return {state: state.localState, mode: state.localMode}; return {state: state, mode: mode}; }, blankLine: blankLine, getType: getType, fold: "markdown" }; return mode; }, "xml"); CodeMirror.defineMIME("text/x-markdown", "markdown"); }); ================================================ FILE: base/res/codemirror/mode/markdown/test.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({tabSize: 4}, "markdown"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } var modeHighlightFormatting = CodeMirror.getMode({tabSize: 4}, {name: "markdown", highlightFormatting: true}); function FT(name) { test.mode(name, modeHighlightFormatting, Array.prototype.slice.call(arguments, 1)); } FT("formatting_emAsterisk", "[em&formatting&formatting-em *][em foo][em&formatting&formatting-em *]"); FT("formatting_emUnderscore", "[em&formatting&formatting-em _][em foo][em&formatting&formatting-em _]"); FT("formatting_strongAsterisk", "[strong&formatting&formatting-strong **][strong foo][strong&formatting&formatting-strong **]"); FT("formatting_strongUnderscore", "[strong&formatting&formatting-strong __][strong foo][strong&formatting&formatting-strong __]"); FT("formatting_codeBackticks", "[comment&formatting&formatting-code `][comment foo][comment&formatting&formatting-code `]"); FT("formatting_doubleBackticks", "[comment&formatting&formatting-code ``][comment foo ` bar][comment&formatting&formatting-code ``]"); FT("formatting_atxHeader", "[header&header-1&formatting&formatting-header&formatting-header-1 # ][header&header-1 foo # bar ][header&header-1&formatting&formatting-header&formatting-header-1 #]"); FT("formatting_setextHeader", "foo", "[header&header-1&formatting&formatting-header&formatting-header-1 =]"); FT("formatting_blockquote", "[quote"e-1&formatting&formatting-quote&formatting-quote-1 > ][quote"e-1 foo]"); FT("formatting_list", "[variable-2&formatting&formatting-list&formatting-list-ul - ][variable-2 foo]"); FT("formatting_list", "[variable-2&formatting&formatting-list&formatting-list-ol 1. ][variable-2 foo]"); FT("formatting_link", "[link&formatting&formatting-link [][link foo][link&formatting&formatting-link ]]][string&formatting&formatting-link-string (][string http://example.com/][string&formatting&formatting-link-string )]"); FT("formatting_linkReference", "[link&formatting&formatting-link [][link foo][link&formatting&formatting-link ]]][string&formatting&formatting-link-string [][string bar][string&formatting&formatting-link-string ]]]", "[link&formatting&formatting-link [][link bar][link&formatting&formatting-link ]]:] [string http://example.com/]"); FT("formatting_linkWeb", "[link&formatting&formatting-link <][link http://example.com/][link&formatting&formatting-link >]"); FT("formatting_linkEmail", "[link&formatting&formatting-link <][link user@example.com][link&formatting&formatting-link >]"); FT("formatting_escape", "[formatting-escape \\*]"); MT("plainText", "foo"); // Don't style single trailing space MT("trailingSpace1", "foo "); // Two or more trailing spaces should be styled with line break character MT("trailingSpace2", "foo[trailing-space-a ][trailing-space-new-line ]"); MT("trailingSpace3", "foo[trailing-space-a ][trailing-space-b ][trailing-space-new-line ]"); MT("trailingSpace4", "foo[trailing-space-a ][trailing-space-b ][trailing-space-a ][trailing-space-new-line ]"); // Code blocks using 4 spaces (regardless of CodeMirror.tabSize value) MT("codeBlocksUsing4Spaces", " [comment foo]"); // Code blocks using 4 spaces with internal indentation MT("codeBlocksUsing4SpacesIndentation", " [comment bar]", " [comment hello]", " [comment world]", " [comment foo]", "bar"); // Code blocks using 4 spaces with internal indentation MT("codeBlocksUsing4SpacesIndentation", " foo", " [comment bar]", " [comment hello]", " [comment world]"); // Code blocks should end even after extra indented lines MT("codeBlocksWithTrailingIndentedLine", " [comment foo]", " [comment bar]", " [comment baz]", " ", "hello"); // Code blocks using 1 tab (regardless of CodeMirror.indentWithTabs value) MT("codeBlocksUsing1Tab", "\t[comment foo]"); // Inline code using backticks MT("inlineCodeUsingBackticks", "foo [comment `bar`]"); // Block code using single backtick (shouldn't work) MT("blockCodeSingleBacktick", "[comment `]", "foo", "[comment `]"); // Unclosed backticks // Instead of simply marking as CODE, it would be nice to have an // incomplete flag for CODE, that is styled slightly different. MT("unclosedBackticks", "foo [comment `bar]"); // Per documentation: "To include a literal backtick character within a // code span, you can use multiple backticks as the opening and closing // delimiters" MT("doubleBackticks", "[comment ``foo ` bar``]"); // Tests based on Dingus // http://daringfireball.net/projects/markdown/dingus // // Multiple backticks within an inline code block MT("consecutiveBackticks", "[comment `foo```bar`]"); // Multiple backticks within an inline code block with a second code block MT("consecutiveBackticks", "[comment `foo```bar`] hello [comment `world`]"); // Unclosed with several different groups of backticks MT("unclosedBackticks", "[comment ``foo ``` bar` hello]"); // Closed with several different groups of backticks MT("closedBackticks", "[comment ``foo ``` bar` hello``] world"); // atx headers // http://daringfireball.net/projects/markdown/syntax#header MT("atxH1", "[header&header-1 # foo]"); MT("atxH2", "[header&header-2 ## foo]"); MT("atxH3", "[header&header-3 ### foo]"); MT("atxH4", "[header&header-4 #### foo]"); MT("atxH5", "[header&header-5 ##### foo]"); MT("atxH6", "[header&header-6 ###### foo]"); // H6 - 7x '#' should still be H6, per Dingus // http://daringfireball.net/projects/markdown/dingus MT("atxH6NotH7", "[header&header-6 ####### foo]"); // Inline styles should be parsed inside headers MT("atxH1inline", "[header&header-1 # foo ][header&header-1&em *bar*]"); // Setext headers - H1, H2 // Per documentation, "Any number of underlining =’s or -’s will work." // http://daringfireball.net/projects/markdown/syntax#header // Ideally, the text would be marked as `header` as well, but this is // not really feasible at the moment. So, instead, we're testing against // what works today, to avoid any regressions. // // Check if single underlining = works MT("setextH1", "foo", "[header&header-1 =]"); // Check if 3+ ='s work MT("setextH1", "foo", "[header&header-1 ===]"); // Check if single underlining - works MT("setextH2", "foo", "[header&header-2 -]"); // Check if 3+ -'s work MT("setextH2", "foo", "[header&header-2 ---]"); // Single-line blockquote with trailing space MT("blockquoteSpace", "[quote"e-1 > foo]"); // Single-line blockquote MT("blockquoteNoSpace", "[quote"e-1 >foo]"); // No blank line before blockquote MT("blockquoteNoBlankLine", "foo", "[quote"e-1 > bar]"); // Nested blockquote MT("blockquoteSpace", "[quote"e-1 > foo]", "[quote"e-1 >][quote"e-2 > foo]", "[quote"e-1 >][quote"e-2 >][quote"e-3 > foo]"); // Single-line blockquote followed by normal paragraph MT("blockquoteThenParagraph", "[quote"e-1 >foo]", "", "bar"); // Multi-line blockquote (lazy mode) MT("multiBlockquoteLazy", "[quote"e-1 >foo]", "[quote"e-1 bar]"); // Multi-line blockquote followed by normal paragraph (lazy mode) MT("multiBlockquoteLazyThenParagraph", "[quote"e-1 >foo]", "[quote"e-1 bar]", "", "hello"); // Multi-line blockquote (non-lazy mode) MT("multiBlockquote", "[quote"e-1 >foo]", "[quote"e-1 >bar]"); // Multi-line blockquote followed by normal paragraph (non-lazy mode) MT("multiBlockquoteThenParagraph", "[quote"e-1 >foo]", "[quote"e-1 >bar]", "", "hello"); // Check list types MT("listAsterisk", "foo", "bar", "", "[variable-2 * foo]", "[variable-2 * bar]"); MT("listPlus", "foo", "bar", "", "[variable-2 + foo]", "[variable-2 + bar]"); MT("listDash", "foo", "bar", "", "[variable-2 - foo]", "[variable-2 - bar]"); MT("listNumber", "foo", "bar", "", "[variable-2 1. foo]", "[variable-2 2. bar]"); // Lists require a preceding blank line (per Dingus) MT("listBogus", "foo", "1. bar", "2. hello"); // List after header MT("listAfterHeader", "[header&header-1 # foo]", "[variable-2 - bar]"); // Formatting in lists (*) MT("listAsteriskFormatting", "[variable-2 * ][variable-2&em *foo*][variable-2 bar]", "[variable-2 * ][variable-2&strong **foo**][variable-2 bar]", "[variable-2 * ][variable-2&strong **][variable-2&em&strong *foo**][variable-2&em *][variable-2 bar]", "[variable-2 * ][variable-2&comment `foo`][variable-2 bar]"); // Formatting in lists (+) MT("listPlusFormatting", "[variable-2 + ][variable-2&em *foo*][variable-2 bar]", "[variable-2 + ][variable-2&strong **foo**][variable-2 bar]", "[variable-2 + ][variable-2&strong **][variable-2&em&strong *foo**][variable-2&em *][variable-2 bar]", "[variable-2 + ][variable-2&comment `foo`][variable-2 bar]"); // Formatting in lists (-) MT("listDashFormatting", "[variable-2 - ][variable-2&em *foo*][variable-2 bar]", "[variable-2 - ][variable-2&strong **foo**][variable-2 bar]", "[variable-2 - ][variable-2&strong **][variable-2&em&strong *foo**][variable-2&em *][variable-2 bar]", "[variable-2 - ][variable-2&comment `foo`][variable-2 bar]"); // Formatting in lists (1.) MT("listNumberFormatting", "[variable-2 1. ][variable-2&em *foo*][variable-2 bar]", "[variable-2 2. ][variable-2&strong **foo**][variable-2 bar]", "[variable-2 3. ][variable-2&strong **][variable-2&em&strong *foo**][variable-2&em *][variable-2 bar]", "[variable-2 4. ][variable-2&comment `foo`][variable-2 bar]"); // Paragraph lists MT("listParagraph", "[variable-2 * foo]", "", "[variable-2 * bar]"); // Multi-paragraph lists // // 4 spaces MT("listMultiParagraph", "[variable-2 * foo]", "", "[variable-2 * bar]", "", " [variable-2 hello]"); // 4 spaces, extra blank lines (should still be list, per Dingus) MT("listMultiParagraphExtra", "[variable-2 * foo]", "", "[variable-2 * bar]", "", "", " [variable-2 hello]"); // 4 spaces, plus 1 space (should still be list, per Dingus) MT("listMultiParagraphExtraSpace", "[variable-2 * foo]", "", "[variable-2 * bar]", "", " [variable-2 hello]", "", " [variable-2 world]"); // 1 tab MT("listTab", "[variable-2 * foo]", "", "[variable-2 * bar]", "", "\t[variable-2 hello]"); // No indent MT("listNoIndent", "[variable-2 * foo]", "", "[variable-2 * bar]", "", "hello"); // Blockquote MT("blockquote", "[variable-2 * foo]", "", "[variable-2 * bar]", "", " [variable-2"e"e-1 > hello]"); // Code block MT("blockquoteCode", "[variable-2 * foo]", "", "[variable-2 * bar]", "", " [comment > hello]", "", " [variable-2 world]"); // Code block followed by text MT("blockquoteCodeText", "[variable-2 * foo]", "", " [variable-2 bar]", "", " [comment hello]", "", " [variable-2 world]"); // Nested list MT("listAsteriskNested", "[variable-2 * foo]", "", " [variable-3 * bar]"); MT("listPlusNested", "[variable-2 + foo]", "", " [variable-3 + bar]"); MT("listDashNested", "[variable-2 - foo]", "", " [variable-3 - bar]"); MT("listNumberNested", "[variable-2 1. foo]", "", " [variable-3 2. bar]"); MT("listMixed", "[variable-2 * foo]", "", " [variable-3 + bar]", "", " [keyword - hello]", "", " [variable-2 1. world]"); MT("listBlockquote", "[variable-2 * foo]", "", " [variable-3 + bar]", "", " [quote"e-1&variable-3 > hello]"); MT("listCode", "[variable-2 * foo]", "", " [variable-3 + bar]", "", " [comment hello]"); // Code with internal indentation MT("listCodeIndentation", "[variable-2 * foo]", "", " [comment bar]", " [comment hello]", " [comment world]", " [comment foo]", " [variable-2 bar]"); // List nesting edge cases MT("listNested", "[variable-2 * foo]", "", " [variable-3 * bar]", "", " [variable-2 hello]" ); MT("listNested", "[variable-2 * foo]", "", " [variable-3 * bar]", "", " [variable-3 * foo]" ); // Code followed by text MT("listCodeText", "[variable-2 * foo]", "", " [comment bar]", "", "hello"); // Following tests directly from official Markdown documentation // http://daringfireball.net/projects/markdown/syntax#hr MT("hrSpace", "[hr * * *]"); MT("hr", "[hr ***]"); MT("hrLong", "[hr *****]"); MT("hrSpaceDash", "[hr - - -]"); MT("hrDashLong", "[hr ---------------------------------------]"); // Inline link with title MT("linkTitle", "[link [[foo]]][string (http://example.com/ \"bar\")] hello"); // Inline link without title MT("linkNoTitle", "[link [[foo]]][string (http://example.com/)] bar"); // Inline link with image MT("linkImage", "[link [[][tag ![[foo]]][string (http://example.com/)][link ]]][string (http://example.com/)] bar"); // Inline link with Em MT("linkEm", "[link [[][link&em *foo*][link ]]][string (http://example.com/)] bar"); // Inline link with Strong MT("linkStrong", "[link [[][link&strong **foo**][link ]]][string (http://example.com/)] bar"); // Inline link with EmStrong MT("linkEmStrong", "[link [[][link&strong **][link&em&strong *foo**][link&em *][link ]]][string (http://example.com/)] bar"); // Image with title MT("imageTitle", "[tag ![[foo]]][string (http://example.com/ \"bar\")] hello"); // Image without title MT("imageNoTitle", "[tag ![[foo]]][string (http://example.com/)] bar"); // Image with asterisks MT("imageAsterisks", "[tag ![[*foo*]]][string (http://example.com/)] bar"); // Not a link. Should be normal text due to square brackets being used // regularly in text, especially in quoted material, and no space is allowed // between square brackets and parentheses (per Dingus). MT("notALink", "[[foo]] (bar)"); // Reference-style links MT("linkReference", "[link [[foo]]][string [[bar]]] hello"); // Reference-style links with Em MT("linkReferenceEm", "[link [[][link&em *foo*][link ]]][string [[bar]]] hello"); // Reference-style links with Strong MT("linkReferenceStrong", "[link [[][link&strong **foo**][link ]]][string [[bar]]] hello"); // Reference-style links with EmStrong MT("linkReferenceEmStrong", "[link [[][link&strong **][link&em&strong *foo**][link&em *][link ]]][string [[bar]]] hello"); // Reference-style links with optional space separator (per docuentation) // "You can optionally use a space to separate the sets of brackets" MT("linkReferenceSpace", "[link [[foo]]] [string [[bar]]] hello"); // Should only allow a single space ("...use *a* space...") MT("linkReferenceDoubleSpace", "[[foo]] [[bar]] hello"); // Reference-style links with implicit link name MT("linkImplicit", "[link [[foo]]][string [[]]] hello"); // @todo It would be nice if, at some point, the document was actually // checked to see if the referenced link exists // Link label, for reference-style links (taken from documentation) MT("labelNoTitle", "[link [[foo]]:] [string http://example.com/]"); MT("labelIndented", " [link [[foo]]:] [string http://example.com/]"); MT("labelSpaceTitle", "[link [[foo bar]]:] [string http://example.com/ \"hello\"]"); MT("labelDoubleTitle", "[link [[foo bar]]:] [string http://example.com/ \"hello\"] \"world\""); MT("labelTitleDoubleQuotes", "[link [[foo]]:] [string http://example.com/ \"bar\"]"); MT("labelTitleSingleQuotes", "[link [[foo]]:] [string http://example.com/ 'bar']"); MT("labelTitleParenthese", "[link [[foo]]:] [string http://example.com/ (bar)]"); MT("labelTitleInvalid", "[link [[foo]]:] [string http://example.com/] bar"); MT("labelLinkAngleBrackets", "[link [[foo]]:] [string \"bar\"]"); MT("labelTitleNextDoubleQuotes", "[link [[foo]]:] [string http://example.com/]", "[string \"bar\"] hello"); MT("labelTitleNextSingleQuotes", "[link [[foo]]:] [string http://example.com/]", "[string 'bar'] hello"); MT("labelTitleNextParenthese", "[link [[foo]]:] [string http://example.com/]", "[string (bar)] hello"); MT("labelTitleNextMixed", "[link [[foo]]:] [string http://example.com/]", "(bar\" hello"); MT("linkWeb", "[link ] foo"); MT("linkWebDouble", "[link ] foo [link ]"); MT("linkEmail", "[link ] foo"); MT("linkEmailDouble", "[link ] foo [link ]"); MT("emAsterisk", "[em *foo*] bar"); MT("emUnderscore", "[em _foo_] bar"); MT("emInWordAsterisk", "foo[em *bar*]hello"); MT("emInWordUnderscore", "foo[em _bar_]hello"); // Per documentation: "...surround an * or _ with spaces, it’ll be // treated as a literal asterisk or underscore." MT("emEscapedBySpaceIn", "foo [em _bar _ hello_] world"); MT("emEscapedBySpaceOut", "foo _ bar[em _hello_]world"); MT("emEscapedByNewline", "foo", "_ bar[em _hello_]world"); // Unclosed emphasis characters // Instead of simply marking as EM / STRONG, it would be nice to have an // incomplete flag for EM and STRONG, that is styled slightly different. MT("emIncompleteAsterisk", "foo [em *bar]"); MT("emIncompleteUnderscore", "foo [em _bar]"); MT("strongAsterisk", "[strong **foo**] bar"); MT("strongUnderscore", "[strong __foo__] bar"); MT("emStrongAsterisk", "[em *foo][em&strong **bar*][strong hello**] world"); MT("emStrongUnderscore", "[em _foo][em&strong __bar_][strong hello__] world"); // "...same character must be used to open and close an emphasis span."" MT("emStrongMixed", "[em _foo][em&strong **bar*hello__ world]"); MT("emStrongMixed", "[em *foo][em&strong __bar_hello** world]"); // These characters should be escaped: // \ backslash // ` backtick // * asterisk // _ underscore // {} curly braces // [] square brackets // () parentheses // # hash mark // + plus sign // - minus sign (hyphen) // . dot // ! exclamation mark MT("escapeBacktick", "foo \\`bar\\`"); MT("doubleEscapeBacktick", "foo \\\\[comment `bar\\\\`]"); MT("escapeAsterisk", "foo \\*bar\\*"); MT("doubleEscapeAsterisk", "foo \\\\[em *bar\\\\*]"); MT("escapeUnderscore", "foo \\_bar\\_"); MT("doubleEscapeUnderscore", "foo \\\\[em _bar\\\\_]"); MT("escapeHash", "\\# foo"); MT("doubleEscapeHash", "\\\\# foo"); MT("escapeNewline", "\\", "[em *foo*]"); // Tests to make sure GFM-specific things aren't getting through MT("taskList", "[variable-2 * [ ]] bar]"); MT("fencedCodeBlocks", "[comment ```]", "foo", "[comment ```]"); // Tests that require XML mode MT("xmlMode", "[tag&bracket <][tag div][tag&bracket >]", "*foo*", "[tag&bracket <][tag http://github.com][tag&bracket />]", "[tag&bracket ]", "[link ]"); MT("xmlModeWithMarkdownInside", "[tag&bracket <][tag div] [attribute markdown]=[string 1][tag&bracket >]", "[em *foo*]", "[link ]", "[tag
]", "[link ]", "[tag&bracket <][tag div][tag&bracket >]", "[tag&bracket ]"); })(); ================================================ FILE: base/res/codemirror/mode/meta.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.modeInfo = [ {name: "APL", mime: "text/apl", mode: "apl", ext: ["dyalog", "apl"]}, {name: "PGP", mimes: ["application/pgp", "application/pgp-keys", "application/pgp-signature"], mode: "asciiarmor", ext: ["pgp"]}, {name: "Asterisk", mime: "text/x-asterisk", mode: "asterisk", file: /^extensions\.conf$/i}, {name: "C", mime: "text/x-csrc", mode: "clike", ext: ["c", "h"]}, {name: "C++", mime: "text/x-c++src", mode: "clike", ext: ["cpp", "c++", "cc", "cxx", "hpp", "h++", "hh", "hxx"], alias: ["cpp"]}, {name: "Cobol", mime: "text/x-cobol", mode: "cobol", ext: ["cob", "cpy"]}, {name: "C#", mime: "text/x-csharp", mode: "clike", ext: ["cs"], alias: ["csharp"]}, {name: "Clojure", mime: "text/x-clojure", mode: "clojure", ext: ["clj"]}, {name: "CMake", mime: "text/x-cmake", mode: "cmake", ext: ["cmake", "cmake.in"], file: /^CMakeLists.txt$/}, {name: "CoffeeScript", mime: "text/x-coffeescript", mode: "coffeescript", ext: ["coffee"], alias: ["coffee", "coffee-script"]}, {name: "Common Lisp", mime: "text/x-common-lisp", mode: "commonlisp", ext: ["cl", "lisp", "el"], alias: ["lisp"]}, {name: "Cypher", mime: "application/x-cypher-query", mode: "cypher", ext: ["cyp", "cypher"]}, {name: "Cython", mime: "text/x-cython", mode: "python", ext: ["pyx", "pxd", "pxi"]}, {name: "CSS", mime: "text/css", mode: "css", ext: ["css"]}, {name: "CQL", mime: "text/x-cassandra", mode: "sql", ext: ["cql"]}, {name: "D", mime: "text/x-d", mode: "d", ext: ["d"]}, {name: "Dart", mimes: ["application/dart", "text/x-dart"], mode: "dart", ext: ["dart"]}, {name: "diff", mime: "text/x-diff", mode: "diff", ext: ["diff", "patch"]}, {name: "Django", mime: "text/x-django", mode: "django"}, {name: "Dockerfile", mime: "text/x-dockerfile", mode: "dockerfile", file: /^Dockerfile$/}, {name: "DTD", mime: "application/xml-dtd", mode: "dtd", ext: ["dtd"]}, {name: "Dylan", mime: "text/x-dylan", mode: "dylan", ext: ["dylan", "dyl", "intr"]}, {name: "EBNF", mime: "text/x-ebnf", mode: "ebnf"}, {name: "ECL", mime: "text/x-ecl", mode: "ecl", ext: ["ecl"]}, {name: "Eiffel", mime: "text/x-eiffel", mode: "eiffel", ext: ["e"]}, {name: "Embedded Javascript", mime: "application/x-ejs", mode: "htmlembedded", ext: ["ejs"]}, {name: "Embedded Ruby", mime: "application/x-erb", mode: "htmlembedded", ext: ["erb"]}, {name: "Erlang", mime: "text/x-erlang", mode: "erlang", ext: ["erl"]}, {name: "Forth", mime: "text/x-forth", mode: "forth", ext: ["forth", "fth", "4th"]}, {name: "Fortran", mime: "text/x-fortran", mode: "fortran", ext: ["f", "for", "f77", "f90"]}, {name: "F#", mime: "text/x-fsharp", mode: "mllike", ext: ["fs"], alias: ["fsharp"]}, {name: "Gas", mime: "text/x-gas", mode: "gas", ext: ["s"]}, {name: "Gherkin", mime: "text/x-feature", mode: "gherkin", ext: ["feature"]}, {name: "GitHub Flavored Markdown", mime: "text/x-gfm", mode: "gfm", file: /^(readme|contributing|history).md$/i}, {name: "Go", mime: "text/x-go", mode: "go", ext: ["go"]}, {name: "Groovy", mime: "text/x-groovy", mode: "groovy", ext: ["groovy"]}, {name: "HAML", mime: "text/x-haml", mode: "haml", ext: ["haml"]}, {name: "Haskell", mime: "text/x-haskell", mode: "haskell", ext: ["hs"]}, {name: "Haxe", mime: "text/x-haxe", mode: "haxe", ext: ["hx"]}, {name: "HXML", mime: "text/x-hxml", mode: "haxe", ext: ["hxml"]}, {name: "ASP.NET", mime: "application/x-aspx", mode: "htmlembedded", ext: ["aspx"], alias: ["asp", "aspx"]}, {name: "HTML", mime: "text/html", mode: "htmlmixed", ext: ["html", "htm"], alias: ["xhtml"]}, {name: "HTTP", mime: "message/http", mode: "http"}, {name: "IDL", mime: "text/x-idl", mode: "idl", ext: ["pro"]}, {name: "Jade", mime: "text/x-jade", mode: "jade", ext: ["jade"]}, {name: "Java", mime: "text/x-java", mode: "clike", ext: ["java"]}, {name: "Java Server Pages", mime: "application/x-jsp", mode: "htmlembedded", ext: ["jsp"], alias: ["jsp"]}, {name: "JavaScript", mimes: ["text/javascript", "text/ecmascript", "application/javascript", "application/x-javascript", "application/ecmascript"], mode: "javascript", ext: ["js"], alias: ["ecmascript", "js", "node"]}, {name: "JSON", mimes: ["application/json", "application/x-json"], mode: "javascript", ext: ["json", "map"], alias: ["json5"]}, {name: "JSON-LD", mime: "application/ld+json", mode: "javascript", ext: ["jsonld"], alias: ["jsonld"]}, {name: "Jinja2", mime: "null", mode: "jinja2"}, {name: "Julia", mime: "text/x-julia", mode: "julia", ext: ["jl"]}, {name: "Kotlin", mime: "text/x-kotlin", mode: "kotlin", ext: ["kt"]}, {name: "LESS", mime: "text/x-less", mode: "css", ext: ["less"]}, {name: "LiveScript", mime: "text/x-livescript", mode: "livescript", ext: ["ls"], alias: ["ls"]}, {name: "Lua", mime: "text/x-lua", mode: "lua", ext: ["lua"]}, {name: "Markdown", mime: "text/x-markdown", mode: "markdown", ext: ["markdown", "md", "mkd"]}, {name: "mIRC", mime: "text/mirc", mode: "mirc"}, {name: "MariaDB SQL", mime: "text/x-mariadb", mode: "sql"}, {name: "Modelica", mime: "text/x-modelica", mode: "modelica", ext: ["mo"]}, {name: "MUMPS", mime: "text/x-mumps", mode: "mumps"}, {name: "MS SQL", mime: "text/x-mssql", mode: "sql"}, {name: "MySQL", mime: "text/x-mysql", mode: "sql"}, {name: "Nginx", mime: "text/x-nginx-conf", mode: "nginx", file: /nginx.*\.conf$/i}, {name: "NTriples", mime: "text/n-triples", mode: "ntriples", ext: ["nt"]}, {name: "Objective C", mime: "text/x-objectivec", mode: "clike", ext: ["m", "mm"]}, {name: "OCaml", mime: "text/x-ocaml", mode: "mllike", ext: ["ml", "mli", "mll", "mly"]}, {name: "Octave", mime: "text/x-octave", mode: "octave", ext: ["m"]}, {name: "Pascal", mime: "text/x-pascal", mode: "pascal", ext: ["p", "pas"]}, {name: "PEG.js", mime: "null", mode: "pegjs", ext: ["jsonld"]}, {name: "Perl", mime: "text/x-perl", mode: "perl", ext: ["pl", "pm"]}, {name: "PHP", mime: "application/x-httpd-php", mode: "php", ext: ["php", "php3", "php4", "php5", "phtml"]}, {name: "Pig", mime: "text/x-pig", mode: "pig", ext: ["pig"]}, {name: "Plain Text", mime: "text/plain", mode: "null", ext: ["txt", "text", "conf", "def", "list", "log"]}, {name: "PLSQL", mime: "text/x-plsql", mode: "sql", ext: ["pls"]}, {name: "Properties files", mime: "text/x-properties", mode: "properties", ext: ["properties", "ini", "in"], alias: ["ini", "properties"]}, {name: "Python", mime: "text/x-python", mode: "python", ext: ["py", "pyw"]}, {name: "Puppet", mime: "text/x-puppet", mode: "puppet", ext: ["pp"]}, {name: "Q", mime: "text/x-q", mode: "q", ext: ["q"]}, {name: "R", mime: "text/x-rsrc", mode: "r", ext: ["r"], alias: ["rscript"]}, {name: "reStructuredText", mime: "text/x-rst", mode: "rst", ext: ["rst"], alias: ["rst"]}, {name: "RPM Changes", mime: "text/x-rpm-changes", mode: "rpm"}, {name: "RPM Spec", mime: "text/x-rpm-spec", mode: "rpm", ext: ["spec"]}, {name: "Ruby", mime: "text/x-ruby", mode: "ruby", ext: ["rb"], alias: ["jruby", "macruby", "rake", "rb", "rbx"]}, {name: "Rust", mime: "text/x-rustsrc", mode: "rust", ext: ["rs"]}, {name: "Sass", mime: "text/x-sass", mode: "sass", ext: ["sass"]}, {name: "Scala", mime: "text/x-scala", mode: "clike", ext: ["scala"]}, {name: "Scheme", mime: "text/x-scheme", mode: "scheme", ext: ["scm", "ss"]}, {name: "SCSS", mime: "text/x-scss", mode: "css", ext: ["scss"]}, {name: "Shell", mime: "text/x-sh", mode: "shell", ext: ["sh", "ksh", "bash"], alias: ["bash", "sh", "zsh"]}, {name: "Sieve", mime: "application/sieve", mode: "sieve", ext: ["siv", "sieve"]}, {name: "Slim", mimes: ["text/x-slim", "application/x-slim"], mode: "slim", ext: ["slim"]}, {name: "Smalltalk", mime: "text/x-stsrc", mode: "smalltalk", ext: ["st"]}, {name: "Smarty", mime: "text/x-smarty", mode: "smarty", ext: ["tpl"]}, {name: "Solr", mime: "text/x-solr", mode: "solr"}, {name: "Soy", mime: "text/x-soy", mode: "soy", ext: ["soy"], alias: ["closure template"]}, {name: "SPARQL", mime: "application/sparql-query", mode: "sparql", ext: ["rq", "sparql"], alias: ["sparul"]}, {name: "Spreadsheet", mime: "text/x-spreadsheet", mode: "spreadsheet", alias: ["excel", "formula"]}, {name: "SQL", mime: "text/x-sql", mode: "sql", ext: ["sql"]}, {name: "MariaDB", mime: "text/x-mariadb", mode: "sql"}, {name: "sTeX", mime: "text/x-stex", mode: "stex"}, {name: "LaTeX", mime: "text/x-latex", mode: "stex", ext: ["text", "ltx"], alias: ["tex"]}, {name: "SystemVerilog", mime: "text/x-systemverilog", mode: "verilog", ext: ["v"]}, {name: "Tcl", mime: "text/x-tcl", mode: "tcl", ext: ["tcl"]}, {name: "Textile", mime: "text/x-textile", mode: "textile", ext: ["textile"]}, {name: "TiddlyWiki ", mime: "text/x-tiddlywiki", mode: "tiddlywiki"}, {name: "Tiki wiki", mime: "text/tiki", mode: "tiki"}, {name: "TOML", mime: "text/x-toml", mode: "toml", ext: ["toml"]}, {name: "Tornado", mime: "text/x-tornado", mode: "tornado"}, {name: "troff", mime: "troff", mode: "troff", ext: ["1", "2", "3", "4", "5", "6", "7", "8", "9"]}, {name: "Turtle", mime: "text/turtle", mode: "turtle", ext: ["ttl"]}, {name: "TypeScript", mime: "application/typescript", mode: "javascript", ext: ["ts"], alias: ["ts"]}, {name: "VB.NET", mime: "text/x-vb", mode: "vb", ext: ["vb"]}, {name: "VBScript", mime: "text/vbscript", mode: "vbscript", ext: ["vbs"]}, {name: "Velocity", mime: "text/velocity", mode: "velocity", ext: ["vtl"]}, {name: "Verilog", mime: "text/x-verilog", mode: "verilog", ext: ["v"]}, {name: "XML", mimes: ["application/xml", "text/xml"], mode: "xml", ext: ["xml", "xsl", "xsd"], alias: ["rss", "wsdl", "xsd"]}, {name: "XQuery", mime: "application/xquery", mode: "xquery", ext: ["xy", "xquery"]}, {name: "YAML", mime: "text/x-yaml", mode: "yaml", ext: ["yaml", "yml"], alias: ["yml"]}, {name: "Z80", mime: "text/x-z80", mode: "z80", ext: ["z80"]} ]; // Ensure all modes have a mime property for backwards compatibility for (var i = 0; i < CodeMirror.modeInfo.length; i++) { var info = CodeMirror.modeInfo[i]; if (info.mimes) info.mime = info.mimes[0]; } CodeMirror.findModeByMIME = function(mime) { mime = mime.toLowerCase(); for (var i = 0; i < CodeMirror.modeInfo.length; i++) { var info = CodeMirror.modeInfo[i]; if (info.mime == mime) return info; if (info.mimes) for (var j = 0; j < info.mimes.length; j++) if (info.mimes[j] == mime) return info; } }; CodeMirror.findModeByExtension = function(ext) { for (var i = 0; i < CodeMirror.modeInfo.length; i++) { var info = CodeMirror.modeInfo[i]; if (info.ext) for (var j = 0; j < info.ext.length; j++) if (info.ext[j] == ext) return info; } }; CodeMirror.findModeByFileName = function(filename) { for (var i = 0; i < CodeMirror.modeInfo.length; i++) { var info = CodeMirror.modeInfo[i]; if (info.file && info.file.test(filename)) return info; } var dot = filename.lastIndexOf("."); var ext = dot > -1 && filename.substring(dot + 1, filename.length); if (ext) return CodeMirror.findModeByExtension(ext); }; CodeMirror.findModeByName = function(name) { name = name.toLowerCase(); for (var i = 0; i < CodeMirror.modeInfo.length; i++) { var info = CodeMirror.modeInfo[i]; if (info.name.toLowerCase() == name) return info; if (info.alias) for (var j = 0; j < info.alias.length; j++) if (info.alias[j].toLowerCase() == name) return info; } }; }); ================================================ FILE: base/res/codemirror/mode/mirc/index.html ================================================ CodeMirror: mIRC mode

mIRC mode

MIME types defined: text/mirc.

================================================ FILE: base/res/codemirror/mode/mirc/mirc.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE //mIRC mode by Ford_Lawnmower :: Based on Velocity mode by Steve O'Hara (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMIME("text/mirc", "mirc"); CodeMirror.defineMode("mirc", function() { function parseWords(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } var specials = parseWords("$! $$ $& $? $+ $abook $abs $active $activecid " + "$activewid $address $addtok $agent $agentname $agentstat $agentver " + "$alias $and $anick $ansi2mirc $aop $appactive $appstate $asc $asctime " + "$asin $atan $avoice $away $awaymsg $awaytime $banmask $base $bfind " + "$binoff $biton $bnick $bvar $bytes $calc $cb $cd $ceil $chan $chanmodes " + "$chantypes $chat $chr $cid $clevel $click $cmdbox $cmdline $cnick $color " + "$com $comcall $comchan $comerr $compact $compress $comval $cos $count " + "$cr $crc $creq $crlf $ctime $ctimer $ctrlenter $date $day $daylight " + "$dbuh $dbuw $dccignore $dccport $dde $ddename $debug $decode $decompress " + "$deltok $devent $dialog $did $didreg $didtok $didwm $disk $dlevel $dll " + "$dllcall $dname $dns $duration $ebeeps $editbox $emailaddr $encode $error " + "$eval $event $exist $feof $ferr $fgetc $file $filename $filtered $finddir " + "$finddirn $findfile $findfilen $findtok $fline $floor $fopen $fread $fserve " + "$fulladdress $fulldate $fullname $fullscreen $get $getdir $getdot $gettok $gmt " + "$group $halted $hash $height $hfind $hget $highlight $hnick $hotline " + "$hotlinepos $ial $ialchan $ibl $idle $iel $ifmatch $ignore $iif $iil " + "$inelipse $ini $inmidi $inpaste $inpoly $input $inrect $inroundrect " + "$insong $instok $int $inwave $ip $isalias $isbit $isdde $isdir $isfile " + "$isid $islower $istok $isupper $keychar $keyrpt $keyval $knick $lactive " + "$lactivecid $lactivewid $left $len $level $lf $line $lines $link $lock " + "$lock $locked $log $logstamp $logstampfmt $longfn $longip $lower $ltimer " + "$maddress $mask $matchkey $matchtok $md5 $me $menu $menubar $menucontext " + "$menutype $mid $middir $mircdir $mircexe $mircini $mklogfn $mnick $mode " + "$modefirst $modelast $modespl $mouse $msfile $network $newnick $nick $nofile " + "$nopath $noqt $not $notags $notify $null $numeric $numok $oline $onpoly " + "$opnick $or $ord $os $passivedcc $pic $play $pnick $port $portable $portfree " + "$pos $prefix $prop $protect $puttok $qt $query $rand $r $rawmsg $read $readomo " + "$readn $regex $regml $regsub $regsubex $remove $remtok $replace $replacex " + "$reptok $result $rgb $right $round $scid $scon $script $scriptdir $scriptline " + "$sdir $send $server $serverip $sfile $sha1 $shortfn $show $signal $sin " + "$site $sline $snick $snicks $snotify $sock $sockbr $sockerr $sockname " + "$sorttok $sound $sqrt $ssl $sreq $sslready $status $strip $str $stripped " + "$syle $submenu $switchbar $tan $target $ticks $time $timer $timestamp " + "$timestampfmt $timezone $tip $titlebar $toolbar $treebar $trust $ulevel " + "$ulist $upper $uptime $url $usermode $v1 $v2 $var $vcmd $vcmdstat $vcmdver " + "$version $vnick $vol $wid $width $wildsite $wildtok $window $wrap $xor"); var keywords = parseWords("abook ajinvite alias aline ame amsg anick aop auser autojoin avoice " + "away background ban bcopy beep bread break breplace bset btrunc bunset bwrite " + "channel clear clearall cline clipboard close cnick color comclose comopen " + "comreg continue copy creq ctcpreply ctcps dcc dccserver dde ddeserver " + "debug dec describe dialog did didtok disable disconnect dlevel dline dll " + "dns dqwindow drawcopy drawdot drawfill drawline drawpic drawrect drawreplace " + "drawrot drawsave drawscroll drawtext ebeeps echo editbox emailaddr enable " + "events exit fclose filter findtext finger firewall flash flist flood flush " + "flushini font fopen fseek fsend fserve fullname fwrite ghide gload gmove " + "gopts goto gplay gpoint gqreq groups gshow gsize gstop gtalk gunload hadd " + "halt haltdef hdec hdel help hfree hinc hload hmake hop hsave ial ialclear " + "ialmark identd if ignore iline inc invite iuser join kick linesep links list " + "load loadbuf localinfo log mdi me menubar mkdir mnick mode msg nick noop notice " + "notify omsg onotice part partall pdcc perform play playctrl pop protect pvoice " + "qme qmsg query queryn quit raw reload remini remote remove rename renwin " + "reseterror resetidle return rlevel rline rmdir run ruser save savebuf saveini " + "say scid scon server set showmirc signam sline sockaccept sockclose socklist " + "socklisten sockmark sockopen sockpause sockread sockrename sockudp sockwrite " + "sound speak splay sreq strip switchbar timer timestamp titlebar tnick tokenize " + "toolbar topic tray treebar ulist unload unset unsetall updatenl url uwho " + "var vcadd vcmd vcrem vol while whois window winhelp write writeint if isalnum " + "isalpha isaop isavoice isban ischan ishop isignore isin isincs isletter islower " + "isnotify isnum ison isop isprotect isreg isupper isvoice iswm iswmcs " + "elseif else goto menu nicklist status title icon size option text edit " + "button check radio box scroll list combo link tab item"); var functions = parseWords("if elseif else and not or eq ne in ni for foreach while switch"); var isOperatorChar = /[+\-*&%=<>!?^\/\|]/; function chain(stream, state, f) { state.tokenize = f; return f(stream, state); } function tokenBase(stream, state) { var beforeParams = state.beforeParams; state.beforeParams = false; var ch = stream.next(); if (/[\[\]{}\(\),\.]/.test(ch)) { if (ch == "(" && beforeParams) state.inParams = true; else if (ch == ")") state.inParams = false; return null; } else if (/\d/.test(ch)) { stream.eatWhile(/[\w\.]/); return "number"; } else if (ch == "\\") { stream.eat("\\"); stream.eat(/./); return "number"; } else if (ch == "/" && stream.eat("*")) { return chain(stream, state, tokenComment); } else if (ch == ";" && stream.match(/ *\( *\(/)) { return chain(stream, state, tokenUnparsed); } else if (ch == ";" && !state.inParams) { stream.skipToEnd(); return "comment"; } else if (ch == '"') { stream.eat(/"/); return "keyword"; } else if (ch == "$") { stream.eatWhile(/[$_a-z0-9A-Z\.:]/); if (specials && specials.propertyIsEnumerable(stream.current().toLowerCase())) { return "keyword"; } else { state.beforeParams = true; return "builtin"; } } else if (ch == "%") { stream.eatWhile(/[^,^\s^\(^\)]/); state.beforeParams = true; return "string"; } else if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return "operator"; } else { stream.eatWhile(/[\w\$_{}]/); var word = stream.current().toLowerCase(); if (keywords && keywords.propertyIsEnumerable(word)) return "keyword"; if (functions && functions.propertyIsEnumerable(word)) { state.beforeParams = true; return "keyword"; } return null; } } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = tokenBase; break; } maybeEnd = (ch == "*"); } return "comment"; } function tokenUnparsed(stream, state) { var maybeEnd = 0, ch; while (ch = stream.next()) { if (ch == ";" && maybeEnd == 2) { state.tokenize = tokenBase; break; } if (ch == ")") maybeEnd++; else if (ch != " ") maybeEnd = 0; } return "meta"; } return { startState: function() { return { tokenize: tokenBase, beforeParams: false, inParams: false }; }, token: function(stream, state) { if (stream.eatSpace()) return null; return state.tokenize(stream, state); } }; }); }); ================================================ FILE: base/res/codemirror/mode/mllike/index.html ================================================ CodeMirror: ML-like mode

OCaml mode

F# mode

MIME types defined: text/x-ocaml (OCaml) and text/x-fsharp (F#).

================================================ FILE: base/res/codemirror/mode/mllike/mllike.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode('mllike', function(_config, parserConfig) { var words = { 'let': 'keyword', 'rec': 'keyword', 'in': 'keyword', 'of': 'keyword', 'and': 'keyword', 'if': 'keyword', 'then': 'keyword', 'else': 'keyword', 'for': 'keyword', 'to': 'keyword', 'while': 'keyword', 'do': 'keyword', 'done': 'keyword', 'fun': 'keyword', 'function': 'keyword', 'val': 'keyword', 'type': 'keyword', 'mutable': 'keyword', 'match': 'keyword', 'with': 'keyword', 'try': 'keyword', 'open': 'builtin', 'ignore': 'builtin', 'begin': 'keyword', 'end': 'keyword' }; var extraWords = parserConfig.extraWords || {}; for (var prop in extraWords) { if (extraWords.hasOwnProperty(prop)) { words[prop] = parserConfig.extraWords[prop]; } } function tokenBase(stream, state) { var ch = stream.next(); if (ch === '"') { state.tokenize = tokenString; return state.tokenize(stream, state); } if (ch === '(') { if (stream.eat('*')) { state.commentLevel++; state.tokenize = tokenComment; return state.tokenize(stream, state); } } if (ch === '~') { stream.eatWhile(/\w/); return 'variable-2'; } if (ch === '`') { stream.eatWhile(/\w/); return 'quote'; } if (ch === '/' && parserConfig.slashComments && stream.eat('/')) { stream.skipToEnd(); return 'comment'; } if (/\d/.test(ch)) { stream.eatWhile(/[\d]/); if (stream.eat('.')) { stream.eatWhile(/[\d]/); } return 'number'; } if ( /[+\-*&%=<>!?|]/.test(ch)) { return 'operator'; } stream.eatWhile(/\w/); var cur = stream.current(); return words.hasOwnProperty(cur) ? words[cur] : 'variable'; } function tokenString(stream, state) { var next, end = false, escaped = false; while ((next = stream.next()) != null) { if (next === '"' && !escaped) { end = true; break; } escaped = !escaped && next === '\\'; } if (end && !escaped) { state.tokenize = tokenBase; } return 'string'; }; function tokenComment(stream, state) { var prev, next; while(state.commentLevel > 0 && (next = stream.next()) != null) { if (prev === '(' && next === '*') state.commentLevel++; if (prev === '*' && next === ')') state.commentLevel--; prev = next; } if (state.commentLevel <= 0) { state.tokenize = tokenBase; } return 'comment'; } return { startState: function() {return {tokenize: tokenBase, commentLevel: 0};}, token: function(stream, state) { if (stream.eatSpace()) return null; return state.tokenize(stream, state); }, blockCommentStart: "(*", blockCommentEnd: "*)", lineComment: parserConfig.slashComments ? "//" : null }; }); CodeMirror.defineMIME('text/x-ocaml', { name: 'mllike', extraWords: { 'succ': 'keyword', 'trace': 'builtin', 'exit': 'builtin', 'print_string': 'builtin', 'print_endline': 'builtin', 'true': 'atom', 'false': 'atom', 'raise': 'keyword' } }); CodeMirror.defineMIME('text/x-fsharp', { name: 'mllike', extraWords: { 'abstract': 'keyword', 'as': 'keyword', 'assert': 'keyword', 'base': 'keyword', 'class': 'keyword', 'default': 'keyword', 'delegate': 'keyword', 'downcast': 'keyword', 'downto': 'keyword', 'elif': 'keyword', 'exception': 'keyword', 'extern': 'keyword', 'finally': 'keyword', 'global': 'keyword', 'inherit': 'keyword', 'inline': 'keyword', 'interface': 'keyword', 'internal': 'keyword', 'lazy': 'keyword', 'let!': 'keyword', 'member' : 'keyword', 'module': 'keyword', 'namespace': 'keyword', 'new': 'keyword', 'null': 'keyword', 'override': 'keyword', 'private': 'keyword', 'public': 'keyword', 'return': 'keyword', 'return!': 'keyword', 'select': 'keyword', 'static': 'keyword', 'struct': 'keyword', 'upcast': 'keyword', 'use': 'keyword', 'use!': 'keyword', 'val': 'keyword', 'when': 'keyword', 'yield': 'keyword', 'yield!': 'keyword', 'List': 'builtin', 'Seq': 'builtin', 'Map': 'builtin', 'Set': 'builtin', 'int': 'builtin', 'string': 'builtin', 'raise': 'builtin', 'failwith': 'builtin', 'not': 'builtin', 'true': 'builtin', 'false': 'builtin' }, slashComments: true }); }); ================================================ FILE: base/res/codemirror/mode/modelica/index.html ================================================ CodeMirror: Modelica mode

Modelica mode

Simple mode that tries to handle Modelica as well as it can.

MIME types defined: text/x-modelica (Modlica code).

================================================ FILE: base/res/codemirror/mode/modelica/modelica.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Modelica support for CodeMirror, copyright (c) by Lennart Ochel (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); }) (function(CodeMirror) { "use strict"; CodeMirror.defineMode("modelica", function(config, parserConfig) { var indentUnit = config.indentUnit; var keywords = parserConfig.keywords || {}; var builtin = parserConfig.builtin || {}; var atoms = parserConfig.atoms || {}; var isSingleOperatorChar = /[;=\(:\),{}.*<>+\-\/^\[\]]/; var isDoubleOperatorChar = /(:=|<=|>=|==|<>|\.\+|\.\-|\.\*|\.\/|\.\^)/; var isDigit = /[0-9]/; var isNonDigit = /[_a-zA-Z]/; function tokenLineComment(stream, state) { stream.skipToEnd(); state.tokenize = null; return "comment"; } function tokenBlockComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (maybeEnd && ch == "/") { state.tokenize = null; break; } maybeEnd = (ch == "*"); } return "comment"; } function tokenString(stream, state) { var escaped = false, ch; while ((ch = stream.next()) != null) { if (ch == '"' && !escaped) { state.tokenize = null; state.sol = false; break; } escaped = !escaped && ch == "\\"; } return "string"; } function tokenIdent(stream, state) { stream.eatWhile(isDigit); while (stream.eat(isDigit) || stream.eat(isNonDigit)) { } var cur = stream.current(); if(state.sol && (cur == "package" || cur == "model" || cur == "when" || cur == "connector")) state.level++; else if(state.sol && cur == "end" && state.level > 0) state.level--; state.tokenize = null; state.sol = false; if (keywords.propertyIsEnumerable(cur)) return "keyword"; else if (builtin.propertyIsEnumerable(cur)) return "builtin"; else if (atoms.propertyIsEnumerable(cur)) return "atom"; else return "variable"; } function tokenQIdent(stream, state) { while (stream.eat(/[^']/)) { } state.tokenize = null; state.sol = false; if(stream.eat("'")) return "variable"; else return "error"; } function tokenUnsignedNuber(stream, state) { stream.eatWhile(isDigit); if (stream.eat('.')) { stream.eatWhile(isDigit); } if (stream.eat('e') || stream.eat('E')) { if (!stream.eat('-')) stream.eat('+'); stream.eatWhile(isDigit); } state.tokenize = null; state.sol = false; return "number"; } // Interface return { startState: function() { return { tokenize: null, level: 0, sol: true }; }, token: function(stream, state) { if(state.tokenize != null) { return state.tokenize(stream, state); } if(stream.sol()) { state.sol = true; } // WHITESPACE if(stream.eatSpace()) { state.tokenize = null; return null; } var ch = stream.next(); // LINECOMMENT if(ch == '/' && stream.eat('/')) { state.tokenize = tokenLineComment; } // BLOCKCOMMENT else if(ch == '/' && stream.eat('*')) { state.tokenize = tokenBlockComment; } // TWO SYMBOL TOKENS else if(isDoubleOperatorChar.test(ch+stream.peek())) { stream.next(); state.tokenize = null; return "operator"; } // SINGLE SYMBOL TOKENS else if(isSingleOperatorChar.test(ch)) { state.tokenize = null; return "operator"; } // IDENT else if(isNonDigit.test(ch)) { state.tokenize = tokenIdent; } // Q-IDENT else if(ch == "'" && stream.peek() && stream.peek() != "'") { state.tokenize = tokenQIdent; } // STRING else if(ch == '"') { state.tokenize = tokenString; } // UNSIGNED_NUBER else if(isDigit.test(ch)) { state.tokenize = tokenUnsignedNuber; } // ERROR else { state.tokenize = null; return "error"; } return state.tokenize(stream, state); }, indent: function(state, textAfter) { if (state.tokenize != null) return CodeMirror.Pass; var level = state.level; if(/(algorithm)/.test(textAfter)) level--; if(/(equation)/.test(textAfter)) level--; if(/(initial algorithm)/.test(textAfter)) level--; if(/(initial equation)/.test(textAfter)) level--; if(/(end)/.test(textAfter)) level--; if(level > 0) return indentUnit*level; else return 0; }, blockCommentStart: "/*", blockCommentEnd: "*/", lineComment: "//" }; }); function words(str) { var obj = {}, words = str.split(" "); for (var i=0; i CodeMirror: MUMPS mode

MUMPS mode

================================================ FILE: base/res/codemirror/mode/mumps/mumps.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /* This MUMPS Language script was constructed using vbscript.js as a template. */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("mumps", function() { function wordRegexp(words) { return new RegExp("^((" + words.join(")|(") + "))\\b", "i"); } var singleOperators = new RegExp("^[\\+\\-\\*/&#!_?\\\\<>=\\'\\[\\]]"); var doubleOperators = new RegExp("^(('=)|(<=)|(>=)|('>)|('<)|([[)|(]])|(^$))"); var singleDelimiters = new RegExp("^[\\.,:]"); var brackets = new RegExp("[()]"); var identifiers = new RegExp("^[%A-Za-z][A-Za-z0-9]*"); var commandKeywords = ["break","close","do","else","for","goto", "halt", "hang", "if", "job","kill","lock","merge","new","open", "quit", "read", "set", "tcommit", "trollback", "tstart", "use", "view", "write", "xecute", "b","c","d","e","f","g", "h", "i", "j","k","l","m","n","o", "q", "r", "s", "tc", "tro", "ts", "u", "v", "w", "x"]; // The following list includes instrinsic functions _and_ special variables var intrinsicFuncsWords = ["\\$ascii", "\\$char", "\\$data", "\\$ecode", "\\$estack", "\\$etrap", "\\$extract", "\\$find", "\\$fnumber", "\\$get", "\\$horolog", "\\$io", "\\$increment", "\\$job", "\\$justify", "\\$length", "\\$name", "\\$next", "\\$order", "\\$piece", "\\$qlength", "\\$qsubscript", "\\$query", "\\$quit", "\\$random", "\\$reverse", "\\$select", "\\$stack", "\\$test", "\\$text", "\\$translate", "\\$view", "\\$x", "\\$y", "\\$a", "\\$c", "\\$d", "\\$e", "\\$ec", "\\$es", "\\$et", "\\$f", "\\$fn", "\\$g", "\\$h", "\\$i", "\\$j", "\\$l", "\\$n", "\\$na", "\\$o", "\\$p", "\\$q", "\\$ql", "\\$qs", "\\$r", "\\$re", "\\$s", "\\$st", "\\$t", "\\$tr", "\\$v", "\\$z"]; var intrinsicFuncs = wordRegexp(intrinsicFuncsWords); var command = wordRegexp(commandKeywords); function tokenBase(stream, state) { if (stream.sol()) { state.label = true; state.commandMode = 0; } // The character has meaning in MUMPS. Ignoring consecutive // spaces would interfere with interpreting whether the next non-space // character belongs to the command or argument context. // Examine each character and update a mode variable whose interpretation is: // >0 => command 0 => argument <0 => command post-conditional var ch = stream.peek(); if (ch == " " || ch == "\t") { // Pre-process state.label = false; if (state.commandMode == 0) state.commandMode = 1; else if ((state.commandMode < 0) || (state.commandMode == 2)) state.commandMode = 0; } else if ((ch != ".") && (state.commandMode > 0)) { if (ch == ":") state.commandMode = -1; // SIS - Command post-conditional else state.commandMode = 2; } // Do not color parameter list as line tag if ((ch === "(") || (ch === "\u0009")) state.label = false; // MUMPS comment starts with ";" if (ch === ";") { stream.skipToEnd(); return "comment"; } // Number Literals // SIS/RLM - MUMPS permits canonic number followed by concatenate operator if (stream.match(/^[-+]?\d+(\.\d+)?([eE][-+]?\d+)?/)) return "number"; // Handle Strings if (ch == '"') { if (stream.skipTo('"')) { stream.next(); return "string"; } else { stream.skipToEnd(); return "error"; } } // Handle operators and Delimiters if (stream.match(doubleOperators) || stream.match(singleOperators)) return "operator"; // Prevents leading "." in DO block from falling through to error if (stream.match(singleDelimiters)) return null; if (brackets.test(ch)) { stream.next(); return "bracket"; } if (state.commandMode > 0 && stream.match(command)) return "variable-2"; if (stream.match(intrinsicFuncs)) return "builtin"; if (stream.match(identifiers)) return "variable"; // Detect dollar-sign when not a documented intrinsic function // "^" may introduce a GVN or SSVN - Color same as function if (ch === "$" || ch === "^") { stream.next(); return "builtin"; } // MUMPS Indirection if (ch === "@") { stream.next(); return "string-2"; } if (/[\w%]/.test(ch)) { stream.eatWhile(/[\w%]/); return "variable"; } // Handle non-detected items stream.next(); return "error"; } return { startState: function() { return { label: false, commandMode: 0 }; }, token: function(stream, state) { var style = tokenBase(stream, state); if (state.label) return "tag"; return style; } }; }); CodeMirror.defineMIME("text/x-mumps", "mumps"); }); ================================================ FILE: base/res/codemirror/mode/nginx/index.html ================================================ CodeMirror: NGINX mode

NGINX mode

MIME types defined: text/nginx.

================================================ FILE: base/res/codemirror/mode/nginx/nginx.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("nginx", function(config) { function words(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } var keywords = words( /* ngxDirectiveControl */ "break return rewrite set" + /* ngxDirective */ " accept_mutex accept_mutex_delay access_log add_after_body add_before_body add_header addition_types aio alias allow ancient_browser ancient_browser_value auth_basic auth_basic_user_file auth_http auth_http_header auth_http_timeout autoindex autoindex_exact_size autoindex_localtime charset charset_types client_body_buffer_size client_body_in_file_only client_body_in_single_buffer client_body_temp_path client_body_timeout client_header_buffer_size client_header_timeout client_max_body_size connection_pool_size create_full_put_path daemon dav_access dav_methods debug_connection debug_points default_type degradation degrade deny devpoll_changes devpoll_events directio directio_alignment empty_gif env epoll_events error_log eventport_events expires fastcgi_bind fastcgi_buffer_size fastcgi_buffers fastcgi_busy_buffers_size fastcgi_cache fastcgi_cache_key fastcgi_cache_methods fastcgi_cache_min_uses fastcgi_cache_path fastcgi_cache_use_stale fastcgi_cache_valid fastcgi_catch_stderr fastcgi_connect_timeout fastcgi_hide_header fastcgi_ignore_client_abort fastcgi_ignore_headers fastcgi_index fastcgi_intercept_errors fastcgi_max_temp_file_size fastcgi_next_upstream fastcgi_param fastcgi_pass_header fastcgi_pass_request_body fastcgi_pass_request_headers fastcgi_read_timeout fastcgi_send_lowat fastcgi_send_timeout fastcgi_split_path_info fastcgi_store fastcgi_store_access fastcgi_temp_file_write_size fastcgi_temp_path fastcgi_upstream_fail_timeout fastcgi_upstream_max_fails flv geoip_city geoip_country google_perftools_profiles gzip gzip_buffers gzip_comp_level gzip_disable gzip_hash gzip_http_version gzip_min_length gzip_no_buffer gzip_proxied gzip_static gzip_types gzip_vary gzip_window if_modified_since ignore_invalid_headers image_filter image_filter_buffer image_filter_jpeg_quality image_filter_transparency imap_auth imap_capabilities imap_client_buffer index ip_hash keepalive_requests keepalive_timeout kqueue_changes kqueue_events large_client_header_buffers limit_conn limit_conn_log_level limit_rate limit_rate_after limit_req limit_req_log_level limit_req_zone limit_zone lingering_time lingering_timeout lock_file log_format log_not_found log_subrequest map_hash_bucket_size map_hash_max_size master_process memcached_bind memcached_buffer_size memcached_connect_timeout memcached_next_upstream memcached_read_timeout memcached_send_timeout memcached_upstream_fail_timeout memcached_upstream_max_fails merge_slashes min_delete_depth modern_browser modern_browser_value msie_padding msie_refresh multi_accept open_file_cache open_file_cache_errors open_file_cache_events open_file_cache_min_uses open_file_cache_valid open_log_file_cache output_buffers override_charset perl perl_modules perl_require perl_set pid pop3_auth pop3_capabilities port_in_redirect postpone_gzipping postpone_output protocol proxy proxy_bind proxy_buffer proxy_buffer_size proxy_buffering proxy_buffers proxy_busy_buffers_size proxy_cache proxy_cache_key proxy_cache_methods proxy_cache_min_uses proxy_cache_path proxy_cache_use_stale proxy_cache_valid proxy_connect_timeout proxy_headers_hash_bucket_size proxy_headers_hash_max_size proxy_hide_header proxy_ignore_client_abort proxy_ignore_headers proxy_intercept_errors proxy_max_temp_file_size proxy_method proxy_next_upstream proxy_pass_error_message proxy_pass_header proxy_pass_request_body proxy_pass_request_headers proxy_read_timeout proxy_redirect proxy_send_lowat proxy_send_timeout proxy_set_body proxy_set_header proxy_ssl_session_reuse proxy_store proxy_store_access proxy_temp_file_write_size proxy_temp_path proxy_timeout proxy_upstream_fail_timeout proxy_upstream_max_fails random_index read_ahead real_ip_header recursive_error_pages request_pool_size reset_timedout_connection resolver resolver_timeout rewrite_log rtsig_overflow_events rtsig_overflow_test rtsig_overflow_threshold rtsig_signo satisfy secure_link_secret send_lowat send_timeout sendfile sendfile_max_chunk server_name_in_redirect server_names_hash_bucket_size server_names_hash_max_size server_tokens set_real_ip_from smtp_auth smtp_capabilities smtp_client_buffer smtp_greeting_delay so_keepalive source_charset ssi ssi_ignore_recycled_buffers ssi_min_file_chunk ssi_silent_errors ssi_types ssi_value_length ssl ssl_certificate ssl_certificate_key ssl_ciphers ssl_client_certificate ssl_crl ssl_dhparam ssl_engine ssl_prefer_server_ciphers ssl_protocols ssl_session_cache ssl_session_timeout ssl_verify_client ssl_verify_depth starttls stub_status sub_filter sub_filter_once sub_filter_types tcp_nodelay tcp_nopush thread_stack_size timeout timer_resolution types_hash_bucket_size types_hash_max_size underscores_in_headers uninitialized_variable_warn use user userid userid_domain userid_expires userid_mark userid_name userid_p3p userid_path userid_service valid_referers variables_hash_bucket_size variables_hash_max_size worker_connections worker_cpu_affinity worker_priority worker_processes worker_rlimit_core worker_rlimit_nofile worker_rlimit_sigpending worker_threads working_directory xclient xml_entities xslt_stylesheet xslt_typesdrew@li229-23" ); var keywords_block = words( /* ngxDirectiveBlock */ "http mail events server types location upstream charset_map limit_except if geo map" ); var keywords_important = words( /* ngxDirectiveImportant */ "include root server server_name listen internal proxy_pass memcached_pass fastcgi_pass try_files" ); var indentUnit = config.indentUnit, type; function ret(style, tp) {type = tp; return style;} function tokenBase(stream, state) { stream.eatWhile(/[\w\$_]/); var cur = stream.current(); if (keywords.propertyIsEnumerable(cur)) { return "keyword"; } else if (keywords_block.propertyIsEnumerable(cur)) { return "variable-2"; } else if (keywords_important.propertyIsEnumerable(cur)) { return "string-2"; } /**/ var ch = stream.next(); if (ch == "@") {stream.eatWhile(/[\w\\\-]/); return ret("meta", stream.current());} else if (ch == "/" && stream.eat("*")) { state.tokenize = tokenCComment; return tokenCComment(stream, state); } else if (ch == "<" && stream.eat("!")) { state.tokenize = tokenSGMLComment; return tokenSGMLComment(stream, state); } else if (ch == "=") ret(null, "compare"); else if ((ch == "~" || ch == "|") && stream.eat("=")) return ret(null, "compare"); else if (ch == "\"" || ch == "'") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } else if (ch == "#") { stream.skipToEnd(); return ret("comment", "comment"); } else if (ch == "!") { stream.match(/^\s*\w*/); return ret("keyword", "important"); } else if (/\d/.test(ch)) { stream.eatWhile(/[\w.%]/); return ret("number", "unit"); } else if (/[,.+>*\/]/.test(ch)) { return ret(null, "select-op"); } else if (/[;{}:\[\]]/.test(ch)) { return ret(null, ch); } else { stream.eatWhile(/[\w\\\-]/); return ret("variable", "variable"); } } function tokenCComment(stream, state) { var maybeEnd = false, ch; while ((ch = stream.next()) != null) { if (maybeEnd && ch == "/") { state.tokenize = tokenBase; break; } maybeEnd = (ch == "*"); } return ret("comment", "comment"); } function tokenSGMLComment(stream, state) { var dashes = 0, ch; while ((ch = stream.next()) != null) { if (dashes >= 2 && ch == ">") { state.tokenize = tokenBase; break; } dashes = (ch == "-") ? dashes + 1 : 0; } return ret("comment", "comment"); } function tokenString(quote) { return function(stream, state) { var escaped = false, ch; while ((ch = stream.next()) != null) { if (ch == quote && !escaped) break; escaped = !escaped && ch == "\\"; } if (!escaped) state.tokenize = tokenBase; return ret("string", "string"); }; } return { startState: function(base) { return {tokenize: tokenBase, baseIndent: base || 0, stack: []}; }, token: function(stream, state) { if (stream.eatSpace()) return null; type = null; var style = state.tokenize(stream, state); var context = state.stack[state.stack.length-1]; if (type == "hash" && context == "rule") style = "atom"; else if (style == "variable") { if (context == "rule") style = "number"; else if (!context || context == "@media{") style = "tag"; } if (context == "rule" && /^[\{\};]$/.test(type)) state.stack.pop(); if (type == "{") { if (context == "@media") state.stack[state.stack.length-1] = "@media{"; else state.stack.push("{"); } else if (type == "}") state.stack.pop(); else if (type == "@media") state.stack.push("@media"); else if (context == "{" && type != "comment") state.stack.push("rule"); return style; }, indent: function(state, textAfter) { var n = state.stack.length; if (/^\}/.test(textAfter)) n -= state.stack[state.stack.length-1] == "rule" ? 2 : 1; return state.baseIndent + n * indentUnit; }, electricChars: "}" }; }); CodeMirror.defineMIME("text/nginx", "text/x-nginx-conf"); }); ================================================ FILE: base/res/codemirror/mode/ntriples/index.html ================================================ CodeMirror: NTriples mode

NTriples mode

MIME types defined: text/n-triples.

================================================ FILE: base/res/codemirror/mode/ntriples/ntriples.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /********************************************************** * This script provides syntax highlighting support for * the Ntriples format. * Ntriples format specification: * http://www.w3.org/TR/rdf-testcases/#ntriples ***********************************************************/ /* The following expression defines the defined ASF grammar transitions. pre_subject -> { ( writing_subject_uri | writing_bnode_uri ) -> pre_predicate -> writing_predicate_uri -> pre_object -> writing_object_uri | writing_object_bnode | ( writing_object_literal -> writing_literal_lang | writing_literal_type ) -> post_object -> BEGIN } otherwise { -> ERROR } */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("ntriples", function() { var Location = { PRE_SUBJECT : 0, WRITING_SUB_URI : 1, WRITING_BNODE_URI : 2, PRE_PRED : 3, WRITING_PRED_URI : 4, PRE_OBJ : 5, WRITING_OBJ_URI : 6, WRITING_OBJ_BNODE : 7, WRITING_OBJ_LITERAL : 8, WRITING_LIT_LANG : 9, WRITING_LIT_TYPE : 10, POST_OBJ : 11, ERROR : 12 }; function transitState(currState, c) { var currLocation = currState.location; var ret; // Opening. if (currLocation == Location.PRE_SUBJECT && c == '<') ret = Location.WRITING_SUB_URI; else if(currLocation == Location.PRE_SUBJECT && c == '_') ret = Location.WRITING_BNODE_URI; else if(currLocation == Location.PRE_PRED && c == '<') ret = Location.WRITING_PRED_URI; else if(currLocation == Location.PRE_OBJ && c == '<') ret = Location.WRITING_OBJ_URI; else if(currLocation == Location.PRE_OBJ && c == '_') ret = Location.WRITING_OBJ_BNODE; else if(currLocation == Location.PRE_OBJ && c == '"') ret = Location.WRITING_OBJ_LITERAL; // Closing. else if(currLocation == Location.WRITING_SUB_URI && c == '>') ret = Location.PRE_PRED; else if(currLocation == Location.WRITING_BNODE_URI && c == ' ') ret = Location.PRE_PRED; else if(currLocation == Location.WRITING_PRED_URI && c == '>') ret = Location.PRE_OBJ; else if(currLocation == Location.WRITING_OBJ_URI && c == '>') ret = Location.POST_OBJ; else if(currLocation == Location.WRITING_OBJ_BNODE && c == ' ') ret = Location.POST_OBJ; else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '"') ret = Location.POST_OBJ; else if(currLocation == Location.WRITING_LIT_LANG && c == ' ') ret = Location.POST_OBJ; else if(currLocation == Location.WRITING_LIT_TYPE && c == '>') ret = Location.POST_OBJ; // Closing typed and language literal. else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '@') ret = Location.WRITING_LIT_LANG; else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '^') ret = Location.WRITING_LIT_TYPE; // Spaces. else if( c == ' ' && ( currLocation == Location.PRE_SUBJECT || currLocation == Location.PRE_PRED || currLocation == Location.PRE_OBJ || currLocation == Location.POST_OBJ ) ) ret = currLocation; // Reset. else if(currLocation == Location.POST_OBJ && c == '.') ret = Location.PRE_SUBJECT; // Error else ret = Location.ERROR; currState.location=ret; } return { startState: function() { return { location : Location.PRE_SUBJECT, uris : [], anchors : [], bnodes : [], langs : [], types : [] }; }, token: function(stream, state) { var ch = stream.next(); if(ch == '<') { transitState(state, ch); var parsedURI = ''; stream.eatWhile( function(c) { if( c != '#' && c != '>' ) { parsedURI += c; return true; } return false;} ); state.uris.push(parsedURI); if( stream.match('#', false) ) return 'variable'; stream.next(); transitState(state, '>'); return 'variable'; } if(ch == '#') { var parsedAnchor = ''; stream.eatWhile(function(c) { if(c != '>' && c != ' ') { parsedAnchor+= c; return true; } return false;}); state.anchors.push(parsedAnchor); return 'variable-2'; } if(ch == '>') { transitState(state, '>'); return 'variable'; } if(ch == '_') { transitState(state, ch); var parsedBNode = ''; stream.eatWhile(function(c) { if( c != ' ' ) { parsedBNode += c; return true; } return false;}); state.bnodes.push(parsedBNode); stream.next(); transitState(state, ' '); return 'builtin'; } if(ch == '"') { transitState(state, ch); stream.eatWhile( function(c) { return c != '"'; } ); stream.next(); if( stream.peek() != '@' && stream.peek() != '^' ) { transitState(state, '"'); } return 'string'; } if( ch == '@' ) { transitState(state, '@'); var parsedLang = ''; stream.eatWhile(function(c) { if( c != ' ' ) { parsedLang += c; return true; } return false;}); state.langs.push(parsedLang); stream.next(); transitState(state, ' '); return 'string-2'; } if( ch == '^' ) { stream.next(); transitState(state, '^'); var parsedType = ''; stream.eatWhile(function(c) { if( c != '>' ) { parsedType += c; return true; } return false;} ); state.types.push(parsedType); stream.next(); transitState(state, '>'); return 'variable'; } if( ch == ' ' ) { transitState(state, ch); } if( ch == '.' ) { transitState(state, ch); } } }; }); CodeMirror.defineMIME("text/n-triples", "ntriples"); }); ================================================ FILE: base/res/codemirror/mode/octave/index.html ================================================ CodeMirror: Octave mode

Octave mode

MIME types defined: text/x-octave.

================================================ FILE: base/res/codemirror/mode/octave/octave.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("octave", function() { function wordRegexp(words) { return new RegExp("^((" + words.join(")|(") + "))\\b"); } var singleOperators = new RegExp("^[\\+\\-\\*/&|\\^~<>!@'\\\\]"); var singleDelimiters = new RegExp('^[\\(\\[\\{\\},:=;]'); var doubleOperators = new RegExp("^((==)|(~=)|(<=)|(>=)|(<<)|(>>)|(\\.[\\+\\-\\*/\\^\\\\]))"); var doubleDelimiters = new RegExp("^((!=)|(\\+=)|(\\-=)|(\\*=)|(/=)|(&=)|(\\|=)|(\\^=))"); var tripleDelimiters = new RegExp("^((>>=)|(<<=))"); var expressionEnd = new RegExp("^[\\]\\)]"); var identifiers = new RegExp("^[_A-Za-z\xa1-\uffff][_A-Za-z0-9\xa1-\uffff]*"); var builtins = wordRegexp([ 'error', 'eval', 'function', 'abs', 'acos', 'atan', 'asin', 'cos', 'cosh', 'exp', 'log', 'prod', 'sum', 'log10', 'max', 'min', 'sign', 'sin', 'sinh', 'sqrt', 'tan', 'reshape', 'break', 'zeros', 'default', 'margin', 'round', 'ones', 'rand', 'syn', 'ceil', 'floor', 'size', 'clear', 'zeros', 'eye', 'mean', 'std', 'cov', 'det', 'eig', 'inv', 'norm', 'rank', 'trace', 'expm', 'logm', 'sqrtm', 'linspace', 'plot', 'title', 'xlabel', 'ylabel', 'legend', 'text', 'grid', 'meshgrid', 'mesh', 'num2str', 'fft', 'ifft', 'arrayfun', 'cellfun', 'input', 'fliplr', 'flipud', 'ismember' ]); var keywords = wordRegexp([ 'return', 'case', 'switch', 'else', 'elseif', 'end', 'endif', 'endfunction', 'if', 'otherwise', 'do', 'for', 'while', 'try', 'catch', 'classdef', 'properties', 'events', 'methods', 'global', 'persistent', 'endfor', 'endwhile', 'printf', 'sprintf', 'disp', 'until', 'continue', 'pkg' ]); // tokenizers function tokenTranspose(stream, state) { if (!stream.sol() && stream.peek() === '\'') { stream.next(); state.tokenize = tokenBase; return 'operator'; } state.tokenize = tokenBase; return tokenBase(stream, state); } function tokenComment(stream, state) { if (stream.match(/^.*%}/)) { state.tokenize = tokenBase; return 'comment'; }; stream.skipToEnd(); return 'comment'; } function tokenBase(stream, state) { // whitespaces if (stream.eatSpace()) return null; // Handle one line Comments if (stream.match('%{')){ state.tokenize = tokenComment; stream.skipToEnd(); return 'comment'; } if (stream.match(/^[%#]/)){ stream.skipToEnd(); return 'comment'; } // Handle Number Literals if (stream.match(/^[0-9\.+-]/, false)) { if (stream.match(/^[+-]?0x[0-9a-fA-F]+[ij]?/)) { stream.tokenize = tokenBase; return 'number'; }; if (stream.match(/^[+-]?\d*\.\d+([EeDd][+-]?\d+)?[ij]?/)) { return 'number'; }; if (stream.match(/^[+-]?\d+([EeDd][+-]?\d+)?[ij]?/)) { return 'number'; }; } if (stream.match(wordRegexp(['nan','NaN','inf','Inf']))) { return 'number'; }; // Handle Strings if (stream.match(/^"([^"]|(""))*"/)) { return 'string'; } ; if (stream.match(/^'([^']|(''))*'/)) { return 'string'; } ; // Handle words if (stream.match(keywords)) { return 'keyword'; } ; if (stream.match(builtins)) { return 'builtin'; } ; if (stream.match(identifiers)) { return 'variable'; } ; if (stream.match(singleOperators) || stream.match(doubleOperators)) { return 'operator'; }; if (stream.match(singleDelimiters) || stream.match(doubleDelimiters) || stream.match(tripleDelimiters)) { return null; }; if (stream.match(expressionEnd)) { state.tokenize = tokenTranspose; return null; }; // Handle non-detected items stream.next(); return 'error'; }; return { startState: function() { return { tokenize: tokenBase }; }, token: function(stream, state) { var style = state.tokenize(stream, state); if (style === 'number' || style === 'variable'){ state.tokenize = tokenTranspose; } return style; } }; }); CodeMirror.defineMIME("text/x-octave", "octave"); }); ================================================ FILE: base/res/codemirror/mode/pascal/index.html ================================================ CodeMirror: Pascal mode

Pascal mode

MIME types defined: text/x-pascal.

================================================ FILE: base/res/codemirror/mode/pascal/pascal.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("pascal", function() { function words(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } var keywords = words("and array begin case const div do downto else end file for forward integer " + "boolean char function goto if in label mod nil not of or packed procedure " + "program record repeat set string then to type until var while with"); var atoms = {"null": true}; var isOperatorChar = /[+\-*&%=<>!?|\/]/; function tokenBase(stream, state) { var ch = stream.next(); if (ch == "#" && state.startOfLine) { stream.skipToEnd(); return "meta"; } if (ch == '"' || ch == "'") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } if (ch == "(" && stream.eat("*")) { state.tokenize = tokenComment; return tokenComment(stream, state); } if (/[\[\]{}\(\),;\:\.]/.test(ch)) { return null; } if (/\d/.test(ch)) { stream.eatWhile(/[\w\.]/); return "number"; } if (ch == "/") { if (stream.eat("/")) { stream.skipToEnd(); return "comment"; } } if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return "operator"; } stream.eatWhile(/[\w\$_]/); var cur = stream.current(); if (keywords.propertyIsEnumerable(cur)) return "keyword"; if (atoms.propertyIsEnumerable(cur)) return "atom"; return "variable"; } function tokenString(quote) { return function(stream, state) { var escaped = false, next, end = false; while ((next = stream.next()) != null) { if (next == quote && !escaped) {end = true; break;} escaped = !escaped && next == "\\"; } if (end || !escaped) state.tokenize = null; return "string"; }; } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == ")" && maybeEnd) { state.tokenize = null; break; } maybeEnd = (ch == "*"); } return "comment"; } // Interface return { startState: function() { return {tokenize: null}; }, token: function(stream, state) { if (stream.eatSpace()) return null; var style = (state.tokenize || tokenBase)(stream, state); if (style == "comment" || style == "meta") return style; return style; }, electricChars: "{}" }; }); CodeMirror.defineMIME("text/x-pascal", "pascal"); }); ================================================ FILE: base/res/codemirror/mode/pegjs/index.html ================================================ CodeMirror: PEG.js Mode

PEG.js Mode

The PEG.js Mode

Created by Forbes Lindesay.

================================================ FILE: base/res/codemirror/mode/pegjs/pegjs.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../javascript/javascript")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../javascript/javascript"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("pegjs", function (config) { var jsMode = CodeMirror.getMode(config, "javascript"); function identifier(stream) { return stream.match(/^[a-zA-Z_][a-zA-Z0-9_]*/); } return { startState: function () { return { inString: false, stringType: null, inComment: false, inChracterClass: false, braced: 0, lhs: true, localState: null }; }, token: function (stream, state) { if (stream) //check for state changes if (!state.inString && !state.inComment && ((stream.peek() == '"') || (stream.peek() == "'"))) { state.stringType = stream.peek(); stream.next(); // Skip quote state.inString = true; // Update state } if (!state.inString && !state.inComment && stream.match(/^\/\*/)) { state.inComment = true; } //return state if (state.inString) { while (state.inString && !stream.eol()) { if (stream.peek() === state.stringType) { stream.next(); // Skip quote state.inString = false; // Clear flag } else if (stream.peek() === '\\') { stream.next(); stream.next(); } else { stream.match(/^.[^\\\"\']*/); } } return state.lhs ? "property string" : "string"; // Token style } else if (state.inComment) { while (state.inComment && !stream.eol()) { if (stream.match(/\*\//)) { state.inComment = false; // Clear flag } else { stream.match(/^.[^\*]*/); } } return "comment"; } else if (state.inChracterClass) { while (state.inChracterClass && !stream.eol()) { if (!(stream.match(/^[^\]\\]+/) || stream.match(/^\\./))) { state.inChracterClass = false; } } } else if (stream.peek() === '[') { stream.next(); state.inChracterClass = true; return 'bracket'; } else if (stream.match(/^\/\//)) { stream.skipToEnd(); return "comment"; } else if (state.braced || stream.peek() === '{') { if (state.localState === null) { state.localState = jsMode.startState(); } var token = jsMode.token(stream, state.localState); var text = stream.current(); if (!token) { for (var i = 0; i < text.length; i++) { if (text[i] === '{') { state.braced++; } else if (text[i] === '}') { state.braced--; } }; } return token; } else if (identifier(stream)) { if (stream.peek() === ':') { return 'variable'; } return 'variable-2'; } else if (['[', ']', '(', ')'].indexOf(stream.peek()) != -1) { stream.next(); return 'bracket'; } else if (!stream.eatSpace()) { stream.next(); } return null; } }; }, "javascript"); }); ================================================ FILE: base/res/codemirror/mode/perl/index.html ================================================ CodeMirror: Perl mode

Perl mode

MIME types defined: text/x-perl.

================================================ FILE: base/res/codemirror/mode/perl/perl.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // CodeMirror2 mode/perl/perl.js (text/x-perl) beta 0.10 (2011-11-08) // This is a part of CodeMirror from https://github.com/sabaca/CodeMirror_mode_perl (mail@sabaca.com) (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("perl",function(){ // http://perldoc.perl.org var PERL={ // null - magic touch // 1 - keyword // 2 - def // 3 - atom // 4 - operator // 5 - variable-2 (predefined) // [x,y] - x=1,2,3; y=must be defined if x{...} // PERL operators '->' : 4, '++' : 4, '--' : 4, '**' : 4, // ! ~ \ and unary + and - '=~' : 4, '!~' : 4, '*' : 4, '/' : 4, '%' : 4, 'x' : 4, '+' : 4, '-' : 4, '.' : 4, '<<' : 4, '>>' : 4, // named unary operators '<' : 4, '>' : 4, '<=' : 4, '>=' : 4, 'lt' : 4, 'gt' : 4, 'le' : 4, 'ge' : 4, '==' : 4, '!=' : 4, '<=>' : 4, 'eq' : 4, 'ne' : 4, 'cmp' : 4, '~~' : 4, '&' : 4, '|' : 4, '^' : 4, '&&' : 4, '||' : 4, '//' : 4, '..' : 4, '...' : 4, '?' : 4, ':' : 4, '=' : 4, '+=' : 4, '-=' : 4, '*=' : 4, // etc. ??? ',' : 4, '=>' : 4, '::' : 4, // list operators (rightward) 'not' : 4, 'and' : 4, 'or' : 4, 'xor' : 4, // PERL predefined variables (I know, what this is a paranoid idea, but may be needed for people, who learn PERL, and for me as well, ...and may be for you?;) 'BEGIN' : [5,1], 'END' : [5,1], 'PRINT' : [5,1], 'PRINTF' : [5,1], 'GETC' : [5,1], 'READ' : [5,1], 'READLINE' : [5,1], 'DESTROY' : [5,1], 'TIE' : [5,1], 'TIEHANDLE' : [5,1], 'UNTIE' : [5,1], 'STDIN' : 5, 'STDIN_TOP' : 5, 'STDOUT' : 5, 'STDOUT_TOP' : 5, 'STDERR' : 5, 'STDERR_TOP' : 5, '$ARG' : 5, '$_' : 5, '@ARG' : 5, '@_' : 5, '$LIST_SEPARATOR' : 5, '$"' : 5, '$PROCESS_ID' : 5, '$PID' : 5, '$$' : 5, '$REAL_GROUP_ID' : 5, '$GID' : 5, '$(' : 5, '$EFFECTIVE_GROUP_ID' : 5, '$EGID' : 5, '$)' : 5, '$PROGRAM_NAME' : 5, '$0' : 5, '$SUBSCRIPT_SEPARATOR' : 5, '$SUBSEP' : 5, '$;' : 5, '$REAL_USER_ID' : 5, '$UID' : 5, '$<' : 5, '$EFFECTIVE_USER_ID' : 5, '$EUID' : 5, '$>' : 5, '$a' : 5, '$b' : 5, '$COMPILING' : 5, '$^C' : 5, '$DEBUGGING' : 5, '$^D' : 5, '${^ENCODING}' : 5, '$ENV' : 5, '%ENV' : 5, '$SYSTEM_FD_MAX' : 5, '$^F' : 5, '@F' : 5, '${^GLOBAL_PHASE}' : 5, '$^H' : 5, '%^H' : 5, '@INC' : 5, '%INC' : 5, '$INPLACE_EDIT' : 5, '$^I' : 5, '$^M' : 5, '$OSNAME' : 5, '$^O' : 5, '${^OPEN}' : 5, '$PERLDB' : 5, '$^P' : 5, '$SIG' : 5, '%SIG' : 5, '$BASETIME' : 5, '$^T' : 5, '${^TAINT}' : 5, '${^UNICODE}' : 5, '${^UTF8CACHE}' : 5, '${^UTF8LOCALE}' : 5, '$PERL_VERSION' : 5, '$^V' : 5, '${^WIN32_SLOPPY_STAT}' : 5, '$EXECUTABLE_NAME' : 5, '$^X' : 5, '$1' : 5, // - regexp $1, $2... '$MATCH' : 5, '$&' : 5, '${^MATCH}' : 5, '$PREMATCH' : 5, '$`' : 5, '${^PREMATCH}' : 5, '$POSTMATCH' : 5, "$'" : 5, '${^POSTMATCH}' : 5, '$LAST_PAREN_MATCH' : 5, '$+' : 5, '$LAST_SUBMATCH_RESULT' : 5, '$^N' : 5, '@LAST_MATCH_END' : 5, '@+' : 5, '%LAST_PAREN_MATCH' : 5, '%+' : 5, '@LAST_MATCH_START' : 5, '@-' : 5, '%LAST_MATCH_START' : 5, '%-' : 5, '$LAST_REGEXP_CODE_RESULT' : 5, '$^R' : 5, '${^RE_DEBUG_FLAGS}' : 5, '${^RE_TRIE_MAXBUF}' : 5, '$ARGV' : 5, '@ARGV' : 5, 'ARGV' : 5, 'ARGVOUT' : 5, '$OUTPUT_FIELD_SEPARATOR' : 5, '$OFS' : 5, '$,' : 5, '$INPUT_LINE_NUMBER' : 5, '$NR' : 5, '$.' : 5, '$INPUT_RECORD_SEPARATOR' : 5, '$RS' : 5, '$/' : 5, '$OUTPUT_RECORD_SEPARATOR' : 5, '$ORS' : 5, '$\\' : 5, '$OUTPUT_AUTOFLUSH' : 5, '$|' : 5, '$ACCUMULATOR' : 5, '$^A' : 5, '$FORMAT_FORMFEED' : 5, '$^L' : 5, '$FORMAT_PAGE_NUMBER' : 5, '$%' : 5, '$FORMAT_LINES_LEFT' : 5, '$-' : 5, '$FORMAT_LINE_BREAK_CHARACTERS' : 5, '$:' : 5, '$FORMAT_LINES_PER_PAGE' : 5, '$=' : 5, '$FORMAT_TOP_NAME' : 5, '$^' : 5, '$FORMAT_NAME' : 5, '$~' : 5, '${^CHILD_ERROR_NATIVE}' : 5, '$EXTENDED_OS_ERROR' : 5, '$^E' : 5, '$EXCEPTIONS_BEING_CAUGHT' : 5, '$^S' : 5, '$WARNING' : 5, '$^W' : 5, '${^WARNING_BITS}' : 5, '$OS_ERROR' : 5, '$ERRNO' : 5, '$!' : 5, '%OS_ERROR' : 5, '%ERRNO' : 5, '%!' : 5, '$CHILD_ERROR' : 5, '$?' : 5, '$EVAL_ERROR' : 5, '$@' : 5, '$OFMT' : 5, '$#' : 5, '$*' : 5, '$ARRAY_BASE' : 5, '$[' : 5, '$OLD_PERL_VERSION' : 5, '$]' : 5, // PERL blocks 'if' :[1,1], elsif :[1,1], 'else' :[1,1], 'while' :[1,1], unless :[1,1], 'for' :[1,1], foreach :[1,1], // PERL functions 'abs' :1, // - absolute value function accept :1, // - accept an incoming socket connect alarm :1, // - schedule a SIGALRM 'atan2' :1, // - arctangent of Y/X in the range -PI to PI bind :1, // - binds an address to a socket binmode :1, // - prepare binary files for I/O bless :1, // - create an object bootstrap :1, // 'break' :1, // - break out of a "given" block caller :1, // - get context of the current subroutine call chdir :1, // - change your current working directory chmod :1, // - changes the permissions on a list of files chomp :1, // - remove a trailing record separator from a string chop :1, // - remove the last character from a string chown :1, // - change the owership on a list of files chr :1, // - get character this number represents chroot :1, // - make directory new root for path lookups close :1, // - close file (or pipe or socket) handle closedir :1, // - close directory handle connect :1, // - connect to a remote socket 'continue' :[1,1], // - optional trailing block in a while or foreach 'cos' :1, // - cosine function crypt :1, // - one-way passwd-style encryption dbmclose :1, // - breaks binding on a tied dbm file dbmopen :1, // - create binding on a tied dbm file 'default' :1, // defined :1, // - test whether a value, variable, or function is defined 'delete' :1, // - deletes a value from a hash die :1, // - raise an exception or bail out 'do' :1, // - turn a BLOCK into a TERM dump :1, // - create an immediate core dump each :1, // - retrieve the next key/value pair from a hash endgrent :1, // - be done using group file endhostent :1, // - be done using hosts file endnetent :1, // - be done using networks file endprotoent :1, // - be done using protocols file endpwent :1, // - be done using passwd file endservent :1, // - be done using services file eof :1, // - test a filehandle for its end 'eval' :1, // - catch exceptions or compile and run code 'exec' :1, // - abandon this program to run another exists :1, // - test whether a hash key is present exit :1, // - terminate this program 'exp' :1, // - raise I to a power fcntl :1, // - file control system call fileno :1, // - return file descriptor from filehandle flock :1, // - lock an entire file with an advisory lock fork :1, // - create a new process just like this one format :1, // - declare a picture format with use by the write() function formline :1, // - internal function used for formats getc :1, // - get the next character from the filehandle getgrent :1, // - get next group record getgrgid :1, // - get group record given group user ID getgrnam :1, // - get group record given group name gethostbyaddr :1, // - get host record given its address gethostbyname :1, // - get host record given name gethostent :1, // - get next hosts record getlogin :1, // - return who logged in at this tty getnetbyaddr :1, // - get network record given its address getnetbyname :1, // - get networks record given name getnetent :1, // - get next networks record getpeername :1, // - find the other end of a socket connection getpgrp :1, // - get process group getppid :1, // - get parent process ID getpriority :1, // - get current nice value getprotobyname :1, // - get protocol record given name getprotobynumber :1, // - get protocol record numeric protocol getprotoent :1, // - get next protocols record getpwent :1, // - get next passwd record getpwnam :1, // - get passwd record given user login name getpwuid :1, // - get passwd record given user ID getservbyname :1, // - get services record given its name getservbyport :1, // - get services record given numeric port getservent :1, // - get next services record getsockname :1, // - retrieve the sockaddr for a given socket getsockopt :1, // - get socket options on a given socket given :1, // glob :1, // - expand filenames using wildcards gmtime :1, // - convert UNIX time into record or string using Greenwich time 'goto' :1, // - create spaghetti code grep :1, // - locate elements in a list test true against a given criterion hex :1, // - convert a string to a hexadecimal number 'import' :1, // - patch a module's namespace into your own index :1, // - find a substring within a string 'int' :1, // - get the integer portion of a number ioctl :1, // - system-dependent device control system call 'join' :1, // - join a list into a string using a separator keys :1, // - retrieve list of indices from a hash kill :1, // - send a signal to a process or process group last :1, // - exit a block prematurely lc :1, // - return lower-case version of a string lcfirst :1, // - return a string with just the next letter in lower case length :1, // - return the number of bytes in a string 'link' :1, // - create a hard link in the filesytem listen :1, // - register your socket as a server local : 2, // - create a temporary value for a global variable (dynamic scoping) localtime :1, // - convert UNIX time into record or string using local time lock :1, // - get a thread lock on a variable, subroutine, or method 'log' :1, // - retrieve the natural logarithm for a number lstat :1, // - stat a symbolic link m :null, // - match a string with a regular expression pattern map :1, // - apply a change to a list to get back a new list with the changes mkdir :1, // - create a directory msgctl :1, // - SysV IPC message control operations msgget :1, // - get SysV IPC message queue msgrcv :1, // - receive a SysV IPC message from a message queue msgsnd :1, // - send a SysV IPC message to a message queue my : 2, // - declare and assign a local variable (lexical scoping) 'new' :1, // next :1, // - iterate a block prematurely no :1, // - unimport some module symbols or semantics at compile time oct :1, // - convert a string to an octal number open :1, // - open a file, pipe, or descriptor opendir :1, // - open a directory ord :1, // - find a character's numeric representation our : 2, // - declare and assign a package variable (lexical scoping) pack :1, // - convert a list into a binary representation 'package' :1, // - declare a separate global namespace pipe :1, // - open a pair of connected filehandles pop :1, // - remove the last element from an array and return it pos :1, // - find or set the offset for the last/next m//g search print :1, // - output a list to a filehandle printf :1, // - output a formatted list to a filehandle prototype :1, // - get the prototype (if any) of a subroutine push :1, // - append one or more elements to an array q :null, // - singly quote a string qq :null, // - doubly quote a string qr :null, // - Compile pattern quotemeta :null, // - quote regular expression magic characters qw :null, // - quote a list of words qx :null, // - backquote quote a string rand :1, // - retrieve the next pseudorandom number read :1, // - fixed-length buffered input from a filehandle readdir :1, // - get a directory from a directory handle readline :1, // - fetch a record from a file readlink :1, // - determine where a symbolic link is pointing readpipe :1, // - execute a system command and collect standard output recv :1, // - receive a message over a Socket redo :1, // - start this loop iteration over again ref :1, // - find out the type of thing being referenced rename :1, // - change a filename require :1, // - load in external functions from a library at runtime reset :1, // - clear all variables of a given name 'return' :1, // - get out of a function early reverse :1, // - flip a string or a list rewinddir :1, // - reset directory handle rindex :1, // - right-to-left substring search rmdir :1, // - remove a directory s :null, // - replace a pattern with a string say :1, // - print with newline scalar :1, // - force a scalar context seek :1, // - reposition file pointer for random-access I/O seekdir :1, // - reposition directory pointer select :1, // - reset default output or do I/O multiplexing semctl :1, // - SysV semaphore control operations semget :1, // - get set of SysV semaphores semop :1, // - SysV semaphore operations send :1, // - send a message over a socket setgrent :1, // - prepare group file for use sethostent :1, // - prepare hosts file for use setnetent :1, // - prepare networks file for use setpgrp :1, // - set the process group of a process setpriority :1, // - set a process's nice value setprotoent :1, // - prepare protocols file for use setpwent :1, // - prepare passwd file for use setservent :1, // - prepare services file for use setsockopt :1, // - set some socket options shift :1, // - remove the first element of an array, and return it shmctl :1, // - SysV shared memory operations shmget :1, // - get SysV shared memory segment identifier shmread :1, // - read SysV shared memory shmwrite :1, // - write SysV shared memory shutdown :1, // - close down just half of a socket connection 'sin' :1, // - return the sine of a number sleep :1, // - block for some number of seconds socket :1, // - create a socket socketpair :1, // - create a pair of sockets 'sort' :1, // - sort a list of values splice :1, // - add or remove elements anywhere in an array 'split' :1, // - split up a string using a regexp delimiter sprintf :1, // - formatted print into a string 'sqrt' :1, // - square root function srand :1, // - seed the random number generator stat :1, // - get a file's status information state :1, // - declare and assign a state variable (persistent lexical scoping) study :1, // - optimize input data for repeated searches 'sub' :1, // - declare a subroutine, possibly anonymously 'substr' :1, // - get or alter a portion of a stirng symlink :1, // - create a symbolic link to a file syscall :1, // - execute an arbitrary system call sysopen :1, // - open a file, pipe, or descriptor sysread :1, // - fixed-length unbuffered input from a filehandle sysseek :1, // - position I/O pointer on handle used with sysread and syswrite system :1, // - run a separate program syswrite :1, // - fixed-length unbuffered output to a filehandle tell :1, // - get current seekpointer on a filehandle telldir :1, // - get current seekpointer on a directory handle tie :1, // - bind a variable to an object class tied :1, // - get a reference to the object underlying a tied variable time :1, // - return number of seconds since 1970 times :1, // - return elapsed time for self and child processes tr :null, // - transliterate a string truncate :1, // - shorten a file uc :1, // - return upper-case version of a string ucfirst :1, // - return a string with just the next letter in upper case umask :1, // - set file creation mode mask undef :1, // - remove a variable or function definition unlink :1, // - remove one link to a file unpack :1, // - convert binary structure into normal perl variables unshift :1, // - prepend more elements to the beginning of a list untie :1, // - break a tie binding to a variable use :1, // - load in a module at compile time utime :1, // - set a file's last access and modify times values :1, // - return a list of the values in a hash vec :1, // - test or set particular bits in a string wait :1, // - wait for any child process to die waitpid :1, // - wait for a particular child process to die wantarray :1, // - get void vs scalar vs list context of current subroutine call warn :1, // - print debugging info when :1, // write :1, // - print a picture record y :null}; // - transliterate a string var RXstyle="string-2"; var RXmodifiers=/[goseximacplud]/; // NOTE: "m", "s", "y" and "tr" need to correct real modifiers for each regexp type function tokenChain(stream,state,chain,style,tail){ // NOTE: chain.length > 2 is not working now (it's for s[...][...]geos;) state.chain=null; // 12 3tail state.style=null; state.tail=null; state.tokenize=function(stream,state){ var e=false,c,i=0; while(c=stream.next()){ if(c===chain[i]&&!e){ if(chain[++i]!==undefined){ state.chain=chain[i]; state.style=style; state.tail=tail;} else if(tail) stream.eatWhile(tail); state.tokenize=tokenPerl; return style;} e=!e&&c=="\\";} return style;}; return state.tokenize(stream,state);} function tokenSOMETHING(stream,state,string){ state.tokenize=function(stream,state){ if(stream.string==string) state.tokenize=tokenPerl; stream.skipToEnd(); return "string";}; return state.tokenize(stream,state);} function tokenPerl(stream,state){ if(stream.eatSpace()) return null; if(state.chain) return tokenChain(stream,state,state.chain,state.style,state.tail); if(stream.match(/^\-?[\d\.]/,false)) if(stream.match(/^(\-?(\d*\.\d+(e[+-]?\d+)?|\d+\.\d*)|0x[\da-fA-F]+|0b[01]+|\d+(e[+-]?\d+)?)/)) return 'number'; if(stream.match(/^<<(?=\w)/)){ // NOTE: <"],RXstyle,RXmodifiers);} if(/[\^'"!~\/]/.test(c)){ eatSuffix(stream, 1); return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers);}} else if(c=="q"){ c=look(stream, 1); if(c=="("){ eatSuffix(stream, 2); return tokenChain(stream,state,[")"],"string");} if(c=="["){ eatSuffix(stream, 2); return tokenChain(stream,state,["]"],"string");} if(c=="{"){ eatSuffix(stream, 2); return tokenChain(stream,state,["}"],"string");} if(c=="<"){ eatSuffix(stream, 2); return tokenChain(stream,state,[">"],"string");} if(/[\^'"!~\/]/.test(c)){ eatSuffix(stream, 1); return tokenChain(stream,state,[stream.eat(c)],"string");}} else if(c=="w"){ c=look(stream, 1); if(c=="("){ eatSuffix(stream, 2); return tokenChain(stream,state,[")"],"bracket");} if(c=="["){ eatSuffix(stream, 2); return tokenChain(stream,state,["]"],"bracket");} if(c=="{"){ eatSuffix(stream, 2); return tokenChain(stream,state,["}"],"bracket");} if(c=="<"){ eatSuffix(stream, 2); return tokenChain(stream,state,[">"],"bracket");} if(/[\^'"!~\/]/.test(c)){ eatSuffix(stream, 1); return tokenChain(stream,state,[stream.eat(c)],"bracket");}} else if(c=="r"){ c=look(stream, 1); if(c=="("){ eatSuffix(stream, 2); return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);} if(c=="["){ eatSuffix(stream, 2); return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);} if(c=="{"){ eatSuffix(stream, 2); return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);} if(c=="<"){ eatSuffix(stream, 2); return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);} if(/[\^'"!~\/]/.test(c)){ eatSuffix(stream, 1); return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers);}} else if(/[\^'"!~\/(\[{<]/.test(c)){ if(c=="("){ eatSuffix(stream, 1); return tokenChain(stream,state,[")"],"string");} if(c=="["){ eatSuffix(stream, 1); return tokenChain(stream,state,["]"],"string");} if(c=="{"){ eatSuffix(stream, 1); return tokenChain(stream,state,["}"],"string");} if(c=="<"){ eatSuffix(stream, 1); return tokenChain(stream,state,[">"],"string");} if(/[\^'"!~\/]/.test(c)){ return tokenChain(stream,state,[stream.eat(c)],"string");}}}} if(ch=="m"){ var c=look(stream, -2); if(!(c&&/\w/.test(c))){ c=stream.eat(/[(\[{<\^'"!~\/]/); if(c){ if(/[\^'"!~\/]/.test(c)){ return tokenChain(stream,state,[c],RXstyle,RXmodifiers);} if(c=="("){ return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);} if(c=="["){ return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);} if(c=="{"){ return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);} if(c=="<"){ return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);}}}} if(ch=="s"){ var c=/[\/>\]})\w]/.test(look(stream, -2)); if(!c){ c=stream.eat(/[(\[{<\^'"!~\/]/); if(c){ if(c=="[") return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers); if(c=="{") return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers); if(c=="<") return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers); if(c=="(") return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers); return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}} if(ch=="y"){ var c=/[\/>\]})\w]/.test(look(stream, -2)); if(!c){ c=stream.eat(/[(\[{<\^'"!~\/]/); if(c){ if(c=="[") return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers); if(c=="{") return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers); if(c=="<") return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers); if(c=="(") return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers); return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}} if(ch=="t"){ var c=/[\/>\]})\w]/.test(look(stream, -2)); if(!c){ c=stream.eat("r");if(c){ c=stream.eat(/[(\[{<\^'"!~\/]/); if(c){ if(c=="[") return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers); if(c=="{") return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers); if(c=="<") return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers); if(c=="(") return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers); return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}}} if(ch=="`"){ return tokenChain(stream,state,[ch],"variable-2");} if(ch=="/"){ if(!/~\s*$/.test(prefix(stream))) return "operator"; else return tokenChain(stream,state,[ch],RXstyle,RXmodifiers);} if(ch=="$"){ var p=stream.pos; if(stream.eatWhile(/\d/)||stream.eat("{")&&stream.eatWhile(/\d/)&&stream.eat("}")) return "variable-2"; else stream.pos=p;} if(/[$@%]/.test(ch)){ var p=stream.pos; if(stream.eat("^")&&stream.eat(/[A-Z]/)||!/[@$%&]/.test(look(stream, -2))&&stream.eat(/[=|\\\-#?@;:&`~\^!\[\]*'"$+.,\/<>()]/)){ var c=stream.current(); if(PERL[c]) return "variable-2";} stream.pos=p;} if(/[$@%&]/.test(ch)){ if(stream.eatWhile(/[\w$\[\]]/)||stream.eat("{")&&stream.eatWhile(/[\w$\[\]]/)&&stream.eat("}")){ var c=stream.current(); if(PERL[c]) return "variable-2"; else return "variable";}} if(ch=="#"){ if(look(stream, -2)!="$"){ stream.skipToEnd(); return "comment";}} if(/[:+\-\^*$&%@=<>!?|\/~\.]/.test(ch)){ var p=stream.pos; stream.eatWhile(/[:+\-\^*$&%@=<>!?|\/~\.]/); if(PERL[stream.current()]) return "operator"; else stream.pos=p;} if(ch=="_"){ if(stream.pos==1){ if(suffix(stream, 6)=="_END__"){ return tokenChain(stream,state,['\0'],"comment");} else if(suffix(stream, 7)=="_DATA__"){ return tokenChain(stream,state,['\0'],"variable-2");} else if(suffix(stream, 7)=="_C__"){ return tokenChain(stream,state,['\0'],"string");}}} if(/\w/.test(ch)){ var p=stream.pos; if(look(stream, -2)=="{"&&(look(stream, 0)=="}"||stream.eatWhile(/\w/)&&look(stream, 0)=="}")) return "string"; else stream.pos=p;} if(/[A-Z]/.test(ch)){ var l=look(stream, -2); var p=stream.pos; stream.eatWhile(/[A-Z_]/); if(/[\da-z]/.test(look(stream, 0))){ stream.pos=p;} else{ var c=PERL[stream.current()]; if(!c) return "meta"; if(c[1]) c=c[0]; if(l!=":"){ if(c==1) return "keyword"; else if(c==2) return "def"; else if(c==3) return "atom"; else if(c==4) return "operator"; else if(c==5) return "variable-2"; else return "meta";} else return "meta";}} if(/[a-zA-Z_]/.test(ch)){ var l=look(stream, -2); stream.eatWhile(/\w/); var c=PERL[stream.current()]; if(!c) return "meta"; if(c[1]) c=c[0]; if(l!=":"){ if(c==1) return "keyword"; else if(c==2) return "def"; else if(c==3) return "atom"; else if(c==4) return "operator"; else if(c==5) return "variable-2"; else return "meta";} else return "meta";} return null;} return { startState: function() { return { tokenize: tokenPerl, chain: null, style: null, tail: null }; }, token: function(stream, state) { return (state.tokenize || tokenPerl)(stream, state); }, lineComment: '#' }; }); CodeMirror.registerHelper("wordChars", "perl", /[\w$]/); CodeMirror.defineMIME("text/x-perl", "perl"); // it's like "peek", but need for look-ahead or look-behind if index < 0 function look(stream, c){ return stream.string.charAt(stream.pos+(c||0)); } // return a part of prefix of current stream from current position function prefix(stream, c){ if(c){ var x=stream.pos-c; return stream.string.substr((x>=0?x:0),c);} else{ return stream.string.substr(0,stream.pos-1); } } // return a part of suffix of current stream from current position function suffix(stream, c){ var y=stream.string.length; var x=y-stream.pos+1; return stream.string.substr(stream.pos,(c&&c=(y=stream.string.length-1)) stream.pos=y; else stream.pos=x; } }); ================================================ FILE: base/res/codemirror/mode/php/index.html ================================================ CodeMirror: PHP mode

PHP mode

Simple HTML/PHP mode based on the C-like mode. Depends on XML, JavaScript, CSS, HTMLMixed, and C-like modes.

MIME types defined: application/x-httpd-php (HTML with PHP code), text/x-php (plain, non-wrapped PHP code).

================================================ FILE: base/res/codemirror/mode/php/php.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../clike/clike")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../clike/clike"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; function keywords(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } // Helper for stringWithEscapes function matchSequence(list, end) { if (list.length == 0) return stringWithEscapes(end); return function (stream, state) { var patterns = list[0]; for (var i = 0; i < patterns.length; i++) if (stream.match(patterns[i][0])) { state.tokenize = matchSequence(list.slice(1), end); return patterns[i][1]; } state.tokenize = stringWithEscapes(end); return "string"; }; } function stringWithEscapes(closing) { return function(stream, state) { return stringWithEscapes_(stream, state, closing); }; } function stringWithEscapes_(stream, state, closing) { // "Complex" syntax if (stream.match("${", false) || stream.match("{$", false)) { state.tokenize = null; return "string"; } // Simple syntax if (stream.match(/^\$[a-zA-Z_][a-zA-Z0-9_]*/)) { // After the variable name there may appear array or object operator. if (stream.match("[", false)) { // Match array operator state.tokenize = matchSequence([ [["[", null]], [[/\d[\w\.]*/, "number"], [/\$[a-zA-Z_][a-zA-Z0-9_]*/, "variable-2"], [/[\w\$]+/, "variable"]], [["]", null]] ], closing); } if (stream.match(/\-\>\w/, false)) { // Match object operator state.tokenize = matchSequence([ [["->", null]], [[/[\w]+/, "variable"]] ], closing); } return "variable-2"; } var escaped = false; // Normal string while (!stream.eol() && (escaped || (!stream.match("{$", false) && !stream.match(/^(\$[a-zA-Z_][a-zA-Z0-9_]*|\$\{)/, false)))) { if (!escaped && stream.match(closing)) { state.tokenize = null; state.tokStack.pop(); state.tokStack.pop(); break; } escaped = stream.next() == "\\" && !escaped; } return "string"; } var phpKeywords = "abstract and array as break case catch class clone const continue declare default " + "do else elseif enddeclare endfor endforeach endif endswitch endwhile extends final " + "for foreach function global goto if implements interface instanceof namespace " + "new or private protected public static switch throw trait try use var while xor " + "die echo empty exit eval include include_once isset list require require_once return " + "print unset __halt_compiler self static parent yield insteadof finally"; var phpAtoms = "true false null TRUE FALSE NULL __CLASS__ __DIR__ __FILE__ __LINE__ __METHOD__ __FUNCTION__ __NAMESPACE__ __TRAIT__"; var phpBuiltin = "func_num_args func_get_arg func_get_args strlen strcmp strncmp strcasecmp strncasecmp each error_reporting define defined trigger_error user_error set_error_handler restore_error_handler get_declared_classes get_loaded_extensions extension_loaded get_extension_funcs debug_backtrace constant bin2hex hex2bin sleep usleep time mktime gmmktime strftime gmstrftime strtotime date gmdate getdate localtime checkdate flush wordwrap htmlspecialchars htmlentities html_entity_decode md5 md5_file crc32 getimagesize image_type_to_mime_type phpinfo phpversion phpcredits strnatcmp strnatcasecmp substr_count strspn strcspn strtok strtoupper strtolower strpos strrpos strrev hebrev hebrevc nl2br basename dirname pathinfo stripslashes stripcslashes strstr stristr strrchr str_shuffle str_word_count strcoll substr substr_replace quotemeta ucfirst ucwords strtr addslashes addcslashes rtrim str_replace str_repeat count_chars chunk_split trim ltrim strip_tags similar_text explode implode setlocale localeconv parse_str str_pad chop strchr sprintf printf vprintf vsprintf sscanf fscanf parse_url urlencode urldecode rawurlencode rawurldecode readlink linkinfo link unlink exec system escapeshellcmd escapeshellarg passthru shell_exec proc_open proc_close rand srand getrandmax mt_rand mt_srand mt_getrandmax base64_decode base64_encode abs ceil floor round is_finite is_nan is_infinite bindec hexdec octdec decbin decoct dechex base_convert number_format fmod ip2long long2ip getenv putenv getopt microtime gettimeofday getrusage uniqid quoted_printable_decode set_time_limit get_cfg_var magic_quotes_runtime set_magic_quotes_runtime get_magic_quotes_gpc get_magic_quotes_runtime import_request_variables error_log serialize unserialize memory_get_usage var_dump var_export debug_zval_dump print_r highlight_file show_source highlight_string ini_get ini_get_all ini_set ini_alter ini_restore get_include_path set_include_path restore_include_path setcookie header headers_sent connection_aborted connection_status ignore_user_abort parse_ini_file is_uploaded_file move_uploaded_file intval floatval doubleval strval gettype settype is_null is_resource is_bool is_long is_float is_int is_integer is_double is_real is_numeric is_string is_array is_object is_scalar ereg ereg_replace eregi eregi_replace split spliti join sql_regcase dl pclose popen readfile rewind rmdir umask fclose feof fgetc fgets fgetss fread fopen fpassthru ftruncate fstat fseek ftell fflush fwrite fputs mkdir rename copy tempnam tmpfile file file_get_contents stream_select stream_context_create stream_context_set_params stream_context_set_option stream_context_get_options stream_filter_prepend stream_filter_append fgetcsv flock get_meta_tags stream_set_write_buffer set_file_buffer set_socket_blocking stream_set_blocking socket_set_blocking stream_get_meta_data stream_register_wrapper stream_wrapper_register stream_set_timeout socket_set_timeout socket_get_status realpath fnmatch fsockopen pfsockopen pack unpack get_browser crypt opendir closedir chdir getcwd rewinddir readdir dir glob fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype file_exists is_writable is_writeable is_readable is_executable is_file is_dir is_link stat lstat chown touch clearstatcache mail ob_start ob_flush ob_clean ob_end_flush ob_end_clean ob_get_flush ob_get_clean ob_get_length ob_get_level ob_get_status ob_get_contents ob_implicit_flush ob_list_handlers ksort krsort natsort natcasesort asort arsort sort rsort usort uasort uksort shuffle array_walk count end prev next reset current key min max in_array array_search extract compact array_fill range array_multisort array_push array_pop array_shift array_unshift array_splice array_slice array_merge array_merge_recursive array_keys array_values array_count_values array_reverse array_reduce array_pad array_flip array_change_key_case array_rand array_unique array_intersect array_intersect_assoc array_diff array_diff_assoc array_sum array_filter array_map array_chunk array_key_exists pos sizeof key_exists assert assert_options version_compare ftok str_rot13 aggregate session_name session_module_name session_save_path session_id session_regenerate_id session_decode session_register session_unregister session_is_registered session_encode session_start session_destroy session_unset session_set_save_handler session_cache_limiter session_cache_expire session_set_cookie_params session_get_cookie_params session_write_close preg_match preg_match_all preg_replace preg_replace_callback preg_split preg_quote preg_grep overload ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_lower ctype_graph ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit virtual apache_request_headers apache_note apache_lookup_uri apache_child_terminate apache_setenv apache_response_headers apache_get_version getallheaders mysql_connect mysql_pconnect mysql_close mysql_select_db mysql_create_db mysql_drop_db mysql_query mysql_unbuffered_query mysql_db_query mysql_list_dbs mysql_list_tables mysql_list_fields mysql_list_processes mysql_error mysql_errno mysql_affected_rows mysql_insert_id mysql_result mysql_num_rows mysql_num_fields mysql_fetch_row mysql_fetch_array mysql_fetch_assoc mysql_fetch_object mysql_data_seek mysql_fetch_lengths mysql_fetch_field mysql_field_seek mysql_free_result mysql_field_name mysql_field_table mysql_field_len mysql_field_type mysql_field_flags mysql_escape_string mysql_real_escape_string mysql_stat mysql_thread_id mysql_client_encoding mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql mysql_fieldname mysql_fieldtable mysql_fieldlen mysql_fieldtype mysql_fieldflags mysql_selectdb mysql_createdb mysql_dropdb mysql_freeresult mysql_numfields mysql_numrows mysql_listdbs mysql_listtables mysql_listfields mysql_db_name mysql_dbname mysql_tablename mysql_table_name pg_connect pg_pconnect pg_close pg_connection_status pg_connection_busy pg_connection_reset pg_host pg_dbname pg_port pg_tty pg_options pg_ping pg_query pg_send_query pg_cancel_query pg_fetch_result pg_fetch_row pg_fetch_assoc pg_fetch_array pg_fetch_object pg_fetch_all pg_affected_rows pg_get_result pg_result_seek pg_result_status pg_free_result pg_last_oid pg_num_rows pg_num_fields pg_field_name pg_field_num pg_field_size pg_field_type pg_field_prtlen pg_field_is_null pg_get_notify pg_get_pid pg_result_error pg_last_error pg_last_notice pg_put_line pg_end_copy pg_copy_to pg_copy_from pg_trace pg_untrace pg_lo_create pg_lo_unlink pg_lo_open pg_lo_close pg_lo_read pg_lo_write pg_lo_read_all pg_lo_import pg_lo_export pg_lo_seek pg_lo_tell pg_escape_string pg_escape_bytea pg_unescape_bytea pg_client_encoding pg_set_client_encoding pg_meta_data pg_convert pg_insert pg_update pg_delete pg_select pg_exec pg_getlastoid pg_cmdtuples pg_errormessage pg_numrows pg_numfields pg_fieldname pg_fieldsize pg_fieldtype pg_fieldnum pg_fieldprtlen pg_fieldisnull pg_freeresult pg_result pg_loreadall pg_locreate pg_lounlink pg_loopen pg_loclose pg_loread pg_lowrite pg_loimport pg_loexport http_response_code get_declared_traits getimagesizefromstring socket_import_stream stream_set_chunk_size trait_exists header_register_callback class_uses session_status session_register_shutdown echo print global static exit array empty eval isset unset die include require include_once require_once json_decode json_encode json_last_error json_last_error_msg curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt_array curl_setopt curl_share_close curl_share_init curl_share_setopt curl_strerror curl_unescape curl_version mysqli_affected_rows mysqli_autocommit mysqli_change_user mysqli_character_set_name mysqli_close mysqli_commit mysqli_connect_errno mysqli_connect_error mysqli_connect mysqli_data_seek mysqli_debug mysqli_dump_debug_info mysqli_errno mysqli_error_list mysqli_error mysqli_fetch_all mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_charset mysqli_get_client_info mysqli_get_client_stats mysqli_get_client_version mysqli_get_connection_stats mysqli_get_host_info mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_num_fields mysqli_num_rows mysqli_options mysqli_ping mysqli_prepare mysqli_query mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reap_async_query mysqli_refresh mysqli_rollback mysqli_select_db mysqli_set_charset mysqli_set_local_infile_default mysqli_set_local_infile_handler mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_init mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count"; CodeMirror.registerHelper("hintWords", "php", [phpKeywords, phpAtoms, phpBuiltin].join(" ").split(" ")); CodeMirror.registerHelper("wordChars", "php", /[\w$]/); var phpConfig = { name: "clike", helperType: "php", keywords: keywords(phpKeywords), blockKeywords: keywords("catch do else elseif for foreach if switch try while finally"), atoms: keywords(phpAtoms), builtin: keywords(phpBuiltin), multiLineStrings: true, hooks: { "$": function(stream) { stream.eatWhile(/[\w\$_]/); return "variable-2"; }, "<": function(stream, state) { if (stream.match(/<", false)) stream.next(); return "comment"; }, "/": function(stream) { if (stream.eat("/")) { while (!stream.eol() && !stream.match("?>", false)) stream.next(); return "comment"; } return false; }, '"': function(_stream, state) { (state.tokStack || (state.tokStack = [])).push('"', 0); state.tokenize = stringWithEscapes('"'); return "string"; }, "{": function(_stream, state) { if (state.tokStack && state.tokStack.length) state.tokStack[state.tokStack.length - 1]++; return false; }, "}": function(_stream, state) { if (state.tokStack && state.tokStack.length > 0 && !--state.tokStack[state.tokStack.length - 1]) { state.tokenize = stringWithEscapes(state.tokStack[state.tokStack.length - 2]); } return false; } } }; CodeMirror.defineMode("php", function(config, parserConfig) { var htmlMode = CodeMirror.getMode(config, "text/html"); var phpMode = CodeMirror.getMode(config, phpConfig); function dispatch(stream, state) { var isPHP = state.curMode == phpMode; if (stream.sol() && state.pending && state.pending != '"' && state.pending != "'") state.pending = null; if (!isPHP) { if (stream.match(/^<\?\w*/)) { state.curMode = phpMode; state.curState = state.php; return "meta"; } if (state.pending == '"' || state.pending == "'") { while (!stream.eol() && stream.next() != state.pending) {} var style = "string"; } else if (state.pending && stream.pos < state.pending.end) { stream.pos = state.pending.end; var style = state.pending.style; } else { var style = htmlMode.token(stream, state.curState); } if (state.pending) state.pending = null; var cur = stream.current(), openPHP = cur.search(/<\?/), m; if (openPHP != -1) { if (style == "string" && (m = cur.match(/[\'\"]$/)) && !/\?>/.test(cur)) state.pending = m[0]; else state.pending = {end: stream.pos, style: style}; stream.backUp(cur.length - openPHP); } return style; } else if (isPHP && state.php.tokenize == null && stream.match("?>")) { state.curMode = htmlMode; state.curState = state.html; return "meta"; } else { return phpMode.token(stream, state.curState); } } return { startState: function() { var html = CodeMirror.startState(htmlMode), php = CodeMirror.startState(phpMode); return {html: html, php: php, curMode: parserConfig.startOpen ? phpMode : htmlMode, curState: parserConfig.startOpen ? php : html, pending: null}; }, copyState: function(state) { var html = state.html, htmlNew = CodeMirror.copyState(htmlMode, html), php = state.php, phpNew = CodeMirror.copyState(phpMode, php), cur; if (state.curMode == htmlMode) cur = htmlNew; else cur = phpNew; return {html: htmlNew, php: phpNew, curMode: state.curMode, curState: cur, pending: state.pending}; }, token: dispatch, indent: function(state, textAfter) { if ((state.curMode != phpMode && /^\s*<\//.test(textAfter)) || (state.curMode == phpMode && /^\?>/.test(textAfter))) return htmlMode.indent(state.html, textAfter); return state.curMode.indent(state.curState, textAfter); }, blockCommentStart: "/*", blockCommentEnd: "*/", lineComment: "//", innerMode: function(state) { return {state: state.curState, mode: state.curMode}; } }; }, "htmlmixed", "clike"); CodeMirror.defineMIME("application/x-httpd-php", "php"); CodeMirror.defineMIME("application/x-httpd-php-open", {name: "php", startOpen: true}); CodeMirror.defineMIME("text/x-php", phpConfig); }); ================================================ FILE: base/res/codemirror/mode/php/test.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({indentUnit: 2}, "php"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } MT('simple_test', '[meta ]'); MT('variable_interpolation_non_alphanumeric', '[meta $/$\\$}$\\\"$:$;$?$|$[[$]]$+$=aaa"]', '[meta ?>]'); MT('variable_interpolation_digits', '[meta ]'); MT('variable_interpolation_simple_syntax_1', '[meta ]'); MT('variable_interpolation_simple_syntax_2', '[meta ]'); MT('variable_interpolation_simple_syntax_3', '[meta [variable aaaaa][string .aaaaaa"];', '[keyword echo] [string "aaa][variable-2 $aaaa][string ->][variable-2 $aaaaa][string .aaaaaa"];', '[keyword echo] [string "aaa][variable-2 $aaaa]->[variable aaaaa][string [[2]].aaaaaa"];', '[keyword echo] [string "aaa][variable-2 $aaaa]->[variable aaaaa][string ->aaaa2.aaaaaa"];', '[meta ?>]'); MT('variable_interpolation_escaping', '[meta aaa.aaa"];', '[keyword echo] [string "aaa\\$aaaa[[2]]aaa.aaa"];', '[keyword echo] [string "aaa\\$aaaa[[asd]]aaa.aaa"];', '[keyword echo] [string "aaa{\\$aaaa->aaa.aaa"];', '[keyword echo] [string "aaa{\\$aaaa[[2]]aaa.aaa"];', '[keyword echo] [string "aaa{\\aaaaa[[asd]]aaa.aaa"];', '[keyword echo] [string "aaa\\${aaaa->aaa.aaa"];', '[keyword echo] [string "aaa\\${aaaa[[2]]aaa.aaa"];', '[keyword echo] [string "aaa\\${aaaa[[asd]]aaa.aaa"];', '[meta ?>]'); MT('variable_interpolation_complex_syntax_1', '[meta aaa.aaa"];', '[keyword echo] [string "aaa][variable-2 $]{[variable-2 $aaaa]}[string ->aaa.aaa"];', '[keyword echo] [string "aaa][variable-2 $]{[variable-2 $aaaa][[',' [number 42]',']]}[string ->aaa.aaa"];', '[keyword echo] [string "aaa][variable-2 $]{[variable aaaa][meta ?>]aaaaaa'); MT('variable_interpolation_complex_syntax_2', '[meta } $aaaaaa.aaa"];', '[keyword echo] [string "][variable-2 $]{[variable aaa][comment /*}?>*/][[',' [string "aaa][variable-2 $aaa][string {}][variable-2 $]{[variable aaa]}[string "]',']]}[string ->aaa.aaa"];', '[keyword echo] [string "][variable-2 $]{[variable aaa][comment /*} } $aaa } */]}[string ->aaa.aaa"];'); function build_recursive_monsters(nt, t, n){ var monsters = [t]; for (var i = 1; i <= n; ++i) monsters[i] = nt.join(monsters[i - 1]); return monsters; } var m1 = build_recursive_monsters( ['[string "][variable-2 $]{[variable aaa] [operator +] ', '}[string "]'], '[comment /* }?>} */] [string "aaa][variable-2 $aaa][string .aaa"]', 10 ); MT('variable_interpolation_complex_syntax_3_1', '[meta ]'); var m2 = build_recursive_monsters( ['[string "a][variable-2 $]{[variable aaa] [operator +] ', ' [operator +] ', '}[string .a"]'], '[comment /* }?>{{ */] [string "a?>}{{aa][variable-2 $aaa][string .a}a?>a"]', 5 ); MT('variable_interpolation_complex_syntax_3_2', '[meta ]'); function build_recursive_monsters_2(mf1, mf2, nt, t, n){ var monsters = [t]; for (var i = 1; i <= n; ++i) monsters[i] = nt[0] + mf1[i - 1] + nt[1] + mf2[i - 1] + nt[2] + monsters[i - 1] + nt[3]; return monsters; } var m3 = build_recursive_monsters_2( m1, m2, ['[string "a][variable-2 $]{[variable aaa] [operator +] ', ' [operator +] ', ' [operator +] ', '}[string .a"]'], '[comment /* }?>{{ */] [string "a?>}{{aa][variable-2 $aaa][string .a}a?>a"]', 4 ); MT('variable_interpolation_complex_syntax_3_3', '[meta ]'); MT("variable_interpolation_heredoc", "[meta CodeMirror: Pig Latin mode

Pig Latin mode

Simple mode that handles Pig Latin language.

MIME type defined: text/x-pig (PIG code)

================================================ FILE: base/res/codemirror/mode/pig/pig.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /* * Pig Latin Mode for CodeMirror 2 * @author Prasanth Jayachandran * @link https://github.com/prasanthj/pig-codemirror-2 * This implementation is adapted from PL/SQL mode in CodeMirror 2. */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("pig", function(_config, parserConfig) { var keywords = parserConfig.keywords, builtins = parserConfig.builtins, types = parserConfig.types, multiLineStrings = parserConfig.multiLineStrings; var isOperatorChar = /[*+\-%<>=&?:\/!|]/; function chain(stream, state, f) { state.tokenize = f; return f(stream, state); } var type; function ret(tp, style) { type = tp; return style; } function tokenComment(stream, state) { var isEnd = false; var ch; while(ch = stream.next()) { if(ch == "/" && isEnd) { state.tokenize = tokenBase; break; } isEnd = (ch == "*"); } return ret("comment", "comment"); } function tokenString(quote) { return function(stream, state) { var escaped = false, next, end = false; while((next = stream.next()) != null) { if (next == quote && !escaped) { end = true; break; } escaped = !escaped && next == "\\"; } if (end || !(escaped || multiLineStrings)) state.tokenize = tokenBase; return ret("string", "error"); }; } function tokenBase(stream, state) { var ch = stream.next(); // is a start of string? if (ch == '"' || ch == "'") return chain(stream, state, tokenString(ch)); // is it one of the special chars else if(/[\[\]{}\(\),;\.]/.test(ch)) return ret(ch); // is it a number? else if(/\d/.test(ch)) { stream.eatWhile(/[\w\.]/); return ret("number", "number"); } // multi line comment or operator else if (ch == "/") { if (stream.eat("*")) { return chain(stream, state, tokenComment); } else { stream.eatWhile(isOperatorChar); return ret("operator", "operator"); } } // single line comment or operator else if (ch=="-") { if(stream.eat("-")){ stream.skipToEnd(); return ret("comment", "comment"); } else { stream.eatWhile(isOperatorChar); return ret("operator", "operator"); } } // is it an operator else if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return ret("operator", "operator"); } else { // get the while word stream.eatWhile(/[\w\$_]/); // is it one of the listed keywords? if (keywords && keywords.propertyIsEnumerable(stream.current().toUpperCase())) { if (stream.eat(")") || stream.eat(".")) { //keywords can be used as variables like flatten(group), group.$0 etc.. } else { return ("keyword", "keyword"); } } // is it one of the builtin functions? if (builtins && builtins.propertyIsEnumerable(stream.current().toUpperCase())) { return ("keyword", "variable-2"); } // is it one of the listed types? if (types && types.propertyIsEnumerable(stream.current().toUpperCase())) return ("keyword", "variable-3"); // default is a 'variable' return ret("variable", "pig-word"); } } // Interface return { startState: function() { return { tokenize: tokenBase, startOfLine: true }; }, token: function(stream, state) { if(stream.eatSpace()) return null; var style = state.tokenize(stream, state); return style; } }; }); (function() { function keywords(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } // builtin funcs taken from trunk revision 1303237 var pBuiltins = "ABS ACOS ARITY ASIN ATAN AVG BAGSIZE BINSTORAGE BLOOM BUILDBLOOM CBRT CEIL " + "CONCAT COR COS COSH COUNT COUNT_STAR COV CONSTANTSIZE CUBEDIMENSIONS DIFF DISTINCT DOUBLEABS " + "DOUBLEAVG DOUBLEBASE DOUBLEMAX DOUBLEMIN DOUBLEROUND DOUBLESUM EXP FLOOR FLOATABS FLOATAVG " + "FLOATMAX FLOATMIN FLOATROUND FLOATSUM GENERICINVOKER INDEXOF INTABS INTAVG INTMAX INTMIN " + "INTSUM INVOKEFORDOUBLE INVOKEFORFLOAT INVOKEFORINT INVOKEFORLONG INVOKEFORSTRING INVOKER " + "ISEMPTY JSONLOADER JSONMETADATA JSONSTORAGE LAST_INDEX_OF LCFIRST LOG LOG10 LOWER LONGABS " + "LONGAVG LONGMAX LONGMIN LONGSUM MAX MIN MAPSIZE MONITOREDUDF NONDETERMINISTIC OUTPUTSCHEMA " + "PIGSTORAGE PIGSTREAMING RANDOM REGEX_EXTRACT REGEX_EXTRACT_ALL REPLACE ROUND SIN SINH SIZE " + "SQRT STRSPLIT SUBSTRING SUM STRINGCONCAT STRINGMAX STRINGMIN STRINGSIZE TAN TANH TOBAG " + "TOKENIZE TOMAP TOP TOTUPLE TRIM TEXTLOADER TUPLESIZE UCFIRST UPPER UTF8STORAGECONVERTER "; // taken from QueryLexer.g var pKeywords = "VOID IMPORT RETURNS DEFINE LOAD FILTER FOREACH ORDER CUBE DISTINCT COGROUP " + "JOIN CROSS UNION SPLIT INTO IF OTHERWISE ALL AS BY USING INNER OUTER ONSCHEMA PARALLEL " + "PARTITION GROUP AND OR NOT GENERATE FLATTEN ASC DESC IS STREAM THROUGH STORE MAPREDUCE " + "SHIP CACHE INPUT OUTPUT STDERROR STDIN STDOUT LIMIT SAMPLE LEFT RIGHT FULL EQ GT LT GTE LTE " + "NEQ MATCHES TRUE FALSE DUMP"; // data types var pTypes = "BOOLEAN INT LONG FLOAT DOUBLE CHARARRAY BYTEARRAY BAG TUPLE MAP "; CodeMirror.defineMIME("text/x-pig", { name: "pig", builtins: keywords(pBuiltins), keywords: keywords(pKeywords), types: keywords(pTypes) }); CodeMirror.registerHelper("hintWords", "pig", (pBuiltins + pTypes + pKeywords).split(" ")); }()); }); ================================================ FILE: base/res/codemirror/mode/properties/index.html ================================================ CodeMirror: Properties files mode

Properties files mode

MIME types defined: text/x-properties, text/x-ini.

================================================ FILE: base/res/codemirror/mode/properties/properties.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("properties", function() { return { token: function(stream, state) { var sol = stream.sol() || state.afterSection; var eol = stream.eol(); state.afterSection = false; if (sol) { if (state.nextMultiline) { state.inMultiline = true; state.nextMultiline = false; } else { state.position = "def"; } } if (eol && ! state.nextMultiline) { state.inMultiline = false; state.position = "def"; } if (sol) { while(stream.eatSpace()); } var ch = stream.next(); if (sol && (ch === "#" || ch === "!" || ch === ";")) { state.position = "comment"; stream.skipToEnd(); return "comment"; } else if (sol && ch === "[") { state.afterSection = true; stream.skipTo("]"); stream.eat("]"); return "header"; } else if (ch === "=" || ch === ":") { state.position = "quote"; return null; } else if (ch === "\\" && state.position === "quote") { if (stream.eol()) { // end of line? // Multiline value state.nextMultiline = true; } } return state.position; }, startState: function() { return { position : "def", // Current position, "def", "quote" or "comment" nextMultiline : false, // Is the next line multiline value inMultiline : false, // Is the current line a multiline value afterSection : false // Did we just open a section }; } }; }); CodeMirror.defineMIME("text/x-properties", "properties"); CodeMirror.defineMIME("text/x-ini", "properties"); }); ================================================ FILE: base/res/codemirror/mode/puppet/index.html ================================================ CodeMirror: Puppet mode

Puppet mode

MIME types defined: text/x-puppet.

================================================ FILE: base/res/codemirror/mode/puppet/puppet.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("puppet", function () { // Stores the words from the define method var words = {}; // Taken, mostly, from the Puppet official variable standards regex var variable_regex = /({)?([a-z][a-z0-9_]*)?((::[a-z][a-z0-9_]*)*::)?[a-zA-Z0-9_]+(})?/; // Takes a string of words separated by spaces and adds them as // keys with the value of the first argument 'style' function define(style, string) { var split = string.split(' '); for (var i = 0; i < split.length; i++) { words[split[i]] = style; } } // Takes commonly known puppet types/words and classifies them to a style define('keyword', 'class define site node include import inherits'); define('keyword', 'case if else in and elsif default or'); define('atom', 'false true running present absent file directory undef'); define('builtin', 'action augeas burst chain computer cron destination dport exec ' + 'file filebucket group host icmp iniface interface jump k5login limit log_level ' + 'log_prefix macauthorization mailalias maillist mcx mount nagios_command ' + 'nagios_contact nagios_contactgroup nagios_host nagios_hostdependency ' + 'nagios_hostescalation nagios_hostextinfo nagios_hostgroup nagios_service ' + 'nagios_servicedependency nagios_serviceescalation nagios_serviceextinfo ' + 'nagios_servicegroup nagios_timeperiod name notify outiface package proto reject ' + 'resources router schedule scheduled_task selboolean selmodule service source ' + 'sport ssh_authorized_key sshkey stage state table tidy todest toports tosource ' + 'user vlan yumrepo zfs zone zpool'); // After finding a start of a string ('|") this function attempts to find the end; // If a variable is encountered along the way, we display it differently when it // is encapsulated in a double-quoted string. function tokenString(stream, state) { var current, prev, found_var = false; while (!stream.eol() && (current = stream.next()) != state.pending) { if (current === '$' && prev != '\\' && state.pending == '"') { found_var = true; break; } prev = current; } if (found_var) { stream.backUp(1); } if (current == state.pending) { state.continueString = false; } else { state.continueString = true; } return "string"; } // Main function function tokenize(stream, state) { // Matches one whole word var word = stream.match(/[\w]+/, false); // Matches attributes (i.e. ensure => present ; 'ensure' would be matched) var attribute = stream.match(/(\s+)?\w+\s+=>.*/, false); // Matches non-builtin resource declarations // (i.e. "apache::vhost {" or "mycustomclasss {" would be matched) var resource = stream.match(/(\s+)?[\w:_]+(\s+)?{/, false); // Matches virtual and exported resources (i.e. @@user { ; and the like) var special_resource = stream.match(/(\s+)?[@]{1,2}[\w:_]+(\s+)?{/, false); // Finally advance the stream var ch = stream.next(); // Have we found a variable? if (ch === '$') { if (stream.match(variable_regex)) { // If so, and its in a string, assign it a different color return state.continueString ? 'variable-2' : 'variable'; } // Otherwise return an invalid variable return "error"; } // Should we still be looking for the end of a string? if (state.continueString) { // If so, go through the loop again stream.backUp(1); return tokenString(stream, state); } // Are we in a definition (class, node, define)? if (state.inDefinition) { // If so, return def (i.e. for 'class myclass {' ; 'myclass' would be matched) if (stream.match(/(\s+)?[\w:_]+(\s+)?/)) { return 'def'; } // Match the rest it the next time around stream.match(/\s+{/); state.inDefinition = false; } // Are we in an 'include' statement? if (state.inInclude) { // Match and return the included class stream.match(/(\s+)?\S+(\s+)?/); state.inInclude = false; return 'def'; } // Do we just have a function on our hands? // In 'ensure_resource("myclass")', 'ensure_resource' is matched if (stream.match(/(\s+)?\w+\(/)) { stream.backUp(1); return 'def'; } // Have we matched the prior attribute regex? if (attribute) { stream.match(/(\s+)?\w+/); return 'tag'; } // Do we have Puppet specific words? if (word && words.hasOwnProperty(word)) { // Negates the initial next() stream.backUp(1); // Acutally move the stream stream.match(/[\w]+/); // We want to process these words differently // do to the importance they have in Puppet if (stream.match(/\s+\S+\s+{/, false)) { state.inDefinition = true; } if (word == 'include') { state.inInclude = true; } // Returns their value as state in the prior define methods return words[word]; } // Is there a match on a reference? if (/(^|\s+)[A-Z][\w:_]+/.test(word)) { // Negate the next() stream.backUp(1); // Match the full reference stream.match(/(^|\s+)[A-Z][\w:_]+/); return 'def'; } // Have we matched the prior resource regex? if (resource) { stream.match(/(\s+)?[\w:_]+/); return 'def'; } // Have we matched the prior special_resource regex? if (special_resource) { stream.match(/(\s+)?[@]{1,2}/); return 'special'; } // Match all the comments. All of them. if (ch == "#") { stream.skipToEnd(); return "comment"; } // Have we found a string? if (ch == "'" || ch == '"') { // Store the type (single or double) state.pending = ch; // Perform the looping function to find the end return tokenString(stream, state); } // Match all the brackets if (ch == '{' || ch == '}') { return 'bracket'; } // Match characters that we are going to assume // are trying to be regex if (ch == '/') { stream.match(/.*?\//); return 'variable-3'; } // Match all the numbers if (ch.match(/[0-9]/)) { stream.eatWhile(/[0-9]+/); return 'number'; } // Match the '=' and '=>' operators if (ch == '=') { if (stream.peek() == '>') { stream.next(); } return "operator"; } // Keep advancing through all the rest stream.eatWhile(/[\w-]/); // Return a blank line for everything else return null; } // Start it all return { startState: function () { var state = {}; state.inDefinition = false; state.inInclude = false; state.continueString = false; state.pending = false; return state; }, token: function (stream, state) { // Strip the spaces, but regex will account for them eitherway if (stream.eatSpace()) return null; // Go through the main process return tokenize(stream, state); } }; }); CodeMirror.defineMIME("text/x-puppet", "puppet"); }); ================================================ FILE: base/res/codemirror/mode/python/index.html ================================================ CodeMirror: Python mode

Python mode

Cython mode

Configuration Options for Python mode:

  • version - 2/3 - The version of Python to recognize. Default is 2.
  • singleLineStringErrors - true/false - If you have a single-line string that is not terminated at the end of the line, this will show subsequent lines as errors if true, otherwise it will consider the newline as the end of the string. Default is false.
  • hangingIndent - int - If you want to write long arguments to a function starting on a new line, how much that line should be indented. Defaults to one normal indentation unit.

Advanced Configuration Options:

Usefull for superset of python syntax like Enthought enaml, IPython magics and questionmark help

  • singleOperators - RegEx - Regular Expression for single operator matching, default :
    ^[\\+\\-\\*/%&|\\^~<>!]
    including
    @
    on Python 3
  • singleDelimiters - RegEx - Regular Expression for single delimiter matching, default :
    ^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]
  • doubleOperators - RegEx - Regular Expression for double operators matching, default :
    ^((==)|(!=)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))
  • doubleDelimiters - RegEx - Regular Expressoin for double delimiters matching, default :
    ^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))
  • tripleDelimiters - RegEx - Regular Expression for triple delimiters matching, default :
    ^((//=)|(>>=)|(<<=)|(\\*\\*=))
  • identifiers - RegEx - Regular Expression for identifier, default :
    ^[_A-Za-z][_A-Za-z0-9]*
    on Python 2 and
    ^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*
    on Python 3.
  • extra_keywords - list of string - List of extra words ton consider as keywords
  • extra_builtins - list of string - List of extra words ton consider as builtins

MIME types defined: text/x-python and text/x-cython.

================================================ FILE: base/res/codemirror/mode/python/python.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; function wordRegexp(words) { return new RegExp("^((" + words.join(")|(") + "))\\b"); } var wordOperators = wordRegexp(["and", "or", "not", "is"]); var commonKeywords = ["as", "assert", "break", "class", "continue", "def", "del", "elif", "else", "except", "finally", "for", "from", "global", "if", "import", "lambda", "pass", "raise", "return", "try", "while", "with", "yield", "in"]; var commonBuiltins = ["abs", "all", "any", "bin", "bool", "bytearray", "callable", "chr", "classmethod", "compile", "complex", "delattr", "dict", "dir", "divmod", "enumerate", "eval", "filter", "float", "format", "frozenset", "getattr", "globals", "hasattr", "hash", "help", "hex", "id", "input", "int", "isinstance", "issubclass", "iter", "len", "list", "locals", "map", "max", "memoryview", "min", "next", "object", "oct", "open", "ord", "pow", "property", "range", "repr", "reversed", "round", "set", "setattr", "slice", "sorted", "staticmethod", "str", "sum", "super", "tuple", "type", "vars", "zip", "__import__", "NotImplemented", "Ellipsis", "__debug__"]; var py2 = {builtins: ["apply", "basestring", "buffer", "cmp", "coerce", "execfile", "file", "intern", "long", "raw_input", "reduce", "reload", "unichr", "unicode", "xrange", "False", "True", "None"], keywords: ["exec", "print"]}; var py3 = {builtins: ["ascii", "bytes", "exec", "print"], keywords: ["nonlocal", "False", "True", "None"]}; CodeMirror.registerHelper("hintWords", "python", commonKeywords.concat(commonBuiltins)); function top(state) { return state.scopes[state.scopes.length - 1]; } CodeMirror.defineMode("python", function(conf, parserConf) { var ERRORCLASS = "error"; var singleDelimiters = parserConf.singleDelimiters || new RegExp("^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]"); var doubleOperators = parserConf.doubleOperators || new RegExp("^((==)|(!=)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))"); var doubleDelimiters = parserConf.doubleDelimiters || new RegExp("^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))"); var tripleDelimiters = parserConf.tripleDelimiters || new RegExp("^((//=)|(>>=)|(<<=)|(\\*\\*=))"); if (parserConf.version && parseInt(parserConf.version, 10) == 3){ // since http://legacy.python.org/dev/peps/pep-0465/ @ is also an operator var singleOperators = parserConf.singleOperators || new RegExp("^[\\+\\-\\*/%&|\\^~<>!@]"); var identifiers = parserConf.identifiers|| new RegExp("^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*"); } else { var singleOperators = parserConf.singleOperators || new RegExp("^[\\+\\-\\*/%&|\\^~<>!]"); var identifiers = parserConf.identifiers|| new RegExp("^[_A-Za-z][_A-Za-z0-9]*"); } var hangingIndent = parserConf.hangingIndent || conf.indentUnit; var myKeywords = commonKeywords, myBuiltins = commonBuiltins; if(parserConf.extra_keywords != undefined){ myKeywords = myKeywords.concat(parserConf.extra_keywords); } if(parserConf.extra_builtins != undefined){ myBuiltins = myBuiltins.concat(parserConf.extra_builtins); } if (parserConf.version && parseInt(parserConf.version, 10) == 3) { myKeywords = myKeywords.concat(py3.keywords); myBuiltins = myBuiltins.concat(py3.builtins); var stringPrefixes = new RegExp("^(([rb]|(br))?('{3}|\"{3}|['\"]))", "i"); } else { myKeywords = myKeywords.concat(py2.keywords); myBuiltins = myBuiltins.concat(py2.builtins); var stringPrefixes = new RegExp("^(([rub]|(ur)|(br))?('{3}|\"{3}|['\"]))", "i"); } var keywords = wordRegexp(myKeywords); var builtins = wordRegexp(myBuiltins); // tokenizers function tokenBase(stream, state) { // Handle scope changes if (stream.sol() && top(state).type == "py") { var scopeOffset = top(state).offset; if (stream.eatSpace()) { var lineOffset = stream.indentation(); if (lineOffset > scopeOffset) pushScope(stream, state, "py"); else if (lineOffset < scopeOffset && dedent(stream, state)) state.errorToken = true; return null; } else { var style = tokenBaseInner(stream, state); if (scopeOffset > 0 && dedent(stream, state)) style += " " + ERRORCLASS; return style; } } return tokenBaseInner(stream, state); } function tokenBaseInner(stream, state) { if (stream.eatSpace()) return null; var ch = stream.peek(); // Handle Comments if (ch == "#") { stream.skipToEnd(); return "comment"; } // Handle Number Literals if (stream.match(/^[0-9\.]/, false)) { var floatLiteral = false; // Floats if (stream.match(/^\d*\.\d+(e[\+\-]?\d+)?/i)) { floatLiteral = true; } if (stream.match(/^\d+\.\d*/)) { floatLiteral = true; } if (stream.match(/^\.\d+/)) { floatLiteral = true; } if (floatLiteral) { // Float literals may be "imaginary" stream.eat(/J/i); return "number"; } // Integers var intLiteral = false; // Hex if (stream.match(/^0x[0-9a-f]+/i)) intLiteral = true; // Binary if (stream.match(/^0b[01]+/i)) intLiteral = true; // Octal if (stream.match(/^0o[0-7]+/i)) intLiteral = true; // Decimal if (stream.match(/^[1-9]\d*(e[\+\-]?\d+)?/)) { // Decimal literals may be "imaginary" stream.eat(/J/i); // TODO - Can you have imaginary longs? intLiteral = true; } // Zero by itself with no other piece of number. if (stream.match(/^0(?![\dx])/i)) intLiteral = true; if (intLiteral) { // Integer literals may be "long" stream.eat(/L/i); return "number"; } } // Handle Strings if (stream.match(stringPrefixes)) { state.tokenize = tokenStringFactory(stream.current()); return state.tokenize(stream, state); } // Handle operators and Delimiters if (stream.match(tripleDelimiters) || stream.match(doubleDelimiters)) return null; if (stream.match(doubleOperators) || stream.match(singleOperators)) return "operator"; if (stream.match(singleDelimiters)) return null; if (stream.match(keywords) || stream.match(wordOperators)) return "keyword"; if (stream.match(builtins)) return "builtin"; if (stream.match(/^(self|cls)\b/)) return "variable-2"; if (stream.match(identifiers)) { if (state.lastToken == "def" || state.lastToken == "class") return "def"; return "variable"; } // Handle non-detected items stream.next(); return ERRORCLASS; } function tokenStringFactory(delimiter) { while ("rub".indexOf(delimiter.charAt(0).toLowerCase()) >= 0) delimiter = delimiter.substr(1); var singleline = delimiter.length == 1; var OUTCLASS = "string"; function tokenString(stream, state) { while (!stream.eol()) { stream.eatWhile(/[^'"\\]/); if (stream.eat("\\")) { stream.next(); if (singleline && stream.eol()) return OUTCLASS; } else if (stream.match(delimiter)) { state.tokenize = tokenBase; return OUTCLASS; } else { stream.eat(/['"]/); } } if (singleline) { if (parserConf.singleLineStringErrors) return ERRORCLASS; else state.tokenize = tokenBase; } return OUTCLASS; } tokenString.isString = true; return tokenString; } function pushScope(stream, state, type) { var offset = 0, align = null; if (type == "py") { while (top(state).type != "py") state.scopes.pop(); } offset = top(state).offset + (type == "py" ? conf.indentUnit : hangingIndent); if (type != "py" && !stream.match(/^(\s|#.*)*$/, false)) align = stream.column() + 1; state.scopes.push({offset: offset, type: type, align: align}); } function dedent(stream, state) { var indented = stream.indentation(); while (top(state).offset > indented) { if (top(state).type != "py") return true; state.scopes.pop(); } return top(state).offset != indented; } function tokenLexer(stream, state) { var style = state.tokenize(stream, state); var current = stream.current(); // Handle '.' connected identifiers if (current == ".") { style = stream.match(identifiers, false) ? null : ERRORCLASS; if (style == null && state.lastStyle == "meta") { // Apply 'meta' style to '.' connected identifiers when // appropriate. style = "meta"; } return style; } // Handle decorators if (current == "@"){ if(parserConf.version && parseInt(parserConf.version, 10) == 3){ return stream.match(identifiers, false) ? "meta" : "operator"; } else { return stream.match(identifiers, false) ? "meta" : ERRORCLASS; } } if ((style == "variable" || style == "builtin") && state.lastStyle == "meta") style = "meta"; // Handle scope changes. if (current == "pass" || current == "return") state.dedent += 1; if (current == "lambda") state.lambda = true; if (current == ":" && !state.lambda && top(state).type == "py") pushScope(stream, state, "py"); var delimiter_index = current.length == 1 ? "[({".indexOf(current) : -1; if (delimiter_index != -1) pushScope(stream, state, "])}".slice(delimiter_index, delimiter_index+1)); delimiter_index = "])}".indexOf(current); if (delimiter_index != -1) { if (top(state).type == current) state.scopes.pop(); else return ERRORCLASS; } if (state.dedent > 0 && stream.eol() && top(state).type == "py") { if (state.scopes.length > 1) state.scopes.pop(); state.dedent -= 1; } return style; } var external = { startState: function(basecolumn) { return { tokenize: tokenBase, scopes: [{offset: basecolumn || 0, type: "py", align: null}], lastStyle: null, lastToken: null, lambda: false, dedent: 0 }; }, token: function(stream, state) { var addErr = state.errorToken; if (addErr) state.errorToken = false; var style = tokenLexer(stream, state); state.lastStyle = style; var current = stream.current(); if (current && style) state.lastToken = current; if (stream.eol() && state.lambda) state.lambda = false; return addErr ? style + " " + ERRORCLASS : style; }, indent: function(state, textAfter) { if (state.tokenize != tokenBase) return state.tokenize.isString ? CodeMirror.Pass : 0; var scope = top(state); var closing = textAfter && textAfter.charAt(0) == scope.type; if (scope.align != null) return scope.align - (closing ? 1 : 0); else if (closing && state.scopes.length > 1) return state.scopes[state.scopes.length - 2].offset; else return scope.offset; }, closeBrackets: {triples: "'\""}, lineComment: "#", fold: "indent" }; return external; }); CodeMirror.defineMIME("text/x-python", "python"); var words = function(str) { return str.split(" "); }; CodeMirror.defineMIME("text/x-cython", { name: "python", extra_keywords: words("by cdef cimport cpdef ctypedef enum except"+ "extern gil include nogil property public"+ "readonly struct union DEF IF ELIF ELSE") }); }); ================================================ FILE: base/res/codemirror/mode/q/index.html ================================================ CodeMirror: Q mode

Q mode

MIME type defined: text/x-q.

================================================ FILE: base/res/codemirror/mode/q/q.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("q",function(config){ var indentUnit=config.indentUnit, curPunc, keywords=buildRE(["abs","acos","aj","aj0","all","and","any","asc","asin","asof","atan","attr","avg","avgs","bin","by","ceiling","cols","cor","cos","count","cov","cross","csv","cut","delete","deltas","desc","dev","differ","distinct","div","do","each","ej","enlist","eval","except","exec","exit","exp","fby","fills","first","fkeys","flip","floor","from","get","getenv","group","gtime","hclose","hcount","hdel","hopen","hsym","iasc","idesc","if","ij","in","insert","inter","inv","key","keys","last","like","list","lj","load","log","lower","lsq","ltime","ltrim","mavg","max","maxs","mcount","md5","mdev","med","meta","min","mins","mmax","mmin","mmu","mod","msum","neg","next","not","null","or","over","parse","peach","pj","plist","prd","prds","prev","prior","rand","rank","ratios","raze","read0","read1","reciprocal","reverse","rload","rotate","rsave","rtrim","save","scan","select","set","setenv","show","signum","sin","sqrt","ss","ssr","string","sublist","sum","sums","sv","system","tables","tan","til","trim","txf","type","uj","ungroup","union","update","upper","upsert","value","var","view","views","vs","wavg","where","where","while","within","wj","wj1","wsum","xasc","xbar","xcol","xcols","xdesc","xexp","xgroup","xkey","xlog","xprev","xrank"]), E=/[|/&^!+:\\\-*%$=~#;@><,?_\'\"\[\(\]\)\s{}]/; function buildRE(w){return new RegExp("^("+w.join("|")+")$");} function tokenBase(stream,state){ var sol=stream.sol(),c=stream.next(); curPunc=null; if(sol) if(c=="/") return(state.tokenize=tokenLineComment)(stream,state); else if(c=="\\"){ if(stream.eol()||/\s/.test(stream.peek())) return stream.skipToEnd(),/^\\\s*$/.test(stream.current())?(state.tokenize=tokenCommentToEOF)(stream, state):state.tokenize=tokenBase,"comment"; else return state.tokenize=tokenBase,"builtin"; } if(/\s/.test(c)) return stream.peek()=="/"?(stream.skipToEnd(),"comment"):"whitespace"; if(c=='"') return(state.tokenize=tokenString)(stream,state); if(c=='`') return stream.eatWhile(/[A-Z|a-z|\d|_|:|\/|\.]/),"symbol"; if(("."==c&&/\d/.test(stream.peek()))||/\d/.test(c)){ var t=null; stream.backUp(1); if(stream.match(/^\d{4}\.\d{2}(m|\.\d{2}([D|T](\d{2}(:\d{2}(:\d{2}(\.\d{1,9})?)?)?)?)?)/) || stream.match(/^\d+D(\d{2}(:\d{2}(:\d{2}(\.\d{1,9})?)?)?)/) || stream.match(/^\d{2}:\d{2}(:\d{2}(\.\d{1,9})?)?/) || stream.match(/^\d+[ptuv]{1}/)) t="temporal"; else if(stream.match(/^0[NwW]{1}/) || stream.match(/^0x[\d|a-f|A-F]*/) || stream.match(/^[0|1]+[b]{1}/) || stream.match(/^\d+[chijn]{1}/) || stream.match(/-?\d*(\.\d*)?(e[+\-]?\d+)?(e|f)?/)) t="number"; return(t&&(!(c=stream.peek())||E.test(c)))?t:(stream.next(),"error"); } if(/[A-Z|a-z]|\./.test(c)) return stream.eatWhile(/[A-Z|a-z|\.|_|\d]/),keywords.test(stream.current())?"keyword":"variable"; if(/[|/&^!+:\\\-*%$=~#;@><\.,?_\']/.test(c)) return null; if(/[{}\(\[\]\)]/.test(c)) return null; return"error"; } function tokenLineComment(stream,state){ return stream.skipToEnd(),/\/\s*$/.test(stream.current())?(state.tokenize=tokenBlockComment)(stream,state):(state.tokenize=tokenBase),"comment"; } function tokenBlockComment(stream,state){ var f=stream.sol()&&stream.peek()=="\\"; stream.skipToEnd(); if(f&&/^\\\s*$/.test(stream.current())) state.tokenize=tokenBase; return"comment"; } function tokenCommentToEOF(stream){return stream.skipToEnd(),"comment";} function tokenString(stream,state){ var escaped=false,next,end=false; while((next=stream.next())){ if(next=="\""&&!escaped){end=true;break;} escaped=!escaped&&next=="\\"; } if(end)state.tokenize=tokenBase; return"string"; } function pushContext(state,type,col){state.context={prev:state.context,indent:state.indent,col:col,type:type};} function popContext(state){state.indent=state.context.indent;state.context=state.context.prev;} return{ startState:function(){ return{tokenize:tokenBase, context:null, indent:0, col:0}; }, token:function(stream,state){ if(stream.sol()){ if(state.context&&state.context.align==null) state.context.align=false; state.indent=stream.indentation(); } //if (stream.eatSpace()) return null; var style=state.tokenize(stream,state); if(style!="comment"&&state.context&&state.context.align==null&&state.context.type!="pattern"){ state.context.align=true; } if(curPunc=="(")pushContext(state,")",stream.column()); else if(curPunc=="[")pushContext(state,"]",stream.column()); else if(curPunc=="{")pushContext(state,"}",stream.column()); else if(/[\]\}\)]/.test(curPunc)){ while(state.context&&state.context.type=="pattern")popContext(state); if(state.context&&curPunc==state.context.type)popContext(state); } else if(curPunc=="."&&state.context&&state.context.type=="pattern")popContext(state); else if(/atom|string|variable/.test(style)&&state.context){ if(/[\}\]]/.test(state.context.type)) pushContext(state,"pattern",stream.column()); else if(state.context.type=="pattern"&&!state.context.align){ state.context.align=true; state.context.col=stream.column(); } } return style; }, indent:function(state,textAfter){ var firstChar=textAfter&&textAfter.charAt(0); var context=state.context; if(/[\]\}]/.test(firstChar)) while (context&&context.type=="pattern")context=context.prev; var closing=context&&firstChar==context.type; if(!context) return 0; else if(context.type=="pattern") return context.col; else if(context.align) return context.col+(closing?0:1); else return context.indent+(closing?0:indentUnit); } }; }); CodeMirror.defineMIME("text/x-q","q"); }); ================================================ FILE: base/res/codemirror/mode/r/index.html ================================================ CodeMirror: R mode

R mode

MIME types defined: text/x-rsrc.

Development of the CodeMirror R mode was kindly sponsored by Ubalo.

================================================ FILE: base/res/codemirror/mode/r/r.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("r", function(config) { function wordObj(str) { var words = str.split(" "), res = {}; for (var i = 0; i < words.length; ++i) res[words[i]] = true; return res; } var atoms = wordObj("NULL NA Inf NaN NA_integer_ NA_real_ NA_complex_ NA_character_"); var builtins = wordObj("list quote bquote eval return call parse deparse"); var keywords = wordObj("if else repeat while function for in next break"); var blockkeywords = wordObj("if else repeat while function for"); var opChars = /[+\-*\/^<>=!&|~$:]/; var curPunc; function tokenBase(stream, state) { curPunc = null; var ch = stream.next(); if (ch == "#") { stream.skipToEnd(); return "comment"; } else if (ch == "0" && stream.eat("x")) { stream.eatWhile(/[\da-f]/i); return "number"; } else if (ch == "." && stream.eat(/\d/)) { stream.match(/\d*(?:e[+\-]?\d+)?/); return "number"; } else if (/\d/.test(ch)) { stream.match(/\d*(?:\.\d+)?(?:e[+\-]\d+)?L?/); return "number"; } else if (ch == "'" || ch == '"') { state.tokenize = tokenString(ch); return "string"; } else if (ch == "." && stream.match(/.[.\d]+/)) { return "keyword"; } else if (/[\w\.]/.test(ch) && ch != "_") { stream.eatWhile(/[\w\.]/); var word = stream.current(); if (atoms.propertyIsEnumerable(word)) return "atom"; if (keywords.propertyIsEnumerable(word)) { // Block keywords start new blocks, except 'else if', which only starts // one new block for the 'if', no block for the 'else'. if (blockkeywords.propertyIsEnumerable(word) && !stream.match(/\s*if(\s+|$)/, false)) curPunc = "block"; return "keyword"; } if (builtins.propertyIsEnumerable(word)) return "builtin"; return "variable"; } else if (ch == "%") { if (stream.skipTo("%")) stream.next(); return "variable-2"; } else if (ch == "<" && stream.eat("-")) { return "arrow"; } else if (ch == "=" && state.ctx.argList) { return "arg-is"; } else if (opChars.test(ch)) { if (ch == "$") return "dollar"; stream.eatWhile(opChars); return "operator"; } else if (/[\(\){}\[\];]/.test(ch)) { curPunc = ch; if (ch == ";") return "semi"; return null; } else { return null; } } function tokenString(quote) { return function(stream, state) { if (stream.eat("\\")) { var ch = stream.next(); if (ch == "x") stream.match(/^[a-f0-9]{2}/i); else if ((ch == "u" || ch == "U") && stream.eat("{") && stream.skipTo("}")) stream.next(); else if (ch == "u") stream.match(/^[a-f0-9]{4}/i); else if (ch == "U") stream.match(/^[a-f0-9]{8}/i); else if (/[0-7]/.test(ch)) stream.match(/^[0-7]{1,2}/); return "string-2"; } else { var next; while ((next = stream.next()) != null) { if (next == quote) { state.tokenize = tokenBase; break; } if (next == "\\") { stream.backUp(1); break; } } return "string"; } }; } function push(state, type, stream) { state.ctx = {type: type, indent: state.indent, align: null, column: stream.column(), prev: state.ctx}; } function pop(state) { state.indent = state.ctx.indent; state.ctx = state.ctx.prev; } return { startState: function() { return {tokenize: tokenBase, ctx: {type: "top", indent: -config.indentUnit, align: false}, indent: 0, afterIdent: false}; }, token: function(stream, state) { if (stream.sol()) { if (state.ctx.align == null) state.ctx.align = false; state.indent = stream.indentation(); } if (stream.eatSpace()) return null; var style = state.tokenize(stream, state); if (style != "comment" && state.ctx.align == null) state.ctx.align = true; var ctype = state.ctx.type; if ((curPunc == ";" || curPunc == "{" || curPunc == "}") && ctype == "block") pop(state); if (curPunc == "{") push(state, "}", stream); else if (curPunc == "(") { push(state, ")", stream); if (state.afterIdent) state.ctx.argList = true; } else if (curPunc == "[") push(state, "]", stream); else if (curPunc == "block") push(state, "block", stream); else if (curPunc == ctype) pop(state); state.afterIdent = style == "variable" || style == "keyword"; return style; }, indent: function(state, textAfter) { if (state.tokenize != tokenBase) return 0; var firstChar = textAfter && textAfter.charAt(0), ctx = state.ctx, closing = firstChar == ctx.type; if (ctx.type == "block") return ctx.indent + (firstChar == "{" ? 0 : config.indentUnit); else if (ctx.align) return ctx.column + (closing ? 0 : 1); else return ctx.indent + (closing ? 0 : config.indentUnit); }, lineComment: "#" }; }); CodeMirror.defineMIME("text/x-rsrc", "r"); }); ================================================ FILE: base/res/codemirror/mode/rpm/changes/index.html ================================================ CodeMirror: RPM changes mode

RPM changes mode

MIME types defined: text/x-rpm-changes.

================================================ FILE: base/res/codemirror/mode/rpm/index.html ================================================ CodeMirror: RPM changes mode

RPM changes mode

RPM spec mode

MIME types defined: text/x-rpm-spec, text/x-rpm-changes.

================================================ FILE: base/res/codemirror/mode/rpm/rpm.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("rpm-changes", function() { var headerSeperator = /^-+$/; var headerLine = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ?\d{1,2} \d{2}:\d{2}(:\d{2})? [A-Z]{3,4} \d{4} - /; var simpleEmail = /^[\w+.-]+@[\w.-]+/; return { token: function(stream) { if (stream.sol()) { if (stream.match(headerSeperator)) { return 'tag'; } if (stream.match(headerLine)) { return 'tag'; } } if (stream.match(simpleEmail)) { return 'string'; } stream.next(); return null; } }; }); CodeMirror.defineMIME("text/x-rpm-changes", "rpm-changes"); // Quick and dirty spec file highlighting CodeMirror.defineMode("rpm-spec", function() { var arch = /^(i386|i586|i686|x86_64|ppc64|ppc|ia64|s390x|s390|sparc64|sparcv9|sparc|noarch|alphaev6|alpha|hppa|mipsel)/; var preamble = /^(Name|Version|Release|License|Summary|Url|Group|Source|BuildArch|BuildRequires|BuildRoot|AutoReqProv|Provides|Requires(\(\w+\))?|Obsoletes|Conflicts|Recommends|Source\d*|Patch\d*|ExclusiveArch|NoSource|Supplements):/; var section = /^%(debug_package|package|description|prep|build|install|files|clean|changelog|preinstall|preun|postinstall|postun|pre|post|triggerin|triggerun|pretrans|posttrans|verifyscript|check|triggerpostun|triggerprein|trigger)/; var control_flow_complex = /^%(ifnarch|ifarch|if)/; // rpm control flow macros var control_flow_simple = /^%(else|endif)/; // rpm control flow macros var operators = /^(\!|\?|\<\=|\<|\>\=|\>|\=\=|\&\&|\|\|)/; // operators in control flow macros return { startState: function () { return { controlFlow: false, macroParameters: false, section: false }; }, token: function (stream, state) { var ch = stream.peek(); if (ch == "#") { stream.skipToEnd(); return "comment"; } if (stream.sol()) { if (stream.match(preamble)) { return "preamble"; } if (stream.match(section)) { return "section"; } } if (stream.match(/^\$\w+/)) { return "def"; } // Variables like '$RPM_BUILD_ROOT' if (stream.match(/^\$\{\w+\}/)) { return "def"; } // Variables like '${RPM_BUILD_ROOT}' if (stream.match(control_flow_simple)) { return "keyword"; } if (stream.match(control_flow_complex)) { state.controlFlow = true; return "keyword"; } if (state.controlFlow) { if (stream.match(operators)) { return "operator"; } if (stream.match(/^(\d+)/)) { return "number"; } if (stream.eol()) { state.controlFlow = false; } } if (stream.match(arch)) { return "number"; } // Macros like '%make_install' or '%attr(0775,root,root)' if (stream.match(/^%[\w]+/)) { if (stream.match(/^\(/)) { state.macroParameters = true; } return "macro"; } if (state.macroParameters) { if (stream.match(/^\d+/)) { return "number";} if (stream.match(/^\)/)) { state.macroParameters = false; return "macro"; } } if (stream.match(/^%\{\??[\w \-]+\}/)) { return "macro"; } // Macros like '%{defined fedora}' //TODO: Include bash script sub-parser (CodeMirror supports that) stream.next(); return null; } }; }); CodeMirror.defineMIME("text/x-rpm-spec", "rpm-spec"); }); ================================================ FILE: base/res/codemirror/mode/rst/index.html ================================================ CodeMirror: reStructuredText mode

reStructuredText mode

The python mode will be used for highlighting blocks containing Python/IPython terminal sessions: blocks starting with >>> (for Python) or In [num]: (for IPython). Further, the stex mode will be used for highlighting blocks containing LaTex code.

MIME types defined: text/x-rst.

================================================ FILE: base/res/codemirror/mode/rst/rst.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../python/python"), require("../stex/stex"), require("../../addon/mode/overlay")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../python/python", "../stex/stex", "../../addon/mode/overlay"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode('rst', function (config, options) { var rx_strong = /^\*\*[^\*\s](?:[^\*]*[^\*\s])?\*\*/; var rx_emphasis = /^\*[^\*\s](?:[^\*]*[^\*\s])?\*/; var rx_literal = /^``[^`\s](?:[^`]*[^`\s])``/; var rx_number = /^(?:[\d]+(?:[\.,]\d+)*)/; var rx_positive = /^(?:\s\+[\d]+(?:[\.,]\d+)*)/; var rx_negative = /^(?:\s\-[\d]+(?:[\.,]\d+)*)/; var rx_uri_protocol = "[Hh][Tt][Tt][Pp][Ss]?://"; var rx_uri_domain = "(?:[\\d\\w.-]+)\\.(?:\\w{2,6})"; var rx_uri_path = "(?:/[\\d\\w\\#\\%\\&\\-\\.\\,\\/\\:\\=\\?\\~]+)*"; var rx_uri = new RegExp("^" + rx_uri_protocol + rx_uri_domain + rx_uri_path); var overlay = { token: function (stream) { if (stream.match(rx_strong) && stream.match (/\W+|$/, false)) return 'strong'; if (stream.match(rx_emphasis) && stream.match (/\W+|$/, false)) return 'em'; if (stream.match(rx_literal) && stream.match (/\W+|$/, false)) return 'string-2'; if (stream.match(rx_number)) return 'number'; if (stream.match(rx_positive)) return 'positive'; if (stream.match(rx_negative)) return 'negative'; if (stream.match(rx_uri)) return 'link'; while (stream.next() != null) { if (stream.match(rx_strong, false)) break; if (stream.match(rx_emphasis, false)) break; if (stream.match(rx_literal, false)) break; if (stream.match(rx_number, false)) break; if (stream.match(rx_positive, false)) break; if (stream.match(rx_negative, false)) break; if (stream.match(rx_uri, false)) break; } return null; } }; var mode = CodeMirror.getMode( config, options.backdrop || 'rst-base' ); return CodeMirror.overlayMode(mode, overlay, true); // combine }, 'python', 'stex'); /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// CodeMirror.defineMode('rst-base', function (config) { /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// function format(string) { var args = Array.prototype.slice.call(arguments, 1); return string.replace(/{(\d+)}/g, function (match, n) { return typeof args[n] != 'undefined' ? args[n] : match; }); } /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// var mode_python = CodeMirror.getMode(config, 'python'); var mode_stex = CodeMirror.getMode(config, 'stex'); /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// var SEPA = "\\s+"; var TAIL = "(?:\\s*|\\W|$)", rx_TAIL = new RegExp(format('^{0}', TAIL)); var NAME = "(?:[^\\W\\d_](?:[\\w!\"#$%&'()\\*\\+,\\-\\.\/:;<=>\\?]*[^\\W_])?)", rx_NAME = new RegExp(format('^{0}', NAME)); var NAME_WWS = "(?:[^\\W\\d_](?:[\\w\\s!\"#$%&'()\\*\\+,\\-\\.\/:;<=>\\?]*[^\\W_])?)"; var REF_NAME = format('(?:{0}|`{1}`)', NAME, NAME_WWS); var TEXT1 = "(?:[^\\s\\|](?:[^\\|]*[^\\s\\|])?)"; var TEXT2 = "(?:[^\\`]+)", rx_TEXT2 = new RegExp(format('^{0}', TEXT2)); var rx_section = new RegExp( "^([!'#$%&\"()*+,-./:;<=>?@\\[\\\\\\]^_`{|}~])\\1{3,}\\s*$"); var rx_explicit = new RegExp( format('^\\.\\.{0}', SEPA)); var rx_link = new RegExp( format('^_{0}:{1}|^__:{1}', REF_NAME, TAIL)); var rx_directive = new RegExp( format('^{0}::{1}', REF_NAME, TAIL)); var rx_substitution = new RegExp( format('^\\|{0}\\|{1}{2}::{3}', TEXT1, SEPA, REF_NAME, TAIL)); var rx_footnote = new RegExp( format('^\\[(?:\\d+|#{0}?|\\*)]{1}', REF_NAME, TAIL)); var rx_citation = new RegExp( format('^\\[{0}\\]{1}', REF_NAME, TAIL)); var rx_substitution_ref = new RegExp( format('^\\|{0}\\|', TEXT1)); var rx_footnote_ref = new RegExp( format('^\\[(?:\\d+|#{0}?|\\*)]_', REF_NAME)); var rx_citation_ref = new RegExp( format('^\\[{0}\\]_', REF_NAME)); var rx_link_ref1 = new RegExp( format('^{0}__?', REF_NAME)); var rx_link_ref2 = new RegExp( format('^`{0}`_', TEXT2)); var rx_role_pre = new RegExp( format('^:{0}:`{1}`{2}', NAME, TEXT2, TAIL)); var rx_role_suf = new RegExp( format('^`{1}`:{0}:{2}', NAME, TEXT2, TAIL)); var rx_role = new RegExp( format('^:{0}:{1}', NAME, TAIL)); var rx_directive_name = new RegExp(format('^{0}', REF_NAME)); var rx_directive_tail = new RegExp(format('^::{0}', TAIL)); var rx_substitution_text = new RegExp(format('^\\|{0}\\|', TEXT1)); var rx_substitution_sepa = new RegExp(format('^{0}', SEPA)); var rx_substitution_name = new RegExp(format('^{0}', REF_NAME)); var rx_substitution_tail = new RegExp(format('^::{0}', TAIL)); var rx_link_head = new RegExp("^_"); var rx_link_name = new RegExp(format('^{0}|_', REF_NAME)); var rx_link_tail = new RegExp(format('^:{0}', TAIL)); var rx_verbatim = new RegExp('^::\\s*$'); var rx_examples = new RegExp('^\\s+(?:>>>|In \\[\\d+\\]:)\\s'); /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// function to_normal(stream, state) { var token = null; if (stream.sol() && stream.match(rx_examples, false)) { change(state, to_mode, { mode: mode_python, local: CodeMirror.startState(mode_python) }); } else if (stream.sol() && stream.match(rx_explicit)) { change(state, to_explicit); token = 'meta'; } else if (stream.sol() && stream.match(rx_section)) { change(state, to_normal); token = 'header'; } else if (phase(state) == rx_role_pre || stream.match(rx_role_pre, false)) { switch (stage(state)) { case 0: change(state, to_normal, context(rx_role_pre, 1)); stream.match(/^:/); token = 'meta'; break; case 1: change(state, to_normal, context(rx_role_pre, 2)); stream.match(rx_NAME); token = 'keyword'; if (stream.current().match(/^(?:math|latex)/)) { state.tmp_stex = true; } break; case 2: change(state, to_normal, context(rx_role_pre, 3)); stream.match(/^:`/); token = 'meta'; break; case 3: if (state.tmp_stex) { state.tmp_stex = undefined; state.tmp = { mode: mode_stex, local: CodeMirror.startState(mode_stex) }; } if (state.tmp) { if (stream.peek() == '`') { change(state, to_normal, context(rx_role_pre, 4)); state.tmp = undefined; break; } token = state.tmp.mode.token(stream, state.tmp.local); break; } change(state, to_normal, context(rx_role_pre, 4)); stream.match(rx_TEXT2); token = 'string'; break; case 4: change(state, to_normal, context(rx_role_pre, 5)); stream.match(/^`/); token = 'meta'; break; case 5: change(state, to_normal, context(rx_role_pre, 6)); stream.match(rx_TAIL); break; default: change(state, to_normal); } } else if (phase(state) == rx_role_suf || stream.match(rx_role_suf, false)) { switch (stage(state)) { case 0: change(state, to_normal, context(rx_role_suf, 1)); stream.match(/^`/); token = 'meta'; break; case 1: change(state, to_normal, context(rx_role_suf, 2)); stream.match(rx_TEXT2); token = 'string'; break; case 2: change(state, to_normal, context(rx_role_suf, 3)); stream.match(/^`:/); token = 'meta'; break; case 3: change(state, to_normal, context(rx_role_suf, 4)); stream.match(rx_NAME); token = 'keyword'; break; case 4: change(state, to_normal, context(rx_role_suf, 5)); stream.match(/^:/); token = 'meta'; break; case 5: change(state, to_normal, context(rx_role_suf, 6)); stream.match(rx_TAIL); break; default: change(state, to_normal); } } else if (phase(state) == rx_role || stream.match(rx_role, false)) { switch (stage(state)) { case 0: change(state, to_normal, context(rx_role, 1)); stream.match(/^:/); token = 'meta'; break; case 1: change(state, to_normal, context(rx_role, 2)); stream.match(rx_NAME); token = 'keyword'; break; case 2: change(state, to_normal, context(rx_role, 3)); stream.match(/^:/); token = 'meta'; break; case 3: change(state, to_normal, context(rx_role, 4)); stream.match(rx_TAIL); break; default: change(state, to_normal); } } else if (phase(state) == rx_substitution_ref || stream.match(rx_substitution_ref, false)) { switch (stage(state)) { case 0: change(state, to_normal, context(rx_substitution_ref, 1)); stream.match(rx_substitution_text); token = 'variable-2'; break; case 1: change(state, to_normal, context(rx_substitution_ref, 2)); if (stream.match(/^_?_?/)) token = 'link'; break; default: change(state, to_normal); } } else if (stream.match(rx_footnote_ref)) { change(state, to_normal); token = 'quote'; } else if (stream.match(rx_citation_ref)) { change(state, to_normal); token = 'quote'; } else if (stream.match(rx_link_ref1)) { change(state, to_normal); if (!stream.peek() || stream.peek().match(/^\W$/)) { token = 'link'; } } else if (phase(state) == rx_link_ref2 || stream.match(rx_link_ref2, false)) { switch (stage(state)) { case 0: if (!stream.peek() || stream.peek().match(/^\W$/)) { change(state, to_normal, context(rx_link_ref2, 1)); } else { stream.match(rx_link_ref2); } break; case 1: change(state, to_normal, context(rx_link_ref2, 2)); stream.match(/^`/); token = 'link'; break; case 2: change(state, to_normal, context(rx_link_ref2, 3)); stream.match(rx_TEXT2); break; case 3: change(state, to_normal, context(rx_link_ref2, 4)); stream.match(/^`_/); token = 'link'; break; default: change(state, to_normal); } } else if (stream.match(rx_verbatim)) { change(state, to_verbatim); } else { if (stream.next()) change(state, to_normal); } return token; } /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// function to_explicit(stream, state) { var token = null; if (phase(state) == rx_substitution || stream.match(rx_substitution, false)) { switch (stage(state)) { case 0: change(state, to_explicit, context(rx_substitution, 1)); stream.match(rx_substitution_text); token = 'variable-2'; break; case 1: change(state, to_explicit, context(rx_substitution, 2)); stream.match(rx_substitution_sepa); break; case 2: change(state, to_explicit, context(rx_substitution, 3)); stream.match(rx_substitution_name); token = 'keyword'; break; case 3: change(state, to_explicit, context(rx_substitution, 4)); stream.match(rx_substitution_tail); token = 'meta'; break; default: change(state, to_normal); } } else if (phase(state) == rx_directive || stream.match(rx_directive, false)) { switch (stage(state)) { case 0: change(state, to_explicit, context(rx_directive, 1)); stream.match(rx_directive_name); token = 'keyword'; if (stream.current().match(/^(?:math|latex)/)) state.tmp_stex = true; else if (stream.current().match(/^python/)) state.tmp_py = true; break; case 1: change(state, to_explicit, context(rx_directive, 2)); stream.match(rx_directive_tail); token = 'meta'; if (stream.match(/^latex\s*$/) || state.tmp_stex) { state.tmp_stex = undefined; change(state, to_mode, { mode: mode_stex, local: CodeMirror.startState(mode_stex) }); } break; case 2: change(state, to_explicit, context(rx_directive, 3)); if (stream.match(/^python\s*$/) || state.tmp_py) { state.tmp_py = undefined; change(state, to_mode, { mode: mode_python, local: CodeMirror.startState(mode_python) }); } break; default: change(state, to_normal); } } else if (phase(state) == rx_link || stream.match(rx_link, false)) { switch (stage(state)) { case 0: change(state, to_explicit, context(rx_link, 1)); stream.match(rx_link_head); stream.match(rx_link_name); token = 'link'; break; case 1: change(state, to_explicit, context(rx_link, 2)); stream.match(rx_link_tail); token = 'meta'; break; default: change(state, to_normal); } } else if (stream.match(rx_footnote)) { change(state, to_normal); token = 'quote'; } else if (stream.match(rx_citation)) { change(state, to_normal); token = 'quote'; } else { stream.eatSpace(); if (stream.eol()) { change(state, to_normal); } else { stream.skipToEnd(); change(state, to_comment); token = 'comment'; } } return token; } /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// function to_comment(stream, state) { return as_block(stream, state, 'comment'); } function to_verbatim(stream, state) { return as_block(stream, state, 'meta'); } function as_block(stream, state, token) { if (stream.eol() || stream.eatSpace()) { stream.skipToEnd(); return token; } else { change(state, to_normal); return null; } } /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// function to_mode(stream, state) { if (state.ctx.mode && state.ctx.local) { if (stream.sol()) { if (!stream.eatSpace()) change(state, to_normal); return null; } return state.ctx.mode.token(stream, state.ctx.local); } change(state, to_normal); return null; } /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// function context(phase, stage, mode, local) { return {phase: phase, stage: stage, mode: mode, local: local}; } function change(state, tok, ctx) { state.tok = tok; state.ctx = ctx || {}; } function stage(state) { return state.ctx.stage || 0; } function phase(state) { return state.ctx.phase; } /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// return { startState: function () { return {tok: to_normal, ctx: context(undefined, 0)}; }, copyState: function (state) { var ctx = state.ctx, tmp = state.tmp; if (ctx.local) ctx = {mode: ctx.mode, local: CodeMirror.copyState(ctx.mode, ctx.local)}; if (tmp) tmp = {mode: tmp.mode, local: CodeMirror.copyState(tmp.mode, tmp.local)}; return {tok: state.tok, ctx: ctx, tmp: tmp}; }, innerMode: function (state) { return state.tmp ? {state: state.tmp.local, mode: state.tmp.mode} : state.ctx.mode ? {state: state.ctx.local, mode: state.ctx.mode} : null; }, token: function (stream, state) { return state.tok(stream, state); } }; }, 'python', 'stex'); /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// CodeMirror.defineMIME('text/x-rst', 'rst'); /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// }); ================================================ FILE: base/res/codemirror/mode/ruby/index.html ================================================ CodeMirror: Ruby mode

Ruby mode

MIME types defined: text/x-ruby.

Development of the CodeMirror Ruby mode was kindly sponsored by Ubalo.

================================================ FILE: base/res/codemirror/mode/ruby/ruby.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("ruby", function(config) { function wordObj(words) { var o = {}; for (var i = 0, e = words.length; i < e; ++i) o[words[i]] = true; return o; } var keywords = wordObj([ "alias", "and", "BEGIN", "begin", "break", "case", "class", "def", "defined?", "do", "else", "elsif", "END", "end", "ensure", "false", "for", "if", "in", "module", "next", "not", "or", "redo", "rescue", "retry", "return", "self", "super", "then", "true", "undef", "unless", "until", "when", "while", "yield", "nil", "raise", "throw", "catch", "fail", "loop", "callcc", "caller", "lambda", "proc", "public", "protected", "private", "require", "load", "require_relative", "extend", "autoload", "__END__", "__FILE__", "__LINE__", "__dir__" ]); var indentWords = wordObj(["def", "class", "case", "for", "while", "module", "then", "catch", "loop", "proc", "begin"]); var dedentWords = wordObj(["end", "until"]); var matching = {"[": "]", "{": "}", "(": ")"}; var curPunc; function chain(newtok, stream, state) { state.tokenize.push(newtok); return newtok(stream, state); } function tokenBase(stream, state) { curPunc = null; if (stream.sol() && stream.match("=begin") && stream.eol()) { state.tokenize.push(readBlockComment); return "comment"; } if (stream.eatSpace()) return null; var ch = stream.next(), m; if (ch == "`" || ch == "'" || ch == '"') { return chain(readQuoted(ch, "string", ch == '"' || ch == "`"), stream, state); } else if (ch == "/") { var currentIndex = stream.current().length; if (stream.skipTo("/")) { var search_till = stream.current().length; stream.backUp(stream.current().length - currentIndex); var balance = 0; // balance brackets while (stream.current().length < search_till) { var chchr = stream.next(); if (chchr == "(") balance += 1; else if (chchr == ")") balance -= 1; if (balance < 0) break; } stream.backUp(stream.current().length - currentIndex); if (balance == 0) return chain(readQuoted(ch, "string-2", true), stream, state); } return "operator"; } else if (ch == "%") { var style = "string", embed = true; if (stream.eat("s")) style = "atom"; else if (stream.eat(/[WQ]/)) style = "string"; else if (stream.eat(/[r]/)) style = "string-2"; else if (stream.eat(/[wxq]/)) { style = "string"; embed = false; } var delim = stream.eat(/[^\w\s=]/); if (!delim) return "operator"; if (matching.propertyIsEnumerable(delim)) delim = matching[delim]; return chain(readQuoted(delim, style, embed, true), stream, state); } else if (ch == "#") { stream.skipToEnd(); return "comment"; } else if (ch == "<" && (m = stream.match(/^<-?[\`\"\']?([a-zA-Z_?]\w*)[\`\"\']?(?:;|$)/))) { return chain(readHereDoc(m[1]), stream, state); } else if (ch == "0") { if (stream.eat("x")) stream.eatWhile(/[\da-fA-F]/); else if (stream.eat("b")) stream.eatWhile(/[01]/); else stream.eatWhile(/[0-7]/); return "number"; } else if (/\d/.test(ch)) { stream.match(/^[\d_]*(?:\.[\d_]+)?(?:[eE][+\-]?[\d_]+)?/); return "number"; } else if (ch == "?") { while (stream.match(/^\\[CM]-/)) {} if (stream.eat("\\")) stream.eatWhile(/\w/); else stream.next(); return "string"; } else if (ch == ":") { if (stream.eat("'")) return chain(readQuoted("'", "atom", false), stream, state); if (stream.eat('"')) return chain(readQuoted('"', "atom", true), stream, state); // :> :>> :< :<< are valid symbols if (stream.eat(/[\<\>]/)) { stream.eat(/[\<\>]/); return "atom"; } // :+ :- :/ :* :| :& :! are valid symbols if (stream.eat(/[\+\-\*\/\&\|\:\!]/)) { return "atom"; } // Symbols can't start by a digit if (stream.eat(/[a-zA-Z$@_\xa1-\uffff]/)) { stream.eatWhile(/[\w$\xa1-\uffff]/); // Only one ? ! = is allowed and only as the last character stream.eat(/[\?\!\=]/); return "atom"; } return "operator"; } else if (ch == "@" && stream.match(/^@?[a-zA-Z_\xa1-\uffff]/)) { stream.eat("@"); stream.eatWhile(/[\w\xa1-\uffff]/); return "variable-2"; } else if (ch == "$") { if (stream.eat(/[a-zA-Z_]/)) { stream.eatWhile(/[\w]/); } else if (stream.eat(/\d/)) { stream.eat(/\d/); } else { stream.next(); // Must be a special global like $: or $! } return "variable-3"; } else if (/[a-zA-Z_\xa1-\uffff]/.test(ch)) { stream.eatWhile(/[\w\xa1-\uffff]/); stream.eat(/[\?\!]/); if (stream.eat(":")) return "atom"; return "ident"; } else if (ch == "|" && (state.varList || state.lastTok == "{" || state.lastTok == "do")) { curPunc = "|"; return null; } else if (/[\(\)\[\]{}\\;]/.test(ch)) { curPunc = ch; return null; } else if (ch == "-" && stream.eat(">")) { return "arrow"; } else if (/[=+\-\/*:\.^%<>~|]/.test(ch)) { var more = stream.eatWhile(/[=+\-\/*:\.^%<>~|]/); if (ch == "." && !more) curPunc = "."; return "operator"; } else { return null; } } function tokenBaseUntilBrace(depth) { if (!depth) depth = 1; return function(stream, state) { if (stream.peek() == "}") { if (depth == 1) { state.tokenize.pop(); return state.tokenize[state.tokenize.length-1](stream, state); } else { state.tokenize[state.tokenize.length - 1] = tokenBaseUntilBrace(depth - 1); } } else if (stream.peek() == "{") { state.tokenize[state.tokenize.length - 1] = tokenBaseUntilBrace(depth + 1); } return tokenBase(stream, state); }; } function tokenBaseOnce() { var alreadyCalled = false; return function(stream, state) { if (alreadyCalled) { state.tokenize.pop(); return state.tokenize[state.tokenize.length-1](stream, state); } alreadyCalled = true; return tokenBase(stream, state); }; } function readQuoted(quote, style, embed, unescaped) { return function(stream, state) { var escaped = false, ch; if (state.context.type === 'read-quoted-paused') { state.context = state.context.prev; stream.eat("}"); } while ((ch = stream.next()) != null) { if (ch == quote && (unescaped || !escaped)) { state.tokenize.pop(); break; } if (embed && ch == "#" && !escaped) { if (stream.eat("{")) { if (quote == "}") { state.context = {prev: state.context, type: 'read-quoted-paused'}; } state.tokenize.push(tokenBaseUntilBrace()); break; } else if (/[@\$]/.test(stream.peek())) { state.tokenize.push(tokenBaseOnce()); break; } } escaped = !escaped && ch == "\\"; } return style; }; } function readHereDoc(phrase) { return function(stream, state) { if (stream.match(phrase)) state.tokenize.pop(); else stream.skipToEnd(); return "string"; }; } function readBlockComment(stream, state) { if (stream.sol() && stream.match("=end") && stream.eol()) state.tokenize.pop(); stream.skipToEnd(); return "comment"; } return { startState: function() { return {tokenize: [tokenBase], indented: 0, context: {type: "top", indented: -config.indentUnit}, continuedLine: false, lastTok: null, varList: false}; }, token: function(stream, state) { if (stream.sol()) state.indented = stream.indentation(); var style = state.tokenize[state.tokenize.length-1](stream, state), kwtype; var thisTok = curPunc; if (style == "ident") { var word = stream.current(); style = state.lastTok == "." ? "property" : keywords.propertyIsEnumerable(stream.current()) ? "keyword" : /^[A-Z]/.test(word) ? "tag" : (state.lastTok == "def" || state.lastTok == "class" || state.varList) ? "def" : "variable"; if (style == "keyword") { thisTok = word; if (indentWords.propertyIsEnumerable(word)) kwtype = "indent"; else if (dedentWords.propertyIsEnumerable(word)) kwtype = "dedent"; else if ((word == "if" || word == "unless") && stream.column() == stream.indentation()) kwtype = "indent"; else if (word == "do" && state.context.indented < state.indented) kwtype = "indent"; } } if (curPunc || (style && style != "comment")) state.lastTok = thisTok; if (curPunc == "|") state.varList = !state.varList; if (kwtype == "indent" || /[\(\[\{]/.test(curPunc)) state.context = {prev: state.context, type: curPunc || style, indented: state.indented}; else if ((kwtype == "dedent" || /[\)\]\}]/.test(curPunc)) && state.context.prev) state.context = state.context.prev; if (stream.eol()) state.continuedLine = (curPunc == "\\" || style == "operator"); return style; }, indent: function(state, textAfter) { if (state.tokenize[state.tokenize.length-1] != tokenBase) return 0; var firstChar = textAfter && textAfter.charAt(0); var ct = state.context; var closing = ct.type == matching[firstChar] || ct.type == "keyword" && /^(?:end|until|else|elsif|when|rescue)\b/.test(textAfter); return ct.indented + (closing ? 0 : config.indentUnit) + (state.continuedLine ? config.indentUnit : 0); }, electricChars: "}de", // enD and rescuE lineComment: "#" }; }); CodeMirror.defineMIME("text/x-ruby", "ruby"); }); ================================================ FILE: base/res/codemirror/mode/ruby/test.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({indentUnit: 2}, "ruby"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } MT("divide_equal_operator", "[variable bar] [operator /=] [variable foo]"); MT("divide_equal_operator_no_spacing", "[variable foo][operator /=][number 42]"); })(); ================================================ FILE: base/res/codemirror/mode/rust/index.html ================================================ CodeMirror: Rust mode

Rust mode

MIME types defined: text/x-rustsrc.

================================================ FILE: base/res/codemirror/mode/rust/rust.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("rust", function() { var indentUnit = 4, altIndentUnit = 2; var valKeywords = { "if": "if-style", "while": "if-style", "loop": "else-style", "else": "else-style", "do": "else-style", "ret": "else-style", "fail": "else-style", "break": "atom", "cont": "atom", "const": "let", "resource": "fn", "let": "let", "fn": "fn", "for": "for", "alt": "alt", "iface": "iface", "impl": "impl", "type": "type", "enum": "enum", "mod": "mod", "as": "op", "true": "atom", "false": "atom", "assert": "op", "check": "op", "claim": "op", "native": "ignore", "unsafe": "ignore", "import": "else-style", "export": "else-style", "copy": "op", "log": "op", "log_err": "op", "use": "op", "bind": "op", "self": "atom", "struct": "enum" }; var typeKeywords = function() { var keywords = {"fn": "fn", "block": "fn", "obj": "obj"}; var atoms = "bool uint int i8 i16 i32 i64 u8 u16 u32 u64 float f32 f64 str char".split(" "); for (var i = 0, e = atoms.length; i < e; ++i) keywords[atoms[i]] = "atom"; return keywords; }(); var operatorChar = /[+\-*&%=<>!?|\.@]/; // Tokenizer // Used as scratch variable to communicate multiple values without // consing up tons of objects. var tcat, content; function r(tc, style) { tcat = tc; return style; } function tokenBase(stream, state) { var ch = stream.next(); if (ch == '"') { state.tokenize = tokenString; return state.tokenize(stream, state); } if (ch == "'") { tcat = "atom"; if (stream.eat("\\")) { if (stream.skipTo("'")) { stream.next(); return "string"; } else { return "error"; } } else { stream.next(); return stream.eat("'") ? "string" : "error"; } } if (ch == "/") { if (stream.eat("/")) { stream.skipToEnd(); return "comment"; } if (stream.eat("*")) { state.tokenize = tokenComment(1); return state.tokenize(stream, state); } } if (ch == "#") { if (stream.eat("[")) { tcat = "open-attr"; return null; } stream.eatWhile(/\w/); return r("macro", "meta"); } if (ch == ":" && stream.match(":<")) { return r("op", null); } if (ch.match(/\d/) || (ch == "." && stream.eat(/\d/))) { var flp = false; if (!stream.match(/^x[\da-f]+/i) && !stream.match(/^b[01]+/)) { stream.eatWhile(/\d/); if (stream.eat(".")) { flp = true; stream.eatWhile(/\d/); } if (stream.match(/^e[+\-]?\d+/i)) { flp = true; } } if (flp) stream.match(/^f(?:32|64)/); else stream.match(/^[ui](?:8|16|32|64)/); return r("atom", "number"); } if (ch.match(/[()\[\]{}:;,]/)) return r(ch, null); if (ch == "-" && stream.eat(">")) return r("->", null); if (ch.match(operatorChar)) { stream.eatWhile(operatorChar); return r("op", null); } stream.eatWhile(/\w/); content = stream.current(); if (stream.match(/^::\w/)) { stream.backUp(1); return r("prefix", "variable-2"); } if (state.keywords.propertyIsEnumerable(content)) return r(state.keywords[content], content.match(/true|false/) ? "atom" : "keyword"); return r("name", "variable"); } function tokenString(stream, state) { var ch, escaped = false; while (ch = stream.next()) { if (ch == '"' && !escaped) { state.tokenize = tokenBase; return r("atom", "string"); } escaped = !escaped && ch == "\\"; } // Hack to not confuse the parser when a string is split in // pieces. return r("op", "string"); } function tokenComment(depth) { return function(stream, state) { var lastCh = null, ch; while (ch = stream.next()) { if (ch == "/" && lastCh == "*") { if (depth == 1) { state.tokenize = tokenBase; break; } else { state.tokenize = tokenComment(depth - 1); return state.tokenize(stream, state); } } if (ch == "*" && lastCh == "/") { state.tokenize = tokenComment(depth + 1); return state.tokenize(stream, state); } lastCh = ch; } return "comment"; }; } // Parser var cx = {state: null, stream: null, marked: null, cc: null}; function pass() { for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]); } function cont() { pass.apply(null, arguments); return true; } function pushlex(type, info) { var result = function() { var state = cx.state; state.lexical = {indented: state.indented, column: cx.stream.column(), type: type, prev: state.lexical, info: info}; }; result.lex = true; return result; } function poplex() { var state = cx.state; if (state.lexical.prev) { if (state.lexical.type == ")") state.indented = state.lexical.indented; state.lexical = state.lexical.prev; } } function typecx() { cx.state.keywords = typeKeywords; } function valcx() { cx.state.keywords = valKeywords; } poplex.lex = typecx.lex = valcx.lex = true; function commasep(comb, end) { function more(type) { if (type == ",") return cont(comb, more); if (type == end) return cont(); return cont(more); } return function(type) { if (type == end) return cont(); return pass(comb, more); }; } function stat_of(comb, tag) { return cont(pushlex("stat", tag), comb, poplex, block); } function block(type) { if (type == "}") return cont(); if (type == "let") return stat_of(letdef1, "let"); if (type == "fn") return stat_of(fndef); if (type == "type") return cont(pushlex("stat"), tydef, endstatement, poplex, block); if (type == "enum") return stat_of(enumdef); if (type == "mod") return stat_of(mod); if (type == "iface") return stat_of(iface); if (type == "impl") return stat_of(impl); if (type == "open-attr") return cont(pushlex("]"), commasep(expression, "]"), poplex); if (type == "ignore" || type.match(/[\]\);,]/)) return cont(block); return pass(pushlex("stat"), expression, poplex, endstatement, block); } function endstatement(type) { if (type == ";") return cont(); return pass(); } function expression(type) { if (type == "atom" || type == "name") return cont(maybeop); if (type == "{") return cont(pushlex("}"), exprbrace, poplex); if (type.match(/[\[\(]/)) return matchBrackets(type, expression); if (type.match(/[\]\)\};,]/)) return pass(); if (type == "if-style") return cont(expression, expression); if (type == "else-style" || type == "op") return cont(expression); if (type == "for") return cont(pattern, maybetype, inop, expression, expression); if (type == "alt") return cont(expression, altbody); if (type == "fn") return cont(fndef); if (type == "macro") return cont(macro); return cont(); } function maybeop(type) { if (content == ".") return cont(maybeprop); if (content == "::<"){return cont(typarams, maybeop);} if (type == "op" || content == ":") return cont(expression); if (type == "(" || type == "[") return matchBrackets(type, expression); return pass(); } function maybeprop() { if (content.match(/^\w+$/)) {cx.marked = "variable"; return cont(maybeop);} return pass(expression); } function exprbrace(type) { if (type == "op") { if (content == "|") return cont(blockvars, poplex, pushlex("}", "block"), block); if (content == "||") return cont(poplex, pushlex("}", "block"), block); } if (content == "mutable" || (content.match(/^\w+$/) && cx.stream.peek() == ":" && !cx.stream.match("::", false))) return pass(record_of(expression)); return pass(block); } function record_of(comb) { function ro(type) { if (content == "mutable" || content == "with") {cx.marked = "keyword"; return cont(ro);} if (content.match(/^\w*$/)) {cx.marked = "variable"; return cont(ro);} if (type == ":") return cont(comb, ro); if (type == "}") return cont(); return cont(ro); } return ro; } function blockvars(type) { if (type == "name") {cx.marked = "def"; return cont(blockvars);} if (type == "op" && content == "|") return cont(); return cont(blockvars); } function letdef1(type) { if (type.match(/[\]\)\};]/)) return cont(); if (content == "=") return cont(expression, letdef2); if (type == ",") return cont(letdef1); return pass(pattern, maybetype, letdef1); } function letdef2(type) { if (type.match(/[\]\)\};,]/)) return pass(letdef1); else return pass(expression, letdef2); } function maybetype(type) { if (type == ":") return cont(typecx, rtype, valcx); return pass(); } function inop(type) { if (type == "name" && content == "in") {cx.marked = "keyword"; return cont();} return pass(); } function fndef(type) { if (content == "@" || content == "~") {cx.marked = "keyword"; return cont(fndef);} if (type == "name") {cx.marked = "def"; return cont(fndef);} if (content == "<") return cont(typarams, fndef); if (type == "{") return pass(expression); if (type == "(") return cont(pushlex(")"), commasep(argdef, ")"), poplex, fndef); if (type == "->") return cont(typecx, rtype, valcx, fndef); if (type == ";") return cont(); return cont(fndef); } function tydef(type) { if (type == "name") {cx.marked = "def"; return cont(tydef);} if (content == "<") return cont(typarams, tydef); if (content == "=") return cont(typecx, rtype, valcx); return cont(tydef); } function enumdef(type) { if (type == "name") {cx.marked = "def"; return cont(enumdef);} if (content == "<") return cont(typarams, enumdef); if (content == "=") return cont(typecx, rtype, valcx, endstatement); if (type == "{") return cont(pushlex("}"), typecx, enumblock, valcx, poplex); return cont(enumdef); } function enumblock(type) { if (type == "}") return cont(); if (type == "(") return cont(pushlex(")"), commasep(rtype, ")"), poplex, enumblock); if (content.match(/^\w+$/)) cx.marked = "def"; return cont(enumblock); } function mod(type) { if (type == "name") {cx.marked = "def"; return cont(mod);} if (type == "{") return cont(pushlex("}"), block, poplex); return pass(); } function iface(type) { if (type == "name") {cx.marked = "def"; return cont(iface);} if (content == "<") return cont(typarams, iface); if (type == "{") return cont(pushlex("}"), block, poplex); return pass(); } function impl(type) { if (content == "<") return cont(typarams, impl); if (content == "of" || content == "for") {cx.marked = "keyword"; return cont(rtype, impl);} if (type == "name") {cx.marked = "def"; return cont(impl);} if (type == "{") return cont(pushlex("}"), block, poplex); return pass(); } function typarams() { if (content == ">") return cont(); if (content == ",") return cont(typarams); if (content == ":") return cont(rtype, typarams); return pass(rtype, typarams); } function argdef(type) { if (type == "name") {cx.marked = "def"; return cont(argdef);} if (type == ":") return cont(typecx, rtype, valcx); return pass(); } function rtype(type) { if (type == "name") {cx.marked = "variable-3"; return cont(rtypemaybeparam); } if (content == "mutable") {cx.marked = "keyword"; return cont(rtype);} if (type == "atom") return cont(rtypemaybeparam); if (type == "op" || type == "obj") return cont(rtype); if (type == "fn") return cont(fntype); if (type == "{") return cont(pushlex("{"), record_of(rtype), poplex); return matchBrackets(type, rtype); } function rtypemaybeparam() { if (content == "<") return cont(typarams); return pass(); } function fntype(type) { if (type == "(") return cont(pushlex("("), commasep(rtype, ")"), poplex, fntype); if (type == "->") return cont(rtype); return pass(); } function pattern(type) { if (type == "name") {cx.marked = "def"; return cont(patternmaybeop);} if (type == "atom") return cont(patternmaybeop); if (type == "op") return cont(pattern); if (type.match(/[\]\)\};,]/)) return pass(); return matchBrackets(type, pattern); } function patternmaybeop(type) { if (type == "op" && content == ".") return cont(); if (content == "to") {cx.marked = "keyword"; return cont(pattern);} else return pass(); } function altbody(type) { if (type == "{") return cont(pushlex("}", "alt"), altblock1, poplex); return pass(); } function altblock1(type) { if (type == "}") return cont(); if (type == "|") return cont(altblock1); if (content == "when") {cx.marked = "keyword"; return cont(expression, altblock2);} if (type.match(/[\]\);,]/)) return cont(altblock1); return pass(pattern, altblock2); } function altblock2(type) { if (type == "{") return cont(pushlex("}", "alt"), block, poplex, altblock1); else return pass(altblock1); } function macro(type) { if (type.match(/[\[\(\{]/)) return matchBrackets(type, expression); return pass(); } function matchBrackets(type, comb) { if (type == "[") return cont(pushlex("]"), commasep(comb, "]"), poplex); if (type == "(") return cont(pushlex(")"), commasep(comb, ")"), poplex); if (type == "{") return cont(pushlex("}"), commasep(comb, "}"), poplex); return cont(); } function parse(state, stream, style) { var cc = state.cc; // Communicate our context to the combinators. // (Less wasteful than consing up a hundred closures on every call.) cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; while (true) { var combinator = cc.length ? cc.pop() : block; if (combinator(tcat)) { while(cc.length && cc[cc.length - 1].lex) cc.pop()(); return cx.marked || style; } } } return { startState: function() { return { tokenize: tokenBase, cc: [], lexical: {indented: -indentUnit, column: 0, type: "top", align: false}, keywords: valKeywords, indented: 0 }; }, token: function(stream, state) { if (stream.sol()) { if (!state.lexical.hasOwnProperty("align")) state.lexical.align = false; state.indented = stream.indentation(); } if (stream.eatSpace()) return null; tcat = content = null; var style = state.tokenize(stream, state); if (style == "comment") return style; if (!state.lexical.hasOwnProperty("align")) state.lexical.align = true; if (tcat == "prefix") return style; if (!content) content = stream.current(); return parse(state, stream, style); }, indent: function(state, textAfter) { if (state.tokenize != tokenBase) return 0; var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical, type = lexical.type, closing = firstChar == type; if (type == "stat") return lexical.indented + indentUnit; if (lexical.align) return lexical.column + (closing ? 0 : 1); return lexical.indented + (closing ? 0 : (lexical.info == "alt" ? altIndentUnit : indentUnit)); }, electricChars: "{}", blockCommentStart: "/*", blockCommentEnd: "*/", lineComment: "//", fold: "brace" }; }); CodeMirror.defineMIME("text/x-rustsrc", "rust"); }); ================================================ FILE: base/res/codemirror/mode/sass/index.html ================================================ CodeMirror: Sass mode

Sass mode

MIME types defined: text/x-sass.

================================================ FILE: base/res/codemirror/mode/sass/sass.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("sass", function(config) { function tokenRegexp(words) { return new RegExp("^" + words.join("|")); } var keywords = ["true", "false", "null", "auto"]; var keywordsRegexp = new RegExp("^" + keywords.join("|")); var operators = ["\\(", "\\)", "=", ">", "<", "==", ">=", "<=", "\\+", "-", "\\!=", "/", "\\*", "%", "and", "or", "not", ";","\\{","\\}",":"]; var opRegexp = tokenRegexp(operators); var pseudoElementsRegexp = /^::?[a-zA-Z_][\w\-]*/; function urlTokens(stream, state) { var ch = stream.peek(); if (ch === ")") { stream.next(); state.tokenizer = tokenBase; return "operator"; } else if (ch === "(") { stream.next(); stream.eatSpace(); return "operator"; } else if (ch === "'" || ch === '"') { state.tokenizer = buildStringTokenizer(stream.next()); return "string"; } else { state.tokenizer = buildStringTokenizer(")", false); return "string"; } } function comment(indentation, multiLine) { return function(stream, state) { if (stream.sol() && stream.indentation() <= indentation) { state.tokenizer = tokenBase; return tokenBase(stream, state); } if (multiLine && stream.skipTo("*/")) { stream.next(); stream.next(); state.tokenizer = tokenBase; } else { stream.skipToEnd(); } return "comment"; }; } function buildStringTokenizer(quote, greedy) { if (greedy == null) { greedy = true; } function stringTokenizer(stream, state) { var nextChar = stream.next(); var peekChar = stream.peek(); var previousChar = stream.string.charAt(stream.pos-2); var endingString = ((nextChar !== "\\" && peekChar === quote) || (nextChar === quote && previousChar !== "\\")); if (endingString) { if (nextChar !== quote && greedy) { stream.next(); } state.tokenizer = tokenBase; return "string"; } else if (nextChar === "#" && peekChar === "{") { state.tokenizer = buildInterpolationTokenizer(stringTokenizer); stream.next(); return "operator"; } else { return "string"; } } return stringTokenizer; } function buildInterpolationTokenizer(currentTokenizer) { return function(stream, state) { if (stream.peek() === "}") { stream.next(); state.tokenizer = currentTokenizer; return "operator"; } else { return tokenBase(stream, state); } }; } function indent(state) { if (state.indentCount == 0) { state.indentCount++; var lastScopeOffset = state.scopes[0].offset; var currentOffset = lastScopeOffset + config.indentUnit; state.scopes.unshift({ offset:currentOffset }); } } function dedent(state) { if (state.scopes.length == 1) return; state.scopes.shift(); } function tokenBase(stream, state) { var ch = stream.peek(); // Comment if (stream.match("/*")) { state.tokenizer = comment(stream.indentation(), true); return state.tokenizer(stream, state); } if (stream.match("//")) { state.tokenizer = comment(stream.indentation(), false); return state.tokenizer(stream, state); } // Interpolation if (stream.match("#{")) { state.tokenizer = buildInterpolationTokenizer(tokenBase); return "operator"; } // Strings if (ch === '"' || ch === "'") { stream.next(); state.tokenizer = buildStringTokenizer(ch); return "string"; } if(!state.cursorHalf){// state.cursorHalf === 0 // first half i.e. before : for key-value pairs // including selectors if (ch === ".") { stream.next(); if (stream.match(/^[\w-]+/)) { indent(state); return "atom"; } else if (stream.peek() === "#") { indent(state); return "atom"; } } if (ch === "#") { stream.next(); // ID selectors if (stream.match(/^[\w-]+/)) { indent(state); return "atom"; } if (stream.peek() === "#") { indent(state); return "atom"; } } // Variables if (ch === "$") { stream.next(); stream.eatWhile(/[\w-]/); return "variable-2"; } // Numbers if (stream.match(/^-?[0-9\.]+/)) return "number"; // Units if (stream.match(/^(px|em|in)\b/)) return "unit"; if (stream.match(keywordsRegexp)) return "keyword"; if (stream.match(/^url/) && stream.peek() === "(") { state.tokenizer = urlTokens; return "atom"; } if (ch === "=") { // Match shortcut mixin definition if (stream.match(/^=[\w-]+/)) { indent(state); return "meta"; } } if (ch === "+") { // Match shortcut mixin definition if (stream.match(/^\+[\w-]+/)){ return "variable-3"; } } if(ch === "@"){ if(stream.match(/@extend/)){ if(!stream.match(/\s*[\w]/)) dedent(state); } } // Indent Directives if (stream.match(/^@(else if|if|media|else|for|each|while|mixin|function)/)) { indent(state); return "meta"; } // Other Directives if (ch === "@") { stream.next(); stream.eatWhile(/[\w-]/); return "meta"; } if (stream.eatWhile(/[\w-]/)){ if(stream.match(/ *: *[\w-\+\$#!\("']/,false)){ return "property"; } else if(stream.match(/ *:/,false)){ indent(state); state.cursorHalf = 1; return "atom"; } else if(stream.match(/ *,/,false)){ return "atom"; } else{ indent(state); return "atom"; } } if(ch === ":"){ if (stream.match(pseudoElementsRegexp)){ // could be a pseudo-element return "keyword"; } stream.next(); state.cursorHalf=1; return "operator"; } } // cursorHalf===0 ends here else{ if (ch === "#") { stream.next(); // Hex numbers if (stream.match(/[0-9a-fA-F]{6}|[0-9a-fA-F]{3}/)){ if(!stream.peek()){ state.cursorHalf = 0; } return "number"; } } // Numbers if (stream.match(/^-?[0-9\.]+/)){ if(!stream.peek()){ state.cursorHalf = 0; } return "number"; } // Units if (stream.match(/^(px|em|in)\b/)){ if(!stream.peek()){ state.cursorHalf = 0; } return "unit"; } if (stream.match(keywordsRegexp)){ if(!stream.peek()){ state.cursorHalf = 0; } return "keyword"; } if (stream.match(/^url/) && stream.peek() === "(") { state.tokenizer = urlTokens; if(!stream.peek()){ state.cursorHalf = 0; } return "atom"; } // Variables if (ch === "$") { stream.next(); stream.eatWhile(/[\w-]/); if(!stream.peek()){ state.cursorHalf = 0; } return "variable-3"; } // bang character for !important, !default, etc. if (ch === "!") { stream.next(); if(!stream.peek()){ state.cursorHalf = 0; } return stream.match(/^[\w]+/) ? "keyword": "operator"; } if (stream.match(opRegexp)){ if(!stream.peek()){ state.cursorHalf = 0; } return "operator"; } // attributes if (stream.eatWhile(/[\w-]/)) { if(!stream.peek()){ state.cursorHalf = 0; } return "attribute"; } //stream.eatSpace(); if(!stream.peek()){ state.cursorHalf = 0; return null; } } // else ends here if (stream.match(opRegexp)) return "operator"; // If we haven't returned by now, we move 1 character // and return an error stream.next(); return null; } function tokenLexer(stream, state) { if (stream.sol()) state.indentCount = 0; var style = state.tokenizer(stream, state); var current = stream.current(); if (current === "@return" || current === "}"){ dedent(state); } if (style !== null) { var startOfToken = stream.pos - current.length; var withCurrentIndent = startOfToken + (config.indentUnit * state.indentCount); var newScopes = []; for (var i = 0; i < state.scopes.length; i++) { var scope = state.scopes[i]; if (scope.offset <= withCurrentIndent) newScopes.push(scope); } state.scopes = newScopes; } return style; } return { startState: function() { return { tokenizer: tokenBase, scopes: [{offset: 0, type: "sass"}], indentCount: 0, cursorHalf: 0, // cursor half tells us if cursor lies after (1) // or before (0) colon (well... more or less) definedVars: [], definedMixins: [] }; }, token: function(stream, state) { var style = tokenLexer(stream, state); state.lastToken = { style: style, content: stream.current() }; return style; }, indent: function(state) { return state.scopes[0].offset; } }; }); CodeMirror.defineMIME("text/x-sass", "sass"); }); ================================================ FILE: base/res/codemirror/mode/scheme/index.html ================================================ CodeMirror: Scheme mode

Scheme mode

MIME types defined: text/x-scheme.

================================================ FILE: base/res/codemirror/mode/scheme/scheme.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /** * Author: Koh Zi Han, based on implementation by Koh Zi Chun */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("scheme", function () { var BUILTIN = "builtin", COMMENT = "comment", STRING = "string", ATOM = "atom", NUMBER = "number", BRACKET = "bracket"; var INDENT_WORD_SKIP = 2; function makeKeywords(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } var keywords = makeKeywords("λ case-lambda call/cc class define-class exit-handler field import inherit init-field interface let*-values let-values let/ec mixin opt-lambda override protect provide public rename require require-for-syntax syntax syntax-case syntax-error unit/sig unless when with-syntax and begin call-with-current-continuation call-with-input-file call-with-output-file case cond define define-syntax delay do dynamic-wind else for-each if lambda let let* let-syntax letrec letrec-syntax map or syntax-rules abs acos angle append apply asin assoc assq assv atan boolean? caar cadr call-with-input-file call-with-output-file call-with-values car cdddar cddddr cdr ceiling char->integer char-alphabetic? char-ci<=? char-ci=? char-ci>? char-downcase char-lower-case? char-numeric? char-ready? char-upcase char-upper-case? char-whitespace? char<=? char=? char>? char? close-input-port close-output-port complex? cons cos current-input-port current-output-port denominator display eof-object? eq? equal? eqv? eval even? exact->inexact exact? exp expt #f floor force gcd imag-part inexact->exact inexact? input-port? integer->char integer? interaction-environment lcm length list list->string list->vector list-ref list-tail list? load log magnitude make-polar make-rectangular make-string make-vector max member memq memv min modulo negative? newline not null-environment null? number->string number? numerator odd? open-input-file open-output-file output-port? pair? peek-char port? positive? procedure? quasiquote quote quotient rational? rationalize read read-char real-part real? remainder reverse round scheme-report-environment set! set-car! set-cdr! sin sqrt string string->list string->number string->symbol string-append string-ci<=? string-ci=? string-ci>? string-copy string-fill! string-length string-ref string-set! string<=? string=? string>? string? substring symbol->string symbol? #t tan transcript-off transcript-on truncate values vector vector->list vector-fill! vector-length vector-ref vector-set! with-input-from-file with-output-to-file write write-char zero?"); var indentKeys = makeKeywords("define let letrec let* lambda"); function stateStack(indent, type, prev) { // represents a state stack object this.indent = indent; this.type = type; this.prev = prev; } function pushStack(state, indent, type) { state.indentStack = new stateStack(indent, type, state.indentStack); } function popStack(state) { state.indentStack = state.indentStack.prev; } var binaryMatcher = new RegExp(/^(?:[-+]i|[-+][01]+#*(?:\/[01]+#*)?i|[-+]?[01]+#*(?:\/[01]+#*)?@[-+]?[01]+#*(?:\/[01]+#*)?|[-+]?[01]+#*(?:\/[01]+#*)?[-+](?:[01]+#*(?:\/[01]+#*)?)?i|[-+]?[01]+#*(?:\/[01]+#*)?)(?=[()\s;"]|$)/i); var octalMatcher = new RegExp(/^(?:[-+]i|[-+][0-7]+#*(?:\/[0-7]+#*)?i|[-+]?[0-7]+#*(?:\/[0-7]+#*)?@[-+]?[0-7]+#*(?:\/[0-7]+#*)?|[-+]?[0-7]+#*(?:\/[0-7]+#*)?[-+](?:[0-7]+#*(?:\/[0-7]+#*)?)?i|[-+]?[0-7]+#*(?:\/[0-7]+#*)?)(?=[()\s;"]|$)/i); var hexMatcher = new RegExp(/^(?:[-+]i|[-+][\da-f]+#*(?:\/[\da-f]+#*)?i|[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?@[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?|[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?[-+](?:[\da-f]+#*(?:\/[\da-f]+#*)?)?i|[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?)(?=[()\s;"]|$)/i); var decimalMatcher = new RegExp(/^(?:[-+]i|[-+](?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)i|[-+]?(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)@[-+]?(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)|[-+]?(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)[-+](?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)?i|(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*))(?=[()\s;"]|$)/i); function isBinaryNumber (stream) { return stream.match(binaryMatcher); } function isOctalNumber (stream) { return stream.match(octalMatcher); } function isDecimalNumber (stream, backup) { if (backup === true) { stream.backUp(1); } return stream.match(decimalMatcher); } function isHexNumber (stream) { return stream.match(hexMatcher); } return { startState: function () { return { indentStack: null, indentation: 0, mode: false, sExprComment: false }; }, token: function (stream, state) { if (state.indentStack == null && stream.sol()) { // update indentation, but only if indentStack is empty state.indentation = stream.indentation(); } // skip spaces if (stream.eatSpace()) { return null; } var returnType = null; switch(state.mode){ case "string": // multi-line string parsing mode var next, escaped = false; while ((next = stream.next()) != null) { if (next == "\"" && !escaped) { state.mode = false; break; } escaped = !escaped && next == "\\"; } returnType = STRING; // continue on in scheme-string mode break; case "comment": // comment parsing mode var next, maybeEnd = false; while ((next = stream.next()) != null) { if (next == "#" && maybeEnd) { state.mode = false; break; } maybeEnd = (next == "|"); } returnType = COMMENT; break; case "s-expr-comment": // s-expr commenting mode state.mode = false; if(stream.peek() == "(" || stream.peek() == "["){ // actually start scheme s-expr commenting mode state.sExprComment = 0; }else{ // if not we just comment the entire of the next token stream.eatWhile(/[^/s]/); // eat non spaces returnType = COMMENT; break; } default: // default parsing mode var ch = stream.next(); if (ch == "\"") { state.mode = "string"; returnType = STRING; } else if (ch == "'") { returnType = ATOM; } else if (ch == '#') { if (stream.eat("|")) { // Multi-line comment state.mode = "comment"; // toggle to comment mode returnType = COMMENT; } else if (stream.eat(/[tf]/i)) { // #t/#f (atom) returnType = ATOM; } else if (stream.eat(';')) { // S-Expr comment state.mode = "s-expr-comment"; returnType = COMMENT; } else { var numTest = null, hasExactness = false, hasRadix = true; if (stream.eat(/[ei]/i)) { hasExactness = true; } else { stream.backUp(1); // must be radix specifier } if (stream.match(/^#b/i)) { numTest = isBinaryNumber; } else if (stream.match(/^#o/i)) { numTest = isOctalNumber; } else if (stream.match(/^#x/i)) { numTest = isHexNumber; } else if (stream.match(/^#d/i)) { numTest = isDecimalNumber; } else if (stream.match(/^[-+0-9.]/, false)) { hasRadix = false; numTest = isDecimalNumber; // re-consume the intial # if all matches failed } else if (!hasExactness) { stream.eat('#'); } if (numTest != null) { if (hasRadix && !hasExactness) { // consume optional exactness after radix stream.match(/^#[ei]/i); } if (numTest(stream)) returnType = NUMBER; } } } else if (/^[-+0-9.]/.test(ch) && isDecimalNumber(stream, true)) { // match non-prefixed number, must be decimal returnType = NUMBER; } else if (ch == ";") { // comment stream.skipToEnd(); // rest of the line is a comment returnType = COMMENT; } else if (ch == "(" || ch == "[") { var keyWord = ''; var indentTemp = stream.column(), letter; /** Either (indent-word .. (non-indent-word .. (;something else, bracket, etc. */ while ((letter = stream.eat(/[^\s\(\[\;\)\]]/)) != null) { keyWord += letter; } if (keyWord.length > 0 && indentKeys.propertyIsEnumerable(keyWord)) { // indent-word pushStack(state, indentTemp + INDENT_WORD_SKIP, ch); } else { // non-indent word // we continue eating the spaces stream.eatSpace(); if (stream.eol() || stream.peek() == ";") { // nothing significant after // we restart indentation 1 space after pushStack(state, indentTemp + 1, ch); } else { pushStack(state, indentTemp + stream.current().length, ch); // else we match } } stream.backUp(stream.current().length - 1); // undo all the eating if(typeof state.sExprComment == "number") state.sExprComment++; returnType = BRACKET; } else if (ch == ")" || ch == "]") { returnType = BRACKET; if (state.indentStack != null && state.indentStack.type == (ch == ")" ? "(" : "[")) { popStack(state); if(typeof state.sExprComment == "number"){ if(--state.sExprComment == 0){ returnType = COMMENT; // final closing bracket state.sExprComment = false; // turn off s-expr commenting mode } } } } else { stream.eatWhile(/[\w\$_\-!$%&*+\.\/:<=>?@\^~]/); if (keywords && keywords.propertyIsEnumerable(stream.current())) { returnType = BUILTIN; } else returnType = "variable"; } } return (typeof state.sExprComment == "number") ? COMMENT : returnType; }, indent: function (state) { if (state.indentStack == null) return state.indentation; return state.indentStack.indent; }, closeBrackets: {pairs: "()[]{}\"\""}, lineComment: ";;" }; }); CodeMirror.defineMIME("text/x-scheme", "scheme"); }); ================================================ FILE: base/res/codemirror/mode/shell/index.html ================================================ CodeMirror: Shell mode

Shell mode

MIME types defined: text/x-sh.

================================================ FILE: base/res/codemirror/mode/shell/shell.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode('shell', function() { var words = {}; function define(style, string) { var split = string.split(' '); for(var i = 0; i < split.length; i++) { words[split[i]] = style; } }; // Atoms define('atom', 'true false'); // Keywords define('keyword', 'if then do else elif while until for in esac fi fin ' + 'fil done exit set unset export function'); // Commands define('builtin', 'ab awk bash beep cat cc cd chown chmod chroot clear cp ' + 'curl cut diff echo find gawk gcc get git grep kill killall ln ls make ' + 'mkdir openssl mv nc node npm ping ps restart rm rmdir sed service sh ' + 'shopt shred source sort sleep ssh start stop su sudo tee telnet top ' + 'touch vi vim wall wc wget who write yes zsh'); function tokenBase(stream, state) { if (stream.eatSpace()) return null; var sol = stream.sol(); var ch = stream.next(); if (ch === '\\') { stream.next(); return null; } if (ch === '\'' || ch === '"' || ch === '`') { state.tokens.unshift(tokenString(ch)); return tokenize(stream, state); } if (ch === '#') { if (sol && stream.eat('!')) { stream.skipToEnd(); return 'meta'; // 'comment'? } stream.skipToEnd(); return 'comment'; } if (ch === '$') { state.tokens.unshift(tokenDollar); return tokenize(stream, state); } if (ch === '+' || ch === '=') { return 'operator'; } if (ch === '-') { stream.eat('-'); stream.eatWhile(/\w/); return 'attribute'; } if (/\d/.test(ch)) { stream.eatWhile(/\d/); if(stream.eol() || !/\w/.test(stream.peek())) { return 'number'; } } stream.eatWhile(/[\w-]/); var cur = stream.current(); if (stream.peek() === '=' && /\w+/.test(cur)) return 'def'; return words.hasOwnProperty(cur) ? words[cur] : null; } function tokenString(quote) { return function(stream, state) { var next, end = false, escaped = false; while ((next = stream.next()) != null) { if (next === quote && !escaped) { end = true; break; } if (next === '$' && !escaped && quote !== '\'') { escaped = true; stream.backUp(1); state.tokens.unshift(tokenDollar); break; } escaped = !escaped && next === '\\'; } if (end || !escaped) { state.tokens.shift(); } return (quote === '`' || quote === ')' ? 'quote' : 'string'); }; }; var tokenDollar = function(stream, state) { if (state.tokens.length > 1) stream.eat('$'); var ch = stream.next(), hungry = /\w/; if (ch === '{') hungry = /[^}]/; if (ch === '(') { state.tokens[0] = tokenString(')'); return tokenize(stream, state); } if (!/\d/.test(ch)) { stream.eatWhile(hungry); stream.eat('}'); } state.tokens.shift(); return 'def'; }; function tokenize(stream, state) { return (state.tokens[0] || tokenBase) (stream, state); }; return { startState: function() {return {tokens:[]};}, token: function(stream, state) { return tokenize(stream, state); }, lineComment: '#', fold: "brace" }; }); CodeMirror.defineMIME('text/x-sh', 'shell'); }); ================================================ FILE: base/res/codemirror/mode/shell/test.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({}, "shell"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } MT("var", "text [def $var] text"); MT("varBraces", "text[def ${var}]text"); MT("varVar", "text [def $a$b] text"); MT("varBracesVarBraces", "text[def ${a}${b}]text"); MT("singleQuotedVar", "[string 'text $var text']"); MT("singleQuotedVarBraces", "[string 'text ${var} text']"); MT("doubleQuotedVar", '[string "text ][def $var][string text"]'); MT("doubleQuotedVarBraces", '[string "text][def ${var}][string text"]'); MT("doubleQuotedVarPunct", '[string "text ][def $@][string text"]'); MT("doubleQuotedVarVar", '[string "][def $a$b][string "]'); MT("doubleQuotedVarBracesVarBraces", '[string "][def ${a}${b}][string "]'); MT("notAString", "text\\'text"); MT("escapes", "outside\\'\\\"\\`\\\\[string \"inside\\`\\'\\\"\\\\`\\$notAVar\"]outside\\$\\(notASubShell\\)"); MT("subshell", "[builtin echo] [quote $(whoami)] s log, stardate [quote `date`]."); MT("doubleQuotedSubshell", "[builtin echo] [string \"][quote $(whoami)][string 's log, stardate `date`.\"]"); MT("hashbang", "[meta #!/bin/bash]"); MT("comment", "text [comment # Blurb]"); MT("numbers", "[number 0] [number 1] [number 2]"); MT("keywords", "[keyword while] [atom true]; [keyword do]", " [builtin sleep] [number 3]", "[keyword done]"); MT("options", "[builtin ls] [attribute -l] [attribute --human-readable]"); MT("operator", "[def var][operator =]value"); })(); ================================================ FILE: base/res/codemirror/mode/sieve/index.html ================================================ CodeMirror: Sieve (RFC5228) mode

Sieve (RFC5228) mode

MIME types defined: application/sieve.

================================================ FILE: base/res/codemirror/mode/sieve/sieve.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("sieve", function(config) { function words(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } var keywords = words("if elsif else stop require"); var atoms = words("true false not"); var indentUnit = config.indentUnit; function tokenBase(stream, state) { var ch = stream.next(); if (ch == "/" && stream.eat("*")) { state.tokenize = tokenCComment; return tokenCComment(stream, state); } if (ch === '#') { stream.skipToEnd(); return "comment"; } if (ch == "\"") { state.tokenize = tokenString(ch); return state.tokenize(stream, state); } if (ch == "(") { state._indent.push("("); // add virtual angel wings so that editor behaves... // ...more sane incase of broken brackets state._indent.push("{"); return null; } if (ch === "{") { state._indent.push("{"); return null; } if (ch == ")") { state._indent.pop(); state._indent.pop(); } if (ch === "}") { state._indent.pop(); return null; } if (ch == ",") return null; if (ch == ";") return null; if (/[{}\(\),;]/.test(ch)) return null; // 1*DIGIT "K" / "M" / "G" if (/\d/.test(ch)) { stream.eatWhile(/[\d]/); stream.eat(/[KkMmGg]/); return "number"; } // ":" (ALPHA / "_") *(ALPHA / DIGIT / "_") if (ch == ":") { stream.eatWhile(/[a-zA-Z_]/); stream.eatWhile(/[a-zA-Z0-9_]/); return "operator"; } stream.eatWhile(/\w/); var cur = stream.current(); // "text:" *(SP / HTAB) (hash-comment / CRLF) // *(multiline-literal / multiline-dotstart) // "." CRLF if ((cur == "text") && stream.eat(":")) { state.tokenize = tokenMultiLineString; return "string"; } if (keywords.propertyIsEnumerable(cur)) return "keyword"; if (atoms.propertyIsEnumerable(cur)) return "atom"; return null; } function tokenMultiLineString(stream, state) { state._multiLineString = true; // the first line is special it may contain a comment if (!stream.sol()) { stream.eatSpace(); if (stream.peek() == "#") { stream.skipToEnd(); return "comment"; } stream.skipToEnd(); return "string"; } if ((stream.next() == ".") && (stream.eol())) { state._multiLineString = false; state.tokenize = tokenBase; } return "string"; } function tokenCComment(stream, state) { var maybeEnd = false, ch; while ((ch = stream.next()) != null) { if (maybeEnd && ch == "/") { state.tokenize = tokenBase; break; } maybeEnd = (ch == "*"); } return "comment"; } function tokenString(quote) { return function(stream, state) { var escaped = false, ch; while ((ch = stream.next()) != null) { if (ch == quote && !escaped) break; escaped = !escaped && ch == "\\"; } if (!escaped) state.tokenize = tokenBase; return "string"; }; } return { startState: function(base) { return {tokenize: tokenBase, baseIndent: base || 0, _indent: []}; }, token: function(stream, state) { if (stream.eatSpace()) return null; return (state.tokenize || tokenBase)(stream, state);; }, indent: function(state, _textAfter) { var length = state._indent.length; if (_textAfter && (_textAfter[0] == "}")) length--; if (length <0) length = 0; return length * indentUnit; }, electricChars: "}" }; }); CodeMirror.defineMIME("application/sieve", "sieve"); }); ================================================ FILE: base/res/codemirror/mode/slim/index.html ================================================ CodeMirror: SLIM mode

SLIM mode

MIME types defined: application/x-slim.

Parsing/Highlighting Tests: normal, verbose.

================================================ FILE: base/res/codemirror/mode/slim/slim.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Slim Highlighting for CodeMirror copyright (c) HicknHack Software Gmbh (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../ruby/ruby")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../ruby/ruby"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("slim", function(config) { var htmlMode = CodeMirror.getMode(config, {name: "htmlmixed"}); var rubyMode = CodeMirror.getMode(config, "ruby"); var modes = { html: htmlMode, ruby: rubyMode }; var embedded = { ruby: "ruby", javascript: "javascript", css: "text/css", sass: "text/x-sass", scss: "text/x-scss", less: "text/x-less", styl: "text/x-styl", // no highlighting so far coffee: "coffeescript", asciidoc: "text/x-asciidoc", markdown: "text/x-markdown", textile: "text/x-textile", // no highlighting so far creole: "text/x-creole", // no highlighting so far wiki: "text/x-wiki", // no highlighting so far mediawiki: "text/x-mediawiki", // no highlighting so far rdoc: "text/x-rdoc", // no highlighting so far builder: "text/x-builder", // no highlighting so far nokogiri: "text/x-nokogiri", // no highlighting so far erb: "application/x-erb" }; var embeddedRegexp = function(map){ var arr = []; for(var key in map) arr.push(key); return new RegExp("^("+arr.join('|')+"):"); }(embedded); var styleMap = { "commentLine": "comment", "slimSwitch": "operator special", "slimTag": "tag", "slimId": "attribute def", "slimClass": "attribute qualifier", "slimAttribute": "attribute", "slimSubmode": "keyword special", "closeAttributeTag": null, "slimDoctype": null, "lineContinuation": null }; var closing = { "{": "}", "[": "]", "(": ")" }; var nameStartChar = "_a-zA-Z\xC0-\xD6\xD8-\xF6\xF8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD"; var nameChar = nameStartChar + "\\-0-9\xB7\u0300-\u036F\u203F-\u2040"; var nameRegexp = new RegExp("^[:"+nameStartChar+"](?::["+nameChar+"]|["+nameChar+"]*)"); var attributeNameRegexp = new RegExp("^[:"+nameStartChar+"][:\\."+nameChar+"]*(?=\\s*=)"); var wrappedAttributeNameRegexp = new RegExp("^[:"+nameStartChar+"][:\\."+nameChar+"]*"); var classNameRegexp = /^\.-?[_a-zA-Z]+[\w\-]*/; var classIdRegexp = /^#[_a-zA-Z]+[\w\-]*/; function backup(pos, tokenize, style) { var restore = function(stream, state) { state.tokenize = tokenize; if (stream.pos < pos) { stream.pos = pos; return style; } return state.tokenize(stream, state); }; return function(stream, state) { state.tokenize = restore; return tokenize(stream, state); }; } function maybeBackup(stream, state, pat, offset, style) { var cur = stream.current(); var idx = cur.search(pat); if (idx > -1) { state.tokenize = backup(stream.pos, state.tokenize, style); stream.backUp(cur.length - idx - offset); } return style; } function continueLine(state, column) { state.stack = { parent: state.stack, style: "continuation", indented: column, tokenize: state.line }; state.line = state.tokenize; } function finishContinue(state) { if (state.line == state.tokenize) { state.line = state.stack.tokenize; state.stack = state.stack.parent; } } function lineContinuable(column, tokenize) { return function(stream, state) { finishContinue(state); if (stream.match(/^\\$/)) { continueLine(state, column); return "lineContinuation"; } var style = tokenize(stream, state); if (stream.eol() && stream.current().match(/(?:^|[^\\])(?:\\\\)*\\$/)) { stream.backUp(1); } return style; }; } function commaContinuable(column, tokenize) { return function(stream, state) { finishContinue(state); var style = tokenize(stream, state); if (stream.eol() && stream.current().match(/,$/)) { continueLine(state, column); } return style; }; } function rubyInQuote(endQuote, tokenize) { // TODO: add multi line support return function(stream, state) { var ch = stream.peek(); if (ch == endQuote && state.rubyState.tokenize.length == 1) { // step out of ruby context as it seems to complete processing all the braces stream.next(); state.tokenize = tokenize; return "closeAttributeTag"; } else { return ruby(stream, state); } }; } function startRubySplat(tokenize) { var rubyState; var runSplat = function(stream, state) { if (state.rubyState.tokenize.length == 1 && !state.rubyState.context.prev) { stream.backUp(1); if (stream.eatSpace()) { state.rubyState = rubyState; state.tokenize = tokenize; return tokenize(stream, state); } stream.next(); } return ruby(stream, state); }; return function(stream, state) { rubyState = state.rubyState; state.rubyState = rubyMode.startState(); state.tokenize = runSplat; return ruby(stream, state); }; } function ruby(stream, state) { return rubyMode.token(stream, state.rubyState); } function htmlLine(stream, state) { if (stream.match(/^\\$/)) { return "lineContinuation"; } return html(stream, state); } function html(stream, state) { if (stream.match(/^#\{/)) { state.tokenize = rubyInQuote("}", state.tokenize); return null; } return maybeBackup(stream, state, /[^\\]#\{/, 1, htmlMode.token(stream, state.htmlState)); } function startHtmlLine(lastTokenize) { return function(stream, state) { var style = htmlLine(stream, state); if (stream.eol()) state.tokenize = lastTokenize; return style; }; } function startHtmlMode(stream, state, offset) { state.stack = { parent: state.stack, style: "html", indented: stream.column() + offset, // pipe + space tokenize: state.line }; state.line = state.tokenize = html; return null; } function comment(stream, state) { stream.skipToEnd(); return state.stack.style; } function commentMode(stream, state) { state.stack = { parent: state.stack, style: "comment", indented: state.indented + 1, tokenize: state.line }; state.line = comment; return comment(stream, state); } function attributeWrapper(stream, state) { if (stream.eat(state.stack.endQuote)) { state.line = state.stack.line; state.tokenize = state.stack.tokenize; state.stack = state.stack.parent; return null; } if (stream.match(wrappedAttributeNameRegexp)) { state.tokenize = attributeWrapperAssign; return "slimAttribute"; } stream.next(); return null; } function attributeWrapperAssign(stream, state) { if (stream.match(/^==?/)) { state.tokenize = attributeWrapperValue; return null; } return attributeWrapper(stream, state); } function attributeWrapperValue(stream, state) { var ch = stream.peek(); if (ch == '"' || ch == "\'") { state.tokenize = readQuoted(ch, "string", true, false, attributeWrapper); stream.next(); return state.tokenize(stream, state); } if (ch == '[') { return startRubySplat(attributeWrapper)(stream, state); } if (stream.match(/^(true|false|nil)\b/)) { state.tokenize = attributeWrapper; return "keyword"; } return startRubySplat(attributeWrapper)(stream, state); } function startAttributeWrapperMode(state, endQuote, tokenize) { state.stack = { parent: state.stack, style: "wrapper", indented: state.indented + 1, tokenize: tokenize, line: state.line, endQuote: endQuote }; state.line = state.tokenize = attributeWrapper; return null; } function sub(stream, state) { if (stream.match(/^#\{/)) { state.tokenize = rubyInQuote("}", state.tokenize); return null; } var subStream = new CodeMirror.StringStream(stream.string.slice(state.stack.indented), stream.tabSize); subStream.pos = stream.pos - state.stack.indented; subStream.start = stream.start - state.stack.indented; subStream.lastColumnPos = stream.lastColumnPos - state.stack.indented; subStream.lastColumnValue = stream.lastColumnValue - state.stack.indented; var style = state.subMode.token(subStream, state.subState); stream.pos = subStream.pos + state.stack.indented; return style; } function firstSub(stream, state) { state.stack.indented = stream.column(); state.line = state.tokenize = sub; return state.tokenize(stream, state); } function createMode(mode) { var query = embedded[mode]; var spec = CodeMirror.mimeModes[query]; if (spec) { return CodeMirror.getMode(config, spec); } var factory = CodeMirror.modes[query]; if (factory) { return factory(config, {name: query}); } return CodeMirror.getMode(config, "null"); } function getMode(mode) { if (!modes.hasOwnProperty(mode)) { return modes[mode] = createMode(mode); } return modes[mode]; } function startSubMode(mode, state) { var subMode = getMode(mode); var subState = subMode.startState && subMode.startState(); state.subMode = subMode; state.subState = subState; state.stack = { parent: state.stack, style: "sub", indented: state.indented + 1, tokenize: state.line }; state.line = state.tokenize = firstSub; return "slimSubmode"; } function doctypeLine(stream, _state) { stream.skipToEnd(); return "slimDoctype"; } function startLine(stream, state) { var ch = stream.peek(); if (ch == '<') { return (state.tokenize = startHtmlLine(state.tokenize))(stream, state); } if (stream.match(/^[|']/)) { return startHtmlMode(stream, state, 1); } if (stream.match(/^\/(!|\[\w+])?/)) { return commentMode(stream, state); } if (stream.match(/^(-|==?[<>]?)/)) { state.tokenize = lineContinuable(stream.column(), commaContinuable(stream.column(), ruby)); return "slimSwitch"; } if (stream.match(/^doctype\b/)) { state.tokenize = doctypeLine; return "keyword"; } var m = stream.match(embeddedRegexp); if (m) { return startSubMode(m[1], state); } return slimTag(stream, state); } function slim(stream, state) { if (state.startOfLine) { return startLine(stream, state); } return slimTag(stream, state); } function slimTag(stream, state) { if (stream.eat('*')) { state.tokenize = startRubySplat(slimTagExtras); return null; } if (stream.match(nameRegexp)) { state.tokenize = slimTagExtras; return "slimTag"; } return slimClass(stream, state); } function slimTagExtras(stream, state) { if (stream.match(/^(<>?|> state.indented && state.last != "slimSubmode") { state.line = state.tokenize = state.stack.tokenize; state.stack = state.stack.parent; state.subMode = null; state.subState = null; } } if (stream.eatSpace()) return null; var style = state.tokenize(stream, state); state.startOfLine = false; if (style) state.last = style; return styleMap.hasOwnProperty(style) ? styleMap[style] : style; }, blankLine: function(state) { if (state.subMode && state.subMode.blankLine) { return state.subMode.blankLine(state.subState); } }, innerMode: function(state) { if (state.subMode) return {state: state.subState, mode: state.subMode}; return {state: state, mode: mode}; } //indent: function(state) { // return state.indented; //} }; return mode; }, "htmlmixed", "ruby"); CodeMirror.defineMIME("text/x-slim", "slim"); CodeMirror.defineMIME("application/x-slim", "slim"); }); ================================================ FILE: base/res/codemirror/mode/slim/test.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Slim Highlighting for CodeMirror copyright (c) HicknHack Software Gmbh (function() { var mode = CodeMirror.getMode({tabSize: 4, indentUnit: 2}, "slim"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } // Requires at least one media query MT("elementName", "[tag h1] Hey There"); MT("oneElementPerLine", "[tag h1] Hey There .h2"); MT("idShortcut", "[attribute&def #test] Hey There"); MT("tagWithIdShortcuts", "[tag h1][attribute&def #test] Hey There"); MT("classShortcut", "[attribute&qualifier .hello] Hey There"); MT("tagWithIdAndClassShortcuts", "[tag h1][attribute&def #test][attribute&qualifier .hello] Hey There"); MT("docType", "[keyword doctype] xml"); MT("comment", "[comment / Hello WORLD]"); MT("notComment", "[tag h1] This is not a / comment "); MT("attributes", "[tag a]([attribute title]=[string \"test\"]) [attribute href]=[string \"link\"]}"); MT("multiLineAttributes", "[tag a]([attribute title]=[string \"test\"]", " ) [attribute href]=[string \"link\"]}"); MT("htmlCode", "[tag&bracket <][tag h1][tag&bracket >]Title[tag&bracket ]"); MT("rubyBlock", "[operator&special =][variable-2 @item]"); MT("selectorRubyBlock", "[tag a][attribute&qualifier .test][operator&special =] [variable-2 @item]"); MT("nestedRubyBlock", "[tag a]", " [operator&special =][variable puts] [string \"test\"]"); MT("multilinePlaintext", "[tag p]", " | Hello,", " World"); MT("multilineRuby", "[tag p]", " [comment /# this is a comment]", " [comment and this is a comment too]", " | Date/Time", " [operator&special -] [variable now] [operator =] [tag DateTime][operator .][property now]", " [tag strong][operator&special =] [variable now]", " [operator&special -] [keyword if] [variable now] [operator >] [tag DateTime][operator .][property parse]([string \"December 31, 2006\"])", " [operator&special =][string \"Happy\"]", " [operator&special =][string \"Belated\"]", " [operator&special =][string \"Birthday\"]"); MT("multilineComment", "[comment /]", " [comment Multiline]", " [comment Comment]"); MT("hamlAfterRubyTag", "[attribute&qualifier .block]", " [tag strong][operator&special =] [variable now]", " [attribute&qualifier .test]", " [operator&special =][variable now]", " [attribute&qualifier .right]"); MT("stretchedRuby", "[operator&special =] [variable puts] [string \"Hello\"],", " [string \"World\"]"); MT("interpolationInHashAttribute", "[tag div]{[attribute id] = [string \"]#{[variable test]}[string _]#{[variable ting]}[string \"]} test"); MT("interpolationInHTMLAttribute", "[tag div]([attribute title]=[string \"]#{[variable test]}[string _]#{[variable ting]()}[string \"]) Test"); })(); ================================================ FILE: base/res/codemirror/mode/smalltalk/index.html ================================================ CodeMirror: Smalltalk mode

Smalltalk mode

Simple Smalltalk mode.

MIME types defined: text/x-stsrc.

================================================ FILE: base/res/codemirror/mode/smalltalk/smalltalk.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode('smalltalk', function(config) { var specialChars = /[+\-\/\\*~<>=@%|&?!.,:;^]/; var keywords = /true|false|nil|self|super|thisContext/; var Context = function(tokenizer, parent) { this.next = tokenizer; this.parent = parent; }; var Token = function(name, context, eos) { this.name = name; this.context = context; this.eos = eos; }; var State = function() { this.context = new Context(next, null); this.expectVariable = true; this.indentation = 0; this.userIndentationDelta = 0; }; State.prototype.userIndent = function(indentation) { this.userIndentationDelta = indentation > 0 ? (indentation / config.indentUnit - this.indentation) : 0; }; var next = function(stream, context, state) { var token = new Token(null, context, false); var aChar = stream.next(); if (aChar === '"') { token = nextComment(stream, new Context(nextComment, context)); } else if (aChar === '\'') { token = nextString(stream, new Context(nextString, context)); } else if (aChar === '#') { if (stream.peek() === '\'') { stream.next(); token = nextSymbol(stream, new Context(nextSymbol, context)); } else { if (stream.eatWhile(/[^\s.{}\[\]()]/)) token.name = 'string-2'; else token.name = 'meta'; } } else if (aChar === '$') { if (stream.next() === '<') { stream.eatWhile(/[^\s>]/); stream.next(); } token.name = 'string-2'; } else if (aChar === '|' && state.expectVariable) { token.context = new Context(nextTemporaries, context); } else if (/[\[\]{}()]/.test(aChar)) { token.name = 'bracket'; token.eos = /[\[{(]/.test(aChar); if (aChar === '[') { state.indentation++; } else if (aChar === ']') { state.indentation = Math.max(0, state.indentation - 1); } } else if (specialChars.test(aChar)) { stream.eatWhile(specialChars); token.name = 'operator'; token.eos = aChar !== ';'; // ; cascaded message expression } else if (/\d/.test(aChar)) { stream.eatWhile(/[\w\d]/); token.name = 'number'; } else if (/[\w_]/.test(aChar)) { stream.eatWhile(/[\w\d_]/); token.name = state.expectVariable ? (keywords.test(stream.current()) ? 'keyword' : 'variable') : null; } else { token.eos = state.expectVariable; } return token; }; var nextComment = function(stream, context) { stream.eatWhile(/[^"]/); return new Token('comment', stream.eat('"') ? context.parent : context, true); }; var nextString = function(stream, context) { stream.eatWhile(/[^']/); return new Token('string', stream.eat('\'') ? context.parent : context, false); }; var nextSymbol = function(stream, context) { stream.eatWhile(/[^']/); return new Token('string-2', stream.eat('\'') ? context.parent : context, false); }; var nextTemporaries = function(stream, context) { var token = new Token(null, context, false); var aChar = stream.next(); if (aChar === '|') { token.context = context.parent; token.eos = true; } else { stream.eatWhile(/[^|]/); token.name = 'variable'; } return token; }; return { startState: function() { return new State; }, token: function(stream, state) { state.userIndent(stream.indentation()); if (stream.eatSpace()) { return null; } var token = state.context.next(stream, state.context, state); state.context = token.context; state.expectVariable = token.eos; return token.name; }, blankLine: function(state) { state.userIndent(0); }, indent: function(state, textAfter) { var i = state.context.next === next && textAfter && textAfter.charAt(0) === ']' ? -1 : state.userIndentationDelta; return (state.indentation + i) * config.indentUnit; }, electricChars: ']' }; }); CodeMirror.defineMIME('text/x-stsrc', {name: 'smalltalk'}); }); ================================================ FILE: base/res/codemirror/mode/smarty/index.html ================================================ CodeMirror: Smarty mode

Smarty mode

Mode for Smarty version 2 or 3, which allows for custom delimiter tags.

Several configuration parameters are supported:

  • leftDelimiter and rightDelimiter, which should be strings that determine where the Smarty syntax starts and ends.
  • version, which should be 2 or 3.
  • baseMode, which can be a mode spec like "text/html" to set a different background mode.

MIME types defined: text/x-smarty

Smarty 2, custom delimiters

Smarty 3

================================================ FILE: base/res/codemirror/mode/smarty/smarty.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /** * Smarty 2 and 3 mode. */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("smarty", function(config, parserConf) { var rightDelimiter = parserConf.rightDelimiter || "}"; var leftDelimiter = parserConf.leftDelimiter || "{"; var version = parserConf.version || 2; var baseMode = CodeMirror.getMode(config, parserConf.baseMode || "null"); var keyFunctions = ["debug", "extends", "function", "include", "literal"]; var regs = { operatorChars: /[+\-*&%=<>!?]/, validIdentifier: /[a-zA-Z0-9_]/, stringChar: /['"]/ }; var last; function cont(style, lastType) { last = lastType; return style; } function chain(stream, state, parser) { state.tokenize = parser; return parser(stream, state); } // Smarty 3 allows { and } surrounded by whitespace to NOT slip into Smarty mode function doesNotCount(stream, pos) { if (pos == null) pos = stream.pos; return version === 3 && leftDelimiter == "{" && (pos == stream.string.length || /\s/.test(stream.string.charAt(pos))); } function tokenTop(stream, state) { var string = stream.string; for (var scan = stream.pos;;) { var nextMatch = string.indexOf(leftDelimiter, scan); scan = nextMatch + leftDelimiter.length; if (nextMatch == -1 || !doesNotCount(stream, nextMatch + leftDelimiter.length)) break; } if (nextMatch == stream.pos) { stream.match(leftDelimiter); if (stream.eat("*")) { return chain(stream, state, tokenBlock("comment", "*" + rightDelimiter)); } else { state.depth++; state.tokenize = tokenSmarty; last = "startTag"; return "tag"; } } if (nextMatch > -1) stream.string = string.slice(0, nextMatch); var token = baseMode.token(stream, state.base); if (nextMatch > -1) stream.string = string; return token; } // parsing Smarty content function tokenSmarty(stream, state) { if (stream.match(rightDelimiter, true)) { if (version === 3) { state.depth--; if (state.depth <= 0) { state.tokenize = tokenTop; } } else { state.tokenize = tokenTop; } return cont("tag", null); } if (stream.match(leftDelimiter, true)) { state.depth++; return cont("tag", "startTag"); } var ch = stream.next(); if (ch == "$") { stream.eatWhile(regs.validIdentifier); return cont("variable-2", "variable"); } else if (ch == "|") { return cont("operator", "pipe"); } else if (ch == ".") { return cont("operator", "property"); } else if (regs.stringChar.test(ch)) { state.tokenize = tokenAttribute(ch); return cont("string", "string"); } else if (regs.operatorChars.test(ch)) { stream.eatWhile(regs.operatorChars); return cont("operator", "operator"); } else if (ch == "[" || ch == "]") { return cont("bracket", "bracket"); } else if (ch == "(" || ch == ")") { return cont("bracket", "operator"); } else if (/\d/.test(ch)) { stream.eatWhile(/\d/); return cont("number", "number"); } else { if (state.last == "variable") { if (ch == "@") { stream.eatWhile(regs.validIdentifier); return cont("property", "property"); } else if (ch == "|") { stream.eatWhile(regs.validIdentifier); return cont("qualifier", "modifier"); } } else if (state.last == "pipe") { stream.eatWhile(regs.validIdentifier); return cont("qualifier", "modifier"); } else if (state.last == "whitespace") { stream.eatWhile(regs.validIdentifier); return cont("attribute", "modifier"); } if (state.last == "property") { stream.eatWhile(regs.validIdentifier); return cont("property", null); } else if (/\s/.test(ch)) { last = "whitespace"; return null; } var str = ""; if (ch != "/") { str += ch; } var c = null; while (c = stream.eat(regs.validIdentifier)) { str += c; } for (var i=0, j=keyFunctions.length; i CodeMirror: Solr mode

Solr mode

MIME types defined: text/x-solr.

================================================ FILE: base/res/codemirror/mode/solr/solr.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("solr", function() { "use strict"; var isStringChar = /[^\s\|\!\+\-\*\?\~\^\&\:\(\)\[\]\{\}\^\"\\]/; var isOperatorChar = /[\|\!\+\-\*\?\~\^\&]/; var isOperatorString = /^(OR|AND|NOT|TO)$/i; function isNumber(word) { return parseFloat(word, 10).toString() === word; } function tokenString(quote) { return function(stream, state) { var escaped = false, next; while ((next = stream.next()) != null) { if (next == quote && !escaped) break; escaped = !escaped && next == "\\"; } if (!escaped) state.tokenize = tokenBase; return "string"; }; } function tokenOperator(operator) { return function(stream, state) { var style = "operator"; if (operator == "+") style += " positive"; else if (operator == "-") style += " negative"; else if (operator == "|") stream.eat(/\|/); else if (operator == "&") stream.eat(/\&/); else if (operator == "^") style += " boost"; state.tokenize = tokenBase; return style; }; } function tokenWord(ch) { return function(stream, state) { var word = ch; while ((ch = stream.peek()) && ch.match(isStringChar) != null) { word += stream.next(); } state.tokenize = tokenBase; if (isOperatorString.test(word)) return "operator"; else if (isNumber(word)) return "number"; else if (stream.peek() == ":") return "field"; else return "string"; }; } function tokenBase(stream, state) { var ch = stream.next(); if (ch == '"') state.tokenize = tokenString(ch); else if (isOperatorChar.test(ch)) state.tokenize = tokenOperator(ch); else if (isStringChar.test(ch)) state.tokenize = tokenWord(ch); return (state.tokenize != tokenBase) ? state.tokenize(stream, state) : null; } return { startState: function() { return { tokenize: tokenBase }; }, token: function(stream, state) { if (stream.eatSpace()) return null; return state.tokenize(stream, state); } }; }); CodeMirror.defineMIME("text/x-solr", "solr"); }); ================================================ FILE: base/res/codemirror/mode/soy/index.html ================================================ CodeMirror: Soy (Closure Template) mode

Soy (Closure Template) mode

A mode for Closure Templates (Soy).

MIME type defined: text/x-soy.

================================================ FILE: base/res/codemirror/mode/soy/soy.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../htmlmixed/htmlmixed"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; var indentingTags = ["template", "literal", "msg", "fallbackmsg", "let", "if", "elseif", "else", "switch", "case", "default", "foreach", "ifempty", "for", "call", "param", "deltemplate", "delcall", "log"]; CodeMirror.defineMode("soy", function(config) { var textMode = CodeMirror.getMode(config, "text/plain"); var modes = { html: CodeMirror.getMode(config, {name: "text/html", multilineTagIndentFactor: 2, multilineTagIndentPastTag: false}), attributes: textMode, text: textMode, uri: textMode, css: CodeMirror.getMode(config, "text/css"), js: CodeMirror.getMode(config, {name: "text/javascript", statementIndent: 2 * config.indentUnit}) }; function last(array) { return array[array.length - 1]; } function tokenUntil(stream, state, untilRegExp) { var oldString = stream.string; var match = untilRegExp.exec(oldString.substr(stream.pos)); if (match) { // We don't use backUp because it backs up just the position, not the state. // This uses an undocumented API. stream.string = oldString.substr(0, stream.pos + match.index); } var result = stream.hideFirstChars(state.indent, function() { return state.localMode.token(stream, state.localState); }); stream.string = oldString; return result; } return { startState: function() { return { kind: [], kindTag: [], soyState: [], indent: 0, localMode: modes.html, localState: CodeMirror.startState(modes.html) }; }, copyState: function(state) { return { tag: state.tag, // Last seen Soy tag. kind: state.kind.concat([]), // Values of kind="" attributes. kindTag: state.kindTag.concat([]), // Opened tags with kind="" attributes. soyState: state.soyState.concat([]), indent: state.indent, // Indentation of the following line. localMode: state.localMode, localState: CodeMirror.copyState(state.localMode, state.localState) }; }, token: function(stream, state) { var match; switch (last(state.soyState)) { case "comment": if (stream.match(/^.*?\*\//)) { state.soyState.pop(); } else { stream.skipToEnd(); } return "comment"; case "variable": if (stream.match(/^}/)) { state.indent -= 2 * config.indentUnit; state.soyState.pop(); return "variable-2"; } stream.next(); return null; case "tag": if (stream.match(/^\/?}/)) { if (state.tag == "/template" || state.tag == "/deltemplate") state.indent = 0; else state.indent -= (stream.current() == "/}" || indentingTags.indexOf(state.tag) == -1 ? 2 : 1) * config.indentUnit; state.soyState.pop(); return "keyword"; } else if (stream.match(/^([\w?]+)(?==)/)) { if (stream.current() == "kind" && (match = stream.match(/^="([^"]+)/, false))) { var kind = match[1]; state.kind.push(kind); state.kindTag.push(state.tag); state.localMode = modes[kind] || modes.html; state.localState = CodeMirror.startState(state.localMode); } return "attribute"; } else if (stream.match(/^"/)) { state.soyState.push("string"); return "string"; } stream.next(); return null; case "literal": if (stream.match(/^(?=\{\/literal})/)) { state.indent -= config.indentUnit; state.soyState.pop(); return this.token(stream, state); } return tokenUntil(stream, state, /\{\/literal}/); case "string": if (stream.match(/^.*?"/)) { state.soyState.pop(); } else { stream.skipToEnd(); } return "string"; } if (stream.match(/^\/\*/)) { state.soyState.push("comment"); return "comment"; } else if (stream.match(stream.sol() ? /^\s*\/\/.*/ : /^\s+\/\/.*/)) { return "comment"; } else if (stream.match(/^\{\$[\w?]*/)) { state.indent += 2 * config.indentUnit; state.soyState.push("variable"); return "variable-2"; } else if (stream.match(/^\{literal}/)) { state.indent += config.indentUnit; state.soyState.push("literal"); return "keyword"; } else if (match = stream.match(/^\{([\/@\\]?[\w?]*)/)) { if (match[1] != "/switch") state.indent += (/^(\/|(else|elseif|case|default)$)/.test(match[1]) && state.tag != "switch" ? 1 : 2) * config.indentUnit; state.tag = match[1]; if (state.tag == "/" + last(state.kindTag)) { // We found the tag that opened the current kind="". state.kind.pop(); state.kindTag.pop(); state.localMode = modes[last(state.kind)] || modes.html; state.localState = CodeMirror.startState(state.localMode); } state.soyState.push("tag"); return "keyword"; } return tokenUntil(stream, state, /\{|\s+\/\/|\/\*/); }, indent: function(state, textAfter) { var indent = state.indent, top = last(state.soyState); if (top == "comment") return CodeMirror.Pass; if (top == "literal") { if (/^\{\/literal}/.test(textAfter)) indent -= config.indentUnit; } else { if (/^\s*\{\/(template|deltemplate)\b/.test(textAfter)) return 0; if (/^\{(\/|(fallbackmsg|elseif|else|ifempty)\b)/.test(textAfter)) indent -= config.indentUnit; if (state.tag != "switch" && /^\{(case|default)\b/.test(textAfter)) indent -= config.indentUnit; if (/^\{\/switch\b/.test(textAfter)) indent -= config.indentUnit; } if (indent && state.localMode.indent) indent += state.localMode.indent(state.localState, textAfter); return indent; }, innerMode: function(state) { if (state.soyState.length && last(state.soyState) != "literal") return null; else return {state: state.localState, mode: state.localMode}; }, electricInput: /^\s*\{(\/|\/template|\/deltemplate|\/switch|fallbackmsg|elseif|else|case|default|ifempty|\/literal\})$/, lineComment: "//", blockCommentStart: "/*", blockCommentEnd: "*/", blockCommentContinue: " * ", fold: "indent" }; }, "htmlmixed"); CodeMirror.registerHelper("hintWords", "soy", indentingTags.concat( ["delpackage", "namespace", "alias", "print", "css", "debugger"])); CodeMirror.defineMIME("text/x-soy", "soy"); }); ================================================ FILE: base/res/codemirror/mode/sparql/index.html ================================================ CodeMirror: SPARQL mode

SPARQL mode

MIME types defined: application/sparql-query.

================================================ FILE: base/res/codemirror/mode/sparql/sparql.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("sparql", function(config) { var indentUnit = config.indentUnit; var curPunc; function wordRegexp(words) { return new RegExp("^(?:" + words.join("|") + ")$", "i"); } var ops = wordRegexp(["str", "lang", "langmatches", "datatype", "bound", "sameterm", "isiri", "isuri", "iri", "uri", "bnode", "count", "sum", "min", "max", "avg", "sample", "group_concat", "rand", "abs", "ceil", "floor", "round", "concat", "substr", "strlen", "replace", "ucase", "lcase", "encode_for_uri", "contains", "strstarts", "strends", "strbefore", "strafter", "year", "month", "day", "hours", "minutes", "seconds", "timezone", "tz", "now", "uuid", "struuid", "md5", "sha1", "sha256", "sha384", "sha512", "coalesce", "if", "strlang", "strdt", "isnumeric", "regex", "exists", "isblank", "isliteral", "a"]); var keywords = wordRegexp(["base", "prefix", "select", "distinct", "reduced", "construct", "describe", "ask", "from", "named", "where", "order", "limit", "offset", "filter", "optional", "graph", "by", "asc", "desc", "as", "having", "undef", "values", "group", "minus", "in", "not", "service", "silent", "using", "insert", "delete", "union", "true", "false", "with", "data", "copy", "to", "move", "add", "create", "drop", "clear", "load"]); var operatorChars = /[*+\-<>=&|\^\/!\?]/; function tokenBase(stream, state) { var ch = stream.next(); curPunc = null; if (ch == "$" || ch == "?") { if(ch == "?" && stream.match(/\s/, false)){ return "operator"; } stream.match(/^[\w\d]*/); return "variable-2"; } else if (ch == "<" && !stream.match(/^[\s\u00a0=]/, false)) { stream.match(/^[^\s\u00a0>]*>?/); return "atom"; } else if (ch == "\"" || ch == "'") { state.tokenize = tokenLiteral(ch); return state.tokenize(stream, state); } else if (/[{}\(\),\.;\[\]]/.test(ch)) { curPunc = ch; return "bracket"; } else if (ch == "#") { stream.skipToEnd(); return "comment"; } else if (operatorChars.test(ch)) { stream.eatWhile(operatorChars); return "operator"; } else if (ch == ":") { stream.eatWhile(/[\w\d\._\-]/); return "atom"; } else if (ch == "@") { stream.eatWhile(/[a-z\d\-]/i); return "meta"; } else { stream.eatWhile(/[_\w\d]/); if (stream.eat(":")) { stream.eatWhile(/[\w\d_\-]/); return "atom"; } var word = stream.current(); if (ops.test(word)) return "builtin"; else if (keywords.test(word)) return "keyword"; else return "variable"; } } function tokenLiteral(quote) { return function(stream, state) { var escaped = false, ch; while ((ch = stream.next()) != null) { if (ch == quote && !escaped) { state.tokenize = tokenBase; break; } escaped = !escaped && ch == "\\"; } return "string"; }; } function pushContext(state, type, col) { state.context = {prev: state.context, indent: state.indent, col: col, type: type}; } function popContext(state) { state.indent = state.context.indent; state.context = state.context.prev; } return { startState: function() { return {tokenize: tokenBase, context: null, indent: 0, col: 0}; }, token: function(stream, state) { if (stream.sol()) { if (state.context && state.context.align == null) state.context.align = false; state.indent = stream.indentation(); } if (stream.eatSpace()) return null; var style = state.tokenize(stream, state); if (style != "comment" && state.context && state.context.align == null && state.context.type != "pattern") { state.context.align = true; } if (curPunc == "(") pushContext(state, ")", stream.column()); else if (curPunc == "[") pushContext(state, "]", stream.column()); else if (curPunc == "{") pushContext(state, "}", stream.column()); else if (/[\]\}\)]/.test(curPunc)) { while (state.context && state.context.type == "pattern") popContext(state); if (state.context && curPunc == state.context.type) popContext(state); } else if (curPunc == "." && state.context && state.context.type == "pattern") popContext(state); else if (/atom|string|variable/.test(style) && state.context) { if (/[\}\]]/.test(state.context.type)) pushContext(state, "pattern", stream.column()); else if (state.context.type == "pattern" && !state.context.align) { state.context.align = true; state.context.col = stream.column(); } } return style; }, indent: function(state, textAfter) { var firstChar = textAfter && textAfter.charAt(0); var context = state.context; if (/[\]\}]/.test(firstChar)) while (context && context.type == "pattern") context = context.prev; var closing = context && firstChar == context.type; if (!context) return 0; else if (context.type == "pattern") return context.col; else if (context.align) return context.col + (closing ? 0 : 1); else return context.indent + (closing ? 0 : indentUnit); } }; }); CodeMirror.defineMIME("application/sparql-query", "sparql"); }); ================================================ FILE: base/res/codemirror/mode/spreadsheet/index.html ================================================ CodeMirror: Spreadsheet mode

Spreadsheet mode

MIME types defined: text/x-spreadsheet.

The Spreadsheet Mode

Created by Robert Plummer

================================================ FILE: base/res/codemirror/mode/spreadsheet/spreadsheet.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("spreadsheet", function () { return { startState: function () { return { stringType: null, stack: [] }; }, token: function (stream, state) { if (!stream) return; //check for state changes if (state.stack.length === 0) { //strings if ((stream.peek() == '"') || (stream.peek() == "'")) { state.stringType = stream.peek(); stream.next(); // Skip quote state.stack.unshift("string"); } } //return state //stack has switch (state.stack[0]) { case "string": while (state.stack[0] === "string" && !stream.eol()) { if (stream.peek() === state.stringType) { stream.next(); // Skip quote state.stack.shift(); // Clear flag } else if (stream.peek() === "\\") { stream.next(); stream.next(); } else { stream.match(/^.[^\\\"\']*/); } } return "string"; case "characterClass": while (state.stack[0] === "characterClass" && !stream.eol()) { if (!(stream.match(/^[^\]\\]+/) || stream.match(/^\\./))) state.stack.shift(); } return "operator"; } var peek = stream.peek(); //no stack switch (peek) { case "[": stream.next(); state.stack.unshift("characterClass"); return "bracket"; case ":": stream.next(); return "operator"; case "\\": if (stream.match(/\\[a-z]+/)) return "string-2"; else return null; case ".": case ",": case ";": case "*": case "-": case "+": case "^": case "<": case "/": case "=": stream.next(); return "atom"; case "$": stream.next(); return "builtin"; } if (stream.match(/\d+/)) { if (stream.match(/^\w+/)) return "error"; return "number"; } else if (stream.match(/^[a-zA-Z_]\w*/)) { if (stream.match(/(?=[\(.])/, false)) return "keyword"; return "variable-2"; } else if (["[", "]", "(", ")", "{", "}"].indexOf(peek) != -1) { stream.next(); return "bracket"; } else if (!stream.eatSpace()) { stream.next(); } return null; } }; }); CodeMirror.defineMIME("text/x-spreadsheet", "spreadsheet"); }); ================================================ FILE: base/res/codemirror/mode/sql/index.html ================================================ CodeMirror: SQL Mode for CodeMirror

SQL Mode for CodeMirror

MIME types defined: text/x-sql, text/x-mysql, text/x-mariadb, text/x-cassandra, text/x-plsql, text/x-mssql, text/x-hive.

================================================ FILE: base/res/codemirror/mode/sql/sql.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("sql", function(config, parserConfig) { "use strict"; var client = parserConfig.client || {}, atoms = parserConfig.atoms || {"false": true, "true": true, "null": true}, builtin = parserConfig.builtin || {}, keywords = parserConfig.keywords || {}, operatorChars = parserConfig.operatorChars || /^[*+\-%<>!=&|~^]/, support = parserConfig.support || {}, hooks = parserConfig.hooks || {}, dateSQL = parserConfig.dateSQL || {"date" : true, "time" : true, "timestamp" : true}; function tokenBase(stream, state) { var ch = stream.next(); // call hooks from the mime type if (hooks[ch]) { var result = hooks[ch](stream, state); if (result !== false) return result; } if (support.hexNumber == true && ((ch == "0" && stream.match(/^[xX][0-9a-fA-F]+/)) || (ch == "x" || ch == "X") && stream.match(/^'[0-9a-fA-F]+'/))) { // hex // ref: http://dev.mysql.com/doc/refman/5.5/en/hexadecimal-literals.html return "number"; } else if (support.binaryNumber == true && (((ch == "b" || ch == "B") && stream.match(/^'[01]+'/)) || (ch == "0" && stream.match(/^b[01]+/)))) { // bitstring // ref: http://dev.mysql.com/doc/refman/5.5/en/bit-field-literals.html return "number"; } else if (ch.charCodeAt(0) > 47 && ch.charCodeAt(0) < 58) { // numbers // ref: http://dev.mysql.com/doc/refman/5.5/en/number-literals.html stream.match(/^[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?/); support.decimallessFloat == true && stream.eat('.'); return "number"; } else if (ch == "?" && (stream.eatSpace() || stream.eol() || stream.eat(";"))) { // placeholders return "variable-3"; } else if (ch == "'" || (ch == '"' && support.doubleQuote)) { // strings // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html state.tokenize = tokenLiteral(ch); return state.tokenize(stream, state); } else if ((((support.nCharCast == true && (ch == "n" || ch == "N")) || (support.charsetCast == true && ch == "_" && stream.match(/[a-z][a-z0-9]*/i))) && (stream.peek() == "'" || stream.peek() == '"'))) { // charset casting: _utf8'str', N'str', n'str' // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html return "keyword"; } else if (/^[\(\),\;\[\]]/.test(ch)) { // no highlightning return null; } else if (support.commentSlashSlash && ch == "/" && stream.eat("/")) { // 1-line comment stream.skipToEnd(); return "comment"; } else if ((support.commentHash && ch == "#") || (ch == "-" && stream.eat("-") && (!support.commentSpaceRequired || stream.eat(" ")))) { // 1-line comments // ref: https://kb.askmonty.org/en/comment-syntax/ stream.skipToEnd(); return "comment"; } else if (ch == "/" && stream.eat("*")) { // multi-line comments // ref: https://kb.askmonty.org/en/comment-syntax/ state.tokenize = tokenComment; return state.tokenize(stream, state); } else if (ch == ".") { // .1 for 0.1 if (support.zerolessFloat == true && stream.match(/^(?:\d+(?:e[+-]?\d+)?)/i)) { return "number"; } // .table_name (ODBC) // // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html if (support.ODBCdotTable == true && stream.match(/^[a-zA-Z_]+/)) { return "variable-2"; } } else if (operatorChars.test(ch)) { // operators stream.eatWhile(operatorChars); return null; } else if (ch == '{' && (stream.match(/^( )*(d|D|t|T|ts|TS)( )*'[^']*'( )*}/) || stream.match(/^( )*(d|D|t|T|ts|TS)( )*"[^"]*"( )*}/))) { // dates (weird ODBC syntax) // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html return "number"; } else { stream.eatWhile(/^[_\w\d]/); var word = stream.current().toLowerCase(); // dates (standard SQL syntax) // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html if (dateSQL.hasOwnProperty(word) && (stream.match(/^( )+'[^']*'/) || stream.match(/^( )+"[^"]*"/))) return "number"; if (atoms.hasOwnProperty(word)) return "atom"; if (builtin.hasOwnProperty(word)) return "builtin"; if (keywords.hasOwnProperty(word)) return "keyword"; if (client.hasOwnProperty(word)) return "string-2"; return null; } } // 'string', with char specified in quote escaped by '\' function tokenLiteral(quote) { return function(stream, state) { var escaped = false, ch; while ((ch = stream.next()) != null) { if (ch == quote && !escaped) { state.tokenize = tokenBase; break; } escaped = !escaped && ch == "\\"; } return "string"; }; } function tokenComment(stream, state) { while (true) { if (stream.skipTo("*")) { stream.next(); if (stream.eat("/")) { state.tokenize = tokenBase; break; } } else { stream.skipToEnd(); break; } } return "comment"; } function pushContext(stream, state, type) { state.context = { prev: state.context, indent: stream.indentation(), col: stream.column(), type: type }; } function popContext(state) { state.indent = state.context.indent; state.context = state.context.prev; } return { startState: function() { return {tokenize: tokenBase, context: null}; }, token: function(stream, state) { if (stream.sol()) { if (state.context && state.context.align == null) state.context.align = false; } if (stream.eatSpace()) return null; var style = state.tokenize(stream, state); if (style == "comment") return style; if (state.context && state.context.align == null) state.context.align = true; var tok = stream.current(); if (tok == "(") pushContext(stream, state, ")"); else if (tok == "[") pushContext(stream, state, "]"); else if (state.context && state.context.type == tok) popContext(state); return style; }, indent: function(state, textAfter) { var cx = state.context; if (!cx) return CodeMirror.Pass; var closing = textAfter.charAt(0) == cx.type; if (cx.align) return cx.col + (closing ? 0 : 1); else return cx.indent + (closing ? 0 : config.indentUnit); }, blockCommentStart: "/*", blockCommentEnd: "*/", lineComment: support.commentSlashSlash ? "//" : support.commentHash ? "#" : null }; }); (function() { "use strict"; // `identifier` function hookIdentifier(stream) { // MySQL/MariaDB identifiers // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html var ch; while ((ch = stream.next()) != null) { if (ch == "`" && !stream.eat("`")) return "variable-2"; } stream.backUp(stream.current().length - 1); return stream.eatWhile(/\w/) ? "variable-2" : null; } // variable token function hookVar(stream) { // variables // @@prefix.varName @varName // varName can be quoted with ` or ' or " // ref: http://dev.mysql.com/doc/refman/5.5/en/user-variables.html if (stream.eat("@")) { stream.match(/^session\./); stream.match(/^local\./); stream.match(/^global\./); } if (stream.eat("'")) { stream.match(/^.*'/); return "variable-2"; } else if (stream.eat('"')) { stream.match(/^.*"/); return "variable-2"; } else if (stream.eat("`")) { stream.match(/^.*`/); return "variable-2"; } else if (stream.match(/^[0-9a-zA-Z$\.\_]+/)) { return "variable-2"; } return null; }; // short client keyword token function hookClient(stream) { // \N means NULL // ref: http://dev.mysql.com/doc/refman/5.5/en/null-values.html if (stream.eat("N")) { return "atom"; } // \g, etc // ref: http://dev.mysql.com/doc/refman/5.5/en/mysql-commands.html return stream.match(/^[a-zA-Z.#!?]/) ? "variable-2" : null; } // these keywords are used by all SQL dialects (however, a mode can still overwrite it) var sqlKeywords = "alter and as asc between by count create delete desc distinct drop from having in insert into is join like not on or order select set table union update values where "; // turn a space-separated list into an array function set(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } // A generic SQL Mode. It's not a standard, it just try to support what is generally supported CodeMirror.defineMIME("text/x-sql", { name: "sql", keywords: set(sqlKeywords + "begin"), builtin: set("bool boolean bit blob enum long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision real date datetime year unsigned signed decimal numeric"), atoms: set("false true null unknown"), operatorChars: /^[*+\-%<>!=]/, dateSQL: set("date time timestamp"), support: set("ODBCdotTable doubleQuote binaryNumber hexNumber") }); CodeMirror.defineMIME("text/x-mssql", { name: "sql", client: set("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"), keywords: set(sqlKeywords + "begin trigger proc view index for add constraint key primary foreign collate clustered nonclustered declare"), builtin: set("bigint numeric bit smallint decimal smallmoney int tinyint money float real char varchar text nchar nvarchar ntext binary varbinary image cursor timestamp hierarchyid uniqueidentifier sql_variant xml table "), atoms: set("false true null unknown"), operatorChars: /^[*+\-%<>!=]/, dateSQL: set("date datetimeoffset datetime2 smalldatetime datetime time"), hooks: { "@": hookVar } }); CodeMirror.defineMIME("text/x-mysql", { name: "sql", client: set("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"), keywords: set(sqlKeywords + "accessible action add after algorithm all analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general get global grant grants group groupby_concat handler hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show signal slave slow smallint snapshot soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"), builtin: set("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"), atoms: set("false true null unknown"), operatorChars: /^[*+\-%<>!=&|^]/, dateSQL: set("date time timestamp"), support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"), hooks: { "@": hookVar, "`": hookIdentifier, "\\": hookClient } }); CodeMirror.defineMIME("text/x-mariadb", { name: "sql", client: set("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"), keywords: set(sqlKeywords + "accessible action add after algorithm all always analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general generated get global grant grants group groupby_concat handler hard hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password persistent phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show shutdown signal slave slow smallint snapshot soft soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views virtual warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"), builtin: set("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"), atoms: set("false true null unknown"), operatorChars: /^[*+\-%<>!=&|^]/, dateSQL: set("date time timestamp"), support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"), hooks: { "@": hookVar, "`": hookIdentifier, "\\": hookClient } }); // the query language used by Apache Cassandra is called CQL, but this mime type // is called Cassandra to avoid confusion with Contextual Query Language CodeMirror.defineMIME("text/x-cassandra", { name: "sql", client: { }, keywords: set("add all allow alter and any apply as asc authorize batch begin by clustering columnfamily compact consistency count create custom delete desc distinct drop each_quorum exists filtering from grant if in index insert into key keyspace keyspaces level limit local_one local_quorum modify nan norecursive nosuperuser not of on one order password permission permissions primary quorum rename revoke schema select set storage superuser table three to token truncate ttl two type unlogged update use user users using values where with writetime"), builtin: set("ascii bigint blob boolean counter decimal double float frozen inet int list map static text timestamp timeuuid tuple uuid varchar varint"), atoms: set("false true infinity NaN"), operatorChars: /^[<>=]/, dateSQL: { }, support: set("commentSlashSlash decimallessFloat"), hooks: { } }); // this is based on Peter Raganitsch's 'plsql' mode CodeMirror.defineMIME("text/x-plsql", { name: "sql", client: set("appinfo arraysize autocommit autoprint autorecovery autotrace blockterminator break btitle cmdsep colsep compatibility compute concat copycommit copytypecheck define describe echo editfile embedded escape exec execute feedback flagger flush heading headsep instance linesize lno loboffset logsource long longchunksize markup native newpage numformat numwidth pagesize pause pno recsep recsepchar release repfooter repheader serveroutput shiftinout show showmode size spool sqlblanklines sqlcase sqlcode sqlcontinue sqlnumber sqlpluscompatibility sqlprefix sqlprompt sqlterminator suffix tab term termout time timing trimout trimspool ttitle underline verify version wrap"), keywords: set("abort accept access add all alter and any array arraylen as asc assert assign at attributes audit authorization avg base_table begin between binary_integer body boolean by case cast char char_base check close cluster clusters colauth column comment commit compress connect connected constant constraint crash create current currval cursor data_base database date dba deallocate debugoff debugon decimal declare default definition delay delete desc digits dispose distinct do drop else elseif elsif enable end entry escape exception exception_init exchange exclusive exists exit external fast fetch file for force form from function generic goto grant group having identified if immediate in increment index indexes indicator initial initrans insert interface intersect into is key level library like limited local lock log logging long loop master maxextents maxtrans member minextents minus mislabel mode modify multiset new next no noaudit nocompress nologging noparallel not nowait number_base object of off offline on online only open option or order out package parallel partition pctfree pctincrease pctused pls_integer positive positiven pragma primary prior private privileges procedure public raise range raw read rebuild record ref references refresh release rename replace resource restrict return returning returns reverse revoke rollback row rowid rowlabel rownum rows run savepoint schema segment select separate session set share snapshot some space split sql start statement storage subtype successful synonym tabauth table tables tablespace task terminate then to trigger truncate type union unique unlimited unrecoverable unusable update use using validate value values variable view views when whenever where while with work"), builtin: set("abs acos add_months ascii asin atan atan2 average bfile bfilename bigserial bit blob ceil character chartorowid chr clob concat convert cos cosh count dec decode deref dual dump dup_val_on_index empty error exp false float floor found glb greatest hextoraw initcap instr instrb int integer isopen last_day least lenght lenghtb ln lower lpad ltrim lub make_ref max min mlslabel mod months_between natural naturaln nchar nclob new_time next_day nextval nls_charset_decl_len nls_charset_id nls_charset_name nls_initcap nls_lower nls_sort nls_upper nlssort no_data_found notfound null number numeric nvarchar2 nvl others power rawtohex real reftohex round rowcount rowidtochar rowtype rpad rtrim serial sign signtype sin sinh smallint soundex sqlcode sqlerrm sqrt stddev string substr substrb sum sysdate tan tanh to_char text to_date to_label to_multi_byte to_number to_single_byte translate true trunc uid unlogged upper user userenv varchar varchar2 variance varying vsize xml"), operatorChars: /^[*+\-%<>!=~]/, dateSQL: set("date time timestamp"), support: set("doubleQuote nCharCast zerolessFloat binaryNumber hexNumber") }); // Created to support specific hive keywords CodeMirror.defineMIME("text/x-hive", { name: "sql", keywords: set("select alter $elem$ $key$ $value$ add after all analyze and archive as asc before between binary both bucket buckets by cascade case cast change cluster clustered clusterstatus collection column columns comment compute concatenate continue create cross cursor data database databases dbproperties deferred delete delimited desc describe directory disable distinct distribute drop else enable end escaped exclusive exists explain export extended external false fetch fields fileformat first format formatted from full function functions grant group having hold_ddltime idxproperties if import in index indexes inpath inputdriver inputformat insert intersect into is items join keys lateral left like limit lines load local location lock locks mapjoin materialized minus msck no_drop nocompress not of offline on option or order out outer outputdriver outputformat overwrite partition partitioned partitions percent plus preserve procedure purge range rcfile read readonly reads rebuild recordreader recordwriter recover reduce regexp rename repair replace restrict revoke right rlike row schema schemas semi sequencefile serde serdeproperties set shared show show_database sort sorted ssl statistics stored streamtable table tables tablesample tblproperties temporary terminated textfile then tmp to touch transform trigger true unarchive undo union uniquejoin unlock update use using utc utc_tmestamp view when where while with"), builtin: set("bool boolean long timestamp tinyint smallint bigint int float double date datetime unsigned string array struct map uniontype"), atoms: set("false true null unknown"), operatorChars: /^[*+\-%<>!=]/, dateSQL: set("date timestamp"), support: set("ODBCdotTable doubleQuote binaryNumber hexNumber") }); }()); }); /* How Properties of Mime Types are used by SQL Mode ================================================= keywords: A list of keywords you want to be highlighted. builtin: A list of builtin types you want to be highlighted (if you want types to be of class "builtin" instead of "keyword"). operatorChars: All characters that must be handled as operators. client: Commands parsed and executed by the client (not the server). support: A list of supported syntaxes which are not common, but are supported by more than 1 DBMS. * ODBCdotTable: .tableName * zerolessFloat: .1 * doubleQuote * nCharCast: N'string' * charsetCast: _utf8'string' * commentHash: use # char for comments * commentSlashSlash: use // for comments * commentSpaceRequired: require a space after -- for comments atoms: Keywords that must be highlighted as atoms,. Some DBMS's support more atoms than others: UNKNOWN, INFINITY, UNDERFLOW, NaN... dateSQL: Used for date/time SQL standard syntax, because not all DBMS's support same temporal types. */ ================================================ FILE: base/res/codemirror/mode/stex/index.html ================================================ CodeMirror: sTeX mode

sTeX mode

MIME types defined: text/x-stex.

Parsing/Highlighting Tests: normal, verbose.

================================================ FILE: base/res/codemirror/mode/stex/stex.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /* * Author: Constantin Jucovschi (c.jucovschi@jacobs-university.de) * Licence: MIT */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("stex", function() { "use strict"; function pushCommand(state, command) { state.cmdState.push(command); } function peekCommand(state) { if (state.cmdState.length > 0) { return state.cmdState[state.cmdState.length - 1]; } else { return null; } } function popCommand(state) { var plug = state.cmdState.pop(); if (plug) { plug.closeBracket(); } } // returns the non-default plugin closest to the end of the list function getMostPowerful(state) { var context = state.cmdState; for (var i = context.length - 1; i >= 0; i--) { var plug = context[i]; if (plug.name == "DEFAULT") { continue; } return plug; } return { styleIdentifier: function() { return null; } }; } function addPluginPattern(pluginName, cmdStyle, styles) { return function () { this.name = pluginName; this.bracketNo = 0; this.style = cmdStyle; this.styles = styles; this.argument = null; // \begin and \end have arguments that follow. These are stored in the plugin this.styleIdentifier = function() { return this.styles[this.bracketNo - 1] || null; }; this.openBracket = function() { this.bracketNo++; return "bracket"; }; this.closeBracket = function() {}; }; } var plugins = {}; plugins["importmodule"] = addPluginPattern("importmodule", "tag", ["string", "builtin"]); plugins["documentclass"] = addPluginPattern("documentclass", "tag", ["", "atom"]); plugins["usepackage"] = addPluginPattern("usepackage", "tag", ["atom"]); plugins["begin"] = addPluginPattern("begin", "tag", ["atom"]); plugins["end"] = addPluginPattern("end", "tag", ["atom"]); plugins["DEFAULT"] = function () { this.name = "DEFAULT"; this.style = "tag"; this.styleIdentifier = this.openBracket = this.closeBracket = function() {}; }; function setState(state, f) { state.f = f; } // called when in a normal (no environment) context function normal(source, state) { var plug; // Do we look like '\command' ? If so, attempt to apply the plugin 'command' if (source.match(/^\\[a-zA-Z@]+/)) { var cmdName = source.current().slice(1); plug = plugins[cmdName] || plugins["DEFAULT"]; plug = new plug(); pushCommand(state, plug); setState(state, beginParams); return plug.style; } // escape characters if (source.match(/^\\[$&%#{}_]/)) { return "tag"; } // white space control characters if (source.match(/^\\[,;!\/\\]/)) { return "tag"; } // find if we're starting various math modes if (source.match("\\[")) { setState(state, function(source, state){ return inMathMode(source, state, "\\]"); }); return "keyword"; } if (source.match("$$")) { setState(state, function(source, state){ return inMathMode(source, state, "$$"); }); return "keyword"; } if (source.match("$")) { setState(state, function(source, state){ return inMathMode(source, state, "$"); }); return "keyword"; } var ch = source.next(); if (ch == "%") { source.skipToEnd(); return "comment"; } else if (ch == '}' || ch == ']') { plug = peekCommand(state); if (plug) { plug.closeBracket(ch); setState(state, beginParams); } else { return "error"; } return "bracket"; } else if (ch == '{' || ch == '[') { plug = plugins["DEFAULT"]; plug = new plug(); pushCommand(state, plug); return "bracket"; } else if (/\d/.test(ch)) { source.eatWhile(/[\w.%]/); return "atom"; } else { source.eatWhile(/[\w\-_]/); plug = getMostPowerful(state); if (plug.name == 'begin') { plug.argument = source.current(); } return plug.styleIdentifier(); } } function inMathMode(source, state, endModeSeq) { if (source.eatSpace()) { return null; } if (source.match(endModeSeq)) { setState(state, normal); return "keyword"; } if (source.match(/^\\[a-zA-Z@]+/)) { return "tag"; } if (source.match(/^[a-zA-Z]+/)) { return "variable-2"; } // escape characters if (source.match(/^\\[$&%#{}_]/)) { return "tag"; } // white space control characters if (source.match(/^\\[,;!\/]/)) { return "tag"; } // special math-mode characters if (source.match(/^[\^_&]/)) { return "tag"; } // non-special characters if (source.match(/^[+\-<>|=,\/@!*:;'"`~#?]/)) { return null; } if (source.match(/^(\d+\.\d*|\d*\.\d+|\d+)/)) { return "number"; } var ch = source.next(); if (ch == "{" || ch == "}" || ch == "[" || ch == "]" || ch == "(" || ch == ")") { return "bracket"; } if (ch == "%") { source.skipToEnd(); return "comment"; } return "error"; } function beginParams(source, state) { var ch = source.peek(), lastPlug; if (ch == '{' || ch == '[') { lastPlug = peekCommand(state); lastPlug.openBracket(ch); source.eat(ch); setState(state, normal); return "bracket"; } if (/[ \t\r]/.test(ch)) { source.eat(ch); return null; } setState(state, normal); popCommand(state); return normal(source, state); } return { startState: function() { return { cmdState: [], f: normal }; }, copyState: function(s) { return { cmdState: s.cmdState.slice(), f: s.f }; }, token: function(stream, state) { return state.f(stream, state); }, blankLine: function(state) { state.f = normal; state.cmdState.length = 0; }, lineComment: "%" }; }); CodeMirror.defineMIME("text/x-stex", "stex"); CodeMirror.defineMIME("text/x-latex", "stex"); }); ================================================ FILE: base/res/codemirror/mode/stex/test.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({tabSize: 4}, "stex"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } MT("word", "foo"); MT("twoWords", "foo bar"); MT("beginEndDocument", "[tag \\begin][bracket {][atom document][bracket }]", "[tag \\end][bracket {][atom document][bracket }]"); MT("beginEndEquation", "[tag \\begin][bracket {][atom equation][bracket }]", " E=mc^2", "[tag \\end][bracket {][atom equation][bracket }]"); MT("beginModule", "[tag \\begin][bracket {][atom module][bracket }[[]]]"); MT("beginModuleId", "[tag \\begin][bracket {][atom module][bracket }[[]id=bbt-size[bracket ]]]"); MT("importModule", "[tag \\importmodule][bracket [[][string b-b-t][bracket ]]{][builtin b-b-t][bracket }]"); MT("importModulePath", "[tag \\importmodule][bracket [[][tag \\KWARCslides][bracket {][string dmath/en/cardinality][bracket }]]{][builtin card][bracket }]"); MT("psForPDF", "[tag \\PSforPDF][bracket [[][atom 1][bracket ]]{]#1[bracket }]"); MT("comment", "[comment % foo]"); MT("tagComment", "[tag \\item][comment % bar]"); MT("commentTag", " [comment % \\item]"); MT("commentLineBreak", "[comment %]", "foo"); MT("tagErrorCurly", "[tag \\begin][error }][bracket {]"); MT("tagErrorSquare", "[tag \\item][error ]]][bracket {]"); MT("commentCurly", "[comment % }]"); MT("tagHash", "the [tag \\#] key"); MT("tagNumber", "a [tag \\$][atom 5] stetson"); MT("tagPercent", "[atom 100][tag \\%] beef"); MT("tagAmpersand", "L [tag \\&] N"); MT("tagUnderscore", "foo[tag \\_]bar"); MT("tagBracketOpen", "[tag \\emph][bracket {][tag \\{][bracket }]"); MT("tagBracketClose", "[tag \\emph][bracket {][tag \\}][bracket }]"); MT("tagLetterNumber", "section [tag \\S][atom 1]"); MT("textTagNumber", "para [tag \\P][atom 2]"); MT("thinspace", "x[tag \\,]y"); MT("thickspace", "x[tag \\;]y"); MT("negativeThinspace", "x[tag \\!]y"); MT("periodNotSentence", "J.\\ L.\\ is"); MT("periodSentence", "X[tag \\@]. The"); MT("italicCorrection", "[bracket {][tag \\em] If[tag \\/][bracket }] I"); MT("tagBracket", "[tag \\newcommand][bracket {][tag \\pop][bracket }]"); MT("inlineMathTagFollowedByNumber", "[keyword $][tag \\pi][number 2][keyword $]"); MT("inlineMath", "[keyword $][number 3][variable-2 x][tag ^][number 2.45]-[tag \\sqrt][bracket {][tag \\$\\alpha][bracket }] = [number 2][keyword $] other text"); MT("displayMath", "More [keyword $$]\t[variable-2 S][tag ^][variable-2 n][tag \\sum] [variable-2 i][keyword $$] other text"); MT("mathWithComment", "[keyword $][variable-2 x] [comment % $]", "[variable-2 y][keyword $] other text"); MT("lineBreakArgument", "[tag \\\\][bracket [[][atom 1cm][bracket ]]]"); })(); ================================================ FILE: base/res/codemirror/mode/stylus/index.html ================================================ CodeMirror: Stylus mode

Stylus mode

MIME types defined: text/x-styl.

Created by Dmitry Kiselyov

================================================ FILE: base/res/codemirror/mode/stylus/stylus.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Stylus mode created by Dmitry Kiselyov http://git.io/AaRB (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("stylus", function(config) { var indentUnit = config.indentUnit, tagKeywords = keySet(tagKeywords_), tagVariablesRegexp = /^(a|b|i|s|col|em)$/i, propertyKeywords = keySet(propertyKeywords_), nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_), valueKeywords = keySet(valueKeywords_), colorKeywords = keySet(colorKeywords_), documentTypes = keySet(documentTypes_), documentTypesRegexp = wordRegexp(documentTypes_), mediaFeatures = keySet(mediaFeatures_), mediaTypes = keySet(mediaTypes_), fontProperties = keySet(fontProperties_), operatorsRegexp = /^\s*([.]{2,3}|&&|\|\||\*\*|[?!=:]?=|[-+*\/%<>]=?|\?:|\~)/, wordOperatorKeywordsRegexp = wordRegexp(wordOperatorKeywords_), blockKeywords = keySet(blockKeywords_), vendorPrefixesRegexp = new RegExp(/^\-(moz|ms|o|webkit)-/i), commonAtoms = keySet(commonAtoms_), firstWordMatch = "", states = {}, ch, style, type, override; /** * Tokenizers */ function tokenBase(stream, state) { firstWordMatch = stream.string.match(/(^[\w-]+\s*=\s*$)|(^\s*[\w-]+\s*=\s*[\w-])|(^\s*(\.|#|@|\$|\&|\[|\d|\+|::?|\{|\>|~|\/)?\s*[\w-]*([a-z0-9-]|\*|\/\*)(\(|,)?)/); state.context.line.firstWord = firstWordMatch ? firstWordMatch[0].replace(/^\s*/, "") : ""; state.context.line.indent = stream.indentation(); ch = stream.peek(); // Line comment if (stream.match("//")) { stream.skipToEnd(); return ["comment", "comment"]; } // Block comment if (stream.match("/*")) { state.tokenize = tokenCComment; return tokenCComment(stream, state); } // String if (ch == "\"" || ch == "'") { stream.next(); state.tokenize = tokenString(ch); return state.tokenize(stream, state); } // Def if (ch == "@") { stream.next(); stream.eatWhile(/[\w\\-]/); return ["def", stream.current()]; } // ID selector or Hex color if (ch == "#") { stream.next(); // Hex color if (stream.match(/^[0-9a-f]{6}|[0-9a-f]{3}/i)) { return ["atom", "atom"]; } // ID selector if (stream.match(/^[a-z][\w-]*/i)) { return ["builtin", "hash"]; } } // Vendor prefixes if (stream.match(vendorPrefixesRegexp)) { return ["meta", "vendor-prefixes"]; } // Numbers if (stream.match(/^-?[0-9]?\.?[0-9]/)) { stream.eatWhile(/[a-z%]/i); return ["number", "unit"]; } // !important|optional if (ch == "!") { stream.next(); return [stream.match(/^(important|optional)/i) ? "keyword": "operator", "important"]; } // Class if (ch == "." && stream.match(/^\.[a-z][\w-]*/i)) { return ["qualifier", "qualifier"]; } // url url-prefix domain regexp if (stream.match(documentTypesRegexp)) { if (stream.peek() == "(") state.tokenize = tokenParenthesized; return ["property", "word"]; } // Mixins / Functions if (stream.match(/^[a-z][\w-]*\(/i)) { stream.backUp(1); return ["keyword", "mixin"]; } // Block mixins if (stream.match(/^(\+|-)[a-z][\w-]*\(/i)) { stream.backUp(1); return ["keyword", "block-mixin"]; } // Parent Reference BEM naming if (stream.string.match(/^\s*&/) && stream.match(/^[-_]+[a-z][\w-]*/)) { return ["qualifier", "qualifier"]; } // / Root Reference & Parent Reference if (stream.match(/^(\/|&)(-|_|:|\.|#|[a-z])/)) { stream.backUp(1); return ["variable-3", "reference"]; } if (stream.match(/^&{1}\s*$/)) { return ["variable-3", "reference"]; } // Variable if (ch == "$" && stream.match(/^\$[\w-]+/i)) { return ["variable-2", "variable-name"]; } // Word operator if (stream.match(wordOperatorKeywordsRegexp)) { return ["operator", "operator"]; } // Word if (stream.match(/^[-_]*[a-z0-9]+[\w-]*/i)) { if (stream.match(/^(\.|\[)[\w-\'\"\]]+/i, false)) { if (!wordIsTag(stream.current())) { stream.match(/[\w-]+/); return ["variable-2", "variable-name"]; } } return ["variable-2", "word"]; } // Operators if (stream.match(operatorsRegexp)) { return ["operator", stream.current()]; } // Delimiters if (/[:;,{}\[\]\(\)]/.test(ch)) { stream.next(); return [null, ch]; } // Non-detected items stream.next(); return [null, null]; } /** * Token comment */ function tokenCComment(stream, state) { var maybeEnd = false, ch; while ((ch = stream.next()) != null) { if (maybeEnd && ch == "/") { state.tokenize = null; break; } maybeEnd = (ch == "*"); } return ["comment", "comment"]; } /** * Token string */ function tokenString(quote) { return function(stream, state) { var escaped = false, ch; while ((ch = stream.next()) != null) { if (ch == quote && !escaped) { if (quote == ")") stream.backUp(1); break; } escaped = !escaped && ch == "\\"; } if (ch == quote || !escaped && quote != ")") state.tokenize = null; return ["string", "string"]; }; } /** * Token parenthesized */ function tokenParenthesized(stream, state) { stream.next(); // Must be "(" if (!stream.match(/\s*[\"\')]/, false)) state.tokenize = tokenString(")"); else state.tokenize = null; return [null, "("]; } /** * Context management */ function Context(type, indent, prev, line) { this.type = type; this.indent = indent; this.prev = prev; this.line = line || {firstWord: "", indent: 0}; } function pushContext(state, stream, type, indent) { indent = indent >= 0 ? indent : indentUnit; state.context = new Context(type, stream.indentation() + indent, state.context); return type; } function popContext(state, currentIndent) { var contextIndent = state.context.indent - indentUnit; currentIndent = currentIndent || false; state.context = state.context.prev; if (currentIndent) state.context.indent = contextIndent; return state.context.type; } function pass(type, stream, state) { return states[state.context.type](type, stream, state); } function popAndPass(type, stream, state, n) { for (var i = n || 1; i > 0; i--) state.context = state.context.prev; return pass(type, stream, state); } /** * Parser */ function wordIsTag(word) { return word.toLowerCase() in tagKeywords; } function wordIsProperty(word) { word = word.toLowerCase(); return word in propertyKeywords || word in fontProperties; } function wordIsBlock(word) { return word.toLowerCase() in blockKeywords; } function wordIsVendorPrefix(word) { return word.toLowerCase().match(vendorPrefixesRegexp); } function wordAsValue(word) { var wordLC = word.toLowerCase(); var override = "variable-2"; if (wordIsTag(word)) override = "tag"; else if (wordIsBlock(word)) override = "block-keyword"; else if (wordIsProperty(word)) override = "property"; else if (wordLC in valueKeywords || wordLC in commonAtoms) override = "atom"; else if (wordLC == "return" || wordLC in colorKeywords) override = "keyword"; // Font family else if (word.match(/^[A-Z]/)) override = "string"; return override; } function typeIsBlock(type, stream) { return ((endOfLine(stream) && (type == "{" || type == "]" || type == "hash" || type == "qualifier")) || type == "block-mixin"); } function typeIsInterpolation(type, stream) { return type == "{" && stream.match(/^\s*\$?[\w-]+/i, false); } function typeIsPseudo(type, stream) { return type == ":" && stream.match(/^[a-z-]+/, false); } function startOfLine(stream) { return stream.sol() || stream.string.match(new RegExp("^\\s*" + escapeRegExp(stream.current()))); } function endOfLine(stream) { return stream.eol() || stream.match(/^\s*$/, false); } function firstWordOfLine(line) { var re = /^\s*[-_]*[a-z0-9]+[\w-]*/i; var result = typeof line == "string" ? line.match(re) : line.string.match(re); return result ? result[0].replace(/^\s*/, "") : ""; } /** * Block */ states.block = function(type, stream, state) { if ((type == "comment" && startOfLine(stream)) || (type == "," && endOfLine(stream)) || type == "mixin") { return pushContext(state, stream, "block", 0); } if (typeIsInterpolation(type, stream)) { return pushContext(state, stream, "interpolation"); } if (endOfLine(stream) && type == "]") { if (!/^\s*(\.|#|:|\[|\*|&)/.test(stream.string) && !wordIsTag(firstWordOfLine(stream))) { return pushContext(state, stream, "block", 0); } } if (typeIsBlock(type, stream, state)) { return pushContext(state, stream, "block"); } if (type == "}" && endOfLine(stream)) { return pushContext(state, stream, "block", 0); } if (type == "variable-name") { if ((stream.indentation() == 0 && startOfLine(stream)) || wordIsBlock(firstWordOfLine(stream))) { return pushContext(state, stream, "variableName"); } else { return pushContext(state, stream, "variableName", 0); } } if (type == "=") { if (!endOfLine(stream) && !wordIsBlock(firstWordOfLine(stream))) { return pushContext(state, stream, "block", 0); } return pushContext(state, stream, "block"); } if (type == "*") { if (endOfLine(stream) || stream.match(/\s*(,|\.|#|\[|:|{)/,false)) { override = "tag"; return pushContext(state, stream, "block"); } } if (typeIsPseudo(type, stream)) { return pushContext(state, stream, "pseudo"); } if (/@(font-face|media|supports|(-moz-)?document)/.test(type)) { return pushContext(state, stream, endOfLine(stream) ? "block" : "atBlock"); } if (/@(-(moz|ms|o|webkit)-)?keyframes$/.test(type)) { return pushContext(state, stream, "keyframes"); } if (/@extends?/.test(type)) { return pushContext(state, stream, "extend", 0); } if (type && type.charAt(0) == "@") { // Property Lookup if (stream.indentation() > 0 && wordIsProperty(stream.current().slice(1))) { override = "variable-2"; return "block"; } if (/(@import|@require|@charset)/.test(type)) { return pushContext(state, stream, "block", 0); } return pushContext(state, stream, "block"); } if (type == "reference" && endOfLine(stream)) { return pushContext(state, stream, "block"); } if (type == "(") { return pushContext(state, stream, "parens"); } if (type == "vendor-prefixes") { return pushContext(state, stream, "vendorPrefixes"); } if (type == "word") { var word = stream.current(); override = wordAsValue(word); if (override == "property") { if (startOfLine(stream)) { return pushContext(state, stream, "block", 0); } else { override = "atom"; return "block"; } } if (override == "tag") { // tag is a css value if (/embed|menu|pre|progress|sub|table/.test(word)) { if (wordIsProperty(firstWordOfLine(stream))) { override = "atom"; return "block"; } } // tag is an attribute if (stream.string.match(new RegExp("\\[\\s*" + word + "|" + word +"\\s*\\]"))) { override = "atom"; return "block"; } // tag is a variable if (tagVariablesRegexp.test(word)) { if ((startOfLine(stream) && stream.string.match(/=/)) || (!startOfLine(stream) && !stream.string.match(/^(\s*\.|#|\&|\[|\/|>|\*)/) && !wordIsTag(firstWordOfLine(stream)))) { override = "variable-2"; if (wordIsBlock(firstWordOfLine(stream))) return "block"; return pushContext(state, stream, "block", 0); } } if (endOfLine(stream)) return pushContext(state, stream, "block"); } if (override == "block-keyword") { override = "keyword"; // Postfix conditionals if (stream.current(/(if|unless)/) && !startOfLine(stream)) { return "block"; } return pushContext(state, stream, "block"); } if (word == "return") return pushContext(state, stream, "block", 0); } return state.context.type; }; /** * Parens */ states.parens = function(type, stream, state) { if (type == "(") return pushContext(state, stream, "parens"); if (type == ")") { if (state.context.prev.type == "parens") { return popContext(state); } if ((stream.string.match(/^[a-z][\w-]*\(/i) && endOfLine(stream)) || wordIsBlock(firstWordOfLine(stream)) || /(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(firstWordOfLine(stream)) || (!stream.string.match(/^-?[a-z][\w-\.\[\]\'\"]*\s*=/) && wordIsTag(firstWordOfLine(stream)))) { return pushContext(state, stream, "block"); } if (stream.string.match(/^[\$-]?[a-z][\w-\.\[\]\'\"]*\s*=/) || stream.string.match(/^\s*(\(|\)|[0-9])/) || stream.string.match(/^\s+[a-z][\w-]*\(/i) || stream.string.match(/^\s+[\$-]?[a-z]/i)) { return pushContext(state, stream, "block", 0); } if (endOfLine(stream)) return pushContext(state, stream, "block"); else return pushContext(state, stream, "block", 0); } if (type && type.charAt(0) == "@" && wordIsProperty(stream.current().slice(1))) { override = "variable-2"; } if (type == "word") { var word = stream.current(); override = wordAsValue(word); if (override == "tag" && tagVariablesRegexp.test(word)) { override = "variable-2"; } if (override == "property" || word == "to") override = "atom"; } if (type == "variable-name") { return pushContext(state, stream, "variableName"); } if (typeIsPseudo(type, stream)) { return pushContext(state, stream, "pseudo"); } return state.context.type; }; /** * Vendor prefixes */ states.vendorPrefixes = function(type, stream, state) { if (type == "word") { override = "property"; return pushContext(state, stream, "block", 0); } return popContext(state); }; /** * Pseudo */ states.pseudo = function(type, stream, state) { if (!wordIsProperty(firstWordOfLine(stream.string))) { stream.match(/^[a-z-]+/); override = "variable-3"; if (endOfLine(stream)) return pushContext(state, stream, "block"); return popContext(state); } return popAndPass(type, stream, state); }; /** * atBlock */ states.atBlock = function(type, stream, state) { if (type == "(") return pushContext(state, stream, "atBlock_parens"); if (typeIsBlock(type, stream, state)) { return pushContext(state, stream, "block"); } if (typeIsInterpolation(type, stream)) { return pushContext(state, stream, "interpolation"); } if (type == "word") { var word = stream.current().toLowerCase(); if (/^(only|not|and|or)$/.test(word)) override = "keyword"; else if (documentTypes.hasOwnProperty(word)) override = "tag"; else if (mediaTypes.hasOwnProperty(word)) override = "attribute"; else if (mediaFeatures.hasOwnProperty(word)) override = "property"; else if (nonStandardPropertyKeywords.hasOwnProperty(word)) override = "string-2"; else override = wordAsValue(stream.current()); if (override == "tag" && endOfLine(stream)) { return pushContext(state, stream, "block"); } } if (type == "operator" && /^(not|and|or)$/.test(stream.current())) { override = "keyword"; } return state.context.type; }; states.atBlock_parens = function(type, stream, state) { if (type == "{" || type == "}") return state.context.type; if (type == ")") { if (endOfLine(stream)) return pushContext(state, stream, "block"); else return pushContext(state, stream, "atBlock"); } if (type == "word") { var word = stream.current().toLowerCase(); override = wordAsValue(word); if (/^(max|min)/.test(word)) override = "property"; if (override == "tag") { tagVariablesRegexp.test(word) ? override = "variable-2" : override = "atom"; } return state.context.type; } return states.atBlock(type, stream, state); }; /** * Keyframes */ states.keyframes = function(type, stream, state) { if (stream.indentation() == "0" && ((type == "}" && startOfLine(stream)) || type == "]" || type == "hash" || type == "qualifier" || wordIsTag(stream.current()))) { return popAndPass(type, stream, state); } if (type == "{") return pushContext(state, stream, "keyframes"); if (type == "}") { if (startOfLine(stream)) return popContext(state, true); else return pushContext(state, stream, "keyframes"); } if (type == "unit" && /^[0-9]+\%$/.test(stream.current())) { return pushContext(state, stream, "keyframes"); } if (type == "word") { override = wordAsValue(stream.current()); if (override == "block-keyword") { override = "keyword"; return pushContext(state, stream, "keyframes"); } } if (/@(font-face|media|supports|(-moz-)?document)/.test(type)) { return pushContext(state, stream, endOfLine(stream) ? "block" : "atBlock"); } if (type == "mixin") { return pushContext(state, stream, "block", 0); } return state.context.type; }; /** * Interpolation */ states.interpolation = function(type, stream, state) { if (type == "{") popContext(state) && pushContext(state, stream, "block"); if (type == "}") { if (stream.string.match(/^\s*(\.|#|:|\[|\*|&|>|~|\+|\/)/i) || (stream.string.match(/^\s*[a-z]/i) && wordIsTag(firstWordOfLine(stream)))) { return pushContext(state, stream, "block"); } if (!stream.string.match(/^(\{|\s*\&)/) || stream.match(/\s*[\w-]/,false)) { return pushContext(state, stream, "block", 0); } return pushContext(state, stream, "block"); } if (type == "variable-name") { return pushContext(state, stream, "variableName", 0); } if (type == "word") { override = wordAsValue(stream.current()); if (override == "tag") override = "atom"; } return state.context.type; }; /** * Extend/s */ states.extend = function(type, stream, state) { if (type == "[" || type == "=") return "extend"; if (type == "]") return popContext(state); if (type == "word") { override = wordAsValue(stream.current()); return "extend"; } return popContext(state); }; /** * Variable name */ states.variableName = function(type, stream, state) { if (type == "string" || type == "[" || type == "]" || stream.current().match(/^(\.|\$)/)) { if (stream.current().match(/^\.[\w-]+/i)) override = "variable-2"; if (endOfLine(stream)) return popContext(state); return "variableName"; } return popAndPass(type, stream, state); }; return { startState: function(base) { return { tokenize: null, state: "block", context: new Context("block", base || 0, null) }; }, token: function(stream, state) { if (!state.tokenize && stream.eatSpace()) return null; style = (state.tokenize || tokenBase)(stream, state); if (style && typeof style == "object") { type = style[1]; style = style[0]; } override = style; state.state = states[state.state](type, stream, state); return override; }, indent: function(state, textAfter, line) { var cx = state.context, ch = textAfter && textAfter.charAt(0), indent = cx.indent, lineFirstWord = firstWordOfLine(textAfter), lineIndent = line.length - line.replace(/^\s*/, "").length, prevLineFirstWord = state.context.prev ? state.context.prev.line.firstWord : "", prevLineIndent = state.context.prev ? state.context.prev.line.indent : lineIndent; if (cx.prev && (ch == "}" && (cx.type == "block" || cx.type == "atBlock" || cx.type == "keyframes") || ch == ")" && (cx.type == "parens" || cx.type == "atBlock_parens") || ch == "{" && (cx.type == "at"))) { indent = cx.indent - indentUnit; cx = cx.prev; } else if (!(/(\})/.test(ch))) { if (/@|\$|\d/.test(ch) || /^\{/.test(textAfter) || /^\s*\/(\/|\*)/.test(textAfter) || /^\s*\/\*/.test(prevLineFirstWord) || /^\s*[\w-\.\[\]\'\"]+\s*(\?|:|\+)?=/i.test(textAfter) || /^(\+|-)?[a-z][\w-]*\(/i.test(textAfter) || /^return/.test(textAfter) || wordIsBlock(lineFirstWord)) { indent = lineIndent; } else if (/(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(ch) || wordIsTag(lineFirstWord)) { if (/\,\s*$/.test(prevLineFirstWord)) { indent = prevLineIndent; } else if (/^\s+/.test(line) && (/(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(prevLineFirstWord) || wordIsTag(prevLineFirstWord))) { indent = lineIndent <= prevLineIndent ? prevLineIndent : prevLineIndent + indentUnit; } else { indent = lineIndent; } } else if (!/,\s*$/.test(line) && (wordIsVendorPrefix(lineFirstWord) || wordIsProperty(lineFirstWord))) { if (wordIsBlock(prevLineFirstWord)) { indent = lineIndent <= prevLineIndent ? prevLineIndent : prevLineIndent + indentUnit; } else if (/^\{/.test(prevLineFirstWord)) { indent = lineIndent <= prevLineIndent ? lineIndent : prevLineIndent + indentUnit; } else if (wordIsVendorPrefix(prevLineFirstWord) || wordIsProperty(prevLineFirstWord)) { indent = lineIndent >= prevLineIndent ? prevLineIndent : lineIndent; } else if (/^(\.|#|:|\[|\*|&|@|\+|\-|>|~|\/)/.test(prevLineFirstWord) || /=\s*$/.test(prevLineFirstWord) || wordIsTag(prevLineFirstWord) || /^\$[\w-\.\[\]\'\"]/.test(prevLineFirstWord)) { indent = prevLineIndent + indentUnit; } else { indent = lineIndent; } } } return indent; }, electricChars: "}", lineComment: "//", fold: "indent" }; }); // developer.mozilla.org/en-US/docs/Web/HTML/Element var tagKeywords_ = ["a","abbr","address","area","article","aside","audio", "b", "base","bdi", "bdo","bgsound","blockquote","body","br","button","canvas","caption","cite", "code","col","colgroup","data","datalist","dd","del","details","dfn","div", "dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1", "h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe", "img","input","ins","kbd","keygen","label","legend","li","link","main","map", "mark","marquee","menu","menuitem","meta","meter","nav","nobr","noframes", "noscript","object","ol","optgroup","option","output","p","param","pre", "progress","q","rp","rt","ruby","s","samp","script","section","select", "small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","track", "u","ul","var","video"]; // github.com/codemirror/CodeMirror/blob/master/mode/css/css.js var documentTypes_ = ["domain", "regexp", "url", "url-prefix"]; var mediaTypes_ = ["all","aural","braille","handheld","print","projection","screen","tty","tv","embossed"]; var mediaFeatures_ = ["width","min-width","max-width","height","min-height","max-height","device-width","min-device-width","max-device-width","device-height","min-device-height","max-device-height","aspect-ratio","min-aspect-ratio","max-aspect-ratio","device-aspect-ratio","min-device-aspect-ratio","max-device-aspect-ratio","color","min-color","max-color","color-index","min-color-index","max-color-index","monochrome","min-monochrome","max-monochrome","resolution","min-resolution","max-resolution","scan","grid"]; var propertyKeywords_ = ["align-content","align-items","align-self","alignment-adjust","alignment-baseline","anchor-point","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","appearance","azimuth","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","baseline-shift","binding","bleed","bookmark-label","bookmark-level","bookmark-state","bookmark-target","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","color","color-profile","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","crop","cue","cue-after","cue-before","cursor","direction","display","dominant-baseline","drop-initial-after-adjust","drop-initial-after-align","drop-initial-before-adjust","drop-initial-before-align","drop-initial-size","drop-initial-value","elevation","empty-cells","fit","fit-position","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","float-offset","flow-from","flow-into","font","font-feature-settings","font-family","font-kerning","font-language-override","font-size","font-size-adjust","font-stretch","font-style","font-synthesis","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-weight","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-position","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","inline-box-align","justify-content","left","letter-spacing","line-break","line-height","line-stacking","line-stacking-ruby","line-stacking-shift","line-stacking-strategy","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marker-offset","marks","marquee-direction","marquee-loop","marquee-play-count","marquee-speed","marquee-style","max-height","max-width","min-height","min-width","move-to","nav-down","nav-index","nav-left","nav-right","nav-up","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-style","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","page-policy","pause","pause-after","pause-before","perspective","perspective-origin","pitch","pitch-range","play-during","position","presentation-level","punctuation-trim","quotes","region-break-after","region-break-before","region-break-inside","region-fragment","rendering-intent","resize","rest","rest-after","rest-before","richness","right","rotation","rotation-point","ruby-align","ruby-overhang","ruby-position","ruby-span","shape-image-threshold","shape-inside","shape-margin","shape-outside","size","speak","speak-as","speak-header","speak-numeral","speak-punctuation","speech-rate","stress","string-set","tab-size","table-layout","target","target-name","target-new","target-position","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-height","text-indent","text-justify","text-outline","text-overflow","text-shadow","text-size-adjust","text-space-collapse","text-transform","text-underline-position","text-wrap","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","volume","white-space","widows","width","word-break","word-spacing","word-wrap","z-index","clip-path","clip-rule","mask","enable-background","filter","flood-color","flood-opacity","lighting-color","stop-color","stop-opacity","pointer-events","color-interpolation","color-interpolation-filters","color-rendering","fill","fill-opacity","fill-rule","image-rendering","marker","marker-end","marker-mid","marker-start","shape-rendering","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-rendering","baseline-shift","dominant-baseline","glyph-orientation-horizontal","glyph-orientation-vertical","text-anchor","writing-mode","font-smoothing","osx-font-smoothing"]; var nonStandardPropertyKeywords_ = ["scrollbar-arrow-color","scrollbar-base-color","scrollbar-dark-shadow-color","scrollbar-face-color","scrollbar-highlight-color","scrollbar-shadow-color","scrollbar-3d-light-color","scrollbar-track-color","shape-inside","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","zoom"]; var fontProperties_ = ["font-family","src","unicode-range","font-variant","font-feature-settings","font-stretch","font-weight","font-style"]; var colorKeywords_ = ["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"]; var valueKeywords_ = ["above","absolute","activeborder","additive","activecaption","afar","after-white-space","ahead","alias","all","all-scroll","alphabetic","alternate","always","amharic","amharic-abegede","antialiased","appworkspace","arabic-indic","armenian","asterisks","attr","auto","avoid","avoid-column","avoid-page","avoid-region","background","backwards","baseline","below","bidi-override","binary","bengali","blink","block","block-axis","bold","bolder","border","border-box","both","bottom","break","break-all","break-word","bullets","button","button-bevel","buttonface","buttonhighlight","buttonshadow","buttontext","calc","cambodian","capitalize","caps-lock-indicator","caption","captiontext","caret","cell","center","checkbox","circle","cjk-decimal","cjk-earthly-branch","cjk-heavenly-stem","cjk-ideographic","clear","clip","close-quote","col-resize","collapse","column","compact","condensed","contain","content","content-box","context-menu","continuous","copy","counter","counters","cover","crop","cross","crosshair","currentcolor","cursive","cyclic","dashed","decimal","decimal-leading-zero","default","default-button","destination-atop","destination-in","destination-out","destination-over","devanagari","disc","discard","disclosure-closed","disclosure-open","document","dot-dash","dot-dot-dash","dotted","double","down","e-resize","ease","ease-in","ease-in-out","ease-out","element","ellipse","ellipsis","embed","end","ethiopic","ethiopic-abegede","ethiopic-abegede-am-et","ethiopic-abegede-gez","ethiopic-abegede-ti-er","ethiopic-abegede-ti-et","ethiopic-halehame-aa-er","ethiopic-halehame-aa-et","ethiopic-halehame-am-et","ethiopic-halehame-gez","ethiopic-halehame-om-et","ethiopic-halehame-sid-et","ethiopic-halehame-so-et","ethiopic-halehame-ti-er","ethiopic-halehame-ti-et","ethiopic-halehame-tig","ethiopic-numeric","ew-resize","expanded","extends","extra-condensed","extra-expanded","fantasy","fast","fill","fixed","flat","flex","footnotes","forwards","from","geometricPrecision","georgian","graytext","groove","gujarati","gurmukhi","hand","hangul","hangul-consonant","hebrew","help","hidden","hide","higher","highlight","highlighttext","hiragana","hiragana-iroha","horizontal","hsl","hsla","icon","ignore","inactiveborder","inactivecaption","inactivecaptiontext","infinite","infobackground","infotext","inherit","initial","inline","inline-axis","inline-block","inline-flex","inline-table","inset","inside","intrinsic","invert","italic","japanese-formal","japanese-informal","justify","kannada","katakana","katakana-iroha","keep-all","khmer","korean-hangul-formal","korean-hanja-formal","korean-hanja-informal","landscape","lao","large","larger","left","level","lighter","line-through","linear","linear-gradient","lines","list-item","listbox","listitem","local","logical","loud","lower","lower-alpha","lower-armenian","lower-greek","lower-hexadecimal","lower-latin","lower-norwegian","lower-roman","lowercase","ltr","malayalam","match","matrix","matrix3d","media-controls-background","media-current-time-display","media-fullscreen-button","media-mute-button","media-play-button","media-return-to-realtime-button","media-rewind-button","media-seek-back-button","media-seek-forward-button","media-slider","media-sliderthumb","media-time-remaining-display","media-volume-slider","media-volume-slider-container","media-volume-sliderthumb","medium","menu","menulist","menulist-button","menulist-text","menulist-textfield","menutext","message-box","middle","min-intrinsic","mix","mongolian","monospace","move","multiple","myanmar","n-resize","narrower","ne-resize","nesw-resize","no-close-quote","no-drop","no-open-quote","no-repeat","none","normal","not-allowed","nowrap","ns-resize","numbers","numeric","nw-resize","nwse-resize","oblique","octal","open-quote","optimizeLegibility","optimizeSpeed","oriya","oromo","outset","outside","outside-shape","overlay","overline","padding","padding-box","painted","page","paused","persian","perspective","plus-darker","plus-lighter","pointer","polygon","portrait","pre","pre-line","pre-wrap","preserve-3d","progress","push-button","radial-gradient","radio","read-only","read-write","read-write-plaintext-only","rectangle","region","relative","repeat","repeating-linear-gradient","repeating-radial-gradient","repeat-x","repeat-y","reset","reverse","rgb","rgba","ridge","right","rotate","rotate3d","rotateX","rotateY","rotateZ","round","row-resize","rtl","run-in","running","s-resize","sans-serif","scale","scale3d","scaleX","scaleY","scaleZ","scroll","scrollbar","se-resize","searchfield","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","semi-condensed","semi-expanded","separate","serif","show","sidama","simp-chinese-formal","simp-chinese-informal","single","skew","skewX","skewY","skip-white-space","slide","slider-horizontal","slider-vertical","sliderthumb-horizontal","sliderthumb-vertical","slow","small","small-caps","small-caption","smaller","solid","somali","source-atop","source-in","source-out","source-over","space","spell-out","square","square-button","start","static","status-bar","stretch","stroke","sub","subpixel-antialiased","super","sw-resize","symbolic","symbols","table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row","table-row-group","tamil","telugu","text","text-bottom","text-top","textarea","textfield","thai","thick","thin","threeddarkshadow","threedface","threedhighlight","threedlightshadow","threedshadow","tibetan","tigre","tigrinya-er","tigrinya-er-abegede","tigrinya-et","tigrinya-et-abegede","to","top","trad-chinese-formal","trad-chinese-informal","translate","translate3d","translateX","translateY","translateZ","transparent","ultra-condensed","ultra-expanded","underline","up","upper-alpha","upper-armenian","upper-greek","upper-hexadecimal","upper-latin","upper-norwegian","upper-roman","uppercase","urdu","url","var","vertical","vertical-text","visible","visibleFill","visiblePainted","visibleStroke","visual","w-resize","wait","wave","wider","window","windowframe","windowtext","words","x-large","x-small","xor","xx-large","xx-small","bicubic","optimizespeed","grayscale"]; var wordOperatorKeywords_ = ["in","and","or","not","is not","is a","is","isnt","defined","if unless"], blockKeywords_ = ["for","if","else","unless", "from", "to"], commonAtoms_ = ["null","true","false","href","title","type","not-allowed","readonly","disabled"], commonDef_ = ["@font-face", "@keyframes", "@media", "@viewport", "@page", "@host", "@supports", "@block", "@css"]; var hintWords = tagKeywords_.concat(documentTypes_,mediaTypes_,mediaFeatures_, propertyKeywords_,nonStandardPropertyKeywords_, colorKeywords_,valueKeywords_,fontProperties_, wordOperatorKeywords_,blockKeywords_, commonAtoms_,commonDef_); function wordRegexp(words) { words = words.sort(function(a,b){return b > a;}); return new RegExp("^((" + words.join(")|(") + "))\\b"); } function keySet(array) { var keys = {}; for (var i = 0; i < array.length; ++i) keys[array[i]] = true; return keys; } function escapeRegExp(text) { return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); } CodeMirror.registerHelper("hintWords", "stylus", hintWords); CodeMirror.defineMIME("text/x-styl", "stylus"); }); ================================================ FILE: base/res/codemirror/mode/tcl/index.html ================================================ CodeMirror: Tcl mode

Tcl mode

MIME types defined: text/x-tcl.

================================================ FILE: base/res/codemirror/mode/tcl/tcl.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE //tcl mode by Ford_Lawnmower :: Based on Velocity mode by Steve O'Hara (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("tcl", function() { function parseWords(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } var keywords = parseWords("Tcl safe after append array auto_execok auto_import auto_load " + "auto_mkindex auto_mkindex_old auto_qualify auto_reset bgerror " + "binary break catch cd close concat continue dde eof encoding error " + "eval exec exit expr fblocked fconfigure fcopy file fileevent filename " + "filename flush for foreach format gets glob global history http if " + "incr info interp join lappend lindex linsert list llength load lrange " + "lreplace lsearch lset lsort memory msgcat namespace open package parray " + "pid pkg::create pkg_mkIndex proc puts pwd re_syntax read regex regexp " + "registry regsub rename resource return scan seek set socket source split " + "string subst switch tcl_endOfWord tcl_findLibrary tcl_startOfNextWord " + "tcl_wordBreakAfter tcl_startOfPreviousWord tcl_wordBreakBefore tcltest " + "tclvars tell time trace unknown unset update uplevel upvar variable " + "vwait"); var functions = parseWords("if elseif else and not or eq ne in ni for foreach while switch"); var isOperatorChar = /[+\-*&%=<>!?^\/\|]/; function chain(stream, state, f) { state.tokenize = f; return f(stream, state); } function tokenBase(stream, state) { var beforeParams = state.beforeParams; state.beforeParams = false; var ch = stream.next(); if ((ch == '"' || ch == "'") && state.inParams) return chain(stream, state, tokenString(ch)); else if (/[\[\]{}\(\),;\.]/.test(ch)) { if (ch == "(" && beforeParams) state.inParams = true; else if (ch == ")") state.inParams = false; return null; } else if (/\d/.test(ch)) { stream.eatWhile(/[\w\.]/); return "number"; } else if (ch == "#" && stream.eat("*")) { return chain(stream, state, tokenComment); } else if (ch == "#" && stream.match(/ *\[ *\[/)) { return chain(stream, state, tokenUnparsed); } else if (ch == "#" && stream.eat("#")) { stream.skipToEnd(); return "comment"; } else if (ch == '"') { stream.skipTo(/"/); return "comment"; } else if (ch == "$") { stream.eatWhile(/[$_a-z0-9A-Z\.{:]/); stream.eatWhile(/}/); state.beforeParams = true; return "builtin"; } else if (isOperatorChar.test(ch)) { stream.eatWhile(isOperatorChar); return "comment"; } else { stream.eatWhile(/[\w\$_{}\xa1-\uffff]/); var word = stream.current().toLowerCase(); if (keywords && keywords.propertyIsEnumerable(word)) return "keyword"; if (functions && functions.propertyIsEnumerable(word)) { state.beforeParams = true; return "keyword"; } return null; } } function tokenString(quote) { return function(stream, state) { var escaped = false, next, end = false; while ((next = stream.next()) != null) { if (next == quote && !escaped) { end = true; break; } escaped = !escaped && next == "\\"; } if (end) state.tokenize = tokenBase; return "string"; }; } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "#" && maybeEnd) { state.tokenize = tokenBase; break; } maybeEnd = (ch == "*"); } return "comment"; } function tokenUnparsed(stream, state) { var maybeEnd = 0, ch; while (ch = stream.next()) { if (ch == "#" && maybeEnd == 2) { state.tokenize = tokenBase; break; } if (ch == "]") maybeEnd++; else if (ch != " ") maybeEnd = 0; } return "meta"; } return { startState: function() { return { tokenize: tokenBase, beforeParams: false, inParams: false }; }, token: function(stream, state) { if (stream.eatSpace()) return null; return state.tokenize(stream, state); } }; }); CodeMirror.defineMIME("text/x-tcl", "tcl"); }); ================================================ FILE: base/res/codemirror/mode/textile/index.html ================================================ CodeMirror: Textile mode

Textile mode

MIME types defined: text/x-textile.

Parsing/Highlighting Tests: normal, verbose.

================================================ FILE: base/res/codemirror/mode/textile/test.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({tabSize: 4}, 'textile'); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } MT('simpleParagraphs', 'Some text.', '', 'Some more text.'); /* * Phrase Modifiers */ MT('em', 'foo [em _bar_]'); MT('emBoogus', 'code_mirror'); MT('strong', 'foo [strong *bar*]'); MT('strongBogus', '3 * 3 = 9'); MT('italic', 'foo [em __bar__]'); MT('italicBogus', 'code__mirror'); MT('bold', 'foo [strong **bar**]'); MT('boldBogus', '3 ** 3 = 27'); MT('simpleLink', '[link "CodeMirror":http://codemirror.net]'); MT('referenceLink', '[link "CodeMirror":code_mirror]', 'Normal Text.', '[link [[code_mirror]]http://codemirror.net]'); MT('footCite', 'foo bar[qualifier [[1]]]'); MT('footCiteBogus', 'foo bar[[1a2]]'); MT('special-characters', 'Registered [tag (r)], ' + 'Trademark [tag (tm)], and ' + 'Copyright [tag (c)] 2008'); MT('cite', "A book is [keyword ??The Count of Monte Cristo??] by Dumas."); MT('additionAndDeletion', 'The news networks declared [negative -Al Gore-] ' + '[positive +George W. Bush+] the winner in Florida.'); MT('subAndSup', 'f(x, n) = log [builtin ~4~] x [builtin ^n^]'); MT('spanAndCode', 'A [quote %span element%] and [atom @code element@]'); MT('spanBogus', 'Percentage 25% is not a span.'); MT('citeBogus', 'Question? is not a citation.'); MT('codeBogus', 'user@example.com'); MT('subBogus', '~username'); MT('supBogus', 'foo ^ bar'); MT('deletionBogus', '3 - 3 = 0'); MT('additionBogus', '3 + 3 = 6'); MT('image', 'An image: [string !http://www.example.com/image.png!]'); MT('imageWithAltText', 'An image: [string !http://www.example.com/image.png (Alt Text)!]'); MT('imageWithUrl', 'An image: [string !http://www.example.com/image.png!:http://www.example.com/]'); /* * Headers */ MT('h1', '[header&header-1 h1. foo]'); MT('h2', '[header&header-2 h2. foo]'); MT('h3', '[header&header-3 h3. foo]'); MT('h4', '[header&header-4 h4. foo]'); MT('h5', '[header&header-5 h5. foo]'); MT('h6', '[header&header-6 h6. foo]'); MT('h7Bogus', 'h7. foo'); MT('multipleHeaders', '[header&header-1 h1. Heading 1]', '', 'Some text.', '', '[header&header-2 h2. Heading 2]', '', 'More text.'); MT('h1inline', '[header&header-1 h1. foo ][header&header-1&em _bar_][header&header-1 baz]'); /* * Lists */ MT('ul', 'foo', 'bar', '', '[variable-2 * foo]', '[variable-2 * bar]'); MT('ulNoBlank', 'foo', 'bar', '[variable-2 * foo]', '[variable-2 * bar]'); MT('ol', 'foo', 'bar', '', '[variable-2 # foo]', '[variable-2 # bar]'); MT('olNoBlank', 'foo', 'bar', '[variable-2 # foo]', '[variable-2 # bar]'); MT('ulFormatting', '[variable-2 * ][variable-2&em _foo_][variable-2 bar]', '[variable-2 * ][variable-2&strong *][variable-2&em&strong _foo_]' + '[variable-2&strong *][variable-2 bar]', '[variable-2 * ][variable-2&strong *foo*][variable-2 bar]'); MT('olFormatting', '[variable-2 # ][variable-2&em _foo_][variable-2 bar]', '[variable-2 # ][variable-2&strong *][variable-2&em&strong _foo_]' + '[variable-2&strong *][variable-2 bar]', '[variable-2 # ][variable-2&strong *foo*][variable-2 bar]'); MT('ulNested', '[variable-2 * foo]', '[variable-3 ** bar]', '[keyword *** bar]', '[variable-2 **** bar]', '[variable-3 ** bar]'); MT('olNested', '[variable-2 # foo]', '[variable-3 ## bar]', '[keyword ### bar]', '[variable-2 #### bar]', '[variable-3 ## bar]'); MT('ulNestedWithOl', '[variable-2 * foo]', '[variable-3 ## bar]', '[keyword *** bar]', '[variable-2 #### bar]', '[variable-3 ** bar]'); MT('olNestedWithUl', '[variable-2 # foo]', '[variable-3 ** bar]', '[keyword ### bar]', '[variable-2 **** bar]', '[variable-3 ## bar]'); MT('definitionList', '[number - coffee := Hot ][number&em _and_][number black]', '', 'Normal text.'); MT('definitionListSpan', '[number - coffee :=]', '', '[number Hot ][number&em _and_][number black =:]', '', 'Normal text.'); MT('boo', '[number - dog := woof woof]', '[number - cat := meow meow]', '[number - whale :=]', '[number Whale noises.]', '', '[number Also, ][number&em _splashing_][number . =:]'); /* * Attributes */ MT('divWithAttribute', '[punctuation div][punctuation&attribute (#my-id)][punctuation . foo bar]'); MT('divWithAttributeAnd2emRightPadding', '[punctuation div][punctuation&attribute (#my-id)((][punctuation . foo bar]'); MT('divWithClassAndId', '[punctuation div][punctuation&attribute (my-class#my-id)][punctuation . foo bar]'); MT('paragraphWithCss', 'p[attribute {color:red;}]. foo bar'); MT('paragraphNestedStyles', 'p. [strong *foo ][strong&em _bar_][strong *]'); MT('paragraphWithLanguage', 'p[attribute [[fr]]]. Parlez-vous français?'); MT('paragraphLeftAlign', 'p[attribute <]. Left'); MT('paragraphRightAlign', 'p[attribute >]. Right'); MT('paragraphRightAlign', 'p[attribute =]. Center'); MT('paragraphJustified', 'p[attribute <>]. Justified'); MT('paragraphWithLeftIndent1em', 'p[attribute (]. Left'); MT('paragraphWithRightIndent1em', 'p[attribute )]. Right'); MT('paragraphWithLeftIndent2em', 'p[attribute ((]. Left'); MT('paragraphWithRightIndent2em', 'p[attribute ))]. Right'); MT('paragraphWithLeftIndent3emRightIndent2em', 'p[attribute ((())]. Right'); MT('divFormatting', '[punctuation div. ][punctuation&strong *foo ]' + '[punctuation&strong&em _bar_][punctuation&strong *]'); MT('phraseModifierAttributes', 'p[attribute (my-class)]. This is a paragraph that has a class and' + ' this [em _][em&attribute (#special-phrase)][em emphasized phrase_]' + ' has an id.'); MT('linkWithClass', '[link "(my-class). This is a link with class":http://redcloth.org]'); /* * Layouts */ MT('paragraphLayouts', 'p. This is one paragraph.', '', 'p. This is another.'); MT('div', '[punctuation div. foo bar]'); MT('pre', '[operator pre. Text]'); MT('bq.', '[bracket bq. foo bar]', '', 'Normal text.'); MT('footnote', '[variable fn123. foo ][variable&strong *bar*]'); /* * Spanning Layouts */ MT('bq..ThenParagraph', '[bracket bq.. foo bar]', '', '[bracket More quote.]', 'p. Normal Text'); MT('bq..ThenH1', '[bracket bq.. foo bar]', '', '[bracket More quote.]', '[header&header-1 h1. Header Text]'); MT('bc..ThenParagraph', '[atom bc.. # Some ruby code]', '[atom obj = {foo: :bar}]', '[atom puts obj]', '', '[atom obj[[:love]] = "*love*"]', '[atom puts obj.love.upcase]', '', 'p. Normal text.'); MT('fn1..ThenParagraph', '[variable fn1.. foo bar]', '', '[variable More.]', 'p. Normal Text'); MT('pre..ThenParagraph', '[operator pre.. foo bar]', '', '[operator More.]', 'p. Normal Text'); /* * Tables */ MT('table', '[variable-3&operator |_. name |_. age|]', '[variable-3 |][variable-3&strong *Walter*][variable-3 | 5 |]', '[variable-3 |Florence| 6 |]', '', 'p. Normal text.'); MT('tableWithAttributes', '[variable-3&operator |_. name |_. age|]', '[variable-3 |][variable-3&attribute /2.][variable-3 Jim |]', '[variable-3 |][variable-3&attribute \\2{color: red}.][variable-3 Sam |]'); /* * HTML */ MT('html', '[comment
]', '[comment
]', '', '[header&header-1 h1. Welcome]', '', '[variable-2 * Item one]', '[variable-2 * Item two]', '', '[comment Example]', '', '[comment
]', '[comment
]'); MT('inlineHtml', 'I can use HTML directly in my [comment Textile].'); /* * No-Textile */ MT('notextile', '[string-2 notextile. *No* formatting]'); MT('notextileInline', 'Use [string-2 ==*asterisks*==] for [strong *strong*] text.'); MT('notextileWithPre', '[operator pre. *No* formatting]'); MT('notextileWithSpanningPre', '[operator pre.. *No* formatting]', '', '[operator *No* formatting]'); /* Only toggling phrases between non-word chars. */ MT('phrase-in-word', 'foo_bar_baz'); MT('phrase-non-word', '[negative -x-] aaa-bbb ccc-ddd [negative -eee-] fff [negative -ggg-]'); MT('phrase-lone-dash', 'foo - bar - baz'); })(); ================================================ FILE: base/res/codemirror/mode/textile/textile.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") { // CommonJS mod(require("../../lib/codemirror")); } else if (typeof define == "function" && define.amd) { // AMD define(["../../lib/codemirror"], mod); } else { // Plain browser env mod(CodeMirror); } })(function(CodeMirror) { "use strict"; var TOKEN_STYLES = { addition: "positive", attributes: "attribute", bold: "strong", cite: "keyword", code: "atom", definitionList: "number", deletion: "negative", div: "punctuation", em: "em", footnote: "variable", footCite: "qualifier", header: "header", html: "comment", image: "string", italic: "em", link: "link", linkDefinition: "link", list1: "variable-2", list2: "variable-3", list3: "keyword", notextile: "string-2", pre: "operator", p: "property", quote: "bracket", span: "quote", specialChar: "tag", strong: "strong", sub: "builtin", sup: "builtin", table: "variable-3", tableHeading: "operator" }; function startNewLine(stream, state) { state.mode = Modes.newLayout; state.tableHeading = false; if (state.layoutType === "definitionList" && state.spanningLayout && stream.match(RE("definitionListEnd"), false)) state.spanningLayout = false; } function handlePhraseModifier(stream, state, ch) { if (ch === "_") { if (stream.eat("_")) return togglePhraseModifier(stream, state, "italic", /__/, 2); else return togglePhraseModifier(stream, state, "em", /_/, 1); } if (ch === "*") { if (stream.eat("*")) { return togglePhraseModifier(stream, state, "bold", /\*\*/, 2); } return togglePhraseModifier(stream, state, "strong", /\*/, 1); } if (ch === "[") { if (stream.match(/\d+\]/)) state.footCite = true; return tokenStyles(state); } if (ch === "(") { var spec = stream.match(/^(r|tm|c)\)/); if (spec) return tokenStylesWith(state, TOKEN_STYLES.specialChar); } if (ch === "<" && stream.match(/(\w+)[^>]+>[^<]+<\/\1>/)) return tokenStylesWith(state, TOKEN_STYLES.html); if (ch === "?" && stream.eat("?")) return togglePhraseModifier(stream, state, "cite", /\?\?/, 2); if (ch === "=" && stream.eat("=")) return togglePhraseModifier(stream, state, "notextile", /==/, 2); if (ch === "-" && !stream.eat("-")) return togglePhraseModifier(stream, state, "deletion", /-/, 1); if (ch === "+") return togglePhraseModifier(stream, state, "addition", /\+/, 1); if (ch === "~") return togglePhraseModifier(stream, state, "sub", /~/, 1); if (ch === "^") return togglePhraseModifier(stream, state, "sup", /\^/, 1); if (ch === "%") return togglePhraseModifier(stream, state, "span", /%/, 1); if (ch === "@") return togglePhraseModifier(stream, state, "code", /@/, 1); if (ch === "!") { var type = togglePhraseModifier(stream, state, "image", /(?:\([^\)]+\))?!/, 1); stream.match(/^:\S+/); // optional Url portion return type; } return tokenStyles(state); } function togglePhraseModifier(stream, state, phraseModifier, closeRE, openSize) { var charBefore = stream.pos > openSize ? stream.string.charAt(stream.pos - openSize - 1) : null; var charAfter = stream.peek(); if (state[phraseModifier]) { if ((!charAfter || /\W/.test(charAfter)) && charBefore && /\S/.test(charBefore)) { var type = tokenStyles(state); state[phraseModifier] = false; return type; } } else if ((!charBefore || /\W/.test(charBefore)) && charAfter && /\S/.test(charAfter) && stream.match(new RegExp("^.*\\S" + closeRE.source + "(?:\\W|$)"), false)) { state[phraseModifier] = true; state.mode = Modes.attributes; } return tokenStyles(state); }; function tokenStyles(state) { var disabled = textileDisabled(state); if (disabled) return disabled; var styles = []; if (state.layoutType) styles.push(TOKEN_STYLES[state.layoutType]); styles = styles.concat(activeStyles( state, "addition", "bold", "cite", "code", "deletion", "em", "footCite", "image", "italic", "link", "span", "strong", "sub", "sup", "table", "tableHeading")); if (state.layoutType === "header") styles.push(TOKEN_STYLES.header + "-" + state.header); return styles.length ? styles.join(" ") : null; } function textileDisabled(state) { var type = state.layoutType; switch(type) { case "notextile": case "code": case "pre": return TOKEN_STYLES[type]; default: if (state.notextile) return TOKEN_STYLES.notextile + (type ? (" " + TOKEN_STYLES[type]) : ""); return null; } } function tokenStylesWith(state, extraStyles) { var disabled = textileDisabled(state); if (disabled) return disabled; var type = tokenStyles(state); if (extraStyles) return type ? (type + " " + extraStyles) : extraStyles; else return type; } function activeStyles(state) { var styles = []; for (var i = 1; i < arguments.length; ++i) { if (state[arguments[i]]) styles.push(TOKEN_STYLES[arguments[i]]); } return styles; } function blankLine(state) { var spanningLayout = state.spanningLayout, type = state.layoutType; for (var key in state) if (state.hasOwnProperty(key)) delete state[key]; state.mode = Modes.newLayout; if (spanningLayout) { state.layoutType = type; state.spanningLayout = true; } } var REs = { cache: {}, single: { bc: "bc", bq: "bq", definitionList: /- [^(?::=)]+:=+/, definitionListEnd: /.*=:\s*$/, div: "div", drawTable: /\|.*\|/, foot: /fn\d+/, header: /h[1-6]/, html: /\s*<(?:\/)?(\w+)(?:[^>]+)?>(?:[^<]+<\/\1>)?/, link: /[^"]+":\S/, linkDefinition: /\[[^\s\]]+\]\S+/, list: /(?:#+|\*+)/, notextile: "notextile", para: "p", pre: "pre", table: "table", tableCellAttributes: /[\/\\]\d+/, tableHeading: /\|_\./, tableText: /[^"_\*\[\(\?\+~\^%@|-]+/, text: /[^!"_=\*\[\(<\?\+~\^%@-]+/ }, attributes: { align: /(?:<>|<|>|=)/, selector: /\([^\(][^\)]+\)/, lang: /\[[^\[\]]+\]/, pad: /(?:\(+|\)+){1,2}/, css: /\{[^\}]+\}/ }, createRe: function(name) { switch (name) { case "drawTable": return REs.makeRe("^", REs.single.drawTable, "$"); case "html": return REs.makeRe("^", REs.single.html, "(?:", REs.single.html, ")*", "$"); case "linkDefinition": return REs.makeRe("^", REs.single.linkDefinition, "$"); case "listLayout": return REs.makeRe("^", REs.single.list, RE("allAttributes"), "*\\s+"); case "tableCellAttributes": return REs.makeRe("^", REs.choiceRe(REs.single.tableCellAttributes, RE("allAttributes")), "+\\."); case "type": return REs.makeRe("^", RE("allTypes")); case "typeLayout": return REs.makeRe("^", RE("allTypes"), RE("allAttributes"), "*\\.\\.?", "(\\s+|$)"); case "attributes": return REs.makeRe("^", RE("allAttributes"), "+"); case "allTypes": return REs.choiceRe(REs.single.div, REs.single.foot, REs.single.header, REs.single.bc, REs.single.bq, REs.single.notextile, REs.single.pre, REs.single.table, REs.single.para); case "allAttributes": return REs.choiceRe(REs.attributes.selector, REs.attributes.css, REs.attributes.lang, REs.attributes.align, REs.attributes.pad); default: return REs.makeRe("^", REs.single[name]); } }, makeRe: function() { var pattern = ""; for (var i = 0; i < arguments.length; ++i) { var arg = arguments[i]; pattern += (typeof arg === "string") ? arg : arg.source; } return new RegExp(pattern); }, choiceRe: function() { var parts = [arguments[0]]; for (var i = 1; i < arguments.length; ++i) { parts[i * 2 - 1] = "|"; parts[i * 2] = arguments[i]; } parts.unshift("(?:"); parts.push(")"); return REs.makeRe.apply(null, parts); } }; function RE(name) { return (REs.cache[name] || (REs.cache[name] = REs.createRe(name))); } var Modes = { newLayout: function(stream, state) { if (stream.match(RE("typeLayout"), false)) { state.spanningLayout = false; return (state.mode = Modes.blockType)(stream, state); } var newMode; if (!textileDisabled(state)) { if (stream.match(RE("listLayout"), false)) newMode = Modes.list; else if (stream.match(RE("drawTable"), false)) newMode = Modes.table; else if (stream.match(RE("linkDefinition"), false)) newMode = Modes.linkDefinition; else if (stream.match(RE("definitionList"))) newMode = Modes.definitionList; else if (stream.match(RE("html"), false)) newMode = Modes.html; } return (state.mode = (newMode || Modes.text))(stream, state); }, blockType: function(stream, state) { var match, type; state.layoutType = null; if (match = stream.match(RE("type"))) type = match[0]; else return (state.mode = Modes.text)(stream, state); if (match = type.match(RE("header"))) { state.layoutType = "header"; state.header = parseInt(match[0][1]); } else if (type.match(RE("bq"))) { state.layoutType = "quote"; } else if (type.match(RE("bc"))) { state.layoutType = "code"; } else if (type.match(RE("foot"))) { state.layoutType = "footnote"; } else if (type.match(RE("notextile"))) { state.layoutType = "notextile"; } else if (type.match(RE("pre"))) { state.layoutType = "pre"; } else if (type.match(RE("div"))) { state.layoutType = "div"; } else if (type.match(RE("table"))) { state.layoutType = "table"; } state.mode = Modes.attributes; return tokenStyles(state); }, text: function(stream, state) { if (stream.match(RE("text"))) return tokenStyles(state); var ch = stream.next(); if (ch === '"') return (state.mode = Modes.link)(stream, state); return handlePhraseModifier(stream, state, ch); }, attributes: function(stream, state) { state.mode = Modes.layoutLength; if (stream.match(RE("attributes"))) return tokenStylesWith(state, TOKEN_STYLES.attributes); else return tokenStyles(state); }, layoutLength: function(stream, state) { if (stream.eat(".") && stream.eat(".")) state.spanningLayout = true; state.mode = Modes.text; return tokenStyles(state); }, list: function(stream, state) { var match = stream.match(RE("list")); state.listDepth = match[0].length; var listMod = (state.listDepth - 1) % 3; if (!listMod) state.layoutType = "list1"; else if (listMod === 1) state.layoutType = "list2"; else state.layoutType = "list3"; state.mode = Modes.attributes; return tokenStyles(state); }, link: function(stream, state) { state.mode = Modes.text; if (stream.match(RE("link"))) { stream.match(/\S+/); return tokenStylesWith(state, TOKEN_STYLES.link); } return tokenStyles(state); }, linkDefinition: function(stream, state) { stream.skipToEnd(); return tokenStylesWith(state, TOKEN_STYLES.linkDefinition); }, definitionList: function(stream, state) { stream.match(RE("definitionList")); state.layoutType = "definitionList"; if (stream.match(/\s*$/)) state.spanningLayout = true; else state.mode = Modes.attributes; return tokenStyles(state); }, html: function(stream, state) { stream.skipToEnd(); return tokenStylesWith(state, TOKEN_STYLES.html); }, table: function(stream, state) { state.layoutType = "table"; return (state.mode = Modes.tableCell)(stream, state); }, tableCell: function(stream, state) { if (stream.match(RE("tableHeading"))) state.tableHeading = true; else stream.eat("|"); state.mode = Modes.tableCellAttributes; return tokenStyles(state); }, tableCellAttributes: function(stream, state) { state.mode = Modes.tableText; if (stream.match(RE("tableCellAttributes"))) return tokenStylesWith(state, TOKEN_STYLES.attributes); else return tokenStyles(state); }, tableText: function(stream, state) { if (stream.match(RE("tableText"))) return tokenStyles(state); if (stream.peek() === "|") { // end of cell state.mode = Modes.tableCell; return tokenStyles(state); } return handlePhraseModifier(stream, state, stream.next()); } }; CodeMirror.defineMode("textile", function() { return { startState: function() { return { mode: Modes.newLayout }; }, token: function(stream, state) { if (stream.sol()) startNewLine(stream, state); return state.mode(stream, state); }, blankLine: blankLine }; }); CodeMirror.defineMIME("text/x-textile", "textile"); }); ================================================ FILE: base/res/codemirror/mode/tiddlywiki/index.html ================================================ CodeMirror: TiddlyWiki mode

TiddlyWiki mode

TiddlyWiki mode supports a single configuration.

MIME types defined: text/x-tiddlywiki.

================================================ FILE: base/res/codemirror/mode/tiddlywiki/tiddlywiki.css ================================================ span.cm-underlined { text-decoration: underline; } span.cm-strikethrough { text-decoration: line-through; } span.cm-brace { color: #170; font-weight: bold; } span.cm-table { color: blue; font-weight: bold; } ================================================ FILE: base/res/codemirror/mode/tiddlywiki/tiddlywiki.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /*** |''Name''|tiddlywiki.js| |''Description''|Enables TiddlyWikiy syntax highlighting using CodeMirror| |''Author''|PMario| |''Version''|0.1.7| |''Status''|''stable''| |''Source''|[[GitHub|https://github.com/pmario/CodeMirror2/blob/tw-syntax/mode/tiddlywiki]]| |''Documentation''|http://codemirror.tiddlyspace.com/| |''License''|[[MIT License|http://www.opensource.org/licenses/mit-license.php]]| |''CoreVersion''|2.5.0| |''Requires''|codemirror.js| |''Keywords''|syntax highlighting color code mirror codemirror| ! Info CoreVersion parameter is needed for TiddlyWiki only! ***/ //{{{ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("tiddlywiki", function () { // Tokenizer var textwords = {}; var keywords = function () { function kw(type) { return { type: type, style: "macro"}; } return { "allTags": kw('allTags'), "closeAll": kw('closeAll'), "list": kw('list'), "newJournal": kw('newJournal'), "newTiddler": kw('newTiddler'), "permaview": kw('permaview'), "saveChanges": kw('saveChanges'), "search": kw('search'), "slider": kw('slider'), "tabs": kw('tabs'), "tag": kw('tag'), "tagging": kw('tagging'), "tags": kw('tags'), "tiddler": kw('tiddler'), "timeline": kw('timeline'), "today": kw('today'), "version": kw('version'), "option": kw('option'), "with": kw('with'), "filter": kw('filter') }; }(); var isSpaceName = /[\w_\-]/i, reHR = /^\-\-\-\-+$/, //
reWikiCommentStart = /^\/\*\*\*$/, // /*** reWikiCommentStop = /^\*\*\*\/$/, // ***/ reBlockQuote = /^<<<$/, reJsCodeStart = /^\/\/\{\{\{$/, // //{{{ js block start reJsCodeStop = /^\/\/\}\}\}$/, // //}}} js stop reXmlCodeStart = /^$/, // xml block start reXmlCodeStop = /^$/, // xml stop reCodeBlockStart = /^\{\{\{$/, // {{{ TW text div block start reCodeBlockStop = /^\}\}\}$/, // }}} TW text stop reUntilCodeStop = /.*?\}\}\}/; function chain(stream, state, f) { state.tokenize = f; return f(stream, state); } // Used as scratch variables to communicate multiple values without // consing up tons of objects. var type, content; function ret(tp, style, cont) { type = tp; content = cont; return style; } function jsTokenBase(stream, state) { var sol = stream.sol(), ch; state.block = false; // indicates the start of a code block. ch = stream.peek(); // don't eat, to make matching simpler // check start of blocks if (sol && /[<\/\*{}\-]/.test(ch)) { if (stream.match(reCodeBlockStart)) { state.block = true; return chain(stream, state, twTokenCode); } if (stream.match(reBlockQuote)) { return ret('quote', 'quote'); } if (stream.match(reWikiCommentStart) || stream.match(reWikiCommentStop)) { return ret('code', 'comment'); } if (stream.match(reJsCodeStart) || stream.match(reJsCodeStop) || stream.match(reXmlCodeStart) || stream.match(reXmlCodeStop)) { return ret('code', 'comment'); } if (stream.match(reHR)) { return ret('hr', 'hr'); } } // sol ch = stream.next(); if (sol && /[\/\*!#;:>|]/.test(ch)) { if (ch == "!") { // tw header stream.skipToEnd(); return ret("header", "header"); } if (ch == "*") { // tw list stream.eatWhile('*'); return ret("list", "comment"); } if (ch == "#") { // tw numbered list stream.eatWhile('#'); return ret("list", "comment"); } if (ch == ";") { // definition list, term stream.eatWhile(';'); return ret("list", "comment"); } if (ch == ":") { // definition list, description stream.eatWhile(':'); return ret("list", "comment"); } if (ch == ">") { // single line quote stream.eatWhile(">"); return ret("quote", "quote"); } if (ch == '|') { return ret('table', 'header'); } } if (ch == '{' && stream.match(/\{\{/)) { return chain(stream, state, twTokenCode); } // rudimentary html:// file:// link matching. TW knows much more ... if (/[hf]/i.test(ch)) { if (/[ti]/i.test(stream.peek()) && stream.match(/\b(ttps?|tp|ile):\/\/[\-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i)) { return ret("link", "link"); } } // just a little string indicator, don't want to have the whole string covered if (ch == '"') { return ret('string', 'string'); } if (ch == '~') { // _no_ CamelCase indicator should be bold return ret('text', 'brace'); } if (/[\[\]]/.test(ch)) { // check for [[..]] if (stream.peek() == ch) { stream.next(); return ret('brace', 'brace'); } } if (ch == "@") { // check for space link. TODO fix @@...@@ highlighting stream.eatWhile(isSpaceName); return ret("link", "link"); } if (/\d/.test(ch)) { // numbers stream.eatWhile(/\d/); return ret("number", "number"); } if (ch == "/") { // tw invisible comment if (stream.eat("%")) { return chain(stream, state, twTokenComment); } else if (stream.eat("/")) { // return chain(stream, state, twTokenEm); } } if (ch == "_") { // tw underline if (stream.eat("_")) { return chain(stream, state, twTokenUnderline); } } // strikethrough and mdash handling if (ch == "-") { if (stream.eat("-")) { // if strikethrough looks ugly, change CSS. if (stream.peek() != ' ') return chain(stream, state, twTokenStrike); // mdash if (stream.peek() == ' ') return ret('text', 'brace'); } } if (ch == "'") { // tw bold if (stream.eat("'")) { return chain(stream, state, twTokenStrong); } } if (ch == "<") { // tw macro if (stream.eat("<")) { return chain(stream, state, twTokenMacro); } } else { return ret(ch); } // core macro handling stream.eatWhile(/[\w\$_]/); var word = stream.current(), known = textwords.propertyIsEnumerable(word) && textwords[word]; return known ? ret(known.type, known.style, word) : ret("text", null, word); } // jsTokenBase() // tw invisible comment function twTokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = jsTokenBase; break; } maybeEnd = (ch == "%"); } return ret("comment", "comment"); } // tw strong / bold function twTokenStrong(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "'" && maybeEnd) { state.tokenize = jsTokenBase; break; } maybeEnd = (ch == "'"); } return ret("text", "strong"); } // tw code function twTokenCode(stream, state) { var ch, sb = state.block; if (sb && stream.current()) { return ret("code", "comment"); } if (!sb && stream.match(reUntilCodeStop)) { state.tokenize = jsTokenBase; return ret("code", "comment"); } if (sb && stream.sol() && stream.match(reCodeBlockStop)) { state.tokenize = jsTokenBase; return ret("code", "comment"); } ch = stream.next(); return (sb) ? ret("code", "comment") : ret("code", "comment"); } // tw em / italic function twTokenEm(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = jsTokenBase; break; } maybeEnd = (ch == "/"); } return ret("text", "em"); } // tw underlined text function twTokenUnderline(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "_" && maybeEnd) { state.tokenize = jsTokenBase; break; } maybeEnd = (ch == "_"); } return ret("text", "underlined"); } // tw strike through text looks ugly // change CSS if needed function twTokenStrike(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "-" && maybeEnd) { state.tokenize = jsTokenBase; break; } maybeEnd = (ch == "-"); } return ret("text", "strikethrough"); } // macro function twTokenMacro(stream, state) { var ch, word, known; if (stream.current() == '<<') { return ret('brace', 'macro'); } ch = stream.next(); if (!ch) { state.tokenize = jsTokenBase; return ret(ch); } if (ch == ">") { if (stream.peek() == '>') { stream.next(); state.tokenize = jsTokenBase; return ret("brace", "macro"); } } stream.eatWhile(/[\w\$_]/); word = stream.current(); known = keywords.propertyIsEnumerable(word) && keywords[word]; if (known) { return ret(known.type, known.style, word); } else { return ret("macro", null, word); } } // Interface return { startState: function () { return { tokenize: jsTokenBase, indented: 0, level: 0 }; }, token: function (stream, state) { if (stream.eatSpace()) return null; var style = state.tokenize(stream, state); return style; }, electricChars: "" }; }); CodeMirror.defineMIME("text/x-tiddlywiki", "tiddlywiki"); }); //}}} ================================================ FILE: base/res/codemirror/mode/tiki/index.html ================================================ CodeMirror: Tiki wiki mode

Tiki wiki mode

================================================ FILE: base/res/codemirror/mode/tiki/tiki.css ================================================ .cm-tw-syntaxerror { color: #FFF; background-color: #900; } .cm-tw-deleted { text-decoration: line-through; } .cm-tw-header5 { font-weight: bold; } .cm-tw-listitem:first-child { /*Added first child to fix duplicate padding when highlighting*/ padding-left: 10px; } .cm-tw-box { border-top-width: 0px ! important; border-style: solid; border-width: 1px; border-color: inherit; } .cm-tw-underline { text-decoration: underline; } ================================================ FILE: base/res/codemirror/mode/tiki/tiki.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode('tiki', function(config) { function inBlock(style, terminator, returnTokenizer) { return function(stream, state) { while (!stream.eol()) { if (stream.match(terminator)) { state.tokenize = inText; break; } stream.next(); } if (returnTokenizer) state.tokenize = returnTokenizer; return style; }; } function inLine(style) { return function(stream, state) { while(!stream.eol()) { stream.next(); } state.tokenize = inText; return style; }; } function inText(stream, state) { function chain(parser) { state.tokenize = parser; return parser(stream, state); } var sol = stream.sol(); var ch = stream.next(); //non start of line switch (ch) { //switch is generally much faster than if, so it is used here case "{": //plugin stream.eat("/"); stream.eatSpace(); var tagName = ""; var c; while ((c = stream.eat(/[^\s\u00a0=\"\'\/?(}]/))) tagName += c; state.tokenize = inPlugin; return "tag"; break; case "_": //bold if (stream.eat("_")) { return chain(inBlock("strong", "__", inText)); } break; case "'": //italics if (stream.eat("'")) { // Italic text return chain(inBlock("em", "''", inText)); } break; case "(":// Wiki Link if (stream.eat("(")) { return chain(inBlock("variable-2", "))", inText)); } break; case "[":// Weblink return chain(inBlock("variable-3", "]", inText)); break; case "|": //table if (stream.eat("|")) { return chain(inBlock("comment", "||")); } break; case "-": if (stream.eat("=")) {//titleBar return chain(inBlock("header string", "=-", inText)); } else if (stream.eat("-")) {//deleted return chain(inBlock("error tw-deleted", "--", inText)); } break; case "=": //underline if (stream.match("==")) { return chain(inBlock("tw-underline", "===", inText)); } break; case ":": if (stream.eat(":")) { return chain(inBlock("comment", "::")); } break; case "^": //box return chain(inBlock("tw-box", "^")); break; case "~": //np if (stream.match("np~")) { return chain(inBlock("meta", "~/np~")); } break; } //start of line types if (sol) { switch (ch) { case "!": //header at start of line if (stream.match('!!!!!')) { return chain(inLine("header string")); } else if (stream.match('!!!!')) { return chain(inLine("header string")); } else if (stream.match('!!!')) { return chain(inLine("header string")); } else if (stream.match('!!')) { return chain(inLine("header string")); } else { return chain(inLine("header string")); } break; case "*": //unordered list line item, or
  • at start of line case "#": //ordered list line item, or
  • at start of line case "+": //ordered list line item, or
  • at start of line return chain(inLine("tw-listitem bracket")); break; } } //stream.eatWhile(/[&{]/); was eating up plugins, turned off to act less like html and more like tiki return null; } var indentUnit = config.indentUnit; // Return variables for tokenizers var pluginName, type; function inPlugin(stream, state) { var ch = stream.next(); var peek = stream.peek(); if (ch == "}") { state.tokenize = inText; //type = ch == ")" ? "endPlugin" : "selfclosePlugin"; inPlugin return "tag"; } else if (ch == "(" || ch == ")") { return "bracket"; } else if (ch == "=") { type = "equals"; if (peek == ">") { ch = stream.next(); peek = stream.peek(); } //here we detect values directly after equal character with no quotes if (!/[\'\"]/.test(peek)) { state.tokenize = inAttributeNoQuote(); } //end detect values return "operator"; } else if (/[\'\"]/.test(ch)) { state.tokenize = inAttribute(ch); return state.tokenize(stream, state); } else { stream.eatWhile(/[^\s\u00a0=\"\'\/?]/); return "keyword"; } } function inAttribute(quote) { return function(stream, state) { while (!stream.eol()) { if (stream.next() == quote) { state.tokenize = inPlugin; break; } } return "string"; }; } function inAttributeNoQuote() { return function(stream, state) { while (!stream.eol()) { var ch = stream.next(); var peek = stream.peek(); if (ch == " " || ch == "," || /[ )}]/.test(peek)) { state.tokenize = inPlugin; break; } } return "string"; }; } var curState, setStyle; function pass() { for (var i = arguments.length - 1; i >= 0; i--) curState.cc.push(arguments[i]); } function cont() { pass.apply(null, arguments); return true; } function pushContext(pluginName, startOfLine) { var noIndent = curState.context && curState.context.noIndent; curState.context = { prev: curState.context, pluginName: pluginName, indent: curState.indented, startOfLine: startOfLine, noIndent: noIndent }; } function popContext() { if (curState.context) curState.context = curState.context.prev; } function element(type) { if (type == "openPlugin") {curState.pluginName = pluginName; return cont(attributes, endplugin(curState.startOfLine));} else if (type == "closePlugin") { var err = false; if (curState.context) { err = curState.context.pluginName != pluginName; popContext(); } else { err = true; } if (err) setStyle = "error"; return cont(endcloseplugin(err)); } else if (type == "string") { if (!curState.context || curState.context.name != "!cdata") pushContext("!cdata"); if (curState.tokenize == inText) popContext(); return cont(); } else return cont(); } function endplugin(startOfLine) { return function(type) { if ( type == "selfclosePlugin" || type == "endPlugin" ) return cont(); if (type == "endPlugin") {pushContext(curState.pluginName, startOfLine); return cont();} return cont(); }; } function endcloseplugin(err) { return function(type) { if (err) setStyle = "error"; if (type == "endPlugin") return cont(); return pass(); }; } function attributes(type) { if (type == "keyword") {setStyle = "attribute"; return cont(attributes);} if (type == "equals") return cont(attvalue, attributes); return pass(); } function attvalue(type) { if (type == "keyword") {setStyle = "string"; return cont();} if (type == "string") return cont(attvaluemaybe); return pass(); } function attvaluemaybe(type) { if (type == "string") return cont(attvaluemaybe); else return pass(); } return { startState: function() { return {tokenize: inText, cc: [], indented: 0, startOfLine: true, pluginName: null, context: null}; }, token: function(stream, state) { if (stream.sol()) { state.startOfLine = true; state.indented = stream.indentation(); } if (stream.eatSpace()) return null; setStyle = type = pluginName = null; var style = state.tokenize(stream, state); if ((style || type) && style != "comment") { curState = state; while (true) { var comb = state.cc.pop() || element; if (comb(type || style)) break; } } state.startOfLine = false; return setStyle || style; }, indent: function(state, textAfter) { var context = state.context; if (context && context.noIndent) return 0; if (context && /^{\//.test(textAfter)) context = context.prev; while (context && !context.startOfLine) context = context.prev; if (context) return context.indent + indentUnit; else return 0; }, electricChars: "/" }; }); CodeMirror.defineMIME("text/tiki", "tiki"); }); ================================================ FILE: base/res/codemirror/mode/toml/index.html ================================================ CodeMirror: TOML Mode

    TOML Mode

    The TOML Mode

    Created by Forbes Lindesay.

    MIME type defined: text/x-toml.

    ================================================ FILE: base/res/codemirror/mode/toml/toml.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("toml", function () { return { startState: function () { return { inString: false, stringType: "", lhs: true, inArray: 0 }; }, token: function (stream, state) { //check for state changes if (!state.inString && ((stream.peek() == '"') || (stream.peek() == "'"))) { state.stringType = stream.peek(); stream.next(); // Skip quote state.inString = true; // Update state } if (stream.sol() && state.inArray === 0) { state.lhs = true; } //return state if (state.inString) { while (state.inString && !stream.eol()) { if (stream.peek() === state.stringType) { stream.next(); // Skip quote state.inString = false; // Clear flag } else if (stream.peek() === '\\') { stream.next(); stream.next(); } else { stream.match(/^.[^\\\"\']*/); } } return state.lhs ? "property string" : "string"; // Token style } else if (state.inArray && stream.peek() === ']') { stream.next(); state.inArray--; return 'bracket'; } else if (state.lhs && stream.peek() === '[' && stream.skipTo(']')) { stream.next();//skip closing ] // array of objects has an extra open & close [] if (stream.peek() === ']') stream.next(); return "atom"; } else if (stream.peek() === "#") { stream.skipToEnd(); return "comment"; } else if (stream.eatSpace()) { return null; } else if (state.lhs && stream.eatWhile(function (c) { return c != '=' && c != ' '; })) { return "property"; } else if (state.lhs && stream.peek() === "=") { stream.next(); state.lhs = false; return null; } else if (!state.lhs && stream.match(/^\d\d\d\d[\d\-\:\.T]*Z/)) { return 'atom'; //date } else if (!state.lhs && (stream.match('true') || stream.match('false'))) { return 'atom'; } else if (!state.lhs && stream.peek() === '[') { state.inArray++; stream.next(); return 'bracket'; } else if (!state.lhs && stream.match(/^\-?\d+(?:\.\d+)?/)) { return 'number'; } else if (!stream.eatSpace()) { stream.next(); } return null; } }; }); CodeMirror.defineMIME('text/x-toml', 'toml'); }); ================================================ FILE: base/res/codemirror/mode/tornado/index.html ================================================ CodeMirror: Tornado template mode

    Tornado template mode

    Mode for HTML with embedded Tornado template markup.

    MIME types defined: text/x-tornado

    ================================================ FILE: base/res/codemirror/mode/tornado/tornado.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../../addon/mode/overlay")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../../addon/mode/overlay"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("tornado:inner", function() { var keywords = ["and","as","assert","autoescape","block","break","class","comment","context", "continue","datetime","def","del","elif","else","end","escape","except", "exec","extends","false","finally","for","from","global","if","import","in", "include","is","json_encode","lambda","length","linkify","load","module", "none","not","or","pass","print","put","raise","raw","return","self","set", "squeeze","super","true","try","url_escape","while","with","without","xhtml_escape","yield"]; keywords = new RegExp("^((" + keywords.join(")|(") + "))\\b"); function tokenBase (stream, state) { stream.eatWhile(/[^\{]/); var ch = stream.next(); if (ch == "{") { if (ch = stream.eat(/\{|%|#/)) { state.tokenize = inTag(ch); return "tag"; } } } function inTag (close) { if (close == "{") { close = "}"; } return function (stream, state) { var ch = stream.next(); if ((ch == close) && stream.eat("}")) { state.tokenize = tokenBase; return "tag"; } if (stream.match(keywords)) { return "keyword"; } return close == "#" ? "comment" : "string"; }; } return { startState: function () { return {tokenize: tokenBase}; }, token: function (stream, state) { return state.tokenize(stream, state); } }; }); CodeMirror.defineMode("tornado", function(config) { var htmlBase = CodeMirror.getMode(config, "text/html"); var tornadoInner = CodeMirror.getMode(config, "tornado:inner"); return CodeMirror.overlayMode(htmlBase, tornadoInner); }); CodeMirror.defineMIME("text/x-tornado", "tornado"); }); ================================================ FILE: base/res/codemirror/mode/troff/index.html ================================================ CodeMirror: troff mode

    troff

    MIME types defined: troff.

    ================================================ FILE: base/res/codemirror/mode/troff/troff.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) define(["../../lib/codemirror"], mod); else mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode('troff', function() { var words = {}; function tokenBase(stream) { if (stream.eatSpace()) return null; var sol = stream.sol(); var ch = stream.next(); if (ch === '\\') { if (stream.match('fB') || stream.match('fR') || stream.match('fI') || stream.match('u') || stream.match('d') || stream.match('%') || stream.match('&')) { return 'string'; } if (stream.match('m[')) { stream.skipTo(']'); stream.next(); return 'string'; } if (stream.match('s+') || stream.match('s-')) { stream.eatWhile(/[\d-]/); return 'string'; } if (stream.match('\(') || stream.match('*\(')) { stream.eatWhile(/[\w-]/); return 'string'; } return 'string'; } if (sol && (ch === '.' || ch === '\'')) { if (stream.eat('\\') && stream.eat('\"')) { stream.skipToEnd(); return 'comment'; } } if (sol && ch === '.') { if (stream.match('B ') || stream.match('I ') || stream.match('R ')) { return 'attribute'; } if (stream.match('TH ') || stream.match('SH ') || stream.match('SS ') || stream.match('HP ')) { stream.skipToEnd(); return 'quote'; } if ((stream.match(/[A-Z]/) && stream.match(/[A-Z]/)) || (stream.match(/[a-z]/) && stream.match(/[a-z]/))) { return 'attribute'; } } stream.eatWhile(/[\w-]/); var cur = stream.current(); return words.hasOwnProperty(cur) ? words[cur] : null; } function tokenize(stream, state) { return (state.tokens[0] || tokenBase) (stream, state); }; return { startState: function() {return {tokens:[]};}, token: function(stream, state) { return tokenize(stream, state); } }; }); CodeMirror.defineMIME('troff', 'troff'); }); ================================================ FILE: base/res/codemirror/mode/turtle/index.html ================================================ CodeMirror: Turtle mode

    Turtle mode

    MIME types defined: text/turtle.

    ================================================ FILE: base/res/codemirror/mode/turtle/turtle.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("turtle", function(config) { var indentUnit = config.indentUnit; var curPunc; function wordRegexp(words) { return new RegExp("^(?:" + words.join("|") + ")$", "i"); } var ops = wordRegexp([]); var keywords = wordRegexp(["@prefix", "@base", "a"]); var operatorChars = /[*+\-<>=&|]/; function tokenBase(stream, state) { var ch = stream.next(); curPunc = null; if (ch == "<" && !stream.match(/^[\s\u00a0=]/, false)) { stream.match(/^[^\s\u00a0>]*>?/); return "atom"; } else if (ch == "\"" || ch == "'") { state.tokenize = tokenLiteral(ch); return state.tokenize(stream, state); } else if (/[{}\(\),\.;\[\]]/.test(ch)) { curPunc = ch; return null; } else if (ch == "#") { stream.skipToEnd(); return "comment"; } else if (operatorChars.test(ch)) { stream.eatWhile(operatorChars); return null; } else if (ch == ":") { return "operator"; } else { stream.eatWhile(/[_\w\d]/); if(stream.peek() == ":") { return "variable-3"; } else { var word = stream.current(); if(keywords.test(word)) { return "meta"; } if(ch >= "A" && ch <= "Z") { return "comment"; } else { return "keyword"; } } var word = stream.current(); if (ops.test(word)) return null; else if (keywords.test(word)) return "meta"; else return "variable"; } } function tokenLiteral(quote) { return function(stream, state) { var escaped = false, ch; while ((ch = stream.next()) != null) { if (ch == quote && !escaped) { state.tokenize = tokenBase; break; } escaped = !escaped && ch == "\\"; } return "string"; }; } function pushContext(state, type, col) { state.context = {prev: state.context, indent: state.indent, col: col, type: type}; } function popContext(state) { state.indent = state.context.indent; state.context = state.context.prev; } return { startState: function() { return {tokenize: tokenBase, context: null, indent: 0, col: 0}; }, token: function(stream, state) { if (stream.sol()) { if (state.context && state.context.align == null) state.context.align = false; state.indent = stream.indentation(); } if (stream.eatSpace()) return null; var style = state.tokenize(stream, state); if (style != "comment" && state.context && state.context.align == null && state.context.type != "pattern") { state.context.align = true; } if (curPunc == "(") pushContext(state, ")", stream.column()); else if (curPunc == "[") pushContext(state, "]", stream.column()); else if (curPunc == "{") pushContext(state, "}", stream.column()); else if (/[\]\}\)]/.test(curPunc)) { while (state.context && state.context.type == "pattern") popContext(state); if (state.context && curPunc == state.context.type) popContext(state); } else if (curPunc == "." && state.context && state.context.type == "pattern") popContext(state); else if (/atom|string|variable/.test(style) && state.context) { if (/[\}\]]/.test(state.context.type)) pushContext(state, "pattern", stream.column()); else if (state.context.type == "pattern" && !state.context.align) { state.context.align = true; state.context.col = stream.column(); } } return style; }, indent: function(state, textAfter) { var firstChar = textAfter && textAfter.charAt(0); var context = state.context; if (/[\]\}]/.test(firstChar)) while (context && context.type == "pattern") context = context.prev; var closing = context && firstChar == context.type; if (!context) return 0; else if (context.type == "pattern") return context.col; else if (context.align) return context.col + (closing ? 0 : 1); else return context.indent + (closing ? 0 : indentUnit); }, lineComment: "#" }; }); CodeMirror.defineMIME("text/turtle", "turtle"); }); ================================================ FILE: base/res/codemirror/mode/vb/index.html ================================================ CodeMirror: VB.NET mode

    VB.NET mode

    
      

    MIME type defined: text/x-vb.

    ================================================ FILE: base/res/codemirror/mode/vb/vb.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("vb", function(conf, parserConf) { var ERRORCLASS = 'error'; function wordRegexp(words) { return new RegExp("^((" + words.join(")|(") + "))\\b", "i"); } var singleOperators = new RegExp("^[\\+\\-\\*/%&\\\\|\\^~<>!]"); var singleDelimiters = new RegExp('^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]'); var doubleOperators = new RegExp("^((==)|(<>)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))"); var doubleDelimiters = new RegExp("^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))"); var tripleDelimiters = new RegExp("^((//=)|(>>=)|(<<=)|(\\*\\*=))"); var identifiers = new RegExp("^[_A-Za-z][_A-Za-z0-9]*"); var openingKeywords = ['class','module', 'sub','enum','select','while','if','function', 'get','set','property', 'try']; var middleKeywords = ['else','elseif','case', 'catch']; var endKeywords = ['next','loop']; var operatorKeywords = ['and', 'or', 'not', 'xor', 'in']; var wordOperators = wordRegexp(operatorKeywords); var commonKeywords = ['as', 'dim', 'break', 'continue','optional', 'then', 'until', 'goto', 'byval','byref','new','handles','property', 'return', 'const','private', 'protected', 'friend', 'public', 'shared', 'static', 'true','false']; var commontypes = ['integer','string','double','decimal','boolean','short','char', 'float','single']; var keywords = wordRegexp(commonKeywords); var types = wordRegexp(commontypes); var stringPrefixes = '"'; var opening = wordRegexp(openingKeywords); var middle = wordRegexp(middleKeywords); var closing = wordRegexp(endKeywords); var doubleClosing = wordRegexp(['end']); var doOpening = wordRegexp(['do']); var indentInfo = null; CodeMirror.registerHelper("hintWords", "vb", openingKeywords.concat(middleKeywords).concat(endKeywords) .concat(operatorKeywords).concat(commonKeywords).concat(commontypes)); function indent(_stream, state) { state.currentIndent++; } function dedent(_stream, state) { state.currentIndent--; } // tokenizers function tokenBase(stream, state) { if (stream.eatSpace()) { return null; } var ch = stream.peek(); // Handle Comments if (ch === "'") { stream.skipToEnd(); return 'comment'; } // Handle Number Literals if (stream.match(/^((&H)|(&O))?[0-9\.a-f]/i, false)) { var floatLiteral = false; // Floats if (stream.match(/^\d*\.\d+F?/i)) { floatLiteral = true; } else if (stream.match(/^\d+\.\d*F?/)) { floatLiteral = true; } else if (stream.match(/^\.\d+F?/)) { floatLiteral = true; } if (floatLiteral) { // Float literals may be "imaginary" stream.eat(/J/i); return 'number'; } // Integers var intLiteral = false; // Hex if (stream.match(/^&H[0-9a-f]+/i)) { intLiteral = true; } // Octal else if (stream.match(/^&O[0-7]+/i)) { intLiteral = true; } // Decimal else if (stream.match(/^[1-9]\d*F?/)) { // Decimal literals may be "imaginary" stream.eat(/J/i); // TODO - Can you have imaginary longs? intLiteral = true; } // Zero by itself with no other piece of number. else if (stream.match(/^0(?![\dx])/i)) { intLiteral = true; } if (intLiteral) { // Integer literals may be "long" stream.eat(/L/i); return 'number'; } } // Handle Strings if (stream.match(stringPrefixes)) { state.tokenize = tokenStringFactory(stream.current()); return state.tokenize(stream, state); } // Handle operators and Delimiters if (stream.match(tripleDelimiters) || stream.match(doubleDelimiters)) { return null; } if (stream.match(doubleOperators) || stream.match(singleOperators) || stream.match(wordOperators)) { return 'operator'; } if (stream.match(singleDelimiters)) { return null; } if (stream.match(doOpening)) { indent(stream,state); state.doInCurrentLine = true; return 'keyword'; } if (stream.match(opening)) { if (! state.doInCurrentLine) indent(stream,state); else state.doInCurrentLine = false; return 'keyword'; } if (stream.match(middle)) { return 'keyword'; } if (stream.match(doubleClosing)) { dedent(stream,state); dedent(stream,state); return 'keyword'; } if (stream.match(closing)) { dedent(stream,state); return 'keyword'; } if (stream.match(types)) { return 'keyword'; } if (stream.match(keywords)) { return 'keyword'; } if (stream.match(identifiers)) { return 'variable'; } // Handle non-detected items stream.next(); return ERRORCLASS; } function tokenStringFactory(delimiter) { var singleline = delimiter.length == 1; var OUTCLASS = 'string'; return function(stream, state) { while (!stream.eol()) { stream.eatWhile(/[^'"]/); if (stream.match(delimiter)) { state.tokenize = tokenBase; return OUTCLASS; } else { stream.eat(/['"]/); } } if (singleline) { if (parserConf.singleLineStringErrors) { return ERRORCLASS; } else { state.tokenize = tokenBase; } } return OUTCLASS; }; } function tokenLexer(stream, state) { var style = state.tokenize(stream, state); var current = stream.current(); // Handle '.' connected identifiers if (current === '.') { style = state.tokenize(stream, state); current = stream.current(); if (style === 'variable') { return 'variable'; } else { return ERRORCLASS; } } var delimiter_index = '[({'.indexOf(current); if (delimiter_index !== -1) { indent(stream, state ); } if (indentInfo === 'dedent') { if (dedent(stream, state)) { return ERRORCLASS; } } delimiter_index = '])}'.indexOf(current); if (delimiter_index !== -1) { if (dedent(stream, state)) { return ERRORCLASS; } } return style; } var external = { electricChars:"dDpPtTfFeE ", startState: function() { return { tokenize: tokenBase, lastToken: null, currentIndent: 0, nextLineIndent: 0, doInCurrentLine: false }; }, token: function(stream, state) { if (stream.sol()) { state.currentIndent += state.nextLineIndent; state.nextLineIndent = 0; state.doInCurrentLine = 0; } var style = tokenLexer(stream, state); state.lastToken = {style:style, content: stream.current()}; return style; }, indent: function(state, textAfter) { var trueText = textAfter.replace(/^\s+|\s+$/g, '') ; if (trueText.match(closing) || trueText.match(doubleClosing) || trueText.match(middle)) return conf.indentUnit*(state.currentIndent-1); if(state.currentIndent < 0) return 0; return state.currentIndent * conf.indentUnit; } }; return external; }); CodeMirror.defineMIME("text/x-vb", "vb"); }); ================================================ FILE: base/res/codemirror/mode/vbscript/index.html ================================================ CodeMirror: VBScript mode

    VBScript mode

    MIME types defined: text/vbscript.

    ================================================ FILE: base/res/codemirror/mode/vbscript/vbscript.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE /* For extra ASP classic objects, initialize CodeMirror instance with this option: isASP: true E.G.: var editor = CodeMirror.fromTextArea(document.getElementById("code"), { lineNumbers: true, isASP: true }); */ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("vbscript", function(conf, parserConf) { var ERRORCLASS = 'error'; function wordRegexp(words) { return new RegExp("^((" + words.join(")|(") + "))\\b", "i"); } var singleOperators = new RegExp("^[\\+\\-\\*/&\\\\\\^<>=]"); var doubleOperators = new RegExp("^((<>)|(<=)|(>=))"); var singleDelimiters = new RegExp('^[\\.,]'); var brakets = new RegExp('^[\\(\\)]'); var identifiers = new RegExp("^[A-Za-z][_A-Za-z0-9]*"); var openingKeywords = ['class','sub','select','while','if','function', 'property', 'with', 'for']; var middleKeywords = ['else','elseif','case']; var endKeywords = ['next','loop','wend']; var wordOperators = wordRegexp(['and', 'or', 'not', 'xor', 'is', 'mod', 'eqv', 'imp']); var commonkeywords = ['dim', 'redim', 'then', 'until', 'randomize', 'byval','byref','new','property', 'exit', 'in', 'const','private', 'public', 'get','set','let', 'stop', 'on error resume next', 'on error goto 0', 'option explicit', 'call', 'me']; //This list was from: http://msdn.microsoft.com/en-us/library/f8tbc79x(v=vs.84).aspx var atomWords = ['true', 'false', 'nothing', 'empty', 'null']; //This list was from: http://msdn.microsoft.com/en-us/library/3ca8tfek(v=vs.84).aspx var builtinFuncsWords = ['abs', 'array', 'asc', 'atn', 'cbool', 'cbyte', 'ccur', 'cdate', 'cdbl', 'chr', 'cint', 'clng', 'cos', 'csng', 'cstr', 'date', 'dateadd', 'datediff', 'datepart', 'dateserial', 'datevalue', 'day', 'escape', 'eval', 'execute', 'exp', 'filter', 'formatcurrency', 'formatdatetime', 'formatnumber', 'formatpercent', 'getlocale', 'getobject', 'getref', 'hex', 'hour', 'inputbox', 'instr', 'instrrev', 'int', 'fix', 'isarray', 'isdate', 'isempty', 'isnull', 'isnumeric', 'isobject', 'join', 'lbound', 'lcase', 'left', 'len', 'loadpicture', 'log', 'ltrim', 'rtrim', 'trim', 'maths', 'mid', 'minute', 'month', 'monthname', 'msgbox', 'now', 'oct', 'replace', 'rgb', 'right', 'rnd', 'round', 'scriptengine', 'scriptenginebuildversion', 'scriptenginemajorversion', 'scriptengineminorversion', 'second', 'setlocale', 'sgn', 'sin', 'space', 'split', 'sqr', 'strcomp', 'string', 'strreverse', 'tan', 'time', 'timer', 'timeserial', 'timevalue', 'typename', 'ubound', 'ucase', 'unescape', 'vartype', 'weekday', 'weekdayname', 'year']; //This list was from: http://msdn.microsoft.com/en-us/library/ydz4cfk3(v=vs.84).aspx var builtinConsts = ['vbBlack', 'vbRed', 'vbGreen', 'vbYellow', 'vbBlue', 'vbMagenta', 'vbCyan', 'vbWhite', 'vbBinaryCompare', 'vbTextCompare', 'vbSunday', 'vbMonday', 'vbTuesday', 'vbWednesday', 'vbThursday', 'vbFriday', 'vbSaturday', 'vbUseSystemDayOfWeek', 'vbFirstJan1', 'vbFirstFourDays', 'vbFirstFullWeek', 'vbGeneralDate', 'vbLongDate', 'vbShortDate', 'vbLongTime', 'vbShortTime', 'vbObjectError', 'vbOKOnly', 'vbOKCancel', 'vbAbortRetryIgnore', 'vbYesNoCancel', 'vbYesNo', 'vbRetryCancel', 'vbCritical', 'vbQuestion', 'vbExclamation', 'vbInformation', 'vbDefaultButton1', 'vbDefaultButton2', 'vbDefaultButton3', 'vbDefaultButton4', 'vbApplicationModal', 'vbSystemModal', 'vbOK', 'vbCancel', 'vbAbort', 'vbRetry', 'vbIgnore', 'vbYes', 'vbNo', 'vbCr', 'VbCrLf', 'vbFormFeed', 'vbLf', 'vbNewLine', 'vbNullChar', 'vbNullString', 'vbTab', 'vbVerticalTab', 'vbUseDefault', 'vbTrue', 'vbFalse', 'vbEmpty', 'vbNull', 'vbInteger', 'vbLong', 'vbSingle', 'vbDouble', 'vbCurrency', 'vbDate', 'vbString', 'vbObject', 'vbError', 'vbBoolean', 'vbVariant', 'vbDataObject', 'vbDecimal', 'vbByte', 'vbArray']; //This list was from: http://msdn.microsoft.com/en-us/library/hkc375ea(v=vs.84).aspx var builtinObjsWords = ['WScript', 'err', 'debug', 'RegExp']; var knownProperties = ['description', 'firstindex', 'global', 'helpcontext', 'helpfile', 'ignorecase', 'length', 'number', 'pattern', 'source', 'value', 'count']; var knownMethods = ['clear', 'execute', 'raise', 'replace', 'test', 'write', 'writeline', 'close', 'open', 'state', 'eof', 'update', 'addnew', 'end', 'createobject', 'quit']; var aspBuiltinObjsWords = ['server', 'response', 'request', 'session', 'application']; var aspKnownProperties = ['buffer', 'cachecontrol', 'charset', 'contenttype', 'expires', 'expiresabsolute', 'isclientconnected', 'pics', 'status', //response 'clientcertificate', 'cookies', 'form', 'querystring', 'servervariables', 'totalbytes', //request 'contents', 'staticobjects', //application 'codepage', 'lcid', 'sessionid', 'timeout', //session 'scripttimeout']; //server var aspKnownMethods = ['addheader', 'appendtolog', 'binarywrite', 'end', 'flush', 'redirect', //response 'binaryread', //request 'remove', 'removeall', 'lock', 'unlock', //application 'abandon', //session 'getlasterror', 'htmlencode', 'mappath', 'transfer', 'urlencode']; //server var knownWords = knownMethods.concat(knownProperties); builtinObjsWords = builtinObjsWords.concat(builtinConsts); if (conf.isASP){ builtinObjsWords = builtinObjsWords.concat(aspBuiltinObjsWords); knownWords = knownWords.concat(aspKnownMethods, aspKnownProperties); }; var keywords = wordRegexp(commonkeywords); var atoms = wordRegexp(atomWords); var builtinFuncs = wordRegexp(builtinFuncsWords); var builtinObjs = wordRegexp(builtinObjsWords); var known = wordRegexp(knownWords); var stringPrefixes = '"'; var opening = wordRegexp(openingKeywords); var middle = wordRegexp(middleKeywords); var closing = wordRegexp(endKeywords); var doubleClosing = wordRegexp(['end']); var doOpening = wordRegexp(['do']); var noIndentWords = wordRegexp(['on error resume next', 'exit']); var comment = wordRegexp(['rem']); function indent(_stream, state) { state.currentIndent++; } function dedent(_stream, state) { state.currentIndent--; } // tokenizers function tokenBase(stream, state) { if (stream.eatSpace()) { return 'space'; //return null; } var ch = stream.peek(); // Handle Comments if (ch === "'") { stream.skipToEnd(); return 'comment'; } if (stream.match(comment)){ stream.skipToEnd(); return 'comment'; } // Handle Number Literals if (stream.match(/^((&H)|(&O))?[0-9\.]/i, false) && !stream.match(/^((&H)|(&O))?[0-9\.]+[a-z_]/i, false)) { var floatLiteral = false; // Floats if (stream.match(/^\d*\.\d+/i)) { floatLiteral = true; } else if (stream.match(/^\d+\.\d*/)) { floatLiteral = true; } else if (stream.match(/^\.\d+/)) { floatLiteral = true; } if (floatLiteral) { // Float literals may be "imaginary" stream.eat(/J/i); return 'number'; } // Integers var intLiteral = false; // Hex if (stream.match(/^&H[0-9a-f]+/i)) { intLiteral = true; } // Octal else if (stream.match(/^&O[0-7]+/i)) { intLiteral = true; } // Decimal else if (stream.match(/^[1-9]\d*F?/)) { // Decimal literals may be "imaginary" stream.eat(/J/i); // TODO - Can you have imaginary longs? intLiteral = true; } // Zero by itself with no other piece of number. else if (stream.match(/^0(?![\dx])/i)) { intLiteral = true; } if (intLiteral) { // Integer literals may be "long" stream.eat(/L/i); return 'number'; } } // Handle Strings if (stream.match(stringPrefixes)) { state.tokenize = tokenStringFactory(stream.current()); return state.tokenize(stream, state); } // Handle operators and Delimiters if (stream.match(doubleOperators) || stream.match(singleOperators) || stream.match(wordOperators)) { return 'operator'; } if (stream.match(singleDelimiters)) { return null; } if (stream.match(brakets)) { return "bracket"; } if (stream.match(noIndentWords)) { state.doInCurrentLine = true; return 'keyword'; } if (stream.match(doOpening)) { indent(stream,state); state.doInCurrentLine = true; return 'keyword'; } if (stream.match(opening)) { if (! state.doInCurrentLine) indent(stream,state); else state.doInCurrentLine = false; return 'keyword'; } if (stream.match(middle)) { return 'keyword'; } if (stream.match(doubleClosing)) { dedent(stream,state); dedent(stream,state); return 'keyword'; } if (stream.match(closing)) { if (! state.doInCurrentLine) dedent(stream,state); else state.doInCurrentLine = false; return 'keyword'; } if (stream.match(keywords)) { return 'keyword'; } if (stream.match(atoms)) { return 'atom'; } if (stream.match(known)) { return 'variable-2'; } if (stream.match(builtinFuncs)) { return 'builtin'; } if (stream.match(builtinObjs)){ return 'variable-2'; } if (stream.match(identifiers)) { return 'variable'; } // Handle non-detected items stream.next(); return ERRORCLASS; } function tokenStringFactory(delimiter) { var singleline = delimiter.length == 1; var OUTCLASS = 'string'; return function(stream, state) { while (!stream.eol()) { stream.eatWhile(/[^'"]/); if (stream.match(delimiter)) { state.tokenize = tokenBase; return OUTCLASS; } else { stream.eat(/['"]/); } } if (singleline) { if (parserConf.singleLineStringErrors) { return ERRORCLASS; } else { state.tokenize = tokenBase; } } return OUTCLASS; }; } function tokenLexer(stream, state) { var style = state.tokenize(stream, state); var current = stream.current(); // Handle '.' connected identifiers if (current === '.') { style = state.tokenize(stream, state); current = stream.current(); if (style && (style.substr(0, 8) === 'variable' || style==='builtin' || style==='keyword')){//|| knownWords.indexOf(current.substring(1)) > -1) { if (style === 'builtin' || style === 'keyword') style='variable'; if (knownWords.indexOf(current.substr(1)) > -1) style='variable-2'; return style; } else { return ERRORCLASS; } } return style; } var external = { electricChars:"dDpPtTfFeE ", startState: function() { return { tokenize: tokenBase, lastToken: null, currentIndent: 0, nextLineIndent: 0, doInCurrentLine: false, ignoreKeyword: false }; }, token: function(stream, state) { if (stream.sol()) { state.currentIndent += state.nextLineIndent; state.nextLineIndent = 0; state.doInCurrentLine = 0; } var style = tokenLexer(stream, state); state.lastToken = {style:style, content: stream.current()}; if (style==='space') style=null; return style; }, indent: function(state, textAfter) { var trueText = textAfter.replace(/^\s+|\s+$/g, '') ; if (trueText.match(closing) || trueText.match(doubleClosing) || trueText.match(middle)) return conf.indentUnit*(state.currentIndent-1); if(state.currentIndent < 0) return 0; return state.currentIndent * conf.indentUnit; } }; return external; }); CodeMirror.defineMIME("text/vbscript", "vbscript"); }); ================================================ FILE: base/res/codemirror/mode/velocity/index.html ================================================ CodeMirror: Velocity mode

    Velocity mode

    MIME types defined: text/velocity.

    ================================================ FILE: base/res/codemirror/mode/velocity/velocity.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("velocity", function() { function parseWords(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } var keywords = parseWords("#end #else #break #stop #[[ #]] " + "#{end} #{else} #{break} #{stop}"); var functions = parseWords("#if #elseif #foreach #set #include #parse #macro #define #evaluate " + "#{if} #{elseif} #{foreach} #{set} #{include} #{parse} #{macro} #{define} #{evaluate}"); var specials = parseWords("$foreach.count $foreach.hasNext $foreach.first $foreach.last $foreach.topmost $foreach.parent.count $foreach.parent.hasNext $foreach.parent.first $foreach.parent.last $foreach.parent $velocityCount $!bodyContent $bodyContent"); var isOperatorChar = /[+\-*&%=<>!?:\/|]/; function chain(stream, state, f) { state.tokenize = f; return f(stream, state); } function tokenBase(stream, state) { var beforeParams = state.beforeParams; state.beforeParams = false; var ch = stream.next(); // start of unparsed string? if ((ch == "'") && state.inParams) { state.lastTokenWasBuiltin = false; return chain(stream, state, tokenString(ch)); } // start of parsed string? else if ((ch == '"')) { state.lastTokenWasBuiltin = false; if (state.inString) { state.inString = false; return "string"; } else if (state.inParams) return chain(stream, state, tokenString(ch)); } // is it one of the special signs []{}().,;? Seperator? else if (/[\[\]{}\(\),;\.]/.test(ch)) { if (ch == "(" && beforeParams) state.inParams = true; else if (ch == ")") { state.inParams = false; state.lastTokenWasBuiltin = true; } return null; } // start of a number value? else if (/\d/.test(ch)) { state.lastTokenWasBuiltin = false; stream.eatWhile(/[\w\.]/); return "number"; } // multi line comment? else if (ch == "#" && stream.eat("*")) { state.lastTokenWasBuiltin = false; return chain(stream, state, tokenComment); } // unparsed content? else if (ch == "#" && stream.match(/ *\[ *\[/)) { state.lastTokenWasBuiltin = false; return chain(stream, state, tokenUnparsed); } // single line comment? else if (ch == "#" && stream.eat("#")) { state.lastTokenWasBuiltin = false; stream.skipToEnd(); return "comment"; } // variable? else if (ch == "$") { stream.eatWhile(/[\w\d\$_\.{}]/); // is it one of the specials? if (specials && specials.propertyIsEnumerable(stream.current())) { return "keyword"; } else { state.lastTokenWasBuiltin = true; state.beforeParams = true; return "builtin"; } } // is it a operator? else if (isOperatorChar.test(ch)) { state.lastTokenWasBuiltin = false; stream.eatWhile(isOperatorChar); return "operator"; } else { // get the whole word stream.eatWhile(/[\w\$_{}@]/); var word = stream.current(); // is it one of the listed keywords? if (keywords && keywords.propertyIsEnumerable(word)) return "keyword"; // is it one of the listed functions? if (functions && functions.propertyIsEnumerable(word) || (stream.current().match(/^#@?[a-z0-9_]+ *$/i) && stream.peek()=="(") && !(functions && functions.propertyIsEnumerable(word.toLowerCase()))) { state.beforeParams = true; state.lastTokenWasBuiltin = false; return "keyword"; } if (state.inString) { state.lastTokenWasBuiltin = false; return "string"; } if (stream.pos > word.length && stream.string.charAt(stream.pos-word.length-1)=="." && state.lastTokenWasBuiltin) return "builtin"; // default: just a "word" state.lastTokenWasBuiltin = false; return null; } } function tokenString(quote) { return function(stream, state) { var escaped = false, next, end = false; while ((next = stream.next()) != null) { if ((next == quote) && !escaped) { end = true; break; } if (quote=='"' && stream.peek() == '$' && !escaped) { state.inString = true; end = true; break; } escaped = !escaped && next == "\\"; } if (end) state.tokenize = tokenBase; return "string"; }; } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "#" && maybeEnd) { state.tokenize = tokenBase; break; } maybeEnd = (ch == "*"); } return "comment"; } function tokenUnparsed(stream, state) { var maybeEnd = 0, ch; while (ch = stream.next()) { if (ch == "#" && maybeEnd == 2) { state.tokenize = tokenBase; break; } if (ch == "]") maybeEnd++; else if (ch != " ") maybeEnd = 0; } return "meta"; } // Interface return { startState: function() { return { tokenize: tokenBase, beforeParams: false, inParams: false, inString: false, lastTokenWasBuiltin: false }; }, token: function(stream, state) { if (stream.eatSpace()) return null; return state.tokenize(stream, state); }, blockCommentStart: "#*", blockCommentEnd: "*#", lineComment: "##", fold: "velocity" }; }); CodeMirror.defineMIME("text/velocity", "velocity"); }); ================================================ FILE: base/res/codemirror/mode/verilog/index.html ================================================ CodeMirror: Verilog/SystemVerilog mode

    SystemVerilog mode

    Syntax highlighting and indentation for the Verilog and SystemVerilog languages (IEEE 1800).

    Configuration options:

    • noIndentKeywords - List of keywords which should not cause identation to increase. E.g. ["package", "module"]. Default: None

    MIME types defined: text/x-verilog and text/x-systemverilog.

    ================================================ FILE: base/res/codemirror/mode/verilog/test.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({indentUnit: 4}, "verilog"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } MT("binary_literals", "[number 1'b0]", "[number 1'b1]", "[number 1'bx]", "[number 1'bz]", "[number 1'bX]", "[number 1'bZ]", "[number 1'B0]", "[number 1'B1]", "[number 1'Bx]", "[number 1'Bz]", "[number 1'BX]", "[number 1'BZ]", "[number 1'b0]", "[number 1'b1]", "[number 2'b01]", "[number 2'bxz]", "[number 2'b11]", "[number 2'b10]", "[number 2'b1Z]", "[number 12'b0101_0101_0101]", "[number 1'b 0]", "[number 'b0101]" ); MT("octal_literals", "[number 3'o7]", "[number 3'O7]", "[number 3'so7]", "[number 3'SO7]" ); MT("decimal_literals", "[number 0]", "[number 1]", "[number 7]", "[number 123_456]", "[number 'd33]", "[number 8'd255]", "[number 8'D255]", "[number 8'sd255]", "[number 8'SD255]", "[number 32'd123]", "[number 32 'd123]", "[number 32 'd 123]" ); MT("hex_literals", "[number 4'h0]", "[number 4'ha]", "[number 4'hF]", "[number 4'hx]", "[number 4'hz]", "[number 4'hX]", "[number 4'hZ]", "[number 32'hdc78]", "[number 32'hDC78]", "[number 32 'hDC78]", "[number 32'h DC78]", "[number 32 'h DC78]", "[number 32'h44x7]", "[number 32'hFFF?]" ); MT("real_number_literals", "[number 1.2]", "[number 0.1]", "[number 2394.26331]", "[number 1.2E12]", "[number 1.2e12]", "[number 1.30e-2]", "[number 0.1e-0]", "[number 23E10]", "[number 29E-2]", "[number 236.123_763_e-12]" ); MT("operators", "[meta ^]" ); MT("keywords", "[keyword logic]", "[keyword logic] [variable foo]", "[keyword reg] [variable abc]" ); MT("variables", "[variable _leading_underscore]", "[variable _if]", "[number 12] [variable foo]", "[variable foo] [number 14]" ); MT("tick_defines", "[def `FOO]", "[def `foo]", "[def `FOO_bar]" ); MT("system_calls", "[meta $display]", "[meta $vpi_printf]" ); MT("line_comment", "[comment // Hello world]"); // Alignment tests MT("align_port_map_style1", /** * mod mod(.a(a), * .b(b) * ); */ "[variable mod] [variable mod][bracket (].[variable a][bracket (][variable a][bracket )],", " .[variable b][bracket (][variable b][bracket )]", " [bracket )];", "" ); MT("align_port_map_style2", /** * mod mod( * .a(a), * .b(b) * ); */ "[variable mod] [variable mod][bracket (]", " .[variable a][bracket (][variable a][bracket )],", " .[variable b][bracket (][variable b][bracket )]", "[bracket )];", "" ); // Indentation tests MT("indent_single_statement_if", "[keyword if] [bracket (][variable foo][bracket )]", " [keyword break];", "" ); MT("no_indent_after_single_line_if", "[keyword if] [bracket (][variable foo][bracket )] [keyword break];", "" ); MT("indent_after_if_begin_same_line", "[keyword if] [bracket (][variable foo][bracket )] [keyword begin]", " [keyword break];", " [keyword break];", "[keyword end]", "" ); MT("indent_after_if_begin_next_line", "[keyword if] [bracket (][variable foo][bracket )]", " [keyword begin]", " [keyword break];", " [keyword break];", " [keyword end]", "" ); MT("indent_single_statement_if_else", "[keyword if] [bracket (][variable foo][bracket )]", " [keyword break];", "[keyword else]", " [keyword break];", "" ); MT("indent_if_else_begin_same_line", "[keyword if] [bracket (][variable foo][bracket )] [keyword begin]", " [keyword break];", " [keyword break];", "[keyword end] [keyword else] [keyword begin]", " [keyword break];", " [keyword break];", "[keyword end]", "" ); MT("indent_if_else_begin_next_line", "[keyword if] [bracket (][variable foo][bracket )]", " [keyword begin]", " [keyword break];", " [keyword break];", " [keyword end]", "[keyword else]", " [keyword begin]", " [keyword break];", " [keyword break];", " [keyword end]", "" ); MT("indent_if_nested_without_begin", "[keyword if] [bracket (][variable foo][bracket )]", " [keyword if] [bracket (][variable foo][bracket )]", " [keyword if] [bracket (][variable foo][bracket )]", " [keyword break];", "" ); MT("indent_case", "[keyword case] [bracket (][variable state][bracket )]", " [variable FOO]:", " [keyword break];", " [variable BAR]:", " [keyword break];", "[keyword endcase]", "" ); MT("unindent_after_end_with_preceding_text", "[keyword begin]", " [keyword break]; [keyword end]", "" ); MT("export_function_one_line_does_not_indent", "[keyword export] [string \"DPI-C\"] [keyword function] [variable helloFromSV];", "" ); MT("export_task_one_line_does_not_indent", "[keyword export] [string \"DPI-C\"] [keyword task] [variable helloFromSV];", "" ); MT("export_function_two_lines_indents_properly", "[keyword export]", " [string \"DPI-C\"] [keyword function] [variable helloFromSV];", "" ); MT("export_task_two_lines_indents_properly", "[keyword export]", " [string \"DPI-C\"] [keyword task] [variable helloFromSV];", "" ); MT("import_function_one_line_does_not_indent", "[keyword import] [string \"DPI-C\"] [keyword function] [variable helloFromC];", "" ); MT("import_task_one_line_does_not_indent", "[keyword import] [string \"DPI-C\"] [keyword task] [variable helloFromC];", "" ); MT("import_package_single_line_does_not_indent", "[keyword import] [variable p]::[variable x];", "[keyword import] [variable p]::[variable y];", "" ); MT("covergoup_with_function_indents_properly", "[keyword covergroup] [variable cg] [keyword with] [keyword function] [variable sample][bracket (][keyword bit] [variable b][bracket )];", " [variable c] : [keyword coverpoint] [variable c];", "[keyword endgroup]: [variable cg]", "" ); })(); ================================================ FILE: base/res/codemirror/mode/verilog/verilog.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("verilog", function(config, parserConfig) { var indentUnit = config.indentUnit, statementIndentUnit = parserConfig.statementIndentUnit || indentUnit, dontAlignCalls = parserConfig.dontAlignCalls, noIndentKeywords = parserConfig.noIndentKeywords || [], multiLineStrings = parserConfig.multiLineStrings, hooks = parserConfig.hooks || {}; function words(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } /** * Keywords from IEEE 1800-2012 */ var keywords = words( "accept_on alias always always_comb always_ff always_latch and assert assign assume automatic before begin bind " + "bins binsof bit break buf bufif0 bufif1 byte case casex casez cell chandle checker class clocking cmos config " + "const constraint context continue cover covergroup coverpoint cross deassign default defparam design disable " + "dist do edge else end endcase endchecker endclass endclocking endconfig endfunction endgenerate endgroup " + "endinterface endmodule endpackage endprimitive endprogram endproperty endspecify endsequence endtable endtask " + "enum event eventually expect export extends extern final first_match for force foreach forever fork forkjoin " + "function generate genvar global highz0 highz1 if iff ifnone ignore_bins illegal_bins implements implies import " + "incdir include initial inout input inside instance int integer interconnect interface intersect join join_any " + "join_none large let liblist library local localparam logic longint macromodule matches medium modport module " + "nand negedge nettype new nexttime nmos nor noshowcancelled not notif0 notif1 null or output package packed " + "parameter pmos posedge primitive priority program property protected pull0 pull1 pulldown pullup " + "pulsestyle_ondetect pulsestyle_onevent pure rand randc randcase randsequence rcmos real realtime ref reg " + "reject_on release repeat restrict return rnmos rpmos rtran rtranif0 rtranif1 s_always s_eventually s_nexttime " + "s_until s_until_with scalared sequence shortint shortreal showcancelled signed small soft solve specify " + "specparam static string strong strong0 strong1 struct super supply0 supply1 sync_accept_on sync_reject_on " + "table tagged task this throughout time timeprecision timeunit tran tranif0 tranif1 tri tri0 tri1 triand trior " + "trireg type typedef union unique unique0 unsigned until until_with untyped use uwire var vectored virtual void " + "wait wait_order wand weak weak0 weak1 while wildcard wire with within wor xnor xor"); /** Operators from IEEE 1800-2012 unary_operator ::= + | - | ! | ~ | & | ~& | | | ~| | ^ | ~^ | ^~ binary_operator ::= + | - | * | / | % | == | != | === | !== | ==? | !=? | && | || | ** | < | <= | > | >= | & | | | ^ | ^~ | ~^ | >> | << | >>> | <<< | -> | <-> inc_or_dec_operator ::= ++ | -- unary_module_path_operator ::= ! | ~ | & | ~& | | | ~| | ^ | ~^ | ^~ binary_module_path_operator ::= == | != | && | || | & | | | ^ | ^~ | ~^ */ var isOperatorChar = /[\+\-\*\/!~&|^%=?:]/; var isBracketChar = /[\[\]{}()]/; var unsignedNumber = /\d[0-9_]*/; var decimalLiteral = /\d*\s*'s?d\s*\d[0-9_]*/i; var binaryLiteral = /\d*\s*'s?b\s*[xz01][xz01_]*/i; var octLiteral = /\d*\s*'s?o\s*[xz0-7][xz0-7_]*/i; var hexLiteral = /\d*\s*'s?h\s*[0-9a-fxz?][0-9a-fxz?_]*/i; var realLiteral = /(\d[\d_]*(\.\d[\d_]*)?E-?[\d_]+)|(\d[\d_]*\.\d[\d_]*)/i; var closingBracketOrWord = /^((\w+)|[)}\]])/; var closingBracket = /[)}\]]/; var curPunc; var curKeyword; // Block openings which are closed by a matching keyword in the form of ("end" + keyword) // E.g. "task" => "endtask" var blockKeywords = words( "case checker class clocking config function generate interface module package" + "primitive program property specify sequence table task" ); // Opening/closing pairs var openClose = {}; for (var keyword in blockKeywords) { openClose[keyword] = "end" + keyword; } openClose["begin"] = "end"; openClose["casex"] = "endcase"; openClose["casez"] = "endcase"; openClose["do" ] = "while"; openClose["fork" ] = "join;join_any;join_none"; openClose["covergroup"] = "endgroup"; for (var i in noIndentKeywords) { var keyword = noIndentKeywords[i]; if (openClose[keyword]) { openClose[keyword] = undefined; } } // Keywords which open statements that are ended with a semi-colon var statementKeywords = words("always always_comb always_ff always_latch assert assign assume else export for foreach forever if import initial repeat while"); function tokenBase(stream, state) { var ch = stream.peek(), style; if (hooks[ch] && (style = hooks[ch](stream, state)) != false) return style; if (hooks.tokenBase && (style = hooks.tokenBase(stream, state)) != false) return style; if (/[,;:\.]/.test(ch)) { curPunc = stream.next(); return null; } if (isBracketChar.test(ch)) { curPunc = stream.next(); return "bracket"; } // Macros (tick-defines) if (ch == '`') { stream.next(); if (stream.eatWhile(/[\w\$_]/)) { return "def"; } else { return null; } } // System calls if (ch == '$') { stream.next(); if (stream.eatWhile(/[\w\$_]/)) { return "meta"; } else { return null; } } // Time literals if (ch == '#') { stream.next(); stream.eatWhile(/[\d_.]/); return "def"; } // Strings if (ch == '"') { stream.next(); state.tokenize = tokenString(ch); return state.tokenize(stream, state); } // Comments if (ch == "/") { stream.next(); if (stream.eat("*")) { state.tokenize = tokenComment; return tokenComment(stream, state); } if (stream.eat("/")) { stream.skipToEnd(); return "comment"; } stream.backUp(1); } // Numeric literals if (stream.match(realLiteral) || stream.match(decimalLiteral) || stream.match(binaryLiteral) || stream.match(octLiteral) || stream.match(hexLiteral) || stream.match(unsignedNumber) || stream.match(realLiteral)) { return "number"; } // Operators if (stream.eatWhile(isOperatorChar)) { return "meta"; } // Keywords / plain variables if (stream.eatWhile(/[\w\$_]/)) { var cur = stream.current(); if (keywords[cur]) { if (openClose[cur]) { curPunc = "newblock"; } if (statementKeywords[cur]) { curPunc = "newstatement"; } curKeyword = cur; return "keyword"; } return "variable"; } stream.next(); return null; } function tokenString(quote) { return function(stream, state) { var escaped = false, next, end = false; while ((next = stream.next()) != null) { if (next == quote && !escaped) {end = true; break;} escaped = !escaped && next == "\\"; } if (end || !(escaped || multiLineStrings)) state.tokenize = tokenBase; return "string"; }; } function tokenComment(stream, state) { var maybeEnd = false, ch; while (ch = stream.next()) { if (ch == "/" && maybeEnd) { state.tokenize = tokenBase; break; } maybeEnd = (ch == "*"); } return "comment"; } function Context(indented, column, type, align, prev) { this.indented = indented; this.column = column; this.type = type; this.align = align; this.prev = prev; } function pushContext(state, col, type) { var indent = state.indented; var c = new Context(indent, col, type, null, state.context); return state.context = c; } function popContext(state) { var t = state.context.type; if (t == ")" || t == "]" || t == "}") { state.indented = state.context.indented; } return state.context = state.context.prev; } function isClosing(text, contextClosing) { if (text == contextClosing) { return true; } else { // contextClosing may be mulitple keywords separated by ; var closingKeywords = contextClosing.split(";"); for (var i in closingKeywords) { if (text == closingKeywords[i]) { return true; } } return false; } } function buildElectricInputRegEx() { // Reindentation should occur on any bracket char: {}()[] // or on a match of any of the block closing keywords, at // the end of a line var allClosings = []; for (var i in openClose) { if (openClose[i]) { var closings = openClose[i].split(";"); for (var j in closings) { allClosings.push(closings[j]); } } } var re = new RegExp("[{}()\\[\\]]|(" + allClosings.join("|") + ")$"); return re; } // Interface return { // Regex to force current line to reindent electricInput: buildElectricInputRegEx(), startState: function(basecolumn) { var state = { tokenize: null, context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), indented: 0, startOfLine: true }; if (hooks.startState) hooks.startState(state); return state; }, token: function(stream, state) { var ctx = state.context; if (stream.sol()) { if (ctx.align == null) ctx.align = false; state.indented = stream.indentation(); state.startOfLine = true; } if (hooks.token) hooks.token(stream, state); if (stream.eatSpace()) return null; curPunc = null; curKeyword = null; var style = (state.tokenize || tokenBase)(stream, state); if (style == "comment" || style == "meta" || style == "variable") return style; if (ctx.align == null) ctx.align = true; if (curPunc == ctx.type) { popContext(state); } else if ((curPunc == ";" && ctx.type == "statement") || (ctx.type && isClosing(curKeyword, ctx.type))) { ctx = popContext(state); while (ctx && ctx.type == "statement") ctx = popContext(state); } else if (curPunc == "{") { pushContext(state, stream.column(), "}"); } else if (curPunc == "[") { pushContext(state, stream.column(), "]"); } else if (curPunc == "(") { pushContext(state, stream.column(), ")"); } else if (ctx && ctx.type == "endcase" && curPunc == ":") { pushContext(state, stream.column(), "statement"); } else if (curPunc == "newstatement") { pushContext(state, stream.column(), "statement"); } else if (curPunc == "newblock") { if (curKeyword == "function" && ctx && (ctx.type == "statement" || ctx.type == "endgroup")) { // The 'function' keyword can appear in some other contexts where it actually does not // indicate a function (import/export DPI and covergroup definitions). // Do nothing in this case } else if (curKeyword == "task" && ctx && ctx.type == "statement") { // Same thing for task } else { var close = openClose[curKeyword]; pushContext(state, stream.column(), close); } } state.startOfLine = false; return style; }, indent: function(state, textAfter) { if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass; if (hooks.indent) { var fromHook = hooks.indent(state); if (fromHook >= 0) return fromHook; } var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev; var closing = false; var possibleClosing = textAfter.match(closingBracketOrWord); if (possibleClosing) closing = isClosing(possibleClosing[0], ctx.type); if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit); else if (closingBracket.test(ctx.type) && ctx.align && !dontAlignCalls) return ctx.column + (closing ? 0 : 1); else if (ctx.type == ")" && !closing) return ctx.indented + statementIndentUnit; else return ctx.indented + (closing ? 0 : indentUnit); }, blockCommentStart: "/*", blockCommentEnd: "*/", lineComment: "//" }; }); CodeMirror.defineMIME("text/x-verilog", { name: "verilog" }); CodeMirror.defineMIME("text/x-systemverilog", { name: "verilog" }); // TLVVerilog mode var tlvchScopePrefixes = { ">": "property", "->": "property", "-": "hr", "|": "link", "?$": "qualifier", "?*": "qualifier", "@-": "variable-3", "@": "variable-3", "?": "qualifier" }; function tlvGenIndent(stream, state) { var tlvindentUnit = 2; var rtnIndent = -1, indentUnitRq = 0, curIndent = stream.indentation(); switch (state.tlvCurCtlFlowChar) { case "\\": curIndent = 0; break; case "|": if (state.tlvPrevPrevCtlFlowChar == "@") { indentUnitRq = -2; //-2 new pipe rq after cur pipe break; } if (tlvchScopePrefixes[state.tlvPrevCtlFlowChar]) indentUnitRq = 1; // +1 new scope break; case "M": // m4 if (state.tlvPrevPrevCtlFlowChar == "@") { indentUnitRq = -2; //-2 new inst rq after pipe break; } if (tlvchScopePrefixes[state.tlvPrevCtlFlowChar]) indentUnitRq = 1; // +1 new scope break; case "@": if (state.tlvPrevCtlFlowChar == "S") indentUnitRq = -1; // new pipe stage after stmts if (state.tlvPrevCtlFlowChar == "|") indentUnitRq = 1; // 1st pipe stage break; case "S": if (state.tlvPrevCtlFlowChar == "@") indentUnitRq = 1; // flow in pipe stage if (tlvchScopePrefixes[state.tlvPrevCtlFlowChar]) indentUnitRq = 1; // +1 new scope break; } var statementIndentUnit = tlvindentUnit; rtnIndent = curIndent + (indentUnitRq*statementIndentUnit); return rtnIndent >= 0 ? rtnIndent : curIndent; } CodeMirror.defineMIME("text/x-tlv", { name: "verilog", hooks: { "\\": function(stream, state) { var vxIndent = 0, style = false; var curPunc = stream.string; if ((stream.sol()) && ((/\\SV/.test(stream.string)) || (/\\TLV/.test(stream.string)))) { curPunc = (/\\TLV_version/.test(stream.string)) ? "\\TLV_version" : stream.string; stream.skipToEnd(); if (curPunc == "\\SV" && state.vxCodeActive) {state.vxCodeActive = false;}; if ((/\\TLV/.test(curPunc) && !state.vxCodeActive) || (curPunc=="\\TLV_version" && state.vxCodeActive)) {state.vxCodeActive = true;}; style = "keyword"; state.tlvCurCtlFlowChar = state.tlvPrevPrevCtlFlowChar = state.tlvPrevCtlFlowChar = ""; if (state.vxCodeActive == true) { state.tlvCurCtlFlowChar = "\\"; vxIndent = tlvGenIndent(stream, state); } state.vxIndentRq = vxIndent; } return style; }, tokenBase: function(stream, state) { var vxIndent = 0, style = false; var tlvisOperatorChar = /[\[\]=:]/; var tlvkpScopePrefixs = { "**":"variable-2", "*":"variable-2", "$$":"variable", "$":"variable", "^^":"attribute", "^":"attribute"}; var ch = stream.peek(); var vxCurCtlFlowCharValueAtStart = state.tlvCurCtlFlowChar; if (state.vxCodeActive == true) { if (/[\[\]{}\(\);\:]/.test(ch)) { // bypass nesting and 1 char punc style = "meta"; stream.next(); } else if (ch == "/") { stream.next(); if (stream.eat("/")) { stream.skipToEnd(); style = "comment"; state.tlvCurCtlFlowChar = "S"; } else { stream.backUp(1); } } else if (ch == "@") { // pipeline stage style = tlvchScopePrefixes[ch]; state.tlvCurCtlFlowChar = "@"; stream.next(); stream.eatWhile(/[\w\$_]/); } else if (stream.match(/\b[mM]4+/, true)) { // match: function(pattern, consume, caseInsensitive) // m4 pre proc stream.skipTo("("); style = "def"; state.tlvCurCtlFlowChar = "M"; } else if (ch == "!" && stream.sol()) { // v stmt in tlv region // state.tlvCurCtlFlowChar = "S"; style = "comment"; stream.next(); } else if (tlvisOperatorChar.test(ch)) { // operators stream.eatWhile(tlvisOperatorChar); style = "operator"; } else if (ch == "#") { // phy hier state.tlvCurCtlFlowChar = (state.tlvCurCtlFlowChar == "") ? ch : state.tlvCurCtlFlowChar; stream.next(); stream.eatWhile(/[+-]\d/); style = "tag"; } else if (tlvkpScopePrefixs.propertyIsEnumerable(ch)) { // special TLV operators style = tlvkpScopePrefixs[ch]; state.tlvCurCtlFlowChar = state.tlvCurCtlFlowChar == "" ? "S" : state.tlvCurCtlFlowChar; // stmt stream.next(); stream.match(/[a-zA-Z_0-9]+/); } else if (style = tlvchScopePrefixes[ch] || false) { // special TLV operators state.tlvCurCtlFlowChar = state.tlvCurCtlFlowChar == "" ? ch : state.tlvCurCtlFlowChar; stream.next(); stream.match(/[a-zA-Z_0-9]+/); } if (state.tlvCurCtlFlowChar != vxCurCtlFlowCharValueAtStart) { // flow change vxIndent = tlvGenIndent(stream, state); state.vxIndentRq = vxIndent; } } return style; }, token: function(stream, state) { if (state.vxCodeActive == true && stream.sol() && state.tlvCurCtlFlowChar != "") { state.tlvPrevPrevCtlFlowChar = state.tlvPrevCtlFlowChar; state.tlvPrevCtlFlowChar = state.tlvCurCtlFlowChar; state.tlvCurCtlFlowChar = ""; } }, indent: function(state) { return (state.vxCodeActive == true) ? state.vxIndentRq : -1; }, startState: function(state) { state.tlvCurCtlFlowChar = ""; state.tlvPrevCtlFlowChar = ""; state.tlvPrevPrevCtlFlowChar = ""; state.vxCodeActive = true; state.vxIndentRq = 0; } } }); }); ================================================ FILE: base/res/codemirror/mode/xml/index.html ================================================ CodeMirror: XML mode

    XML mode

    The XML mode supports two configuration parameters:

    htmlMode (boolean)
    This switches the mode to parse HTML instead of XML. This means attributes do not have to be quoted, and some elements (such as br) do not require a closing tag.
    alignCDATA (boolean)
    Setting this to true will force the opening tag of CDATA blocks to not be indented.

    MIME types defined: application/xml, text/html.

    ================================================ FILE: base/res/codemirror/mode/xml/test.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function() { var mode = CodeMirror.getMode({indentUnit: 2}, "xml"), mname = "xml"; function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), mname); } MT("matching", "[tag&bracket <][tag top][tag&bracket >]", " text", " [tag&bracket <][tag inner][tag&bracket />]", "[tag&bracket ]"); MT("nonmatching", "[tag&bracket <][tag top][tag&bracket >]", " [tag&bracket <][tag inner][tag&bracket />]", " [tag&bracket ]"); MT("doctype", "[meta ]", "[tag&bracket <][tag top][tag&bracket />]"); MT("cdata", "[tag&bracket <][tag top][tag&bracket >]", " [atom ]", "[tag&bracket ]"); // HTML tests mode = CodeMirror.getMode({indentUnit: 2}, "text/html"); MT("selfclose", "[tag&bracket <][tag html][tag&bracket >]", " [tag&bracket <][tag link] [attribute rel]=[string stylesheet] [attribute href]=[string \"/foobar\"][tag&bracket >]", "[tag&bracket ]"); MT("list", "[tag&bracket <][tag ol][tag&bracket >]", " [tag&bracket <][tag li][tag&bracket >]one", " [tag&bracket <][tag li][tag&bracket >]two", "[tag&bracket ]"); MT("valueless", "[tag&bracket <][tag input] [attribute type]=[string checkbox] [attribute checked][tag&bracket />]"); MT("pThenArticle", "[tag&bracket <][tag p][tag&bracket >]", " foo", "[tag&bracket <][tag article][tag&bracket >]bar"); })(); ================================================ FILE: base/res/codemirror/mode/xml/xml.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("xml", function(config, parserConfig) { var indentUnit = config.indentUnit; var multilineTagIndentFactor = parserConfig.multilineTagIndentFactor || 1; var multilineTagIndentPastTag = parserConfig.multilineTagIndentPastTag; if (multilineTagIndentPastTag == null) multilineTagIndentPastTag = true; var Kludges = parserConfig.htmlMode ? { autoSelfClosers: {'area': true, 'base': true, 'br': true, 'col': true, 'command': true, 'embed': true, 'frame': true, 'hr': true, 'img': true, 'input': true, 'keygen': true, 'link': true, 'meta': true, 'param': true, 'source': true, 'track': true, 'wbr': true, 'menuitem': true}, implicitlyClosed: {'dd': true, 'li': true, 'optgroup': true, 'option': true, 'p': true, 'rp': true, 'rt': true, 'tbody': true, 'td': true, 'tfoot': true, 'th': true, 'tr': true}, contextGrabbers: { 'dd': {'dd': true, 'dt': true}, 'dt': {'dd': true, 'dt': true}, 'li': {'li': true}, 'option': {'option': true, 'optgroup': true}, 'optgroup': {'optgroup': true}, 'p': {'address': true, 'article': true, 'aside': true, 'blockquote': true, 'dir': true, 'div': true, 'dl': true, 'fieldset': true, 'footer': true, 'form': true, 'h1': true, 'h2': true, 'h3': true, 'h4': true, 'h5': true, 'h6': true, 'header': true, 'hgroup': true, 'hr': true, 'menu': true, 'nav': true, 'ol': true, 'p': true, 'pre': true, 'section': true, 'table': true, 'ul': true}, 'rp': {'rp': true, 'rt': true}, 'rt': {'rp': true, 'rt': true}, 'tbody': {'tbody': true, 'tfoot': true}, 'td': {'td': true, 'th': true}, 'tfoot': {'tbody': true}, 'th': {'td': true, 'th': true}, 'thead': {'tbody': true, 'tfoot': true}, 'tr': {'tr': true} }, doNotIndent: {"pre": true}, allowUnquoted: true, allowMissing: true, caseFold: true } : { autoSelfClosers: {}, implicitlyClosed: {}, contextGrabbers: {}, doNotIndent: {}, allowUnquoted: false, allowMissing: false, caseFold: false }; var alignCDATA = parserConfig.alignCDATA; // Return variables for tokenizers var type, setStyle; function inText(stream, state) { function chain(parser) { state.tokenize = parser; return parser(stream, state); } var ch = stream.next(); if (ch == "<") { if (stream.eat("!")) { if (stream.eat("[")) { if (stream.match("CDATA[")) return chain(inBlock("atom", "]]>")); else return null; } else if (stream.match("--")) { return chain(inBlock("comment", "-->")); } else if (stream.match("DOCTYPE", true, true)) { stream.eatWhile(/[\w\._\-]/); return chain(doctype(1)); } else { return null; } } else if (stream.eat("?")) { stream.eatWhile(/[\w\._\-]/); state.tokenize = inBlock("meta", "?>"); return "meta"; } else { type = stream.eat("/") ? "closeTag" : "openTag"; state.tokenize = inTag; return "tag bracket"; } } else if (ch == "&") { var ok; if (stream.eat("#")) { if (stream.eat("x")) { ok = stream.eatWhile(/[a-fA-F\d]/) && stream.eat(";"); } else { ok = stream.eatWhile(/[\d]/) && stream.eat(";"); } } else { ok = stream.eatWhile(/[\w\.\-:]/) && stream.eat(";"); } return ok ? "atom" : "error"; } else { stream.eatWhile(/[^&<]/); return null; } } function inTag(stream, state) { var ch = stream.next(); if (ch == ">" || (ch == "/" && stream.eat(">"))) { state.tokenize = inText; type = ch == ">" ? "endTag" : "selfcloseTag"; return "tag bracket"; } else if (ch == "=") { type = "equals"; return null; } else if (ch == "<") { state.tokenize = inText; state.state = baseState; state.tagName = state.tagStart = null; var next = state.tokenize(stream, state); return next ? next + " tag error" : "tag error"; } else if (/[\'\"]/.test(ch)) { state.tokenize = inAttribute(ch); state.stringStartCol = stream.column(); return state.tokenize(stream, state); } else { stream.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/); return "word"; } } function inAttribute(quote) { var closure = function(stream, state) { while (!stream.eol()) { if (stream.next() == quote) { state.tokenize = inTag; break; } } return "string"; }; closure.isInAttribute = true; return closure; } function inBlock(style, terminator) { return function(stream, state) { while (!stream.eol()) { if (stream.match(terminator)) { state.tokenize = inText; break; } stream.next(); } return style; }; } function doctype(depth) { return function(stream, state) { var ch; while ((ch = stream.next()) != null) { if (ch == "<") { state.tokenize = doctype(depth + 1); return state.tokenize(stream, state); } else if (ch == ">") { if (depth == 1) { state.tokenize = inText; break; } else { state.tokenize = doctype(depth - 1); return state.tokenize(stream, state); } } } return "meta"; }; } function Context(state, tagName, startOfLine) { this.prev = state.context; this.tagName = tagName; this.indent = state.indented; this.startOfLine = startOfLine; if (Kludges.doNotIndent.hasOwnProperty(tagName) || (state.context && state.context.noIndent)) this.noIndent = true; } function popContext(state) { if (state.context) state.context = state.context.prev; } function maybePopContext(state, nextTagName) { var parentTagName; while (true) { if (!state.context) { return; } parentTagName = state.context.tagName; if (!Kludges.contextGrabbers.hasOwnProperty(parentTagName) || !Kludges.contextGrabbers[parentTagName].hasOwnProperty(nextTagName)) { return; } popContext(state); } } function baseState(type, stream, state) { if (type == "openTag") { state.tagStart = stream.column(); return tagNameState; } else if (type == "closeTag") { return closeTagNameState; } else { return baseState; } } function tagNameState(type, stream, state) { if (type == "word") { state.tagName = stream.current(); setStyle = "tag"; return attrState; } else { setStyle = "error"; return tagNameState; } } function closeTagNameState(type, stream, state) { if (type == "word") { var tagName = stream.current(); if (state.context && state.context.tagName != tagName && Kludges.implicitlyClosed.hasOwnProperty(state.context.tagName)) popContext(state); if (state.context && state.context.tagName == tagName) { setStyle = "tag"; return closeState; } else { setStyle = "tag error"; return closeStateErr; } } else { setStyle = "error"; return closeStateErr; } } function closeState(type, _stream, state) { if (type != "endTag") { setStyle = "error"; return closeState; } popContext(state); return baseState; } function closeStateErr(type, stream, state) { setStyle = "error"; return closeState(type, stream, state); } function attrState(type, _stream, state) { if (type == "word") { setStyle = "attribute"; return attrEqState; } else if (type == "endTag" || type == "selfcloseTag") { var tagName = state.tagName, tagStart = state.tagStart; state.tagName = state.tagStart = null; if (type == "selfcloseTag" || Kludges.autoSelfClosers.hasOwnProperty(tagName)) { maybePopContext(state, tagName); } else { maybePopContext(state, tagName); state.context = new Context(state, tagName, tagStart == state.indented); } return baseState; } setStyle = "error"; return attrState; } function attrEqState(type, stream, state) { if (type == "equals") return attrValueState; if (!Kludges.allowMissing) setStyle = "error"; return attrState(type, stream, state); } function attrValueState(type, stream, state) { if (type == "string") return attrContinuedState; if (type == "word" && Kludges.allowUnquoted) {setStyle = "string"; return attrState;} setStyle = "error"; return attrState(type, stream, state); } function attrContinuedState(type, stream, state) { if (type == "string") return attrContinuedState; return attrState(type, stream, state); } return { startState: function() { return {tokenize: inText, state: baseState, indented: 0, tagName: null, tagStart: null, context: null}; }, token: function(stream, state) { if (!state.tagName && stream.sol()) state.indented = stream.indentation(); if (stream.eatSpace()) return null; type = null; var style = state.tokenize(stream, state); if ((style || type) && style != "comment") { setStyle = null; state.state = state.state(type || style, stream, state); if (setStyle) style = setStyle == "error" ? style + " error" : setStyle; } return style; }, indent: function(state, textAfter, fullLine) { var context = state.context; // Indent multi-line strings (e.g. css). if (state.tokenize.isInAttribute) { if (state.tagStart == state.indented) return state.stringStartCol + 1; else return state.indented + indentUnit; } if (context && context.noIndent) return CodeMirror.Pass; if (state.tokenize != inTag && state.tokenize != inText) return fullLine ? fullLine.match(/^(\s*)/)[0].length : 0; // Indent the starts of attribute names. if (state.tagName) { if (multilineTagIndentPastTag) return state.tagStart + state.tagName.length + 2; else return state.tagStart + indentUnit * multilineTagIndentFactor; } if (alignCDATA && /$/, blockCommentStart: "", configuration: parserConfig.htmlMode ? "html" : "xml", helperType: parserConfig.htmlMode ? "html" : "xml" }; }); CodeMirror.defineMIME("text/xml", "xml"); CodeMirror.defineMIME("application/xml", "xml"); if (!CodeMirror.mimeModes.hasOwnProperty("text/html")) CodeMirror.defineMIME("text/html", {name: "xml", htmlMode: true}); }); ================================================ FILE: base/res/codemirror/mode/xquery/index.html ================================================ CodeMirror: XQuery mode

    XQuery mode

    MIME types defined: application/xquery.

    Development of the CodeMirror XQuery mode was sponsored by MarkLogic and developed by Mike Brevoort.

    ================================================ FILE: base/res/codemirror/mode/xquery/test.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE // Don't take these too seriously -- the expected results appear to be // based on the results of actual runs without any serious manual // verification. If a change you made causes them to fail, the test is // as likely to wrong as the code. (function() { var mode = CodeMirror.getMode({tabSize: 4}, "xquery"); function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } MT("eviltest", "[keyword xquery] [keyword version] [variable "1][keyword .][atom 0][keyword -][variable ml"][def&variable ;] [comment (: this is : a \"comment\" :)]", " [keyword let] [variable $let] [keyword :=] [variable <x] [variable attr][keyword =][variable "value">"test"<func>][def&variable ;function]() [variable $var] {[keyword function]()} {[variable $var]}[variable <][keyword /][variable func><][keyword /][variable x>]", " [keyword let] [variable $joe][keyword :=][atom 1]", " [keyword return] [keyword element] [variable element] {", " [keyword attribute] [variable attribute] { [atom 1] },", " [keyword element] [variable test] { [variable 'a'] }, [keyword attribute] [variable foo] { [variable "bar"] },", " [def&variable fn:doc]()[[ [variable foo][keyword /][variable @bar] [keyword eq] [variable $let] ]],", " [keyword //][variable x] } [comment (: a more 'evil' test :)]", " [comment (: Modified Blakeley example (: with nested comment :) ... :)]", " [keyword declare] [keyword private] [keyword function] [def&variable local:declare]() {()}[variable ;]", " [keyword declare] [keyword private] [keyword function] [def&variable local:private]() {()}[variable ;]", " [keyword declare] [keyword private] [keyword function] [def&variable local:function]() {()}[variable ;]", " [keyword declare] [keyword private] [keyword function] [def&variable local:local]() {()}[variable ;]", " [keyword let] [variable $let] [keyword :=] [variable <let>let] [variable $let] [keyword :=] [variable "let"<][keyword /let][variable >]", " [keyword return] [keyword element] [variable element] {", " [keyword attribute] [variable attribute] { [keyword try] { [def&variable xdmp:version]() } [keyword catch]([variable $e]) { [def&variable xdmp:log]([variable $e]) } },", " [keyword attribute] [variable fn:doc] { [variable "bar"] [variable castable] [keyword as] [atom xs:string] },", " [keyword element] [variable text] { [keyword text] { [variable "text"] } },", " [def&variable fn:doc]()[[ [qualifier child::][variable eq][keyword /]([variable @bar] [keyword |] [qualifier attribute::][variable attribute]) [keyword eq] [variable $let] ]],", " [keyword //][variable fn:doc]", " }"); MT("testEmptySequenceKeyword", "[string \"foo\"] [keyword instance] [keyword of] [keyword empty-sequence]()"); MT("testMultiAttr", "[tag

    ][variable hello] [variable world][tag

    ]"); MT("test namespaced variable", "[keyword declare] [keyword namespace] [variable e] [keyword =] [string \"http://example.com/ANamespace\"][variable ;declare] [keyword variable] [variable $e:exampleComThisVarIsNotRecognized] [keyword as] [keyword element]([keyword *]) [variable external;]"); MT("test EQName variable", "[keyword declare] [keyword variable] [variable $\"http://www.example.com/ns/my\":var] [keyword :=] [atom 12][variable ;]", "[tag ]{[variable $\"http://www.example.com/ns/my\":var]}[tag ]"); MT("test EQName function", "[keyword declare] [keyword function] [def&variable \"http://www.example.com/ns/my\":fn] ([variable $a] [keyword as] [atom xs:integer]) [keyword as] [atom xs:integer] {", " [variable $a] [keyword +] [atom 2]", "}[variable ;]", "[tag ]{[def&variable \"http://www.example.com/ns/my\":fn]([atom 12])}[tag ]"); MT("test EQName function with single quotes", "[keyword declare] [keyword function] [def&variable 'http://www.example.com/ns/my':fn] ([variable $a] [keyword as] [atom xs:integer]) [keyword as] [atom xs:integer] {", " [variable $a] [keyword +] [atom 2]", "}[variable ;]", "[tag ]{[def&variable 'http://www.example.com/ns/my':fn]([atom 12])}[tag ]"); MT("testProcessingInstructions", "[def&variable data]([comment&meta ]) [keyword instance] [keyword of] [atom xs:string]"); MT("testQuoteEscapeDouble", "[keyword let] [variable $rootfolder] [keyword :=] [string \"c:\\builds\\winnt\\HEAD\\qa\\scripts\\\"]", "[keyword let] [variable $keysfolder] [keyword :=] [def&variable concat]([variable $rootfolder], [string \"keys\\\"])"); })(); ================================================ FILE: base/res/codemirror/mode/xquery/xquery.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("xquery", function() { // The keywords object is set to the result of this self executing // function. Each keyword is a property of the keywords object whose // value is {type: atype, style: astyle} var keywords = function(){ // conveinence functions used to build keywords object function kw(type) {return {type: type, style: "keyword"};} var A = kw("keyword a") , B = kw("keyword b") , C = kw("keyword c") , operator = kw("operator") , atom = {type: "atom", style: "atom"} , punctuation = {type: "punctuation", style: null} , qualifier = {type: "axis_specifier", style: "qualifier"}; // kwObj is what is return from this function at the end var kwObj = { 'if': A, 'switch': A, 'while': A, 'for': A, 'else': B, 'then': B, 'try': B, 'finally': B, 'catch': B, 'element': C, 'attribute': C, 'let': C, 'implements': C, 'import': C, 'module': C, 'namespace': C, 'return': C, 'super': C, 'this': C, 'throws': C, 'where': C, 'private': C, ',': punctuation, 'null': atom, 'fn:false()': atom, 'fn:true()': atom }; // a list of 'basic' keywords. For each add a property to kwObj with the value of // {type: basic[i], style: "keyword"} e.g. 'after' --> {type: "after", style: "keyword"} var basic = ['after','ancestor','ancestor-or-self','and','as','ascending','assert','attribute','before', 'by','case','cast','child','comment','declare','default','define','descendant','descendant-or-self', 'descending','document','document-node','element','else','eq','every','except','external','following', 'following-sibling','follows','for','function','if','import','in','instance','intersect','item', 'let','module','namespace','node','node','of','only','or','order','parent','precedes','preceding', 'preceding-sibling','processing-instruction','ref','return','returns','satisfies','schema','schema-element', 'self','some','sortby','stable','text','then','to','treat','typeswitch','union','variable','version','where', 'xquery', 'empty-sequence']; for(var i=0, l=basic.length; i < l; i++) { kwObj[basic[i]] = kw(basic[i]);}; // a list of types. For each add a property to kwObj with the value of // {type: "atom", style: "atom"} var types = ['xs:string', 'xs:float', 'xs:decimal', 'xs:double', 'xs:integer', 'xs:boolean', 'xs:date', 'xs:dateTime', 'xs:time', 'xs:duration', 'xs:dayTimeDuration', 'xs:time', 'xs:yearMonthDuration', 'numeric', 'xs:hexBinary', 'xs:base64Binary', 'xs:anyURI', 'xs:QName', 'xs:byte','xs:boolean','xs:anyURI','xf:yearMonthDuration']; for(var i=0, l=types.length; i < l; i++) { kwObj[types[i]] = atom;}; // each operator will add a property to kwObj with value of {type: "operator", style: "keyword"} var operators = ['eq', 'ne', 'lt', 'le', 'gt', 'ge', ':=', '=', '>', '>=', '<', '<=', '.', '|', '?', 'and', 'or', 'div', 'idiv', 'mod', '*', '/', '+', '-']; for(var i=0, l=operators.length; i < l; i++) { kwObj[operators[i]] = operator;}; // each axis_specifiers will add a property to kwObj with value of {type: "axis_specifier", style: "qualifier"} var axis_specifiers = ["self::", "attribute::", "child::", "descendant::", "descendant-or-self::", "parent::", "ancestor::", "ancestor-or-self::", "following::", "preceding::", "following-sibling::", "preceding-sibling::"]; for(var i=0, l=axis_specifiers.length; i < l; i++) { kwObj[axis_specifiers[i]] = qualifier; }; return kwObj; }(); // Used as scratch variables to communicate multiple values without // consing up tons of objects. var type, content; function ret(tp, style, cont) { type = tp; content = cont; return style; } function chain(stream, state, f) { state.tokenize = f; return f(stream, state); } // the primary mode tokenizer function tokenBase(stream, state) { var ch = stream.next(), mightBeFunction = false, isEQName = isEQNameAhead(stream); // an XML tag (if not in some sub, chained tokenizer) if (ch == "<") { if(stream.match("!--", true)) return chain(stream, state, tokenXMLComment); if(stream.match("![CDATA", false)) { state.tokenize = tokenCDATA; return ret("tag", "tag"); } if(stream.match("?", false)) { return chain(stream, state, tokenPreProcessing); } var isclose = stream.eat("/"); stream.eatSpace(); var tagName = "", c; while ((c = stream.eat(/[^\s\u00a0=<>\"\'\/?]/))) tagName += c; return chain(stream, state, tokenTag(tagName, isclose)); } // start code block else if(ch == "{") { pushStateStack(state,{ type: "codeblock"}); return ret("", null); } // end code block else if(ch == "}") { popStateStack(state); return ret("", null); } // if we're in an XML block else if(isInXmlBlock(state)) { if(ch == ">") return ret("tag", "tag"); else if(ch == "/" && stream.eat(">")) { popStateStack(state); return ret("tag", "tag"); } else return ret("word", "variable"); } // if a number else if (/\d/.test(ch)) { stream.match(/^\d*(?:\.\d*)?(?:E[+\-]?\d+)?/); return ret("number", "atom"); } // comment start else if (ch === "(" && stream.eat(":")) { pushStateStack(state, { type: "comment"}); return chain(stream, state, tokenComment); } // quoted string else if ( !isEQName && (ch === '"' || ch === "'")) return chain(stream, state, tokenString(ch)); // variable else if(ch === "$") { return chain(stream, state, tokenVariable); } // assignment else if(ch ===":" && stream.eat("=")) { return ret("operator", "keyword"); } // open paren else if(ch === "(") { pushStateStack(state, { type: "paren"}); return ret("", null); } // close paren else if(ch === ")") { popStateStack(state); return ret("", null); } // open paren else if(ch === "[") { pushStateStack(state, { type: "bracket"}); return ret("", null); } // close paren else if(ch === "]") { popStateStack(state); return ret("", null); } else { var known = keywords.propertyIsEnumerable(ch) && keywords[ch]; // if there's a EQName ahead, consume the rest of the string portion, it's likely a function if(isEQName && ch === '\"') while(stream.next() !== '"'){} if(isEQName && ch === '\'') while(stream.next() !== '\''){} // gobble up a word if the character is not known if(!known) stream.eatWhile(/[\w\$_-]/); // gobble a colon in the case that is a lib func type call fn:doc var foundColon = stream.eat(":"); // if there's not a second colon, gobble another word. Otherwise, it's probably an axis specifier // which should get matched as a keyword if(!stream.eat(":") && foundColon) { stream.eatWhile(/[\w\$_-]/); } // if the next non whitespace character is an open paren, this is probably a function (if not a keyword of other sort) if(stream.match(/^[ \t]*\(/, false)) { mightBeFunction = true; } // is the word a keyword? var word = stream.current(); known = keywords.propertyIsEnumerable(word) && keywords[word]; // if we think it's a function call but not yet known, // set style to variable for now for lack of something better if(mightBeFunction && !known) known = {type: "function_call", style: "variable def"}; // if the previous word was element, attribute, axis specifier, this word should be the name of that if(isInXmlConstructor(state)) { popStateStack(state); return ret("word", "variable", word); } // as previously checked, if the word is element,attribute, axis specifier, call it an "xmlconstructor" and // push the stack so we know to look for it on the next word if(word == "element" || word == "attribute" || known.type == "axis_specifier") pushStateStack(state, {type: "xmlconstructor"}); // if the word is known, return the details of that else just call this a generic 'word' return known ? ret(known.type, known.style, word) : ret("word", "variable", word); } } // handle comments, including nested function tokenComment(stream, state) { var maybeEnd = false, maybeNested = false, nestedCount = 0, ch; while (ch = stream.next()) { if (ch == ")" && maybeEnd) { if(nestedCount > 0) nestedCount--; else { popStateStack(state); break; } } else if(ch == ":" && maybeNested) { nestedCount++; } maybeEnd = (ch == ":"); maybeNested = (ch == "("); } return ret("comment", "comment"); } // tokenizer for string literals // optionally pass a tokenizer function to set state.tokenize back to when finished function tokenString(quote, f) { return function(stream, state) { var ch; if(isInString(state) && stream.current() == quote) { popStateStack(state); if(f) state.tokenize = f; return ret("string", "string"); } pushStateStack(state, { type: "string", name: quote, tokenize: tokenString(quote, f) }); // if we're in a string and in an XML block, allow an embedded code block if(stream.match("{", false) && isInXmlAttributeBlock(state)) { state.tokenize = tokenBase; return ret("string", "string"); } while (ch = stream.next()) { if (ch == quote) { popStateStack(state); if(f) state.tokenize = f; break; } else { // if we're in a string and in an XML block, allow an embedded code block in an attribute if(stream.match("{", false) && isInXmlAttributeBlock(state)) { state.tokenize = tokenBase; return ret("string", "string"); } } } return ret("string", "string"); }; } // tokenizer for variables function tokenVariable(stream, state) { var isVariableChar = /[\w\$_-]/; // a variable may start with a quoted EQName so if the next character is quote, consume to the next quote if(stream.eat("\"")) { while(stream.next() !== '\"'){}; stream.eat(":"); } else { stream.eatWhile(isVariableChar); if(!stream.match(":=", false)) stream.eat(":"); } stream.eatWhile(isVariableChar); state.tokenize = tokenBase; return ret("variable", "variable"); } // tokenizer for XML tags function tokenTag(name, isclose) { return function(stream, state) { stream.eatSpace(); if(isclose && stream.eat(">")) { popStateStack(state); state.tokenize = tokenBase; return ret("tag", "tag"); } // self closing tag without attributes? if(!stream.eat("/")) pushStateStack(state, { type: "tag", name: name, tokenize: tokenBase}); if(!stream.eat(">")) { state.tokenize = tokenAttribute; return ret("tag", "tag"); } else { state.tokenize = tokenBase; } return ret("tag", "tag"); }; } // tokenizer for XML attributes function tokenAttribute(stream, state) { var ch = stream.next(); if(ch == "/" && stream.eat(">")) { if(isInXmlAttributeBlock(state)) popStateStack(state); if(isInXmlBlock(state)) popStateStack(state); return ret("tag", "tag"); } if(ch == ">") { if(isInXmlAttributeBlock(state)) popStateStack(state); return ret("tag", "tag"); } if(ch == "=") return ret("", null); // quoted string if (ch == '"' || ch == "'") return chain(stream, state, tokenString(ch, tokenAttribute)); if(!isInXmlAttributeBlock(state)) pushStateStack(state, { type: "attribute", tokenize: tokenAttribute}); stream.eat(/[a-zA-Z_:]/); stream.eatWhile(/[-a-zA-Z0-9_:.]/); stream.eatSpace(); // the case where the attribute has not value and the tag was closed if(stream.match(">", false) || stream.match("/", false)) { popStateStack(state); state.tokenize = tokenBase; } return ret("attribute", "attribute"); } // handle comments, including nested function tokenXMLComment(stream, state) { var ch; while (ch = stream.next()) { if (ch == "-" && stream.match("->", true)) { state.tokenize = tokenBase; return ret("comment", "comment"); } } } // handle CDATA function tokenCDATA(stream, state) { var ch; while (ch = stream.next()) { if (ch == "]" && stream.match("]", true)) { state.tokenize = tokenBase; return ret("comment", "comment"); } } } // handle preprocessing instructions function tokenPreProcessing(stream, state) { var ch; while (ch = stream.next()) { if (ch == "?" && stream.match(">", true)) { state.tokenize = tokenBase; return ret("comment", "comment meta"); } } } // functions to test the current context of the state function isInXmlBlock(state) { return isIn(state, "tag"); } function isInXmlAttributeBlock(state) { return isIn(state, "attribute"); } function isInXmlConstructor(state) { return isIn(state, "xmlconstructor"); } function isInString(state) { return isIn(state, "string"); } function isEQNameAhead(stream) { // assume we've already eaten a quote (") if(stream.current() === '"') return stream.match(/^[^\"]+\"\:/, false); else if(stream.current() === '\'') return stream.match(/^[^\"]+\'\:/, false); else return false; } function isIn(state, type) { return (state.stack.length && state.stack[state.stack.length - 1].type == type); } function pushStateStack(state, newState) { state.stack.push(newState); } function popStateStack(state) { state.stack.pop(); var reinstateTokenize = state.stack.length && state.stack[state.stack.length-1].tokenize; state.tokenize = reinstateTokenize || tokenBase; } // the interface for the mode API return { startState: function() { return { tokenize: tokenBase, cc: [], stack: [] }; }, token: function(stream, state) { if (stream.eatSpace()) return null; var style = state.tokenize(stream, state); return style; }, blockCommentStart: "(:", blockCommentEnd: ":)" }; }); CodeMirror.defineMIME("application/xquery", "xquery"); }); ================================================ FILE: base/res/codemirror/mode/yaml/index.html ================================================ CodeMirror: YAML mode

    YAML mode

    MIME types defined: text/x-yaml.

    ================================================ FILE: base/res/codemirror/mode/yaml/yaml.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode("yaml", function() { var cons = ['true', 'false', 'on', 'off', 'yes', 'no']; var keywordRegex = new RegExp("\\b(("+cons.join(")|(")+"))$", 'i'); return { token: function(stream, state) { var ch = stream.peek(); var esc = state.escaped; state.escaped = false; /* comments */ if (ch == "#" && (stream.pos == 0 || /\s/.test(stream.string.charAt(stream.pos - 1)))) { stream.skipToEnd(); return "comment"; } if (stream.match(/^('([^']|\\.)*'?|"([^"]|\\.)*"?)/)) return "string"; if (state.literal && stream.indentation() > state.keyCol) { stream.skipToEnd(); return "string"; } else if (state.literal) { state.literal = false; } if (stream.sol()) { state.keyCol = 0; state.pair = false; state.pairStart = false; /* document start */ if(stream.match(/---/)) { return "def"; } /* document end */ if (stream.match(/\.\.\./)) { return "def"; } /* array list item */ if (stream.match(/\s*-\s+/)) { return 'meta'; } } /* inline pairs/lists */ if (stream.match(/^(\{|\}|\[|\])/)) { if (ch == '{') state.inlinePairs++; else if (ch == '}') state.inlinePairs--; else if (ch == '[') state.inlineList++; else state.inlineList--; return 'meta'; } /* list seperator */ if (state.inlineList > 0 && !esc && ch == ',') { stream.next(); return 'meta'; } /* pairs seperator */ if (state.inlinePairs > 0 && !esc && ch == ',') { state.keyCol = 0; state.pair = false; state.pairStart = false; stream.next(); return 'meta'; } /* start of value of a pair */ if (state.pairStart) { /* block literals */ if (stream.match(/^\s*(\||\>)\s*/)) { state.literal = true; return 'meta'; }; /* references */ if (stream.match(/^\s*(\&|\*)[a-z0-9\._-]+\b/i)) { return 'variable-2'; } /* numbers */ if (state.inlinePairs == 0 && stream.match(/^\s*-?[0-9\.\,]+\s?$/)) { return 'number'; } if (state.inlinePairs > 0 && stream.match(/^\s*-?[0-9\.\,]+\s?(?=(,|}))/)) { return 'number'; } /* keywords */ if (stream.match(keywordRegex)) { return 'keyword'; } } /* pairs (associative arrays) -> key */ if (!state.pair && stream.match(/^\s*(?:[,\[\]{}&*!|>'"%@`][^\s'":]|[^,\[\]{}#&*!|>'"%@`])[^#]*?(?=\s*:($|\s))/)) { state.pair = true; state.keyCol = stream.indentation(); return "atom"; } if (state.pair && stream.match(/^:\s*/)) { state.pairStart = true; return 'meta'; } /* nothing found, continue */ state.pairStart = false; state.escaped = (ch == '\\'); stream.next(); return null; }, startState: function() { return { pair: false, pairStart: false, keyCol: 0, inlinePairs: 0, inlineList: 0, literal: false, escaped: false }; } }; }); CodeMirror.defineMIME("text/x-yaml", "yaml"); }); ================================================ FILE: base/res/codemirror/mode/z80/index.html ================================================ CodeMirror: Z80 assembly mode

    Z80 assembly mode

    MIME types defined: text/x-z80, text/x-ez80.

    ================================================ FILE: base/res/codemirror/mode/z80/z80.js ================================================ // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: http://codemirror.net/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { "use strict"; CodeMirror.defineMode('z80', function(_config, parserConfig) { var ez80 = parserConfig.ez80; var keywords1, keywords2; if (ez80) { keywords1 = /^(exx?|(ld|cp)([di]r?)?|[lp]ea|pop|push|ad[cd]|cpl|daa|dec|inc|neg|sbc|sub|and|bit|[cs]cf|x?or|res|set|r[lr]c?a?|r[lr]d|s[lr]a|srl|djnz|nop|[de]i|halt|im|in([di]mr?|ir?|irx|2r?)|ot(dmr?|[id]rx|imr?)|out(0?|[di]r?|[di]2r?)|tst(io)?|slp)(\.([sl]?i)?[sl])?\b/i; keywords2 = /^(((call|j[pr]|rst|ret[in]?)(\.([sl]?i)?[sl])?)|(rs|st)mix)\b/i; } else { keywords1 = /^(exx?|(ld|cp|in)([di]r?)?|pop|push|ad[cd]|cpl|daa|dec|inc|neg|sbc|sub|and|bit|[cs]cf|x?or|res|set|r[lr]c?a?|r[lr]d|s[lr]a|srl|djnz|nop|rst|[de]i|halt|im|ot[di]r|out[di]?)\b/i; keywords2 = /^(call|j[pr]|ret[in]?|b_?(call|jump))\b/i; } var variables1 = /^(af?|bc?|c|de?|e|hl?|l|i[xy]?|r|sp)\b/i; var variables2 = /^(n?[zc]|p[oe]?|m)\b/i; var errors = /^([hl][xy]|i[xy][hl]|slia|sll)\b/i; var numbers = /^([\da-f]+h|[0-7]+o|[01]+b|\d+d?)\b/i; return { startState: function() { return { context: 0 }; }, token: function(stream, state) { if (!stream.column()) state.context = 0; if (stream.eatSpace()) return null; var w; if (stream.eatWhile(/\w/)) { if (ez80 && stream.eat('.')) { stream.eatWhile(/\w/); } w = stream.current(); if (stream.indentation()) { if ((state.context == 1 || state.context == 4) && variables1.test(w)) { state.context = 4; return 'var2'; } if (state.context == 2 && variables2.test(w)) { state.context = 4; return 'var3'; } if (keywords1.test(w)) { state.context = 1; return 'keyword'; } else if (keywords2.test(w)) { state.context = 2; return 'keyword'; } else if (state.context == 4 && numbers.test(w)) { return 'number'; } if (errors.test(w)) return 'error'; } else if (stream.match(numbers)) { return 'number'; } else { return null; } } else if (stream.eat(';')) { stream.skipToEnd(); return 'comment'; } else if (stream.eat('"')) { while (w = stream.next()) { if (w == '"') break; if (w == '\\') stream.next(); } return 'string'; } else if (stream.eat('\'')) { if (stream.match(/\\?.'/)) return 'number'; } else if (stream.eat('.') || stream.sol() && stream.eat('#')) { state.context = 5; if (stream.eatWhile(/\w/)) return 'def'; } else if (stream.eat('$')) { if (stream.eatWhile(/[\da-f]/i)) return 'number'; } else if (stream.eat('%')) { if (stream.eatWhile(/[01]/)) return 'number'; } else { stream.next(); } return null; } }; }); CodeMirror.defineMIME("text/x-z80", "z80"); CodeMirror.defineMIME("text/x-ez80", { name: "z80", ez80: true }); }); ================================================ FILE: base/res/codemirror/theme/3024-day.css ================================================ /* Name: 3024 day Author: Jan T. Sott (http://github.com/idleberg) CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ .cm-s-3024-day.CodeMirror {background: #f7f7f7; color: #3a3432;} .cm-s-3024-day div.CodeMirror-selected {background: #d6d5d4 !important;} .cm-s-3024-day.CodeMirror ::selection { background: #d6d5d4; } .cm-s-3024-day.CodeMirror ::-moz-selection { background: #d9d9d9; } .cm-s-3024-day .CodeMirror-gutters {background: #f7f7f7; border-right: 0px;} .cm-s-3024-day .CodeMirror-guttermarker { color: #db2d20; } .cm-s-3024-day .CodeMirror-guttermarker-subtle { color: #807d7c; } .cm-s-3024-day .CodeMirror-linenumber {color: #807d7c;} .cm-s-3024-day .CodeMirror-cursor {border-left: 1px solid #5c5855 !important;} .cm-s-3024-day span.cm-comment {color: #cdab53;} .cm-s-3024-day span.cm-atom {color: #a16a94;} .cm-s-3024-day span.cm-number {color: #a16a94;} .cm-s-3024-day span.cm-property, .cm-s-3024-day span.cm-attribute {color: #01a252;} .cm-s-3024-day span.cm-keyword {color: #db2d20;} .cm-s-3024-day span.cm-string {color: #fded02;} .cm-s-3024-day span.cm-variable {color: #01a252;} .cm-s-3024-day span.cm-variable-2 {color: #01a0e4;} .cm-s-3024-day span.cm-def {color: #e8bbd0;} .cm-s-3024-day span.cm-bracket {color: #3a3432;} .cm-s-3024-day span.cm-tag {color: #db2d20;} .cm-s-3024-day span.cm-link {color: #a16a94;} .cm-s-3024-day span.cm-error {background: #db2d20; color: #5c5855;} .cm-s-3024-day .CodeMirror-activeline-background {background: #e8f2ff !important;} .cm-s-3024-day .CodeMirror-matchingbracket { text-decoration: underline; color: #a16a94 !important;} ================================================ FILE: base/res/codemirror/theme/3024-night.css ================================================ /* Name: 3024 night Author: Jan T. Sott (http://github.com/idleberg) CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ .cm-s-3024-night.CodeMirror {background: #090300; color: #d6d5d4;} .cm-s-3024-night div.CodeMirror-selected {background: #3a3432 !important;} .cm-s-3024-night.CodeMirror ::selection { background: rgba(58, 52, 50, .99); } .cm-s-3024-night.CodeMirror ::-moz-selection { background: rgba(58, 52, 50, .99); } .cm-s-3024-night .CodeMirror-gutters {background: #090300; border-right: 0px;} .cm-s-3024-night .CodeMirror-guttermarker { color: #db2d20; } .cm-s-3024-night .CodeMirror-guttermarker-subtle { color: #5c5855; } .cm-s-3024-night .CodeMirror-linenumber {color: #5c5855;} .cm-s-3024-night .CodeMirror-cursor {border-left: 1px solid #807d7c !important;} .cm-s-3024-night span.cm-comment {color: #cdab53;} .cm-s-3024-night span.cm-atom {color: #a16a94;} .cm-s-3024-night span.cm-number {color: #a16a94;} .cm-s-3024-night span.cm-property, .cm-s-3024-night span.cm-attribute {color: #01a252;} .cm-s-3024-night span.cm-keyword {color: #db2d20;} .cm-s-3024-night span.cm-string {color: #fded02;} .cm-s-3024-night span.cm-variable {color: #01a252;} .cm-s-3024-night span.cm-variable-2 {color: #01a0e4;} .cm-s-3024-night span.cm-def {color: #e8bbd0;} .cm-s-3024-night span.cm-bracket {color: #d6d5d4;} .cm-s-3024-night span.cm-tag {color: #db2d20;} .cm-s-3024-night span.cm-link {color: #a16a94;} .cm-s-3024-night span.cm-error {background: #db2d20; color: #807d7c;} .cm-s-3024-night .CodeMirror-activeline-background {background: #2F2F2F !important;} .cm-s-3024-night .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} ================================================ FILE: base/res/codemirror/theme/ambiance-mobile.css ================================================ .cm-s-ambiance.CodeMirror { -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; } ================================================ FILE: base/res/codemirror/theme/ambiance.css ================================================ /* ambiance theme for codemirror */ /* Color scheme */ .cm-s-ambiance .cm-keyword { color: #cda869; } .cm-s-ambiance .cm-atom { color: #CF7EA9; } .cm-s-ambiance .cm-number { color: #78CF8A; } .cm-s-ambiance .cm-def { color: #aac6e3; } .cm-s-ambiance .cm-variable { color: #ffb795; } .cm-s-ambiance .cm-variable-2 { color: #eed1b3; } .cm-s-ambiance .cm-variable-3 { color: #faded3; } .cm-s-ambiance .cm-property { color: #eed1b3; } .cm-s-ambiance .cm-operator {color: #fa8d6a;} .cm-s-ambiance .cm-comment { color: #555; font-style:italic; } .cm-s-ambiance .cm-string { color: #8f9d6a; } .cm-s-ambiance .cm-string-2 { color: #9d937c; } .cm-s-ambiance .cm-meta { color: #D2A8A1; } .cm-s-ambiance .cm-qualifier { color: yellow; } .cm-s-ambiance .cm-builtin { color: #9999cc; } .cm-s-ambiance .cm-bracket { color: #24C2C7; } .cm-s-ambiance .cm-tag { color: #fee4ff } .cm-s-ambiance .cm-attribute { color: #9B859D; } .cm-s-ambiance .cm-header {color: blue;} .cm-s-ambiance .cm-quote { color: #24C2C7; } .cm-s-ambiance .cm-hr { color: pink; } .cm-s-ambiance .cm-link { color: #F4C20B; } .cm-s-ambiance .cm-special { color: #FF9D00; } .cm-s-ambiance .cm-error { color: #AF2018; } .cm-s-ambiance .CodeMirror-matchingbracket { color: #0f0; } .cm-s-ambiance .CodeMirror-nonmatchingbracket { color: #f22; } .cm-s-ambiance .CodeMirror-selected { background: rgba(255, 255, 255, 0.15); } .cm-s-ambiance.CodeMirror-focused .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); } .cm-s-ambiance.CodeMirror ::selection { background: rgba(255, 255, 255, 0.10); } .cm-s-ambiance.CodeMirror ::-moz-selection { background: rgba(255, 255, 255, 0.10); } /* Editor styling */ .cm-s-ambiance.CodeMirror { line-height: 1.40em; color: #E6E1DC; background-color: #202020; -webkit-box-shadow: inset 0 0 10px black; -moz-box-shadow: inset 0 0 10px black; box-shadow: inset 0 0 10px black; } .cm-s-ambiance .CodeMirror-gutters { background: #3D3D3D; border-right: 1px solid #4D4D4D; box-shadow: 0 10px 20px black; } .cm-s-ambiance .CodeMirror-linenumber { text-shadow: 0px 1px 1px #4d4d4d; color: #111; padding: 0 5px; } .cm-s-ambiance .CodeMirror-guttermarker { color: #aaa; } .cm-s-ambiance .CodeMirror-guttermarker-subtle { color: #111; } .cm-s-ambiance .CodeMirror-lines .CodeMirror-cursor { border-left: 1px solid #7991E8; } .cm-s-ambiance .CodeMirror-activeline-background { background: none repeat scroll 0% 0% rgba(255, 255, 255, 0.031); } .cm-s-ambiance.CodeMirror, .cm-s-ambiance .CodeMirror-gutters { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAQAAAAHUWYVAABFFUlEQVQYGbzBCeDVU/74/6fj9HIcx/FRHx9JCFmzMyGRURhLZIkUsoeRfUjS2FNDtr6WkMhO9sm+S8maJfu+Jcsg+/o/c+Z4z/t97/vezy3z+z8ekGlnYICG/o7gdk+wmSHZ1z4pJItqapjoKXWahm8NmV6eOTbWUOp6/6a/XIg6GQqmenJ2lDHyvCFZ2cBDbmtHA043VFhHwXxClWmeYAdLhV00Bd85go8VmaFCkbVkzlQENzfBDZ5gtN7HwF0KDrTwJ0dypSOzpaKCMwQHKTIreYIxlmhXTzTWkVm+LTynZhiSBT3RZQ7aGfjGEd3qyXQ1FDymqbKxpspERQN2MiRjNZlFFQXfCNFm9nM1zpAsoYjmtRTc5ajwuaXc5xrWskT97RaKzAGe5ARHhVUsDbjKklziiX5WROcJwSNCNI+9w1Jwv4Zb2r7lCMZ4oq5C0EdTx+2GzNuKpJ+iFf38JEWkHJn9DNF7mmBDITrWEg0VWL3pHU20tSZnuqWu+R3BtYa8XxV1HO7GyD32UkOpL/yDloINFTmvtId+nmAjxRw40VMwVKiwrKLE4bK5UOVntYwhOcSSXKrJHKPJedocpGjVz/ZMIbnYUPB10/eKCrs5apqpgVmWzBYWpmtKHecJPjaUuEgRDDaU0oZghCJ6zNMQ5ZhDYx05r5v2muQdM0EILtXUsaKiQX9WMEUotagQzFbUNN6NUPC2nm5pxEWGCjMc3GdJHjSU2kORLK/JGSrkfGEIjncU/CYUnOipoYemwj8tST9NsJmB7TUVXtbUtXATJVZXBMvYeTXJfobgJUPmGMP/yFaWonaa6BcFO3nqcIqCozSZoZoSr1g4zJOzuyGnxTEX3lUEJ7WcZgme8ddaWvWJo2AJR9DZU3CUIbhCSG6ybSwN6qtJVnCU2svDTP2ZInOw2cBTrqtQahtNZn9NcJ4l2NaSmSkkP1noZWnVwkLmdUPOwLZEwy2Z3S3R+4rIG9hcbpPXHFVWcQdZkn2FOta3cKWQnNRC5g1LsJah4GCzSVsKnCOY5OAFRTBekyyryeyilhFKva75r4Mc0aWanGEaThcy31s439KKxTzJYY5WTHPU1FtIHjQU3Oip4xlNzj/lBw23dYZVliQa7WAXf4shetcQfatI+jWRDBPmyNeW6A1P5kdDgyYJlba0BIM8BZu1JfrFwItyjcAMR3K0BWOIrtMEXyhyrlVEx3ui5dUBjmB/Q3CXW85R4mBD0s7B+4q5tKUjOlb9qqmhi5AZ6GFIC5HXtOobdYGlVdMVbNJ8toNTFcHxnoL+muBagcctjWnbNMuR00uI7nQESwg5q2qqrKWIfrNUmeQocY6HuyxJV02wj36w00yhpmUFenv4p6fUkZYqLyuinx2RGOjhCXYyJF84oiU00YMOOhhquNdfbOB7gU88pY4xJO8LVdp6/q2voeB4R04vIdhSE40xZObx1HGGJ/ja0LBthFInKaLPPFzuCaYaoj8JjPME8yoyxo6zlBqkiUZYgq00OYMswbWO5NGmq+xhipxHLRW29ARjNKXO0wRnear8XSg4XFPLKEPUS1GqvyLwiuBUoa7zpZ0l5xxFwWmWZC1H5h5FwU8eQ7K+g8UcVY6TMQreVQT/8uQ8Z+ALIXnSEa2pYZQneE9RZbSBNYXfWYJzW/h/4j4Dp1tYVcFIC5019Vyi4ThPqSFCzjGWaHQTBU8q6vrVwgxP9Lkm840imWKpcLCjYTtrKuwvsKSnrvHCXGkSMk9p6lhckfRpIeis+N2PiszT+mFLspyGleUhDwcLrZqmyeylxwjBcKHEapqkmyangyLZRVOijwOtCY5SsG5zL0OwlCJ4y5KznF3EUNDDrinwiyLZRzOXtlBbK5ITHFGLp8Q0R6ab6mS7enI2cFrxOyHvOCFaT1HThS1krjCwqWeurCkk+willhCC+RSZnRXBiZaC5RXRIZYKp2lyfrHwiKPKR0JDzrdU2EFgpidawlFDR6FgXUMNa+g1FY3bUQh2cLCwosRdnuQTS/S+JVrGLeWIvtQUvONJxlqSQYYKpwoN2kaocLjdVsis4Mk80ESF2YpSkzwldjHkjFCUutI/r+EHDU8oCs6yzL3PhWiEooZdFMkymlas4AcI3KmoMMNSQ3tHzjGWCrcJJdYyZC7QFGwjRL9p+MrRkAGWzIaWCn9W0F3TsK01c2ZvQw0byvxuQU0r1lM0qJO7wW0kRIMdDTtXEdzi4VIh+EoIHm0mWtAtpCixlabgn83fKTI7anJe9ST7WIK1DMGpQmYeA58ImV6ezOGOzK2Kgq01pd60cKWiUi9Lievb/0vIDPHQ05Kzt4ddPckQBQtoaurjyHnek/nKzpQLrVgKPjIkh2v4uyezpv+Xoo7fPFXaGFp1vaLKxQ4uUpQQS5VuQs7BCq4xRJv7fwpVvvFEB3j+620haOuocqMhWd6TTPAEx+mdFNGHdranFe95WrWmIvlY4F1Dle2ECgc6cto7SryuqGGGha0tFQ5V53migUKmg6XKAo4qS3mik+0OZpAhOLeZKicacgaYcyx5hypYQE02ZA4xi/pNhOQxR4klNKyqacj+mpxnLTnnGSo85++3ZCZq6lrZkXlGEX3o+C9FieccJbZWVFjC0Yo1FZnJhoYMFoI1hEZ9r6hwg75HwzBNhbZCdJEfJwTPGzJvaKImw1yYX1HDAmpXR+ZJQ/SmgqMNVQb5vgamGwLtt7VwvP7Qk1xpiM5x5Cyv93E06MZmgs0Nya2azIKOYKCGBQQW97RmhKNKF02JZqHEJ4o58qp7X5EcZmc56trXEqzjCBZ1MFGR87Ql2tSTs6CGxS05PTzRQorkbw7aKoKXFDXsYW42VJih/q+FP2BdTzDTwVqOYB13liM50vG7wy28qagyuIXMeQI/Oqq8bcn5wJI50xH00CRntyfpL1T4hydYpoXgNiFzoIUTDZnLNRzh4TBHwbYGDvZkxmlyJloyr6tRihpeUG94GnKtIznREF0tzJG/OOr73JBcrSh1k6WuTprgLU+mnSGnv6Zge0NNz+kTDdH8nuAuTdJDCNb21LCiIuqlYbqGzT3RAoZofQfjFazkqeNWdYaGvYTM001EW2oKPvVk1ldUGSgUtHFwjKM1h9jnFcmy5lChoLNaQMGGDsYbKixlaMBmmsx1QjCfflwTfO/gckW0ruZ3jugKR3R5W9hGUWqCgxuFgsuaCHorotGKzGaeZB9DMsaTnKCpMtwTvOzhYk0rdrArKCqcaWmVk1+F372ur1YkKxgatI8Qfe1gIX9wE9FgS8ESmuABIXnRUbCapcKe+nO7slClSZFzpV/LkLncEb1qiO42fS3R855Su2mCLh62t1SYZZYVmKwIHjREF2uihTzB20JOkz7dkxzYQnK0UOU494wh+VWRc6Un2kpTaVgLDFEkJ/uhzRcI0YKGgpGWOlocBU/a4fKoJ/pEaNV6jip3+Es9VXY078rGnmAdf7t9ylPXS34RBSuYPs1UecZTU78WanhBCHpZ5sAoTz0LGZKjPf9TRypqWEiTvOFglL1fCEY3wY/++rbk7C8bWebA6p6om6PgOL2kp44TFJlVNBXae2rqqdZztOJpT87GQsE9jqCPIe9VReZuQ/CIgacsyZdCpIScSYqcZk8r+nsyCzhyfhOqHGOIvrLknC8wTpFcaYiGC/RU1NRbUeUpocQOnkRpGOrIOcNRx+1uA0UrzhSSt+VyS3SJpnFWkzNDqOFGIWcfR86DnmARTQ1HKIL33ExPiemeOhYSSjzlSUZZuE4TveoJLnBUOFof6KiysCbnAEcZgcUNTDOwkqWu3RWtmGpZwlHhJENdZ3miGz0lJlsKnjbwqSHQjpxnFDlTLLwqJPMZMjd7KrzkSG7VsxXBZE+F8YZkb01Oe00yyRK9psh5SYh29ySPKBo2ylNht7ZkZnsKenjKNJu9PNEyZpaCHv4Kt6RQsLvAVp7M9kIimmCUwGeWqLMmGuIotYMmWNpSahkhZw9FqZsVnKJhsjAHvtHMsTM9fCI06Dx/u3vfUXCqfsKRc4oFY2jMsoo/7DJDwZ1CsIKnJu+J9ldkpmiCxQx1rWjI+T9FwcWWzOuaYH0Hj7klNRVWEQpmaqosakiGNTFHdjS/qnUdmf0NJW5xsL0HhimCCZZSRzmSPTXJQ4aaztAwtZnoabebJ+htCaZ7Cm535ByoqXKbX1WRc4Eh2MkRXWzImVc96Cj4VdOKVxR84VdQsIUM8Psoou2byVHyZFuq7O8otbSQ2UAoeEWTudATLGSpZzVLlXVkPU2Jc+27lsw2jmg5T5VhbeE3BT083K9WsTTkFU/Osi0rC5lRlpwRHUiesNS0sOvmqGML1aRbPAxTJD9ZKtxuob+hhl8cwYGWpJ8nub7t5p6coYbMovZ1BTdaKn1jYD6h4GFDNFyT/Kqe1XCXphXHOKLZmuRSRdBPEfVUXQzJm5YGPGGJdvAEr7hHNdGZnuBvrpciGmopOLf5N0uVMy0FfYToJk90uUCbJupaVpO53UJXR2bVpoU00V2KOo4zMFrBd0Jtz2pa0clT5Q5L8IpQ177mWQejPMEJhuQjS10ref6HHjdEhy1P1EYR7GtO0uSsKJQYLiTnG1rVScj5lyazpqWGl5uBbRWl7m6ixGOOnEsMJR7z8J0n6KMnCdxhiNYQCoZ6CmYLnO8omC3MkW3bktlPmEt/VQQHejL3+dOE5FlPdK/Mq8hZxxJtLyRrepLThYKbLZxkSb5W52vYxNOaOxUF0yxMUPwBTYqCzy01XayYK0sJyWBLqX0MwU5CzoymRzV0EjjeUeLgDpTo6ij42ZAzvD01dHUUTPLU96MdLbBME8nFBn7zJCMtJcZokn8YoqU0FS5WFKyniHobguMcmW8N0XkWZjkyN3hqOMtS08r+/xTBwpZSZ3qiVRX8SzMHHjfUNFjgHEPmY9PL3ykEzxkSre/1ZD6z/NuznuB0RcE1TWTm9zRgfUWVJiG6yrzgmWPXC8EAR4Wxhlad0ZbgQyEz3pG5RVEwwDJH2mgKpjcTiCOzn1lfUWANFbZ2BA8balnEweJC9J0iuaeZoI+ippFCztEKVvckR2iice1JvhVytrQwUAZpgsubCPaU7xUe9vWnaOpaSBEspalykhC9bUlOMpT42ZHca6hyrqKmw/wMR8H5ZmdFoBVJb03O4UL0tSNnvIeRmkrLWqrs78gcrEn2tpcboh0UPOW3UUR9PMk4T4nnNKWmCjlrefhCwxRNztfmIQVdDElvS4m1/WuOujoZCs5XVOjtKPGokJzsYCtFYoWonSPT21DheU/wWhM19FcElwqNGOsp9Q8N/cwXaiND1MmeL1Q5XROtYYgGeFq1aTMsoMmcrKjQrOFQTQ1fmBYhmW6o8Jkjc7iDJRTBIo5kgJD5yMEYA3srCg7VFKwiVJkmRCc5ohGOKhsYMn/XBLdo5taZjlb9YAlGWRimqbCsoY7HFAXLa5I1HPRxMMsQDHFkWtRNniqT9UEeNjcE7RUlrCJ4R2CSJuqlKHWvJXjAUNcITYkenuBRB84TbeepcqTj3zZyFJzgYQdHnqfgI0ddUwS6GqWpsKWhjq9cV0vBAEMN2znq+EBfIWT+pClYw5xsTlJU6GeIBsjGmmANTzJZiIYpgrM0Oa8ZMjd7NP87jxhqGOhJlnQtjuQpB+8aEE00wZFznSJPyHxgH3HkPOsJFvYk8zqCHzTs1BYOa4J3PFU+UVRZxlHDM4YavlNUuMoRveiZA2d7grMNc2g+RbSCEKzmgYsUmWmazFJyoiOZ4KnyhKOGRzWJa0+moyV4TVHDzn51Awtqaphfk/lRQ08FX1iiqxTB/kLwd0VynKfEvI6cd4XMV5bMhZ7gZUWVzYQ6Nm2BYzxJbw3bGthEUUMfgbGeorae6DxHtJoZ6alhZ0+ytiVoK1R4z5PTrOECT/SugseEOlb1MMNR4VRNcJy+V1Hg9ONClSZFZjdHlc6W6FBLdJja2MC5hhpu0DBYEY1TFGwiFAxRRCsYkiM9JRb0JNMVkW6CZYT/2EiTGWmo8k+h4FhDNE7BvppoTSFnmCV5xZKzvcCdDo7VVPnIU+I+Rc68juApC90MwcFCsJ5hDqxgScYKreruyQwTqrzoqDCmhWi4IbhB0Yrt3RGa6GfDv52rKXWhh28dyZaWUvcZeMTBaZoSGyiCtRU5J8iviioHaErs7Jkj61syVzTTgOcUOQ8buFBTYWdL5g3T4qlpe0+wvD63heAXRfCCIed9RbCsp2CiI7raUOYOTU13N8PNHvpaGvayo4a3LLT1lDrVEPT2zLUlheB1R+ZTRfKWJ+dcocLJfi11vyJ51lLqJ0WD7tRwryezjiV5W28uJO9qykzX8JDe2lHl/9oyBwa2UMfOngpXCixvKdXTk3wrsKmiVYdZIqsoWEERjbcUNDuiaQomGoIbFdEHmsyWnuR+IeriKDVLnlawlyNHKwKlSU631PKep8J4Q+ayjkSLKYLhalNHlYvttb6fHm0p6OApsZ4l2VfdqZkjuysy6ysKLlckf1KUutCTs39bmCgEyyoasIWlVaMF7mgmWtBT8Kol5xpH9IGllo8cJdopcvZ2sImlDmMIbtDk3KIpeNiS08lQw11NFPTwVFlPP6pJ2gvRfI7gQUfmNAtf6Gs0wQxDsKGlVBdF8rCa3jzdwMaGHOsItrZk7hAyOzpK9VS06j5F49b0VNGOOfKs3lDToMsMBe9ZWtHFEgxTJLs7qrygKZjUnmCYoeAqeU6jqWuLJup4WghOdvCYJnrSkSzoyRkm5M2StQwVltPkfCAk58tET/CSg+8MUecmotMEnhBKfWBIZsg2ihruMJQaoIm+tkTLKEqspMh00w95gvFCQRtDwTT1gVDDSEVdlwqZfxoQRbK0g+tbiBZxzKlpnpypejdDwTaeOvorMk/IJE10h9CqRe28hhLbe0pMsdSwv4ZbhKivo2BjDWfL8UKJgeavwlwb5KlwhyE4u4XkGE2ytZCznKLCDZZq42VzT8HLCrpruFbIfOIINmh/qCdZ1ZBc65kLHR1Bkyf5zn6pN3SvGKIlFNGplhrO9QSXanLOMQTLCa0YJCRrCZm/CZmrLTm7WzCK4GJDiWUdFeYx1LCFg3NMd0XmCuF3Y5rITLDUsYS9zoHVzwnJoYpSTQoObyEzr4cFBNqYTopoaU/wkyLZ2lPhX/5Y95ulxGTV7KjhWrOZgl8MyUUafjYraNjNU1N3IWcjT5WzWqjwtoarHSUObGYO3GCJZpsBlnJGPd6ZYLyl1GdCA2625IwwJDP8GUKymbzuyPlZlvTUsaUh5zFDhRWFzPKKZLAlWdcQbObgF9tOqOsmB1dqcqYJmWstFbZRRI9poolmqiLnU0POvxScpah2iSL5UJNzgScY5+AuIbpO0YD3NCW+dLMszFSdFCWGqG6eVq2uYVNDdICGD6W7EPRWZEY5gpsE9rUkS3mijzzJnm6UpUFXG1hCUeVoS5WfNcFpblELL2qqrCvMvRfd45oalvKU2tiQ6ePJOVMRXase9iTtLJztPxJKLWpo2CRDcJwn2sWSLKIO1WQWNTCvpVUvOZhgSC40JD0dOctaSqzkCRbXsKlb11Oip6PCJ0IwSJM31j3akRxlP7Rwn6aGaUL0qiLnJkvB3xWZ2+Q1TfCwpQH3G0o92UzmX4o/oJNQMMSQc547wVHhdk+VCw01DFYEnTxzZKAm74QmeNNR1w6WzEhNK15VJzuCdxQ53dRUDws5KvwgBMOEgpcVNe0hZI6RXT1Jd0cyj5nsaEAHgVmGaJIlWdsc5Ui2ElrRR6jrRAttNMEAIWrTDFubkZaok7/AkzfIwfuWVq0jHzuCK4QabtLUMVPB3kJ0oyHTSVFlqMALilJf2Rf8k5aaHtMfayocLBS8L89oKoxpJvnAkDPa0qp5DAUTHKWmCcnthlou8iCKaFFLHWcINd1nyIwXqrSxMNmSs6KmoL2QrKuWtlQ5V0120xQ5vRyZS1rgFkWwhiOwiuQbR0OOVhQM9iS3tiXp4RawRPMp5tDletOOBL95MpM01dZTBM9pkn5qF010rIeHFcFZhmSGpYpTsI6nwhqe5C9ynhlpp5ophuRb6WcJFldkVnVEwwxVfrVkvnWUuNLCg5bgboFHPDlDPDmnK7hUrWiIbjadDclujlZcaokOFup4Ri1kacV6jmrrK1hN9bGwpKEBQ4Q6DvIUXOmo6U5LqQM6EPyiKNjVkPnJkDPNEaxhiFay5ExW1NXVUGqcpYYdPcGiCq7z/TSlbhL4pplWXKd7NZO5QQFrefhRQW/NHOsqcIglc4UhWklR8K0QzbAw08CBDnpbgqXdeD/QUsM4RZXDFBW6WJKe/mFPdH0LtBgiq57wFLzlyQzz82qYx5D5WJP5yVJDW01BfyHnS6HKO/reZqId1WGa4Hkh2kWodJ8i6KoIPlAj2hPt76CzXsVR6koPRzWTfKqIentatYpQw2me4AA3y1Kind3SwoOKZDcFXTwl9tWU6mfgRk9d71sKtlNwrjnYw5tC5n5LdKiGry3JKNlHEd3oaMCFHrazBPMp/uNJ+V7IudcSbeOIdjUEdwl0VHCOZo5t6YluEuaC9mQeMgSfOyKnYGFHcIeQ84yQWbuJYJpZw5CzglDH7gKnWqqM9ZTaXcN0TeYhR84eQtJT76JJ1lREe7WnnvsMmRc9FQ7SBBM9mV3lCUdmHk/S2RAMt0QjFNFqQpWjDPQ01DXWUdDBkXziKPjGEP3VP+zIWU2t7im41FOloyWzn/L6dkUy3VLDaZ6appgDLHPjJEsyvJngWEPUyVBiAaHCTEXwrLvSEbV1e1gKJniicWorC1MUrVjB3uDhJE/wgSOzk1DXpk0k73qCM8xw2UvD5kJmDUfOomqMpWCkJRlvKXGmoeBm18USjVIk04SClxTB6YrgLAPLWYK9HLUt5cmc0vYES8GnTeRc6skZbQkWdxRsIcyBRzx1DbTk9FbU0caTPOgJHhJKnOGIVhQqvKmo0llRw9sabrZkDtdg3PqaKi9oatjY8B+G371paMg6+mZFNNtQ04mWBq3rYLOmtWWQp8KJnpy9DdFensyjdqZ+yY40VJlH8wcdLzC8PZnvHMFUTZUrDTkLyQaGus5X5LzpYAf3i+e/ZlhqGqWhh6Ou6xTR9Z6oi5AZZtp7Mj2EEm8oSpxiYZCHU/1fbGdNNNRRoZMhmilEb2gqHOEJDtXkHK/JnG6IrvbPCwV3NhONVdS1thBMs1T4QOBcTWa2IzhMk2nW5Kyn9tXUtpv9RsG2msxk+ZsQzRQacJncpgke0+T8y5Fzj8BiGo7XlJjaTIlpQs7KFjpqGnKuoyEPeIKnFMkZHvopgh81ySxNFWvJWcKRs70j2FOT012IllEEO1n4pD1513Yg2ssQPOThOkvyrqHUdEXOSEsihmBbTbKX1kLBPWqWkLOqJbjB3GBIZmoa8qWl4CG/iZ7oiA72ZL7TJNeZUY7kFQftDcHHluBzRbCegzMtrRjVQpX2lgoPKKLJAkcbMl01XK2p7yhL8pCBbQ3BN2avJgKvttcrWDK3CiUOVxQ8ZP+pqXKyIxnmBymCg5vJjNfkPK4+c8cIfK8ocVt7kmfd/I5SR1hKvCzUtb+lhgc00ZaO6CyhIQP1Uv4yIZjload72PXX0OIJvnFU+0Zf6MhsJwTfW0r0UwQfW4LNLZl5HK261JCZ4qnBaAreVAS3WrjV0LBnNDUNNDToCEeFfwgcb4gOEqLRhirWkexrCEYKVV711DLYEE1XBEsp5tpTGjorkomKYF9FDXv7fR3BGwbettSxnyL53MBPjsxDZjMh+VUW9NRxq1DhVk+FSxQcaGjV9Pawv6eGByw5qzoy7xk4RsOShqjJwWKe/1pEEfzkobeD/dQJmpqedcyBTy2sr4nGNRH0c0SPWTLrqAc0OQcb/gemKgqucQT7ySWKCn2EUotoCvpZct7RO2sy/QW0IWcXd7pQRQyZVwT2USRO87uhjioTLKV2brpMUcMQRbKH/N2T+UlTpaMls6cmc6CCNy3JdYYSUzzJQ4oSD3oKLncULOiJvjBEC2oqnCJkJluCYy2ZQ5so9YYlZ1VLlQU1mXEW1jZERwj/MUSRc24TdexlqLKfQBtDTScJUV8FszXBEY5ktpD5Ur9hYB4Nb1iikw3JoYpkKX+RodRKFt53MMuRnKSpY31PwYaGaILh3wxJGz9TkTPEETxoCWZrgvOlmyMzxFEwVJE5xZKzvyJ4WxEc16Gd4Xe3Weq4XH2jKRikqOkGQ87hQnC7wBmGYLAnesX3M+S87eFATauuN+Qcrh7xIxXJbUIdMw3JGE3ylCWzrieaqCn4zhGM19TQ3z1oH1AX+pWEqIc7wNGAkULBo/ZxRaV9NNyh4Br3rCHZzbzmSfawBL0dNRwpW1kK9mxPXR9povcdrGSZK9c2k0xwFGzjuniCtRSZCZ6ccZ7gaktmgAOtKbG/JnOkJrjcQTdFMsxRQ2cLY3WTIrlCw1eWKn8R6pvt4GFDso3QoL4a3nLk3G6JrtME3dSenpx7PNFTmga0EaJTLQ061sEeQoWXhSo9LTXsaSjoJQRXeZLtDclbCrYzfzHHeaKjHCVOUkQHO3JeEepr56mhiyaYYKjjNU+Fed1wS5VlhWSqI/hYUdDOkaxiKehoyOnrCV5yBHtbWFqTHCCwtpDcYolesVR5yUzTZBb3RNMd0d6WP+SvhuBmRcGxnuQzT95IC285cr41cLGQ6aJJhmi4TMGempxeimBRQw1tFKV+8jd6KuzoSTqqDxzRtpZkurvKEHxlqXKRIjjfUNNXQsNOsRScoWFLT+YeRZVD3GRN0MdQcKqQjHDMrdGGVu3iYJpQx3WGUvfbmxwFfR20WBq0oYY7LMFhhgYtr8jpaEnaOzjawWWaTP8mMr0t/EPDPoqcnxTBI5o58L7uoWnMrpoqPwgVrlAUWE+V+TQl9rawoyP6QGAlQw2TPRX+YSkxyBC8Z6jhHkXBgQL7WII3DVFnRfCrBfxewv9D6xsyjys4VkhWb9pUU627JllV0YDNHMku/ldNMMXDEo4aFnAkk4U6frNEU4XgZUPmEKHUl44KrzmYamjAbh0JFvGnaTLPu1s9jPCwjFpYiN7z1DTOk/nc07CfDFzmCf7i+bfNHXhDtLeBXzTBT5rkMvWOIxpl4EMh2LGJBu2syDnAEx2naEhHDWMMzPZEhygyS1mS5RTJr5ZkoKbEUoYqr2kqdDUE8ztK7OaIntJkFrIECwv8LJTaVx5XJE86go8dFeZ3FN3rjabCAYpoYEeC9zzJVULBbmZhDyd7ko09ydpNZ3nm2Kee4FPPXHnYEF1nqOFEC08LUVcDvYXkJHW8gTaKCk9YGOeIJhqiE4ToPEepdp7IWFjdwnWaufGMwJJCMtUTTBBK9BGCOy2tGGrJTHIwyEOzp6aPzNMOtlZkDvcEWpP5SVNhfkvDxhmSazTJXYrM9U1E0xwFVwqZQwzJxw6+kGGGUj2FglGGmnb1/G51udRSMNlTw6GGnCcUwVcOpmsqTHa06o72sw1RL02p9z0VbnMLOaIX3QKaYKSCFQzBKEUNHTSc48k53RH9wxGMtpQa5KjjW0W0n6XCCCG4yxNNdhQ4R4l1Ff+2sSd6UFHiIEOyqqFgT01mEUMD+joy75jPhOA+oVVLm309FR4yVOlp4RhLiScNmSmaYF5Pw0STrOIoWMSR2UkRXOMp+M4SHW8o8Zoi6OZgjKOaFar8zZDzkWzvKOjkKBjmCXby8JahhjXULY4KlzgKLvAwxVGhvyd4zxB1d9T0piazmKLCVZY5sKiD0y2ZSYrkUEPUbIk+dlQ4SJHTR50k1DPaUWIdTZW9NJwnJMOECgd7ou/MnppMJ02O1VT4Wsh85MnZzcFTngpXGKo84qmwgKbCL/orR/SzJ2crA+t6Mp94KvxJUeIbT3CQu1uIdlQEOzlKfS3UMcrTiFmOuroocrZrT2AcmamOKg8YomeEKm/rlT2sociMaybaUlFhuqHCM2qIJ+rg4EcDFymiDSxzaHdPcpE62pD5kyM5SBMoA1PaUtfIthS85ig1VPiPPYXgYEMNk4Qq7TXBgo7oT57gPUdwgCHzhIVFPFU6OYJzHAX9m5oNrVjeE61miDrqQ4VSa1oiURTsKHC0IfjNwU2WzK6eqK8jWln4g15TVBnqmDteCJ501PGAocJhhqjZdtBEB6lnhLreFJKxmlKbeGrqLiSThVIbCdGzloasa6lpMQXHCME2boLpJgT7yWaemu6wBONbqGNVRS0PKIL7LckbjmQtR7K8I5qtqel+T/ChJTNIKLjdUMNIRyvOEko9YYl2cwQveBikCNawJKcLBbc7+JM92mysNvd/Fqp8a0k6CNEe7cnZrxlW0wQXaXjaktnRwNOGZKYiONwS7a1JVheq3WgJHlQUGKHKmp4KAxXR/ULURcNgoa4zhKSLpZR3kxRRb0NmD0OFn+UCS7CzI1nbP6+o4x47QZE5xRCt3ZagnYcvmpYQktXdk5YKXTzBC57kKEe0VVuiSYqapssMS3C9p2CKkHOg8B8Pa8p5atrIw3qezIWanMGa5HRDNF6RM9wcacl0N+Q8Z8hsIkSnaIIdHRUOEebAPy1zbCkhM062FCJtif7PU+UtoVXzWKqM1PxXO8cfdruhFQ/a6x3JKYagvVDhQEtNiyiiSQ7OsuRsZUku0CRNDs4Sog6KKjsZgk2bYJqijgsEenoKeniinRXBn/U3lgpPdyDZynQx8IiioMnCep5Ky8mjGs6Wty0l1hUQTcNWswS3WRp2kCNZwJG8omG8JphPUaFbC8lEfabwP7VtM9yoaNCAjpR41VNhrD9LkbN722v0CoZMByFzhaW+MyzRYEWFDQwN2M4/JiT76PuljT3VU/A36eaIThb+R9oZGOAJ9tewkgGvqOMNRWYjT/Cwu99Q8LqDE4TgbLWxJ1jaDDAERsFOFrobgjUsBScaguXU8kKm2RL19tRypSHnHNlHiIZqgufs4opgQdVdwxBNNFBR6kVFqb8ogimOzB6a6HTzrlDHEpYaxjiiA4TMQobkDg2vejjfwJGWmnbVFAw3H3hq2NyQfG7hz4aC+w3BbwbesG0swYayvpAs6++Ri1Vfzx93mFChvyN5xVHTS+0p9aqCAxyZ6ZacZyw5+7uuQkFPR9DDk9NOiE7X1PCYJVjVUqq7JlrHwWALF5nfHNGjApdpqgzx5OwilDhCiDYTgnc9waGW4BdLNNUQvOtpzDOWHDH8D7TR/A/85KljEQu3NREc4Pl/6B1Hhc8Umb5CsKMmGC9EPcxoT2amwHNCmeOEnOPbklnMkbOgIvO5UMOpQrS9UGVdt6iH/fURjhI/WOpaW9OKLYRod6HCUEdOX000wpDZQ6hwg6LgZfOqo1RfT/CrJzjekXOGhpc1VW71ZLbXyyp+93ILbC1kPtIEYx0FIx1VDrLoVzXRKRYWk809yYlC9ImcrinxtabKnzRJk3lAU1OLEN1j2zrYzr2myHRXJFf4h4QKT1qSTzTB5+ZNTzTRkAxX8FcLV2uS8eoQQ2aAkFzvCM72sJIcJET3WPjRk5wi32uSS9rfZajpWEvj9hW42F4o5NytSXYy8IKHay10VYdrcl4SkqscrXpMwyGOgtkajheSxdQqmpxP1L3t4R5PqasFnrQEjytq6qgp9Y09Qx9o4S1FzhUCn1kyHSzBWLemoSGvOqLNhZyBjmCaAUYpMgt4Ck7wBBMMwWKWgjsUwTaGVsxWC1mYoKiyqqeGKYqonSIRQ3KIkHO0pmAxTdBHkbOvfllfr+AA+7gnc50huVKYK393FOyg7rbPO/izI7hE4CnHHHnJ0ogNPRUGeUpsrZZTBJcrovUcJe51BPsr6GkJdhCCsZ6aTtMEb2pqWkqeVtDXE/QVggsU/Nl86d9RMF3DxvZTA58agu810RWawCiSzzXBeU3MMW9oyJUedvNEvQyNu1f10BSMddR1vaLCYpYa/mGocLSiYDcLbQz8aMn5iyF4xBNMs1P0QEOV7o5gaWGuzSeLue4tt3ro7y4Tgm4G/mopdZgl6q0o6KzJWE3mMksNr3r+a6CbT8g5wZNzT9O7fi/zpaOmnz3BRoqos+tv9zMbdpxsqDBOEewtJLt7cg5wtKKbvldpSzRRCD43VFheCI7yZLppggMVBS/KMAdHODJvOwq2NQSbKKKPLdFWQs7Fqo+mpl01JXYRgq8dnGLhTiFzqmWsUMdpllZdbKlyvSdYxhI9YghOtxR8LgSLWHK62mGGVoxzBE8LNWzqH9CUesQzFy5RQzTc56mhi6fgXEWwpKfE5Z7M05ZgZUPmo6auiv8YKzDYwWBLMErIbKHJvOwIrvEdhOBcQ9JdU1NHQ7CXn2XIDFBKU2WAgcX9UAUzDXWd5alwuyJ41Z9rjKLCL4aCp4WarhPm2rH+SaHUYE001JDZ2ZAzXPjdMpZWvC9wmqIB2lLhQ01D5jO06hghWMndbM7yRJMsoCj1vYbnFQVrW9jak3OlEJ3s/96+p33dEPRV5GxiqaGjIthUU6FFEZyqCa5qJrpBdzSw95IUnOPIrCUUjRZQFrbw5PR0R1qiYx3cb6nrWUMrBmmiBQxVHtTew5ICP/ip6g4hed/Akob/32wvBHsIOX83cI8hGeNeNPCIkPmXe8fPKx84OMSRM1MTdXSwjCZ4S30jVGhvqTRak/OVhgGazHuOCud5onEO1lJr6ecVyaOK6H7zqlBlIaHE0oroCgfvGJIdPcmfLNGLjpz7hZwZQpUbFME0A1cIJa7VNORkgfsMBatbKgwwJM9bSvQXeNOvbIjelg6WWvo5kvbKaJJNHexkKNHL9xRyFlH8Ti2riB5wVPhUk7nGkJnoCe428LR/wRGdYIlmWebCyxou1rCk4g/ShugBDX0V0ZQWkh0dOVsagkM0yV6OoLd5ye+pRlsCr0n+KiQrGuq5yJDzrTAXHtLUMduTDBVKrSm3eHL+6ijxhFDX9Z5gVU/wliHYTMiMFpKLNMEywu80wd3meoFmt6VbRMPenhrOc6DVe4pgXU8DnnHakLOIIrlF4FZPIw6R+zxBP0dyq6OOZ4Q5sLKCcz084ok+VsMMyQhNZmmBgX5xIXOEJTmi7VsGTvMTNdHHhpzdbE8Du2oKxgvBqQKdDDnTFOylCFaxR1syz2iqrOI/FEpNc3C6f11/7+ASS6l2inq2ciTrCCzgyemrCL5SVPjQkdPZUmGy2c9Sw9FtR1sS30RmsKPCS4rkIC/2U0MduwucYolGaPjKEyhzmiPYXagyWbYz8LWBDdzRimAXzxx4z8K9hpzlhLq+NiQ97HuKorMUfK/OVvC2JfiHUPCQI/q7J2gjK+tTDNxkCc4TMssqCs4TGtLVwQihyoAWgj9bosU80XGW6Ac9TJGziaUh5+hnFcHOnlaM1iRn29NaqGENTTTSUHCH2tWTeV0osUhH6psuVLjRUmGWhm6OZEshGeNowABHcJ2Bpy2ZszRcKkRXd2QuKVEeXnbfaEq825FguqfgfE2whlChSRMdron+LATTPQ2Z369t4B9C5gs/ylzv+CMmepIDPclFQl13W0rspPd1JOcbghGOEutqCv5qacURQl3dDKyvyJlqKXGPgcM9FfawJAMVmdcspcYKOZc4GjDYkFlK05olNMHyHn4zFNykyOxt99RkHlfwmiHo60l2EKI+mhreEKp080Tbug08BVPcgoqC5zWt+NLDTZ7oNSF51N1qie7Va3uCCwyZbkINf/NED6jzOsBdZjFN8oqG3wxVunqCSYYKf3EdhJyf9YWGf7tRU2oH3VHgPr1fe5J9hOgHd7xQ0y7qBwXr23aGErP0cm64JVjZwsOGqL+mhNgZmhJLW2oY4UhedsyBgzrCKrq7BmcpNVhR6jBPq64Vgi+kn6XE68pp8J5/+0wRHGOpsKenQn9DZntPzjRLZpDAdD2fnSgkG9tmIXnUwQ6WVighs7Yi2MxQ0N3CqYaCXkJ0oyOztMDJjmSSpcpvlrk0RMMOjmArQ04PRV1DO1FwhCVaUVPpKUM03JK5SxPsIWRu8/CGHi8UHChiqGFDTbSRJWeYUDDcH6vJWUxR4k1FXbMUwV6e4AJFXS8oMqsZKqzvYQ9DDQdZckY4aGsIhtlubbd2r3j4QBMoTamdPZk7O/Bf62lacZwneNjQoGcdVU7zJOd7ghsUHOkosagic6cnWc8+4gg285R6zZP5s1/LUbCKIznTwK36PkdwlOrl4U1LwfdCCa+IrvFkmgw1PCAUXKWo0sURXWcI2muKJlgyFzhynCY4RBOsqCjoI1R5zREco0n2Vt09BQtYSizgKNHfUmUrQ5UOCh51BFcLmY7umhYqXKQomOop8bUnWNNQcIiBcYaC6xzMNOS8JQQfeqKBmmglB+97ok/lfk3ygaHSyZaCRTzRxQo6GzLfa2jWBPepw+UmT7SQEJyiyRkhBLMVOfcoMjcK0eZChfUNzFAUzCsEN5vP/X1uP/n/aoMX+K+nw/Hjr/9xOo7j7Pju61tLcgvJpTWXNbfN5jLpi6VfCOviTktKlFusQixdEKWmEBUKNaIpjZRSSOXSgzaaKLdabrm1/9nZ+/f+vd/vz/v9+Xy+zZ7PRorYoZqyLrCwQdEAixxVOEXNNnjX2nUSRlkqGmWowk8lxR50JPy9Bo6qJXaXwNvREBvnThPEPrewryLhcAnj5WE15Fqi8W7R1sAuEu86S4ENikItFN4xkv9Af4nXSnUVcLiA9xzesFpivRRVeFKtsMRaKBhuSbjOELnAUtlSQUpXgdfB4Z1oSbnFEetbQ0IrAe+Y+pqnDcEJFj6S8LDZzZHwY4e3XONNlARraomNEt2bkvGsosA3ioyHm+6jCMbI59wqt4eeara28IzEmyPgoRaUOEDhTVdEJhmCoTWfC0p8aNkCp0oYqih2iqGi4yXeMkOsn4LdLLnmKfh/YogjNsPebeFGR4m9BJHLzB61XQ3BtpISfS2FugsK9FAtLWX1dCRcrCnUp44CNzuCowUZmxSRgYaE6Za0W2u/E7CVXCiI/UOR8aAm1+OSyE3mOUcwyc1zBBeoX1kiKy0Zfxck1Gsyulti11i83QTBF5Kg3pDQThFMVHiPSlK+0cSedng/VaS8bOZbtsBcTcZAR8JP5KeqQ1OYKAi20njdNNRpgnsU//K+JnaXJaGTomr7aYIphoRn9aeShJWKEq9LcozSF7QleEfDI5LYm5bgVkFkRwVDBCVu0DDIkGupo8TZBq+/pMQURYErJQmPKGKjNDkWOLx7Jd5QizdUweIaKrlP7SwJDhZvONjLkOsBBX9UpGxnydhXkfBLQ8IxgojQbLFnJf81JytSljclYYyEFyx0kVBvKWOFJmONpshGAcsduQY5giVNCV51eOdJYo/pLhbvM0uDHSevNKRcrKZIqnCtJeEsO95RoqcgGK4ocZcho1tTYtcZvH41pNQ7vA0WrhIfOSraIIntIAi+NXWCErdbkvrWwjRLrt0NKUdL6KSOscTOdMSOUtBHwL6OLA0vNSdynaWQEnCpIvKaIrJJEbvHkmuNhn6OjM8VkSGSqn1uYJCGHnq9I3aLhNME3t6GjIkO7xrNFumpyTNX/NrwX7CrIRiqqWijI9JO4d1iieykyfiposQIQ8YjjsjlBh6oHWbwRjgYJQn2NgSnNycmJAk3NiXhx44Sxykihxm8ybUwT1OVKySc7vi3OXVkdBJ4AyXBeksDXG0IhgtYY0lY5ahCD0ehborIk5aUWRJviMA7Xt5kyRjonrXENkm8yYqgs8VzgrJmClK20uMM3jRJ0FiQICQF9hdETlLQWRIb5ki6WDfWRPobvO6a4GP5mcOrNzDFELtTkONLh9dXE8xypEg7z8A9jkhrQ6Fhjlg/QVktJXxt4WXzT/03Q8IaQWSqIuEvloQ2mqC9Jfi7wRul4RX3pSPlzpoVlmCtI2jvKHCFhjcM3sN6lqF6HxnKelLjXWbwrpR4xzuCrTUZx2qq9oAh8p6ixCUGr78g8oyjRAtB5CZFwi80VerVpI0h+IeBxa6Zg6kWvpDHaioYYuEsRbDC3eOmC2JvGYLeioxGknL2UATNJN6hmtj1DlpLvDVmocYbrGCVJKOrg4X6DgddLA203BKMFngdJJFtFd7vJLm6KEpc5yjQrkk7M80SGe34X24nSex1Ra5Omgb71JKyg8SrU3i/kARKwWpH0kOGhKkObyfd0ZGjvyXlAkVZ4xRbYJ2irFMkFY1SwyWxr2oo4zlNiV+7zmaweFpT4kR3kaDAFW6xpSqzJay05FtYR4HmZhc9UxKbbfF2V8RG1MBmSaE+kmC6JnaRXK9gsiXhJHl/U0qM0WTcbyhwkYIvFGwjSbjfwhiJt8ZSQU+Bd5+marPMOkVkD0muxYLIfEuhh60x/J92itguihJSEMySVPQnTewnEm+620rTQEMsOfo4/kP/0ARvWjitlpSX7GxBgcMEsd3EEeYWvdytd+Saawi6aCIj1CkGb6Aj9rwhx16Cf3vAwFy5pyLhVonXzy51FDpdEblbkdJbUcEPDEFzQ8qNmhzzLTmmKWKbFCXeEuRabp6rxbvAtLF442QjQ+wEA9eL1xSR7Q0JXzlSHjJ4exq89yR0laScJ/FW6z4a73pFMEfDiRZvuvijIt86RaSFOl01riV2mD1UEvxGk/Geg5aWwGki1zgKPG9J2U8PEg8qYvMsZeytiTRXBMslCU8JSlxi8EabjwUldlDNLfzTUmCgxWsjqWCOHavYAqsknKFIO0yQ61VL5AVFxk6WhEaCAkdJgt9aSkzXlKNX2jEa79waYuc7gq0N3GDJGCBhoiTXUEPsdknCUE1CK0fwsiaylSF2uiDyO4XX3pFhNd7R4itFGc0k/ElBZwWvq+GC6szVeEoS/MZ+qylwpKNKv9Z469UOjqCjwlusicyTxG6VpNxcQ8IncoR4RhLbR+NdpGGmJWOcIzJGUuKPGpQg8rrG21dOMqQssJQ4RxH5jaUqnZuQ0F4Q+cjxLwPtpZbIAk3QTJHQWBE5S1BokoVtDd6lhqr9UpHSUxMcIYl9pojsb8h4SBOsMQcqvOWC2E8EVehqiJ1hrrAEbQxeK0NGZ0Gkq+guSRgniM23bIHVkqwx4hiHd7smaOyglyIyQuM978j4VS08J/A2G1KeMBRo4fBaSNhKUEZfQewVQ/C1I+MgfbEleEzCUw7mKXI0M3hd1EESVji8x5uQ41nxs1q4RMJCCXs7Iq9acpxn22oSDnQ/sJTxsCbHIYZiLyhY05TY0ZLIOQrGaSJDDN4t8pVaIrsqqFdEegtizc1iTew5Q4ayBDMUsQMkXocaYkc0hZua412siZ1rSXlR460zRJ5SlHGe5j801RLMlJTxtaOM3Q1pvxJ45zUlWFD7rsAbpfEm1JHxG0eh8w2R7QQVzBUw28FhFp5QZzq8t2rx2joqulYTWSuJdTYfWwqMFMcovFmSyJPNyLhE4E10pHzYjOC3huArRa571ZsGajQpQx38SBP5pyZB6lMU3khDnp0MBV51BE9o2E+TY5Ml2E8S7C0o6w1xvCZjf0HkVEHCzFoyNmqC+9wdcqN+Tp7jSDheE9ws8Y5V0NJCn2bk2tqSY4okdrEhx1iDN8cSudwepWmAGXKcJXK65H9to8jYQRH7SBF01ESUJdd0TayVInaWhLkOjlXE5irKGOnI6GSWGCJa482zBI9rCr0jyTVcEuzriC1vcr6mwFGSiqy5zMwxBH/TJHwjSPhL8+01kaaSUuMFKTcLEvaUePcrSmwn8DZrgikWb7CGPxkSjhQwrRk57tctmxLsb9sZvL9LSlyuSLlWkqOjwduo8b6Uv1DkmudIeFF2dHCgxVtk8dpIvHpBxhEOdhKk7OLIUSdJ+cSRY57B+0DgGUUlNfpthTfGkauzxrvTsUUaCVhlKeteTXCoJDCa2NOKhOmC4G1H8JBd4OBZReSRGkqcb/CO1PyLJTLB4j1q8JYaIutEjSLX8YKM+a6phdMsdLFUoV5RTm9JSkuDN8WcIon0NZMNZWh1q8C7SJEwV5HxrmnnTrf3KoJBlmCYI2ilSLlfEvlE4011NNgjgthzEua0oKK7JLE7HZHlEl60BLMVFewg4EWNt0ThrVNEVkkiTwpKXSWJzdRENgvKGq4IhjsiezgSFtsfCUq8qki5S1LRQeYQQ4nemmCkImWMw3tFUoUBZk4NOeZYEp4XRKTGa6wJjrWNHBVJR4m3FCnbuD6aak2WsMTh3SZImGCIPKNgsDpVwnsa70K31lCFJZYcwwSMFcQulGTsZuEaSdBXkPGZhu0FsdUO73RHjq8MPGGIfaGIbVTk6iuI3GFgucHrIQkmWSJdBd7BBu+uOryWAhY7+Lki9rK5wtEQzWwvtbqGhIMFwWRJsElsY4m9IIg9L6lCX0VklaPAYkfkZEGDnOWowlBJjtMUkcGK4Lg6EtoZInMUBVYLgn0UsdmCyCz7gIGHFfk+k1QwTh5We7A9x+IdJ6CvIkEagms0hR50eH9UnTQJ+2oiKyVlLFUE+8gBGu8MQ3CppUHesnjTHN4QB/UGPhCTHLFPHMFrCqa73gqObUJGa03wgbhHkrCfpEpzNLE7JDS25FMKhlhKKWKfCgqstLCPu1zBXy0J2ztwjtixBu8UTRn9LVtkmCN2iyFhtME70JHRQ1KVZXqKI/KNIKYMCYs1GUMEKbM1bKOI9LDXC7zbHS+bt+1MTWS9odA9DtrYtpbImQJ2VHh/lisEwaHqUk1kjKTAKknkBEXkbkdMGwq0dnhzLJF3NJH3JVwrqOB4Sca2hti75nmJN0WzxS6UxDYoEpxpa4htVlRjkYE7DZGzJVU72uC9IyhQL4i8YfGWSYLLNcHXloyz7QhNifmKSE9JgfGmuyLhc403Xm9vqcp6gXe3xuuv8F6VJNxkyTHEkHG2g0aKXL0MsXc1bGfgas2//dCONXiNLCX+5mB7eZIl1kHh7ajwpikyzlUUWOVOsjSQlsS+M0R+pPje/dzBXRZGO0rMtgQrLLG9VSu9n6CMXS3BhwYmSoIBhsjNBmZbgusE9BCPCP5triU4VhNbJfE+swSP27aayE8tuTpYYjtrYjMVGZdp2NpS1s6aBnKSHDsbKuplKbHM4a0wMFd/5/DmGyKrJSUaW4IBrqUhx0vyfzTBBLPIUcnZdrAkNsKR0sWRspumSns6Ch0v/qqIbBYUWKvPU/CFoyrDJGwSNFhbA/MlzKqjrO80hRbpKx0Jewsi/STftwGSlKc1JZyAzx05dhLEdnfQvhZOqiHWWEAHC7+30FuRcZUgaO5gpaIK+xsiHRUsqaPElTV40xQZQ107Q9BZE1nryDVGU9ZSQ47bmhBpLcYpUt7S+xuK/FiT8qKjwXYw5ypS2iuCv7q1gtgjhuBuB8LCFY5cUuCNtsQOFcT+4Ih9JX+k8Ea6v0iCIRZOtCT0Et00JW5UeC85Cg0ScK0k411HcG1zKtre3SeITBRk7WfwDhEvaYLTHP9le0m8By0JDwn4TlLW/aJOvGHxdjYUes+ScZigCkYQdNdEOhkiezgShqkx8ueKjI8lDfK2oNiOFvrZH1hS+tk7NV7nOmLHicGWEgubkXKdwdtZknCLJXaCpkrjZBtLZFsDP9CdxWsSr05Sxl6CMmoFbCOgryX40uDtamB7SVmXW4Ihlgpmq+00tBKUUa83WbjLUNkzDmY7cow1JDygyPGlhgGKYKz4vcV7QBNbJIgM11TUqZaMdwTeSguH6rOaw1JRKzaaGyxVm2EJ/uCIrVWUcZUkcp2grMsEjK+DMwS59jQk3Kd6SEq1d0S6uVmO4Bc1lDXTUcHjluCXEq+1OlBDj1pi9zgiXxnKuE0SqTXwhqbETW6RggMEnGl/q49UT2iCzgJvRwVXS2K/d6+ZkyUl7jawSVLit46EwxVljDZwoSQ20sDBihztHfk2yA8NVZghiXwrYHQdfKAOtzsayjhY9bY0yE2CWEeJ9xfzO423xhL5syS2TFJofO2pboHob0nY4GiAgRrvGQEDa/FWSsoaaYl0syRsEt3kWoH3B01shCXhTUWe9w3Bt44SC9QCh3eShQctwbaK2ApLroGCMlZrYqvlY3qYhM0aXpFkPOuoqJ3Dm6fxXrGwVF9gCWZagjPqznfkuMKQ8DPTQRO8ZqG1hPGKEm9IgpGW4DZDgTNriTxvFiq+Lz+0cKfp4wj6OCK9JSnzNSn9LFU7UhKZZMnYwcJ8s8yRsECScK4j5UOB95HFO0CzhY4xJxuCix0lDlEUeMdS6EZBkTsUkZ4K74dugyTXS7aNgL8aqjDfkCE0ZbwkCXpaWCKhl8P7VD5jxykivSyxyZrYERbe168LYu9ZYh86IkscgVLE7tWPKmJv11CgoyJltMEbrohtVAQfO4ImltiHEroYEs7RxAarVpY8AwXMcMReFOTYWe5iiLRQxJ5Q8DtJ8LQhWOhIeFESPGsILhbNDRljNbHzNRlTFbk2S3L0NOS6V1KFJYKUbSTcIIhM0wQ/s2TM0SRMNcQmSap3jCH4yhJZKSkwyRHpYYgsFeQ4U7xoCB7VVOExhXepo9ABBsYbvGWKXPME3lyH95YioZ0gssQRWWbI+FaSMkXijZXwgiTlYdPdkNLaETxlyDVIwqeaEus0aTcYcg0RVOkpR3CSJqIddK+90JCxzsDVloyrFd5ZAr4TBKfaWa6boEA7C7s6EpYaeFPjveooY72mjIccLHJ9HUwVlDhKkmutJDJBwnp1rvulJZggKDRfbXAkvC/4l3ozQOG9a8lxjx0i7nV4jSXc7vhe3OwIxjgSHjdEhhsif9YkPGlus3iLFDnWOFhtCZbJg0UbQcIaR67JjthoCyMEZRwhiXWyxO5QxI6w5NhT4U1WsJvDO60J34fW9hwzwlKij6ZAW9ne4L0s8C6XeBMEkd/LQy1VucBRot6QMlbivaBhoBgjqGiCJNhsqVp/S2SsG6DIONCR0dXhvWbJ+MRRZJkkuEjgDXJjFQW6SSL7GXK8Z2CZg7cVsbWGoKmEpzQ5elpiy8Ryg7dMkLLUEauzeO86CuwlSOlgYLojZWeJ9xM3S1PWfEfKl5ISLQ0MEKR8YOB2QfCxJBjrKPCN4f9MkaSsqoVXJBmP7EpFZ9UQfOoOFwSzBN4MQ8LsGrymlipcJQhmy0GaQjPqCHaXRwuCZwRbqK2Fg9wlClZqYicrIgMdZfxTQ0c7TBIbrChxmuzoKG8XRaSrIhhiyNFJkrC7oIAWMEOQa5aBekPCRknCo4IKPrYkvCDI8aYmY7WFtprgekcJZ3oLIqssCSMtFbQTJKwXYy3BY5oCh2iKPCpJOE+zRdpYgi6O2KmOAgvVCYaU4ySRek1sgyFhJ403QFHiVEmJHwtybO1gs8Hr5+BETQX3War0qZngYGgtVZtoqd6vFSk/UwdZElYqyjrF4HXUeFspIi9IGKf4j92pKGAdCYMVsbcV3kRF0N+R8LUd5PCsIGWoxDtBkCI0nKofdJQxT+LtZflvuc8Q3CjwWkq8KwUpHzkK/NmSsclCL0nseQdj5FRH5CNHSgtLiW80Of5HU9Hhlsga9bnBq3fEVltKfO5IaSTmGjjc4J0otcP7QsJUSQM8pEj5/wCuUuC2DWz8AAAAAElFTkSuQmCC"); } ================================================ FILE: base/res/codemirror/theme/base16-dark.css ================================================ /* Name: Base16 Default Dark Author: Chris Kempson (http://chriskempson.com) CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-chrome-devtools) Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ .cm-s-base16-dark.CodeMirror {background: #151515; color: #e0e0e0;} .cm-s-base16-dark div.CodeMirror-selected {background: #303030 !important;} .cm-s-base16-dark.CodeMirror ::selection { background: rgba(48, 48, 48, .99); } .cm-s-base16-dark.CodeMirror ::-moz-selection { background: rgba(48, 48, 48, .99); } .cm-s-base16-dark .CodeMirror-gutters {background: #151515; border-right: 0px;} .cm-s-base16-dark .CodeMirror-guttermarker { color: #ac4142; } .cm-s-base16-dark .CodeMirror-guttermarker-subtle { color: #505050; } .cm-s-base16-dark .CodeMirror-linenumber {color: #505050;} .cm-s-base16-dark .CodeMirror-cursor {border-left: 1px solid #b0b0b0 !important;} .cm-s-base16-dark span.cm-comment {color: #8f5536;} .cm-s-base16-dark span.cm-atom {color: #aa759f;} .cm-s-base16-dark span.cm-number {color: #aa759f;} .cm-s-base16-dark span.cm-property, .cm-s-base16-dark span.cm-attribute {color: #90a959;} .cm-s-base16-dark span.cm-keyword {color: #ac4142;} .cm-s-base16-dark span.cm-string {color: #f4bf75;} .cm-s-base16-dark span.cm-variable {color: #90a959;} .cm-s-base16-dark span.cm-variable-2 {color: #6a9fb5;} .cm-s-base16-dark span.cm-def {color: #d28445;} .cm-s-base16-dark span.cm-bracket {color: #e0e0e0;} .cm-s-base16-dark span.cm-tag {color: #ac4142;} .cm-s-base16-dark span.cm-link {color: #aa759f;} .cm-s-base16-dark span.cm-error {background: #ac4142; color: #b0b0b0;} .cm-s-base16-dark .CodeMirror-activeline-background {background: #202020 !important;} .cm-s-base16-dark .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} ================================================ FILE: base/res/codemirror/theme/base16-light.css ================================================ /* Name: Base16 Default Light Author: Chris Kempson (http://chriskempson.com) CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-chrome-devtools) Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ .cm-s-base16-light.CodeMirror {background: #f5f5f5; color: #202020;} .cm-s-base16-light div.CodeMirror-selected {background: #e0e0e0 !important;} .cm-s-base16-light.CodeMirror ::selection { background: #e0e0e0; } .cm-s-base16-light.CodeMirror ::-moz-selection { background: #e0e0e0; } .cm-s-base16-light .CodeMirror-gutters {background: #f5f5f5; border-right: 0px;} .cm-s-base16-light .CodeMirror-guttermarker { color: #ac4142; } .cm-s-base16-light .CodeMirror-guttermarker-subtle { color: #b0b0b0; } .cm-s-base16-light .CodeMirror-linenumber {color: #b0b0b0;} .cm-s-base16-light .CodeMirror-cursor {border-left: 1px solid #505050 !important;} .cm-s-base16-light span.cm-comment {color: #8f5536;} .cm-s-base16-light span.cm-atom {color: #aa759f;} .cm-s-base16-light span.cm-number {color: #aa759f;} .cm-s-base16-light span.cm-property, .cm-s-base16-light span.cm-attribute {color: #90a959;} .cm-s-base16-light span.cm-keyword {color: #ac4142;} .cm-s-base16-light span.cm-string {color: #f4bf75;} .cm-s-base16-light span.cm-variable {color: #90a959;} .cm-s-base16-light span.cm-variable-2 {color: #6a9fb5;} .cm-s-base16-light span.cm-def {color: #d28445;} .cm-s-base16-light span.cm-bracket {color: #202020;} .cm-s-base16-light span.cm-tag {color: #ac4142;} .cm-s-base16-light span.cm-link {color: #aa759f;} .cm-s-base16-light span.cm-error {background: #ac4142; color: #505050;} .cm-s-base16-light .CodeMirror-activeline-background {background: #DDDCDC !important;} .cm-s-base16-light .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} ================================================ FILE: base/res/codemirror/theme/blackboard.css ================================================ /* Port of TextMate's Blackboard theme */ .cm-s-blackboard.CodeMirror { background: #0C1021; color: #F8F8F8; } .cm-s-blackboard .CodeMirror-selected { background: #253B76 !important; } .cm-s-blackboard.CodeMirror ::selection { background: rgba(37, 59, 118, .99); } .cm-s-blackboard.CodeMirror ::-moz-selection { background: rgba(37, 59, 118, .99); } .cm-s-blackboard .CodeMirror-gutters { background: #0C1021; border-right: 0; } .cm-s-blackboard .CodeMirror-guttermarker { color: #FBDE2D; } .cm-s-blackboard .CodeMirror-guttermarker-subtle { color: #888; } .cm-s-blackboard .CodeMirror-linenumber { color: #888; } .cm-s-blackboard .CodeMirror-cursor { border-left: 1px solid #A7A7A7 !important; } .cm-s-blackboard .cm-keyword { color: #FBDE2D; } .cm-s-blackboard .cm-atom { color: #D8FA3C; } .cm-s-blackboard .cm-number { color: #D8FA3C; } .cm-s-blackboard .cm-def { color: #8DA6CE; } .cm-s-blackboard .cm-variable { color: #FF6400; } .cm-s-blackboard .cm-operator { color: #FBDE2D;} .cm-s-blackboard .cm-comment { color: #AEAEAE; } .cm-s-blackboard .cm-string { color: #61CE3C; } .cm-s-blackboard .cm-string-2 { color: #61CE3C; } .cm-s-blackboard .cm-meta { color: #D8FA3C; } .cm-s-blackboard .cm-builtin { color: #8DA6CE; } .cm-s-blackboard .cm-tag { color: #8DA6CE; } .cm-s-blackboard .cm-attribute { color: #8DA6CE; } .cm-s-blackboard .cm-header { color: #FF6400; } .cm-s-blackboard .cm-hr { color: #AEAEAE; } .cm-s-blackboard .cm-link { color: #8DA6CE; } .cm-s-blackboard .cm-error { background: #9D1E15; color: #F8F8F8; } .cm-s-blackboard .CodeMirror-activeline-background {background: #3C3636 !important;} .cm-s-blackboard .CodeMirror-matchingbracket {outline:1px solid grey;color:white !important} ================================================ FILE: base/res/codemirror/theme/cobalt.css ================================================ .cm-s-cobalt.CodeMirror { background: #002240; color: white; } .cm-s-cobalt div.CodeMirror-selected { background: #b36539 !important; } .cm-s-cobalt.CodeMirror ::selection { background: rgba(179, 101, 57, .99); } .cm-s-cobalt.CodeMirror ::-moz-selection { background: rgba(179, 101, 57, .99); } .cm-s-cobalt .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; } .cm-s-cobalt .CodeMirror-guttermarker { color: #ffee80; } .cm-s-cobalt .CodeMirror-guttermarker-subtle { color: #d0d0d0; } .cm-s-cobalt .CodeMirror-linenumber { color: #d0d0d0; } .cm-s-cobalt .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-cobalt span.cm-comment { color: #08f; } .cm-s-cobalt span.cm-atom { color: #845dc4; } .cm-s-cobalt span.cm-number, .cm-s-cobalt span.cm-attribute { color: #ff80e1; } .cm-s-cobalt span.cm-keyword { color: #ffee80; } .cm-s-cobalt span.cm-string { color: #3ad900; } .cm-s-cobalt span.cm-meta { color: #ff9d00; } .cm-s-cobalt span.cm-variable-2, .cm-s-cobalt span.cm-tag { color: #9effff; } .cm-s-cobalt span.cm-variable-3, .cm-s-cobalt span.cm-def { color: white; } .cm-s-cobalt span.cm-bracket { color: #d8d8d8; } .cm-s-cobalt span.cm-builtin, .cm-s-cobalt span.cm-special { color: #ff9e59; } .cm-s-cobalt span.cm-link { color: #845dc4; } .cm-s-cobalt span.cm-error { color: #9d1e15; } .cm-s-cobalt .CodeMirror-activeline-background {background: #002D57 !important;} .cm-s-cobalt .CodeMirror-matchingbracket {outline:1px solid grey;color:white !important} ================================================ FILE: base/res/codemirror/theme/colorforth.css ================================================ .cm-s-colorforth.CodeMirror { background: #000000; color: #f8f8f8; } .cm-s-colorforth .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; } .cm-s-colorforth .CodeMirror-guttermarker { color: #FFBD40; } .cm-s-colorforth .CodeMirror-guttermarker-subtle { color: #78846f; } .cm-s-colorforth .CodeMirror-linenumber { color: #bababa; } .cm-s-colorforth .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-colorforth span.cm-comment { color: #ededed; } .cm-s-colorforth span.cm-def { color: #ff1c1c; font-weight:bold; } .cm-s-colorforth span.cm-keyword { color: #ffd900; } .cm-s-colorforth span.cm-builtin { color: #00d95a; } .cm-s-colorforth span.cm-variable { color: #73ff00; } .cm-s-colorforth span.cm-string { color: #007bff; } .cm-s-colorforth span.cm-number { color: #00c4ff; } .cm-s-colorforth span.cm-atom { color: #606060; } .cm-s-colorforth span.cm-variable-2 { color: #EEE; } .cm-s-colorforth span.cm-variable-3 { color: #DDD; } .cm-s-colorforth span.cm-property {} .cm-s-colorforth span.cm-operator {} .cm-s-colorforth span.cm-meta { color: yellow; } .cm-s-colorforth span.cm-qualifier { color: #FFF700; } .cm-s-colorforth span.cm-bracket { color: #cc7; } .cm-s-colorforth span.cm-tag { color: #FFBD40; } .cm-s-colorforth span.cm-attribute { color: #FFF700; } .cm-s-colorforth span.cm-error { color: #f00; } .cm-s-colorforth .CodeMirror-selected { background: #333d53 !important; } .cm-s-colorforth span.cm-compilation { background: rgba(255, 255, 255, 0.12); } .cm-s-colorforth .CodeMirror-activeline-background {background: #253540 !important;} ================================================ FILE: base/res/codemirror/theme/eclipse.css ================================================ .cm-s-eclipse span.cm-meta {color: #FF1717;} .cm-s-eclipse span.cm-keyword { line-height: 1em; font-weight: bold; color: #7F0055; } .cm-s-eclipse span.cm-atom {color: #219;} .cm-s-eclipse span.cm-number {color: #164;} .cm-s-eclipse span.cm-def {color: #00f;} .cm-s-eclipse span.cm-variable {color: black;} .cm-s-eclipse span.cm-variable-2 {color: #0000C0;} .cm-s-eclipse span.cm-variable-3 {color: #0000C0;} .cm-s-eclipse span.cm-property {color: black;} .cm-s-eclipse span.cm-operator {color: black;} .cm-s-eclipse span.cm-comment {color: #3F7F5F;} .cm-s-eclipse span.cm-string {color: #2A00FF;} .cm-s-eclipse span.cm-string-2 {color: #f50;} .cm-s-eclipse span.cm-qualifier {color: #555;} .cm-s-eclipse span.cm-builtin {color: #30a;} .cm-s-eclipse span.cm-bracket {color: #cc7;} .cm-s-eclipse span.cm-tag {color: #170;} .cm-s-eclipse span.cm-attribute {color: #00c;} .cm-s-eclipse span.cm-link {color: #219;} .cm-s-eclipse span.cm-error {color: #f00;} .cm-s-eclipse .CodeMirror-activeline-background {background: #e8f2ff !important;} .cm-s-eclipse .CodeMirror-matchingbracket {outline:1px solid grey; color:black !important;} ================================================ FILE: base/res/codemirror/theme/elegant.css ================================================ .cm-s-elegant span.cm-number, .cm-s-elegant span.cm-string, .cm-s-elegant span.cm-atom {color: #762;} .cm-s-elegant span.cm-comment {color: #262; font-style: italic; line-height: 1em;} .cm-s-elegant span.cm-meta {color: #555; font-style: italic; line-height: 1em;} .cm-s-elegant span.cm-variable {color: black;} .cm-s-elegant span.cm-variable-2 {color: #b11;} .cm-s-elegant span.cm-qualifier {color: #555;} .cm-s-elegant span.cm-keyword {color: #730;} .cm-s-elegant span.cm-builtin {color: #30a;} .cm-s-elegant span.cm-link {color: #762;} .cm-s-elegant span.cm-error {background-color: #fdd;} .cm-s-elegant .CodeMirror-activeline-background {background: #e8f2ff !important;} .cm-s-elegant .CodeMirror-matchingbracket {outline:1px solid grey; color:black !important;} ================================================ FILE: base/res/codemirror/theme/erlang-dark.css ================================================ .cm-s-erlang-dark.CodeMirror { background: #002240; color: white; } .cm-s-erlang-dark div.CodeMirror-selected { background: #b36539 !important; } .cm-s-erlang-dark.CodeMirror ::selection { background: rgba(179, 101, 57, .99); } .cm-s-erlang-dark.CodeMirror ::-moz-selection { background: rgba(179, 101, 57, .99); } .cm-s-erlang-dark .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; } .cm-s-erlang-dark .CodeMirror-guttermarker { color: white; } .cm-s-erlang-dark .CodeMirror-guttermarker-subtle { color: #d0d0d0; } .cm-s-erlang-dark .CodeMirror-linenumber { color: #d0d0d0; } .cm-s-erlang-dark .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-erlang-dark span.cm-atom { color: #f133f1; } .cm-s-erlang-dark span.cm-attribute { color: #ff80e1; } .cm-s-erlang-dark span.cm-bracket { color: #ff9d00; } .cm-s-erlang-dark span.cm-builtin { color: #eaa; } .cm-s-erlang-dark span.cm-comment { color: #77f; } .cm-s-erlang-dark span.cm-def { color: #e7a; } .cm-s-erlang-dark span.cm-keyword { color: #ffee80; } .cm-s-erlang-dark span.cm-meta { color: #50fefe; } .cm-s-erlang-dark span.cm-number { color: #ffd0d0; } .cm-s-erlang-dark span.cm-operator { color: #d55; } .cm-s-erlang-dark span.cm-property { color: #ccc; } .cm-s-erlang-dark span.cm-qualifier { color: #ccc; } .cm-s-erlang-dark span.cm-quote { color: #ccc; } .cm-s-erlang-dark span.cm-special { color: #ffbbbb; } .cm-s-erlang-dark span.cm-string { color: #3ad900; } .cm-s-erlang-dark span.cm-string-2 { color: #ccc; } .cm-s-erlang-dark span.cm-tag { color: #9effff; } .cm-s-erlang-dark span.cm-variable { color: #50fe50; } .cm-s-erlang-dark span.cm-variable-2 { color: #e0e; } .cm-s-erlang-dark span.cm-variable-3 { color: #ccc; } .cm-s-erlang-dark span.cm-error { color: #9d1e15; } .cm-s-erlang-dark .CodeMirror-activeline-background {background: #013461 !important;} .cm-s-erlang-dark .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;} ================================================ FILE: base/res/codemirror/theme/lesser-dark.css ================================================ /* http://lesscss.org/ dark theme Ported to CodeMirror by Peter Kroon */ .cm-s-lesser-dark { line-height: 1.3em; } .cm-s-lesser-dark.CodeMirror { background: #262626; color: #EBEFE7; text-shadow: 0 -1px 1px #262626; } .cm-s-lesser-dark div.CodeMirror-selected {background: #45443B !important;} /* 33322B*/ .cm-s-lesser-dark.CodeMirror ::selection { background: rgba(69, 68, 59, .99); } .cm-s-lesser-dark.CodeMirror ::-moz-selection { background: rgba(69, 68, 59, .99); } .cm-s-lesser-dark .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-lesser-dark pre { padding: 0 8px; }/*editable code holder*/ .cm-s-lesser-dark.CodeMirror span.CodeMirror-matchingbracket { color: #7EFC7E; }/*65FC65*/ .cm-s-lesser-dark .CodeMirror-gutters { background: #262626; border-right:1px solid #aaa; } .cm-s-lesser-dark .CodeMirror-guttermarker { color: #599eff; } .cm-s-lesser-dark .CodeMirror-guttermarker-subtle { color: #777; } .cm-s-lesser-dark .CodeMirror-linenumber { color: #777; } .cm-s-lesser-dark span.cm-keyword { color: #599eff; } .cm-s-lesser-dark span.cm-atom { color: #C2B470; } .cm-s-lesser-dark span.cm-number { color: #B35E4D; } .cm-s-lesser-dark span.cm-def {color: white;} .cm-s-lesser-dark span.cm-variable { color:#D9BF8C; } .cm-s-lesser-dark span.cm-variable-2 { color: #669199; } .cm-s-lesser-dark span.cm-variable-3 { color: white; } .cm-s-lesser-dark span.cm-property {color: #92A75C;} .cm-s-lesser-dark span.cm-operator {color: #92A75C;} .cm-s-lesser-dark span.cm-comment { color: #666; } .cm-s-lesser-dark span.cm-string { color: #BCD279; } .cm-s-lesser-dark span.cm-string-2 {color: #f50;} .cm-s-lesser-dark span.cm-meta { color: #738C73; } .cm-s-lesser-dark span.cm-qualifier {color: #555;} .cm-s-lesser-dark span.cm-builtin { color: #ff9e59; } .cm-s-lesser-dark span.cm-bracket { color: #EBEFE7; } .cm-s-lesser-dark span.cm-tag { color: #669199; } .cm-s-lesser-dark span.cm-attribute {color: #00c;} .cm-s-lesser-dark span.cm-header {color: #a0a;} .cm-s-lesser-dark span.cm-quote {color: #090;} .cm-s-lesser-dark span.cm-hr {color: #999;} .cm-s-lesser-dark span.cm-link {color: #00c;} .cm-s-lesser-dark span.cm-error { color: #9d1e15; } .cm-s-lesser-dark .CodeMirror-activeline-background {background: #3C3A3A !important;} .cm-s-lesser-dark .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;} ================================================ FILE: base/res/codemirror/theme/liquibyte.css ================================================ .cm-s-liquibyte.CodeMirror { background-color: #000; color: #fff; line-height: 1.2em; font-size: 1em; } .CodeMirror-focused .cm-matchhighlight { text-decoration: underline; text-decoration-color: #0f0; text-decoration-style: wavy; } .cm-trailingspace { text-decoration: line-through; text-decoration-color: #f00; text-decoration-style: dotted; } .cm-tab { text-decoration: line-through; text-decoration-color: #404040; text-decoration-style: dotted; } .cm-s-liquibyte .CodeMirror-gutters { background-color: #262626; border-right: 1px solid #505050; padding-right: 0.8em; } .cm-s-liquibyte .CodeMirror-gutter-elt div{ font-size: 1.2em; } .cm-s-liquibyte .CodeMirror-guttermarker { } .cm-s-liquibyte .CodeMirror-guttermarker-subtle { } .cm-s-liquibyte .CodeMirror-linenumber { color: #606060; padding-left: 0;} .cm-s-liquibyte .CodeMirror-cursor { border-left: 1px solid #eee !important; } .cm-s-liquibyte span.cm-comment { color: #008000; } .cm-s-liquibyte span.cm-def { color: #ffaf40; font-weight: bold; } .cm-s-liquibyte span.cm-keyword { color: #c080ff; font-weight: bold; } .cm-s-liquibyte span.cm-builtin { color: #ffaf40; font-weight: bold; } .cm-s-liquibyte span.cm-variable { color: #5967ff; font-weight: bold; } .cm-s-liquibyte span.cm-string { color: #ff8000; } .cm-s-liquibyte span.cm-number { color: #0f0; font-weight: bold; } .cm-s-liquibyte span.cm-atom { color: #bf3030; font-weight: bold; } .cm-s-liquibyte span.cm-variable-2 { color: #007f7f; font-weight: bold; } .cm-s-liquibyte span.cm-variable-3 { color: #c080ff; font-weight: bold; } .cm-s-liquibyte span.cm-property { color: #999; font-weight: bold; } .cm-s-liquibyte span.cm-operator { color: #fff; } .cm-s-liquibyte span.cm-meta { color: #0f0; } .cm-s-liquibyte span.cm-qualifier { color: #fff700; font-weight: bold; } .cm-s-liquibyte span.cm-bracket { color: #cc7; } .cm-s-liquibyte span.cm-tag { color: #ff0; font-weight: bold; } .cm-s-liquibyte span.cm-attribute { color: #c080ff; font-weight: bold; } .cm-s-liquibyte span.cm-error { color: #f00; } .cm-s-liquibyte .CodeMirror-selected { background-color: rgba(255, 0, 0, 0.25) !important; } .cm-s-liquibyte span.cm-compilation { background-color: rgba(255, 255, 255, 0.12); } .cm-s-liquibyte .CodeMirror-activeline-background {background-color: rgba(0, 255, 0, 0.15) !important;} /* Default styles for common addons */ div.CodeMirror span.CodeMirror-matchingbracket { color: #0f0; font-weight: bold; } div.CodeMirror span.CodeMirror-nonmatchingbracket { color: #f00; font-weight: bold; } .CodeMirror-matchingtag { background-color: rgba(150, 255, 0, .3); } /* Scrollbars */ /* Simple */ div.CodeMirror-simplescroll-horizontal div:hover, div.CodeMirror-simplescroll-vertical div:hover { background-color: rgba(80, 80, 80, .7); } div.CodeMirror-simplescroll-horizontal div, div.CodeMirror-simplescroll-vertical div { background-color: rgba(80, 80, 80, .3); border: 1px solid #404040; border-radius: 5px; } div.CodeMirror-simplescroll-vertical div { border-top: 1px solid #404040; border-bottom: 1px solid #404040; } div.CodeMirror-simplescroll-horizontal div { border-left: 1px solid #404040; border-right: 1px solid #404040; } div.CodeMirror-simplescroll-vertical { background-color: #262626; } div.CodeMirror-simplescroll-horizontal { background-color: #262626; border-top: 1px solid #404040; } /* Overlay */ div.CodeMirror-overlayscroll-horizontal div, div.CodeMirror-overlayscroll-vertical div { background-color: #404040; border-radius: 5px; } div.CodeMirror-overlayscroll-vertical div { border: 1px solid #404040; } div.CodeMirror-overlayscroll-horizontal div { border: 1px solid #404040; } ================================================ FILE: base/res/codemirror/theme/mbo.css ================================================ /****************************************************************/ /* Based on mbonaci's Brackets mbo theme */ /* https://github.com/mbonaci/global/blob/master/Mbo.tmTheme */ /* Create your own: http://tmtheme-editor.herokuapp.com */ /****************************************************************/ .cm-s-mbo.CodeMirror {background: #2c2c2c; color: #ffffec;} .cm-s-mbo div.CodeMirror-selected {background: #716C62 !important;} .cm-s-mbo.CodeMirror ::selection { background: rgba(113, 108, 98, .99); } .cm-s-mbo.CodeMirror ::-moz-selection { background: rgba(113, 108, 98, .99); } .cm-s-mbo .CodeMirror-gutters {background: #4e4e4e; border-right: 0px;} .cm-s-mbo .CodeMirror-guttermarker { color: white; } .cm-s-mbo .CodeMirror-guttermarker-subtle { color: grey; } .cm-s-mbo .CodeMirror-linenumber {color: #dadada;} .cm-s-mbo .CodeMirror-cursor {border-left: 1px solid #ffffec !important;} .cm-s-mbo span.cm-comment {color: #95958a;} .cm-s-mbo span.cm-atom {color: #00a8c6;} .cm-s-mbo span.cm-number {color: #00a8c6;} .cm-s-mbo span.cm-property, .cm-s-mbo span.cm-attribute {color: #9ddfe9;} .cm-s-mbo span.cm-keyword {color: #ffb928;} .cm-s-mbo span.cm-string {color: #ffcf6c;} .cm-s-mbo span.cm-string.cm-property {color: #ffffec;} .cm-s-mbo span.cm-variable {color: #ffffec;} .cm-s-mbo span.cm-variable-2 {color: #00a8c6;} .cm-s-mbo span.cm-def {color: #ffffec;} .cm-s-mbo span.cm-bracket {color: #fffffc; font-weight: bold;} .cm-s-mbo span.cm-tag {color: #9ddfe9;} .cm-s-mbo span.cm-link {color: #f54b07;} .cm-s-mbo span.cm-error {border-bottom: #636363; color: #ffffec;} .cm-s-mbo span.cm-qualifier {color: #ffffec;} .cm-s-mbo .CodeMirror-activeline-background {background: #494b41 !important;} .cm-s-mbo .CodeMirror-matchingbracket {color: #222 !important;} .cm-s-mbo .CodeMirror-matchingtag {background: rgba(255, 255, 255, .37);} ================================================ FILE: base/res/codemirror/theme/mdn-like.css ================================================ /* MDN-LIKE Theme - Mozilla Ported to CodeMirror by Peter Kroon Report bugs/issues here: https://github.com/codemirror/CodeMirror/issues GitHub: @peterkroon The mdn-like theme is inspired on the displayed code examples at: https://developer.mozilla.org/en-US/docs/Web/CSS/animation */ .cm-s-mdn-like.CodeMirror { color: #999; background-color: #fff; } .cm-s-mdn-like .CodeMirror-selected { background: #cfc !important; } .cm-s-mdn-like.CodeMirror ::selection { background: #cfc; } .cm-s-mdn-like.CodeMirror ::-moz-selection { background: #cfc; } .cm-s-mdn-like .CodeMirror-gutters { background: #f8f8f8; border-left: 6px solid rgba(0,83,159,0.65); color: #333; } .cm-s-mdn-like .CodeMirror-linenumber { color: #aaa; padding-left: 8px; } div.cm-s-mdn-like .CodeMirror-cursor { border-left: 2px solid #222; } .cm-s-mdn-like .cm-keyword { color: #6262FF; } .cm-s-mdn-like .cm-atom { color: #F90; } .cm-s-mdn-like .cm-number { color: #ca7841; } .cm-s-mdn-like .cm-def { color: #8DA6CE; } .cm-s-mdn-like span.cm-variable-2, .cm-s-mdn-like span.cm-tag { color: #690; } .cm-s-mdn-like span.cm-variable-3, .cm-s-mdn-like span.cm-def { color: #07a; } .cm-s-mdn-like .cm-variable { color: #07a; } .cm-s-mdn-like .cm-property { color: #905; } .cm-s-mdn-like .cm-qualifier { color: #690; } .cm-s-mdn-like .cm-operator { color: #cda869; } .cm-s-mdn-like .cm-comment { color:#777; font-weight:normal; } .cm-s-mdn-like .cm-string { color:#07a; font-style:italic; } .cm-s-mdn-like .cm-string-2 { color:#bd6b18; } /*?*/ .cm-s-mdn-like .cm-meta { color: #000; } /*?*/ .cm-s-mdn-like .cm-builtin { color: #9B7536; } /*?*/ .cm-s-mdn-like .cm-tag { color: #997643; } .cm-s-mdn-like .cm-attribute { color: #d6bb6d; } /*?*/ .cm-s-mdn-like .cm-header { color: #FF6400; } .cm-s-mdn-like .cm-hr { color: #AEAEAE; } .cm-s-mdn-like .cm-link { color:#ad9361; font-style:italic; text-decoration:none; } .cm-s-mdn-like .cm-error { border-bottom: 1px solid red; } div.cm-s-mdn-like .CodeMirror-activeline-background {background: #efefff;} div.cm-s-mdn-like span.CodeMirror-matchingbracket {outline:1px solid grey; color: inherit;} .cm-s-mdn-like.CodeMirror { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFcAAAAyCAYAAAAp8UeFAAAHvklEQVR42s2b63bcNgyEQZCSHCdt2vd/0tWF7I+Q6XgMXiTtuvU5Pl57ZQKkKHzEAOtF5KeIJBGJ8uvL599FRFREZhFx8DeXv8trn68RuGaC8TRfo3SNp9dlDDHedyLyTUTeRWStXKPZrjtpZxaRw5hPqozRs1N8/enzIiQRWcCgy4MUA0f+XWliDhyL8Lfyvx7ei/Ae3iQFHyw7U/59pQVIMEEPEz0G7XiwdRjzSfC3UTtz9vchIntxvry5iMgfIhJoEflOz2CQr3F5h/HfeFe+GTdLaKcu9L8LTeQb/R/7GgbsfKedyNdoHsN31uRPWrfZ5wsj/NzzRQHuToIdU3ahwnsKPxXCjJITuOsi7XLc7SG/v5GdALs7wf8JjTFiB5+QvTEfRyGOfX3Lrx8wxyQi3sNq46O7QahQiCsRFgqddjBouVEHOKDgXAQHD9gJCr5sMKkEdjwsarG/ww3BMHBU7OBjXnzdyY7SfCxf5/z6ATccrwlKuwC/jhznnPF4CgVzhhVf4xp2EixcBActO75iZ8/fM9zAs2OMzKdslgXWJ9XG8PQoOAMA5fGcsvORgv0doBXyHrCwfLJAOwo71QLNkb8n2Pl6EWiR7OCibtkPaz4Kc/0NNAze2gju3zOwekALDaCFPI5vjPFmgGY5AZqyGEvH1x7QfIb8YtxMnA/b+QQ0aQDAwc6JMFg8CbQZ4qoYEEHbRwNojuK3EHwd7VALSgq+MNDKzfT58T8qdpADrgW0GmgcAS1lhzztJmkAzcPNOQbsWEALBDSlMKUG0Eq4CLAQWvEVQ9WU57gZJwZtgPO3r9oBTQ9WO8TjqXINx8R0EYpiZEUWOF3FxkbJkgU9B2f41YBrIj5ZfsQa0M5kTgiAAqM3ShXLgu8XMqcrQBvJ0CL5pnTsfMB13oB8athpAq2XOQmcGmoACCLydx7nToa23ATaSIY2ichfOdPTGxlasXMLaL0MLZAOwAKIM+y8CmicobGdCcbbK9DzN+yYGVoNNI5iUKTMyYOjPse4A8SM1MmcXgU0toOq1yO/v8FOxlASyc7TgeYaAMBJHcY1CcCwGI/TK4AmDbDyKYBBtFUkRwto8gygiQEaByFgJ00BH2M8JWwQS1nafDXQCidWyOI8AcjDCSjCLk8ngObuAm3JAHAdubAmOaK06V8MNEsKPJOhobSprwQa6gD7DclRQdqcwL4zxqgBrQcabUiBLclRDKAlWp+etPkBaNMA0AKlrHwTdEByZAA4GM+SNluSY6wAzcMNewxmgig5Ks0nkrSpBvSaQHMdKTBAnLojOdYyGpQ254602ZILPdTD1hdlggdIm74jbTp8vDwF5ZYUeLWGJpWsh6XNyXgcYwVoJQTEhhTYkxzZjiU5npU2TaB979TQehlaAVq4kaGpiPwwwLkYUuBbQwocyQTv1tA0+1UFWoJF3iv1oq+qoSk8EQdJmwHkziIF7oOZk14EGitibAdjLYYK78H5vZOhtWpoI0ATGHs0Q8OMb4Ey+2bU2UYztCtA0wFAs7TplGLRVQCcqaFdGSPCeTI1QNIC52iWNzof6Uib7xjEp07mNNoUYmVosVItHrHzRlLgBn9LFyRHaQCtVUMbtTNhoXWiTOO9k/V8BdAc1Oq0ArSQs6/5SU0hckNy9NnXqQY0PGYo5dWJ7nINaN6o958FWin27aBaWRka1r5myvLOAm0j30eBJqCxHLReVclxhxOEN2JfDWjxBtAC7MIH1fVaGdoOp4qJYDgKtKPSFNID2gSnGldrCqkFZ+5UeQXQBIRrSwocbdZYQT/2LwRahBPBXoHrB8nxaGROST62DKUbQOMMzZIC9abkuELfQzQALWTnDNAm8KHWFOJgJ5+SHIvTPcmx1xQyZRhNL5Qci689aXMEaN/uNIWkEwDAvFpOZmgsBaaGnbs1NPa1Jm32gBZAIh1pCtG7TSH4aE0y1uVY4uqoFPisGlpP2rSA5qTecWn5agK6BzSpgAyD+wFaqhnYoSZ1Vwr8CmlTQbrcO3ZaX0NAEyMbYaAlyquFoLKK3SPby9CeVUPThrSJmkCAE0CrKUQadi4DrdSlWhmah0YL9z9vClH59YGbHx1J8VZTyAjQepJjmXwAKTDQI3omc3p1U4gDUf6RfcdYfrUp5ClAi2J3Ba6UOXGo+K+bQrjjssitG2SJzshaLwMtXgRagUNpYYoVkMSBLM+9GGiJZMvduG6DRZ4qc04DMPtQQxOjEtACmhO7K1AbNbQDEggZyJwscFpAGwENhoBeUwh3bWolhe8BTYVKxQEWrSUn/uhcM5KhvUu/+eQu0Lzhi+VrK0PrZZNDQKs9cpYUuFYgMVpD4/NxenJTiMCNqdUEUf1qZWjppLT5qSkkUZbCwkbZMSuVnu80hfSkzRbQeqCZSAh6huR4VtoM2gHAlLf72smuWgE+VV7XpE25Ab2WFDgyhnSuKbs4GuGzCjR+tIoUuMFg3kgcWKLTwRqanJQ2W00hAsenfaApRC42hbCvK1SlE0HtE9BGgneJO+ELamitD1YjjOYnNYVcraGhtKkW0EqVVeDx733I2NH581k1NNxNLG0i0IJ8/NjVaOZ0tYZ2Vtr0Xv7tPV3hkWp9EFkgS/J0vosngTaSoaG06WHi+xObQkaAdlbanP8B2+2l0f90LmUAAAAASUVORK5CYII=); } ================================================ FILE: base/res/codemirror/theme/midnight.css ================================================ /* Based on the theme at http://bonsaiden.github.com/JavaScript-Garden */ /**/ .cm-s-midnight span.CodeMirror-matchhighlight { background: #494949; } .cm-s-midnight.CodeMirror-focused span.CodeMirror-matchhighlight { background: #314D67 !important; } /**/ .cm-s-midnight .CodeMirror-activeline-background {background: #253540 !important;} .cm-s-midnight.CodeMirror { background: #0F192A; color: #D1EDFF; } .cm-s-midnight.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;} .cm-s-midnight div.CodeMirror-selected {background: #314D67 !important;} .cm-s-midnight.CodeMirror ::selection { background: rgba(49, 77, 103, .99); } .cm-s-midnight.CodeMirror ::-moz-selection { background: rgba(49, 77, 103, .99); } .cm-s-midnight .CodeMirror-gutters {background: #0F192A; border-right: 1px solid;} .cm-s-midnight .CodeMirror-guttermarker { color: white; } .cm-s-midnight .CodeMirror-guttermarker-subtle { color: #d0d0d0; } .cm-s-midnight .CodeMirror-linenumber {color: #D0D0D0;} .cm-s-midnight .CodeMirror-cursor { border-left: 1px solid #F8F8F0 !important; } .cm-s-midnight span.cm-comment {color: #428BDD;} .cm-s-midnight span.cm-atom {color: #AE81FF;} .cm-s-midnight span.cm-number {color: #D1EDFF;} .cm-s-midnight span.cm-property, .cm-s-midnight span.cm-attribute {color: #A6E22E;} .cm-s-midnight span.cm-keyword {color: #E83737;} .cm-s-midnight span.cm-string {color: #1DC116;} .cm-s-midnight span.cm-variable {color: #FFAA3E;} .cm-s-midnight span.cm-variable-2 {color: #FFAA3E;} .cm-s-midnight span.cm-def {color: #4DD;} .cm-s-midnight span.cm-bracket {color: #D1EDFF;} .cm-s-midnight span.cm-tag {color: #449;} .cm-s-midnight span.cm-link {color: #AE81FF;} .cm-s-midnight span.cm-error {background: #F92672; color: #F8F8F0;} .cm-s-midnight .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } ================================================ FILE: base/res/codemirror/theme/monokai.css ================================================ /* Based on Sublime Text's Monokai theme */ .cm-s-monokai.CodeMirror {background: #272822; color: #f8f8f2;} .cm-s-monokai div.CodeMirror-selected {background: #49483E !important;} .cm-s-monokai.CodeMirror ::selection { background: rgba(73, 72, 62, .99); } .cm-s-monokai.CodeMirror ::-moz-selection { background: rgba(73, 72, 62, .99); } .cm-s-monokai .CodeMirror-gutters {background: #272822; border-right: 0px;} .cm-s-monokai .CodeMirror-guttermarker { color: white; } .cm-s-monokai .CodeMirror-guttermarker-subtle { color: #d0d0d0; } .cm-s-monokai .CodeMirror-linenumber {color: #d0d0d0;} .cm-s-monokai .CodeMirror-cursor {border-left: 1px solid #f8f8f0 !important;} .cm-s-monokai span.cm-comment {color: #75715e;} .cm-s-monokai span.cm-atom {color: #ae81ff;} .cm-s-monokai span.cm-number {color: #ae81ff;} .cm-s-monokai span.cm-property, .cm-s-monokai span.cm-attribute {color: #a6e22e;} .cm-s-monokai span.cm-keyword {color: #f92672;} .cm-s-monokai span.cm-string {color: #e6db74;} .cm-s-monokai span.cm-variable {color: #f8f8f2;} .cm-s-monokai span.cm-variable-2 {color: #9effff;} .cm-s-monokai span.cm-def {color: #fd971f;} .cm-s-monokai span.cm-bracket {color: #f8f8f2;} .cm-s-monokai span.cm-tag {color: #f92672;} .cm-s-monokai span.cm-link {color: #ae81ff;} .cm-s-monokai span.cm-error {background: #f92672; color: #f8f8f0;} .cm-s-monokai .CodeMirror-activeline-background {background: #373831 !important;} .cm-s-monokai .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } ================================================ FILE: base/res/codemirror/theme/neat.css ================================================ .cm-s-neat span.cm-comment { color: #a86; } .cm-s-neat span.cm-keyword { line-height: 1em; font-weight: bold; color: blue; } .cm-s-neat span.cm-string { color: #a22; } .cm-s-neat span.cm-builtin { line-height: 1em; font-weight: bold; color: #077; } .cm-s-neat span.cm-special { line-height: 1em; font-weight: bold; color: #0aa; } .cm-s-neat span.cm-variable { color: black; } .cm-s-neat span.cm-number, .cm-s-neat span.cm-atom { color: #3a3; } .cm-s-neat span.cm-meta {color: #555;} .cm-s-neat span.cm-link { color: #3a3; } .cm-s-neat .CodeMirror-activeline-background {background: #e8f2ff !important;} .cm-s-neat .CodeMirror-matchingbracket {outline:1px solid grey; color:black !important;} ================================================ FILE: base/res/codemirror/theme/neo.css ================================================ /* neo theme for codemirror */ /* Color scheme */ .cm-s-neo.CodeMirror { background-color:#ffffff; color:#2e383c; line-height:1.4375; } .cm-s-neo .cm-comment {color:#75787b} .cm-s-neo .cm-keyword, .cm-s-neo .cm-property {color:#1d75b3} .cm-s-neo .cm-atom,.cm-s-neo .cm-number {color:#75438a} .cm-s-neo .cm-node,.cm-s-neo .cm-tag {color:#9c3328} .cm-s-neo .cm-string {color:#b35e14} .cm-s-neo .cm-variable,.cm-s-neo .cm-qualifier {color:#047d65} /* Editor styling */ .cm-s-neo pre { padding:0; } .cm-s-neo .CodeMirror-gutters { border:none; border-right:10px solid transparent; background-color:transparent; } .cm-s-neo .CodeMirror-linenumber { padding:0; color:#e0e2e5; } .cm-s-neo .CodeMirror-guttermarker { color: #1d75b3; } .cm-s-neo .CodeMirror-guttermarker-subtle { color: #e0e2e5; } .cm-s-neo div.CodeMirror-cursor { width: auto; border: 0; background: rgba(155,157,162,0.37); z-index: 1; } ================================================ FILE: base/res/codemirror/theme/night.css ================================================ /* Loosely based on the Midnight Textmate theme */ .cm-s-night.CodeMirror { background: #0a001f; color: #f8f8f8; } .cm-s-night div.CodeMirror-selected { background: #447 !important; } .cm-s-night.CodeMirror ::selection { background: rgba(68, 68, 119, .99); } .cm-s-night.CodeMirror ::-moz-selection { background: rgba(68, 68, 119, .99); } .cm-s-night .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; } .cm-s-night .CodeMirror-guttermarker { color: white; } .cm-s-night .CodeMirror-guttermarker-subtle { color: #bbb; } .cm-s-night .CodeMirror-linenumber { color: #f8f8f8; } .cm-s-night .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-night span.cm-comment { color: #6900a1; } .cm-s-night span.cm-atom { color: #845dc4; } .cm-s-night span.cm-number, .cm-s-night span.cm-attribute { color: #ffd500; } .cm-s-night span.cm-keyword { color: #599eff; } .cm-s-night span.cm-string { color: #37f14a; } .cm-s-night span.cm-meta { color: #7678e2; } .cm-s-night span.cm-variable-2, .cm-s-night span.cm-tag { color: #99b2ff; } .cm-s-night span.cm-variable-3, .cm-s-night span.cm-def { color: white; } .cm-s-night span.cm-bracket { color: #8da6ce; } .cm-s-night span.cm-comment { color: #6900a1; } .cm-s-night span.cm-builtin, .cm-s-night span.cm-special { color: #ff9e59; } .cm-s-night span.cm-link { color: #845dc4; } .cm-s-night span.cm-error { color: #9d1e15; } .cm-s-night .CodeMirror-activeline-background {background: #1C005A !important;} .cm-s-night .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;} ================================================ FILE: base/res/codemirror/theme/paraiso-dark.css ================================================ /* Name: Paraíso (Dark) Author: Jan T. Sott Color scheme by Jan T. Sott (https://github.com/idleberg/Paraiso-CodeMirror) Inspired by the art of Rubens LP (http://www.rubenslp.com.br) */ .cm-s-paraiso-dark.CodeMirror {background: #2f1e2e; color: #b9b6b0;} .cm-s-paraiso-dark div.CodeMirror-selected {background: #41323f !important;} .cm-s-paraiso-dark.CodeMirror ::selection { background: rgba(65, 50, 63, .99); } .cm-s-paraiso-dark.CodeMirror ::-moz-selection { background: rgba(65, 50, 63, .99); } .cm-s-paraiso-dark .CodeMirror-gutters {background: #2f1e2e; border-right: 0px;} .cm-s-paraiso-dark .CodeMirror-guttermarker { color: #ef6155; } .cm-s-paraiso-dark .CodeMirror-guttermarker-subtle { color: #776e71; } .cm-s-paraiso-dark .CodeMirror-linenumber {color: #776e71;} .cm-s-paraiso-dark .CodeMirror-cursor {border-left: 1px solid #8d8687 !important;} .cm-s-paraiso-dark span.cm-comment {color: #e96ba8;} .cm-s-paraiso-dark span.cm-atom {color: #815ba4;} .cm-s-paraiso-dark span.cm-number {color: #815ba4;} .cm-s-paraiso-dark span.cm-property, .cm-s-paraiso-dark span.cm-attribute {color: #48b685;} .cm-s-paraiso-dark span.cm-keyword {color: #ef6155;} .cm-s-paraiso-dark span.cm-string {color: #fec418;} .cm-s-paraiso-dark span.cm-variable {color: #48b685;} .cm-s-paraiso-dark span.cm-variable-2 {color: #06b6ef;} .cm-s-paraiso-dark span.cm-def {color: #f99b15;} .cm-s-paraiso-dark span.cm-bracket {color: #b9b6b0;} .cm-s-paraiso-dark span.cm-tag {color: #ef6155;} .cm-s-paraiso-dark span.cm-link {color: #815ba4;} .cm-s-paraiso-dark span.cm-error {background: #ef6155; color: #8d8687;} .cm-s-paraiso-dark .CodeMirror-activeline-background {background: #4D344A !important;} .cm-s-paraiso-dark .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} ================================================ FILE: base/res/codemirror/theme/paraiso-light.css ================================================ /* Name: Paraíso (Light) Author: Jan T. Sott Color scheme by Jan T. Sott (https://github.com/idleberg/Paraiso-CodeMirror) Inspired by the art of Rubens LP (http://www.rubenslp.com.br) */ .cm-s-paraiso-light.CodeMirror {background: #e7e9db; color: #41323f;} .cm-s-paraiso-light div.CodeMirror-selected {background: #b9b6b0 !important;} .cm-s-paraiso-light.CodeMirror ::selection { background: #b9b6b0; } .cm-s-paraiso-light.CodeMirror ::-moz-selection { background: #b9b6b0; } .cm-s-paraiso-light .CodeMirror-gutters {background: #e7e9db; border-right: 0px;} .cm-s-paraiso-light .CodeMirror-guttermarker { color: black; } .cm-s-paraiso-light .CodeMirror-guttermarker-subtle { color: #8d8687; } .cm-s-paraiso-light .CodeMirror-linenumber {color: #8d8687;} .cm-s-paraiso-light .CodeMirror-cursor {border-left: 1px solid #776e71 !important;} .cm-s-paraiso-light span.cm-comment {color: #e96ba8;} .cm-s-paraiso-light span.cm-atom {color: #815ba4;} .cm-s-paraiso-light span.cm-number {color: #815ba4;} .cm-s-paraiso-light span.cm-property, .cm-s-paraiso-light span.cm-attribute {color: #48b685;} .cm-s-paraiso-light span.cm-keyword {color: #ef6155;} .cm-s-paraiso-light span.cm-string {color: #fec418;} .cm-s-paraiso-light span.cm-variable {color: #48b685;} .cm-s-paraiso-light span.cm-variable-2 {color: #06b6ef;} .cm-s-paraiso-light span.cm-def {color: #f99b15;} .cm-s-paraiso-light span.cm-bracket {color: #41323f;} .cm-s-paraiso-light span.cm-tag {color: #ef6155;} .cm-s-paraiso-light span.cm-link {color: #815ba4;} .cm-s-paraiso-light span.cm-error {background: #ef6155; color: #776e71;} .cm-s-paraiso-light .CodeMirror-activeline-background {background: #CFD1C4 !important;} .cm-s-paraiso-light .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} ================================================ FILE: base/res/codemirror/theme/pastel-on-dark.css ================================================ /** * Pastel On Dark theme ported from ACE editor * @license MIT * @copyright AtomicPages LLC 2014 * @author Dennis Thompson, AtomicPages LLC * @version 1.1 * @source https://github.com/atomicpages/codemirror-pastel-on-dark-theme */ .cm-s-pastel-on-dark.CodeMirror { background: #2c2827; color: #8F938F; line-height: 1.5; font-size: 14px; } .cm-s-pastel-on-dark div.CodeMirror-selected { background: rgba(221,240,255,0.2) !important; } .cm-s-pastel-on-dark.CodeMirror ::selection { background: rgba(221,240,255,0.2); } .cm-s-pastel-on-dark.CodeMirror ::-moz-selection { background: rgba(221,240,255,0.2); } .cm-s-pastel-on-dark .CodeMirror-gutters { background: #34302f; border-right: 0px; padding: 0 3px; } .cm-s-pastel-on-dark .CodeMirror-guttermarker { color: white; } .cm-s-pastel-on-dark .CodeMirror-guttermarker-subtle { color: #8F938F; } .cm-s-pastel-on-dark .CodeMirror-linenumber { color: #8F938F; } .cm-s-pastel-on-dark .CodeMirror-cursor { border-left: 1px solid #A7A7A7 !important; } .cm-s-pastel-on-dark span.cm-comment { color: #A6C6FF; } .cm-s-pastel-on-dark span.cm-atom { color: #DE8E30; } .cm-s-pastel-on-dark span.cm-number { color: #CCCCCC; } .cm-s-pastel-on-dark span.cm-property { color: #8F938F; } .cm-s-pastel-on-dark span.cm-attribute { color: #a6e22e; } .cm-s-pastel-on-dark span.cm-keyword { color: #AEB2F8; } .cm-s-pastel-on-dark span.cm-string { color: #66A968; } .cm-s-pastel-on-dark span.cm-variable { color: #AEB2F8; } .cm-s-pastel-on-dark span.cm-variable-2 { color: #BEBF55; } .cm-s-pastel-on-dark span.cm-variable-3 { color: #DE8E30; } .cm-s-pastel-on-dark span.cm-def { color: #757aD8; } .cm-s-pastel-on-dark span.cm-bracket { color: #f8f8f2; } .cm-s-pastel-on-dark span.cm-tag { color: #C1C144; } .cm-s-pastel-on-dark span.cm-link { color: #ae81ff; } .cm-s-pastel-on-dark span.cm-qualifier,.cm-s-pastel-on-dark span.cm-builtin { color: #C1C144; } .cm-s-pastel-on-dark span.cm-error { background: #757aD8; color: #f8f8f0; } .cm-s-pastel-on-dark .CodeMirror-activeline-background { background: rgba(255, 255, 255, 0.031) !important; } .cm-s-pastel-on-dark .CodeMirror-matchingbracket { border: 1px solid rgba(255,255,255,0.25); color: #8F938F !important; margin: -1px -1px 0 -1px; } ================================================ FILE: base/res/codemirror/theme/rubyblue.css ================================================ .cm-s-rubyblue.CodeMirror { background: #112435; color: white; } .cm-s-rubyblue div.CodeMirror-selected { background: #38566F !important; } .cm-s-rubyblue.CodeMirror ::selection { background: rgba(56, 86, 111, 0.99); } .cm-s-rubyblue.CodeMirror ::-moz-selection { background: rgba(56, 86, 111, 0.99); } .cm-s-rubyblue .CodeMirror-gutters { background: #1F4661; border-right: 7px solid #3E7087; } .cm-s-rubyblue .CodeMirror-guttermarker { color: white; } .cm-s-rubyblue .CodeMirror-guttermarker-subtle { color: #3E7087; } .cm-s-rubyblue .CodeMirror-linenumber { color: white; } .cm-s-rubyblue .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-rubyblue span.cm-comment { color: #999; font-style:italic; line-height: 1em; } .cm-s-rubyblue span.cm-atom { color: #F4C20B; } .cm-s-rubyblue span.cm-number, .cm-s-rubyblue span.cm-attribute { color: #82C6E0; } .cm-s-rubyblue span.cm-keyword { color: #F0F; } .cm-s-rubyblue span.cm-string { color: #F08047; } .cm-s-rubyblue span.cm-meta { color: #F0F; } .cm-s-rubyblue span.cm-variable-2, .cm-s-rubyblue span.cm-tag { color: #7BD827; } .cm-s-rubyblue span.cm-variable-3, .cm-s-rubyblue span.cm-def { color: white; } .cm-s-rubyblue span.cm-bracket { color: #F0F; } .cm-s-rubyblue span.cm-link { color: #F4C20B; } .cm-s-rubyblue span.CodeMirror-matchingbracket { color:#F0F !important; } .cm-s-rubyblue span.cm-builtin, .cm-s-rubyblue span.cm-special { color: #FF9D00; } .cm-s-rubyblue span.cm-error { color: #AF2018; } .cm-s-rubyblue .CodeMirror-activeline-background {background: #173047 !important;} ================================================ FILE: base/res/codemirror/theme/solarized.css ================================================ /* Solarized theme for code-mirror http://ethanschoonover.com/solarized */ /* Solarized color pallet http://ethanschoonover.com/solarized/img/solarized-palette.png */ .solarized.base03 { color: #002b36; } .solarized.base02 { color: #073642; } .solarized.base01 { color: #586e75; } .solarized.base00 { color: #657b83; } .solarized.base0 { color: #839496; } .solarized.base1 { color: #93a1a1; } .solarized.base2 { color: #eee8d5; } .solarized.base3 { color: #fdf6e3; } .solarized.solar-yellow { color: #b58900; } .solarized.solar-orange { color: #cb4b16; } .solarized.solar-red { color: #dc322f; } .solarized.solar-magenta { color: #d33682; } .solarized.solar-violet { color: #6c71c4; } .solarized.solar-blue { color: #268bd2; } .solarized.solar-cyan { color: #2aa198; } .solarized.solar-green { color: #859900; } /* Color scheme for code-mirror */ .cm-s-solarized { line-height: 1.45em; color-profile: sRGB; rendering-intent: auto; } .cm-s-solarized.cm-s-dark { color: #839496; background-color: #002b36; text-shadow: #002b36 0 1px; } .cm-s-solarized.cm-s-light { background-color: #fdf6e3; color: #657b83; text-shadow: #eee8d5 0 1px; } .cm-s-solarized .CodeMirror-widget { text-shadow: none; } .cm-s-solarized .cm-keyword { color: #cb4b16 } .cm-s-solarized .cm-atom { color: #d33682; } .cm-s-solarized .cm-number { color: #d33682; } .cm-s-solarized .cm-def { color: #2aa198; } .cm-s-solarized .cm-variable { color: #839496; } .cm-s-solarized .cm-variable-2 { color: #b58900; } .cm-s-solarized .cm-variable-3 { color: #6c71c4; } .cm-s-solarized .cm-property { color: #2aa198; } .cm-s-solarized .cm-operator {color: #6c71c4;} .cm-s-solarized .cm-comment { color: #586e75; font-style:italic; } .cm-s-solarized .cm-string { color: #859900; } .cm-s-solarized .cm-string-2 { color: #b58900; } .cm-s-solarized .cm-meta { color: #859900; } .cm-s-solarized .cm-qualifier { color: #b58900; } .cm-s-solarized .cm-builtin { color: #d33682; } .cm-s-solarized .cm-bracket { color: #cb4b16; } .cm-s-solarized .CodeMirror-matchingbracket { color: #859900; } .cm-s-solarized .CodeMirror-nonmatchingbracket { color: #dc322f; } .cm-s-solarized .cm-tag { color: #93a1a1 } .cm-s-solarized .cm-attribute { color: #2aa198; } .cm-s-solarized .cm-header { color: #586e75; } .cm-s-solarized .cm-quote { color: #93a1a1; } .cm-s-solarized .cm-hr { color: transparent; border-top: 1px solid #586e75; display: block; } .cm-s-solarized .cm-link { color: #93a1a1; cursor: pointer; } .cm-s-solarized .cm-special { color: #6c71c4; } .cm-s-solarized .cm-em { color: #999; text-decoration: underline; text-decoration-style: dotted; } .cm-s-solarized .cm-strong { color: #eee; } .cm-s-solarized .cm-error, .cm-s-solarized .cm-invalidchar { color: #586e75; border-bottom: 1px dotted #dc322f; } .cm-s-solarized.cm-s-dark .CodeMirror-selected { background: #073642; } .cm-s-solarized.cm-s-dark.CodeMirror ::selection { background: rgba(7, 54, 66, 0.99); } .cm-s-solarized.cm-s-dark.CodeMirror ::-moz-selection { background: rgba(7, 54, 66, 0.99); } .cm-s-solarized.cm-s-light .CodeMirror-selected { background: #eee8d5; } .cm-s-solarized.cm-s-light.CodeMirror ::selection { background: #eee8d5; } .cm-s-solarized.cm-s-lightCodeMirror ::-moz-selection { background: #eee8d5; } /* Editor styling */ /* Little shadow on the view-port of the buffer view */ .cm-s-solarized.CodeMirror { -moz-box-shadow: inset 7px 0 12px -6px #000; -webkit-box-shadow: inset 7px 0 12px -6px #000; box-shadow: inset 7px 0 12px -6px #000; } /* Gutter border and some shadow from it */ .cm-s-solarized .CodeMirror-gutters { border-right: 1px solid; } /* Gutter colors and line number styling based of color scheme (dark / light) */ /* Dark */ .cm-s-solarized.cm-s-dark .CodeMirror-gutters { background-color: #002b36; border-color: #00232c; } .cm-s-solarized.cm-s-dark .CodeMirror-linenumber { text-shadow: #021014 0 -1px; } /* Light */ .cm-s-solarized.cm-s-light .CodeMirror-gutters { background-color: #fdf6e3; border-color: #eee8d5; } /* Common */ .cm-s-solarized .CodeMirror-linenumber { color: #586e75; padding: 0 5px; } .cm-s-solarized .CodeMirror-guttermarker-subtle { color: #586e75; } .cm-s-solarized.cm-s-dark .CodeMirror-guttermarker { color: #ddd; } .cm-s-solarized.cm-s-light .CodeMirror-guttermarker { color: #cb4b16; } .cm-s-solarized .CodeMirror-gutter .CodeMirror-gutter-text { color: #586e75; } .cm-s-solarized .CodeMirror-lines .CodeMirror-cursor { border-left: 1px solid #819090; } /* Active line. Negative margin compensates left padding of the text in the view-port */ .cm-s-solarized.cm-s-dark .CodeMirror-activeline-background { background: rgba(255, 255, 255, 0.10); } .cm-s-solarized.cm-s-light .CodeMirror-activeline-background { background: rgba(0, 0, 0, 0.10); } ================================================ FILE: base/res/codemirror/theme/the-matrix.css ================================================ .cm-s-the-matrix.CodeMirror { background: #000000; color: #00FF00; } .cm-s-the-matrix div.CodeMirror-selected { background: #2D2D2D !important; } .cm-s-the-matrix.CodeMirror ::selection { background: rgba(45, 45, 45, 0.99); } .cm-s-the-matrix.CodeMirror ::-moz-selection { background: rgba(45, 45, 45, 0.99); } .cm-s-the-matrix .CodeMirror-gutters { background: #060; border-right: 2px solid #00FF00; } .cm-s-the-matrix .CodeMirror-guttermarker { color: #0f0; } .cm-s-the-matrix .CodeMirror-guttermarker-subtle { color: white; } .cm-s-the-matrix .CodeMirror-linenumber { color: #FFFFFF; } .cm-s-the-matrix .CodeMirror-cursor { border-left: 1px solid #00FF00 !important; } .cm-s-the-matrix span.cm-keyword {color: #008803; font-weight: bold;} .cm-s-the-matrix span.cm-atom {color: #3FF;} .cm-s-the-matrix span.cm-number {color: #FFB94F;} .cm-s-the-matrix span.cm-def {color: #99C;} .cm-s-the-matrix span.cm-variable {color: #F6C;} .cm-s-the-matrix span.cm-variable-2 {color: #C6F;} .cm-s-the-matrix span.cm-variable-3 {color: #96F;} .cm-s-the-matrix span.cm-property {color: #62FFA0;} .cm-s-the-matrix span.cm-operator {color: #999} .cm-s-the-matrix span.cm-comment {color: #CCCCCC;} .cm-s-the-matrix span.cm-string {color: #39C;} .cm-s-the-matrix span.cm-meta {color: #C9F;} .cm-s-the-matrix span.cm-qualifier {color: #FFF700;} .cm-s-the-matrix span.cm-builtin {color: #30a;} .cm-s-the-matrix span.cm-bracket {color: #cc7;} .cm-s-the-matrix span.cm-tag {color: #FFBD40;} .cm-s-the-matrix span.cm-attribute {color: #FFF700;} .cm-s-the-matrix span.cm-error {color: #FF0000;} .cm-s-the-matrix .CodeMirror-activeline-background {background: #040;} ================================================ FILE: base/res/codemirror/theme/tomorrow-night-bright.css ================================================ /* Name: Tomorrow Night - Bright Author: Chris Kempson Port done by Gerard Braad */ .cm-s-tomorrow-night-bright.CodeMirror {background: #000000; color: #eaeaea;} .cm-s-tomorrow-night-bright div.CodeMirror-selected {background: #424242 !important;} .cm-s-tomorrow-night-bright .CodeMirror-gutters {background: #000000; border-right: 0px;} .cm-s-tomorrow-night-bright .CodeMirror-guttermarker { color: #e78c45; } .cm-s-tomorrow-night-bright .CodeMirror-guttermarker-subtle { color: #777; } .cm-s-tomorrow-night-bright .CodeMirror-linenumber {color: #424242;} .cm-s-tomorrow-night-bright .CodeMirror-cursor {border-left: 1px solid #6A6A6A !important;} .cm-s-tomorrow-night-bright span.cm-comment {color: #d27b53;} .cm-s-tomorrow-night-bright span.cm-atom {color: #a16a94;} .cm-s-tomorrow-night-bright span.cm-number {color: #a16a94;} .cm-s-tomorrow-night-bright span.cm-property, .cm-s-tomorrow-night-bright span.cm-attribute {color: #99cc99;} .cm-s-tomorrow-night-bright span.cm-keyword {color: #d54e53;} .cm-s-tomorrow-night-bright span.cm-string {color: #e7c547;} .cm-s-tomorrow-night-bright span.cm-variable {color: #b9ca4a;} .cm-s-tomorrow-night-bright span.cm-variable-2 {color: #7aa6da;} .cm-s-tomorrow-night-bright span.cm-def {color: #e78c45;} .cm-s-tomorrow-night-bright span.cm-bracket {color: #eaeaea;} .cm-s-tomorrow-night-bright span.cm-tag {color: #d54e53;} .cm-s-tomorrow-night-bright span.cm-link {color: #a16a94;} .cm-s-tomorrow-night-bright span.cm-error {background: #d54e53; color: #6A6A6A;} .cm-s-tomorrow-night-bright .CodeMirror-activeline-background {background: #2a2a2a !important;} .cm-s-tomorrow-night-bright .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} ================================================ FILE: base/res/codemirror/theme/tomorrow-night-eighties.css ================================================ /* Name: Tomorrow Night - Eighties Author: Chris Kempson CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ .cm-s-tomorrow-night-eighties.CodeMirror {background: #000000; color: #CCCCCC;} .cm-s-tomorrow-night-eighties div.CodeMirror-selected {background: #2D2D2D !important;} .cm-s-tomorrow-night-eighties.CodeMirror ::selection { background: rgba(45, 45, 45, 0.99); } .cm-s-tomorrow-night-eighties.CodeMirror ::-moz-selection { background: rgba(45, 45, 45, 0.99); } .cm-s-tomorrow-night-eighties .CodeMirror-gutters {background: #000000; border-right: 0px;} .cm-s-tomorrow-night-eighties .CodeMirror-guttermarker { color: #f2777a; } .cm-s-tomorrow-night-eighties .CodeMirror-guttermarker-subtle { color: #777; } .cm-s-tomorrow-night-eighties .CodeMirror-linenumber {color: #515151;} .cm-s-tomorrow-night-eighties .CodeMirror-cursor {border-left: 1px solid #6A6A6A !important;} .cm-s-tomorrow-night-eighties span.cm-comment {color: #d27b53;} .cm-s-tomorrow-night-eighties span.cm-atom {color: #a16a94;} .cm-s-tomorrow-night-eighties span.cm-number {color: #a16a94;} .cm-s-tomorrow-night-eighties span.cm-property, .cm-s-tomorrow-night-eighties span.cm-attribute {color: #99cc99;} .cm-s-tomorrow-night-eighties span.cm-keyword {color: #f2777a;} .cm-s-tomorrow-night-eighties span.cm-string {color: #ffcc66;} .cm-s-tomorrow-night-eighties span.cm-variable {color: #99cc99;} .cm-s-tomorrow-night-eighties span.cm-variable-2 {color: #6699cc;} .cm-s-tomorrow-night-eighties span.cm-def {color: #f99157;} .cm-s-tomorrow-night-eighties span.cm-bracket {color: #CCCCCC;} .cm-s-tomorrow-night-eighties span.cm-tag {color: #f2777a;} .cm-s-tomorrow-night-eighties span.cm-link {color: #a16a94;} .cm-s-tomorrow-night-eighties span.cm-error {background: #f2777a; color: #6A6A6A;} .cm-s-tomorrow-night-eighties .CodeMirror-activeline-background {background: #343600 !important;} .cm-s-tomorrow-night-eighties .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} ================================================ FILE: base/res/codemirror/theme/twilight.css ================================================ .cm-s-twilight.CodeMirror { background: #141414; color: #f7f7f7; } /**/ .cm-s-twilight .CodeMirror-selected { background: #323232 !important; } /**/ .cm-s-twilight.CodeMirror ::selection { background: rgba(50, 50, 50, 0.99); } .cm-s-twilight.CodeMirror ::-moz-selection { background: rgba(50, 50, 50, 0.99); } .cm-s-twilight .CodeMirror-gutters { background: #222; border-right: 1px solid #aaa; } .cm-s-twilight .CodeMirror-guttermarker { color: white; } .cm-s-twilight .CodeMirror-guttermarker-subtle { color: #aaa; } .cm-s-twilight .CodeMirror-linenumber { color: #aaa; } .cm-s-twilight .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-twilight .cm-keyword { color: #f9ee98; } /**/ .cm-s-twilight .cm-atom { color: #FC0; } .cm-s-twilight .cm-number { color: #ca7841; } /**/ .cm-s-twilight .cm-def { color: #8DA6CE; } .cm-s-twilight span.cm-variable-2, .cm-s-twilight span.cm-tag { color: #607392; } /**/ .cm-s-twilight span.cm-variable-3, .cm-s-twilight span.cm-def { color: #607392; } /**/ .cm-s-twilight .cm-operator { color: #cda869; } /**/ .cm-s-twilight .cm-comment { color:#777; font-style:italic; font-weight:normal; } /**/ .cm-s-twilight .cm-string { color:#8f9d6a; font-style:italic; } /**/ .cm-s-twilight .cm-string-2 { color:#bd6b18 } /*?*/ .cm-s-twilight .cm-meta { background-color:#141414; color:#f7f7f7; } /*?*/ .cm-s-twilight .cm-builtin { color: #cda869; } /*?*/ .cm-s-twilight .cm-tag { color: #997643; } /**/ .cm-s-twilight .cm-attribute { color: #d6bb6d; } /*?*/ .cm-s-twilight .cm-header { color: #FF6400; } .cm-s-twilight .cm-hr { color: #AEAEAE; } .cm-s-twilight .cm-link { color:#ad9361; font-style:italic; text-decoration:none; } /**/ .cm-s-twilight .cm-error { border-bottom: 1px solid red; } .cm-s-twilight .CodeMirror-activeline-background {background: #27282E !important;} .cm-s-twilight .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;} ================================================ FILE: base/res/codemirror/theme/vibrant-ink.css ================================================ /* Taken from the popular Visual Studio Vibrant Ink Schema */ .cm-s-vibrant-ink.CodeMirror { background: black; color: white; } .cm-s-vibrant-ink .CodeMirror-selected { background: #35493c !important; } .cm-s-vibrant-ink.CodeMirror ::selection { background: rgba(53, 73, 60, 0.99); } .cm-s-vibrant-ink.CodeMirror ::-moz-selection { background: rgba(53, 73, 60, 0.99); } .cm-s-vibrant-ink .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; } .cm-s-vibrant-ink .CodeMirror-guttermarker { color: white; } .cm-s-vibrant-ink .CodeMirror-guttermarker-subtle { color: #d0d0d0; } .cm-s-vibrant-ink .CodeMirror-linenumber { color: #d0d0d0; } .cm-s-vibrant-ink .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-vibrant-ink .cm-keyword { color: #CC7832; } .cm-s-vibrant-ink .cm-atom { color: #FC0; } .cm-s-vibrant-ink .cm-number { color: #FFEE98; } .cm-s-vibrant-ink .cm-def { color: #8DA6CE; } .cm-s-vibrant-ink span.cm-variable-2, .cm-s-vibrant span.cm-tag { color: #FFC66D } .cm-s-vibrant-ink span.cm-variable-3, .cm-s-vibrant span.cm-def { color: #FFC66D } .cm-s-vibrant-ink .cm-operator { color: #888; } .cm-s-vibrant-ink .cm-comment { color: gray; font-weight: bold; } .cm-s-vibrant-ink .cm-string { color: #A5C25C } .cm-s-vibrant-ink .cm-string-2 { color: red } .cm-s-vibrant-ink .cm-meta { color: #D8FA3C; } .cm-s-vibrant-ink .cm-builtin { color: #8DA6CE; } .cm-s-vibrant-ink .cm-tag { color: #8DA6CE; } .cm-s-vibrant-ink .cm-attribute { color: #8DA6CE; } .cm-s-vibrant-ink .cm-header { color: #FF6400; } .cm-s-vibrant-ink .cm-hr { color: #AEAEAE; } .cm-s-vibrant-ink .cm-link { color: blue; } .cm-s-vibrant-ink .cm-error { border-bottom: 1px solid red; } .cm-s-vibrant-ink .CodeMirror-activeline-background {background: #27282E !important;} .cm-s-vibrant-ink .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;} ================================================ FILE: base/res/codemirror/theme/xq-dark.css ================================================ /* Copyright (C) 2011 by MarkLogic Corporation Author: Mike Brevoort Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ .cm-s-xq-dark.CodeMirror { background: #0a001f; color: #f8f8f8; } .cm-s-xq-dark .CodeMirror-selected { background: #27007A !important; } .cm-s-xq-dark.CodeMirror ::selection { background: rgba(39, 0, 122, 0.99); } .cm-s-xq-dark.CodeMirror ::-moz-selection { background: rgba(39, 0, 122, 0.99); } .cm-s-xq-dark .CodeMirror-gutters { background: #0a001f; border-right: 1px solid #aaa; } .cm-s-xq-dark .CodeMirror-guttermarker { color: #FFBD40; } .cm-s-xq-dark .CodeMirror-guttermarker-subtle { color: #f8f8f8; } .cm-s-xq-dark .CodeMirror-linenumber { color: #f8f8f8; } .cm-s-xq-dark .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-xq-dark span.cm-keyword {color: #FFBD40;} .cm-s-xq-dark span.cm-atom {color: #6C8CD5;} .cm-s-xq-dark span.cm-number {color: #164;} .cm-s-xq-dark span.cm-def {color: #FFF; text-decoration:underline;} .cm-s-xq-dark span.cm-variable {color: #FFF;} .cm-s-xq-dark span.cm-variable-2 {color: #EEE;} .cm-s-xq-dark span.cm-variable-3 {color: #DDD;} .cm-s-xq-dark span.cm-property {} .cm-s-xq-dark span.cm-operator {} .cm-s-xq-dark span.cm-comment {color: gray;} .cm-s-xq-dark span.cm-string {color: #9FEE00;} .cm-s-xq-dark span.cm-meta {color: yellow;} .cm-s-xq-dark span.cm-qualifier {color: #FFF700;} .cm-s-xq-dark span.cm-builtin {color: #30a;} .cm-s-xq-dark span.cm-bracket {color: #cc7;} .cm-s-xq-dark span.cm-tag {color: #FFBD40;} .cm-s-xq-dark span.cm-attribute {color: #FFF700;} .cm-s-xq-dark span.cm-error {color: #f00;} .cm-s-xq-dark .CodeMirror-activeline-background {background: #27282E !important;} .cm-s-xq-dark .CodeMirror-matchingbracket {outline:1px solid grey; color:white !important;} ================================================ FILE: base/res/codemirror/theme/xq-light.css ================================================ /* Copyright (C) 2011 by MarkLogic Corporation Author: Mike Brevoort Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ .cm-s-xq-light span.cm-keyword {line-height: 1em; font-weight: bold; color: #5A5CAD; } .cm-s-xq-light span.cm-atom {color: #6C8CD5;} .cm-s-xq-light span.cm-number {color: #164;} .cm-s-xq-light span.cm-def {text-decoration:underline;} .cm-s-xq-light span.cm-variable {color: black; } .cm-s-xq-light span.cm-variable-2 {color:black;} .cm-s-xq-light span.cm-variable-3 {color: black; } .cm-s-xq-light span.cm-property {} .cm-s-xq-light span.cm-operator {} .cm-s-xq-light span.cm-comment {color: #0080FF; font-style: italic;} .cm-s-xq-light span.cm-string {color: red;} .cm-s-xq-light span.cm-meta {color: yellow;} .cm-s-xq-light span.cm-qualifier {color: grey} .cm-s-xq-light span.cm-builtin {color: #7EA656;} .cm-s-xq-light span.cm-bracket {color: #cc7;} .cm-s-xq-light span.cm-tag {color: #3F7F7F;} .cm-s-xq-light span.cm-attribute {color: #7F007F;} .cm-s-xq-light span.cm-error {color: #f00;} .cm-s-xq-light .CodeMirror-activeline-background {background: #e8f2ff !important;} .cm-s-xq-light .CodeMirror-matchingbracket {outline:1px solid grey;color:black !important;background:yellow;} ================================================ FILE: base/res/codemirror/theme/zenburn.css ================================================ /** * " * Using Zenburn color palette from the Emacs Zenburn Theme * https://github.com/bbatsov/zenburn-emacs/blob/master/zenburn-theme.el * * Also using parts of https://github.com/xavi/coderay-lighttable-theme * " * From: https://github.com/wisenomad/zenburn-lighttable-theme/blob/master/zenburn.css */ .cm-s-zenburn .CodeMirror-gutters { background: #3f3f3f !important; } .cm-s-zenburn .CodeMirror-foldgutter-open, .CodeMirror-foldgutter-folded { color: #999; } .cm-s-zenburn .CodeMirror-cursor { border-left: 1px solid white !important; } .cm-s-zenburn { background-color: #3f3f3f; color: #dcdccc; } .cm-s-zenburn span.cm-builtin { color: #dcdccc; font-weight: bold; } .cm-s-zenburn span.cm-comment { color: #7f9f7f; } .cm-s-zenburn span.cm-keyword { color: #f0dfaf; font-weight: bold; } .cm-s-zenburn span.cm-atom { color: #bfebbf; } .cm-s-zenburn span.cm-def { color: #dcdccc; } .cm-s-zenburn span.cm-variable { color: #dfaf8f; } .cm-s-zenburn span.cm-variable-2 { color: #dcdccc; } .cm-s-zenburn span.cm-string { color: #cc9393; } .cm-s-zenburn span.cm-string-2 { color: #cc9393; } .cm-s-zenburn span.cm-number { color: #dcdccc; } .cm-s-zenburn span.cm-tag { color: #93e0e3; } .cm-s-zenburn span.cm-property { color: #dfaf8f; } .cm-s-zenburn span.cm-attribute { color: #dfaf8f; } .cm-s-zenburn span.cm-qualifier { color: #7cb8bb; } .cm-s-zenburn span.cm-meta { color: #f0dfaf; } .cm-s-zenburn span.cm-header { color: #f0efd0; } .cm-s-zenburn span.cm-operator { color: #f0efd0; } .cm-s-zenburn span.CodeMirror-matchingbracket { box-sizing: border-box; background: transparent; border-bottom: 1px solid; } .cm-s-zenburn span.CodeMirror-nonmatchingbracket { border-bottom: 1px solid; background: none; } .cm-s-zenburn .CodeMirror-activeline { background: #000000; } .cm-s-zenburn .CodeMirror-activeline-background { background: #000000; } .cm-s-zenburn .CodeMirror-selected { background: #545454; } .cm-s-zenburn .CodeMirror-focused .CodeMirror-selected { background: #4f4f4f; } ================================================ FILE: base/res/codemirror/themes-list.js ================================================ const kTHEMES = [ "3024-day", "3024-night", "ambiance-mobile", "ambiance", "base16-dark", "base16-light", "blackboard", "cobalt", "colorforth", "eclipse", "elegant", "erlang-dark", "lesser-dark", "liquibyte", "mbo", "mdn-like", "midnight", "monokai", "neat", "neo", "night", "paraiso-dark", "paraiso-light", "pastel-on-dark", "rubyblue", "solarized", "the-matrix", "tomorrow-night-bright", "tomorrow-night-eighties", "twilight", "vibrant-ink", "xq-dark", "xq-light", "zenburn", ]; ================================================ FILE: base/res/csseditor.html ================================================ ================================================ FILE: base/res/html5.html ================================================


    ================================================ FILE: base/res/html_strict.html ================================================


    ================================================ FILE: base/res/html_transitional.html ================================================


    ================================================ FILE: base/res/markdowneditor.html ================================================ ================================================ FILE: base/res/polyglot.xhtml ================================================


    ================================================ FILE: base/res/reset-fonts-grids.css ================================================ /* Copyright (c) 2008, Yahoo! Inc. All rights reserved. Code licensed under the BSD License: http://developer.yahoo.net/yui/license.txt version: 2.6.0 */ html{color:#000;background:#FFF;}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}li{list-style:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym{border:0;font-variant:normal;}sup{vertical-align:text-top;}sub{vertical-align:text-bottom;}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit;}input,textarea,select{*font-size:100%;}legend{color:#000;}del,ins{text-decoration:none;}body{font:13px/1.231 arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}select,input,button,textarea{font:99% arial,helvetica,clean,sans-serif;}table{font-size:inherit;font:100%;}pre,code,kbd,samp,tt{font-family:monospace;*font-size:108%;line-height:100%;}body{text-align:center;}#ft{clear:both;}#doc,#doc2,#doc3,#doc4,.yui-t1,.yui-t2,.yui-t3,.yui-t4,.yui-t5,.yui-t6,.yui-t7{margin:auto;text-align:left;width:57.69em;*width:56.25em;min-width:750px;}#doc2{width:73.076em;*width:71.25em;}#doc3{margin:auto 10px;width:auto;}#doc4{width:74.923em;*width:73.05em;}.yui-b{position:relative;}.yui-b{_position:static;}#yui-main .yui-b{position:static;}#yui-main,.yui-g .yui-u .yui-g{width:100%;}{width:100%;}.yui-t1 #yui-main,.yui-t2 #yui-main,.yui-t3 #yui-main{float:right;margin-left:-25em;}.yui-t4 #yui-main,.yui-t5 #yui-main,.yui-t6 #yui-main{float:left;margin-right:-25em;}.yui-t1 .yui-b{float:left;width:12.30769em;*width:12.00em;}.yui-t1 #yui-main .yui-b{margin-left:13.30769em;*margin-left:13.05em;}.yui-t2 .yui-b{float:left;width:13.8461em;*width:13.50em;}.yui-t2 #yui-main .yui-b{margin-left:14.8461em;*margin-left:14.55em;}.yui-t3 .yui-b{float:left;width:23.0769em;*width:22.50em;}.yui-t3 #yui-main .yui-b{margin-left:24.0769em;*margin-left:23.62em;}.yui-t4 .yui-b{float:right;width:13.8456em;*width:13.50em;}.yui-t4 #yui-main .yui-b{margin-right:14.8456em;*margin-right:14.55em;}.yui-t5 .yui-b{float:right;width:18.4615em;*width:18.00em;}.yui-t5 #yui-main .yui-b{margin-right:19.4615em;*margin-right:19.125em;}.yui-t6 .yui-b{float:right;width:23.0769em;*width:22.50em;}.yui-t6 #yui-main .yui-b{margin-right:24.0769em;*margin-right:23.62em;}.yui-t7 #yui-main .yui-b{display:block;margin:0 0 1em 0;}#yui-main .yui-b{float:none;width:auto;}.yui-gb .yui-u,.yui-g .yui-gb .yui-u,.yui-gb .yui-g,.yui-gb .yui-gb,.yui-gb .yui-gc,.yui-gb .yui-gd,.yui-gb .yui-ge,.yui-gb .yui-gf,.yui-gc .yui-u,.yui-gc .yui-g,.yui-gd .yui-u{float:left;}.yui-g .yui-u,.yui-g .yui-g,.yui-g .yui-gb,.yui-g .yui-gc,.yui-g .yui-gd,.yui-g .yui-ge,.yui-g .yui-gf,.yui-gc .yui-u,.yui-gd .yui-g,.yui-g .yui-gc .yui-u,.yui-ge .yui-u,.yui-ge .yui-g,.yui-gf .yui-g,.yui-gf .yui-u{float:right;}.yui-g div.first,.yui-gb div.first,.yui-gc div.first,.yui-gd div.first,.yui-ge div.first,.yui-gf div.first,.yui-g .yui-gc div.first,.yui-g .yui-ge div.first,.yui-gc div.first div.first{float:left;}.yui-g .yui-u,.yui-g .yui-g,.yui-g .yui-gb,.yui-g .yui-gc,.yui-g .yui-gd,.yui-g .yui-ge,.yui-g .yui-gf{width:49.1%;}.yui-gb .yui-u,.yui-g .yui-gb .yui-u,.yui-gb .yui-g,.yui-gb .yui-gb,.yui-gb .yui-gc,.yui-gb .yui-gd,.yui-gb .yui-ge,.yui-gb .yui-gf,.yui-gc .yui-u,.yui-gc .yui-g,.yui-gd .yui-u{width:32%;margin-left:1.99%;}.yui-gb .yui-u{*margin-left:1.9%;*width:31.9%;}.yui-gc div.first,.yui-gd .yui-u{width:66%;}.yui-gd div.first{width:32%;}.yui-ge div.first,.yui-gf .yui-u{width:74.2%;}.yui-ge .yui-u,.yui-gf div.first{width:24%;}.yui-g .yui-gb div.first,.yui-gb div.first,.yui-gc div.first,.yui-gd div.first{margin-left:0;}.yui-g .yui-g .yui-u,.yui-gb .yui-g .yui-u,.yui-gc .yui-g .yui-u,.yui-gd .yui-g .yui-u,.yui-ge .yui-g .yui-u,.yui-gf .yui-g .yui-u{width:49%;*width:48.1%;*margin-left:0;}.yui-g .yui-g .yui-u{width:48.1%;}.yui-g .yui-gb div.first,.yui-gb .yui-gb div.first{*margin-right:0;*width:32%;_width:31.7%;}.yui-g .yui-gc div.first,.yui-gd .yui-g{width:66%;}.yui-gb .yui-g div.first{*margin-right:4%;_margin-right:1.3%;}.yui-gb .yui-gc div.first,.yui-gb .yui-gd div.first{*margin-right:0;}.yui-gb .yui-gb .yui-u,.yui-gb .yui-gc .yui-u{*margin-left:1.8%;_margin-left:4%;}.yui-g .yui-gb .yui-u{_margin-left:1.0%;}.yui-gb .yui-gd .yui-u{*width:66%;_width:61.2%;}.yui-gb .yui-gd div.first{*width:31%;_width:29.5%;}.yui-g .yui-gc .yui-u,.yui-gb .yui-gc .yui-u{width:32%;_float:right;margin-right:0;_margin-left:0;}.yui-gb .yui-gc div.first{width:66%;*float:left;*margin-left:0;}.yui-gb .yui-ge .yui-u,.yui-gb .yui-gf .yui-u{margin:0;}.yui-gb .yui-gb .yui-u{_margin-left:.7%;}.yui-gb .yui-g div.first,.yui-gb .yui-gb div.first{*margin-left:0;}.yui-gc .yui-g .yui-u,.yui-gd .yui-g .yui-u{*width:48.1%;*margin-left:0;} .yui-gb .yui-gd div.first{width:32%;}.yui-g .yui-gd div.first{_width:29.9%;}.yui-ge .yui-g{width:24%;}.yui-gf .yui-g{width:74.2%;}.yui-gb .yui-ge div.yui-u,.yui-gb .yui-gf div.yui-u{float:right;}.yui-gb .yui-ge div.first,.yui-gb .yui-gf div.first{float:left;}.yui-gb .yui-ge .yui-u,.yui-gb .yui-gf div.first{*width:24%;_width:20%;}.yui-gb .yui-ge div.first,.yui-gb .yui-gf .yui-u{*width:73.5%;_width:65.5%;}.yui-ge div.first .yui-gd .yui-u{width:65%;}.yui-ge div.first .yui-gd div.first{width:32%;}#bd:after,.yui-g:after,.yui-gb:after,.yui-gc:after,.yui-gd:after,.yui-ge:after,.yui-gf:after{content:".";display:block;height:0;clear:both;visibility:hidden;}#bd,.yui-g,.yui-gb,.yui-gc,.yui-gd,.yui-ge,.yui-gf{zoom:1;} ================================================ FILE: base/res/scripteditor.html ================================================ ================================================ FILE: base/res/xhtml11.xhtml ================================================


    ================================================ FILE: base/res/xhtml5.xhtml ================================================


    ================================================ FILE: base/res/xhtml_strict.html ================================================
    ================================================ FILE: base/res/xhtml_strict.xhtml ================================================


    ================================================ FILE: base/res/xhtml_transitional.html ================================================
    '; ================================================ FILE: base/res/xhtml_transitional.xhtml ================================================


    ================================================ FILE: branding/Makefile.in ================================================ # ***** BEGIN LICENSE BLOCK ***** # Version: MPL 1.1/GPL 2.0/LGPL 2.1 # # The contents of this file are subject to the Mozilla Public License Version # 1.1 (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. # # The Original Code is mozilla.org code. # # The Initial Developer of the Original Code is Mozilla Foundation. # Portions created by the Initial Developer are Copyright (C) 2009 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Justin Dolske (original author) # Jared Wein # # Alternatively, the contents of this file may be used under the terms of # either the GNU General Public License Version 2 or later (the "GPL"), or # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), # in which case the provisions of the GPL or the LGPL are applicable instead # of those above. If you wish to allow use of your version of this file only # under the terms of either the GPL or the LGPL, and not to allow others to # use your version of this file under the terms of the MPL, indicate your # decision by deleting the provisions above and replace them with the notice # and other provisions required by the GPL or the LGPL. If you do not delete # the provisions above, a recipient may use your version of this file under # the terms of any one of the MPL, the GPL or the LGPL. # # ***** END LICENSE BLOCK ***** DEPTH = ../.. topsrcdir = @top_srcdir@ srcdir = @srcdir@ VPATH = @srcdir@ include $(DEPTH)/config/autoconf.mk include $(topsrcdir)/config/rules.mk WINDOWS_BRANDING_FILES = \ bluegriffon.ico \ document.ico \ branding.nsi \ wizHeader.bmp \ wizHeaderRTL.bmp \ wizWatermark.bmp \ $(NULL) OSX_BRANDING_FILES = \ background.png \ bluegriffon.icns \ disk.icns \ dsstore \ $(NULL) LINUX_BRANDING_FILES = \ default16.png \ default32.png \ default48.png \ mozicon128.png \ $(NULL) OS2_BRANDING_FILES = \ bluegriffon-os2.ico \ document-os2.ico \ $(NULL) export:: $(NSINSTALL) -D $(DIST)/branding ifeq ($(MOZ_WIDGET_TOOLKIT),windows) cp $(addprefix $(srcdir)/, $(WINDOWS_BRANDING_FILES)) $(DIST)/branding/ endif ifeq ($(MOZ_WIDGET_TOOLKIT),cocoa) cp $(addprefix $(srcdir)/, $(OSX_BRANDING_FILES)) $(DIST)/branding/ endif ifeq ($(MOZ_WIDGET_TOOLKIT),gtk2) cp $(addprefix $(srcdir)/, $(LINUX_BRANDING_FILES)) $(DIST)/branding/ $(NSINSTALL) -D $(DIST)/install endif ifeq ($(OS_ARCH),OS2) cp $(addprefix $(srcdir)/, $(OS2_BRANDING_FILES)) $(DIST)/branding/ endif ================================================ FILE: branding/branding.nsi ================================================ # ***** BEGIN LICENSE BLOCK ***** # Version: MPL 1.1/GPL 2.0/LGPL 2.1 # # The contents of this file are subject to the Mozilla Public License Version # 1.1 (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. # # The Original Code is the Mozilla Installer code. # # The Initial Developer of the Original Code is Mozilla Foundation # Portions created by the Initial Developer are Copyright (C) 2006 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Robert Strong # # Alternatively, the contents of this file may be used under the terms of # either the GNU General Public License Version 2 or later (the "GPL"), or # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), # in which case the provisions of the GPL or the LGPL are applicable instead # of those above. If you wish to allow use of your version of this file only # under the terms of either the GPL or the LGPL, and not to allow others to # use your version of this file under the terms of the MPL, indicate your # decision by deleting the provisions above and replace them with the notice # and other provisions required by the GPL or the LGPL. If you do not delete # the provisions above, a recipient may use your version of this file under # the terms of any one of the MPL, the GPL or the LGPL. # # ***** END LICENSE BLOCK ***** # NSIS branding defines for official release builds. # The nightly build branding.nsi is located in browser/installer/windows/nsis/ # The unofficial build branding.nsi is located in browser/branding/unofficial/ # BrandFullNameInternal is used for some registry and file system values # instead of BrandFullName and typically should not be modified. !define BrandFullNameInternal "BlueGriffon" !define CompanyName "Disruptive Innovation SAS" !define URLInfoAbout "http://www.bluegriffon.org" !define URLUpdateInfo "http://www.bluegriffon.org" ================================================ FILE: branding/configure.sh ================================================ MOZ_APP_DISPLAYNAME=BlueGriffon MOZ_UA_BUILDID=20100101 ================================================ FILE: branding/moz.build ================================================ ================================================ FILE: build.mk ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. installer: @$(MAKE) -C bluegriffon/installer installer package: @$(MAKE) -C bluegriffon/installer package-compare: @$(MAKE) -C bluegriffon/installer package-compare stage-package: @$(MAKE) -C bluegriffon/installer stage-package sdk: @$(MAKE) -C bluegriffon/installer make-sdk install:: @$(MAKE) -C bluegriffon/installer install clean:: @$(MAKE) -C bluegriffon/installer clean distclean:: @$(MAKE) -C bluegriffon/installer distclean source-package:: @$(MAKE) -C bluegriffon/installer source-package upload:: @$(MAKE) -C bluegriffon/installer upload source-upload:: @$(MAKE) -C bluegriffon/installer source-upload hg-bundle:: @$(MAKE) -C bluegriffon/installer hg-bundle l10n-check:: @$(MAKE) -C bluegriffon/locales l10n-check ifdef ENABLE_TESTS # Implemented in testing/testsuite-targets.mk mochitest-bluegriffon-chrome: $(RUN_MOCHITEST) --bluegriffon-chrome $(CHECK_TEST_ERROR) mochitest:: mochitest-bluegriffon-chrome .PHONY: mochitest-bluegriffon-chrome mochitest-metro-chrome: $(RUN_MOCHITEST) --metro-immersive --bluegriffon-chrome $(CHECK_TEST_ERROR) endif ================================================ FILE: components/Makefile.in ================================================ # ***** BEGIN LICENSE BLOCK ***** # Version: MPL 1.1/GPL 2.0/LGPL 2.1 # # The contents of this file are subject to the Mozilla Public License Version # 1.1 (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. # # The Original Code is the Mozilla Browser code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 2002 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Brian Ryner # # Alternatively, the contents of this file may be used under the terms of # either the GNU General Public License Version 2 or later (the "GPL"), or # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), # in which case the provisions of the GPL or the LGPL are applicable instead # of those above. If you wish to allow use of your version of this file only # under the terms of either the GPL or the LGPL, and not to allow others to # use your version of this file under the terms of the MPL, indicate your # decision by deleting the provisions above and replace them with the notice # and other provisions required by the GPL or the LGPL. If you do not delete # the provisions above, a recipient may use your version of this file under # the terms of any one of the MPL, the GPL or the LGPL. # # ***** END LICENSE BLOCK ***** DEPTH = ../.. topsrcdir = @top_srcdir@ srcdir = @srcdir@ VPATH = @srcdir@ include $(DEPTH)/config/autoconf.mk include $(topsrcdir)/config/rules.mk ================================================ FILE: components/bgCharUnicodeAutocomplete.js ================================================ Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); Components.utils.import("resource://gre/modules/unicodeHelper.jsm"); //////////////////////////////////////////////////////////////////////////////// //// Constants const Cc = Components.classes; const Ci = Components.interfaces; const Cr = Components.results; function bgCharUnicodeAutocompleteResult(searchString, searchResult, defaultIndex, errorDescription, results, comments) { this._searchString = searchString; this._searchResult = searchResult; this._defaultIndex = defaultIndex; this._errorDescription = errorDescription; this._results = results; this._comments = comments; } bgCharUnicodeAutocompleteResult.prototype = { _searchString: "", _searchResult: 0, _defaultIndex: 0, _errorDescription: "", _results: [], _comments: [], /** * The original search string */ get searchString() { return this._searchString; }, /** * The result code of this result object, either: * RESULT_IGNORED (invalid searchString) * RESULT_FAILURE (failure) * RESULT_NOMATCH (no matches found) * RESULT_SUCCESS (matches found) */ get searchResult() { return this._searchResult; }, /** * Index of the default item that should be entered if none is selected */ get defaultIndex() { return this._defaultIndex; }, /** * A string describing the cause of a search failure */ get errorDescription() { return this._errorDescription; }, /** * The number of matches */ get matchCount() { return this._results.length; }, /** * Get the value of the result at the given index */ getValueAt: function(index) { return this._results[index]; }, getLabelAt: function(index) { return this._results[index]; }, /** * Get the comment of the result at the given index */ getCommentAt: function(index) { return this._comments[index]; }, /** * Get the style hint for the result at the given index */ getStyleAt: function(index) { if (!this._comments[index]) return null; // not a category label, so no special styling if (index == 0) return "suggestfirst"; // category label on first line of results return "suggesthint"; // category label on any other line of results }, /** * Get the image for the result at the given index * The return value is expected to be an URI to the image to display */ getImageAt : function (index) { return ""; }, /** * Remove the value at the given index from the autocomplete results. * If removeFromDb is set to true, the value should be removed from * persistent storage as well. */ removeValueAt: function(index, removeFromDb) { this._results.splice(index, 1); this._comments.splice(index, 1); }, QueryInterface: function(aIID) { if (!aIID.equals(Ci.nsIAutoCompleteResult) && !aIID.equals(Ci.nsISupports)) throw Components.results.NS_ERROR_NO_INTERFACE; return this; } }; //////////////////////////////////////////////////////////////////////////////// //// bgCharUnicodeAutocomplete function bgCharUnicodeAutocomplete() { } bgCharUnicodeAutocomplete.prototype = { /* * Search for a given string and notify a listener (either synchronously * or asynchronously) of the result * * @param searchString - The string to search for * @param searchParam - An extra parameter * @param previousResult - A previous result to use for faster searchinig * @param listener - A listener to notify when the search is complete */ startSearch: function(searchString, searchParam, result, listener) { // This autocomplete source assumes the developer attached a JSON string // to the the "autocompletesearchparam" attribute or "searchParam" property // of the element. The JSON is converted into an array and used // as the source of match data. Any values that match the search string // are moved into temporary arrays and passed to the AutoCompleteResult var results = []; var comments = []; results = UnicodeUtils.findCharFromName(searchString); var newResult = new bgCharUnicodeAutocompleteResult(searchString, Ci.nsIAutoCompleteResult.RESULT_SUCCESS, 0, "", results, comments); listener.onSearchResult(this, newResult); }, /* * Stop an asynchronous search that is in progress */ stopSearch: function() { }, ////////////////////////////////////////////////////////////////////////////// //// nsISupports classID: Components.ID("0f80c041-f794-4589-9d82-60332a69ca5a"), QueryInterface: XPCOMUtils.generateQI([ Ci.nsIAutoCompleteSearch, Ci.nsISupports ]) }; let components = [bgCharUnicodeAutocomplete]; const NSGetFactory = XPCOMUtils.generateNSGetFactory(components); ================================================ FILE: components/bgCharUnicodeAutocomplete.manifest ================================================ component {0f80c041-f794-4589-9d82-60332a69ca5a} bgCharUnicodeAutocomplete.js contract @mozilla.org/autocomplete/search;1?name=bluegriffoncharunicode-autocomplete {0f80c041-f794-4589-9d82-60332a69ca5a} ================================================ FILE: components/bgCommandHandler.js ================================================ Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); Components.utils.import("resource://gre/modules/Services.jsm"); Components.utils.import("resource://gre/modules/urlHelper.jsm"); const nsISupports = Components.interfaces.nsISupports; const nsICommandLine = Components.interfaces.nsICommandLine; const nsICommandLineHandler = Components.interfaces.nsICommandLineHandler; const nsIContentHandler = Components.interfaces.nsIContentHandler; const nsIDocShellTreeItem = Components.interfaces.nsIDocShellTreeItem; const nsIDOMChromeWindow = Components.interfaces.nsIDOMChromeWindow; const nsIDOMWindow = Components.interfaces.nsIDOMWindow; const nsIFileURL = Components.interfaces.nsIFileURL; const nsIHttpProtocolHandler = Components.interfaces.nsIHttpProtocolHandler; const nsIInterfaceRequestor = Components.interfaces.nsIInterfaceRequestor; const nsINetUtil = Components.interfaces.nsINetUtil; const nsIPrefBranch = Components.interfaces.nsIPrefBranch; const nsIPrefLocalizedString = Components.interfaces.nsIPrefLocalizedString; const nsISupportsString = Components.interfaces.nsISupportsString; const nsIURIFixup = Components.interfaces.nsIURIFixup; const nsIWebNavigation = Components.interfaces.nsIWebNavigation; const nsIWindowMediator = Components.interfaces.nsIWindowMediator; const nsIWindowWatcher = Components.interfaces.nsIWindowWatcher; const nsICategoryManager = Components.interfaces.nsICategoryManager; const nsIWebNavigationInfo = Components.interfaces.nsIWebNavigationInfo; const nsIBrowserSearchService = Components.interfaces.nsIBrowserSearchService; const nsICommandLineValidator = Components.interfaces.nsICommandLineValidator; const nsIXULAppInfo = Components.interfaces.nsIXULAppInfo; const nsIObserver = Components.interfaces.nsIObserver; const NS_BINDING_ABORTED = Components.results.NS_BINDING_ABORTED; const NS_ERROR_WONT_HANDLE_CONTENT = 0x805d0001; const NS_ERROR_ABORT = Components.results.NS_ERROR_ABORT; const URI_INHERITS_SECURITY_CONTEXT = nsIHttpProtocolHandler .URI_INHERITS_SECURITY_CONTEXT; // Flag used to indicate that the arguments to openWindow can be passed directly. const NO_EXTERNAL_URIS = 1; function openWindow(parent, url, target, features, args, noExternalArgs) { var wwatch = Components.classes["@mozilla.org/embedcomp/window-watcher;1"] .getService(nsIWindowWatcher); if (noExternalArgs == NO_EXTERNAL_URIS) { // Just pass in the defaultArgs directly var argstring; if (args) { argstring = Components.classes["@mozilla.org/supports-string;1"] .createInstance(nsISupportsString); argstring.data = args; } return wwatch.openWindow(parent, url, target, features, argstring); } // Pass an array to avoid the browser "|"-splitting behavior. var argArray = Components.classes["@mozilla.org/array;1"] .createInstance(Components.interfaces.nsIMutableArray); // add args to the arguments array var stringArgs = null; if (args instanceof Array) // array stringArgs = args; else if (args) // string stringArgs = [args]; if (stringArgs) { // put the URIs into argArray var uriArray = Components.classes["@mozilla.org/array;1"] .createInstance(Components.interfaces.nsIMutableArray); stringArgs.forEach(function (uri) { var sstring = Components.classes["@mozilla.org/supports-string;1"] .createInstance(nsISupportsString); sstring.data = uri; uriArray.appendElement(sstring); }); argArray.appendElement(uriArray); } else { argArray.appendElement(null); } return wwatch.openWindow(parent, url, target, features, argArray); } function nsBlueGriffonContentHandler() { } nsBlueGriffonContentHandler.prototype = { classID: Components.ID("{207D7161-7548-4BA3-99C9-01AE98C53A32}"), _xpcom_factory: { createInstance: function bch_factory_ci(outer, iid) { if (outer) throw Components.results.NS_ERROR_NO_AGGREGATION; return gBlueGriffonContentHandler.QueryInterface(iid); } }, /* helper functions */ mChromeURL : null, get chromeURL() { if (this.mChromeURL) { return this.mChromeURL; } var prefb = Components.classes["@mozilla.org/preferences-service;1"] .getService(nsIPrefBranch); this.mChromeURL = prefb.getCharPref("browser.chromeURL"); return this.mChromeURL; }, /* nsISupports */ QueryInterface : XPCOMUtils.generateQI([nsICommandLineHandler, nsIContentHandler]), /* nsICommandLineHandler */ handle : function bch_handle(cmdLine) { if (!cmdLine.length) return; var urlArray = []; var url = null; var ar = null; // deal with -file arguments do { var ar = cmdLine.handleFlagWithParam("file", false); if (ar) { cmdLine.preventDefault = true; try { var localFile = UrlUtils.newLocalFile(ar); var ioService = Components.classes["@mozilla.org/network/io-service;1"] .getService(Components.interfaces.nsIIOService); var fileHandler = ioService.getProtocolHandler("file") .QueryInterface(Components.interfaces.nsIFileProtocolHandler); url = fileHandler.getURLSpecFromFile(localFile); urlArray.push(url); } catch(e) {} } } while (ar); do { url = cmdLine.handleFlagWithParam("url", false); if (url) urlArray.push(url); } while(url); #ifndef XP_MACOSX if (cmdLine.length) { for (var i = 0; i < cmdLine.length; i++) { var arg = cmdLine.getArgument(i); if (arg[0] != "-") urlArray.push(arg); } } #endif var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"] .getService(nsIWindowMediator); var e = Services.wm.getEnumerator("bluegriffon"); var mostRecent = null; if (e && e.hasMoreElements()) { mostRecent = e.getNext(); } if (urlArray && urlArray.length) { cmdLine.preventDefault = true; if (mostRecent) { var navNav = mostRecent.QueryInterface(nsIInterfaceRequestor) .getInterface(nsIWebNavigation); var rootItem = navNav.QueryInterface(nsIDocShellTreeItem).rootTreeItem; var rootWin = rootItem.QueryInterface(nsIInterfaceRequestor) .getInterface(nsIDOMWindow); rootWin.OpenFiles(urlArray, true); return; } return openWindow(null, "chrome://bluegriffon/content/xul/bluegriffon.xul", "_blank", "chrome,dialog=no,all", urlArray); } }, helpInfo : "", /* nsIContentHandler */ handleContent : function bch_handleContent(contentType, context, request) { Services.prompt.alert(null, "nsBlueGriffonContentHandler", "handleContent"); } }; function nsDefaultCommandLineHandler() { } nsDefaultCommandLineHandler.prototype = { classID: Components.ID("{87B61700-9D3D-47FE-802D-10F57F30AD9A}"), /* nsISupports */ QueryInterface : function dch_QI(iid) { if (!iid.equals(nsISupports) && !iid.equals(nsICommandLineHandler) && !iid.equals(nsIObserver)) throw Components.results.NS_ERROR_NO_INTERFACE; return this; }, // List of uri's that were passed via the command line without the app // running and have already been handled. This is compared against uri's // opened using DDE on Win32 so we only open one of the requests. _handledURIs: [ ], /* nsICommandLineHandler */ handle : function dch_handle(cmdLine) { if (!cmdLine.length) return; var urlArray = []; var url = null; var ar = null; // deal with -file arguments do { var ar = cmdLine.handleFlagWithParam("file", false); if (ar) { cmdLine.preventDefault = true; try { var localFile = UrlUtils.newLocalFile(ar); var ioService = Components.classes["@mozilla.org/network/io-service;1"] .getService(Components.interfaces.nsIIOService); var fileHandler = ioService.getProtocolHandler("file") .QueryInterface(Components.interfaces.nsIFileProtocolHandler); url = fileHandler.getURLSpecFromFile(localFile); urlArray.push(url); } catch(e) {} } } while (ar); do { url = cmdLine.handleFlagWithParam("url", false); if (url) urlArray.push(url); } while(url); #ifndef XP_MACOSX if (cmdLine.length) { for (var i = 0; i < cmdLine.length; i++) { var arg = cmdLine.getArgument(i); if (arg[0] != "-") urlArray.push(arg); } } #endif var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"] .getService(nsIWindowMediator); var e = Services.wm.getEnumerator("bluegriffon"); var mostRecent = null; if (e && e.hasMoreElements()) { mostRecent = e.getNext(); } if (urlArray && urlArray.length) { cmdLine.preventDefault = true; if (mostRecent) { var navNav = mostRecent.QueryInterface(nsIInterfaceRequestor) .getInterface(nsIWebNavigation); var rootItem = navNav.QueryInterface(nsIDocShellTreeItem).rootTreeItem; var rootWin = rootItem.QueryInterface(nsIInterfaceRequestor) .getInterface(nsIDOMWindow); rootWin.OpenFiles(urlArray, true); return; } return openWindow(null, "chrome://bluegriffon/content/xul/bluegriffon.xul", "_blank", "chrome,dialog=no,all", urlArray); } if (mostRecent) { mostRecent.focus(); return mostRecent; } #ifdef TAGADA var wwatch = Components.classes["@mozilla.org/embedcomp/window-watcher;1"] .getService(nsIWindowWatcher); return wwatch.openWindow(null, this.hiddenChromeURL, "_blank", "chrome,dialog=no,all", cmdLine); #else if (!cmdLine.preventDefault) return openWindow(null, "chrome://bluegriffon/content/xul/bluegriffon.xul", "_blank", "chrome,dialog=no,all", ""); #endif }, #ifdef XP_MACOSX mHiddenChromeURL : null, get hiddenChromeURL() { if (this.mHiddenChromeURL) { return this.mHiddenChromeURL; } var prefb = Components.classes["@mozilla.org/preferences-service;1"] .getService(nsIPrefBranch); this.mHiddenChromeURL = prefb.getCharPref("browser.hiddenWindowChromeURL"); return this.mHiddenChromeURL; }, #endif helpInfo : "" }; var gBlueGriffonContentHandler = new nsBlueGriffonContentHandler(); var components = [nsBlueGriffonContentHandler, nsDefaultCommandLineHandler]; var NSGetFactory = XPCOMUtils.generateNSGetFactory(components); ================================================ FILE: components/bgCommandHandler.manifest ================================================ # bgCommandHandler.js component {207D7161-7548-4BA3-99C9-01AE98C53A32} bgCommandHandler.js contract @disruptive-innovations.com/bluegriffon/clh;1 {207D7161-7548-4BA3-99C9-01AE98C53A32} component {87B61700-9D3D-47FE-802D-10F57F30AD9A} bgCommandHandler.js contract @disruptive-innovations.com/bluegriffon/final-clh;1 {87B61700-9D3D-47FE-802D-10F57F30AD9A} contract @mozilla.org/uriloader/content-handler;1?type=text/html {87B61700-9D3D-47FE-802D-10F57F30AD9A} #contract @mozilla.org/uriloader/content-handler;1?type=text/xml {207D7161-7548-4BA3-99C9-01AE98C53A32} #contract @mozilla.org/uriloader/content-handler;1?type=application/xhtml+xml {207D7161-7548-4BA3-99C9-01AE98C53A32} category command-line-handler m-bluegriffon @disruptive-innovations.com/bluegriffon/clh;1 category command-line-handler y-default @disruptive-innovations.com/bluegriffon/final-clh;1 ================================================ FILE: components/bgLocationAutocomplete.js ================================================ Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); //////////////////////////////////////////////////////////////////////////////// //// Constants const Cc = Components.classes; const Ci = Components.interfaces; const Cr = Components.results; function bgLocationAutocompleteResult(searchString, searchResult, defaultIndex, errorDescription, results, comments) { this._searchString = searchString; this._searchResult = searchResult; this._defaultIndex = defaultIndex; this._errorDescription = errorDescription; this._results = results; this._comments = comments; } bgLocationAutocompleteResult.prototype = { _searchString: "", _searchResult: 0, _defaultIndex: 0, _errorDescription: "", _results: [], _comments: [], /** * The original search string */ get searchString() { return this._searchString; }, /** * The result code of this result object, either: * RESULT_IGNORED (invalid searchString) * RESULT_FAILURE (failure) * RESULT_NOMATCH (no matches found) * RESULT_SUCCESS (matches found) */ get searchResult() { return this._searchResult; }, /** * Index of the default item that should be entered if none is selected */ get defaultIndex() { return this._defaultIndex; }, /** * A string describing the cause of a search failure */ get errorDescription() { return this._errorDescription; }, /** * The number of matches */ get matchCount() { return this._results.length; }, /** * Get the value of the result at the given index */ getValueAt: function(index) { return this._results[index]; }, getLabelAt: function(index) { return this._results[index]; }, /** * Get the comment of the result at the given index */ getCommentAt: function(index) { return this._comments[index]; }, /** * Get the style hint for the result at the given index */ getStyleAt: function(index) { if (!this._comments[index]) return null; // not a category label, so no special styling if (index == 0) return "suggestfirst"; // category label on first line of results return "suggesthint"; // category label on any other line of results }, /** * Get the image for the result at the given index * The return value is expected to be an URI to the image to display */ getImageAt : function (index) { return ""; }, /** * Remove the value at the given index from the autocomplete results. * If removeFromDb is set to true, the value should be removed from * persistent storage as well. */ removeValueAt: function(index, removeFromDb) { this._results.splice(index, 1); this._comments.splice(index, 1); }, QueryInterface: function(aIID) { if (!aIID.equals(Ci.nsIAutoCompleteResult) && !aIID.equals(Ci.nsISupports)) throw Components.results.NS_ERROR_NO_INTERFACE; return this; } }; //////////////////////////////////////////////////////////////////////////////// //// bgLocationAutocomplete function bgLocationAutocomplete() { } bgLocationAutocomplete.prototype = { /* * Search for a given string and notify a listener (either synchronously * or asynchronously) of the result * * @param searchString - The string to search for * @param searchParam - An extra parameter * @param previousResult - A previous result to use for faster searchinig * @param listener - A listener to notify when the search is complete */ startSearch: function(searchString, searchParam, result, listener) { // This autocomplete source assumes the developer attached a JSON string // to the the "autocompletesearchparam" attribute or "searchParam" property // of the element. The JSON is converted into an array and used // as the source of match data. Any values that match the search string // are moved into temporary arrays and passed to the AutoCompleteResult var results = []; var comments = []; var file = Components.classes["@mozilla.org/file/directory_service;1"] .getService(Components.interfaces.nsIProperties) .get("ProfD", Components.interfaces.nsIFile); file.append("bgLocations.sqlite"); var storageService = Components.classes["@mozilla.org/storage/service;1"] .getService(Components.interfaces.mozIStorageService); var dbConn = storageService.openDatabase(file); var statement = dbConn.createStatement("SELECT * FROM bgLocations WHERE query LIKE '%" + searchString + "%'"); while (statement.executeStep()) { var value = statement.getUTF8String(1); results.push(value); comments.push(null); } statement.finalize(); dbConn.close(); var newResult = new bgLocationAutocompleteResult(searchString, Ci.nsIAutoCompleteResult.RESULT_SUCCESS, 0, "", results, comments); listener.onSearchResult(this, newResult); }, /* * Stop an asynchronous search that is in progress */ stopSearch: function() { }, ////////////////////////////////////////////////////////////////////////////// //// nsISupports classID: Components.ID("D96C4CF7-DEEB-4C61-8C39-789A97B49546"), QueryInterface: XPCOMUtils.generateQI([ Ci.nsIAutoCompleteSearch, Ci.nsISupports ]) }; let components = [bgLocationAutocomplete]; const NSGetFactory = XPCOMUtils.generateNSGetFactory(components); ================================================ FILE: components/bgLocationAutocomplete.manifest ================================================ component {D96C4CF7-DEEB-4C61-8C39-789A97B49546} bgLocationAutocomplete.js contract @mozilla.org/autocomplete/search;1?name=bluegriffonlocation-autocomplete {D96C4CF7-DEEB-4C61-8C39-789A97B49546} ================================================ FILE: components/devtools/content/dbg-messenger-overlay.js ================================================ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ Components.utils.import("resource://gre/modules/Services.jsm"); Components.utils.import("resource://gre/modules/RemoteDebuggerServer.jsm"); /** * Handler to call when the checked state of the menuitem is toggled. Sets the * remote-enabled preference of the debugger and starts the debugger if needed. */ function toggleDebugger() { let shouldEnable = document.getElementById("devtoolsDebugger").getAttribute("checked") == "true"; Services.prefs.setBoolPref("devtools.debugger.remote-enabled", shouldEnable); RemoteDebuggerServer.extraInit = function(DebuggerServer) { DebuggerServer.registerModule("resource://gre/modules/XULRootActor.js"); }; RemoteDebuggerServer.startstop(shouldEnable); } /** * Intialize the checked state, to be used when the view menu is opened. */ function initDebuggerToolsMenu() { let debuggerEnabled = Services.prefs.getBoolPref("devtools.debugger.remote-enabled"); document.getElementById("devtoolsDebugger") .setAttribute("checked", debuggerEnabled); } /** * Intialize everything needed on load in the window for the debugger, i.e * menuitem checked state listeners. */ function loadDebugger() { window.removeEventListener("load", loadDebugger, false); let viewPopup = document.getElementById("toolsPopup"); viewPopup.addEventListener("popupshowing", initDebuggerToolsMenu, false); // Call these functions once to start or stop the debugger on startup. initDebuggerToolsMenu(); toggleDebugger(); } /** * Shutdown everything needed on load in the window for the debugger, i.e * menuitem checked state listeners. */ function unloadDebugger() { window.removeEventListener("unload", unloadDebugger, false); let viewPopup = document.getElementById("toolsPopup"); viewPopup.removeEventListener("popupshowing", initDebuggerToolsMenu, false); } // Load and unload the debugger when the window loads/unloads. window.addEventListener("load", loadDebugger, false); window.addEventListener("unload", unloadDebugger, false); ================================================ FILE: components/devtools/content/dbg-messenger-overlay.xul ================================================ ================================================ FILE: extensions/gfd/install.rdf ================================================ gfd@bluegriffon.com 3.2 bluegriffon@bluegriffon.com 3.2 * Google Font Directory Manager Google Font Directory Manager for BlueGriffon Disruptive Innovations SARL http://www.disruptive-innovations.com/ chrome://gfd/skin/gfd-icon.png ================================================ FILE: extensions/gfd/jar.mn ================================================ ================================================ FILE: extensions/gfd/jar.mn.in ================================================ gfd.jar: % content gfd %content/gfd/ % skin gfd classic/1.0 %skin/classic/gfd/ % overlay chrome://bluegriffon/content/xul/bluegriffon.xul chrome://gfd/content/gfdOverlay.xul content/gfd/gfdOverlay.xul (content/gfdOverlay.xul) content/gfd/gfdOverlay.js (content/gfdOverlay.js) skin/classic/gfd/gfd-icon.png (skin/gfd-icon.png) skin/classic/gfd/viewfont.png (skin/viewfont.png) skin/classic/gfd/viewfont-disabled.png (skin/viewfont-disabled.png) skin/classic/gfd/gfd.css (skin/gfd.css) content/gfd/gfd.xul (content/gfd.xul) content/gfd/gfd.js (content/gfd.js) content/gfd/addFont.xul (content/addFont.xul) content/gfd/addFont.js (content/addFont.js) content/gfd/preview.html (content/preview.html) content/gfd/directory.js (content/directory.js) ================================================ FILE: extensions/gfd/moz.build ================================================ JAR_MANIFESTS += ['jar.mn'] ================================================ FILE: extensions/gfd/skin/gfd.css ================================================ #mainBox { padding: 4px; } #installedFontsTree { margin: 0px; } .listboxBgViewButton { list-style-image: url("chrome://gfd/skin/viewfont.png"); } .listboxBgViewButton[disabled="true"] { list-style-image: url("chrome://gfd/skin/viewfont-disabled.png"); } ================================================ FILE: extensions/inspector/.hg/branch ================================================ default ================================================ FILE: extensions/inspector/.hg/cache/branch2-served ================================================ 72f8358aa3f014e04e055d03902661352d7a550f 1900 af02c1b03548218f58be6cbb7a63fbe221bc3904 o COMM19110_20100510_RELBRANCH c9e4537a0d331cf768655fafffd9ce07c4dc139d o COMM19112_20101005_RELBRANCH abefda3475f6992a15bd1d58898e6175ca9a855e o COMM19115_20101027_RELBRANCH ce4417f516866f7e39a920ddfe5b3cd8d9ea8939 o COMM19116_20101125_RELBRANCH 52319d93a0d7c3698ef8547fc9ebb4f1d68c2560 o COMM1911_20090717_RELBRANCH ca54ba4a4c5ebb309dc309c5c44dd7491798f84d o COMM1911_20090810_RELBRANCH c1a2361796e4b0d599c5ef6379cc3a0ab1526cfd o COMM1913_20090903_RELBRANCH df82fcfd3d3eaf91573ef40ad3c310cfc2200336 o COMM1913_20090915_RELBRANCH 56d158456ca5c5da11804da5e597e2ef99b72765 o COMM1914_20091007_RELBRANCH e018fe46613bb794872ba4506529540c1d33432d o COMM1914_20091014_RELBRANCH 1add1fb90b86c66db4a2c90a69f386f344d3aaf3 o COMM1915_20091112_RELBRANCH c0bb57aca4036dc89a32edbef7e70b09559709ee o COMM1915_20091125_RELBRANCH 4d11ac1c5728028115fc50b51923e008831b287f o COMM1917_20100111_RELBRANCH 4c59577d73c9d76a9c75f51d7bf951ad84e1e12d o COMM1918_20100216_RELBRANCH c47f1a0c9f0779d0889b1eef1c6c7ad674416b97 o COMM1918_20100227_RELBRANCH e05bafbc2ba34d4faebd49265f94427942d49f37 o COMM1919_20100317_RELBRANCH 84a53b43f7ac29bd8ae7cc5aa448a7cfa6b3a2da o COMM1922_20100302_RELBRANCH 50f5b4f490fc95b94f648dae66044700d2d7fe52 o COMM1924_20100519_RELBRANCH b2dbc1d6a2439fd87ea427948773b5a4c1b73ee1 o COMM1925_20100422_RELBRANCH 2b0271f126be55b79b7993e28f2cc58644d2db45 o COMM1925_20100427_RELBRANCH b66f2b22c359b19cdf9db0fbb152eeff4528e10c o COMM1929_20100825_RELBRANCH 13f58aae299bd5105a4ec4d3f0ef5470adcfdbfb o COMM1929_20100910_RELBRANCH 6a0860a61e8677b45145806c3e3df206c65e4003 o COMM192_20100119_RELBRANCH fbcc2945b56ad45ca7cb9678d38a22d50e305161 o COMM193a4_20100510_RELBRANCH 072d68fc460af8702b3688dc8e7591dd0e447109 o COMM193a5_20100623_RELBRANCH cd79d165e943fa648b08b88d808737f5173e7de5 o COMM2000_20101116_RELBRANCH 207fc2dc642a6ff001bf8ff4bc799c91c77fbf90 o COMM2000_20110114_RELBRANCH af53b4c1f03ad5ac6e48da04f67b8a724d745b49 o COMM2000_20110314_RELBRANCH e26b22659ad72d2c549211fd48f7384f7d9e66cd o COMM201_20110508_RELBRANCH 912ce69f15dd7d83fe49323bfd80689bd5feb316 o COMM20_20110405_RELBRANCH a277953209fa3b18ae9fcb1fe9992021436b3312 o COMM20b11_20110203_RELBRANCH 60e8afdcd7212c39dfdd46f60e21dc30930e5bfe o COMM20b4_20100815_RELBRANCH 313bc6e0d535098f0d8401f775f49d1a1d23d635 o COMM20b7_20101007_RELBRANCH eca14d5f8909cf722878e8ea481cd5aec20a8627 o COMM50_20110618_RELBRANCH 3344dc79c1a4b31ce707352c0ea366976bd0fc33 o COMM50_20110626_RELBRANCH 826ae77ce8c6b9e369717c1b9848b4e5aadc2157 o COMM50_20110701_RELBRANCH 369baf38fb4d7a11f95a857e5e169a0558a7f513 o COMM50_20110703_RELBRANCH d43fc625d4c2a8555831ee584c204f98b690d81e o COMM_1_9_1_BRANCH dcf0328fbc990ced4ab609046ad304602d5bef8b o COMM_1_9_2_BRANCH f6cba594d29efded8f4ad0d8af4e681d45c41120 o DOMI_2_0_10 0fe509831e05820269f4ff507f7f96c35938ed90 o DOMI_2_0_12 6b3f49ccd9c56497b3a28d983295aaa70e82cfd1 o DOMI_2_0_13 c11db2f5fbd80846b7dfeea4d91dd442c7a8f844 o DOMI_2_0_14 cd680af92d327dac37c0cf615703aadf3a9c076b o DOMI_2_0_15 dab848bd7bbb56b8002f1ea763aab0e70925e546 o SEA2_19_RELBRANCH 505c9c8dbd462fa412cc9a2d21242e0efa14590d o SEA2_20_RELBRANCH 5efb3fff4fb1974aa9ae44e294c0da3efb9eb244 o SEA2_21_RELBRANCH 7ddb34efb6379744f123f9fd866e8326d47b2ec2 o SEA2_24_RELBRANCH 1c6b874b1fd9956c7081e00c08c14df54ad1e529 o SEA2_25_RELBRANCH f2c4c9da8d1ee5c707aed532a67700aafe61eab2 c SEA2_26_RELBRANCH 5c41e927a8a716624cd5ccdd6433535105f6ee55 o SEA_2_37_FIX_RELBRANCH 6118698c0a1c00818d7838b6b93421522c55df8c o SEA_COMM130_20120604_RELBRANCH 23224e84f9d7b782c39174c617b2e8e92f67d5f4 o SEA_COMM130_20120614_RELBRANCH 267fad3527fe1587061a35eabc76608d6b7f4575 o SEA_COMM140_20120607_RELBRANCH b77e168ce3c52736ed9fb30b7da78eeb4dfa7f47 o SEA_COMM140_20120612_RELBRANCH 57c43603f6e30172a43938a6941f880c116bfec5 o SEA_COMM140_20120621_RELBRANCH b7809dff8ab6f6cc6cf1c9756edfb8fe3c550a31 o SEA_COMM140_20120629_RELBRANCH 016d773aa1fcbce768147a5887a55fbfa6e37710 o SEA_COMM280_20140210_RELBRANCH 47eaeb9a5dd8dd924f5851a6837c2fa3dd58be84 o SEA_COMM280_20140227_RELBRANCH 9d3f3d1ab00f5aa4dfbe4aeb3911bfdfa65f7bed o SEA_COMM280_20140303_RELBRANCH aa766ceb6afa37339a27f718dedcfc67dfd447d1 o SEA_COMM280_20140304_RELBRANCH 58c726ae3271a46341bd260b101bc1960e9c2d97 o SEA_COMM280_20140313_RELBRANCH 36a3dd782a19164fe6b96d4309f51685251bcb0e o SEA_COMM280_20140318_RELBRANCH 28a4f7c9c4f6ddb79cc6d4afedfa6811b468cdfe o SEA_COMM290_20140407_RELBRANCH e43f7b9c04450b836b62f3dae65729ca8c785650 o SEA_COMM290_20140415_RELBRANCH 444b590ba0117c450d971dcafe43c8279ba4f61c o SEA_COMM290_20140428_RELBRANCH e480502cde13ae03121473f6096ca892fefc6603 o SEA_COMM290_20140612_RELBRANCH 91fcd1064bc90aaa977cf3f54a44df30ad97a720 o SEA_COMM3203_20140923_RELBRANCH 922443c3bc702f06645db6408ffc199ce6eddb99 o SEA_COMM320_20140820_RELBRANCH 6d2624362ccebdb5cc4218816189e4b1b07778bb o SEA_COMM320_20140829_RELBRANCH a6ac0fe2f1461e328d2f24afe356ad5cfc9c8484 o SEA_COMM320_20140904_RELBRANCH 8f6f1a05d08b2e2c28838967d37ad68d71934e1f o SEA_COMM330_20141002_RELBRANCH 55a3eeace1bce0d09c4490fed39a895d99466c7a o SEA_COMM330_20141009_RELBRANCH 3d17136c65b0b60ade3a75fcdc799649d1ff5569 o SEA_COMM330_20141013_RELBRANCH 2378eff3dd89a03fdb6663440181c27476530301 o SEA_COMM340_20141020_RELBRANCH e7877b234caef3b35b7471df3e2a4717998f5110 o SEA_COMM340_20141125_RELBRANCH 8ec0655f4f8396c53caa41721a24885804b017e6 o SEA_COMM340_20141202_RELBRANCH c58a44f6d474aea1cae2c4378838d1cd831ca390 o SEA_COMM3501_20150204_RELBRANCH 791ec79d4b5ec4f23a6ffbee399d3406a133ea57 o SEA_COMM350_20141211_RELBRANCH 2b8afb0c684e94a25a1ff0eec5e127d7d4087fc2 o SEA_COMM350_20141218_RELBRANCH 6487a795913cd98a310a3094438629ce8c1d9937 o SEA_COMM350_20150101_RELBRANCH 1b2f1c18a0662a29ae37c3faea9004fec11d308d o SEA_COMM350_20150112_RELBRANCH 1e20f7ad797c412f548129da7f84d36eb383e525 o SEA_COMM3601_20150321_RELBRANCH a25c41b2a79aecbae113389a8ba44d5a4ba21921 c SEA_COMM360_20150215_RELBRANCH 54f6faaa3f568778d3aca48dda370964a05f6d62 o SEA_COMM360_20150308_RELBRANCH ac4b72684e02beb37d73e47b8a066cc22fd618b5 o SEA_COMM3820_20150821_RELBRANCH 13a3432c6181b952867b3115b85b774f551d5541 o SEA_COMM410_20150903_RELBRANCH 59d606270c269f5b0027a75bc12415c24392daca o SEA_COMM410_20150923_RELBRANCH e2dfe3cf4527407751c0f951a6850cbc41ca5fff o SEA_COMM420_20151028_RELBRANCH fadb7496639a36935d6f9dea59a2745531fbdc3e o SEA_COMM420_20151103_RELBRANCH d8a795b4aa700832c01008c23b187b3fdeb0492c o SEA_COMM430_20151217_RELBRANCH 402c204e2bfb5597c10adf68b630f9f1123226d6 o SEA_COMM430_20151219_RELBRANCH 72f8358aa3f014e04e055d03902661352d7a550f o SEA_COMM430_20160106_RELBRANCH 373456fdb34b05885d341218c9991052e2e7601a c default 31a08ac2b9a055e938db4d5f8ae414c7e04960ed c default 26a171aa468cadad6c0a8dd3b02e2ed4badbea13 o default ================================================ FILE: extensions/inspector/.hg/cache/tags ================================================ 1900 72f8358aa3f014e04e055d03902661352d7a550f 57d1ce956e47a9ab11990d1027b38fa2e0ddf50a 1892 402c204e2bfb5597c10adf68b630f9f1123226d6 3bd921e81185994247b4258aa7197b16bdf6d80b 1890 d8a795b4aa700832c01008c23b187b3fdeb0492c a5f9d46caa8036b3fcfc997d4bfeee61dbca1e5b 1888 26a171aa468cadad6c0a8dd3b02e2ed4badbea13 c6469600ecfc2c7b2231c504253b4f50a00ac874 1883 fadb7496639a36935d6f9dea59a2745531fbdc3e 8fe36cf1baecd963c90f16dd0d346d4040c1a295 1881 e2dfe3cf4527407751c0f951a6850cbc41ca5fff 68fc82f62da660a698018b4575bb94075337f0a7 1879 59d606270c269f5b0027a75bc12415c24392daca 7889f3c506f451a02bdea10fedf3624647391471 1877 5c41e927a8a716624cd5ccdd6433535105f6ee55 c52ea237747c44ad6728aa513d945c7209e6fe66 1876 cd680af92d327dac37c0cf615703aadf3a9c076b deaa59a74f510538164184699e20050a4fa6087f 1867 13a3432c6181b952867b3115b85b774f551d5541 486587cb2ee91b0484c41d56c260df59dcf0d7c4 1863 ac4b72684e02beb37d73e47b8a066cc22fd618b5 d510388daee3da334e80c005ca7da4a8c9fec8e0 1837 1e20f7ad797c412f548129da7f84d36eb383e525 a3ecef689bd5d2fcbe74ed9e2ccca06dd8ba01d5 1835 54f6faaa3f568778d3aca48dda370964a05f6d62 2d4732f1372fcf1f913f5c826438f97d82365f61 1827 a25c41b2a79aecbae113389a8ba44d5a4ba21921 5fac4eae6c4384ff24ef9ddf5e49cc7c9bd3e72b 1822 c58a44f6d474aea1cae2c4378838d1cd831ca390 9ad6d9fbd5a6280504a97bd2d4423b048d7ba032 1818 1b2f1c18a0662a29ae37c3faea9004fec11d308d 54cb26d8da12ce4865392c12e988d98ce08eb783 1816 6487a795913cd98a310a3094438629ce8c1d9937 a6fe7d8ff1100b99a8a66e9ab30777ae01cac616 1814 2b8afb0c684e94a25a1ff0eec5e127d7d4087fc2 e9c12a26b81f50a5a7488f8b07b0fa60c5980c95 1811 791ec79d4b5ec4f23a6ffbee399d3406a133ea57 1d3eb221a1d59fc85ec21380f6dc6c0cb1e2a409 1801 31a08ac2b9a055e938db4d5f8ae414c7e04960ed 8d076a6a28e04e3bdf70e69174d5c56663d17c67 1800 373456fdb34b05885d341218c9991052e2e7601a 96844c14981920682fbbfa2e52f6203592505fd9 1797 8ec0655f4f8396c53caa41721a24885804b017e6 eefaa35ea3f6378844c0ac7c14567208d17d40fb 1795 e7877b234caef3b35b7471df3e2a4717998f5110 aafbd00d11ec08622c0dfd482a513d7dba62b1ce 1793 2378eff3dd89a03fdb6663440181c27476530301 493d9efc3cea6c6c21727ebb762bdfac83aa86f3 1791 016d773aa1fcbce768147a5887a55fbfa6e37710 3f588925574f1fe5ecc9286ab9e67bfe52b94ca1 1789 3d17136c65b0b60ade3a75fcdc799649d1ff5569 e82afcb2a5440c6cb4c63b4af14e942dd678db03 1787 55a3eeace1bce0d09c4490fed39a895d99466c7a 1816a039c7e8b6960d2b5e3023045a9e3ba2c2c8 1785 8f6f1a05d08b2e2c28838967d37ad68d71934e1f fc32ab1a21120bd747a30eba7738b887402630d5 1783 91fcd1064bc90aaa977cf3f54a44df30ad97a720 6fbd8ce9a9cb8d7ea62b82def1253098561b637d 1781 a6ac0fe2f1461e328d2f24afe356ad5cfc9c8484 0afeab683cce84a5490d3039c9c292b495d74f23 1779 6d2624362ccebdb5cc4218816189e4b1b07778bb 60b916f52e7700f09f1a11fd89e73b10e40508b4 1777 922443c3bc702f06645db6408ffc199ce6eddb99 1196aa4830270a02a86778a1aa59817b545fbf03 1761 e480502cde13ae03121473f6096ca892fefc6603 3528520d09c58190c571e86ebd226d115731fd6b 1758 444b590ba0117c450d971dcafe43c8279ba4f61c 9136eeb6bab2c850359b45eec91e618ba4d1fe24 1746 e43f7b9c04450b836b62f3dae65729ca8c785650 3da088b817f6c14e3d27d71f0e1db2f1be16ca1a 1744 28a4f7c9c4f6ddb79cc6d4afedfa6811b468cdfe 29ac3d652bbe27ba4ea984d1bdcda7b7c9d55518 1740 36a3dd782a19164fe6b96d4309f51685251bcb0e 47a9571f5146d3b70007c30265540370441b0cf0 1738 58c726ae3271a46341bd260b101bc1960e9c2d97 a3aa105f17995615389fc3fee9322359f9c88073 1736 aa766ceb6afa37339a27f718dedcfc67dfd447d1 11c16a7887fba86b95047d61bbb143b64bd25979 1734 9d3f3d1ab00f5aa4dfbe4aeb3911bfdfa65f7bed 11c16a7887fba86b95047d61bbb143b64bd25979 1732 47eaeb9a5dd8dd924f5851a6837c2fa3dd58be84 4c72e03e4b8b14b1357a542d9750b1263992b5ed 1722 7ddb34efb6379744f123f9fd866e8326d47b2ec2 b3304d99fdfdc127f521d7aeb6c1cdf97b4b1968 1713 5efb3fff4fb1974aa9ae44e294c0da3efb9eb244 982203851559b9d1e3c7f20ecb9ca0cb08894c1a 1687 505c9c8dbd462fa412cc9a2d21242e0efa14590d 9bc8e6d7ad50c539c93280a80b6b445130258f4f 1665 6b3f49ccd9c56497b3a28d983295aaa70e82cfd1 41f413f76d112c6c8ce18c7b08313b511a887dfb 1655 c11db2f5fbd80846b7dfeea4d91dd442c7a8f844 9e026b08588cf6e5b98d57756d17aec3fac72a12 1492 0fe509831e05820269f4ff507f7f96c35938ed90 17d208d1dc1499398ea6de430804121533c34368 1479 b7809dff8ab6f6cc6cf1c9756edfb8fe3c550a31 396f14a128a0cba3444aab160e8733859aa27dd1 1473 57c43603f6e30172a43938a6941f880c116bfec5 a6c15ce5b0487f6d6f4f4ea964114cb4c6655246 1469 23224e84f9d7b782c39174c617b2e8e92f67d5f4 c771fd09caac63008082fb72f11a287a2b2da055 1463 b77e168ce3c52736ed9fb30b7da78eeb4dfa7f47 a47c7687b5e4554f06e8cbd25943de56c6590b95 1461 267fad3527fe1587061a35eabc76608d6b7f4575 f21c1a9f6f37ad9353f9d3fbd573fad172aca2ca 1458 6118698c0a1c00818d7838b6b93421522c55df8c fb9263e0245ff1095fdedb87b8eaf67747aff8e6 1451 f6cba594d29efded8f4ad0d8af4e681d45c41120 bc59d391bb224cf13517d1cc49646a0935111aae 1349 13f58aae299bd5105a4ec4d3f0ef5470adcfdbfb d9ff72c94fdb84365fa21bd72237fc2aeec1b7bc 1206 369baf38fb4d7a11f95a857e5e169a0558a7f513 fa2cd11164fea3b03f06e81839a80143da739568 1199 826ae77ce8c6b9e369717c1b9848b4e5aadc2157 8acc605544c1289ba8b813c47e19a7ad81be4f3e 1195 3344dc79c1a4b31ce707352c0ea366976bd0fc33 94d1cbea17074926f88241f41d9fbccc9526846a 1191 eca14d5f8909cf722878e8ea481cd5aec20a8627 acbc9eba0f30a0b6d5d93c37ba8f4a45489f3d25 1173 e26b22659ad72d2c549211fd48f7384f7d9e66cd 3367ea968ab6e0282c6516742dac498a97d5b377 1142 d43fc625d4c2a8555831ee584c204f98b690d81e da1cd0cfec4e4eb2a26f89465cb4da654cce2e72 1134 912ce69f15dd7d83fe49323bfd80689bd5feb316 c579291e56ae6ed8673053d1a3bb8e92b054dec6 1121 af53b4c1f03ad5ac6e48da04f67b8a724d745b49 9965d9f94f114e995462c825214378c69f990825 1109 a277953209fa3b18ae9fcb1fe9992021436b3312 cf00969ee80bfb9d5f02e8616d7878725d1fd85a 1095 207fc2dc642a6ff001bf8ff4bc799c91c77fbf90 c812413cdb311a4d98bdb2ec8ae2d5f581410aa3 1069 ce4417f516866f7e39a920ddfe5b3cd8d9ea8939 e3b13e3ce67c807e7a64b3fc674cae2d58b806c2 1063 cd79d165e943fa648b08b88d808737f5173e7de5 4a54bf7105622c23837d4b286019a53841ca2029 1047 abefda3475f6992a15bd1d58898e6175ca9a855e 83eec1b32e18447c160d48cd2eedba95db9c4a7e 1012 313bc6e0d535098f0d8401f775f49d1a1d23d635 59c7cc6a4c13bc1a30612e655f3de34782317510 1007 c9e4537a0d331cf768655fafffd9ce07c4dc139d 564a6fb43fcddbe1df6e7efc6d58ce8a402923f0 994 af02c1b03548218f58be6cbb7a63fbe221bc3904 16587a05ffac2566edbc0026560567fe3c4203c6 981 b66f2b22c359b19cdf9db0fbb152eeff4528e10c 7fb0b87747a0c2a5244446addf95101d259ba134 973 60e8afdcd7212c39dfdd46f60e21dc30930e5bfe c8df35aa95e9e1a8b4a44173ea0ec602a6737e7f 958 50f5b4f490fc95b94f648dae66044700d2d7fe52 4f3f8d3938580f1efa9de698ddbe2bf7910ec838 930 072d68fc460af8702b3688dc8e7591dd0e447109 a9cdbe17d431114bd4b19956dc35c2a1ff77bff0 888 dcf0328fbc990ced4ab609046ad304602d5bef8b c795ae872ec240161a62c034a232aef062d59b88 876 fbcc2945b56ad45ca7cb9678d38a22d50e305161 91b32ee73febc1ba08a24452f5909e7ec00f24b5 871 2b0271f126be55b79b7993e28f2cc58644d2db45 739c2ea130a47747d4870fed23c044f43f3d7a5f 865 b2dbc1d6a2439fd87ea427948773b5a4c1b73ee1 ae2be28daf0918c6d551c6fcb69bcf3a1dedaf03 859 e05bafbc2ba34d4faebd49265f94427942d49f37 44d979d6e6c8c7d8c82fa074d895bd9ef18edaf7 851 84a53b43f7ac29bd8ae7cc5aa448a7cfa6b3a2da b82f678388f6e5bb827f7a7db5334bf71406a44f 849 4c59577d73c9d76a9c75f51d7bf951ad84e1e12d b28c8d34351f6fb470be10c97c29593ca5565a36 847 c47f1a0c9f0779d0889b1eef1c6c7ad674416b97 eb12b12079ef61794f3afffa70ed13e67641c459 845 6a0860a61e8677b45145806c3e3df206c65e4003 fd37bca9a29a28ffdbbce06061108a552e5b87db 840 1add1fb90b86c66db4a2c90a69f386f344d3aaf3 b0fe9b1eb1a747bb6235533bfdd2fdc36e930c96 819 4d11ac1c5728028115fc50b51923e008831b287f adaccb06e8d1218c8f054a373be894236d8d36f9 813 e018fe46613bb794872ba4506529540c1d33432d 9fb94100f25db27f2b41b9cef4f791460f046a08 781 c0bb57aca4036dc89a32edbef7e70b09559709ee c175cec4543fcea5f138a38aa90cd6053090cad5 744 56d158456ca5c5da11804da5e597e2ef99b72765 f045e139e192af0aec031014f4f8ac4610dc9148 742 df82fcfd3d3eaf91573ef40ad3c310cfc2200336 34baa275e85ffc8258f5efcc8449ae683ec3d554 728 c1a2361796e4b0d599c5ef6379cc3a0ab1526cfd 371ccd44b87c4f2c387e4d5189251cb6e4b67797 726 ca54ba4a4c5ebb309dc309c5c44dd7491798f84d 4456858afc42112ce9acc96001e1578a057e0e4d 721 52319d93a0d7c3698ef8547fc9ebb4f1d68c2560 0c47e488fc009f4716963e913b90a3346778c4bf 653c0e6ca601837d750a55c68776a806c248fbfc THUNDERBIRD_3_0b4_BUILD1 653c0e6ca601837d750a55c68776a806c248fbfc THUNDERBIRD_3_0b4_BUILD3 653c0e6ca601837d750a55c68776a806c248fbfc THUNDERBIRD_3_0b4_BUILD3 653c0e6ca601837d750a55c68776a806c248fbfc THUNDERBIRD_3_0b4_BUILD3 653c0e6ca601837d750a55c68776a806c248fbfc THUNDERBIRD_3_0b4_BUILD2 653c0e6ca601837d750a55c68776a806c248fbfc THUNDERBIRD_3_0b4_BUILD5 653c0e6ca601837d750a55c68776a806c248fbfc THUNDERBIRD_3_0b4_BUILD4 f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_11_RELEASE f1fc2297e2c50e4326c4d94e9c1cbaa2f05844d3 SEAMONKEY_2_0_1_BUILD1 6b5ec09f3b1d218dbf5fa6423916cbb07058829d SEAMONKEY_2_11_RELEASE f1fc2297e2c50e4326c4d94e9c1cbaa2f05844d3 SEAMONKEY_2_0_1_BUILD2 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_7b5_RELEASE 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_7b5_RELEASE 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_7b5_RELEASE ef29512d86ae0822a3af1126235f34fd7761fe66 SEAMONKEY_2_0b1_RELEASE ef29512d86ae0822a3af1126235f34fd7761fe66 SEAMONKEY_2_0b1_RELEASE b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_6b1_RELEASE 863a04e7d1c5eb4f7c95e0e2e6a842c14bc6f6ef SEAMONKEY_2_17_RELEASE f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_6_RELEASE 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1rc2_RELEASE 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1rc2_RELEASE 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1rc2_RELEASE 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1rc2_RELEASE 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1rc2_RELEASE 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1rc2_RELEASE 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1rc2_RELEASE 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1rc2_RELEASE 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1rc2_RELEASE 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1rc2_RELEASE 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1rc2_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_14_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_14_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_14_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26_RELEASE 94ddc709132f1e0221cbe8e58c0cdc5ce70353bc SEAMONKEY_2_15_2_RELEASE 6ff2694c27a6488a27f1450dd9731d209ae57b51 MOZILLA_0_9_6_BASE 27b0e9ef17154b6f610be366813445123e2bcb63 THUNDERBIRD_3_1_b2_BUILD2 27b0e9ef17154b6f610be366813445123e2bcb63 THUNDERBIRD_3_1_b2_BUILD2 27b0e9ef17154b6f610be366813445123e2bcb63 THUNDERBIRD_3_1_b2_BUILD2 27b0e9ef17154b6f610be366813445123e2bcb63 THUNDERBIRD_3_1_b2_BUILD1 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16b5_RELEASE f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_9_RELEASE b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_5_RELEASE b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_5_RELEASE b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_5_RELEASE b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_5_RELEASE b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_5_RELEASE 32de4c4a4ce70e468f7b67252c4945cdd1ebc382 SEAMONKEY_2_20b3_BUILD1 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_33b1_RELEASE 8c6a6ec9a22c1cf65391c61020b52fdfa886a79b SEAMONKEY_2_33b1_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_6_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_6_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_6_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_6_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_6_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_6_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_6_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_6_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_6_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_6_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_6_RELEASE c39783b41b92e321fd4fe3f6169abc1ceff16e48 SEAMONKEY_2_22_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_32b1_BUILD1 f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_4_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_29b2_RELEASE 4185487b5f1f555ec38eccc2c4c23a696d9e78f2 SURESH_IM_STANDALONE_BASE 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_7_1_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_18_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_18_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_18_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_18_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_18_RELEASE f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_5_BUILD1 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_13_2_RELEASE 06e3e885e6c8876761cd786eeb7bd5f60b99239e MOZILLA_1_9a7_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_30_BUILD1 b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_6_BUILD1 d7e5d5a4c9ab9322e46999a7f9dca8c0970108f3 MOZILLA_1_4_2003052312_BASE 32af14255f1346fb45573000b71ab4665ee5f653 SEAMONKEY_2_18b3_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc1_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc1_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc1_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc1_BUILD2 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc1_BUILD2 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc1_BUILD2 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc1_BUILD3 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc1_BUILD3 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc1_BUILD3 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_7_BUILD2 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_7_BUILD3 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_7_BUILD1 b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_6_RELEASE c39783b41b92e321fd4fe3f6169abc1ceff16e48 SEAMONKEY_2_23b1_RELEASE cabaa237f3a429759b992915392c1d1d570c3ec8 SAFEBROWSING_20060516_BASE b72c3dc211a0f6bb338138ef1d6ab7f87a38432c SEAMONKEY_2_9_BUILD1 535bce39929ac4f3173fba12e9c5d161c8ca23b7 REFLOW_20020422_BASE 869a1de4fc3f6c244798f29aa6311cc2377e66e2 SEAMONKEY_2_12b1_BUILD2 b6de3a5ce573ef015d0205070af30d3d1a9981f3 SEAMONKEY_2_11b3_RELEASE b6de3a5ce573ef015d0205070af30d3d1a9981f3 SEAMONKEY_2_11b3_RELEASE b6de3a5ce573ef015d0205070af30d3d1a9981f3 SEAMONKEY_2_11b3_RELEASE 869a1de4fc3f6c244798f29aa6311cc2377e66e2 SEAMONKEY_2_12b1_BUILD1 f79f3cc6c5cc3dd24a1da09a9dde929a19fcc5b1 MOZILLA_1_8a1_RELEASE 869a1de4fc3f6c244798f29aa6311cc2377e66e2 SEAMONKEY_2_12_1_BUILD1 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_32b2_RELEASE bf93a1148597ac5da957b729c04398d0fc768bb8 SEAMONKEY_2_1b2_RELEASE bf93a1148597ac5da957b729c04398d0fc768bb8 SEAMONKEY_2_1b2_RELEASE bf93a1148597ac5da957b729c04398d0fc768bb8 SEAMONKEY_2_1b2_RELEASE 0ff0b47c92b7cd20c30de66bfff57dc24152c409 SEAMONKEY_2_8b6_RELEASE 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_13b3_RELEASE 32af14255f1346fb45573000b71ab4665ee5f653 SEAMONKEY_2_18b3_RELEASE f1fc2297e2c50e4326c4d94e9c1cbaa2f05844d3 SEAMONKEY_2_0rc1_BUILD1 0ff0b47c92b7cd20c30de66bfff57dc24152c409 SEAMONKEY_2_8b6_BUILD1 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_3_2_RELEASE 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_3_2_RELEASE 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_3_2_RELEASE 406291240f501c1ef94be5e6d9b740b8f8e140c5 SONGBIRD_20070117_01_TAG c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_32_1_RELEASE f8f32d5fc804fee4d5697438c782fce96365d02b MOZILLA_1_8b1_RELEASE 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_13b6_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_4_RELEASE 94ddc709132f1e0221cbe8e58c0cdc5ce70353bc SEAMONKEY_2_15b1_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_7_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_7_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_7_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_7_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_7_RELEASE b6de3a5ce573ef015d0205070af30d3d1a9981f3 DOMI_2_0_11_RELEASE f1fc2297e2c50e4326c4d94e9c1cbaa2f05844d3 SEAMONKEY_2_0_2_RELEASE 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1rc1_RELEASE 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1rc1_RELEASE 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1rc1_RELEASE 24d493d26551799fbafbafd8458bba770d050d7e XFORMS_20050106_BASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26_1_BUILD1 32267760986ba88d2cabd69af8522e69d4f7c4f8 MOZILLA_1_9a2_RC1 869a1de4fc3f6c244798f29aa6311cc2377e66e2 SEAMONKEY_2_12b5_BUILD1 91369753b668365a3d295ee1afb9b16dc749d3b6 SUNBIRD_0_3a1_RELEASE 1c6b874b1fd9956c7081e00c08c14df54ad1e529 SEAMONKEY_2_25b2_BUILD1 1c6b874b1fd9956c7081e00c08c14df54ad1e529 SEAMONKEY_2_25b2_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc2_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc2_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc2_BUILD1 cd6a746cc5708f58a2c0ffb1373ff858696c3df1 MOZILLA_1_0_0_BASE 697016a1e94419d7ce00b632d8aaad5f79894fd7 SEAMONKEY_2_2b1_BUILD1 869a1de4fc3f6c244798f29aa6311cc2377e66e2 SEAMONKEY_2_12b4_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_2_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_2_RELEASE 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_8b1_BUILD1 f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_14_RELEASE f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_14_RELEASE f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_14_RELEASE 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16b1_BUILD1 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16b1_BUILD1 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16b1_BUILD1 0ed0135c3829e43112da338bc6e18b41ee18a337 EVENTSREWRITE_20000211_BASE ca35d7b7c443b268f55dd99b67c9d957d1728e84 SEAMONKEY_2_0b2_BUILD1 a4efc38cf218334e054f98435be6084e4e21b03a SUNBIRD_0_3_1_RC2 f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_14_BUILD1 f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_14_BUILD2 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_3_3_RELEASE 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_4_1_BUILD1 03100a2ba838327e218d2d3751d82f6d2a71badc AB_OUTLINER_BASE 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1rc2_BUILD2 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1rc2_BUILD2 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1rc2_BUILD2 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1rc2_BUILD1 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1rc2_BUILD1 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1rc2_BUILD1 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1rc2_BUILD1 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1rc2_BUILD1 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1rc2_BUILD1 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1rc2_BUILD1 c39783b41b92e321fd4fe3f6169abc1ceff16e48 SEAMONKEY_2_23_RELEASE d5aea4a8b3e56f67207e58f61e43aac933264ae8 DOM_AGNOSTIC3_PRE_MERGE 87599cab4bd2c99527a3efceb8a523e6e6a9d870 SEAMONKEY_2_24b1_RELEASE 87599cab4bd2c99527a3efceb8a523e6e6a9d870 SEAMONKEY_2_24b1_RELEASE 87599cab4bd2c99527a3efceb8a523e6e6a9d870 SEAMONKEY_2_24b1_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_32b3_RELEASE b72c3dc211a0f6bb338138ef1d6ab7f87a38432c SEAMONKEY_2_10b2_RELEASE 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1b3_BUILD1 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_13_2_BUILD1 fcfb387360fd99f6730e41136782ce005900cb08 SEAMONKEY_2_1b3_BUILD3 fcfb387360fd99f6730e41136782ce005900cb08 SEAMONKEY_2_1b3_BUILD2 f3f70eccc3059b3e5cfc4bd75663902031a77e54 SEAMONKEY_2_19b2_BUILD1 863a04e7d1c5eb4f7c95e0e2e6a842c14bc6f6ef SEAMONKEY_2_17_1_BUILD1 f2c4c9da8d1ee5c707aed532a67700aafe61eab2 SEAMONKEY_2_35_BUILD1 f2c4c9da8d1ee5c707aed532a67700aafe61eab2 SEAMONKEY_2_35_BUILD1 f2c4c9da8d1ee5c707aed532a67700aafe61eab2 SEAMONKEY_2_35_BUILD1 f2c4c9da8d1ee5c707aed532a67700aafe61eab2 SEAMONKEY_2_35_BUILD1 f352feb54f3ac2bbd6e85c3b2237af859ce9b4b5 SEAMONKEY_2_35_BUILD1 f3f70eccc3059b3e5cfc4bd75663902031a77e54 SEAMONKEY_2_19_RELEASE b6de3a5ce573ef015d0205070af30d3d1a9981f3 SEAMONKEY_2_10b3_BUILD1 935da5633b7f37c6d70b62f1dbdd14b6760dce5c DOMI_LATEST_BRANCH 0000000000000000000000000000000000000000 DOMI_LATEST_BRANCH 869a1de4fc3f6c244798f29aa6311cc2377e66e2 DOMI_LATEST_BRANCH 126fe9d8534cb3ce744a964e125b919a4764be37 DOMI_LATEST_BRANCH 02adedaabfc6e7bb77b405d23edb36754982e261 MOZILLA_0_9_7_RELEASE dcae9d99a6f2ed3cbe80def6a5e7cb3b2403cd4d FIREFOX_0_8_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_30b1_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_11_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_11_BUILD2 b6de3a5ce573ef015d0205070af30d3d1a9981f3 SEAMONKEY_2_11b1_BUILD1 60242bd0c895c42d472f7c22af1c20e7912ccf00 DOMI_2_0_15_1 b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_6b1_BUILD1 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_31b1_RELEASE f2c4c9da8d1ee5c707aed532a67700aafe61eab2 SEAMONKEY_2_35_RELEASE f2c4c9da8d1ee5c707aed532a67700aafe61eab2 SEAMONKEY_2_35_RELEASE f2c4c9da8d1ee5c707aed532a67700aafe61eab2 SEAMONKEY_2_35_RELEASE f2c4c9da8d1ee5c707aed532a67700aafe61eab2 SEAMONKEY_2_35_RELEASE f352feb54f3ac2bbd6e85c3b2237af859ce9b4b5 SEAMONKEY_2_35_RELEASE f352feb54f3ac2bbd6e85c3b2237af859ce9b4b5 SEAMONKEY_2_35_RELEASE f352feb54f3ac2bbd6e85c3b2237af859ce9b4b5 SEAMONKEY_2_35_RELEASE f352feb54f3ac2bbd6e85c3b2237af859ce9b4b5 SEAMONKEY_2_35_RELEASE f352feb54f3ac2bbd6e85c3b2237af859ce9b4b5 SEAMONKEY_2_35_RELEASE b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_5b3_RELEASE b6de3a5ce573ef015d0205070af30d3d1a9981f3 SEAMONKEY_2_11b2_BUILD1 e4b9d71d5f0b4ebe345fe740d8c9aca71a4d11b9 PHOENIX_0_4_RELEASE 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_13_1_BUILD1 6b5ec09f3b1d218dbf5fa6423916cbb07058829d SEAMONKEY_2_11b5_RELEASE 6b5ec09f3b1d218dbf5fa6423916cbb07058829d SEAMONKEY_2_11b5_RELEASE 6b5ec09f3b1d218dbf5fa6423916cbb07058829d SEAMONKEY_2_11b5_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_17_RELEASE b521fa9af6828503c0c38b5e6ccea5fa92c7e4cc FOLDER_PANE_20010807_BASE c8fbd58120795cbaf1f58c2a9299a9be7a4e018b MOZILLA_1_9a3_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_11_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_11_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_11_RELEASE 94ddc709132f1e0221cbe8e58c0cdc5ce70353bc SEAMONKEY_2_15b6_BUILD1 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_4b3_RELEASE 0ff0b47c92b7cd20c30de66bfff57dc24152c409 SEAMONKEY_2_8_BUILD1 0ff0b47c92b7cd20c30de66bfff57dc24152c409 SEAMONKEY_2_8_BUILD1 0ff0b47c92b7cd20c30de66bfff57dc24152c409 SEAMONKEY_2_8_BUILD1 89ebc73495ffcada07614a439adf723c2d14f223 XPCDOM_20010223_BASE b72c3dc211a0f6bb338138ef1d6ab7f87a38432c SEAMONKEY_2_9b1_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_8_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_8_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_8_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_13_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_16_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_16_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_16_RELEASE 215eee579d471d9449ba8e6d5627e84e608cc9c5 SEAMONKEY_2_0a1_RELEASE 1fc863987cc4ba9e8f69c04d17c71d8766d6d8fa MOZILLA_0_9_9_20020301 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16b3_BUILD1 b435a6271f1b662dbe01f1f072feb6709b1c3fde FIREFOX_3_0b5_RC2 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_32b3_BUILD1 863a04e7d1c5eb4f7c95e0e2e6a842c14bc6f6ef SEAMONKEY_2_17b1_RELEASE 63d362f03ddbf68ef827ee683eb2568381ab203a THUNDERBIRD_3_3a2_RELEASE 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_5b1_BUILD2 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_5_BUILD2 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_5_BUILD1 32af14255f1346fb45573000b71ab4665ee5f653 SEAMONKEY_2_18b4_BUILD1 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_7_2_RELEASE 697016a1e94419d7ce00b632d8aaad5f79894fd7 SEAMONKEY_2_2b3_RELEASE 869a1de4fc3f6c244798f29aa6311cc2377e66e2 SEAMONKEY_2_12b5_RELEASE 2c63a5a42aa132b4b2f3a60eedf317997f9b0d07 THUNDERBIRD_3_3a3_BUILD1 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_14_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26b2_RELEASE 6b5ec09f3b1d218dbf5fa6423916cbb07058829d SEAMONKEY_2_11b6_RELEASE 697016a1e94419d7ce00b632d8aaad5f79894fd7 SEAMONKEY_2_2b2_BUILD2 697016a1e94419d7ce00b632d8aaad5f79894fd7 SEAMONKEY_2_2b2_BUILD1 697016a1e94419d7ce00b632d8aaad5f79894fd7 SEAMONKEY_2_2_BUILD1 697016a1e94419d7ce00b632d8aaad5f79894fd7 SEAMONKEY_2_2_BUILD2 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_14b5_RELEASE 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_14b5_RELEASE 94ddc709132f1e0221cbe8e58c0cdc5ce70353bc SEAMONKEY_2_14b5_RELEASE c4e40c30834ae854a7cdf1c450d57e5a314c2ff6 XUL_CONTENT_MERGE_20010220_BASE f352feb54f3ac2bbd6e85c3b2237af859ce9b4b5 SEAMONKEY_2_35_BUILD2 33466ddda9ca7d9a1513d6f0134f5fbd7325b0fd SYD_TEST_03052002_BASE 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_4b1_BUILD1 0714e5dab03cd4a0e67ffba4c1174237b01c0245 FOLDER_OUTLINER_20010417_BASE 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_5b1_RELEASE 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_5b1_RELEASE 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_5b1_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26b1_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26b1_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26b1_RELEASE 87599cab4bd2c99527a3efceb8a523e6e6a9d870 SEAMONKEY_2_24_BUILD1 b7431796b04bcba05b8ff0ca088345f50eb7bfd3 SSU_20030812_BASE dfad1b2e38e44bd6bc76259455065382c5ac0949 SEAMONKEY_2_39_RELEASE 32af14255f1346fb45573000b71ab4665ee5f653 SEAMONKEY_2_18b1_BUILD1 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1b3_RELEASE 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1b3_RELEASE fcfb387360fd99f6730e41136782ce005900cb08 SEAMONKEY_2_1b3_RELEASE fcfb387360fd99f6730e41136782ce005900cb08 SEAMONKEY_2_1b3_RELEASE fcfb387360fd99f6730e41136782ce005900cb08 SEAMONKEY_2_1b3_RELEASE 8c8feff90f3c5fe53d8059fcb21015fa81fd5e81 MOZILLA_0_9_8_BASE 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_7_1_BUILD1 7e9532a964be907671b51f8d86d474379c21c008 MOZILLA_0_8_1_20010326_RELEASE 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_RELEASE 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_RELEASE 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_RELEASE 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_RELEASE 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_RELEASE 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_RELEASE 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_RELEASE 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_RELEASE 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_RELEASE f3f70eccc3059b3e5cfc4bd75663902031a77e54 SEAMONKEY_2_19b2_RELEASE dfad1b2e38e44bd6bc76259455065382c5ac0949 SEAMONKEY_2_40_RELEASE dfad1b2e38e44bd6bc76259455065382c5ac0949 SEAMONKEY_2_40_RELEASE dfad1b2e38e44bd6bc76259455065382c5ac0949 SEAMONKEY_2_40_RELEASE dfad1b2e38e44bd6bc76259455065382c5ac0949 SEAMONKEY_2_40_RELEASE dfad1b2e38e44bd6bc76259455065382c5ac0949 SEAMONKEY_2_40_RELEASE dfad1b2e38e44bd6bc76259455065382c5ac0949 SEAMONKEY_2_40_RELEASE dfad1b2e38e44bd6bc76259455065382c5ac0949 SEAMONKEY_2_40_RELEASE dfad1b2e38e44bd6bc76259455065382c5ac0949 SEAMONKEY_2_40_RELEASE 1c6b874b1fd9956c7081e00c08c14df54ad1e529 SEAMONKEY_2_25_BUILD1 94ddc709132f1e0221cbe8e58c0cdc5ce70353bc SEAMONKEY_2_15b3_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc1_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc1_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc1_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc1_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc1_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc1_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc1_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc1_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc1_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc1_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc1_RELEASE 869a1de4fc3f6c244798f29aa6311cc2377e66e2 SEAMONKEY_2_12b6_BUILD1 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16b2_RELEASE 653c0e6ca601837d750a55c68776a806c248fbfc THUNDERBIRD_3_0b4_RELEASE 653c0e6ca601837d750a55c68776a806c248fbfc THUNDERBIRD_3_0b4_RELEASE 653c0e6ca601837d750a55c68776a806c248fbfc THUNDERBIRD_3_0b4_RELEASE 653c0e6ca601837d750a55c68776a806c248fbfc THUNDERBIRD_3_0b4_RELEASE 653c0e6ca601837d750a55c68776a806c248fbfc THUNDERBIRD_3_0b4_RELEASE 653c0e6ca601837d750a55c68776a806c248fbfc THUNDERBIRD_3_0b4_RELEASE 653c0e6ca601837d750a55c68776a806c248fbfc THUNDERBIRD_3_0b4_RELEASE 653c0e6ca601837d750a55c68776a806c248fbfc THUNDERBIRD_3_0b4_RELEASE 653c0e6ca601837d750a55c68776a806c248fbfc THUNDERBIRD_3_0b4_RELEASE 653c0e6ca601837d750a55c68776a806c248fbfc THUNDERBIRD_3_0b4_RELEASE 653c0e6ca601837d750a55c68776a806c248fbfc THUNDERBIRD_3_0b4_RELEASE b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_6_1_RELEASE 863a04e7d1c5eb4f7c95e0e2e6a842c14bc6f6ef SEAMONKEY_2_17_BUILD1 f3f70eccc3059b3e5cfc4bd75663902031a77e54 SEAMONKEY_2_19_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_18_BUILD2 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_18_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_18_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_18_BUILD1 e9401a4b9951c83338a22544851c9717fa7eea51 DOM_AGNOSTIC3_BASE2 a9f69279b0fbcd3b068c7f474024e496febdde41 DOMI_2_0_16 0000000000000000000000000000000000000000 DOMI_2_0_16 dfad1b2e38e44bd6bc76259455065382c5ac0949 DOMI_2_0_16 4680def0f59c6b9b4d3fb46d2baf771757f73489 ROGC_20021218_FREEZE dfad1b2e38e44bd6bc76259455065382c5ac0949 SEAMONKEY_2_40_BUILD2 dfad1b2e38e44bd6bc76259455065382c5ac0949 SEAMONKEY_2_40_BUILD3 45cc63493d7ddec6e20fe038b2f6c74e758a992c FIREFOX_3_0rc1_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_8_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_8_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_8_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_8_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_8_RELEASE 1559c8d3d7e30b218e3b9c63754db079c61f38d1 REFLOW_20020502_BASE 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16b3_RELEASE 181ed7ee0cd4fcac730f5a3920aa9df3c4737891 THUNDERBIRD_3_1_a1_BUILD1 8cbb50ecfc62b4b93e351b308d3103d4155161cc FIREFOX_3_0b2_RC1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_13_RELEASE 5a93979aeccc69a35f64383460d7774117fe4554 THUNDERBIRD_3_0b2_BUILD1 b6de3a5ce573ef015d0205070af30d3d1a9981f3 SEAMONKEY_2_10_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_10_RELEASE c39783b41b92e321fd4fe3f6169abc1ceff16e48 SEAMONKEY_2_22b2_RELEASE 4dfc4e232cd57479bfced87f8161e533b48c9099 DOMI_2_0_16_GECKO_45 f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_5_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df COMM_1_9_2_BASE 3fd5fece7b046aec6497b1ed669f257ef1e0f315 THUNDERBIRD_3_1_a2_RELEASE 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_14b2_BUILD1 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_8b3_BUILD1 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1_BUILD1 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1_BUILD1 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1_BUILD1 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_13b6_RELEASE 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_13b2_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_4_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_4_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_4_RELEASE a69148785a33f31a5250784cfdf9e679243c5d35 THUNDERBIRD_3_0b1_BUILD2 d97010e0e57a0f611bea91e72388299b03332efd DOMI_2_0_7_RELEASE a69148785a33f31a5250784cfdf9e679243c5d35 THUNDERBIRD_3_0b1_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_7_BUILD1 869a1de4fc3f6c244798f29aa6311cc2377e66e2 SEAMONKEY_2_12b4_RELEASE c39783b41b92e321fd4fe3f6169abc1ceff16e48 SEAMONKEY_2_22_1_BUILD1 02f841ececf01f811d7e33f3fecfa16a5a5833c5 FIREFOX_3_0b3_RC3 f1fc2297e2c50e4326c4d94e9c1cbaa2f05844d3 SEAMONKEY_2_0rc2_RELEASE f1fc2297e2c50e4326c4d94e9c1cbaa2f05844d3 SEAMONKEY_2_0rc2_RELEASE f1fc2297e2c50e4326c4d94e9c1cbaa2f05844d3 SEAMONKEY_2_0rc2_RELEASE f1fc2297e2c50e4326c4d94e9c1cbaa2f05844d3 SEAMONKEY_2_0rc2_RELEASE f1fc2297e2c50e4326c4d94e9c1cbaa2f05844d3 SEAMONKEY_2_0rc2_RELEASE 03cf7e93828fcc03f50a090615eaa01e6286705d SEAMONKEY_2_1a2_BUILD1 03cf7e93828fcc03f50a090615eaa01e6286705d SEAMONKEY_2_1a2_BUILD2 c1781438280575ab6812f51237e65f432ad06109 DOM_AGNOSTIC_BASE 6b5ec09f3b1d218dbf5fa6423916cbb07058829d SEAMONKEY_2_11_BUILD1 b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_6b2_RELEASE 9d1ed426791ed7502fb7fe0bf411b10f2763d0ac ANGELON_MOZ_14_BASE 86b2cc479f7512d9d2c51240501de6f7c33ab132 FORMS_20040611_BASE 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_7b3_BUILD1 b6215256b9fe866eb50ab524e3a2b11931cf39ed IFRAME_20011127_BASE b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_6_1_BUILD1 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_14b3_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_14_BUILD1 697016a1e94419d7ce00b632d8aaad5f79894fd7 SEAMONKEY_2_2b2_RELEASE 697016a1e94419d7ce00b632d8aaad5f79894fd7 SEAMONKEY_2_2b2_RELEASE 697016a1e94419d7ce00b632d8aaad5f79894fd7 SEAMONKEY_2_2b2_RELEASE a69148785a33f31a5250784cfdf9e679243c5d35 THUNDERBIRD_3_0b1_RELEASE a69148785a33f31a5250784cfdf9e679243c5d35 THUNDERBIRD_3_0b1_RELEASE 94ddc709132f1e0221cbe8e58c0cdc5ce70353bc SEAMONKEY_2_15b2_BUILD1 94ddc709132f1e0221cbe8e58c0cdc5ce70353bc SEAMONKEY_2_15b2_RELEASE 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_13b5_BUILD1 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_13b5_BUILD1 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_13b5_BUILD1 32de4c4a4ce70e468f7b67252c4945cdd1ebc382 SEAMONKEY_2_20_BUILD1 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16b1_RELEASE 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16b1_RELEASE 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16b1_RELEASE 207fc806a4778eb0398edcb4c39e1229c81225b7 THUNDERBIRD_M3_BASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_33b1_BUILD1 ef29512d86ae0822a3af1126235f34fd7761fe66 SEAMONKEY_2_0b1_BUILD1 ef29512d86ae0822a3af1126235f34fd7761fe66 SEAMONKEY_2_0b1_BUILD1 32af14255f1346fb45573000b71ab4665ee5f653 SEAMONKEY_2_18b4_RELEASE 0ff0b47c92b7cd20c30de66bfff57dc24152c409 SEAMONKEY_2_8_RELEASE 0ff0b47c92b7cd20c30de66bfff57dc24152c409 SEAMONKEY_2_8_RELEASE 0ff0b47c92b7cd20c30de66bfff57dc24152c409 SEAMONKEY_2_8_RELEASE 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_3b3_RELEASE f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_4_BUILD1 b72c3dc211a0f6bb338138ef1d6ab7f87a38432c SEAMONKEY_2_9b2_BUILD1 b72c3dc211a0f6bb338138ef1d6ab7f87a38432c SEAMONKEY_2_9b2_BUILD1 b72c3dc211a0f6bb338138ef1d6ab7f87a38432c SEAMONKEY_2_9b2_BUILD1 f1fc2297e2c50e4326c4d94e9c1cbaa2f05844d3 SEAMONKEY_2_0_2_BUILD1 94ddc709132f1e0221cbe8e58c0cdc5ce70353bc SEAMONKEY_2_15_BUILD1 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_7b5_BUILD1 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_7b5_BUILD1 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_7b5_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_4_BUILD2 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_4_BUILD1 697016a1e94419d7ce00b632d8aaad5f79894fd7 SEAMONKEY_2_2b1_RELEASE 697016a1e94419d7ce00b632d8aaad5f79894fd7 SEAMONKEY_2_2b1_RELEASE 697016a1e94419d7ce00b632d8aaad5f79894fd7 SEAMONKEY_2_2b1_RELEASE b72c3dc211a0f6bb338138ef1d6ab7f87a38432c SEAMONKEY_2_9b4_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc3_RELEASE 94ddc709132f1e0221cbe8e58c0cdc5ce70353bc SEAMONKEY_2_15b5_RELEASE 71f00fd374cc94d341030c5220eae87447002a4a XPCDOM_20010502_BASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df CALENDAR_1_0b2_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df CALENDAR_1_0b2_RELEASE 32de4c4a4ce70e468f7b67252c4945cdd1ebc382 SEAMONKEY_2_20b2_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_11_BUILD1 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_8b2_BUILD1 b14a42a2f9fd3fcf143ea0ae06b12f42d6481083 FIREBIRD_0_6_RELEASE c39783b41b92e321fd4fe3f6169abc1ceff16e48 SEAMONKEY_2_22b2_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_8_BUILD3 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_8_BUILD2 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_8_BUILD1 b72c3dc211a0f6bb338138ef1d6ab7f87a38432c SEAMONKEY_2_9_1_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_3_BUILD1 c42fd9baba56a868859cd3417a5e1420ffa0d24b DOMI_LATEST_RELEASE 030eee04e40b5f50349089a38a2368a36c1e9af7 DOMI_LATEST_RELEASE 0000000000000000000000000000000000000000 DOMI_LATEST_RELEASE 58bcafc6b7a29cfeba38c7b214f62b4542eab192 DOMI_LATEST_RELEASE b2005ebad365607a6274cd10b4bf73bf1b48cb4a DOMI_LATEST_RELEASE b2005ebad365607a6274cd10b4bf73bf1b48cb4a DOMI_LATEST_RELEASE 77a21a719c0f50f0a3f4a0c9ab143ba863020bcb DOMI_LATEST_RELEASE 84f2a58a989b09f40b9cd19f50f7987d89ac2471 DOMI_LATEST_RELEASE 84f2a58a989b09f40b9cd19f50f7987d89ac2471 DOMI_LATEST_RELEASE 7ca2fdffb52123d97b9da7fa7be46b6d12eaeac1 DOMI_LATEST_RELEASE ec464006febdcaa84637f6f3980e257a7ecb33f3 DOMI_LATEST_RELEASE ec464006febdcaa84637f6f3980e257a7ecb33f3 DOMI_LATEST_RELEASE dfad1b2e38e44bd6bc76259455065382c5ac0949 DOMI_LATEST_RELEASE 970bb659ce72fb8a2fbe1665e507a83529dec8b0 PREFERENCES_20050201_BASE b72c3dc211a0f6bb338138ef1d6ab7f87a38432c SEAMONKEY_2_10b1_BUILD1 b72c3dc211a0f6bb338138ef1d6ab7f87a38432c SEAMONKEY_2_10b1_BUILD2 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_7b2_BUILD1 c39783b41b92e321fd4fe3f6169abc1ceff16e48 SEAMONKEY_2_22_1_RELEASE 5f865ac08ffef2322c78043e22080138adc5b8c7 Style_20010509_Base c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26b1_BUILD1 9b538e3c7ed6057285170e1871d75bfbbf28098a MOZILLA_1_9a5_RC2 25f2029e1f105d0d12d1d32fb71490d76a57d90d MINOTAUR_20030218_BASE 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_4_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_30b2_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_2_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_2_BUILD1 eef568e4ee05b819869103117f2c3798d7bed9a5 SEAMONKEY_2_1a3_BUILD2 c39783b41b92e321fd4fe3f6169abc1ceff16e48 SEAMONKEY_2_21b2_RELEASE b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_5b4_RELEASE eef568e4ee05b819869103117f2c3798d7bed9a5 SEAMONKEY_2_1a3_BUILD1 697016a1e94419d7ce00b632d8aaad5f79894fd7 SEAMONKEY_2_2b3_BUILD1 b72c3dc211a0f6bb338138ef1d6ab7f87a38432c SEAMONKEY_2_10b1_RELEASE b72c3dc211a0f6bb338138ef1d6ab7f87a38432c SEAMONKEY_2_10b1_RELEASE b72c3dc211a0f6bb338138ef1d6ab7f87a38432c SEAMONKEY_2_10b1_RELEASE 3d3cbacea54f37507a6b9a04ddbe5256a4af0254 PHOENIX_0_1_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26b1_BUILD2 014e458947e0478a711c52f833e0542171a440a5 THUNDERBIRD_3_1_a1_RELEASE 014e458947e0478a711c52f833e0542171a440a5 THUNDERBIRD_3_1_a1_RELEASE b28ba70880bb736fd15d2bf0ac72a4b154b267c2 THUNDERBIRD_3_1_a1_RELEASE b28ba70880bb736fd15d2bf0ac72a4b154b267c2 THUNDERBIRD_3_1_a1_RELEASE d07bbc6b52139d99f8af2ef2619c6e66aa4bc387 THUNDERBIRD_3_1_a1_RELEASE f1fc2297e2c50e4326c4d94e9c1cbaa2f05844d3 SEAMONKEY_2_0rc2_BUILD3 f1fc2297e2c50e4326c4d94e9c1cbaa2f05844d3 SEAMONKEY_2_0rc2_BUILD2 f1fc2297e2c50e4326c4d94e9c1cbaa2f05844d3 SEAMONKEY_2_0rc2_BUILD1 030eee04e40b5f50349089a38a2368a36c1e9af7 DOMI_2_0_13_RELEASE 863a04e7d1c5eb4f7c95e0e2e6a842c14bc6f6ef SEAMONKEY_2_17b3_BUILD1 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26_1_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df DOMI_2_0_5_RELEASE 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_14_1_BUILD1 94ddc709132f1e0221cbe8e58c0cdc5ce70353bc SEAMONKEY_2_15b1_BUILD1 d9b9ad73ca55a6354f16efc3766146c6e50c8277 CW7_20011204_TAG 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_14b2_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_12_BUILD1 a69148785a33f31a5250784cfdf9e679243c5d35 THUNDERBIRD_3_0a3_BUILD2 6e994301e7ea29beeba49f34b148901c4bd37c65 THUNDERBIRD_3_0a3_BUILD1 9b74cd906b8b09508599a3e5455225b518414286 MOZILLA_1_1a_RELEASE f21051d6d712170f8e67b838ace9f09b7e928cd3 CFM_LAST_RITES 215eee579d471d9449ba8e6d5627e84e608cc9c5 SEAMONKEY_2_0a1_BUILD1 43c6839edab5ff4d55bfcafc2d4b62f84004d8d5 SEAMONKEY_2_1a1_BUILD1 94ddc709132f1e0221cbe8e58c0cdc5ce70353bc SEAMONKEY_2_15b4_RELEASE f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_7_RELEASE 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_13b4_RELEASE 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_4_BUILD1 c39783b41b92e321fd4fe3f6169abc1ceff16e48 SEAMONKEY_2_22b1_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_2_BUILD1 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_29_BUILD1 869a1de4fc3f6c244798f29aa6311cc2377e66e2 SEAMONKEY_2_12b3_BUILD1 32de4c4a4ce70e468f7b67252c4945cdd1ebc382 SEAMONKEY_2_20b3_RELEASE 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_7b3_RELEASE b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_5b2_RELEASE 35fc7fa5cf3dea06c3be980a3acdfec994473c54 LIGHTNING_0_1_RELEASE 869a1de4fc3f6c244798f29aa6311cc2377e66e2 SEAMONKEY_2_12b3_RELEASE 2e8fb0acaefcaa8a5ece8a02159024e57086726b FIREFOX_3_0b4_RELEASE bf93a1148597ac5da957b729c04398d0fc768bb8 SEAMONKEY_2_1b2_BUILD2 bf93a1148597ac5da957b729c04398d0fc768bb8 SEAMONKEY_2_1b2_BUILD1 fa96487c45e69e3f77f5ab9ae2e7a4b47ca33b87 SEAMONKEY_2_0a2_RELEASE 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_8b4_BUILD1 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_8b4_BUILD1 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_8b4_BUILD1 b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_5b4_BUILD1 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_32_BUILD1 b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_5b2_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_RELEASE 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_8b2_RELEASE 73d2b5105b69b1468b1f30fd7a4b3bd41b6175c2 WEB_CONTENT_HANDLING_20070621_BASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_7_RELEASE b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_6b4_RELEASE 863a04e7d1c5eb4f7c95e0e2e6a842c14bc6f6ef SEAMONKEY_2_17b2_RELEASE 1c6b874b1fd9956c7081e00c08c14df54ad1e529 SEAMONKEY_2_25b3_RELEASE 7eeed7e6106e24bf9cde1f0f25b4fa76fbab6b2c DOMI_2_0_8_RELEASE c39783b41b92e321fd4fe3f6169abc1ceff16e48 SEAMONKEY_2_21_BUILD1 c39783b41b92e321fd4fe3f6169abc1ceff16e48 SEAMONKEY_2_21_BUILD1 c39783b41b92e321fd4fe3f6169abc1ceff16e48 SEAMONKEY_2_21_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_1_RELEASE 12b3ed4e1050d6b6f6058b7ef83b22b7e29c880c MOZILLA_1_8a4_RELEASE 5ec3d5dd237e87583019872d61f044031afe5b5a MOZILLA_1_7a_RELEASE 6e994301e7ea29beeba49f34b148901c4bd37c65 THUNDERBIRD_3_0a3_RELEASE a69148785a33f31a5250784cfdf9e679243c5d35 THUNDERBIRD_3_0a3_RELEASE a69148785a33f31a5250784cfdf9e679243c5d35 THUNDERBIRD_3_0a3_RELEASE d53c20f721f07ffa962f4050ff98b57f2558152b DOMI_2_0_6_RELEASE d53c20f721f07ffa962f4050ff98b57f2558152b DOMI_2_0_6_RELEASE 0000000000000000000000000000000000000000 DOMI_2_0_6_RELEASE 0000000000000000000000000000000000000000 DOMI_2_0_6_RELEASE 0240d2edf528197bed754f3f8cbe55c47a424640 DOMI_2_0_6_RELEASE 4f10ad08740cedf93a65693406c1f27bfb4b651e STATIC_BUILD_20010628_BASE c16f316a0971006dbfb0259c3dcdf2e002ad3493 WINCE_20020710_BASE 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_13b4_BUILD1 b6de3a5ce573ef015d0205070af30d3d1a9981f3 SEAMONKEY_2_10_1_RELEASE b6de3a5ce573ef015d0205070af30d3d1a9981f3 SEAMONKEY_2_10_1_RELEASE b6de3a5ce573ef015d0205070af30d3d1a9981f3 SEAMONKEY_2_10_1_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_12_RELEASE 02308bc6eb4c3c752d6fbc766d0afc13c466440f THUNDERBIRD_3_0b3_BUILD1 f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_6_BUILD1 dfad1b2e38e44bd6bc76259455065382c5ac0949 SEAMONKEY_2_38_RELEASE 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_2_RELEASE 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_2_RELEASE 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_2_RELEASE 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_2_RELEASE 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_2_RELEASE c74cdc6eb4fee6b64cb58da5a6c5539cbb12c529 MOZILLA_1_8a3_RELEASE c39783b41b92e321fd4fe3f6169abc1ceff16e48 SEAMONKEY_2_23b1_BUILD1 6ad7b714e6ea681e4c9eacbd97ec212726339e33 PACKAGING_20030906_BASE c42fd9baba56a868859cd3417a5e1420ffa0d24b DOMI_2_0_12_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 COMM_1_9_1_BASE a9f69279b0fbcd3b068c7f474024e496febdde41 SEA2_37_RELBRANCH 0000000000000000000000000000000000000000 SEA2_37_RELBRANCH dfad1b2e38e44bd6bc76259455065382c5ac0949 SEA2_37_RELBRANCH 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_3b3_BUILD1 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_8b4_RELEASE 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_8b4_RELEASE 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_8b4_RELEASE b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_6b4_BUILD1 c42fd9baba56a868859cd3417a5e1420ffa0d24b SEAMONKEY_2_11b4_BUILD1 c42fd9baba56a868859cd3417a5e1420ffa0d24b SEAMONKEY_2_11b4_BUILD1 c42fd9baba56a868859cd3417a5e1420ffa0d24b SEAMONKEY_2_11b4_BUILD1 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16b2_BUILD1 1c6b874b1fd9956c7081e00c08c14df54ad1e529 SEAMONKEY_2_25b3_BUILD1 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_29b1_RELEASE f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_13_BUILD1 0d73be4425b5ed5b9f34b57a30ec39e777f48e0f EDITOR_EMBEDDING_20011025_BASE 38a67e4ecf1749725107d1c755468e9f48a59048 SEAMONKEY_2_1b1_BUILD2 38a67e4ecf1749725107d1c755468e9f48a59048 SEAMONKEY_2_1b1_BUILD1 27da0da26f640f49a0719b2526bf70e7080800d9 DOMI_2_0_9_RELEASE 5a93979aeccc69a35f64383460d7774117fe4554 THUNDERBIRD_3_0b2_BUILD2 9cce0e3300937485e98f7e79006be3bb2f7b055c THUNDERBIRD_3_1_a1_BUILD2 bf7c2ee5f526c620b1121f09788be4d3703f831c THUNDERBIRD_3_1_a1_BUILD3 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_3b2_BUILD1 87599cab4bd2c99527a3efceb8a523e6e6a9d870 SEAMONKEY_2_24_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_5_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_5_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_5_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_5_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_5_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_5_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_5_RELEASE c39783b41b92e321fd4fe3f6169abc1ceff16e48 SEAMONKEY_2_21_RELEASE c39783b41b92e321fd4fe3f6169abc1ceff16e48 SEAMONKEY_2_21_RELEASE c39783b41b92e321fd4fe3f6169abc1ceff16e48 SEAMONKEY_2_21_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_6_BUILD2 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_6_BUILD2 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_6_BUILD2 f4cc350b8b7ece2e9a1a9a16d6e8ddd3f1509ebf LIGHTNING_0_3_1_RELEASE **INVALID** 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_6_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_6_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_6_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_6_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_6_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_6_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_6_BUILD1 3c347f18b5b2a1f0c5a33ad9c9738ad1f971a91a THUNDERBIRD_1_1a2_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_9_BUILD1 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_4b2_BUILD1 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_4b2_BUILD1 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_4b2_BUILD1 94ddc709132f1e0221cbe8e58c0cdc5ce70353bc SEAMONKEY_2_15b5_BUILD1 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_4b3_BUILD1 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_13_1_RELEASE b6de3a5ce573ef015d0205070af30d3d1a9981f3 SEAMONKEY_2_10_1_BUILD1 b6de3a5ce573ef015d0205070af30d3d1a9981f3 SEAMONKEY_2_10_1_BUILD2 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_13b5_RELEASE 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_13b5_RELEASE 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_13b5_RELEASE 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_7b1_RELEASE 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16b4_RELEASE 5aca607c5dd69d6c697e10a40f3099e5b830851d SEAMONKEY_2_25b1_RELEASE 5aca607c5dd69d6c697e10a40f3099e5b830851d SEAMONKEY_2_25b1_RELEASE 7706ac5ed0a44f03b2df2d9eec097747d4a29d14 SEAMONKEY_2_25b1_RELEASE f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_10_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_rc1_BUILD3 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_rc1_BUILD3 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_rc1_BUILD3 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_rc1_BUILD2 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_rc1_BUILD1 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_3_3_BUILD1 78c967134b2fc64889da4c30467d4a9512b9ff79 OTIS_TEST_BASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_29b1_BUILD1 01f09da2d8f70b36e96cca4953e7cca10d096f3a THUNDERBIRD_M2_BASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_8_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_8_BUILD2 c39783b41b92e321fd4fe3f6169abc1ceff16e48 SEAMONKEY_2_23b2_RELEASE 94ddc709132f1e0221cbe8e58c0cdc5ce70353bc SEAMONKEY_2_15b4_BUILD1 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_32b2_BUILD1 25ac1a05b16dfdd802c1d69c7b22a76d10e06c65 XBL_BRUTAL_SHARING_20010807_BASE 3597295099196282d5549acb42438c1da14bfae1 PREFERENCES_20050101_BASE b6de3a5ce573ef015d0205070af30d3d1a9981f3 SEAMONKEY_2_10b3_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_31b2_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc3_BUILD1 f2c4c9da8d1ee5c707aed532a67700aafe61eab2 SEAMONKEY_2_33_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc2_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc2_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0rc2_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_14_BUILD2 2ca3b9ee64a33989c46af64f30e055d18493496d MOZILLA_1_5a_BASE 2bbdd20af50a055016aed47e14ed7c154b67103a THUNDERBIRD_3_1_b1_RELEASE b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_5_BUILD1 b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_5_BUILD1 b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_5_BUILD1 b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_5_BUILD1 b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_5_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_9_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_11_RELEASE 32af14255f1346fb45573000b71ab4665ee5f653 SEAMONKEY_2_18b1_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_rc2_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_rc2_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_rc2_RELEASE 697016a1e94419d7ce00b632d8aaad5f79894fd7 SEAMONKEY_2_3b1_RELEASE 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_3b2_RELEASE 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_14_BUILD1 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_31_RELEASE ca62530369f98cb54810c0e2a6af3639d21c00e2 CONRAD_PROMPT_1_TAG 697016a1e94419d7ce00b632d8aaad5f79894fd7 SEAMONKEY_2_2b1_BUILD2 0ff0b47c92b7cd20c30de66bfff57dc24152c409 SEAMONKEY_2_8b5_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_17_BUILD1 170262f263a0e088e30ff78f5193ca98e3a6650b MOZILLA_200303241605_TAG b72c3dc211a0f6bb338138ef1d6ab7f87a38432c SEAMONKEY_2_9_RELEASE 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16b4_BUILD1 a25a83f4b1235503d983cdc154c8f5287d9e856f MOZILLA_1_2a_RELEASE b72c3dc211a0f6bb338138ef1d6ab7f87a38432c SEAMONKEY_2_9b1_RELEASE 32de4c4a4ce70e468f7b67252c4945cdd1ebc382 SEAMONKEY_2_20_RELEASE c39783b41b92e321fd4fe3f6169abc1ceff16e48 SEAMONKEY_2_23_BUILD1 808511b0f19f28ccf3a880825b71f6ba5816007a BOOKMARKS_20030310_BASE b6de3a5ce573ef015d0205070af30d3d1a9981f3 SEAMONKEY_2_11b2_RELEASE 1c6b874b1fd9956c7081e00c08c14df54ad1e529 SEAMONKEY_2_25_RELEASE f1fc2297e2c50e4326c4d94e9c1cbaa2f05844d3 SEAMONKEY_2_0_1_RELEASE f1fc2297e2c50e4326c4d94e9c1cbaa2f05844d3 SEAMONKEY_2_0_1_RELEASE f1fc2297e2c50e4326c4d94e9c1cbaa2f05844d3 SEAMONKEY_2_0_1_RELEASE 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_14b4_RELEASE 869a1de4fc3f6c244798f29aa6311cc2377e66e2 SEAMONKEY_2_12_BUILD1 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_32_1_BUILD1 863a04e7d1c5eb4f7c95e0e2e6a842c14bc6f6ef SEAMONKEY_2_17b2_BUILD1 5aca607c5dd69d6c697e10a40f3099e5b830851d SEAMONKEY_2_25b1_BUILD1 5aca607c5dd69d6c697e10a40f3099e5b830851d SEAMONKEY_2_25b1_BUILD1 7706ac5ed0a44f03b2df2d9eec097747d4a29d14 SEAMONKEY_2_25b1_BUILD1 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_7b2_RELEASE c39783b41b92e321fd4fe3f6169abc1ceff16e48 SEAMONKEY_2_21b1_RELEASE c39783b41b92e321fd4fe3f6169abc1ceff16e48 SEAMONKEY_2_21b1_BUILD1 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_14_1_RELEASE 5a93979aeccc69a35f64383460d7774117fe4554 SEAMONKEY_2_0a3_BUILD1 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_13b3_BUILD1 5a93979aeccc69a35f64383460d7774117fe4554 SEAMONKEY_2_0a3_BUILD2 869a1de4fc3f6c244798f29aa6311cc2377e66e2 SEAMONKEY_2_12b2_BUILD1 f3f70eccc3059b3e5cfc4bd75663902031a77e54 SEAMONKEY_2_19b1_BUILD1 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_32b1_RELEASE 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_4b2_RELEASE 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_4b2_RELEASE 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_4b2_RELEASE 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_4b1_RELEASE dfad1b2e38e44bd6bc76259455065382c5ac0949 SEAMONKEY_2_39b1_BUILD1 94ddc709132f1e0221cbe8e58c0cdc5ce70353bc SEAMONKEY_2_15_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_9_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 SUNBIRD_1_0b1_BUILD4 18a1c983c8ee3460bb3a2cf90753a3584412d491 SUNBIRD_1_0b1_BUILD4 18a1c983c8ee3460bb3a2cf90753a3584412d491 SUNBIRD_1_0b1_BUILD4 18a1c983c8ee3460bb3a2cf90753a3584412d491 SUNBIRD_1_0b1_BUILD4 18a1c983c8ee3460bb3a2cf90753a3584412d491 SUNBIRD_1_0b1_BUILD5 18a1c983c8ee3460bb3a2cf90753a3584412d491 SUNBIRD_1_0b1_BUILD5 18a1c983c8ee3460bb3a2cf90753a3584412d491 SUNBIRD_1_0b1_BUILD5 18a1c983c8ee3460bb3a2cf90753a3584412d491 SUNBIRD_1_0b1_BUILD6 18a1c983c8ee3460bb3a2cf90753a3584412d491 SUNBIRD_1_0b1_BUILD7 091ec214aaa3863b573fea99ec387e0f4c1c017a MOZILLA_1_4a_RELEASE ebe59a415752a5b8697b71e64d19734b8182d55c SUNBIRD_1_0b1_BUILD1 ebe59a415752a5b8697b71e64d19734b8182d55c SUNBIRD_1_0b1_BUILD3 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_13_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_4_BUILD1 32af14255f1346fb45573000b71ab4665ee5f653 SEAMONKEY_2_18b2_RELEASE a69148785a33f31a5250784cfdf9e679243c5d35 THUNDERBIRD_3_0a3_BUILD3 32de4c4a4ce70e468f7b67252c4945cdd1ebc382 SEAMONKEY_2_20b1_BUILD1 2001a7394d4f6bff6ffd76eab8882579a75732fb THUNDERBIRD_3_3a1_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_32_RELEASE 2001a7394d4f6bff6ffd76eab8882579a75732fb THUNDERBIRD_3_3a1_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_1_BUILD1 2e51bf59030b373f38e2d968426ca470685102db STRING_20040119_BASE 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1_RELEASE 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1_RELEASE 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1_RELEASE b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_5b3_BUILD1 f352feb54f3ac2bbd6e85c3b2237af859ce9b4b5 SEAMONKEY_2_35_BUILD3 b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_6b3_BUILD1 f2c4c9da8d1ee5c707aed532a67700aafe61eab2 SEAMONKEY_2_33_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_29b2_BUILD1 2bbdd20af50a055016aed47e14ed7c154b67103a THUNDERBIRD_3_1_b1_BUILD1 5f6693d6bd1c3676179537b6ee72e52d65d27799 MOZILLA_1_4b_RELEASE b72c3dc211a0f6bb338138ef1d6ab7f87a38432c SEAMONKEY_2_9b3_BUILD1 b72c3dc211a0f6bb338138ef1d6ab7f87a38432c SEAMONKEY_2_9b3_BUILD2 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_30b1_RELEASE 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_14b4_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_9_RELEASE fd1e00c4f94da6daad340a16812b2c4786eb620a ALERT_SERVICE_BASE 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_14b5_BUILD1 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_14b5_BUILD1 94ddc709132f1e0221cbe8e58c0cdc5ce70353bc SEAMONKEY_2_14b5_BUILD1 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_7b1_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_10_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_10_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_10_RELEASE 38a67e4ecf1749725107d1c755468e9f48a59048 SEAMONKEY_2_1b1_RELEASE 38a67e4ecf1749725107d1c755468e9f48a59048 SEAMONKEY_2_1b1_RELEASE 38a67e4ecf1749725107d1c755468e9f48a59048 SEAMONKEY_2_1b1_RELEASE 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_8b1_RELEASE 528a2d8704eb773c20b4ef898b9f487dbd52d724 DOMI_2_0_10_RELEASE 528a2d8704eb773c20b4ef898b9f487dbd52d724 DOMI_2_0_10_RELEASE 0000000000000000000000000000000000000000 DOMI_2_0_10_RELEASE 0000000000000000000000000000000000000000 DOMI_2_0_10_RELEASE 318c516274b1310cb3d227fc8b35e8ac6582de69 DOMI_2_0_10_RELEASE b72c3dc211a0f6bb338138ef1d6ab7f87a38432c SEAMONKEY_2_9_1_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_5_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_5_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_5_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_5_BUILD2 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_5_BUILD3 b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_6b3_RELEASE 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_7b4_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_1_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_1_BUILD2 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_1_BUILD2 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_1_BUILD2 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1rc1_BUILD2 0bb7db177214fce684dd3cf23fbc08796ebf10c0 SEAMONKEY_2_1rc1_BUILD1 d4b766a12f533fdefd02d2eab54fd7f86ce1f985 REFLOW_20020412_BASE b6de3a5ce573ef015d0205070af30d3d1a9981f3 SEAMONKEY_2_11b1_RELEASE dfad1b2e38e44bd6bc76259455065382c5ac0949 SEAMONKEY_2_40_BUILD4 f1fc2297e2c50e4326c4d94e9c1cbaa2f05844d3 SEAMONKEY_2_0rc1_RELEASE 6b5ec09f3b1d218dbf5fa6423916cbb07058829d SEAMONKEY_2_11b5_BUILD1 6b5ec09f3b1d218dbf5fa6423916cbb07058829d SEAMONKEY_2_11b5_BUILD1 6b5ec09f3b1d218dbf5fa6423916cbb07058829d SEAMONKEY_2_11b5_BUILD1 2c63a5a42aa132b4b2f3a60eedf317997f9b0d07 THUNDERBIRD_3_3a3_RELEASE f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_8_BUILD1 f7d85b2095671aa4a69932dfa143cfff149d04a7 MOZILLA_1_5_RC1 77a21a719c0f50f0a3f4a0c9ab143ba863020bcb DOMI_2_0_15_RELEASE 84f2a58a989b09f40b9cd19f50f7987d89ac2471 DOMI_2_0_15_RELEASE 84f2a58a989b09f40b9cd19f50f7987d89ac2471 DOMI_2_0_15_RELEASE 58bcafc6b7a29cfeba38c7b214f62b4542eab192 DOMI_2_0_15_RELEASE c39783b41b92e321fd4fe3f6169abc1ceff16e48 SEAMONKEY_2_22b1_RELEASE 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_BUILD1 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_BUILD1 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_BUILD1 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_BUILD1 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_BUILD1 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_BUILD1 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_BUILD1 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_BUILD2 f2c4c9da8d1ee5c707aed532a67700aafe61eab2 SEAMONKEY_2_33_1_RELEASE 43c6839edab5ff4d55bfcafc2d4b62f84004d8d5 SEAMONKEY_2_1a1_RELEASE 665f9107126410b7caa1aefa3896ed0405ddc213 FORMREWRITE_20011008_BASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_29_RELEASE dfad1b2e38e44bd6bc76259455065382c5ac0949 SEAMONKEY_2_38b1_BUILD1 dfad1b2e38e44bd6bc76259455065382c5ac0949 SEAMONKEY_2_38b1_BUILD1 dfad1b2e38e44bd6bc76259455065382c5ac0949 SEAMONKEY_2_38b1_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_3_RELEASE 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_13_BUILD1 6b5ec09f3b1d218dbf5fa6423916cbb07058829d SEAMONKEY_2_11b6_BUILD1 e4024d150c234e46e162b6cfb5fb960ebe95d0c4 MOZILLA_1_2b_RELEASE f1fc2297e2c50e4326c4d94e9c1cbaa2f05844d3 SEAMONKEY_2_0_RELEASE 63d362f03ddbf68ef827ee683eb2568381ab203a THUNDERBIRD_3_3a2_BUILD1 b72c3dc211a0f6bb338138ef1d6ab7f87a38432c SEAMONKEY_2_9b3_RELEASE b72c3dc211a0f6bb338138ef1d6ab7f87a38432c SEAMONKEY_2_9b3_RELEASE b72c3dc211a0f6bb338138ef1d6ab7f87a38432c SEAMONKEY_2_9b3_RELEASE f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_7_BUILD1 27b0e9ef17154b6f610be366813445123e2bcb63 THUNDERBIRD_3_1_b2_RELEASE 27b0e9ef17154b6f610be366813445123e2bcb63 THUNDERBIRD_3_1_b2_RELEASE 27b0e9ef17154b6f610be366813445123e2bcb63 THUNDERBIRD_3_1_b2_RELEASE 27b0e9ef17154b6f610be366813445123e2bcb63 THUNDERBIRD_3_1_b2_RELEASE 27b0e9ef17154b6f610be366813445123e2bcb63 THUNDERBIRD_3_1_b2_RELEASE f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_9_BUILD1 76e20dc2aa87ee46eb756010a351ec8f0f71c256 SUNBIRD_0_3a2_RELEASE c39783b41b92e321fd4fe3f6169abc1ceff16e48 SEAMONKEY_2_21b2_BUILD1 c42fd9baba56a868859cd3417a5e1420ffa0d24b SEAMONKEY_2_11b4_RELEASE c42fd9baba56a868859cd3417a5e1420ffa0d24b SEAMONKEY_2_11b4_RELEASE c42fd9baba56a868859cd3417a5e1420ffa0d24b SEAMONKEY_2_11b4_RELEASE 1decc6e8c935550d2522c2fd3705b86bd81737f7 THUNDERBIRD_3_1_a2_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_10_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_10_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_10_BUILD1 f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_12_RELEASE f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_12_RELEASE f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_12_RELEASE 03cf7e93828fcc03f50a090615eaa01e6286705d SEAMONKEY_2_1a2_RELEASE 03cf7e93828fcc03f50a090615eaa01e6286705d SEAMONKEY_2_1a2_RELEASE 03cf7e93828fcc03f50a090615eaa01e6286705d SEAMONKEY_2_1a2_RELEASE f29bd158a37a1db722e2a80e66cc124764e674a2 IFRAME_20020207_BASE 05da7a0ecc8db059c6f67ca0429d586d024b7d4c DOM_AGNOSTIC3_BASE eca2476962980ce3dbc502d1ac839d2ab6bca33d NOIMG_20010801_TAG 869a1de4fc3f6c244798f29aa6311cc2377e66e2 SEAMONKEY_2_12_1_RELEASE 869a1de4fc3f6c244798f29aa6311cc2377e66e2 SEAMONKEY_2_12_1_RELEASE 869a1de4fc3f6c244798f29aa6311cc2377e66e2 SEAMONKEY_2_12_1_RELEASE 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_8b3_RELEASE 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_13b2_RELEASE f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_3_RELEASE f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_12_BUILD1 f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_12_BUILD1 f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_12_BUILD1 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_2_BUILD2 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_2_BUILD1 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_2_BUILD1 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_2_BUILD1 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_14b3_RELEASE 863a04e7d1c5eb4f7c95e0e2e6a842c14bc6f6ef SEAMONKEY_2_17b3_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_10_BUILD1 fb09601eae9552d0114ee6cd5867121debd6aaa1 XPC_IDISP_20020417_BASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_5_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_5_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_5_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_3_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df CALENDAR_1_0b2_BUILD1 cdf364d3620310a93eae913ddd562fcff6daccbb PSM_2_2_DEV_20010918_BASE 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_7b4_RELEASE 2ccf7f0e93a2187a7870101a23eade1e386cc682 THUNDERBIRD_0_7_1_RELEASE 94ddc709132f1e0221cbe8e58c0cdc5ce70353bc SEAMONKEY_2_15_1_RELEASE 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_4_1_RELEASE 869a1de4fc3f6c244798f29aa6311cc2377e66e2 SEAMONKEY_2_12b1_RELEASE 869a1de4fc3f6c244798f29aa6311cc2377e66e2 SEAMONKEY_2_12b1_RELEASE 869a1de4fc3f6c244798f29aa6311cc2377e66e2 SEAMONKEY_2_12b1_RELEASE 6bdd6adec346d57dc0883993a9ee70cec6f4efc2 MOZILLA_1_3a_RELEASE f99dd8e05b2e8118df700ef90084374e8b9779d4 MOZILLA_0_9_3_2001_07_31_BASE f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_13_RELEASE 87599cab4bd2c99527a3efceb8a523e6e6a9d870 SEAMONKEY_2_24b1_BUILD1 1c6b874b1fd9956c7081e00c08c14df54ad1e529 SEAMONKEY_2_25b2_RELEASE 1c6b874b1fd9956c7081e00c08c14df54ad1e529 SEAMONKEY_2_25b2_RELEASE 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_7_2_BUILD1 3e8ff1586e20a0726119c55007c0e2072d5ad075 MINIMO_6_AUG_2003_TAG c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26_BUILD1 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26_BUILD1 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26_BUILD1 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26_BUILD1 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26_BUILD1 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26_BUILD1 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26_BUILD1 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26_BUILD1 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26_BUILD1 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26_BUILD1 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26_BUILD1 17273e29319f65f2835cae7195cf7c1290360496 STATIC_BUILD_20010612_BASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_6_BUILD1 869a1de4fc3f6c244798f29aa6311cc2377e66e2 SEAMONKEY_2_12_1_BUILD2 89bd44ac4af5c5a7b54be554016549c601917cb5 MOZILLA_1_8_BASE **INVALID** b7db8f42fbf84b11e7438e6bdd1bd453a9831361 MOZILLA_1_5b_RELEASE 228a4ec0b2a8e7277f59b45009eda86bfa95949a FIREFOX_3_0_1_BUILD1 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_1_RELEASE 0c223c15699672d238b3b58086b15e20f90585dc STATIC_BUILD_20010418_BASE 02308bc6eb4c3c752d6fbc766d0afc13c466440f THUNDERBIRD_3_0b3_RELEASE 5a93979aeccc69a35f64383460d7774117fe4554 SEAMONKEY_2_0a3_RELEASE 5a93979aeccc69a35f64383460d7774117fe4554 SEAMONKEY_2_0a3_RELEASE 5a93979aeccc69a35f64383460d7774117fe4554 SEAMONKEY_2_0a3_RELEASE f2c4c9da8d1ee5c707aed532a67700aafe61eab2 SEAMONKEY_2_33_1_BUILD1 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16_1_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_rc1_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_rc1_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_rc1_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_rc1_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_rc1_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_rc1_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_rc1_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_31_BUILD1 b72c3dc211a0f6bb338138ef1d6ab7f87a38432c SEAMONKEY_2_9b4_RELEASE eef568e4ee05b819869103117f2c3798d7bed9a5 SEAMONKEY_2_1a3_RELEASE eef568e4ee05b819869103117f2c3798d7bed9a5 SEAMONKEY_2_1a3_RELEASE eef568e4ee05b819869103117f2c3798d7bed9a5 SEAMONKEY_2_1a3_RELEASE 697016a1e94419d7ce00b632d8aaad5f79894fd7 SEAMONKEY_2_3b1_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_15_BUILD1 94ddc709132f1e0221cbe8e58c0cdc5ce70353bc SEAMONKEY_2_15_2_BUILD1 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_3_BUILD1 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_3_2_BUILD1 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_3_2_BUILD1 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_3_2_BUILD1 f6278eaf61c76cca2fbf6bb51e219e53b8b329de XPCDOM_20010329_BASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_1_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_1_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_1_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_1_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_1_RELEASE ca35d7b7c443b268f55dd99b67c9d957d1728e84 SEAMONKEY_2_0b2_RELEASE 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_7_BUILD1 94ddc709132f1e0221cbe8e58c0cdc5ce70353bc SEAMONKEY_2_15b6_RELEASE 91a52d3cd459b2830a582439c6ef62b6a924c583 MAILIM_BASE dfad1b2e38e44bd6bc76259455065382c5ac0949 SEAMONKEY_2_38b1_RELEASE dfad1b2e38e44bd6bc76259455065382c5ac0949 SEAMONKEY_2_38b1_RELEASE dfad1b2e38e44bd6bc76259455065382c5ac0949 SEAMONKEY_2_38b1_RELEASE 863a04e7d1c5eb4f7c95e0e2e6a842c14bc6f6ef SEAMONKEY_2_17_1_RELEASE fa96487c45e69e3f77f5ab9ae2e7a4b47ca33b87 SEAMONKEY_2_0a2_BUILD1 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_3_RELEASE 863a04e7d1c5eb4f7c95e0e2e6a842c14bc6f6ef SEAMONKEY_2_17b1_BUILD1 ab61bce0ee8770c4f89a3bc8b7174853f784e749 MOTIF_LAST_RITES 61de88544d47c034ec8f3dd5006c663c22fb30cb DOMI_2_0_14_RELEASE 0000000000000000000000000000000000000000 DOMI_2_0_14_RELEASE ec464006febdcaa84637f6f3980e257a7ecb33f3 DOMI_2_0_14_RELEASE ec464006febdcaa84637f6f3980e257a7ecb33f3 DOMI_2_0_14_RELEASE 0000000000000000000000000000000000000000 DOMI_2_0_14_RELEASE 0000000000000000000000000000000000000000 DOMI_2_0_14_RELEASE 7ca2fdffb52123d97b9da7fa7be46b6d12eaeac1 DOMI_2_0_14_RELEASE 894241f24e4ea5e913344255c1ca8f9b98666dd8 DOMi_2_0_1_RELEASE 99db87031f1ffe62d0eb6a25dfead2af23a51b5f CW7_20011205_TAG 82b7d8a4f6b89254c97e94d1d37588acc11a30d8 SEAMONKEY_2_13b1_RELEASE 869a1de4fc3f6c244798f29aa6311cc2377e66e2 SEAMONKEY_2_12b2_RELEASE 32af14255f1346fb45573000b71ab4665ee5f653 SEAMONKEY_2_18b2_BUILD1 c39783b41b92e321fd4fe3f6169abc1ceff16e48 SEAMONKEY_2_23b2_BUILD1 869a1de4fc3f6c244798f29aa6311cc2377e66e2 SEAMONKEY_2_12b6_RELEASE b6de3a5ce573ef015d0205070af30d3d1a9981f3 SEAMONKEY_2_11b3_BUILD1 b6de3a5ce573ef015d0205070af30d3d1a9981f3 SEAMONKEY_2_11b3_BUILD1 b6de3a5ce573ef015d0205070af30d3d1a9981f3 SEAMONKEY_2_11b3_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_2_RELEASE 8baf80e84373a6745d70119c5ad5cc4c6d813165 THUNDERBIRD_3_0a1_BUILD1 b6de3a5ce573ef015d0205070af30d3d1a9981f3 SEAMONKEY_2_10_BUILD1 2ccdc4ad905e811a692ef94e6fe9f870dd241e41 THUNDERBIRD_1_1a1_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df CALENDAR_1_0b2_BUILD2 4fbd0f501d89e86d7e34458fd0d534ca860eaee1 MOZILLA_1_9a8_RELEASE 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_3_1_BUILD1 f61da7d6ad8b922abf018099aa4bf7619a64de97 FIREFOX_3_0b1_RC3 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_3_BUILD1 589ef9b749f58afc49649993227098b115de378f SEAMONKEY_2_7_RELEASE f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_11_BUILD1 f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_3_BUILD1 b075d299d44397fa021a75af11b344fb0bddeed7 SEAMONKEY_2_6b2_BUILD1 c39783b41b92e321fd4fe3f6169abc1ceff16e48 SEAMONKEY_2_22_BUILD1 32de4c4a4ce70e468f7b67252c4945cdd1ebc382 SEAMONKEY_2_20b2_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_30_RELEASE 74294a27c91803f115d747d393250ca5dda4b141 Style_20010518_Base c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_6_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_31b1_BUILD1 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_26b2_BUILD1 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_14b1_BUILD1 0ff0b47c92b7cd20c30de66bfff57dc24152c409 SEAMONKEY_2_8b5_BUILD1 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_31b2_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_30b2_RELEASE 14e6fe3a014aa51d4f5b6199692c2bbef0f3d453 MOZILLA_1_7b_RELEASE dfad1b2e38e44bd6bc76259455065382c5ac0949 SEAMONKEY_2_39_BUILD1 030eee04e40b5f50349089a38a2368a36c1e9af7 SEAMONKEY_2_14b1_RELEASE 94ddc709132f1e0221cbe8e58c0cdc5ce70353bc SEAMONKEY_2_15_1_BUILD1 32d3520a513bcd68d37c356bf6670f2264ea2ad0 MOZILLA_1_9a1_RC3 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_5b1_BUILD1 fe123b8ef1d98c7adaa72dfd7268966c4d209dd1 MINIMO_01302003_TAG 51975d5ac74417a934d9a10627916324b44cf002 BOOKMARKS_20030320_BASE 869a1de4fc3f6c244798f29aa6311cc2377e66e2 SEAMONKEY_2_12_RELEASE 10d78e2e475b62b16ff35f150851060e21a0abb6 SEAMONKEY_2_16b5_BUILD1 ea1e32ad6c1fbaf21dc573c2664ef91ea552d3c9 JS_1_7_ALPHA_MERGE b72c3dc211a0f6bb338138ef1d6ab7f87a38432c SEAMONKEY_2_10b2_BUILD1 dfad1b2e38e44bd6bc76259455065382c5ac0949 SEAMONKEY_2_39b1_RELEASE dfad1b2e38e44bd6bc76259455065382c5ac0949 SEAMONKEY_2_38_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_rc2_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_rc2_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_rc2_BUILD1 32de4c4a4ce70e468f7b67252c4945cdd1ebc382 SEAMONKEY_2_20b1_RELEASE 318c516274b1310cb3d227fc8b35e8ac6582de69 SEAMONKEY_2_3_1_RELEASE f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_8_RELEASE 40518a595a2e3681b03cbd4f23a29c732dc17441 MOZILLA_1_9a6_RC2 f3f70eccc3059b3e5cfc4bd75663902031a77e54 SEAMONKEY_2_19b1_RELEASE b72c3dc211a0f6bb338138ef1d6ab7f87a38432c SEAMONKEY_2_9b2_RELEASE b72c3dc211a0f6bb338138ef1d6ab7f87a38432c SEAMONKEY_2_9b2_RELEASE b72c3dc211a0f6bb338138ef1d6ab7f87a38432c SEAMONKEY_2_9b2_RELEASE 109295c19a3e204d82848fcefd51480d3d928c93 XULRUNNER_20040804_BASE dfad1b2e38e44bd6bc76259455065382c5ac0949 SEAMONKEY_2_40_BUILD1 dfad1b2e38e44bd6bc76259455065382c5ac0949 SEAMONKEY_2_40_BUILD1 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_29_1_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 DOMI_2_0_4_RELEASE 5a93979aeccc69a35f64383460d7774117fe4554 THUNDERBIRD_3_0b2_RELEASE 5a93979aeccc69a35f64383460d7774117fe4554 THUNDERBIRD_3_0b2_RELEASE 5a93979aeccc69a35f64383460d7774117fe4554 THUNDERBIRD_3_0b2_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_15_RELEASE 697016a1e94419d7ce00b632d8aaad5f79894fd7 SEAMONKEY_2_2_RELEASE 697016a1e94419d7ce00b632d8aaad5f79894fd7 SEAMONKEY_2_2_RELEASE 697016a1e94419d7ce00b632d8aaad5f79894fd7 SEAMONKEY_2_2_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 SUNBIRD_1_0b1_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 SUNBIRD_1_0b1_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 SUNBIRD_1_0b1_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 SUNBIRD_1_0b1_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 SUNBIRD_1_0b1_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 SUNBIRD_1_0b1_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 SUNBIRD_1_0b1_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 SUNBIRD_1_0b1_RELEASE ebe59a415752a5b8697b71e64d19734b8182d55c SUNBIRD_1_0b1_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 SUNBIRD_1_0b1_RELEASE 863a04e7d1c5eb4f7c95e0e2e6a842c14bc6f6ef SEAMONKEY_2_17b4_RELEASE 863a04e7d1c5eb4f7c95e0e2e6a842c14bc6f6ef SEAMONKEY_2_17b4_BUILD1 4b7ca9452f15ba060bb2552ade65dfccc46b0e03 BookmarksOutliner_20010601_BASE f6c78804ebb430b6ba6bfad0ee49af909870e023 SEAMONKEY_2_0_10_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_16_BUILD1 c1b38e365772f8583697fd24cf9c4caaf9e3a3df THUNDERBIRD_3_1_16_BUILD2 f470b4aff514005d60de42d9ca5518db67a271a4 MOZILLA_1_1b_RELEASE 82b7d8a4f6b89254c97e94d1d37588acc11a30d8 SEAMONKEY_2_13b1_BUILD1 87599cab4bd2c99527a3efceb8a523e6e6a9d870 SEAMONKEY_2_24b1_BUILD2 94ddc709132f1e0221cbe8e58c0cdc5ce70353bc SEAMONKEY_2_15b3_BUILD1 c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_29_1_RELEASE ================================================ FILE: extensions/inspector/.hg/hgrc ================================================ # example repository config (see "hg help config" for more info) [paths] default = https://hg.mozilla.org/dom-inspector/ # path aliases to other clones of this repo in URLs or filesystem paths # (see "hg help config.paths" for more info) # # default-push = ssh://jdoe@example.net/hg/jdoes-fork # my-fork = ssh://jdoe@example.net/hg/jdoes-fork # my-clone = /home/jdoe/jdoes-clone [ui] # name and email (local to this repository, optional), e.g. # username = Jane Doe ================================================ FILE: extensions/inspector/.hg/requires ================================================ dotencode fncache revlogv1 store ================================================ FILE: extensions/inspector/.hg/store/fncache ================================================ data/resources/locale/fr/viewers/accessibleProps.dtd.i data/resources/content/extensions/titledSplitter.css.i data/resources/content/object.xul.i data/base/.cvsignore.i data/resources/content/viewers/accessibleEvents/accessibleEvents.js.i data/resources/locale/ru/viewers/domNode.dtd.i data/base/public/inIFlasher.idl.i data/resources/content/jsutil/system/PrefUtils.js.i data/resources/locale/fr/search/findFiles.dtd.i data/resources/content/sidebar/InspectorSidebar.js.i data/resources/locale/da/viewers/computedStyle.dtd.i data/resources/content/viewers/accessibleObject/accessibleObject.xul.i data/resources/locale/en-US/viewers/accessibleProps.dtd.i data/resources/content/prefs/pref-inspector.xul.i data/resources/content/search/modules/junkImgs/dialog.js.i data/resources/locale/da/search/junkImgs.dtd.i data/resources/locale/el/viewers/accessibleProps.properties.i data/base/public/MANIFEST_IDL.i data/resources/content/Makefile.in.i data/resources/locale/de/viewers/accessibleTreeEvalJSDialog.dtd.i data/resources/locale/ca/inspector.dtd.i data/resources/locale/zh-TW/prefs.dtd.i data/resources/locale/en-GB/viewer-registry.dtd.i data/resources/locale/zh-CN/viewers/domNode.dtd.i data/resources/locale/el/viewers/accessibleTreeEvalJSDialog.dtd.i data/resources/locale/fr/viewers/computedStyle.dtd.i data/resources/locale/sk/viewers/styleRules.dtd.i data/resources/locale/sk/viewers/usedFontFaces.dtd.i data/resources/content/statusbarOverlay.xul.i data/resources/locale/fr/viewers/accessibleTreeEvalJSDialog.dtd.i data/resources/locale/en-GB/viewers/accessibleEvents.properties.i data/resources/locale/cs/viewers/boxModel.dtd.i data/base/src/makefile.win.i data/resources/locale/fi/prefs.dtd.i data/base/src/.cvsignore.i data/resources/locale/cs-CZ/viewers/styleRules.dtd.i data/base/src/win/.cvsignore.i data/resources/locale/fi/viewers/accessibleEvents.properties.i data/resources/content/viewers/dom/popupOverlay.xul.i data/resources/locale/pt-BR/search/findFiles.dtd.i data/resources/locale/sk/viewers/stylesheets.dtd.i data/resources/locale/cs-CZ/viewers/boxModel.dtd.i data/resources/content/inspector-prefs.rdf.i data/resources/locale/sv-SE/search/findFiles.dtd.i data/.hgtags.i data/base/public/inISearchOrphanImages.idl.i data/resources/locale/zh-TW/editing.dtd.i data/resources/locale/zh-CN/viewers/stylesheets.dtd.i data/base/src/inCSSValueSearch.cpp.i data/resources/content/jsutil/system/clipboardFlavors.js.i data/resources/content/sidebar.xul.i data/resources/locale/de/inspector.dtd.i data/resources/locale/de/viewers/accessibleEventsHandlerHelpDialog.dtd.i data/resources/locale/en-US/contents.rdf.i data/resources/locale/fi/viewers/usedFontFaces.dtd.i data/resources/locale/ru/viewers/boxModel.dtd.i data/resources/locale/pl/inspector.properties.i data/resources/locale/sv-SE/viewers/usedFontFaces.dtd.i data/resources/locale/ga-IE/viewers/dom.dtd.i data/resources/locale/fi/viewers/accessibleEventsHandlerHelpDialog.dtd.i data/macbuild/inspectorIDL.xml.i data/resources/skin/modern/btnFind.gif.i data/resources/locale/de/viewers/accessibleEvents.properties.i data/base/src/win/Makefile.in.i data/resources/skin/classic/titledSplitter.css.i data/resources/locale/fi/viewers/accessibleTreeEvalJSDialog.dtd.i data/resources/skin/classic/.cvsignore.i data/resources/locale/sk/viewers/accessibleTree.dtd.i data/resources/locale/ga-IE/viewers/xblBindings.dtd.i data/base/src/nsCSSDecIntHolder.h.i data/base/src/nsDOMDSResource.h.i data/resources/locale/de/search/findFiles.dtd.i data/resources/skin/classic/viewers/domNode/domNode.css.i data/resources/locale/cs-CZ/prefs.dtd.i data/resources/locale/pl/search/junkImgs.dtd.i data/resources/locale/pl/viewers/jsObject.dtd.i data/resources/content/tasksOverlay.xul.i data/resources/locale/nb-NO/viewers/accessibleProps.dtd.i data/resources/content/inspector.xul.i data/resources/locale/pt-BR/prefs.dtd.i data/base/public/inIBitmapURI.idl.i data/resources/content/viewers/accessibleEvent/accessibleEvent.js.i data/resources/locale/pl/viewers/accessibleTreeEvalJSDialog.dtd.i data/resources/locale/fi/viewers/styleRules.dtd.i data/resources/locale/hu/viewers/xblBindings.dtd.i data/resources/locale/pl/viewers/usedFontFaces.dtd.i data/resources/locale/zh-CN/viewers/dom.dtd.i data/build/src/inspector.pkg.i data/resources/content/jsutil/rdf/RDFU.js.i data/resources/locale/fr/prefs.dtd.i data/Makefile.in.i data/resources/locale/ru/prefs.dtd.i data/resources/locale/de/viewer-registry.dtd.i data/resources/locale/en-GB/viewers/usedFontFaces.dtd.i data/resources/skin/classic/inspectorWindow.css.i data/base/src/inFileSearch.h.i data/resources/content/viewers/styleRules/styleRules.js.i data/resources/skin/makefile.win.i data/resources/locale/ca/viewers/domNode.dtd.i data/resources/content/jsutil/xul/DNDUtils.js.i data/resources/skin/classic/iconViewerList-dis.gif.i data/base/public/inICSSValueSearch.idl.i data/resources/content/viewers/jsObject/jsObjectViewer.xul.i data/build/src/makefile.win.i data/resources/skin/Makefile.in.i data/base/public/inIBitmap.idl.i data/resources/content/res/winInspectorMain.ico.i data/resources/skin/modern/iconImportant.gif.i data/resources/skin/classic/viewers/accessibleEvents/accessibleEvents.css.i data/resources/locale/ca/viewers/jsObject.dtd.i data/resources/content/viewers/accessibleEvent/accessibleEvent.xul.i data/resources/locale/makefile.win.i data/resources/content/jsutil/system/DiskSearch.js.i data/resources/locale/ga-IE/search/findFiles.dtd.i data/resources/content/viewers/accessibleTree/evalJSDialog.xul.i data/resources/locale/en-US/viewer-registry.dtd.i data/resources/locale/el/viewers/styleRules.dtd.i data/build/Makefile.in.i data/resources/content/inspectorOverlay.xul.i data/resources/locale/ca/viewers/xblBindings.dtd.i data/resources/content/jsutil/xul/inTreeBuilder.js.i data/resources/locale/cs-CZ/search/findFiles.dtd.i data/resources/content/util.dtd.i data/resources/locale/sv-SE/viewers/boxModel.dtd.i data/macbuild/inspectorIDL.mcp.i data/resources/locale/ru/viewers/dom.dtd.i data/resources/content/search/modules/popupOverlay.xul.i data/resources/content/extensions/multipanel.css.i data/resources/locale/ru/viewers/accessibleProps.dtd.i data/resources/locale/pl/viewers/accessibleEventsHandlerHelpDialog.dtd.i data/resources/locale/fr/viewers/accessibleEvents.dtd.i data/resources/content/ViewerPane.js.i data/resources/locale/fr/viewer-registry.dtd.i data/resources/locale/fi/viewers/domNode.dtd.i data/resources/locale/pl/viewers/accessibleEvent.dtd.i data/resources/locale/sv-SE/editing.dtd.i data/base/src/inBitmapChannel.h.i data/resources/locale/fr/tasksOverlay.dtd.i data/resources/locale/en-GB/viewers/boxModel.dtd.i data/resources/skin/modern/sidebar.css.i data/base/src/Makefile.in.i data/resources/content/contents.rdf.i data/resources/locale/nb-NO/inspector.properties.i data/resources/locale/nb-NO/viewers/dom.dtd.i data/resources/locale/da/editing.dtd.i data/resources/locale/en-US/inspector.dtd.i data/resources/locale/hu/viewers/styleRules.dtd.i data/resources/skin/classic/viewerPane.css.i data/resources/content/extensions/wsm-colorpicker.js.i data/resources/content/jsutil/system/ClipboardUtils.js.i data/resources/locale/contents.rdf.i data/resources/locale/hu/search/junkImgs.dtd.i data/resources/locale/de/viewers/domNode.dtd.i data/resources/locale/pl/viewer-registry.dtd.i data/resources/content/search/modules/findFiles/dialog.xul.i data/build/.cvsignore.i data/resources/locale/el/viewers/dom.dtd.i data/resources/locale/ru/viewers/accessibleTree.dtd.i data/resources/skin/classic/jar.mn.i data/resources/locale/de/viewers/accessibleEvents.dtd.i data/resources/locale/pt-BR/inspector.dtd.i data/resources/content/browserOverlay.xul.i data/resources/Makefile.in.i data/resources/content/viewerOverlay.xul.i data/base/public/nsIDOMDSResource.idl.i data/resources/skin/classic/iconViewerMenu-dis.gif.i data/resources/content/extensions/titledSplitter.xml.i data/resources/locale/en-US/viewers/accessibleEvents.properties.i data/macbuild/inspector.mcp.i data/resources/locale/pl/viewers/styleRules.dtd.i data/resources/locale/sv-SE/viewers/accessibleEventsHandlerHelpDialog.dtd.i data/resources/skin/modern/ImageSearchItem.gif.i data/resources/content/prefs/prefsOverlay.xul.i data/resources/skin/classic/multipanel.css.i data/resources/skin/modern/titledSplitter.css.i data/base/js/moz.build.i data/resources/skin/classic/btnFind.gif.i data/resources/locale/pt-BR/inspector.properties.i data/resources/locale/de/viewers/styleRules.dtd.i data/resources/locale/da/viewers/boxModel.dtd.i data/resources/locale/nb-NO/prefs.dtd.i data/resources/content/viewers/jsObject/jsObject.xul.i data/resources/skin/classic/Makefile.in.i data/resources/locale/ru/viewers/jsObject.dtd.i data/resources/locale/cs/viewers/styleRules.dtd.i data/resources/locale/en-GB/viewers/accessibleProps.properties.i data/resources/locale/en-US/viewers/domNode.dtd.i data/resources/locale/nb-NO/tasksOverlay.dtd.i data/resources/locale/ga-IE/search/junkImgs.dtd.i data/base/src/inFlasher.cpp.i data/resources/locale/en-US/search/junkImgs.dtd.i data/resources/content/viewers/dom/insertDialog.js.i data/build/src/Makefile.in.i data/resources/content/object.js.i data/resources/locale/en-US/jar.mn.i data/resources/skin/classic/sidebar.css.i data/resources/skin/classic/viewers/boxModel/boxModel.css.i data/resources/content/viewers/stylesheets/stylesheets.xul.i data/resources/locale/fr/viewers/accessibleTree.dtd.i data/resources/locale/sv-SE/viewers/accessibleProps.dtd.i data/base/public/nsICSSDecIntHolder.idl.i data/base/src/nsCSSDecDataSource.cpp.i data/resources/locale/ca/search/findFiles.dtd.i data/resources/locale/pl/inspector.dtd.i data/resources/skin/modern/btnSelecting-dis.gif.i data/resources/locale/sv-SE/viewer-registry.dtd.i data/resources/locale/zh-CN/prefs.dtd.i data/resources/skin/modern/makefile.win.i data/base/src/inCSSValueSearch.h.i data/resources/skin/classic/viewers/nodeText/nodeText.css.i data/base/src/win/inScreenCapturer.cpp.i data/resources/content/viewers/accessibleRelations/accessibleRelations.xul.i data/resources/locale/da/viewers/domNode.dtd.i data/resources/content/search/inSearchTreeBuilder.js.i data/base/moz.build.i data/resources/locale/sv-SE/viewers/accessibleTreeEvalJSDialog.dtd.i data/resources/skin/classic/ImageSearchItem.gif.i data/resources/locale/el/viewers/accessibleEvents.properties.i data/resources/locale/zh-CN/tasksOverlay.dtd.i data/resources/locale/fi/viewers/stylesheets.dtd.i data/resources/locale/zh-TW/search/findFiles.dtd.i data/base/src/inBitmapDecoder.h.i data/resources/locale/sv-SE/viewers/dom.dtd.i data/resources/locale/en-US/tasksOverlay.dtd.i data/resources/locale/da/inspector.properties.i data/resources/locale/zh-CN/viewers/styleRules.dtd.i data/resources/locale/el/viewers/accessibleEvents.dtd.i data/resources/skin/classic/iconViewerList.gif.i data/resources/locale/zh-TW/tasksOverlay.dtd.i data/resources/locale/nb-NO/viewers/domNode.dtd.i data/resources/locale/sv-SE/viewers/stylesheets.dtd.i data/resources/skin/modern/iconViewerList-dis.gif.i data/base/src/win/makefile.win.i data/resources/locale/en-US/viewers/accessibleEventsHandlerHelpDialog.dtd.i data/base/src/win/inScreenCapturer.h.i data/resources/locale/el/viewers/stylesheets.dtd.i data/resources/locale/fi/viewers/accessibleProps.dtd.i data/macbuild/Inspector.Prefix.i data/resources/locale/fr/viewers/xblBindings.dtd.i data/resources/locale/en-US/viewers/boxModel.dtd.i data/resources/locale/cs/viewers/xblBindings.dtd.i data/resources/locale/sk/inspector.properties.i data/resources/locale/sv-SE/viewers/accessibleEvents.dtd.i data/resources/content/viewers/domNode/domNodeDialog.js.i data/base/src/inFileSearch.cpp.i data/resources/locale/sk/viewers/accessibleEvent.dtd.i data/makefiles.sh.i data/resources/locale/cs/editing.dtd.i data/base/src/inLayoutUtils.cpp.i data/resources/content/search/modules/findFiles/findFiles.xml.i data/resources/locale/en-US/viewers/xblBindings.dtd.i data/resources/locale/en-US/viewers/accessibleTree.dtd.i data/resources/locale/ca/inspector.properties.i data/resources/locale/sv-SE/inspector.dtd.i data/resources/locale/nb-NO/editing.dtd.i data/base/src/inBitmapDepot.cpp.i data/resources/skin/modern/btnSelecting-act.gif.i data/resources/locale/cs-CZ/viewers/jsObject.dtd.i data/resources/locale/fi/viewers/dom.dtd.i data/resources/skin/classic/viewers/dom/findDialog.css.i data/resources/locale/el/viewers/computedStyle.dtd.i data/resources/locale/nb-NO/inspector.dtd.i data/resources/locale/pt-BR/viewers/boxModel.dtd.i data/resources/locale/zh-TW/viewers/styleRules.dtd.i data/resources/locale/en-GB/viewers/accessibleEvents.dtd.i data/resources/locale/en-US/viewers/accessibleProps.properties.i data/resources/locale/en-US/viewers/accessibleRelations.dtd.i data/resources/locale/ga-IE/viewers/styleRules.dtd.i data/resources/content/extensions/multipanel.xml.i data/resources/locale/sk/prefs.dtd.i data/resources/locale/pt-BR/search/junkImgs.dtd.i data/resources/content/viewers/dom/FindDialog.js.i data/resources/locale/pl/viewers/accessibleEvents.dtd.i data/base/src/dsinfo.h.i data/resources/locale/cs-CZ/viewers/xblBindings.dtd.i data/resources/content/viewers/xblBindings/xblBindings.xul.i data/resources/content/search/inSearchModule.js.i data/resources/locale/pl/search/findFiles.dtd.i data/resources/locale/.cvsignore.i data/resources/content/prefs/pref-inspector.js.i data/resources/locale/en-GB/viewers/accessibleTreeEvalJSDialog.dtd.i data/resources/content/viewers/domNode/domNode.xul.i data/base/public/inIDeepTreeWalker.idl.i data/resources/locale/zh-TW/inspector.dtd.i data/resources/content/res/winInspectorMain.xpm.i data/resources/locale/zh-CN/inspector.dtd.i data/resources/content/viewers/usedFontFaces/usedFontFaces.js.i data/resources/locale/en-US/makefile.win.i data/resources/skin/classic/iconViewerMenu.gif.i data/resources/locale/ga-IE/tasksOverlay.dtd.i data/resources/locale/cs-CZ/tasksOverlay.dtd.i data/resources/content/prefs/pref-sidebar.js.i data/resources/locale/en-GB/viewers/domNode.dtd.i data/resources/locale/ga-IE/viewers/domNode.dtd.i data/resources/locale/cs/viewers/accessibleTree.dtd.i data/resources/locale/hu/inspector.properties.i data/resources/locale/el/viewers/boxModel.dtd.i data/resources/content/commandOverlay.xul.i data/resources/locale/de/search/junkImgs.dtd.i data/resources/content/search/modules/commandOverlay.xul.i data/resources/locale/en-GB/viewers/xblBindings.dtd.i data/resources/locale/zh-TW/viewers/boxModel.dtd.i data/resources/content/prefs/inspector.js.i data/resources/locale/ca/viewers/styleRules.dtd.i data/resources/content/res/Linux/winInspectorMain.xpm.i data/base/src/inBitmapDecoder.cpp.i data/resources/locale/cs/viewers/computedStyle.dtd.i data/resources/content/viewers/dom/keysetOverlay.xul.i data/resources/locale/sk/editing.dtd.i data/resources/content/viewers/accessibleTree/accessibleTree.js.i data/resources/locale/fr/inspector.properties.i data/resources/locale/de/viewers/accessibleTree.dtd.i data/resources/locale/ru/viewers/accessibleEvents.properties.i data/resources/locale/ru/viewers/accessibleProps.properties.i data/resources/skin/modern/treeEditable.css.i data/resources/locale/el/viewers/usedFontFaces.dtd.i data/base/public/inIPNGEncoder.idl.i data/resources/content/viewers/nodeElement/nodeElement.xul.i data/base/public/inIDOMRDFResource.idl.i data/resources/content/toolboxOverlay.xul.i data/base/public/nsICSSRuleDataSource.idl.i data/resources/skin/modern/viewers/xblBindings/xblBindings.css.i data/resources/locale/sv-SE/viewers/domNode.dtd.i data/resources/locale/fi/viewers/accessibleTree.dtd.i data/resources/locale/sv-SE/viewers/accessibleEvents.properties.i data/resources/locale/sv-SE/viewers/styleRules.dtd.i data/resources/locale/ru/viewers/accessibleTreeEvalJSDialog.dtd.i data/resources/content/viewers/nodeElement/nodeElement.js.i data/base/src/inBitmapURI.cpp.i data/resources/content/viewers/accessibleRelations/accessibleRelations.js.i data/resources/locale/cs-CZ/inspector.dtd.i data/base/src/inBitmapProtocolHandler.cpp.i data/resources/content/search/modules/junkImgs/dialog.xul.i data/resources/locale/pl/viewers/accessibleRelations.dtd.i data/resources/skin/classic/viewers/accessibleTree/accessibleTree.css.i data/resources/content/viewers/nodeText/nodeText.xul.i data/resources/locale/ru/viewers/computedStyle.dtd.i data/base/src/inBitmapChannel.cpp.i data/resources/content/viewers/accessibleEvents/handlerHelpDialog.xul.i data/resources/skin/modern/viewers/boxModel/boxModel.css.i data/resources/locale/sk/viewers/computedStyle.dtd.i data/resources/locale/en-GB/viewers/accessibleRelations.dtd.i data/base/src/inSearchItemImage.cpp.i data/resources/locale/cs/viewers/accessibleEvent.dtd.i data/resources/locale/moz.build.i data/resources/locale/cs/viewers/accessibleProps.dtd.i data/resources/locale/en-US/.cvsignore.i data/resources/content/viewers/boxModel/boxModel.js.i data/resources/locale/fi/viewers/accessibleEvents.dtd.i data/resources/makefile.win.i data/resources/locale/en-GB/viewers/dom.dtd.i data/resources/locale/sk/search/junkImgs.dtd.i data/resources/content/jsutil/xul/inDataTreeView.js.i data/resources/content/extensions/treeEditable.xml.i data/resources/skin/modern/titledsplitter-close.gif.i data/resources/locale/de/viewers/boxModel.dtd.i data/resources/skin/modern/multipanel.css.i data/resources/locale/sk/viewers/accessibleProps.dtd.i data/resources/content/sidebar.js.i data/resources/locale/ga-IE/viewers/boxModel.dtd.i data/resources/locale/sk/viewers/xblBindings.dtd.i data/resources/locale/pl/viewers/boxModel.dtd.i data/resources/locale/en-US/viewers/nodeElement.dtd.i data/resources/locale/el/inspector.dtd.i data/resources/locale/de/viewers/computedStyle.dtd.i data/resources/locale/da/viewers/xblBindings.dtd.i data/resources/content/prefs/prefs.xul.i data/resources/locale/sk/inspector.dtd.i data/resources/locale/en-US/prefs.dtd.i data/resources/skin/classic/inspector.css.i data/resources/locale/pl/editing.dtd.i data/resources/locale/en-GB/editing.dtd.i data/resources/skin/classic/viewers/dom/dom.css.i data/resources/locale/ru/viewers/accessibleEventsHandlerHelpDialog.dtd.i data/resources/locale/ga-IE/prefs.dtd.i data/resources/locale/ru/viewers/accessibleEvent.dtd.i data/resources/locale/de/viewers/accessibleEvent.dtd.i data/base/src/inFlasher.h.i data/resources/locale/el/viewers/jsObject.dtd.i data/resources/locale/sk/viewers/dom.dtd.i data/resources/locale/hu/viewers/dom.dtd.i data/base/src/nsCSSDecDataSource.h.i data/resources/locale/sv-SE/tasksOverlay.dtd.i data/resources/locale/nb-NO/viewers/styleRules.dtd.i data/resources/content/res/viewer-registry.rdf.i data/resources/content/viewers/dom/dom.js.i data/resources/skin/classic/btnFind-dis.gif.i data/base/public/.cvsignore.i data/resources/locale/de/inspector.properties.i data/resources/locale/de/viewers/usedFontFaces.dtd.i data/resources/locale/ru/search/findFiles.dtd.i data/resources/locale/el/viewers/accessibleRelations.dtd.i data/resources/locale/ga-IE/viewers/jsObject.dtd.i data/resources/locale/en-GB/viewers/accessibleEventsHandlerHelpDialog.dtd.i data/resources/locale/fr/viewers/stylesheets.dtd.i data/resources/content/res/OS2/winInspectorMain.ico.i data/resources/locale/cs-CZ/editing.dtd.i data/resources/content/jsutil/xul/inTreeTableBuilder.js.i data/resources/locale/zh-TW/viewers/xblBindings.dtd.i data/base/js/inspector-cmdline.js.i data/resources/content/InspectorApp.js.i data/resources/locale/ca/viewers/stylesheets.dtd.i data/resources/locale/pt-BR/viewers/jsObject.dtd.i data/resources/skin/classic/viewers/accessibleProps/accessibleProps.css.i data/resources/content/jsutil/xul/inFormManager.js.i data/resources/locale/fi/viewer-registry.dtd.i data/resources/content/contents.rdf.in.i data/build/makefile.win.i data/resources/locale/fi/viewers/jsObject.dtd.i data/resources/content/prefs/MANIFEST.i data/resources/locale/sv-SE/viewers/xblBindings.dtd.i data/resources/skin/modern/viewers/accessibleProps/accessibleProps.css.i data/resources/content/.cvsignore.i data/resources/locale/sk/viewers/accessibleEventsHandlerHelpDialog.dtd.i data/resources/locale/pl/viewers/accessibleTree.dtd.i data/resources/locale/el/tasksOverlay.dtd.i data/resources/locale/ca/tasksOverlay.dtd.i data/resources/content/search/inSearchUtils.js.i data/resources/content/viewers/domNode/domNode.js.i data/base/public/inISearchProcess.idl.i data/resources/skin/classic/panelset.css.i data/resources/content/inspector.css.i data/resources/locale/pl/viewers/computedStyle.dtd.i data/resources/locale/da/viewers/jsObject.dtd.i data/resources/content/search-registry.rdf.i data/resources/locale/fi/inspector.dtd.i data/resources/locale/fi/viewers/accessibleProps.properties.i data/resources/content/search/modules/junkImgs/junkImgs.xml.i data/resources/locale/pt-BR/viewers/styleRules.dtd.i data/resources/locale/pt-BR/editing.dtd.i data/resources/locale/zh-CN/viewers/jsObject.dtd.i data/resources/content/viewers/computedStyle/computedStyle.xul.i data/resources/locale/sv-SE/viewers/accessibleProps.properties.i data/resources/skin/modern/iconViewerMenu-dis.gif.i data/resources/locale/el/viewers/accessibleTree.dtd.i data/resources/locale/pt-BR/tasksOverlay.dtd.i data/resources/locale/cs-CZ/viewers/stylesheets.dtd.i data/resources/skin/modern/viewers/accessibleEvent/accessibleEvent.css.i data/resources/skin/classic/btnSelecting.gif.i data/resources/locale/da/viewers/stylesheets.dtd.i data/resources/skin/modern/panelset.css.i data/resources/locale/en-US/viewers/accessibleEvent.dtd.i data/resources/locale/sv-SE/inspector.properties.i data/resources/skin/classic/titledsplitter-close.gif.i data/resources/content/viewers/dom/insertDialog.xul.i data/resources/locale/en-GB/prefs.dtd.i data/base/src/nsDOMDataSource.h.i data/resources/locale/zh-CN/search/junkImgs.dtd.i data/resources/locale/el/viewers/xblBindings.dtd.i data/resources/locale/fr/viewers/accessibleProps.properties.i data/resources/skin/classic/viewers/nodeElement/nodeElement.css.i data/resources/skin/modern/viewers/styleRules/styleRules.css.i data/resources/locale/de/editing.dtd.i data/resources/locale/fr/viewers/accessibleEvents.properties.i data/resources/locale/sk/search/findFiles.dtd.i data/resources/locale/cs/tasksOverlay.dtd.i data/resources/locale/sv-SE/viewers/jsObject.dtd.i data/resources/locale/de/tasksOverlay.dtd.i data/resources/skin/.cvsignore.i data/resources/locale/hu/viewers/computedStyle.dtd.i data/resources/content/viewers/dom/commandOverlay.xul.i data/resources/content/viewer-registry.rdf.i data/resources/content/jsutil/xul/inBaseTreeView.js.i data/resources/content/keysetOverlay.xul.i data/resources/locale/sv-SE/viewers/computedStyle.dtd.i data/resources/locale/en-US/viewers/jsObject.dtd.i data/resources/locale/nb-NO/search/findFiles.dtd.i data/resources/content/res/WINNT/winInspectorMain.ico.i data/base/src/inSearchLoop.h.i data/resources/content/viewers/jsObject/evalExprDialog.js.i data/resources/skin/modern/Makefile.in.i data/resources/content/viewers/dom/pseudoClassDialog.xul.i data/macbuild/inspector.xml.i data/install.rdf.i data/resources/locale/fr/viewers/accessibleRelations.dtd.i data/resources/locale/ru/viewers/accessibleRelations.dtd.i data/resources/content/jsutil/xul/FrameExchange.js.i data/base/src/inBitmap.cpp.i data/base/src/inBitmapURI.h.i data/resources/locale/cs/viewers/accessibleEvents.dtd.i data/resources/locale/nb-NO/viewers/computedStyle.dtd.i data/resources/content/viewers/styleRules/keysetOverlay.xul.i data/resources/content/viewers/accessibleObject/accessibleObject.js.i data/resources/locale/fr/inspector.dtd.i data/resources/content/tasksOverlay-mobile.xul.i data/resources/locale/nb-NO/viewers/jsObject.dtd.i data/resources/locale/fi/tasksOverlay.dtd.i data/resources/locale/fi/viewers/accessibleEvent.dtd.i data/resources/content/viewers/accessibleProps/accessibleProps.js.i data/resources/locale/ru/search/junkImgs.dtd.i data/base/src/inDOMDataSource.cpp.i data/resources/locale/ca/viewers/boxModel.dtd.i data/resources/locale/sv-SE/search/junkImgs.dtd.i data/resources/content/utils.js.i data/resources/locale/sv-SE/viewers/accessibleEvent.dtd.i data/resources/locale/hu/viewers/stylesheets.dtd.i data/resources/locale/en-GB/viewers/stylesheets.dtd.i data/base/src/inDeepTreeWalker.h.i data/base/public/inIFileSearch.idl.i data/resources/content/sidebar/sidebar.xul.i data/resources/content/viewers/dom/pseudoClassDialog.js.i data/resources/locale/fr/viewers/accessibleEventsHandlerHelpDialog.dtd.i data/resources/content/viewers/dom/dom.xul.i data/resources/locale/fr/viewers/jsObject.dtd.i data/resources/locale/nb-NO/viewers/xblBindings.dtd.i data/base/public/inIDOMDataSource.idl.i data/build/moz.build.i data/resources/locale/en-US/inspector.properties.i data/resources/skin/modern/viewers/nodeElement/nodeElement.css.i data/resources/locale/zh-TW/viewers/dom.dtd.i data/resources/locale/fr/editing.dtd.i data/resources/content/editingOverlay.xul.i data/resources/locale/en-US/Makefile.in.i data/.hgignore.i data/resources/locale/en-GB/viewers/jsObject.dtd.i data/resources/skin/modern/inspectorWindow.css.i data/resources/locale/de/prefs.dtd.i data/resources/locale/hu/inspector.dtd.i data/resources/locale/ca/viewers/computedStyle.dtd.i data/resources/content/inspector-history.rdf.i data/resources/locale/nb-NO/viewers/stylesheets.dtd.i data/resources/locale/zh-CN/inspector.properties.i data/resources/locale/hu/search/findFiles.dtd.i data/resources/skin/classic/iconImportant.gif.i data/resources/locale/ru/tasksOverlay.dtd.i data/resources/locale/de/viewers/xblBindings.dtd.i data/resources/locale/sk/viewers/jsObject.dtd.i data/base/public/inIDOMView.idl.i data/resources/content/jar.mn.i data/base/public/inIScreenCapturer.idl.i data/resources/locale/sk/viewers/accessibleEvents.properties.i data/resources/locale/ru/viewers/accessibleEvents.dtd.i data/resources/locale/sk/viewers/accessibleEvents.dtd.i data/base/js/Makefile.in.i data/base/public/nsICSSDecDataSource.idl.i data/resources/skin/modern/iconViewerMenu.gif.i data/resources/locale/pl/viewers/accessibleProps.properties.i data/resources/locale/zh-CN/viewers/boxModel.dtd.i data/base/src/inDOMUtils.cpp.i data/resources/locale/ru/inspector.properties.i data/resources/locale/ga-IE/editing.dtd.i data/resources/content/viewers/styleRules/popupOverlay.xul.i data/resources/skin/classic/btnSelecting-dis.gif.i data/resources/locale/cs-CZ/viewers/domNode.dtd.i data/resources/skin/classic/makefile.win.i data/resources/locale/el/viewers/accessibleEventsHandlerHelpDialog.dtd.i data/resources/locale/pl/prefs.dtd.i data/resources/locale/cs-CZ/search/junkImgs.dtd.i data/resources/locale/zh-TW/search/junkImgs.dtd.i data/resources/locale/de/viewers/accessibleRelations.dtd.i data/resources/locale/ga-IE/inspector.properties.i data/resources/locale/de/viewers/stylesheets.dtd.i data/resources/locale/pl/viewers/accessibleProps.dtd.i data/resources/skin/modern/btnSelecting.gif.i data/resources/locale/fr/viewers/dom.dtd.i data/base/public/inIBitmapDepot.idl.i data/resources/locale/ga-IE/viewers/stylesheets.dtd.i data/resources/content/viewers/xblBindings/xblBindings.js.i data/resources/skin/modern/contents.rdf.i data/resources/skin/modern/btnFind-dis.gif.i data/resources/skin/modern/jar.mn.i data/resources/content/prefs/pref-sidebar.xul.i data/resources/content/extensions/treeEditable.css.i data/resources/skin/classic/btnSelecting-act.gif.i data/resources/locale/en-US/viewers/computedStyle.dtd.i data/resources/locale/zh-CN/viewers/xblBindings.dtd.i data/resources/locale/cs/viewers/jsObject.dtd.i data/resources/locale/sv-SE/viewers/accessibleTree.dtd.i data/base/src/inDOMRDFResource.h.i data/base/src/inSearchOrphanImages.cpp.i data/base/src/inSearchOrphanImages.h.i data/resources/content/jsutil/system/FilePickerUtils.js.i data/resources/skin/modern/viewers/dom/columnsDialog.css.i data/resources/locale/pl/viewers/dom.dtd.i data/base/src/inDOMView.cpp.i data/resources/locale/cs/prefs.dtd.i data/resources/skin/modern/iconViewerList.gif.i data/resources/locale/pl/viewers/stylesheets.dtd.i data/resources/skin/classic/viewers/accessibleEvent/accessibleEvent.css.i data/resources/locale/ca/viewers/dom.dtd.i data/base/public/inISearchObserver.idl.i data/resources/locale/ru/viewers/xblBindings.dtd.i data/resources/locale/en-US/viewers/dom.dtd.i data/resources/skin/modern/viewers/dom/findDialog.css.i data/resources/content/tasksOverlay-ff.xul.i data/resources/content/search/inSearchService.js.i data/resources/content/viewers/dom/findDialog.xul.i data/base/src/nsCSSDecIntHolder.cpp.i data/resources/locale/el/inspector.properties.i data/resources/locale/hu/prefs.dtd.i data/resources/content/inspector.xml.i data/resources/locale/nb-NO/viewers/accessibleEvents.dtd.i data/resources/content/tasksOverlay-sb.xul.i data/resources/locale/en-US/viewers/accessibleEvents.dtd.i data/base/src/nsDOMDataSource.cpp.i data/resources/locale/ca/editing.dtd.i data/base/src/inDeepTreeWalker.cpp.i data/resources/locale/zh-TW/viewers/domNode.dtd.i data/resources/locale/jar.mn.i data/resources/locale/sv-SE/prefs.dtd.i data/resources/locale/nb-NO/viewers/boxModel.dtd.i data/resources/locale/ru/viewers/usedFontFaces.dtd.i data/resources/skin/modern/viewers/dom/dom.css.i data/resources/content/res/Linux/winInspectorMain16.xpm.i data/resources/content/viewers/accessibleTree/evalJSDialog.js.i data/resources/content/viewers/boxModel/boxModel.xul.i data/base/src/inDOMDataSource.h.i data/resources/content/viewers/styleRules/commandOverlay.xul.i data/resources/content/jsutil/xul/inOutlinerBuilder.js.i data/base/src/nsCSSRuleDataSource.cpp.i data/.cvsignore.i data/base/src/nsCSSRuleDataSource.h.i data/resources/locale/zh-TW/viewers/computedStyle.dtd.i data/resources/locale/ru/viewer-registry.dtd.i data/resources/locale/nb-NO/viewers/accessibleTree.dtd.i data/resources/.cvsignore.i data/build/src/.cvsignore.i data/resources/content/res/MANIFEST.i data/resources/content/viewers/accessibleEvents/accessibleEvents.xul.i data/resources/locale/ca/search/junkImgs.dtd.i data/jar.mn.i data/base/src/inDOMView.h.i data/resources/content/viewers/accessibleProps/accessiblePropViewerMgr.js.i data/resources/content/viewers/computedStyle/computedStyle.js.i data/resources/skin/modern/inspector.css.i data/resources/content/hooks.js.i data/resources/locale/zh-TW/viewers/stylesheets.dtd.i data/resources/content/venkmanOverlay.xul.i data/base/src/inPNGEncoder.cpp.i data/resources/content/res/winInspectorMain16.xpm.i data/resources/content/tests/allskin.xul.i data/base/public/inIDOMUtils.idl.i data/resources/locale/ca/prefs.dtd.i data/resources/locale/pt-BR/viewers/computedStyle.dtd.i data/resources/locale/de/viewers/accessibleProps.properties.i data/resources/locale/ru/inspector.dtd.i data/resources/content/viewers/jsObject/jsObjectViewer.js.i data/resources/locale/ru/viewers/stylesheets.dtd.i data/resources/locale/en-US/editing.dtd.i data/resources/locale/pl/tasksOverlay.dtd.i data/resources/locale/zh-TW/inspector.properties.i data/resources/locale/en-US/contents.rdf.in.i data/resources/locale/pt-BR/viewers/xblBindings.dtd.i data/resources/locale/nb-NO/search/junkImgs.dtd.i data/resources/content/popupOverlay.xul.i data/macbuild/InspectorDebug.Prefix.i data/resources/locale/pl/viewers/accessibleEvents.properties.i data/resources/content/viewers/dom/columnsDialog.xul.i data/resources/locale/hu/tasksOverlay.dtd.i data/resources/locale/en-US/viewers/styleRules.dtd.i data/resources/locale/en-GB/viewers/accessibleEvent.dtd.i data/base/src/inDOMUtils.h.i data/build/install.js.i data/resources/locale/fi/editing.dtd.i data/resources/locale/sk/viewers/accessibleProps.properties.i data/resources/locale/cs-CZ/viewers/computedStyle.dtd.i data/resources/locale/en-GB/tasksOverlay.dtd.i data/resources/locale/Makefile.in.i data/resources/skin/modern/viewers/nodeText/nodeText.css.i data/resources/locale/pl/viewers/domNode.dtd.i data/resources/locale/el/viewers/accessibleEvent.dtd.i data/resources/locale/sk/tasksOverlay.dtd.i data/resources/locale/da/tasksOverlay.dtd.i data/resources/skin/modern/viewerPane.css.i data/resources/content/viewers/stylesheets/stylesheets.js.i data/resources/locale/pt-BR/viewers/stylesheets.dtd.i data/resources/locale/sk/viewers/accessibleTreeEvalJSDialog.dtd.i data/resources/locale/el/editing.dtd.i data/resources/content/viewers/nodeText/nodeText.js.i data/resources/content/viewers/usedFontFaces/usedFontFaces.xul.i data/resources/locale/ru/editing.dtd.i data/resources/content/viewers/accessibleTree/accessibleTree.xul.i data/resources/locale/sk/viewers/domNode.dtd.i data/resources/locale/zh-CN/viewers/computedStyle.dtd.i data/resources/content/ViewerRegistry.js.i data/base/public/Makefile.in.i data/resources/content/viewers/jsObject/evalExprDialog.xul.i data/base/public/nsIInsDOMDataSource.idl.i data/resources/locale/el/viewers/accessibleProps.dtd.i data/resources/moz.build.i data/resources/content/search/modules/findFiles/dialog.js.i data/resources/content/makefile.win.i data/resources/skin/modern/viewers/accessibleTree/accessibleTree.css.i data/resources/content/viewers/styleRules/styleRules.xul.i data/resources/locale/cs/inspector.properties.i data/build/src/nsInspectorModule.cpp.i data/resources/locale/da/prefs.dtd.i data/base/src/inBitmapProtocolHandler.h.i data/resources/locale/fr/viewers/accessibleEvent.dtd.i data/resources/content/inspector.js.i data/resources/skin/modern/viewers/accessibleEvents/accessibleEvents.css.i data/base/src/inSearchLoop.cpp.i data/resources/locale/de/viewers/jsObject.dtd.i data/resources/locale/el/viewer-registry.dtd.i data/resources/locale/fi/viewers/accessibleRelations.dtd.i data/resources/locale/el/prefs.dtd.i data/base/makefile.win.i data/resources/locale/cs/viewers/dom.dtd.i data/resources/skin/classic/viewers/xblBindings/xblBindings.css.i data/resources/content/jsutil/commands/baseCommands.js.i data/resources/locale/fi/viewers/xblBindings.dtd.i data/resources/locale/da/inspector.dtd.i data/resources/skin/classic/viewers/styleRules/styleRules.css.i data/resources/content/viewers/boxModel/colorPicker.xul.i data/moz.build.i data/base/src/nsDOMDSResource.cpp.i data/resources/content/viewers/domNode/domNodeDialog.xul.i data/resources/locale/fr/search/junkImgs.dtd.i data/resources/locale/fr/viewers/boxModel.dtd.i data/resources/locale/cs/viewers/accessibleRelations.dtd.i data/resources/skin/classic/contents.rdf.i data/resources/content/viewers/dom/columnsDialog.js.i data/resources/locale/cs/inspector.dtd.i data/resources/locale/pt-BR/viewers/dom.dtd.i data/resources/content/viewers/jsObject/jsObject.js.i data/resources/locale/pt-BR/viewers/domNode.dtd.i data/resources/locale/fi/inspector.properties.i data/base/Makefile.in.i data/resources/locale/en-GB/inspector.dtd.i data/resources/content/jsutil/system/file.js.i data/resources/locale/hu/viewers/domNode.dtd.i data/resources/locale/en-US/viewers/stylesheets.dtd.i data/resources/locale/zh-CN/search/findFiles.dtd.i data/resources/skin/modern/viewers/domNode/domNode.css.i data/resources/locale/en-GB/viewers/accessibleTree.dtd.i data/resources/content/res/winInspectorMainOS2.ico.i data/resources/locale/el/search/findFiles.dtd.i data/resources/content/utilWindow.xul.i data/resources/locale/el/search/junkImgs.dtd.i data/resources/content/res/search-registry.rdf.i data/resources/content/Flasher.js.i data/resources/locale/hu/viewers/jsObject.dtd.i data/resources/locale/fr/viewers/styleRules.dtd.i data/resources/locale/sk/viewer-registry.dtd.i data/resources/locale/en-US/viewers/usedFontFaces.dtd.i data/resources/skin/classic/treeEditable.css.i data/resources/content/tasksOverlay-cz.xul.i data/resources/content/viewers/jsObject/jsObjectView.js.i data/resources/locale/ga-IE/inspector.dtd.i data/resources/locale/hu/editing.dtd.i data/resources/locale/ga-IE/viewers/computedStyle.dtd.i data/resources/locale/da/viewers/styleRules.dtd.i data/resources/locale/en-GB/viewers/styleRules.dtd.i data/resources/locale/da/viewers/dom.dtd.i data/resources/locale/en-GB/inspector.properties.i data/resources/locale/sk/viewers/accessibleRelations.dtd.i data/resources/locale/fi/viewers/boxModel.dtd.i data/base/src/inLayoutUtils.h.i data/resources/locale/cs-CZ/viewers/dom.dtd.i data/resources/content/viewers/accessibleProps/accessibleProps.xul.i data/resources/locale/en-GB/viewers/computedStyle.dtd.i data/resources/locale/sk/viewers/boxModel.dtd.i data/resources/skin/classic/viewers/dom/columnsDialog.css.i data/resources/content/tasksOverlay-tb.xul.i data/resources/locale/fi/viewers/computedStyle.dtd.i data/resources/locale/cs-CZ/inspector.properties.i data/base/public/makefile.win.i data/resources/locale/de/viewers/dom.dtd.i data/resources/locale/en-US/search/findFiles.dtd.i data/resources/locale/fr/viewers/domNode.dtd.i data/resources/locale/ru/viewers/styleRules.dtd.i data/base/src/inBitmap.h.i data/resources/locale/pl/viewers/xblBindings.dtd.i data/base/src/inSearchItemImage.h.i data/resources/locale/el/viewers/domNode.dtd.i data/makefile.win.i data/resources/content/jsutil/xpcom/XPCU.js.i data/base/src/inBitmapDepot.h.i data/resources/locale/en-US/viewers/accessibleTreeEvalJSDialog.dtd.i data/resources/locale/de/viewers/accessibleProps.dtd.i data/resources/content/jsutil/rdf/RDFArray.js.i data/base/src/inDOMRDFResource.cpp.i data/resources/locale/en-GB/viewers/accessibleProps.dtd.i data/base/src/inPNGEncoder.h.i data/resources/locale/zh-TW/viewers/jsObject.dtd.i data/resources/content/jsutil/events/ObserverManager.js.i data/resources/locale/cs/viewers/domNode.dtd.i data/resources/skin/modern/.cvsignore.i data/resources/locale/da/search/findFiles.dtd.i data/resources/locale/sv-SE/viewers/accessibleRelations.dtd.i data/resources/content/jsutil/xul/inBaseOutlinerView.js.i data/resources/locale/cs/viewers/stylesheets.dtd.i data/resources/locale/hu/viewers/boxModel.dtd.i data/resources/locale/zh-CN/editing.dtd.i ================================================ FILE: extensions/inspector/.hg/store/phaseroots ================================================ ================================================ FILE: extensions/inspector/.hg/store/undo.phaseroots ================================================ ================================================ FILE: extensions/inspector/.hg/undo.bookmarks ================================================ ================================================ FILE: extensions/inspector/.hg/undo.branch ================================================ default ================================================ FILE: extensions/inspector/.hg/undo.desc ================================================ 0 pull https://hg.mozilla.org/dom-inspector/ ================================================ FILE: extensions/inspector/.hg/undo.dirstate ================================================ ================================================ FILE: extensions/inspector/.hgignore ================================================ (^|/)Makefile$ ================================================ FILE: extensions/inspector/.hgtags ================================================ 01f09da2d8f70b36e96cca4953e7cca10d096f3a THUNDERBIRD_M2_BASE 02adedaabfc6e7bb77b405d23edb36754982e261 MOZILLA_0_9_7_RELEASE 02f841ececf01f811d7e33f3fecfa16a5a5833c5 FIREFOX_3_0b3_RC3 03100a2ba838327e218d2d3751d82f6d2a71badc AB_OUTLINER_BASE 05da7a0ecc8db059c6f67ca0429d586d024b7d4c DOM_AGNOSTIC3_BASE 06e3e885e6c8876761cd786eeb7bd5f60b99239e MOZILLA_1_9a7_RELEASE 0714e5dab03cd4a0e67ffba4c1174237b01c0245 FOLDER_OUTLINER_20010417_BASE 091ec214aaa3863b573fea99ec387e0f4c1c017a MOZILLA_1_4a_RELEASE 0c223c15699672d238b3b58086b15e20f90585dc STATIC_BUILD_20010418_BASE 0d73be4425b5ed5b9f34b57a30ec39e777f48e0f EDITOR_EMBEDDING_20011025_BASE 0ed0135c3829e43112da338bc6e18b41ee18a337 EVENTSREWRITE_20000211_BASE 109295c19a3e204d82848fcefd51480d3d928c93 XULRUNNER_20040804_BASE 12b3ed4e1050d6b6f6058b7ef83b22b7e29c880c MOZILLA_1_8a4_RELEASE 14e6fe3a014aa51d4f5b6199692c2bbef0f3d453 MOZILLA_1_7b_RELEASE 1559c8d3d7e30b218e3b9c63754db079c61f38d1 REFLOW_20020502_BASE 170262f263a0e088e30ff78f5193ca98e3a6650b MOZILLA_200303241605_TAG 17273e29319f65f2835cae7195cf7c1290360496 STATIC_BUILD_20010612_BASE 1fc863987cc4ba9e8f69c04d17c71d8766d6d8fa MOZILLA_0_9_9_20020301 207fc806a4778eb0398edcb4c39e1229c81225b7 THUNDERBIRD_M3_BASE 228a4ec0b2a8e7277f59b45009eda86bfa95949a FIREFOX_3_0_1_BUILD1 24d493d26551799fbafbafd8458bba770d050d7e XFORMS_20050106_BASE 25ac1a05b16dfdd802c1d69c7b22a76d10e06c65 XBL_BRUTAL_SHARING_20010807_BASE 25f2029e1f105d0d12d1d32fb71490d76a57d90d MINOTAUR_20030218_BASE 2ca3b9ee64a33989c46af64f30e055d18493496d MOZILLA_1_5a_BASE 2ccdc4ad905e811a692ef94e6fe9f870dd241e41 THUNDERBIRD_1_1a1_RELEASE 2ccf7f0e93a2187a7870101a23eade1e386cc682 THUNDERBIRD_0_7_1_RELEASE 2e51bf59030b373f38e2d968426ca470685102db STRING_20040119_BASE 2e8fb0acaefcaa8a5ece8a02159024e57086726b FIREFOX_3_0b4_RELEASE 32267760986ba88d2cabd69af8522e69d4f7c4f8 MOZILLA_1_9a2_RC1 32d3520a513bcd68d37c356bf6670f2264ea2ad0 MOZILLA_1_9a1_RC3 33466ddda9ca7d9a1513d6f0134f5fbd7325b0fd SYD_TEST_03052002_BASE 3597295099196282d5549acb42438c1da14bfae1 PREFERENCES_20050101_BASE 35fc7fa5cf3dea06c3be980a3acdfec994473c54 LIGHTNING_0_1_RELEASE 3c347f18b5b2a1f0c5a33ad9c9738ad1f971a91a THUNDERBIRD_1_1a2_RELEASE 3d3cbacea54f37507a6b9a04ddbe5256a4af0254 PHOENIX_0_1_RELEASE 3e8ff1586e20a0726119c55007c0e2072d5ad075 MINIMO_6_AUG_2003_TAG 40518a595a2e3681b03cbd4f23a29c732dc17441 MOZILLA_1_9a6_RC2 406291240f501c1ef94be5e6d9b740b8f8e140c5 SONGBIRD_20070117_01_TAG 4185487b5f1f555ec38eccc2c4c23a696d9e78f2 SURESH_IM_STANDALONE_BASE 45cc63493d7ddec6e20fe038b2f6c74e758a992c FIREFOX_3_0rc1_RELEASE 4680def0f59c6b9b4d3fb46d2baf771757f73489 ROGC_20021218_FREEZE 4b7ca9452f15ba060bb2552ade65dfccc46b0e03 BookmarksOutliner_20010601_BASE 4f10ad08740cedf93a65693406c1f27bfb4b651e STATIC_BUILD_20010628_BASE 4fbd0f501d89e86d7e34458fd0d534ca860eaee1 MOZILLA_1_9a8_RELEASE 51975d5ac74417a934d9a10627916324b44cf002 BOOKMARKS_20030320_BASE 535bce39929ac4f3173fba12e9c5d161c8ca23b7 REFLOW_20020422_BASE 5ec3d5dd237e87583019872d61f044031afe5b5a MOZILLA_1_7a_RELEASE 5f6693d6bd1c3676179537b6ee72e52d65d27799 MOZILLA_1_4b_RELEASE 5f865ac08ffef2322c78043e22080138adc5b8c7 Style_20010509_Base 665f9107126410b7caa1aefa3896ed0405ddc213 FORMREWRITE_20011008_BASE 6ad7b714e6ea681e4c9eacbd97ec212726339e33 PACKAGING_20030906_BASE 6bdd6adec346d57dc0883993a9ee70cec6f4efc2 MOZILLA_1_3a_RELEASE 6ff2694c27a6488a27f1450dd9731d209ae57b51 MOZILLA_0_9_6_BASE 71f00fd374cc94d341030c5220eae87447002a4a XPCDOM_20010502_BASE 73d2b5105b69b1468b1f30fd7a4b3bd41b6175c2 WEB_CONTENT_HANDLING_20070621_BASE 74294a27c91803f115d747d393250ca5dda4b141 Style_20010518_Base 76e20dc2aa87ee46eb756010a351ec8f0f71c256 SUNBIRD_0_3a2_RELEASE 78c967134b2fc64889da4c30467d4a9512b9ff79 OTIS_TEST_BASE 7e9532a964be907671b51f8d86d474379c21c008 MOZILLA_0_8_1_20010326_RELEASE 808511b0f19f28ccf3a880825b71f6ba5816007a BOOKMARKS_20030310_BASE 86b2cc479f7512d9d2c51240501de6f7c33ab132 FORMS_20040611_BASE 89bd44ac4af5c5a7b54be554016549c601917cb5 MOZILLA_1_8_BASE **INVALID** 89ebc73495ffcada07614a439adf723c2d14f223 XPCDOM_20010223_BASE 8baf80e84373a6745d70119c5ad5cc4c6d813165 THUNDERBIRD_3_0a1_BUILD1 8c8feff90f3c5fe53d8059fcb21015fa81fd5e81 MOZILLA_0_9_8_BASE 8cbb50ecfc62b4b93e351b308d3103d4155161cc FIREFOX_3_0b2_RC1 91369753b668365a3d295ee1afb9b16dc749d3b6 SUNBIRD_0_3a1_RELEASE 91a52d3cd459b2830a582439c6ef62b6a924c583 MAILIM_BASE 970bb659ce72fb8a2fbe1665e507a83529dec8b0 PREFERENCES_20050201_BASE 99db87031f1ffe62d0eb6a25dfead2af23a51b5f CW7_20011205_TAG 9b538e3c7ed6057285170e1871d75bfbbf28098a MOZILLA_1_9a5_RC2 9b74cd906b8b09508599a3e5455225b518414286 MOZILLA_1_1a_RELEASE 9d1ed426791ed7502fb7fe0bf411b10f2763d0ac ANGELON_MOZ_14_BASE a25a83f4b1235503d983cdc154c8f5287d9e856f MOZILLA_1_2a_RELEASE a4efc38cf218334e054f98435be6084e4e21b03a SUNBIRD_0_3_1_RC2 ab61bce0ee8770c4f89a3bc8b7174853f784e749 MOTIF_LAST_RITES b14a42a2f9fd3fcf143ea0ae06b12f42d6481083 FIREBIRD_0_6_RELEASE b435a6271f1b662dbe01f1f072feb6709b1c3fde FIREFOX_3_0b5_RC2 b521fa9af6828503c0c38b5e6ccea5fa92c7e4cc FOLDER_PANE_20010807_BASE b6215256b9fe866eb50ab524e3a2b11931cf39ed IFRAME_20011127_BASE b7431796b04bcba05b8ff0ca088345f50eb7bfd3 SSU_20030812_BASE b7db8f42fbf84b11e7438e6bdd1bd453a9831361 MOZILLA_1_5b_RELEASE c16f316a0971006dbfb0259c3dcdf2e002ad3493 WINCE_20020710_BASE c1781438280575ab6812f51237e65f432ad06109 DOM_AGNOSTIC_BASE c4e40c30834ae854a7cdf1c450d57e5a314c2ff6 XUL_CONTENT_MERGE_20010220_BASE c74cdc6eb4fee6b64cb58da5a6c5539cbb12c529 MOZILLA_1_8a3_RELEASE c8fbd58120795cbaf1f58c2a9299a9be7a4e018b MOZILLA_1_9a3_RELEASE ca62530369f98cb54810c0e2a6af3639d21c00e2 CONRAD_PROMPT_1_TAG cabaa237f3a429759b992915392c1d1d570c3ec8 SAFEBROWSING_20060516_BASE cd6a746cc5708f58a2c0ffb1373ff858696c3df1 MOZILLA_1_0_0_BASE cdf364d3620310a93eae913ddd562fcff6daccbb PSM_2_2_DEV_20010918_BASE d4b766a12f533fdefd02d2eab54fd7f86ce1f985 REFLOW_20020412_BASE d5aea4a8b3e56f67207e58f61e43aac933264ae8 DOM_AGNOSTIC3_PRE_MERGE d7e5d5a4c9ab9322e46999a7f9dca8c0970108f3 MOZILLA_1_4_2003052312_BASE d9b9ad73ca55a6354f16efc3766146c6e50c8277 CW7_20011204_TAG dcae9d99a6f2ed3cbe80def6a5e7cb3b2403cd4d FIREFOX_0_8_RELEASE e4024d150c234e46e162b6cfb5fb960ebe95d0c4 MOZILLA_1_2b_RELEASE e4b9d71d5f0b4ebe345fe740d8c9aca71a4d11b9 PHOENIX_0_4_RELEASE e9401a4b9951c83338a22544851c9717fa7eea51 DOM_AGNOSTIC3_BASE2 ea1e32ad6c1fbaf21dc573c2664ef91ea552d3c9 JS_1_7_ALPHA_MERGE eca2476962980ce3dbc502d1ac839d2ab6bca33d NOIMG_20010801_TAG f21051d6d712170f8e67b838ace9f09b7e928cd3 CFM_LAST_RITES f29bd158a37a1db722e2a80e66cc124764e674a2 IFRAME_20020207_BASE f470b4aff514005d60de42d9ca5518db67a271a4 MOZILLA_1_1b_RELEASE f4cc350b8b7ece2e9a1a9a16d6e8ddd3f1509ebf LIGHTNING_0_3_1_RELEASE **INVALID** f61da7d6ad8b922abf018099aa4bf7619a64de97 FIREFOX_3_0b1_RC3 f6278eaf61c76cca2fbf6bb51e219e53b8b329de XPCDOM_20010329_BASE f79f3cc6c5cc3dd24a1da09a9dde929a19fcc5b1 MOZILLA_1_8a1_RELEASE f7d85b2095671aa4a69932dfa143cfff149d04a7 MOZILLA_1_5_RC1 f8f32d5fc804fee4d5697438c782fce96365d02b MOZILLA_1_8b1_RELEASE f99dd8e05b2e8118df700ef90084374e8b9779d4 MOZILLA_0_9_3_2001_07_31_BASE fb09601eae9552d0114ee6cd5867121debd6aaa1 XPC_IDISP_20020417_BASE fd1e00c4f94da6daad340a16812b2c4786eb620a ALERT_SERVICE_BASE fe123b8ef1d98c7adaa72dfd7268966c4d209dd1 MINIMO_01302003_TAG 215eee579d471d9449ba8e6d5627e84e608cc9c5 SEAMONKEY_2_0a1_BUILD1 215eee579d471d9449ba8e6d5627e84e608cc9c5 SEAMONKEY_2_0a1_RELEASE 894241f24e4ea5e913344255c1ca8f9b98666dd8 DOMi_2_0_1_RELEASE 6e994301e7ea29beeba49f34b148901c4bd37c65 THUNDERBIRD_3_0a3_RELEASE 6e994301e7ea29beeba49f34b148901c4bd37c65 THUNDERBIRD_3_0a3_BUILD1 a69148785a33f31a5250784cfdf9e679243c5d35 THUNDERBIRD_3_0a3_RELEASE a69148785a33f31a5250784cfdf9e679243c5d35 THUNDERBIRD_3_0a3_BUILD2 a69148785a33f31a5250784cfdf9e679243c5d35 THUNDERBIRD_3_0a3_RELEASE a69148785a33f31a5250784cfdf9e679243c5d35 THUNDERBIRD_3_0a3_BUILD3 a69148785a33f31a5250784cfdf9e679243c5d35 THUNDERBIRD_3_0b1_RELEASE a69148785a33f31a5250784cfdf9e679243c5d35 THUNDERBIRD_3_0b1_BUILD1 fa96487c45e69e3f77f5ab9ae2e7a4b47ca33b87 SEAMONKEY_2_0a2_BUILD1 fa96487c45e69e3f77f5ab9ae2e7a4b47ca33b87 SEAMONKEY_2_0a2_RELEASE a69148785a33f31a5250784cfdf9e679243c5d35 THUNDERBIRD_3_0b1_RELEASE a69148785a33f31a5250784cfdf9e679243c5d35 THUNDERBIRD_3_0b1_BUILD2 5a93979aeccc69a35f64383460d7774117fe4554 SEAMONKEY_2_0a3_BUILD2 5a93979aeccc69a35f64383460d7774117fe4554 SEAMONKEY_2_0a3_RELEASE 5a93979aeccc69a35f64383460d7774117fe4554 SEAMONKEY_2_0a3_RELEASE 5a93979aeccc69a35f64383460d7774117fe4554 SEAMONKEY_2_0a3_BUILD1 5a93979aeccc69a35f64383460d7774117fe4554 SEAMONKEY_2_0a3_RELEASE 5a93979aeccc69a35f64383460d7774117fe4554 THUNDERBIRD_3_0b2_RELEASE 5a93979aeccc69a35f64383460d7774117fe4554 THUNDERBIRD_3_0b2_BUILD1 5a93979aeccc69a35f64383460d7774117fe4554 THUNDERBIRD_3_0b2_BUILD2 5a93979aeccc69a35f64383460d7774117fe4554 THUNDERBIRD_3_0b2_RELEASE 5a93979aeccc69a35f64383460d7774117fe4554 THUNDERBIRD_3_0b2_RELEASE 02308bc6eb4c3c752d6fbc766d0afc13c466440f THUNDERBIRD_3_0b3_RELEASE 02308bc6eb4c3c752d6fbc766d0afc13c466440f THUNDERBIRD_3_0b3_BUILD1 18a1c983c8ee3460bb3a2cf90753a3584412d491 DOMI_2_0_4_RELEASE 18a1c983c8ee3460bb3a2cf90753a3584412d491 THUNDERBIRD_3_0_RELEASE c1b38e365772f8583697fd24cf9c4caaf9e3a3df DOMI_2_0_5_RELEASE d53c20f721f07ffa962f4050ff98b57f2558152b DOMI_2_0_6_RELEASE d53c20f721f07ffa962f4050ff98b57f2558152b DOMI_2_0_6_RELEASE 0000000000000000000000000000000000000000 DOMI_2_0_6_RELEASE 0000000000000000000000000000000000000000 DOMI_2_0_6_RELEASE 0240d2edf528197bed754f3f8cbe55c47a424640 DOMI_2_0_6_RELEASE d97010e0e57a0f611bea91e72388299b03332efd DOMI_2_0_7_RELEASE 7eeed7e6106e24bf9cde1f0f25b4fa76fbab6b2c DOMI_2_0_8_RELEASE 27da0da26f640f49a0719b2526bf70e7080800d9 DOMI_2_0_9_RELEASE b6de3a5ce573ef015d0205070af30d3d1a9981f3 DOMI_2_0_11_RELEASE c42fd9baba56a868859cd3417a5e1420ffa0d24b DOMI_LATEST_RELEASE 935da5633b7f37c6d70b62f1dbdd14b6760dce5c DOMI_LATEST_BRANCH 0000000000000000000000000000000000000000 DOMI_LATEST_BRANCH 869a1de4fc3f6c244798f29aa6311cc2377e66e2 DOMI_LATEST_BRANCH 0000000000000000000000000000000000000000 DOMI_LATEST_BRANCH 030eee04e40b5f50349089a38a2368a36c1e9af7 DOMI_LATEST_RELEASE 0000000000000000000000000000000000000000 DOMI_LATEST_RELEASE c9ee18bf9d0c6988574b5c51666537e747c852b1 SEAMONKEY_2_33b1_RELEASE 8c6a6ec9a22c1cf65391c61020b52fdfa886a79b SEAMONKEY_2_33b1_RELEASE 58bcafc6b7a29cfeba38c7b214f62b4542eab192 DOMI_LATEST_RELEASE b2005ebad365607a6274cd10b4bf73bf1b48cb4a DOMI_LATEST_RELEASE 60242bd0c895c42d472f7c22af1c20e7912ccf00 DOMI_2_0_15_1 a9f69279b0fbcd3b068c7f474024e496febdde41 DOMI_2_0_16 a9f69279b0fbcd3b068c7f474024e496febdde41 SEA2_37_RELBRANCH 0000000000000000000000000000000000000000 DOMI_2_0_16 dfad1b2e38e44bd6bc76259455065382c5ac0949 DOMI_2_0_16 0000000000000000000000000000000000000000 SEA2_37_RELBRANCH dfad1b2e38e44bd6bc76259455065382c5ac0949 SEA2_37_RELBRANCH b2005ebad365607a6274cd10b4bf73bf1b48cb4a DOMI_LATEST_RELEASE dfad1b2e38e44bd6bc76259455065382c5ac0949 DOMI_LATEST_RELEASE 4dfc4e232cd57479bfced87f8161e533b48c9099 DOMI_2_0_16_GECKO_45 ================================================ FILE: extensions/inspector/Makefile.in ================================================ # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. DEPTH = ../../.. topsrcdir = @top_srcdir@ srcdir = @srcdir@ VPATH = @srcdir@ include $(DEPTH)/config/autoconf.mk DOMi_VERSION = 2.0.17pre DEFINES += -DDOMi_VERSION=$(DOMi_VERSION) include $(topsrcdir)/config/rules.mk #export:: # $(NSINSTALL) -D $(FINAL_TARGET)/chrome/icons/default # $(INSTALL) $(srcdir)/resources/content/res/Linux/winInspectorMain.xpm $(FINAL_TARGET)/chrome/icons/default # $(INSTALL) $(srcdir)/resources/content/res/Linux/winInspectorMain16.xpm $(FINAL_TARGET)/chrome/icons/default # $(INSTALL) $(srcdir)/resources/content/res/WINNT/winInspectorMain.ico $(FINAL_TARGET)/chrome/icons/default ================================================ FILE: extensions/inspector/base/js/inspector-cmdline.js ================================================ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); const nsICommandLineHandler = Components.interfaces.nsICommandLineHandler; const nsISupportsString = Components.interfaces.nsISupportsString; const nsIWindowWatcher = Components.interfaces.nsIWindowWatcher; function InspectorCmdLineHandler() {} InspectorCmdLineHandler.prototype = { classDescription: "DOM Inspector Command Line Handler", classID: Components.ID("{38293526-6b13-4d4f-a075-71939435b408}"), contractID: "@mozilla.org/commandlinehandler/general-startup;1?type=inspector", /* Needed for XPCOMUtils NSGetModule */ _xpcom_categories: [{category: "command-line-handler", entry: "m-inspector"}], /* nsISupports */ QueryInterface: XPCOMUtils.generateQI([nsICommandLineHandler]), /* nsICommandLineHandler */ handle : function handler_handle(cmdLine) { var args = Components.classes["@mozilla.org/supports-string;1"] .createInstance(nsISupportsString); try { var uristr = cmdLine.handleFlagWithParam("inspector", false); if (uristr == null) return; try { args.data = cmdLine.resolveURI(uristr).spec; } catch (e) { return; } } catch (e) { cmdLine.handleFlag("inspector", true); } var wwatch = Components.classes["@mozilla.org/embedcomp/window-watcher;1"] .getService(nsIWindowWatcher); wwatch.openWindow(null, "chrome://inspector/content/", "_blank", "chrome,dialog=no,all", args); }, helpInfo : " -inspector Open the DOM inspector.\n" }; /** * XPCOMUtils.generateNSGetFactory was introduced in Mozilla 2 (Firefox 4). * XPCOMUtils.generateNSGetModule is for Mozilla 1.9.0 (Firefox 3.0). */ if (XPCOMUtils.generateNSGetFactory) var NSGetFactory = XPCOMUtils.generateNSGetFactory([InspectorCmdLineHandler]); else var NSGetModule = XPCOMUtils.generateNSGetModule([InspectorCmdLineHandler]); ================================================ FILE: extensions/inspector/build/Makefile.in ================================================ # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. DEPTH=../../../.. topsrcdir=@top_srcdir@ srcdir=@srcdir@ VPATH=@srcdir@ include $(DEPTH)/config/autoconf.mk include $(topsrcdir)/config/rules.mk ================================================ FILE: extensions/inspector/build/install.js ================================================ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ var gVersion = "0.5"; var err = initInstall("DOM Inspector", "inspector", gVersion); logComment("initInstall: " + err); var fProgram = getFolder("Program"); logComment("fProgram: " + fProgram); err = addDirectory("", gVersion, "bin", fProgram, "", true); logComment("addDirectory: " + err); registerChrome(CONTENT | DELAYED_CHROME, getFolder("Chrome","inspector.jar"), "content/inspector/"); registerChrome(LOCALE | DELAYED_CHROME, getFolder("Chrome","inspector.jar"), "locale/en-US/inspector/"); registerChrome(SKIN | DELAYED_CHROME, getFolder("Chrome","inspector.jar"), "skin/modern/inspector/"); registerChrome(SKIN | DELAYED_CHROME, getFolder("Chrome","inspector.jar"), "skin/classic/inspector/"); if (getLastError() == SUCCESS) { err = performInstall(); logComment("performInstall: " + err); } else { cancelInstall(err); } ================================================ FILE: extensions/inspector/build/moz.build ================================================ # vim: set filetype=python: # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. DIRS += [ 'src', ] ================================================ FILE: extensions/inspector/install.rdf ================================================ #filter substitution inspector@mozilla.org @DOMi_VERSION@ bluegriffon@bluegriffon.com 3.2 * {a23983c0-fd0e-11dc-95ff-0800200c9a66} 4.0 41.0 {ec8030f7-c20a-464f-9b0e-13a3a9e97384} 4.0 41.0.0 {92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} 3.2 2.48 {8de7fcbb-c55c-4fbe-bfc5-fc555c87dbc4} 25.0 25.* {718e30fb-e89b-41dd-9da7-e25a45638b28} 1.0b1pre 5.0b2pre {3550f703-e582-4d05-9a08-453d09bdfdc6} 4.0 41.0 toolkit@mozilla.org 3.2 41.0 DOM Inspector Inspects the structure and properties of a window and its contents. mozilla.org http://www.mozilla.org/projects/inspector/ sk DOM Inspector Umožní preskúmať štruktúru a vlastnosti okna a jeho obsahu. sv-SE DOM-granskaren (DOM Inspector) Granskar strukturen och egenskaperna för ett fönster och dess innehåll. el Επιθεωρητής DOM Επιθεωρεί τη δομή και τις ιδιότητες ενός παραθύρου και των περιεχομένων του. true ================================================ FILE: extensions/inspector/jar.mn ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. inspector.jar: % content inspector %content/inspector/ # SeaMonkey % overlay chrome://inspector/content/inspector.xul chrome://communicator/content/utilityOverlay.xul application={92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} % overlay chrome://inspector/content/inspector.xul chrome://communicator/content/tasksOverlay.xul application={92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} % overlay chrome://communicator/content/tasksOverlay.xul chrome://inspector/content/tasksOverlay.xul application={92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} % overlay chrome://communicator/content/pref/preferences.xul chrome://inspector/content/prefs/prefsOverlay.xul application={92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} # ChatZilla % overlay chrome://chatzilla/content/chatzilla.xul chrome://inspector/content/tasksOverlay-cz.xul application={59c81df5-4b7a-477b-912d-4e0fdf64e5f2} # Calendar % overlay chrome://sunbird/content/calendar.xul chrome://inspector/content/tasksOverlay-sb.xul application={718e30fb-e89b-41dd-9da7-e25a45638b28} # Firefox % overlay chrome://browser/content/browser.xul chrome://inspector/content/tasksOverlay-ff.xul application={ec8030f7-c20a-464f-9b0e-13a3a9e97384} % overlay chrome://browser/content/macBrowserOverlay.xul chrome://inspector/content/tasksOverlay-ff.xul application={ec8030f7-c20a-464f-9b0e-13a3a9e97384} % overlay chrome://inspector/content/inspector.xul chrome://browser/content/baseMenuOverlay.xul application={ec8030f7-c20a-464f-9b0e-13a3a9e97384} # Pale Moon % overlay chrome://browser/content/browser.xul chrome://inspector/content/tasksOverlay-ff.xul application={8de7fcbb-c55c-4fbe-bfc5-fc555c87dbc4} % overlay chrome://browser/content/macBrowserOverlay.xul chrome://inspector/content/tasksOverlay-ff.xul application={8de7fcbb-c55c-4fbe-bfc5-fc555c87dbc4} % overlay chrome://inspector/content/inspector.xul chrome://browser/content/baseMenuOverlay.xul application={8de7fcbb-c55c-4fbe-bfc5-fc555c87dbc4} # Fennec % overlay chrome://browser/content/browser.xul chrome://inspector/content/tasksOverlay-mobile.xul application={a23983c0-fd0e-11dc-95ff-0800200c9a66} # Thunderbird % overlay chrome://messenger/content/mailWindowOverlay.xul chrome://inspector/content/tasksOverlay-tb.xul application={3550f703-e582-4d05-9a08-453d09bdfdc6} # BlueGriffon % overlay chrome://bluegriffon/content/xul/bluegriffon.xul chrome://inspector/content/toolsOverlay-bg.xul application={bluegriffon@bluegriffon.com} # Songbird % overlay chrome://browser/content/browser.xul chrome://inspector/content/tasksOverlay-ff.xul application=songbird@songbirdnest.com # Common % overlay chrome://inspector/content/commandOverlay.xul chrome://inspector/content/viewers/dom/commandOverlay.xul % overlay chrome://inspector/content/commandOverlay.xul chrome://inspector/content/viewers/styleRules/commandOverlay.xul % overlay chrome://inspector/content/keysetOverlay.xul chrome://inspector/content/viewers/dom/keysetOverlay.xul % overlay chrome://inspector/content/popupOverlay.xul chrome://inspector/content/viewers/dom/popupOverlay.xul % overlay chrome://inspector/content/popupOverlay.xul chrome://inspector/content/viewers/styleRules/popupOverlay.xul #ifdef XPI_NAME % component {38293526-6b13-4d4f-a075-71939435b408} components/inspector-cmdline.js % contract @mozilla.org/commandlinehandler/general-startup;1?type=inspector {38293526-6b13-4d4f-a075-71939435b408} % category command-line-handler m-inspector @mozilla.org/commandlinehandler/general-startup;1?type=inspector #endif content/inspector/inspector.xul (resources/content/inspector.xul) content/inspector/inspector.js (resources/content/inspector.js) content/inspector/inspector.css (resources/content/inspector.css) content/inspector/inspector.xml (resources/content/inspector.xml) content/inspector/sidebar.xul (resources/content/sidebar.xul) content/inspector/sidebar.js (resources/content/sidebar.js) content/inspector/object.xul (resources/content/object.xul) content/inspector/object.js (resources/content/object.js) content/inspector/inspectorOverlay.xul (resources/content/inspectorOverlay.xul) content/inspector/toolboxOverlay.xul (resources/content/toolboxOverlay.xul) content/inspector/commandOverlay.xul (resources/content/commandOverlay.xul) content/inspector/keysetOverlay.xul (resources/content/keysetOverlay.xul) content/inspector/popupOverlay.xul (resources/content/popupOverlay.xul) content/inspector/statusbarOverlay.xul (resources/content/statusbarOverlay.xul) content/inspector/tasksOverlay.xul (resources/content/tasksOverlay.xul) content/inspector/tasksOverlay-cz.xul (resources/content/tasksOverlay-cz.xul) content/inspector/tasksOverlay-ff.xul (resources/content/tasksOverlay-ff.xul) content/inspector/tasksOverlay-sb.xul (resources/content/tasksOverlay-sb.xul) content/inspector/tasksOverlay-tb.xul (resources/content/tasksOverlay-tb.xul) content/inspector/toolsOverlay-bg.xul (resources/content/toolsOverlay-bg.xul) content/inspector/tasksOverlay-mobile.xul (resources/content/tasksOverlay-mobile.xul) content/inspector/editingOverlay.xul (resources/content/editingOverlay.xul) content/inspector/Flasher.js (resources/content/Flasher.js) content/inspector/ViewerRegistry.js (resources/content/ViewerRegistry.js) content/inspector/utils.js (resources/content/utils.js) content/inspector/hooks.js (resources/content/hooks.js) content/inspector/res/viewer-registry.rdf (resources/content/res/viewer-registry.rdf) content/inspector/extensions/titledSplitter.css (resources/content/extensions/titledSplitter.css) content/inspector/extensions/titledSplitter.xml (resources/content/extensions/titledSplitter.xml) content/inspector/extensions/wsm-colorpicker.js (resources/content/extensions/wsm-colorpicker.js) content/inspector/jsutil/rdf/RDFArray.js (resources/content/jsutil/rdf/RDFArray.js) content/inspector/jsutil/rdf/RDFU.js (resources/content/jsutil/rdf/RDFU.js) content/inspector/jsutil/system/DiskSearch.js (resources/content/jsutil/system/DiskSearch.js) content/inspector/jsutil/system/FilePickerUtils.js (resources/content/jsutil/system/FilePickerUtils.js) content/inspector/jsutil/system/PrefUtils.js (resources/content/jsutil/system/PrefUtils.js) content/inspector/jsutil/system/clipboardFlavors.js (resources/content/jsutil/system/clipboardFlavors.js) content/inspector/jsutil/xpcom/XPCU.js (resources/content/jsutil/xpcom/XPCU.js) content/inspector/jsutil/xul/DNDUtils.js (resources/content/jsutil/xul/DNDUtils.js) content/inspector/jsutil/xul/FrameExchange.js (resources/content/jsutil/xul/FrameExchange.js) content/inspector/jsutil/xul/inFormManager.js (resources/content/jsutil/xul/inFormManager.js) content/inspector/jsutil/xul/inTreeBuilder.js (resources/content/jsutil/xul/inTreeBuilder.js) content/inspector/jsutil/xul/inBaseTreeView.js (resources/content/jsutil/xul/inBaseTreeView.js) content/inspector/jsutil/xul/inDataTreeView.js (resources/content/jsutil/xul/inDataTreeView.js) content/inspector/jsutil/events/ObserverManager.js (resources/content/jsutil/events/ObserverManager.js) content/inspector/jsutil/commands/baseCommands.js (resources/content/jsutil/commands/baseCommands.js) content/inspector/prefs/pref-inspector.xul (resources/content/prefs/pref-inspector.xul) content/inspector/prefs/pref-inspector.js (resources/content/prefs/pref-inspector.js) content/inspector/prefs/prefsOverlay.xul (resources/content/prefs/prefsOverlay.xul) content/inspector/prefs/pref-sidebar.js (resources/content/prefs/pref-sidebar.js) content/inspector/tests/allskin.xul (resources/content/tests/allskin.xul) content/inspector/viewers/accessibleEvent/accessibleEvent.js (resources/content/viewers/accessibleEvent/accessibleEvent.js) content/inspector/viewers/accessibleEvent/accessibleEvent.xul (resources/content/viewers/accessibleEvent/accessibleEvent.xul) content/inspector/viewers/accessibleEvents/accessibleEvents.js (resources/content/viewers/accessibleEvents/accessibleEvents.js) content/inspector/viewers/accessibleEvents/accessibleEvents.xul (resources/content/viewers/accessibleEvents/accessibleEvents.xul) content/inspector/viewers/accessibleEvents/handlerHelpDialog.xul (resources/content/viewers/accessibleEvents/handlerHelpDialog.xul) content/inspector/viewers/accessibleObject/accessibleObject.js (resources/content/viewers/accessibleObject/accessibleObject.js) content/inspector/viewers/accessibleObject/accessibleObject.xul (resources/content/viewers/accessibleObject/accessibleObject.xul) content/inspector/viewers/accessibleProps/accessibleProps.js (resources/content/viewers/accessibleProps/accessibleProps.js) content/inspector/viewers/accessibleProps/accessiblePropViewerMgr.js (resources/content/viewers/accessibleProps/accessiblePropViewerMgr.js) content/inspector/viewers/accessibleProps/accessibleProps.xul (resources/content/viewers/accessibleProps/accessibleProps.xul) content/inspector/viewers/accessibleRelations/accessibleRelations.js (resources/content/viewers/accessibleRelations/accessibleRelations.js) content/inspector/viewers/accessibleRelations/accessibleRelations.xul (resources/content/viewers/accessibleRelations/accessibleRelations.xul) content/inspector/viewers/accessibleTree/accessibleTree.js (resources/content/viewers/accessibleTree/accessibleTree.js) content/inspector/viewers/accessibleTree/accessibleTree.xul (resources/content/viewers/accessibleTree/accessibleTree.xul) content/inspector/viewers/accessibleTree/evalJSDialog.js (resources/content/viewers/accessibleTree/evalJSDialog.js) content/inspector/viewers/accessibleTree/evalJSDialog.xul (resources/content/viewers/accessibleTree/evalJSDialog.xul) content/inspector/viewers/computedStyle/computedStyle.js (resources/content/viewers/computedStyle/computedStyle.js) content/inspector/viewers/computedStyle/computedStyle.xul (resources/content/viewers/computedStyle/computedStyle.xul) content/inspector/viewers/usedFontFaces/usedFontFaces.js (resources/content/viewers/usedFontFaces/usedFontFaces.js) content/inspector/viewers/usedFontFaces/usedFontFaces.xul (resources/content/viewers/usedFontFaces/usedFontFaces.xul) content/inspector/viewers/dom/FindDialog.js (resources/content/viewers/dom/FindDialog.js) content/inspector/viewers/dom/columnsDialog.js (resources/content/viewers/dom/columnsDialog.js) content/inspector/viewers/dom/columnsDialog.xul (resources/content/viewers/dom/columnsDialog.xul) content/inspector/viewers/dom/commandOverlay.xul (resources/content/viewers/dom/commandOverlay.xul) content/inspector/viewers/dom/insertDialog.js (resources/content/viewers/dom/insertDialog.js) content/inspector/viewers/dom/insertDialog.xul (resources/content/viewers/dom/insertDialog.xul) content/inspector/viewers/dom/findDialog.xul (resources/content/viewers/dom/findDialog.xul) content/inspector/viewers/dom/keysetOverlay.xul (resources/content/viewers/dom/keysetOverlay.xul) content/inspector/viewers/dom/popupOverlay.xul (resources/content/viewers/dom/popupOverlay.xul) content/inspector/viewers/dom/dom.xul (resources/content/viewers/dom/dom.xul) content/inspector/viewers/dom/dom.js (resources/content/viewers/dom/dom.js) content/inspector/viewers/dom/pseudoClassDialog.js (resources/content/viewers/dom/pseudoClassDialog.js) content/inspector/viewers/dom/pseudoClassDialog.xul (resources/content/viewers/dom/pseudoClassDialog.xul) content/inspector/viewers/boxModel/boxModel.js (resources/content/viewers/boxModel/boxModel.js) content/inspector/viewers/boxModel/boxModel.xul (resources/content/viewers/boxModel/boxModel.xul) content/inspector/viewers/jsObject/jsObject.js (resources/content/viewers/jsObject/jsObject.js) content/inspector/viewers/jsObject/jsObject.xul (resources/content/viewers/jsObject/jsObject.xul) content/inspector/viewers/jsObject/jsObjectViewer.js (resources/content/viewers/jsObject/jsObjectViewer.js) content/inspector/viewers/jsObject/jsObjectViewer.xul (resources/content/viewers/jsObject/jsObjectViewer.xul) content/inspector/viewers/jsObject/evalExprDialog.js (resources/content/viewers/jsObject/evalExprDialog.js) content/inspector/viewers/jsObject/evalExprDialog.xul (resources/content/viewers/jsObject/evalExprDialog.xul) content/inspector/viewers/domNode/domNode.js (resources/content/viewers/domNode/domNode.js) content/inspector/viewers/domNode/domNode.xul (resources/content/viewers/domNode/domNode.xul) content/inspector/viewers/domNode/domNodeDialog.js (resources/content/viewers/domNode/domNodeDialog.js) content/inspector/viewers/domNode/domNodeDialog.xul (resources/content/viewers/domNode/domNodeDialog.xul) content/inspector/viewers/styleRules/commandOverlay.xul (resources/content/viewers/styleRules/commandOverlay.xul) content/inspector/viewers/styleRules/keysetOverlay.xul (resources/content/viewers/styleRules/keysetOverlay.xul) content/inspector/viewers/styleRules/popupOverlay.xul (resources/content/viewers/styleRules/popupOverlay.xul) content/inspector/viewers/styleRules/styleRules.js (resources/content/viewers/styleRules/styleRules.js) content/inspector/viewers/styleRules/styleRules.xul (resources/content/viewers/styleRules/styleRules.xul) content/inspector/viewers/stylesheets/stylesheets.js (resources/content/viewers/stylesheets/stylesheets.js) content/inspector/viewers/stylesheets/stylesheets.xul (resources/content/viewers/stylesheets/stylesheets.xul) content/inspector/viewers/xblBindings/xblBindings.js (resources/content/viewers/xblBindings/xblBindings.js) content/inspector/viewers/xblBindings/xblBindings.xul (resources/content/viewers/xblBindings/xblBindings.xul) % skin inspector classic/1.0 %skin/classic/inspector/ skin/classic/inspector/btnFind.gif (resources/skin/classic/btnFind.gif) skin/classic/inspector/btnFind-dis.gif (resources/skin/classic/btnFind-dis.gif) skin/classic/inspector/btnSelecting.gif (resources/skin/classic/btnSelecting.gif) skin/classic/inspector/btnSelecting-act.gif (resources/skin/classic/btnSelecting-act.gif) skin/classic/inspector/btnSelecting-dis.gif (resources/skin/classic/btnSelecting-dis.gif) skin/classic/inspector/ImageSearchItem.gif (resources/skin/classic/ImageSearchItem.gif) skin/classic/inspector/iconImportant.gif (resources/skin/classic/iconImportant.gif) skin/classic/inspector/iconViewerList.gif (resources/skin/classic/iconViewerList.gif) skin/classic/inspector/inspector.css (resources/skin/classic/inspector.css) skin/classic/inspector/inspectorWindow.css (resources/skin/classic/inspectorWindow.css) skin/classic/inspector/titledSplitter.css (resources/skin/classic/titledSplitter.css) skin/classic/inspector/titledsplitter-close.gif (resources/skin/classic/titledsplitter-close.gif) skin/classic/inspector/panelset.css (resources/skin/classic/panelset.css) skin/classic/inspector/sidebar.css (resources/skin/classic/sidebar.css) skin/classic/inspector/iconViewerList-dis.gif (resources/skin/classic/iconViewerList-dis.gif) skin/classic/inspector/viewers/accessibleEvent/accessibleEvent.css (resources/skin/classic/viewers/accessibleEvent/accessibleEvent.css) skin/classic/inspector/viewers/accessibleEvents/accessibleEvents.css (resources/skin/classic/viewers/accessibleEvents/accessibleEvents.css) skin/classic/inspector/viewers/accessibleProps/accessibleProps.css (resources/skin/classic/viewers/accessibleProps/accessibleProps.css) skin/classic/inspector/viewers/accessibleTree/accessibleTree.css (resources/skin/classic/viewers/accessibleTree/accessibleTree.css) skin/classic/inspector/viewers/boxModel/boxModel.css (resources/skin/classic/viewers/boxModel/boxModel.css) skin/classic/inspector/viewers/dom/columnsDialog.css (resources/skin/classic/viewers/dom/columnsDialog.css) skin/classic/inspector/viewers/dom/dom.css (resources/skin/classic/viewers/dom/dom.css) skin/classic/inspector/viewers/dom/findDialog.css (resources/skin/classic/viewers/dom/findDialog.css) skin/classic/inspector/viewers/domNode/domNode.css (resources/skin/classic/viewers/domNode/domNode.css) skin/classic/inspector/viewers/styleRules/styleRules.css (resources/skin/classic/viewers/styleRules/styleRules.css) skin/classic/inspector/viewers/xblBindings/xblBindings.css (resources/skin/classic/viewers/xblBindings/xblBindings.css) % skin inspector modern/1.0 %skin/modern/inspector/ skin/modern/inspector/btnFind.gif (resources/skin/modern/btnFind.gif) skin/modern/inspector/btnFind-dis.gif (resources/skin/modern/btnFind-dis.gif) skin/modern/inspector/btnSelecting.gif (resources/skin/modern/btnSelecting.gif) skin/modern/inspector/btnSelecting-act.gif (resources/skin/modern/btnSelecting-act.gif) skin/modern/inspector/btnSelecting-dis.gif (resources/skin/modern/btnSelecting-dis.gif) skin/modern/inspector/ImageSearchItem.gif (resources/skin/modern/ImageSearchItem.gif) skin/modern/inspector/iconImportant.gif (resources/skin/modern/iconImportant.gif) skin/modern/inspector/iconViewerMenu-dis.gif (resources/skin/modern/iconViewerMenu-dis.gif) skin/modern/inspector/inspector.css (resources/skin/modern/inspector.css) skin/modern/inspector/inspectorWindow.css (resources/skin/modern/inspectorWindow.css) skin/modern/inspector/titledSplitter.css (resources/skin/modern/titledSplitter.css) skin/modern/inspector/titledsplitter-close.gif (resources/skin/modern/titledsplitter-close.gif) skin/modern/inspector/panelset.css (resources/skin/modern/panelset.css) skin/modern/inspector/sidebar.css (resources/skin/modern/sidebar.css) skin/modern/inspector/iconViewerMenu.gif (resources/skin/modern/iconViewerMenu.gif) skin/modern/inspector/iconViewerList.gif (resources/skin/modern/iconViewerList.gif) skin/modern/inspector/iconViewerList-dis.gif (resources/skin/modern/iconViewerList-dis.gif) skin/modern/inspector/viewers/accessibleEvent/accessibleEvent.css (resources/skin/modern/viewers/accessibleEvent/accessibleEvent.css) skin/modern/inspector/viewers/accessibleEvents/accessibleEvents.css (resources/skin/modern/viewers/accessibleEvents/accessibleEvents.css) skin/modern/inspector/viewers/accessibleProps/accessibleProps.css (resources/skin/modern/viewers/accessibleProps/accessibleProps.css) skin/modern/inspector/viewers/accessibleTree/accessibleTree.css (resources/skin/modern/viewers/accessibleTree/accessibleTree.css) skin/modern/inspector/viewers/boxModel/boxModel.css (resources/skin/modern/viewers/boxModel/boxModel.css) skin/modern/inspector/viewers/dom/columnsDialog.css (resources/skin/modern/viewers/dom/columnsDialog.css) skin/modern/inspector/viewers/dom/dom.css (resources/skin/modern/viewers/dom/dom.css) skin/modern/inspector/viewers/dom/findDialog.css (resources/skin/modern/viewers/dom/findDialog.css) skin/modern/inspector/viewers/domNode/domNode.css (resources/skin/modern/viewers/domNode/domNode.css) skin/modern/inspector/viewers/styleRules/styleRules.css (resources/skin/modern/viewers/styleRules/styleRules.css) skin/modern/inspector/viewers/xblBindings/xblBindings.css (resources/skin/modern/viewers/xblBindings/xblBindings.css) ================================================ FILE: extensions/inspector/moz.build ================================================ # vim: set filetype=python: # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. DIRS += [ 'resources', ] JAR_MANIFESTS += ['jar.mn'] JS_PREFERENCE_FILES += [ 'resources/content/prefs/inspector.js', ] ================================================ FILE: extensions/inspector/resources/Makefile.in ================================================ # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. DEPTH=../../../.. topsrcdir=@top_srcdir@ srcdir=@srcdir@ VPATH=@srcdir@ include $(DEPTH)/config/autoconf.mk ALL_LOCALES = \ de \ el \ en-GB \ en-US \ pl \ ru \ sk \ sv-SE \ $(NULL) include $(topsrcdir)/config/config.mk include $(topsrcdir)/config/rules.mk libs realchrome:: locale/Makefile @$(EXIT_ON_ERROR) \ for locale in $(ALL_LOCALES); do \ $(MAKE) -C locale AB_CD=$$locale; \ done install:: @$(EXIT_ON_ERROR) \ for locale in $(ALL_LOCALES); do \ $(MAKE) -C locale AB_CD=$$locale install; \ done ================================================ FILE: extensions/inspector/resources/content/Flasher.js ================================================ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /*************************************************************** * Flasher --------------------------------------------------- * Object for controlling a timed flashing animation which * paints a border around an element. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * REQUIRED IMPORTS: ****************************************************************/ //////////// global variables ///////////////////// //////////// global constants //////////////////// const HIGHLIGHTED_PSEUDO_CLASS = ":-moz-devtools-highlighted"; const INVERT = "filter: url(\"data:image/svg+xml;charset=utf8,%23invert\") !important; " //////////////////////////////////////////////////////////////////////////// //// class Flasher function Flasher(aColor, aThickness, aDuration, aSpeed, aInvert) { document.querySelector(HIGHLIGHTED_PSEUDO_CLASS); this.mIOService = XPCU.getService("@mozilla.org/network/io-service;1", "nsIIOService"); this.mDOMUtils = XPCU.getService("@mozilla.org/inspector/dom-utils;1", "inIDOMUtils"); this.mShell = XPCU.getService("@mozilla.org/inspector/flasher;1", "inIFlasher") || this.mDOMUtils; this.color = aColor; this.thickness = aThickness; this.invert = aInvert; this.duration = aDuration; this.mSpeed = aSpeed; } Flasher.prototype = { //////////////////////////////////////////////////////////////////////////// //// Initialization mFlashTimeout: null, mElement: null, mRegistryId: null, mFlashes: 0, mStartTime: 0, mDOMUtils: null, mWinUtils: null, mStyleURI: null, mColor: "#000000", mInvert: false, mThickness: 0, mDuration: 0, mSpeed: 0, //////////////////////////////////////////////////////////////////////////// //// Properties get flashing() { return this.mFlashTimeout != null; }, get element() { return this.mElement; }, set element(val) { if (val && val.nodeType == Node.ELEMENT_NODE) { this.mElement = val; this.mShell.scrollElementIntoView(val); this.mWinUtils = val.ownerDocument.defaultView .QueryInterface(Components.interfaces.nsIInterfaceRequestor) .getInterface(Components.interfaces.nsIDOMWindowUtils); } else { throw "Invalid node type."; } }, get color() { return this.mColor; }, set color(aVal) { var spacer = document.createElement("spacer"); spacer.style.color = aVal; if (spacer.style.color) { this.mStyleURI = null; this.mColor = aVal; } return aVal; }, get thickness() { return this.mThickness | 0; }, set thickness(aVal) { this.mStyleURI = null; return this.mThickness = aVal; }, get duration() { return this.mDuration; }, set duration(aVal) { this.mDuration = aVal; }, get speed() { return this.mSpeed; }, set speed(aVal) { this.mSpeed = aVal; }, get invert() { return !!this.mInvert; }, set invert(aVal) { this.mStyleURI = null; return this.mInvert = aVal; }, // ::::::::::::::::::::::::::::::::::::::::::::::::::::::::: // :::::::::::::::::::: Methods :::::::::::::::::::::::::::: // ::::::::::::::::::::::::::::::::::::::::::::::::::::::::: start: function(aDuration, aSpeed, aHold) { if (!this.mStyleURI) { var styleURI = "data:text/css;charset=utf-8," + HIGHLIGHTED_PSEUDO_CLASS + " { outline: " + this.thickness + "px solid " + encodeURIComponent(this.color) + " !important; outline-offset: " + -this.thickness + "px !important; " + (this.invert ? INVERT : "") + "}"; this.mStyleURI = this.mIOService.newURI(styleURI, null, null); } this.mWinUtils.loadSheet(this.mStyleURI, this.mWinUtils.AGENT_SHEET); this.mUDuration = aDuration ? aDuration * 1000 : this.mDuration; this.mUSpeed = aSpeed ? aSpeed : this.mSpeed; this.mHold = aHold; this.mFlashes = 0; this.mStartTime = Date.now(); this.doFlash(); }, doFlash: function() { if (this.mHold || this.mFlashes & 1) { this.paintOn(); } else { this.paintOff(); } this.mFlashes++; if (this.mUDuration < 0 || Date.now() - this.mStartTime < this.mUDuration) { this.mFlashTimeout = window.setTimeout(this.timeout, this.mUSpeed, this); } else { this.stop(); } }, timeout: function(self) { self.doFlash(); }, stop: function() { if (this.flashing) { this.mWinUtils.removeSheet(this.mStyleURI, this.mWinUtils.AGENT_SHEET); window.clearTimeout(this.mFlashTimeout); this.mFlashTimeout = null; this.paintOff(); } }, paintOn: function() { this.mDOMUtils.addPseudoClassLock(this.mElement, HIGHLIGHTED_PSEUDO_CLASS); }, paintOff: function() { this.mDOMUtils.removePseudoClassLock(this.mElement, HIGHLIGHTED_PSEUDO_CLASS); } }; //////////////////////////////////////////////////////////////////////////// //// class LegacyFlasher function LegacyFlasher(aColor, aThickness, aDuration, aSpeed, aInvert) { this.mShell = XPCU.getService("@mozilla.org/inspector/flasher;1", "inIFlasher"); this.color = aColor; this.mShell.thickness = aThickness; this.mShell.invert = aInvert; this.duration = aDuration; this.mSpeed = aSpeed; } LegacyFlasher.prototype = { //////////////////////////////////////////////////////////////////////////// //// Initialization mFlashTimeout: null, mElement:null, mRegistryId: null, mFlashes: 0, mStartTime: 0, mDuration: 0, mSpeed: 0, //////////////////////////////////////////////////////////////////////////// //// Properties get flashing() { return this.mFlashTimeout != null; }, get element() { return this.mElement; }, set element(val) { if (val && val.nodeType == Node.ELEMENT_NODE) { this.mElement = val; this.mShell.scrollElementIntoView(val); } else throw "Invalid node type."; }, get color() { return this.mShell.color; }, set color(aVal) { try { this.mShell.color = aVal; } catch (e) { // Catch exception in case aVal is an invalid or empty value. Components.utils.reportError(e); } return aVal; }, get thickness() { return this.mShell.thickness; }, set thickness(aVal) { this.mShell.thickness = aVal; }, get duration() { return this.mDuration; }, set duration(aVal) { this.mDuration = aVal; }, get speed() { return this.mSpeed; }, set speed(aVal) { this.mSpeed = aVal; }, get invert() { return this.mShell.invert; }, set invert(aVal) { this.mShell.invert = aVal; }, // ::::::::::::::::::::::::::::::::::::::::::::::::::::::::: // :::::::::::::::::::: Methods :::::::::::::::::::::::::::: // ::::::::::::::::::::::::::::::::::::::::::::::::::::::::: start: function(aDuration, aSpeed, aHold) { this.mUDuration = aDuration ? aDuration*1000 : this.mDuration; this.mUSpeed = aSpeed ? aSpeed : this.mSpeed this.mHold = aHold; this.mFlashes = 0; this.mStartTime = new Date(); this.doFlash(); }, doFlash: function() { if (this.mHold || this.mFlashes%2) { this.paintOn(); } else { this.paintOff(); } this.mFlashes++; if (this.mUDuration < 0 || new Date() - this.mStartTime < this.mUDuration) { this.mFlashTimeout = window.setTimeout(this.timeout, this.mUSpeed, this); } else { this.stop(); } }, timeout: function(self) { self.doFlash(); }, stop: function() { if (this.flashing) { window.clearTimeout(this.mFlashTimeout); this.mFlashTimeout = null; this.paintOff(); } }, paintOn: function() { this.mShell.drawElementOutline(this.mElement); }, paintOff: function() { this.mShell.repaintElement(this.mElement); } }; //////////////////////////////////////////////////////////////////////////////// //// DOMIFlasher /** * The special version of the flasher operating with DOM Inspector flasher * preferences. */ function DOMIFlasher() { this.init(); } DOMIFlasher.prototype = { ////////////////////////////////////////////////////////////////////////////// //// Public get flashOnSelect() { return PrefUtils.getPref("inspector.blink.on"); }, set flashOnSelect(aVal) { PrefUtils.setPref("inspector.blink.on", aVal); }, get color() { return PrefUtils.getPref("inspector.blink.border-color"); }, set color(aVal) { PrefUtils.setPref("inspector.blink.border-color", aVal); }, get thickness() { return PrefUtils.getPref("inspector.blink.border-width"); }, set thickness(aVal) { PrefUtils.setPref("inspector.blink.border-width", aVal); }, get duration() { return PrefUtils.getPref("inspector.blink.duration"); }, set duration(aVal) { PrefUtils.setPref("inspector.blink.duration", aVal); }, get speed() { return PrefUtils.getPref("inspector.blink.speed"); }, set speed(aVal) { PrefUtils.setPref("inspector.blink.speed", aVal); }, get invert() { return PrefUtils.getPref("inspector.blink.invert"); }, set invert(aVal) { PrefUtils.setPref("inspector.blink.invert", aVal); }, flashElement: function DOMIFlasher_flashElement(aElement) { if (this.mFlasher.flashing) this.mFlasher.stop(); this.mFlasher.element = aElement; this.mFlasher.start(); }, flashElementOnSelect: function DOMIFlasher_flashElementOnSelect(aElement) { if (this.flashOnSelect) { this.flashElement(aElement); } }, destroy: function DOMIFlasher_destroy() { PrefUtils.removeObserver("inspector.blink.", this); }, ////////////////////////////////////////////////////////////////////////////// //// Private init: function DOMIFlasher_init() { try { this.mFlasher = new Flasher(this.color, this.thickness, this.duration, this.speed, this.invert); } catch (e) { this.mFlasher = new LegacyFlasher(this.color, this.thickness, this.duration, this.speed, this.invert); } PrefUtils.addObserver("inspector.blink.", this); this.updateFlashOnSelectCommand(); }, updateFlashOnSelectCommand: function DOMIFlasher_updateFlashOnSelectCommand() { var cmdEl = document.getElementById("cmdFlashOnSelect"); if (this.flashOnSelect) { cmdEl.setAttribute("checked", "true"); } else { cmdEl.removeAttribute("checked"); } }, observe: function DOMIFlasher_observe(aSubject, aTopic, aData) { if (aData == "inspector.blink.on") { this.updateFlashOnSelectCommand(); return; } var value = PrefUtils.getPref(aData); if (aData == "inspector.blink.border-color") { this.mFlasher.color = value; } else if (aData == "inspector.blink.border-width") { this.mFlasher.thickness = value; } else if (aData == "inspector.blink.duration") { this.mFlasher.duration = value; } else if (aData == "inspector.blink.speed") { this.mFlasher.speed = value; } else if (aData == "inspector.blink.invert") { this.mFlasher.invert = value; } } } ================================================ FILE: extensions/inspector/resources/content/ViewerRegistry.js ================================================ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /***************************************************************************** * ViewerRegistry ------------------------------------------------------------- * The central registry where information about all installed viewers is * kept. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * REQUIRED IMPORTS: * chrome://inspector/content/jsutil/xpcom/XPCU.js * chrome://inspector/content/jsutil/rdf/RDFU.js *****************************************************************************/ ////////////////////////////////////////////////////////////////////////////// //// Global Constants const kViewerURLPrefix = "chrome://inspector/content/viewers/"; const kViewerRegURL = "chrome://inspector/content/res/viewer-registry.rdf"; ////////////////////////////////////////////////////////////////////////////// //// Class ViewerRegistry function ViewerRegistry() // implements inIViewerRegistry { this.mViewerHash = {}; } ViewerRegistry.prototype = { //////////////////////////////////////////////////////////////////////////// //// Interface inIViewerRegistry (not yet formalized...) //////////////////////////////////////////////////////////////////////////// //// Initialization mDS: null, mObserver: null, mViewerDS: null, mViewerHash: null, mFilters: null, get url() { return this.mURL; }, //////////////////////////////////////////////////////////////////////////// //// Loading Methods load: function VR_Load(aURL, aObserver) { this.mURL = aURL; this.mObserver = aObserver; RDFU.loadDataSource(aURL, new ViewerRegistryLoadObserver(this)); }, onError: function VR_OnError(aStatus, aErrorMsg) { this.mObserver.onViewerRegistryLoadError(aStatus, aErrorMsg); }, onLoad: function VR_OnLoad(aDS) { this.mDS = aDS; this.prepareRegistry(); this.mObserver.onViewerRegistryLoad(); }, prepareRegistry: function VR_PrepareRegistry() { this.mViewerDS = RDFArray.fromContainer(this.mDS, "inspector:viewers", kInspectorNSURI); // create and cache the filter functions var js, fn; this.mFilters = []; for (var i = 0; i < this.mViewerDS.length; ++i) { js = this.getEntryProperty(i, "filter"); try { fn = new Function("object", "linkedViewer", js); } catch (ex) { fn = new Function("return false"); debug("### ERROR - Syntax error in filter for viewer \"" + this.getEntryProperty(i, "description") + "\"\n"); } this.mFilters.push(fn); } }, /** * Returns the absolute url where the xul file for a viewer can be found. * * @param aIndex * The numerical index of the entry representing the viewer. * @return A string of the fully canonized url. */ getEntryURL: function VR_GetEntryURL(aIndex) { var uid = this.getEntryProperty(aIndex, "uid"); return kViewerURLPrefix + uid + "/" + uid + ".xul"; }, //////////////////////////////////////////////////////////////////////////// //// Lookup Methods /** * Searches the viewer registry for all viewers that can view a particular * object. * * @param aObject * The object being searched against. * @param aPanelId * A string containing the id of the panel requesting viewers. * @param aLinkedViewer * The view object of linked panel. * @return An array of nsIRDFResource entries in the viewer registry. */ findViewersForObject: function VR_FindViewersForObject(aObject, aPanelId, aLinkedViewer) { // check each entry in the registry var len = this.mViewerDS.length; var entry; var urls = []; for (var i = 0; i < len; ++i) { if (this.getEntryProperty(i, "panels").indexOf(aPanelId) == -1) { continue; } if (this.objectMatchesEntry(aObject, aLinkedViewer, i)) { if (this.getEntryProperty(i, "important")) { urls.unshift(i); } else { urls.push(i); } } } return urls; }, /** * Determines if an object is eligible to be viewed by a particular viewer. * * @param aObject * The object being checked for eligibility. * @param aLinkedViewer * The view object of linked panel. * @param aIndex * The numerical index of the entry. * @return true if object can be viewed. */ objectMatchesEntry: function VR_ObjectMatchesEntry(aObject, aLinkedViewer, aIndex) { try { return this.mFilters[aIndex](aObject, aLinkedViewer); } catch (ex) { Components.utils.reportError(ex); } return false; }, /** * Notifies the registry that a viewer has been instantiated, and that it * corresponds to a particular entry in the viewer registry. * * @param aViewer * The inIViewer object to cache. * @param aIndex * The numerical index of the entry. */ cacheViewer: function VR_CacheViewer(aViewer, aIndex) { var uid = this.getEntryProperty(aIndex, "uid"); this.mViewerHash[uid] = { viewer: aViewer, entry: aIndex }; }, uncacheViewer: function VR_UncacheViewer(aViewer) { delete this.mViewerHash[aViewer.uid]; }, // for previously loaded viewers only getViewerByUID: function VR_GetViewerByUID(aUID) { return this.mViewerHash[aUID].viewer; }, // for previously loaded viewers only getEntryForViewer: function VR_GetEntryForViewer(aViewer) { return this.mViewerHash[aViewer.uid].entry; }, // for previously loaded viewers only getEntryByUID: function VR_GetEntryByUID(aUID) { return this.mViewerHash[aUID].aIndex; }, getEntryProperty: function VR_GetEntryProperty(aIndex, aProp) { return this.mViewerDS.get(aIndex, aProp); }, getEntryCount: function VR_GetEntryCount() { return this.mViewerDS.length; }, //////////////////////////////////////////////////////////////////////////// //// Viewer Registration addNewEntry: function VR_AddNewEntry(aUID, aDescription, aFilter) { }, removeEntry: function VR_RemoveEntry(aIndex) { }, saveRegistry: function VR_SaveRegistry() { } }; //////////////////////////////////////////////////////////////////////////// //// Listener Objects function ViewerRegistryLoadObserver(aTarget) { this.mTarget = aTarget; } ViewerRegistryLoadObserver.prototype = { mTarget: null, onError: function VRLO_OnError(aStatus, aErrorMsg) { this.mTarget.onError(aStatus, aErrorMsg); }, onDataSourceReady: function VRLO_OnDataSourceReady(aDS) { this.mTarget.onLoad(aDS); } }; ================================================ FILE: extensions/inspector/resources/content/browserOverlay.xul ================================================ ================================================ FILE: extensions/inspector/resources/content/commandOverlay.xul ================================================ %dtd1; ]> ================================================ FILE: extensions/inspector/resources/content/editingOverlay.xul ================================================ ================================================ FILE: extensions/inspector/resources/content/extensions/titledSplitter.css ================================================ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ @import url("chrome://inspector/skin/titledSplitter.css"); .titled-splitter { -moz-binding: url("titledSplitter.xml#titledSplitter") !important; } ================================================ FILE: extensions/inspector/resources/content/extensions/titledSplitter.xml ================================================ ================================================ FILE: extensions/inspector/resources/content/extensions/wsm-colorpicker.js ================================================ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /*************************************************************** * wsm-colorpicker ---------------------------------------------- * Quick script which adds support for the color picker widget * to nsWidgetStateManager in the pref winodw. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * REQUIRED IMPORTS: ****************************************************************/ function AddColorPicker(aCallback) { window.addEventListener("load", AddColorPicker_delayCheck, false); window.AddColorPicker_callback = aCallback; } function AddColorPicker_delayCheck() { if (parent.hPrefWindow) AddColorPicker_addColorHandlers() else setTimeout("AddColorPicker_delayCheck()", 1); } function AddColorPicker_addColorHandlers() { parent.hPrefWindow.wsm.handlers.colorpicker = { set: function (aElementID, aDataObject) { var wsm = parent.hPrefWindow.wsm; var element = wsm.contentArea.document.getElementById( aElementID ); element.color = aDataObject.color; }, get: function (aElementID) { var wsm = parent.hPrefWindow.wsm; var element = wsm.contentArea.document.getElementById( aElementID ); var dataObject = wsm.generic_Get(element); if(dataObject) { dataObject.color = element.color; return dataObject; } return null; } } window.AddColorPicker_callback(); } ================================================ FILE: extensions/inspector/resources/content/hooks.js ================================================ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ function inspectDOMDocument(aDocument, aModal) { window.openDialog("chrome://inspector/content/", "_blank", "chrome,all,dialog=no"+(aModal?",modal":""), aDocument); } function inspectDOMNode(aNode, aModal) { window.openDialog("chrome://inspector/content/", "_blank", "chrome,all,dialog=no"+(aModal?",modal":""), aNode); } function inspectObject(aObject, aModal) { window.openDialog("chrome://inspector/content/object.xul", "_blank", "chrome,all,dialog=no"+(aModal?",modal":""), aObject); } ================================================ FILE: extensions/inspector/resources/content/inspector.css ================================================ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ @import url("chrome://inspector/content/extensions/titledSplitter.css"); @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); *[hide="true"] { visibility: hidden; } domi-panelset { -moz-binding: url("chrome://inspector/content/inspector.xml#panelset"); display: -moz-box; } domi-panel { -moz-binding: url("chrome://inspector/content/inspector.xml#panel"); display: -moz-box; } #ppsViewerPopupset { display: none; } .tree-list > treecol, .tree-list > .tree-columns > treecol { -moz-binding: none; background-color: transparent !important; margin: 0px !important; border: none !important; padding: 0px !important; } .tree-nocolpicker > .tree-columns > .tree-columnpicker { visibility: collapse; } ================================================ FILE: extensions/inspector/resources/content/inspector.js ================================================ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /***************************************************************************** * InspectorApp --------------------------------------------------------------- * The primary object that controls the Inspector application. *****************************************************************************/ ////////////////////////////////////////////////////////////////////////////// //// Global Variables var inspector; ////////////////////////////////////////////////////////////////////////////// //// Global Constants const kIsMac = /Mac/.test(navigator.platform); const kInspectorTitle = kIsMac ? "" : " - " + document.title; const kAccessibleRetrievalContractID = "@mozilla.org/accessibleRetrieval;1"; const kClipboardHelperContractID = "@mozilla.org/widget/clipboardhelper;1"; const kPromptServiceContractID = "@mozilla.org/embedcomp/prompt-service;1"; const kFOStreamContractID = "@mozilla.org/network/file-output-stream;1"; const kEncoderContractIDbase = "@mozilla.org/layout/documentEncoder;1?type="; const kSerializerContractID = "@mozilla.org/xmlextras/xmlserializer;1"; const kWindowMediatorContractID = "@mozilla.org/appshell/window-mediator;1"; const kFilePickerContractID = "@mozilla.org/filepicker;1"; const nsIAccessible = Components.interfaces.nsIAccessible; const nsIWebNavigation = Components.interfaces.nsIWebNavigation; const nsIDocShellTreeItem = Components.interfaces.nsIDocShellTreeItem; const nsIDocShell = Components.interfaces.nsIDocShell; ////////////////////////////////////////////////////////////////////////////// window.addEventListener("load", InspectorApp_initialize, false); window.addEventListener("unload", InspectorApp_destroy, false); function InspectorApp_initialize() { inspector = new InspectorApp(); // window.arguments may be either a string or a node. // If passed via a command line handler, it will be a uri string. // If passed via navigator hooks, it will be a dom node to inspect. var initNode, initURI; if (window.arguments && window.arguments.length) { if (typeof window.arguments[0] == "string") { initURI = window.arguments[0]; } else if (window.arguments[0] instanceof Components.interfaces.nsIDOMNode) { initNode = window.arguments[0]; } } inspector.initialize(initNode, initURI); // Enable/disable Mac outlier keys. if (kIsMac) { document.getElementById("keyEnterLocation2").setAttribute("disabled", "true"); } else { document.getElementById("keyEditDeleteMac").setAttribute("disabled", "true"); } if (/Win/.test(navigator.platform)) { document.getElementById("mnEditRedo").setAttribute("key", "keyEditRedo2"); } // Get rid of any menus that we expose as overlay points for integration // with several applications but aren't of use with the one hosting us here. var menubar = document.getElementById("mbrInspectorMain"); var kid = menubar.firstChild; while (kid) { let nextSibling = kid.nextSibling; if (!kid.hasChildNodes()) { menubar.removeChild(kid); } kid = nextSibling; } } function InspectorApp_destroy() { inspector.destroy(); } ////////////////////////////////////////////////////////////////////////////// //// Class InspectorApp function InspectorApp() { } InspectorApp.prototype = { //////////////////////////////////////////////////////////////////////////// //// Initialization mShowBrowser: false, mClipboardHelper: null, mPromptService: null, mDocPanel: null, mObjectPanel: null, mDocViewerListPopup: null, mObjectViewerListPopup: null, mLastKnownDocPanelSubject: null, mLastKnownObjectPanelSubject: null, get document() { return this.mDocPanel.viewer.subject }, get panelset() { return this.mPanelSet; }, initialize: function IA_Initialize(aTarget, aURI) { this.mInitTarget = aTarget; var el = document.getElementById("bxBrowser"); el.addEventListener("pageshow", BrowserPageShowListener, true); this.setBrowser(false, true); this.mClipboardHelper = XPCU.getService(kClipboardHelperContractID, "nsIClipboardHelper"); this.mPromptService = XPCU.getService(kPromptServiceContractID, "nsIPromptService"); this.mDocViewerListPopup = document.getElementById("mppDocViewerList"); this.mObjectViewerListPopup = document.getElementById("mppObjectViewerList"); this.mPanelSet = document.getElementById("bxPanelSet"); this.mPanelSet.addObserver("panelsetready", this); this.mPanelSet.initialize(); // check if accessibility service is available if (!(kAccessibleRetrievalContractID in Components.classes)) { var elm = document.getElementById("cmd:toggleAccessibleNodes"); if (elm) { elm.setAttribute("disabled", "true"); } elm = document.getElementById("mnInspectApplicationAccessible"); if (elm) { elm.setAttribute("disabled", "true"); } } if (aURI) { this.gotoURL(aURI); } }, destroy: function IA_Destroy() { InsUtil.persistAll("bxDocPanel"); InsUtil.persistAll("bxObjectPanel"); }, //////////////////////////////////////////////////////////////////////////// //// Viewer Panels initViewerPanels: function IA_InitViewerPanels() { this.mDocPanel = this.mPanelSet.getPanel(0); this.mDocPanel.addObserver("subjectChange", this); this.mObjectPanel = this.mPanelSet.getPanel(1); this.mObjectPanel.addObserver("subjectChange", this); if (this.mInitTarget) { if (this.mInitTarget.nodeType == Node.DOCUMENT_NODE) { this.setTargetDocument(this.mInitTarget, false); } else if (this.mInitTarget.nodeType == Node.ELEMENT_NODE) { this.setTargetDocument(this.mInitTarget.ownerDocument, false); this.mDocPanel.params = this.mInitTarget; } this.mInitTarget = null; } }, onEvent: function IA_OnEvent(aEvent) { switch (aEvent.type) { case "panelsetready": this.initViewerPanels(); break; case "subjectChange": // A subjectChange really means the *viewer's* subject changed, and // one will be dispatched everytime a new viewer is loaded. Don't // update the entries if the panel's subject is the same as before and // the subjectChange was only dispatched because of a new viewer. if (aEvent.target == this.mDocPanel.viewer) { let panel = this.mDocPanel; let mpp = this.mDocViewerListPopup; // Update the viewer list. if (this.mLastKnownDocPanelSubject != aEvent.subject) { panel.rebuildViewerList(mpp); this.mLastKnownDocPanelSubject = aEvent.subject; } panel.updateViewerListSelection(mpp); if (aEvent.subject) { if ("location" in aEvent.subject) { // display document url this.locationText = aEvent.subject.location; document.title = (aEvent.subject.title || aEvent.subject.location) + kInspectorTitle; this.updateCommand("cmdSave"); } else if (("nsIAccessibleApplication" in Components.interfaces && aEvent.subject instanceof Components.interfaces.nsIAccessibleApplication) || (aEvent.subject instanceof nsIAccessible && !aEvent.subject.parent)) { // Update title for application accessible in compatible way for // Gecko 2.0 and 1.9.2. this.locationText = ""; var title = this.mPanelSet. stringBundle.getString("applicationAccesible.title"); document.title = title + kInspectorTitle; this.updateCommand("cmdSave"); } } } else if (aEvent.target == this.mObjectPanel.viewer) { let panel = this.mObjectPanel; let mpp = this.mObjectViewerListPopup; // Update the viewer list. if (this.mLastKnownObjectPanelSubject != aEvent.subject) { panel.rebuildViewerList(mpp); this.mLastKnownObjectPanelSubject = aEvent.subject; } panel.updateViewerListSelection(mpp); } break; } }, //////////////////////////////////////////////////////////////////////////// //// UI Commands updateCommand: function IA_UpdateCommand(aCommand) { var command = document.getElementById(aCommand); var disabled = false; switch (aCommand) { case "cmdSave": var doc = this.mDocPanel.subject; disabled = !((kEncoderContractIDbase + doc.contentType) in Components.classes || (kSerializerContractID in Components.classes)); break; } command.setAttribute("disabled", disabled); }, doViewerCommand: function IA_DoViewerCommand(aCommand) { this.mPanelSet.execCommand(aCommand); }, enterLocation: function IA_EnterLocation() { this.locationBar.focus(); this.locationBar.select(); }, showPrefsDialog: function IA_ShowPrefsDialog() { goPreferences("inspector_pane"); }, toggleBrowser: function IA_ToggleBrowser(aToggleSplitter) { this.setBrowser(!this.mShowBrowser, aToggleSplitter) }, /** * Toggle 'blink on select' command. */ toggleFlashOnSelect: function IA_ToggleFlashOnSelect() { this.mPanelSet.flasher.flashOnSelect = !this.mPanelSet.flasher.flashOnSelect; }, setBrowser: function IA_SetBrowser(aValue, aToggleSplitter) { this.mShowBrowser = aValue; if (aToggleSplitter) { this.openSplitter("Browser", aValue); } var cmd = document.getElementById("cmdToggleDocument"); cmd.setAttribute("checked", aValue); }, openSplitter: function IA_OpenSplitter(aName, aTruth) { var splitter = document.getElementById("spl" + aName); if (aTruth) { splitter.open(); } else { splitter.close(); } }, /** * Saves the current document state in the inspector. */ save: function IA_Save() { var picker = XPCU.createInstance(kFilePickerContractID, "nsIFilePicker"); var title = document.getElementById("mi-save").label; picker.init(window, title, picker.modeSave) picker.appendFilters(picker.filterHTML | picker.filterXML | picker.filterXUL); if (picker.show() == picker.returnCancel) { return; } var fos = XPCU.createInstance(kFOStreamContractID, "nsIFileOutputStream"); const flags = 0x02 | 0x08 | 0x20; // write, create, truncate var doc = this.mDocPanel.subject; if ((kEncoderContractIDbase + doc.contentType) in Components.classes) { // first we try to use the document encoder for that content type. If // that fails, we move on to the xml serializer. var encoder = XPCU.createInstance(kEncoderContractIDbase + doc.contentType, "nsIDocumentEncoder"); encoder.init(doc, doc.contentType, encoder.OutputRaw); encoder.setCharset(doc.characterSet); fos.init(picker.file, flags, -1, 0); try { encoder.encodeToStream(fos); } finally { fos.close(); } } else { var serializer = XPCU.createInstance(kSerializerContractID, "nsIDOMSerializer"); fos.init(picker.file, flags, -1, 0); try { serializer.serializeToStream(doc, fos); } finally { fos.close(); } } }, exit: function IA_Exit() { window.close(); // Todo: remove observer service here }, //////////////////////////////////////////////////////////////////////////// //// Navigation gotoTypedURL: function IA_GotoTypedURL() { var url = document.getElementById("tfURLBar").value; this.gotoURL(url); }, gotoURL: function IA_GotoURL(aURL, aNoSaveHistory) { this.mPendingURL = aURL; this.mPendingNoSave = aNoSaveHistory; this.browseToURL(aURL); this.setBrowser(true, true); }, browseToURL: function IA_BrowseToURL(aURL) { try { this.webNavigation.loadURI(aURL, nsIWebNavigation.LOAD_FLAGS_NONE, null, null, null); } catch(ex) { // nsIWebNavigation.loadURI will spit out an appropriate user prompt, so // we don't need to do anything here. See nsDocShell::DisplayLoadError() } }, /** * Creates the submenu for Inspect Content/Chrome Document */ showInspectDocumentList: function IA_ShowInspectDocumentList(aEvent, aChrome) { var menu = aEvent.target; var ww = XPCU.getService(kWindowMediatorContractID, "nsIWindowMediator"); var windows = ww.getXULWindowEnumerator(null); var docs = []; while (windows.hasMoreElements()) { try { // Get the window's main docshell var windowDocShell = XPCU.QI(windows.getNext(), "nsIXULWindow").docShell; this.appendContainedDocuments(docs, windowDocShell, aChrome ? nsIDocShellTreeItem.typeChrome : nsIDocShellTreeItem.typeContent); } catch (ex) { // We've failed with this window somehow, but we're catching the error // so the others will still work Components.utils.reportError(ex); } } // Clear out any previous menu this.emptyChildren(menu); // Now add what we found to the menu if (!docs.length) { var noneMenuItem = document.createElementNS(kXULNSURI, "menuitem"); var label = this.mPanelSet.stringBundle.getString( "inspectWindow.noDocuments.message" ); noneMenuItem.setAttribute("label", label); noneMenuItem.setAttribute("disabled", true); menu.appendChild(noneMenuItem); } else { for (var i = 0; i < docs.length; i++) { this.addInspectDocumentMenuItem(menu, docs[i], i + 1); } } }, /** * Appends to the array the documents contained in docShell (including the * passed docShell itself). * * @param array * The array to append to. * @param docShell * The docshell to look for documents in. * @param type * One of the types defined in nsIDocShellTreeItem. */ appendContainedDocuments: function IA_AppendContainedDocuments(array, docShell, type) { // Load all the window's content docShells var containedDocShells = docShell.getDocShellEnumerator(type, nsIDocShell.ENUMERATE_FORWARDS); while (containedDocShells.hasMoreElements()) { try { // Get the corresponding document for this docshell var childDoc = XPCU.QI(containedDocShells.getNext(), "nsIDocShell") .contentViewer.DOMDocument; // Ignore the DOM Inspector's browser docshell if it's not being used if (docShell.contentViewer.DOMDocument.location.href != document.location.href || childDoc.location.href != "about:blank") { array.push(childDoc); } } catch (ex) { // We've failed with this document somehow, but we're catching the // error so the others will still work dump(ex + "\n"); } } }, /** * Creates a menu item for Inspect Document. * * @param doc * Document related to this menu item. * @param docNumber * The position of the document. */ addInspectDocumentMenuItem: function IA_AddInspectDocumentMenuItem(parent, doc, docNumber) { var menuItem = document.createElementNS(kXULNSURI, "menuitem"); menuItem.doc = doc; // Use the URL if there's no title var title = doc.title || doc.location.href; // The first ten items get numeric access keys if (docNumber < 10) { menuItem.setAttribute("label", docNumber + " " + title); menuItem.setAttribute("accesskey", docNumber); } else { menuItem.setAttribute("label", title); } parent.appendChild(menuItem); }, setTargetApplicationAccessible: function setTargetApplicationAccessible() { var accService = XPCU.getService(kAccessibleRetrievalContractID, "nsIAccessibleRetrieval"); if (accService) { if ("getApplicationAccessible" in accService) { this.mDocPanel.subject = accService.getApplicationAccessible(); } else { // Gecko 1.9.2 support. var accessible = accService.getAccessibleFor(document); while (accessible.parent) { accessible = accessible.parent; } this.mDocPanel.subject = accessible; } } }, setTargetWindow: function IA_SetTargetWindow(aWindow) { this.setTargetDocument(aWindow.document, true); }, setTargetDocument: function IA_SetTargetDocument(aDoc, aIsInternal) { var cmd = document.getElementById("cmdToggleDocument"); if (aIsInternal == undefined) { aIsInternal = false; } cmd.setAttribute("disabled", !aIsInternal); this.setBrowser(aIsInternal, true); this.mDocPanel.subject = aDoc; }, get webNavigation() { var browser = document.getElementById("ifBrowser"); return browser.webNavigation; }, get locationBar() { return document.getElementById("tfURLBar"); }, //////////////////////////////////////////////////////////////////////////// //// UI Labels Getters and Setters get locationText() { return this.locationBar.value; }, set locationText(aText) { this.locationBar.value = aText; }, get statusText() { return document.getElementById("txStatus").value; }, set statusText(aText) { document.getElementById("txStatus").value = aText; }, get progress() { return document.getElementById("pmStatus").value; }, set progress(aPct) { document.getElementById("pmStatus").value = aPct; }, //////////////////////////////////////////////////////////////////////////// //// Document Loading documentLoaded: function IA_DocumentLoaded() { this.setTargetWindow(content); var url = this.webNavigation.currentURI.spec; // put the url into the urlbar this.locationText = url; // add url to the history, unless explicity told not to if (!this.mPendingNoSave) { this.addToHistory(url); } this.mPendingURL = null; this.mPendingNoSave = null; }, //////////////////////////////////////////////////////////////////////////// //// History addToHistory: function IA_AddToHistory(aURL) { }, //////////////////////////////////////////////////////////////////////////// //// Uncategorized get isViewingContent() { return this.mPanelSet.getPanel(0).subject != null; }, fillInTooltip: function IA_FillInTooltip(aMenuItem) { var doc = aMenuItem.doc; if (!doc) { return false; } var titleLabel = document.getElementById("docItemsTitle"); var uriLabel = document.getElementById("docItemsURI"); titleLabel.value = doc.title; uriLabel.value = doc.location.href; titleLabel.hidden = !titleLabel.value; return true; }, initPopup: function IA_InitPopup(aPopup) { var items = aPopup.getElementsByTagName("menuitem"); var js, fn, item; for (var i = 0; i < items.length; i++) { item = items[i]; fn = "isDisabled" in item ? item.isDisabled : null; if (!fn) { js = item.getAttribute("isDisabled"); if (js) { fn = new Function(js); item.isDisabled = fn; } else { // to prevent annoying "strict" warning messages item.isDisabled = null; } } if (fn) { if (item.isDisabled()) { item.setAttribute("disabled", "true"); } else { item.removeAttribute("disabled"); } } fn = null; } }, emptyChildren: function IA_EmptyChildren(aNode) { while (aNode.hasChildNodes()) { aNode.removeChild(aNode.lastChild); } }, onSplitterOpen: function IA_OnSplitterOpen(aSplitter) { if (aSplitter.id == "splBrowser") { this.setBrowser(aSplitter.isOpened, false); } }, onViewerListCommand: function IA_OnViewerListCommand(aItem) { var mpp = aItem.parentNode; if (mpp == this.mDocViewerListPopup) { this.mDocPanel.onViewerListCommand(aItem); } else if (mpp == this.mObjectViewerListPopup) { this.mObjectPanel.onViewerListCommand(aItem); } }, // needed by overlayed commands from viewer to get references to a specific // viewer object by name getViewer: function IA_GetViewer(aUID) { return this.mPanelSet.registry.getViewerByUID(aUID); } }; //////////////////////////////////////////////////////////////////////////// //// Event Listeners function BrowserPageShowListener(aEvent) { // since we will also get pageshow events for frame documents, // make sure we respond to the top-level document load if (aEvent.target.defaultView == content) { inspector.documentLoaded(); } } ================================================ FILE: extensions/inspector/resources/content/inspector.xml ================================================ null null null null return this.getElementsByTagName("domi-panel"); return this.panels.length; 0; } else if (aCommand == "cmdEditRedo") { enabled = this.mTransactionManager && this.mTransactionManager.numberOfRedoItems > 0; } else { if (this.focusedPanel && this.focusedPanel.viewer) { enabled = this.focusedPanel.viewer.isCommandEnabled(aCommand); } } this.setCommandAttribute(aCommand, "disabled", !enabled); ]]> null null null null this.mFlasher.destroy(); this.mFlasher = null; null null null null null null null null null null 1) { Components.utils.reportError("expected only zero or one checked items"); } while (checked.length) { checked[0].removeAttribute("checked"); } var entry = this.mCurrentEntry; checked = aPopup.getElementsByAttribute("viewerListEntry", entry); if (checked.length == 1) { checked[0].setAttribute("checked", "true"); } else { Components.utils.reportError("expected one item to match entry " + entry); } ]]> ================================================ FILE: extensions/inspector/resources/content/inspector.xul ================================================ %dtd1; ]> ================================================ FILE: extensions/inspector/resources/content/inspectorOverlay.xul ================================================ ================================================ FILE: extensions/inspector/resources/content/tasksOverlay-ff.xul ================================================ ================================================ FILE: extensions/inspector/resources/content/tasksOverlay-mobile.xul ================================================ ================================================ FILE: extensions/inspector/resources/content/tasksOverlay-sb.xul ================================================ ================================================ FILE: extensions/inspector/resources/content/tasksOverlay-tb.xul ================================================ ================================================ FILE: extensions/inspector/resources/content/tasksOverlay.xul ================================================ ================================================ FILE: extensions/inspector/resources/content/utils.js ================================================ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /***************************************************************************** * Inspector Utils ------------------------------------------------------------ * Common functions and constants used across the app. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * REQUIRED IMPORTS: * chrome://inspector/content/jsutil/xpcom/XPCU.js * chrome://inspector/content/jsutil/rdf/RDFU.js *****************************************************************************/ ////////////////////////////////////////////////////////////////////////////// //// Global Constants const kInspectorNSURI = "http://www.mozilla.org/inspector#"; const kXULNSURI = "http://www.mozilla.org/keymaster/gatekeeper/" + "there.is.only.xul"; const kHTMLNSURI = "http://www.w3.org/1999/xhtml"; const kCharTable = { '&': "&", '<': "<", '>': ">", '"': """ }; ////////////////////////////////////////////////////////////////////////////// //// Global Variables var gEntityConverter; var InsUtil = { /*************************************************************************** * Convenience function for calling nsIChromeRegistry::convertChromeURL ***************************************************************************/ convertChromeURL: function IU_ConvertChromeURL(aURL) { var uri = XPCU.getService("@mozilla.org/network/io-service;1", "nsIIOService") .newURI(aURL, null, null); var reg = XPCU.getService("@mozilla.org/chrome/chrome-registry;1", "nsIChromeRegistry"); return reg.convertChromeURL(uri); }, /*************************************************************************** * Convenience function for getting a literal value from * nsIRDFDataSource::GetTarget * @param aDS * nsISupports * @param aId * string * @param aPropName * string ***************************************************************************/ getDSProperty: function IU_GetDSProperty(aDS, aId, aPropName) { var ruleRes = gRDF.GetResource(aId); var ds = XPCU.QI(aDS, "nsIRDFDataSource"); // just to be sure var propRes = ds.GetTarget(ruleRes, gRDF.GetResource(kInspectorNSURI + aPropName), true); propRes = XPCU.QI(propRes, "nsIRDFLiteral"); return propRes.Value; }, /*************************************************************************** * Convenience function for persisting an element's persisted attributes. ***************************************************************************/ persistAll: function IU_PersistAll(aId) { var el = document.getElementById(aId); if (el) { var attrs = el.getAttribute("persist").split(" "); for (var i = 0; i < attrs.length; ++i) { document.persist(aId, attrs[i]); } } }, /*************************************************************************** * Convenience function for escaping HTML strings. ***************************************************************************/ unicodeToEntity: function IU_UnicodeToEntity(text) { const entityVersion = Components.interfaces.nsIEntityConverter.entityW3C; function charTableLookup(letter) { return kCharTable[letter]; } function convertEntity(letter) { try { return gEntityConverter.ConvertToEntity(letter, entityVersion); } catch (ex) { return letter; } } if (!gEntityConverter) { try { gEntityConverter = XPCU.createInstance("@mozilla.org/intl/entityconverter;1", "nsIEntityConverter"); } catch (ex) { } } // replace chars in our charTable text = text.replace(/[<>&"]/g, charTableLookup); // replace chars > 0x7f via nsIEntityConverter text = text.replace(/[^\0-\u007f]/g, convertEntity); return text; }, /** * Determine which from a list of indexes is nearest to the given index. * @param aIndex * The index to search for. * @param aIndexList * A sorted list of indexes to be searched. * @return The index in the list closest to aIndex. This will be aIndex * itself if it appears in the list, or -1 if the list is empty. * @note */ getNearestIndex: function IU_GetNearestIndex(aIndex, aIndexList) { // Four easy cases: // - empty list // - single element list // - given index comes before the first element // - given index comes after the last element if (aIndexList.length == 0) { return -1; } var first = aIndexList[0]; if (aIndexList.length == 1 || aIndex <= first) { return first; } var high = aIndexList.length - 1; var last = aIndexList[high]; if (aIndex >= last) { return last; } var mid, low = 0; while (low <= high) { mid = low + Math.floor((high - low) / 2); let current = aIndexList[mid]; if (aIndex > current) { low = mid + 1; } else if (aIndex < current) { high = mid - 1; } else { return aIndex; } } // By handling the four easy cases above, we eliminated the possibility // that low or high will be out of bounds at this point. If aIndex had // been present, it would have been sandwiched between these two values: var previous = aIndexList[high]; var next = aIndexList[low]; if ((aIndex - previous) < (next - aIndex)) { return previous; } // Even if previous and next are equidistant to aIndex's position, we'll // go with the one that's greater. return next; } }; ////////////////////////////////////////////////////////////////////////////// //// Debugging Utilities // dump text to the Error Console function debug(aText) { // XX comment out to reduce noise var cs = XPCU.getService("@mozilla.org/consoleservice;1", "nsIConsoleService"); cs.logStringMessage(aText); } ================================================ FILE: extensions/inspector/resources/content/venkmanOverlay.xul ================================================ ================================================ FILE: extensions/inspector/resources/content/viewers/accessibleEvent/accessibleEvent.js ================================================ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /////////////////////////////////////////////////////////////////////////////// //// Global Variables var viewer; /////////////////////////////////////////////////////////////////////////////// //// Global Constants const kAccessibleRetrievalCID = "@mozilla.org/accessibleRetrieval;1"; const nsIAccessibleRetrieval = Components.interfaces.nsIAccessibleRetrieval; const nsIAccessibleEvent = Components.interfaces.nsIAccessibleEvent; const nsIAccessibleStateChangeEvent = Components.interfaces.nsIAccessibleStateChangeEvent; const nsIAccessibleTextChangeEvent = Components.interfaces.nsIAccessibleTextChangeEvent; const nsIAccessibleCaretMoveEvent = Components.interfaces.nsIAccessibleCaretMoveEvent; const nsIDOMNode = Components.interfaces.nsIDOMNode; /////////////////////////////////////////////////////////////////////////////// //// Initialization/Destruction window.addEventListener("load", AccessibleEventViewer_initialize, false); function AccessibleEventViewer_initialize() { viewer = new AccessibleEventViewer(); viewer.initialize(parent.FrameExchange.receiveData(window)); } /////////////////////////////////////////////////////////////////////////////// //// class AccessibleEventViewer function AccessibleEventViewer() { this.mURL = window.location; this.mObsMan = new ObserverManager(this); this.mAccService = XPCU.getService(kAccessibleRetrievalCID, nsIAccessibleRetrieval); } AccessibleEventViewer.prototype = { mSubject: null, mPane: null, mAccEventSubject: null, mAccService: null, get uid() { return "accessibleEvent"; }, get pane() { return this.mPane; }, get subject() { return this.mSubject; }, set subject(aObject) { this.mSubject = aObject; this.updateView(); this.mObsMan.dispatchEvent("subjectChange", { subject: aObject }); }, initialize: function initialize(aPane) { this.mPane = aPane; aPane.notifyViewerReady(this); }, isCommandEnabled: function isCommandEnabled(aCommand) { return false; }, getCommand: function getCommand(aCommand) { return null; }, destroy: function destroy() {}, // event dispatching addObserver: function addObserver(aEvent, aObserver) { this.mObsMan.addObserver(aEvent, aObserver); }, removeObserver: function removeObserver(aEvent, aObserver) { this.mObsMan.removeObserver(aEvent, aObserver); }, // private updateView: function updateView() { this.clearView(); if (!this.pane.params) { return; } this.mAccEventSubject = this.pane.params.accessibleEvent; if (!this.mAccEventSubject) return; XPCU.QI(this.mAccEventSubject, nsIAccessibleEvent); // Update accessible event properties. var shownPropsId = ""; if (this.mAccEventSubject instanceof nsIAccessibleStateChangeEvent) shownPropsId = "stateChangeEvent"; else if (this.mAccEventSubject instanceof nsIAccessibleTextChangeEvent) shownPropsId = "textChangeEvent"; else if (this.mAccEventSubject instanceof nsIAccessibleCaretMoveEvent) shownPropsId = "caretMoveEvent"; var props = document.getElementsByAttribute("prop", "*"); for (var i = 0; i < props.length; i++) { var propElm = props[i]; var isActive = !propElm.hasAttribute("class") || (propElm.getAttribute("class") == shownPropsId); if (isActive) { var prop = propElm.getAttribute("prop"); propElm.textContent = this[prop]; propElm.parentNode.removeAttribute("hidden"); } else { propElm.parentNode.setAttribute("hidden", "true"); } } // Update handler output. var outputElm = document.getElementById("handlerOutput"); var outputList = this.pane.params.accessibleEventHandlerOutput; if (outputList) { while (outputElm.firstChild) { outputElm.removeChild(outputElm.lastChild); } for (let i = 0; i < outputList.length; i++) { var output = outputList[i]; // Generate a tree. if (typeof output == "object" && "cols" in output && "view" in output) { var tree = document.createElement("tree"); tree.setAttribute("flex", "1"); tree.setAttribute("treelines", "true"); var treecols = document.createElement("treecols"); for (let col in output.cols) { var treecol = document.createElement("treecol"); treecol.setAttribute("id", col); treecol.setAttribute("label", output.cols[col].name); treecol.setAttribute("flex", output.cols[col].flex); if (output.cols[col].isPrimary) { treecol.setAttribute("primary", "true"); } treecol.setAttribute("persist", "width,hidden,ordinal"); treecols.appendChild(treecol); var splitter = document.createElement("splitter"); splitter.setAttribute("class", "tree-splitter"); treecols.appendChild(splitter); } tree.appendChild(treecols); var treechildren = document.createElement("treechildren"); tree.appendChild(treechildren); outputElm.appendChild(tree); tree.treeBoxObject.view = output.view; } else { // Output text. var node = document.createElement("description"); node.textContent = output; outputElm.appendChild(node); } } outputElm.parentNode.removeAttribute("hidden"); } else { outputElm.parentNode.setAttribute("hidden", "true"); } }, clearView: function clearView() { var containers = document.getElementsByAttribute("prop", "*"); for (var i = 0; i < containers.length; ++i) containers[i].textContent = ""; }, get isFromUserInput() { return this.mAccEventSubject.isFromUserInput; }, get state() { var state = 0, extraState = 0; var isExtraState = typeof this.mAccEventSubject.isExtraState == "function" ? this.mAccEventSubject.isExtraState() : this.mAccEventSubject.isExtraState; if (isExtraState) { extraState = this.mAccEventSubject.state; } else { state = this.mAccEventSubject.state; } var states = this.mAccService.getStringStates(state, extraState); var list = []; for (var i = 0; i < states.length; i++) list.push(states.item(i)); return list.join(); }, get isEnabled() { return typeof this.mAccEventSubject.isEnabled == "function" ? this.mAccEventSubject.isEnabled() : this.mAccEventSubject.isEnabled; }, get startOffset() { return this.mAccEventSubject.start; }, get length() { return this.mAccEventSubject.length; }, get isInserted() { return typeof this.mAccEventSubject.isInserted == "function" ? this.mAccEventSubject.isInserted() : this.mAccEventSubject.isInserted; }, get modifiedText() { return this.mAccEventSubject.modifiedText; }, get caretOffset() { return this.mAccEventSubject.caretOffset; } }; ================================================ FILE: extensions/inspector/resources/content/viewers/accessibleEvent/accessibleEvent.xul ================================================ %dtd1; %dtd2; ]>
    ================================================ FILE: extensions/svg-edit/content/editor/embedapi.js ================================================ /* function embedded_svg_edit(frame){ //initialize communication this.frame = frame; this.stack = []; //callback stack var editapi = this; window.addEventListener("message", function(e){ if(e.data.substr(0,5) == "ERROR"){ editapi.stack.splice(0,1)[0](e.data,"error") }else{ editapi.stack.splice(0,1)[0](e.data) } }, false) } embedded_svg_edit.prototype.call = function(code, callback){ this.stack.push(callback); this.frame.contentWindow.postMessage(code,"*"); } embedded_svg_edit.prototype.getSvgString = function(callback){ this.call("svgCanvas.getSvgString()",callback) } embedded_svg_edit.prototype.setSvgString = function(svg){ this.call("svgCanvas.setSvgString('"+svg.replace(/'/g, "\\'")+"')"); } */ /* Embedded SVG-edit API General usage: - Have an iframe somewhere pointing to a version of svg-edit > r1000 - Initialize the magic with: var svgCanvas = new embedded_svg_edit(window.frames['svgedit']); - Pass functions in this format: svgCanvas.setSvgString("string") - Or if a callback is needed: svgCanvas.setSvgString("string")(function(data, error){ if(error){ //there was an error }else{ //handle data } }) Everything is done with the same API as the real svg-edit, and all documentation is unchanged. The only difference is when handling returns, the callback notation is used instead. var blah = new embedded_svg_edit(window.frames['svgedit']); blah.clearSelection("woot","blah",1337,[1,2,3,4,5,"moo"],-42,{a: "tree",b:6, c: 9})(function(){console.log("GET DATA",arguments)}) */ function embedded_svg_edit(frame){ //initialize communication this.frame = frame; //this.stack = [] //callback stack this.callbacks = {}; //successor to stack this.encode = embedded_svg_edit.encode; //List of functions extracted with this: //Run in firebug on http://svg-edit.googlecode.com/svn/trunk/docs/files/svgcanvas-js.html //for(var i=0,q=[],f = document.querySelectorAll("div.CFunction h3.CTitle a");i<\/style>').appendTo('head'); } conn_rules.text(!on?"":"#tool_clone, #tool_topath, #tool_angle, #xy_panel { display: none !important; }"); $('#connector_panel').toggle(on); } function setPoint(elem, pos, x, y, setMid) { var pts = elem.points; var pt = svgroot.createSVGPoint(); pt.x = x; pt.y = y; if(pos === 'end') pos = pts.numberOfItems-1; // TODO: Test for this on init, then use alt only if needed try { pts.replaceItem(pt, pos); } catch(err) { // Should only occur in FF which formats points attr as "n,n n,n", so just split var pt_arr = elem.getAttribute("points").split(" "); for(var i=0; i< pt_arr.length; i++) { if(i == pos) { pt_arr[i] = x + ',' + y; } } elem.setAttribute("points",pt_arr.join(" ")); } if(setMid) { // Add center point var pt_start = pts.getItem(0); var pt_end = pts.getItem(pts.numberOfItems-1); setPoint(elem, 1, (pt_end.x + pt_start.x)/2, (pt_end.y + pt_start.y)/2); } } function updateLine(diff_x, diff_y) { // Update line with element var i = connections.length; while(i--) { var conn = connections[i]; var line = conn.connector; var elem = conn.elem; var pre = conn.is_start?'start':'end'; // var sw = line.getAttribute('stroke-width') * 5; // Update bbox for this element var bb = elData(line, pre+'_bb'); bb.x = conn.start_x + diff_x; bb.y = conn.start_y + diff_y; elData(line, pre+'_bb', bb); var alt_pre = conn.is_start?'end':'start'; // Get center pt of connected element var bb2 = elData(line, alt_pre+'_bb'); var src_x = bb2.x + bb2.width/2; var src_y = bb2.y + bb2.height/2; // Set point of element being moved var pt = getBBintersect(src_x, src_y, bb, getOffset(pre, line)); // $(line).data(pre+'_off')?sw:0 setPoint(line, conn.is_start?0:'end', pt.x, pt.y, true); // Set point of connected element var pt2 = getBBintersect(pt.x, pt.y, elData(line, alt_pre + '_bb'), getOffset(alt_pre, line)); setPoint(line, conn.is_start?'end':0, pt2.x, pt2.y, true); } } function findConnectors(elems) { if(!elems) elems = selElems; var connectors = $(svgcontent).find(conn_sel); connections = []; // Loop through connectors to see if one is connected to the element connectors.each(function() { var start = elData(this, "c_start"); var end = elData(this, "c_end"); var parts = [getElem(start), getElem(end)]; for(var i=0; i<2; i++) { var c_elem = parts[i]; var add_this = false; // The connected element might be part of a selected group $(c_elem).parents().each(function() { if($.inArray(this, elems) !== -1) { // Pretend this element is selected add_this = true; } }); if(!c_elem || !c_elem.parentNode) { $(this).remove(); continue; } if($.inArray(c_elem, elems) !== -1 || add_this) { var bb = svgCanvas.getStrokedBBox([c_elem]); connections.push({ elem: c_elem, connector: this, is_start: (i === 0), start_x: bb.x, start_y: bb.y }); } } }); } function updateConnectors(elems) { // Updates connector lines based on selected elements // Is not used on mousemove, as it runs getStrokedBBox every time, // which isn't necessary there. findConnectors(elems); if(connections.length) { // Update line with element var i = connections.length; while(i--) { var conn = connections[i]; var line = conn.connector; var elem = conn.elem; var sw = line.getAttribute('stroke-width') * 5; var pre = conn.is_start?'start':'end'; // Update bbox for this element var bb = svgCanvas.getStrokedBBox([elem]); bb.x = conn.start_x; bb.y = conn.start_y; elData(line, pre+'_bb', bb); var add_offset = elData(line, pre+'_off'); var alt_pre = conn.is_start?'end':'start'; // Get center pt of connected element var bb2 = elData(line, alt_pre+'_bb'); var src_x = bb2.x + bb2.width/2; var src_y = bb2.y + bb2.height/2; // Set point of element being moved var pt = getBBintersect(src_x, src_y, bb, getOffset(pre, line)); setPoint(line, conn.is_start?0:'end', pt.x, pt.y, true); // Set point of connected element var pt2 = getBBintersect(pt.x, pt.y, elData(line, alt_pre + '_bb'), getOffset(alt_pre, line)); setPoint(line, conn.is_start?'end':0, pt2.x, pt2.y, true); // Update points attribute manually for webkit if(navigator.userAgent.indexOf('AppleWebKit') != -1) { var pts = line.points; var len = pts.numberOfItems; var pt_arr = Array(len); for(var j=0; j< len; j++) { var pt = pts.getItem(j); pt_arr[j] = pt.x + ',' + pt.y; } line.setAttribute("points",pt_arr.join(" ")); } } } } function getBBintersect(x, y, bb, offset) { if(offset) { offset -= 0; bb = $.extend({}, bb); bb.width += offset; bb.height += offset; bb.x -= offset/2; bb.y -= offset/2; } var mid_x = bb.x + bb.width/2; var mid_y = bb.y + bb.height/2; var len_x = x - mid_x; var len_y = y - mid_y; var slope = Math.abs(len_y/len_x); var ratio; if(slope < bb.height/bb.width) { ratio = (bb.width/2) / Math.abs(len_x); } else { ratio = (bb.height/2) / Math.abs(len_y); } return { x: mid_x + len_x * ratio, y: mid_y + len_y * ratio } } // Do once (function() { var gse = svgCanvas.groupSelectedElements; svgCanvas.groupSelectedElements = function() { svgCanvas.removeFromSelection($(conn_sel).toArray()); gse(); } var mse = svgCanvas.moveSelectedElements; svgCanvas.moveSelectedElements = function() { svgCanvas.removeFromSelection($(conn_sel).toArray()); var cmd = mse.apply(this, arguments); updateConnectors(); return cmd; } se_ns = svgCanvas.getEditorNS(); }()); // Do on reset function init() { // Make sure all connectors have data set $(svgcontent).find('*').each(function() { var conn = this.getAttributeNS(se_ns, "connector"); if(conn) { this.setAttribute('class', conn_sel.substr(1)); var conn_data = conn.split(' '); var sbb = svgCanvas.getStrokedBBox([getElem(conn_data[0])]); var ebb = svgCanvas.getStrokedBBox([getElem(conn_data[1])]); $(this).data('c_start',conn_data[0]) .data('c_end',conn_data[1]) .data('start_bb', sbb) .data('end_bb', ebb); svgCanvas.getEditorNS(true); } }); // updateConnectors(); } // $(svgroot).parent().mousemove(function(e) { // // if(started // // || svgCanvas.getMode() != "connector" // // || e.target.parentNode.parentNode != svgcontent) return; // // console.log('y') // // if(e.target.parentNode.parentNode === svgcontent) { // // // // } // }); return { name: "Connector", svgicons: "images/conn.svg", buttons: [{ id: "mode_connect", type: "mode", icon: "images/cut.png", title: "Connect two objects", key: "Shift+3", includeWith: { button: '#tool_line', isDefault: false, position: 1 }, events: { 'click': function() { svgCanvas.setMode("connector"); } } }], addLangData: function(lang) { return { data: lang_list[lang] }; }, mouseDown: function(opts) { var e = opts.event; start_x = opts.start_x, start_y = opts.start_y; var mode = svgCanvas.getMode(); if(mode == "connector") { if(started) return; var mouse_target = e.target; var parents = $(mouse_target).parents(); if($.inArray(svgcontent, parents) != -1) { // Connectable element // If child of foreignObject, use parent var fo = $(mouse_target).closest("foreignObject"); start_elem = fo.length ? fo[0] : mouse_target; // Get center of source element var bb = svgCanvas.getStrokedBBox([start_elem]); var x = bb.x + bb.width/2; var y = bb.y + bb.height/2; started = true; cur_line = addElem({ "element": "polyline", "attr": { "id": getNextId(), "points": (x+','+y+' '+x+','+y+' '+start_x+','+start_y), "stroke": '#' + curConfig.initStroke.color, "stroke-width": (!start_elem.stroke_width || start_elem.stroke_width == 0) ? curConfig.initStroke.width : start_elem.stroke_width, "fill": "none", "opacity": curConfig.initStroke.opacity, "style": "pointer-events:none" } }); elData(cur_line, 'start_bb', bb); } return { started: true }; } else if(mode == "select") { findConnectors(); } }, mouseMove: function(opts) { var zoom = svgCanvas.getZoom(); var e = opts.event; var x = opts.mouse_x/zoom; var y = opts.mouse_y/zoom; var diff_x = x - start_x, diff_y = y - start_y; var mode = svgCanvas.getMode(); if(mode == "connector" && started) { var sw = cur_line.getAttribute('stroke-width') * 3; // Set start point (adjusts based on bb) var pt = getBBintersect(x, y, elData(cur_line, 'start_bb'), getOffset('start', cur_line)); start_x = pt.x; start_y = pt.y; setPoint(cur_line, 0, pt.x, pt.y, true); // Set end point setPoint(cur_line, 'end', x, y, true); } else if(mode == "select") { var slen = selElems.length; while(slen--) { var elem = selElems[slen]; // Look for selected connector elements if(elem && elData(elem, 'c_start')) { // Remove the "translate" transform given to move svgCanvas.removeFromSelection([elem]); svgCanvas.getTransformList(elem).clear(); } } if(connections.length) { updateLine(diff_x, diff_y); } } }, mouseUp: function(opts) { var zoom = svgCanvas.getZoom(); var e = opts.event, x = opts.mouse_x/zoom, y = opts.mouse_y/zoom, mouse_target = e.target; if(svgCanvas.getMode() == "connector") { var fo = $(mouse_target).closest("foreignObject"); if(fo.length) mouse_target = fo[0]; var parents = $(mouse_target).parents(); if(mouse_target == start_elem) { // Start line through click started = true; return { keep: true, element: null, started: started } } else if($.inArray(svgcontent, parents) === -1) { // Not a valid target element, so remove line $(cur_line).remove(); started = false; return { keep: false, element: null, started: started } } else { // Valid end element end_elem = mouse_target; var start_id = start_elem.id, end_id = end_elem.id; var conn_str = start_id + " " + end_id; var alt_str = end_id + " " + start_id; // Don't create connector if one already exists var dupe = $(svgcontent).find(conn_sel).filter(function() { var conn = this.getAttributeNS(se_ns, "connector"); if(conn == conn_str || conn == alt_str) return true; }); if(dupe.length) { $(cur_line).remove(); return { keep: false, element: null, started: false } } var bb = svgCanvas.getStrokedBBox([end_elem]); var pt = getBBintersect(start_x, start_y, bb, getOffset('start', cur_line)); setPoint(cur_line, 'end', pt.x, pt.y, true); $(cur_line) .data("c_start", start_id) .data("c_end", end_id) .data("end_bb", bb); se_ns = svgCanvas.getEditorNS(true); cur_line.setAttributeNS(se_ns, "se:connector", conn_str); cur_line.setAttribute('class', conn_sel.substr(1)); cur_line.setAttribute('opacity', 1); svgCanvas.addToSelection([cur_line]); svgCanvas.moveToBottomSelectedElement(); selManager.requestSelector(cur_line).showGrips(false); started = false; return { keep: true, element: cur_line, started: started } } } }, selectedChanged: function(opts) { // TODO: Find better way to skip operations if no connectors are in use if(!$(svgcontent).find(conn_sel).length) return; if(svgCanvas.getMode() == 'connector') { svgCanvas.setMode('select'); } // Use this to update the current selected elements selElems = opts.elems; var i = selElems.length; while(i--) { var elem = selElems[i]; if(elem && elData(elem, 'c_start')) { selManager.requestSelector(elem).showGrips(false); if(opts.selectedElement && !opts.multiselected) { // TODO: Set up context tools and hide most regular line tools showPanel(true); } else { showPanel(false); } } else { showPanel(false); } } updateConnectors(); }, elementChanged: function(opts) { var elem = opts.elems[0]; if (elem && elem.tagName == 'svg' && elem.id == "svgcontent") { // Update svgcontent (can change on import) svgcontent = elem; init(); } // Has marker, so change offset if(elem && ( elem.getAttribute("marker-start") || elem.getAttribute("marker-mid") || elem.getAttribute("marker-end") )) { var start = elem.getAttribute("marker-start"); var mid = elem.getAttribute("marker-mid"); var end = elem.getAttribute("marker-end"); cur_line = elem; $(elem) .data("start_off", !!start) .data("end_off", !!end); if(elem.tagName == "line" && mid) { // Convert to polyline to accept mid-arrow var x1 = elem.getAttribute('x1')-0; var x2 = elem.getAttribute('x2')-0; var y1 = elem.getAttribute('y1')-0; var y2 = elem.getAttribute('y2')-0; var id = elem.id; var mid_pt = (' '+((x1+x2)/2)+','+((y1+y2)/2) + ' '); var pline = addElem({ "element": "polyline", "attr": { "points": (x1+','+y1+ mid_pt +x2+','+y2), "stroke": elem.getAttribute('stroke'), "stroke-width": elem.getAttribute('stroke-width'), "marker-mid": mid, "fill": "none", "opacity": elem.getAttribute('opacity') || 1 } }); $(elem).after(pline).remove(); svgCanvas.clearSelection(); pline.id = id; svgCanvas.addToSelection([pline]); elem = pline; } } // Update line if it's a connector if(elem.getAttribute('class') == conn_sel.substr(1)) { var start = getElem(elData(elem, 'c_start')); updateConnectors([start]); } else { updateConnectors(); } }, toolButtonStateUpdate: function(opts) { if(opts.nostroke) { if ($('#mode_connect').hasClass('tool_button_current')) { clickSelect(); } } $('#mode_connect') .toggleClass('disabled',opts.nostroke); } }; }); ================================================ FILE: extensions/svg-edit/content/editor/extensions/ext-eyedropper.js ================================================ /* * ext-eyedropper.js * * Licensed under the Apache License, Version 2 * * Copyright(c) 2010 Jeff Schiller * */ svgEditor.addExtension("eyedropper", function(S) { var svgcontent = S.svgcontent, svgns = "http://www.w3.org/2000/svg", svgdoc = S.svgroot.parentNode.ownerDocument, ChangeElementCommand = svgCanvas.getPrivateMethods().ChangeElementCommand, addToHistory = svgCanvas.getPrivateMethods().addCommandToHistory, currentStyle = {fillPaint: "red", fillOpacity: 1.0, strokePaint: "black", strokeOpacity: 1.0, strokeWidth: 5, strokeDashArray: null, opacity: 1.0, strokeLinecap: 'butt', strokeLinejoin: 'miter', }; function getStyle(opts) { // if we are in eyedropper mode, we don't want to disable the eye-dropper tool var mode = svgCanvas.getMode(); if (mode == "eyedropper") return; var elem = null; var tool = $('#tool_eyedropper'); // enable-eye-dropper if one element is selected if (opts.elems.length == 1 && opts.elems[0] && $.inArray(opts.elems[0].nodeName, ['svg', 'g', 'use']) == -1) { elem = opts.elems[0]; tool.removeClass('disabled'); // grab the current style currentStyle.fillPaint = elem.getAttribute("fill") || "black"; currentStyle.fillOpacity = elem.getAttribute("fill-opacity") || 1.0; currentStyle.strokePaint = elem.getAttribute("stroke"); currentStyle.strokeOpacity = elem.getAttribute("stroke-opacity") || 1.0; currentStyle.strokeWidth = elem.getAttribute("stroke-width"); currentStyle.strokeDashArray = elem.getAttribute("stroke-dasharray"); currentStyle.strokeLinecap = elem.getAttribute("stroke-linecap"); currentStyle.strokeLinejoin = elem.getAttribute("stroke-linejoin"); currentStyle.opacity = elem.getAttribute("opacity") || 1.0; } // disable eye-dropper tool else { tool.addClass('disabled'); } } return { name: "eyedropper", svgicons: "extensions/eyedropper-icon.xml", buttons: [{ id: "tool_eyedropper", type: "mode", title: "Eye Dropper Tool", events: { "click": function() { svgCanvas.setMode("eyedropper"); } } }], // if we have selected an element, grab its paint and enable the eye dropper button selectedChanged: getStyle, elementChanged: getStyle, mouseDown: function(opts) { var mode = svgCanvas.getMode(); if (mode == "eyedropper") { var e = opts.event; var target = e.target; if ($.inArray(target.nodeName, ['svg', 'g', 'use']) == -1) { var changes = {}; var change = function(elem, attrname, newvalue) { changes[attrname] = elem.getAttribute(attrname); elem.setAttribute(attrname, newvalue); }; if (currentStyle.fillPaint) change(target, "fill", currentStyle.fillPaint); if (currentStyle.fillOpacity) change(target, "fill-opacity", currentStyle.fillOpacity); if (currentStyle.strokePaint) change(target, "stroke", currentStyle.strokePaint); if (currentStyle.strokeOpacity) change(target, "stroke-opacity", currentStyle.strokeOpacity); if (currentStyle.strokeWidth) change(target, "stroke-width", currentStyle.strokeWidth); if (currentStyle.strokeDashArray) change(target, "stroke-dasharray", currentStyle.strokeDashArray); if (currentStyle.opacity) change(target, "opacity", currentStyle.opacity); if (currentStyle.strokeLinecap) change(target, "stroke-linecap", currentStyle.strokeLinecap); if (currentStyle.strokeLinejoin) change(target, "stroke-linejoin", currentStyle.strokeLinejoin); addToHistory(new ChangeElementCommand(target, changes)); } } }, }; }); ================================================ FILE: extensions/svg-edit/content/editor/extensions/ext-foreignobject.js ================================================ /* * ext-foreignobject.js * * Licensed under the Apache License, Version 2 * * Copyright(c) 2010 Jacques Distler * Copyright(c) 2010 Alexis Deveria * */ svgEditor.addExtension("foreignObject", function(S) { var svgcontent = S.svgcontent, addElem = S.addSvgElementFromJson, selElems, svgns = "http://www.w3.org/2000/svg", xlinkns = "http://www.w3.org/1999/xlink", xmlns = "http://www.w3.org/XML/1998/namespace", xmlnsns = "http://www.w3.org/2000/xmlns/", se_ns = "http://svg-edit.googlecode.com", htmlns = "http://www.w3.org/1999/xhtml", mathns = "http://www.w3.org/1998/Math/MathML", editingforeign = false, svgdoc = S.svgroot.parentNode.ownerDocument, started, newFO; var properlySourceSizeTextArea = function(){ // TODO: remove magic numbers here and get values from CSS var height = $('#svg_source_container').height() - 80; $('#svg_source_textarea').css('height', height); }; function showPanel(on) { var fc_rules = $('#fc_rules'); if(!fc_rules.length) { fc_rules = $('
  • Layers

    Layer 1
    Move elements to:
    L a y e r s
    B
    i
    >>

    Copy the contents of this box into a text editor, then save the file with a .svg extension.

    Image Properties
    Canvas Dimensions
    Included Images
    Editor Preferences
    Editor Background

    Note: Background will not be saved with image.

    Grid
    ================================================ FILE: extensions/svg-edit/content/editor/svg-editor.js ================================================ /* * svg-editor.js * * Licensed under the Apache License, Version 2 * * Copyright(c) 2010 Alexis Deveria * Copyright(c) 2010 Pavol Rusnak * Copyright(c) 2010 Jeff Schiller * Copyright(c) 2010 Narendra Sisodiya * */ (function() { if(!window.svgEditor) window.svgEditor = function($) { var svgCanvas; var Editor = {}; var is_ready = false; var defaultPrefs = { lang:'en', iconsize:'m', bkgd_color:'#FFF', bkgd_url:'', img_save:'embed' }, curPrefs = {}, // Note: Difference between Prefs and Config is that Prefs can be // changed in the UI and are stored in the browser, config can not curConfig = { canvas_expansion: 1, dimensions: [640,480], initFill: { color: 'FF0000', // solid red opacity: 1 }, initStroke: { width: 5, color: '000000', // solid black opacity: 1 }, initOpacity: 1, imgPath: 'images/', langPath: 'locale/', extPath: 'extensions/', jGraduatePath: 'jgraduate/images/', extensions: ['ext-markers.js','ext-connector.js', 'ext-eyedropper.js', 'ext-shapes.js', 'ext-imagelib.js','ext-grid.js'], initTool: 'select', wireframe: false, colorPickerCSS: null, gridSnapping: false, snappingStep: 10 }, uiStrings = Editor.uiStrings = { "invalidAttrValGiven":"Invalid value given", "noContentToFitTo":"No content to fit to", "layer":"Layer", "dupeLayerName":"There is already a layer named that!", "enterUniqueLayerName":"Please enter a unique layer name", "enterNewLayerName":"Please enter the new layer name", "layerHasThatName":"Layer already has that name", "QmoveElemsToLayer":"Move selected elements to layer \"%s\"?", "QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!", "QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!", "QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?", "QignoreSourceChanges":"Ignore changes made to SVG source?", "featNotSupported":"Feature not supported", "enterNewImgURL":"Enter the new image URL", "defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.", "loadingImage":"Loading image, please wait...", "saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.", "noteTheseIssues": "Also note the following issues: ", "ok":"OK", "cancel":"Cancel", "key_up":"Up", "key_down":"Down", "key_backspace":"Backspace", "key_del":"Del" }; var curPrefs = {}; //$.extend({}, defaultPrefs); var customHandlers = {}; Editor.curConfig = curConfig; Editor.tool_scale = 1; // Store and retrieve preferences $.pref = function(key, val) { if(val) curPrefs[key] = val; key = 'svg-edit-'+key; var host = location.hostname, onweb = host && host.indexOf('.') != -1, store = (val != undefined), storage = false; // Some FF versions throw security errors here try { if(window.localStorage) { // && onweb removed so Webkit works locally storage = localStorage; } } catch(e) {} try { if(window.globalStorage && onweb) { storage = globalStorage[host]; } } catch(e) {} if(storage) { if(store) storage.setItem(key, val); else if (storage.getItem(key)) return storage.getItem(key) + ''; // Convert to string for FF (.value fails in Webkit) } else if(window.widget) { if(store) widget.setPreferenceForKey(val, key); else return widget.preferenceForKey(key); } else { if(store) { var d = new Date(); d.setTime(d.getTime() + 31536000000); val = encodeURIComponent(val); document.cookie = key+'='+val+'; expires='+d.toUTCString(); } else { var result = document.cookie.match(new RegExp(key + "=([^;]+)")); return result?decodeURIComponent(result[1]):''; } } } Editor.setConfig = function(opts) { $.each(opts, function(key, val) { // Only allow prefs defined in defaultPrefs if(key in defaultPrefs) { $.pref(key, val); } }); $.extend(true, curConfig, opts); if(opts.extensions) { curConfig.extensions = opts.extensions; } } // Extension mechanisms must call setCustomHandlers with two functions: opts.open and opts.save // opts.open's responsibilities are: // - invoke a file chooser dialog in 'open' mode // - let user pick a SVG file // - calls setCanvas.setSvgString() with the string contents of that file // opts.save's responsibilities are: // - accept the string contents of the current document // - invoke a file chooser dialog in 'save' mode // - save the file to location chosen by the user Editor.setCustomHandlers = function(opts) { Editor.ready(function() { if(opts.open) { $('#tool_open > input[type="file"]').remove(); $('#tool_open').show(); svgCanvas.open = opts.open; } if(opts.save) { show_save_warning = false; svgCanvas.bind("saved", opts.save); } if(opts.pngsave) { svgCanvas.bind("exported", opts.pngsave); } customHandlers = opts; }); } Editor.randomizeIds = function() { svgCanvas.randomizeIds(arguments) } Editor.init = function() { (function() { // let the opener know SVG Edit is ready var w = window.top.opener; if (w) { try { var svgEditorReadyEvent = w.document.createEvent("Event"); svgEditorReadyEvent.initEvent("svgEditorReady", true, true); w.document.documentElement.dispatchEvent(svgEditorReadyEvent); } catch(e) {} } })(); (function() { // Load config/data from URL if given var urldata = $.deparam.querystring(true); if(!$.isEmptyObject(urldata)) { if(urldata.dimensions) { urldata.dimensions = urldata.dimensions.split(','); } if(urldata.extensions) { urldata.extensions = urldata.extensions.split(','); } if(urldata.bkgd_color) { urldata.bkgd_color = '#' + urldata.bkgd_color; } svgEditor.setConfig(urldata); // FIXME: This is null if Data URL ends with '='. var src = urldata.source; var qstr = $.param.querystring(); if(src) { if(src.indexOf("data:") === 0) { // plusses get replaced by spaces, so re-insert src = src.replace(/ /g, "+"); Editor.loadFromDataURI(src); } else { Editor.loadFromString(src); } } else if(qstr.indexOf('paramurl=') !== -1) { // Get paramater URL (use full length of remaining location.href) svgEditor.loadFromURL(qstr.substr(9)); } else if(urldata.url) { svgEditor.loadFromURL(urldata.url); } } })(); var extFunc = function() { $.each(curConfig.extensions, function() { var extname = this; $.getScript(curConfig.extPath + extname, function(d) { // Fails locally in Chrome 5 if(!d) { var s = document.createElement('script'); s.src = curConfig.extPath + extname; document.querySelector('head').appendChild(s); } }); }); } // Load extensions // Bit of a hack to run extensions in local Opera/IE9 if(document.location.protocol === 'file:') { setTimeout(extFunc, 100); } else { extFunc(); } $.svgIcons(curConfig.imgPath + 'svg_edit_icons.svg', { w:24, h:24, id_match: false, no_img: true, fallback_path: curConfig.imgPath, fallback:{ 'new_image':'clear.png', 'save':'save.png', 'open':'open.png', 'source':'source.png', 'docprops':'document-properties.png', 'wireframe':'wireframe.png', 'undo':'undo.png', 'redo':'redo.png', 'select':'select.png', 'select_node':'select_node.png', 'pencil':'fhpath.png', 'pen':'line.png', 'square':'square.png', 'rect':'rect.png', 'fh_rect':'freehand-square.png', 'circle':'circle.png', 'ellipse':'ellipse.png', 'fh_ellipse':'freehand-circle.png', 'path':'path.png', 'text':'text.png', 'image':'image.png', 'zoom':'zoom.png', 'clone':'clone.png', 'node_clone':'node_clone.png', 'delete':'delete.png', 'node_delete':'node_delete.png', 'group':'shape_group.png', 'ungroup':'shape_ungroup.png', 'move_top':'move_top.png', 'move_bottom':'move_bottom.png', 'to_path':'to_path.png', 'link_controls':'link_controls.png', 'reorient':'reorient.png', 'align_left':'align-left.png', 'align_center':'align-center', 'align_right':'align-right', 'align_top':'align-top', 'align_middle':'align-middle', 'align_bottom':'align-bottom', 'go_up':'go-up.png', 'go_down':'go-down.png', 'ok':'save.png', 'cancel':'cancel.png', 'arrow_right':'flyouth.png', 'arrow_down':'dropdown.gif' }, placement: { '#logo':'logo', '#tool_clear div,#layer_new':'new_image', '#tool_save div':'save', '#tool_export div':'export', '#tool_open div div':'open', '#tool_import div div':'import', '#tool_source':'source', '#tool_docprops > div':'docprops', '#tool_wireframe':'wireframe', '#tool_undo':'undo', '#tool_redo':'redo', '#tool_select':'select', '#tool_fhpath':'pencil', '#tool_line':'pen', '#tool_rect,#tools_rect_show':'rect', '#tool_square':'square', '#tool_fhrect':'fh_rect', '#tool_ellipse,#tools_ellipse_show':'ellipse', '#tool_circle':'circle', '#tool_fhellipse':'fh_ellipse', '#tool_path':'path', '#tool_text,#layer_rename':'text', '#tool_image':'image', '#tool_zoom':'zoom', '#tool_clone,#tool_clone_multi':'clone', '#tool_node_clone':'node_clone', '#layer_delete,#tool_delete,#tool_delete_multi':'delete', '#tool_node_delete':'node_delete', '#tool_add_subpath':'add_subpath', '#tool_openclose_path':'open_path', '#tool_move_top':'move_top', '#tool_move_bottom':'move_bottom', '#tool_topath':'to_path', '#tool_node_link':'link_controls', '#tool_reorient':'reorient', '#tool_group':'group', '#tool_ungroup':'ungroup', '#tool_unlink_use':'unlink_use', '#tool_alignleft, #tool_posleft':'align_left', '#tool_aligncenter, #tool_poscenter':'align_center', '#tool_alignright, #tool_posright':'align_right', '#tool_aligntop, #tool_postop':'align_top', '#tool_alignmiddle, #tool_posmiddle':'align_middle', '#tool_alignbottom, #tool_posbottom':'align_bottom', '#cur_position':'align', '#linecap_butt,#cur_linecap':'linecap_butt', '#linecap_round':'linecap_round', '#linecap_square':'linecap_square', '#linejoin_miter,#cur_linejoin':'linejoin_miter', '#linejoin_round':'linejoin_round', '#linejoin_bevel':'linejoin_bevel', '#url_notice':'warning', '#layer_up':'go_up', '#layer_down':'go_down', '#layer_moreopts':'context_menu', '#layerlist td.layervis':'eye', '#tool_source_save,#tool_docprops_save':'ok', '#tool_source_cancel,#tool_docprops_cancel':'cancel', '#rwidthLabel, #iwidthLabel':'width', '#rheightLabel, #iheightLabel':'height', '#cornerRadiusLabel span':'c_radius', '#angleLabel':'angle', '#zoomLabel':'zoom', '#tool_fill label': 'fill', '#tool_stroke .icon_label': 'stroke', '#group_opacityLabel': 'opacity', '#blurLabel': 'blur', '#font_sizeLabel': 'fontsize', '.flyout_arrow_horiz':'arrow_right', '.dropdown button, #main_button .dropdown':'arrow_down', '#palette .palette_item:first, #fill_bg, #stroke_bg':'no_color' }, resize: { '#logo .svg_icon': 32, '.flyout_arrow_horiz .svg_icon': 5, '.layer_button .svg_icon, #layerlist td.layervis .svg_icon': 14, '.dropdown button .svg_icon': 7, '#main_button .dropdown .svg_icon': 9, '.palette_item:first .svg_icon, #fill_bg .svg_icon, #stroke_bg .svg_icon': 16, '.toolbar_button button .svg_icon':16, '.stroke_tool div div .svg_icon': 20, '#tools_bottom label .svg_icon': 18 }, callback: function(icons) { $('.toolbar_button button > svg, .toolbar_button button > img').each(function() { $(this).parent().prepend(this); }); var tleft = $('#tools_left'); if (tleft.length != 0) { var min_height = tleft.offset().top + tleft.outerHeight(); } // var size = $.pref('iconsize'); // if(size && size != 'm') { // svgEditor.setIconSize(size); // } else if($(window).height() < min_height) { // // Make smaller // svgEditor.setIconSize('s'); // } // Look for any missing flyout icons from plugins $('.tools_flyout').each(function() { var shower = $('#' + this.id + '_show'); var sel = shower.attr('data-curopt'); // Check if there's an icon here if(!shower.children('svg, img').length) { var clone = $(sel).children().clone(); if(clone.length) { clone[0].removeAttribute('style'); //Needed for Opera shower.append(clone); } } }); svgEditor.runCallbacks(); } }); Editor.canvas = svgCanvas = new $.SvgCanvas(document.getElementById("svgcanvas"), curConfig); var palette = ["#000000", "#3f3f3f", "#7f7f7f", "#bfbfbf", "#ffffff", "#ff0000", "#ff7f00", "#ffff00", "#7fff00", "#00ff00", "#00ff7f", "#00ffff", "#007fff", "#0000ff", "#7f00ff", "#ff00ff", "#ff007f", "#7f0000", "#7f3f00", "#7f7f00", "#3f7f00", "#007f00", "#007f3f", "#007f7f", "#003f7f", "#00007f", "#3f007f", "#7f007f", "#7f003f", "#ffaaaa", "#ffd4aa", "#ffffaa", "#d4ffaa", "#aaffaa", "#aaffd4", "#aaffff", "#aad4ff", "#aaaaff", "#d4aaff", "#ffaaff", "#ffaad4", ]; isMac = (navigator.platform.indexOf("Mac") != -1); modKey = (isMac ? "meta+" : "ctrl+"); // ⌘ path = svgCanvas.pathActions, undoMgr = svgCanvas.undoMgr, window.undoMgr = undoMgr; Utils = svgCanvas.Utils, default_img_url = curConfig.imgPath + "logo.png", workarea = $("#workarea"), canv_menu = $("#cmenu_canvas"), layer_menu = $("#cmenu_layers"), show_save_warning = false, exportWindow = null, tool_scale = 1; // This sets up alternative dialog boxes. They mostly work the same way as // their UI counterparts, expect instead of returning the result, a callback // needs to be included that returns the result as its first parameter. // In the future we may want to add additional types of dialog boxes, since // they should be easy to handle this way. (function() { $('#dialog_container').draggable({cancel:'#dialog_content, #dialog_buttons *'}); var box = $('#dialog_box'), btn_holder = $('#dialog_buttons'); var dbox = function(type, msg, callback, defText) { $('#dialog_content').html('

    '+msg.replace(/\n/g,'

    ')+'

    ') .toggleClass('prompt',(type=='prompt')); btn_holder.empty(); var ok = $('').appendTo(btn_holder); if(type != 'alert') { $('') .appendTo(btn_holder) .click(function() { box.hide();callback(false)}); } if(type == 'prompt') { var input = $('').prependTo(btn_holder); input.val(defText || ''); input.bind('keydown', 'return', function() {ok.click();}); } if(type == 'process') { ok.hide(); } box.show(); ok.click(function() { box.hide(); var resp = (type == 'prompt')?input.val():true; if(callback) callback(resp); }).focus(); if(type == 'prompt') input.focus(); } $.alert = function(msg, cb) { dbox('alert', msg, cb);}; $.confirm = function(msg, cb) { dbox('confirm', msg, cb);}; $.process_cancel = function(msg, cb) { dbox('process', msg, cb);}; $.prompt = function(msg, txt, cb) { dbox('prompt', msg, cb, txt);}; }()); var setSelectMode = function() { var curr = $('.tool_button_current'); if(curr.length && curr[0].id !== 'tool_select') { curr.removeClass('tool_button_current').addClass('tool_button'); $('#tool_select').addClass('tool_button_current').removeClass('tool_button'); $('#styleoverrides').text('#svgcanvas svg *{cursor:move;pointer-events:all} #svgcanvas svg{cursor:default}'); } svgCanvas.setMode('select'); }; var togglePathEditMode = function(editmode, elems) { $('#path_node_panel').toggle(editmode); $('#tools_bottom_2,#tools_bottom_3').toggle(!editmode); if(editmode) { // Change select icon $('.tool_button_current').removeClass('tool_button_current').addClass('tool_button'); $('#tool_select').addClass('tool_button_current').removeClass('tool_button'); setIcon('#tool_select', 'select_node'); multiselected = false; if(elems.length) { selectedElement = elems[0]; } } else { setIcon('#tool_select', 'select'); } } // used to make the flyouts stay on the screen longer the very first time var flyoutspeed = 1250; var textBeingEntered = false; var selectedElement = null; var multiselected = false; var editingsource = false; var docprops = false; var fillPaint = new $.jGraduate.Paint({solidColor: curConfig.initFill.color}); var strokePaint = new $.jGraduate.Paint({solidColor: curConfig.initStroke.color}); var saveHandler = function(window,svg) { // by default, we add the XML prolog back, systems integrating SVG-edit (wikis, CMSs) // can just provide their own custom save handler and might not want the XML prolog svg = '\n' + svg; // is SVG-edit called from within a standalone app providing its own save handler? if (svgEditor.externalSaveHandler) { svgEditor.externalSaveHandler(svg); show_save_warning = false; window.top.close(); return; } // Opens the SVG in new window, with warning about Mozilla bug #308590 when applicable var ua = navigator.userAgent; // Chrome 5 (and 6?) don't allow saving, show source instead ( http://code.google.com/p/chromium/issues/detail?id=46735 ) // IE9 doesn't allow standalone Data URLs ( https://connect.microsoft.com/IE/feedback/details/542600/data-uri-images-fail-when-loaded-by-themselves ) if((~ua.indexOf('Chrome') && $.browser.version >= 533) || ~ua.indexOf('MSIE')) { showSourceEditor(0,true); return; } var win = window.open("data:image/svg+xml;base64," + Utils.encode64(svg)); // Alert will only appear the first time saved OR the first time the bug is encountered var done = $.pref('save_notice_done'); if(done !== "all") { var note = uiStrings.saveFromBrowser.replace('%s', 'SVG'); // Check if FF and has if(ua.indexOf('Gecko/') !== -1) { if(svg.indexOf('', {id: 'export_canvas'}).hide().appendTo('body'); } var c = $('#export_canvas')[0]; c.width = svgCanvas.contentW; c.height = svgCanvas.contentH; canvg(c, data.svg, {renderCallback: function() { var datauri = c.toDataURL('image/png'); exportWindow.location.href = datauri; var done = $.pref('export_notice_done'); if(done !== "all") { var note = uiStrings.saveFromBrowser.replace('%s', 'PNG'); // Check if there's issues if(issues.length) { var pre = "\n \u2022 "; note += ("\n\n" + uiStrings.noteTheseIssues + pre + issues.join(pre)); } // Note that this will also prevent the notice even though new issues may appear later. // May want to find a way to deal with that without annoying the user $.pref('export_notice_done', 'all'); exportWindow.alert(note); } }}); }; // called when we've selected a different element var selectedChanged = function(window,elems) { var mode = svgCanvas.getMode(); var is_node = (mode == "pathedit"); // if elems[1] is present, then we have more than one element selectedElement = (elems.length == 1 || elems[1] == null ? elems[0] : null); multiselected = (elems.length >= 2 && elems[1] != null); if (selectedElement != null) { // unless we're already in always set the mode of the editor to select because // upon creation of a text element the editor is switched into // select mode and this event fires - we need our UI to be in sync if (mode != "multiselect" && !is_node) { updateToolbar(); } } // if (elem != null) // Deal with pathedit mode togglePathEditMode(is_node, elems); updateContextPanel(); svgCanvas.runExtensions("selectedChanged", { elems: elems, selectedElement: selectedElement, multiselected: multiselected }); }; // called when any element has changed var elementChanged = function(window,elems) { if(svgCanvas.getMode() == "select") { setSelectMode(); } for (var i = 0; i < elems.length; ++i) { var elem = elems[i]; // if the element changed was the svg, then it could be a resolution change if (elem && elem.tagName == "svg") { populateLayers(); updateCanvas(); } // Update selectedElement if element is no longer part of the image. // This occurs for the text elements in Firefox else if(elem && selectedElement && selectedElement.parentNode == null) { // || elem && elem.tagName == "path" && !multiselected) { // This was added in r1430, but not sure why selectedElement = elem; } } show_save_warning = true; // we update the contextual panel with potentially new // positional/sizing information (we DON'T want to update the // toolbar here as that creates an infinite loop) // also this updates the history buttons // we tell it to skip focusing the text control if the // text element was previously in focus updateContextPanel(); svgCanvas.runExtensions("elementChanged", { elems: elems }); }; var zoomChanged = function(window, bbox, autoCenter) { var scrbar = 15, res = svgCanvas.getResolution(), w_area = workarea, canvas_pos = $('#svgcanvas').position(); w_area.css('cursor','auto'); var z_info = svgCanvas.setBBoxZoom(bbox, w_area.width()-scrbar, w_area.height()-scrbar); if(!z_info) return; var zoomlevel = z_info.zoom, bb = z_info.bbox; $('#zoom').val(Math.round(zoomlevel*100)); if(autoCenter) { updateCanvas(); } else { updateCanvas(false, {x: bb.x * zoomlevel + (bb.width * zoomlevel)/2, y: bb.y * zoomlevel + (bb.height * zoomlevel)/2}); } if(svgCanvas.getMode() == 'zoom' && bb.width) { // Go to select if a zoom box was drawn setSelectMode(); } zoomDone(); } var flyout_funcs = {}; var setupFlyouts = function(holders) { $.each(holders, function(hold_sel, btn_opts) { var buttons = $(hold_sel).children(); var show_sel = hold_sel + '_show'; var shower = $(show_sel); var def = false; buttons.addClass('tool_button') .unbind('click mousedown mouseup') // may not be necessary .each(function(i) { // Get this buttons options var opts = btn_opts[i]; // Remember the function that goes with this ID flyout_funcs[opts.sel] = opts.fn; if(opts.isDefault) def = i; // Clicking the icon in flyout should set this set's icon var func = function() { if($(this).hasClass('disabled')) return false; if (toolButtonClick(show_sel)) { opts.fn(); } if(opts.icon) { var icon = $.getSvgIcon(opts.icon, true); } else { // var icon = $(opts.sel).children().eq(0).clone(); } icon[0].setAttribute('width',shower.width()); icon[0].setAttribute('height',shower.height()); shower.children(':not(.flyout_arrow_horiz)').remove(); shower.append(icon).attr('data-curopt', opts.sel); // This sets the current mode } $(this).mouseup(func); if(opts.key) { $(document).bind('keydown', opts.key+'', func); } }); if(def) { shower.attr('data-curopt', btn_opts[def].sel); } else if(!shower.attr('data-curopt')) { // Set first as default shower.attr('data-curopt', btn_opts[0].sel); } var timer; // Clicking the "show" icon should set the current mode shower.mousedown(function(evt) { if(shower.hasClass('disabled')) return false; var holder = $(show_sel.replace('_show','')); var l = holder.css('left'); var w = holder.width()*-1; var time = holder.data('shown_popop')?200:0; timer = setTimeout(function() { // Show corresponding menu if(!shower.data('isLibrary')) { holder.css('left', w).show().animate({ left: l },150); } else { holder.css('left', l).show(); } holder.data('shown_popop',true); },time); evt.preventDefault(); }).mouseup(function(evt) { clearTimeout(timer); var opt = $(this).attr('data-curopt'); // Is library and popped up, so do nothing if(shower.data('isLibrary') && $(show_sel.replace('_show','')).is(':visible')) { toolButtonClick(show_sel, true); return; } if (toolButtonClick(show_sel) && (opt in flyout_funcs)) { flyout_funcs[opt](); } }); // $('#tools_rect').mouseleave(function(){$('#tools_rect').fadeOut();}); var pos = $(show_sel).position(); $(hold_sel).css({'left': pos.left+34, 'top': pos.top+77}); }); setFlyoutTitles(); } var makeFlyoutHolder = function(id, child) { var div = $('
    ',{ 'class': 'tools_flyout', id: id }).appendTo('#svg_editor').append(child); return div; } var setFlyoutPositions = function() { $('.tools_flyout').each(function() { var shower = $('#' + this.id + '_show'); var pos = shower.offset(); var w = shower.outerWidth(); $(this).css({left: (pos.left + w)*tool_scale, top: pos.top}); }); } var setFlyoutTitles = function() { $('.tools_flyout').each(function() { var shower = $('#' + this.id + '_show'); var tooltips = []; $(this).children().each(function() { tooltips.push(this.title); }); shower[0].title = tooltips.join(' / '); }); } var resize_timer; var extAdded = function(window, ext) { var cb_called = false; var resize_done = false; var cb_ready = true; // Set to false to delay callback (e.g. wait for $.svgIcons) function prepResize() { if(resize_timer) { clearTimeout(resize_timer); resize_timer = null; } if(!resize_done) { resize_timer = setTimeout(function() { resize_done = true; setIconSize(curPrefs.iconsize); }, 50); } } var runCallback = function() { if(ext.callback && !cb_called && cb_ready) { cb_called = true; ext.callback(); } } var btn_selects = []; if(ext.context_tools) { $.each(ext.context_tools, function(i, tool) { // Add select tool var cont_id = tool.container_id?(' id="' + tool.container_id + '"'):""; var panel = $('#' + tool.panel); // create the panel if it doesn't exist if(!panel.length) panel = $('
    ', {id: tool.panel}).appendTo("#tools_top"); // TODO: Allow support for other types, or adding to existing tool switch (tool.type) { case 'tool_button': var html = '
    ' + tool.id + '
    '; var div = $(html).appendTo(panel); if (tool.events) { $.each(tool.events, function(evt, func) { $(div).bind(evt, func); }); } break; case 'select': var html = '' + '"; // Creates the tool, hides & adds it, returns the select element var sel = $(html).appendTo(panel).find('select'); $.each(tool.events, function(evt, func) { $(sel).bind(evt, func); }); break; case 'button-select': var html = ''; var list = $('
      ').appendTo('#option_lists'); if(tool.colnum) { list.addClass('optcols' + tool.colnum); } // Creates the tool, hides & adds it, returns the select element var dropdown = $(html).appendTo(panel).children(); btn_selects.push({ elem: ('#' + tool.id), list: ('#' + tool.id + '_opts'), title: tool.title, callback: tool.events.change, cur: ('#cur_' + tool.id) }); break; case 'input': var html = '' + '' + tool.label + ':' + '' // Creates the tool, hides & adds it, returns the select element // Add to given tool.panel var inp = $(html).appendTo(panel).find('input'); if(tool.spindata) { inp.SpinButton(tool.spindata); } if(tool.events) { $.each(tool.events, function(evt, func) { inp.bind(evt, func); }); } break; default: break; } }); } if(ext.buttons) { var fallback_obj = {}, placement_obj = {}, svgicons = ext.svgicons; var holders = {}; // Add buttons given by extension $.each(ext.buttons, function(i, btn) { var icon; var id = btn.id; var num = i; // Give button a unique ID while($('#'+id).length) { id = btn.id + '_' + (++num); } if(!svgicons) { icon = $(''); } else { fallback_obj[id] = btn.icon; var svgicon = btn.svgicon?btn.svgicon:btn.id; if(btn.type == 'app_menu') { placement_obj['#' + id + ' > div'] = svgicon; } else { placement_obj['#' + id] = svgicon; } } var cls, parent; // Set button up according to its type switch ( btn.type ) { case 'mode_flyout': case 'mode': cls = 'tool_button'; parent = "#tools_left"; break; case 'context': cls = 'tool_button'; parent = "#" + btn.panel; // create the panel if it doesn't exist if(!$(parent).length) $('
      ', {id: btn.panel}).appendTo("#tools_top"); break; case 'app_menu': cls = ''; parent = '#main_menu ul'; break; } var button = $((btn.list || btn.type == 'app_menu')?'
    • ':'
      ') .attr("id", id) .attr("title", btn.title) .addClass(cls); if(!btn.includeWith && !btn.list) { if("position" in btn) { $(parent).children().eq(btn.position).before(button); } else { button.appendTo(parent); } if(btn.type =='mode_flyout') { // Add to flyout menu / make flyout menu // var opts = btn.includeWith; // // opts.button, default, position var ref_btn = $(button); var flyout_holder = ref_btn.parent(); // Create a flyout menu if there isn't one already if(!ref_btn.parent().hasClass('tools_flyout')) { // Create flyout placeholder var tls_id = ref_btn[0].id.replace('tool_','tools_') var show_btn = ref_btn.clone() .attr('id',tls_id + '_show') .append($('
      ',{'class':'flyout_arrow_horiz'})); ref_btn.before(show_btn); // Create a flyout div flyout_holder = makeFlyoutHolder(tls_id, ref_btn); flyout_holder.data('isLibrary', true); show_btn.data('isLibrary', true); } // var ref_data = Actions.getButtonData(opts.button); placement_obj['#' + tls_id + '_show'] = btn.id; // TODO: Find way to set the current icon using the iconloader if this is not default // Include data for extension button as well as ref button var cur_h = holders['#'+flyout_holder[0].id] = [{ sel: '#'+id, fn: btn.events.click, icon: btn.id, // key: btn.key, isDefault: true }, ref_data]; // // // {sel:'#tool_rect', fn: clickRect, evt: 'mouseup', key: 4, parent: '#tools_rect', icon: 'rect'} // // var pos = ("position" in opts)?opts.position:'last'; // var len = flyout_holder.children().length; // // // Add at given position or end // if(!isNaN(pos) && pos >= 0 && pos < len) { // flyout_holder.children().eq(pos).before(button); // } else { // flyout_holder.append(button); // cur_h.reverse(); // } } else if(btn.type == 'app_menu') { button.append('
      ').append(btn.title); } } else if(btn.list) { // Add button to list button.addClass('push_button'); $('#' + btn.list + '_opts').append(button); if(btn.isDefault) { $('#cur_' + btn.list).append(button.children().clone()); var svgicon = btn.svgicon?btn.svgicon:btn.id; placement_obj['#cur_' + btn.list] = svgicon; } } else if(btn.includeWith) { // Add to flyout menu / make flyout menu var opts = btn.includeWith; // opts.button, default, position var ref_btn = $(opts.button); var flyout_holder = ref_btn.parent(); // Create a flyout menu if there isn't one already if(!ref_btn.parent().hasClass('tools_flyout')) { // Create flyout placeholder var tls_id = ref_btn[0].id.replace('tool_','tools_') var show_btn = ref_btn.clone() .attr('id',tls_id + '_show') .append($('
      ',{'class':'flyout_arrow_horiz'})); ref_btn.before(show_btn); // Create a flyout div flyout_holder = makeFlyoutHolder(tls_id, ref_btn); } var ref_data = Actions.getButtonData(opts.button); if(opts.isDefault) { placement_obj['#' + tls_id + '_show'] = btn.id; } // TODO: Find way to set the current icon using the iconloader if this is not default // Include data for extension button as well as ref button var cur_h = holders['#'+flyout_holder[0].id] = [{ sel: '#'+id, fn: btn.events.click, icon: btn.id, key: btn.key, isDefault: btn.includeWith?btn.includeWith.isDefault:0 }, ref_data]; // {sel:'#tool_rect', fn: clickRect, evt: 'mouseup', key: 4, parent: '#tools_rect', icon: 'rect'} var pos = ("position" in opts)?opts.position:'last'; var len = flyout_holder.children().length; // Add at given position or end if(!isNaN(pos) && pos >= 0 && pos < len) { flyout_holder.children().eq(pos).before(button); } else { flyout_holder.append(button); cur_h.reverse(); } } if(!svgicons) { button.append(icon); } if(!btn.list) { // Add given events to button $.each(btn.events, function(name, func) { if(name == "click") { if(btn.type == 'mode') { if(btn.includeWith) { button.bind(name, func); } else { button.bind(name, function() { if(toolButtonClick(button)) { func(); } }); } if(btn.key) { $(document).bind('keydown', btn.key, func); if(btn.title) button.attr("title", btn.title + ' ['+btn.key+']'); } } else { button.bind(name, func); } } else { button.bind(name, func); } }); } setupFlyouts(holders); }); $.each(btn_selects, function() { addAltDropDown(this.elem, this.list, this.callback, {seticon: true}); }); if (svgicons) cb_ready = false; // Delay callback $.svgIcons(svgicons, { w:24, h:24, id_match: false, no_img: true, fallback: fallback_obj, placement: placement_obj, callback: function(icons) { // Non-ideal hack to make the icon match the current size if(curPrefs.iconsize && curPrefs.iconsize != 'm') { prepResize(); } cb_ready = true; // Ready for callback runCallback(); } }); } runCallback(); }; var getPaint = function(color, opac) { // update the editor's fill paint var opts = null; if (color.substr(0,5) == "url(#") { var grad = document.getElementById(color.substr(5,color.length-6)); opts = { alpha: opac }; opts[grad.tagName] = grad; } else if (color.substr(0,1) == "#") { opts = { alpha: opac, solidColor: color.substr(1) }; } else { opts = { alpha: opac, solidColor: 'none' }; } return new $.jGraduate.Paint(opts); }; // updates the toolbar (colors, opacity, etc) based on the selected element // This function also updates the opacity and id elements that are in the context panel var updateToolbar = function() { if (selectedElement != null && $.inArray(selectedElement.tagName, ['use', 'image', 'foreignObject', 'g', 'a']) === -1) { // get opacity values var fillOpacity = parseFloat(selectedElement.getAttribute("fill-opacity")); if (isNaN(fillOpacity)) { fillOpacity = 1.0; } var strokeOpacity = parseFloat(selectedElement.getAttribute("stroke-opacity")); if (isNaN(strokeOpacity)) { strokeOpacity = 1.0; } // update fill color and opacity var fillColor = selectedElement.getAttribute("fill")||"black"; // prevent undo on these canvas changes svgCanvas.setColor('fill', fillColor, true); svgCanvas.setPaintOpacity('fill', fillOpacity, true); // update stroke color and opacity var strokeColor = selectedElement.getAttribute("stroke")||"none"; // prevent undo on these canvas changes svgCanvas.setColor('stroke', strokeColor, true); svgCanvas.setPaintOpacity('stroke', strokeOpacity, true); // update the rect inside #fill_color $("#stroke_color rect").attr({ fill: strokeColor, opacity: strokeOpacity }); // update the rect inside #fill_color $("#fill_color rect").attr({ fill: fillColor, opacity: fillOpacity }); fillOpacity *= 100; strokeOpacity *= 100; fillPaint = getPaint(fillColor, fillOpacity); strokePaint = getPaint(strokeColor, strokeOpacity); fillOpacity = fillOpacity + " %"; strokeOpacity = strokeOpacity + " %"; // update fill color if (fillColor == "none") { fillOpacity = "N/A"; } if (strokeColor == null || strokeColor == "" || strokeColor == "none") { strokeColor = "none"; strokeOpacity = "N/A"; } $('#stroke_width').val(selectedElement.getAttribute("stroke-width")||1).change(); $('#stroke_style').val(selectedElement.getAttribute("stroke-dasharray")||"none").change(); var attr = selectedElement.getAttribute("stroke-linejoin") || 'miter'; if ($('#linejoin_' + attr).length != 0) setStrokeOpt($('#linejoin_' + attr)[0]); attr = selectedElement.getAttribute("stroke-linecap") || 'butt'; if ($('#linecap_' + attr).length != 0) setStrokeOpt($('#linecap_' + attr)[0]); } // All elements including image and group have opacity if(selectedElement != null) { var opac_perc = ((selectedElement.getAttribute("opacity")||1.0)*100); $('#group_opacity').val(opac_perc); $('#opac_slider').slider('option', 'value', opac_perc); $('#elem_id').val(selectedElement.id); } updateToolButtonState(); }; var setImageURL = Editor.setImageURL = function(url) { if(!url) url = default_img_url; svgCanvas.setImageURL(url); $('#image_url').val(url); if(url.indexOf('data:') === 0) { // data URI found $('#image_url').hide(); $('#change_image_url').show(); } else { // regular URL svgCanvas.embedImage(url, function(datauri) { if(!datauri) { // Couldn't embed, so show warning $('#url_notice').show(); } else { $('#url_notice').hide(); } default_img_url = url; }); $('#image_url').show(); $('#change_image_url').hide(); } } var setInputWidth = function(elem) { var w = Math.min(Math.max(12 + elem.value.length * 6, 50), 300); $(elem).width(w); } // updates the context panel tools based on the selected element var updateContextPanel = function() { var elem = selectedElement; // If element has just been deleted, consider it null if(elem != null && !elem.parentNode) elem = null; var currentLayer = svgCanvas.getCurrentLayer(); var currentMode = svgCanvas.getMode(); // No need to update anything else in rotate mode if (currentMode == 'rotate' && elem != null) { var ang = svgCanvas.getRotationAngle(elem); $('#angle').val(ang); $('#tool_reorient').toggleClass('disabled', ang == 0); return; } var is_node = currentMode == 'pathedit'; //elem ? (elem.id && elem.id.indexOf('pathpointgrip') == 0) : false; $('#selected_panel, #multiselected_panel, #g_panel, #rect_panel, #circle_panel,\ #ellipse_panel, #line_panel, #text_panel, #image_panel, #container_panel, #use_panel').hide(); if (elem != null) { var elname = elem.nodeName; // If this is a link with no transform and one child, pretend // its child is selected // console.log('go', elem) // if(elname === 'a') { // && !$(elem).attr('transform')) { // elem = elem.firstChild; // } var angle = svgCanvas.getRotationAngle(elem); $('#angle').val(angle); var blurval = svgCanvas.getBlur(elem); $('#blur').val(blurval); $('#blur_slider').slider('option', 'value', blurval); if(svgCanvas.addedNew) { if(elname == 'image') { // Prompt for URL if not a data URL if(svgCanvas.getHref(elem).indexOf('data:') !== 0) { promptImgURL(); } } else if(elname == 'text') { // TODO: Do something here for new text } } if(!is_node && currentMode != 'pathedit') { $('#selected_panel').show(); // Elements in this array already have coord fields if($.inArray(elname, ['line', 'circle', 'ellipse']) != -1) { $('#xy_panel').hide(); } else { var x,y; // Get BBox vals for g, polyline and path if($.inArray(elname, ['g', 'polyline', 'path']) != -1) { var bb = svgCanvas.getStrokedBBox([elem]); if(bb) { x = bb.x; y = bb.y; } } else { x = elem.getAttribute('x'); y = elem.getAttribute('y'); } $('#selected_x').val(x || 0); $('#selected_y').val(y || 0); $('#xy_panel').show(); } // Elements in this array cannot be converted to a path var no_path = $.inArray(elname, ['image', 'text', 'path', 'g', 'use']) == -1; $('#tool_topath').toggle(no_path); $('#tool_reorient').toggle(elname == 'path'); $('#tool_reorient').toggleClass('disabled', angle == 0); } else { var point = path.getNodePoint(); $('#tool_add_subpath').removeClass('push_button_pressed').addClass('tool_button'); $('#tool_node_delete').toggleClass('disabled', !path.canDeleteNodes); // Show open/close button based on selected point setIcon('#tool_openclose_path', path.closed_subpath ? 'open_path' : 'close_path'); if(point) { var seg_type = $('#seg_type'); $('#path_node_x').val(point.x); $('#path_node_y').val(point.y); if(point.type) { seg_type.val(point.type).removeAttr('disabled'); } else { seg_type.val(4).attr('disabled','disabled'); } } return; } // update contextual tools here var panels = { g: [], rect: ['rx','width','height'], image: ['width','height'], circle: ['cx','cy','r'], ellipse: ['cx','cy','rx','ry'], line: ['x1','y1','x2','y2'], text: [], 'use': [] }; var el_name = elem.tagName; // if($(elem).data('gsvg')) { // $('#g_panel').show(); // } if(panels[el_name]) { var cur_panel = panels[el_name]; $('#' + el_name + '_panel').show(); $.each(cur_panel, function(i, item) { $('#' + el_name + '_' + item).val(elem.getAttribute(item) || 0); }); if(el_name == 'text') { $('#text_panel').css("display", "inline"); if (svgCanvas.getItalic()) { $('#tool_italic').addClass('push_button_pressed').removeClass('tool_button'); } else { $('#tool_italic').removeClass('push_button_pressed').addClass('tool_button'); } if (svgCanvas.getBold()) { $('#tool_bold').addClass('push_button_pressed').removeClass('tool_button'); } else { $('#tool_bold').removeClass('push_button_pressed').addClass('tool_button'); } $('#font_family').val(elem.getAttribute("font-family")); $('#font_size').val(elem.getAttribute("font-size")); $('#text').val(elem.textContent); if (svgCanvas.addedNew) { // Timeout needed for IE9 setTimeout(function() { $('#text').focus().select(); },100); } } // text else if(el_name == 'image') { setImageURL(svgCanvas.getHref(elem)); } // image else if(el_name == 'g' || el_name == 'use') { $('#container_panel').show(); var title = svgCanvas.getTitle(); var label = $('#g_title')[0]; label.value = title; setInputWidth(label); var d = 'disabled'; if(el_name == 'use') { label.setAttribute(d, d); } else { label.removeAttribute(d); } } } } // if (elem != null) else if (multiselected) { $('#multiselected_panel').show(); } else { $('#cmenu_canvas li').disableContextMenuItems('#delete,#cut,#copy,#move_up,#move_down'); } // update history buttons if (undoMgr.getUndoStackSize() > 0) { $('#tool_undo').removeClass( 'disabled'); } else { $('#tool_undo').addClass( 'disabled'); } if (undoMgr.getRedoStackSize() > 0) { $('#tool_redo').removeClass( 'disabled'); } else { $('#tool_redo').addClass( 'disabled'); } svgCanvas.addedNew = false; if ( (elem && !is_node) || multiselected) { // update the selected elements' layer $('#selLayerNames').removeAttr('disabled').val(currentLayer); // Enable regular menu options canv_menu.enableContextMenuItems('#delete,#cut,#copy,#move_down,#move_up'); } else { $('#selLayerNames').attr('disabled', 'disabled'); } }; $('#text').focus( function(){ textBeingEntered = true; } ); $('#text').blur( function(){ textBeingEntered = false; } ); // bind the selected event to our function that handles updates to the UI svgCanvas.bind("selected", selectedChanged); svgCanvas.bind("changed", elementChanged); svgCanvas.bind("saved", saveHandler); svgCanvas.bind("exported", exportHandler); svgCanvas.bind("zoomed", zoomChanged); svgCanvas.bind("extension_added", extAdded); svgCanvas.textActions.setInputElem($("#text")[0]); var str = '
      ' $.each(palette, function(i,item){ str += '
      '; }); $('#palette').append(str); // Set up editor background functionality // TODO add checkerboard as "pattern" var color_blocks = ['#FFF','#888','#000']; // ,'url(data:image/gif;base64,R0lGODlhEAAQAIAAAP%2F%2F%2F9bW1iH5BAAAAAAALAAAAAAQABAAAAIfjG%2Bgq4jM3IFLJgpswNly%2FXkcBpIiVaInlLJr9FZWAQA7)']; var str = ''; $.each(color_blocks, function() { str += '
      '; }); $('#bg_blocks').append(str); var blocks = $('#bg_blocks div'); var cur_bg = 'cur_background'; blocks.each(function() { var blk = $(this); blk.click(function() { blocks.removeClass(cur_bg); $(this).addClass(cur_bg); }); }); if($.pref('bkgd_color')) { setBackground($.pref('bkgd_color'), $.pref('bkgd_url')); } else if($.pref('bkgd_url')) { // No color set, only URL setBackground(defaultPrefs.bkgd_color, $.pref('bkgd_url')); } if($.pref('img_save')) { curPrefs.img_save = $.pref('img_save'); $('#image_save_opts input').val([curPrefs.img_save]); } var changeRectRadius = function(ctl) { svgCanvas.setRectRadius(ctl.value); } var changeFontSize = function(ctl) { svgCanvas.setFontSize(ctl.value); } var changeStrokeWidth = function(ctl) { var val = ctl.value; if(val == 0 && selectedElement && $.inArray(selectedElement.nodeName, ['line', 'polyline']) != -1) { val = ctl.value = 1; } svgCanvas.setStrokeWidth(val); } var changeRotationAngle = function(ctl) { svgCanvas.setRotationAngle(ctl.value); $('#tool_reorient').toggleClass('disabled', ctl.value == 0); } var changeZoom = function(ctl) { var zoomlevel = ctl.value / 100; var zoom = svgCanvas.getZoom(); var w_area = workarea; zoomChanged(window, { width: 0, height: 0, // center pt of scroll position x: (w_area[0].scrollLeft + w_area.width()/2)/zoom, y: (w_area[0].scrollTop + w_area.height()/2)/zoom, zoom: zoomlevel }, true); } var changeOpacity = function(ctl, val) { if(val == null) val = ctl.value; $('#group_opacity').val(val); if(!ctl || !ctl.handle) { $('#opac_slider').slider('option', 'value', val); } svgCanvas.setOpacity(val/100); } var changeBlur = function(ctl, val, noUndo) { if(val == null) val = ctl.value; $('#blur').val(val); var complete = false; if(!ctl || !ctl.handle) { $('#blur_slider').slider('option', 'value', val); complete = true; } if(noUndo) { svgCanvas.setBlurNoUndo(val); } else { svgCanvas.setBlur(val, complete); } } var operaRepaint = function() { // Repaints canvas in Opera. Needed for stroke-dasharray change as well as fill change if(!window.opera) return; $('

      ').hide().appendTo('body').remove(); } $('#stroke_style').change(function(){ svgCanvas.setStrokeAttr('stroke-dasharray', $(this).val()); operaRepaint(); }); $('#stroke_linejoin').change(function(){ svgCanvas.setStrokeAttr('stroke-linejoin', $(this).val()); operaRepaint(); }); // Lose focus for select elements when changed (Allows keyboard shortcuts to work better) $('select').change(function(){$(this).blur();}); // fired when user wants to move elements to another layer var promptMoveLayerOnce = false; $('#selLayerNames').change(function(){ var destLayer = this.options[this.selectedIndex].value; var confirm_str = uiStrings.QmoveElemsToLayer.replace('%s',destLayer); var moveToLayer = function(ok) { if(!ok) return; promptMoveLayerOnce = true; svgCanvas.moveSelectedToLayer(destLayer); svgCanvas.clearSelection(); populateLayers(); } if (destLayer) { if(promptMoveLayerOnce) { moveToLayer(true); } else { $.confirm(confirm_str, moveToLayer); } } }); $('#font_family').change(function() { svgCanvas.setFontFamily(this.value); }); $('#seg_type').change(function() { svgCanvas.setSegType($(this).val()); }); $('#text').keyup(function(){ svgCanvas.setTextContent(this.value); }); $('#image_url').change(function(){ setImageURL(this.value); }); $('#g_title').change(function() { svgCanvas.setGroupTitle(this.value); setInputWidth(this); }); $('.attr_changer').change(function() { var attr = this.getAttribute("data-attr"); var val = this.value; var valid = svgCanvas.isValidUnit(attr, val); if(!valid) { $.alert(uiStrings.invalidAttrValGiven); this.value = selectedElement.getAttribute(attr); return false; } // if the user is changing the id, then de-select the element first // change the ID, then re-select it with the new ID if (attr == "id") { var elem = selectedElement; svgCanvas.clearSelection(); elem.id = val; svgCanvas.addToSelection([elem],true); } else { svgCanvas.changeSelectedAttribute(attr, val); } }); // Prevent selection of elements when shift-clicking $('#palette').mouseover(function() { var inp = $(''); $(this).append(inp); inp.focus().remove(); }); $('.palette_item').click(function(evt){ var picker = (evt.shiftKey ? "stroke" : "fill"); var id = (evt.shiftKey ? '#stroke_' : '#fill_'); var color = $(this).attr('data-rgb'); var rectbox = document.getElementById("gradbox_"+picker).parentNode.firstChild; var paint = null; // Webkit-based browsers returned 'initial' here for no stroke if (color == 'transparent' || color == 'initial') { color = 'none'; $(id + "opacity").html("N/A"); paint = new $.jGraduate.Paint(); } else { paint = new $.jGraduate.Paint({alpha: 100, solidColor: color.substr(1)}); } rectbox.setAttribute("fill", color); rectbox.setAttribute("opacity", 1); if (evt.shiftKey) { strokePaint = paint; if (svgCanvas.getColor('stroke') != color) { svgCanvas.setColor('stroke', color); } if (color != 'none' && svgCanvas.getStrokeOpacity() != 1) { svgCanvas.setPaintOpacity('stroke', 1.0); } } else { fillPaint = paint; if (svgCanvas.getColor('fill') != color) { svgCanvas.setColor('fill', color); } if (color != 'none' && svgCanvas.getFillOpacity('fill') != 1) { svgCanvas.setPaintOpacity('fill', 1.0); } } updateToolButtonState(); }); $("#toggle_stroke_tools").toggle(function() { $(".stroke_tool").css('display','table-cell'); $(this).text('<<'); }, function() { $(".stroke_tool").css('display','none'); $(this).text('>>'); }); // This is a common function used when a tool has been clicked (chosen) // It does several common things: // - removes the tool_button_current class from whatever tool currently has it // - hides any flyouts // - adds the tool_button_current class to the button passed in var toolButtonClick = function(button, noHiding) { if ($(button).hasClass('disabled')) return false; if($(button).parent().hasClass('tools_flyout')) return true; var fadeFlyouts = fadeFlyouts || 'normal'; if(!noHiding) { $('.tools_flyout').fadeOut(fadeFlyouts); } $('#styleoverrides').text(''); $('.tool_button_current').removeClass('tool_button_current').addClass('tool_button'); $(button).addClass('tool_button_current').removeClass('tool_button'); // when a tool is selected, we should deselect any currently selected elements if(button !== '#tool_select') { svgCanvas.clearSelection(); } return true; }; (function() { var last_x = null, last_y = null, w_area = workarea[0], panning = false, keypan = false; $('#svgcanvas').bind('mousemove mouseup', function(evt) { if(panning === false) return; w_area.scrollLeft -= (evt.clientX - last_x); w_area.scrollTop -= (evt.clientY - last_y); last_x = evt.clientX; last_y = evt.clientY; if(evt.type === 'mouseup') panning = false; return false; }).mousedown(function(evt) { if(evt.button === 1 || keypan === true) { panning = true; last_x = evt.clientX; last_y = evt.clientY; return false; } }); $(window).mouseup(function() { panning = false; }); $(document).bind('keydown', 'space', function(evt) { svgCanvas.spaceKey = keypan = true; evt.preventDefault(); }).bind('keyup', 'space', function(evt) { evt.preventDefault(); svgCanvas.spaceKey = keypan = false; }); }()); function setStrokeOpt(opt, changeElem) { var id = opt.id; var bits = id.split('_'); var pre = bits[0]; var val = bits[1]; if(changeElem) { svgCanvas.setStrokeAttr('stroke-' + pre, val); } operaRepaint(); setIcon('#cur_' + pre , id, 20); $(opt).addClass('current').siblings().removeClass('current'); } (function() { var button = $('#main_icon'); var overlay = $('#main_icon span'); var list = $('#main_menu'); var on_button = false; var height = 0; var js_hover = true; var set_click = false; var hideMenu = function() { list.fadeOut(200); }; $(window).mouseup(function(evt) { if(!on_button) { button.removeClass('buttondown'); // do not hide if it was the file input as that input needs to be visible // for its change event to fire if (evt.target.tagName != "INPUT") { list.fadeOut(200); } else if(!set_click) { set_click = true; $(evt.target).click(function() { list.css('margin-left','-9999px').show(); }); } } on_button = false; }).mousedown(function(evt) { // $(".contextMenu").hide(); // console.log('cm', $(evt.target).closest('.contextMenu')); var islib = $(evt.target).closest('div.tools_flyout, .contextMenu').length; if(!islib) $('.tools_flyout:visible,.contextMenu').fadeOut(250); }); overlay.bind('mousedown',function() { if (!button.hasClass('buttondown')) { button.addClass('buttondown').removeClass('buttonup') // Margin must be reset in case it was changed before; list.css('margin-left',0).show(); if(!height) { height = list.height(); } // Using custom animation as slideDown has annoying "bounce effect" list.css('height',0).animate({ 'height': height },200); on_button = true; return false; } else { button.removeClass('buttondown').addClass('buttonup'); list.fadeOut(200); } }).hover(function() { on_button = true; }).mouseout(function() { on_button = false; }); var list_items = $('#main_menu li'); // Check if JS method of hovering needs to be used (Webkit bug) list_items.mouseover(function() { js_hover = ($(this).css('background-color') == 'rgba(0, 0, 0, 0)'); list_items.unbind('mouseover'); if(js_hover) { list_items.mouseover(function() { this.style.backgroundColor = '#FFC'; }).mouseout(function() { this.style.backgroundColor = 'transparent'; return true; }); } }); }()); // Made public for UI customization. // TODO: Group UI functions into a public svgEditor.ui interface. Editor.addDropDown = function(elem, callback, dropUp) { var button = $(elem).find('button'); var list = $(elem).find('ul'); var on_button = false; if(dropUp) { $(elem).addClass('dropup'); } $(elem).find('li').bind('mouseup', callback); $(window).mouseup(function(evt) { if(!on_button) { button.removeClass('down'); list.hide(); } on_button = false; }); button.bind('mousedown',function() { if (!button.hasClass('down')) { button.addClass('down'); list.show(); on_button = true; } else { button.removeClass('down'); list.hide(); } }).hover(function() { on_button = true; }).mouseout(function() { on_button = false; }); } // TODO: Combine this with addDropDown or find other way to optimize var addAltDropDown = function(elem, list, callback, opts) { var button = $(elem); var list = $(list); var on_button = false; var dropUp = opts.dropUp; if(dropUp) { $(elem).addClass('dropup'); } list.find('li').bind('mouseup', function() { if(opts.seticon) { setIcon('#cur_' + button[0].id , $(this).children()); $(this).addClass('current').siblings().removeClass('current'); } callback.apply(this, arguments); }); $(window).mouseup(function(evt) { if(!on_button) { button.removeClass('down'); list.hide(); list.css({top:0, left:0}); } on_button = false; }); var height = list.height(); $(elem).bind('mousedown',function() { var off = $(elem).offset(); if(dropUp) { off.top -= list.height(); off.left += 8; } else { off.top += $(elem).height(); } $(list).offset(off); if (!button.hasClass('down')) { button.addClass('down'); list.show(); on_button = true; return false; } else { button.removeClass('down'); // CSS position must be reset for Webkit list.hide(); list.css({top:0, left:0}); } }).hover(function() { on_button = true; }).mouseout(function() { on_button = false; }); if(opts.multiclick) { list.mousedown(function() { on_button = true; }); } } Editor.addDropDown('#font_family_dropdown', function() { var fam = $(this).text(); $('#font_family').val($(this).text()).change(); }); Editor.addDropDown('#opacity_dropdown', function() { if($(this).find('div').length) return; var perc = parseInt($(this).text().split('%')[0]); changeOpacity(false, perc); }, true); // For slider usage, see: http://jqueryui.com/demos/slider/ $("#opac_slider").slider({ start: function() { $('#opacity_dropdown li:not(.special)').hide(); }, stop: function() { $('#opacity_dropdown li').show(); $(window).mouseup(); }, slide: function(evt, ui){ changeOpacity(ui); } }); Editor.addDropDown('#blur_dropdown', function() { }); var slideStart = false; $("#blur_slider").slider({ max: 10, step: .1, stop: function(evt, ui) { slideStart = false; changeBlur(ui); $('#blur_dropdown li').show(); $(window).mouseup(); }, start: function() { slideStart = true; }, slide: function(evt, ui){ changeBlur(ui, null, slideStart); } }); Editor.addDropDown('#zoom_dropdown', function() { var item = $(this); var val = item.attr('data-val'); if(val) { zoomChanged(window, val); } else { changeZoom({value:parseInt(item.text())}); } }, true); addAltDropDown('#stroke_linecap', '#linecap_opts', function() { setStrokeOpt(this, true); }, {dropUp: true}); addAltDropDown('#stroke_linejoin', '#linejoin_opts', function() { setStrokeOpt(this, true); }, {dropUp: true}); addAltDropDown('#tool_position', '#position_opts', function() { var letter = this.id.replace('tool_pos','').charAt(0); svgCanvas.alignSelectedElements(letter, 'page'); }, {multiclick: true}); /* When a flyout icon is selected (if flyout) { - Change the icon - Make pressing the button run its stuff } - Run its stuff When its shortcut key is pressed - If not current in list, do as above , else: - Just run its stuff */ // Unfocus text input when workarea is mousedowned. (function() { var inp; var unfocus = function() { $(inp).blur(); } // Do not include the #text input, as it needs to remain focused // when clicking on an SVG text element. $('#svg_editor input:text:not(#text)').focus(function() { inp = this; workarea.mousedown(unfocus); }).blur(function() { workarea.unbind('mousedown', unfocus); // Go back to selecting text if in textedit mode if(svgCanvas.getMode() == 'textedit') { $('#text').focus(); } }); }()); var clickSelect = function() { if (toolButtonClick('#tool_select')) { svgCanvas.setMode('select'); $('#styleoverrides').text('#svgcanvas svg *{cursor:move;pointer-events:all}, #svgcanvas svg{cursor:default}'); } }; var clickFHPath = function() { if (toolButtonClick('#tool_fhpath')) { svgCanvas.setMode('fhpath'); } }; var clickLine = function() { if (toolButtonClick('#tool_line')) { svgCanvas.setMode('line'); } }; var clickSquare = function(){ if (toolButtonClick('#tool_square')) { svgCanvas.setMode('square'); } }; var clickRect = function(){ if (toolButtonClick('#tool_rect')) { svgCanvas.setMode('rect'); } }; var clickFHRect = function(){ if (toolButtonClick('#tool_fhrect')) { svgCanvas.setMode('fhrect'); } }; var clickCircle = function(){ if (toolButtonClick('#tool_circle')) { svgCanvas.setMode('circle'); } }; var clickEllipse = function(){ if (toolButtonClick('#tool_ellipse')) { svgCanvas.setMode('ellipse'); } }; var clickFHEllipse = function(){ if (toolButtonClick('#tool_fhellipse')) { svgCanvas.setMode('fhellipse'); } }; var clickImage = function(){ if (toolButtonClick('#tool_image')) { svgCanvas.setMode('image'); } }; var clickZoom = function(){ if (toolButtonClick('#tool_zoom')) { workarea.css('cursor','crosshair'); svgCanvas.setMode('zoom'); } }; var dblclickZoom = function(){ if (toolButtonClick('#tool_zoom')) { zoomImage(); setSelectMode(); } }; var clickText = function(){ toolButtonClick('#tool_text'); svgCanvas.setMode('text'); }; var clickPath = function(){ toolButtonClick('#tool_path'); svgCanvas.setMode('path'); }; // Delete is a contextual tool that only appears in the ribbon if // an element has been selected var deleteSelected = function() { if (selectedElement != null || multiselected) { svgCanvas.deleteSelectedElements(); } }; var cutSelected = function() { if (selectedElement != null || multiselected) { svgCanvas.cutSelectedElements(); } }; var copySelected = function() { if (selectedElement != null || multiselected) { svgCanvas.copySelectedElements(); } }; var moveToTopSelected = function() { if (selectedElement != null) { svgCanvas.moveToTopSelectedElement(); } }; var moveToBottomSelected = function() { if (selectedElement != null) { svgCanvas.moveToBottomSelectedElement(); } }; var moveUpDownSelected = function(dir) { if (selectedElement != null) { svgCanvas.moveUpDownSelected(dir); } }; var convertToPath = function() { if (selectedElement != null) { svgCanvas.convertToPath(); } } var reorientPath = function() { if (selectedElement != null) { path.reorient(); } } var moveSelected = function(dx,dy) { if (selectedElement != null || multiselected) { svgCanvas.moveSelectedElements(dx,dy); } }; var linkControlPoints = function() { var linked = !$('#tool_node_link').hasClass('push_button_pressed'); if (linked) $('#tool_node_link').addClass('push_button_pressed').removeClass('tool_button'); else $('#tool_node_link').removeClass('push_button_pressed').addClass('tool_button'); path.linkControlPoints(linked); } var clonePathNode = function() { if (path.getNodePoint()) { path.clonePathNode(); } }; var deletePathNode = function() { if (path.getNodePoint()) { path.deletePathNode(); } }; var addSubPath = function() { var button = $('#tool_add_subpath'); var sp = !button.hasClass('push_button_pressed'); if (sp) { button.addClass('push_button_pressed').removeClass('tool_button'); } else { button.removeClass('push_button_pressed').addClass('tool_button'); } path.addSubPath(sp); }; var opencloseSubPath = function() { path.opencloseSubPath(); } var selectNext = function() { svgCanvas.cycleElement(1); }; var selectPrev = function() { svgCanvas.cycleElement(0); }; var rotateSelected = function(cw) { if (selectedElement == null || multiselected) return; var step = 5; if(!cw) step *= -1; var new_angle = $('#angle').val()*1 + step; svgCanvas.setRotationAngle(new_angle); updateContextPanel(); }; var clickClear = function(){ var dims = curConfig.dimensions; $.confirm(uiStrings.QwantToClear, function(ok) { if(!ok) return; setSelectMode(); svgCanvas.clear(); svgCanvas.setResolution(dims[0], dims[1]); updateCanvas(true); zoomImage(); populateLayers(); updateContextPanel(); }); }; var clickBold = function(){ svgCanvas.setBold( !svgCanvas.getBold() ); updateContextPanel(); return false; }; var clickItalic = function(){ svgCanvas.setItalic( !svgCanvas.getItalic() ); updateContextPanel(); return false; }; var clickSave = function(){ // In the future, more options can be provided here var saveOpts = { 'images': curPrefs.img_save, 'round_digits': 6 } svgCanvas.save(saveOpts); }; var clickExport = function() { // Open placeholder window (prevents popup) if(!customHandlers.pngsave) { var str = uiStrings.loadingImage; exportWindow = window.open("data:text/html;charset=utf-8," + str + "<\/title><h1>" + str + "<\/h1>"); } if(window.canvg) { svgCanvas.rasterExport(); } else { $.getScript('canvg/rgbcolor.js', function() { $.getScript('canvg/canvg.js', function() { svgCanvas.rasterExport(); }); }); } } // by default, svgCanvas.open() is a no-op. // it is up to an extension mechanism (opera widget, etc) // to call setCustomHandlers() which will make it do something var clickOpen = function(){ svgCanvas.open(); }; var clickImport = function(){ }; var clickUndo = function(){ if (undoMgr.getUndoStackSize() > 0) { undoMgr.undo(); populateLayers(); } }; var clickRedo = function(){ if (undoMgr.getRedoStackSize() > 0) { undoMgr.redo(); populateLayers(); } }; var clickGroup = function(){ // group if (multiselected) { svgCanvas.groupSelectedElements(); } // ungroup else if(selectedElement){ svgCanvas.ungroupSelectedElement(); } }; var clickClone = function(){ svgCanvas.cloneSelectedElements(); }; var clickAlign = function() { var letter = this.id.replace('tool_align','').charAt(0); svgCanvas.alignSelectedElements(letter, $('#align_relative_to').val()); }; var zoomImage = function(multiplier) { var res = svgCanvas.getResolution(); multiplier = multiplier?res.zoom * multiplier:1; // setResolution(res.w * multiplier, res.h * multiplier, true); $('#zoom').val(multiplier * 100); svgCanvas.setZoom(multiplier); zoomDone(); updateCanvas(true); }; var zoomDone = function() { // updateBgImage(); updateWireFrame(); //updateCanvas(); // necessary? } var clickWireframe = function() { var wf = !$('#tool_wireframe').hasClass('push_button_pressed'); if (wf) $('#tool_wireframe').addClass('push_button_pressed').removeClass('tool_button'); else $('#tool_wireframe').removeClass('push_button_pressed').addClass('tool_button'); workarea.toggleClass('wireframe'); if(supportsNonSS) return; var wf_rules = $('#wireframe_rules'); if(!wf_rules.length) { wf_rules = $('<style id="wireframe_rules"><\/style>').appendTo('head'); } else { wf_rules.empty(); } updateWireFrame(); } var updateWireFrame = function() { // Test support if(supportsNonSS) return; var rule = "#workarea.wireframe #svgcontent * { stroke-width: " + 1/svgCanvas.getZoom() + "px; }"; $('#wireframe_rules').text(workarea.hasClass('wireframe') ? rule : ""); } var showSourceEditor = function(e, forSaving){ if (editingsource) return; editingsource = true; $('#save_output_btns').toggle(!!forSaving); $('#tool_source_back').toggle(!forSaving); var str = svgCanvas.getSvgString(); $('#svg_source_textarea').val(str); $('#svg_source_editor').fadeIn(); properlySourceSizeTextArea(); $('#svg_source_textarea').focus(); }; $('#svg_docprops_container').draggable({cancel:'button,fieldset'}); var showDocProperties = function(){ if (docprops) return; docprops = true; // This selects the correct radio button by using the array notation $('#image_save_opts input').val([curPrefs.img_save]); // update resolution option with actual resolution var res = svgCanvas.getResolution(); $('#canvas_width').val(res.w); $('#canvas_height').val(res.h); $('#canvas_title').val(svgCanvas.getDocumentTitle()); // Update background color with current one var blocks = $('#bg_blocks div'); var cur_bg = 'cur_background'; var canvas_bg = $.pref('bkgd_color'); var url = $.pref('bkgd_url'); // if(url) url = url[1]; blocks.each(function() { var blk = $(this); var is_bg = blk.css('background-color') == canvas_bg; blk.toggleClass(cur_bg, is_bg); if(is_bg) $('#canvas_bg_url').removeClass(cur_bg); }); if(!canvas_bg) blocks.eq(0).addClass(cur_bg); if(url) { $('#canvas_bg_url').val(url); } $('grid_snapping_step').attr('value', curConfig.snappingStep); if (curConfig.gridSnapping == true) { $('#grid_snapping_on').attr('checked', 'checked'); } else { $('#grid_snapping_on').removeAttr('checked'); } $('#svg_docprops').fadeIn(); }; var properlySourceSizeTextArea = function(){ // TODO: remove magic numbers here and get values from CSS var height = $('#svg_source_container').height() - 80; $('#svg_source_textarea').css('height', height); }; var saveSourceEditor = function(){ if (!editingsource) return; var saveChanges = function() { svgCanvas.clearSelection(); hideSourceEditor(); zoomImage(); populateLayers(); setTitle(svgCanvas.getDocumentTitle()); } if (!svgCanvas.setSvgString($('#svg_source_textarea').val())) { $.confirm(uiStrings.QerrorsRevertToSource, function(ok) { if(!ok) return false; saveChanges(); }); } else { saveChanges(); } setSelectMode(); }; var setTitle = function(title) { var editor_title = $('title:first').text().split(':')[0]; var new_title = editor_title + (title?': ' + title:''); $('title:first').text(new_title); } var saveDocProperties = function(){ // set title var new_title = $('#canvas_title').val(); setTitle(new_title); svgCanvas.setDocumentTitle(new_title); // update resolution var width = $('#canvas_width'), w = width.val(); var height = $('#canvas_height'), h = height.val(); if(w != "fit" && !svgCanvas.isValidUnit('width', w)) { $.alert(uiStrings.invalidAttrValGiven); width.parent().addClass('error'); return false; } width.parent().removeClass('error'); if(h != "fit" && !svgCanvas.isValidUnit('height', h)) { $.alert(uiStrings.invalidAttrValGiven); height.parent().addClass('error'); return false; } height.parent().removeClass('error'); if(!svgCanvas.setResolution(w, h)) { $.alert(uiStrings.noContentToFitTo); return false; } // set image save option curPrefs.img_save = $('#image_save_opts :checked').val(); $.pref('img_save',curPrefs.img_save); // set background var color = $('#bg_blocks div.cur_background').css('background-color') || '#FFF'; setBackground(color, $('#canvas_bg_url').val()); // set language var lang = $('#lang_select').val(); if(lang != curPrefs.lang) { Editor.putLocale(lang); } // set icon size setIconSize($('#iconsize').val()); // set grid setting curConfig.gridSnapping = $('#grid_snapping_on')[0].checked; curConfig.snappingStep = $('#grid_snapping_step').val(); svgCanvas.setConfig(curConfig); updateCanvas(); hideDocProperties(); }; function setBackground(color, url) { // if(color == curPrefs.bkgd_color && url == curPrefs.bkgd_url) return; $.pref('bkgd_color', color); $.pref('bkgd_url', url); // This should be done in svgcanvas.js for the borderRect fill svgCanvas.setBackground(color, url); } var setIcon = Editor.setIcon = function(elem, icon_id, forcedSize) { var icon = (typeof icon_id == 'string') ? $.getSvgIcon(icon_id, true) : icon_id; if(!icon) { console.log('NOTE: Icon image missing: ' + icon_id); return; } $(elem).empty().append(icon); } var ua_prefix; (ua_prefix = function() { var regex = /^(Moz|Webkit|Khtml|O|ms|Icab)(?=[A-Z])/; var someScript = document.getElementsByTagName('script')[0]; for(var prop in someScript.style) { if(regex.test(prop)) { // test is faster than match, so it's better to perform // that on the lot and match only when necessary return prop.match(regex)[0]; } } // Nothing found so far? if('WebkitOpacity' in someScript.style) return 'Webkit'; if('KhtmlOpacity' in someScript.style) return 'Khtml'; return ''; }()); var scaleElements = function(elems, scale) { var prefix = '-' + ua_prefix.toLowerCase() + '-'; var sides = ['top', 'left', 'bottom', 'right']; elems.each(function() { // console.log('go', scale); // Handled in CSS // this.style[ua_prefix + 'Transform'] = 'scale(' + scale + ')'; var el = $(this); var w = el.outerWidth() * (scale - 1); var h = el.outerHeight() * (scale - 1); var margins = {}; for(var i = 0; i < 4; i++) { var s = sides[i]; var cur = el.data('orig_margin-' + s); if(cur == null) { cur = parseInt(el.css('margin-' + s)); // Cache the original margin el.data('orig_margin-' + s, cur); } var val = cur * scale; if(s === 'right') { val += w; } else if(s === 'bottom') { val += h; } el.css('margin-' + s, val); // el.css('outline', '1px solid red'); } }); } var setIconSize = Editor.setIconSize = function(size, force) { if(size == curPrefs.size && !force) return; // return; // var elems = $('.tool_button, .push_button, .tool_button_current, .disabled, .icon_label, #url_notice, #tool_open'); console.log('size', size); var sel_toscale = '#tools_top .toolset, #editor_panel > *, #history_panel > *,\ #main_button, #tools_left > *, #path_node_panel > *, #multiselected_panel > *,\ #g_panel > *, #tool_font_size > *, .tools_flyout'; var elems = $(sel_toscale); var scale = 1; if(typeof size == 'number') { scale = size; } else { var icon_sizes = { s:.75, m:1, l:1.25, xl:1.5 }; scale = icon_sizes[size]; } Editor.tool_scale = tool_scale = scale; setFlyoutPositions(); // $('.tools_flyout').each(function() { // var pos = $(this).position(); // console.log($(this), pos.left+(34 * scale)); // $(this).css({'left': pos.left+(34 * scale), 'top': pos.top+(77 * scale)}); // console.log('l', $(this).css('left')); // }); // var scale = .75;//0.75; var hidden_ps = elems.parents(':hidden'); hidden_ps.css('visibility', 'hidden').show(); scaleElements(elems, scale); hidden_ps.css('visibility', 'visible').hide(); // console.timeEnd('elems'); // return; $.pref('iconsize', size); $('#iconsize').val(size); // Change icon size // $('.tool_button, .push_button, .tool_button_current, .disabled, .icon_label, #url_notice, #tool_open') // .find('> svg, > img').each(function() { // this.setAttribute('width',size_num); // this.setAttribute('height',size_num); // }); // // $.resizeSvgIcons({ // '.flyout_arrow_horiz > svg, .flyout_arrow_horiz > img': size_num / 5, // '#logo > svg, #logo > img': size_num * 1.3, // '#tools_bottom .icon_label > *': (size_num === 16 ? 18 : size_num * .75) // }); // if(size != 's') { // $.resizeSvgIcons({'#layerbuttons svg, #layerbuttons img': size_num * .6}); // } // Note that all rules will be prefixed with '#svg_editor' when parsed var cssResizeRules = { // ".tool_button,\ // .push_button,\ // .tool_button_current,\ // .push_button_pressed,\ // .disabled,\ // .icon_label,\ // .tools_flyout .tool_button": { // 'width': {s: '16px', l: '32px', xl: '48px'}, // 'height': {s: '16px', l: '32px', xl: '48px'}, // 'padding': {s: '1px', l: '2px', xl: '3px'} // }, // ".tool_sep": { // 'height': {s: '16px', l: '32px', xl: '48px'}, // 'margin': {s: '2px 2px', l: '2px 5px', xl: '2px 8px'} // }, // "#main_icon": { // 'width': {s: '31px', l: '53px', xl: '75px'}, // 'height': {s: '22px', l: '42px', xl: '64px'} // }, "#tools_top": { 'left': 50, 'height': 72 }, "#tools_left": { 'width': 31, 'top': 74 }, "div#workarea": { 'left': 38, 'top': 74 }, // "#tools_bottom": { // 'left': {s: '27px', l: '46px', xl: '65px'}, // 'height': {s: '58px', l: '98px', xl: '145px'} // }, // "#color_tools": { // 'border-spacing': {s: '0 1px'}, // 'margin-top': {s: '-1px'} // }, // "#color_tools .icon_label": { // 'width': {l:'43px', xl: '60px'} // }, // ".color_tool": { // 'height': {s: '20px'} // }, // "#tool_opacity": { // 'top': {s: '1px'}, // 'height': {s: 'auto', l:'auto', xl:'auto'} // }, // "#tools_top input, #tools_bottom input": { // 'margin-top': {s: '2px', l: '4px', xl: '5px'}, // 'height': {s: 'auto', l: 'auto', xl: 'auto'}, // 'border': {s: '1px solid #555', l: 'auto', xl: 'auto'}, // 'font-size': {s: '.9em', l: '1.2em', xl: '1.4em'} // }, // "#zoom_panel": { // 'margin-top': {s: '3px', l: '4px', xl: '5px'} // }, // "#copyright, #tools_bottom .label": { // 'font-size': {l: '1.5em', xl: '2em'}, // 'line-height': {s: '15px'} // }, // "#tools_bottom_2": { // 'width': {l: '295px', xl: '355px'}, // 'top': {s: '4px'} // }, // "#tools_top > div, #tools_top": { // 'line-height': {s: '17px', l: '34px', xl: '50px'} // }, // ".dropdown button": { // 'height': {s: '18px', l: '34px', xl: '40px'}, // 'line-height': {s: '18px', l: '34px', xl: '40px'}, // 'margin-top': {s: '3px'} // }, // "#tools_top label, #tools_bottom label": { // 'font-size': {s: '1em', l: '1.5em', xl: '2em'}, // 'height': {s: '25px', l: '42px', xl: '64px'} // }, // "div.toolset": { // 'height': {s: '25px', l: '42px', xl: '64px'} // }, // "#tool_bold, #tool_italic": { // 'font-size': {s: '1.5em', l: '3em', xl: '4.5em'} // }, // "#sidepanels": { // 'top': {s: '50px', l: '88px', xl: '125px'}, // 'bottom': {s: '51px', l: '68px', xl: '65px'} // }, // '#layerbuttons': { // 'width': {l: '130px', xl: '175px'}, // 'height': {l: '24px', xl: '30px'} // }, // '#layerlist': { // 'width': {l: '128px', xl: '150px'} // }, // '.layer_button': { // 'width': {l: '19px', xl: '28px'}, // 'height': {l: '19px', xl: '28px'} // }, // "input.spin-button": { // 'background-image': {l: "url('images/spinbtn_updn_big.png')", xl: "url('images/spinbtn_updn_big.png')"}, // 'background-position': {l: '100% -5px', xl: '100% -2px'}, // 'padding-right': {l: '24px', xl: '24px' } // }, // "input.spin-button.up": { // 'background-position': {l: '100% -45px', xl: '100% -42px'} // }, // "input.spin-button.down": { // 'background-position': {l: '100% -85px', xl: '100% -82px'} // }, // "#position_opts": { // 'width': {all: (size_num*4) +'px'} // } }; var rule_elem = $('#tool_size_rules'); if(!rule_elem.length) { rule_elem = $('<style id="tool_size_rules"><\/style>').appendTo('head'); } else { rule_elem.empty(); } if(size != 'm') { var style_str = ''; $.each(cssResizeRules, function(selector, rules) { selector = '#svg_editor ' + selector.replace(/,/g,', #svg_editor'); style_str += selector + '{'; $.each(rules, function(prop, values) { if(typeof values === 'number') { var val = (values * scale) + 'px'; } else if(values[size] || values.all) { var val = (values[size] || values.all); } style_str += (prop + ':' + val + ';'); }); style_str += '}'; }); //this.style[ua_prefix + 'Transform'] = 'scale(' + scale + ')'; var prefix = '-' + ua_prefix.toLowerCase() + '-'; style_str += (sel_toscale + '{' + prefix + 'transform: scale(' + scale + ');}' + ' #svg_editor div.toolset .toolset {' + prefix + 'transform: scale(1); margin: 1px !important;}' // Hack for markers + ' #svg_editor .ui-slider {' + prefix + 'transform: scale(' + (1/scale) + ');}' // Hack for sliders ); rule_elem.text(style_str); } setFlyoutPositions(); } var cancelOverlays = function() { $('#dialog_box').hide(); if (!editingsource && !docprops) return; if (editingsource) { var oldString = svgCanvas.getSvgString(); if (oldString != $('#svg_source_textarea').val()) { $.confirm(uiStrings.QignoreSourceChanges, function(ok) { if(ok) hideSourceEditor(); }); } else { hideSourceEditor(); } } else if (docprops) { hideDocProperties(); } }; var hideSourceEditor = function(){ $('#svg_source_editor').hide(); editingsource = false; $('#svg_source_textarea').blur(); }; var hideDocProperties = function(){ $('#svg_docprops').hide(); $('#canvas_width,#canvas_height').removeAttr('disabled'); $('#resolution')[0].selectedIndex = 0; $('#image_save_opts input').val([curPrefs.img_save]); docprops = false; }; var win_wh = {width:$(window).width(), height:$(window).height()}; $(window).resize(function(evt) { if (editingsource) { properlySourceSizeTextArea(); } $.each(win_wh, function(type, val) { var curval = $(window)[type](); workarea[0]['scroll' + (type==='width'?'Left':'Top')] -= (curval - val)/2; win_wh[type] = curval; }); }); $('#url_notice').click(function() { $.alert(this.title); }); $('#change_image_url').click(promptImgURL); function promptImgURL() { var curhref = svgCanvas.getHref(selectedElement); curhref = curhref.indexOf("data:") === 0?"":curhref; $.prompt(uiStrings.enterNewImgURL, curhref, function(url) { if(url) setImageURL(url); }); } // added these event handlers for all the push buttons so they // behave more like buttons being pressed-in and not images (function() { var toolnames = ['clear','open','save','source','delete','delete_multi','paste','clone','clone_multi','move_top','move_bottom']; var all_tools = ''; var cur_class = 'tool_button_current'; $.each(toolnames, function(i,item) { all_tools += '#tool_' + item + (i==toolnames.length-1?',':''); }); $(all_tools).mousedown(function() { $(this).addClass(cur_class); }).bind('mousedown mouseout', function() { $(this).removeClass(cur_class); }); $('#tool_undo, #tool_redo').mousedown(function(){ if (!$(this).hasClass('disabled')) $(this).addClass(cur_class); }).bind('mousedown mouseout',function(){ $(this).removeClass(cur_class);} ); }()); // switch modifier key in tooltips if mac // NOTE: This code is not used yet until I can figure out how to successfully bind ctrl/meta // in Opera and Chrome if (isMac) { var shortcutButtons = ["tool_clear", "tool_save", "tool_source", "tool_undo", "tool_redo", "tool_clone"]; var i = shortcutButtons.length; while (i--) { var button = document.getElementById(shortcutButtons[i]); if (button != null) { var title = button.title; var index = title.indexOf("Ctrl+"); button.title = [title.substr(0, index), "Cmd+", title.substr(index + 5)].join(''); } } } // TODO: go back to the color boxes having white background-color and then setting // background-image to none.png (otherwise partially transparent gradients look weird) var colorPicker = function(elem) { var picker = elem.attr('id') == 'stroke_color' ? 'stroke' : 'fill'; // var opacity = (picker == 'stroke' ? $('#stroke_opacity') : $('#fill_opacity')); var paint = (picker == 'stroke' ? strokePaint : fillPaint); var title = (picker == 'stroke' ? 'Pick a Stroke Paint and Opacity' : 'Pick a Fill Paint and Opacity'); var was_none = false; var pos = elem.position(); $("#color_picker") .draggable({cancel:'.jPicker_table,.jGraduate_lgPick,.jGraduate_rgPick'}) .css(curConfig.colorPickerCSS || {'left': pos.left, 'bottom': 50 - pos.top}) .jGraduate( { paint: paint, window: { pickerTitle: title }, images: { clientPath: curConfig.jGraduatePath } }, function(p) { paint = new $.jGraduate.Paint(p); var oldgrad = document.getElementById("gradbox_"+picker); var svgbox = oldgrad.parentNode; var rectbox = svgbox.firstChild; if (paint.type == "linearGradient" || paint.type == "radialGradient") { svgbox.removeChild(oldgrad); var newgrad = svgbox.appendChild(document.importNode(paint[paint.type], true)); newgrad.id = "gradbox_"+picker; rectbox.setAttribute("fill", "url(#gradbox_" + picker + ")"); rectbox.setAttribute("opacity", paint.alpha/100); } else { rectbox.setAttribute("fill", paint.solidColor != "none" ? "#" + paint.solidColor : "none"); rectbox.setAttribute("opacity", paint.alpha/100); } if (picker == 'stroke') { svgCanvas.setPaint('stroke', paint); strokePaint = paint; } else { svgCanvas.setPaint('fill', paint); fillPaint = paint; } updateToolbar(); $('#color_picker').hide(); }, function(p) { $('#color_picker').hide(); }); }; var updateToolButtonState = function() { var bNoFill = (svgCanvas.getColor('fill') == 'none'); var bNoStroke = (svgCanvas.getColor('stroke') == 'none'); var buttonsNeedingStroke = [ '#tool_fhpath', '#tool_line' ]; var buttonsNeedingFillAndStroke = [ '#tools_rect .tool_button', '#tools_ellipse .tool_button', '#tool_text', '#tool_path']; if (bNoStroke) { for (index in buttonsNeedingStroke) { var button = buttonsNeedingStroke[index]; if ($(button).hasClass('tool_button_current')) { clickSelect(); } $(button).addClass('disabled'); } } else { for (index in buttonsNeedingStroke) { var button = buttonsNeedingStroke[index]; $(button).removeClass('disabled'); } } if (bNoStroke && bNoFill) { for (index in buttonsNeedingFillAndStroke) { var button = buttonsNeedingFillAndStroke[index]; if ($(button).hasClass('tool_button_current')) { clickSelect(); } $(button).addClass('disabled'); } } else { for (index in buttonsNeedingFillAndStroke) { var button = buttonsNeedingFillAndStroke[index]; $(button).removeClass('disabled'); } } svgCanvas.runExtensions("toolButtonStateUpdate", { nofill: bNoFill, nostroke: bNoStroke }); // Disable flyouts if all inside are disabled $('.tools_flyout').each(function() { var shower = $('#' + this.id + '_show'); var has_enabled = false; $(this).children().each(function() { if(!$(this).hasClass('disabled')) { has_enabled = true; } }); shower.toggleClass('disabled', !has_enabled); }); operaRepaint(); }; // set up gradients to be used for the buttons var svgdocbox = new DOMParser().parseFromString( '<svg xmlns="http://www.w3.org/2000/svg"><rect width="100%" height="100%"\ fill="#' + curConfig.initFill.color + '" opacity="' + curConfig.initFill.opacity + '"/>\ <linearGradient id="gradbox_">\ <stop stop-color="#000" offset="0.0"/>\ <stop stop-color="#FF0000" offset="1.0"/>\ </linearGradient></svg>', 'text/xml'); var docElem = svgdocbox.documentElement; var boxgrad = svgdocbox.getElementById('gradbox_'); boxgrad.id = 'gradbox_fill'; docElem.setAttribute('width',16.5); $('#fill_color').append( document.importNode(docElem,true) ); boxgrad.id = 'gradbox_stroke'; docElem.setAttribute('width',16.5); $('#stroke_color').append( document.importNode(docElem,true) ); $('#stroke_color rect').attr({ 'fill': '#' + curConfig.initStroke.color, 'opacity': curConfig.initStroke.opacity }); $('#stroke_width').val(curConfig.initStroke.width); $('#group_opacity').val(curConfig.initOpacity * 100); // Use this SVG elem to test vectorEffect support var test_el = docElem.firstChild; test_el.setAttribute('style','vector-effect:non-scaling-stroke'); var supportsNonSS = (test_el.style.vectorEffect == 'non-scaling-stroke'); test_el.removeAttribute('style'); // Use this to test support for blur element. Seems to work to test support in Webkit var blur_test = svgdocbox.createElementNS('http://www.w3.org/2000/svg', 'feGaussianBlur'); if(typeof blur_test.stdDeviationX === "undefined") { $('#tool_blur').hide(); } $(blur_test).remove(); // Test for embedImage support (use timeout to not interfere with page load) setTimeout(function() { svgCanvas.embedImage('images/logo.png', function(datauri) { if(!datauri) { // Disable option $('#image_save_opts [value=embed]').attr('disabled','disabled'); $('#image_save_opts input').val(['ref']); curPrefs.img_save = 'ref'; $('#image_opt_embed').css('color','#666').attr('title',uiStrings.featNotSupported); } }); },1000); $('#fill_color, #tool_fill .icon_label').click(function(){ colorPicker($('#fill_color')); updateToolButtonState(); }); $('#stroke_color, #tool_stroke .icon_label').click(function(){ colorPicker($('#stroke_color')); updateToolButtonState(); }); $('#group_opacityLabel').click(function() { $('#opacity_dropdown button').mousedown(); $(window).mouseup(); }); $('#zoomLabel').click(function() { $('#zoom_dropdown button').mousedown(); $(window).mouseup(); }); $('#tool_move_top').mousedown(function(evt){ $('#tools_stacking').show(); evt.preventDefault(); }); $('.layer_button').mousedown(function() { $(this).addClass('layer_buttonpressed'); }).mouseout(function() { $(this).removeClass('layer_buttonpressed'); }).mouseup(function() { $(this).removeClass('layer_buttonpressed'); }); $('.push_button').mousedown(function() { if (!$(this).hasClass('disabled')) { $(this).addClass('push_button_pressed').removeClass('push_button'); } }).mouseout(function() { $(this).removeClass('push_button_pressed').addClass('push_button'); }).mouseup(function() { $(this).removeClass('push_button_pressed').addClass('push_button'); }); $('#layer_new').click(function() { var i = svgCanvas.getNumLayers(); do { var uniqName = uiStrings.layer + " " + ++i; } while(svgCanvas.hasLayer(uniqName)); $.prompt(uiStrings.enterUniqueLayerName,uniqName, function(newName) { if (!newName) return; if (svgCanvas.hasLayer(newName)) { $.alert(uiStrings.dupeLayerName); return; } svgCanvas.createLayer(newName); updateContextPanel(); populateLayers(); }); }); function deleteLayer() { if (svgCanvas.deleteCurrentLayer()) { updateContextPanel(); populateLayers(); // This matches what SvgCanvas does // TODO: make this behavior less brittle (svg-editor should get which // layer is selected from the canvas and then select that one in the UI) $('#layerlist tr.layer').removeClass("layersel"); $('#layerlist tr.layer:first').addClass("layersel"); } } function cloneLayer() { var name = svgCanvas.getCurrentLayer() + ' copy'; $.prompt(uiStrings.enterUniqueLayerName, name, function(newName) { if (!newName) return; if (svgCanvas.hasLayer(newName)) { $.alert(uiStrings.dupeLayerName); return; } svgCanvas.cloneLayer(newName); updateContextPanel(); populateLayers(); }); } function mergeLayer() { if($('#layerlist tr.layersel').index() == svgCanvas.getNumLayers()-1) return; svgCanvas.mergeLayer(); updateContextPanel(); populateLayers(); } function moveLayer(pos) { var curIndex = $('#layerlist tr.layersel').index(); var total = svgCanvas.getNumLayers(); if(curIndex > 0 || curIndex < total-1) { curIndex += pos; svgCanvas.setCurrentLayerPosition(total-curIndex-1); populateLayers(); } } $('#layer_delete').click(deleteLayer); $('#layer_up').click(function() { moveLayer(-1); }); $('#layer_down').click(function() { moveLayer(1); }); $('#layer_rename').click(function() { var curIndex = $('#layerlist tr.layersel').prevAll().length; var oldName = $('#layerlist tr.layersel td.layername').text(); $.prompt(uiStrings.enterNewLayerName,"", function(newName) { if (!newName) return; if (oldName == newName || svgCanvas.hasLayer(newName)) { $.alert(uiStrings.layerHasThatName); return; } svgCanvas.renameCurrentLayer(newName); populateLayers(); }); }); var SIDEPANEL_MAXWIDTH = 300; var SIDEPANEL_OPENWIDTH = 150; var sidedrag = -1, sidedragging = false, allowmove = false; var resizePanel = function(evt) { if (!allowmove) return; if (sidedrag == -1) return; sidedragging = true; var deltax = sidedrag - evt.pageX; var sidepanels = $('#sidepanels'); var sidewidth = parseInt(sidepanels.css('width')); if (sidewidth+deltax > SIDEPANEL_MAXWIDTH) { deltax = SIDEPANEL_MAXWIDTH - sidewidth; sidewidth = SIDEPANEL_MAXWIDTH; } else if (sidewidth+deltax < 2) { deltax = 2 - sidewidth; sidewidth = 2; } if (deltax == 0) return; sidedrag -= deltax; var layerpanel = $('#layerpanel'); workarea.css('right', parseInt(workarea.css('right'))+deltax); sidepanels.css('width', parseInt(sidepanels.css('width'))+deltax); layerpanel.css('width', parseInt(layerpanel.css('width'))+deltax); } $('#sidepanel_handle') .mousedown(function(evt) { sidedrag = evt.pageX; $(window).mousemove(resizePanel); allowmove = false; // Silly hack for Chrome, which always runs mousemove right after mousedown setTimeout(function() { allowmove = true; }, 20); }) .mouseup(function(evt) { if (!sidedragging) toggleSidePanel(); sidedrag = -1; sidedragging = false; }); $(window).mouseup(function() { sidedrag = -1; sidedragging = false; $('#svg_editor').unbind('mousemove', resizePanel); }); // if width is non-zero, then fully close it, otherwise fully open it // the optional close argument forces the side panel closed var toggleSidePanel = function(close){ var w = parseInt($('#sidepanels').css('width')); var deltax = (w > 2 || close ? 2 : SIDEPANEL_OPENWIDTH) - w; var sidepanels = $('#sidepanels'); var layerpanel = $('#layerpanel'); workarea.css('right', parseInt(workarea.css('right'))+deltax); sidepanels.css('width', parseInt(sidepanels.css('width'))+deltax); layerpanel.css('width', parseInt(layerpanel.css('width'))+deltax); }; // this function highlights the layer passed in (by fading out the other layers) // if no layer is passed in, this function restores the other layers var toggleHighlightLayer = function(layerNameToHighlight) { var curNames = new Array(svgCanvas.getNumLayers()); for (var i = 0; i < curNames.length; ++i) { curNames[i] = svgCanvas.getLayer(i); } if (layerNameToHighlight) { for (var i = 0; i < curNames.length; ++i) { if (curNames[i] != layerNameToHighlight) { svgCanvas.setLayerOpacity(curNames[i], 0.5); } } } else { for (var i = 0; i < curNames.length; ++i) { svgCanvas.setLayerOpacity(curNames[i], 1.0); } } }; var populateLayers = function(){ var layerlist = $('#layerlist tbody'); var selLayerNames = $('#selLayerNames'); layerlist.empty(); selLayerNames.empty(); var currentlayer = svgCanvas.getCurrentLayer(); var layer = svgCanvas.getNumLayers(); var icon = $.getSvgIcon('eye'); // we get the layers in the reverse z-order (the layer rendered on top is listed first) while (layer--) { var name = svgCanvas.getLayer(layer); // contenteditable=\"true\" var appendstr = "<tr class=\"layer"; if (name == currentlayer) { appendstr += " layersel" } appendstr += "\">"; if (svgCanvas.getLayerVisibility(name)) { appendstr += "<td class=\"layervis\"/><td class=\"layername\" >" + name + "</td></tr>"; } else { appendstr += "<td class=\"layervis layerinvis\"/><td class=\"layername\" >" + name + "</td></tr>"; } layerlist.append(appendstr); selLayerNames.append("<option value=\"" + name + "\">" + name + "</option>"); } if(icon !== undefined) { var copy = icon.clone(); $('td.layervis',layerlist).append(icon.clone()); $.resizeSvgIcons({'td.layervis .svg_icon':14}); } // handle selection of layer $('#layerlist td.layername') .mouseup(function(evt){ $('#layerlist tr.layer').removeClass("layersel"); var row = $(this.parentNode); row.addClass("layersel"); svgCanvas.setCurrentLayer(this.textContent); evt.preventDefault(); }) .mouseover(function(evt){ $(this).css({"font-style": "italic", "color":"blue"}); toggleHighlightLayer(this.textContent); }) .mouseout(function(evt){ $(this).css({"font-style": "normal", "color":"black"}); toggleHighlightLayer(); }); $('#layerlist td.layervis').click(function(evt){ var row = $(this.parentNode).prevAll().length; var name = $('#layerlist tr.layer:eq(' + row + ') td.layername').text(); var vis = $(this).hasClass('layerinvis'); svgCanvas.setLayerVisibility(name, vis); if (vis) { $(this).removeClass('layerinvis'); } else { $(this).addClass('layerinvis'); } }); // if there were too few rows, let's add a few to make it not so lonely var num = 5 - $('#layerlist tr.layer').size(); while (num-- > 0) { // FIXME: there must a better way to do this layerlist.append("<tr><td style=\"color:white\">_</td><td/></tr>"); } }; populateLayers(); // function changeResolution(x,y) { // var zoom = svgCanvas.getResolution().zoom; // setResolution(x * zoom, y * zoom); // } var centerCanvas = function() { // this centers the canvas vertically in the workarea (horizontal handled in CSS) workarea.css('line-height', workarea.height() + 'px'); }; $(window).bind('load resize', centerCanvas); function stepFontSize(elem, step) { var orig_val = elem.value-0; var sug_val = orig_val + step; var increasing = sug_val >= orig_val; if(step === 0) return orig_val; if(orig_val >= 24) { if(increasing) { return Math.round(orig_val * 1.1); } else { return Math.round(orig_val / 1.1); } } else if(orig_val <= 1) { if(increasing) { return orig_val * 2; } else { return orig_val / 2; } } else { return sug_val; } } function stepZoom(elem, step) { var orig_val = elem.value-0; if(orig_val === 0) return 100; var sug_val = orig_val + step; if(step === 0) return orig_val; if(orig_val >= 100) { return sug_val; } else { if(sug_val >= orig_val) { return orig_val * 2; } else { return orig_val / 2; } } } // function setResolution(w, h, center) { // updateCanvas(); // // w-=0; h-=0; // // $('#svgcanvas').css( { 'width': w, 'height': h } ); // // $('#canvas_width').val(w); // // $('#canvas_height').val(h); // // // // if(center) { // // var w_area = workarea; // // var scroll_y = h/2 - w_area.height()/2; // // var scroll_x = w/2 - w_area.width()/2; // // w_area[0].scrollTop = scroll_y; // // w_area[0].scrollLeft = scroll_x; // // } // } $('#resolution').change(function(){ var wh = $('#canvas_width,#canvas_height'); if(!this.selectedIndex) { if($('#canvas_width').val() == 'fit') { wh.removeAttr("disabled").val(100); } } else if(this.value == 'content') { wh.val('fit').attr("disabled","disabled"); } else { var dims = this.value.split('x'); $('#canvas_width').val(dims[0]); $('#canvas_height').val(dims[1]); wh.removeAttr("disabled"); } }); //Prevent browser from erroneously repopulating fields $('input,select').attr("autocomplete","off"); // Associate all button actions as well as non-button keyboard shortcuts var Actions = function() { // sel:'selector', fn:function, evt:'event', key:[key, preventDefault, NoDisableInInput] var tool_buttons = [ {sel:'#tool_select', fn: clickSelect, evt: 'click', key: 1}, {sel:'#tool_fhpath', fn: clickFHPath, evt: 'click', key: 2}, {sel:'#tool_line', fn: clickLine, evt: 'click', key: 3}, {sel:'#tool_rect', fn: clickRect, evt: 'mouseup', key: 4, parent: '#tools_rect', icon: 'rect'}, {sel:'#tool_square', fn: clickSquare, evt: 'mouseup', key: 'Shift+4', parent: '#tools_rect', icon: 'square'}, {sel:'#tool_fhrect', fn: clickFHRect, evt: 'mouseup', parent: '#tools_rect', icon: 'fh_rect'}, {sel:'#tool_ellipse', fn: clickEllipse, evt: 'mouseup', key: 5, parent: '#tools_ellipse', icon: 'ellipse'}, {sel:'#tool_circle', fn: clickCircle, evt: 'mouseup', key: 'Shift+5', parent: '#tools_ellipse', icon: 'circle'}, {sel:'#tool_fhellipse', fn: clickFHEllipse, evt: 'mouseup', parent: '#tools_ellipse', icon: 'fh_ellipse'}, {sel:'#tool_path', fn: clickPath, evt: 'click', key: 6}, {sel:'#tool_text', fn: clickText, evt: 'click', key: 7}, {sel:'#tool_image', fn: clickImage, evt: 'mouseup', key: 8}, {sel:'#tool_zoom', fn: clickZoom, evt: 'mouseup', key: 9}, {sel:'#tool_clear', fn: clickClear, evt: 'mouseup', key: ['N', true]}, {sel:'#tool_save', fn: function() { editingsource?saveSourceEditor():clickSave()}, evt: 'mouseup', key: ['S', true]}, {sel:'#tool_export', fn: clickExport, evt: 'mouseup'}, {sel:'#tool_open', fn: clickOpen, evt: 'mouseup', key: ['O', true]}, {sel:'#tool_import', fn: clickImport, evt: 'mouseup'}, {sel:'#tool_source', fn: showSourceEditor, evt: 'click', key: ['U', true]}, {sel:'#tool_wireframe', fn: clickWireframe, evt: 'click', key: ['F', true]}, {sel:'#tool_source_cancel,#svg_source_overlay,#tool_docprops_cancel', fn: cancelOverlays, evt: 'click', key: ['esc', false, false], hidekey: true}, {sel:'#tool_source_save', fn: saveSourceEditor, evt: 'click'}, {sel:'#tool_docprops_save', fn: saveDocProperties, evt: 'click'}, {sel:'#tool_docprops', fn: showDocProperties, evt: 'mouseup', key: ['P', true]}, {sel:'#tool_delete,#tool_delete_multi', fn: deleteSelected, evt: 'click', key: ['del/backspace', true]}, {sel:'#tool_reorient', fn: reorientPath, evt: 'click'}, {sel:'#tool_node_link', fn: linkControlPoints, evt: 'click'}, {sel:'#tool_node_clone', fn: clonePathNode, evt: 'click'}, {sel:'#tool_node_delete', fn: deletePathNode, evt: 'click'}, {sel:'#tool_openclose_path', fn: opencloseSubPath, evt: 'click'}, {sel:'#tool_add_subpath', fn: addSubPath, evt: 'click'}, {sel:'#tool_move_top', fn: moveToTopSelected, evt: 'click', key: 'shift+up'}, {sel:'#tool_move_bottom', fn: moveToBottomSelected, evt: 'click', key: 'shift+down'}, {sel:'#tool_topath', fn: convertToPath, evt: 'click'}, {sel:'#tool_undo', fn: clickUndo, evt: 'click', key: ['Z', true]}, {sel:'#tool_redo', fn: clickRedo, evt: 'click', key: ['Y', true]}, {sel:'#tool_clone,#tool_clone_multi', fn: clickClone, evt: 'click', key: ['C', true]}, {sel:'#tool_group', fn: clickGroup, evt: 'click', key: ['G', true]}, {sel:'#tool_ungroup', fn: clickGroup, evt: 'click'}, {sel:'#tool_unlink_use', fn: clickGroup, evt: 'click'}, {sel:'[id^=tool_align]', fn: clickAlign, evt: 'click'}, // these two lines are required to make Opera work properly with the flyout mechanism // {sel:'#tools_rect_show', fn: clickRect, evt: 'click'}, // {sel:'#tools_ellipse_show', fn: clickEllipse, evt: 'click'}, {sel:'#tool_bold', fn: clickBold, evt: 'mousedown'}, {sel:'#tool_italic', fn: clickItalic, evt: 'mousedown'}, {sel:'#sidepanel_handle', fn: toggleSidePanel, key: ['X']}, {sel:'#copy_save_done', fn: cancelOverlays, evt: 'click'}, // Shortcuts not associated with buttons {key: 'shift+left', fn: function(){rotateSelected(0)}}, {key: 'shift+right', fn: function(){rotateSelected(1)}}, {key: 'shift+O', fn: selectPrev}, {key: 'shift+P', fn: selectNext}, {key: [modKey+'up', true], fn: function(){zoomImage(2);}}, {key: [modKey+'down', true], fn: function(){zoomImage(.5);}}, {key: [modKey+'[', true], fn: function(){moveUpDownSelected('Down');}}, {key: [modKey+']', true], fn: function(){moveUpDownSelected('Up');}}, {key: ['up', true], fn: function(){moveSelected(0,-1);}}, {key: ['down', true], fn: function(){moveSelected(0,1);}}, {key: ['left', true], fn: function(){moveSelected(-1,0);}}, {key: ['right', true], fn: function(){moveSelected(1,0);}}, {key: 'A', fn: function(){svgCanvas.selectAllInCurrentLayer();}} ]; // Tooltips not directly associated with a single function var key_assocs = { '4/Shift+4': '#tools_rect_show', '5/Shift+5': '#tools_ellipse_show' }; return { setAll: function() { var flyouts = {}; $.each(tool_buttons, function(i, opts) { // Bind function to button if(opts.sel) { var btn = $(opts.sel); if (btn.length == 0) return true; // Skip if markup does not exist if(opts.evt) { btn[opts.evt](opts.fn); } // Add to parent flyout menu, if able to be displayed if(opts.parent && $(opts.parent + '_show').length != 0) { var f_h = $(opts.parent); if(!f_h.length) { f_h = makeFlyoutHolder(opts.parent.substr(1)); } f_h.append(btn); if(!$.isArray(flyouts[opts.parent])) { flyouts[opts.parent] = []; } flyouts[opts.parent].push(opts); } } // Bind function to shortcut key if(opts.key) { // Set shortcut based on options var keyval, shortcut = '', disInInp = true, fn = opts.fn, pd = false; if($.isArray(opts.key)) { keyval = opts.key[0]; if(opts.key.length > 1) pd = opts.key[1]; if(opts.key.length > 2) disInInp = opts.key[2]; } else { keyval = opts.key; } keyval += ''; $.each(keyval.split('/'), function(i, key) { $(document).bind('keydown', key, function(e) { fn(); if(pd) { e.preventDefault(); } // Prevent default on ALL keys? return false; }); }); // Put shortcut in title if(opts.sel && !opts.hidekey) { var new_title = btn.attr('title').split('[')[0] + '[' + keyval + ']'; key_assocs[keyval] = opts.sel; // Disregard for menu items if(!btn.parents('#main_menu').length) { btn.attr('title', new_title); } } } }); // Setup flyouts setupFlyouts(flyouts); // Misc additional actions // Make "return" keypress trigger the change event $('.attr_changer, #image_url').bind('keydown', 'return', function(evt) {$(this).change();evt.preventDefault();} ); $('#tool_zoom').dblclick(dblclickZoom); }, setTitles: function() { $.each(key_assocs, function(keyval, sel) { var menu = ($(sel).parents('#main_menu').length); $(sel).each(function() { if(menu) { var t = $(this).text().split(' [')[0]; } else { var t = this.title.split(' [')[0]; } var key_str = ''; // Shift+Up $.each(keyval.split('/'), function(i, key) { var mod_bits = key.split('+'), mod = ''; if(mod_bits.length > 1) { mod = mod_bits[0] + '+'; key = mod_bits[1]; } key_str += (i?'/':'') + mod + (uiStrings['key_'+key] || key); }); if(menu) { this.lastChild.textContent = t +' ['+key_str+']'; } else { this.title = t +' ['+key_str+']'; } }); }); }, getButtonData: function(sel) { var b; $.each(tool_buttons, function(i, btn) { if(btn.sel === sel) b = btn; }); return b; } }; }(); Actions.setAll(); // Select given tool Editor.ready(function() { var itool = curConfig.initTool, container = $("#tools_left, #svg_editor .tools_flyout"), pre_tool = container.find("#tool_" + itool), reg_tool = container.find("#" + itool); if(pre_tool.length) { tool = pre_tool; } else if(reg_tool.length){ tool = reg_tool; } else { tool = $("#tool_select"); } tool.click().mouseup(); if(curConfig.wireframe) { $('#tool_wireframe').click(); } if(curConfig.showlayers) { toggleSidePanel(); } if(curConfig.gridSnapping) { $('#grid_snapping_on')[0].checked = true; } if(curConfig.snappingStep) { $('#grid_snapping_step').val(curConfig.snappingStep); } }); $('#rect_rx').SpinButton({ min: 0, max: 1000, step: 1, callback: changeRectRadius }); $('#stroke_width').SpinButton({ min: 0, max: 99, step: 1, smallStep: 0.1, callback: changeStrokeWidth }); $('#angle').SpinButton({ min: -180, max: 180, step: 5, callback: changeRotationAngle }); $('#font_size').SpinButton({ step: 1, min: 0.001, stepfunc: stepFontSize, callback: changeFontSize }); $('#group_opacity').SpinButton({ step: 5, min: 0, max: 100, callback: changeOpacity }); $('#blur').SpinButton({ step: .1, min: 0, max: 10, callback: changeBlur }); $('#zoom').SpinButton({ min: 0.001, max: 10000, step: 50, stepfunc: stepZoom, callback: changeZoom }); $("#workarea").contextMenu({ menu: 'cmenu_canvas', inSpeed: 0 }, function(action, el, pos) { switch ( action ) { case 'delete': deleteSelected(); break; case 'cut': cutSelected(); break; case 'copy': copySelected(); break; case 'paste': svgCanvas.pasteElements(); break; case 'paste_in_place': svgCanvas.pasteElements('in_place'); break; case 'move_down': moveUpDownSelected('Down'); break; case 'move_up': moveUpDownSelected('Up'); break; } if(svgCanvas.clipBoard.length) { canv_menu.enableContextMenuItems('#paste,#paste_in_place'); } }); var lmenu_func = function(action, el, pos) { switch ( action ) { case 'dupe': cloneLayer(); break; case 'delete': deleteLayer(); break; case 'merge_down': mergeLayer(); break; case 'merge_all': svgCanvas.mergeAllLayers(); updateContextPanel(); populateLayers(); break; } } $("#layerlist").contextMenu({ menu: 'cmenu_layers', inSpeed: 0 }, lmenu_func ); $("#layer_moreopts").contextMenu({ menu: 'cmenu_layers', inSpeed: 0, allowLeft: true }, lmenu_func ); $('.contextMenu li').mousedown(function(ev) { ev.preventDefault(); }) $('#cmenu_canvas li').disableContextMenu(); canv_menu.enableContextMenuItems('#delete,#cut,#copy'); window.onbeforeunload = function() { // Suppress warning if page is empty if(undoMgr.getUndoStackSize() === 0) { show_save_warning = false; } // show_save_warning is set to "false" when the page is saved. if(!curConfig.no_save_warning && show_save_warning) { // Browser already asks question about closing the page return "There are unsaved changes."; } }; Editor.openPrep = function(func) { $('#main_menu').hide(); if(undoMgr.getUndoStackSize() === 0) { func(true); } else { $.confirm(uiStrings.QwantToOpen, func); } } // use HTML5 File API: http://www.w3.org/TR/FileAPI/ // if browser has HTML5 File API support, then we will show the open menu item // and provide a file input to click. When that change event fires, it will // get the text contents of the file and send it to the canvas if (window.FileReader) { var inp = $('<input type="file">').change(function() { var f = this; Editor.openPrep(function(ok) { if(!ok) return; svgCanvas.clear(); if(f.files.length==1) { var reader = new FileReader(); reader.onloadend = function(e) { svgCanvas.setSvgString(e.target.result); updateCanvas(); }; reader.readAsText(f.files[0]); } }); }); $("#tool_open").show().prepend(inp); var inp2 = $('<input type="file">').change(function() { $('#main_menu').hide(); if(this.files.length==1) { var reader = new FileReader(); reader.onloadend = function(e) { svgCanvas.importSvgString(e.target.result, true); updateCanvas(); }; reader.readAsText(this.files[0]); } }); $("#tool_import").show().prepend(inp2); } var updateCanvas = Editor.updateCanvas = function(center, new_ctr) { var w = workarea.width(), h = workarea.height(); var w_orig = w, h_orig = h; var zoom = svgCanvas.getZoom(); var w_area = workarea; var cnvs = $("#svgcanvas"); var old_ctr = { x: w_area[0].scrollLeft + w_orig/2, y: w_area[0].scrollTop + h_orig/2 }; var multi = curConfig.canvas_expansion; w = Math.max(w_orig, svgCanvas.contentW * zoom * multi); h = Math.max(h_orig, svgCanvas.contentH * zoom * multi); if(w == w_orig && h == h_orig) { workarea.css('overflow','hidden'); } else { workarea.css('overflow','scroll'); } var old_can_y = cnvs.height()/2; var old_can_x = cnvs.width()/2; cnvs.width(w).height(h); var new_can_y = h/2; var new_can_x = w/2; var offset = svgCanvas.updateCanvas(w, h); var ratio = new_can_x / old_can_x; var scroll_x = w/2 - w_orig/2; var scroll_y = h/2 - h_orig/2; if(!new_ctr) { var old_dist_x = old_ctr.x - old_can_x; var new_x = new_can_x + old_dist_x * ratio; var old_dist_y = old_ctr.y - old_can_y; var new_y = new_can_y + old_dist_y * ratio; new_ctr = { x: new_x, y: new_y }; } else { new_ctr.x += offset.x, new_ctr.y += offset.y; } if(center) { // Go to top-left for larger documents if(svgCanvas.contentW > w_area.width()) { // Top-left workarea[0].scrollLeft = offset.x - 10; workarea[0].scrollTop = offset.y - 10; } else { // Center w_area[0].scrollLeft = scroll_x; w_area[0].scrollTop = scroll_y; } } else { w_area[0].scrollLeft = new_ctr.x - w_orig/2; w_area[0].scrollTop = new_ctr.y - h_orig/2; } } // $(function() { updateCanvas(true); // }); // var revnums = "svg-editor.js ($Rev: 1734 $) "; // revnums += svgCanvas.getVersion(); // $('#copyright')[0].setAttribute("title", revnums); var good_langs = []; $('#lang_select option').each(function() { good_langs.push(this.value); }); // var lang = ('lang' in curPrefs) ? curPrefs.lang : null; Editor.putLocale(null, good_langs); // Callback handler for embedapi.js try{ json_encode = function(obj){ //simple partial JSON encoder implementation if(window.JSON && JSON.stringify) return JSON.stringify(obj); var enc = arguments.callee; //for purposes of recursion if(typeof obj == "boolean" || typeof obj == "number"){ return obj+'' //should work... }else if(typeof obj == "string"){ //a large portion of this is stolen from Douglas Crockford's json2.js return '"'+ obj.replace( /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g , function (a) { return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); }) +'"'; //note that this isn't quite as purtyful as the usualness }else if(obj.length){ //simple hackish test for arrayish-ness for(var i = 0; i < obj.length; i++){ obj[i] = enc(obj[i]); //encode every sub-thingy on top } return "["+obj.join(",")+"]"; }else{ var pairs = []; //pairs will be stored here for(var k in obj){ //loop through thingys pairs.push(enc(k)+":"+enc(obj[k])); //key: value } return "{"+pairs.join(",")+"}" //wrap in the braces } } window.addEventListener("message", function(e){ var cbid = parseInt(e.data.substr(0, e.data.indexOf(";"))); try{ e.source.postMessage("SVGe"+cbid+";"+json_encode(eval(e.data)), "*"); }catch(err){ e.source.postMessage("SVGe"+cbid+";error:"+err.message, "*"); } }, false) }catch(err){ window.embed_error = err; } // For Compatibility with older extensions $(function() { window.svgCanvas = svgCanvas; svgCanvas.ready = svgEditor.ready; }); Editor.setLang = function(lang, strings) { $.pref('lang', lang); $('#lang_select').val(lang); if(strings) { // $.extend will only replace the given strings var oldLayerName = $('#layerlist tr.layersel td.layername').text(); var rename_layer = (oldLayerName == uiStrings.layer + ' 1'); $.extend(uiStrings,strings); svgCanvas.setUiStrings(strings); Actions.setTitles(); if(rename_layer) { svgCanvas.renameCurrentLayer(uiStrings.layer + ' 1'); populateLayers(); } svgCanvas.runExtensions("langChanged", lang); // Update flyout tooltips setFlyoutTitles(); // Copy title for certain tool elements var elems = { '#stroke_color': '#tool_stroke .icon_label, #tool_stroke .color_block', '#fill_color': '#tool_fill label, #tool_fill .color_block', '#linejoin_miter': '#cur_linejoin', '#linecap_butt': '#cur_linecap' } $.each(elems, function(source, dest) { $(dest).attr('title', $(source)[0].title); }); // Copy alignment titles $('#multiselected_panel div[id^=tool_align]').each(function() { $('#tool_pos' + this.id.substr(10))[0].title = this.title; }); } }; }; var callbacks = []; Editor.ready = function(cb) { if(!is_ready) { callbacks.push(cb); } else { cb(); } }; Editor.runCallbacks = function() { $.each(callbacks, function() { this(); }); is_ready = true; }; Editor.loadFromString = function(str) { Editor.ready(function() { svgCanvas.setSvgString(str); svgCanvas.undoMgr.reset(); }); }; Editor.resetTransactionManager = function() { Editor.ready(function() { svgCanvas.undoMgr.reset(); }); }; Editor.loadFromURL = function(url, cache) { Editor.ready(function() { $.ajax({ 'url': url, 'dataType': 'text', cache: !!cache, success: svgCanvas.setSvgString, error: function(xhr, stat, err) { if(xhr.responseText) { svgCanvas.setSvgString(xhr.responseText); } else { $.alert("Unable to load from URL. Error: \n"+err+''); } } }); }); }; Editor.loadFromDataURI = function(str) { Editor.ready(function() { svgCanvas.setSvgString(str); var pre = 'data:image/svg+xml;base64,'; var src = str.substring(pre.length); svgCanvas.setSvgString(Utils.decode64(src)); }); }; Editor.addExtension = function() { var args = arguments; // Note that we don't want this on Editor.ready since some extensions // may want to run before then (like server_opensave). $(function() { if(svgCanvas) svgCanvas.addExtension.apply(this, args); }); }; return Editor; }(jQuery); // Run init once DOM is loaded $(svgEditor.init); })(); // ?iconsize=s&bkgd_color=555 // svgEditor.setConfig({ // // imgPath: 'foo', // dimensions: [800, 600], // canvas_expansion: 5, // initStroke: { // color: '0000FF', // width: 3.5, // opacity: .5 // }, // initFill: { // color: '550000', // opacity: .75 // }, // extensions: ['ext-helloworld.js'] // }) ================================================ FILE: extensions/svg-edit/content/editor/svgcanvas.js ================================================ /* * svgcanvas.js * * Licensed under the Apache License, Version 2 * * Copyright(c) 2010 Alexis Deveria * Copyright(c) 2010 Pavol Rusnak * Copyright(c) 2010 Jeff Schiller * */ if(!window.console) { window.console = {}; window.console.log = function(str) {}; window.console.dir = function(str) {}; } if(window.opera) { window.console.log = function(str) {opera.postError(str);}; window.console.dir = function(str) {}; } (function() { // This fixes $(...).attr() to work as expected with SVG elements. // Does not currently use *AttributeNS() since we rarely need that. // See http://api.jquery.com/attr/ for basic documentation of .attr() // Additional functionality: // - When getting attributes, a string that's a number is return as type number. // - If an array is supplied as first parameter, multiple values are returned // as an object with values for each given attributes var proxied = jQuery.fn.attr, svgns = "http://www.w3.org/2000/svg"; jQuery.fn.attr = function(key, value) { var len = this.length; if(!len) return this; for(var i=0; i<len; i++) { var elem = this[i]; // set/get SVG attribute if(elem.namespaceURI === svgns) { // Setting attribute if(value !== undefined) { elem.setAttribute(key, value); } else if($.isArray(key)) { // Getting attributes from array var j = key.length, obj = {}; while(j--) { var aname = key[j]; var attr = elem.getAttribute(aname); // This returns a number when appropriate if(attr || attr === "0") { attr = isNaN(attr)?attr:attr-0; } obj[aname] = attr; } return obj; } else if(typeof key === "object") { // Setting attributes form object for(var v in key) { elem.setAttribute(v, key[v]); } // Getting attribute } else { var attr = elem.getAttribute(key); if(attr || attr === "0") { attr = isNaN(attr)?attr:attr-0; } return attr; } } else { return proxied.apply(this, arguments); } } return this; }; }()); // Class: SvgCanvas // The main SvgCanvas class that manages all SVG-related functions // // Parameters: // container - The container HTML element that should hold the SVG root element // config - An object that contains configuration data $.SvgCanvas = function(container, config) { var isOpera = !!window.opera, isWebkit = navigator.userAgent.indexOf("AppleWebKit") != -1, // Object populated later with booleans indicating support for features support = {}, // this defines which elements and attributes that we support svgWhiteList = { // SVG Elements "a": ["class", "clip-path", "clip-rule", "fill", "fill-opacity", "fill-rule", "filter", "id", "mask", "opacity", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform", "xlink:href", "xlink:title"], "circle": ["class", "clip-path", "clip-rule", "cx", "cy", "fill", "fill-opacity", "fill-rule", "filter", "id", "mask", "opacity", "r", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform"], "clipPath": ["class", "clipPathUnits", "id"], "defs": [], "desc": [], "ellipse": ["class", "clip-path", "clip-rule", "cx", "cy", "fill", "fill-opacity", "fill-rule", "filter", "id", "mask", "opacity", "requiredFeatures", "rx", "ry", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform"], "feGaussianBlur": ["class", "color-interpolation-filters", "id", "requiredFeatures", "stdDeviation"], "filter": ["class", "color-interpolation-filters", "filterRes", "filterUnits", "height", "id", "primitiveUnits", "requiredFeatures", "width", "x", "xlink:href", "y"], "foreignObject": ["class", "font-size", "height", "id", "opacity", "requiredFeatures", "style", "transform", "width", "x", "y"], "g": ["class", "clip-path", "clip-rule", "id", "display", "fill", "fill-opacity", "fill-rule", "filter", "mask", "opacity", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform"], "image": ["class", "clip-path", "clip-rule", "filter", "height", "id", "mask", "opacity", "requiredFeatures", "style", "systemLanguage", "transform", "width", "x", "xlink:href", "xlink:title", "y"], "line": ["class", "clip-path", "clip-rule", "fill", "fill-opacity", "fill-rule", "filter", "id", "marker-end", "marker-mid", "marker-start", "mask", "opacity", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform", "x1", "x2", "y1", "y2"], "linearGradient": ["class", "id", "gradientTransform", "gradientUnits", "requiredFeatures", "spreadMethod", "systemLanguage", "x1", "x2", "xlink:href", "y1", "y2"], "marker": ["id", "class", "markerHeight", "markerUnits", "markerWidth", "orient", "preserveAspectRatio", "refX", "refY", "systemLanguage", "viewBox"], "mask": ["class", "height", "id", "maskContentUnits", "maskUnits", "width", "x", "y"], "metadata": ["class", "id"], "path": ["class", "clip-path", "clip-rule", "d", "fill", "fill-opacity", "fill-rule", "filter", "id", "marker-end", "marker-mid", "marker-start", "mask", "opacity", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform"], "pattern": ["class", "height", "id", "patternContentUnits", "patternTransform", "patternUnits", "requiredFeatures", "style", "systemLanguage", "width", "x", "xlink:href", "y"], "polygon": ["class", "clip-path", "clip-rule", "id", "fill", "fill-opacity", "fill-rule", "filter", "id", "class", "marker-end", "marker-mid", "marker-start", "mask", "opacity", "points", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform"], "polyline": ["class", "clip-path", "clip-rule", "id", "fill", "fill-opacity", "fill-rule", "filter", "marker-end", "marker-mid", "marker-start", "mask", "opacity", "points", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform"], "radialGradient": ["class", "cx", "cy", "fx", "fy", "gradientTransform", "gradientUnits", "id", "r", "requiredFeatures", "spreadMethod", "systemLanguage", "xlink:href"], "rect": ["class", "clip-path", "clip-rule", "fill", "fill-opacity", "fill-rule", "filter", "height", "id", "mask", "opacity", "requiredFeatures", "rx", "ry", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform", "width", "x", "y"], "stop": ["class", "id", "offset", "requiredFeatures", "stop-color", "stop-opacity", "style", "systemLanguage"], "svg": ["class", "clip-path", "clip-rule", "filter", "id", "height", "mask", "preserveAspectRatio", "requiredFeatures", "style", "systemLanguage", "viewBox", "width", "x", "xmlns", "xmlns:se", "xmlns:xlink", "y"], "switch": ["class", "id", "requiredFeatures", "systemLanguage"], "symbol": ["class", "fill", "fill-opacity", "fill-rule", "filter", "font-family", "font-size", "font-style", "font-weight", "id", "opacity", "preserveAspectRatio", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform", "viewBox"], "text": ["class", "clip-path", "clip-rule", "fill", "fill-opacity", "fill-rule", "filter", "font-family", "font-size", "font-style", "font-weight", "id", "mask", "opacity", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "text-anchor", "transform", "x", "xml:space", "y"], "textPath": ["class", "id", "method", "requiredFeatures", "spacing", "startOffset", "style", "systemLanguage", "transform", "xlink:href"], "title": [], "tspan": ["class", "clip-path", "clip-rule", "dx", "dy", "fill", "fill-opacity", "fill-rule", "filter", "font-family", "font-size", "font-style", "font-weight", "id", "mask", "opacity", "requiredFeatures", "rotate", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "text-anchor", "textLength", "transform", "x", "xml:space", "y"], "use": ["class", "clip-path", "clip-rule", "fill", "fill-opacity", "fill-rule", "filter", "height", "id", "mask", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "transform", "width", "x", "xlink:href", "y"], // MathML Elements "annotation": ["encoding"], "annotation-xml": ["encoding"], "maction": ["actiontype", "other", "selection"], "math": ["class", "id", "display", "xmlns"], "menclose": ["notation"], "merror": [], "mfrac": ["linethickness"], "mi": ["mathvariant"], "mmultiscripts": [], "mn": [], "mo": ["fence", "lspace", "maxsize", "minsize", "rspace", "stretchy"], "mover": [], "mpadded": ["lspace", "width"], "mphantom": [], "mprescripts": [], "mroot": [], "mrow": ["xlink:href", "xlink:type", "xmlns:xlink"], "mspace": ["depth", "height", "width"], "msqrt": [], "mstyle": ["displaystyle", "mathbackground", "mathcolor", "mathvariant", "scriptlevel"], "msub": [], "msubsup": [], "msup": [], "mtable": ["align", "columnalign", "columnlines", "columnspacing", "displaystyle", "equalcolumns", "equalrows", "frame", "rowalign", "rowlines", "rowspacing", "width"], "mtd": ["columnalign", "columnspan", "rowalign", "rowspan"], "mtext": [], "mtr": ["columnalign", "rowalign"], "munder": [], "munderover": [], "none": [], "semantics": [] }, // Interface strings, usually for title elements uiStrings = { "pathNodeTooltip": "Drag node to move it. Double-click node to change segment type", "pathCtrlPtTooltip": "Drag control point to adjust curve properties", "exportNoBlur": "Blurred elements will appear as un-blurred", "exportNoImage": "Image elements will not appear", "exportNoforeignObject": "foreignObject elements will not appear", "exportNoDashArray": "Strokes will appear filled", "exportNoText": "Text may not appear as expected" }, // Default configuration options curConfig = { show_outside_canvas: true, dimensions: [640, 480] }; // Much faster than running getBBox() every time var visElems = 'a,circle,ellipse,foreignObject,g,image,line,path,polygon,polyline,rect,svg,text,tspan,use'; // var hidElems = 'clipPath,defs,desc,feGaussianBlur,filter,linearGradient,marker,mask,metadata,pattern,radialGradient,stop,switch,symbol,title,textPath'; // Update config with new one if given if(config) { $.extend(curConfig, config); } // Static class for various utility functions var Utils = this.Utils = function() { var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; return { // Function: Utils.toXml // Converts characters in a string to XML-friendly entities. // // Example: "&" becomes "&" // // Parameters: // str - The string to be converted // // Returns: // The converted string "toXml": function(str) { return $('<p/>').text(str).html(); }, // Function: Utils.fromXml // Converts XML entities in a string to single characters. // Example: "&" becomes "&" // // Parameters: // str - The string to be converted // // Returns: // The converted string "fromXml": function(str) { return $('<p/>').html(str).text(); }, // This code was written by Tyler Akins and has been placed in the // public domain. It would be nice if you left this header intact. // Base64 code from Tyler Akins -- http://rumkin.com // schiller: Removed string concatenation in favour of Array.join() optimization, // also precalculate the size of the array needed. // Function: Utils.encode64 // Converts a string to base64 "encode64" : function(input) { // base64 strings are 4/3 larger than the original string // input = Utils.encodeUTF8(input); // convert non-ASCII characters input = Utils.convertToXMLReferences(input); if(window.btoa) return window.btoa(input); // Use native if available var output = new Array( Math.floor( (input.length + 2) / 3 ) * 4 ); var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0, p = 0; do { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; } output[p++] = _keyStr.charAt(enc1); output[p++] = _keyStr.charAt(enc2); output[p++] = _keyStr.charAt(enc3); output[p++] = _keyStr.charAt(enc4); } while (i < input.length); return output.join(''); }, // Function: Utils.decode64 // Converts a string from base64 "decode64" : function(input) { if(window.atob) return window.atob(input); var output = ""; var chr1, chr2, chr3 = ""; var enc1, enc2, enc3, enc4 = ""; var i = 0; // remove all characters that are not A-Z, a-z, 0-9, +, /, or = input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); do { enc1 = _keyStr.indexOf(input.charAt(i++)); enc2 = _keyStr.indexOf(input.charAt(i++)); enc3 = _keyStr.indexOf(input.charAt(i++)); enc4 = _keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); } chr1 = chr2 = chr3 = ""; enc1 = enc2 = enc3 = enc4 = ""; } while (i < input.length); return unescape(output); }, // Currently not being used, so commented out for now // based on http://phpjs.org/functions/utf8_encode:577 // codedread:does not seem to work with webkit-based browsers on OSX // "encodeUTF8": function(input) { // //return unescape(encodeURIComponent(input)); //may or may not work // var output = ''; // for (var n = 0; n < input.length; n++){ // var c = input.charCodeAt(n); // if (c < 128) { // output += input[n]; // } // else if (c > 127) { // if (c < 2048){ // output += String.fromCharCode((c >> 6) | 192); // } // else { // output += String.fromCharCode((c >> 12) | 224) + String.fromCharCode((c >> 6) & 63 | 128); // } // output += String.fromCharCode((c & 63) | 128); // } // } // return output; // }, // Function: Utils.convertToXMLReferences // Converts a string to use XML references "convertToXMLReferences": function(input) { var output = ''; for (var n = 0; n < input.length; n++){ var c = input.charCodeAt(n); if (c < 128) { output += input[n]; } else if(c > 127) { output += ("&#" + c + ";"); } } return output; }, // Function: rectsIntersect // Check if two rectangles (BBoxes objects) intersect each other // // Paramaters: // r1 - The first BBox-like object // r2 - The second BBox-like object // // Returns: // Boolean that's true if rectangles intersect "rectsIntersect": function(r1, r2) { return r2.x < (r1.x+r1.width) && (r2.x+r2.width) > r1.x && r2.y < (r1.y+r1.height) && (r2.y+r2.height) > r1.y; }, // Function: snapToAngle // Returns a 45 degree angle coordinate associated with the two given // coordinates // // Parameters: // x1 - First coordinate's x value // x2 - Second coordinate's x value // y1 - First coordinate's y value // y2 - Second coordinate's y value // // Returns: // Object with the following values: // x - The angle-snapped x value // y - The angle-snapped y value // snapangle - The angle at which to snap "snapToAngle": function(x1,y1,x2,y2) { var snap = Math.PI/4; // 45 degrees var dx = x2 - x1; var dy = y2 - y1; var angle = Math.atan2(dy,dx); var dist = Math.sqrt(dx * dx + dy * dy); var snapangle= Math.round(angle/snap)*snap; var x = x1 + dist*Math.cos(snapangle); var y = y1 + dist*Math.sin(snapangle); //console.log(x1,y1,x2,y2,x,y,angle) return {x:x, y:y, a:snapangle}; }, // Function: snapToGrid // round value to for snapping "snapToGrid" : function(value){ var stepSize = curConfig.snappingStep; value = Math.round(value/stepSize)*stepSize; return value; }, // Function: text2xml // Cross-browser compatible method of converting a string to an XML tree // found this function here: http://groups.google.com/group/jquery-dev/browse_thread/thread/c6d11387c580a77f "text2xml": function(sXML) { if(sXML.indexOf('<svg:svg') !== -1) { sXML = sXML.replace(/<(\/?)svg:/g, '<$1').replace('xmlns:svg', 'xmlns'); } var out; try{ var dXML = (window.DOMParser)?new DOMParser():new ActiveXObject("Microsoft.XMLDOM"); dXML.async = false; } catch(e){ throw new Error("XML Parser could not be instantiated"); }; try{ if(dXML.loadXML) out = (dXML.loadXML(sXML))?dXML:false; else out = dXML.parseFromString(sXML, "text/xml"); } catch(e){ throw new Error("Error parsing XML string"); }; return out; } } }(); var snapToGrid = Utils.snapToGrid; var elData = $.data; // TODO: declare the variables and set them as null, then move this setup stuff to // an initialization function - probably just use clear() var canvas = this, // Namespace constants svgns = "http://www.w3.org/2000/svg", xlinkns = "http://www.w3.org/1999/xlink", xmlns = "http://www.w3.org/XML/1998/namespace", xmlnsns = "http://www.w3.org/2000/xmlns/", // see http://www.w3.org/TR/REC-xml-names/#xmlReserved se_ns = "http://svg-edit.googlecode.com", htmlns = "http://www.w3.org/1999/xhtml", mathns = "http://www.w3.org/1998/Math/MathML", // Map of units, those set to 0 are updated later based on calculations unit_types = {'em':0,'ex':0,'px':1,'cm':35.43307,'mm':3.543307,'in':90,'pt':1.25,'pc':15,'%':0}, //nonce to uniquify id's nonce = Math.floor(Math.random()*100001), // Boolean to indicate whether or not IDs given to elements should be random randomize_ids = false, // "document" element associated with the container (same as window.document using default svg-editor.js) svgdoc = container.ownerDocument, // Array with width/height of canvas dimensions = curConfig.dimensions; // Create Root SVG element. This is a container for the document being edited, not the document itself. var svgroot = svgdoc.importNode(Utils.text2xml('<svg id="svgroot" xmlns="' + svgns + '" xlinkns="' + xlinkns + '" ' + 'width="' + dimensions[0] + '" height="' + dimensions[1] + '" x="' + dimensions[0] + '" y="' + dimensions[1] + '" overflow="visible">' + '<defs>' + '<filter id="canvashadow" filterUnits="objectBoundingBox">' + '<feGaussianBlur in="SourceAlpha" stdDeviation="4" result="blur"/>'+ '<feOffset in="blur" dx="5" dy="5" result="offsetBlur"/>'+ '<feMerge>'+ '<feMergeNode in="offsetBlur"/>'+ '<feMergeNode in="SourceGraphic"/>'+ '</feMerge>'+ '</filter>'+ '</defs>'+ '</svg>').documentElement, true); container.appendChild(svgroot); // The actual element that represents the final output SVG element var svgcontent = svgdoc.createElementNS(svgns, "svg"); $(svgcontent).attr({ id: 'svgcontent', width: dimensions[0], height: dimensions[1], x: dimensions[0], y: dimensions[1], overflow: curConfig.show_outside_canvas?'visible':'hidden', xmlns: svgns, "xmlns:se": se_ns, "xmlns:xlink": xlinkns }).appendTo(svgroot); // Set nonce if randomize_ids = true if (randomize_ids) svgcontent.setAttributeNS(se_ns, 'se:nonce', nonce); // map namespace URIs to prefixes var nsMap = {}; nsMap[xlinkns] = 'xlink'; nsMap[xmlns] = 'xml'; nsMap[xmlnsns] = 'xmlns'; nsMap[se_ns] = 'se'; nsMap[htmlns] = 'xhtml'; nsMap[mathns] = 'mathml'; // map prefixes to namespace URIs var nsRevMap = {}; $.each(nsMap, function(key,value){ nsRevMap[value] = key; }); // Produce a Namespace-aware version of svgWhitelist var svgWhiteListNS = {}; $.each(svgWhiteList, function(elt,atts){ var attNS = {}; $.each(atts, function(i, att){ if (att.indexOf(':') != -1) { var v = att.split(':'); attNS[v[1]] = nsRevMap[v[0]]; } else { attNS[att] = att == 'xmlns' ? xmlnsns : null; } }); svgWhiteListNS[elt] = attNS; }); // Animation element to change the opacity of any newly created element var opac_ani = document.createElementNS(svgns, 'animate'); $(opac_ani).attr({ attributeName: 'opacity', begin: 'indefinite', dur: 1, fill: 'freeze' }).appendTo(svgroot); // Group: Unit conversion functions // Set the scope for these functions var convertToNum, convertToUnit, setUnitAttr; (function() { var w_attrs = ['x', 'x1', 'cx', 'rx', 'width']; var h_attrs = ['y', 'y1', 'cy', 'ry', 'height']; var unit_attrs = $.merge(['r','radius'], w_attrs); $.merge(unit_attrs, h_attrs); // Function: convertToNum // Converts given values to numbers. Attributes must be supplied in // case a percentage is given // // Parameters: // attr - String with the name of the attribute associated with the value // val - String with the attribute value to convert convertToNum = function(attr, val) { // Return a number if that's what it already is if(!isNaN(val)) return val-0; if(val.substr(-1) === '%') { // Deal with percentage, depends on attribute var num = val.substr(0, val.length-1)/100; var res = getResolution(); if($.inArray(attr, w_attrs) !== -1) { return num * res.w; } else if($.inArray(attr, h_attrs) !== -1) { return num * res.h; } else { return num * Math.sqrt((res.w*res.w) + (res.h*res.h))/Math.sqrt(2); } } else { var unit = val.substr(-2); var num = val.substr(0, val.length-2); // Note that this multiplication turns the string into a number return num * unit_types[unit]; } }; // Function: setUnitAttr // Sets an element's attribute based on the unit in its current value. // // Parameters: // elem - DOM element to be changed // attr - String with the name of the attribute associated with the value // val - String with the attribute value to convert setUnitAttr = function(elem, attr, val) { if(!isNaN(val)) { // New value is a number, so check currently used unit var old_val = elem.getAttribute(attr); if(old_val !== null && isNaN(old_val)) { // Old value was a number, so get unit, then convert var unit; if(old_val.substr(-1) === '%') { var res = getResolution(); unit = '%'; val *= 100; if($.inArray(attr, w_attrs) !== -1) { val = val / res.w; } else if($.inArray(attr, h_attrs) !== -1) { val = val / res.h; } else { return val / Math.sqrt((res.w*res.w) + (res.h*res.h))/Math.sqrt(2); } } else { unit = old_val.substr(-2); val = val / unit_types[unit]; } val += unit; } } elem.setAttribute(attr, val); } // Function: isValidUnit // Check if an attribute's value is in a valid format // // Parameters: // attr - String with the name of the attribute associated with the value // val - String with the attribute value to check canvas.isValidUnit = function(attr, val) { var valid = false; if($.inArray(attr, unit_attrs) != -1) { // True if it's just a number if(!isNaN(val)) { valid = true; } else { // Not a number, check if it has a valid unit val = val.toLowerCase(); $.each(unit_types, function(unit) { if(valid) return; var re = new RegExp('^-?[\\d\\.]+' + unit + '$'); if(re.test(val)) valid = true; }); } } else if (attr == "id") { // if we're trying to change the id, make sure it's not already present in the doc // and the id value is valid. var result = false; // because getElem() can throw an exception in the case of an invalid id // (according to http://www.w3.org/TR/xml-id/ IDs must be a NCName) // we wrap it in an exception and only return true if the ID was valid and // not already present try { var elem = getElem(val); result = (elem == null); } catch(e) {} return result; } else valid = true; return valid; } })(); // Group: Undo/Redo history management this.undoCmd = {}; // Function: ChangeElementCommand // History command to make a change to an element. // Usually an attribute change, but can also be textcontent. // // Parameters: // elem - The DOM element that was changed // attrs - An object with the attributes to be changed and the values they had *before* the change // text - An optional string visible to user related to this change var ChangeElementCommand = this.undoCmd.changeElement = function(elem, attrs, text) { this.elem = elem; this.text = text ? ("Change " + elem.tagName + " " + text) : ("Change " + elem.tagName); this.newValues = {}; this.oldValues = attrs; for (var attr in attrs) { if (attr == "#text") this.newValues[attr] = elem.textContent; else if (attr == "#href") this.newValues[attr] = getHref(elem); else this.newValues[attr] = elem.getAttribute(attr); } // Function: ChangeElementCommand.apply // Performs the stored change action this.apply = function() { var bChangedTransform = false; for(var attr in this.newValues ) { if (this.newValues[attr]) { if (attr == "#text") this.elem.textContent = this.newValues[attr]; else if (attr == "#href") setHref(this.elem, this.newValues[attr]) else this.elem.setAttribute(attr, this.newValues[attr]); } else { if (attr == "#text") this.elem.textContent = ""; else { this.elem.setAttribute(attr, ""); this.elem.removeAttribute(attr); } } if (attr == "transform") { bChangedTransform = true; } else if (attr == "stdDeviation") { canvas.setBlurOffsets(this.elem.parentNode, this.newValues[attr]); } } // relocate rotational transform, if necessary if(!bChangedTransform) { var angle = getRotationAngle(elem); if (angle) { var bbox = elem.getBBox(); var cx = bbox.x + bbox.width/2, cy = bbox.y + bbox.height/2; var rotate = ["rotate(", angle, " ", cx, ",", cy, ")"].join(''); if (rotate != elem.getAttribute("transform")) { elem.setAttribute("transform", rotate); } } } // if we are changing layer names, re-identify all layers if (this.elem.tagName == "title" && this.elem.parentNode.parentNode == svgcontent) { identifyLayers(); } return true; }; // Function: ChangeElementCommand.unapply // Reverses the stored change action this.unapply = function() { var bChangedTransform = false; for(var attr in this.oldValues ) { if (this.oldValues[attr]) { if (attr == "#text") this.elem.textContent = this.oldValues[attr]; else if (attr == "#href") setHref(this.elem, this.oldValues[attr]); else this.elem.setAttribute(attr, this.oldValues[attr]); if (attr == "stdDeviation") canvas.setBlurOffsets(this.elem.parentNode, this.oldValues[attr]); } else { if (attr == "#text") this.elem.textContent = ""; else this.elem.removeAttribute(attr); } if (attr == "transform") { bChangedTransform = true; } } // relocate rotational transform, if necessary if(!bChangedTransform) { var angle = getRotationAngle(elem); if (angle) { var bbox = elem.getBBox(); var cx = bbox.x + bbox.width/2, cy = bbox.y + bbox.height/2; var rotate = ["rotate(", angle, " ", cx, ",", cy, ")"].join(''); if (rotate != elem.getAttribute("transform")) { elem.setAttribute("transform", rotate); } } } // if we are changing layer names, re-identify all layers if (this.elem.tagName == "title" && this.elem.parentNode.parentNode == svgcontent) { identifyLayers(); } // Remove transformlist to prevent confusion that causes bugs like 575. if (svgTransformLists[this.elem.id]) { delete svgTransformLists[this.elem.id]; } return true; }; // Function: ChangeElementCommand.elements // Returns array with element associated with this command this.elements = function() { return [this.elem]; } } // Function: InsertElementCommand // History command for an element that was added to the DOM // // Parameters: // elem - The newly added DOM element // text - An optional string visible to user related to this change var InsertElementCommand = this.undoCmd.insertElement = function(elem, text) { this.elem = elem; this.text = text || ("Create " + elem.tagName); this.parent = elem.parentNode; // Function: InsertElementCommand.apply // Re-Inserts the new element this.apply = function() { this.elem = this.parent.insertBefore(this.elem, this.elem.nextSibling); if (this.parent == svgcontent) { identifyLayers(); } }; // Function: InsertElementCommand.unapply // Removes the element this.unapply = function() { this.parent = this.elem.parentNode; this.elem = this.elem.parentNode.removeChild(this.elem); if (this.parent == svgcontent) { identifyLayers(); } }; // Function: InsertElementCommand.elements // Returns array with element associated with this command this.elements = function() { return [this.elem]; }; } // Function: RemoveElementCommand // History command for an element removed from the DOM // // Parameters: // elem - The removed DOM element // parent - The DOM element's parent // text - An optional string visible to user related to this change var RemoveElementCommand = this.undoCmd.removeElement = function(elem, parent, text) { this.elem = elem; this.text = text || ("Delete " + elem.tagName); this.parent = parent; // Function: RemoveElementCommand.apply // Re-removes the new element this.apply = function() { if (svgTransformLists[this.elem.id]) { delete svgTransformLists[this.elem.id]; } this.parent = this.elem.parentNode; this.elem = this.parent.removeChild(this.elem); if (this.parent == svgcontent) { identifyLayers(); } }; // Function: RemoveElementCommand.unapply // Re-adds the new element this.unapply = function() { if (svgTransformLists[this.elem.id]) { delete svgTransformLists[this.elem.id]; } this.elem = this.parent.insertBefore(this.elem, this.elem.nextSibling); if (this.parent == svgcontent) { identifyLayers(); } }; // Function: RemoveElementCommand.elements // Returns array with element associated with this command this.elements = function() { return [this.elem]; }; // special hack for webkit: remove this element's entry in the svgTransformLists map if (svgTransformLists[elem.id]) { delete svgTransformLists[elem.id]; } } // Function: MoveElementCommand // History command for an element that had its DOM position changed // // Parameters: // elem - The DOM element that was moved // oldNextSibling - The element's next sibling before it was moved // oldParent - The element's parent before it was moved // text - An optional string visible to user related to this change var MoveElementCommand = this.undoCmd.moveElement = function(elem, oldNextSibling, oldParent, text) { this.elem = elem; this.text = text ? ("Move " + elem.tagName + " to " + text) : ("Move " + elem.tagName); this.oldNextSibling = oldNextSibling; this.oldParent = oldParent; this.newNextSibling = elem.nextSibling; this.newParent = elem.parentNode; // Function: MoveElementCommand.unapply // Re-positions the element this.apply = function() { this.elem = this.newParent.insertBefore(this.elem, this.newNextSibling); if (this.newParent == svgcontent) { identifyLayers(); } }; // Function: MoveElementCommand.unapply // Positions the element back to its original location this.unapply = function() { this.elem = this.oldParent.insertBefore(this.elem, this.oldNextSibling); if (this.oldParent == svgcontent) { identifyLayers(); } }; // Function: MoveElementCommand.elements // Returns array with element associated with this command this.elements = function() { return [this.elem]; }; } // TODO: create a 'typing' command object that tracks changes in text // if a new Typing command is created and the top command on the stack is also a Typing // and they both affect the same element, then collapse the two commands into one // Function: BatchCommand // History command that can contain/execute multiple other commands // // Parameters: // text - An optional string visible to user related to this change var BatchCommand = this.undoCmd.batch = function(text) { this.text = text || "Batch Command"; this.stack = []; // Function: BatchCommand.apply // Runs "apply" on all subcommands this.apply = function() { var len = this.stack.length; for (var i = 0; i < len; ++i) { this.stack[i].apply(); } }; // Function: BatchCommand.unapply // Runs "unapply" on all subcommands this.unapply = function() { for (var i = this.stack.length-1; i >= 0; i--) { this.stack[i].unapply(); } }; // Function: BatchCommand.elements // Iterate through all our subcommands and returns all the elements we are changing this.elements = function() { var elems = []; var cmd = this.stack.length; while (cmd--) { var thisElems = this.stack[cmd].elements(); var elem = thisElems.length; while (elem--) { if (elems.indexOf(thisElems[elem]) == -1) elems.push(thisElems[elem]); } } return elems; }; // Function: BatchCommand.addSubCommand // Adds a given command to the history stack // // Parameters: // cmd - The undo command object to add this.addSubCommand = function(cmd) { this.stack.push(cmd); }; // Function: BatchCommand.isEmpty // Returns a boolean indicating whether or not the batch command is empty this.isEmpty = function() { return this.stack.length == 0; }; } // Set scope for these undo functions var resetUndoStack, addCommandToHistory; // Undo/redo stack related functions (function(c) { var undoStackPointer = 0, undoStack = []; // Function: resetUndoStack // Resets the undo stack, effectively clearing the undo/redo history resetUndoStack = function() { undoStack = []; undoStackPointer = 0; }; c.undoMgr = { reset: function() { undoStack = []; undoStackPointer = 0; }, // Function: undoMgr.getUndoStackSize // Returns: // Integer with the current size of the undo history stack getUndoStackSize: function() { return undoStackPointer; }, // Function: undoMgr.getRedoStackSize // Returns: // Integer with the current size of the redo history stack getRedoStackSize: function() { return undoStack.length - undoStackPointer; }, // Function: undoMgr.getNextUndoCommandText // Returns: // String associated with the next undo command getNextUndoCommandText: function() { if (undoStackPointer > 0) return undoStack[undoStackPointer-1].text; return ""; }, // Function: undoMgr.getNextRedoCommandText // Returns: // String associated with the next redo command getNextRedoCommandText: function() { if (undoStackPointer < undoStack.length) return undoStack[undoStackPointer].text; return ""; }, // Function: undoMgr.undo // Performs an undo step undo: function() { if (undoStackPointer > 0) { c.clearSelection(); var cmd = undoStack[--undoStackPointer]; cmd.unapply(); pathActions.clear(); call("changed", cmd.elements()); } }, // Function: undoMgr.redo // Performs a redo step redo: function() { if (undoStackPointer < undoStack.length && undoStack.length > 0) { c.clearSelection(); var cmd = undoStack[undoStackPointer++]; cmd.apply(); pathActions.clear(); call("changed", cmd.elements()); } } }; // Function: addCommandToHistory // Adds a command object to the undo history stack // // Parameters: // cmd - The command object to add addCommandToHistory = c.undoCmd.add = function(cmd) { // FIXME: we MUST compress consecutive text changes to the same element // (right now each keystroke is saved as a separate command that includes the // entire text contents of the text element) // TODO: consider limiting the history that we store here (need to do some slicing) // if our stack pointer is not at the end, then we have to remove // all commands after the pointer and insert the new command if (undoStackPointer < undoStack.length && undoStack.length > 0) { undoStack = undoStack.splice(0, undoStackPointer); } undoStack.push(cmd); undoStackPointer = undoStack.length; }; }(canvas)); (function(c) { // New functions for refactoring of Undo/Redo // this is the stack that stores the original values, the elements and // the attribute name for begin/finish var undoChangeStackPointer = -1; var undoableChangeStack = []; // Function: beginUndoableChange // This function tells the canvas to remember the old values of the // attrName attribute for each element sent in. The elements and values // are stored on a stack, so the next call to finishUndoableChange() will // pop the elements and old values off the stack, gets the current values // from the DOM and uses all of these to construct the undo-able command. // // Parameters: // attrName - The name of the attribute being changed // elems - Array of DOM elements being changed c.beginUndoableChange = function(attrName, elems) { var p = ++undoChangeStackPointer; var i = elems.length; var oldValues = new Array(i), elements = new Array(i); while (i--) { var elem = elems[i]; if (elem == null) continue; elements[i] = elem; oldValues[i] = elem.getAttribute(attrName); } undoableChangeStack[p] = {'attrName': attrName, 'oldValues': oldValues, 'elements': elements}; }; // Function: finishUndoableChange // This function returns a BatchCommand object which summarizes the // change since beginUndoableChange was called. The command can then // be added to the command history // // Returns: // Batch command object with resulting changes c.finishUndoableChange = function() { var p = undoChangeStackPointer--; var changeset = undoableChangeStack[p]; var i = changeset['elements'].length; var attrName = changeset['attrName']; var batchCmd = new BatchCommand("Change " + attrName); while (i--) { var elem = changeset['elements'][i]; if (elem == null) continue; var changes = {}; changes[attrName] = changeset['oldValues'][i]; if (changes[attrName] != elem.getAttribute(attrName)) { batchCmd.addSubCommand(new ChangeElementCommand(elem, changes, attrName)); } } undoableChangeStack[p] = null; return batchCmd; }; }(canvas)); // Put SelectorManager in this scope var SelectorManager; (function() { // Interface: Selector // Private class for DOM element selection boxes // // Parameters: // id - integer to internally indentify the selector // elem - DOM element associated with this selector function Selector(id, elem) { // this is the selector's unique number this.id = id; // this holds a reference to the element for which this selector is being used this.selectedElement = elem; // this is a flag used internally to track whether the selector is being used or not this.locked = true; // Function: Selector.reset // Used to reset the id and element that the selector is attached to // // Parameters: // e - DOM element associated with this selector this.reset = function(e) { this.locked = true; this.selectedElement = e; this.resize(); this.selectorGroup.setAttribute("display", "inline"); }; // this holds a reference to the <g> element that holds all visual elements of the selector this.selectorGroup = addSvgElementFromJson({ "element": "g", "attr": {"id": ("selectorGroup"+this.id)} }); // this holds a reference to the path rect this.selectorRect = this.selectorGroup.appendChild( addSvgElementFromJson({ "element": "path", "attr": { "id": ("selectedBox"+this.id), "fill": "none", "stroke": "#22C", "stroke-width": "1", "stroke-dasharray": "5,5", // need to specify this so that the rect is not selectable "style": "pointer-events:none" } }) ); // this holds a reference to the grip coordinates for this selector this.gripCoords = { "nw":null, "n":null, "ne":null, "e":null, "se":null, "s":null, "sw":null, "w":null }; // Function: Selector.showGrips // Show the resize grips of this selector // // Parameters: // show - boolean indicating whether grips should be shown or not this.showGrips = function(show) { // TODO: use suspendRedraw() here var bShow = show ? "inline" : "none"; selectorManager.selectorGripsGroup.setAttribute("display", bShow); var elem = this.selectedElement; if(elem && show) { this.selectorGroup.appendChild(selectorManager.selectorGripsGroup); this.updateGripCursors(getRotationAngle(elem)); } }; // Function: Selector.updateGripCursors // Updates cursors for corner grips on rotation so arrows point the right way // // Parameters: // angle - Float indicating current rotation angle in degrees this.updateGripCursors = function(angle) { var dir_arr = []; var steps = Math.round(angle / 45); if(steps < 0) steps += 8; for (var dir in selectorManager.selectorGrips) { dir_arr.push(dir); } while(steps > 0) { dir_arr.push(dir_arr.shift()); steps--; } var i = 0; for (var dir in selectorManager.selectorGrips) { selectorManager.selectorGrips[dir].setAttribute('style', ("cursor:" + dir_arr[i] + "-resize")); i++; }; }; // Function: Selector.resize // Updates the selector to match the element's size this.resize = function() { var selectedBox = this.selectorRect, mgr = selectorManager, selectedGrips = mgr.selectorGrips, selected = this.selectedElement, sw = selected.getAttribute("stroke-width"); var offset = 1/current_zoom; if (selected.getAttribute("stroke") != "none" && !isNaN(sw)) { offset += (sw/2); } if (selected.tagName == "text") { offset += 2/current_zoom; } var bbox = getBBox(selected); if(selected.tagName == 'g' && !$(selected).data('gsvg')) { // The bbox for a group does not include stroke vals, so we // get the bbox based on its children. var stroked_bbox = getStrokedBBox(selected.childNodes); if(stroked_bbox) { var bb = {}; $.each(bbox, function(key, val) { bb[key] = stroked_bbox[key]; }); bbox = bb; } } // loop and transform our bounding box until we reach our first rotation var m = getMatrix(selected); // This should probably be handled somewhere else, but for now // it keeps the selection box correctly positioned when zoomed m.e *= current_zoom; m.f *= current_zoom; // apply the transforms var l=bbox.x-offset, t=bbox.y-offset, w=bbox.width+(offset*2), h=bbox.height+(offset*2), bbox = {x:l, y:t, width:w, height:h}; // we need to handle temporary transforms too // if skewed, get its transformed box, then find its axis-aligned bbox //* var nbox = transformBox(l*current_zoom, t*current_zoom, w*current_zoom, h*current_zoom, m), nbax = nbox.aabox.x, nbay = nbox.aabox.y, nbaw = nbox.aabox.width, nbah = nbox.aabox.height; // now if the shape is rotated, un-rotate it var cx = nbax + nbaw/2, cy = nbay + nbah/2; var angle = getRotationAngle(selected); if (angle) { var rot = svgroot.createSVGTransform(); rot.setRotate(-angle,cx,cy); var rotm = rot.matrix; nbox.tl = transformPoint(nbox.tl.x,nbox.tl.y,rotm); nbox.tr = transformPoint(nbox.tr.x,nbox.tr.y,rotm); nbox.bl = transformPoint(nbox.bl.x,nbox.bl.y,rotm); nbox.br = transformPoint(nbox.br.x,nbox.br.y,rotm); // calculate the axis-aligned bbox var minx = nbox.tl.x, miny = nbox.tl.y, maxx = nbox.tl.x, maxy = nbox.tl.y; minx = Math.min(minx, Math.min(nbox.tr.x, Math.min(nbox.bl.x, nbox.br.x) ) ); miny = Math.min(miny, Math.min(nbox.tr.y, Math.min(nbox.bl.y, nbox.br.y) ) ); maxx = Math.max(maxx, Math.max(nbox.tr.x, Math.max(nbox.bl.x, nbox.br.x) ) ); maxy = Math.max(maxy, Math.max(nbox.tr.y, Math.max(nbox.bl.y, nbox.br.y) ) ); nbax = minx; nbay = miny; nbaw = (maxx-minx); nbah = (maxy-miny); } var sr_handle = svgroot.suspendRedraw(100); var dstr = "M" + nbax + "," + nbay + " L" + (nbax+nbaw) + "," + nbay + " " + (nbax+nbaw) + "," + (nbay+nbah) + " " + nbax + "," + (nbay+nbah) + "z"; assignAttributes(selectedBox, {'d': dstr}); this.gripCoords = { nw: [nbax, nbay], ne: [nbax+nbaw, nbay], sw: [nbax, nbay+nbah], se: [nbax+nbaw, nbay+nbah], n: [nbax + (nbaw)/2, nbay], w: [nbax, nbay + (nbah)/2], e: [nbax + nbaw, nbay + (nbah)/2], s: [nbax + (nbaw)/2, nbay + nbah] }; if(selected == selectedElements[0]) { for(var dir in this.gripCoords) { var coords = this.gripCoords[dir]; assignAttributes(selectedGrips[dir], { cx: coords[0], cy: coords[1] }); }; } if (angle) { this.selectorGroup.setAttribute("transform", "rotate(" + [angle,cx,cy].join(",") + ")"); } else { this.selectorGroup.setAttribute("transform", ""); } // we want to go 20 pixels in the negative transformed y direction, ignoring scale assignAttributes(mgr.rotateGripConnector, { x1: nbax + (nbaw)/2, y1: nbay, x2: nbax + (nbaw)/2, y2: nbay- 20}); assignAttributes(mgr.rotateGrip, { cx: nbax + (nbaw)/2, cy: nbay - 20 }); svgroot.unsuspendRedraw(sr_handle); }; // now initialize the selector this.reset(elem); }; // Interface: SelectorManager // Public class to manage all selector objects (selection boxes) SelectorManager = function() { // this will hold the <g> element that contains all selector rects/grips this.selectorParentGroup = null; // this is a special rect that is used for multi-select this.rubberBandBox = null; // this will hold objects of type Selector (see above) this.selectors = []; // this holds a map of SVG elements to their Selector object this.selectorMap = {}; // local reference to this object var mgr = this; // Function: SelectorManager.initGroup // Resets the parent selector group element this.initGroup = function() { // remove old selector parent group if it existed if (mgr.selectorParentGroup && mgr.selectorParentGroup.parentNode) { mgr.selectorParentGroup.parentNode.removeChild(mgr.selectorParentGroup); } // create parent selector group and add it to svgroot mgr.selectorParentGroup = svgdoc.createElementNS(svgns, "g"); mgr.selectorParentGroup.setAttribute("id", "selectorParentGroup"); mgr.selectorGripsGroup = svgdoc.createElementNS(svgns, "g"); mgr.selectorGripsGroup.setAttribute('display','none'); svgroot.appendChild(mgr.selectorParentGroup); mgr.selectorParentGroup.appendChild(mgr.selectorGripsGroup); mgr.selectorMap = {}; mgr.selectors = []; mgr.rubberBandBox = null; // this holds a reference to the grip elements mgr.selectorGrips = { "nw":null, "n":null, "ne":null, "e":null, "se":null, "s":null, "sw":null, "w":null }; // add the corner grips for (var dir in mgr.selectorGrips) { var grip = addSvgElementFromJson({ "element": "circle", "attr": { "id": ("selectorGrip_resize_" + dir), "fill": "#22C", "r": 4, "style": ("cursor:" + dir + "-resize"), // This expands the mouse-able area of the grips making them // easier to grab with the mouse. // This works in Opera and WebKit, but does not work in Firefox // see https://bugzilla.mozilla.org/show_bug.cgi?id=500174 "stroke-width": 2, "pointer-events":"all" } }); elData(grip, "dir", dir); elData(grip, "type", "resize"); this.selectorGrips[dir] = mgr.selectorGripsGroup.appendChild(grip); } // add rotator elems this.rotateGripConnector = this.selectorGripsGroup.appendChild( addSvgElementFromJson({ "element": "line", "attr": { "id": ("selectorGrip_rotateconnector"), "stroke": "#22C", "stroke-width": "1" } }) ); this.rotateGrip = this.selectorGripsGroup.appendChild( addSvgElementFromJson({ "element": "circle", "attr": { "id": "selectorGrip_rotate", "fill": "lime", "r": 4, "stroke": "#22C", "stroke-width": 2, "style": "cursor:url(" + curConfig.imgPath + "rotate.png) 12 12, auto;" } }) ); elData(this.rotateGrip, "type", "rotate"); if($("#canvasBackground").length) return; var canvasbg = svgdoc.createElementNS(svgns, "svg"); var dims = curConfig.dimensions; assignAttributes(canvasbg, { 'id':'canvasBackground', 'width': dims[0], 'height': dims[1], 'x': 0, 'y': 0, 'overflow': 'visible', 'style': 'pointer-events:none' }); var rect = svgdoc.createElementNS(svgns, "rect"); assignAttributes(rect, { 'width': '100%', 'height': '100%', 'x': 0, 'y': 0, 'stroke-width': 1, 'stroke': '#000', 'fill': '#FFF', 'style': 'pointer-events:none' }); // Both Firefox and WebKit are too slow with this filter region (especially at higher // zoom levels) and Opera has at least one bug // if (!window.opera) rect.setAttribute('filter', 'url(#canvashadow)'); canvasbg.appendChild(rect); svgroot.insertBefore(canvasbg, svgcontent); }; // Function: SelectorManager.requestSelector // Returns the selector based on the given element // // Parameters: // elem - DOM element to get the selector for this.requestSelector = function(elem) { if (elem == null) return null; var N = this.selectors.length; // if we've already acquired one for this element, return it if (typeof(this.selectorMap[elem.id]) == "object") { this.selectorMap[elem.id].locked = true; return this.selectorMap[elem.id]; } for (var i = 0; i < N; ++i) { if (this.selectors[i] && !this.selectors[i].locked) { this.selectors[i].locked = true; this.selectors[i].reset(elem); this.selectorMap[elem.id] = this.selectors[i]; return this.selectors[i]; } } // if we reached here, no available selectors were found, we create one this.selectors[N] = new Selector(N, elem); this.selectorParentGroup.appendChild(this.selectors[N].selectorGroup); this.selectorMap[elem.id] = this.selectors[N]; return this.selectors[N]; }; // Function: SelectorManager.releaseSelector // Removes the selector of the given element (hides selection box) // // Parameters: // elem - DOM element to remove the selector for this.releaseSelector = function(elem) { if (elem == null) return; var N = this.selectors.length, sel = this.selectorMap[elem.id]; for (var i = 0; i < N; ++i) { if (this.selectors[i] && this.selectors[i] == sel) { if (sel.locked == false) { console.log("WARNING! selector was released but was already unlocked"); } delete this.selectorMap[elem.id]; sel.locked = false; sel.selectedElement = null; sel.showGrips(false); // remove from DOM and store reference in JS but only if it exists in the DOM try { sel.selectorGroup.setAttribute("display", "none"); } catch(e) { } break; } } }; // Function: SelectorManager.getRubberBandBox // Returns the rubberBandBox DOM element. This is the rectangle drawn by the user for selecting/zooming this.getRubberBandBox = function() { if (this.rubberBandBox == null) { this.rubberBandBox = this.selectorParentGroup.appendChild( addSvgElementFromJson({ "element": "rect", "attr": { "id": "selectorRubberBand", "fill": "#22C", "fill-opacity": 0.15, "stroke": "#22C", "stroke-width": 0.5, "display": "none", "style": "pointer-events:none" } })); } return this.rubberBandBox; }; this.initGroup(); }; }()); // ************************************************************************************** // SVGTransformList implementation for Webkit // These methods do not currently raise any exceptions. // These methods also do not check that transforms are being inserted or handle if // a transform is already in the list, etc. This is basically implementing as much // of SVGTransformList that we need to get the job done. // // interface SVGEditTransformList { // attribute unsigned long numberOfItems; // void clear ( ) // SVGTransform initialize ( in SVGTransform newItem ) // SVGTransform getItem ( in unsigned long index ) // SVGTransform insertItemBefore ( in SVGTransform newItem, in unsigned long index ) // SVGTransform replaceItem ( in SVGTransform newItem, in unsigned long index ) // SVGTransform removeItem ( in unsigned long index ) // SVGTransform appendItem ( in SVGTransform newItem ) // NOT IMPLEMENTED: SVGTransform createSVGTransformFromMatrix ( in SVGMatrix matrix ); // NOT IMPLEMENTED: SVGTransform consolidate ( ); // } // ************************************************************************************** var svgTransformLists = {}; var SVGEditTransformList = function(elem) { function transformToString(xform) { var m = xform.matrix, text = ""; switch(xform.type) { case 1: // MATRIX text = "matrix(" + [m.a,m.b,m.c,m.d,m.e,m.f].join(",") + ")"; break; case 2: // TRANSLATE text = "translate(" + m.e + "," + m.f + ")"; break; case 3: // SCALE if (m.a == m.d) text = "scale(" + m.a + ")"; else text = "scale(" + m.a + "," + m.d + ")"; break; case 4: // ROTATE var cx = 0, cy = 0; // this prevents divide by zero if (xform.angle != 0) { var K = 1 - m.a; cy = ( K * m.f + m.b*m.e ) / ( K*K + m.b*m.b ); cx = ( m.e - m.b * cy ) / K; } text = "rotate(" + xform.angle + " " + cx + "," + cy + ")"; break; } return text; }; this._elem = elem || null; this._xforms = []; // TODO: how do we capture the undo-ability in the changed transform list? this._update = function() { var tstr = ""; var concatMatrix = svgroot.createSVGMatrix(); for (var i = 0; i < this.numberOfItems; ++i) { var xform = this._list.getItem(i); tstr += transformToString(xform) + " "; } this._elem.setAttribute("transform", tstr); }; this._list = this; this._init = function() { // Transform attribute parser var str = this._elem.getAttribute("transform"); if(!str) return; // TODO: Add skew support in future var re = /\s*((scale|matrix|rotate|translate)\s*\(.*?\))\s*,?\s*/; var arr = []; var m = true; while(m) { m = str.match(re); str = str.replace(re,''); if(m && m[1]) { var x = m[1]; var bits = x.split(/\s*\(/); var name = bits[0]; var val_bits = bits[1].match(/\s*(.*?)\s*\)/); var val_arr = val_bits[1].split(/[, ]+/); var letters = 'abcdef'.split(''); var mtx = svgroot.createSVGMatrix(); $.each(val_arr, function(i, item) { val_arr[i] = parseFloat(item); if(name == 'matrix') { mtx[letters[i]] = val_arr[i]; } }); var xform = svgroot.createSVGTransform(); var fname = 'set' + name.charAt(0).toUpperCase() + name.slice(1); var values = name=='matrix'?[mtx]:val_arr; if(name == 'scale' && values.length == 1) { values.push(values[0]); } else if(name == 'translate' && values.length == 1) { values.push(0); } xform[fname].apply(xform, values); this._list.appendItem(xform); } } } this.numberOfItems = 0; this.clear = function() { this.numberOfItems = 0; this._xforms = []; }; this.initialize = function(newItem) { this.numberOfItems = 1; this._xforms = [newItem]; }; this.getItem = function(index) { if (index < this.numberOfItems && index >= 0) { return this._xforms[index]; } return null; }; this.insertItemBefore = function(newItem, index) { var retValue = null; if (index >= 0) { if (index < this.numberOfItems) { var newxforms = new Array(this.numberOfItems + 1); // TODO: use array copying and slicing for ( var i = 0; i < index; ++i) { newxforms[i] = this._xforms[i]; } newxforms[i] = newItem; for ( var j = i+1; i < this.numberOfItems; ++j, ++i) { newxforms[j] = this._xforms[i]; } this.numberOfItems++; this._xforms = newxforms; retValue = newItem; this._list._update(); } else { retValue = this._list.appendItem(newItem); } } return retValue; }; this.replaceItem = function(newItem, index) { var retValue = null; if (index < this.numberOfItems && index >= 0) { this._xforms[index] = newItem; retValue = newItem; this._list._update(); } return retValue; }; this.removeItem = function(index) { var retValue = null; if (index < this.numberOfItems && index >= 0) { var retValue = this._xforms[index]; var newxforms = new Array(this.numberOfItems - 1); for (var i = 0; i < index; ++i) { newxforms[i] = this._xforms[i]; } for (var j = i; j < this.numberOfItems-1; ++j, ++i) { newxforms[j] = this._xforms[i+1]; } this.numberOfItems--; this._xforms = newxforms; this._list._update(); } return retValue; }; this.appendItem = function(newItem) { this._xforms.push(newItem); this.numberOfItems++; this._list._update(); return newItem; }; }; // ************************************************************************************** // Group: Helper functions // Function: walkTree // Walks the tree and executes the callback on each element in a top-down fashion // // Parameters: // elem - DOM element to traverse // cbFn - Callback function to run on each element function walkTree(elem, cbFn){ if (elem && elem.nodeType == 1) { cbFn(elem); var i = elem.childNodes.length; while (i--) { walkTree(elem.childNodes.item(i), cbFn); } } }; // Function: walkTreePost // Walks the tree and executes the callback on each element in a depth-first fashion // // Parameters: // elem - DOM element to traverse // cbFn - Callback function to run on each element function walkTreePost(elem, cbFn) { if (elem && elem.nodeType == 1) { var i = elem.childNodes.length; while (i--) { walkTree(elem.childNodes.item(i), cbFn); } cbFn(elem); } }; // Function: assignAttributes // Assigns multiple attributes to an element. // // Parameters: // node - DOM element to apply new attribute values to // attrs - Object with attribute keys/values // suspendLength - Optional integer of milliseconds to suspend redraw // unitCheck - Boolean to indicate the need to use setUnitAttr var assignAttributes = this.assignAttributes = function(node, attrs, suspendLength, unitCheck) { if(!suspendLength) suspendLength = 0; // Opera has a problem with suspendRedraw() apparently var handle = null; if (!window.opera) svgroot.suspendRedraw(suspendLength); for (var i in attrs) { var ns = (i.substr(0,4) == "xml:" ? xmlns : i.substr(0,6) == "xlink:" ? xlinkns : null); if(ns || !unitCheck) { node.setAttributeNS(ns, i, attrs[i]); } else { setUnitAttr(node, i, attrs[i]); } } if (!window.opera) svgroot.unsuspendRedraw(handle); }; // Function: cleanupElement // Remove unneeded (default) attributes, makes resulting SVG smaller // // Parameters: // element - DOM element to clean up var cleanupElement = this.cleanupElement = function(element) { var handle = svgroot.suspendRedraw(60); var defaults = { 'fill-opacity':1, 'stop-opacity':1, 'opacity':1, 'stroke':'none', 'stroke-dasharray':'none', 'stroke-linejoin':'miter', 'stroke-linecap':'butt', 'stroke-opacity':1, 'stroke-width':1, 'rx':0, 'ry':0 } for(var attr in defaults) { var val = defaults[attr]; if(element.getAttribute(attr) == val) { element.removeAttribute(attr); } } svgroot.unsuspendRedraw(handle); }; // Function: addSvgElementFromJson // Create a new SVG element based on the given object keys/values and add it to the current layer // The element will be ran through cleanupElement before being returned // // Parameters: // data - Object with the following keys/values: // * element - DOM element to create // * attr - Object with attributes/values to assign to the new element // * curStyles - Boolean indicating that current style attributes should be applied first // // Returns: The new element var addSvgElementFromJson = this.addSvgElementFromJson = function(data) { var shape = getElem(data.attr.id); // if shape is a path but we need to create a rect/ellipse, then remove the path if (shape && data.element != shape.tagName) { current_layer.removeChild(shape); shape = null; } if (!shape) { shape = svgdoc.createElementNS(svgns, data.element); if (current_layer) { current_layer.appendChild(shape); } } if(data.curStyles) { assignAttributes(shape, { "fill": cur_shape.fill, "stroke": cur_shape.stroke, "stroke-width": cur_shape.stroke_width, "stroke-dasharray": cur_shape.stroke_dasharray, "stroke-linejoin": cur_shape.stroke_linejoin, "stroke-linecap": cur_shape.stroke_linecap, "stroke-opacity": cur_shape.stroke_opacity, "fill-opacity": cur_shape.fill_opacity, "opacity": cur_shape.opacity / 2, "style": "pointer-events:inherit" }, 100); } assignAttributes(shape, data.attr, 100); cleanupElement(shape); return shape; }; (function() { // TODO: make this string optional and set by the client var comment = svgdoc.createComment(" Created with SVG-edit - http://svg-edit.googlecode.com/ "); svgcontent.appendChild(comment); // TODO For Issue 208: this is a start on a thumbnail // var svgthumb = svgdoc.createElementNS(svgns, "use"); // svgthumb.setAttribute('width', '100'); // svgthumb.setAttribute('height', '100'); // setHref(svgthumb, '#svgcontent'); // svgroot.appendChild(svgthumb); })(); // z-ordered array of tuples containing layer names and <g> elements // the first layer is the one at the bottom of the rendering var all_layers = [], // Object to contain image data for raster images that were found encodable encodableImages = {}, // String with image URL of last loadable image last_good_img_url = curConfig.imgPath + 'logo.png', // pointer to the current layer <g> current_layer = null, // Object with save options save_options = {round_digits: 5}, // Boolean indicating whether or not a draw action has been started started = false, // Integer with internal ID number for the latest element obj_num = 1, // String with an element's initial transform attribute value start_transform = null, // String indicating the current editor mode current_mode = "select", // String with the current direction in which an element is being resized current_resize_mode = "none", // Object containing data for the currently selected styles all_properties = { shape: { fill: "#" + curConfig.initFill.color, fill_paint: null, fill_opacity: curConfig.initFill.opacity, stroke: "#" + curConfig.initStroke.color, stroke_paint: null, stroke_opacity: curConfig.initStroke.opacity, stroke_width: curConfig.initStroke.width, stroke_dasharray: 'none', stroke_linejoin: 'miter', stroke_linecap: 'butt', opacity: curConfig.initOpacity } }; all_properties.text = $.extend(true, {}, all_properties.shape); $.extend(all_properties.text, { fill: "#000000", stroke_width: 0, font_size: 24, font_family: 'serif' }); // Current shape style properties var cur_shape = all_properties.shape, // Current text style properties cur_text = all_properties.text, // Current general properties cur_properties = cur_shape, // Float displaying the current zoom level (1 = 100%, .5 = 50%, etc) current_zoom = 1, // Array with all the currently selected elements // default size of 1 until it needs to grow bigger selectedElements = new Array(1), // Array with selected elements' Bounding box object selectedBBoxes = new Array(1), // The DOM element that was just selected justSelected = null, // this object manages selectors for us selectorManager = this.selectorManager = new SelectorManager(), // DOM element for selection rectangle drawn by the user rubberBox = null, // Array of current BBoxes (still needed?) curBBoxes = [], // Object to contain all included extensions extensions = {}, // Canvas point for the most recent right click lastClickPoint = null; // Clipboard for cut, copy&pasted elements canvas.clipBoard = []; // Should this return an array by default, so extension results aren't overwritten? var runExtensions = this.runExtensions = function(action, vars, returnArray) { var result = false; if(returnArray) result = []; $.each(extensions, function(name, opts) { if(action in opts) { if(returnArray) { result.push(opts[action](vars)) } else { result = opts[action](vars); } } }); return result; } // Function: addExtension // Add an extension to the editor // // Parameters: // name - String with the ID of the extension // ext_func - Function supplied by the extension with its data this.addExtension = function(name, ext_func) { if(!(name in extensions)) { // Provide private vars/funcs here. Is there a better way to do this? if($.isFunction(ext_func)) { var ext = ext_func($.extend(canvas.getPrivateMethods(), { svgroot: svgroot, svgcontent: svgcontent, nonce: nonce, selectorManager: selectorManager })); } else { var ext = ext_func; } extensions[name] = ext; call("extension_added", ext); } else { console.log('Cannot add extension "' + name + '", an extension by that name already exists"'); } }; // Function: shortFloat // Rounds a given value to a float with number of digits defined in save_options // // Parameters: // val - The value as a String, Number or Array of two numbers to be rounded // // Returns: // If a string/number was given, returns a Float. If an array, return a string // with comma-seperated floats var shortFloat = function(val) { var digits = save_options.round_digits; if(!isNaN(val)) { return Number(Number(val).toFixed(digits)); } else if($.isArray(val)) { return shortFloat(val[0]) + ',' + shortFloat(val[1]); } } // This method rounds the incoming value to the nearest value based on the current_zoom var round = this.round = function(val) { return parseInt(val*current_zoom)/current_zoom; }; // This method sends back an array or a NodeList full of elements that // intersect the multi-select rubber-band-box on the current_layer only. // // Since the only browser that supports the SVG DOM getIntersectionList is Opera, // we need to provide an implementation here. We brute-force it for now. // // Reference: // Firefox does not implement getIntersectionList(), see https://bugzilla.mozilla.org/show_bug.cgi?id=501421 // Webkit does not implement getIntersectionList(), see https://bugs.webkit.org/show_bug.cgi?id=11274 var getIntersectionList = this.getIntersectionList = function(rect) { if (rubberBox == null) { return null; } if(!curBBoxes.length) { // Cache all bboxes curBBoxes = getVisibleElements(current_layer, true); } var resultList = null; try { resultList = current_layer.getIntersectionList(rect, null); } catch(e) { } if (resultList == null || typeof(resultList.item) != "function") { resultList = []; if(!rect) { var rubberBBox = rubberBox.getBBox(); var bb = {}; $.each(rubberBBox, function(key, val) { // Can't set values to a real BBox object, so make a fake one bb[key] = val / current_zoom; }); rubberBBox = bb; } else { var rubberBBox = rect; } var i = curBBoxes.length; while (i--) { if(!rubberBBox.width || !rubberBBox.width) continue; if (Utils.rectsIntersect(rubberBBox, curBBoxes[i].bbox)) { resultList.push(curBBoxes[i].elem); } } } // addToSelection expects an array, but it's ok to pass a NodeList // because using square-bracket notation is allowed: // http://www.w3.org/TR/DOM-Level-2-Core/ecma-script-binding.html return resultList; }; // Function: getStrokedBBox // Get the bounding box for one or more stroked and/or transformed elements // // Parameters: // elems - Array with DOM elements to check // // Returns: // A single bounding box object var getStrokedBBox = this.getStrokedBBox = function(elems) { if(!elems) elems = getVisibleElements(); if(!elems.length) return false; // Make sure the expected BBox is returned if the element is a group var getCheckedBBox = function(elem) { try { // TODO: Fix issue with rotated groups. Currently they work // fine in FF, but not in other browsers (same problem mentioned // in Issue 339 comment #2). var bb = getBBox(elem); var angle = getRotationAngle(elem); if ((angle && angle % 90) || hasMatrixTransform(getTransformList(elem))) { // Accurate way to get BBox of rotated element in Firefox: // Put element in group and get its BBox var good_bb = false; // Get the BBox from the raw path for these elements var elemNames = ['ellipse','path','line','polyline','polygon']; if($.inArray(elem.tagName, elemNames) != -1) { bb = good_bb = canvas.convertToPath(elem, true); } else if(elem.tagName == 'rect') { // Look for radius var rx = elem.getAttribute('rx'); var ry = elem.getAttribute('ry'); if(rx || ry) { bb = good_bb = canvas.convertToPath(elem, true); } } if(!good_bb) { var g = document.createElementNS(svgns, "g"); var parent = elem.parentNode; parent.replaceChild(g, elem); g.appendChild(elem); bb = g.getBBox(); parent.insertBefore(elem,g); parent.removeChild(g); } // Old method: Works by giving the rotated BBox, // this is (unfortunately) what Opera and Safari do // natively when getting the BBox of the parent group // var angle = angle * Math.PI / 180.0; // var rminx = Number.MAX_VALUE, rminy = Number.MAX_VALUE, // rmaxx = Number.MIN_VALUE, rmaxy = Number.MIN_VALUE; // var cx = round(bb.x + bb.width/2), // cy = round(bb.y + bb.height/2); // var pts = [ [bb.x - cx, bb.y - cy], // [bb.x + bb.width - cx, bb.y - cy], // [bb.x + bb.width - cx, bb.y + bb.height - cy], // [bb.x - cx, bb.y + bb.height - cy] ]; // var j = 4; // while (j--) { // var x = pts[j][0], // y = pts[j][1], // r = Math.sqrt( x*x + y*y ); // var theta = Math.atan2(y,x) + angle; // x = round(r * Math.cos(theta) + cx); // y = round(r * Math.sin(theta) + cy); // // // now set the bbox for the shape after it's been rotated // if (x < rminx) rminx = x; // if (y < rminy) rminy = y; // if (x > rmaxx) rmaxx = x; // if (y > rmaxy) rmaxy = y; // } // // bb.x = rminx; // bb.y = rminy; // bb.width = rmaxx - rminx; // bb.height = rmaxy - rminy; } return bb; } catch(e) { console.log(elem, e); return null; } } var full_bb; $.each(elems, function() { if(full_bb) return; if(!this.parentNode) return; full_bb = getCheckedBBox(this); if(full_bb) { var b = {}; for(var i in full_bb) b[i] = full_bb[i]; full_bb = b; } }); // This shouldn't ever happen... if(full_bb == null) return null; // full_bb doesn't include the stoke, so this does no good! // if(elems.length == 1) return full_bb; var max_x = full_bb.x + full_bb.width; var max_y = full_bb.y + full_bb.height; var min_x = full_bb.x; var min_y = full_bb.y; // FIXME: same re-creation problem with this function as getCheckedBBox() above var getOffset = function(elem) { var sw = elem.getAttribute("stroke-width"); var offset = 0; if (elem.getAttribute("stroke") != "none" && !isNaN(sw)) { offset += sw/2; } return offset; } var bboxes = []; $.each(elems, function(i, elem) { var cur_bb = getCheckedBBox(elem); if(cur_bb) { var offset = getOffset(elem); min_x = Math.min(min_x, cur_bb.x - offset); min_y = Math.min(min_y, cur_bb.y - offset); bboxes.push(cur_bb); } }); full_bb.x = min_x; full_bb.y = min_y; $.each(elems, function(i, elem) { var cur_bb = bboxes[i]; // ensure that elem is really an element node if (cur_bb && elem.nodeType == 1) { var offset = getOffset(elem); max_x = Math.max(max_x, cur_bb.x + cur_bb.width + offset); max_y = Math.max(max_y, cur_bb.y + cur_bb.height + offset); } }); full_bb.width = max_x - min_x; full_bb.height = max_y - min_y; return full_bb; } // Function: getVisibleElements // Get all elements that have a BBox (excludes <defs>, <title>, etc). // Note that 0-opacity, off-screen etc elements are still considered "visible" // for this function // // Parameters: // parent - The parent DOM element to search within // includeBBox - Boolean to indicate that an object should return with the element and its bbox // // Returns: // An array with all "visible" elements, or if includeBBox is true, an array with // objects that include: // * elem - The element // * bbox - The element's BBox as retrieved from getStrokedBBox var getVisibleElements = this.getVisibleElements = function(parent, includeBBox) { if(!parent) parent = $(svgcontent).children(); // Prevent layers from being included var contentElems = []; $(parent).children().each(function(i, elem) { try { var box = elem.getBBox(); if (box) { var item = includeBBox?{'elem':elem, 'bbox':getStrokedBBox([elem])}:elem; contentElems.push(item); } } catch(e) {} }); return contentElems.reverse(); } // Function: groupSvgElem // Wrap an SVG element into a group element, mark the group as 'gsvg' // // Parameters: // elem - SVG element to wrap var groupSvgElem = this.groupSvgElem = function(elem) { var g = document.createElementNS(svgns, "g"); elem.parentNode.replaceChild(g, elem); $(g).append(elem).data('gsvg', elem)[0].id = getNextId(); } // Function: copyElem // Create a clone of an element, updating its ID and its children's IDs when needed // // Parameters: // el - DOM element to clone // // Returns: The cloned element var copyElem = function(el) { // manually create a copy of the element var new_el = document.createElementNS(el.namespaceURI, el.nodeName); $.each(el.attributes, function(i, attr) { if (attr.localName != '-moz-math-font-style') { new_el.setAttributeNS(attr.namespaceURI, attr.nodeName, attr.nodeValue); } }); // set the copied element's new id new_el.removeAttribute("id"); new_el.id = getNextId(); // manually increment obj_num because our cloned elements are not in the DOM yet obj_num++; // Opera's "d" value needs to be reset for Opera/Win/non-EN // Also needed for webkit (else does not keep curved segments on clone) if((isWebkit) && el.nodeName == 'path') { var fixed_d = pathActions.convertPath(el); new_el.setAttribute('d', fixed_d); } // now create copies of all children $.each(el.childNodes, function(i, child) { switch(child.nodeType) { case 1: // element node new_el.appendChild(copyElem(child)); break; case 3: // text node new_el.textContent = child.nodeValue; break; default: break; } }); if($(el).data('gsvg')) { $(new_el).data('gsvg', new_el.firstChild); } else if($(el).data('symbol')) { var ref = $(el).data('symbol'); $(new_el).data('ref', ref).data('symbol', ref); } else if(new_el.tagName == 'image') { preventClickDefault(new_el); } return new_el; }; // Function: getElem // Get a DOM element by ID within the SVG root element. // // Parameters: // id - String with the element's new ID function getElem(id) { // if(svgroot.getElementById) { // // getElementById lookup // return svgroot.getElementById(id); // } else if(svgroot.querySelector) { // querySelector lookup return svgroot.querySelector('#'+id); } else if(svgdoc.evaluate) { // xpath lookup return svgdoc.evaluate('svg:svg[@id="svgroot"]//svg:*[@id="'+id+'"]', container, function() { return "http://www.w3.org/2000/svg"; }, 9, null).singleNodeValue; } else { // jQuery lookup: twice as slow as xpath in FF return $(svgroot).find('[id=' + id + ']')[0]; } // getElementById lookup: includes icons, not good // return svgdoc.getElementById(id); } // Set scope for these functions var getId, getNextId; (function(c) { // Object to contain editor event names and callback functions var events = {}; // Prefix string for element IDs var idprefix = "svg_"; // Function: getId // Returns the last created DOM element ID string getId = c.getId = function() { if (events["getid"]) return call("getid", obj_num); if (randomize_ids) { return idprefix + nonce +'_' + obj_num; } else { return idprefix + obj_num; } }; // Function: getNextId // Creates and returns a unique ID string for a DOM element getNextId = c.getNextId = function() { // ensure the ID does not exist var id = getId(); while (getElem(id)) { obj_num++; id = getId(); } return id; }; // Run the callback function associated with the given event // // Parameters: // event - String with the event name // arg - Argument to pass through to the callback function call = c.call = function(event, arg) { if (events[event]) { return events[event](this,arg); } }; // Function: bind // Attaches a callback function to an event // // Parameters: // event - String indicating the name of the event // f - The callback function to bind to the event // // Return: // The previous event c.bind = function(event, f) { var old = events[event]; events[event] = f; return old; }; // Function: setIdPrefix // Changes the ID prefix to the given value // // Parameters: // p - String with the new prefix c.setIdPrefix = function(p) { idprefix = p; }; }(canvas)); // Function: sanitizeSvg // Sanitizes the input node and its children // It only keeps what is allowed from our whitelist defined above // // Parameters: // node - The DOM element to be checked, will also check its children var sanitizeSvg = this.sanitizeSvg = function(node) { // we only care about element nodes // automatically return for all comment, etc nodes // for text, we do a whitespace trim if (node.nodeType == 3) { node.nodeValue = node.nodeValue.replace(/^\s+|\s+$/g, ""); // Remove empty text nodes if(!node.nodeValue.length) node.parentNode.removeChild(node); } if (node.nodeType != 1) return; var doc = node.ownerDocument; var parent = node.parentNode; // can parent ever be null here? I think the root node's parent is the document... if (!doc || !parent) return; var allowedAttrs = svgWhiteList[node.nodeName]; var allowedAttrsNS = svgWhiteListNS[node.nodeName]; // if this element is allowed if (allowedAttrs != undefined) { var se_attrs = []; var i = node.attributes.length; while (i--) { // if the attribute is not in our whitelist, then remove it // could use jQuery's inArray(), but I don't know if that's any better var attr = node.attributes.item(i); var attrName = attr.nodeName; var attrLocalName = attr.localName; var attrNsURI = attr.namespaceURI; // Check that an attribute with the correct localName in the correct namespace is on // our whitelist or is a namespace declaration for one of our allowed namespaces if (!(allowedAttrsNS.hasOwnProperty(attrLocalName) && attrNsURI == allowedAttrsNS[attrLocalName] && attrNsURI != xmlnsns) && !(attrNsURI == xmlnsns && nsMap[attr.nodeValue]) ) { // Bypassing the whitelist to allow se: prefixes. Is there // a more appropriate way to do this? if(attrName.indexOf('se:') == 0) { se_attrs.push([attrName, attr.nodeValue]); } node.removeAttributeNS(attrNsURI, attrLocalName); } // special handling for path d attribute if (node.nodeName == 'path' && attrName == 'd') { // Convert to absolute node.setAttribute('d',pathActions.convertPath(node)); pathActions.fixEnd(node); } // for the style attribute, rewrite it in terms of XML presentational attributes if (attrName == "style") { var props = attr.nodeValue.split(";"), p = props.length; while(p--) { var nv = props[p].split(":"); // now check that this attribute is supported if (allowedAttrs.indexOf(nv[0]) != -1) { node.setAttribute(nv[0],nv[1]); } } node.removeAttribute('style'); } } $.each(se_attrs, function(i, attr) { node.setAttributeNS(se_ns, attr[0], attr[1]); }); // for some elements that have a xlink:href, ensure the URI refers to a local element // (but not for links) var href = getHref(node); if(href && $.inArray(node.nodeName, ["filter", "linearGradient", "pattern", "radialGradient", "textPath", "use"]) != -1) { // TODO: we simply check if the first character is a #, is this bullet-proof? if (href[0] != "#") { // remove the attribute (but keep the element) setHref(node, ""); node.removeAttributeNS(xlinkns, "href"); } } // Safari crashes on a <use> without a xlink:href, so we just remove the node here if (node.nodeName == "use" && !getHref(node)) { parent.removeChild(node); return; } // if the element has attributes pointing to a non-local reference, // need to remove the attribute $.each(["clip-path", "fill", "filter", "marker-end", "marker-mid", "marker-start", "mask", "stroke"],function(i,attr) { var val = node.getAttribute(attr); if (val) { val = getUrlFromAttr(val); // simply check for first character being a '#' if (val && val[0] != "#") { node.setAttribute(attr, ""); node.removeAttribute(attr); } } }); // recurse to children i = node.childNodes.length; while (i--) { sanitizeSvg(node.childNodes.item(i)); } } // else, remove this element else { // remove all children from this node and insert them before this node // FIXME: in the case of animation elements this will hardly ever be correct var children = []; while (node.hasChildNodes()) { children.push(parent.insertBefore(node.firstChild, node)); } // remove this node from the document altogether parent.removeChild(node); // call sanitizeSvg on each of those children var i = children.length; while (i--) { sanitizeSvg(children[i]); } } }; // Function: getUrlFromAttr // Extracts the URL from the url(...) syntax of some attributes. // Three variants: // * <circle fill="url(someFile.svg#foo)" /> // * <circle fill="url('someFile.svg#foo')" /> // * <circle fill='url("someFile.svg#foo")' /> // // Parameters: // attrVal - The attribute value as a string // // Returns: // String with just the URL, like someFile.svg#foo var getUrlFromAttr = this.getUrlFromAttr = function(attrVal) { if (attrVal) { // url("#somegrad") if (attrVal.indexOf('url("') == 0) { return attrVal.substring(5,attrVal.indexOf('"',6)); } // url('#somegrad') else if (attrVal.indexOf("url('") == 0) { return attrVal.substring(5,attrVal.indexOf("'",6)); } else if (attrVal.indexOf("url(") == 0) { return attrVal.substring(4,attrVal.indexOf(')')); } } return null; }; // Function: getBBox // Get the given/selected element's bounding box object, convert it to be more // usable when necessary // // Parameters: // elem - Optional DOM element to get the BBox for var getBBox = this.getBBox = function(elem) { var selected = elem || selectedElements[0]; if (elem.nodeType != 1) return null; var ret = null; if(elem.nodeName == 'text' && selected.textContent == '') { selected.textContent = 'a'; // Some character needed for the selector to use. ret = selected.getBBox(); selected.textContent = ''; } else if(elem.nodeName == 'path' && isWebkit) { ret = getPathBBox(selected); } else if(elem.nodeName == 'use' && !isWebkit || elem.nodeName == 'foreignObject') { ret = selected.getBBox(); var bb = {}; bb.width = ret.width; bb.height = ret.height; bb.x = ret.x + parseFloat(selected.getAttribute('x')||0); bb.y = ret.y + parseFloat(selected.getAttribute('y')||0); ret = bb; } else { try { ret = selected.getBBox(); } catch(e) { // Check if element is child of a foreignObject var fo = $(selected).closest("foreignObject"); if(fo.length) { try { ret = fo[0].getBBox(); } catch(e) { ret = null; } } else { ret = null; } } } // get the bounding box from the DOM (which is in that element's coordinate system) return ret; }; // Function: ffClone // Hack for Firefox bugs where text element features aren't updated. // This function clones the element and re-selects it // TODO: Test for this bug on load and add it to "support" object instead of // browser sniffing // // Parameters: // elem - The (text) DOM element to clone var ffClone = function(elem) { if(navigator.userAgent.indexOf('Gecko/') == -1) return elem; var clone = elem.cloneNode(true) elem.parentNode.insertBefore(clone, elem); elem.parentNode.removeChild(elem); selectorManager.releaseSelector(elem); selectedElements[0] = clone; selectorManager.requestSelector(clone).showGrips(true); return clone; } // Function: getPathBBox // Get correct BBox for a path in Webkit // Converted from code found here: // http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html // // Parameters: // path - The path DOM element to get the BBox for // // Returns: // A BBox-like object var getPathBBox = function(path) { var seglist = path.pathSegList; var tot = seglist.numberOfItems; var bounds = [[], []]; var start = seglist.getItem(0); var P0 = [start.x, start.y]; for(var i=0; i < tot; i++) { var seg = seglist.getItem(i); if(!seg.x) continue; // Add actual points to limits bounds[0].push(P0[0]); bounds[1].push(P0[1]); if(seg.x1) { var P1 = [seg.x1, seg.y1], P2 = [seg.x2, seg.y2], P3 = [seg.x, seg.y]; for(var j=0; j < 2; j++) { var calc = function(t) { return Math.pow(1-t,3) * P0[j] + 3 * Math.pow(1-t,2) * t * P1[j] + 3 * (1-t) * Math.pow(t,2) * P2[j] + Math.pow(t,3) * P3[j]; }; var b = 6 * P0[j] - 12 * P1[j] + 6 * P2[j]; var a = -3 * P0[j] + 9 * P1[j] - 9 * P2[j] + 3 * P3[j]; var c = 3 * P1[j] - 3 * P0[j]; if(a == 0) { if(b == 0) { continue; } var t = -c / b; if(0 < t && t < 1) { bounds[j].push(calc(t)); } continue; } var b2ac = Math.pow(b,2) - 4 * c * a; if(b2ac < 0) continue; var t1 = (-b + Math.sqrt(b2ac))/(2 * a); if(0 < t1 && t1 < 1) bounds[j].push(calc(t1)); var t2 = (-b - Math.sqrt(b2ac))/(2 * a); if(0 < t2 && t2 < 1) bounds[j].push(calc(t2)); } P0 = P3; } else { bounds[0].push(seg.x); bounds[1].push(seg.y); } } var x = Math.min.apply(null, bounds[0]); var w = Math.max.apply(null, bounds[0]) - x; var y = Math.min.apply(null, bounds[1]); var h = Math.max.apply(null, bounds[1]) - y; return { 'x': x, 'y': y, 'width': w, 'height': h }; } // this.each is deprecated, if any extension used this it can be recreated by doing this: // $(canvas.getRootElem()).children().each(...) // this.each = function(cb) { // $(svgroot).children().each(cb); // }; // Group: Element Transforms // Function: getRotationAngle // Get the rotation angle of the given/selected DOM element // // Parameters: // elem - Optional DOM element to get the angle for // to_rad - Boolean that when true returns the value in radians rather than degrees // // Returns: // Float with the angle in degrees or radians var getRotationAngle = this.getRotationAngle = function(elem, to_rad) { var selected = elem || selectedElements[0]; // find the rotation transform (if any) and set it var tlist = getTransformList(selected); if(!tlist) return 0; // <svg> elements have no tlist var N = tlist.numberOfItems; for (var i = 0; i < N; ++i) { var xform = tlist.getItem(i); if (xform.type == 4) { return to_rad ? xform.angle * Math.PI / 180.0 : xform.angle; } } return 0.0; }; // Function: setRotationAngle // Removes any old rotations if present, prepends a new rotation at the // transformed center // // Parameters: // val - The new rotation angle in degrees // preventUndo - Boolean indicating whether the action should be undoable or not this.setRotationAngle = function(val, preventUndo) { // ensure val is the proper type val = parseFloat(val); var elem = selectedElements[0]; var oldTransform = elem.getAttribute("transform"); var bbox = getBBox(elem); var cx = bbox.x+bbox.width/2, cy = bbox.y+bbox.height/2; var tlist = getTransformList(elem); // only remove the real rotational transform if present (i.e. at index=0) if (tlist.numberOfItems > 0) { var xform = tlist.getItem(0); if (xform.type == 4) { tlist.removeItem(0); } } // find R_nc and insert it if (val != 0) { var center = transformPoint(cx,cy,transformListToTransform(tlist).matrix); var R_nc = svgroot.createSVGTransform(); R_nc.setRotate(val, center.x, center.y); if(tlist.numberOfItems) { tlist.insertItemBefore(R_nc, 0); } else { tlist.appendItem(R_nc); } } else if (tlist.numberOfItems == 0) { elem.removeAttribute("transform"); } if (!preventUndo) { // we need to undo it, then redo it so it can be undo-able! :) // TODO: figure out how to make changes to transform list undo-able cross-browser? var newTransform = elem.getAttribute("transform"); elem.setAttribute("transform", oldTransform); changeSelectedAttribute("transform",newTransform,selectedElements); } var pointGripContainer = getElem("pathpointgrip_container"); // if(elem.nodeName == "path" && pointGripContainer) { // pathActions.setPointContainerTransform(elem.getAttribute("transform")); // } var selector = selectorManager.requestSelector(selectedElements[0]); selector.resize(); selector.updateGripCursors(val); }; // Function: getTransformList // Returns an object that behaves like a SVGTransformList for the given DOM element // // Parameters: // elem - DOM element to get a transformlist from var getTransformList = this.getTransformList = function(elem) { if (isWebkit) { var id = elem.id; if(!id) { // Get unique ID for temporary element id = 'temp'; } var t = svgTransformLists[id]; if (!t || id == 'temp') { svgTransformLists[id] = new SVGEditTransformList(elem); svgTransformLists[id]._init(); t = svgTransformLists[id]; } return t; } else if (elem.transform) { return elem.transform.baseVal; } else if (elem.gradientTransform) { return elem.gradientTransform.baseVal; } return null; }; // Function: recalculateAllSelectedDimensions // Runs recalculateDimensions on the selected elements, // adding the changes to a single batch command var recalculateAllSelectedDimensions = this.recalculateAllSelectedDimensions = function() { var text = (current_resize_mode == "none" ? "position" : "size"); var batchCmd = new BatchCommand(text); var i = selectedElements.length; while(i--) { var elem = selectedElements[i]; // if(getRotationAngle(elem) && !hasMatrixTransform(getTransformList(elem))) continue; var cmd = recalculateDimensions(elem); if (cmd) { batchCmd.addSubCommand(cmd); } } if (!batchCmd.isEmpty()) { addCommandToHistory(batchCmd); call("changed", selectedElements); } }; // this is how we map paths to our preferred relative segment types var pathMap = [0, 'z', 'M', 'm', 'L', 'l', 'C', 'c', 'Q', 'q', 'A', 'a', 'H', 'h', 'V', 'v', 'S', 's', 'T', 't']; // Debug tool to easily see the current matrix in the browser's console var logMatrix = function(m) { console.log([m.a,m.b,m.c,m.d,m.e,m.f]); }; // Function: remapElement // Applies coordinate changes to an element based on the given matrix // // Parameters: // selected - DOM element to be changed // changes - Object with changes to be remapped // m - Matrix object to use for remapping coordinates var remapElement = this.remapElement = function(selected,changes,m) { var remap = function(x,y) { return transformPoint(x,y,m); }, scalew = function(w) { return m.a*w; }, scaleh = function(h) { return m.d*h; }, box = getBBox(selected); switch (selected.tagName) { case "line": var pt1 = remap(changes["x1"],changes["y1"]), pt2 = remap(changes["x2"],changes["y2"]); changes["x1"] = pt1.x; changes["y1"] = pt1.y; changes["x2"] = pt2.x; changes["y2"] = pt2.y; break; case "circle": var c = remap(changes["cx"],changes["cy"]); changes["cx"] = c.x; changes["cy"] = c.y; // take the minimum of the new selected box's dimensions for the new circle radius var tbox = transformBox(box.x, box.y, box.width, box.height, m); var w = tbox.tr.x - tbox.tl.x, h = tbox.bl.y - tbox.tl.y; changes["r"] = Math.min(w/2, h/2); break; case "ellipse": var c = remap(changes["cx"],changes["cy"]); changes["cx"] = c.x; changes["cy"] = c.y; changes["rx"] = scalew(changes["rx"]); changes["ry"] = scaleh(changes["ry"]); break; case "foreignObject": case "rect": case "image": var pt1 = remap(changes["x"],changes["y"]); changes["x"] = pt1.x; changes["y"] = pt1.y; changes["width"] = scalew(changes["width"]); changes["height"] = scaleh(changes["height"]); break; case "use": // var pt1 = remap(changes["x"],changes["y"]); // changes["x"] = pt1.x; // changes["y"] = pt1.y; // break; case "g": case "text": // if it was a translate, then just update x,y if (m.a == 1 && m.b == 0 && m.c == 0 && m.d == 1 && (m.e != 0 || m.f != 0) ) { // [T][M] = [M][T'] // therefore [T'] = [M_inv][T][M] var existing = transformListToTransform(selected).matrix, t_new = matrixMultiply(existing.inverse(), m, existing); changes["x"] = parseFloat(changes["x"]) + t_new.e; changes["y"] = parseFloat(changes["y"]) + t_new.f; } else { // we just absorb all matrices into the element and don't do any remapping var chlist = getTransformList(selected); var mt = svgroot.createSVGTransform(); mt.setMatrix(matrixMultiply(transformListToTransform(chlist).matrix,m)); chlist.clear(); chlist.appendItem(mt); } break; case "polygon": case "polyline": var len = changes["points"].length; for (var i = 0; i < len; ++i) { var pt = changes["points"][i]; pt = remap(pt.x,pt.y); changes["points"][i].x = pt.x; changes["points"][i].y = pt.y; } break; case "path": var segList = selected.pathSegList; var len = segList.numberOfItems; changes.d = new Array(len); for (var i = 0; i < len; ++i) { var seg = segList.getItem(i); changes.d[i] = { type: seg.pathSegType, x: seg.x, y: seg.y, x1: seg.x1, y1: seg.y1, x2: seg.x2, y2: seg.y2, r1: seg.r1, r2: seg.r2, angle: seg.angle, largeArcFlag: seg.largeArcFlag, sweepFlag: seg.sweepFlag }; } var len = changes["d"].length, firstseg = changes["d"][0], currentpt = remap(firstseg.x,firstseg.y); changes["d"][0].x = currentpt.x; changes["d"][0].y = currentpt.y; for (var i = 1; i < len; ++i) { var seg = changes["d"][i]; var type = seg.type; // if absolute or first segment, we want to remap x, y, x1, y1, x2, y2 // if relative, we want to scalew, scaleh if (type % 2 == 0) { // absolute var thisx = (seg.x != undefined) ? seg.x : currentpt.x, // for V commands thisy = (seg.y != undefined) ? seg.y : currentpt.y, // for H commands pt = remap(thisx,thisy), pt1 = remap(seg.x1,seg.y1), pt2 = remap(seg.x2,seg.y2); seg.x = pt.x; seg.y = pt.y; seg.x1 = pt1.x; seg.y1 = pt1.y; seg.x2 = pt2.x; seg.y2 = pt2.y; seg.r1 = scalew(seg.r1), seg.r2 = scaleh(seg.r2); } else { // relative seg.x = scalew(seg.x); seg.y = scaleh(seg.y); seg.x1 = scalew(seg.x1); seg.y1 = scaleh(seg.y1); seg.x2 = scalew(seg.x2); seg.y2 = scaleh(seg.y2); seg.r1 = scalew(seg.r1), seg.r2 = scaleh(seg.r2); } // tracks the current position (for H,V commands) if (seg.x) currentpt.x = seg.x; if (seg.y) currentpt.y = seg.y; } // for each segment break; } // switch on element type to get initial values // now we have a set of changes and an applied reduced transform list // we apply the changes directly to the DOM // TODO: merge this switch with the above one and optimize switch (selected.tagName) { case "foreignObject": case "rect": case "image": changes.x = changes.x-0 + Math.min(0,changes.width); changes.y = changes.y-0 + Math.min(0,changes.height); changes.width = Math.abs(changes.width); changes.height = Math.abs(changes.height); if(curConfig.gridSnapping && selected.parentNode.parentNode.localName == "svg"){ changes.x = snapToGrid(changes.x); changes.y = snapToGrid(changes.y); changes.width = snapToGrid(changes.width); changes.height = snapToGrid(changes.height); } assignAttributes(selected, changes, 1000, true); break; case "ellipse": changes.rx = Math.abs(changes.rx); changes.ry = Math.abs(changes.ry); if(curConfig.gridSnapping && selected.parentNode.parentNode.localName == "svg"){ changes.cx = snapToGrid(changes.cx); changes.cy = snapToGrid(changes.cy); changes.rx = snapToGrid(changes.rx); changes.ry = snapToGrid(changes.ry); } case "circle": if(changes.r) changes.r = Math.abs(changes.r); if(curConfig.gridSnapping && selected.parentNode.parentNode.localName == "svg"){ changes.cx = snapToGrid(changes.cx); changes.cy = snapToGrid(changes.cy); changes.r = snapToGrid(changes.r); } case "line": if(curConfig.gridSnapping && selected.parentNode.parentNode.localName == "svg"){ changes.x1 = snapToGrid(changes.x1); changes.y1 = snapToGrid(changes.y1); changes.x2 = snapToGrid(changes.x2); changes.y2 = snapToGrid(changes.y2); } case "text": if(curConfig.gridSnapping && selected.parentNode.parentNode.localName == "svg"){ changes.x = snapToGrid(changes.x); changes.y = snapToGrid(changes.y); } case "use": assignAttributes(selected, changes, 1000, true); break; case "g": var gsvg = $(selected).data('gsvg'); if(gsvg) { assignAttributes(gsvg, changes, 1000, true); } break; case "polyline": case "polygon": var len = changes["points"].length; var pstr = ""; for (var i = 0; i < len; ++i) { var pt = changes["points"][i]; pstr += pt.x + "," + pt.y + " "; } selected.setAttribute("points", pstr); break; case "path": var dstr = ""; var len = changes["d"].length; for (var i = 0; i < len; ++i) { var seg = changes["d"][i]; var type = seg.type; dstr += pathMap[type]; switch(type) { case 13: // relative horizontal line (h) case 12: // absolute horizontal line (H) dstr += seg.x + " "; break; case 15: // relative vertical line (v) case 14: // absolute vertical line (V) dstr += seg.y + " "; break; case 3: // relative move (m) case 5: // relative line (l) case 19: // relative smooth quad (t) case 2: // absolute move (M) case 4: // absolute line (L) case 18: // absolute smooth quad (T) dstr += seg.x + "," + seg.y + " "; break; case 7: // relative cubic (c) case 6: // absolute cubic (C) dstr += seg.x1 + "," + seg.y1 + " " + seg.x2 + "," + seg.y2 + " " + seg.x + "," + seg.y + " "; break; case 9: // relative quad (q) case 8: // absolute quad (Q) dstr += seg.x1 + "," + seg.y1 + " " + seg.x + "," + seg.y + " "; break; case 11: // relative elliptical arc (a) case 10: // absolute elliptical arc (A) dstr += seg.r1 + "," + seg.r2 + " " + seg.angle + " " + Number(seg.largeArcFlag) + " " + Number(seg.sweepFlag) + " " + seg.x + "," + seg.y + " "; break; case 17: // relative smooth cubic (s) case 16: // absolute smooth cubic (S) dstr += seg.x2 + "," + seg.y2 + " " + seg.x + "," + seg.y + " "; break; } } selected.setAttribute("d", dstr); break; } }; // Function: updateClipPath // Updates a <clipPath>s values based on the given translation of an element // // Parameters: // attr - The clip-path attribute value with the clipPath's ID // tx - The translation's x value // ty - The translation's y value var updateClipPath = function(attr, tx, ty) { var id = getUrlFromAttr(attr).substr(1); var path = getElem(id).firstChild; var cp_xform = getTransformList(path); var newxlate = svgroot.createSVGTransform(); newxlate.setTranslate(tx, ty); cp_xform.appendItem(newxlate); // Update clipPath's dimensions recalculateDimensions(path); } // Function: recalculateDimensions // Decides the course of action based on the element's transform list // // Parameters: // selected - The DOM element to recalculate // // Returns: // Undo command object with the resulting change var recalculateDimensions = this.recalculateDimensions = function(selected) { if (selected == null) return null; var tlist = getTransformList(selected); // remove any unnecessary transforms if (tlist && tlist.numberOfItems > 0) { var k = tlist.numberOfItems; while (k--) { var xform = tlist.getItem(k); if (xform.type == 0) { tlist.removeItem(k); } // remove identity matrices else if (xform.type == 1) { if (isIdentity(xform.matrix)) { tlist.removeItem(k); } } // remove zero-degree rotations else if (xform.type == 4) { if (xform.angle == 0) { tlist.removeItem(k); } } } // End here if all it has is a rotation if(tlist.numberOfItems == 1 && getRotationAngle(selected)) return null; } // if this element had no transforms, we are done if (!tlist || tlist.numberOfItems == 0) { selected.removeAttribute("transform"); return null; } // Grouped SVG element var gsvg = $(selected).data('gsvg'); // we know we have some transforms, so set up return variable var batchCmd = new BatchCommand("Transform"); // store initial values that will be affected by reducing the transform list var changes = {}, initial = null, attrs = []; switch (selected.tagName) { case "line": attrs = ["x1", "y1", "x2", "y2"]; break; case "circle": attrs = ["cx", "cy", "r"]; break; case "ellipse": attrs = ["cx", "cy", "rx", "ry"]; break; case "foreignObject": case "rect": case "image": attrs = ["width", "height", "x", "y"]; break; case "use": case "text": attrs = ["x", "y"]; break; case "polygon": case "polyline": initial = {}; initial["points"] = selected.getAttribute("points"); var list = selected.points; var len = list.numberOfItems; changes["points"] = new Array(len); for (var i = 0; i < len; ++i) { var pt = list.getItem(i); changes["points"][i] = {x:pt.x,y:pt.y}; } break; case "path": initial = {}; initial["d"] = selected.getAttribute("d"); changes["d"] = selected.getAttribute("d"); break; } // switch on element type to get initial values if(attrs.length) { changes = $(selected).attr(attrs); $.each(changes, function(attr, val) { changes[attr] = convertToNum(attr, val); }); } else if(gsvg) { // GSVG exception changes = { x: $(gsvg).attr('x') || 0, y: $(gsvg).attr('y') || 0 }; } // if we haven't created an initial array in polygon/polyline/path, then // make a copy of initial values and include the transform if (initial == null) { initial = $.extend(true, {}, changes); $.each(initial, function(attr, val) { initial[attr] = convertToNum(attr, val); }); } // save the start transform value too initial["transform"] = start_transform ? start_transform : ""; // if it's a regular group, we have special processing to flatten transforms if ((selected.tagName == "g" && !gsvg) || selected.tagName == "a") { var box = getBBox(selected), oldcenter = {x: box.x+box.width/2, y: box.y+box.height/2}, newcenter = transformPoint(box.x+box.width/2, box.y+box.height/2, transformListToTransform(tlist).matrix), m = svgroot.createSVGMatrix(); // temporarily strip off the rotate and save the old center var gangle = getRotationAngle(selected); if (gangle) { var a = gangle * Math.PI / 180; if ( Math.abs(a) > (1.0e-10) ) { var s = Math.sin(a)/(1 - Math.cos(a)); } else { // FIXME: This blows up if the angle is exactly 0! var s = 2/a; } for (var i = 0; i < tlist.numberOfItems; ++i) { var xform = tlist.getItem(i); if (xform.type == 4) { // extract old center through mystical arts var rm = xform.matrix; oldcenter.y = (s*rm.e + rm.f)/2; oldcenter.x = (rm.e - s*rm.f)/2; tlist.removeItem(i); break; } } } var tx = 0, ty = 0, operation = 0, N = tlist.numberOfItems; if(N) { var first_m = tlist.getItem(0).matrix; } // first, if it was a scale then the second-last transform will be it if (N >= 3 && tlist.getItem(N-2).type == 3 && tlist.getItem(N-3).type == 2 && tlist.getItem(N-1).type == 2) { operation = 3; // scale // if the children are unrotated, pass the scale down directly // otherwise pass the equivalent matrix() down directly var tm = tlist.getItem(N-3).matrix, sm = tlist.getItem(N-2).matrix, tmn = tlist.getItem(N-1).matrix; var children = selected.childNodes; var c = children.length; while (c--) { var child = children.item(c); tx = 0; ty = 0; if (child.nodeType == 1) { var childTlist = getTransformList(child); // some children might not have a transform (<metadata>, <defs>, etc) if (!childTlist) continue; var m = transformListToTransform(childTlist).matrix; // Convert a matrix to a scale if applicable // if(hasMatrixTransform(childTlist) && childTlist.numberOfItems == 1) { // if(m.b==0 && m.c==0 && m.e==0 && m.f==0) { // childTlist.removeItem(0); // var translateOrigin = svgroot.createSVGTransform(), // scale = svgroot.createSVGTransform(), // translateBack = svgroot.createSVGTransform(); // translateOrigin.setTranslate(0, 0); // scale.setScale(m.a, m.d); // translateBack.setTranslate(0, 0); // childTlist.appendItem(translateBack); // childTlist.appendItem(scale); // childTlist.appendItem(translateOrigin); // } // } var angle = getRotationAngle(child); var old_start_transform = start_transform; var childxforms = []; start_transform = child.getAttribute("transform"); if(angle || hasMatrixTransform(childTlist)) { var e2t = svgroot.createSVGTransform(); e2t.setMatrix(matrixMultiply(tm, sm, tmn, m)); childTlist.clear(); childTlist.appendItem(e2t); childxforms.push(e2t); } // if not rotated or skewed, push the [T][S][-T] down to the child else { // update the transform list with translate,scale,translate // slide the [T][S][-T] from the front to the back // [T][S][-T][M] = [M][T2][S2][-T2] // (only bringing [-T] to the right of [M]) // [T][S][-T][M] = [T][S][M][-T2] // [-T2] = [M_inv][-T][M] var t2n = matrixMultiply(m.inverse(), tmn, m); // [T2] is always negative translation of [-T2] var t2 = svgroot.createSVGMatrix(); t2.e = -t2n.e; t2.f = -t2n.f; // [T][S][-T][M] = [M][T2][S2][-T2] // [S2] = [T2_inv][M_inv][T][S][-T][M][-T2_inv] var s2 = matrixMultiply(t2.inverse(), m.inverse(), tm, sm, tmn, m, t2n.inverse()); var translateOrigin = svgroot.createSVGTransform(), scale = svgroot.createSVGTransform(), translateBack = svgroot.createSVGTransform(); translateOrigin.setTranslate(t2n.e, t2n.f); scale.setScale(s2.a, s2.d); translateBack.setTranslate(t2.e, t2.f); childTlist.appendItem(translateBack); childTlist.appendItem(scale); childTlist.appendItem(translateOrigin); childxforms.push(translateBack); childxforms.push(scale); childxforms.push(translateOrigin); logMatrix(translateBack.matrix); logMatrix(scale.matrix); } // not rotated batchCmd.addSubCommand( recalculateDimensions(child) ); // TODO: If any <use> have this group as a parent and are // referencing this child, then we need to impose a reverse // scale on it so that when it won't get double-translated // var uses = selected.getElementsByTagNameNS(svgns, "use"); // var href = "#"+child.id; // var u = uses.length; // while (u--) { // var useElem = uses.item(u); // if(href == getHref(useElem)) { // var usexlate = svgroot.createSVGTransform(); // usexlate.setTranslate(-tx,-ty); // getTransformList(useElem).insertItemBefore(usexlate,0); // batchCmd.addSubCommand( recalculateDimensions(useElem) ); // } // } start_transform = old_start_transform; } // element } // for each child // Remove these transforms from group tlist.removeItem(N-1); tlist.removeItem(N-2); tlist.removeItem(N-3); } else if (N >= 3 && tlist.getItem(N-1).type == 1) { operation = 3; // scale m = transformListToTransform(tlist).matrix; var e2t = svgroot.createSVGTransform(); e2t.setMatrix(m); tlist.clear(); tlist.appendItem(e2t); } // next, check if the first transform was a translate // if we had [ T1 ] [ M ] we want to transform this into [ M ] [ T2 ] // therefore [ T2 ] = [ M_inv ] [ T1 ] [ M ] else if ( (N == 1 || (N > 1 && tlist.getItem(1).type != 3)) && tlist.getItem(0).type == 2) { operation = 2; // translate var T_M = transformListToTransform(tlist).matrix; tlist.removeItem(0); var M_inv = transformListToTransform(tlist).matrix.inverse(); var M2 = matrixMultiply( M_inv, T_M ); tx = M2.e; ty = M2.f; if (tx != 0 || ty != 0) { // we pass the translates down to the individual children var children = selected.childNodes; var c = children.length; var clipPaths_done = []; while (c--) { var child = children.item(c); if (child.nodeType == 1) { // Check if child has clip-path if(child.getAttribute('clip-path')) { // tx, ty var attr = child.getAttribute('clip-path'); if($.inArray(attr, clipPaths_done) === -1) { updateClipPath(attr, tx, ty); clipPaths_done.push(attr); } } var old_start_transform = start_transform; start_transform = child.getAttribute("transform"); var childTlist = getTransformList(child); // some children might not have a transform (<metadata>, <defs>, etc) if (childTlist) { var newxlate = svgroot.createSVGTransform(); newxlate.setTranslate(tx,ty); if(childTlist.numberOfItems) { childTlist.insertItemBefore(newxlate, 0); } else { childTlist.appendItem(newxlate); } batchCmd.addSubCommand( recalculateDimensions(child) ); // If any <use> have this group as a parent and are // referencing this child, then impose a reverse translate on it // so that when it won't get double-translated var uses = selected.getElementsByTagNameNS(svgns, "use"); var href = "#"+child.id; var u = uses.length; while (u--) { var useElem = uses.item(u); if(href == getHref(useElem)) { var usexlate = svgroot.createSVGTransform(); usexlate.setTranslate(-tx,-ty); getTransformList(useElem).insertItemBefore(usexlate,0); batchCmd.addSubCommand( recalculateDimensions(useElem) ); } } start_transform = old_start_transform; } } } clipPaths_done = []; start_transform = old_start_transform; } } // else, a matrix imposition from a parent group // keep pushing it down to the children else if (N == 1 && tlist.getItem(0).type == 1 && !gangle) { operation = 1; var m = tlist.getItem(0).matrix, children = selected.childNodes, c = children.length; while (c--) { var child = children.item(c); if (child.nodeType == 1) { var old_start_transform = start_transform; start_transform = child.getAttribute("transform"); var childTlist = getTransformList(child); if (!childTlist) continue; var em = matrixMultiply(m, transformListToTransform(childTlist).matrix); var e2m = svgroot.createSVGTransform(); e2m.setMatrix(em); childTlist.clear(); childTlist.appendItem(e2m,0); batchCmd.addSubCommand( recalculateDimensions(child) ); start_transform = old_start_transform; } } tlist.clear(); } // else it was just a rotate else { if (gangle) { var newRot = svgroot.createSVGTransform(); newRot.setRotate(gangle,newcenter.x,newcenter.y); if(tlist.numberOfItems) { tlist.insertItemBefore(newRot, 0); } else { tlist.appendItem(newRot); } } if (tlist.numberOfItems == 0) { selected.removeAttribute("transform"); } return null; } // if it was a translate, put back the rotate at the new center if (operation == 2) { if (gangle) { newcenter = { x: oldcenter.x + first_m.e, y: oldcenter.y + first_m.f }; var newRot = svgroot.createSVGTransform(); newRot.setRotate(gangle,newcenter.x,newcenter.y); if(tlist.numberOfItems) { tlist.insertItemBefore(newRot, 0); } else { tlist.appendItem(newRot); } } } // if it was a resize else if (operation == 3) { var m = transformListToTransform(tlist).matrix; var roldt = svgroot.createSVGTransform(); roldt.setRotate(gangle, oldcenter.x, oldcenter.y); var rold = roldt.matrix; var rnew = svgroot.createSVGTransform(); rnew.setRotate(gangle, newcenter.x, newcenter.y); var rnew_inv = rnew.matrix.inverse(), m_inv = m.inverse(), extrat = matrixMultiply(m_inv, rnew_inv, rold, m); tx = extrat.e; ty = extrat.f; if (tx != 0 || ty != 0) { // now push this transform down to the children // we pass the translates down to the individual children var children = selected.childNodes; var c = children.length; while (c--) { var child = children.item(c); if (child.nodeType == 1) { var old_start_transform = start_transform; start_transform = child.getAttribute("transform"); var childTlist = getTransformList(child); var newxlate = svgroot.createSVGTransform(); newxlate.setTranslate(tx,ty); if(childTlist.numberOfItems) { childTlist.insertItemBefore(newxlate, 0); } else { childTlist.appendItem(newxlate); } batchCmd.addSubCommand( recalculateDimensions(child) ); start_transform = old_start_transform; } } } if (gangle) { if(tlist.numberOfItems) { tlist.insertItemBefore(rnew, 0); } else { tlist.appendItem(rnew); } } } } // else, it's a non-group else { // FIXME: box might be null for some elements (<metadata> etc), need to handle this var box = getBBox(selected); // Paths (and possbly other shapes) will have no BBox while still in <defs>, // but we still may need to recalculate them (see issue 595). // TODO: Figure out how to get BBox from these elements in case they // have a rotation transform if(!box && selected.tagName != 'path') return null; var m = svgroot.createSVGMatrix(), // temporarily strip off the rotate and save the old center angle = getRotationAngle(selected); if (angle) { var oldcenter = {x: box.x+box.width/2, y: box.y+box.height/2}, newcenter = transformPoint(box.x+box.width/2, box.y+box.height/2, transformListToTransform(tlist).matrix); var a = angle * Math.PI / 180; if ( Math.abs(a) > (1.0e-10) ) { var s = Math.sin(a)/(1 - Math.cos(a)); } else { // FIXME: This blows up if the angle is exactly 0! var s = 2/a; } for (var i = 0; i < tlist.numberOfItems; ++i) { var xform = tlist.getItem(i); if (xform.type == 4) { // extract old center through mystical arts var rm = xform.matrix; oldcenter.y = (s*rm.e + rm.f)/2; oldcenter.x = (rm.e - s*rm.f)/2; tlist.removeItem(i); break; } } } // 2 = translate, 3 = scale, 4 = rotate, 1 = matrix imposition var operation = 0; var N = tlist.numberOfItems; // Check if it has a gradient with userSpaceOnUse, in which case // adjust it by recalculating the matrix transform. // TODO: Make this work in Webkit using SVGEditTransformList if(!isWebkit) { var fill = selected.getAttribute('fill'); if(fill && fill.indexOf('url(') === 0) { var grad = getElem(getUrlFromAttr(fill).substr(1)); if(grad.getAttribute('gradientUnits') === 'userSpaceOnUse') { //Update the userSpaceOnUse element var grad = $(grad); m = transformListToTransform(tlist).matrix; var gtlist = getTransformList(grad[0]); var gmatrix = transformListToTransform(gtlist).matrix; m = matrixMultiply(m, gmatrix); var m_str = "matrix(" + [m.a,m.b,m.c,m.d,m.e,m.f].join(",") + ")"; grad.attr('gradientTransform', m_str); } } } // first, if it was a scale of a non-skewed element, then the second-last // transform will be the [S] // if we had [M][T][S][T] we want to extract the matrix equivalent of // [T][S][T] and push it down to the element if (N >= 3 && tlist.getItem(N-2).type == 3 && tlist.getItem(N-3).type == 2 && tlist.getItem(N-1).type == 2) // Removed this so a <use> with a given [T][S][T] would convert to a matrix. // Is that bad? // && selected.nodeName != "use" { operation = 3; // scale m = transformListToTransform(tlist,N-3,N-1).matrix; tlist.removeItem(N-1); tlist.removeItem(N-2); tlist.removeItem(N-3); } // if we had [T][S][-T][M], then this was a skewed element being resized // Thus, we simply combine it all into one matrix else if(N == 4 && tlist.getItem(N-1).type == 1) { operation = 3; // scale m = transformListToTransform(tlist).matrix; var e2t = svgroot.createSVGTransform(); e2t.setMatrix(m); tlist.clear(); tlist.appendItem(e2t); // reset the matrix so that the element is not re-mapped m = svgroot.createSVGMatrix(); } // if we had [R][T][S][-T][M], then this was a rotated matrix-element // if we had [T1][M] we want to transform this into [M][T2] // therefore [ T2 ] = [ M_inv ] [ T1 ] [ M ] and we can push [T2] // down to the element else if ( (N == 1 || (N > 1 && tlist.getItem(1).type != 3)) && tlist.getItem(0).type == 2) { operation = 2; // translate var oldxlate = tlist.getItem(0).matrix, meq = transformListToTransform(tlist,1).matrix, meq_inv = meq.inverse(); m = matrixMultiply( meq_inv, oldxlate, meq ); tlist.removeItem(0); } // else if this child now has a matrix imposition (from a parent group) // we might be able to simplify else if (N == 1 && tlist.getItem(0).type == 1 && !angle) { // Remap all point-based elements m = transformListToTransform(tlist).matrix; switch (selected.tagName) { case 'line': changes = $(selected).attr(["x1","y1","x2","y2"]); case 'polyline': case 'polygon': changes.points = selected.getAttribute("points"); if(changes.points) { var list = selected.points; var len = list.numberOfItems; changes.points = new Array(len); for (var i = 0; i < len; ++i) { var pt = list.getItem(i); changes.points[i] = {x:pt.x,y:pt.y}; } } case 'path': changes.d = selected.getAttribute("d"); operation = 1; tlist.clear(); break; default: break; } } // if it was a rotation, put the rotate back and return without a command // (this function has zero work to do for a rotate()) else { operation = 4; // rotation if (angle) { var newRot = svgroot.createSVGTransform(); newRot.setRotate(angle,newcenter.x,newcenter.y); if(tlist.numberOfItems) { tlist.insertItemBefore(newRot, 0); } else { tlist.appendItem(newRot); } } if (tlist.numberOfItems == 0) { selected.removeAttribute("transform"); } return null; } // if it was a translate or resize, we need to remap the element and absorb the xform if (operation == 1 || operation == 2 || operation == 3) { remapElement(selected,changes,m); } // if we are remapping // if it was a translate, put back the rotate at the new center if (operation == 2) { if (angle) { if(!hasMatrixTransform(tlist)) { newcenter = { x: oldcenter.x + m.e, y: oldcenter.y + m.f }; } var newRot = svgroot.createSVGTransform(); newRot.setRotate(angle, newcenter.x, newcenter.y); if(tlist.numberOfItems) { tlist.insertItemBefore(newRot, 0); } else { tlist.appendItem(newRot); } } } // [Rold][M][T][S][-T] became [Rold][M] // we want it to be [Rnew][M][Tr] where Tr is the // translation required to re-center it // Therefore, [Tr] = [M_inv][Rnew_inv][Rold][M] else if (operation == 3 && angle) { var m = transformListToTransform(tlist).matrix; var roldt = svgroot.createSVGTransform(); roldt.setRotate(angle, oldcenter.x, oldcenter.y); var rold = roldt.matrix; var rnew = svgroot.createSVGTransform(); rnew.setRotate(angle, newcenter.x, newcenter.y); var rnew_inv = rnew.matrix.inverse(); var m_inv = m.inverse(); var extrat = matrixMultiply(m_inv, rnew_inv, rold, m); remapElement(selected,changes,extrat); if (angle) { if(tlist.numberOfItems) { tlist.insertItemBefore(rnew, 0); } else { tlist.appendItem(rnew); } } } } // a non-group // if the transform list has been emptied, remove it if (tlist.numberOfItems == 0) { selected.removeAttribute("transform"); } batchCmd.addSubCommand(new ChangeElementCommand(selected, initial)); return batchCmd; }; // Root Current Transformation Matrix in user units var root_sctm = null; // Function: transformPoint // A (hopefully) quicker function to transform a point by a matrix // (this function avoids any DOM calls and just does the math) // // Parameters: // x - Float representing the x coordinate // y - Float representing the y coordinate // m - Matrix object to transform the point with // Returns a x,y object representing the transformed point var transformPoint = function(x, y, m) { return { x: m.a * x + m.c * y + m.e, y: m.b * x + m.d * y + m.f}; }; // Function: isIdentity // Helper function to check if the matrix performs no actual transform // (i.e. exists for identity purposes) // // Parameters: // m - The matrix object to check // // Returns: // Boolean indicating whether or not the matrix is 1,0,0,1,0,0 var isIdentity = function(m) { return (m.a == 1 && m.b == 0 && m.c == 0 && m.d == 1 && m.e == 0 && m.f == 0); } // matrixMultiply() is provided because WebKit didn't implement multiply() correctly // on the SVGMatrix interface. See https://bugs.webkit.org/show_bug.cgi?id=16062 // Function: matrixMultiply // This function tries to return a SVGMatrix that is the multiplication m1*m2. // We also round to zero when it's near zero // // Parameters: // >= 2 Matrix objects to multiply // // Returns: // The matrix object resulting from the calculation var matrixMultiply = this.matrixMultiply = function() { var NEAR_ZERO = 1e-14, multi2 = function(m1, m2) { var m = svgroot.createSVGMatrix(); m.a = m1.a*m2.a + m1.c*m2.b; m.b = m1.b*m2.a + m1.d*m2.b, m.c = m1.a*m2.c + m1.c*m2.d, m.d = m1.b*m2.c + m1.d*m2.d, m.e = m1.a*m2.e + m1.c*m2.f + m1.e, m.f = m1.b*m2.e + m1.d*m2.f + m1.f; return m; }, args = arguments, i = args.length, m = args[i-1]; while(i-- > 1) { var m1 = args[i-1]; m = multi2(m1, m); } if (Math.abs(m.a) < NEAR_ZERO) m.a = 0; if (Math.abs(m.b) < NEAR_ZERO) m.b = 0; if (Math.abs(m.c) < NEAR_ZERO) m.c = 0; if (Math.abs(m.d) < NEAR_ZERO) m.d = 0; if (Math.abs(m.e) < NEAR_ZERO) m.e = 0; if (Math.abs(m.f) < NEAR_ZERO) m.f = 0; return m; } // Function: transformListToTransform // This returns a single matrix Transform for a given Transform List // (this is the equivalent of SVGTransformList.consolidate() but unlike // that method, this one does not modify the actual SVGTransformList) // This function is very liberal with its min,max arguments // // Parameters: // tlist - The transformlist object // min - Optional integer indicating start transform position // max - Optional integer indicating end transform position // // Returns: // A single matrix transform object var transformListToTransform = this.transformListToTransform = function(tlist, min, max) { if(tlist == null) { // Or should tlist = null have been prevented before this? return svgroot.createSVGTransformFromMatrix(svgroot.createSVGMatrix()); } var min = min == undefined ? 0 : min; var max = max == undefined ? (tlist.numberOfItems-1) : max; min = parseInt(min); max = parseInt(max); if (min > max) { var temp = max; max = min; min = temp; } var m = svgroot.createSVGMatrix(); for (var i = min; i <= max; ++i) { // if our indices are out of range, just use a harmless identity matrix var mtom = (i >= 0 && i < tlist.numberOfItems ? tlist.getItem(i).matrix : svgroot.createSVGMatrix()); m = matrixMultiply(m, mtom); } return svgroot.createSVGTransformFromMatrix(m); }; // Function: hasMatrixTransform // See if the given transformlist includes a non-indentity matrix transform // // Parameters: // tlist - The transformlist to check // // Returns: // Boolean on whether or not a matrix transform was found var hasMatrixTransform = this.hasMatrixTransform = function(tlist) { if(!tlist) return false; var num = tlist.numberOfItems; while (num--) { var xform = tlist.getItem(num); if (xform.type == 1 && !isIdentity(xform.matrix)) return true; } return false; } // Function: getMatrix // Get the matrix object for a given element // // Parameters: // elem - The DOM element to check // // Returns: // The matrix object associated with the element's transformlist var getMatrix = function(elem) { var tlist = getTransformList(elem); return transformListToTransform(tlist).matrix; } // Function: transformBox // Transforms a rectangle based on the given matrix // // Parameters: // l - Float with the box's left coordinate // t - Float with the box's top coordinate // w - Float with the box width // h - Float with the box height // m - Matrix object to transform the box by // // Returns: // An object with the following values: // * tl - The top left coordinate (x,y object) // * tr - The top right coordinate (x,y object) // * bl - The bottom left coordinate (x,y object) // * br - The bottom right coordinate (x,y object) // * aabox - Object with the following values: // * Float with the axis-aligned x coordinate // * Float with the axis-aligned y coordinate // * Float with the axis-aligned width coordinate // * Float with the axis-aligned height coordinate var transformBox = this.transformBox = function(l, t, w, h, m) { var topleft = {x:l,y:t}, topright = {x:(l+w),y:t}, botright = {x:(l+w),y:(t+h)}, botleft = {x:l,y:(t+h)}; topleft = transformPoint( topleft.x, topleft.y, m ); var minx = topleft.x, maxx = topleft.x, miny = topleft.y, maxy = topleft.y; topright = transformPoint( topright.x, topright.y, m ); minx = Math.min(minx, topright.x); maxx = Math.max(maxx, topright.x); miny = Math.min(miny, topright.y); maxy = Math.max(maxy, topright.y); botleft = transformPoint( botleft.x, botleft.y, m); minx = Math.min(minx, botleft.x); maxx = Math.max(maxx, botleft.x); miny = Math.min(miny, botleft.y); maxy = Math.max(maxy, botleft.y); botright = transformPoint( botright.x, botright.y, m ); minx = Math.min(minx, botright.x); maxx = Math.max(maxx, botright.x); miny = Math.min(miny, botright.y); maxy = Math.max(maxy, botright.y); return {tl:topleft, tr:topright, bl:botleft, br:botright, aabox: {x:minx, y:miny, width:(maxx-minx), height:(maxy-miny)} }; }; // Group: Selection // Function: clearSelection // Clears the selection. The 'selected' handler is then called. // Parameters: // noCall - Optional boolean that when true does not call the "selected" handler var clearSelection = this.clearSelection = function(noCall) { if (selectedElements[0] != null) { var len = selectedElements.length; for (var i = 0; i < len; ++i) { var elem = selectedElements[i]; if (elem == null) break; selectorManager.releaseSelector(elem); selectedElements[i] = null; } selectedBBoxes[0] = null; } if(!noCall) call("selected", selectedElements); }; // TODO: do we need to worry about selectedBBoxes here? // Function: addToSelection // Adds a list of elements to the selection. The 'selected' handler is then called. // // Parameters: // elemsToAdd - an array of DOM elements to add to the selection // showGrips - a boolean flag indicating whether the resize grips should be shown var addToSelection = this.addToSelection = function(elemsToAdd, showGrips) { if (elemsToAdd.length == 0) { return; } // find the first null in our selectedElements array var j = 0; while (j < selectedElements.length) { if (selectedElements[j] == null) { break; } ++j; } // now add each element consecutively var i = elemsToAdd.length; while (i--) { var elem = elemsToAdd[i]; if (!elem || !getBBox(elem)) continue; // if it's not already there, add it if (selectedElements.indexOf(elem) == -1) { selectedElements[j] = elem; // only the first selectedBBoxes element is ever used in the codebase these days if (j == 0) selectedBBoxes[j] = getBBox(elem); j++; var sel = selectorManager.requestSelector(elem); if (selectedElements.length > 1) { sel.showGrips(false); } } } if(selectedElements[0] && selectedElements.length === 1 && selectedElements[0].tagName == 'a') { // Make "a" element's child be the selected element selectedElements[0] = selectedElements[0].firstChild; } call("selected", selectedElements); if (showGrips || selectedElements.length == 1) { selectorManager.requestSelector(selectedElements[0]).showGrips(true); } else { selectorManager.requestSelector(selectedElements[0]).showGrips(false); } // make sure the elements are in the correct order // See: http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-compareDocumentPosition selectedElements.sort(function(a,b) { if(a && b && a.compareDocumentPosition) { return 3 - (b.compareDocumentPosition(a) & 6); } else if(a == null) { return 1; } }); // Make sure first elements are not null while(selectedElements[0] == null) selectedElements.shift(0); }; // Function: selectOnly() // Selects only the given elements, shortcut for clearSelection(); addToSelection() // // Parameters: // elems - an array of DOM elements to be selected var selectOnly = this.selectOnly = function(elems, showGrips) { clearSelection(true); addToSelection(elems, showGrips); } // TODO: could use slice here to make this faster? // TODO: should the 'selected' handler // Function: removeFromSelection // Removes elements from the selection. // // Parameters: // elemsToRemove - an array of elements to remove from selection var removeFromSelection = this.removeFromSelection = function(elemsToRemove) { if (selectedElements[0] == null) { return; } if (elemsToRemove.length == 0) { return; } // find every element and remove it from our array copy var newSelectedItems = new Array(selectedElements.length), newSelectedBBoxes = new Array(selectedBBoxes.length), j = 0, len = selectedElements.length; for (var i = 0; i < len; ++i) { var elem = selectedElements[i]; if (elem) { // keep the item if (elemsToRemove.indexOf(elem) == -1) { newSelectedItems[j] = elem; if (j==0) newSelectedBBoxes[j] = selectedBBoxes[i]; j++; } else { // remove the item and its selector selectorManager.releaseSelector(elem); } } } // the copy becomes the master now selectedElements = newSelectedItems; selectedBBoxes = newSelectedBBoxes; }; // Function: selectAllInCurrentLayer // Clears the selection, then adds all elements in the current layer to the selection. this.selectAllInCurrentLayer = function() { if (current_layer) { selectOnly($(current_layer).children()); current_mode = "select"; } }; // Function: smoothControlPoints // Takes three points and creates a smoother line based on them // // Parameters: // ct1 - Object with x and y values (first control point) // ct2 - Object with x and y values (second control point) // pt - Object with x and y values (third point) // // Returns: // Array of two "smoothed" point objects var smoothControlPoints = this.smoothControlPoints = function(ct1, ct2, pt) { // each point must not be the origin var x1 = ct1.x - pt.x, y1 = ct1.y - pt.y, x2 = ct2.x - pt.x, y2 = ct2.y - pt.y; if ( (x1 != 0 || y1 != 0) && (x2 != 0 || y2 != 0) ) { var anglea = Math.atan2(y1,x1), angleb = Math.atan2(y2,x2), r1 = Math.sqrt(x1*x1+y1*y1), r2 = Math.sqrt(x2*x2+y2*y2), nct1 = svgroot.createSVGPoint(), nct2 = svgroot.createSVGPoint(); if (anglea < 0) { anglea += 2*Math.PI; } if (angleb < 0) { angleb += 2*Math.PI; } var angleBetween = Math.abs(anglea - angleb), angleDiff = Math.abs(Math.PI - angleBetween)/2; var new_anglea, new_angleb; if (anglea - angleb > 0) { new_anglea = angleBetween < Math.PI ? (anglea + angleDiff) : (anglea - angleDiff); new_angleb = angleBetween < Math.PI ? (angleb - angleDiff) : (angleb + angleDiff); } else { new_anglea = angleBetween < Math.PI ? (anglea - angleDiff) : (anglea + angleDiff); new_angleb = angleBetween < Math.PI ? (angleb + angleDiff) : (angleb - angleDiff); } // rotate the points nct1.x = r1 * Math.cos(new_anglea) + pt.x; nct1.y = r1 * Math.sin(new_anglea) + pt.y; nct2.x = r2 * Math.cos(new_angleb) + pt.x; nct2.y = r2 * Math.sin(new_angleb) + pt.y; return [nct1, nct2]; } return undefined; }; // Function: getMouseTarget // Gets the desired element from a mouse event // // Parameters: // evt - Event object from the mouse event // // Returns: // DOM element we want var getMouseTarget = this.getMouseTarget = function(evt) { if (evt == null) { return null; } var mouse_target = evt.target; // if it was a <use>, Opera and WebKit return the SVGElementInstance if (mouse_target.correspondingUseElement) mouse_target = mouse_target.correspondingUseElement; // for foreign content, go up until we find the foreignObject // WebKit browsers set the mouse target to the svgcanvas div if ($.inArray(mouse_target.namespaceURI, [mathns, htmlns]) != -1 && mouse_target.id != "svgcanvas") { while (mouse_target.nodeName != "foreignObject") { mouse_target = mouse_target.parentNode; if(!mouse_target) return svgroot; } } // Get the desired mouse_target with jQuery selector-fu // If it's root-like, select the root if($.inArray(mouse_target, [svgroot, container, svgcontent, current_layer]) !== -1) { return svgroot; } var $target = $(mouse_target); // If it's a selection grip, return the grip parent if($target.closest('#selectorParentGroup').length) { // While we could instead have just returned mouse_target, // this makes it easier to indentify as being a selector grip return selectorManager.selectorParentGroup; } while (mouse_target.parentNode !== current_layer) { mouse_target = mouse_target.parentNode; } return mouse_target; // // // go up until we hit a child of a layer // while (mouse_target.parentNode.parentNode.tagName == 'g') { // mouse_target = mouse_target.parentNode; // } // Webkit bubbles the mouse event all the way up to the div, so we // set the mouse_target to the svgroot like the other browsers // if (mouse_target.nodeName.toLowerCase() == "div") { // mouse_target = svgroot; // } return mouse_target; }; // Mouse events (function() { var off_x, off_y; var d_attr = null, start_x = null, start_y = null, r_start_x = null, r_start_y = null, init_bbox = {}, freehand = { minx: null, miny: null, maxx: null, maxy: null }; // - when we are in a create mode, the element is added to the canvas // but the action is not recorded until mousing up // - when we are in select mode, select the element, remember the position // and do nothing else var mouseDown = function(evt) { if(canvas.spaceKey) return; var right_click = evt.button === 2; root_sctm = svgcontent.getScreenCTM().inverse(); var pt = transformPoint( evt.pageX, evt.pageY, root_sctm ), mouse_x = pt.x * current_zoom, mouse_y = pt.y * current_zoom; if($.browser.msie) { var off = $(container.parentNode).offset(); off_x = svgcontent.getAttribute('x')-0 + off.left - container.parentNode.scrollLeft; off_y = svgcontent.getAttribute('y')-0 + off.top - container.parentNode.scrollTop; mouse_x = -(off_x - evt.pageX); mouse_y = -(off_y - evt.pageY); } evt.preventDefault(); if(right_click) { current_mode = "select"; lastClickPoint = pt; } // This would seem to be unnecessary... // if($.inArray(current_mode, ['select', 'resize']) == -1) { // setGradient(); // } var x = mouse_x / current_zoom, y = mouse_y / current_zoom, mouse_target = getMouseTarget(evt); // real_x/y ignores grid-snap value var real_x = r_start_x = start_x = x; var real_y = r_start_y = start_y = y; if(curConfig.gridSnapping){ x = snapToGrid(x); y = snapToGrid(y); start_x = snapToGrid(start_x); start_y = snapToGrid(start_y); } // if it is a selector grip, then it must be a single element selected, // set the mouse_target to that and update the mode to rotate/resize if (mouse_target == selectorManager.selectorParentGroup && selectedElements[0] != null) { var grip = evt.target; var griptype = elData(grip, "type"); // rotating if (griptype == "rotate") { current_mode = "rotate"; } // resizing else if(griptype == "resize") { current_mode = "resize"; current_resize_mode = elData(grip, "dir"); } mouse_target = selectedElements[0]; } start_transform = mouse_target.getAttribute("transform"); var tlist = getTransformList(mouse_target); switch (current_mode) { case "select": started = true; current_resize_mode = "none"; if(right_click) started = false; if (mouse_target != svgroot) { // if this element is not yet selected, clear selection and select it if (selectedElements.indexOf(mouse_target) == -1) { // only clear selection if shift is not pressed (otherwise, add // element to selection) if (!evt.shiftKey) { // No need to do the call here as it will be done on addToSelection clearSelection(true); } addToSelection([mouse_target]); justSelected = mouse_target; pathActions.clear(); } // else if it's a path, go into pathedit mode in mouseup if(!right_click) { // insert a dummy transform so if the element(s) are moved it will have // a transform to use for its translate for (var i = 0; i < selectedElements.length; ++i) { if(selectedElements[i] == null) continue; var slist = getTransformList(selectedElements[i]); if(slist.numberOfItems) { slist.insertItemBefore(svgroot.createSVGTransform(), 0); } else { slist.appendItem(svgroot.createSVGTransform()); } } } } else if(!right_click){ clearSelection(); current_mode = "multiselect"; if (rubberBox == null) { rubberBox = selectorManager.getRubberBandBox(); } r_start_x *= current_zoom; r_start_y *= current_zoom; // console.log('p',[evt.pageX, evt.pageY]); // console.log('c',[evt.clientX, evt.clientY]); // console.log('o',[evt.offsetX, evt.offsetY]); // console.log('s',[start_x, start_y]); assignAttributes(rubberBox, { 'x': r_start_x, 'y': r_start_y, 'width': 0, 'height': 0, 'display': 'inline' }, 100); } break; case "zoom": started = true; if (rubberBox == null) { rubberBox = selectorManager.getRubberBandBox(); } assignAttributes(rubberBox, { 'x': real_x * current_zoom, 'y': real_x * current_zoom, 'width': 0, 'height': 0, 'display': 'inline' }, 100); break; case "resize": started = true; start_x = x; start_y = y; // Getting the BBox from the selection box, since we know we // want to orient around it init_bbox = getBBox($('#selectedBox0')[0]); var bb = {}; $.each(init_bbox, function(key, val) { bb[key] = val/current_zoom; }); init_bbox = bb; // append three dummy transforms to the tlist so that // we can translate,scale,translate in mousemove var pos = getRotationAngle(mouse_target)?1:0; if(hasMatrixTransform(tlist)) { tlist.insertItemBefore(svgroot.createSVGTransform(), pos); tlist.insertItemBefore(svgroot.createSVGTransform(), pos); tlist.insertItemBefore(svgroot.createSVGTransform(), pos); } else { tlist.appendItem(svgroot.createSVGTransform()); tlist.appendItem(svgroot.createSVGTransform()); tlist.appendItem(svgroot.createSVGTransform()); } break; case "fhellipse": case "fhrect": case "fhpath": started = true; d_attr = real_x + "," + real_y + " "; var stroke_w = cur_shape.stroke_width == 0?1:cur_shape.stroke_width; addSvgElementFromJson({ "element": "polyline", "curStyles": true, "attr": { "points": d_attr, "id": getNextId(), "fill": "none", "opacity": cur_shape.opacity / 2, "stroke-linecap": "round", "style": "pointer-events:none" } }); freehand.minx = real_x; freehand.maxx = real_x; freehand.miny = real_y; freehand.maxy = real_y; break; case "image": started = true; var newImage = addSvgElementFromJson({ "element": "image", "attr": { "x": x, "y": y, "width": 0, "height": 0, "id": getNextId(), "opacity": cur_shape.opacity / 2, "style": "pointer-events:inherit" } }); setHref(newImage, last_good_img_url); preventClickDefault(newImage); break; case "square": // FIXME: once we create the rect, we lose information that this was a square // (for resizing purposes this could be important) case "rect": started = true; start_x = x; start_y = y; addSvgElementFromJson({ "element": "rect", "curStyles": true, "attr": { "x": x, "y": y, "width": 0, "height": 0, "id": getNextId(), "opacity": cur_shape.opacity / 2 } }); break; case "line": started = true; var stroke_w = cur_shape.stroke_width == 0?1:cur_shape.stroke_width; addSvgElementFromJson({ "element": "line", "curStyles": true, "attr": { "x1": x, "y1": y, "x2": x, "y2": y, "id": getNextId(), "stroke": cur_shape.stroke, "stroke-width": stroke_w, "stroke-dasharray": cur_shape.stroke_dasharray, "stroke-linejoin": cur_shape.stroke_linejoin, "stroke-linecap": cur_shape.stroke_linecap, "stroke-opacity": cur_shape.stroke_opacity, "fill": "none", "opacity": cur_shape.opacity / 2, "style": "pointer-events:none" } }); break; case "circle": started = true; addSvgElementFromJson({ "element": "circle", "curStyles": true, "attr": { "cx": x, "cy": y, "r": 0, "id": getNextId(), "opacity": cur_shape.opacity / 2 } }); break; case "ellipse": started = true; addSvgElementFromJson({ "element": "ellipse", "curStyles": true, "attr": { "cx": x, "cy": y, "rx": 0, "ry": 0, "id": getNextId(), "opacity": cur_shape.opacity / 2 } }); break; case "text": started = true; var newText = addSvgElementFromJson({ "element": "text", "curStyles": true, "attr": { "x": x, "y": y, "id": getNextId(), "fill": cur_text.fill, "stroke-width": cur_text.stroke_width, "font-size": cur_text.font_size, "font-family": cur_text.font_family, "text-anchor": "middle", "xml:space": "preserve" } }); // newText.textContent = "text"; break; case "path": // Fall through case "pathedit": start_x *= current_zoom; start_y *= current_zoom; pathActions.mouseDown(evt, mouse_target, start_x, start_y); started = true; break; case "textedit": start_x *= current_zoom; start_y *= current_zoom; textActions.mouseDown(evt, mouse_target, start_x, start_y); started = true; break; case "rotate": started = true; // we are starting an undoable change (a drag-rotation) canvas.beginUndoableChange("transform", selectedElements); break; default: // This could occur in an extension break; } var ext_result = runExtensions("mouseDown", { event: evt, start_x: start_x, start_y: start_y, selectedElements: selectedElements }, true); $.each(ext_result, function(i, r) { if(r && r.started) { started = true; } }); }; // in this function we do not record any state changes yet (but we do update // any elements that are still being created, moved or resized on the canvas) // TODO: svgcanvas should just retain a reference to the image being dragged instead // of the getId() and getElementById() funkiness - this will help us customize the ids // a little bit for squares and paths var mouseMove = function(evt) { if (!started) return; if(evt.button === 1 || canvas.spaceKey) return; var selected = selectedElements[0], pt = transformPoint( evt.pageX, evt.pageY, root_sctm ), mouse_x = pt.x * current_zoom, mouse_y = pt.y * current_zoom, shape = getElem(getId()); // IE9 gives the wrong root_sctm // TODO: Use non-browser sniffing way to make this work if($.browser.msie) { mouse_x = -(off_x - evt.pageX); mouse_y = -(off_y - evt.pageY); } var real_x = x = mouse_x / current_zoom; var real_y = y = mouse_y / current_zoom; if(curConfig.gridSnapping){ x = snapToGrid(x); y = snapToGrid(y); } evt.preventDefault(); switch (current_mode) { case "select": // we temporarily use a translate on the element(s) being dragged // this transform is removed upon mousing up and the element is // relocated to the new location if (selectedElements[0] != null) { var dx = x - start_x; var dy = y - start_y; if(curConfig.gridSnapping){ dx = snapToGrid(dx); dy = snapToGrid(dy); } if(evt.shiftKey) { var xya = Utils.snapToAngle(start_x,start_y,x,y); x=xya.x; y=xya.y; } if (dx != 0 || dy != 0) { var len = selectedElements.length; for (var i = 0; i < len; ++i) { var selected = selectedElements[i]; if (selected == null) break; if (i==0) { var box = getBBox(selected); // selectedBBoxes[i].x = box.x + dx; // selectedBBoxes[i].y = box.y + dy; } // update the dummy transform in our transform list // to be a translate var xform = svgroot.createSVGTransform(); var tlist = getTransformList(selected); // Note that if Webkit and there's no ID for this // element, the dummy transform may have gotten lost. // This results in unexpected behaviour xform.setTranslate(dx,dy); if(tlist.numberOfItems) { tlist.replaceItem(xform, 0); } else { tlist.appendItem(xform); } // update our internal bbox that we're tracking while dragging selectorManager.requestSelector(selected).resize(); } } } break; case "multiselect": real_x *= current_zoom; real_y *= current_zoom; assignAttributes(rubberBox, { 'x': Math.min(r_start_x, real_x), 'y': Math.min(r_start_y, real_y), 'width': Math.abs(real_x - r_start_x), 'height': Math.abs(real_y - r_start_y) },100); // for each selected: // - if newList contains selected, do nothing // - if newList doesn't contain selected, remove it from selected // - for any newList that was not in selectedElements, add it to selected var elemsToRemove = [], elemsToAdd = [], newList = getIntersectionList(), len = selectedElements.length; for (var i = 0; i < len; ++i) { var ind = newList.indexOf(selectedElements[i]); if (ind == -1) { elemsToRemove.push(selectedElements[i]); } else { newList[ind] = null; } } len = newList.length; for (i = 0; i < len; ++i) { if (newList[i]) elemsToAdd.push(newList[i]); } if (elemsToRemove.length > 0) canvas.removeFromSelection(elemsToRemove); if (elemsToAdd.length > 0) addToSelection(elemsToAdd); break; case "resize": // we track the resize bounding box and translate/scale the selected element // while the mouse is down, when mouse goes up, we use this to recalculate // the shape's coordinates var tlist = getTransformList(selected), hasMatrix = hasMatrixTransform(tlist), box=hasMatrix?init_bbox:getBBox(selected), left=box.x, top=box.y, width=box.width, height=box.height, dx=(x-start_x), dy=(y-start_y); if(curConfig.gridSnapping){ dx = snapToGrid(dx); dy = snapToGrid(dy); height = snapToGrid(height); width = snapToGrid(width); } // if rotated, adjust the dx,dy values var angle = getRotationAngle(selected); if (angle) { var r = Math.sqrt( dx*dx + dy*dy ), theta = Math.atan2(dy,dx) - angle * Math.PI / 180.0; dx = r * Math.cos(theta); dy = r * Math.sin(theta); } // if not stretching in y direction, set dy to 0 // if not stretching in x direction, set dx to 0 if(current_resize_mode.indexOf("n")==-1 && current_resize_mode.indexOf("s")==-1) { dy = 0; } if(current_resize_mode.indexOf("e")==-1 && current_resize_mode.indexOf("w")==-1) { dx = 0; } var ts = null, tx = 0, ty = 0, sy = height ? (height+dy)/height : 1, sx = width ? (width+dx)/width : 1; // if we are dragging on the north side, then adjust the scale factor and ty if(current_resize_mode.indexOf("n") != -1) { sy = height ? (height-dy)/height : 1; ty = height; } // if we dragging on the east side, then adjust the scale factor and tx if(current_resize_mode.indexOf("w") != -1) { sx = width ? (width-dx)/width : 1; tx = width; } // update the transform list with translate,scale,translate var translateOrigin = svgroot.createSVGTransform(), scale = svgroot.createSVGTransform(), translateBack = svgroot.createSVGTransform(); if(curConfig.gridSnapping){ left = snapToGrid(left); tx = snapToGrid(tx); top = snapToGrid(top); ty = snapToGrid(ty); } translateOrigin.setTranslate(-(left+tx),-(top+ty)); if(evt.shiftKey) { if(sx == 1) sx = sy else sy = sx; } scale.setScale(sx,sy); translateBack.setTranslate(left+tx,top+ty); if(hasMatrix) { var diff = angle?1:0; tlist.replaceItem(translateOrigin, 2+diff); tlist.replaceItem(scale, 1+diff); tlist.replaceItem(translateBack, 0+diff); } else { var N = tlist.numberOfItems; tlist.replaceItem(translateBack, N-3); tlist.replaceItem(scale, N-2); tlist.replaceItem(translateOrigin, N-1); } selectorManager.requestSelector(selected).resize(); break; case "zoom": real_x *= current_zoom; real_y *= current_zoom; assignAttributes(rubberBox, { 'x': Math.min(r_start_x*current_zoom, real_x), 'y': Math.min(r_start_y*current_zoom, real_y), 'width': Math.abs(real_x - r_start_x*current_zoom), 'height': Math.abs(real_y - r_start_y*current_zoom) },100); break; case "text": assignAttributes(shape,{ 'x': x, 'y': y },1000); break; case "line": // Opera has a problem with suspendRedraw() apparently var handle = null; if (!window.opera) svgroot.suspendRedraw(1000); if(curConfig.gridSnapping){ x = snapToGrid(x); y = snapToGrid(y); } var x2 = x; var y2 = y; if(evt.shiftKey) { var xya=Utils.snapToAngle(start_x,start_y,x2,y2); x2=xya.x; y2=xya.y; } shape.setAttributeNS(null, "x2", x2); shape.setAttributeNS(null, "y2", y2); if (!window.opera) svgroot.unsuspendRedraw(handle); break; case "foreignObject": // fall through case "square": // fall through case "rect": // fall through case "image": var square = (current_mode == 'square') || evt.shiftKey, w = Math.abs(x - start_x), h = Math.abs(y - start_y), new_x, new_y; if(square) { w = h = Math.max(w, h); new_x = start_x < x ? start_x : start_x - w; new_y = start_y < y ? start_y : start_y - h; } else { new_x = Math.min(start_x,x); new_y = Math.min(start_y,y); } if(curConfig.gridSnapping){ w = snapToGrid(w); h = snapToGrid(h); new_x = snapToGrid(new_x); new_y = snapToGrid(new_y); } assignAttributes(shape,{ 'width': w, 'height': h, 'x': new_x, 'y': new_y },1000); break; case "circle": var c = $(shape).attr(["cx", "cy"]); var cx = c.cx, cy = c.cy, rad = Math.sqrt( (x-cx)*(x-cx) + (y-cy)*(y-cy) ); if(curConfig.gridSnapping){ rad = snapToGrid(rad); } shape.setAttributeNS(null, "r", rad); break; case "ellipse": var c = $(shape).attr(["cx", "cy"]); var cx = c.cx, cy = c.cy; // Opera has a problem with suspendRedraw() apparently handle = null; if (!window.opera) svgroot.suspendRedraw(1000); if(curConfig.gridSnapping){ x = snapToGrid(x); cx = snapToGrid(cx); y = snapToGrid(y); cy = snapToGrid(cy); } shape.setAttributeNS(null, "rx", Math.abs(x - cx) ); var ry = Math.abs(evt.shiftKey?(x - cx):(y - cy)); shape.setAttributeNS(null, "ry", ry ); if (!window.opera) svgroot.unsuspendRedraw(handle); break; case "fhellipse": case "fhrect": freehand.minx = Math.min(real_x, freehand.minx); freehand.maxx = Math.max(real_x, freehand.maxx); freehand.miny = Math.min(real_y, freehand.miny); freehand.maxy = Math.max(real_y, freehand.maxy); // break; missing on purpose case "fhpath": d_attr += + real_x + "," + real_y + " "; shape.setAttributeNS(null, "points", d_attr); break; // update path stretch line coordinates case "path": // fall through case "pathedit": x *= current_zoom; y *= current_zoom; if(curConfig.gridSnapping){ x = snapToGrid(x); y = snapToGrid(y); start_x = snapToGrid(start_x); start_y = snapToGrid(start_y); } if(evt.shiftKey) { var x1 = path.dragging?path.dragging[0]:start_x; var y1 = path.dragging?path.dragging[1]:start_y; var xya=Utils.snapToAngle(x1,y1,x,y); x=xya.x; y=xya.y; } if(rubberBox && rubberBox.getAttribute('display') != 'none') { assignAttributes(rubberBox, { 'x': Math.min(r_start_x, real_x), 'y': Math.min(r_start_y, real_y), 'width': Math.abs(real_x - r_start_x), 'height': Math.abs(real_y - r_start_y) },100); } pathActions.mouseMove(x, y); break; case "textedit": x *= current_zoom; y *= current_zoom; // if(rubberBox && rubberBox.getAttribute('display') != 'none') { // assignAttributes(rubberBox, { // 'x': Math.min(start_x,x), // 'y': Math.min(start_y,y), // 'width': Math.abs(x-start_x), // 'height': Math.abs(y-start_y) // },100); // } textActions.mouseMove(mouse_x, mouse_y); break; case "rotate": var box = getBBox(selected), cx = box.x + box.width/2, cy = box.y + box.height/2, m = getMatrix(selected), center = transformPoint(cx,cy,m); cx = center.x; cy = center.y; var angle = ((Math.atan2(cy-y,cx-x) * (180/Math.PI))-90) % 360; if(curConfig.gridSnapping){ angle = snapToGrid(angle); } if(evt.shiftKey) { // restrict rotations to nice angles (WRS) var snap = 45; angle= Math.round(angle/snap)*snap; } canvas.setRotationAngle(angle<-180?(360+angle):angle, true); call("changed", selectedElements); break; default: break; } runExtensions("mouseMove", { event: evt, mouse_x: mouse_x, mouse_y: mouse_y, selected: selected }); }; // mouseMove() // - in create mode, the element's opacity is set properly, we create an InsertElementCommand // and store it on the Undo stack // - in move/resize mode, the element's attributes which were affected by the move/resize are // identified, a ChangeElementCommand is created and stored on the stack for those attrs // this is done in when we recalculate the selected dimensions() var mouseUp = function(evt) { if(evt.button === 2) return; var tempJustSelected = justSelected; justSelected = null; if (!started) return; var pt = transformPoint( evt.pageX, evt.pageY, root_sctm ), mouse_x = pt.x * current_zoom, mouse_y = pt.y * current_zoom, x = mouse_x / current_zoom, y = mouse_y / current_zoom, element = getElem(getId()), keep = false; var real_x = x; var real_y = y; started = false; switch (current_mode) { // intentionally fall-through to select here case "resize": case "multiselect": if (rubberBox != null) { rubberBox.setAttribute("display", "none"); curBBoxes = []; } current_mode = "select"; case "select": if (selectedElements[0] != null) { // if we only have one selected element if (selectedElements[1] == null) { // set our current stroke/fill properties to the element's var selected = selectedElements[0]; if (selected.tagName != "g" && selected.tagName != "image" && selected.tagName != "foreignObject") { cur_properties.fill = selected.getAttribute("fill"); cur_properties.fill_opacity = selected.getAttribute("fill-opacity"); cur_properties.stroke = selected.getAttribute("stroke"); cur_properties.stroke_opacity = selected.getAttribute("stroke-opacity"); cur_properties.stroke_width = selected.getAttribute("stroke-width"); cur_properties.stroke_dasharray = selected.getAttribute("stroke-dasharray"); cur_properties.stroke_linejoin = selected.getAttribute("stroke-linejoin"); cur_properties.stroke_linecap = selected.getAttribute("stroke-linecap"); } if (selected.tagName == "text") { cur_text.font_size = selected.getAttribute("font-size"); cur_text.font_family = selected.getAttribute("font-family"); } selectorManager.requestSelector(selected).showGrips(true); // This shouldn't be necessary as it was done on mouseDown... // call("selected", [selected]); } // always recalculate dimensions to strip off stray identity transforms recalculateAllSelectedDimensions(); // if it was being dragged/resized if (real_x != r_start_x || real_y != r_start_y) { var len = selectedElements.length; for (var i = 0; i < len; ++i) { if (selectedElements[i] == null) break; if(selectedElements[i].tagName != 'g') { // Not needed for groups (incorrectly resizes elems), possibly not needed at all? selectorManager.requestSelector(selectedElements[i]).resize(); } } } // no change in position/size, so maybe we should move to pathedit else { var t = evt.target; if (selectedElements[0].nodeName == "path" && selectedElements[1] == null) { pathActions.select(t); } // if it was a path else if (selectedElements[0].nodeName == "text" && selectedElements[1] == null) { textActions.select(t, x, y); } // if it was a path // else, if it was selected and this is a shift-click, remove it from selection else if (evt.shiftKey) { if(tempJustSelected != t) { canvas.removeFromSelection([t]); } } } // no change in mouse position } // we return immediately from select so that the obj_num is not incremented return; break; case "zoom": if (rubberBox != null) { rubberBox.setAttribute("display", "none"); } var factor = evt.shiftKey?.5:2; call("zoomed", { 'x': Math.min(r_start_x, real_x), 'y': Math.min(r_start_y, real_y), 'width': Math.abs(real_x - r_start_x), 'height': Math.abs(real_y - r_start_y), 'factor': factor }); return; case "fhpath": // Check that the path contains at least 2 points; a degenerate one-point path // causes problems. // Webkit ignores how we set the points attribute with commas and uses space // to separate all coordinates, see https://bugs.webkit.org/show_bug.cgi?id=29870 var coords = element.getAttribute('points'); var commaIndex = coords.indexOf(','); if (commaIndex >= 0) { keep = coords.indexOf(',', commaIndex+1) >= 0; } else { keep = coords.indexOf(' ', coords.indexOf(' ')+1) >= 0; } if (keep) { element = pathActions.smoothPolylineIntoPath(element); } break; case "line": var attrs = $(element).attr(["x1", "x2", "y1", "y2"]); keep = (attrs.x1 != attrs.x2 || attrs.y1 != attrs.y2); break; case "foreignObject": case "square": case "rect": case "image": var attrs = $(element).attr(["width", "height"]); // Image should be kept regardless of size (use inherit dimensions later) keep = (attrs.width != 0 || attrs.height != 0) || current_mode === "image"; break; case "circle": keep = (element.getAttribute('r') != 0); break; case "ellipse": var attrs = $(element).attr(["rx", "ry"]); keep = (attrs.rx != null || attrs.ry != null); break; case "fhellipse": if ((freehand.maxx - freehand.minx) > 0 && (freehand.maxy - freehand.miny) > 0) { element = addSvgElementFromJson({ "element": "ellipse", "curStyles": true, "attr": { "cx": (freehand.minx + freehand.maxx) / 2, "cy": (freehand.miny + freehand.maxy) / 2, "rx": (freehand.maxx - freehand.minx) / 2, "ry": (freehand.maxy - freehand.miny) / 2, "id": getId() } }); call("changed",[element]); keep = true; } break; case "fhrect": if ((freehand.maxx - freehand.minx) > 0 && (freehand.maxy - freehand.miny) > 0) { element = addSvgElementFromJson({ "element": "rect", "curStyles": true, "attr": { "x": freehand.minx, "y": freehand.miny, "width": (freehand.maxx - freehand.minx), "height": (freehand.maxy - freehand.miny), "id": getId() } }); call("changed",[element]); keep = true; } break; case "text": keep = true; addToSelection([element]); textActions.start(element); break; case "path": // set element to null here so that it is not removed nor finalized element = null; // continue to be set to true so that mouseMove happens started = true; var res = pathActions.mouseUp(evt, element, mouse_x, mouse_y); element = res.element keep = res.keep; break; case "pathedit": keep = true; element = null; pathActions.mouseUp(evt); break; case "textedit": keep = false; element = null; textActions.mouseUp(evt, mouse_x, mouse_y); break; case "rotate": keep = true; element = null; current_mode = "select"; var batchCmd = canvas.finishUndoableChange(); if (!batchCmd.isEmpty()) { addCommandToHistory(batchCmd); } // perform recalculation to weed out any stray identity transforms that might get stuck recalculateAllSelectedDimensions(); call("changed", selectedElements); break; default: // This could occur in an extension break; } var ext_result = runExtensions("mouseUp", { event: evt, mouse_x: mouse_x, mouse_y: mouse_y }, true); $.each(ext_result, function(i, r) { if(r) { keep = r.keep || keep; element = r.element; started = r.started || started; } }); if (!keep && element != null) { element.parentNode.removeChild(element); element = null; var t = evt.target; // if this element is in a group, go up until we reach the top-level group // just below the layer groups // TODO: once we implement links, we also would have to check for <a> elements while (t.parentNode.parentNode.tagName == "g") { t = t.parentNode; } // if we are not in the middle of creating a path, and we've clicked on some shape, // then go to Select mode. // WebKit returns <div> when the canvas is clicked, Firefox/Opera return <svg> if ( (current_mode != "path" || current_path_pts.length == 0) && t.parentNode.id != "selectorParentGroup" && t.id != "svgcanvas" && t.id != "svgroot") { // switch into "select" mode if we've clicked on an element canvas.setMode("select"); selectOnly([t], true); } } else if (element != null) { canvas.addedNew = true; var ani_dur = .2, c_ani; if(opac_ani.beginElement && element.getAttribute('opacity') != cur_shape.opacity) { c_ani = $(opac_ani).clone().attr({ to: cur_shape.opacity, dur: ani_dur }).appendTo(element); try { // Fails in FF4 on foreignObject c_ani[0].beginElement(); } catch(e){} } else { ani_dur = 0; } // Ideally this would be done on the endEvent of the animation, // but that doesn't seem to be supported in Webkit setTimeout(function() { if(c_ani) c_ani.remove(); element.setAttribute("opacity", cur_shape.opacity); element.setAttribute("style", "pointer-events:inherit"); cleanupElement(element); if(current_mode == "path") { pathActions.toEditMode(element); } else if (current_mode == "text" || current_mode == "image" || current_mode == "foreignObject") { // keep us in the tool we were in unless it was a text or image element addToSelection([element], true); } else { selectOnly([element], true); } // we create the insert command that is stored on the stack // undo means to call cmd.unapply(), redo means to call cmd.apply() addCommandToHistory(new InsertElementCommand(element)); call("changed",[element]); }, ani_dur * 1000); } start_transform = null; }; // prevent links from being followed in the canvas var handleLinkInCanvas = function(e) { e.preventDefault(); return false; }; $(container).mousedown(mouseDown).mousemove(mouseMove).click(handleLinkInCanvas); $(window).mouseup(mouseUp); $(container).bind("mousewheel DOMMouseScroll", function(e){ if(!e.shiftKey) return; e.preventDefault(); root_sctm = svgcontent.getScreenCTM().inverse(); var pt = transformPoint( e.pageX, e.pageY, root_sctm ); var bbox = { 'x': pt.x, 'y': pt.y, 'width': 0, 'height': 0 }; // Respond to mouse wheel in IE/Webkit/Opera. // (It returns up/dn motion in multiples of 120) if(e.wheelDelta) { if (e.wheelDelta >= 120) { bbox.factor = 2; } else if (e.wheelDelta <= -120) { bbox.factor = .5; } } else if(e.detail) { if (e.detail > 0) { bbox.factor = .5; } else if (e.detail < 0) { bbox.factor = 2; } } if(!bbox.factor) return; call("zoomed", bbox); }); }()); // Function: preventClickDefault // Prevents default browser click behaviour on the given element // // Parameters: // img - The DOM element to prevent the cilck on var preventClickDefault = function(img) { $(img).click(function(e){e.preventDefault()}); } // Group: Text edit functions // Functions relating to editing text elements var textActions = canvas.textActions = function() { var curtext, current_text; var textinput; var cursor; var selblock; var blinker; var chardata = []; var textbb, transbb; var matrix; var last_x, last_y; var allow_dbl; function setCursor(index) { var empty = (textinput.value === ""); $(textinput).focus(); if(!arguments.length) { if(empty) { index = 0; } else { if(textinput.selectionEnd !== textinput.selectionStart) return; index = textinput.selectionEnd; } } var charbb; charbb = chardata[index]; if(!empty) { textinput.setSelectionRange(index, index); } cursor = getElem("text_cursor"); if (!cursor) { cursor = document.createElementNS(svgns, "line"); assignAttributes(cursor, { 'id': "text_cursor", 'stroke': "#333", 'stroke-width': 1 }); cursor = getElem("selectorParentGroup").appendChild(cursor); } if(!blinker) { blinker = setInterval(function() { var show = (cursor.getAttribute('display') === 'none'); cursor.setAttribute('display', show?'inline':'none'); }, 600); } var start_pt = ptToScreen(charbb.x, textbb.y); var end_pt = ptToScreen(charbb.x, (textbb.y + textbb.height)); assignAttributes(cursor, { x1: start_pt.x, y1: start_pt.y, x2: end_pt.x, y2: end_pt.y, visibility: 'visible', display: 'inline' }); if(selblock) selblock.setAttribute('d', ''); } function setSelection(start, end, skipInput) { if(start === end) { setCursor(end); return; } if(!skipInput) { textinput.setSelectionRange(start, end); } selblock = getElem("text_selectblock"); if (!selblock) { selblock = document.createElementNS(svgns, "path"); assignAttributes(selblock, { 'id': "text_selectblock", 'fill': "green", 'opacity': .5, 'style': "pointer-events:none" }); getElem("selectorParentGroup").appendChild(selblock); } var startbb = chardata[start]; var endbb = chardata[end]; cursor.setAttribute('visibility', 'hidden'); var tl = ptToScreen(startbb.x, textbb.y), tr = ptToScreen(startbb.x + (endbb.x - startbb.x), textbb.y), bl = ptToScreen(startbb.x, textbb.y + textbb.height), br = ptToScreen(startbb.x + (endbb.x - startbb.x), textbb.y + textbb.height); var dstr = "M" + tl.x + "," + tl.y + " L" + tr.x + "," + tr.y + " " + br.x + "," + br.y + " " + bl.x + "," + bl.y + "z"; assignAttributes(selblock, { d: dstr, 'display': 'inline' }); } function getIndexFromPoint(mouse_x, mouse_y) { // Position cursor here var pt = svgroot.createSVGPoint(); pt.x = mouse_x; pt.y = mouse_y; // No content, so return 0 if(chardata.length == 1) return 0; // Determine if cursor should be on left or right of character var charpos = curtext.getCharNumAtPosition(pt); if(charpos < 0) { // Out of text range, look at mouse coords charpos = chardata.length - 2; if(mouse_x <= chardata[0].x) { charpos = 0; } } else if(charpos >= chardata.length - 2) { charpos = chardata.length - 2; } var charbb = chardata[charpos]; var mid = charbb.x + (charbb.width/2); if(mouse_x > mid) { charpos++; } return charpos; } function setCursorFromPoint(mouse_x, mouse_y) { setCursor(getIndexFromPoint(mouse_x, mouse_y)); } function setEndSelectionFromPoint(x, y, apply) { var i1 = textinput.selectionStart; var i2 = getIndexFromPoint(x, y); var start = Math.min(i1, i2); var end = Math.max(i1, i2); setSelection(start, end, !apply); } function screenToPt(x_in, y_in) { var out = { x: x_in, y: y_in } out.x /= current_zoom; out.y /= current_zoom; if(matrix) { var pt = transformPoint(out.x, out.y, matrix.inverse()); out.x = pt.x; out.y = pt.y; } return out; } function ptToScreen(x_in, y_in) { var out = { x: x_in, y: y_in } if(matrix) { var pt = transformPoint(out.x, out.y, matrix); out.x = pt.x; out.y = pt.y; } out.x *= current_zoom; out.y *= current_zoom; return out; } function hideCursor() { if(cursor) { cursor.setAttribute('visibility', 'hidden'); } } function selectAll(evt) { setSelection(0, curtext.textContent.length); $(this).unbind(evt); } function selectWord(evt) { if(!allow_dbl) return; var ept = transformPoint( evt.pageX, evt.pageY, root_sctm ), mouse_x = ept.x * current_zoom, mouse_y = ept.y * current_zoom; var pt = screenToPt(mouse_x, mouse_y); var index = getIndexFromPoint(pt.x, pt.y); var str = curtext.textContent; var first = str.substr(0, index).replace(/[a-z0-9]+$/i, '').length; var m = str.substr(index).match(/^[a-z0-9]+/i); var last = (m?m[0].length:0) + index; setSelection(first, last); // Set tripleclick $(evt.target).click(selectAll); setTimeout(function() { $(evt.target).unbind('click', selectAll); }, 300); } return { select: function(target, x, y) { if (current_text == target) { curtext = target; textActions.toEditMode(x, y); } // going into pathedit mode else { current_text = target; } }, start: function(elem) { curtext = elem; textActions.toEditMode(); }, mouseDown: function(evt, mouse_target, start_x, start_y) { var pt = screenToPt(start_x, start_y); textinput.focus(); setCursorFromPoint(pt.x, pt.y); last_x = start_x; last_y = start_y; // TODO: Find way to block native selection }, mouseMove: function(mouse_x, mouse_y) { var pt = screenToPt(mouse_x, mouse_y); setEndSelectionFromPoint(pt.x, pt.y); }, mouseUp: function(evt, mouse_x, mouse_y) { var pt = screenToPt(mouse_x, mouse_y); setEndSelectionFromPoint(pt.x, pt.y, true); // TODO: Find a way to make this work: Use transformed BBox instead of evt.target // if(last_x === mouse_x && last_y === mouse_y // && !Utils.rectsIntersect(transbb, {x: pt.x, y: pt.y, width:0, height:0})) { // textActions.toSelectMode(true); // } if(last_x === mouse_x && last_y === mouse_y && evt.target !== curtext) { textActions.toSelectMode(true); } }, setCursor: setCursor, toEditMode: function(x, y) { allow_dbl = false; current_mode = "textedit"; selectorManager.requestSelector(curtext).showGrips(false); // Make selector group accept clicks var sel = selectorManager.requestSelector(curtext).selectorRect; textActions.init(); $(curtext).css('cursor', 'text'); // if(support.editableText) { // curtext.setAttribute('editable', 'simple'); // return; // } if(!arguments.length) { setCursor(); } else { var pt = screenToPt(x, y); setCursorFromPoint(pt.x, pt.y); } setTimeout(function() { allow_dbl = true; }, 300); }, toSelectMode: function(selectElem) { current_mode = "select"; clearInterval(blinker); blinker = null; if(selblock) $(selblock).attr('display','none'); if(cursor) $(cursor).attr('visibility','hidden'); $(curtext).css('cursor', 'move'); if(selectElem) { clearSelection(); $(curtext).css('cursor', 'move'); call("selected", [curtext]); addToSelection([curtext], true); } if(curtext && !curtext.textContent.length) { // No content, so delete canvas.deleteSelectedElements(); } $(textinput).blur(); curtext = false; // if(support.editableText) { // curtext.removeAttribute('editable'); // } }, setInputElem: function(elem) { textinput = elem; // $(textinput).blur(hideCursor); }, clear: function() { current_text = null; if(current_mode == "textedit") { textActions.toSelectMode(); } }, init: function(inputElem) { if(!curtext) return; // if(support.editableText) { // curtext.select(); // return; // } if(!curtext.parentNode) { // Result of the ffClone, need to get correct element curtext = selectedElements[0]; selectorManager.requestSelector(curtext).showGrips(false); } var str = curtext.textContent; var len = str.length; var xform = curtext.getAttribute('transform'); textbb = getBBox(curtext); matrix = xform?getMatrix(curtext):null; chardata = Array(len); textinput.focus(); $(curtext).unbind('dblclick', selectWord).dblclick(selectWord); if(!len) { var end = {x: textbb.x + (textbb.width/2), width: 0}; } for(var i=0; i<len; i++) { var start = curtext.getStartPositionOfChar(i); var end = curtext.getEndPositionOfChar(i); // Get a "bbox" equivalent for each character. Uses the // bbox data of the actual text for y, height purposes // TODO: Decide if y, width and height are actually necessary chardata[i] = { x: start.x, y: textbb.y, // start.y? width: end.x - start.x, height: textbb.height }; } // Add a last bbox for cursor at end of text chardata.push({ x: end.x, width: 0 }); setSelection(textinput.selectionStart, textinput.selectionEnd, true); } } }(); // Group: Path edit functions // Functions relating to editing path elements var pathActions = this.pathActions = function() { var subpath = false; var pathData = {}; var current_path; var path; var segData = { 2: ['x','y'], 4: ['x','y'], 6: ['x','y','x1','y1','x2','y2'], 8: ['x','y','x1','y1'], 10: ['x','y','r1','r2','angle','largeArcFlag','sweepFlag'], 12: ['x'], 14: ['y'], 16: ['x','y','x2','y2'], 18: ['x','y'] }; function retPath() { return path; } function resetD(p) { p.setAttribute("d", pathActions.convertPath(p)); } function insertItemBefore(elem, newseg, index) { // Support insertItemBefore on paths for FF2 var list = elem.pathSegList; if(support.pathInsertItemBefore) { list.insertItemBefore(newseg, index); return; } var len = list.numberOfItems; var arr = []; for(var i=0; i<len; i++) { var cur_seg = list.getItem(i); arr.push(cur_seg) } list.clear(); for(var i=0; i<len; i++) { if(i == index) { //index+1 list.appendItem(newseg); } list.appendItem(arr[i]); } } // TODO: See if this should just live in replacePathSeg function ptObjToArr(type, seg_item) { var arr = segData[type], len = arr.length; var out = Array(len); for(var i=0; i<len; i++) { out[i] = seg_item[arr[i]]; } return out; } function getGripContainer() { var c = getElem("pathpointgrip_container"); if (!c) { var parent = getElem("selectorParentGroup"); c = parent.appendChild(document.createElementNS(svgns, "g")); c.id = "pathpointgrip_container"; } return c; } var addPointGrip = function(index, x, y) { // create the container of all the point grips var pointGripContainer = getGripContainer(); var pointGrip = getElem("pathpointgrip_"+index); // create it if (!pointGrip) { pointGrip = document.createElementNS(svgns, "circle"); assignAttributes(pointGrip, { 'id': "pathpointgrip_" + index, 'display': "none", 'r': 4, 'fill': "#0FF", 'stroke': "#00F", 'stroke-width': 2, 'cursor': 'move', 'style': 'pointer-events:all', 'xlink:title': uiStrings.pathNodeTooltip }); pointGrip = pointGripContainer.appendChild(pointGrip); var grip = $('#pathpointgrip_'+index); grip.dblclick(function() { if(path) path.setSegType(); }); } if(x && y) { // set up the point grip element and display it assignAttributes(pointGrip, { 'cx': x, 'cy': y, 'display': "inline" }); } return pointGrip; }; var getPointGrip = function(seg, update) { var index = seg.index; var pointGrip = addPointGrip(index); if(update) { var pt = getGripPt(seg); assignAttributes(pointGrip, { 'cx': pt.x, 'cy': pt.y, 'display': "inline" }); } return pointGrip; } var getSegSelector = function(seg, update) { var index = seg.index; var segLine = getElem("segline_" + index); if(!segLine) { var pointGripContainer = getGripContainer(); // create segline segLine = document.createElementNS(svgns, "path"); assignAttributes(segLine, { 'id': "segline_" + index, 'display': 'none', 'fill': "none", 'stroke': "#0FF", 'stroke-width': 2, 'style':'pointer-events:none', 'd': 'M0,0 0,0' }); pointGripContainer.appendChild(segLine); } if(update) { var prev = seg.prev; if(!prev) { segLine.setAttribute("display", "none"); return segLine; } var pt = getGripPt(prev); // Set start point replacePathSeg(2, 0, [pt.x, pt.y], segLine); var pts = ptObjToArr(seg.type, seg.item, true); for(var i=0; i < pts.length; i+=2) { var pt = getGripPt(seg, {x:pts[i], y:pts[i+1]}); pts[i] = pt.x; pts[i+1] = pt.y; } replacePathSeg(seg.type, 1, pts, segLine); } return segLine; } var getControlPoints = function(seg) { var item = seg.item; var index = seg.index; if(!("x1" in item) || !("x2" in item)) return null; var cpt = {}; var pointGripContainer = getGripContainer(); // Note that this is intentionally not seg.prev.item var prev = path.segs[index-1].item; var seg_items = [prev, item]; for(var i=1; i<3; i++) { var id = index + 'c' + i; var ctrlLine = cpt['c' + i + '_line'] = getElem("ctrlLine_"+id); if(!ctrlLine) { ctrlLine = document.createElementNS(svgns, "line"); assignAttributes(ctrlLine, { 'id': "ctrlLine_"+id, 'stroke': "#555", 'stroke-width': 1, "style": "pointer-events:none" }); pointGripContainer.appendChild(ctrlLine); } var pt = getGripPt(seg, {x:item['x' + i], y:item['y' + i]}); var gpt = getGripPt(seg, {x:seg_items[i-1].x, y:seg_items[i-1].y}); assignAttributes(ctrlLine, { 'x1': pt.x, 'y1': pt.y, 'x2': gpt.x, 'y2': gpt.y, 'display': "inline" }); cpt['c' + i + '_line'] = ctrlLine; var pointGrip = cpt['c' + i] = getElem("ctrlpointgrip_"+id); // create it if (!pointGrip) { pointGrip = document.createElementNS(svgns, "circle"); assignAttributes(pointGrip, { 'id': "ctrlpointgrip_" + id, 'display': "none", 'r': 4, 'fill': "#0FF", 'stroke': "#55F", 'stroke-width': 1, 'cursor': 'move', 'style': 'pointer-events:all', 'xlink:title': uiStrings.pathCtrlPtTooltip }); pointGripContainer.appendChild(pointGrip); } assignAttributes(pointGrip, { 'cx': pt.x, 'cy': pt.y, 'display': "inline" }); cpt['c' + i] = pointGrip; } return cpt; } function getGripPt(seg, alt_pt) { var out = { x: alt_pt? alt_pt.x : seg.item.x, y: alt_pt? alt_pt.y : seg.item.y }, path = seg.path; if(path.matrix) { var pt = transformPoint(out.x, out.y, path.matrix); out = pt; } out.x *= current_zoom; out.y *= current_zoom; return out; } function getPointFromGrip(pt, path) { var out = { x: pt.x, y: pt.y } if(path.matrix) { var pt = transformPoint(out.x, out.y, path.imatrix); out.x = pt.x; out.y = pt.y; } out.x /= current_zoom; out.y /= current_zoom; return out; } function Segment(index, item) { var s = this; s.index = index; s.selected = false; s.type = item.pathSegType; var grip; s.addGrip = function() { grip = s.ptgrip = getPointGrip(s, true); s.ctrlpts = getControlPoints(s, true); s.segsel = getSegSelector(s, true); } s.item = item; s.show = function(y) { if(grip) { grip.setAttribute("display", y?"inline":"none"); s.segsel.setAttribute("display", y?"inline":"none"); // Show/hide all control points if available s.showCtrlPts(y); } } s.select = function(y) { if(grip) { grip.setAttribute("stroke", y?"#0FF":"#00F"); s.segsel.setAttribute("display", y?"inline":"none"); if(s.ctrlpts) { s.selectCtrls(y); } s.selected = y; } } s.selectCtrls = function(y) { $('#ctrlpointgrip_' + s.index + 'c1, #ctrlpointgrip_' + s.index + 'c2').attr('fill',y?'#0FF':'#EEE'); } s.update = function(full) { item = s.item; if(grip) { var pt = getGripPt(s); assignAttributes(grip, { 'cx': pt.x, 'cy': pt.y }); getSegSelector(s, true); if(s.ctrlpts) { if(full) { s.item = path.elem.pathSegList.getItem(s.index); s.type = s.item.pathSegType; } getControlPoints(s); } // this.segsel.setAttribute("display", y?"inline":"none"); } } s.move = function(dx, dy) { var item = s.item; var cur = s; if(cur.ctrlpts) { var cur_pts = [item.x += dx, item.y += dy, item.x1, item.y1, item.x2 += dx, item.y2 += dy]; } else { var cur_pts = [item.x += dx, item.y += dy]; } replacePathSeg(cur.type, cur.index, cur_pts); if(s.next && s.next.ctrlpts) { var next = s.next.item; var next_pts = [next.x, next.y, next.x1 += dx, next.y1 += dy, next.x2, next.y2]; replacePathSeg(s.next.type, s.next.index, next_pts); } if(s.mate) { // The last point of a closed subpath has a "mate", // which is the "M" segment of the subpath var item = s.mate.item; var pts = [item.x += dx, item.y += dy]; replacePathSeg(s.mate.type, s.mate.index, pts); // Has no grip, so does not need "updating"? } s.update(true); if(s.next) s.next.update(true); } s.setLinked = function(num) { var seg, anum, pt; if(num == 2) { anum = 1; seg = s.next; if(!seg) return; pt = s.item; } else { anum = 2; seg = s.prev; if(!seg) return; pt = seg.item; } var item = seg.item; item['x' + anum] = pt.x + (pt.x - s.item['x' + num]); item['y' + anum] = pt.y + (pt.y - s.item['y' + num]); var pts = [item.x,item.y, item.x1,item.y1, item.x2,item.y2]; replacePathSeg(seg.type, seg.index, pts); seg.update(true); } s.moveCtrl = function(num, dx, dy) { var item = s.item; item['x' + num] += dx; item['y' + num] += dy; var pts = [item.x,item.y, item.x1,item.y1, item.x2,item.y2]; replacePathSeg(s.type, s.index, pts); s.update(true); } s.setType = function(new_type, pts) { replacePathSeg(new_type, index, pts); s.type = new_type; s.item = path.elem.pathSegList.getItem(index); s.showCtrlPts(new_type === 6); s.ctrlpts = getControlPoints(s); s.update(true); } s.showCtrlPts = function(y) { if(s.ctrlpts) { for (var o in s.ctrlpts) { s.ctrlpts[o].setAttribute("display", y?"inline":"none"); } } } } function Path(elem) { if(!elem || elem.tagName !== "path") return false; var p = path = this; this.elem = elem; this.segs = []; this.selected_pts = []; // Reset path data this.init = function() { // Hide all grips, etc $(getGripContainer()).find("*").attr("display", "none"); var segList = elem.pathSegList; var len = segList.numberOfItems; p.segs = []; p.selected_pts = []; p.first_seg = null; // Set up segs array for(var i=0; i < len; i++) { var item = segList.getItem(i); var segment = new Segment(i, item); segment.path = p; p.segs.push(segment); } var segs = p.segs; var start_i = null; for(var i=0; i < len; i++) { var seg = segs[i]; var next_seg = (i+1) >= len ? null : segs[i+1]; var prev_seg = (i-1) < 0 ? null : segs[i-1]; if(seg.type === 2) { if(prev_seg && prev_seg.type !== 1) { // New sub-path, last one is open, // so add a grip to last sub-path's first point var start_seg = segs[start_i]; start_seg.next = segs[start_i+1]; start_seg.next.prev = start_seg; start_seg.addGrip(); } // Remember that this is a starter seg start_i = i; } else if(next_seg && next_seg.type === 1) { // This is the last real segment of a closed sub-path // Next is first seg after "M" seg.next = segs[start_i+1]; // First seg after "M"'s prev is this seg.next.prev = seg; seg.mate = segs[start_i]; seg.addGrip(); if(p.first_seg == null) { p.first_seg = seg; } } else if(!next_seg) { if(seg.type !== 1) { // Last seg, doesn't close so add a grip // to last sub-path's first point var start_seg = segs[start_i]; start_seg.next = segs[start_i+1]; start_seg.next.prev = start_seg; start_seg.addGrip(); seg.addGrip(); if(!p.first_seg) { // Open path, so set first as real first and add grip p.first_seg = segs[start_i]; } } } else if(seg.type !== 1){ // Regular segment, so add grip and its "next" seg.addGrip(); // Don't set its "next" if it's an "M" if(next_seg && next_seg.type !== 2) { seg.next = next_seg; seg.next.prev = seg; } } } return p; } this.init(); // Update position of all points this.update = function() { if(getRotationAngle(p.elem)) { p.matrix = getMatrix(path.elem); p.imatrix = p.matrix.inverse(); } p.eachSeg(function(i) { this.item = elem.pathSegList.getItem(i); this.update(); }); return p; } this.eachSeg = function(fn) { var len = p.segs.length for(var i=0; i < len; i++) { var ret = fn.call(p.segs[i], i); if(ret === false) break; } } this.addSeg = function(index) { // Adds a new segment var seg = p.segs[index]; if(!seg.prev) return; var prev = seg.prev; var newseg; switch(seg.item.pathSegType) { case 4: var new_x = (seg.item.x + prev.item.x) / 2; var new_y = (seg.item.y + prev.item.y) / 2; newseg = elem.createSVGPathSegLinetoAbs(new_x, new_y); break; case 6: //make it a curved segment to preserve the shape (WRS) // http://en.wikipedia.org/wiki/De_Casteljau%27s_algorithm#Geometric_interpretation var p0_x = (prev.item.x + seg.item.x1)/2; var p1_x = (seg.item.x1 + seg.item.x2)/2; var p2_x = (seg.item.x2 + seg.item.x)/2; var p01_x = (p0_x + p1_x)/2; var p12_x = (p1_x + p2_x)/2; var new_x = (p01_x + p12_x)/2; var p0_y = (prev.item.y + seg.item.y1)/2; var p1_y = (seg.item.y1 + seg.item.y2)/2; var p2_y = (seg.item.y2 + seg.item.y)/2; var p01_y = (p0_y + p1_y)/2; var p12_y = (p1_y + p2_y)/2; var new_y = (p01_y + p12_y)/2; newseg = elem.createSVGPathSegCurvetoCubicAbs(new_x,new_y, p0_x,p0_y, p01_x,p01_y); var pts = [seg.item.x,seg.item.y,p12_x,p12_y,p2_x,p2_y]; replacePathSeg(seg.type,index,pts); break; } insertItemBefore(elem, newseg, index); } this.deleteSeg = function(index) { var seg = p.segs[index]; var list = elem.pathSegList; seg.show(false); var next = seg.next; if(seg.mate) { // Make the next point be the "M" point var pt = [next.item.x, next.item.y]; replacePathSeg(2, next.index, pt); // Reposition last node replacePathSeg(4, seg.index, pt); list.removeItem(seg.mate.index); } else if(!seg.prev) { // First node of open path, make next point the M var item = seg.item; var pt = [next.item.x, next.item.y]; replacePathSeg(2, seg.next.index, pt); list.removeItem(index); } else { list.removeItem(index); } } this.endChanges = function(text) { if(isWebkit) resetD(p.elem); var cmd = new ChangeElementCommand(elem, {d: p.last_d}, text); addCommandToHistory(cmd); call("changed", [elem]); } this.subpathIsClosed = function(index) { var closed = false; // Check if subpath is already open path.eachSeg(function(i) { if(i <= index) return true; if(this.type === 2) { // Found M first, so open return false; } else if(this.type === 1) { // Found Z first, so closed closed = true; return false; } }); return closed; } this.addPtsToSelection = function(indexes) { if(!$.isArray(indexes)) indexes = [indexes]; for(var i=0; i< indexes.length; i++) { var index = indexes[i]; var seg = p.segs[index]; if(seg.ptgrip) { if($.inArray(index, p.selected_pts) == -1 && index >= 0) { p.selected_pts.push(index); } } }; p.selected_pts.sort(); var i = p.selected_pts.length, grips = new Array(i); // Loop through points to be selected and highlight each while(i--) { var pt = p.selected_pts[i]; var seg = p.segs[pt]; seg.select(true); grips[i] = seg.ptgrip; } // TODO: Correct this: pathActions.canDeleteNodes = true; pathActions.closed_subpath = p.subpathIsClosed(p.selected_pts[0]); call("selected", grips); } this.removePtFromSelection = function(index) { var pos = $.inArray(index, p.selected_pts); if(pos == -1) { return; } p.segs[index].select(false); p.selected_pts.splice(pos, 1); } this.clearSelection = function() { p.eachSeg(function(i) { this.select(false); }); p.selected_pts = []; } this.selectPt = function(pt, ctrl_num) { p.clearSelection(); if(pt == null) { p.eachSeg(function(i) { if(this.prev) { pt = i; } }); } p.addPtsToSelection(pt); if(ctrl_num) { p.dragctrl = ctrl_num; if(link_control_pts) { p.segs[pt].setLinked(ctrl_num); } } } this.storeD = function() { this.last_d = elem.getAttribute('d'); } this.show = function(y) { // Shows this path's segment grips p.eachSeg(function() { this.show(y); }); if(y) { p.selectPt(p.first_seg.index); } return p; } // Move selected points this.movePts = function(d_x, d_y) { var i = p.selected_pts.length; while(i--) { var seg = p.segs[p.selected_pts[i]]; seg.move(d_x, d_y); } } this.moveCtrl = function(d_x, d_y) { var seg = p.segs[p.selected_pts[0]]; seg.moveCtrl(p.dragctrl, d_x, d_y); if(link_control_pts) { seg.setLinked(p.dragctrl); } } this.setSegType = function(new_type) { p.storeD(); var i = p.selected_pts.length; var text; while(i--) { var sel_pt = p.selected_pts[i]; // Selected seg var cur = p.segs[sel_pt]; var prev = cur.prev; if(!prev) continue; if(!new_type) { // double-click, so just toggle text = "Toggle Path Segment Type"; // Toggle segment to curve/straight line var old_type = cur.type; new_type = (old_type == 6) ? 4 : 6; } new_type = new_type-0; var cur_x = cur.item.x; var cur_y = cur.item.y; var prev_x = prev.item.x; var prev_y = prev.item.y; var points; switch ( new_type ) { case 6: if(cur.olditem) { var old = cur.olditem; points = [cur_x,cur_y, old.x1,old.y1, old.x2,old.y2]; } else { var diff_x = cur_x - prev_x; var diff_y = cur_y - prev_y; // get control points from straight line segment /* var ct1_x = (prev_x + (diff_y/2)); var ct1_y = (prev_y - (diff_x/2)); var ct2_x = (cur_x + (diff_y/2)); var ct2_y = (cur_y - (diff_x/2)); */ //create control points on the line to preserve the shape (WRS) var ct1_x = (prev_x + (diff_x/3)); var ct1_y = (prev_y + (diff_y/3)); var ct2_x = (cur_x - (diff_x/3)); var ct2_y = (cur_y - (diff_y/3)); points = [cur_x,cur_y, ct1_x,ct1_y, ct2_x,ct2_y]; } break; case 4: points = [cur_x,cur_y]; // Store original prevve segment nums cur.olditem = cur.item; break; } cur.setType(new_type, points); } path.endChanges(text); return; } } function getPath(elem) { var p = pathData[elem.id]; if(!p) p = pathData[elem.id] = new Path(elem); return p; } var pathFuncs = [], current_path = null, current_path_pts = [], link_control_pts = false, hasMoved = false; // This function converts a polyline (created by the fh_path tool) into // a path element and coverts every three line segments into a single bezier // curve in an attempt to smooth out the free-hand var smoothPolylineIntoPath = function(element) { var points = element.points; var N = points.numberOfItems; if (N >= 4) { // loop through every 3 points and convert to a cubic bezier curve segment // // NOTE: this is cheating, it means that every 3 points has the potential to // be a corner instead of treating each point in an equal manner. In general, // this technique does not look that good. // // I am open to better ideas! // // Reading: // - http://www.efg2.com/Lab/Graphics/Jean-YvesQueinecBezierCurves.htm // - http://www.codeproject.com/KB/graphics/BezierSpline.aspx?msg=2956963 // - http://www.ian-ko.com/ET_GeoWizards/UserGuide/smooth.htm // - http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/bezier-der.html var curpos = points.getItem(0), prevCtlPt = null; var d = []; d.push(["M",curpos.x,",",curpos.y," C"].join("")); for (var i = 1; i <= (N-4); i += 3) { var ct1 = points.getItem(i); var ct2 = points.getItem(i+1); var end = points.getItem(i+2); // if the previous segment had a control point, we want to smooth out // the control points on both sides if (prevCtlPt) { var newpts = smoothControlPoints( prevCtlPt, ct1, curpos ); if (newpts && newpts.length == 2) { var prevArr = d[d.length-1].split(','); prevArr[2] = newpts[0].x; prevArr[3] = newpts[0].y; d[d.length-1] = prevArr.join(','); ct1 = newpts[1]; } } d.push([ct1.x,ct1.y,ct2.x,ct2.y,end.x,end.y].join(',')); curpos = end; prevCtlPt = ct2; } // handle remaining line segments d.push("L"); for(;i < N;++i) { var pt = points.getItem(i); d.push([pt.x,pt.y].join(",")); } d = d.join(" "); // create new path element element = addSvgElementFromJson({ "element": "path", "curStyles": true, "attr": { "id": getId(), "d": d, "fill": "none" } }); call("changed",[element]); } return element; }; // This replaces the segment at the given index. Type is given as number. var replacePathSeg = function(type, index, pts, elem) { var path = elem || retPath().elem; var func = 'createSVGPathSeg' + pathFuncs[type]; var seg = path[func].apply(path, pts); if(support.pathReplaceItem) { path.pathSegList.replaceItem(seg, index); } else { var segList = path.pathSegList; var len = segList.numberOfItems; var arr = []; for(var i=0; i<len; i++) { var cur_seg = segList.getItem(i); arr.push(cur_seg) } segList.clear(); for(var i=0; i<len; i++) { if(i == index) { segList.appendItem(seg); } else { segList.appendItem(arr[i]); } } } } // If the path was rotated, we must now pay the piper: // Every path point must be rotated into the rotated coordinate system of // its old center, then determine the new center, then rotate it back // This is because we want the path to remember its rotation // TODO: This is still using ye olde transform methods, can probably // be optimized or even taken care of by recalculateDimensions var recalcRotatedPath = function() { var current_path = path.elem; var angle = getRotationAngle(current_path, true); if(!angle) return; selectedBBoxes[0] = path.oldbbox; var box = getBBox(current_path), oldbox = selectedBBoxes[0], oldcx = oldbox.x + oldbox.width/2, oldcy = oldbox.y + oldbox.height/2, newcx = box.x + box.width/2, newcy = box.y + box.height/2, // un-rotate the new center to the proper position dx = newcx - oldcx, dy = newcy - oldcy, r = Math.sqrt(dx*dx + dy*dy), theta = Math.atan2(dy,dx) + angle; newcx = r * Math.cos(theta) + oldcx; newcy = r * Math.sin(theta) + oldcy; var getRotVals = function(x, y) { dx = x - oldcx; dy = y - oldcy; // rotate the point around the old center r = Math.sqrt(dx*dx + dy*dy); theta = Math.atan2(dy,dx) + angle; dx = r * Math.cos(theta) + oldcx; dy = r * Math.sin(theta) + oldcy; // dx,dy should now hold the actual coordinates of each // point after being rotated // now we want to rotate them around the new center in the reverse direction dx -= newcx; dy -= newcy; r = Math.sqrt(dx*dx + dy*dy); theta = Math.atan2(dy,dx) - angle; return {'x':(r * Math.cos(theta) + newcx)/1, 'y':(r * Math.sin(theta) + newcy)/1}; } var list = current_path.pathSegList, i = list.numberOfItems; while (i) { i -= 1; var seg = list.getItem(i), type = seg.pathSegType; if(type == 1) continue; var rvals = getRotVals(seg.x,seg.y), points = [rvals.x, rvals.y]; if(seg.x1 != null && seg.x2 != null) { c_vals1 = getRotVals(seg.x1, seg.y1); c_vals2 = getRotVals(seg.x2, seg.y2); points.splice(points.length, 0, c_vals1.x , c_vals1.y, c_vals2.x, c_vals2.y); } replacePathSeg(type, i, points); } // loop for each point box = getBBox(current_path); selectedBBoxes[0].x = box.x; selectedBBoxes[0].y = box.y; selectedBBoxes[0].width = box.width; selectedBBoxes[0].height = box.height; // now we must set the new transform to be rotated around the new center var R_nc = svgroot.createSVGTransform(), tlist = getTransformList(current_path); R_nc.setRotate((angle * 180.0 / Math.PI), newcx, newcy); tlist.replaceItem(R_nc,0); } return { init: function() { pathFuncs = [0,'ClosePath']; var pathFuncsStrs = ['Moveto','Lineto','CurvetoCubic','CurvetoQuadratic','Arc','LinetoHorizontal','LinetoVertical','CurvetoCubicSmooth','CurvetoQuadraticSmooth']; $.each(pathFuncsStrs,function(i,s){pathFuncs.push(s+'Abs');pathFuncs.push(s+'Rel');}); }, getPath: function() { return path; }, mouseDown: function(evt, mouse_target, start_x, start_y) { if(current_mode == "path") return; // TODO: Make sure current_path isn't null at this point if(!path) return; path.storeD(); var id = evt.target.id; if (id.substr(0,14) == "pathpointgrip_") { // Select this point var cur_pt = path.cur_pt = parseInt(id.substr(14)); path.dragging = [start_x, start_y]; var seg = path.segs[cur_pt]; // only clear selection if shift is not pressed (otherwise, add // node to selection) if (!evt.shiftKey) { if(path.selected_pts.length <= 1 || !seg.selected) { path.clearSelection(); } path.addPtsToSelection(cur_pt); } else if(seg.selected) { path.removePtFromSelection(cur_pt); } else { path.addPtsToSelection(cur_pt); } } else if(id.indexOf("ctrlpointgrip_") == 0) { path.dragging = [start_x, start_y]; var parts = id.split('_')[1].split('c'); var cur_pt = parts[0]-0; var ctrl_num = parts[1]-0; path.selectPt(cur_pt, ctrl_num); } // Start selection box if(!path.dragging) { if (rubberBox == null) { rubberBox = selectorManager.getRubberBandBox(); } assignAttributes(rubberBox, { 'x': start_x * current_zoom, 'y': start_y * current_zoom, 'width': 0, 'height': 0, 'display': 'inline' }, 100); } }, mouseMove: function(mouse_x, mouse_y) { hasMoved = true; if(current_mode == "path") { var line = getElem("path_stretch_line"); if (line) { line.setAttribute("x2", mouse_x); line.setAttribute("y2", mouse_y); } return; } // if we are dragging a point, let's move it if (path.dragging) { var pt = getPointFromGrip({ x: path.dragging[0], y: path.dragging[1] }, path); var mpt = getPointFromGrip({ x: mouse_x, y: mouse_y }, path); var diff_x = mpt.x - pt.x; var diff_y = mpt.y - pt.y; path.dragging = [mouse_x, mouse_y]; if(path.dragctrl) { path.moveCtrl(diff_x, diff_y); } else { path.movePts(diff_x, diff_y); } } else { path.selected_pts = []; path.eachSeg(function(i) { var seg = this; if(!seg.next && !seg.prev) return; var item = seg.item; var rbb = rubberBox.getBBox(); var pt = getGripPt(seg); var pt_bb = { x: pt.x, y: pt.y, width: 0, height: 0 }; var sel = Utils.rectsIntersect(rbb, pt_bb); this.select(sel); //Note that addPtsToSelection is not being run if(sel) path.selected_pts.push(seg.index); }); } }, mouseUp: function(evt, element, mouse_x, mouse_y) { // Create mode if(current_mode == "path") { var x = mouse_x/current_zoom, y = mouse_y/current_zoom, stretchy = getElem("path_stretch_line"); if(curConfig.gridSnapping){ x = snapToGrid(x); y = snapToGrid(y); mouse_x = snapToGrid(mouse_x); mouse_y = snapToGrid(mouse_y); } if (!stretchy) { stretchy = document.createElementNS(svgns, "line"); assignAttributes(stretchy, { 'id': "path_stretch_line", 'stroke': "#22C", 'stroke-width': "0.5" }); stretchy = getElem("selectorParentGroup").appendChild(stretchy); } stretchy.setAttribute("display", "inline"); var keep = null; // if pts array is empty, create path element with M at current point if (current_path_pts.length == 0) { current_path_pts.push(x); current_path_pts.push(y); d_attr = "M" + x + "," + y + " "; addSvgElementFromJson({ "element": "path", "curStyles": true, "attr": { "d": d_attr, "id": getNextId(), "opacity": cur_shape.opacity / 2, } }); // set stretchy line to first point assignAttributes(stretchy, { 'x1': mouse_x, 'y1': mouse_y, 'x2': mouse_x, 'y2': mouse_y }); var index = subpath ? path.segs.length : 0; addPointGrip(index, mouse_x, mouse_y); } else { // determine if we clicked on an existing point var i = current_path_pts.length; var FUZZ = 6/current_zoom; var clickOnPoint = false; while(i) { i -= 2; var px = current_path_pts[i], py = current_path_pts[i+1]; // found a matching point if ( x >= (px-FUZZ) && x <= (px+FUZZ) && y >= (py-FUZZ) && y <= (py+FUZZ) ) { clickOnPoint = true; break; } } // get path element that we are in the process of creating var id = getId(); // Remove previous path object if previously created if(id in pathData) delete pathData[id]; var newpath = getElem(id); var len = current_path_pts.length; // if we clicked on an existing point, then we are done this path, commit it // (i,i+1) are the x,y that were clicked on if (clickOnPoint) { // if clicked on any other point but the first OR // the first point was clicked on and there are less than 3 points // then leave the path open // otherwise, close the path if (i == 0 && len >= 6) { // Create end segment var abs_x = current_path_pts[0]; var abs_y = current_path_pts[1]; d_attr += ['L',abs_x,',',abs_y,'z'].join(''); newpath.setAttribute("d", d_attr); } else if(len < 3) { keep = false; return keep; } $(stretchy).remove(); // this will signal to commit the path element = newpath; current_path_pts = []; started = false; if(subpath) { if(path.matrix) { remapElement(newpath, {}, path.matrix.inverse()); } var new_d = newpath.getAttribute("d"); var orig_d = $(path.elem).attr("d"); $(path.elem).attr("d", orig_d + new_d); $(newpath).remove(); if(path.matrix) { recalcRotatedPath(); } path.init(); pathActions.toEditMode(path.elem); path.selectPt(); return false; } } // else, create a new point, append to pts array, update path element else { // Checks if current target or parents are #svgcontent if(!$.contains(container, getMouseTarget(evt))) { // Clicked outside canvas, so don't make point console.log("Clicked outside canvas"); return false; } var lastx = current_path_pts[len-2], lasty = current_path_pts[len-1]; if(evt.shiftKey) { var xya=Utils.snapToAngle(lastx,lasty,x,y); x=xya.x; y=xya.y; } // we store absolute values in our path points array for easy checking above current_path_pts.push(x); current_path_pts.push(y); d_attr += "L" + round(x) + "," + round(y) + " "; newpath.setAttribute("d", d_attr); x *= current_zoom; y *= current_zoom; // set stretchy line to latest point assignAttributes(stretchy, { 'x1': x, 'y1': y, 'x2': x, 'y2': y }); var index = (current_path_pts.length/2 - 1); if(subpath) index += path.segs.length; addPointGrip(index, x, y); } keep = true; } return { keep: keep, element: element } } // Edit mode if (path.dragging) { var last_pt = path.cur_pt; path.dragging = false; path.dragctrl = false; path.update(); if(hasMoved) { path.endChanges("Move path point(s)"); } if(!evt.shiftKey && !hasMoved) { path.selectPt(last_pt); } } else if(rubberBox && rubberBox.getAttribute('display') != 'none') { // Done with multi-node-select rubberBox.setAttribute("display", "none"); if(rubberBox.getAttribute('width') <= 2 && rubberBox.getAttribute('height') <= 2) { pathActions.toSelectMode(evt.target); } // else, move back to select mode } else { pathActions.toSelectMode(evt.target); } hasMoved = false; }, clearData: function() { pathData = {}; }, toEditMode: function(element) { path = getPath(element); current_mode = "pathedit"; clearSelection(); path.show(true).update(); path.oldbbox = getBBox(path.elem); subpath = false; }, toSelectMode: function(elem) { var selPath = (elem == path.elem); current_mode = "select"; path.show(false); current_path = false; clearSelection(); if(path.matrix) { // Rotated, so may need to re-calculate the center recalcRotatedPath(); } if(selPath) { call("selected", [elem]); addToSelection([elem], true); } }, addSubPath: function(on) { if(on) { // Internally we go into "path" mode, but in the UI it will // still appear as if in "pathedit" mode. current_mode = "path"; subpath = true; } else { pathActions.clear(true); pathActions.toEditMode(path.elem); } }, select: function(target) { if (current_path == target) { pathActions.toEditMode(target); current_mode = "pathedit"; } // going into pathedit mode else { current_path = target; } }, reorient: function() { var elem = selectedElements[0]; if(!elem) return; var angle = getRotationAngle(elem); if(angle == 0) return; var batchCmd = new BatchCommand("Reorient path"); var changes = { d: elem.getAttribute('d'), transform: elem.getAttribute('transform') }; batchCmd.addSubCommand(new ChangeElementCommand(elem, changes)); clearSelection(); this.resetOrientation(elem); addCommandToHistory(batchCmd); // Set matrix to null getPath(elem).show(false).matrix = null; this.clear(); addToSelection([elem], true); call("changed", selectedElements); }, clear: function(remove) { current_path = null; if (current_mode == "path" && current_path_pts.length > 0) { var elem = getElem(getId()); $(getElem("path_stretch_line")).remove(); $(elem).remove(); $(getElem("pathpointgrip_container")).find('*').attr('display', 'none'); current_path_pts = []; started = false; } else if (current_mode == "pathedit") { this.toSelectMode(); } if(path) path.init().show(false); }, resetOrientation: function(path) { if(path == null || path.nodeName != 'path') return false; var tlist = getTransformList(path); var m = transformListToTransform(tlist).matrix; tlist.clear(); path.removeAttribute("transform"); var segList = path.pathSegList; // Opera/win/non-EN throws an error here. // TODO: Find out why! // Presumed fixed in Opera 10.5, so commented out for now // try { var len = segList.numberOfItems; // } catch(err) { // var fixed_d = pathActions.convertPath(path); // path.setAttribute('d', fixed_d); // segList = path.pathSegList; // var len = segList.numberOfItems; // } for (var i = 0; i < len; ++i) { var seg = segList.getItem(i); var type = seg.pathSegType; if(type == 1) continue; var pts = []; $.each(['',1,2], function(j, n) { var x = seg['x'+n], y = seg['y'+n]; if(x && y) { var pt = transformPoint(x, y, m); pts.splice(pts.length, 0, pt.x, pt.y); } }); replacePathSeg(type, i, pts, path); } }, zoomChange: function() { if(current_mode == "pathedit") { path.update(); } }, getNodePoint: function() { var sel_pt = path.selected_pts.length ? path.selected_pts[0] : 1; var seg = path.segs[sel_pt]; return { x: seg.item.x, y: seg.item.y, type: seg.type }; }, linkControlPoints: function(linkPoints) { link_control_pts = linkPoints; }, clonePathNode: function() { path.storeD(); var sel_pts = path.selected_pts; var segs = path.segs; var i = sel_pts.length; var nums = []; while(i--) { var pt = sel_pts[i]; path.addSeg(pt); nums.push(pt + i); nums.push(pt + i + 1); } path.init().addPtsToSelection(nums); path.endChanges("Clone path node(s)"); }, opencloseSubPath: function() { var sel_pts = path.selected_pts; // Only allow one selected node for now if(sel_pts.length !== 1) return; var elem = path.elem; var list = elem.pathSegList; var len = list.numberOfItems; var index = sel_pts[0]; var open_pt = null; var start_item = null; // Check if subpath is already open path.eachSeg(function(i) { if(this.type === 2 && i <= index) { start_item = this.item; } if(i <= index) return true; if(this.type === 2) { // Found M first, so open open_pt = i; return false; } else if(this.type === 1) { // Found Z first, so closed open_pt = false; return false; } }); if(open_pt == null) { // Single path, so close last seg open_pt = path.segs.length - 1; } if(open_pt !== false) { // Close this path // Create a line going to the previous "M" var newseg = elem.createSVGPathSegLinetoAbs(start_item.x, start_item.y); var closer = elem.createSVGPathSegClosePath(); if(open_pt == path.segs.length - 1) { list.appendItem(newseg); list.appendItem(closer); } else { insertItemBefore(elem, closer, open_pt); insertItemBefore(elem, newseg, open_pt); } path.init().selectPt(open_pt+1); return; } // M 1,1 L 2,2 L 3,3 L 1,1 z // open at 2,2 // M 2,2 L 3,3 L 1,1 // M 1,1 L 2,2 L 1,1 z M 4,4 L 5,5 L6,6 L 5,5 z // M 1,1 L 2,2 L 1,1 z [M 4,4] L 5,5 L(M)6,6 L 5,5 z var seg = path.segs[index]; if(seg.mate) { list.removeItem(index); // Removes last "L" list.removeItem(index); // Removes the "Z" path.init().selectPt(index - 1); return; } var last_m, z_seg; // Find this sub-path's closing point and remove for(var i=0; i<list.numberOfItems; i++) { var item = list.getItem(i); if(item.pathSegType === 2) { // Find the preceding M last_m = i; } else if(i === index) { // Remove it list.removeItem(last_m); // index--; } else if(item.pathSegType === 1 && index < i) { // Remove the closing seg of this subpath z_seg = i-1; list.removeItem(i); break; } } var num = (index - last_m) - 1; while(num--) { insertItemBefore(elem, list.getItem(last_m), z_seg); } var pt = list.getItem(last_m); // Make this point the new "M" replacePathSeg(2, last_m, [pt.x, pt.y]); var i = index path.init().selectPt(0); }, deletePathNode: function() { if(!pathActions.canDeleteNodes) return; path.storeD(); var sel_pts = path.selected_pts; var i = sel_pts.length; while(i--) { var pt = sel_pts[i]; path.deleteSeg(pt); } // Cleanup var cleanup = function() { var segList = path.elem.pathSegList; var len = segList.numberOfItems; var remItems = function(pos, count) { while(count--) { segList.removeItem(pos); } } if(len <= 1) return true; while(len--) { var item = segList.getItem(len); if(item.pathSegType === 1) { var prev = segList.getItem(len-1); var nprev = segList.getItem(len-2); if(prev.pathSegType === 2) { remItems(len-1, 2); cleanup(); break; } else if(nprev.pathSegType === 2) { remItems(len-2, 3); cleanup(); break; } } else if(item.pathSegType === 2) { if(len > 0) { var prev_type = segList.getItem(len-1).pathSegType; // Path has M M if(prev_type === 2) { remItems(len-1, 1); cleanup(); break; // Entire path ends with Z M } else if(prev_type === 1 && segList.numberOfItems-1 === len) { remItems(len, 1); cleanup(); break; } } } } return false; } cleanup(); // Completely delete a path with 1 or 0 segments if(path.elem.pathSegList.numberOfItems <= 1) { pathActions.toSelectMode(path.elem); canvas.deleteSelectedElements(); return; } path.init(); path.clearSelection(); // TODO: Find right way to select point now // path.selectPt(sel_pt); if(window.opera) { // Opera repaints incorrectly var cp = $(path.elem); cp.attr('d',cp.attr('d')); } path.endChanges("Delete path node(s)"); }, smoothPolylineIntoPath: smoothPolylineIntoPath, setSegType: function(v) { path.setSegType(v); }, moveNode: function(attr, newValue) { var sel_pts = path.selected_pts; if(!sel_pts.length) return; path.storeD(); // Get first selected point var seg = path.segs[sel_pts[0]]; var diff = {x:0, y:0}; diff[attr] = newValue - seg.item[attr]; seg.move(diff.x, diff.y); path.endChanges("Move path point"); }, fixEnd: function(elem) { // Adds an extra segment if the last seg before a Z doesn't end // at its M point // M0,0 L0,100 L100,100 z var segList = elem.pathSegList; var len = segList.numberOfItems; var last_m; for (var i = 0; i < len; ++i) { var item = segList.getItem(i); if(item.pathSegType === 2) { last_m = item; } if(item.pathSegType === 1) { var prev = segList.getItem(i-1); if(prev.x != last_m.x || prev.y != last_m.y) { // Add an L segment here var newseg = elem.createSVGPathSegLinetoAbs(last_m.x, last_m.y); insertItemBefore(elem, newseg, i); // Can this be done better? pathActions.fixEnd(elem); break; } } } if(isWebkit) resetD(elem); }, // Convert a path to one with only absolute or relative values convertPath: function(path, toRel) { var segList = path.pathSegList; var len = segList.numberOfItems; var curx = 0, cury = 0; var d = ""; var last_m = null; for (var i = 0; i < len; ++i) { var seg = segList.getItem(i); // if these properties are not in the segment, set them to zero var x = seg.x || 0, y = seg.y || 0, x1 = seg.x1 || 0, y1 = seg.y1 || 0, x2 = seg.x2 || 0, y2 = seg.y2 || 0; var type = seg.pathSegType; var letter = pathMap[type]['to'+(toRel?'Lower':'Upper')+'Case'](); var addToD = function(pnts, more, last) { var str = ''; var more = more?' '+more.join(' '):''; var last = last?' '+shortFloat(last):''; $.each(pnts, function(i, pnt) { pnts[i] = shortFloat(pnt); }); d += letter + pnts.join(' ') + more + last; } switch (type) { case 1: // z,Z closepath (Z/z) d += "z"; break; case 12: // absolute horizontal line (H) x -= curx; case 13: // relative horizontal line (h) if(toRel) { curx += x; } else { x += curx; curx = x; } addToD([[x]]); break; case 14: // absolute vertical line (V) y -= cury; case 15: // relative vertical line (v) if(toRel) { cury += y; } else { y += cury; cury = y; } addToD([[y]]); break; case 2: // absolute move (M) case 4: // absolute line (L) case 18: // absolute smooth quad (T) x -= curx; y -= cury; case 5: // relative line (l) case 3: // relative move (m) // If the last segment was a "z", this must be relative to if(last_m && segList.getItem(i-1).pathSegType === 1 && !toRel) { curx = last_m[0]; cury = last_m[1]; } case 19: // relative smooth quad (t) if(toRel) { curx += x; cury += y; } else { x += curx; y += cury; curx = x; cury = y; } if(type === 3) last_m = [curx, cury]; addToD([[x,y]]); break; case 6: // absolute cubic (C) x -= curx; x1 -= curx; x2 -= curx; y -= cury; y1 -= cury; y2 -= cury; case 7: // relative cubic (c) if(toRel) { curx += x; cury += y; } else { x += curx; x1 += curx; x2 += curx; y += cury; y1 += cury; y2 += cury; curx = x; cury = y; } addToD([[x1,y1],[x2,y2],[x,y]]); break; case 8: // absolute quad (Q) x -= curx; x1 -= curx; y -= cury; y1 -= cury; case 9: // relative quad (q) if(toRel) { curx += x; cury += y; } else { x += curx; x1 += curx; y += cury; y1 += cury; curx = x; cury = y; } addToD([[x1,y1],[x,y]]); break; case 10: // absolute elliptical arc (A) x -= curx; y -= cury; case 11: // relative elliptical arc (a) if(toRel) { curx += x; cury += y; } else { x += curx; y += cury; curx = x; cury = y; } addToD([[seg.r1,seg.r2]], [ seg.angle, (seg.largeArcFlag ? 1 : 0), (seg.sweepFlag ? 1 : 0) ],[x,y] ); break; case 16: // absolute smooth cubic (S) x -= curx; x2 -= curx; y -= cury; y2 -= cury; case 17: // relative smooth cubic (s) if(toRel) { curx += x; cury += y; } else { x += curx; x2 += curx; y += cury; y2 += cury; curx = x; cury = y; } addToD([[x2,y2],[x,y]]); break; } // switch on path segment type } // for each segment return d; } } }(); pathActions.init(); // Group: Serialization // Function: removeUnusedDefElems // Looks at DOM elements inside the <defs> to see if they are referred to, // removes them from the DOM if they are not. // // Returns: // The amount of elements that were removed var removeUnusedDefElems = this.removeUnusedDefElems = function() { var defs = svgcontent.getElementsByTagNameNS(svgns, "defs"); if(!defs || !defs.length) return 0; var defelem_uses = [], numRemoved = 0; var attrs = ['fill', 'stroke', 'filter', 'marker-start', 'marker-mid', 'marker-end']; var alen = attrs.length; var all_els = svgcontent.getElementsByTagNameNS(svgns, '*'); var all_len = all_els.length; for(var i=0; i<all_len; i++) { var el = all_els[i]; for(var j = 0; j < alen; j++) { var ref = getUrlFromAttr(el.getAttribute(attrs[j])); if(ref) defelem_uses.push(ref.substr(1)); } // gradients can refer to other gradients var href = getHref(el); if (href && href.indexOf('#') == 0) { defelem_uses.push(href.substr(1)); } }; var defelems = $(svgcontent).find("linearGradient, radialGradient, filter, marker, svg"); defelem_ids = [], i = defelems.length; while (i--) { var defelem = defelems[i]; var id = defelem.id; if($.inArray(id, defelem_uses) == -1) { // Not found, so remove defelem.parentNode.removeChild(defelem); numRemoved++; } } // Remove defs if empty var i = defs.length; while (i--) { var def = defs[i]; if(!def.getElementsByTagNameNS(svgns,'*').length) { def.parentNode.removeChild(def); } } return numRemoved; } // Function: svgCanvasToString // Main function to set up the SVG content for output // // Returns: // String containing the SVG image for output var svgCanvasToString = this.svgCanvasToString = function() { // keep calling it until there are none to remove while (removeUnusedDefElems() > 0) {}; pathActions.clear(true); // Keep SVG-Edit comment on top $.each(svgcontent.childNodes, function(i, node) { if(i && node.nodeType == 8 && node.data.indexOf('Created with') != -1) { svgcontent.insertBefore(node, svgcontent.firstChild); } }); var naked_svgs = []; // Unwrap gsvg if it has no special attributes (only id and style) $(svgcontent).find('g:data(gsvg)').each(function() { var attrs = this.attributes; var len = attrs.length; for(var i=0; i<len; i++) { if(attrs[i].nodeName == 'id' || attrs[i].nodeName == 'style') { len--; } } // No significant attributes, so ungroup if(len <= 0) { var svg = this.firstChild; naked_svgs.push(svg); $(this).replaceWith(svg); } }); var output = svgToString(svgcontent, 0); // Rewrap gsvg if(naked_svgs.length) { $(naked_svgs).each(function() { groupSvgElem(this); }); } return output; } // Function: svgToString // Sub function ran on each SVG element to convert it to a string as desired // // Parameters: // elem - The SVG element to convert // indent - Integer with the amount of spaces to indent this tag // // Returns: // String with the given element as an SVG tag var svgToString = this.svgToString = function(elem, indent) { var out = new Array(), toXml = Utils.toXml; if (elem) { cleanupElement(elem); var attrs = elem.attributes, attr, i, childs = elem.childNodes; for (var i=0; i<indent; i++) out.push(" "); out.push("<"); out.push(elem.nodeName); if(elem.id == 'svgcontent') { // Process root element separately var res = getResolution(); out.push(' width="' + res.w + '" height="' + res.h + '" xmlns="'+svgns+'"'); var nsuris = {}; // Check elements for namespaces, add if found $(elem).find('*').andSelf().each(function() { var el = this; $.each(this.attributes, function(i, attr) { var uri = attr.namespaceURI; if(uri && !nsuris[uri] && nsMap[uri] !== 'xmlns' && nsMap[uri] !== 'xml' ) { nsuris[uri] = true; out.push(" xmlns:" + nsMap[uri] + '="' + uri +'"'); } }); }); var i = attrs.length; while (i--) { attr = attrs.item(i); var attrVal = toXml(attr.nodeValue); // Namespaces have already been dealt with, so skip if(attr.nodeName.indexOf('xmlns:') === 0) continue; // only serialize attributes we don't use internally if (attrVal != "" && $.inArray(attr.localName, ['width','height','xmlns','x','y','viewBox','id','overflow']) == -1) { if(!attr.namespaceURI || nsMap[attr.namespaceURI]) { out.push(' '); out.push(attr.nodeName); out.push("=\""); out.push(attrVal); out.push("\""); } } } } else { for (var i=attrs.length-1; i>=0; i--) { attr = attrs.item(i); var attrVal = toXml(attr.nodeValue); //remove bogus attributes added by Gecko if ($.inArray(attr.localName, ['-moz-math-font-style', '_moz-math-font-style']) !== -1) continue; if (attrVal != "") { if(attrVal.indexOf('pointer-events') == 0) continue; if(attr.localName == "class" && attrVal.indexOf('se_') == 0) continue; out.push(" "); if(attr.localName == 'd') attrVal = pathActions.convertPath(elem, true); if(!isNaN(attrVal)) { attrVal = shortFloat(attrVal); } // Embed images when saving if(save_options.apply && elem.nodeName == 'image' && attr.localName == 'href' && save_options.images && save_options.images == 'embed') { var img = encodableImages[attrVal]; if(img) attrVal = img; } // map various namespaces to our fixed namespace prefixes // (the default xmlns attribute itself does not get a prefix) if(!attr.namespaceURI || attr.namespaceURI == svgns || nsMap[attr.namespaceURI]) { out.push(attr.nodeName); out.push("=\""); out.push(attrVal); out.push("\""); } } } } if (elem.hasChildNodes()) { out.push(">"); indent++; var bOneLine = false; for (var i=0; i<childs.length; i++) { var child = childs.item(i); switch(child.nodeType) { case 1: // element node out.push("\n"); out.push(svgToString(childs.item(i), indent)); break; case 3: // text node var str = child.nodeValue.replace(/^\s+|\s+$/g, ""); if (str != "") { bOneLine = true; out.push(toXml(str) + ""); } break; case 8: // comment out.push("\n"); out.push(new Array(indent+1).join(" ")); out.push("<!--"); out.push(child.data); out.push("-->"); break; } // switch on node type } indent--; if (!bOneLine) { out.push("\n"); for (var i=0; i<indent; i++) out.push(" "); } out.push("</"); out.push(elem.nodeName); out.push(">"); } else { out.push("/>"); } } return out.join(''); }; // end svgToString() // Function: embedImage // Converts a given image file to a data URL when possible, then runs a given callback // // Parameters: // val - String with the path/URL of the image // callback - Optional function to run when image data is found, supplies the // result (data URL or false) as first parameter. this.embedImage = function(val, callback) { // load in the image and once it's loaded, get the dimensions $(new Image()).load(function() { // create a canvas the same size as the raster image var canvas = document.createElement("canvas"); canvas.width = this.width; canvas.height = this.height; // load the raster image into the canvas canvas.getContext("2d").drawImage(this,0,0); // retrieve the data: URL try { var urldata = ';svgedit_url=' + encodeURIComponent(val); urldata = canvas.toDataURL().replace(';base64',urldata+';base64'); encodableImages[val] = urldata; } catch(e) { encodableImages[val] = false; } last_good_img_url = val; if(callback) callback(encodableImages[val]); }).attr('src',val); } // Function: setGoodImage // Sets a given URL to be a "last good image" URL this.setGoodImage = function(val) { last_good_img_url = val; } this.open = function() { // Nothing by default, handled by optional widget/extension }; // Function: save // Serializes the current drawing into SVG XML text and returns it to the 'saved' handler. // This function also includes the XML prolog. Clients of the SvgCanvas bind their save // function to the 'saved' event. // // Returns: // Nothing this.save = function(opts) { // remove the selected outline before serializing clearSelection(); // Update save options if provided if(opts) $.extend(save_options, opts); save_options.apply = true; // no need for doctype, see http://jwatt.org/svg/authoring/#doctype-declaration var str = svgCanvasToString(); call("saved", str); }; // Function: rasterExport // Generates a PNG Data URL based on the current image, then calls "exported" // with an object including the string and any issues found this.rasterExport = function() { // remove the selected outline before serializing clearSelection(); // Check for known CanVG issues var issues = []; // Selector and notice var issue_list = { 'feGaussianBlur': uiStrings.exportNoBlur, 'foreignObject': uiStrings.exportNoforeignObject, '[stroke-dasharray]': uiStrings.exportNoDashArray }; var content = $(svgcontent); // Add font/text check if Canvas Text API is not implemented if(!("font" in $('<canvas>')[0].getContext('2d'))) { issue_list['text'] = uiStrings.exportNoText; } $.each(issue_list, function(sel, descr) { if(content.find(sel).length) { issues.push(descr); } }); var str = svgCanvasToString(); call("exported", {svg: str, issues: issues}); }; // Function: getSvgString // Returns the current drawing as raw SVG XML text. // // Returns: // The current drawing as raw SVG XML text. this.getSvgString = function() { save_options.apply = false; return svgCanvasToString(); }; //function randomizeIds // This function determines whether to add a nonce to the prefix, when // generating IDs in SVG-Edit // // Parameters: // an opional boolean, which, if true, adds a nonce to the prefix. Thus // svgCanvas.randomizeIds() <==> svgCanvas.randomizeIds(true) // // if you're controlling SVG-Edit externally, and want randomized IDs, call // this BEFORE calling svgCanvas.setSvgString // this.randomizeIds = function() { if (arguments.length > 0 && arguments[0] == false) { randomize_ids = false; if (extensions["Arrows"]) call("unsetarrownonce") ; } else { randomize_ids = true; if (!svgcontent.getAttributeNS(se_ns, 'nonce')) { svgcontent.setAttributeNS(se_ns, 'se:nonce', nonce); if (extensions["Arrows"]) call("setarrownonce", nonce) ; } } } // Function: uniquifyElems // Ensure each element has a unique ID // // Parameters: // g - The parent element of the tree to give unique IDs var uniquifyElems = this.uniquifyElems = function(g) { var ids = {}; walkTree(g, function(n) { // if it's an element node if (n.nodeType == 1) { // and the element has an ID if (n.id) { // and we haven't tracked this ID yet if (!(n.id in ids)) { // add this id to our map ids[n.id] = {elem:null, attrs:[], hrefs:[]}; } ids[n.id]["elem"] = n; } // now search for all attributes on this element that might refer // to other elements $.each(["clip-path", "fill", "filter", "marker-end", "marker-mid", "marker-start", "mask", "stroke"],function(i,attr) { var attrnode = n.getAttributeNode(attr); if (attrnode) { // the incoming file has been sanitized, so we should be able to safely just strip off the leading # var url = getUrlFromAttr(attrnode.value), refid = url ? url.substr(1) : null; if (refid) { if (!(refid in ids)) { // add this id to our map ids[refid] = {elem:null, attrs:[], hrefs:[]}; } ids[refid]["attrs"].push(attrnode); } } }); // check xlink:href now var href = getHref(n); // TODO: what if an <image> or <a> element refers to an element internally? if(href && $.inArray(n.nodeName, ["filter", "linearGradient", "pattern", "radialGradient", "textPath", "use"]) != -1) { var refid = href.substr(1); if (!(refid in ids)) { // add this id to our map ids[refid] = {elem:null, attrs:[], hrefs:[]}; } ids[refid]["hrefs"].push(n); } } }); // in ids, we now have a map of ids, elements and attributes, let's re-identify for (var oldid in ids) { var elem = ids[oldid]["elem"]; if (elem) { var newid = getNextId(); // manually increment obj_num because our cloned elements are not in the DOM yet obj_num++; // assign element its new id elem.id = newid; // remap all url() attributes var attrs = ids[oldid]["attrs"]; var j = attrs.length; while (j--) { var attr = attrs[j]; attr.ownerElement.setAttribute(attr.name, "url(#" + newid + ")"); } // remap all href attributes var hreffers = ids[oldid]["hrefs"]; var k = hreffers.length; while (k--) { var hreffer = hreffers[k]; setHref(hreffer, "#"+newid); } } } // manually increment obj_num because our cloned elements are not in the DOM yet obj_num++; } // Function: convertToGroup // Converts selected/given <use> or child SVG element to a group var convertToGroup = this.convertToGroup = function(elem) { if(!elem) { elem = selectedElements[0]; } var $elem = $(elem); var batchCmd = new BatchCommand(); var ts; if($elem.data('gsvg')) { // Use the gsvg as the new group var svg = elem.firstChild; var pt = $(svg).attr(['x', 'y']); $(elem.firstChild.firstChild).unwrap(); $(elem).removeData('gsvg'); var tlist = getTransformList(elem); var xform = svgroot.createSVGTransform(); xform.setTranslate(pt.x, pt.y); tlist.appendItem(xform); recalculateDimensions(elem); call("selected", [elem]); } else if($elem.data('symbol')) { elem = $elem.data('symbol'); ts = $elem.attr('transform'); var pos = $elem.attr(['x','y']); // Not ideal, but works ts += "translate(" + pos.x + "," + pos.y + ")"; var prev = $elem.prev(); // Remove <use> element batchCmd.addSubCommand(new RemoveElementCommand($elem[0], $elem[0].parentNode)); $elem.remove(); // See if other elements reference this symbol var has_more = $(svgcontent).find('use:data(symbol)').length; var g = svgdoc.createElementNS(svgns, "g"); var childs = elem.childNodes; for(var i = 0; i < childs.length; i++) { g.appendChild(childs[i].cloneNode(true)); } // while (elem.hasChildNodes()) // g.appendChild(elem.firstChild.cloneNode(true)); if (ts) g.setAttribute("transform", ts); var parent = elem.parentNode; uniquifyElems(g); // now give the g itself a new id g.id = getNextId(); prev.after(g); if(parent) { if(!has_more) { // remove symbol/svg element parent.removeChild(elem); batchCmd.addSubCommand(new RemoveElementCommand(elem, parent)); } batchCmd.addSubCommand(new InsertElementCommand(g)); } // recalculate dimensions on the top-level children so that unnecessary transforms // are removed walkTreePost(g, function(n){try{recalculateDimensions(n)}catch(e){console.log(e)}}); // Give ID for any visible element missing one $(g).find(visElems).each(function() { if(!this.id) this.id = getNextId(); }); selectOnly([g]); addCommandToHistory(batchCmd); } else { console.log('Unexpected element to ungroup:', elem); } } // // Function: setSvgString // This function sets the current drawing as the input SVG XML. // // Parameters: // xmlString - The SVG as XML text. // // Returns: // This function returns false if the set was unsuccessful, true otherwise. this.setSvgString = function(xmlString) { try { // convert string into XML document var newDoc = Utils.text2xml(xmlString); // run it through our sanitizer to remove anything we do not support sanitizeSvg(newDoc.documentElement); var batchCmd = new BatchCommand("Change Source"); // remove old svg document var oldzoom = svgroot.removeChild(svgcontent); batchCmd.addSubCommand(new RemoveElementCommand(oldzoom, svgroot)); // set new svg document svgcontent = svgroot.appendChild(svgdoc.importNode(newDoc.documentElement, true)); var content = $(svgcontent); // retrieve or set the nonce n = svgcontent.getAttributeNS(se_ns, 'nonce'); if (n) { randomize_ids = true; nonce = n; if (extensions["Arrows"]) call("setarrownonce", n) ; } else if (randomize_ids) { svgcontent.setAttributeNS(xmlnsns, 'xmlns:se', se_ns); svgcontent.setAttributeNS(se_ns, 'se:nonce', nonce); if (extensions["Arrows"]) call("setarrownonce", nonce) ; } // change image href vals if possible content.find('image').each(function() { var image = this; preventClickDefault(image); var val = getHref(this); if(val.indexOf('data:') === 0) { // Check if an SVG-edit data URI var m = val.match(/svgedit_url=(.*?);/); if(m) { var url = decodeURIComponent(m[1]); $(new Image()).load(function() { image.setAttributeNS(xlinkns,'xlink:href',url); }).attr('src',url); } } // Add to encodableImages if it loads canvas.embedImage(val); }); // Wrap child SVGs in group elements content.find('svg').each(function() { // Skip if it's in a <defs> if($(this).closest('defs').length) return; uniquifyElems(this); // Check if it already has a gsvg group var pa = this.parentNode; if(pa.childNodes.length === 1 && pa.nodeName === 'g') { $(pa).data('gsvg', this); pa.id = pa.id || getNextId(); } else { groupSvgElem(this); } }); // Set ref element for <use> elements // TODO: This should also be done if the object is re-added through "redo" content.find('use').each(function() { var id = getHref(this).substr(1); var ref_elem = getElem(id); $(this).data('ref', ref_elem); if(ref_elem.tagName == 'symbol' || ref_elem.tagName == 'svg') { $(this).data('symbol', ref_elem); } }); // convert gradients with userSpaceOnUse to objectBoundingBox content.find('linearGradient, radialGradient').each(function() { var grad = this; if($(grad).attr('gradientUnits') === 'userSpaceOnUse') { // TODO: Support more than one element with this ref by duplicating parent grad var elems = $(svgcontent).find('[fill=url(#' + grad.id + ')],[stroke=url(#' + grad.id + ')]'); if(!elems.length) return; // get object's bounding box var bb = elems[0].getBBox(); if(grad.tagName === 'linearGradient') { var g_coords = $(grad).attr(['x1', 'y1', 'x2', 'y2']); $(grad).attr({ x1: (g_coords.x1 - bb.x) / bb.width, y1: (g_coords.y1 - bb.y) / bb.height, x2: (g_coords.x2 - bb.x) / bb.width, y2: (g_coords.y1 - bb.y) / bb.height }); grad.removeAttribute('gradientUnits'); } else { // Note: radialGradient elements cannot be easily converted // because userSpaceOnUse will keep circular gradients, while // objectBoundingBox will x/y scale the gradient according to // its bbox. // For now we'll do nothing, though we should probably have // the gradient be updated as the element is moved, as // inkscape/illustrator do. // var g_coords = $(grad).attr(['cx', 'cy', 'r']); // // $(grad).attr({ // cx: (g_coords.cx - bb.x) / bb.width, // cy: (g_coords.cy - bb.y) / bb.height, // r: g_coords.r // }); // // grad.removeAttribute('gradientUnits'); } } }); // recalculate dimensions on the top-level children so that unnecessary transforms // are removed walkTreePost(svgcontent, function(n){try{recalculateDimensions(n)}catch(e){console.log(e)}}); var attrs = { id: 'svgcontent', overflow: curConfig.show_outside_canvas?'visible':'hidden' }; var percs = false; // determine proper size if (content.attr("viewBox")) { var vb = content.attr("viewBox").split(' '); attrs.width = vb[2]; attrs.height = vb[3]; } // handle content that doesn't have a viewBox else { $.each(['width', 'height'], function(i, dim) { // Set to 100 if not given var val = content.attr(dim); if(!val) val = '100%'; if((val+'').substr(-1) === "%") { // Use user units if percentage given percs = true; } else { attrs[dim] = convertToNum(dim, val); } }); } // identify layers identifyLayers(); // Give ID for any visible layer children missing one content.children().find(visElems).each(function() { if(!this.id) this.id = getNextId(); }); // Percentage width/height, so let's base it on visible elements if(percs) { var bb = getStrokedBBox(); attrs.width = bb.width + bb.x; attrs.height = bb.height + bb.y; } // Just in case negative numbers are given or // result from the percs calculation if(attrs.width <= 0) attrs.width = 100; if(attrs.height <= 0) attrs.height = 100; content.attr(attrs); this.contentW = attrs['width']; this.contentH = attrs['height']; batchCmd.addSubCommand(new InsertElementCommand(svgcontent)); // update root to the correct size var changes = content.attr(["width", "height"]); batchCmd.addSubCommand(new ChangeElementCommand(svgroot, changes)); // reset zoom current_zoom = 1; // reset transform lists svgTransformLists = {}; clearSelection(); pathActions.clearData(); svgroot.appendChild(selectorManager.selectorParentGroup); addCommandToHistory(batchCmd); call("changed", [svgcontent]); } catch(e) { console.log(e); return false; } return true; }; // Function: importSvgString // This function imports the input SVG XML as a <symbol> in the <defs>, then adds a // <use> to the current layer. // // Parameters: // xmlString - The SVG as XML text. // // Returns: // This function returns false if the import was unsuccessful, true otherwise. // TODO: // * properly handle if namespace is introduced by imported content (must add to svgcontent // and update all prefixes in the imported node) // * properly handle recalculating dimensions, recalculateDimensions() doesn't handle // arbitrary transform lists, but makes some assumptions about how the transform list // was obtained // * import should happen in top-left of current zoomed viewport this.importSvgString = function(xmlString) { try { // convert string into XML document var newDoc = Utils.text2xml(xmlString); // run it through our sanitizer to remove anything we do not support sanitizeSvg(newDoc.documentElement); var batchCmd = new BatchCommand("Change Source"); // import new svg document into our document var svg = svgdoc.importNode(newDoc.documentElement, true); var innerw = convertToNum('width', svg.getAttribute("width")), innerh = convertToNum('height', svg.getAttribute("height")), innervb = svg.getAttribute("viewBox"), // if no explicit viewbox, create one out of the width and height vb = innervb ? innervb.split(" ") : [0,0,innerw,innerh]; for (var j = 0; j < 4; ++j) vb[j] = Number(vb[j]); // TODO: properly handle preserveAspectRatio var canvasw = Number(svgcontent.getAttribute("width")), canvash = Number(svgcontent.getAttribute("height")); // imported content should be 1/3 of the canvas on its largest dimension if (innerh > innerw) { var ts = "scale(" + (canvash/3)/vb[3] + ")"; } else { var ts = "scale(" + (canvash/3)/vb[2] + ")"; } // Hack to make recalculateDimensions understand how to scale ts = "translate(0) " + ts + " translate(0)"; // Uncomment this once Firefox has fixed their symbol bug: // https://bugzilla.mozilla.org/show_bug.cgi?id=353575 // var symbol = svgdoc.createElementNS(svgns, "symbol"); // while (svg.firstChild) { // symbol.appendChild(svg.firstChild); // } // var attrs = svg.attributes; // for(var i=0; i < attrs.length; i++) { // var attr = attrs[i]; // symbol.setAttribute(attr.nodeName, attr.nodeValue); // } var symbol = svg; symbol.id = getNextId(); var use_el = svgdoc.createElementNS(svgns, "use"); setHref(use_el, "#" + symbol.id); findDefs().appendChild(symbol); current_layer.appendChild(use_el); use_el.id = getNextId(); clearSelection(); use_el.setAttribute("transform", ts); recalculateDimensions(use_el); $(use_el).data('symbol', symbol); addToSelection([use_el]); return true; // TODO: Find way to add this in a recalculateDimensions-parsable way // if (vb[0] != 0 || vb[1] != 0) // ts = "translate(" + (-vb[0]) + "," + (-vb[1]) + ") " + ts; } catch(e) { console.log(e); return false; } return true; }; // Layer API Functions // Group: Layers // Function: identifyLayers // Updates layer system var identifyLayers = function() { all_layers = []; var numchildren = svgcontent.childNodes.length; // loop through all children of svgcontent var orphans = [], layernames = []; for (var i = 0; i < numchildren; ++i) { var child = svgcontent.childNodes.item(i); // for each g, find its layer name if (child && child.nodeType == 1) { if (child.tagName == "g") { var name = $("title",child).text(); // Hack for Opera 10.60 if(!name && isOpera && child.querySelectorAll) { name = $(child.querySelectorAll('title')).text(); } // store layer and name in global variable if (name) { layernames.push(name); all_layers.push( [name,child] ); current_layer = child; walkTree(child, function(e){e.setAttribute("style", "pointer-events:inherit");}); current_layer.setAttribute("style", "pointer-events:none"); } // if group did not have a name, it is an orphan else { orphans.push(child); } } // if child has a bbox (i.e. not a <title> or <defs> element), then it is an orphan else if(getBBox(child) && child.nodeName != 'defs') { // Opera returns a BBox for defs var bb = getBBox(child); orphans.push(child); } } } // create a new layer and add all the orphans to it if (orphans.length > 0) { var i = 1; while ($.inArray(("Layer " + i), layernames) != -1) { i++; } var newname = "Layer " + i; current_layer = svgdoc.createElementNS(svgns, "g"); var layer_title = svgdoc.createElementNS(svgns, "title"); layer_title.textContent = newname; current_layer.appendChild(layer_title); for (var j = 0; j < orphans.length; ++j) { current_layer.appendChild(orphans[j]); } current_layer = svgcontent.appendChild(current_layer); all_layers.push( [newname, current_layer] ); } walkTree(current_layer, function(e){e.setAttribute("style","pointer-events:inherit");}); current_layer.setAttribute("style","pointer-events:all"); }; // Function: createLayer // Creates a new top-level layer in the drawing with the given name, sets the current layer // to it, and then clears the selection This function then calls the 'changed' handler. // This is an undoable action. // // Parameters: // name - The given name this.createLayer = function(name) { var batchCmd = new BatchCommand("Create Layer"); var new_layer = svgdoc.createElementNS(svgns, "g"); var layer_title = svgdoc.createElementNS(svgns, "title"); layer_title.textContent = name; new_layer.appendChild(layer_title); new_layer = svgcontent.appendChild(new_layer); batchCmd.addSubCommand(new InsertElementCommand(new_layer)); addCommandToHistory(batchCmd); clearSelection(); identifyLayers(); canvas.setCurrentLayer(name); call("changed", [new_layer]); }; // Function: cloneLayer // Creates a new top-level layer in the drawing with the given name, copies all the current layer's contents // to it, and then clears the selection This function then calls the 'changed' handler. // This is an undoable action. // // Parameters: // name - The given name this.cloneLayer = function(name) { var batchCmd = new BatchCommand("Duplicate Layer"); var new_layer = svgdoc.createElementNS(svgns, "g"); var layer_title = svgdoc.createElementNS(svgns, "title"); layer_title.textContent = name; new_layer.appendChild(layer_title); $(current_layer).after(new_layer); var childs = current_layer.childNodes; for(var i = 0; i < childs.length; i++) { var ch = childs[i]; if(ch.localName == 'title') continue; new_layer.appendChild(copyElem(ch)); } clearSelection(); identifyLayers(); batchCmd.addSubCommand(new InsertElementCommand(new_layer)); addCommandToHistory(batchCmd); canvas.setCurrentLayer(name); call("changed", [new_layer]); }; // Function: deleteCurrentLayer // Deletes the current layer from the drawing and then clears the selection. This function // then calls the 'changed' handler. This is an undoable action. this.deleteCurrentLayer = function() { if (current_layer && all_layers.length > 1) { var batchCmd = new BatchCommand("Delete Layer"); // actually delete from the DOM and store in our Undo History var parent = current_layer.parentNode; batchCmd.addSubCommand(new RemoveElementCommand(current_layer, parent)); parent.removeChild(current_layer); addCommandToHistory(batchCmd); clearSelection(); identifyLayers(); canvas.setCurrentLayer(all_layers[all_layers.length-1][0]); call("changed", [svgcontent]); return true; } return false; }; // Function: hasLayer // Check if layer with given name already exists this.hasLayer = function(name) { for(var i = 0; i < all_layers.length; i++) { if(all_layers[i][0] == name) return true; } return false; }; // Function: getNumLayers // Returns the number of layers in the current drawing. // // Returns: // The number of layers in the current drawing. this.getNumLayers = function() { return all_layers.length; }; // Function: getLayer // Returns the name of the ith layer. If the index is out of range, an empty string is returned. // // Parameters: // i - the zero-based index of the layer you are querying. // // Returns: // The name of the ith layer this.getLayer = function(i) { if (i >= 0 && i < canvas.getNumLayers()) { return all_layers[i][0]; } return ""; }; // Function: getCurrentLayer // Returns the name of the currently selected layer. If an error occurs, an empty string // is returned. // // Returns: // The name of the currently active layer. this.getCurrentLayer = function() { for (var i = 0; i < all_layers.length; ++i) { if (all_layers[i][1] == current_layer) { return all_layers[i][0]; } } return ""; }; // Function: setCurrentLayer // Sets the current layer. If the name is not a valid layer name, then this function returns // false. Otherwise it returns true. This is not an undo-able action. // // Parameters: // name - the name of the layer you want to switch to. // // Returns: // true if the current layer was switched, otherwise false this.setCurrentLayer = function(name) { name = Utils.toXml(name); for (var i = 0; i < all_layers.length; ++i) { if (name == all_layers[i][0]) { if (current_layer != all_layers[i][1]) { clearSelection(); current_layer.setAttribute("style", "pointer-events:none"); current_layer = all_layers[i][1]; current_layer.setAttribute("style", "pointer-events:all"); } return true; } } return false; }; // Function: renameCurrentLayer // Renames the current layer. If the layer name is not valid (i.e. unique), then this function // does nothing and returns false, otherwise it returns true. This is an undo-able action. // // Parameters: // newname - the new name you want to give the current layer. This name must be unique // among all layer names. // // Returns: // true if the rename succeeded, false otherwise. this.renameCurrentLayer = function(newname) { if (current_layer) { var oldLayer = current_layer; // setCurrentLayer will return false if the name doesn't already exists if (!canvas.setCurrentLayer(newname)) { var batchCmd = new BatchCommand("Rename Layer"); // find the index of the layer for (var i = 0; i < all_layers.length; ++i) { if (all_layers[i][1] == oldLayer) break; } var oldname = all_layers[i][0]; all_layers[i][0] = Utils.toXml(newname); // now change the underlying title element contents var len = oldLayer.childNodes.length; for (var i = 0; i < len; ++i) { var child = oldLayer.childNodes.item(i); // found the <title> element, now append all the if (child && child.tagName == "title") { // wipe out old name while (child.firstChild) { child.removeChild(child.firstChild); } child.textContent = newname; batchCmd.addSubCommand(new ChangeElementCommand(child, {"#text":oldname})); addCommandToHistory(batchCmd); call("changed", [oldLayer]); return true; } } } current_layer = oldLayer; } return false; }; // Function: setCurrentLayerPosition // Changes the position of the current layer to the new value. If the new index is not valid, // this function does nothing and returns false, otherwise it returns true. This is an // undo-able action. // // Parameters: // newpos - The zero-based index of the new position of the layer. This should be between // 0 and (number of layers - 1) // // Returns: // true if the current layer position was changed, false otherwise. this.setCurrentLayerPosition = function(newpos) { if (current_layer && newpos >= 0 && newpos < all_layers.length) { for (var oldpos = 0; oldpos < all_layers.length; ++oldpos) { if (all_layers[oldpos][1] == current_layer) break; } // some unknown error condition (current_layer not in all_layers) if (oldpos == all_layers.length) { return false; } if (oldpos != newpos) { // if our new position is below us, we need to insert before the node after newpos var refLayer = null; var oldNextSibling = current_layer.nextSibling; if (newpos > oldpos ) { if (newpos < all_layers.length-1) { refLayer = all_layers[newpos+1][1]; } } // if our new position is above us, we need to insert before the node at newpos else { refLayer = all_layers[newpos][1]; } svgcontent.insertBefore(current_layer, refLayer); addCommandToHistory(new MoveElementCommand(current_layer, oldNextSibling, svgcontent)); identifyLayers(); canvas.setCurrentLayer(all_layers[newpos][0]); return true; } } return false; }; // Function: getLayerVisibility // Returns whether the layer is visible. If the layer name is not valid, then this function // returns false. // // Parameters: // layername - the name of the layer which you want to query. // // Returns: // The visibility state of the layer, or false if the layer name was invalid. this.getLayerVisibility = function(layername) { // find the layer var layer = null; for (var i = 0; i < all_layers.length; ++i) { if (all_layers[i][0] == layername) { layer = all_layers[i][1]; break; } } if (!layer) return false; return (layer.getAttribute("display") != "none"); }; // Function: setLayerVisibility // Sets the visibility of the layer. If the layer name is not valid, this function return // false, otherwise it returns true. This is an undo-able action. // // Parameters: // layername - the name of the layer to change the visibility // bVisible - true/false, whether the layer should be visible // // Returns: // true if the layer's visibility was set, false otherwise this.setLayerVisibility = function(layername, bVisible) { // find the layer var layer = null; for (var i = 0; i < all_layers.length; ++i) { if (all_layers[i][0] == layername) { layer = all_layers[i][1]; break; } } if (!layer) return false; var oldDisplay = layer.getAttribute("display"); if (!oldDisplay) oldDisplay = "inline"; layer.setAttribute("display", bVisible ? "inline" : "none"); addCommandToHistory(new ChangeElementCommand(layer, {"display":oldDisplay}, "Layer Visibility")); if (layer == current_layer) { clearSelection(); pathActions.clear(); } // call("changed", [selected]); return true; }; // Function: moveSelectedToLayer // Moves the selected elements to layername. If the name is not a valid layer name, then false // is returned. Otherwise it returns true. This is an undo-able action. // // Parameters: // layername - the name of the layer you want to which you want to move the selected elements // // Returns: // true if the selected elements were moved to the layer, false otherwise. this.moveSelectedToLayer = function(layername) { // find the layer var layer = null; for (var i = 0; i < all_layers.length; ++i) { if (all_layers[i][0] == layername) { layer = all_layers[i][1]; break; } } if (!layer) return false; var batchCmd = new BatchCommand("Move Elements to Layer"); // loop for each selected element and move it var selElems = selectedElements; var i = selElems.length; while (i--) { var elem = selElems[i]; if (!elem) continue; var oldNextSibling = elem.nextSibling; // TODO: this is pretty brittle! var oldLayer = elem.parentNode; layer.appendChild(elem); batchCmd.addSubCommand(new MoveElementCommand(elem, oldNextSibling, oldLayer)); } addCommandToHistory(batchCmd); return true; }; this.mergeLayer = function(skipHistory) { var batchCmd = new BatchCommand("Merge Layer"); var prev = $(current_layer).prev()[0]; if(!prev) return; var childs = current_layer.childNodes; var len = childs.length; batchCmd.addSubCommand(new RemoveElementCommand(current_layer, svgcontent)); while(current_layer.firstChild) { var ch = current_layer.firstChild; if(ch.localName == 'title') { batchCmd.addSubCommand(new RemoveElementCommand(ch, current_layer)); current_layer.removeChild(ch); continue; } var oldNextSibling = ch.nextSibling; prev.appendChild(ch); batchCmd.addSubCommand(new MoveElementCommand(ch, oldNextSibling, current_layer)); } // Remove current layer svgcontent.removeChild(current_layer); if(!skipHistory) { clearSelection(); identifyLayers(); call("changed", [svgcontent]); addCommandToHistory(batchCmd); } current_layer = prev; return batchCmd; } this.mergeAllLayers = function() { var batchCmd = new BatchCommand("Merge all Layers"); current_layer = all_layers[all_layers.length-1][1]; while($(svgcontent).children('g').length > 1) { batchCmd.addSubCommand(canvas.mergeLayer(true)); } clearSelection(); identifyLayers(); call("changed", [svgcontent]); addCommandToHistory(batchCmd); } // Function: getLayerOpacity // Returns the opacity of the given layer. If the input name is not a layer, null is returned. // // Parameters: // layername - name of the layer on which to get the opacity // // Returns: // The opacity value of the given layer. This will be a value between 0.0 and 1.0, or null // if layername is not a valid layer this.getLayerOpacity = function(layername) { for (var i = 0; i < all_layers.length; ++i) { if (all_layers[i][0] == layername) { var g = all_layers[i][1]; var opacity = g.getAttribute("opacity"); if (!opacity) { opacity = "1.0"; } return parseFloat(opacity); } } return null; }; // Function: setLayerOpacity // Sets the opacity of the given layer. If the input name is not a layer, nothing happens. // This is not an undo-able action. NOTE: this function exists solely to apply // a highlighting/de-emphasis effect to a layer, when it is possible for a user to affect // the opacity of a layer, we will need to allow this function to produce an undo-able action. // If opacity is not a value between 0.0 and 1.0, then nothing happens. // // Parameters: // layername - name of the layer on which to set the opacity // opacity - a float value in the range 0.0-1.0 this.setLayerOpacity = function(layername, opacity) { if (opacity < 0.0 || opacity > 1.0) return; for (var i = 0; i < all_layers.length; ++i) { if (all_layers[i][0] == layername) { var g = all_layers[i][1]; g.setAttribute("opacity", opacity); break; } } }; // Group: Document functions // Function: clear // Clears the current document. This is not an undoable action. this.clear = function() { pathActions.clear(); // clear the svgcontent node var nodes = svgcontent.childNodes; var len = svgcontent.childNodes.length; var i = 0; clearSelection(); for(var rep = 0; rep < len; rep++){ if (nodes[i].nodeType == 1) { // element node svgcontent.removeChild(nodes[i]); } else { i++; } } // create empty first layer all_layers = []; canvas.createLayer("Layer 1"); // clear the undo stack resetUndoStack(); // reset the selector manager selectorManager.initGroup(); // reset the rubber band box rubberBox = selectorManager.getRubberBandBox(); call("cleared"); }; // Function: linkControlPoints // Alias function this.linkControlPoints = pathActions.linkControlPoints; // Function: getContentElem // Returns the content DOM element this.getContentElem = function() { return svgcontent; }; // Function: getRootElem // Returns the root DOM element this.getRootElem = function() { return svgroot; }; // Function: getSelectedElems // Returns the array with selected DOM elements this.getSelectedElems = function() { return selectedElements; }; // Function: getResolution // Returns the current dimensions and zoom level in an object var getResolution = this.getResolution = function() { // var vb = svgcontent.getAttribute("viewBox").split(' '); // return {'w':vb[2], 'h':vb[3], 'zoom': current_zoom}; return { 'w':svgcontent.getAttribute("width")/current_zoom, 'h':svgcontent.getAttribute("height")/current_zoom, 'zoom': current_zoom }; }; // Function: getZoom // Returns the current zoom level this.getZoom = function(){return current_zoom;}; // Function: getVersion // Returns a string which describes the revision number of SvgCanvas. this.getVersion = function() { return "svgcanvas.js ($Rev: 1730 $)"; }; // Function: setUiStrings // Update interface strings with given values // // Parameters: // strs - Object with strings (see uiStrings for examples) this.setUiStrings = function(strs) { $.extend(uiStrings, strs); } // Function: setConfig // Update configuration options with given values // // Parameters: // opts - Object with options (see curConfig for examples) this.setConfig = function(opts) { $.extend(curConfig, opts); } // Function: getDocumentTitle // Returns the current group/SVG's title contents this.getTitle = function(elem) { elem = elem || selectedElements[0]; if(!elem) return; elem = $(elem).data('gsvg') || $(elem).data('symbol') || elem; var childs = elem.childNodes; for (var i=0; i<childs.length; i++) { if(childs[i].nodeName == 'title') { return childs[i].textContent; } } return ''; } // Function: getHref // Returns the given element's xlink:href value var getHref = this.getHref = function(elem) { return elem.getAttributeNS(xlinkns, "href"); } // Function: setHref // Sets the given element's xlink:href value var setHref = this.setHref = function(elem, val) { elem.setAttributeNS(xlinkns, "xlink:href", val); } // Function: setGroupTitle // Sets the group/SVG's title content // TODO: Combine this with setDocumentTitle this.setGroupTitle = function(val) { var elem = selectedElements[0]; elem = $(elem).data('gsvg') || elem; var ts = $(elem).children('title'); var batchCmd = new BatchCommand("Set Label"); if(!val.length) { // Remove title element batchCmd.addSubCommand(new RemoveElementCommand(ts[0], elem)); ts.remove(); } else if(ts.length) { // Change title contents var title = ts[0]; batchCmd.addSubCommand(new ChangeElementCommand(title, {'#text': title.textContent})); title.textContent = val; } else { // Add title element title = svgdoc.createElementNS(svgns, "title"); title.textContent = val; $(elem).prepend(title); batchCmd.addSubCommand(new InsertElementCommand(title)); } addCommandToHistory(batchCmd); } // Function: getDocumentTitle // Returns the current document title or an empty string if not found this.getDocumentTitle = function() { return canvas.getTitle(svgcontent); } // Function: setDocumentTitle // Adds/updates a title element for the document with the given name. // This is an undoable action // // Parameters: // newtitle - String with the new title this.setDocumentTitle = function(newtitle) { var childs = svgcontent.childNodes, doc_title = false, old_title = ''; var batchCmd = new BatchCommand("Change Image Title"); for (var i=0; i<childs.length; i++) { if(childs[i].nodeName == 'title') { doc_title = childs[i]; old_title = doc_title.textContent; break; } } if(!doc_title) { doc_title = svgdoc.createElementNS(svgns, "title"); svgcontent.insertBefore(doc_title, svgcontent.firstChild); } if(newtitle.length) { doc_title.textContent = newtitle; } else { // No title given, so element is not necessary doc_title.parentNode.removeChild(doc_title); } batchCmd.addSubCommand(new ChangeElementCommand(doc_title, {'#text': old_title})); addCommandToHistory(batchCmd); } // Function: getEditorNS // Returns the editor's namespace URL, optionally adds it to root element // // Parameters: // add - Boolean to indicate whether or not to add the namespace value this.getEditorNS = function(add) { if(add) { svgcontent.setAttribute('xmlns:se', se_ns); } return se_ns; } // Function: setResolution // Changes the document's dimensions to the given size // // Parameters: // x - Number with the width of the new dimensions in user units. // Can also be the string "fit" to indicate "fit to content" // y - Number with the height of the new dimensions in user units. // // Returns: // Boolean to indicate if resolution change was succesful. // It will fail on "fit to content" option with no content to fit to. this.setResolution = function(x, y) { var res = getResolution(); var w = res.w, h = res.h; var batchCmd; if(x == 'fit') { // Get bounding box var bbox = getStrokedBBox(); if(bbox) { batchCmd = new BatchCommand("Fit Canvas to Content"); var visEls = getVisibleElements(); addToSelection(visEls); var dx = [], dy = []; $.each(visEls, function(i, item) { dx.push(bbox.x*-1); dy.push(bbox.y*-1); }); var cmd = canvas.moveSelectedElements(dx, dy, true); batchCmd.addSubCommand(cmd); clearSelection(); x = Math.round(bbox.width); y = Math.round(bbox.height); } else { return false; } } if (x != w || y != h) { var handle = svgroot.suspendRedraw(1000); if(!batchCmd) { batchCmd = new BatchCommand("Change Image Dimensions"); } x = convertToNum('width', x); y = convertToNum('height', y); svgcontent.setAttribute('width', x); svgcontent.setAttribute('height', y); this.contentW = x; this.contentH = y; batchCmd.addSubCommand(new ChangeElementCommand(svgcontent, {"width":w, "height":h})); svgcontent.setAttribute("viewBox", [0, 0, x/current_zoom, y/current_zoom].join(' ')); batchCmd.addSubCommand(new ChangeElementCommand(svgcontent, {"viewBox": ["0 0", w, h].join(' ')})); addCommandToHistory(batchCmd); svgroot.unsuspendRedraw(handle); call("changed", [svgcontent]); } return true; }; // Function: getOffset // Returns an object with x, y values indicating the svgcontent element's // position in the editor's canvas. this.getOffset = function() { return $(svgcontent).attr(['x', 'y']); } // Function: setBBoxZoom // Sets the zoom level on the canvas-side based on the given value // // Parameters: // val - Bounding box object to zoom to or string indicating zoom option // editor_w - Integer with the editor's workarea box's width // editor_h - Integer with the editor's workarea box's height this.setBBoxZoom = function(val, editor_w, editor_h) { var spacer = .85; var bb; var calcZoom = function(bb) { if(!bb) return false; var w_zoom = Math.round((editor_w / bb.width)*100 * spacer)/100; var h_zoom = Math.round((editor_h / bb.height)*100 * spacer)/100; var zoomlevel = Math.min(w_zoom,h_zoom); canvas.setZoom(zoomlevel); return {'zoom': zoomlevel, 'bbox': bb}; } if(typeof val == 'object') { bb = val; if(bb.width == 0 || bb.height == 0) { var newzoom = bb.zoom?bb.zoom:current_zoom * bb.factor; canvas.setZoom(newzoom); return {'zoom': current_zoom, 'bbox': bb}; } return calcZoom(bb); } switch (val) { case 'selection': if(!selectedElements[0]) return; var sel_elems = $.map(selectedElements, function(n){ if(n) return n; }); bb = getStrokedBBox(sel_elems); break; case 'canvas': var res = getResolution(); spacer = .95; bb = {width:res.w, height:res.h ,x:0, y:0}; break; case 'content': bb = getStrokedBBox(); break; case 'layer': bb = getStrokedBBox(getVisibleElements(current_layer)); break; default: return; } return calcZoom(bb); } // Function: setZoom // Sets the zoom to the given level // // Parameters: // zoomlevel - Float indicating the zoom level to change to this.setZoom = function(zoomlevel) { var res = getResolution(); svgcontent.setAttribute("viewBox", "0 0 " + res.w/zoomlevel + " " + res.h/zoomlevel); current_zoom = zoomlevel; $.each(selectedElements, function(i, elem) { if(!elem) return; selectorManager.requestSelector(elem).resize(); }); pathActions.zoomChange(); runExtensions("zoomChanged", zoomlevel); } // Function: getMode // Returns the current editor mode string this.getMode = function() { return current_mode; }; // Function: setMode // Sets the editor's mode to the given string // // Parameters: // name - String with the new mode to change to this.setMode = function(name) { pathActions.clear(true); textActions.clear(); cur_properties = (selectedElements[0] && selectedElements[0].nodeName == 'text') ? cur_text : cur_shape; current_mode = name; }; // Group: Element Styling // Function: getColor // Returns the current fill/stroke option this.getColor = function(type) { return cur_properties[type]; }; // Function: setColor // Change the current stroke/fill color/gradient value // // Parameters: // type - String indicating fill or stroke // val - The value to set the stroke attribute to // preventUndo - Boolean indicating whether or not this should be and undoable option this.setColor = function(type, val, preventUndo) { cur_shape[type] = val; cur_properties[type + '_paint'] = {type:"solidColor"}; var elems = []; var i = selectedElements.length; while (i--) { var elem = selectedElements[i]; if (elem) { if (elem.tagName == "g") walkTree(elem, function(e){if(e.nodeName!="g") elems.push(e);}); else { if(type == 'fill') { if(elem.tagName != "polyline" && elem.tagName != "line") { elems.push(elem); } } else { elems.push(elem); } } } } if (elems.length > 0) { if (!preventUndo) { changeSelectedAttribute(type, val, elems); call("changed", elems); } else changeSelectedAttributeNoUndo(type, val, elems); } } // Function: findDefs // Return the document's <defs> element, create it first if necessary var findDefs = function() { var defs = svgcontent.getElementsByTagNameNS(svgns, "defs"); if (defs.length > 0) { defs = defs[0]; } else { // first child is a comment, so call nextSibling defs = svgcontent.insertBefore( svgdoc.createElementNS(svgns, "defs" ), svgcontent.firstChild.nextSibling); } return defs; }; // Function: setGradient // Apply the current gradient to selected element's fill or stroke // // Parameters // type - String indicating "fill" or "stroke" to apply to an element var setGradient = this.setGradient = function(type) { if(!cur_properties[type + '_paint'] || cur_properties[type + '_paint'].type == "solidColor") return; var grad = canvas[type + 'Grad']; // find out if there is a duplicate gradient already in the defs var duplicate_grad = findDuplicateGradient(grad); var defs = findDefs(); // no duplicate found, so import gradient into defs if (!duplicate_grad) { var orig_grad = grad; grad = defs.appendChild( svgdoc.importNode(grad, true) ); // get next id and set it on the grad grad.id = getNextId(); } else { // use existing gradient grad = duplicate_grad; } canvas.setColor(type, "url(#" + grad.id + ")"); } // Function: findDuplicateGradient // Check if exact gradient already exists // // Parameters: // grad - The gradient DOM element to compare to others // // Returns: // The existing gradient if found, null if not var findDuplicateGradient = function(grad) { var defs = findDefs(); var existing_grads = $(defs).find("linearGradient, radialGradient"); var i = existing_grads.length; var rad_attrs = ['r','cx','cy','fx','fy']; while (i--) { var og = existing_grads[i]; if(grad.tagName == "linearGradient") { if (grad.getAttribute('x1') != og.getAttribute('x1') || grad.getAttribute('y1') != og.getAttribute('y1') || grad.getAttribute('x2') != og.getAttribute('x2') || grad.getAttribute('y2') != og.getAttribute('y2')) { continue; } } else { var grad_attrs = $(grad).attr(rad_attrs); var og_attrs = $(og).attr(rad_attrs); var diff = false; $.each(rad_attrs, function(i, attr) { if(grad_attrs[attr] != og_attrs[attr]) diff = true; }); if(diff) continue; } // else could be a duplicate, iterate through stops var stops = grad.getElementsByTagNameNS(svgns, "stop"); var ostops = og.getElementsByTagNameNS(svgns, "stop"); if (stops.length != ostops.length) { continue; } var j = stops.length; while(j--) { var stop = stops[j]; var ostop = ostops[j]; if (stop.getAttribute('offset') != ostop.getAttribute('offset') || stop.getAttribute('stop-opacity') != ostop.getAttribute('stop-opacity') || stop.getAttribute('stop-color') != ostop.getAttribute('stop-color')) { break; } } if (j == -1) { return og; } } // for each gradient in defs return null; }; // Function: setPaint // Set a color/gradient to a fill/stroke // // Parameters: // type - String with "fill" or "stroke" // paint - The jGraduate paint object to apply this.setPaint = function(type, paint) { // make a copy var p = new $.jGraduate.Paint(paint); this.setPaintOpacity(type, p.alpha/100, true); // now set the current paint object cur_properties[type + '_paint'] = p; switch ( p.type ) { case "solidColor": this.setColor(type, p.solidColor != "none" ? "#"+p.solidColor : "none");; break; case "linearGradient": case "radialGradient": canvas[type + 'Grad'] = p[p.type]; setGradient(type); break; default: // console.log("none!"); } }; // this.setStrokePaint = function(p) { // // make a copy // var p = new $.jGraduate.Paint(p); // this.setStrokeOpacity(p.alpha/100); // // // now set the current paint object // cur_properties.stroke_paint = p; // switch ( p.type ) { // case "solidColor": // this.setColor('stroke', p.solidColor != "none" ? "#"+p.solidColor : "none");; // break; // case "linearGradient" // case "radialGradient" // canvas.strokeGrad = p[p.type]; // setGradient(type); // default: // // console.log("none!"); // } // }; // // this.setFillPaint = function(p, addGrad) { // // make a copy // var p = new $.jGraduate.Paint(p); // this.setFillOpacity(p.alpha/100, true); // // // now set the current paint object // cur_properties.fill_paint = p; // if (p.type == "solidColor") { // this.setColor('fill', p.solidColor != "none" ? "#"+p.solidColor : "none"); // } // else if(p.type == "linearGradient") { // canvas.fillGrad = p.linearGradient; // if(addGrad) setGradient(); // } // else if(p.type == "radialGradient") { // canvas.fillGrad = p.radialGradient; // if(addGrad) setGradient(); // } // else { // // console.log("none!"); // } // }; // Function: getStrokeWidth // Returns the current stroke-width value this.getStrokeWidth = function() { return cur_properties.stroke_width; }; // Function: setStrokeWidth // Sets the stroke width for the current selected elements // When attempting to set a line's width to 0, this changes it to 1 instead // // Parameters: // val - A Float indicating the new stroke width value this.setStrokeWidth = function(val) { if(val == 0 && $.inArray(current_mode, ['line', 'path']) != -1) { canvas.setStrokeWidth(1); return; } cur_properties.stroke_width = val; var elems = []; var i = selectedElements.length; while (i--) { var elem = selectedElements[i]; if (elem) { if (elem.tagName == "g") walkTree(elem, function(e){if(e.nodeName!="g") elems.push(e);}); else elems.push(elem); } } if (elems.length > 0) { changeSelectedAttribute("stroke-width", val, elems); call("changed", selectedElements); } }; // Function: setStrokeAttr // Set the given stroke-related attribute the given value for selected elements // // Parameters: // attr - String with the attribute name // val - String or number with the attribute value this.setStrokeAttr = function(attr, val) { cur_shape[attr.replace('-','_')] = val; var elems = []; var i = selectedElements.length; while (i--) { var elem = selectedElements[i]; if (elem) { if (elem.tagName == "g") walkTree(elem, function(e){if(e.nodeName!="g") elems.push(e);}); else elems.push(elem); } } if (elems.length > 0) { changeSelectedAttribute(attr, val, elems); call("changed", selectedElements); } }; // Function: getStyle // Returns current style options this.getStyle = function() { return cur_shape; } // Function: getOpacity // Returns the current opacity this.getOpacity = function() { return cur_shape.opacity; }; // Function: setOpacity // Sets the given opacity to the current selected elements this.setOpacity = function(val) { cur_shape.opacity = val; changeSelectedAttribute("opacity", val); }; // Function: getOpacity // Returns the current fill opacity this.getFillOpacity = function() { return cur_shape.fill_opacity; }; // Function: getStrokeOpacity // Returns the current stroke opacity this.getStrokeOpacity = function() { return cur_shape.stroke_opacity; }; // Function: setPaintOpacity // Sets the current fill/stroke opacity // // Parameters: // type - String with "fill" or "stroke" // val - Float with the new opacity value // preventUndo - Boolean indicating whether or not this should be an undoable action this.setPaintOpacity = function(type, val, preventUndo) { cur_shape[type + '_opacity'] = val; if (!preventUndo) changeSelectedAttribute(type + "-opacity", val); else changeSelectedAttributeNoUndo(type + "-opacity", val); }; // Function: getBlur // Gets the stdDeviation blur value of the given element // // Parameters: // elem - The element to check the blur value for this.getBlur = function(elem) { var val = 0; // var elem = selectedElements[0]; if(elem) { var filter_url = elem.getAttribute('filter'); if(filter_url) { var blur = getElem(elem.id + '_blur'); if(blur) { val = blur.firstChild.getAttribute('stdDeviation'); } } } return val; }; (function() { var cur_command = null; var filter = null; var filterHidden = false; // Function: setBlurNoUndo // Sets the stdDeviation blur value on the selected element without being undoable // // Parameters: // val - The new stdDeviation value canvas.setBlurNoUndo = function(val) { if(!filter) { canvas.setBlur(val); return; } if(val === 0) { // Don't change the StdDev, as that will hide the element. // Instead, just remove the value for "filter" changeSelectedAttributeNoUndo("filter", ""); filterHidden = true; } else { if(filterHidden) { changeSelectedAttributeNoUndo("filter", 'url(#' + selectedElements[0].id + '_blur)'); } changeSelectedAttributeNoUndo("stdDeviation", val, [filter.firstChild]); canvas.setBlurOffsets(filter, val); } } function finishChange() { var bCmd = canvas.finishUndoableChange(); cur_command.addSubCommand(bCmd); addCommandToHistory(cur_command); cur_command = null; filter = null; } // Function: setBlurOffsets // Sets the x, y, with, height values of the filter element in order to // make the blur not be clipped. Removes them if not neeeded // // Parameters: // filter - The filter DOM element to update // stdDev - The standard deviation value on which to base the offset size canvas.setBlurOffsets = function(filter, stdDev) { if(stdDev > 3) { // TODO: Create algorithm here where size is based on expected blur assignAttributes(filter, { x: '-50%', y: '-50%', width: '200%', height: '200%', }, 100); } else { filter.removeAttribute('x'); filter.removeAttribute('y'); filter.removeAttribute('width'); filter.removeAttribute('height'); } } // Function: setBlur // Adds/updates the blur filter to the selected element // // Parameters: // val - Float with the new stdDeviation blur value // complete - Boolean indicating whether or not the action should be completed (to add to the undo manager) canvas.setBlur = function(val, complete) { if(cur_command) { finishChange(); return; } // Looks for associated blur, creates one if not found var elem = selectedElements[0]; var elem_id = elem.id; filter = getElem(elem_id + '_blur'); val -= 0; var batchCmd = new BatchCommand(); // Blur found! if(filter) { if(val === 0) { filter = null; } } else { // Not found, so create var newblur = addSvgElementFromJson({ "element": "feGaussianBlur", "attr": { "in": 'SourceGraphic', "stdDeviation": val } }); filter = addSvgElementFromJson({ "element": "filter", "attr": { "id": elem_id + '_blur' } }); filter.appendChild(newblur); findDefs().appendChild(filter); batchCmd.addSubCommand(new InsertElementCommand(filter)); } var changes = {filter: elem.getAttribute('filter')}; if(val === 0) { elem.removeAttribute("filter"); batchCmd.addSubCommand(new ChangeElementCommand(elem, changes)); return; } else { changeSelectedAttribute("filter", 'url(#' + elem_id + '_blur)'); batchCmd.addSubCommand(new ChangeElementCommand(elem, changes)); canvas.setBlurOffsets(filter, val); } cur_command = batchCmd; canvas.beginUndoableChange("stdDeviation", [filter?filter.firstChild:null]); if(complete) { canvas.setBlurNoUndo(val); finishChange(); } }; }()); // Function: getBold // Check whether selected element is bold or not // // Returns: // Boolean indicating whether or not element is bold this.getBold = function() { // should only have one element selected var selected = selectedElements[0]; if (selected != null && selected.tagName == "text" && selectedElements[1] == null) { return (selected.getAttribute("font-weight") == "bold"); } return false; }; // Function: setBold // Make the selected element bold or normal // // Parameters: // b - Boolean indicating bold (true) or normal (false) this.setBold = function(b) { var selected = selectedElements[0]; if (selected != null && selected.tagName == "text" && selectedElements[1] == null) { changeSelectedAttribute("font-weight", b ? "bold" : "normal"); } if(!selectedElements[0].textContent) { textActions.setCursor(); } }; // Function: getItalic // Check whether selected element is italic or not // // Returns: // Boolean indicating whether or not element is italic this.getItalic = function() { var selected = selectedElements[0]; if (selected != null && selected.tagName == "text" && selectedElements[1] == null) { return (selected.getAttribute("font-style") == "italic"); } return false; }; // Function: setItalic // Make the selected element italic or normal // // Parameters: // b - Boolean indicating italic (true) or normal (false) this.setItalic = function(i) { var selected = selectedElements[0]; if (selected != null && selected.tagName == "text" && selectedElements[1] == null) { changeSelectedAttribute("font-style", i ? "italic" : "normal"); } if(!selectedElements[0].textContent) { textActions.setCursor(); } }; // Function: getFontFamily // Returns the current font family this.getFontFamily = function() { return cur_text.font_family; }; // Function: setFontFamily // Set the new font family // // Parameters: // val - String with the new font family this.setFontFamily = function(val) { cur_text.font_family = val; changeSelectedAttribute("font-family", val); if(selectedElements[0] && !selectedElements[0].textContent) { textActions.setCursor(); } }; // Function: getFontSize // Returns the current font size this.getFontSize = function() { return cur_text.font_size; }; // Function: setFontSize // Applies the given font size to the selected element // // Parameters: // val - Float with the new font size this.setFontSize = function(val) { cur_text.font_size = val; changeSelectedAttribute("font-size", val); if(!selectedElements[0].textContent) { textActions.setCursor(); } }; // Function: getText // Returns the current text (textContent) of the selected element this.getText = function() { var selected = selectedElements[0]; if (selected == null) { return ""; } return selected.textContent; }; // Function: setTextContent // Updates the text element with the given string // // Parameters: // val - String with the new text this.setTextContent = function(val) { changeSelectedAttribute("#text", val); textActions.init(val); textActions.setCursor(); }; // Function: setImageURL // Sets the new image URL for the selected image element. Updates its size if // a new URL is given // // Parameters: // val - String with the image URL/path this.setImageURL = function(val) { var elem = selectedElements[0]; if(!elem) return; var attrs = $(elem).attr(['width', 'height']); var setsize = (!attrs.width || !attrs.height); var cur_href = getHref(elem); // Do nothing if no URL change or size change if(cur_href !== val) { setsize = true; } else if(!setsize) return; var batchCmd = new BatchCommand("Change Image URL"); setHref(elem, val); batchCmd.addSubCommand(new ChangeElementCommand(elem, { "#href": cur_href })); if(setsize) { $(new Image()).load(function() { var changes = $(elem).attr(['width', 'height']); $(elem).attr({ width: this.width, height: this.height }); selectorManager.requestSelector(elem).resize(); batchCmd.addSubCommand(new ChangeElementCommand(elem, changes)); addCommandToHistory(batchCmd); call("changed", [elem]); }).attr('src',val); } else { addCommandToHistory(batchCmd); } }; // Function: setRectRadius // Sets the rx & ry values to the selected rect element to change its corner radius // // Parameters: // val - The new radius this.setRectRadius = function(val) { var selected = selectedElements[0]; if (selected != null && selected.tagName == "rect") { var r = selected.getAttribute("rx"); if (r != val) { selected.setAttribute("rx", val); selected.setAttribute("ry", val); addCommandToHistory(new ChangeElementCommand(selected, {"rx":r, "ry":r}, "Radius")); call("changed", [selected]); } } }; // Group: Element manipulation // Function: setSegType // Sets the new segment type to the selected segment(s). // // Parameters: // new_type - Integer with the new segment type // See http://www.w3.org/TR/SVG/paths.html#InterfaceSVGPathSeg for list this.setSegType = function(new_type) { pathActions.setSegType(new_type); } // Function: convertToPath // Convert selected element to a path, or get the BBox of an element-as-path // // Parameters: // elem - The DOM element to be converted // getBBox - Boolean on whether or not to only return the path's BBox // // Returns: // If the getBBox flag is true, the resulting path's bounding box object. // Otherwise the resulting path element is returned. this.convertToPath = function(elem, getBBox) { if(elem == null) { var elems = selectedElements; $.each(selectedElements, function(i, elem) { if(elem) canvas.convertToPath(elem); }); return; } if(!getBBox) { var batchCmd = new BatchCommand("Convert element to Path"); } var attrs = getBBox?{}:{ "fill": cur_shape.fill, "fill-opacity": cur_shape.fill_opacity, "stroke": cur_shape.stroke, "stroke-width": cur_shape.stroke_width, "stroke-dasharray": cur_shape.stroke_dasharray, "stroke-linejoin": cur_shape.stroke_linejoin, "stroke-linecap": cur_shape.stroke_linecap, "stroke-opacity": cur_shape.stroke_opacity, "opacity": cur_shape.opacity, "visibility":"hidden" }; // any attribute on the element not covered by the above // TODO: make this list global so that we can properly maintain it // TODO: what about @transform, @clip-rule, @fill-rule, etc? $.each(['marker-start', 'marker-end', 'marker-mid', 'filter', 'clip-path'], function() { if (elem.getAttribute(this)) { attrs[this] = elem.getAttribute(this); } }); var path = addSvgElementFromJson({ "element": "path", "attr": attrs }); var eltrans = elem.getAttribute("transform"); if(eltrans) { path.setAttribute("transform",eltrans); } var id = elem.id; var parent = elem.parentNode; if(elem.nextSibling) { parent.insertBefore(path, elem); } else { parent.appendChild(path); } var d = ''; var joinSegs = function(segs) { $.each(segs, function(j, seg) { var l = seg[0], pts = seg[1]; d += l; for(var i=0; i < pts.length; i+=2) { d += (pts[i] +','+pts[i+1]) + ' '; } }); } // Possibly the cubed root of 6, but 1.81 works best var num = 1.81; switch (elem.tagName) { case 'ellipse': case 'circle': var a = $(elem).attr(['rx', 'ry', 'cx', 'cy']); var cx = a.cx, cy = a.cy, rx = a.rx, ry = a.ry; if(elem.tagName == 'circle') { rx = ry = $(elem).attr('r'); } joinSegs([ ['M',[(cx-rx),(cy)]], ['C',[(cx-rx),(cy-ry/num), (cx-rx/num),(cy-ry), (cx),(cy-ry)]], ['C',[(cx+rx/num),(cy-ry), (cx+rx),(cy-ry/num), (cx+rx),(cy)]], ['C',[(cx+rx),(cy+ry/num), (cx+rx/num),(cy+ry), (cx),(cy+ry)]], ['C',[(cx-rx/num),(cy+ry), (cx-rx),(cy+ry/num), (cx-rx),(cy)]], ['Z',[]] ]); break; case 'path': d = elem.getAttribute('d'); break; case 'line': var a = $(elem).attr(["x1", "y1", "x2", "y2"]); d = "M"+a.x1+","+a.y1+"L"+a.x2+","+a.y2; break; case 'polyline': case 'polygon': d = "M" + elem.getAttribute('points'); break; case 'rect': var r = $(elem).attr(['rx', 'ry']); var rx = r.rx, ry = r.ry; var b = elem.getBBox(); var x = b.x, y = b.y, w = b.width, h = b.height; var num = 4-num; // Why? Because! if(!rx && !ry) { // Regular rect joinSegs([ ['M',[x, y]], ['L',[x+w, y]], ['L',[x+w, y+h]], ['L',[x, y+h]], ['L',[x, y]], ['Z',[]] ]); } else { joinSegs([ ['M',[x, y+ry]], ['C',[x,y+ry/num, x+rx/num,y, x+rx,y]], ['L',[x+w-rx, y]], ['C',[x+w-rx/num,y, x+w,y+ry/num, x+w,y+ry]], ['L',[x+w, y+h-ry]], ['C',[x+w, y+h-ry/num, x+w-rx/num,y+h, x+w-rx,y+h]], ['L',[x+rx, y+h]], ['C',[x+rx/num, y+h, x,y+h-ry/num, x,y+h-ry]], ['L',[x, y+ry]], ['Z',[]] ]); } break; default: path.parentNode.removeChild(path); break; } if(d) { path.setAttribute('d',d); } if(!getBBox) { // Replace the current element with the converted one // Reorient if it has a matrix if(eltrans) { var tlist = getTransformList(path); if(hasMatrixTransform(tlist)) { pathActions.resetOrientation(path); } } batchCmd.addSubCommand(new RemoveElementCommand(elem, parent)); batchCmd.addSubCommand(new InsertElementCommand(path)); clearSelection(); elem.parentNode.removeChild(elem) path.setAttribute('id', id); path.removeAttribute("visibility"); addToSelection([path], true); addCommandToHistory(batchCmd); } else { // Get the correct BBox of the new path, then discard it pathActions.resetOrientation(path); var bb = false; try { bb = path.getBBox(); } catch(e) { // Firefox fails } path.parentNode.removeChild(path); return bb; } } // Function: changeSelectedAttributeNoUndo // This function makes the changes to the elements. It does not add the change // to the history stack. // // Parameters: // attr - String with the attribute name // newValue - String or number with the new attribute value // elems - The DOM elements to apply the change to var changeSelectedAttributeNoUndo = function(attr, newValue, elems) { var handle = svgroot.suspendRedraw(1000); if(current_mode == 'pathedit') { // Editing node pathActions.moveNode(attr, newValue); } var elems = elems || selectedElements; var i = elems.length; while (i--) { var elem = elems[i]; if (elem == null) continue; // Go into "select" mode for text changes if(current_mode === "textedit" && attr !== "#text" && elem.textContent.length) { textActions.toSelectMode(elem); } // Set x,y vals on elements that don't have them if((attr == 'x' || attr == 'y') && $.inArray(elem.tagName, ['g', 'polyline', 'path']) != -1) { var bbox = getStrokedBBox([elem]); var diff_x = attr == 'x' ? newValue - bbox.x : 0; var diff_y = attr == 'y' ? newValue - bbox.y : 0; canvas.moveSelectedElements(diff_x*current_zoom, diff_y*current_zoom, true); continue; } // only allow the transform/opacity attribute to change on <g> elements, slightly hacky if (elem.tagName == "g" && $.inArray(attr, ['transform', 'opacity', 'filter']) !== -1); var oldval = attr == "#text" ? elem.textContent : elem.getAttribute(attr); if (oldval == null) oldval = ""; if (oldval != String(newValue)) { if (attr == "#text") { var old_w = getBBox(elem).width; elem.textContent = newValue; elem = ffClone(elem); // Hoped to solve the issue of moving text with text-anchor="start", // but this doesn't actually fix it. Hopefully on the right track, though. -Fyrd // var box=getBBox(elem), left=box.x, top=box.y, width=box.width, // height=box.height, dx = width - old_w, dy=0; // var angle = getRotationAngle(elem, true); // if (angle) { // var r = Math.sqrt( dx*dx + dy*dy ); // var theta = Math.atan2(dy,dx) - angle; // dx = r * Math.cos(theta); // dy = r * Math.sin(theta); // // elem.setAttribute('x', elem.getAttribute('x')-dx); // elem.setAttribute('y', elem.getAttribute('y')-dy); // } } else if (attr == "#href") { setHref(elem, newValue); } else elem.setAttribute(attr, newValue); if (i==0) selectedBBoxes[i] = getBBox(elem); // Use the Firefox ffClone hack for text elements with gradients or // where other text attributes are changed. if(elem.nodeName == 'text') { if((newValue+'').indexOf('url') == 0 || $.inArray(attr, ['font-size','font-family','x','y']) != -1 && elem.textContent) { elem = ffClone(elem); } } // Timeout needed for Opera & Firefox // codedread: it is now possible for this function to be called with elements // that are not in the selectedElements array, we need to only request a // selector if the element is in that array if ($.inArray(elem, selectedElements) != -1) { setTimeout(function() { // Due to element replacement, this element may no longer // be part of the DOM if(!elem.parentNode) return; selectorManager.requestSelector(elem).resize(); },0); } // if this element was rotated, and we changed the position of this element // we need to update the rotational transform attribute var angle = getRotationAngle(elem); if (angle != 0 && attr != "transform") { var tlist = getTransformList(elem); var n = tlist.numberOfItems; while (n--) { var xform = tlist.getItem(n); if (xform.type == 4) { // remove old rotate tlist.removeItem(n); var box = getBBox(elem); var center = transformPoint(box.x+box.width/2, box.y+box.height/2, transformListToTransform(tlist).matrix); var cx = center.x, cy = center.y; var newrot = svgroot.createSVGTransform(); newrot.setRotate(angle, cx, cy); tlist.insertItemBefore(newrot, n); break; } } } } // if oldValue != newValue } // for each elem svgroot.unsuspendRedraw(handle); }; // Function: changeSelectedAttribute // Change the given/selected element and add the original value to the history stack // If you want to change all selectedElements, ignore the elems argument. // If you want to change only a subset of selectedElements, then send the // subset to this function in the elems argument. // // Parameters: // attr - String with the attribute name // newValue - String or number with the new attribute value // elems - The DOM elements to apply the change to var changeSelectedAttribute = this.changeSelectedAttribute = function(attr, val, elems) { var elems = elems || selectedElements; canvas.beginUndoableChange(attr, elems); var i = elems.length; changeSelectedAttributeNoUndo(attr, val, elems); var batchCmd = canvas.finishUndoableChange(); if (!batchCmd.isEmpty()) { addCommandToHistory(batchCmd); } }; // Function: deleteSelectedElements // Removes all selected elements from the DOM and adds the change to the // history stack this.deleteSelectedElements = function() { var batchCmd = new BatchCommand("Delete Elements"); var len = selectedElements.length; var selectedCopy = []; //selectedElements is being deleted for (var i = 0; i < len; ++i) { var selected = selectedElements[i]; if (selected == null) break; var parent = selected.parentNode; var t = selected; // this will unselect the element and remove the selectedOutline selectorManager.releaseSelector(t); var elem = parent.removeChild(t); selectedCopy.push(selected) //for the copy selectedElements[i] = null; batchCmd.addSubCommand(new RemoveElementCommand(elem, parent)); } if (!batchCmd.isEmpty()) addCommandToHistory(batchCmd); call("changed", selectedCopy); clearSelection(); }; // Function: cutSelectedElements // Removes all selected elements from the DOM and adds the change to the // history stack. Remembers removed elements on the clipboard // TODO: Combine similar code with deleteSelectedElements this.cutSelectedElements = function() { var batchCmd = new BatchCommand("Cut Elements"); var len = selectedElements.length; var selectedCopy = []; //selectedElements is being deleted for (var i = 0; i < len; ++i) { var selected = selectedElements[i]; if (selected == null) break; var parent = selected.parentNode; var t = selected; // this will unselect the element and remove the selectedOutline selectorManager.releaseSelector(t); var elem = parent.removeChild(t); selectedCopy.push(selected) //for the copy selectedElements[i] = null; batchCmd.addSubCommand(new RemoveElementCommand(elem, parent)); } if (!batchCmd.isEmpty()) addCommandToHistory(batchCmd); call("changed", selectedCopy); clearSelection(); canvas.clipBoard = selectedCopy; }; // Function: copySelectedElements // Remembers the current selected elements on the clipboard this.copySelectedElements = function() { canvas.clipBoard = $.merge([], selectedElements); }; this.pasteElements = function(type) { var cb = canvas.clipBoard; var len = cb.length; if(!len) return; var pasted = []; var batchCmd = new BatchCommand('Paste elements'); // Move elements to lastClickPoint while (len--) { var elem = cb[len]; if(!elem) continue; var copy = copyElem(elem); // See if elem with elem ID is in the DOM already if(!getElem(elem.id)) copy.id = elem.id; pasted.push(copy); current_layer.appendChild(copy); batchCmd.addSubCommand(new InsertElementCommand(copy)); } selectOnly(pasted); if(type !== 'in_place') { var bbox = getStrokedBBox(pasted); var cx = lastClickPoint.x - (bbox.x + bbox.width/2), cy = lastClickPoint.y - (bbox.y + bbox.height/2), dx = [], dy = []; $.each(pasted, function(i, item) { dx.push(cx); dy.push(cy); }); var cmd = canvas.moveSelectedElements(dx, dy, false); batchCmd.addSubCommand(cmd); } addCommandToHistory(batchCmd); call("changed", pasted); } // Function: groupSelectedElements // Wraps all the selected elements in a group (g) element this.groupSelectedElements = function() { var batchCmd = new BatchCommand("Group Elements"); // create and insert the group element var g = addSvgElementFromJson({ "element": "g", "attr": { "id": getNextId() } }); batchCmd.addSubCommand(new InsertElementCommand(g)); // now move all children into the group var i = selectedElements.length; while (i--) { var elem = selectedElements[i]; if (elem == null) continue; var oldNextSibling = elem.nextSibling; var oldParent = elem.parentNode; g.appendChild(elem); batchCmd.addSubCommand(new MoveElementCommand(elem, oldNextSibling, oldParent)); } if (!batchCmd.isEmpty()) addCommandToHistory(batchCmd); // update selection selectOnly([g], true); }; // Function: ungroupSelectedElement // Unwraps all the elements in a selected group (g) element. This requires // significant recalculations to apply group's transforms, etc to its children this.ungroupSelectedElement = function() { var g = selectedElements[0]; if($(g).data('gsvg') || $(g).data('symbol')) { // Is svg, so actually convert to group convertToGroup(g); return; } if (g.tagName == "g") { var batchCmd = new BatchCommand("Ungroup Elements"); var parent = g.parentNode; var anchor = g.nextSibling; var children = new Array(g.childNodes.length); var xform = g.getAttribute("transform"); // get consolidated matrix var glist = getTransformList(g); var m = transformListToTransform(glist).matrix; // TODO: get all fill/stroke properties from the group that we are about to destroy // "fill", "fill-opacity", "fill-rule", "stroke", "stroke-dasharray", "stroke-dashoffset", // "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", // "stroke-width" // and then for each child, if they do not have the attribute (or the value is 'inherit') // then set the child's attribute var i = 0; var gangle = getRotationAngle(g); var gattrs = $(g).attr(['filter', 'opacity']); var gfilter, gblur; while (g.firstChild) { var elem = g.firstChild; var oldNextSibling = elem.nextSibling; var oldParent = elem.parentNode; // Remove child title elements if(elem.tagName == 'title') { batchCmd.addSubCommand(new RemoveElementCommand(elem, oldParent)); oldParent.removeChild(elem); continue; } children[i++] = elem = parent.insertBefore(elem, anchor); batchCmd.addSubCommand(new MoveElementCommand(elem, oldNextSibling, oldParent)); if(gattrs.opacity !== null && gattrs.opacity !== 1) { var c_opac = elem.getAttribute('opacity') || 1; var new_opac = Math.round((elem.getAttribute('opacity') || 1) * gattrs.opacity * 100)/100; changeSelectedAttribute('opacity', new_opac, [elem]); } if(gattrs.filter) { var cblur = this.getBlur(elem); var orig_cblur = cblur; if(!gblur) gblur = this.getBlur(g); if(cblur) { // Is this formula correct? cblur = (gblur-0) + (cblur-0); } else if(cblur === 0) { cblur = gblur; } // If child has no current filter, get group's filter or clone it. if(!orig_cblur) { // Set group's filter to use first child's ID if(!gfilter) { gfilter = getElem(getUrlFromAttr(gattrs.filter).substr(1)); } else { // Clone the group's filter gfilter = copyElem(gfilter); findDefs().appendChild(gfilter); } } else { gfilter = getElem(getUrlFromAttr(elem.getAttribute('filter')).substr(1)); } // Change this in future for different filters var suffix = (gfilter.firstChild.tagName === 'feGaussianBlur')?'blur':'filter'; gfilter.id = elem.id + '_' + suffix; changeSelectedAttribute('filter', 'url(#' + gfilter.id + ')', [elem]); // Update blur value if(cblur) { changeSelectedAttribute('stdDeviation', cblur, [gfilter.firstChild]); canvas.setBlurOffsets(gfilter, cblur); } } var chtlist = getTransformList(elem); // Hopefully not a problem to add this. Necessary for elements like <desc/> if(!chtlist) continue; if (glist.numberOfItems) { // TODO: if the group's transform is just a rotate, we can always transfer the // rotate() down to the children (collapsing consecutive rotates and factoring // out any translates) if (gangle && glist.numberOfItems == 1) { // [Rg] [Rc] [Mc] // we want [Tr] [Rc2] [Mc] where: // - [Rc2] is at the child's current center but has the // sum of the group and child's rotation angles // - [Tr] is the equivalent translation that this child // undergoes if the group wasn't there // [Tr] = [Rg] [Rc] [Rc2_inv] // get group's rotation matrix (Rg) var rgm = glist.getItem(0).matrix; // get child's rotation matrix (Rc) var rcm = svgroot.createSVGMatrix(); var cangle = getRotationAngle(elem); if (cangle) { rcm = chtlist.getItem(0).matrix; } // get child's old center of rotation var cbox = getBBox(elem); var ceqm = transformListToTransform(chtlist).matrix; var coldc = transformPoint(cbox.x+cbox.width/2, cbox.y+cbox.height/2,ceqm); // sum group and child's angles var sangle = gangle + cangle; // get child's rotation at the old center (Rc2_inv) var r2 = svgroot.createSVGTransform(); r2.setRotate(sangle, coldc.x, coldc.y); // calculate equivalent translate var trm = matrixMultiply(rgm, rcm, r2.matrix.inverse()); // set up tlist if (cangle) { chtlist.removeItem(0); } if (sangle) { if(chtlist.numberOfItems) { chtlist.insertItemBefore(r2, 0); } else { chtlist.appendItem(r2); } } if (trm.e || trm.f) { var tr = svgroot.createSVGTransform(); tr.setTranslate(trm.e, trm.f); if(chtlist.numberOfItems) { chtlist.insertItemBefore(tr, 0); } else { chtlist.appendItem(tr); } } } else { // more complicated than just a rotate // transfer the group's transform down to each child and then // call recalculateDimensions() var oldxform = elem.getAttribute("transform"); var changes = {}; changes["transform"] = oldxform ? oldxform : ""; var newxform = svgroot.createSVGTransform(); // [ gm ] [ chm ] = [ chm ] [ gm' ] // [ gm' ] = [ chm_inv ] [ gm ] [ chm ] var chm = transformListToTransform(chtlist).matrix, chm_inv = chm.inverse(); var gm = matrixMultiply( chm_inv, m, chm ); newxform.setMatrix(gm); chtlist.appendItem(newxform); } batchCmd.addSubCommand(recalculateDimensions(elem)); } } // remove transform and make it undo-able if (xform) { var changes = {}; changes["transform"] = xform; g.setAttribute("transform", ""); g.removeAttribute("transform"); batchCmd.addSubCommand(new ChangeElementCommand(g, changes)); } // remove the group from the selection clearSelection(); // delete the group element (but make undo-able) g = parent.removeChild(g); batchCmd.addSubCommand(new RemoveElementCommand(g, parent)); if (!batchCmd.isEmpty()) addCommandToHistory(batchCmd); // update selection addToSelection(children); } }; // Function: moveToTopSelectedElement // Repositions the selected element to the bottom in the DOM to appear on top of // other elements this.moveToTopSelectedElement = function() { var selected = selectedElements[0]; if (selected != null) { var t = selected; var oldParent = t.parentNode; var oldNextSibling = t.nextSibling; t = t.parentNode.appendChild(t); addCommandToHistory(new MoveElementCommand(t, oldNextSibling, oldParent, "top")); } }; // Function: moveToBottomSelectedElement // Repositions the selected element to the top in the DOM to appear under // other elements this.moveToBottomSelectedElement = function() { var selected = selectedElements[0]; if (selected != null) { var t = selected; var oldParent = t.parentNode; var oldNextSibling = t.nextSibling; var firstChild = t.parentNode.firstChild; if (firstChild.tagName == 'title') { firstChild = firstChild.nextSibling; } // This can probably be removed, as the defs should not ever apppear // inside a layer group if (firstChild.tagName == 'defs') { firstChild = firstChild.nextSibling; } t = t.parentNode.insertBefore(t, firstChild); addCommandToHistory(new MoveElementCommand(t, oldNextSibling, oldParent, "bottom")); } }; // Function: moveUpDownSelected // Moves the select element up or down the stack, based on the visibly // intersecting elements // // Parameters: // dir - String that's either 'Up' or 'Down' this.moveUpDownSelected = function(dir) { var selected = selectedElements[0]; if (!selected) return; curBBoxes = []; var closest, found_cur; // jQuery sorts this list var list = $(getIntersectionList(getStrokedBBox([selected]))).toArray(); if(dir == 'Down') list.reverse(); $.each(list, function() { if(!found_cur) { if(this == selected) { found_cur = true; } return; } closest = this; return false; }); if(!closest) return; var t = selected; var oldParent = t.parentNode; var oldNextSibling = t.nextSibling; $(closest)[dir == 'Down'?'before':'after'](t); addCommandToHistory(new MoveElementCommand(t, oldNextSibling, oldParent, "Move " + dir)); } // Function: moveSelectedElements // Moves selected elements on the X/Y axis // // Parameters: // dx - Float with the distance to move on the x-axis // dy - Float with the distance to move on the y-axis // undoable - Boolean indicating whether or not the action should be undoable // // Returns: // Batch command for the move this.moveSelectedElements = function(dx,dy,undoable) { // if undoable is not sent, default to true // if single values, scale them to the zoom if (dx.constructor != Array) { dx /= current_zoom; dy /= current_zoom; } var undoable = undoable || true; var batchCmd = new BatchCommand("position"); var i = selectedElements.length; while (i--) { var selected = selectedElements[i]; if (selected != null) { if (i==0) selectedBBoxes[i] = getBBox(selected); var b = {}; for(var j in selectedBBoxes[i]) b[j] = selectedBBoxes[i][j]; selectedBBoxes[i] = b; var xform = svgroot.createSVGTransform(); var tlist = getTransformList(selected); // dx and dy could be arrays if (dx.constructor == Array) { if (i==0) { selectedBBoxes[i].x += dx[i]; selectedBBoxes[i].y += dy[i]; } xform.setTranslate(dx[i],dy[i]); } else { if (i==0) { selectedBBoxes[i].x += dx; selectedBBoxes[i].y += dy; } xform.setTranslate(dx,dy); } if(tlist.numberOfItems) { tlist.insertItemBefore(xform, 0); } else { tlist.appendItem(xform); } var cmd = recalculateDimensions(selected); if (cmd) { batchCmd.addSubCommand(cmd); } selectorManager.requestSelector(selected).resize(); } } if (!batchCmd.isEmpty()) { if (undoable) addCommandToHistory(batchCmd); call("changed", selectedElements); return batchCmd; } }; // Function: cloneSelectedElements // Create deep DOM copies (clones) of all selected elements and move them slightly // from their originals this.cloneSelectedElements = function() { var batchCmd = new BatchCommand("Clone Elements"); // find all the elements selected (stop at first null) var len = selectedElements.length; for (var i = 0; i < len; ++i) { var elem = selectedElements[i]; if (elem == null) break; } // use slice to quickly get the subset of elements we need var copiedElements = selectedElements.slice(0,i); this.clearSelection(true); // note that we loop in the reverse way because of the way elements are added // to the selectedElements array (top-first) var i = copiedElements.length; while (i--) { // clone each element and replace it within copiedElements var elem = copiedElements[i] = copyElem(copiedElements[i]); current_layer.appendChild(elem); batchCmd.addSubCommand(new InsertElementCommand(elem)); } if (!batchCmd.isEmpty()) { addToSelection(copiedElements.reverse()); // Need to reverse for correct selection-adding this.moveSelectedElements(20,20,false); addCommandToHistory(batchCmd); } }; // Function: alignSelectedElements // Aligns selected elements // // Parameters: // type - String with single character indicating the alignment type // relative_to - String that must be one of the following: // "selected", "largest", "smallest", "page" this.alignSelectedElements = function(type, relative_to) { var bboxes = [], angles = []; var minx = Number.MAX_VALUE, maxx = Number.MIN_VALUE, miny = Number.MAX_VALUE, maxy = Number.MIN_VALUE; var curwidth = Number.MIN_VALUE, curheight = Number.MIN_VALUE; var len = selectedElements.length; if (!len) return; for (var i = 0; i < len; ++i) { if (selectedElements[i] == null) break; var elem = selectedElements[i]; bboxes[i] = getStrokedBBox([elem]); // now bbox is axis-aligned and handles rotation switch (relative_to) { case 'smallest': if ( (type == 'l' || type == 'c' || type == 'r') && (curwidth == Number.MIN_VALUE || curwidth > bboxes[i].width) || (type == 't' || type == 'm' || type == 'b') && (curheight == Number.MIN_VALUE || curheight > bboxes[i].height) ) { minx = bboxes[i].x; miny = bboxes[i].y; maxx = bboxes[i].x + bboxes[i].width; maxy = bboxes[i].y + bboxes[i].height; curwidth = bboxes[i].width; curheight = bboxes[i].height; } break; case 'largest': if ( (type == 'l' || type == 'c' || type == 'r') && (curwidth == Number.MIN_VALUE || curwidth < bboxes[i].width) || (type == 't' || type == 'm' || type == 'b') && (curheight == Number.MIN_VALUE || curheight < bboxes[i].height) ) { minx = bboxes[i].x; miny = bboxes[i].y; maxx = bboxes[i].x + bboxes[i].width; maxy = bboxes[i].y + bboxes[i].height; curwidth = bboxes[i].width; curheight = bboxes[i].height; } break; default: // 'selected' if (bboxes[i].x < minx) minx = bboxes[i].x; if (bboxes[i].y < miny) miny = bboxes[i].y; if (bboxes[i].x + bboxes[i].width > maxx) maxx = bboxes[i].x + bboxes[i].width; if (bboxes[i].y + bboxes[i].height > maxy) maxy = bboxes[i].y + bboxes[i].height; break; } } // loop for each element to find the bbox and adjust min/max if (relative_to == 'page') { minx = 0; miny = 0; maxx = canvas.contentW; maxy = canvas.contentH; } var dx = new Array(len); var dy = new Array(len); for (var i = 0; i < len; ++i) { if (selectedElements[i] == null) break; var elem = selectedElements[i]; var bbox = bboxes[i]; dx[i] = 0; dy[i] = 0; switch (type) { case 'l': // left (horizontal) dx[i] = minx - bbox.x; break; case 'c': // center (horizontal) dx[i] = (minx+maxx)/2 - (bbox.x + bbox.width/2); break; case 'r': // right (horizontal) dx[i] = maxx - (bbox.x + bbox.width); break; case 't': // top (vertical) dy[i] = miny - bbox.y; break; case 'm': // middle (vertical) dy[i] = (miny+maxy)/2 - (bbox.y + bbox.height/2); break; case 'b': // bottom (vertical) dy[i] = maxy - (bbox.y + bbox.height); break; } } this.moveSelectedElements(dx,dy); }; // Group: Additional editor tools this.contentW = getResolution().w; this.contentH = getResolution().h; // Function: updateCanvas // Updates the editor canvas width/height/position after a zoom has occurred // // Parameters: // w - Float with the new width // h - Float with the new height // // Returns: // Object with the following values: // * x - The canvas' new x coordinate // * y - The canvas' new y coordinate // * old_x - The canvas' old x coordinate // * old_y - The canvas' old y coordinate // * d_x - The x position difference // * d_y - The y position difference this.updateCanvas = function(w, h) { svgroot.setAttribute("width", w); svgroot.setAttribute("height", h); var bg = $('#canvasBackground')[0]; var old_x = svgcontent.getAttribute('x'); var old_y = svgcontent.getAttribute('y'); var x = (w/2 - this.contentW*current_zoom/2); var y = (h/2 - this.contentH*current_zoom/2); assignAttributes(svgcontent, { width: this.contentW*current_zoom, height: this.contentH*current_zoom, 'x': x, 'y': y, "viewBox" : "0 0 " + this.contentW + " " + this.contentH }); assignAttributes(bg, { width: svgcontent.getAttribute('width'), height: svgcontent.getAttribute('height'), x: x, y: y }); selectorManager.selectorParentGroup.setAttribute("transform","translate(" + x + "," + y + ")"); return {x:x, y:y, old_x:old_x, old_y:old_y, d_x:x - old_x, d_y:y - old_y}; } // Function: setBackground // Set the background of the editor (NOT the actual document) // // Parameters: // color - String with fill color to apply // url - URL or path to image to use this.setBackground = function(color, url) { var bg = getElem('canvasBackground'); var border = $(bg).find('rect')[0]; var bg_img = getElem('background_image'); border.setAttribute('fill',color); if(url) { if(!bg_img) { bg_img = svgdoc.createElementNS(svgns, "image"); assignAttributes(bg_img, { 'id': 'background_image', 'width': '100%', 'height': '100%', 'preserveAspectRatio': 'xMinYMin', 'style':'pointer-events:none' }); } setHref(bg_img, url); bg.appendChild(bg_img); } else if(bg_img) { bg_img.parentNode.removeChild(bg_img); } } // Function: cycleElement // Select the next/previous element within the current layer // // Parameters: // next - Boolean where true = next and false = previous element this.cycleElement = function(next) { var cur_elem = selectedElements[0]; var elem = false; var all_elems = getVisibleElements(current_layer); if (cur_elem == null) { var num = next?all_elems.length-1:0; elem = all_elems[num]; } else { var i = all_elems.length; while(i--) { if(all_elems[i] == cur_elem) { var num = next?i-1:i+1; if(num >= all_elems.length) { num = 0; } else if(num < 0) { num = all_elems.length-1; } elem = all_elems[num]; break; } } } selectOnly([elem], true); call("selected", selectedElements); } this.clear(); // DEPRECATED: getPrivateMethods // Since all methods are/should be public somehow, this function should be removed // Being able to access private methods publicly seems wrong somehow, // but currently appears to be the best way to allow testing and provide // access to them to plugins. this.getPrivateMethods = function() { var obj = { addCommandToHistory: addCommandToHistory, setGradient: setGradient, addSvgElementFromJson: addSvgElementFromJson, assignAttributes: assignAttributes, BatchCommand: BatchCommand, call: call, ChangeElementCommand: ChangeElementCommand, cleanupElement: cleanupElement, copyElem: copyElem, ffClone: ffClone, findDefs: findDefs, findDuplicateGradient: findDuplicateGradient, getElem: getElem, getId: getId, getIntersectionList: getIntersectionList, getMouseTarget: getMouseTarget, getNextId: getNextId, getPathBBox: getPathBBox, getUrlFromAttr: getUrlFromAttr, hasMatrixTransform: hasMatrixTransform, identifyLayers: identifyLayers, InsertElementCommand: InsertElementCommand, isIdentity: isIdentity, logMatrix: logMatrix, matrixMultiply: matrixMultiply, MoveElementCommand: MoveElementCommand, preventClickDefault: preventClickDefault, recalculateAllSelectedDimensions: recalculateAllSelectedDimensions, recalculateDimensions: recalculateDimensions, remapElement: remapElement, RemoveElementCommand: RemoveElementCommand, removeUnusedDefElems: removeUnusedDefElems, round: round, runExtensions: runExtensions, sanitizeSvg: sanitizeSvg, SelectorManager: SelectorManager, shortFloat: shortFloat, svgCanvasToString: svgCanvasToString, SVGEditTransformList: SVGEditTransformList, svgToString: svgToString, toString: toString, transformBox: transformBox, transformListToTransform: transformListToTransform, transformPoint: transformPoint, walkTree: walkTree } return obj; }; // Temporary fix until MS fixes: // https://connect.microsoft.com/IE/feedback/details/599257/ function disableAdvancedTextEdit() { var curtext; var textInput = $('#text').css({ position: 'static' }); $.each(['mouseDown','mouseUp','mouseMove', 'setCursor', 'init', 'select', 'toEditMode'], function() { textActions[this] = $.noop; }); textActions.init = function(elem) { curtext = elem; $(curtext).unbind('dblclick').bind('dblclick', function() { textInput.focus(); }); } canvas.textActions = textActions; } // Test support for features/bugs (function() { // segList functions (for FF1.5 and 2.0) var path = document.createElementNS(svgns,'path'); path.setAttribute('d','M0,0 10,10'); var seglist = path.pathSegList; var seg = path.createSVGPathSegLinetoAbs(5,5); try { seglist.replaceItem(seg, 0); support.pathReplaceItem = true; } catch(err) { support.pathReplaceItem = false; } try { seglist.insertItemBefore(seg, 0); support.pathInsertItemBefore = true; } catch(err) { support.pathInsertItemBefore = false; } var text = document.createElementNS(svgns,'text'); text.textContent = 'a'; svgcontent.appendChild(text); // text character positioning try { text.getStartPositionOfChar(0); support.textCharPos = true; } catch(err) { support.textCharPos = false; disableAdvancedTextEdit(); } svgcontent.removeChild(text); // TODO: Find better way to check support for this support.editableText = isOpera; // Correct decimals on clone attributes (Opera < 10.5/win/non-en) var rect = document.createElementNS(svgns,'rect'); rect.setAttribute('x',.1); var crect = rect.cloneNode(false); support.goodDecimals = (crect.getAttribute('x').indexOf(',') == -1); if(!support.goodDecimals) { $.alert("NOTE: This version of Opera is known to contain bugs in SVG-edit.\n\ Please upgrade to the <a href='http://opera.com'>latest version</a> in which the problems have been fixed."); } // Get correct em/ex values var rect = document.createElementNS(svgns,'rect'); rect.setAttribute('width',"1em"); rect.setAttribute('height',"1ex"); svgcontent.appendChild(rect); var bb = rect.getBBox(); unit_types.em = bb.width; unit_types.ex = bb.height; svgcontent.removeChild(rect); }()); } ================================================ FILE: extensions/svg-edit/content/editor/svgicons/jquery.svgicons.js ================================================ /* * SVG Icon Loader 2.0 * * jQuery Plugin for loading SVG icons from a single file * * Copyright (c) 2009 Alexis Deveria * http://a.deveria.com * * Apache 2 License How to use: 1. Create the SVG master file that includes all icons: The master SVG icon-containing file is an SVG file that contains <g> elements. Each <g> element should contain the markup of an SVG icon. The <g> element has an ID that should correspond with the ID of the HTML element used on the page that should contain or optionally be replaced by the icon. Additionally, one empty element should be added at the end with id "svg_eof". 2. Optionally create fallback raster images for each SVG icon. 3. Include the jQuery and the SVG Icon Loader scripts on your page. 4. Run $.svgIcons() when the document is ready: $.svgIcons( file [string], options [object literal]); File is the location of a local SVG or SVGz file. All options are optional and can include: - 'w (number)': The icon widths - 'h (number)': The icon heights - 'fallback (object literal)': List of raster images with each key being the SVG icon ID to replace, and the value the image file name. - 'fallback_path (string)': The path to use for all images listed under "fallback" - 'replace (boolean)': If set to true, HTML elements will be replaced by, rather than include the SVG icon. - 'placement (object literal)': List with selectors for keys and SVG icon ids as values. This provides a custom method of adding icons. - 'resize (object literal)': List with selectors for keys and numbers as values. This allows an easy way to resize specific icons. - 'callback (function)': A function to call when all icons have been loaded. Includes an object literal as its argument with as keys all icon IDs and the icon as a jQuery object as its value. - 'id_match (boolean)': Automatically attempt to match SVG icon ids with corresponding HTML id (default: true) - 'no_img (boolean)': Prevent attempting to convert the icon into an <img> element (may be faster, help for browser consistency) - 'svgz (boolean)': Indicate that the file is an SVGZ file, and thus not to parse as XML. SVGZ files add compression benefits, but getting data from them fails in Firefox 2 and older. 5. To access an icon at a later point without using the callback, use this: $.getSvgIcon(id (string)); This will return the icon (as jQuery object) with a given ID. 6. To resize icons at a later point without using the callback, use this: $.resizeSvgIcons(resizeOptions) (use the same way as the "resize" parameter) Example usage #1: $(function() { $.svgIcons('my_icon_set.svg'); // The SVG file that contains all icons // No options have been set, so all icons will automatically be inserted // into HTML elements that match the same IDs. }); Example usage #2: $(function() { $.svgIcons('my_icon_set.svg', { // The SVG file that contains all icons callback: function(icons) { // Custom callback function that sets click // events for each icon $.each(icons, function(id, icon) { icon.click(function() { alert('You clicked on the icon with id ' + id); }); }); } }); //The SVG file that contains all icons }); Example usage #3: $(function() { $.svgIcons('my_icon_set.svgz', { // The SVGZ file that contains all icons w: 32, // All icons will be 32px wide h: 32, // All icons will be 32px high fallback_path: 'icons/', // All fallback files can be found here fallback: { '#open_icon': 'open.png', // The "open.png" will be appended to the // HTML element with ID "open_icon" '#close_icon': 'close.png', '#save_icon': 'save.png' }, placement: {'.open_icon','open'}, // The "open" icon will be added // to all elements with class "open_icon" resize: function() { '#save_icon .svg_icon': 64 // The "save" icon will be resized to 64 x 64px }, callback: function(icons) { // Sets background color for "close" icon icons['close'].css('background','red'); }, svgz: true // Indicates that an SVGZ file is being used }) }); */ (function($) { var svg_icons = {}, fixIDs; $.svgIcons = function(file, opts) { var svgns = "http://www.w3.org/2000/svg", xlinkns = "http://www.w3.org/1999/xlink", icon_w = opts.w?opts.w : 24, icon_h = opts.h?opts.h : 24, elems, svgdoc, testImg, icons_made = false, data_loaded = false, load_attempts = 0, ua = navigator.userAgent, isOpera = !!window.opera, isSafari = (ua.indexOf('Safari/') > -1 && ua.indexOf('Chrome/')==-1), data_pre = 'data:image/svg+xml;charset=utf-8;base64,'; if(opts.svgz) { var data_el = $('<object data="' + file + '" type=image/svg+xml>').appendTo('body').hide(); try { svgdoc = data_el[0].contentDocument; data_el.load(getIcons); getIcons(0, true); // Opera will not run "load" event if file is already cached } catch(err1) { useFallback(); } } else { var parser = new DOMParser(); $.ajax({ url: file, dataType: 'string', success: function(data) { if(!data) { $(useFallback); return; } svgdoc = parser.parseFromString(data, "text/xml"); $(function() { getIcons('ajax'); }); }, error: function(err) { // TODO: Fix Opera widget icon bug if(window.opera) { $(function() { useFallback(); }); } else { if(err.responseXML) { svgdoc = parser.parseFromString(err.responseXML, "text/xml"); if(!svgdoc.childNodes.length) { $(useFallback); } $(function() { getIcons('ajax'); }); } else { $(useFallback); } } } }); } function getIcons(evt, no_wait) { if(evt !== 'ajax') { if(data_loaded) return; // Webkit sometimes says svgdoc is undefined, other times // it fails to load all nodes. Thus we must make sure the "eof" // element is loaded. svgdoc = data_el[0].contentDocument; // Needed again for Webkit var isReady = (svgdoc && svgdoc.getElementById('svg_eof')); if(!isReady && !(no_wait && isReady)) { load_attempts++; if(load_attempts < 50) { setTimeout(getIcons, 20); } else { useFallback(); data_loaded = true; } return; } data_loaded = true; } elems = $(svgdoc.firstChild).children(); //.getElementsByTagName('foreignContent'); if(!opts.no_img) { var testSrc = data_pre + 'PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNzUiIGhlaWdodD0iMjc1Ij48L3N2Zz4%3D'; testImg = $(new Image()).attr({ src: testSrc, width: 0, height: 0 }).appendTo('body') .load(function () { // Safari 4 crashes, Opera and Chrome don't makeIcons(!isSafari); }).error(function () { makeIcons(); }); } else { setTimeout(function() { if(!icons_made) makeIcons(); },500); } } var setIcon = function(target, icon, id, setID) { if(isOpera) icon.css('visibility','hidden'); if(opts.replace) { if(setID) icon.attr('id',id); var cl = target.attr('class'); if(cl) icon.attr('class','svg_icon '+cl); target.replaceWith(icon); } else { target.append(icon); } if(isOpera) { setTimeout(function() { icon.removeAttr('style'); },1); } } var addIcon = function(icon, id) { if(opts.id_match === undefined || opts.id_match !== false) { setIcon(holder, icon, id, true); } svg_icons[id] = icon; } function makeIcons(toImage, fallback) { if(icons_made) return; if(opts.no_img) toImage = false; var holder; if(toImage) { var temp_holder = $(document.createElement('div')); temp_holder.hide().appendTo('body'); } if(fallback) { var path = opts.fallback_path?opts.fallback_path:''; $.each(fallback, function(id, imgsrc) { holder = $('#' + id); var icon = $(new Image()) .attr({ 'class':'svg_icon', src: path + imgsrc, 'width': icon_w, 'height': icon_h, 'alt': 'icon' }); addIcon(icon, id); }); } else { var len = elems.length; for(var i = 0; i < len; i++) { var elem = elems[i]; var id = elem.id; if(id === 'svg_eof') break; holder = $('#' + id); var svg = elem.getElementsByTagNameNS(svgns, 'svg')[0]; var svgroot = document.createElementNS(svgns, "svg"); svgroot.setAttributeNS(svgns, 'viewBox', [0,0,icon_w,icon_h].join(' ')); // Make flexible by converting width/height to viewBox var w = svg.getAttribute('width'); var h = svg.getAttribute('height'); svg.removeAttribute('width'); svg.removeAttribute('height'); var vb = svg.getAttribute('viewBox'); if(!vb) { svg.setAttribute('viewBox', [0,0,w,h].join(' ')); } // Not using jQuery to be a bit faster svgroot.setAttribute('xmlns', svgns); svgroot.setAttribute('width', icon_w); svgroot.setAttribute('height', icon_h); svgroot.setAttribute("xmlns:xlink", xlinkns); svgroot.setAttribute("class", 'svg_icon'); // Without cloning, Firefox will make another GET request. // With cloning, causes issue in Opera/Win/Non-EN if(!isOpera) svg = svg.cloneNode(true); svgroot.appendChild(svg); if(toImage) { // Without cloning, Safari will crash // With cloning, causes issue in Opera/Win/Non-EN var svgcontent = isOpera?svgroot:svgroot.cloneNode(true); temp_holder.empty().append(svgroot); var str = data_pre + encode64(temp_holder.html()); var icon = $(new Image()) .attr({'class':'svg_icon', src:str}); } else { var icon = fixIDs($(svgroot), i); } addIcon(icon, id); } } if(opts.placement) { $.each(opts.placement, function(sel, id) { if(!svg_icons[id]) return; $(sel).each(function(i) { var copy = svg_icons[id].clone(); if(i > 0 && !toImage) copy = fixIDs(copy, i, true); setIcon($(this), copy, id); }) }); } if(!fallback) { if(toImage) temp_holder.remove(); if(data_el) data_el.remove(); if(testImg) testImg.remove(); } if(opts.resize) $.resizeSvgIcons(opts.resize); icons_made = true; if(opts.callback) opts.callback(svg_icons); } fixIDs = function(svg_el, svg_num, force) { var defs = svg_el.find('defs'); if(!defs.length) return svg_el; defs.find('[id]').each(function(i) { var id = this.id; var no_dupes = ($(svgdoc).find('#' + id).length <= 1); if(isOpera) no_dupes = false; // Opera didn't clone svg_el, so not reliable // if(!force && no_dupes) return; var new_id = 'x' + id + svg_num + i; this.id = new_id; svg_el.find('[fill="url(#' + id + ')"]').each(function() { this.setAttribute('fill', 'url(#' + new_id + ')'); }).end().find('[stroke="url(#' + id + ')"]').each(function() { this.setAttribute('stroke', 'url(#' + new_id + ')'); }).end().find('use').each(function() { if(this.getAttribute('xlink:href') == '#' + id) { this.setAttributeNS(xlinkns,'href','#' + new_id); } }).end().find('[filter="url(#' + id + ')"]').each(function() { this.setAttribute('filter', 'url(#' + new_id + ')'); }); }); return svg_el; } function useFallback() { if(file.indexOf('.svgz') != -1) { var reg_file = file.replace('.svgz','.svg'); if(window.console) { console.log('.svgz failed, trying with .svg'); } $.svgIcons(reg_file, opts); } else if(opts.fallback) { makeIcons(false, opts.fallback); } } function encode64(input) { // base64 strings are 4/3 larger than the original string if(window.btoa) return window.btoa(input); var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; var output = new Array( Math.floor( (input.length + 2) / 3 ) * 4 ); var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0, p = 0; do { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; } output[p++] = _keyStr.charAt(enc1); output[p++] = _keyStr.charAt(enc2); output[p++] = _keyStr.charAt(enc3); output[p++] = _keyStr.charAt(enc4); } while (i < input.length); return output.join(''); } } $.getSvgIcon = function(id, uniqueClone) { var icon = svg_icons[id]; if(uniqueClone && icon) { icon = fixIDs(icon, 0, true).clone(true); } return icon; } $.resizeSvgIcons = function(obj) { // FF2 and older don't detect .svg_icon, so we change it detect svg elems instead var change_sel = !$('.svg_icon:first').length; $.each(obj, function(sel, size) { var arr = $.isArray(size); var w = arr?size[0]:size, h = arr?size[1]:size; if(change_sel) { sel = sel.replace(/\.svg_icon/g,'svg'); } $(sel).each(function() { this.setAttribute('width', w); this.setAttribute('height', h); if(window.opera && window.widget) { this.parentNode.style.width = w + 'px'; this.parentNode.style.height = h + 'px'; } }); }); } })(jQuery); ================================================ FILE: extensions/svg-edit/content/svg-edit-overlay.css ================================================ #svg-edit-statusbar-button { list-style-image: url("chrome://svg-edit/content/editor/images/logo.png"); display: -moz-box; /*-moz-image-region: rect(16px, 16px, 32px, 0px);*/ padding-left: 0px; padding-right: 0px; width: 16px; height: 16px; } #svg-edit-statusbar-button[state="active"] { list-style-image: url("chrome://svg-edit/content/editor/images/logo.png"); -moz-image-region: rect(32px, 16px, 48px, 0px); } #svg-edit-statusbar-button[state="error"] { list-style-image: url("chrome://svg-edit/content/editor/images/logo.png"); -moz-image-region: rect(0px, 16px, 16px, 0px); } ================================================ FILE: extensions/svg-edit/content/svg-edit-overlay.js ================================================ Components.utils.import("resource://gre/modules/editorHelper.jsm"); var SVGWindow; function start_svg_edit(aString) { function svgEditorReady(event) { var svgWindow = SVGWindow.document.getElementById("mainIframe") .contentWindow; var svgEditor = svgWindow.svgEditor; svgEditor.externalSaveHandler = InsertSVGAtSelection; if (aString) svgEditor.loadFromString(aString) else svgEditor.resetTransactionManager(); svgWindow.document.documentElement .removeEventListener("svgEditorReady", svgEditorReady, false); } window.document.documentElement .addEventListener("svgEditorReady", svgEditorReady, false); var url = "chrome://svg-edit/content/svg-edit.xul"; SVGWindow = window.openDialog(url, "_blank", "menubar=yes,toolbar=no,resizable=yes,sizemode=normal,dialog=no"); } function InsertSVGAtSelection(aString) { var editor = EditorUtils.getCurrentEditor(); var isHTML = !EditorUtils.isXHTMLDocument(); if (isHTML) editor.beginTransaction(); var svgDocument = (new DOMParser()).parseFromString(aString, "application/xml") var doc = EditorUtils.getCurrentDocument(); var node = doc.importNode(svgDocument.documentElement, true); editor.insertElementAtSelection(node, true); if (isHTML) { var l = doc.querySelector("link[rel='force-svg']"); if (!l) { var head = doc.querySelector("head"); l = doc.createElement("link"); l.setAttribute("rel", "force-svg"); l.setAttribute("href", "http://berjon.com/blog/2009/07/force-svg.html"); editor.insertNode(l, head, head.childNodes.length); var s = doc.createElement("script"); s.setAttribute("type", "application/javascript"); var text = doc.createTextNode("(" + _ForceSVGInHTML.toString() + ")();"); s.appendChild(text); editor.insertNode(s, head, head.childNodes.length); } } if (isHTML) editor.endTransaction(); } var _ForceSVGInHTML= function() { function ForceSVGInHTML() { window.removeEventListener("load", ForceSVGInHTML, true); var svgs = document.getElementsByTagName("svg"); for (var i = 0; i < svgs.length; i++) { var svg = svgs[i]; var div = document.createElement("div"); div.appendChild(svg.cloneNode(true)); var dom = (new DOMParser()).parseFromString(div.innerHTML, "application/xml"); svg.parentNode.replaceChild(document.importNode(dom.documentElement, true), svg); } } window.addEventListener("load", ForceSVGInHTML, true); } var Base64 = { // private property _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", // public method for encoding encode : function (input) { var output = ""; var chr1, chr2, chr3, enc1, enc2, enc3, enc4; var i = 0; input = Base64._utf8_encode(input); while (i < input.length) { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; } output = output + this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4); } return output; }, // public method for decoding decode : function (input) { var output = ""; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); while (i < input.length) { enc1 = this._keyStr.indexOf(input.charAt(i++)); enc2 = this._keyStr.indexOf(input.charAt(i++)); enc3 = this._keyStr.indexOf(input.charAt(i++)); enc4 = this._keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); } } output = Base64._utf8_decode(output); return output; }, // private method for UTF-8 encoding _utf8_encode : function (string) { string = string.replace(/\r\n/g,"\n"); var utftext = ""; for (var n = 0; n < string.length; n++) { var c = string.charCodeAt(n); if (c < 128) { utftext += String.fromCharCode(c); } else if((c > 127) && (c < 2048)) { utftext += String.fromCharCode((c >> 6) | 192); utftext += String.fromCharCode((c & 63) | 128); } else { utftext += String.fromCharCode((c >> 12) | 224); utftext += String.fromCharCode(((c >> 6) & 63) | 128); utftext += String.fromCharCode((c & 63) | 128); } } return utftext; }, // private method for UTF-8 decoding _utf8_decode : function (utftext) { var string = ""; var i = 0; var c = c1 = c2 = 0; while ( i < utftext.length ) { c = utftext.charCodeAt(i); if (c < 128) { string += String.fromCharCode(c); i++; } else if((c > 191) && (c < 224)) { c2 = utftext.charCodeAt(i+1); string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); i += 2; } else { c2 = utftext.charCodeAt(i+1); c3 = utftext.charCodeAt(i+2); string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); i += 3; } } return string; } } ================================================ FILE: extensions/svg-edit/content/svg-edit-overlay.xul ================================================ <?xml version="1.0"?> <overlay id="SVGEditToolsOverlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <script type="application/x-javascript" src="chrome://svg-edit/content/svg-edit-overlay.js" /> <menupopup id="insertMenuPopup"> <menuseparator/> <menuitem id="svgEditMenuitem" label="SVG" observes="cmd_renderedHTMLEnabler" oncommand="start_svg_edit(null);"/> </menupopup> </overlay> ================================================ FILE: extensions/svg-edit/content/svg-edit.js ================================================ Components.utils.import("resource://gre/modules/Services.jsm"); function Startup() { GetUIElements(); } function CloseWindowRequest(event) { var svgWindow = document.getElementById("mainIframe") .contentWindow; var undoMgr = svgWindow.undoMgr; if (undoMgr.getUndoStackSize() && !Services.prompt.confirm(window, gDialog.bundleString.getString("SvgEdit"), gDialog.bundleString.getString("ConfirmClose"))) { return false; } return true; } ================================================ FILE: extensions/svg-edit/content/svg-edit.xul ================================================ <?xml version="1.0"?> <?xml-stylesheet href="chrome://global/skin/" type="text/css"?> <window title="SVG Edit;" id="svgEditXulWindow" windowtype="BlueGriffon:SvgEditXulWindow:Gfd" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" persist="screenX screenY width height" onload="Startup()" onclose="return CloseWindowRequest(event)" width="1024" height="700" screenX="24" screenY="24"> <script type="application/x-javascript" src="chrome://bluegriffon/content/utils/dgid.js"/> <script type="application/x-javascript" src="chrome://svg-edit/content/svg-edit.js" /> <stringbundle id="bundleString" src="chrome://bluegriffon/locale/svg-edit.properties"/> <iframe id="mainIframe" type="chrome" src="chrome://svg-edit/content/editor/svg-editor.html" flex="1"/> </window> ================================================ FILE: extensions/svg-edit/handlers.js ================================================ // Note: This JavaScript file must be included as the last script on the main HTML editor page to override the open/save handlers $(function() { if(!window.Components) return; function moz_file_picker(readflag) { var fp = window.Components.classes["@mozilla.org/filepicker;1"]. createInstance(Components.interfaces.nsIFilePicker); if(readflag) fp.init(window, "Pick a SVG file", fp.modeOpen); else fp.init(window, "Pick a SVG file", fp.modeSave); fp.defaultExtension = "*.svg"; fp.show(); return fp.file; } svgCanvas.setCustomHandlers({ 'open':function() { try { netscape.security.PrivilegeManager. enablePrivilege("UniversalXPConnect"); var file = moz_file_picker(true); if(!file) return(null); var inputStream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream); inputStream.init(file, 0x01, parseInt("00004", 8), null); var sInputStream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream); sInputStream.init(inputStream); svgCanvas.setSvgString(sInputStream. read(sInputStream.available())); } catch(e) { console.log("Exception while attempting to load" + e); } }, 'save':function(svg, str) { try { var file = moz_file_picker(false); if(!file) return; if (!file.exists()) file.create(0, parseInt("0664", 8)); var out = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream); out.init(file, 0x20 | 0x02, parseInt("00004", 8),null); out.write(str, str.length); out.flush(); out.close(); } catch(e) { alert(e); } } }); }); ================================================ FILE: extensions/svg-edit/install.rdf ================================================ <?xml version="1.0"?> <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#"> <Description about="urn:mozilla:extension:file:chrome" em:package="content" /> <Description about="urn:mozilla:install-manifest"> <!-- required properties --> <em:name>SVG-edit</em:name> <em:id>svg-edit@googlegroups.com</em:id> <em:homepageURL>http://svg-edit.googlecode.com/</em:homepageURL> <em:description>A complete vector graphic editor for BlueGriffon</em:description> <em:iconURL>chrome://svg-edit/skin/logo32.png</em:iconURL> <em:version>3.0.4</em:version> <em:type>2</em:type> <em:targetApplication><!-- BlueGriffon --> <Description> <em:id>bluegriffon@bluegriffon.com</em:id> <em:minVersion>3.2</em:minVersion> <em:maxVersion>*</em:maxVersion> </Description> </em:targetApplication> </Description> </RDF> ================================================ FILE: extensions/svg-edit/jar.mn ================================================ svg-edit.jar: % content svg-edit %content/ % overlay chrome://bluegriffon/content/xul/bluegriffon.xul chrome://svg-edit/content/svg-edit-overlay.xul content/editor/canvg/canvg.js (content/editor/canvg/canvg.js) content/editor/canvg/rgbcolor.js (content/editor/canvg/rgbcolor.js) content/editor/contextmenu/jquery.contextMenu.js (content/editor/contextmenu/jquery.contextMenu.js) content/editor/contextmenu/jquery.contextMenu.min.js (content/editor/contextmenu/jquery.contextMenu.min.js) content/editor/embedapi.html (content/editor/embedapi.html) content/editor/embedapi.js (content/editor/embedapi.js) content/editor/extensions/closepath_icons.svg (content/editor/extensions/closepath_icons.svg) content/editor/extensions/ext-arrows.js (content/editor/extensions/ext-arrows.js) content/editor/extensions/ext-closepath.js (content/editor/extensions/ext-closepath.js) content/editor/extensions/ext-connector.js (content/editor/extensions/ext-connector.js) content/editor/extensions/ext-eyedropper.js (content/editor/extensions/ext-eyedropper.js) content/editor/extensions/ext-foreignobject.js (content/editor/extensions/ext-foreignobject.js) content/editor/extensions/ext-grid.js (content/editor/extensions/ext-grid.js) content/editor/extensions/ext-helloworld.js (content/editor/extensions/ext-helloworld.js) content/editor/extensions/ext-imagelib.js (content/editor/extensions/ext-imagelib.js) content/editor/extensions/ext-imagelib.xml (content/editor/extensions/ext-imagelib.xml) content/editor/extensions/ext-markers.js (content/editor/extensions/ext-markers.js) content/editor/extensions/ext-server_opensave.js (content/editor/extensions/ext-server_opensave.js) content/editor/extensions/ext-shapes.js (content/editor/extensions/ext-shapes.js) content/editor/extensions/ext-shapes.xml (content/editor/extensions/ext-shapes.xml) content/editor/extensions/eyedropper-icon.xml (content/editor/extensions/eyedropper-icon.xml) content/editor/extensions/eyedropper.png (content/editor/extensions/eyedropper.png) content/editor/extensions/fileopen.php (content/editor/extensions/fileopen.php) content/editor/extensions/filesave.php (content/editor/extensions/filesave.php) content/editor/extensions/foreignobject-icons.xml (content/editor/extensions/foreignobject-icons.xml) content/editor/extensions/grid-icon.xml (content/editor/extensions/grid-icon.xml) content/editor/extensions/helloworld-icon.xml (content/editor/extensions/helloworld-icon.xml) content/editor/extensions/imagelib/index.html (content/editor/extensions/imagelib/index.html) content/editor/extensions/imagelib/smiley.svg (content/editor/extensions/imagelib/smiley.svg) content/editor/extensions/markers-icons.xml (content/editor/extensions/markers-icons.xml) content/editor/extensions/shapelib/animal.json (content/editor/extensions/shapelib/animal.json) content/editor/extensions/shapelib/arrow.json (content/editor/extensions/shapelib/arrow.json) content/editor/extensions/shapelib/dialog_balloon.json (content/editor/extensions/shapelib/dialog_balloon.json) content/editor/extensions/shapelib/electronics.json (content/editor/extensions/shapelib/electronics.json) content/editor/extensions/shapelib/flowchart.json (content/editor/extensions/shapelib/flowchart.json) content/editor/extensions/shapelib/game.json (content/editor/extensions/shapelib/game.json) content/editor/extensions/shapelib/math.json (content/editor/extensions/shapelib/math.json) content/editor/extensions/shapelib/misc.json (content/editor/extensions/shapelib/misc.json) content/editor/extensions/shapelib/music.json (content/editor/extensions/shapelib/music.json) content/editor/extensions/shapelib/object.json (content/editor/extensions/shapelib/object.json) content/editor/extensions/shapelib/symbol.json (content/editor/extensions/shapelib/symbol.json) content/editor/images/align-bottom.png (content/editor/images/align-bottom.png) content/editor/images/align-bottom.svg (content/editor/images/align-bottom.svg) content/editor/images/align-center.png (content/editor/images/align-center.png) content/editor/images/align-center.svg (content/editor/images/align-center.svg) content/editor/images/align-left.png (content/editor/images/align-left.png) content/editor/images/align-left.svg (content/editor/images/align-left.svg) content/editor/images/align-middle.png (content/editor/images/align-middle.png) content/editor/images/align-middle.svg (content/editor/images/align-middle.svg) content/editor/images/align-right.png (content/editor/images/align-right.png) content/editor/images/align-right.svg (content/editor/images/align-right.svg) content/editor/images/align-top.png (content/editor/images/align-top.png) content/editor/images/align-top.svg (content/editor/images/align-top.svg) content/editor/images/bold.png (content/editor/images/bold.png) content/editor/images/cancel.png (content/editor/images/cancel.png) content/editor/images/circle.png (content/editor/images/circle.png) content/editor/images/clear.png (content/editor/images/clear.png) content/editor/images/clone.png (content/editor/images/clone.png) content/editor/images/conn.svg (content/editor/images/conn.svg) content/editor/images/copy.png (content/editor/images/copy.png) content/editor/images/cut.png (content/editor/images/cut.png) content/editor/images/delete.png (content/editor/images/delete.png) content/editor/images/document-properties.png (content/editor/images/document-properties.png) content/editor/images/dropdown.gif (content/editor/images/dropdown.gif) content/editor/images/ellipse.png (content/editor/images/ellipse.png) content/editor/images/eye.png (content/editor/images/eye.png) content/editor/images/fhpath.png (content/editor/images/fhpath.png) content/editor/images/flyouth.png (content/editor/images/flyouth.png) content/editor/images/flyup.gif (content/editor/images/flyup.gif) content/editor/images/freehand-circle.png (content/editor/images/freehand-circle.png) content/editor/images/freehand-square.png (content/editor/images/freehand-square.png) content/editor/images/go-down.png (content/editor/images/go-down.png) content/editor/images/go-up.png (content/editor/images/go-up.png) content/editor/images/image.png (content/editor/images/image.png) content/editor/images/italic.png (content/editor/images/italic.png) content/editor/images/line.png (content/editor/images/line.png) content/editor/images/link_controls.png (content/editor/images/link_controls.png) content/editor/images/logo.png (content/editor/images/logo.png) content/editor/images/logo.svg (content/editor/images/logo.svg) content/editor/images/move_bottom.png (content/editor/images/move_bottom.png) content/editor/images/move_top.png (content/editor/images/move_top.png) content/editor/images/node_clone.png (content/editor/images/node_clone.png) content/editor/images/node_delete.png (content/editor/images/node_delete.png) content/editor/images/none.png (content/editor/images/none.png) content/editor/images/open.png (content/editor/images/open.png) content/editor/images/paste.png (content/editor/images/paste.png) content/editor/images/path.png (content/editor/images/path.png) content/editor/images/polygon.png (content/editor/images/polygon.png) content/editor/images/polygon.svg (content/editor/images/polygon.svg) content/editor/images/README.txt (content/editor/images/README.txt) content/editor/images/rect.png (content/editor/images/rect.png) content/editor/images/redo.png (content/editor/images/redo.png) content/editor/images/reorient.png (content/editor/images/reorient.png) content/editor/images/rotate.png (content/editor/images/rotate.png) content/editor/images/save.png (content/editor/images/save.png) content/editor/images/select.png (content/editor/images/select.png) content/editor/images/select_node.png (content/editor/images/select_node.png) content/editor/images/sep.png (content/editor/images/sep.png) content/editor/images/shape_group.png (content/editor/images/shape_group.png) content/editor/images/shape_ungroup.png (content/editor/images/shape_ungroup.png) content/editor/images/source.png (content/editor/images/source.png) content/editor/images/spinbtn_updn_big.png (content/editor/images/spinbtn_updn_big.png) content/editor/images/square.png (content/editor/images/square.png) content/editor/images/svg_edit_icons.svg (content/editor/images/svg_edit_icons.svg) content/editor/images/svg_edit_icons.svgz (content/editor/images/svg_edit_icons.svgz) content/editor/images/text.png (content/editor/images/text.png) content/editor/images/text.svg (content/editor/images/text.svg) content/editor/images/to_path.png (content/editor/images/to_path.png) content/editor/images/undo.png (content/editor/images/undo.png) content/editor/images/view-refresh.png (content/editor/images/view-refresh.png) content/editor/images/wave.png (content/editor/images/wave.png) content/editor/images/wireframe.png (content/editor/images/wireframe.png) content/editor/images/zoom.png (content/editor/images/zoom.png) content/editor/jgraduate/css/jGraduate-0.2.0.css (content/editor/jgraduate/css/jGraduate-0.2.0.css) content/editor/jgraduate/css/jgraduate.css (content/editor/jgraduate/css/jgraduate.css) content/editor/jgraduate/css/jPicker-1.0.12.css (content/editor/jgraduate/css/jPicker-1.0.12.css) content/editor/jgraduate/css/jPicker-1.0.9.css (content/editor/jgraduate/css/jPicker-1.0.9.css) content/editor/jgraduate/images/AlphaBar.png (content/editor/jgraduate/images/AlphaBar.png) content/editor/jgraduate/images/bar-opacity.png (content/editor/jgraduate/images/bar-opacity.png) content/editor/jgraduate/images/Bars.png (content/editor/jgraduate/images/Bars.png) content/editor/jgraduate/images/map-opacity.png (content/editor/jgraduate/images/map-opacity.png) content/editor/jgraduate/images/mappoint.gif (content/editor/jgraduate/images/mappoint.gif) content/editor/jgraduate/images/mappoint_c.png (content/editor/jgraduate/images/mappoint_c.png) content/editor/jgraduate/images/mappoint_f.png (content/editor/jgraduate/images/mappoint_f.png) content/editor/jgraduate/images/Maps.png (content/editor/jgraduate/images/Maps.png) content/editor/jgraduate/images/NoColor.png (content/editor/jgraduate/images/NoColor.png) content/editor/jgraduate/images/picker.gif (content/editor/jgraduate/images/picker.gif) content/editor/jgraduate/images/preview-opacity.png (content/editor/jgraduate/images/preview-opacity.png) content/editor/jgraduate/images/rangearrows.gif (content/editor/jgraduate/images/rangearrows.gif) content/editor/jgraduate/images/rangearrows2.gif (content/editor/jgraduate/images/rangearrows2.gif) content/editor/jgraduate/jpicker-1.0.12.min.js (content/editor/jgraduate/jpicker-1.0.12.min.js) content/editor/jgraduate/jpicker-1.0.9.min.js (content/editor/jgraduate/jpicker-1.0.9.min.js) content/editor/jgraduate/jquery.jgraduate.js (content/editor/jgraduate/jquery.jgraduate.js) content/editor/jgraduate/jquery.jgraduate.min.js (content/editor/jgraduate/jquery.jgraduate.min.js) content/editor/jgraduate/LICENSE (content/editor/jgraduate/LICENSE) content/editor/jgraduate/README (content/editor/jgraduate/README) content/editor/jquery-ui/jquery-ui-1.7.2.custom.min.js (content/editor/jquery-ui/jquery-ui-1.7.2.custom.min.js) content/editor/jquery-ui/jquery-ui-1.8.custom.min.js (content/editor/jquery-ui/jquery-ui-1.8.custom.min.js) content/editor/jquery.js (content/editor/jquery.js) content/editor/jquerybbq/jquery.bbq.min.js (content/editor/jquerybbq/jquery.bbq.min.js) content/editor/js-hotkeys/jquery.hotkeys.min.js (content/editor/js-hotkeys/jquery.hotkeys.min.js) content/editor/js-hotkeys/README.md (content/editor/js-hotkeys/README.md) content/editor/locale/lang.af.js (content/editor/locale/lang.af.js) content/editor/locale/lang.ar.js (content/editor/locale/lang.ar.js) content/editor/locale/lang.az.js (content/editor/locale/lang.az.js) content/editor/locale/lang.be.js (content/editor/locale/lang.be.js) content/editor/locale/lang.bg.js (content/editor/locale/lang.bg.js) content/editor/locale/lang.ca.js (content/editor/locale/lang.ca.js) content/editor/locale/lang.cs.js (content/editor/locale/lang.cs.js) content/editor/locale/lang.cy.js (content/editor/locale/lang.cy.js) content/editor/locale/lang.da.js (content/editor/locale/lang.da.js) content/editor/locale/lang.de.js (content/editor/locale/lang.de.js) content/editor/locale/lang.el.js (content/editor/locale/lang.el.js) content/editor/locale/lang.en.js (content/editor/locale/lang.en.js) content/editor/locale/lang.es.js (content/editor/locale/lang.es.js) content/editor/locale/lang.et.js (content/editor/locale/lang.et.js) content/editor/locale/lang.fa.js (content/editor/locale/lang.fa.js) content/editor/locale/lang.fi.js (content/editor/locale/lang.fi.js) content/editor/locale/lang.fr.js (content/editor/locale/lang.fr.js) content/editor/locale/lang.fy.js (content/editor/locale/lang.fy.js) content/editor/locale/lang.ga.js (content/editor/locale/lang.ga.js) content/editor/locale/lang.gl.js (content/editor/locale/lang.gl.js) content/editor/locale/lang.he.js (content/editor/locale/lang.he.js) content/editor/locale/lang.hi.js (content/editor/locale/lang.hi.js) content/editor/locale/lang.hr.js (content/editor/locale/lang.hr.js) content/editor/locale/lang.hu.js (content/editor/locale/lang.hu.js) content/editor/locale/lang.hy.js (content/editor/locale/lang.hy.js) content/editor/locale/lang.id.js (content/editor/locale/lang.id.js) content/editor/locale/lang.is.js (content/editor/locale/lang.is.js) content/editor/locale/lang.it.js (content/editor/locale/lang.it.js) content/editor/locale/lang.ja.js (content/editor/locale/lang.ja.js) content/editor/locale/lang.ko.js (content/editor/locale/lang.ko.js) content/editor/locale/lang.lt.js (content/editor/locale/lang.lt.js) content/editor/locale/lang.lv.js (content/editor/locale/lang.lv.js) content/editor/locale/lang.mk.js (content/editor/locale/lang.mk.js) content/editor/locale/lang.ms.js (content/editor/locale/lang.ms.js) content/editor/locale/lang.mt.js (content/editor/locale/lang.mt.js) content/editor/locale/lang.nl.js (content/editor/locale/lang.nl.js) content/editor/locale/lang.no.js (content/editor/locale/lang.no.js) content/editor/locale/lang.pl.js (content/editor/locale/lang.pl.js) content/editor/locale/lang.pt-BR.js (content/editor/locale/lang.pt-BR.js) content/editor/locale/lang.pt-PT.js (content/editor/locale/lang.pt-PT.js) content/editor/locale/lang.ro.js (content/editor/locale/lang.ro.js) content/editor/locale/lang.ru.js (content/editor/locale/lang.ru.js) content/editor/locale/lang.sk.js (content/editor/locale/lang.sk.js) content/editor/locale/lang.sl.js (content/editor/locale/lang.sl.js) content/editor/locale/lang.sq.js (content/editor/locale/lang.sq.js) content/editor/locale/lang.sr.js (content/editor/locale/lang.sr.js) content/editor/locale/lang.sv.js (content/editor/locale/lang.sv.js) content/editor/locale/lang.sw.js (content/editor/locale/lang.sw.js) content/editor/locale/lang.th.js (content/editor/locale/lang.th.js) content/editor/locale/lang.tl.js (content/editor/locale/lang.tl.js) content/editor/locale/lang.tr.js (content/editor/locale/lang.tr.js) content/editor/locale/lang.uk.js (content/editor/locale/lang.uk.js) content/editor/locale/lang.vi.js (content/editor/locale/lang.vi.js) content/editor/locale/lang.yi.js (content/editor/locale/lang.yi.js) content/editor/locale/lang.zh-CN.js (content/editor/locale/lang.zh-CN.js) content/editor/locale/lang.zh-HK.js (content/editor/locale/lang.zh-HK.js) content/editor/locale/lang.zh-TW.js (content/editor/locale/lang.zh-TW.js) content/editor/locale/lang.zh.js (content/editor/locale/lang.zh.js) content/editor/locale/locale.js (content/editor/locale/locale.js) content/editor/locale/README.txt (content/editor/locale/README.txt) content/editor/spinbtn/JQuerySpinBtn.css (content/editor/spinbtn/JQuerySpinBtn.css) content/editor/spinbtn/JQuerySpinBtn.js (content/editor/spinbtn/JQuerySpinBtn.js) content/editor/spinbtn/JQuerySpinBtn.min.js (content/editor/spinbtn/JQuerySpinBtn.min.js) content/editor/spinbtn/spinbtn_updn.png (content/editor/spinbtn/spinbtn_updn.png) content/editor/svg-editor.css (content/editor/svg-editor.css) content/editor/svg-editor.html (content/editor/svg-editor.html) content/editor/svg-editor.js (content/editor/svg-editor.js) content/editor/svg-editor.min.js (content/editor/svg-editor.min.js) content/editor/svgcanvas.js (content/editor/svgcanvas.js) content/editor/svgcanvas.min.js (content/editor/svgcanvas.min.js) content/editor/svgicons/jquery.svgicons.js (content/editor/svgicons/jquery.svgicons.js) content/editor/svgicons/jquery.svgicons.min.js (content/editor/svgicons/jquery.svgicons.min.js) content/svg-edit-overlay.css (content/svg-edit-overlay.css) content/svg-edit-overlay.js (content/svg-edit-overlay.js) content/svg-edit-overlay.xul (content/svg-edit-overlay.xul) content/svg-edit.xul (content/svg-edit.xul) content/svg-edit.js (content/svg-edit.js) skin/logo32.png (skin/logo32.png) ================================================ FILE: extensions/svg-edit/moz.build ================================================ JAR_MANIFESTS += ['jar.mn'] ================================================ FILE: installer/Makefile.in ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. STANDALONE_MAKEFILE := 1 #DIST_SUBDIR := browser include $(topsrcdir)/config/rules.mk MOZ_PKG_REMOVALS = $(srcdir)/removed-files.in MOZ_PKG_MANIFEST = $(srcdir)/package-manifest.in MOZ_PKG_DUPEFLAGS = -f $(srcdir)/allowed-dupes.mn # Some files have been already bundled with xulrunner ifndef MOZ_MULET MOZ_PKG_FATAL_WARNINGS = 1 else DEFINES += -DMOZ_MULET endif # When packaging an artifact build not all xpt files expected by the # packager will be present. ifdef MOZ_ARTIFACT_BUILDS MOZ_PKG_FATAL_WARNINGS = endif DEFINES += -DMOZ_APP_NAME=$(MOZ_APP_NAME) -DPREF_DIR=$(PREF_DIR) ifdef MOZ_DEBUG DEFINES += -DMOZ_DEBUG=1 endif ifneq (,$(filter gtk%,$(MOZ_WIDGET_TOOLKIT))) DEFINES += -DMOZ_GTK=1 ifeq ($(MOZ_WIDGET_TOOLKIT),gtk3) DEFINES += -DMOZ_GTK3=1 endif endif ifdef MOZ_SYSTEM_NSPR DEFINES += -DMOZ_SYSTEM_NSPR=1 endif ifdef MOZ_SYSTEM_NSS DEFINES += -DMOZ_SYSTEM_NSS=1 endif ifdef NSS_DISABLE_DBM DEFINES += -DNSS_DISABLE_DBM=1 endif ifdef MOZ_ARTIFACT_BUILDS DEFINES += -DMOZ_ARTIFACT_BUILDS=1 endif DEFINES += -DJAREXT= ifdef MOZ_ANGLE_RENDERER DEFINES += -DMOZ_ANGLE_RENDERER=$(MOZ_ANGLE_RENDERER) ifdef MOZ_D3DCOMPILER_VISTA_DLL DEFINES += -DMOZ_D3DCOMPILER_VISTA_DLL=$(MOZ_D3DCOMPILER_VISTA_DLL) endif endif DEFINES += -DMOZ_CHILD_PROCESS_NAME=$(MOZ_CHILD_PROCESS_NAME) # Set MSVC dlls version to package, if any. ifdef MOZ_NO_DEBUG_RTL ifdef WIN32_REDIST_DIR DEFINES += -DMOZ_PACKAGE_MSVC_DLLS=1 DEFINES += -DMSVC_C_RUNTIME_DLL=$(MSVC_C_RUNTIME_DLL) DEFINES += -DMSVC_CXX_RUNTIME_DLL=$(MSVC_CXX_RUNTIME_DLL) endif ifdef WIN_UCRT_REDIST_DIR DEFINES += -DMOZ_PACKAGE_WIN_UCRT_DLLS=1 endif endif ifneq (,$(filter WINNT Darwin Android,$(OS_TARGET))) DEFINES += -DMOZ_SHARED_MOZGLUE=1 endif ifdef NECKO_WIFI DEFINES += -DNECKO_WIFI endif ifdef MAKENSISU DEFINES += -DHAVE_MAKENSISU=1 endif ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT)) MOZ_PKG_MAC_DSSTORE=branding/dsstore MOZ_PKG_MAC_BACKGROUND=branding/background.png MOZ_PKG_MAC_ICON=branding/disk.icns MOZ_PKG_MAC_EXTRA=--symlink '/Applications:/ ' endif include $(topsrcdir)/toolkit/mozapps/installer/signing.mk include $(topsrcdir)/toolkit/mozapps/installer/packager.mk ifeq (bundle, $(MOZ_FS_LAYOUT)) BINPATH = $(_BINPATH) DEFINES += -DAPPNAME=$(_APPNAME) else # Every other platform just winds up in dist/bin BINPATH = bin endif DEFINES += -DBINPATH=$(BINPATH) ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT)) RESPATH = $(_APPNAME)/Contents/Resources else RESPATH = $(BINPATH) endif DEFINES += -DRESPATH=$(RESPATH) LPROJ_ROOT = $(firstword $(subst -, ,$(AB_CD))) ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT)) ifeq (zh-TW,$(AB_CD)) LPROJ_ROOT := $(subst -,_,$(AB_CD)) endif endif DEFINES += -DLPROJ_ROOT=$(LPROJ_ROOT) DEFINES += -DMOZ_ICU_VERSION=$(MOZ_ICU_VERSION) ifdef MOZ_SYSTEM_ICU DEFINES += -DMOZ_SYSTEM_ICU endif ifdef MOZ_ICU_DATA_ARCHIVE DEFINES += -DMOZ_ICU_DATA_ARCHIVE endif DEFINES += -DMOZ_ICU_DBG_SUFFIX=$(MOZ_ICU_DBG_SUFFIX) DEFINES += -DICU_DATA_FILE=$(ICU_DATA_FILE) ifdef CLANG_CXX DEFINES += -DCLANG_CXX endif ifdef CLANG_CL DEFINES += -DCLANG_CL endif # Builds using the hybrid FasterMake/RecursiveMake backend will # fail to produce a langpack. See bug 1255096. ifeq (WINNT,$(OS_ARCH)) PKGCOMP_FIND_OPTS = else PKGCOMP_FIND_OPTS = -L endif ifeq (Darwin, $(OS_ARCH)) FINDPATH = $(_APPNAME)/Contents/MacOS else FINDPATH=bin endif package-compare:: cd $(DIST); find $(PKGCOMP_FIND_OPTS) $(FINDPATH) -type f | sort > bin-list.txt $(call py_action,preprocessor,$(DEFINES) $(ACDEFINES) $(MOZ_PKG_MANIFEST)) | grep '^$(BINPATH)' | sed -e 's/^\///' | sort > $(DIST)/pack-list.txt -diff -u $(DIST)/pack-list.txt $(DIST)/bin-list.txt rm -f $(DIST)/pack-list.txt $(DIST)/bin-list.txt installer:: ifdef INSTALLER_DIR $(MAKE) -C $(INSTALLER_DIR) endif ifdef ENABLE_MARIONETTE DEFINES += -DENABLE_MARIONETTE=1 endif ================================================ FILE: installer/linux/bluegriffon.desktop ================================================ [Desktop Entry] Name=BlueGriffon GenericName=Create Web Pages GenericName[es]=Crea páginas web GenericName[it]=Creare pagine Web GenericName[fr]=Créer des pages Web GenericName[af]=Skep webblaaie GenericName[sq]=Krijo Faqe Interneti GenericName[be]=Стварэньне вэб-старонак GenericName[ast]=Facer páxines web GenericName[bn]=ওয়েব পৃষ্ঠা তৈরি করুন GenericName[bs]=Kreirajte web stranice GenericName[pt_BR]=Crie páginas web GenericName[ca@valencia]=Creeu pàgines web GenericName[ca]=Creeu pàgines web GenericName[bg]=Създаване на уеб страници GenericName[zh_HK]=建立網頁 GenericName[zh_CN]=创建网页 GenericName[zh_TW]=建立網頁 GenericName[crh]=Web sayfaları Oluştur GenericName[nl]=Webpagina's ontwerpen GenericName[da]=Opret websider GenericName[cs]=Tvorba webových stránek GenericName[fi]=Luo WWW-sivuja GenericName[gl]=Cree páxinas web GenericName[de]=Webseiten erstellen GenericName[el]=Δημιουργήστε ιστοσελίδες GenericName[is]=Búa til vefsíður GenericName[hu]=Weboldalak készítése GenericName[ky]=Веб - баракчаларын түзүү GenericName[ms]=Cipta Laman Sesawang GenericName[lt]=Kurkite tinklalapius GenericName[nb]=Opprett websider GenericName[oc]=Crear de paginas Web GenericName[pt]=Crie páginas Web GenericName[ro]=Creați pagini web GenericName[sl]=Ustvarjajte spletne strani GenericName[ru]=Создание веб-страниц GenericName[sv]=Skapa webbplatser GenericName[vi]=Tạo trang web GenericName[uk]=Створення веб-сторінок GenericName[tr]=Web sayfaları Oluştur Comment=Web Authoring System Comment[bg]=Система за създаване на уеб страници Comment[cs]=Autorský webový systém Comment[da]=Webudviklingssystem Comment[de]=Web-Gestaltungssystem Comment[el]=Σύστημα δημιουργίας διαδικτυακού περιεχομένου Comment[es]=Sistema de autoría web Comment[fi]=Verkkosivujen teko-ohjelma Comment[fr]=Système de création de contenu Web Comment[hu]=Weboldal szerkesztő Comment[it]=Sistema di Authoring Web Comment[ja]=Web オーサリングシステム Comment[ko]=웹 오서링 시스템 Comment[lt]=Saityno autorizavimo sistema Comment[nb]=Webdesignsystem Comment[nl]=Webverificatiesysteem Comment[pl]=Wizualny edytor stron WWW Comment[pt]=Sistema de Autoria Web Comment[pt_BR]=Sistema de autoração da Web Comment[ro]=Sistem de autorizare web Comment[ru]=Система создания веб-страниц Comment[sk]=Web Authoring systém Comment[tr]=Web Yazarlık Sistemi Comment[uk]=Система веб-розробки Comment[wa]=Sistinme d' askepiaedje di waibes Comment[zh_CN]=网络创作系统 Comment[zh_TW]=網頁管理系統 Exec=bluegriffon Icon=bluegriffon Terminal=false Type=Application Categories=Development;WebDevelopment; MimeType=text/html;text/xml;text/css;text/x-javascript;text/javascript;application/x-php;text/x-php;application/xhtml+xml; ================================================ FILE: installer/linux/template.desktop ================================================ #filter substitution [Desktop Entry] Version=1.0 Name=@APP_NAME@ Comment=@APP_DESCRIPTION@ Exec=/usr/bin/@APP_NAME@ Terminal=false Type=Application Categories=Utility; Icon=@APP_ICON@ MimeType=text/html;text/xml;application/xhtml+xml; ================================================ FILE: installer/package-manifest.in ================================================ ; This Source Code Form is subject to the terms of the Mozilla Public ; License, v. 2.0. If a copy of the MPL was not distributed with this ; file, You can obtain one at http://mozilla.org/MPL/2.0/. ; Package file for the Firefox build. ; ; Packaging manifest is used to copy files from dist/bin ; to the staging directory. ; Some other files are built in the staging directory directly, ; so they will be implicitly packaged too. ; ; File format: ; ; [] designates a toplevel component. Example: [xpcom] ; - in front of a file specifies it to be removed from the destination ; * wildcard support to recursively copy the entire directory ; ; file comment ; ; Due to Apple Mac OS X packaging requirements, files that are in the same ; directory on other platforms must be located in different directories on ; Mac OS X. The following defines allow specifying the Mac OS X bundle ; location which also work on other platforms. ; ; @BINPATH@ ; Equals Contents/MacOS/ on Mac OS X and is the path to the main binary on other ; platforms. ; ; @RESPATH@ ; Equals Contents/Resources/ on Mac OS X and is equivalent to @BINPATH@ on other ; platforms. #filter substitution #ifdef XP_MACOSX ; Mac bundle stuff @APPNAME@/Contents/Info.plist @APPNAME@/Contents/PkgInfo @RESPATH@/bluegriffon.icns @RESPATH@/en.lproj/* #endif [@AB_CD@] @RESPATH@/dictionaries/* @RESPATH@/hyphenation/* [xpcom] @RESPATH@/dependentlibs.list #ifdef MOZ_SHARED_MOZGLUE @BINPATH@/@DLL_PREFIX@mozglue@DLL_SUFFIX@ #endif #ifndef MOZ_STATIC_JS @BINPATH@/@DLL_PREFIX@mozjs@DLL_SUFFIX@ #endif #ifdef MOZ_DMD @BINPATH@/@DLL_PREFIX@dmd@DLL_SUFFIX@ #endif #ifndef MOZ_SYSTEM_NSPR #ifndef MOZ_FOLD_LIBS @BINPATH@/@DLL_PREFIX@nspr4@DLL_SUFFIX@ @BINPATH@/@DLL_PREFIX@plc4@DLL_SUFFIX@ @BINPATH@/@DLL_PREFIX@plds4@DLL_SUFFIX@ #endif #endif #ifdef XP_MACOSX @BINPATH@/XUL #else @BINPATH@/@DLL_PREFIX@xul@DLL_SUFFIX@ #endif #ifdef XP_MACOSX @BINPATH@/@MOZ_CHILD_PROCESS_NAME@.app/ @BINPATH@/@DLL_PREFIX@plugin_child_interpose@DLL_SUFFIX@ #else @BINPATH@/@MOZ_CHILD_PROCESS_NAME@ #endif #ifdef XP_WIN32 @BINPATH@/plugin-hang-ui@BIN_SUFFIX@ #if MOZ_PACKAGE_MSVC_DLLS @BINPATH@/@MSVC_C_RUNTIME_DLL@ @BINPATH@/@MSVC_CXX_RUNTIME_DLL@ #endif #if MOZ_PACKAGE_WIN_UCRT_DLLS @BINPATH@/api-ms-win-*.dll @BINPATH@/ucrtbase.dll #endif #endif #ifdef MOZ_ICU_DATA_ARCHIVE @RESPATH@/@ICU_DATA_FILE@ #endif #ifdef MOZ_GTK3 @BINPATH@/@DLL_PREFIX@mozgtk@DLL_SUFFIX@ @BINPATH@/gtk2/@DLL_PREFIX@mozgtk@DLL_SUFFIX@ #endif ; We don't have a complete view of which dlls to expect when doing an artifact ; build because we haven't run all of configure, so we trust what's in ; dist/bin, because everything there was extracted from our original build's ; package. #if defined(MOZ_ARTIFACT_BUILDS) && defined(XP_WIN) @BINPATH@/*.dll #endif [bluegriffon] ; [Base Browser Files] #ifndef XP_UNIX @BINPATH@/@MOZ_APP_NAME@.exe #else @BINPATH@/@MOZ_APP_NAME@-bin @BINPATH@/@MOZ_APP_NAME@ #endif @RESPATH@/application.ini #ifdef MOZ_UPDATER @RESPATH@/update-settings.ini #endif @RESPATH@/platform.ini #ifndef MOZ_SYSTEM_SQLITE #ifndef MOZ_FOLD_LIBS @BINPATH@/@DLL_PREFIX@mozsqlite3@DLL_SUFFIX@ #endif #endif @BINPATH@/@DLL_PREFIX@lgpllibs@DLL_SUFFIX@ #ifdef MOZ_FFVPX @BINPATH@/@DLL_PREFIX@mozavutil@DLL_SUFFIX@ @BINPATH@/@DLL_PREFIX@mozavcodec@DLL_SUFFIX@ #endif #ifdef XP_UNIX #ifndef XP_MACOSX @RESPATH@/run-mozilla.sh #endif #endif #ifdef XP_WIN #ifdef _AMD64_ @BINPATH@/@DLL_PREFIX@qipcap64@DLL_SUFFIX@ #else @BINPATH@/@DLL_PREFIX@qipcap@DLL_SUFFIX@ #endif #endif ; [Components] ; DevTools ; @RESPATH@/chrome/devtools@JAREXT@ ; @RESPATH@/chrome/devtools.manifest @RESPATH@/@PREF_DIR@/devtools.js @RESPATH@/components/devtools-startup.manifest @RESPATH@/components/devtools-startup.js #ifdef MOZ_ARTIFACT_BUILDS @RESPATH@/components/prebuilt-interfaces.manifest @RESPATH@/components/interfaces.xpt #endif @RESPATH@/components/alerts.xpt #ifdef ACCESSIBILITY #ifdef XP_WIN32 @BINPATH@/Accessible.tlb @BINPATH@/AccessibleMarshal.dll @BINPATH@/IA2Marshal.dll #endif @RESPATH@/components/accessibility.xpt #endif @RESPATH@/components/appshell.xpt @RESPATH@/components/appstartup.xpt @RESPATH@/components/autocomplete.xpt @RESPATH@/components/autoconfig.xpt @RESPATH@/components/browser-element.xpt @RESPATH@/components/caps.xpt @RESPATH@/components/chrome.xpt @RESPATH@/components/commandhandler.xpt @RESPATH@/components/commandlines.xpt @RESPATH@/components/composer.xpt @RESPATH@/components/content_events.xpt @RESPATH@/components/content_html.xpt @RESPATH@/components/content_geckomediaplugins.xpt #ifdef MOZ_WEBRTC @RESPATH@/components/content_webrtc.xpt #endif @RESPATH@/components/content_xslt.xpt #ifdef XP_MACOSX @RESPATH@/components/dibadge.xpt #endif @RESPATH@/components/dibgutils.xpt @RESPATH@/components/directory.xpt @RESPATH@/components/docshell.xpt @RESPATH@/components/dom.xpt @RESPATH@/components/dom_base.xpt @RESPATH@/components/dom_bindings.xpt @RESPATH@/components/dom_file.xpt @RESPATH@/components/dom_system.xpt @RESPATH@/components/dom_canvas.xpt @RESPATH@/components/dom_core.xpt @RESPATH@/components/dom_css.xpt @RESPATH@/components/dom_events.xpt @RESPATH@/components/dom_geolocation.xpt @RESPATH@/components/dom_media.xpt @RESPATH@/components/dom_network.xpt @RESPATH@/components/dom_notification.xpt @RESPATH@/components/dom_html.xpt @RESPATH@/components/dom_offline.xpt @RESPATH@/components/dom_json.xpt @RESPATH@/components/dom_power.xpt @RESPATH@/components/dom_push.xpt @RESPATH@/components/dom_quota.xpt @RESPATH@/components/dom_range.xpt @RESPATH@/components/dom_security.xpt @RESPATH@/components/dom_sidebar.xpt @RESPATH@/components/dom_storage.xpt @RESPATH@/components/dom_stylesheets.xpt @RESPATH@/components/dom_traversal.xpt #ifdef MOZ_WEBSPEECH @RESPATH@/components/dom_webspeechrecognition.xpt #endif @RESPATH@/components/dom_workers.xpt @RESPATH@/components/dom_xbl.xpt @RESPATH@/components/dom_xhr.xpt @RESPATH@/components/dom_xpath.xpt @RESPATH@/components/dom_xul.xpt @RESPATH@/components/dom_presentation.xpt @RESPATH@/components/downloads.xpt @RESPATH@/components/editor.xpt @RESPATH@/components/extensions.xpt @RESPATH@/components/exthandler.xpt @RESPATH@/components/exthelper.xpt @RESPATH@/components/fastfind.xpt @RESPATH@/components/feeds.xpt #ifdef MOZ_GTK @RESPATH@/components/filepicker.xpt #endif @RESPATH@/components/gfx.xpt @RESPATH@/components/html5.xpt @RESPATH@/components/htmlparser.xpt @RESPATH@/components/imglib2.xpt @RESPATH@/components/inspector.xpt @RESPATH@/components/intl.xpt @RESPATH@/components/jar.xpt @RESPATH@/components/jsdebugger.xpt @RESPATH@/components/jsdownloads.xpt @RESPATH@/components/layout_base.xpt #ifdef NS_PRINTING @RESPATH@/components/layout_printing.xpt #endif @RESPATH@/components/layout_xul_tree.xpt @RESPATH@/components/layout_xul.xpt @RESPATH@/components/locale.xpt @RESPATH@/components/lwbrk.xpt #ifdef MOZ_GECKO_PROFILER @RESPATH@/components/memory_profiler.xpt #endif @RESPATH@/components/mimetype.xpt @RESPATH@/components/mozfind.xpt #ifdef ENABLE_INTL_API @RESPATH@/components/mozintl.xpt #endif @RESPATH@/components/necko_about.xpt @RESPATH@/components/necko_cache.xpt @RESPATH@/components/necko_cache2.xpt @RESPATH@/components/necko_cookie.xpt @RESPATH@/components/necko_dns.xpt @RESPATH@/components/necko_file.xpt @RESPATH@/components/necko_ftp.xpt @RESPATH@/components/necko_http.xpt @RESPATH@/components/necko_mdns.xpt @RESPATH@/components/necko_res.xpt @RESPATH@/components/necko_socket.xpt @RESPATH@/components/necko_strconv.xpt @RESPATH@/components/necko_viewsource.xpt @RESPATH@/components/necko_websocket.xpt #ifdef NECKO_WIFI @RESPATH@/components/necko_wifi.xpt #endif @RESPATH@/components/necko_wyciwyg.xpt @RESPATH@/components/necko.xpt @RESPATH@/components/loginmgr.xpt @RESPATH@/components/parentalcontrols.xpt #ifdef MOZ_WEBRTC @RESPATH@/components/peerconnection.xpt #endif @RESPATH@/components/places.xpt @RESPATH@/components/plugin.xpt @RESPATH@/components/pref.xpt @RESPATH@/components/prefetch.xpt #ifdef MOZ_GECKO_PROFILER @RESPATH@/components/profiler.xpt #endif @RESPATH@/components/rdf.xpt @RESPATH@/components/satchel.xpt @RESPATH@/components/saxparser.xpt @RESPATH@/components/services-crypto-component.xpt @RESPATH@/components/captivedetect.xpt @RESPATH@/components/shistory.xpt @RESPATH@/components/spellchecker.xpt @RESPATH@/components/storage.xpt @RESPATH@/components/toolkit_asyncshutdown.xpt @RESPATH@/components/toolkit_filewatcher.xpt @RESPATH@/components/toolkit_finalizationwitness.xpt @RESPATH@/components/toolkit_formautofill.xpt @RESPATH@/components/toolkit_osfile.xpt @RESPATH@/components/toolkit_securityreporter.xpt @RESPATH@/components/toolkit_perfmonitoring.xpt @RESPATH@/components/toolkit_xulstore.xpt @RESPATH@/components/toolkitprofile.xpt #ifdef MOZ_ENABLE_XREMOTE @RESPATH@/components/toolkitremote.xpt #endif @RESPATH@/components/txtsvc.xpt @RESPATH@/components/txmgr.xpt @RESPATH@/components/uconv.xpt @RESPATH@/components/unicharutil.xpt @RESPATH@/components/update.xpt @RESPATH@/components/uriloader.xpt @RESPATH@/components/urlformatter.xpt @RESPATH@/components/webBrowser_core.xpt @RESPATH@/components/webbrowserpersist.xpt @RESPATH@/components/widget.xpt #ifdef XP_MACOSX @RESPATH@/components/widget_cocoa.xpt #endif @RESPATH@/components/windowcreator.xpt @RESPATH@/components/windowds.xpt @RESPATH@/components/windowwatcher.xpt @RESPATH@/components/xpcom_base.xpt @RESPATH@/components/xpcom_system.xpt @RESPATH@/components/xpcom_components.xpt @RESPATH@/components/xpcom_ds.xpt @RESPATH@/components/xpcom_io.xpt @RESPATH@/components/xpcom_threads.xpt @RESPATH@/components/xpcom_xpti.xpt @RESPATH@/components/xpconnect.xpt @RESPATH@/components/xulapp.xpt @RESPATH@/components/xul.xpt @RESPATH@/components/xultmpl.xpt @RESPATH@/components/zipwriter.xpt @RESPATH@/components/telemetry.xpt ; JavaScript components @RESPATH@/components/ConsoleAPI.manifest @RESPATH@/components/ConsoleAPIStorage.js @RESPATH@/components/BrowserElementParent.manifest @RESPATH@/components/BrowserElementParent.js @RESPATH@/components/FeedProcessor.manifest @RESPATH@/components/FeedProcessor.js @RESPATH@/components/WellKnownOpportunisticUtils.js @RESPATH@/components/WellKnownOpportunisticUtils.manifest #ifndef XP_MACOSX ; OSX uses native platform impl. Windows, Linux, and Android uses fallback JS impl. @BINPATH@/components/nsDNSServiceDiscovery.manifest @BINPATH@/components/nsDNSServiceDiscovery.js #endif @RESPATH@/components/Downloads.manifest @RESPATH@/components/DownloadLegacy.js @RESPATH@/components/BrowserPageThumbs.manifest @RESPATH@/components/crashmonitor.manifest @RESPATH@/components/nsCrashMonitor.js @RESPATH@/components/toolkitsearch.manifest @RESPATH@/components/nsSearchService.js @RESPATH@/components/nsSearchSuggestions.js @RESPATH@/components/passwordmgr.manifest @RESPATH@/components/nsLoginInfo.js @RESPATH@/components/nsLoginManager.js @RESPATH@/components/nsLoginManagerPrompter.js @RESPATH@/components/storage-json.js @RESPATH@/components/crypto-SDR.js @RESPATH@/components/TooltipTextProvider.js @RESPATH@/components/TooltipTextProvider.manifest @RESPATH@/components/webvtt.xpt @RESPATH@/components/WebVTT.manifest @RESPATH@/components/WebVTTParserWrapper.js #ifdef MOZ_GTK @RESPATH@/components/nsFilePicker.manifest @RESPATH@/components/nsFilePicker.js #endif @RESPATH@/components/bgCharUnicodeAutocomplete.js @RESPATH@/components/bgCharUnicodeAutocomplete.manifest @RESPATH@/components/bgCommandHandler.js @RESPATH@/components/bgCommandHandler.manifest @RESPATH@/components/bgLocationAutocomplete.js @RESPATH@/components/bgLocationAutocomplete.manifest @RESPATH@/components/phpStreamConverter.js @RESPATH@/components/phpStreamConverter.manifest @RESPATH@/components/nsHelperAppDlg.manifest @RESPATH@/components/nsHelperAppDlg.js @RESPATH@/components/NetworkGeolocationProvider.manifest @RESPATH@/components/NetworkGeolocationProvider.js @RESPATH@/components/extensions.manifest @RESPATH@/components/EditorUtils.manifest @RESPATH@/components/EditorUtils.js @RESPATH@/components/addonManager.js @RESPATH@/components/amContentHandler.js @RESPATH@/components/amInstallTrigger.js @RESPATH@/components/amWebAPI.js @RESPATH@/components/nsBlocklistService.js @RESPATH@/components/nsBlocklistServiceContent.js #ifdef MOZ_UPDATER @RESPATH@/components/nsUpdateService.manifest @RESPATH@/components/nsUpdateService.js @RESPATH@/components/nsUpdateServiceStub.js #endif @RESPATH@/components/nsUpdateTimerManager.manifest @RESPATH@/components/nsUpdateTimerManager.js @RESPATH@/components/addoncompat.manifest @RESPATH@/components/multiprocessShims.js @RESPATH@/components/defaultShims.js @RESPATH@/components/utils.manifest @RESPATH@/components/simpleServices.js @RESPATH@/components/pluginGlue.manifest @RESPATH@/components/ProcessSingleton.manifest @RESPATH@/components/MainProcessSingleton.js @RESPATH@/components/ContentProcessSingleton.js @RESPATH@/components/nsURLFormatter.manifest @RESPATH@/components/nsURLFormatter.js @RESPATH@/components/txEXSLTRegExFunctions.manifest @RESPATH@/components/txEXSLTRegExFunctions.js @RESPATH@/components/PageThumbsProtocol.js @RESPATH@/components/mozProtocolHandler.js @RESPATH@/components/mozProtocolHandler.manifest @RESPATH@/components/nsDefaultCLH.manifest @RESPATH@/components/nsDefaultCLH.js @RESPATH@/components/nsContentPrefService.manifest @RESPATH@/components/nsContentPrefService.js @RESPATH@/components/nsContentDispatchChooser.manifest @RESPATH@/components/nsContentDispatchChooser.js @RESPATH@/components/nsHandlerService-json.manifest @RESPATH@/components/nsHandlerService-json.js @RESPATH@/components/nsHandlerService.manifest @RESPATH@/components/nsHandlerService.js @RESPATH@/components/nsWebHandlerApp.manifest @RESPATH@/components/nsWebHandlerApp.js @RESPATH@/components/satchel.manifest @RESPATH@/components/nsFormAutoComplete.js @RESPATH@/components/FormHistoryStartup.js @RESPATH@/components/nsInputListAutoComplete.js @RESPATH@/components/formautofill.manifest @RESPATH@/components/FormAutofillContentService.js @RESPATH@/components/FormAutofillStartup.js @RESPATH@/components/contentAreaDropListener.manifest @RESPATH@/components/contentAreaDropListener.js @RESPATH@/components/nsINIProcessor.manifest @RESPATH@/components/nsINIProcessor.js @RESPATH@/components/nsPrompter.manifest @RESPATH@/components/nsPrompter.js @RESPATH@/components/FxAccountsComponents.manifest @RESPATH@/components/FxAccountsPush.js @RESPATH@/components/CaptivePortalDetectComponents.manifest @RESPATH@/components/captivedetect.js @RESPATH@/components/servicesComponents.manifest @RESPATH@/components/cryptoComponents.manifest @RESPATH@/components/TelemetryStartup.js @RESPATH@/components/TelemetryStartup.manifest @RESPATH@/components/XULStore.js @RESPATH@/components/XULStore.manifest @RESPATH@/components/messageWakeupService.js @RESPATH@/components/messageWakeupService.manifest @RESPATH@/components/recording-cmdline.js @RESPATH@/components/recording-cmdline.manifest @RESPATH@/components/htmlMenuBuilder.js @RESPATH@/components/htmlMenuBuilder.manifest @RESPATH@/components/NotificationStorage.js @RESPATH@/components/NotificationStorage.manifest @RESPATH@/components/Push.js @RESPATH@/components/Push.manifest @RESPATH@/components/PushComponents.js @RESPATH@/components/remotebrowserutils.manifest @RESPATH@/components/RemoteWebNavigation.js @RESPATH@/components/ProcessSelector.js @RESPATH@/components/ProcessSelector.manifest @RESPATH@/components/SlowScriptDebug.manifest @RESPATH@/components/SlowScriptDebug.js #ifdef MOZ_WEBRTC @RESPATH@/components/PeerConnection.js @RESPATH@/components/PeerConnection.manifest #endif @RESPATH@/components/marionette.manifest @RESPATH@/components/marionette.js #ifdef MOZ_WEBSPEECH @RESPATH@/components/dom_webspeechsynth.xpt #endif @RESPATH@/components/nsAsyncShutdown.manifest @RESPATH@/components/nsAsyncShutdown.js @RESPATH@/components/PresentationDeviceInfoManager.manifest @RESPATH@/components/PresentationDeviceInfoManager.js @RESPATH@/components/BuiltinProviders.manifest @RESPATH@/components/PresentationControlService.js @RESPATH@/components/PresentationDataChannelSessionTransport.js @RESPATH@/components/PresentationDataChannelSessionTransport.manifest #ifdef ENABLE_INTL_API @RESPATH@/components/mozIntl.manifest @RESPATH@/components/mozIntl.js #endif #if defined(ENABLE_TESTS) && defined(MOZ_DEBUG) @RESPATH@/components/TestInterfaceJS.js @RESPATH@/components/TestInterfaceJS.manifest @RESPATH@/components/TestInterfaceJSMaplike.js #endif ; [Extensions] @RESPATH@/components/extensions-toolkit.manifest ; Modules @RESPATH@/modules/* ; Safe Browsing @RESPATH@/components/nsURLClassifier.manifest @RESPATH@/components/nsUrlClassifierHashCompleter.js @RESPATH@/components/nsUrlClassifierListManager.js @RESPATH@/components/nsUrlClassifierLib.js @RESPATH@/components/url-classifier.xpt ; Private Browsing @RESPATH@/components/privatebrowsing.xpt @RESPATH@/components/PrivateBrowsing.manifest @RESPATH@/components/PrivateBrowsingTrackingProtectionWhitelist.js ; Security Reports @RESPATH@/components/SecurityReporter.manifest @RESPATH@/components/SecurityReporter.js ; ANGLE GLES-on-D3D rendering library #ifdef MOZ_ANGLE_RENDERER @BINPATH@/libEGL.dll @BINPATH@/libGLESv2.dll #ifdef MOZ_D3DCOMPILER_VISTA_DLL @BINPATH@/@MOZ_D3DCOMPILER_VISTA_DLL@ #endif #endif # MOZ_ANGLE_RENDERER ; [Browser Chrome Files] @RESPATH@/chrome/* #ifdef XP_MACOSX @BINPATH@/extensions/* #else @BINPATH@/distribution #endif #ifdef MOZ_GTK ; @RESPATH@/browser/chrome/icons/default/default16.png ; @RESPATH@/browser/chrome/icons/default/default32.png ; @RESPATH@/browser/chrome/icons/default/default48.png #endif ; shell icons #ifdef XP_UNIX #ifndef XP_MACOSX ; shell icons ; @RESPATH@/browser/icons/*.png #ifdef MOZ_UPDATER ; updater icon ; @RESPATH@/icons/updater.png #endif #endif #endif ; [Default Preferences] ; All the pref files must be part of base to prevent migration bugs @RESPATH@/defaults/pref/bluegriffon-prefs.js @RESPATH@/greprefs.js @RESPATH@/defaults/autoconfig/prefcalls.js @RESPATH@/defaults/profile/prefs.js ; Warning: changing the path to channel-prefs.js can cause bugs (Bug 756325) ; Technically this is an app pref file, but we are keeping it in the original ; gre location for now. @RESPATH@/defaults/pref/channel-prefs.js ; [Layout Engine Resources] ; Style Sheets, Graphics and other Resources used by the layout engine. @RESPATH@/res/base-min.css @RESPATH@/res/cm2.html @RESPATH@/res/codemirror/* @RESPATH@/res/contenteditable.css @RESPATH@/res/csseditor.html @RESPATH@/res/designmode.css @RESPATH@/res/EditorOverride.css @RESPATH@/res/grabber.gif @RESPATH@/res/html5.html @RESPATH@/res/html_strict.html @RESPATH@/res/html_transitional.html @RESPATH@/res/ImageDocument.css @RESPATH@/res/markdowneditor.html @RESPATH@/res/polyglot.xhtml @RESPATH@/res/reset-fonts-grids.css @RESPATH@/res/rotate_icon.png @RESPATH@/res/rotatorCenterBG.png @RESPATH@/res/scripteditor.html @RESPATH@/res/table-add-column-after-active.gif @RESPATH@/res/table-add-column-after-hover.gif @RESPATH@/res/table-add-column-after.gif @RESPATH@/res/table-add-column-before-active.gif @RESPATH@/res/table-add-column-before-hover.gif @RESPATH@/res/table-add-column-before.gif @RESPATH@/res/table-add-row-after-active.gif @RESPATH@/res/table-add-row-after-hover.gif @RESPATH@/res/table-add-row-after.gif @RESPATH@/res/table-add-row-before-active.gif @RESPATH@/res/table-add-row-before-hover.gif @RESPATH@/res/table-add-row-before.gif @RESPATH@/res/table-remove-column-active.gif @RESPATH@/res/table-remove-column-hover.gif @RESPATH@/res/table-remove-column.gif @RESPATH@/res/table-remove-row-active.gif @RESPATH@/res/table-remove-row-hover.gif @RESPATH@/res/table-remove-row.gif @RESPATH@/res/TopLevelImageDocument.css @RESPATH@/res/TopLevelVideoDocument.css @RESPATH@/res/xhtml11.xhtml @RESPATH@/res/xhtml5.xhtml @RESPATH@/res/xhtml_strict.html @RESPATH@/res/xhtml_strict.xhtml @RESPATH@/res/xhtml_transitional.html @RESPATH@/res/xhtml_transitional.xhtml #ifdef XP_MACOSX @RESPATH@/res/cursors/* #endif @RESPATH@/res/fonts/* @RESPATH@/res/dtd/* @RESPATH@/res/html/* #if defined(XP_MACOSX) || defined(XP_WIN) ; For SafariProfileMigrator.js. ; @RESPATH@/res/langGroups.properties #endif @RESPATH@/res/language.properties @RESPATH@/res/entityTables/* #ifdef XP_MACOSX @RESPATH@/res/MainMenu.nib/ #endif ; svg @RESPATH@/res/svg.css @RESPATH@/components/dom_svg.xpt @RESPATH@/components/dom_smil.xpt ; [Personal Security Manager] ; ; NSS libraries are signed in the staging directory, ; meaning their .chk files are created there directly. ; #ifndef MOZ_SYSTEM_NSS #if defined(XP_LINUX) && !defined(ANDROID) @BINPATH@/@DLL_PREFIX@freeblpriv3@DLL_SUFFIX@ #else @BINPATH@/@DLL_PREFIX@freebl3@DLL_SUFFIX@ #endif @BINPATH@/@DLL_PREFIX@nss3@DLL_SUFFIX@ @BINPATH@/@DLL_PREFIX@nssckbi@DLL_SUFFIX@ #ifndef NSS_DISABLE_DBM @BINPATH@/@DLL_PREFIX@nssdbm3@DLL_SUFFIX@ #endif #ifndef MOZ_FOLD_LIBS @BINPATH@/@DLL_PREFIX@nssutil3@DLL_SUFFIX@ @BINPATH@/@DLL_PREFIX@smime3@DLL_SUFFIX@ @BINPATH@/@DLL_PREFIX@ssl3@DLL_SUFFIX@ #endif @BINPATH@/@DLL_PREFIX@softokn3@DLL_SUFFIX@ #endif @RESPATH@/components/pipnss.xpt @RESPATH@/components/pippki.xpt ; For process sandboxing #if defined(MOZ_SANDBOX) #if defined(XP_LINUX) @BINPATH@/@DLL_PREFIX@mozsandbox@DLL_SUFFIX@ @RESPATH@/components/sandbox.xpt #endif #endif ; for Solaris SPARC #ifdef SOLARIS bin/libfreebl_32fpu_3.so bin/libfreebl_32int_3.so bin/libfreebl_32int64_3.so #endif ; [Updater] ; #ifdef MOZ_UPDATER #ifdef XP_MACOSX @BINPATH@/updater.app/ #else @BINPATH@/updater@BIN_SUFFIX@ #endif #endif ; [MaintenanceService] ; #ifdef MOZ_MAINTENANCE_SERVICE @BINPATH@/maintenanceservice.exe @BINPATH@/maintenanceservice_installer.exe #endif ; [Crash Reporter] ; #ifdef MOZ_CRASHREPORTER @RESPATH@/components/CrashService.manifest @RESPATH@/components/CrashService.js @RESPATH@/components/toolkit_crashservice.xpt #ifdef XP_MACOSX @BINPATH@/crashreporter.app/ #else @BINPATH@/crashreporter@BIN_SUFFIX@ @RESPATH@/crashreporter.ini @BINPATH@/minidump-analyzer@BIN_SUFFIX@ #ifdef XP_UNIX @RESPATH@/Throbber-small.gif #endif #endif #ifdef MOZ_CRASHREPORTER_INJECTOR @BINPATH@/breakpadinjector.dll #endif #endif @RESPATH@/components/dom_audiochannel.xpt ; Shutdown Terminator @RESPATH@/components/nsTerminatorTelemetry.js @RESPATH@/components/terminator.manifest #if defined(CLANG_CXX) #if defined(MOZ_ASAN) || defined(MOZ_TSAN) @BINPATH@/llvm-symbolizer #endif #endif #if defined(MOZ_ASAN) && defined(CLANG_CL) @BINPATH@/clang_rt.asan_dynamic-*.dll #endif ; media @RESPATH@/gmp-clearkey/0.1/@DLL_PREFIX@clearkey@DLL_SUFFIX@ @RESPATH@/gmp-clearkey/0.1/manifest.json ; gfx #ifdef XP_WIN @RESPATH@/components/GfxSanityTest.manifest @RESPATH@/components/SanityTest.js #endif #ifdef MOZ_MULET #include ../../b2g/installer/package-manifest.in #endif ================================================ FILE: installer/removed-files.in ================================================ .autoreg LICENSE ================================================ FILE: installer/windows/Makefile.in ================================================ DEPTH = ../../.. topsrcdir = @top_srcdir@ srcdir = @srcdir@ VPATH = @srcdir@ include $(DEPTH)/config/autoconf.mk include $(topsrcdir)/toolkit/mozapps/installer/package-name.mk PKG_INST_PATH = CONFIG_DIR = instgen SFX_MODULE = $(topsrcdir)/other-licenses/7zstub/firefox/7zSD.sfx PRE_RELEASE_SUFFIX := "" DEFINES += -DPRE_RELEASE_SUFFIX="$(PRE_RELEASE_SUFFIX)" INSTALLER_FILES = \ nsis/installer.nsi \ nsis/uninstaller.nsi \ nsis/shared.nsh \ $(NULL) BRANDING_FILES = \ wizHeader.bmp \ wizHeaderRTL.bmp \ wizWatermark.bmp \ $(NULL) DEFINES += \ -DAB_CD=$(AB_CD) \ -DMOZ_APP_NAME=$(MOZ_APP_NAME) \ -DMOZ_APP_VERSION=$(MOZ_APP_VERSION) \ -DMOZ_APP_VENDOR=$(MOZ_APP_VENDOR) \ -DMOZ_APP_DISPLAYNAME=${MOZ_APP_DISPLAYNAME} \ -DMOZILLA_VERSION=${MOZILLA_VERSION} \ $(NULL) include $(topsrcdir)/config/config.mk ifdef LOCALE_MERGEDIR PPL_LOCALE_ARGS = \ --l10n-dir=$(LOCALE_MERGEDIR)/browser/installer \ --l10n-dir=$(call EXPAND_LOCALE_SRCDIR,browser/locales)/installer \ --l10n-dir=$(topsrcdir)/browser/locales/en-US/installer \ $(NULL) else PPL_LOCALE_ARGS=$(call EXPAND_LOCALE_SRCDIR,browser/locales)/installer endif installer:: $(MAKE) -C .. installer-stage $(MAKE) $(CONFIG_DIR)/setup.exe # For building the uninstaller during the application build so it can be # included for mar file generation. uninstaller:: $(RM) -r $(CONFIG_DIR) $(MKDIR) $(CONFIG_DIR) $(INSTALL) $(addprefix $(srcdir)/,$(INSTALLER_FILES)) $(CONFIG_DIR) $(PYTHON) $(topsrcdir)/config/Preprocessor.py -Fsubstitution $(DEFINES) $(ACDEFINES) \ $(srcdir)/app.tag.in > $(CONFIG_DIR)/app.tag ifdef BRANDING_FILES $(INSTALL) $(addprefix $(DIST)/branding/,$(BRANDING_FILES)) $(CONFIG_DIR) endif $(PYTHON) $(topsrcdir)/config/Preprocessor.py -Fsubstitution $(DEFINES) $(ACDEFINES) \ $(srcdir)/nsis/defines.nsi.in > $(CONFIG_DIR)/defines.nsi $(PYTHON) $(topsrcdir)/toolkit/mozapps/installer/windows/nsis/preprocess-locale.py \ --preprocess-locale $(topsrcdir) \ $(PPL_LOCALE_ARGS) $(AB_CD) $(CONFIG_DIR) $(CONFIG_DIR)/setup.exe:: $(RM) -r $(CONFIG_DIR) $(MKDIR) $(CONFIG_DIR) $(INSTALL) $(addprefix $(srcdir)/,$(INSTALLER_FILES)) $(CONFIG_DIR) $(PYTHON) $(topsrcdir)/config/Preprocessor.py -Fsubstitution $(DEFINES) $(ACDEFINES) \ $(srcdir)/app.tag.in > $(CONFIG_DIR)/app.tag ifdef BRANDING_FILES $(INSTALL) $(addprefix $(DIST)/branding/,$(BRANDING_FILES)) $(CONFIG_DIR) endif $(PYTHON) $(topsrcdir)/config/Preprocessor.py -Fsubstitution $(DEFINES) $(ACDEFINES) \ $(srcdir)/nsis/defines.nsi.in > $(CONFIG_DIR)/defines.nsi $(PYTHON) $(topsrcdir)/toolkit/mozapps/installer/windows/nsis/preprocess-locale.py \ --preprocess-locale $(topsrcdir) \ $(PPL_LOCALE_ARGS) $(AB_CD) $(CONFIG_DIR) GARBARGE_DIRS += instgen include $(topsrcdir)/config/rules.mk include $(topsrcdir)/toolkit/mozapps/installer/windows/nsis/makensis.mk ================================================ FILE: installer/windows/app.tag.in ================================================ #define Install @Install@ #define InstallEnd @InstallEnd@ ;!@Install@!UTF-8! Title="@MOZ_APP_DISPLAYNAME@" RunProgram="setup.exe" ;!@InstallEnd@! ================================================ FILE: installer/windows/moz.build ================================================ # vim: set filetype=python: # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. ================================================ FILE: installer/windows/nsis/defines.nsi.in ================================================ #filter substitution !define BrandFullNameInternal "@MOZ_APP_DISPLAYNAME@" !define CompanyName "Disruptive Innovations SARL" !define URLInfoAbout "http://www.bluegriffon.org" !define URLUpdateInfo "http://www.bluegriffon.org" # These defines should match application.ini settings !define AppName "@MOZ_APP_NAME@" !define AppVersion "@MOZ_APP_VERSION@" !define GREVersion @MOZILLA_VERSION@ !define AB_CD "@AB_CD@" !define FileMainEXE "@MOZ_APP_NAME@.exe" !define WindowClass "BlueGriffonMessageWindow" !define DDEApplication "BlueGriffon" !define AppRegName "BlueGriffon" !define BrandShortName "@MOZ_APP_DISPLAYNAME@" !define PreReleaseSuffix "@PRE_RELEASE_SUFFIX@" !define BrandFullName "${BrandFullNameInternal}${PreReleaseSuffix}" !define NO_UNINSTALL_SURVEY # LSP_CATEGORIES is the permitted LSP categories for the application. Each LSP # category value is ANDed together to set multiple permitted categories. # See http://msdn.microsoft.com/en-us/library/ms742253%28VS.85%29.aspx # The value below removes all LSP categories previously set. !define LSP_CATEGORIES "0x00000000" # NO_INSTDIR_FROM_REG is defined for pre-releases which have a PreReleaseSuffix # (e.g. Alpha X, Beta X, etc.) to prevent finding a non-default installation # directory in the registry and using that as the default. This prevents # Beta releases built with official branding from finding an existing install # of an official release and defaulting to its installation directory. !if "@PRE_RELEASE_SUFFIX@" != "" !define NO_INSTDIR_FROM_REG !endif # ARCH is used when it is necessary to differentiate the x64 registry keys from # the x86 registry keys (e.g. the uninstall registry key). #ifdef HAVE_64BIT_OS !define HAVE_64BIT_OS !define ARCH "x64" !define MinSupportedVer "Microsoft Windows Vista x64" #else !define ARCH "x86" !define MinSupportedVer "Microsoft Windows 2000" #endif # File details shared by both the installer and uninstaller VIProductVersion "1.0.0.0" VIAddVersionKey "ProductName" "${BrandShortName}" VIAddVersionKey "CompanyName" "${CompanyName}" #ifdef MOZ_OFFICIAL_BRANDING VIAddVersionKey "LegalTrademarks" "${BrandShortName} is a Trademark of Disruptive Innovations SAS." #endif VIAddVersionKey "LegalCopyright" "${CompanyName}" VIAddVersionKey "FileVersion" "${AppVersion}" VIAddVersionKey "ProductVersion" "${AppVersion}" # Comments is not used but left below commented out for future reference # VIAddVersionKey "Comments" "Comments" ================================================ FILE: installer/windows/nsis/installer.nsi ================================================ # ***** BEGIN LICENSE BLOCK ***** # Version: MPL 1.1/GPL 2.0/LGPL 2.1 # # The contents of this file are subject to the Mozilla Public License Version # 1.1 (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. # # The Original Code is the Mozilla Installer code. # # The Initial Developer of the Original Code is Mozilla Foundation # Portions created by the Initial Developer are Copyright (C) 2006 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Robert Strong <robert.bugzilla@gmail.com> # # Alternatively, the contents of this file may be used under the terms of # either the GNU General Public License Version 2 or later (the "GPL"), or # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), # in which case the provisions of the GPL or the LGPL are applicable instead # of those above. If you wish to allow use of your version of this file only # under the terms of either the GPL or the LGPL, and not to allow others to # use your version of this file under the terms of the MPL, indicate your # decision by deleting the provisions above and replace them with the notice # and other provisions required by the GPL or the LGPL. If you do not delete # the provisions above, a recipient may use your version of this file under # the terms of any one of the MPL, the GPL or the LGPL. # # ***** END LICENSE BLOCK ***** # Required Plugins: # AppAssocReg http://nsis.sourceforge.net/Application_Association_Registration_plug-in # ApplicationID http://nsis.sourceforge.net/ApplicationID_plug-in # CityHash http://mxr.mozilla.org/mozilla-central/source/other-licenses/nsis/Contrib/CityHash # ShellLink http://nsis.sourceforge.net/ShellLink_plug-in # UAC http://nsis.sourceforge.net/UAC_plug-in ; Set verbosity to 3 (e.g. no script) to lessen the noise in the build logs !verbose 3 ; 7-Zip provides better compression than the lzma from NSIS so we add the files ; uncompressed and use 7-Zip to create a SFX archive of it SetDatablockOptimize on SetCompress off CRCCheck on RequestExecutionLevel user !addplugindir ./ Var TmpVal Var InstallType Var AddStartMenuSC Var AddQuickLaunchSC Var AddDesktopSC Var PageName ; By defining NO_STARTMENU_DIR an installer that doesn't provide an option for ; an application's Start Menu PROGRAMS directory and doesn't define the ; StartMenuDir variable can use the common InstallOnInitCommon macro. !define NO_STARTMENU_DIR ; On Vista and above attempt to elevate Standard Users in addition to users that ; are a member of the Administrators group. !define NONADMIN_ELEVATE !define AbortSurveyURL "http://www.kampyle.com/feedback_form/ff-feedback-form.php?site_code=8166124&form_id=12116&url=" ; Other included files may depend upon these includes! ; The following includes are provided by NSIS. !include FileFunc.nsh !include LogicLib.nsh !include MUI.nsh !include WinMessages.nsh !include WinVer.nsh !include WordFunc.nsh !insertmacro GetOptions !insertmacro GetParameters !insertmacro GetSize !insertmacro StrFilter !insertmacro WordFind !insertmacro WordReplace ; The following includes are custom. ;!include branding.nsi !include defines.nsi !include common.nsh !include locales.nsi VIAddVersionKey "FileDescription" "${BrandShortName} Installer" VIAddVersionKey "OriginalFilename" "setup.exe" ; Must be inserted before other macros that use logging !insertmacro _LoggingCommon !insertmacro AddDDEHandlerValues !insertmacro ChangeMUIHeaderImage !insertmacro CheckForFilesInUse !insertmacro CleanUpdatesDir !insertmacro CopyFilesFromDir !insertmacro CreateRegKey !insertmacro GetPathFromString !insertmacro GetParent !insertmacro InitHashAppModelId !insertmacro IsHandlerForInstallDir !insertmacro IsPinnedToTaskBar !insertmacro LogDesktopShortcut !insertmacro LogQuickLaunchShortcut !insertmacro LogStartMenuShortcut !insertmacro ManualCloseAppPrompt !insertmacro PinnedToStartMenuLnkCount !insertmacro RegCleanAppHandler !insertmacro RegCleanMain !insertmacro RegCleanUninstall !insertmacro SetAppLSPCategories !insertmacro SetBrandNameVars !insertmacro UpdateShortcutAppModelIDs !insertmacro UnloadUAC !insertmacro WriteRegStr2 !insertmacro WriteRegDWORD2 !insertmacro CheckIfRegistryKeyExists !include shared.nsh ; Helper macros for ui callbacks. Insert these after shared.nsh !insertmacro CheckCustomCommon !insertmacro InstallEndCleanupCommon !insertmacro InstallOnInitCommon !insertmacro InstallStartCleanupCommon !insertmacro LeaveDirectoryCommon !insertmacro LeaveOptionsCommon !insertmacro OnEndCommon !insertmacro PreDirectoryCommon Name "${BrandFullName}" OutFile "setup.exe" !ifdef HAVE_64BIT_OS InstallDir "$PROGRAMFILES64\${CompanyName}\${BrandFullName}\" !else InstallDir "$PROGRAMFILES32\${CompanyName}\${BrandFullName}\" !endif ShowInstDetails nevershow ################################################################################ # Modern User Interface - MUI !define MOZ_MUI_CUSTOM_ABORT !define MUI_CUSTOMFUNCTION_ABORT "CustomAbort" !define MUI_ICON setup.ico !define MUI_UNICON setup.ico !define MUI_WELCOMEPAGE_TITLE_3LINES !define MUI_HEADERIMAGE !define MUI_HEADERIMAGE_RIGHT !define MUI_WELCOMEFINISHPAGE_BITMAP wizWatermark.bmp ; Use a right to left header image when the language is right to left !ifdef ${AB_CD}_rtl !define MUI_HEADERIMAGE_BITMAP_RTL wizHeaderRTL.bmp !else !define MUI_HEADERIMAGE_BITMAP wizHeader.bmp !endif /** * Installation Pages */ ; Welcome Page !define MUI_PAGE_CUSTOMFUNCTION_PRE preWelcome !insertmacro MUI_PAGE_WELCOME ; Custom Options Page Page custom preOptions leaveOptions ; Select Install Directory Page !define MUI_PAGE_CUSTOMFUNCTION_PRE preDirectory !define MUI_PAGE_CUSTOMFUNCTION_LEAVE leaveDirectory !define MUI_DIRECTORYPAGE_VERIFYONLEAVE !insertmacro MUI_PAGE_DIRECTORY ; Custom Shortcuts Page Page custom preShortcuts leaveShortcuts ; Custom Summary Page Page custom preSummary leaveSummary ; Install Files Page !insertmacro MUI_PAGE_INSTFILES ; Finish Page !define MUI_FINISHPAGE_TITLE_3LINES !define MUI_FINISHPAGE_RUN !define MUI_FINISHPAGE_RUN_FUNCTION LaunchApp !define MUI_FINISHPAGE_RUN_TEXT $(LAUNCH_TEXT) !define MUI_PAGE_CUSTOMFUNCTION_PRE preFinish !insertmacro MUI_PAGE_FINISH ; Use the default dialog for IDD_VERIFY for a simple Banner ChangeUI IDD_VERIFY "${NSISDIR}\Contrib\UIs\default.exe" ################################################################################ # Install Sections ; Cleanup operations to perform at the start of the installation. Section "-InstallStartCleanup" SetDetailsPrint both DetailPrint $(STATUS_CLEANUP) SetDetailsPrint none SetOutPath "$INSTDIR" ${StartInstallLog} "${BrandFullName}" "${AB_CD}" "${AppVersion}" "${GREVersion}" ; Delete the app exe to prevent launching the app while we are installing. ClearErrors ${DeleteFile} "$INSTDIR\${FileMainEXE}" ${If} ${Errors} ; If the user closed the application it can take several seconds for it to ; shut down completely. If the application is being used by another user we ; can rename the file and then delete is when the system is restarted. Sleep 5000 ${DeleteFile} "$INSTDIR\${FileMainEXE}" ClearErrors ${EndIf} ; Remove the updates directory for Vista and above ${CleanUpdatesDir} "${CompanyName}\${BrandFullName}" ${RemoveDeprecatedFiles} ${InstallStartCleanupCommon} SectionEnd Section "-Application" APP_IDX ${StartUninstallLog} SetDetailsPrint both DetailPrint $(STATUS_INSTALL_APP) SetDetailsPrint none ${LogHeader} "Installing Main Files" ${CopyFilesFromDir} "$EXEDIR\core" "$INSTDIR" \ "$(ERROR_CREATE_DIRECTORY_PREFIX)" \ "$(ERROR_CREATE_DIRECTORY_SUFFIX)" ; Register DLLs ; XXXrstrong - AccessibleMarshal.dll can be used by multiple applications but ; is only registered for the last application installed. When the last ; application installed is uninstalled AccessibleMarshal.dll will no longer be ; registered. bug 338878 ${LogHeader} "DLL Registration" ClearErrors ${RegisterDLL} "$INSTDIR\AccessibleMarshal.dll" ${If} ${Errors} ${LogMsg} "** ERROR Registering: $INSTDIR\AccessibleMarshal.dll **" ${Else} ${LogUninstall} "DLLReg: \AccessibleMarshal.dll" ${LogMsg} "Registered: $INSTDIR\AccessibleMarshal.dll" ${EndIf} ; Write extra files created by the application to the uninstall log so they ; will be removed when the application is uninstalled. To remove an empty ; directory write a bogus filename to the deepest directory and all empty ; parent directories will be removed. ${LogUninstall} "File: \components\compreg.dat" ${LogUninstall} "File: \components\xpti.dat" ${LogUninstall} "File: \active-update.xml" ${LogUninstall} "File: \install.log" ${LogUninstall} "File: \install_status.log" ${LogUninstall} "File: \install_wizard.log" ${LogUninstall} "File: \updates.xml" ClearErrors ; Default for creating Start Menu shortcut ; (1 = create, 0 = don't create) ${If} $AddStartMenuSC == "" StrCpy $AddStartMenuSC "1" ${EndIf} ; Default for creating Quick Launch shortcut (1 = create, 0 = don't create) ${If} $AddQuickLaunchSC == "" ; Don't install the quick launch shortcut on Windows 7 ${If} ${AtLeastWin7} StrCpy $AddQuickLaunchSC "0" ${Else} StrCpy $AddQuickLaunchSC "1" ${EndIf} ${EndIf} ; Default for creating Desktop shortcut (1 = create, 0 = don't create) ${If} $AddDesktopSC == "" StrCpy $AddDesktopSC "1" ${EndIf} ${LogHeader} "Adding Registry Entries" SetShellVarContext current ; Set SHCTX to HKCU ${RegCleanMain} "Software\${CompanyName}" ${RegCleanUninstall} ${UpdateProtocolHandlers} ClearErrors WriteRegStr HKLM "Software\${CompanyName}" "${BrandShortName}InstallerTest" "Write Test" ${If} ${Errors} StrCpy $TmpVal "HKCU" ; used primarily for logging ${Else} SetShellVarContext all ; Set SHCTX to HKLM DeleteRegValue HKLM "Software\${CompanyName}" "${BrandShortName}InstallerTest" StrCpy $TmpVal "HKLM" ; used primarily for logging ${RegCleanMain} "Software\${CompanyName}" ${RegCleanUninstall} ${UpdateProtocolHandlers} ReadRegStr $0 HKLM "Software\${CompanyName}" "CurrentVersion" ${If} "$0" != "${GREVersion}" WriteRegStr HKLM "Software\${CompanyName}" "CurrentVersion" "${GREVersion}" ${EndIf} ${EndIf} ; setup the application model id registration value ${InitHashAppModelId} "$INSTDIR" "Software\${CompanyName}\${AppName}\TaskBarIDs" ${RemoveDeprecatedKeys} ; The previous installer adds several regsitry values to both HKLM and HKCU. ; We now try to add to HKLM and if that fails to HKCU ; The order that reg keys and values are added is important if you use the ; uninstall log to remove them on uninstall. When using the uninstall log you ; MUST add children first so they will be removed first on uninstall so they ; will be empty when the key is deleted. This allows the uninstaller to ; specify that only empty keys will be deleted. ${SetAppKeys} ${FixClassKeys} ; Uninstall keys can only exist under HKLM on some versions of windows. Since ; it doesn't cause problems always add them. ${SetUninstallKeys} ; On install always add the BlueGriffonHTML and BlueGriffonURL keys. ; An empty string is used for the 5th param because BlueGriffonHTML and BlueGriffonURL ; are not protocol handlers. ${GetLongPath} "$INSTDIR\${FileMainEXE}" $8 StrCpy $2 "$\"$8$\" -requestPending -osint -url $\"%1$\"" StrCpy $3 "$\"%1$\",,0,0,,,," ${AddDDEHandlerValues} "BlueGriffonHTML" "$2" "$8,1" "${AppRegName} Document" "" \ "${DDEApplication}" "$3" "WWW_OpenURL" ${AddDDEHandlerValues} "BlueGriffonURL" "$2" "$8,1" "${AppRegName} URL" "true" \ "${DDEApplication}" "$3" "WWW_OpenURL" ; The following keys should only be set if we can write to HKLM ${If} $TmpVal == "HKLM" ; Set the Start Menu Internet and Vista Registered App HKLM registry keys. ${SetStartMenuInternet} ${FixShellIconHandler} ; If we are writing to HKLM and create either the desktop or start menu ; shortcuts set IconsVisible to 1 otherwise to 0. ${StrFilter} "${FileMainEXE}" "+" "" "" $R9 StrCpy $0 "Software\Clients\StartMenuInternet\$R9\InstallInfo" ${If} $AddDesktopSC == 1 ${OrIf} $AddStartMenuSC == 1 WriteRegDWORD HKLM "$0" "IconsVisible" 1 ${Else} WriteRegDWORD HKLM "$0" "IconsVisible" 0 ${EndIf} ${EndIf} ; These need special handling on uninstall since they may be overwritten by ; an install into a different location. StrCpy $0 "Software\Microsoft\Windows\CurrentVersion\App Paths\${FileMainEXE}" ${WriteRegStr2} $TmpVal "$0" "" "$INSTDIR\${FileMainEXE}" 0 ${WriteRegStr2} $TmpVal "$0" "Path" "$INSTDIR" 0 StrCpy $0 "Software\Microsoft\MediaPlayer\ShimInclusionList\$R9" ${CreateRegKey} "$TmpVal" "$0" 0 StrCpy $0 "Software\Microsoft\MediaPlayer\ShimInclusionList\plugin-container.exe" ${CreateRegKey} "$TmpVal" "$0" 0 ${If} $TmpVal == "HKLM" ; Set the permitted LSP Categories for WinVista and above ${SetAppLSPCategories} ${LSP_CATEGORIES} ${EndIf} ; Create shortcuts ${LogHeader} "Adding Shortcuts" ; Remove the start menu shortcuts and directory if the SMPROGRAMS section ; exists in the shortcuts_log.ini and the SMPROGRAMS. The installer's shortcut ; creation code will create the shortcut in the root of the Start Menu ; Programs directory. ${RemoveStartMenuDir} ; Always add the application's shortcuts to the shortcuts log ini file. The ; DeleteShortcuts macro will do the right thing on uninstall if the ; shortcuts don't exist. ${LogStartMenuShortcut} "${BrandFullName}.lnk" ${LogQuickLaunchShortcut} "${BrandFullName}.lnk" ${LogDesktopShortcut} "${BrandFullName}.lnk" ; Best effort to update the Win7 taskbar and start menu shortcut app model ; id's. The possible contexts are current user / system and the user that ; elevated the installer. Call FixShortcutAppModelIDs ; If the current context is all also perform Win7 taskbar and start menu link ; maintenance for the current user context. ${If} $TmpVal == "HKLM" SetShellVarContext current ; Set SHCTX to HKCU Call FixShortcutAppModelIDs SetShellVarContext all ; Set SHCTX to HKLM ${EndIf} ; If running elevated also perform Win7 taskbar and start menu link ; maintenance for the unelevated user context in case that is different than ; the current user. ClearErrors ${GetParameters} $0 ${GetOptions} "$0" "/UAC:" $0 ${Unless} ${Errors} GetFunctionAddress $0 FixShortcutAppModelIDs UAC::ExecCodeSegment $0 ${EndIf} ; UAC only allows elevating to an Admin account so there is no need to add ; the Start Menu or Desktop shortcuts from the original unelevated process ; since this will either add it for the user if unelevated or All Users if ; elevated. ${If} $AddStartMenuSC == 1 CreateShortCut "$SMPROGRAMS\${BrandFullName}.lnk" "$INSTDIR\${FileMainEXE}" ${If} ${FileExists} "$SMPROGRAMS\${BrandFullName}.lnk" ShellLink::SetShortCutWorkingDirectory "$SMPROGRAMS\${BrandFullName}.lnk" \ "$INSTDIR" ${If} ${AtLeastWin7} ${AndIf} "$AppUserModelID" != "" ApplicationID::Set "$SMPROGRAMS\${BrandFullName}.lnk" "$AppUserModelID" ${EndIf} ${LogMsg} "Added Shortcut: $SMPROGRAMS\${BrandFullName}.lnk" ${Else} ${LogMsg} "** ERROR Adding Shortcut: $SMPROGRAMS\${BrandFullName}.lnk" ${EndIf} ${EndIf} ${If} $AddDesktopSC == 1 CreateShortCut "$DESKTOP\${BrandFullName}.lnk" "$INSTDIR\${FileMainEXE}" ${If} ${FileExists} "$DESKTOP\${BrandFullName}.lnk" ShellLink::SetShortCutWorkingDirectory "$DESKTOP\${BrandFullName}.lnk" \ "$INSTDIR" ${If} ${AtLeastWin7} ${AndIf} "$AppUserModelID" != "" ApplicationID::Set "$DESKTOP\${BrandFullName}.lnk" "$AppUserModelID" ${EndIf} ${LogMsg} "Added Shortcut: $DESKTOP\${BrandFullName}.lnk" ${Else} ${LogMsg} "** ERROR Adding Shortcut: $DESKTOP\${BrandFullName}.lnk" ${EndIf} ${EndIf} ; If elevated the Quick Launch shortcut must be added from the unelevated ; original process. ${If} $AddQuickLaunchSC == 1 ${Unless} ${AtLeastWin7} ClearErrors ${GetParameters} $0 ${GetOptions} "$0" "/UAC:" $0 ${If} ${Errors} Call AddQuickLaunchShortcut ${LogMsg} "Added Shortcut: $QUICKLAUNCH\${BrandFullName}.lnk" ${Else} ; It is not possible to add a log entry from the unelevated process so ; add the log entry without the path since there is no simple way to ; know the correct full path. ${LogMsg} "Added Quick Launch Shortcut: ${BrandFullName}.lnk" GetFunctionAddress $0 AddQuickLaunchShortcut UAC::ExecCodeSegment $0 ${EndIf} ${EndUnless} ${EndIf} SectionEnd ; Cleanup operations to perform at the end of the installation. Section "-InstallEndCleanup" SetDetailsPrint both DetailPrint "$(STATUS_CLEANUP)" SetDetailsPrint none ${Unless} ${Silent} ${MUI_INSTALLOPTIONS_READ} $0 "summary.ini" "Field 4" "State" ${If} "$0" == "1" ${LogHeader} "Setting as the default editor" ClearErrors ${GetParameters} $0 ${GetOptions} "$0" "/UAC:" $0 ${If} ${Errors} Call SetAsDefaultAppUserHKCU ${Else} GetFunctionAddress $0 SetAsDefaultAppUserHKCU UAC::ExecCodeSegment $0 ${EndIf} ${EndIf} ${EndUnless} ; Adds a pinned Task Bar shortcut (see MigrateTaskBarShortcut for details). ${MigrateTaskBarShortcut} ${GetShortcutsLogPath} $0 WriteIniStr "$0" "TASKBAR" "Migrated" "true" ; Refresh desktop icons System::Call "shell32::SHChangeNotify(i 0x08000000, i 0, i 0, i 0)" ${InstallEndCleanupCommon} ${If} ${RebootFlag} ; When a reboot is required give SHChangeNotify time to finish the ; refreshing the icons so the OS doesn't display the icons from helper.exe Sleep 10000 ${LogHeader} "Reboot Required To Finish Installation" ; ${FileMainEXE}.moz-upgrade should never exist but just in case... ${Unless} ${FileExists} "$INSTDIR\${FileMainEXE}.moz-upgrade" Rename "$INSTDIR\${FileMainEXE}" "$INSTDIR\${FileMainEXE}.moz-upgrade" ${EndUnless} ${If} ${FileExists} "$INSTDIR\${FileMainEXE}" ClearErrors Rename "$INSTDIR\${FileMainEXE}" "$INSTDIR\${FileMainEXE}.moz-delete" ${Unless} ${Errors} Delete /REBOOTOK "$INSTDIR\${FileMainEXE}.moz-delete" ${EndUnless} ${EndIf} ${Unless} ${FileExists} "$INSTDIR\${FileMainEXE}" CopyFiles /SILENT "$INSTDIR\uninstall\helper.exe" "$INSTDIR" FileOpen $0 "$INSTDIR\${FileMainEXE}" w FileWrite $0 "Will be deleted on restart" Rename /REBOOTOK "$INSTDIR\${FileMainEXE}.moz-upgrade" "$INSTDIR\${FileMainEXE}" FileClose $0 Delete "$INSTDIR\${FileMainEXE}" Rename "$INSTDIR\helper.exe" "$INSTDIR\${FileMainEXE}" ${EndUnless} ${EndIf} SectionEnd ################################################################################ # Install Abort Survey Functions Function CustomAbort ${If} "${AB_CD}" == "en-US" ${AndIf} "$PageName" != "" ${AndIf} ${FileExists} "$EXEDIR\core\distribution\distribution.ini" ReadINIStr $0 "$EXEDIR\core\distribution\distribution.ini" "Global" "about" ClearErrors ${WordFind} "$0" "Funnelcake" "E#" $1 ${Unless} ${Errors} ; Yes = fill out the survey and exit, No = don't fill out survey and exit, ; Cancel = don't exit. MessageBox MB_YESNO|MB_ICONEXCLAMATION \ "Would you like to tell us why you are canceling this installation?" \ IDYes +1 IDNO CustomAbort_finish ${If} "$PageName" == "Welcome" GetFunctionAddress $0 AbortSurveyWelcome ${ElseIf} "$PageName" == "Options" GetFunctionAddress $0 AbortSurveyOptions ${ElseIf} "$PageName" == "Directory" GetFunctionAddress $0 AbortSurveyDirectory ${ElseIf} "$PageName" == "Shortcuts" GetFunctionAddress $0 AbortSurveyShortcuts ${ElseIf} "$PageName" == "Summary" GetFunctionAddress $0 AbortSurveySummary ${EndIf} ClearErrors ${GetParameters} $1 ${GetOptions} "$1" "/UAC:" $2 ${If} ${Errors} Call $0 ${Else} UAC::ExecCodeSegment $0 ${EndIf} CustomAbort_finish: Return ${EndUnless} ${EndIf} MessageBox MB_YESNO|MB_ICONEXCLAMATION "$(MOZ_MUI_TEXT_ABORTWARNING)" \ IDYES +1 IDNO +2 Return Abort FunctionEnd Function AbortSurveyWelcome ExecShell "open" "${AbortSurveyURL}step1" FunctionEnd Function AbortSurveyOptions ExecShell "open" "${AbortSurveyURL}step2" FunctionEnd Function AbortSurveyDirectory ExecShell "open" "${AbortSurveyURL}step3" FunctionEnd Function AbortSurveyShortcuts ExecShell "open" "${AbortSurveyURL}step4" FunctionEnd Function AbortSurveySummary ExecShell "open" "${AbortSurveyURL}step5" FunctionEnd ################################################################################ # Helper Functions Function AddQuickLaunchShortcut CreateShortCut "$QUICKLAUNCH\${BrandFullName}.lnk" "$INSTDIR\${FileMainEXE}" ${If} ${FileExists} "$QUICKLAUNCH\${BrandFullName}.lnk" ShellLink::SetShortCutWorkingDirectory "$QUICKLAUNCH\${BrandFullName}.lnk" \ "$INSTDIR" ${EndIf} FunctionEnd Function CheckExistingInstall ; If there is a pending file copy from a previous upgrade don't allow ; installing until after the system has rebooted. IfFileExists "$INSTDIR\${FileMainEXE}.moz-upgrade" +1 +4 MessageBox MB_YESNO|MB_ICONEXCLAMATION "$(WARN_RESTART_REQUIRED_UPGRADE)" IDNO +2 Reboot Quit ; If there is a pending file deletion from a previous uninstall don't allow ; installing until after the system has rebooted. IfFileExists "$INSTDIR\${FileMainEXE}.moz-delete" +1 +4 MessageBox MB_YESNO|MB_ICONEXCLAMATION "$(WARN_RESTART_REQUIRED_UNINSTALL)" IDNO +2 Reboot Quit ${If} ${FileExists} "$INSTDIR\${FileMainEXE}" ; Disable the next, cancel, and back buttons GetDlgItem $0 $HWNDPARENT 1 ; Next button EnableWindow $0 0 GetDlgItem $0 $HWNDPARENT 2 ; Cancel button EnableWindow $0 0 GetDlgItem $0 $HWNDPARENT 3 ; Back button EnableWindow $0 0 Banner::show /NOUNLOAD "$(BANNER_CHECK_EXISTING)" ${If} "$TmpVal" == "FoundMessageWindow" Sleep 5000 ${EndIf} ${PushFilesToCheck} ; Store the return value in $TmpVal so it is less likely to be accidentally ; overwritten elsewhere. ${CheckForFilesInUse} $TmpVal Banner::destroy ; Enable the next, cancel, and back buttons GetDlgItem $0 $HWNDPARENT 1 ; Next button EnableWindow $0 1 GetDlgItem $0 $HWNDPARENT 2 ; Cancel button EnableWindow $0 1 GetDlgItem $0 $HWNDPARENT 3 ; Back button EnableWindow $0 1 ${If} "$TmpVal" == "true" StrCpy $TmpVal "FoundMessageWindow" ${ManualCloseAppPrompt} "${WindowClass}" "$(WARN_MANUALLY_CLOSE_APP_INSTALL)" StrCpy $TmpVal "true" ${EndIf} ${EndIf} FunctionEnd Function LaunchApp ClearErrors ${GetParameters} $0 ${GetOptions} "$0" "/UAC:" $1 ${If} ${Errors} ${ManualCloseAppPrompt} "${WindowClass}" "$(WARN_MANUALLY_CLOSE_APP_LAUNCH)" Exec "$INSTDIR\${FileMainEXE}" ${Else} GetFunctionAddress $0 LaunchAppFromElevatedProcess UAC::ExecCodeSegment $0 ${EndIf} FunctionEnd Function LaunchAppFromElevatedProcess ${ManualCloseAppPrompt} "${WindowClass}" "$(WARN_MANUALLY_CLOSE_APP_LAUNCH)" ; Find the installation directory when launching using GetFunctionAddress ; from an elevated installer since $INSTDIR will not be set in this installer ${StrFilter} "${FileMainEXE}" "+" "" "" $R9 ReadRegStr $0 HKLM "Software\Clients\StartMenuInternet\$R9\DefaultIcon" "" ${GetPathFromString} "$0" $0 ${GetParent} "$0" $1 ; Set our current working directory to the application's install directory ; otherwise the 7-Zip temp directory will be in use and won't be deleted. SetOutPath "$1" Exec "$0" FunctionEnd ################################################################################ # Language !insertmacro MOZ_MUI_LANGUAGE 'baseLocale' !verbose push !verbose 3 !include "overrideLocale.nsh" !include "customLocale.nsh" !verbose pop ; Set this after the locale files to override it if it is in the locale ; using " " for BrandingText will hide the "Nullsoft Install System..." branding BrandingText " " ################################################################################ # Page pre, show, and leave functions Function preWelcome StrCpy $PageName "Welcome" ${If} ${FileExists} "$EXEDIR\core\distribution\modern-wizard.bmp" Delete "$PLUGINSDIR\modern-wizard.bmp" CopyFiles /SILENT "$EXEDIR\core\distribution\modern-wizard.bmp" "$PLUGINSDIR\modern-wizard.bmp" ${EndIf} FunctionEnd Function preOptions StrCpy $PageName "Options" ${If} ${FileExists} "$EXEDIR\core\distribution\modern-header.bmp" ${AndIf} $hHeaderBitmap == "" Delete "$PLUGINSDIR\modern-header.bmp" CopyFiles /SILENT "$EXEDIR\core\distribution\modern-header.bmp" "$PLUGINSDIR\modern-header.bmp" ${ChangeMUIHeaderImage} "$PLUGINSDIR\modern-header.bmp" ${EndIf} !insertmacro MUI_HEADER_TEXT "$(OPTIONS_PAGE_TITLE)" "$(OPTIONS_PAGE_SUBTITLE)" !insertmacro MUI_INSTALLOPTIONS_DISPLAY "options.ini" FunctionEnd Function leaveOptions ${MUI_INSTALLOPTIONS_READ} $0 "options.ini" "Settings" "State" ${If} $0 != 0 Abort ${EndIf} ${MUI_INSTALLOPTIONS_READ} $R0 "options.ini" "Field 2" "State" StrCmp $R0 "1" +1 +2 StrCpy $InstallType ${INSTALLTYPE_BASIC} ${MUI_INSTALLOPTIONS_READ} $R0 "options.ini" "Field 3" "State" StrCmp $R0 "1" +1 +2 StrCpy $InstallType ${INSTALLTYPE_CUSTOM} ${LeaveOptionsCommon} ${If} $InstallType == ${INSTALLTYPE_BASIC} Call CheckExistingInstall ${EndIf} FunctionEnd Function preDirectory StrCpy $PageName "Directory" ${PreDirectoryCommon} FunctionEnd Function leaveDirectory ${If} $InstallType == ${INSTALLTYPE_BASIC} Call CheckExistingInstall ${EndIf} ${LeaveDirectoryCommon} "$(WARN_DISK_SPACE)" "$(WARN_WRITE_ACCESS)" FunctionEnd Function preShortcuts StrCpy $PageName "Shortcuts" ${CheckCustomCommon} !insertmacro MUI_HEADER_TEXT "$(SHORTCUTS_PAGE_TITLE)" "$(SHORTCUTS_PAGE_SUBTITLE)" !insertmacro MUI_INSTALLOPTIONS_DISPLAY "shortcuts.ini" FunctionEnd Function leaveShortcuts ${MUI_INSTALLOPTIONS_READ} $0 "shortcuts.ini" "Settings" "State" ${If} $0 != 0 Abort ${EndIf} ${MUI_INSTALLOPTIONS_READ} $AddDesktopSC "shortcuts.ini" "Field 2" "State" ${MUI_INSTALLOPTIONS_READ} $AddStartMenuSC "shortcuts.ini" "Field 3" "State" ; Don't install the quick launch shortcut on Windows 7 ${Unless} ${AtLeastWin7} ${MUI_INSTALLOPTIONS_READ} $AddQuickLaunchSC "shortcuts.ini" "Field 4" "State" ${EndUnless} ${If} $InstallType == ${INSTALLTYPE_CUSTOM} Call CheckExistingInstall ${EndIf} FunctionEnd Function preSummary StrCpy $PageName "Summary" ; Setup the summary.ini file for the Custom Summary Page WriteINIStr "$PLUGINSDIR\summary.ini" "Settings" NumFields "3" WriteINIStr "$PLUGINSDIR\summary.ini" "Field 1" Type "label" WriteINIStr "$PLUGINSDIR\summary.ini" "Field 1" Text "$(SUMMARY_INSTALLED_TO)" WriteINIStr "$PLUGINSDIR\summary.ini" "Field 1" Left "0" WriteINIStr "$PLUGINSDIR\summary.ini" "Field 1" Right "-1" WriteINIStr "$PLUGINSDIR\summary.ini" "Field 1" Top "5" WriteINIStr "$PLUGINSDIR\summary.ini" "Field 1" Bottom "15" WriteINIStr "$PLUGINSDIR\summary.ini" "Field 2" Type "text" ; The contents of this control must be set as follows in the pre function ; ${MUI_INSTALLOPTIONS_READ} $1 "summary.ini" "Field 2" "HWND" ; SendMessage $1 ${WM_SETTEXT} 0 "STR:$INSTDIR" WriteINIStr "$PLUGINSDIR\summary.ini" "Field 2" state "" WriteINIStr "$PLUGINSDIR\summary.ini" "Field 2" Left "0" WriteINIStr "$PLUGINSDIR\summary.ini" "Field 2" Right "-1" WriteINIStr "$PLUGINSDIR\summary.ini" "Field 2" Top "17" WriteINIStr "$PLUGINSDIR\summary.ini" "Field 2" Bottom "30" WriteINIStr "$PLUGINSDIR\summary.ini" "Field 2" flags "READONLY" WriteINIStr "$PLUGINSDIR\summary.ini" "Field 3" Type "label" WriteINIStr "$PLUGINSDIR\summary.ini" "Field 3" Left "0" WriteINIStr "$PLUGINSDIR\summary.ini" "Field 3" Right "-1" WriteINIStr "$PLUGINSDIR\summary.ini" "Field 3" Top "130" WriteINIStr "$PLUGINSDIR\summary.ini" "Field 3" Bottom "150" ${If} ${FileExists} "$INSTDIR\${FileMainEXE}" WriteINIStr "$PLUGINSDIR\summary.ini" "Field 3" Text "$(SUMMARY_UPGRADE_CLICK)" WriteINIStr "$PLUGINSDIR\summary.ini" "Settings" NextButtonText "$(UPGRADE_BUTTON)" ${Else} WriteINIStr "$PLUGINSDIR\summary.ini" "Field 3" Text "$(SUMMARY_INSTALL_CLICK)" DeleteINIStr "$PLUGINSDIR\summary.ini" "Settings" NextButtonText ${EndIf} ; Remove the "Field 4" ini section in case the user hits back and changes the ; installation directory which could change whether the make default checkbox ; should be displayed. DeleteINISec "$PLUGINSDIR\summary.ini" "Field 4" ; Check if it is possible to write to HKLM ClearErrors WriteRegStr HKLM "Software\${CompanyName}" "${BrandShortName}InstallerTest" "Write Test" ${Unless} ${Errors} DeleteRegValue HKLM "Software\${CompanyName}" "${BrandShortName}InstallerTest" ; Check if BlueGriffon is the http handler for this user. SetShellVarContext current ; Set SHCTX to the current user ${IsHandlerForInstallDir} "http" $R9 ${If} $TmpVal == "HKLM" SetShellVarContext all ; Set SHCTX to all users ${EndIf} ; If BlueGriffon isn't the http handler for this user show the option to set ; BlueGriffon as the default browser. ;${If} "$R9" != "true" ; WriteINIStr "$PLUGINSDIR\summary.ini" "Settings" NumFields "4" ; WriteINIStr "$PLUGINSDIR\summary.ini" "Field 4" Type "checkbox" ; WriteINIStr "$PLUGINSDIR\summary.ini" "Field 4" Text "$(SUMMARY_TAKE_DEFAULTS)" ; WriteINIStr "$PLUGINSDIR\summary.ini" "Field 4" Left "0" ; WriteINIStr "$PLUGINSDIR\summary.ini" "Field 4" Right "-1" ; WriteINIStr "$PLUGINSDIR\summary.ini" "Field 4" State "1" ; WriteINIStr "$PLUGINSDIR\summary.ini" "Field 4" Top "32" ; WriteINIStr "$PLUGINSDIR\summary.ini" "Field 4" Bottom "53" ;${EndIf} ${EndUnless} ${If} "$TmpVal" == "true" ; If there is already a Type entry in the "Field 4" section with a value of ; checkbox then the set as the default browser checkbox is displayed and ; this text must be moved below it. ReadINIStr $0 "$PLUGINSDIR\summary.ini" "Field 4" "Type" ${If} "$0" == "checkbox" StrCpy $0 "5" WriteINIStr "$PLUGINSDIR\summary.ini" "Field $0" Top "53" WriteINIStr "$PLUGINSDIR\summary.ini" "Field $0" Bottom "68" ${Else} StrCpy $0 "4" WriteINIStr "$PLUGINSDIR\summary.ini" "Field $0" Top "35" WriteINIStr "$PLUGINSDIR\summary.ini" "Field $0" Bottom "50" ${EndIf} WriteINIStr "$PLUGINSDIR\summary.ini" "Settings" NumFields "$0" WriteINIStr "$PLUGINSDIR\summary.ini" "Field $0" Type "label" WriteINIStr "$PLUGINSDIR\summary.ini" "Field $0" Text "$(SUMMARY_REBOOT_REQUIRED_INSTALL)" WriteINIStr "$PLUGINSDIR\summary.ini" "Field $0" Left "0" WriteINIStr "$PLUGINSDIR\summary.ini" "Field $0" Right "-1" ${EndIf} !insertmacro MUI_HEADER_TEXT "$(SUMMARY_PAGE_TITLE)" "$(SUMMARY_PAGE_SUBTITLE)" ; The Summary custom page has a textbox that will automatically receive ; focus. This sets the focus to the Install button instead. !insertmacro MUI_INSTALLOPTIONS_INITDIALOG "summary.ini" GetDlgItem $0 $HWNDPARENT 1 System::Call "user32::SetFocus(i r0, i 0x0007, i,i)i" ${MUI_INSTALLOPTIONS_READ} $1 "summary.ini" "Field 2" "HWND" SendMessage $1 ${WM_SETTEXT} 0 "STR:$INSTDIR" !insertmacro MUI_INSTALLOPTIONS_SHOW FunctionEnd Function leaveSummary ; Try to delete the app executable and if we can't delete it try to find the ; app's message window and prompt the user to close the app. This allows ; running an instance that is located in another directory. If for whatever ; reason there is no message window we will just rename the app's files and ; then remove them on restart. ClearErrors ${DeleteFile} "$INSTDIR\${FileMainEXE}" ${If} ${Errors} ${ManualCloseAppPrompt} "${WindowClass}" "$(WARN_MANUALLY_CLOSE_APP_INSTALL)" ${EndIf} FunctionEnd ; When we add an optional action to the finish page the cancel button is ; enabled. This disables it and leaves the finish button as the only choice. Function preFinish StrCpy $PageName "" ${EndInstallLog} "${BrandFullName}" !insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "settings" "cancelenabled" "0" FunctionEnd ################################################################################ # Initialization Functions Function .onInit StrCpy $PageName "" StrCpy $LANGUAGE 0 ${SetBrandNameVars} "$EXEDIR\core\distribution\setup.ini" ${InstallOnInitCommon} "$(WARN_MIN_SUPPORTED_OS_MSG)" !insertmacro InitInstallOptionsFile "options.ini" !insertmacro InitInstallOptionsFile "shortcuts.ini" !insertmacro InitInstallOptionsFile "summary.ini" WriteINIStr "$PLUGINSDIR\options.ini" "Settings" NumFields "5" WriteINIStr "$PLUGINSDIR\options.ini" "Field 1" Type "label" WriteINIStr "$PLUGINSDIR\options.ini" "Field 1" Text "$(OPTIONS_SUMMARY)" WriteINIStr "$PLUGINSDIR\options.ini" "Field 1" Left "0" WriteINIStr "$PLUGINSDIR\options.ini" "Field 1" Right "-1" WriteINIStr "$PLUGINSDIR\options.ini" "Field 1" Top "0" WriteINIStr "$PLUGINSDIR\options.ini" "Field 1" Bottom "10" WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Type "RadioButton" WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Text "$(OPTION_STANDARD_RADIO)" WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Left "15" WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Right "-1" WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Top "25" WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Bottom "35" WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" State "1" WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Flags "GROUP" WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" Type "RadioButton" WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" Text "$(OPTION_CUSTOM_RADIO)" WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" Left "15" WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" Right "-1" WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" Top "55" WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" Bottom "65" WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" State "0" WriteINIStr "$PLUGINSDIR\options.ini" "Field 4" Type "label" WriteINIStr "$PLUGINSDIR\options.ini" "Field 4" Text "$(OPTION_STANDARD_DESC)" WriteINIStr "$PLUGINSDIR\options.ini" "Field 4" Left "30" WriteINIStr "$PLUGINSDIR\options.ini" "Field 4" Right "-1" WriteINIStr "$PLUGINSDIR\options.ini" "Field 4" Top "37" WriteINIStr "$PLUGINSDIR\options.ini" "Field 4" Bottom "57" WriteINIStr "$PLUGINSDIR\options.ini" "Field 5" Type "label" WriteINIStr "$PLUGINSDIR\options.ini" "Field 5" Text "$(OPTION_CUSTOM_DESC)" WriteINIStr "$PLUGINSDIR\options.ini" "Field 5" Left "30" WriteINIStr "$PLUGINSDIR\options.ini" "Field 5" Right "-1" WriteINIStr "$PLUGINSDIR\options.ini" "Field 5" Top "67" WriteINIStr "$PLUGINSDIR\options.ini" "Field 5" Bottom "87" ; Setup the shortcuts.ini file for the Custom Shortcuts Page ; Don't offer to install the quick launch shortcut on Windows 7 ${If} ${AtLeastWin7} WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Settings" NumFields "3" ${Else} WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Settings" NumFields "4" ${EndIf} WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 1" Type "label" WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 1" Text "$(CREATE_ICONS_DESC)" WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 1" Left "0" WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 1" Right "-1" WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 1" Top "5" WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 1" Bottom "15" WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 2" Type "checkbox" WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 2" Text "$(ICONS_DESKTOP)" WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 2" Left "15" WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 2" Right "-1" WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 2" Top "20" WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 2" Bottom "30" WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 2" State "1" WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 2" Flags "GROUP" WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 3" Type "checkbox" WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 3" Text "$(ICONS_STARTMENU)" WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 3" Left "15" WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 3" Right "-1" WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 3" Top "40" WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 3" Bottom "50" WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 3" State "1" ; Don't offer to install the quick launch shortcut on Windows 7 ${Unless} ${AtLeastWin7} WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 4" Type "checkbox" WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 4" Text "$(ICONS_QUICKLAUNCH)" WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 4" Left "15" WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 4" Right "-1" WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 4" Top "60" WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 4" Bottom "70" WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 4" State "1" ${EndUnless} ; There must always be a core directory. ${GetSize} "$EXEDIR\core\" "/S=0K" $R5 $R7 $R8 SectionSetSize ${APP_IDX} $R5 ; Initialize $hHeaderBitmap to prevent redundant changing of the bitmap if ; the user clicks the back button StrCpy $hHeaderBitmap "" FunctionEnd Function .onGUIEnd ${OnEndCommon} FunctionEnd ================================================ FILE: installer/windows/nsis/shared.nsh ================================================ # ***** BEGIN LICENSE BLOCK ***** # Version: MPL 1.1/GPL 2.0/LGPL 2.1 # # The contents of this file are subject to the Mozilla Public License Version # 1.1 (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. # # The Original Code is the Mozilla Installer code. # # The Initial Developer of the Original Code is Mozilla Foundation # Portions created by the Initial Developer are Copyright (C) 2006 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Robert Strong <robert.bugzilla@gmail.com> # # Alternatively, the contents of this file may be used under the terms of # either the GNU General Public License Version 2 or later (the "GPL"), or # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), # in which case the provisions of the GPL or the LGPL are applicable instead # of those above. If you wish to allow use of your version of this file only # under the terms of either the GPL or the LGPL, and not to allow others to # use your version of this file under the terms of the MPL, indicate your # decision by deleting the provisions above and replace them with the notice # and other provisions required by the GPL or the LGPL. If you do not delete # the provisions above, a recipient may use your version of this file under # the terms of any one of the MPL, the GPL or the LGPL. # # ***** END LICENSE BLOCK ***** !macro PostUpdate ${CreateShortcutsLog} ; Remove registry entries for non-existent apps and for apps that point to our ; install location in the Software\${CompanyName} key and uninstall registry entries ; that point to our install location for both HKCU and HKLM. SetShellVarContext current ; Set SHCTX to the current user (e.g. HKCU) ${RegCleanMain} "Software\${CompanyName}" ${RegCleanUninstall} ${UpdateProtocolHandlers} ; setup the application model id registration value ${InitHashAppModelId} "$INSTDIR" "Software\${CompanyName}\${AppName}\TaskBarIDs" ; Win7 taskbar and start menu link maintenance Call FixShortcutAppModelIDs ClearErrors WriteRegStr HKLM "Software\${CompanyName}" "${BrandShortName}InstallerTest" "Write Test" ${If} ${Errors} StrCpy $TmpVal "HKCU" ; used primarily for logging ${Else} SetShellVarContext all ; Set SHCTX to all users (e.g. HKLM) DeleteRegValue HKLM "Software\${CompanyName}" "${BrandShortName}InstallerTest" StrCpy $TmpVal "HKLM" ; used primarily for logging ${RegCleanMain} "Software\${CompanyName}" ${RegCleanUninstall} ${UpdateProtocolHandlers} ${FixShellIconHandler} ${SetAppLSPCategories} ${LSP_CATEGORIES} ; Win7 taskbar and start menu link maintenance Call FixShortcutAppModelIDs ; Only update the Clients\StartMenuInternet registry key values if they ; don't exist or this installation is the same as the one set in those keys. ${StrFilter} "${FileMainEXE}" "+" "" "" $1 ReadRegStr $0 HKLM "Software\Clients\StartMenuInternet\$1\DefaultIcon" "" ${GetPathFromString} "$0" $0 ${GetParent} "$0" $0 ${If} ${FileExists} "$0" ${GetLongPath} "$0" $0 ${EndIf} ${If} "$0" == "$INSTDIR" ${SetStartMenuInternet} ${EndIf} ReadRegStr $0 HKLM "Software\${CompanyName}" "CurrentVersion" ${If} "$0" != "${GREVersion}" WriteRegStr HKLM "Software\${CompanyName}" "CurrentVersion" "${GREVersion}" ${EndIf} ${EndIf} ; Migrate the application's Start Menu directory to a single shortcut in the ; root of the Start Menu Programs directory. ${MigrateStartMenuShortcut} ; Adds a pinned Task Bar shortcut (see MigrateTaskBarShortcut for details). ${MigrateTaskBarShortcut} ${RemoveDeprecatedKeys} ${SetAppKeys} ${FixClassKeys} ${SetUninstallKeys} ; Remove files that may be left behind by the application in the ; VirtualStore directory. ${CleanVirtualStore} ${RemoveDeprecatedFiles} !macroend !define PostUpdate "!insertmacro PostUpdate" !macro SetAsDefaultAppGlobal ${RemoveDeprecatedKeys} SetShellVarContext all ; Set SHCTX to all users (e.g. HKLM) ${SetHandlers} ${SetStartMenuInternet} ${FixShellIconHandler} ${ShowShortcuts} ${StrFilter} "${FileMainEXE}" "+" "" "" $R9 WriteRegStr HKLM "Software\Clients\StartMenuInternet" "" "$R9" !macroend !define SetAsDefaultAppGlobal "!insertmacro SetAsDefaultAppGlobal" ; Removes shortcuts for this installation. This should also remove the ; application from Open With for the file types the application handles ; (bug 370480). !macro HideShortcuts ${StrFilter} "${FileMainEXE}" "+" "" "" $0 StrCpy $R1 "Software\Clients\StartMenuInternet\$0\InstallInfo" WriteRegDWORD HKLM "$R1" "IconsVisible" 0 SetShellVarContext all ; Set $DESKTOP to All Users ${Unless} ${FileExists} "$DESKTOP\${BrandFullName}.lnk" SetShellVarContext current ; Set $DESKTOP to the current user's desktop ${EndUnless} ${If} ${FileExists} "$DESKTOP\${BrandFullName}.lnk" ShellLink::GetShortCutArgs "$DESKTOP\${BrandFullName}.lnk" Pop $0 ${If} "$0" == "" ShellLink::GetShortCutTarget "$DESKTOP\${BrandFullName}.lnk" Pop $0 ${GetLongPath} "$0" $0 ${If} "$0" == "$INSTDIR\${FileMainEXE}" Delete "$DESKTOP\${BrandFullName}.lnk" ${EndIf} ${EndIf} ${EndIf} SetShellVarContext all ; Set $SMPROGRAMS to All Users ${Unless} ${FileExists} "$SMPROGRAMS\${BrandFullName}.lnk" SetShellVarContext current ; Set $SMPROGRAMS to the current user's Start ; Menu Programs directory ${EndUnless} ${If} ${FileExists} "$SMPROGRAMS\${BrandFullName}.lnk" ShellLink::GetShortCutArgs "$SMPROGRAMS\${BrandFullName}.lnk" Pop $0 ${If} "$0" == "" ShellLink::GetShortCutTarget "$SMPROGRAMS\${BrandFullName}.lnk" Pop $0 ${GetLongPath} "$0" $0 ${If} "$0" == "$INSTDIR\${FileMainEXE}" Delete "$SMPROGRAMS\${BrandFullName}.lnk" ${EndIf} ${EndIf} ${EndIf} ${If} ${FileExists} "$QUICKLAUNCH\${BrandFullName}.lnk" ShellLink::GetShortCutArgs "$QUICKLAUNCH\${BrandFullName}.lnk" Pop $0 ${If} "$0" == "" ShellLink::GetShortCutTarget "$QUICKLAUNCH\${BrandFullName}.lnk" Pop $0 ${GetLongPath} "$0" $0 ${If} "$0" == "$INSTDIR\${FileMainEXE}" Delete "$QUICKLAUNCH\${BrandFullName}.lnk" ${EndIf} ${EndIf} ${EndIf} !macroend !define HideShortcuts "!insertmacro HideShortcuts" ; Adds shortcuts for this installation. This should also add the application ; to Open With for the file types the application handles (bug 370480). !macro ShowShortcuts ${StrFilter} "${FileMainEXE}" "+" "" "" $0 StrCpy $R1 "Software\Clients\StartMenuInternet\$0\InstallInfo" WriteRegDWORD HKLM "$R1" "IconsVisible" 1 SetShellVarContext all ; Set $DESKTOP to All Users ${Unless} ${FileExists} "$DESKTOP\${BrandFullName}.lnk" CreateShortCut "$DESKTOP\${BrandFullName}.lnk" "$INSTDIR\${FileMainEXE}" ${If} ${FileExists} "$DESKTOP\${BrandFullName}.lnk" ShellLink::SetShortCutWorkingDirectory "$DESKTOP\${BrandFullName}.lnk" "$INSTDIR" ${If} ${AtLeastWin7} ${AndIf} "$AppUserModelID" != "" ApplicationID::Set "$DESKTOP\${BrandFullName}.lnk" "$AppUserModelID" ${EndIf} ${Else} SetShellVarContext current ; Set $DESKTOP to the current user's desktop ${Unless} ${FileExists} "$DESKTOP\${BrandFullName}.lnk" CreateShortCut "$DESKTOP\${BrandFullName}.lnk" "$INSTDIR\${FileMainEXE}" ${If} ${FileExists} "$DESKTOP\${BrandFullName}.lnk" ShellLink::SetShortCutWorkingDirectory "$DESKTOP\${BrandFullName}.lnk" \ "$INSTDIR" ${If} ${AtLeastWin7} ${AndIf} "$AppUserModelID" != "" ApplicationID::Set "$DESKTOP\${BrandFullName}.lnk" "$AppUserModelID" ${EndIf} ${EndIf} ${EndUnless} ${EndIf} ${EndUnless} SetShellVarContext all ; Set $SMPROGRAMS to All Users ${Unless} ${FileExists} "$SMPROGRAMS\${BrandFullName}.lnk" CreateShortCut "$SMPROGRAMS\${BrandFullName}.lnk" "$INSTDIR\${FileMainEXE}" ${If} ${FileExists} "$SMPROGRAMS\${BrandFullName}.lnk" ShellLink::SetShortCutWorkingDirectory "$SMPROGRAMS\${BrandFullName}.lnk" \ "$INSTDIR" ${If} ${AtLeastWin7} ${AndIf} "$AppUserModelID" != "" ApplicationID::Set "$SMPROGRAMS\${BrandFullName}.lnk" "$AppUserModelID" ${EndIf} ${Else} SetShellVarContext current ; Set $SMPROGRAMS to the current user's Start ; Menu Programs directory ${Unless} ${FileExists} "$SMPROGRAMS\${BrandFullName}.lnk" CreateShortCut "$SMPROGRAMS\${BrandFullName}.lnk" "$INSTDIR\${FileMainEXE}" ${If} ${FileExists} "$SMPROGRAMS\${BrandFullName}.lnk" ShellLink::SetShortCutWorkingDirectory "$SMPROGRAMS\${BrandFullName}.lnk" \ "$INSTDIR" ${If} ${AtLeastWin7} ${AndIf} "$AppUserModelID" != "" ApplicationID::Set "$SMPROGRAMS\${BrandFullName}.lnk" "$AppUserModelID" ${EndIf} ${EndIf} ${EndUnless} ${EndIf} ${EndUnless} ; Windows 7 doesn't use the QuickLaunch directory ${Unless} ${AtLeastWin7} ${AndUnless} ${FileExists} "$QUICKLAUNCH\${BrandFullName}.lnk" CreateShortCut "$QUICKLAUNCH\${BrandFullName}.lnk" \ "$INSTDIR\${FileMainEXE}" ${If} ${FileExists} "$QUICKLAUNCH\${BrandFullName}.lnk" ShellLink::SetShortCutWorkingDirectory "$QUICKLAUNCH\${BrandFullName}.lnk" \ "$INSTDIR" ${EndIf} ${EndUnless} !macroend !define ShowShortcuts "!insertmacro ShowShortcuts" ; Adds the protocol and file handler registry entries for making BlueGriffon the ; default handler (uses SHCTX). !macro SetHandlers ${GetLongPath} "$INSTDIR\${FileMainEXE}" $8 StrCpy $0 "SOFTWARE\Classes" StrCpy $2 "$\"$8$\" -requestPending -osint -url $\"%1$\"" ; Associate the file handlers with BlueGriffonHTML ReadRegStr $6 SHCTX "$0\.htm" "" ${If} "$6" != "BlueGriffonHTML" WriteRegStr SHCTX "$0\.htm" "" "BlueGriffonHTML" ${EndIf} ReadRegStr $6 SHCTX "$0\.html" "" ${If} "$6" != "BlueGriffonHTML" WriteRegStr SHCTX "$0\.html" "" "BlueGriffonHTML" ${EndIf} ReadRegStr $6 SHCTX "$0\.shtml" "" ${If} "$6" != "BlueGriffonHTML" WriteRegStr SHCTX "$0\.shtml" "" "BlueGriffonHTML" ${EndIf} ReadRegStr $6 SHCTX "$0\.xht" "" ${If} "$6" != "BlueGriffonHTML" WriteRegStr SHCTX "$0\.xht" "" "BlueGriffonHTML" ${EndIf} ReadRegStr $6 SHCTX "$0\.xhtml" "" ${If} "$6" != "BlueGriffonHTML" WriteRegStr SHCTX "$0\.xhtml" "" "BlueGriffonHTML" ${EndIf} ; Only add webm if it's not present ${CheckIfRegistryKeyExists} "$0" ".webm" $7 ${If} $7 == "false" WriteRegStr SHCTX "$0\.webm" "" "BlueGriffonHTML" ${EndIf} StrCpy $3 "$\"%1$\",,0,0,,,," ; An empty string is used for the 5th param because BlueGriffonHTML is not a ; protocol handler ${AddDDEHandlerValues} "BlueGriffonHTML" "$2" "$8,1" "${AppRegName} HTML Document" "" \ "${DDEApplication}" "$3" "WWW_OpenURL" ${AddDDEHandlerValues} "BlueGriffonURL" "$2" "$8,1" "${AppRegName} URL" "true" \ "${DDEApplication}" "$3" "WWW_OpenURL" ; An empty string is used for the 4th & 5th params because the following ; protocol handlers already have a display name and the additional keys ; required for a protocol handler. ${AddDDEHandlerValues} "ftp" "$2" "$8,1" "" "" \ "${DDEApplication}" "$3" "WWW_OpenURL" ${AddDDEHandlerValues} "http" "$2" "$8,1" "" "" \ "${DDEApplication}" "$3" "WWW_OpenURL" ${AddDDEHandlerValues} "https" "$2" "$8,1" "" "" \ "${DDEApplication}" "$3" "WWW_OpenURL" !macroend !define SetHandlers "!insertmacro SetHandlers" ; Adds the HKLM\Software\Clients\StartMenuInternet\BLUEGRIFFON.EXE registry ; entries (does not use SHCTX). ; ; The values for StartMenuInternet are only valid under HKLM and there can only ; be one installation registerred under StartMenuInternet per application since ; the key name is derived from the main application executable. ; http://support.microsoft.com/kb/297878 ; ; Note: we might be able to get away with using the full path to the ; application executable for the key name in order to support multiple ; installations. !macro SetStartMenuInternet ${GetLongPath} "$INSTDIR\${FileMainEXE}" $8 ${GetLongPath} "$INSTDIR\uninstall\helper.exe" $7 ${StrFilter} "${FileMainEXE}" "+" "" "" $R9 StrCpy $0 "Software\Clients\StartMenuInternet\$R9" WriteRegStr HKLM "$0" "" "${BrandFullName}" WriteRegStr HKLM "$0\DefaultIcon" "" "$8,0" ; The Reinstall Command is defined at ; http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/programmersguide/shell_adv/registeringapps.asp WriteRegStr HKLM "$0\InstallInfo" "HideIconsCommand" "$\"$7$\" /HideShortcuts" WriteRegStr HKLM "$0\InstallInfo" "ShowIconsCommand" "$\"$7$\" /ShowShortcuts" WriteRegStr HKLM "$0\InstallInfo" "ReinstallCommand" "$\"$7$\" /SetAsDefaultAppGlobal" ClearErrors ReadRegDWORD $1 HKLM "$0\InstallInfo" "IconsVisible" ; If the IconsVisible name value pair doesn't exist add it otherwise the ; application won't be displayed in Set Program Access and Defaults. ${If} ${Errors} ${If} ${FileExists} "$QUICKLAUNCH\${BrandFullName}.lnk" WriteRegDWORD HKLM "$0\InstallInfo" "IconsVisible" 1 ${Else} WriteRegDWORD HKLM "$0\InstallInfo" "IconsVisible" 0 ${EndIf} ${EndIf} WriteRegStr HKLM "$0\shell\open\command" "" "$8" WriteRegStr HKLM "$0\shell\properties" "" "$(CONTEXT_OPTIONS)" WriteRegStr HKLM "$0\shell\properties\command" "" "$\"$8$\" -preferences" WriteRegStr HKLM "$0\shell\safemode" "" "$(CONTEXT_SAFE_MODE)" WriteRegStr HKLM "$0\shell\safemode\command" "" "$\"$8$\" -safe-mode" ; Vista Capabilities registry keys WriteRegStr HKLM "$0\Capabilities" "ApplicationDescription" "$(REG_APP_DESC)" WriteRegStr HKLM "$0\Capabilities" "ApplicationIcon" "$8,0" WriteRegStr HKLM "$0\Capabilities" "ApplicationName" "${BrandShortName}" WriteRegStr HKLM "$0\Capabilities\FileAssociations" ".htm" "BlueGriffonHTML" WriteRegStr HKLM "$0\Capabilities\FileAssociations" ".html" "BlueGriffonHTML" WriteRegStr HKLM "$0\Capabilities\FileAssociations" ".shtml" "BlueGriffonHTML" WriteRegStr HKLM "$0\Capabilities\FileAssociations" ".xht" "BlueGriffonHTML" WriteRegStr HKLM "$0\Capabilities\FileAssociations" ".xhtml" "BlueGriffonHTML" WriteRegStr HKLM "$0\Capabilities\StartMenu" "StartMenuInternet" "$R9" WriteRegStr HKLM "$0\Capabilities\URLAssociations" "http" "BlueGriffonURL" WriteRegStr HKLM "$0\Capabilities\URLAssociations" "https" "BlueGriffonURL" ; Vista Registered Application WriteRegStr HKLM "Software\RegisteredApplications" "${AppRegName}" "$0\Capabilities" !macroend !define SetStartMenuInternet "!insertmacro SetStartMenuInternet" ; The IconHandler reference for BlueGriffonHTML can end up in an inconsistent state ; due to changes not being detected by the IconHandler for side by side ; installs (see bug 268512). The symptoms can be either an incorrect icon or no ; icon being displayed for files associated with BlueGriffon (does not use SHCTX). !macro FixShellIconHandler ClearErrors ReadRegStr $1 HKLM "Software\Classes\BlueGriffonHTML\ShellEx\IconHandler" "" ${Unless} ${Errors} ReadRegStr $1 HKLM "Software\Classes\BlueGriffonHTML\" "" ${GetLongPath} "$INSTDIR\${FileMainEXE}" $2 ${If} "$1" != "$2,1" WriteRegStr HKLM "Software\Classes\BlueGriffonHTML\DefaultIcon" "" "$2,1" ${EndIf} ${EndUnless} !macroend !define FixShellIconHandler "!insertmacro FixShellIconHandler" ; Add Software\${CompanyName}\ registry entries (uses SHCTX). !macro SetAppKeys ${GetLongPath} "$INSTDIR" $8 StrCpy $0 "Software\${CompanyName}\${BrandFullNameInternal}\${AppVersion} (${AB_CD})\Main" ${WriteRegStr2} $TmpVal "$0" "Install Directory" "$8" 0 ${WriteRegStr2} $TmpVal "$0" "PathToExe" "$8\${FileMainEXE}" 0 StrCpy $0 "Software\${CompanyName}\${BrandFullNameInternal}\${AppVersion} (${AB_CD})\Uninstall" ${WriteRegStr2} $TmpVal "$0" "Description" "${BrandFullNameInternal} ${AppVersion} (${ARCH} ${AB_CD})" 0 StrCpy $0 "Software\${CompanyName}\${BrandFullNameInternal}\${AppVersion} (${AB_CD})" ${WriteRegStr2} $TmpVal "$0" "" "${AppVersion} (${AB_CD})" 0 StrCpy $0 "Software\${CompanyName}\${BrandFullNameInternal} ${AppVersion}\bin" ${WriteRegStr2} $TmpVal "$0" "PathToExe" "$8\${FileMainEXE}" 0 StrCpy $0 "Software\${CompanyName}\${BrandFullNameInternal} ${AppVersion}\extensions" ${WriteRegStr2} $TmpVal "$0" "Components" "$8\components" 0 ${WriteRegStr2} $TmpVal "$0" "Plugins" "$8\plugins" 0 StrCpy $0 "Software\${CompanyName}\${BrandFullNameInternal} ${AppVersion}" ${WriteRegStr2} $TmpVal "$0" "GeckoVer" "${GREVersion}" 0 StrCpy $0 "Software\${CompanyName}\${BrandFullNameInternal}" ${WriteRegStr2} $TmpVal "$0" "" "${GREVersion}" 0 ${WriteRegStr2} $TmpVal "$0" "CurrentVersion" "${AppVersion} (${AB_CD})" 0 !macroend !define SetAppKeys "!insertmacro SetAppKeys" ; Add uninstall registry entries. This macro tests for write access to determine ; if the uninstall keys should be added to HKLM or HKCU. !macro SetUninstallKeys StrCpy $0 "Software\Microsoft\Windows\CurrentVersion\Uninstall\${BrandFullNameInternal} ${AppVersion} (${ARCH} ${AB_CD})" WriteRegStr HKLM "$0" "${BrandShortName}InstallerTest" "Write Test" ${If} ${Errors} StrCpy $1 "HKCU" SetShellVarContext current ; Set SHCTX to the current user (e.g. HKCU) ${Else} StrCpy $1 "HKLM" SetShellVarContext all ; Set SHCTX to all users (e.g. HKLM) DeleteRegValue HKLM "$0" "${BrandShortName}InstallerTest" ${EndIf} ${GetLongPath} "$INSTDIR" $8 ; Write the uninstall registry keys ${WriteRegStr2} $1 "$0" "Comments" "${BrandFullNameInternal} ${AppVersion} (${ARCH} ${AB_CD})" 0 ${WriteRegStr2} $1 "$0" "DisplayIcon" "$8\${FileMainEXE},0" 0 ${WriteRegStr2} $1 "$0" "DisplayName" "${BrandFullNameInternal} ${AppVersion} (${ARCH} ${AB_CD})" 0 ${WriteRegStr2} $1 "$0" "DisplayVersion" "${AppVersion}" 0 ${WriteRegStr2} $1 "$0" "InstallLocation" "$8" 0 ${WriteRegStr2} $1 "$0" "Publisher" "${CompanyName}" 0 ${WriteRegStr2} $1 "$0" "UninstallString" "$8\uninstall\helper.exe" 0 ${WriteRegStr2} $1 "$0" "URLInfoAbout" "${URLInfoAbout}" 0 ${WriteRegStr2} $1 "$0" "URLUpdateInfo" "${URLUpdateInfo}" 0 ${WriteRegDWORD2} $1 "$0" "NoModify" 1 0 ${WriteRegDWORD2} $1 "$0" "NoRepair" 1 0 ${GetSize} "$8" "/S=0K" $R2 $R3 $R4 ${WriteRegDWORD2} $1 "$0" "EstimatedSize" $R2 0 ${If} "$TmpVal" == "HKLM" SetShellVarContext all ; Set SHCTX to all users (e.g. HKLM) ${Else} SetShellVarContext current ; Set SHCTX to the current user (e.g. HKCU) ${EndIf} !macroend !define SetUninstallKeys "!insertmacro SetUninstallKeys" ; Add app specific handler registry entries under Software\Classes if they ; don't exist (does not use SHCTX). !macro FixClassKeys StrCpy $1 "SOFTWARE\Classes" ; File handler keys and name value pairs that may need to be created during ; install or upgrade. ReadRegStr $0 HKCR ".shtml" "Content Type" ${If} "$0" == "" StrCpy $0 "$1\.shtml" ${WriteRegStr2} $TmpVal "$1\.shtml" "" "shtmlfile" 0 ${WriteRegStr2} $TmpVal "$1\.shtml" "Content Type" "text/html" 0 ${WriteRegStr2} $TmpVal "$1\.shtml" "PerceivedType" "text" 0 ${EndIf} ReadRegStr $0 HKCR ".xht" "Content Type" ${If} "$0" == "" ${WriteRegStr2} $TmpVal "$1\.xht" "" "xhtfile" 0 ${WriteRegStr2} $TmpVal "$1\.xht" "Content Type" "application/xhtml+xml" 0 ${EndIf} ReadRegStr $0 HKCR ".xhtml" "Content Type" ${If} "$0" == "" ${WriteRegStr2} $TmpVal "$1\.xhtml" "" "xhtmlfile" 0 ${WriteRegStr2} $TmpVal "$1\.xhtml" "Content Type" "application/xhtml+xml" 0 ${EndIf} !macroend !define FixClassKeys "!insertmacro FixClassKeys" ; Updates protocol handlers if their registry open command value is for this ; install location (uses SHCTX). !macro UpdateProtocolHandlers ; Store the command to open the app with an url in a register for easy access. ${GetLongPath} "$INSTDIR\${FileMainEXE}" $8 StrCpy $2 "$\"$8$\" -requestPending -osint -url $\"%1$\"" StrCpy $3 "$\"%1$\",,0,0,,,," ; Only set the file and protocol handlers if the existing one under HKCR is ; for this install location. ${IsHandlerForInstallDir} "BlueGriffonHTML" $R9 ${If} "$R9" == "true" ; An empty string is used for the 5th param because BlueGriffonHTML is not a ; protocol handler. ${AddDDEHandlerValues} "BlueGriffonHTML" "$2" "$8,1" "${AppRegName} HTML Document" "" \ "${DDEApplication}" "$3" "WWW_OpenURL" ${EndIf} ${IsHandlerForInstallDir} "BlueGriffonURL" $R9 ${If} "$R9" == "true" ${AddDDEHandlerValues} "BlueGriffonURL" "$2" "$8,1" "${AppRegName} URL" "true" \ "${DDEApplication}" "$3" "WWW_OpenURL" ${EndIf} ${IsHandlerForInstallDir} "ftp" $R9 ${If} "$R9" == "true" ${AddDDEHandlerValues} "ftp" "$2" "$8,1" "" "" \ "${DDEApplication}" "$3" "WWW_OpenURL" ${EndIf} ${IsHandlerForInstallDir} "http" $R9 ${If} "$R9" == "true" ${AddDDEHandlerValues} "http" "$2" "$8,1" "" "" \ "${DDEApplication}" "$3" "WWW_OpenURL" ${EndIf} ${IsHandlerForInstallDir} "https" $R9 ${If} "$R9" == "true" ${AddDDEHandlerValues} "https" "$2" "$8,1" "" "" \ "${DDEApplication}" "$3" "WWW_OpenURL" ${EndIf} !macroend !define UpdateProtocolHandlers "!insertmacro UpdateProtocolHandlers" ; Removes various registry entries for reasons noted below (does not use SHCTX). !macro RemoveDeprecatedKeys StrCpy $0 "SOFTWARE\Classes" ; Remove support for launching gopher urls from the shell during install or ; update if the DefaultIcon is from BlueGriffon.exe. ${RegCleanAppHandler} "gopher" ; Remove support for launching chrome urls from the shell during install or ; update if the DefaultIcon is from BlueGriffon.exe (Bug 301073). ${RegCleanAppHandler} "chrome" ; Remove protocol handler registry keys added by the MS shim DeleteRegKey HKLM "Software\Classes\BlueGriffon.URL" DeleteRegKey HKCU "Software\Classes\BlueGriffon.URL" ; Remove the app compatibility registry key StrCpy $0 "Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" DeleteRegValue HKLM "$0" "$INSTDIR\${FileMainEXE}" DeleteRegValue HKCU "$0" "$INSTDIR\${FileMainEXE}" ; Delete gopher from Capabilities\URLAssociations if it is present. ${StrFilter} "${FileMainEXE}" "+" "" "" $R9 StrCpy $0 "Software\Clients\StartMenuInternet\$R9" ClearErrors ReadRegStr $2 HKLM "$0\Capabilities\URLAssociations" "gopher" ${Unless} ${Errors} DeleteRegValue HKLM "$0\Capabilities\URLAssociations" "gopher" ${EndUnless} ; Delete gopher from the user's UrlAssociations if it points to BlueGriffonURL. StrCpy $0 "Software\Microsoft\Windows\Shell\Associations\UrlAssociations\gopher" ReadRegStr $2 HKCU "$0\UserChoice" "Progid" ${If} "$2" == "BlueGriffonURL" DeleteRegKey HKCU "$0" ${EndIf} !macroend !define RemoveDeprecatedKeys "!insertmacro RemoveDeprecatedKeys" ; Removes various directories and files for reasons noted below. !macro RemoveDeprecatedFiles ; Remove the Java Console extension (bug 597235) ;${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0012-ABCDEFFEDCBA}" ; RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0012-ABCDEFFEDCBA}" ;${EndIf} !macroend !define RemoveDeprecatedFiles "!insertmacro RemoveDeprecatedFiles" ; Adds a pinned shortcut to Task Bar on update for Windows 7 and above if this ; macro has never been called before and the application is default (see ; PinToTaskBar for more details). !macro MigrateTaskBarShortcut ${GetShortcutsLogPath} $0 ${If} ${FileExists} "$0" ClearErrors ReadINIStr $1 "$0" "TASKBAR" "Migrated" ${If} ${Errors} ClearErrors WriteIniStr "$0" "TASKBAR" "Migrated" "true" ${If} ${AtLeastWin7} ; Check if the BlueGriffon is the http handler for this user SetShellVarContext current ; Set SHCTX to the current user ${IsHandlerForInstallDir} "http" $R9 ${If} $TmpVal == "HKLM" SetShellVarContext all ; Set SHCTX to all users ${EndIf} ${If} "$R9" == "true" ${PinToTaskBar} ${EndIf} ${EndIf} ${EndIf} ${EndIf} !macroend !define MigrateTaskBarShortcut "!insertmacro MigrateTaskBarShortcut" ; Adds a pinned Task Bar shortcut on Windows 7 if there isn't one for the main ; application executable already. Existing pinned shortcuts for the same ; application model ID must be removed first to prevent breaking the pinned ; item's lists but multiple installations with the same application model ID is ; an edgecase. If removing existing pinned shortcuts with the same application ; model ID removes a pinned pinned Start Menu shortcut this will also add a ; pinned Start Menu shortcut. !macro PinToTaskBar ${If} ${AtLeastWin7} StrCpy $8 "false" ; Whether a shortcut had to be created ${IsPinnedToTaskBar} "$INSTDIR\${FileMainEXE}" $R9 ${If} "$R9" == "false" ; Find an existing Start Menu shortcut or create one to use for pinning ${GetShortcutsLogPath} $0 ${If} ${FileExists} "$0" ClearErrors ReadINIStr $1 "$0" "STARTMENU" "Shortcut0" ${Unless} ${Errors} SetShellVarContext all ; Set SHCTX to all users ${Unless} ${FileExists} "$SMPROGRAMS\$1" SetShellVarContext current ; Set SHCTX to the current user ${Unless} ${FileExists} "$SMPROGRAMS\$1" StrCpy $8 "true" CreateShortCut "$SMPROGRAMS\$1" "$INSTDIR\${FileMainEXE}" ${If} ${FileExists} "$SMPROGRAMS\$1" ShellLink::SetShortCutWorkingDirectory "$SMPROGRAMS\$1" \ "$INSTDIR" ${If} "$AppUserModelID" != "" ApplicationID::Set "$SMPROGRAMS\$1" "$AppUserModelID" ${EndIf} ${EndIf} ${EndUnless} ${EndUnless} ${If} ${FileExists} "$SMPROGRAMS\$1" ; Count of Start Menu pinned shortcuts before unpinning. ${PinnedToStartMenuLnkCount} $R9 ; Having multiple shortcuts pointing to different installations with ; the same AppUserModelID (e.g. side by side installations of the ; same version) will make the TaskBar shortcut's lists into an bad ; state where the lists are not shown. To prevent this first ; uninstall the pinned item. ApplicationID::UninstallPinnedItem "$SMPROGRAMS\$1" ; Count of Start Menu pinned shortcuts after unpinning. ${PinnedToStartMenuLnkCount} $R8 ; If there is a change in the number of Start Menu pinned shortcuts ; assume that unpinning unpinned a side by side installation from ; the Start Menu and pin this installation to the Start Menu. ${Unless} $R8 == $R9 ; Pin the shortcut to the Start Menu. 5381 is the shell32.dll ; resource id for the "Pin to Start Menu" string. InvokeShellVerb::DoIt "$SMPROGRAMS" "$1" "5381" ${EndUnless} ; Pin the shortcut to the TaskBar. 5386 is the shell32.dll resource ; id for the "Pin to Taskbar" string. InvokeShellVerb::DoIt "$SMPROGRAMS" "$1" "5386" ; Delete the shortcut if it was created ${If} "$8" == "true" Delete "$SMPROGRAMS\$1" ${EndIf} ${EndIf} ${If} $TmpVal == "HKCU" SetShellVarContext current ; Set SHCTX to the current user ${Else} SetShellVarContext all ; Set SHCTX to all users ${EndIf} ${EndUnless} ${EndIf} ${EndIf} ${EndIf} !macroend !define PinToTaskBar "!insertmacro PinToTaskBar" ; Adds a shortcut to the root of the Start Menu Programs directory if the ; application's Start Menu Programs directory exists with a shortcut pointing to ; this installation directory. This will also remove the old shortcuts and the ; application's Start Menu Programs directory by calling the RemoveStartMenuDir ; macro. !macro MigrateStartMenuShortcut ${GetShortcutsLogPath} $0 ${If} ${FileExists} "$0" ClearErrors ReadINIStr $5 "$0" "SMPROGRAMS" "RelativePathToDir" ${Unless} ${Errors} ClearErrors ReadINIStr $1 "$0" "STARTMENU" "Shortcut0" ${If} ${Errors} ; The STARTMENU ini section doesn't exist. ${LogStartMenuShortcut} "${BrandFullName}.lnk" ${GetLongPath} "$SMPROGRAMS" $2 ${GetLongPath} "$2\$5" $1 ${If} "$1" != "" ClearErrors ReadINIStr $3 "$0" "SMPROGRAMS" "Shortcut0" ${Unless} ${Errors} ${If} ${FileExists} "$1\$3" ShellLink::GetShortCutTarget "$1\$3" Pop $4 ${If} "$INSTDIR\${FileMainEXE}" == "$4" CreateShortCut "$SMPROGRAMS\${BrandFullName}.lnk" \ "$INSTDIR\${FileMainEXE}" ${If} ${FileExists} "$SMPROGRAMS\${BrandFullName}.lnk" ShellLink::SetShortCutWorkingDirectory "$SMPROGRAMS\${BrandFullName}.lnk" \ "$INSTDIR" ${If} ${AtLeastWin7} ${AndIf} "$AppUserModelID" != "" ApplicationID::Set "$SMPROGRAMS\${BrandFullName}.lnk" \ "$AppUserModelID" ${EndIf} ${EndIf} ${EndIf} ${EndIf} ${EndUnless} ${EndIf} ${EndIf} ; Remove the application's Start Menu Programs directory, shortcuts, and ; ini section. ${RemoveStartMenuDir} ${EndUnless} ${EndIf} !macroend !define MigrateStartMenuShortcut "!insertmacro MigrateStartMenuShortcut" ; Removes the application's start menu directory along with its shortcuts if ; they exist and if they exist creates a start menu shortcut in the root of the ; start menu directory (bug 598779). If the application's start menu directory ; is not empty after removing the shortucts the directory will not be removed ; since these additional items were not created by the installer (uses SHCTX). !macro RemoveStartMenuDir ${GetShortcutsLogPath} $0 ${If} ${FileExists} "$0" ; Delete Start Menu Programs shortcuts, directory if it is empty, and ; parent directories if they are empty up to but not including the start ; menu directory. ${GetLongPath} "$SMPROGRAMS" $1 ClearErrors ReadINIStr $2 "$0" "SMPROGRAMS" "RelativePathToDir" ${Unless} ${Errors} ${GetLongPath} "$1\$2" $2 ${If} "$2" != "" ; Delete shortucts in the Start Menu Programs directory. StrCpy $3 0 ${Do} ClearErrors ReadINIStr $4 "$0" "SMPROGRAMS" "Shortcut$3" ; Stop if there are no more entries ${If} ${Errors} ${ExitDo} ${EndIf} ${If} ${FileExists} "$2\$4" ShellLink::GetShortCutTarget "$2\$4" Pop $5 ${If} "$INSTDIR\${FileMainEXE}" == "$5" Delete "$2\$4" ${EndIf} ${EndIf} IntOp $3 $3 + 1 ; Increment the counter ${Loop} ; Delete Start Menu Programs directory and parent directories ${Do} ; Stop if the current directory is the start menu directory ${If} "$1" == "$2" ${ExitDo} ${EndIf} ClearErrors RmDir "$2" ; Stop if removing the directory failed ${If} ${Errors} ${ExitDo} ${EndIf} ${GetParent} "$2" $2 ${Loop} ${EndIf} DeleteINISec "$0" "SMPROGRAMS" ${EndUnless} ${EndIf} !macroend !define RemoveStartMenuDir "!insertmacro RemoveStartMenuDir" ; Creates the shortcuts log ini file with the appropriate entries if it doesn't ; already exist. !macro CreateShortcutsLog ${GetShortcutsLogPath} $0 ${Unless} ${FileExists} "$0" ${LogStartMenuShortcut} "${BrandFullName}.lnk" ${LogQuickLaunchShortcut} "${BrandFullName}.lnk" ${LogDesktopShortcut} "${BrandFullName}.lnk" ${EndUnless} !macroend !define CreateShortcutsLog "!insertmacro CreateShortcutsLog" ; The files to check if they are in use during (un)install so the restart is ; required message is displayed. All files must be located in the $INSTDIR ; directory. !macro PushFilesToCheck ; The first string to be pushed onto the stack MUST be "end" to indicate ; that there are no more files to check in $INSTDIR and the last string ; should be ${FileMainEXE} so if it is in use the CheckForFilesInUse macro ; returns after the first check. Push "end" Push "AccessibleMarshal.dll" Push "freebl3.dll" Push "nssckbi.dll" Push "nspr4.dll" Push "nssdbm3.dll" Push "mozsqlite3.dll" Push "xpcom.dll" Push "crashreporter.exe" Push "updater.exe" Push "${FileMainEXE}" !macroend !define PushFilesToCheck "!insertmacro PushFilesToCheck" ; Sets this installation as the default browser by setting the registry keys ; under HKEY_CURRENT_USER via registry calls and using the AppAssocReg NSIS ; plugin for Vista and above. This is a function instead of a macro so it is ; easily called from an elevated instance of the binary. Since this can be ; called by an elevated instance logging is not performed in this function. Function SetAsDefaultAppUserHKCU ; Only set as the user's StartMenuInternet browser if the StartMenuInternet ; registry keys are for this install. ${StrFilter} "${FileMainEXE}" "+" "" "" $R9 ClearErrors ReadRegStr $0 HKLM "Software\Clients\StartMenuInternet\$R9\DefaultIcon" "" ${Unless} ${Errors} ${GetPathFromString} "$0" $0 ${GetParent} "$0" $0 ${If} ${FileExists} "$0" ${GetLongPath} "$0" $0 ${If} "$0" == "$INSTDIR" WriteRegStr HKCU "Software\Clients\StartMenuInternet" "" "$R9" ${EndIf} ${EndIf} ${EndUnless} SetShellVarContext current ; Set SHCTX to the current user (e.g. HKCU) ${SetHandlers} ${If} ${AtLeastWinVista} ; Only register as the handler on Vista and above if the app registry name ; exists under the RegisteredApplications registry key. The protocol and ; file handlers set previously at the user level will associate this install ; as the default browser. ClearErrors ReadRegStr $0 HKLM "Software\RegisteredApplications" "${AppRegName}" ${Unless} ${Errors} AppAssocReg::SetAppAsDefaultAll "${AppRegName}" ${EndUnless} ${EndIf} ${RemoveDeprecatedKeys} ${PinToTaskBar} FunctionEnd ; Helper for updating the shortcut application model IDs. Function FixShortcutAppModelIDs ${If} ${AtLeastWin7} ${AndIf} "$AppUserModelID" != "" ${UpdateShortcutAppModelIDs} "$INSTDIR\${FileMainEXE}" "$AppUserModelID" $0 ${EndIf} FunctionEnd ; The !ifdef NO_LOG prevents warnings when compiling the installer.nsi due to ; this function only being used by the uninstaller.nsi. !ifdef NO_LOG Function SetAsDefaultAppUser ; It is only possible to set this installation of the application as the ; StartMenuInternet handler if it was added to the HKLM StartMenuInternet ; registry keys. ; http://support.microsoft.com/kb/297878 ; Check if this install location registered as the StartMenuInternet client ${StrFilter} "${FileMainEXE}" "+" "" "" $R9 ClearErrors ReadRegStr $0 HKLM "Software\Clients\StartMenuInternet\$R9\DefaultIcon" "" ${Unless} ${Errors} ${GetPathFromString} "$0" $0 ${GetParent} "$0" $0 ${If} ${FileExists} "$0" ${GetLongPath} "$0" $0 ${If} "$0" == "$INSTDIR" ; Check if this is running in an elevated process ClearErrors ${GetParameters} $0 ${GetOptions} "$0" "/UAC:" $0 ${If} ${Errors} ; Not elevated Call SetAsDefaultAppUserHKCU ${Else} ; Elevated - execute the function in the unelevated process GetFunctionAddress $0 SetAsDefaultAppUserHKCU UAC::ExecCodeSegment $0 ${EndIf} Return ; Nothing more needs to be done ${EndIf} ${EndIf} ${EndUnless} ; The code after ElevateUAC won't be executed on Vista and above when the ; user: ; a) is a member of the administrators group (e.g. elevation is required) ; b) is not a member of the administrators group and chooses to elevate ${ElevateUAC} ${SetStartMenuInternet} SetShellVarContext all ; Set SHCTX to all users (e.g. HKLM) ${FixShellIconHandler} ${RemoveDeprecatedKeys} ClearErrors ${GetParameters} $0 ${GetOptions} "$0" "/UAC:" $0 ${If} ${Errors} Call SetAsDefaultAppUserHKCU ${Else} GetFunctionAddress $0 SetAsDefaultAppUserHKCU UAC::ExecCodeSegment $0 ${EndIf} FunctionEnd !define SetAsDefaultAppUser "Call SetAsDefaultAppUser" !endif ================================================ FILE: installer/windows/nsis/uninstaller.nsi ================================================ # ***** BEGIN LICENSE BLOCK ***** # Version: MPL 1.1/GPL 2.0/LGPL 2.1 # # The contents of this file are subject to the Mozilla Public License Version # 1.1 (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. # # The Original Code is the Mozilla Installer code. # # The Initial Developer of the Original Code is Mozilla Foundation # Portions created by the Initial Developer are Copyright (C) 2006 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Robert Strong <robert.bugzilla@gmail.com> # # Alternatively, the contents of this file may be used under the terms of # either the GNU General Public License Version 2 or later (the "GPL"), or # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), # in which case the provisions of the GPL or the LGPL are applicable instead # of those above. If you wish to allow use of your version of this file only # under the terms of either the GPL or the LGPL, and not to allow others to # use your version of this file under the terms of the MPL, indicate your # decision by deleting the provisions above and replace them with the notice # and other provisions required by the GPL or the LGPL. If you do not delete # the provisions above, a recipient may use your version of this file under # the terms of any one of the MPL, the GPL or the LGPL. # # ***** END LICENSE BLOCK ***** # Required Plugins: # AppAssocReg http://nsis.sourceforge.net/Application_Association_Registration_plug-in # CityHash http://mxr.mozilla.org/mozilla-central/source/other-licenses/nsis/Contrib/CityHash # ShellLink http://nsis.sourceforge.net/ShellLink_plug-in # UAC http://nsis.sourceforge.net/UAC_plug-in ; Set verbosity to 3 (e.g. no script) to lessen the noise in the build logs !verbose 3 ; 7-Zip provides better compression than the lzma from NSIS so we add the files ; uncompressed and use 7-Zip to create a SFX archive of it SetDatablockOptimize on SetCompress off CRCCheck on RequestExecutionLevel user !addplugindir ./ ; On Vista and above attempt to elevate Standard Users in addition to users that ; are a member of the Administrators group. !define NONADMIN_ELEVATE ; prevents compiling of the reg write logging. !define NO_LOG Var TmpVal ; Other included files may depend upon these includes! ; The following includes are provided by NSIS. !include FileFunc.nsh !include LogicLib.nsh !include MUI.nsh !include WinMessages.nsh !include WinVer.nsh !include WordFunc.nsh !insertmacro GetSize !insertmacro StrFilter !insertmacro WordReplace !insertmacro un.GetParent ; The following includes are custom. ;!include branding.nsi !include defines.nsi !include common.nsh !include locales.nsi ; This is named BrandShortName helper because we use this for software update ; post update cleanup. VIAddVersionKey "FileDescription" "${BrandShortName} Helper" VIAddVersionKey "OriginalFilename" "helper.exe" !insertmacro AddDDEHandlerValues !insertmacro CleanVirtualStore !insertmacro ElevateUAC !insertmacro GetLongPath !insertmacro GetPathFromString !insertmacro InitHashAppModelId !insertmacro IsHandlerForInstallDir !insertmacro IsPinnedToTaskBar !insertmacro LogDesktopShortcut !insertmacro LogQuickLaunchShortcut !insertmacro LogStartMenuShortcut !insertmacro PinnedToStartMenuLnkCount !insertmacro RegCleanAppHandler !insertmacro RegCleanMain !insertmacro RegCleanUninstall !insertmacro SetAppLSPCategories !insertmacro SetBrandNameVars !insertmacro UpdateShortcutAppModelIDs !insertmacro UnloadUAC !insertmacro WriteRegDWORD2 !insertmacro WriteRegStr2 !insertmacro CheckIfRegistryKeyExists !insertmacro un.ChangeMUIHeaderImage !insertmacro un.CheckForFilesInUse !insertmacro un.CleanUpdatesDir !insertmacro un.CleanVirtualStore !insertmacro un.DeleteRelativeProfiles !insertmacro un.DeleteShortcuts !insertmacro un.GetLongPath !insertmacro un.GetSecondInstallPath !insertmacro un.InitHashAppModelId !insertmacro un.ManualCloseAppPrompt !insertmacro un.ParseUninstallLog !insertmacro un.RegCleanAppHandler !insertmacro un.RegCleanFileHandler !insertmacro un.RegCleanMain !insertmacro un.RegCleanUninstall !insertmacro un.RegCleanProtocolHandler !insertmacro un.RemoveQuotesFromPath !insertmacro un.SetAppLSPCategories !insertmacro un.SetBrandNameVars !include shared.nsh ; Helper macros for ui callbacks. Insert these after shared.nsh !insertmacro OnEndCommon !insertmacro UninstallOnInitCommon !insertmacro un.OnEndCommon !insertmacro un.UninstallUnOnInitCommon Name "${BrandFullName}" OutFile "helper.exe" !ifdef HAVE_64BIT_OS InstallDir "$PROGRAMFILES64\${CompanyName}\${BrandFullName}\" !else InstallDir "$PROGRAMFILES32\${CompanyName}\${BrandFullName}\" !endif ShowUnInstDetails nevershow ################################################################################ # Modern User Interface - MUI !define MUI_ABORTWARNING !define MUI_ICON setup.ico !define MUI_UNICON setup.ico !define MUI_WELCOMEPAGE_TITLE_3LINES !define MUI_HEADERIMAGE !define MUI_HEADERIMAGE_RIGHT !define MUI_UNWELCOMEFINISHPAGE_BITMAP wizWatermark.bmp ; Use a right to left header image when the language is right to left !ifdef ${AB_CD}_rtl !define MUI_HEADERIMAGE_BITMAP_RTL wizHeaderRTL.bmp !else !define MUI_HEADERIMAGE_BITMAP wizHeader.bmp !endif /** * Uninstall Pages */ ; Welcome Page !define MUI_PAGE_CUSTOMFUNCTION_PRE un.preWelcome !define MUI_PAGE_CUSTOMFUNCTION_LEAVE un.leaveWelcome !insertmacro MUI_UNPAGE_WELCOME ; Custom Uninstall Confirm Page UninstPage custom un.preConfirm un.leaveConfirm ; Remove Files Page !insertmacro MUI_UNPAGE_INSTFILES ; Finish Page ; Don't setup the survey controls, functions, etc. when the application has ; defined NO_UNINSTALL_SURVEY !ifndef NO_UNINSTALL_SURVEY !define MUI_PAGE_CUSTOMFUNCTION_PRE un.preFinish !define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED !define MUI_FINISHPAGE_SHOWREADME "" !define MUI_FINISHPAGE_SHOWREADME_TEXT $(SURVEY_TEXT) !define MUI_FINISHPAGE_SHOWREADME_FUNCTION un.Survey !endif !insertmacro MUI_UNPAGE_FINISH ; Use the default dialog for IDD_VERIFY for a simple Banner ChangeUI IDD_VERIFY "${NSISDIR}\Contrib\UIs\default.exe" ################################################################################ # Install Sections ; Empty section required for the installer to compile as an uninstaller Section "" SectionEnd ################################################################################ # Uninstall Sections Section "Uninstall" SetDetailsPrint textonly DetailPrint $(STATUS_UNINSTALL_MAIN) SetDetailsPrint none ; Delete the app exe to prevent launching the app while we are uninstalling. ClearErrors ${DeleteFile} "$INSTDIR\${FileMainEXE}" ${If} ${Errors} ; If the user closed the application it can take several seconds for it to ; shut down completely. If the application is being used by another user we ; can still delete the files when the system is restarted. Sleep 5000 ${DeleteFile} "$INSTDIR\${FileMainEXE}" ClearErrors ${EndIf} ${MUI_INSTALLOPTIONS_READ} $0 "unconfirm.ini" "Field 3" "State" ${If} "$0" == "1" ${un.DeleteRelativeProfiles} "${CompanyName}\${BrandFullName}" ;RmDir "$APPDATA\${CompanyName}\Extensions\{ec8030f7-c20a-464f-9b0e-13a3a9e97384}" ;RmDir "$APPDATA\${CompanyName}\Extensions" RmDir "$APPDATA\${CompanyName}\${BrandFullName}" ${EndIf} ; setup the application model id registration value ${un.InitHashAppModelId} "$INSTDIR" "Software\${CompanyName}\${AppName}\TaskBarIDs" SetShellVarContext current ; Set SHCTX to HKCU ${un.RegCleanMain} "Software\${CompanyName}" ${un.RegCleanUninstall} ${un.DeleteShortcuts} ; Unregister resources associated with Win7 taskbar jump lists. ${If} ${AtLeastWin7} ${AndIf} "$AppUserModelID" != "" ApplicationID::UninstallJumpLists "$AppUserModelID" ${EndIf} ; Remove any app model id's stored in the registry for this install path DeleteRegValue HKCU "Software\${CompanyName}\${AppName}\TaskBarIDs" "$INSTDIR" DeleteRegValue HKLM "Software\${CompanyName}\${AppName}\TaskBarIDs" "$INSTDIR" ClearErrors WriteRegStr HKLM "Software\${CompanyName}" "${BrandShortName}InstallerTest" "Write Test" ${If} ${Errors} StrCpy $TmpVal "HKCU" ; used primarily for logging ${Else} SetShellVarContext all ; Set SHCTX to HKLM DeleteRegValue HKLM "Software\${CompanyName}" "${BrandShortName}InstallerTest" StrCpy $TmpVal "HKLM" ; used primarily for logging ${un.RegCleanMain} "Software\${CompanyName}" ${un.RegCleanUninstall} ${un.DeleteShortcuts} ${un.SetAppLSPCategories} ${EndIf} ${un.RegCleanAppHandler} "BlueGriffonURL" ${un.RegCleanAppHandler} "BlueGriffonHTML" ${un.RegCleanProtocolHandler} "ftp" ${un.RegCleanProtocolHandler} "http" ${un.RegCleanProtocolHandler} "https" ClearErrors ReadRegStr $R9 HKCR "BlueGriffonHTML" "" ; Don't clean up the file handlers if the BlueGriffonHTML key still exists since ; there should be a second installation that may be the default file handler ${If} ${Errors} ${un.RegCleanFileHandler} ".htm" "BlueGriffonHTML" ${un.RegCleanFileHandler} ".html" "BlueGriffonHTML" ${un.RegCleanFileHandler} ".shtml" "BlueGriffonHTML" ${un.RegCleanFileHandler} ".xht" "BlueGriffonHTML" ${un.RegCleanFileHandler} ".xhtml" "BlueGriffonHTML" ${un.RegCleanFileHandler} ".webm" "BlueGriffonHTML" ${EndIf} SetShellVarContext all ; Set SHCTX to HKLM ${un.GetSecondInstallPath} "Software\${CompanyName}" $R9 ${If} $R9 == "false" SetShellVarContext current ; Set SHCTX to HKCU ${un.GetSecondInstallPath} "Software\${CompanyName}" $R9 ${EndIf} StrCpy $0 "Software\Clients\StartMenuInternet\${FileMainEXE}\shell\open\command" ReadRegStr $R1 HKLM "$0" "" ${un.RemoveQuotesFromPath} "$R1" $R1 ${un.GetParent} "$R1" $R1 ; Only remove the StartMenuInternet key if it refers to this install location. ; The StartMenuInternet registry key is independent of the default browser ; settings. The XPInstall base un-installer always removes this key if it is ; uninstalling the default browser and it will always replace the keys when ; installing even if there is another install of BlueGriffon that is set as the ; default browser. Now the key is always updated on install but it is only ; removed if it refers to this install location. ${If} "$INSTDIR" == "$R1" DeleteRegKey HKLM "Software\Clients\StartMenuInternet\${FileMainEXE}" DeleteRegValue HKLM "Software\RegisteredApplications" "${AppRegName}" ${EndIf} StrCpy $0 "Software\Microsoft\Windows\CurrentVersion\App Paths\${FileMainEXE}" ${If} $R9 == "false" DeleteRegKey HKLM "$0" DeleteRegKey HKCU "$0" StrCpy $0 "Software\Microsoft\MediaPlayer\ShimInclusionList\${FileMainEXE}" DeleteRegKey HKLM "$0" DeleteRegKey HKCU "$0" StrCpy $0 "Software\Microsoft\MediaPlayer\ShimInclusionList\plugin-container.exe" DeleteRegKey HKLM "$0" DeleteRegKey HKCU "$0" StrCpy $0 "Software\Classes\MIME\Database\Content Type\application/x-xpinstall;app=bluegriffon" DeleteRegKey HKLM "$0" DeleteRegKey HKCU "$0" ${Else} ReadRegStr $R1 HKLM "$0" "" ${un.RemoveQuotesFromPath} "$R1" $R1 ${un.GetParent} "$R1" $R1 ${If} "$INSTDIR" == "$R1" WriteRegStr HKLM "$0" "" "$R9" ${un.GetParent} "$R9" $R1 WriteRegStr HKLM "$0" "Path" "$R1" ${EndIf} ${EndIf} ; Remove directories and files we always control before parsing the uninstall ; log so empty directories can be removed. ${If} ${FileExists} "$INSTDIR\updates" RmDir /r /REBOOTOK "$INSTDIR\updates" ${EndIf} ${If} ${FileExists} "$INSTDIR\defaults\shortcuts" RmDir /r /REBOOTOK "$INSTDIR\defaults\shortcuts" ${EndIf} ${If} ${FileExists} "$INSTDIR\distribution" RmDir /r /REBOOTOK "$INSTDIR\distribution" ${EndIf} ${If} ${FileExists} "$INSTDIR\removed-files" Delete /REBOOTOK "$INSTDIR\removed-files" ${EndIf} ; Remove the updates directory for Vista and above ${un.CleanUpdatesDir} "${CompanyName}\${BrandFullName}" ; Remove files that may be left behind by the application in the ; VirtualStore directory. ${un.CleanVirtualStore} ; Parse the uninstall log to unregister dll's and remove all installed ; files / directories this install is responsible for. ${un.ParseUninstallLog} ; Remove the uninstall directory that we control RmDir /r /REBOOTOK "$INSTDIR\uninstall" ; Remove the installation directory if it is empty ${RemoveDir} "$INSTDIR" ; If bluegriffon.exe was successfully deleted yet we still need to restart to ; remove other files create a dummy bluegriffon.exe.moz-delete to prevent the ; installer from allowing an install without restart when it is required ; to complete an uninstall. ${If} ${RebootFlag} ${Unless} ${FileExists} "$INSTDIR\${FileMainEXE}.moz-delete" FileOpen $0 "$INSTDIR\${FileMainEXE}.moz-delete" w FileWrite $0 "Will be deleted on restart" Delete /REBOOTOK "$INSTDIR\${FileMainEXE}.moz-delete" FileClose $0 ${EndUnless} ${EndIf} ; Refresh desktop icons otherwise the start menu internet item won't be ; removed and other ugly things will happen like recreation of the app's ; clients registry key by the OS under some conditions. System::Call "shell32::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)" SectionEnd ################################################################################ # Helper Functions ; Don't setup the survey controls, functions, etc. when the application has ; defined NO_UNINSTALL_SURVEY !ifndef NO_UNINSTALL_SURVEY Function un.Survey Exec "$\"$TmpVal$\" $\"${SurveyURL}$\"" FunctionEnd !endif ################################################################################ # Language !insertmacro MOZ_MUI_LANGUAGE 'baseLocale' !verbose push !verbose 3 !include "overrideLocale.nsh" !include "customLocale.nsh" !verbose pop ; Set this after the locale files to override it if it is in the locale. Using ; " " for BrandingText will hide the "Nullsoft Install System..." branding. BrandingText " " ################################################################################ # Page pre, show, and leave functions Function un.preWelcome ${If} ${FileExists} "$INSTDIR\distribution\modern-wizard.bmp" Delete "$PLUGINSDIR\modern-wizard.bmp" CopyFiles /SILENT "$INSTDIR\distribution\modern-wizard.bmp" "$PLUGINSDIR\modern-wizard.bmp" ${EndIf} FunctionEnd Function un.leaveWelcome ${If} ${FileExists} "$INSTDIR\${FileMainEXE}" Banner::show /NOUNLOAD "$(BANNER_CHECK_EXISTING)" ; If the message window has been found previously give the app an additional ; five seconds to close. ${If} "$TmpVal" == "FoundMessageWindow" Sleep 5000 ${EndIf} ${PushFilesToCheck} ${un.CheckForFilesInUse} $TmpVal Banner::destroy ; If there are files in use $TmpVal will be "true" ${If} "$TmpVal" == "true" ; If the message window is found the call to ManualCloseAppPrompt will ; abort leaving the value of $TmpVal set to "FoundMessageWindow". StrCpy $TmpVal "FoundMessageWindow" ${un.ManualCloseAppPrompt} "${WindowClass}" "$(WARN_MANUALLY_CLOSE_APP_UNINSTALL)" ; If the message window is not found set $TmpVal to "true" so the restart ; required message is displayed. StrCpy $TmpVal "true" ${EndIf} ${EndIf} FunctionEnd Function un.preConfirm ${If} ${FileExists} "$INSTDIR\distribution\modern-header.bmp" ${AndIf} $hHeaderBitmap == "" Delete "$PLUGINSDIR\modern-header.bmp" CopyFiles /SILENT "$INSTDIR\distribution\modern-header.bmp" "$PLUGINSDIR\modern-header.bmp" ${un.ChangeMUIHeaderImage} "$PLUGINSDIR\modern-header.bmp" ${EndIf} ; Setup the unconfirm.ini file for the Custom Uninstall Confirm Page WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Settings" NumFields "5" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 1" Type "label" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 1" Text "$(UN_CONFIRM_UNINSTALLED_FROM)" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 1" Left "0" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 1" Right "-1" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 1" Top "5" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 1" Bottom "15" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 2" Type "text" ; The contents of this control must be set as follows in the pre function ; ${MUI_INSTALLOPTIONS_READ} $1 "unconfirm.ini" "Field 2" "HWND" ; SendMessage $1 ${WM_SETTEXT} 0 "STR:$INSTDIR" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 2" State "" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 2" Left "0" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 2" Right "-1" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 2" Top "17" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 2" Bottom "30" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 2" flags "READONLY" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Type "checkbox" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Text "$(UN_REMOVE_PROFILES)" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Left "0" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Right "-1" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Top "40" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Bottom "50" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" State "0" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" flags "NOTIFY" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" Type "text" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" State "$(UN_REMOVE_PROFILES_DESC)" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" Left "0" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" Right "-1" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" Top "52" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" Bottom "120" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" flags "MULTILINE|READONLY" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 5" Type "label" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 5" Text "$(UN_CONFIRM_CLICK)" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 5" Left "0" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 5" Right "-1" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 5" Top "130" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 5" Bottom "150" ${If} "$TmpVal" == "true" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 6" Type "label" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 6" Text "$(SUMMARY_REBOOT_REQUIRED_UNINSTALL)" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 6" Left "0" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 6" Right "-1" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 6" Top "35" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 6" Bottom "45" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Settings" NumFields "6" ; To insert this control reset Top / Bottom for controls below this one WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Top "55" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Bottom "65" WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" Top "67" ${EndIf} !insertmacro MUI_HEADER_TEXT "$(UN_CONFIRM_PAGE_TITLE)" "$(UN_CONFIRM_PAGE_SUBTITLE)" ; The Summary custom page has a textbox that will automatically receive ; focus. This sets the focus to the Install button instead. !insertmacro MUI_INSTALLOPTIONS_INITDIALOG "unconfirm.ini" GetDlgItem $0 $HWNDPARENT 1 ${MUI_INSTALLOPTIONS_READ} $1 "unconfirm.ini" "Field 4" "HWND" SetCtlColors $1 0x000000 0xFFFFEE ShowWindow $1 ${SW_HIDE} System::Call "user32::SetFocus(i r0, i 0x0007, i,i)i" ${MUI_INSTALLOPTIONS_READ} $1 "unconfirm.ini" "Field 2" "HWND" SendMessage $1 ${WM_SETTEXT} 0 "STR:$INSTDIR" !insertmacro MUI_INSTALLOPTIONS_SHOW FunctionEnd Function un.leaveConfirm ${MUI_INSTALLOPTIONS_READ} $0 "unconfirm.ini" "Settings" "State" StrCmp $0 "3" +1 continue ${MUI_INSTALLOPTIONS_READ} $0 "unconfirm.ini" "Field 3" "State" ${MUI_INSTALLOPTIONS_READ} $1 "unconfirm.ini" "Field 4" "HWND" StrCmp $0 1 +1 +3 ShowWindow $1 ${SW_SHOW} Abort ShowWindow $1 ${SW_HIDE} Abort continue: ; Try to delete the app executable and if we can't delete it try to find the ; app's message window and prompt the user to close the app. This allows ; running an instance that is located in another directory. If for whatever ; reason there is no message window we will just rename the app's files and ; then remove them on restart if they are in use. ClearErrors ${DeleteFile} "$INSTDIR\${FileMainEXE}" ${If} ${Errors} ${un.ManualCloseAppPrompt} "${WindowClass}" "$(WARN_MANUALLY_CLOSE_APP_UNINSTALL)" ${EndIf} FunctionEnd !ifndef NO_UNINSTALL_SURVEY Function un.preFinish ; Do not modify the finish page if there is a reboot pending ${Unless} ${RebootFlag} ; Setup the survey controls, functions, etc. StrCpy $TmpVal "SOFTWARE\Microsoft\IE Setup\Setup" ClearErrors ReadRegStr $0 HKLM $TmpVal "Path" ${If} ${Errors} !insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "settings" "NumFields" "3" ${Else} ExpandEnvStrings $0 "$0" ; this value will usually contain %programfiles% ${If} $0 != "\" StrCpy $0 "$0\" ${EndIf} StrCpy $0 "$0\iexplore.exe" ClearErrors GetFullPathName $TmpVal $0 ${If} ${Errors} !insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "settings" "NumFields" "3" ${Else} ; When we add an optional action to the finish page the cancel button ; is enabled. This disables it and leaves the finish button as the ; only choice. !insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "settings" "cancelenabled" "0" ${EndIf} ${EndIf} ${EndUnless} FunctionEnd !endif ################################################################################ # Initialization Functions Function .onInit ; We need this set up for most of the helper.exe operations. !ifdef AppName ${InitHashAppModelId} "$INSTDIR" "Software\${CompanyName}\${AppName}\TaskBarIDs" !endif ${UninstallOnInitCommon} FunctionEnd Function un.onInit StrCpy $LANGUAGE 0 ${un.UninstallUnOnInitCommon} !insertmacro InitInstallOptionsFile "unconfirm.ini" FunctionEnd Function .onGUIEnd ${OnEndCommon} FunctionEnd Function un.onGUIEnd ${un.OnEndCommon} FunctionEnd ================================================ FILE: installer/windows/nsis/updater_append.ini ================================================ ; IMPORTANT: This file should always start with a newline in case a locale ; provided updater.ini does not end with a newline. ; Application to launch after an update has been successfully applied. This ; must be in the same directory or a sub-directory of the directory of the ; application executable that initiated the software update. [PostUpdateWin] ; ExeRelPath is the path to the PostUpdateWin executable relative to the ; application executable. ExeRelPath=uninstall\helper.exe ; ExeArg is the argument to pass to the PostUpdateWin exe ExeArg=/PostUpdate ================================================ FILE: langpacks/Makefile.in ================================================ DEPTH = ../.. topsrcdir = @top_srcdir@ srcdir = @srcdir@ VPATH = @srcdir@ include $(DEPTH)/config/autoconf.mk APP_NAME = $(MOZ_APP_DISPLAYNAME) ifdef MOZ_DEBUG APP_NAME := $(APP_NAME)Debug endif _AVAILABLE_LOCALES =\ en-US \ $(NULL) _EXTRA_LOCALES =\ cs \ de \ es-ES \ fi \ fr \ gl \ he \ it \ ja \ ko \ nl \ pl \ ru \ sl \ sv-SE \ zh-CN \ zh-TW \ hu \ sr \ $(NULL) _EXTENSIONS_=\ fs \ gfd \ markdown \ op1 \ tipoftheday \ $(NULL) libs::$(_AVAILABLE_LOCALES) $(_EXTRA_LOCALES) mkdir -p $(FINAL_TARGET)/distribution/extensions rm -f $(FINAL_TARGET)/distribution/extensions/*.xpi rm -f $(srcdir)/*.xpi $(foreach f,$^, cd $(srcdir)/`basename $f`; zip -qr ../langpack-`basename $f`@bluegriffon.org.xpi `find . -type f | grep -v svn` ;) $(foreach f,$^, cd $(topsrcdir)/bluegriffon/locales/`basename $f`; zip -qr $(topsrcdir)/bluegriffon/langpacks/langpack-`basename $f`@bluegriffon.org.xpi `find bluegriffon/base -type f | grep -v svn` ;) $(foreach f,$^, cd $(topsrcdir)/bluegriffon/locales/`basename $f`; zip -qr $(topsrcdir)/bluegriffon/langpacks/langpack-`basename $f`@bluegriffon.org.xpi `find bluegriffon/sidebars -type f | grep -v svn` ;) $(foreach f,$^, cd $(topsrcdir)/bluegriffon/locales/`basename $f`; zip -qr $(topsrcdir)/bluegriffon/langpacks/langpack-`basename $f`@bluegriffon.org.xpi `find bluegriffon/extensions -type f | grep -v svn` ;) ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT)) $(INSTALL) $(srcdir)/*.xpi $(DIST)/$(APP_NAME).app/Contents/MacOS/extensions else $(INSTALL) $(srcdir)/*.xpi $(DIST)/bin/distribution/extensions # rm $(srcdir)/*.xpi endif include $(topsrcdir)/config/rules.mk ================================================ FILE: langpacks/cs/bluegriffon/chrome.manifest ================================================ locale bluegriffon cs base/locale/bluegriffon/ locale branding cs base/locale/branding/ locale fs cs extensions/fs/ locale gfd cs extensions/gfd/ locale cssproperties cs sidebars/cssproperties/ locale domexplorer cs sidebars/domexplorer/ locale scripteditor cs sidebars/scripteditor/ locale stylesheets cs sidebars/stylesheets/ locale tipoftheday cs extensions/tipoftheday/ locale aria cs sidebars/aria/ ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/branding/brand.dtd ================================================ <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <!ENTITY brandShorterName "Firefox"> <!ENTITY brandShortName "Firefox Developer Edition"> <!ENTITY brandFullName "Firefox Developer Edition"> <!ENTITY vendorShortName "Mozilla"> <!ENTITY trademarkInfo.part1 " "> ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/branding/brand.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. brandShorterName=Firefox brandShortName=Firefox Developer Edition brandFullName=Firefox Developer Edition vendorShortName=Mozilla syncBrandShortName=Sync ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/branding/browserconfig.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # Do NOT localize or otherwise change these values browser.startup.homepage=about:home ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/aboutAccounts.dtd ================================================ <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <!ENTITY aboutAccounts.welcome "Vítá vás &syncBrand.shortName.label;"> <!ENTITY aboutAccountsConfig.description "Pro synchronizaci panelů, záložek, hesel a dalších věcí se přihlaste."> <!ENTITY aboutAccountsConfig.startButton.label "Začít"> <!ENTITY aboutAccountsConfig.syncPreferences.label "Předvolby synchronizace"> <!ENTITY aboutAccounts.noConnection.title "Žádné připojení"> <!ENTITY aboutAccounts.noConnection.description "Abyste se mohli přihlásit, musíte být připojeni k internetu."> <!ENTITY aboutAccounts.noConnection.retry "Zkusit znovu"> <!ENTITY aboutAccounts.badConfig.title "Špatná konfigurace"> <!ENTITY aboutAccounts.badConfig.description "Nepodařilo se zjistit konfiguraci serveru pro váš účet Firefoxu. Zkuste to prosím znovu."> ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/aboutCertError.dtd ================================================ <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd"> %brandDTD; <!-- These strings are used by Firefox's custom about:certerror page, a replacement for the standard security certificate errors produced by NSS/PSM via netError.xhtml. --> <!ENTITY certerror.pagetitle1 "Nezabezpečené připojení"> <!ENTITY certerror.longpagetitle1 "Vaše připojení není zabezpečené"> <!-- Localization note (certerror.introPara) - The text content of the span tag will be replaced at runtime with the name of the server to which the user was trying to connect. --> <!ENTITY certerror.introPara "Majitel serveru <span class='hostname'/> nakonfiguroval své webové stránky nesprávně. Abychom chránili vaše informace před odcizením, &brandShortName; se k této webové stránce nepřipojil."> <!ENTITY certerror.returnToPreviousPage.label "Přejít zpět"> <!ENTITY certerror.learnMore "Zjistit více…"> <!ENTITY certerror.advanced.label "Rozšířené"> <!ENTITY certerror.whatShouldIDo.badStsCertExplanation "Tento server používá HTTP Strict Transport Security (HSTS), čímž určuje, že se má &brandShortName; připojovat pouze zabezpečeně. Z tohoto důvodu není možné přidat pro tento certifikát výjimku."> <!ENTITY certerror.expert.content "Pokud víte, co se děje, můžete &brandShortName; požádat o výjimku a začít identifikaci tohoto serveru důvěřovat. <b>I když tomuto serveru důvěřujete, může tato chyba znamenat, že někdo manipuluje s tímto připojením.</b>"> <!ENTITY certerror.expert.contentPara2 "Nepřidávejte výjimku, pokud si nejste jisti, že tento server má dobrý důvod nepoužívat důvěryhodnou identifikaci."> <!ENTITY certerror.addException.label "Přidat výjimku…"> <!ENTITY certerror.copyToClipboard.label "Zkopírovat text do schránky"> <!ENTITY errorReporting.automatic "Hlásit chyby jako je tato a pomoci tak organizaci Mozilla identifikovat chybně nastavené servery"> ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/aboutDialog.dtd ================================================ <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <!ENTITY aboutDialog.title "O aplikaci &brandFullName;"> <!-- LOCALIZATION NOTE (update.checkForUpdatesButton.*, update.updateButton.*): # Only one button is present at a time. # The button when displayed is located directly under the Firefox version in # the about dialog (see bug 596813 for screenshots). --> <!ENTITY update.checkForUpdatesButton.label "Zkontrolovat aktualizace"> <!ENTITY update.checkForUpdatesButton.accesskey "Z"> <!ENTITY update.updateButton.label2 "Pro aktualizaci restartovat &brandShortName;"> <!ENTITY update.updateButton.accesskey "R"> <!-- LOCALIZATION NOTE (warningDesc.version): This is a warning about the experimental nature of Nightly and Aurora builds. It is only shown in those versions. --> <!ENTITY warningDesc.version "&brandShortName; je experimentální verze a může být nestabilní."> <!-- LOCALIZATION NOTE (warningDesc.telemetryDesc): This is a notification that Nightly/Aurora builds automatically send Telemetry data back to Mozilla. It is only shown in those versions. "It" refers to brandShortName. --> <!ENTITY warningDesc.telemetryDesc "&brandShortName; automaticky odesílá data o výkonu, hardware, používání a přizpůsobení, která slouží vývojářům z organizace &vendorShortName; k vylepšení aplikace."> <!-- LOCALIZATION NOTE (community.exp.*) This paragraph is shown in "experimental" builds, i.e. Nightly and Aurora builds, instead of the other "community.*" strings below. --> <!ENTITY community.exp.start ""> <!-- LOCALIZATION NOTE (community.exp.mozillaLink): This is a link title that links to http://www.mozilla.org/. --> <!ENTITY community.exp.mozillaLink "&vendorShortName;"> <!ENTITY community.exp.middle " je "> <!-- LOCALIZATION NOTE (community.exp.creditslink): This is a link title that links to about:credits. --> <!ENTITY community.exp.creditsLink "celosvětová komunita"> <!ENTITY community.exp.end " snažící se o zachování veřejně dostupného, otevřeného a všem přístupného webu."> <!ENTITY community.start2 "Aplikace &brandShortName; byla vytvořena organizací "> <!-- LOCALIZATION NOTE (community.mozillaLink): This is a link title that links to http://www.mozilla.org/. --> <!ENTITY community.mozillaLink "&vendorShortName;"> <!ENTITY community.middle2 ". Jsme "> <!-- LOCALIZATION NOTE (community.creditsLink): This is a link title that links to about:credits. --> <!ENTITY community.creditsLink "celosvětová komunita"> <!ENTITY community.end3 " snažící se o zachování veřejně dostupného, otevřeného a všem přístupného webu."> <!ENTITY helpus.start "Chcete pomoci? "> <!-- LOCALIZATION NOTE (helpus.donateLink): This is a link title that links to https://sendto.mozilla.org/page/contribute/Give-Now?source=mozillaorg_default_footer&ref=firefox_about&utm_campaign=firefox_about&utm_source=firefox&utm_medium=referral&utm_content=20140929_FireFoxAbout. --> <!ENTITY helpus.donateLink "Darujte příspěvek"> <!ENTITY helpus.middle " nebo "> <!-- LOCALIZATION NOTE (helpus.getInvolvedLink): This is a link title that links to http://www.mozilla.org/contribute/. --> <!ENTITY helpus.getInvolvedLink "se zapojte!"> <!ENTITY helpus.end ""> <!ENTITY releaseNotes.link "Co je nového"> <!-- LOCALIZATION NOTE (bottomLinks.license): This is a link title that links to about:license. --> <!ENTITY bottomLinks.license "Licence"> <!-- LOCALIZATION NOTE (bottomLinks.rights): This is a link title that links to about:rights. --> <!ENTITY bottomLinks.rights "O vašich právech"> <!-- LOCALIZATION NOTE (bottomLinks.privacy): This is a link title that links to https://www.mozilla.org/legal/privacy/. --> <!ENTITY bottomLinks.privacy "Ochrana soukromí"> <!-- LOCALIZATION NOTE (update.checkingForUpdates): try to make the localized text short (see bug 596813 for screenshots). --> <!ENTITY update.checkingForUpdates "Kontrola aktualizací…"> <!-- LOCALIZATION NOTE (update.noUpdatesFound): try to make the localized text short (see bug 596813 for screenshots). --> <!ENTITY update.noUpdatesFound "&brandShortName; je aktuální"> <!-- LOCALIZATION NOTE (update.adminDisabled): try to make the localized text short (see bug 596813 for screenshots). --> <!ENTITY update.adminDisabled "Aktualizace jsou zakázány správcem"> <!-- LOCALIZATION NOTE (update.otherInstanceHandlingUpdates): try to make the localized text short --> <!ENTITY update.otherInstanceHandlingUpdates "&brandShortName; je aktualizován jinou instancí"> <!ENTITY update.restarting "Restartování…"> <!-- LOCALIZATION NOTE (update.failed.start,update.failed.linkText,update.failed.end): update.failed.start, update.failed.linkText, and update.failed.end all go into one line with linkText being wrapped in an anchor that links to a site to download the latest version of Firefox (e.g. http://www.firefox.com). As this is all in one line, try to make the localized text short (see bug 596813 for screenshots). --> <!ENTITY update.failed.start "Aktualizace selhala. "> <!ENTITY update.failed.linkText "Stáhnout nejnovější verzi"> <!ENTITY update.failed.end ""> <!-- LOCALIZATION NOTE (update.manual.start,update.manual.end): update.manual.start and update.manual.end all go into one line and have an anchor in between with text that is the same as the link to a site to download the latest version of Firefox (e.g. http://www.firefox.com). As this is all in one line, try to make the localized text short (see bug 596813 for screenshots). --> <!ENTITY update.manual.start "Aktualizace jsou dostupné na "> <!ENTITY update.manual.end ""> <!-- LOCALIZATION NOTE (update.unsupported.start,update.unsupported.linkText,update.unsupported.end): update.unsupported.start, update.unsupported.linkText, and update.unsupported.end all go into one line with linkText being wrapped in an anchor that links to a site to provide additional information regarding why the system is no longer supported. As this is all in one line, try to make the localized text short (see bug 843497 for screenshots). --> <!ENTITY update.unsupported.start "Na tomto systému nelze provádět další aktualizace. "> <!ENTITY update.unsupported.linkText "Zjistit více"> <!ENTITY update.unsupported.end ""> <!-- LOCALIZATION NOTE (update.downloading.start,update.downloading.end): update.downloading.start and update.downloading.end all go into one line, with the amount downloaded inserted in between. As this is all in one line, try to make the localized text short (see bug 596813 for screenshots). The — is the "em dash" (long dash). example: Downloading update — 111 KB of 13 MB --> <!ENTITY update.downloading.start "Stahování aktualizace — "> <!ENTITY update.downloading.end ""> <!ENTITY update.applying "Aktualizace…"> <!-- LOCALIZATION NOTE (channel.description.start,channel.description.end): channel.description.start and channel.description.end create one sentence, with the current channel label inserted in between. example: You are currently on the _Stable_ update channel. --> <!ENTITY channel.description.start "Nyní používáte aktualizační kanál "> <!ENTITY channel.description.end "."> ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/aboutHealthReport.dtd ================================================ <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <!-- LOCALIZATION NOTE (abouthealth.pagetitle): Firefox Health Report is a proper noun in en-US, please keep this in mind. --> <!ENTITY abouthealth.pagetitle "Hlášení o zdraví aplikace &brandShortName;"> ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/aboutHome.dtd ================================================ <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd"> %brandDTD; <!ENTITY % syncBrandDTD SYSTEM "chrome://browser/locale/syncBrand.dtd"> %syncBrandDTD; <!-- These strings are used in the about:home page --> <!ENTITY abouthome.pageTitle "Startovní stránka aplikace &brandFullName;"> <!-- LOCALIZATION NOTE (abouthome.defaultSnippet1.v1): text in <a/> will be linked to the Firefox features page on mozilla.com --> <!ENTITY abouthome.defaultSnippet1.v1 "Děkujeme, že jste si vybrali Firefox! Abyste získali ze svého prohlížeče maximum, přečtěte si více o <a>nejnovějších funkcích</a>."> <!-- LOCALIZATION NOTE (abouthome.defaultSnippet2.v1): text in <a/> will be linked to the featured add-ons on addons.mozilla.org --> <!ENTITY abouthome.defaultSnippet2.v1 "Přizpůsobit si Firefox přesně podle vás je opravdu jednoduché. <a>Vyberte si z tisíce doplňků</a>."> <!-- LOCALIZATION NOTE (abouthome.rightsSnippet): text in <a/> will be linked to about:rights --> <!ENTITY abouthome.rightsSnippet "&brandFullName; je svobodný software s otevřeným zdrojovým kódem od Mozilla Foundation. <a>Poznejte svá práva…</a>"> <!ENTITY abouthome.bookmarksButton.label "Záložky"> <!ENTITY abouthome.historyButton.label "Historie"> <!-- LOCALIZATION NOTE (abouthome.preferencesButtonWin.label): The label for the preferences/options item on about:home on Windows --> <!ENTITY abouthome.preferencesButtonWin.label "Možnosti"> <!-- LOCALIZATION NOTE (abouthome.preferencesButtonUnix.label): The label for the preferences/options item on about:home on Linux and OS X --> <!ENTITY abouthome.preferencesButtonUnix.label "Předvolby"> <!ENTITY abouthome.addonsButton.label "Doplňky"> <!ENTITY abouthome.downloadsButton.label "Stahování"> <!ENTITY abouthome.syncButton.label "&syncBrand.shortName.label;"> <!-- LOCALIZATION NOTE (abouthome.aboutMozilla.label): The (invisible) label for the mozilla wordmark in the top-right corner that links to Mozilla's main about page. --> <!ENTITY abouthome.aboutMozilla.label "O Mozille"> ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/aboutPrivateBrowsing.dtd ================================================ <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <!ENTITY aboutPrivateBrowsing.notPrivate "Aktuálně nepracujete s anonymním oknem."> <!ENTITY privatebrowsingpage.openPrivateWindow.label "Otevřít anonymní okno"> <!ENTITY privatebrowsingpage.openPrivateWindow.accesskey "a"> <!ENTITY privateBrowsing.title "Anonymní prohlížení"> <!ENTITY privateBrowsing.title.tracking "Anonymní prohlížení s Ochranou proti sledování"> <!ENTITY aboutPrivateBrowsing.info.notsaved.before "Při použití anonymního okna Firefox "> <!ENTITY aboutPrivateBrowsing.info.notsaved.emphasize "neukládá"> <!ENTITY aboutPrivateBrowsing.info.notsaved.after ":"> <!ENTITY aboutPrivateBrowsing.info.visited "Navštívené stránky"> <!ENTITY aboutPrivateBrowsing.info.searches "Vyhledávání"> <!ENTITY aboutPrivateBrowsing.info.cookies "Cookies"> <!ENTITY aboutPrivateBrowsing.info.temporaryFiles "Dočasné soubory"> <!ENTITY aboutPrivateBrowsing.info.saved.before "Firefox "> <!ENTITY aboutPrivateBrowsing.info.saved.emphasize "bude ukládat"> <!ENTITY aboutPrivateBrowsing.info.saved.after2 " vaše:"> <!ENTITY aboutPrivateBrowsing.info.downloads "Stahování"> <!ENTITY aboutPrivateBrowsing.info.bookmarks "Záložky"> <!ENTITY aboutPrivateBrowsing.note.before "Ani s funkcí anonymního prohlížení "> <!ENTITY aboutPrivateBrowsing.note.emphasize "ale nebudete na internetu zcela neviditelní."> <!ENTITY aboutPrivateBrowsing.note.after " Váš zaměstnavatel nebo poskytovatel internetu mohou stále zjistit, jaké stránky navštěvujete."> <!ENTITY aboutPrivateBrowsing.learnMore3.before "Zjistit více o "> <!ENTITY aboutPrivateBrowsing.learnMore3.title "anonymním prohlížení"> <!ENTITY aboutPrivateBrowsing.learnMore3.after "."> <!ENTITY trackingProtection.title "Ochrana proti sledování"> <!ENTITY trackingProtection.description2 "Některé webové stránky používají prvky, které vás mohou sledovat napříč internetem. S ochranou proti sledování bude Firefox blokovat mnohé sledovací prvky, které o vás mohou sbírat informace."> <!ENTITY trackingProtection.startTour1 "Jak to funguje"> ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/aboutPrivateBrowsing.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. title.head=Anonymní prohlížení title.normal=Otevřít anonymní okno? ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/aboutRobots.dtd ================================================ <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <!-- These strings are used in the about:robots page, which ties in with the robots theme used in the Firefox 3 Beta 2/3 first run pages... https://www.mozilla.com/en-US/firefox/3.0b2/firstrun/ https://www.mozilla.com/en-US/firefox/3.0b3/firstrun/ They're just meant to be fun and whimsical, with references to some geeky but well-known robots in movies and books. Be creative with translations! --> <!-- Nonsense line from the movie "The Day The Earth Stood Still". No translation needed. --> <!ENTITY robots.pagetitle "Gort! Klaatu barada nikto!"> <!-- Movie: Logan's Run... Box (cybog): "Welcome Humans! I am ready for you." --> <!ENTITY robots.errorTitleText "Vítejte lidé!"> <!-- Movie: The Day The Earth Stood Still. Spoken by Klaatu. --> <!ENTITY robots.errorShortDescText "Přišli jsme vás navštívit v míru a přátelství!"> <!-- Various books by Isaac Asimov. http://en.wikipedia.org/wiki/Three_Laws_of_Robotics --> <!ENTITY robots.errorLongDesc1 "Robot nesmí ublížit člověku nebo svou nečinností dopustit, aby mu bylo ublíženo."> <!-- Movie: Blade Runner. Batty: "I've seen things you people wouldn't believe..." --> <!ENTITY robots.errorLongDesc2 "Roboti viděli věci, kterým byste vy lidi nevěřili."> <!-- Book: Hitchiker's Guide To The Galaxy. What the Sirius Cybernetics Corporation calls robots. --> <!ENTITY robots.errorLongDesc3 "Roboti jsou vaši plastikoví kámoši, se kterými je radost pobývat."> <!-- TV: Futurama. Bender's first line is "Bite my shiny metal ass." --> <!ENTITY robots.errorLongDesc4 "Roboti mají lesklý kovový zadek, který se nesmí líbat."> <!-- TV: Battlestar Galactica (2004 series). From the opening text. --> <!ENTITY robots.errorTrailerDescText "A oni mají plán."> <!-- TV: Battlestar Galactica (2004 series). Common expletive referring to Cylons. --> <!ENTITY robots.imgtitle "Frakkin' Toasters"> <!-- Book: Hitchiker's Guide To The Galaxy. Arthur presses a button and it warns him. --> <!ENTITY robots.dontpress "Prosím, už ten knoflík víckrát nemačkejte."> ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/aboutSearchReset.dtd ================================================ <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <!ENTITY searchreset.tabtitle "Obnovit nastavení vyhledávání"> <!ENTITY searchreset.pageTitle "Chcete obnovit vaše nastavení vyhledávání?"> <!ENTITY searchreset.pageInfo1 "Vaše nastavení vyhledávání může být zastaralé. &brandShortName; vám může pomoci obnovit výchozí nastavení vyhledávání."> <!-- LOCALIZATION NOTE (searchreset.selector.label): this string is followed by a dropdown of all the built-in search engines. --> <!ENTITY searchreset.selector.label "Toto nastaví váš výchozí vyhledávač na"> <!-- LOCALIZATION NOTE (searchreset.beforelink.pageInfo, searchreset.afterlink.pageInfo): these two string are used respectively before and after the "Settings page" link (searchreset.link.pageInfo2). Localizers can use one of them, or both, to better adapt this sentence to their language. --> <!ENTITY searchreset.beforelink.pageInfo2 "Tato nastavení můžete změnit kdykoliv na stránce "> <!ENTITY searchreset.afterlink.pageInfo2 "."> <!ENTITY searchreset.link.pageInfo2 "Nastavení"> <!ENTITY searchreset.noChangeButton "Neměnit"> <!ENTITY searchreset.noChangeButton.access "N"> <!ENTITY searchreset.changeEngineButton "Změnit vyhledávač"> <!ENTITY searchreset.changeEngineButton.access "Z"> ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/aboutSessionRestore.dtd ================================================ <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <!ENTITY restorepage.tabtitle "Obnovení relace"> <!-- LOCALIZATION NOTE: The title is intended to be apologetic and disarming, expressing dismay and regret that we are unable to restore the session for the user --> <!ENTITY restorepage.errorTitle "Ale toto je nepříjemné."> <!ENTITY restorepage.problemDesc "&brandShortName; má potíže s obnovením otevřených oken a panelů, což je většinou způsobeno některou z naposledy otevřených webových stránek."> <!ENTITY restorepage.tryThis "Můžete zkusit:"> <!ENTITY restorepage.restoreSome "Odebrat jeden nebo více problémových panelů"> <!ENTITY restorepage.startNew "Začít s prohlížením v nové relaci"> <!ENTITY restorepage.tryagainButton "Obnovit"> <!ENTITY restorepage.restore.access "b"> <!ENTITY restorepage.closeButton "Zavřít"> <!ENTITY restorepage.close.access "Z"> <!ENTITY restorepage.restoreHeader "Obnovit"> <!ENTITY restorepage.listHeader "Okna a panely"> <!-- LOCALIZATION NOTE: %S will be replaced with a number. --> <!ENTITY restorepage.windowLabel "Okno #%S"> <!-- LOCALIZATION NOTE: The following 'welcomeback2' strings are for about:welcomeback, not for about:sessionstore --> <!ENTITY welcomeback2.restoreButton "Pojďme na to!"> <!ENTITY welcomeback2.restoreButton.access "P"> <!ENTITY welcomeback2.tabtitle "Úspěch!"> <!ENTITY welcomeback2.pageTitle "Úspěch!"> <!ENTITY welcomeback2.pageInfo1 "&brandShortName; je připravený."> <!ENTITY welcomeback2.label.restoreAll "Obnovit všechna okna a panely"> <!ENTITY welcomeback2.label.restoreSome "Obnovit pouze ty, které chcete"> <!-- LOCALIZATION NOTE (welcomeback2.beforelink.pageInfo2, welcomeback2.afterlink.pageInfo2): these two string are used respectively before and after the the "learn more" link (welcomeback2.link.pageInfo2). Localizers can use one of them, or both, to better adapt this sentence to their language. --> <!ENTITY welcomeback2.beforelink.pageInfo2 "Vaše doplňky a přizpůsobení bylo odebráno a nastavení prohlížeče bylo obnoveno do výchozího stavu. Pokud to nevyřeší váš problém, "> <!ENTITY welcomeback2.afterlink.pageInfo2 ""> <!ENTITY welcomeback2.link.pageInfo2 "přečtěte si více o tom, co můžete dělat."> ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/aboutSyncTabs.dtd ================================================ <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <!-- LOCALIZATION NOTE (tabs.otherDevices.label): Keep this in sync with syncTabsMenu2.label from browser.dtd --> <!ENTITY tabs.otherDevices.label "Panely z jiných zařízení"> <!ENTITY tabs.searchText.label "Vložte text pro nalezení panelů…"> <!-- LOCALIZATION NOTE (tabs.context.openTab.accesskey, tabs.context.openMultipleTabs.accesskey): Only one of these will show at a time (based on selection), so reusing accesskey is ok. --> <!ENTITY tabs.context.openTab.label "Otevřít tento panel"> <!ENTITY tabs.context.openTab.accesskey "O"> <!ENTITY tabs.context.openMultipleTabs.label "Otevřít zvolené panely"> <!ENTITY tabs.context.openMultipleTabs.accesskey "O"> <!ENTITY tabs.context.bookmarkSingleTab.label "Přidat panel do záložek…"> <!ENTITY tabs.context.bookmarkSingleTab.accesskey "P"> <!ENTITY tabs.context.bookmarkMultipleTabs.label "Přidat vybrané panely do záložek…"> <!ENTITY tabs.context.bookmarkMultipleTabs.accesskey "P"> <!ENTITY tabs.context.refreshList.label "Obnovit seznam"> <!ENTITY tabs.context.refreshList.accesskey "b"> ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/aboutTabCrashed.dtd ================================================ <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <!ENTITY tabCrashed.closeTab "Zavřít tento panel"> <!ENTITY tabCrashed.restoreTab "Obnovit tento panel"> <!ENTITY tabCrashed.restoreAll "Obnovit všechny spadlé panely"> <!-- LOCALIZATION NOTE (tabCrashed.header2): "Gah" is an English slang word used to express surprise or frustration (or both at the same time). We are using it to communicate in an informal way that it is both frustrating that your tab crashed and a surprise that we didn't want to happen. If you have a similar word or short phrase that is not profane or vulgar, use it. If not, feel free to skip the word in your translation. --> <!ENTITY tabCrashed.header2 "Jejda. Váš panel právě spadl."> <!ENTITY tabCrashed.offerHelp "Můžeme vám pomoci!"> <!ENTITY tabCrashed.single.offerHelpMessage "Zvolte &tabCrashed.restoreTab; pro načtení obsahu stránky."> <!ENTITY tabCrashed.multiple.offerHelpMessage "Zvolte &tabCrashed.restoreTab; nebo &tabCrashed.restoreAll; pro načteni obsahu stránky."> <!ENTITY tabCrashed.requestHelp "Pomůžete nám?"> <!ENTITY tabCrashed.requestHelpMessage "Hlášení o pádech nám pomáhají rozpoznat problémy a aplikaci &brandShortName; dále zlepšovat."> <!ENTITY tabCrashed.requestReport "Nahlásit tento panel"> <!ENTITY tabCrashed.sendReport2 "Odeslat hlášení o pádu zobrazeného panelu"> <!ENTITY tabCrashed.commentPlaceholder2 "Přidat komentář (komentáře jsou veřejně dostupné)"> <!ENTITY tabCrashed.includeURL2 "Zahrnout do tohoto hlášení o pádu také URL adresu stránky"> <!ENTITY tabCrashed.emailPlaceholder "Zde vložte svoji e-mailovou adresu"> <!ENTITY tabCrashed.emailMe "Informovat mě e-mailem, až bude k dispozici více informací"> <!ENTITY tabCrashed.reportSent "Hlášení o pádu bylo odesláno; děkujeme, že nám pomáháte &brandShortName; vylepšovat!"> <!ENTITY tabCrashed.requestAutoSubmit2 "Nahlásit panely na pozadí"> <!ENTITY tabCrashed.autoSubmit2 "Nastavit předvolby tak, aby byla hlášení o pádu odesílána automaticky na pozadí, včetně informací o spadlých panelech z této relace a budoucích relací"> ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/accounts.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE (reconnectDescription) - %S = Email address of user's Firefox Account reconnectDescription = Znovu připojit %S # LOCALIZATION NOTE (verifyDescription) - %S = Email address of user's Firefox Account verifyDescription = Ověřit %S # These strings are shown in a desktop notification after the # user requests we resend a verification email. verificationSentTitle = Ověření odesláno # LOCALIZATION NOTE (verificationSentBody) - %S = Email address of user's Firefox Account verificationSentBody = Odkaz pro ověření byl odeslán na %S. verificationNotSentTitle = Ověření nelze odeslat verificationNotSentBody = V tuto chvíli nemůžeme ověřovací email odeslat, zkuste to prosím znovu později. # LOCALIZATION NOTE (deviceConnectedTitle, deviceConnectedBody, deviceConnectedBody.noDeviceName) # These strings are used in a notification shown when a new device joins the Sync account. # deviceConnectedBody.noDeviceName is shown instead of deviceConnectedBody when we # could not get the device name that joined deviceConnectedTitle = Firefox Sync deviceConnectedBody = Tento počítač se nyní synchronizuje s %S. deviceConnectedBody.noDeviceName = Tento počítač se nyní synchronizuje s novým zařízením. # LOCALIZATION NOTE (syncStartNotification.title, syncStartNotification.body) # These strings are used in a notification shown after Sync is connected. syncStartNotification.title = Synchronizace povolena # %S is brandShortName syncStartNotification.body2 = %S se za okamžik začne synchronizovat. # LOCALIZATION NOTE (deviceDisconnectedNotification.title, deviceDisconnectedNotification.body) # These strings are used in a notification shown after Sync was disconnected remotely. deviceDisconnectedNotification.title = Synchronizace odpojena deviceDisconnectedNotification.body = Tento počítač byl úspěšně odpojen od Firefox Sync. # LOCALIZATION NOTE (sendTabToAllDevices.menuitem) # Displayed in the Send Tabs context menu when right clicking a tab, a page or a link. sendTabToAllDevices.menuitem = Všechna zařízení # LOCALIZATION NOTE (tabArrivingNotification.title, tabArrivingNotificationWithDevice.title, # tabsArrivingNotification.title, unnamedTabsArrivingNotification2.body, # unnamedTabsArrivingNotificationMultiple2.body, unnamedTabsArrivingNotificationNoDevice.body) # These strings are used in a notification shown when we're opening tab(s) another device sent us to display. # LOCALIZATION NOTE (tabArrivingNotification.title, tabArrivingNotificationWithDevice.title) # The body for these is the URL of the tab recieved tabArrivingNotification.title = Přijaté panely # LOCALIZATION NOTE (tabArrivingNotificationWithDevice.title) %S is the device name tabArrivingNotificationWithDevice.title = Panely z %S tabsArrivingNotification.title = Přijato několik panelů # LOCALIZATION NOTE (unnamedTabsArrivingNotification2.body): # Semi-colon list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 is the number of tabs received and #2 is the device name. unnamedTabsArrivingNotification2.body = Byl přijat #1 panel ze zařízení #2;Byly přijaty #1 panely ze zařízení #2;Bylo přijato #1 panelů ze zařízení #2 # LOCALIZATION NOTE (unnamedTabsArrivingNotificationMultiple2.body): # Semi-colon list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 is the number of tabs received. unnamedTabsArrivingNotificationMultiple2.body = Byl přijat #1 panel z vašich připojených zařízení;Byly přijaty #1 panely z vašich připojených zařízení;Bylo přijato #1 panelů z vašich připojených zařízení # LOCALIZATION NOTE (unnamedTabsArrivingNotificationNoDevice.body): # Semi-colon list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 is the number of tabs received # This version is used when we don't know any device names. unnamedTabsArrivingNotificationNoDevice.body = Byl přijat #1 panel;Byly přijaty #1 panely;Bylo přijato #1 panelů ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/appstrings.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. malformedURI=Adresa URL je neplatná a nemůže být načtena. fileNotFound=Firefox nemůže nalézt soubor %S. fileAccessDenied=Soubor na adrese %S je nečitelný. dnsNotFound=Firefox nemůže nalézt server %S. unknownProtocolFound=Firefox nemůže otevřít tuto adresu, protože jeden z následujících protokolů (%S) není asociován s žádným programem nebo není v tomto kontextu povolen. connectionFailure=Firefox nemůže navázat spojení se serverem %S. netInterrupt=Spojení se serverem %S bylo v průběhu načítání stránky ukončeno. netTimeout=Při pokusu kontaktovat server %S vypršel časový limit. redirectLoop=Server přesměrovává požadavky na tuto adresu sám na sebe, a to takovým způsobem, který zabraňuje jejich dokončení. ## LOCALIZATION NOTE (confirmRepostPrompt): In this item, don’t translate "%S" confirmRepostPrompt=Pro zobrazení této stránky musí %S znovu odeslat požadavek, který zopakuje akci (jako např. hledání nebo potvrzení objednávky), která byla provedena již dříve. resendButton.label=Znovu odeslat unknownSocketType=Firefox neví, jak má komunikovat s tímto serverem. netReset=Spojení se serverem bylo v průběhu načítání stránky ukončeno. notCached=Tento dokument již není dostupný. netOffline=Webová stránka je nedostupná, protože je nyní Firefox v režimu offline. isprinting=Dokument nelze měnit při tisku nebo při náhledu tisku. deniedPortAccess=Tato adresa obsahuje číslo portu, které se obvykle používá k jiným účelům než je prohlížení webových stránek. Z bezpečnostních důvodů Firefox tento požadavek zrušil. proxyResolveFailure=Firefox je nastaven, aby používal proxy server, který nelze nalézt. proxyConnectFailure=Firefox je nastaven, aby používal proxy server, který odmítá spojení. contentEncodingError=Stránka, kterou se snažíte načíst, nemůže být zobrazena, protože server používá neplatný či nepodporovaný způsob komprimace dat. unsafeContentType=Požadovanou stránku nelze zobrazit, protože je obsažena v typu souboru, který není bezpečné otevírat. Kontaktujte prosím vlastníky webového serveru a informujte je o tomto problému. externalProtocolTitle=Požadavek externího protokolu externalProtocolPrompt=Pro obsluhu odkazu %1$S: musí být spuštěna externí aplikace. Požadovaný odkaz:\n\n\n%2$S\nAplikace: %3$S\n\n\nPokud jste tento požadavek neočekávali, jedná se možná o pokus o zneužití slabin externí aplikace. Pokud si nejste jisti, že tento požadavek není zákeřný, doporučujeme ho zrušit. #LOCALIZATION NOTE (externalProtocolUnknown): The following string is shown if the application name can't be determined externalProtocolUnknown=<Neznámá aplikace> externalProtocolChkMsg=Zapamatovat si tuto volbu pro všechny odkazy stejného typu. externalProtocolLaunchBtn=Spustit aplikaci malwareBlocked=Stránka %S byla nahlášena jako útočná stránka a tak byla na základě vašeho nastavení zablokována. unwantedBlocked=Stránka %S byla nahlášena jako stránka s nevyžádaným software a byla zablokována na základě vašeho bezpečnostního nastavení. deceptiveBlocked=Tato webová stránka na serveru %S byla nahlášena jako klamavá, a proto byla na základě vašeho bezpečnostního nastavení zablokována. cspBlocked=Bezpečnostní pravidla této stránky jí nedovolí, aby byla načítána tímto způsobem. corruptedContentErrorv2=Při načítání adresy %S došlo k porušení síťového protokolu, které nelze opravit. remoteXUL=Tato stránka využívá nepodporovanou technologii, která není ve výchozím nastavení Firefoxu povolena. ## LOCALIZATION NOTE (sslv3Used) - Do not translate "%S". sslv3Used=Firefox nemůže garantovat bezpečnost vašich dat, protože server %S používá bezpečnostní protokol SSLv3, který již byl prolomen. inadequateSecurityError=Webová stránka se pokusila domluvit neadekvátní úroveň zabezpečení. ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/baseMenuOverlay.dtd ================================================ <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <!ENTITY minimizeWindow.key "m"> <!ENTITY minimizeWindow.label "Minimalizovat"> <!ENTITY bringAllToFront.label "Přenést vše do popředí"> <!ENTITY zoomWindow.label "Zvětšit okno"> <!ENTITY windowMenu.label "Okno"> <!ENTITY helpMenu.label "Nápověda"> <!ENTITY helpMenu.accesskey "v"> <!-- LOCALIZATION NOTE some localizations of Windows (ex:french, german) use "?" for the help button in the menubar but Gnome does not. --> <!ENTITY helpMenuWin.label "Nápověda"> <!ENTITY helpMenuWin.accesskey "v"> <!ENTITY aboutProduct2.label "O aplikaci &brandShorterName;"> <!ENTITY aboutProduct2.accesskey "O"> <!ENTITY productHelp2.label "Nápověda aplikace &brandShorterName;"> <!ENTITY productHelp2.accesskey "N"> <!ENTITY helpMac.commandkey "?"> <!ENTITY helpKeyboardShortcuts.label "Klávesové zkratky"> <!ENTITY helpKeyboardShortcuts.accesskey "K"> <!ENTITY helpSafeMode.label "Restartovat se zakázanými doplňky…"> <!ENTITY helpSafeMode.accesskey "R"> <!ENTITY helpSafeMode.stop.label "Restartovat s povolenými doplňky"> <!ENTITY helpSafeMode.stop.accesskey "R"> <!ENTITY healthReport2.label "Hlášení o zdraví aplikace &brandShorterName;"> <!ENTITY healthReport2.accesskey "H"> <!ENTITY helpTroubleshootingInfo.label "Technické informace"> <!ENTITY helpTroubleshootingInfo.accesskey "T"> <!ENTITY helpFeedbackPage.label "Odeslat zpětnou vazbu…"> <!ENTITY helpFeedbackPage.accesskey "d"> <!ENTITY helpShowTour2.label "Průvodce aplikací &brandShorterName;"> <!ENTITY helpShowTour2.accesskey "P"> <!ENTITY preferencesCmdMac.label "Předvolby…"> <!ENTITY preferencesCmdMac.commandkey ","> <!ENTITY servicesMenuMac.label "Služby"> <!ENTITY hideThisAppCmdMac2.label "Skrýt &brandShorterName;"> <!ENTITY hideThisAppCmdMac2.commandkey "H"> <!ENTITY hideOtherAppsCmdMac.label "Skrýt ostatní"> <!ENTITY hideOtherAppsCmdMac.commandkey "H"> <!ENTITY showAllAppsCmdMac.label "Zobrazit vše"> ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/bookmarks.html ================================================ <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <!DOCTYPE NETSCAPE-Bookmark-file-1> <meta charset="UTF-8"> <title>Záložky

      Záložky

      Složka lišty záložek

      Pro zobrazení záložky v liště záložek stačí přidat záložku do této složky

      Jak začít

      Mozilla Firefox

      Nápověda a návody
      Přizpůsobení Firefoxu
      Zapojte se
      O nás
      ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/browser.dtd ================================================ cookies"> historii"> panely a okna"> ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/browser.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. nv_timeout=Čas vypršel openFile=Otevřít soubor droponhometitle=Nastavení domovské stránky droponhomemsg=Chcete nastavit tento dokument jako novou domovskou stánku? droponhomemsgMultiple=Chcete nastavit tyto dokumenty jako nové domovské stránky? # context menu strings # LOCALIZATION NOTE (contextMenuSearch): %1$S is the search engine, # %2$S is the selection string. contextMenuSearch=Hledat „%2$S“ na webu „%1$S“ contextMenuSearch.accesskey=H # bookmark dialog strings bookmarkAllTabsDefault=[Název složky] xpinstallPromptMessage=Aplikace %S zabránila této stránce v dotazu na instalaci softwaru do vašeho počítače. xpinstallPromptMessage.dontAllow=Nepovolit xpinstallPromptMessage.dontAllow.accesskey=N xpinstallPromptAllowButton=Povolit # Accessibility Note: # Be sure you do not choose an accesskey that is used elsewhere in the active context (e.g. main menu bar, submenu of the warning popup button) # See http://www.mozilla.org/access/keyboard/accesskey for details xpinstallPromptAllowButton.accesskey=P xpinstallDisabledMessageLocked=Instalace softwaru byla zakázána správcem vašeho systému. xpinstallDisabledMessage=Instalace softwaru je v současnosti zakázána. Klepněte na Povolit a zkuste to prosím znovu. xpinstallDisabledButton=Povolit xpinstallDisabledButton.accesskey=P # LOCALIZATION NOTE (webextPerms.header) # This string is used as a header in the webextension permissions dialog, # %S is replaced with the localized name of the extension being installed. # See https://bug1308309.bmoattachments.org/attachment.cgi?id=8814612 # for an example of the full dialog. # Note, this string will be used as raw markup. Avoid characters like <, >, & webextPerms.header=Přidat %S? # LOCALIZATION NOTE (webextPerms.listIntro) # This string will be followed by a list of permissions requested # by the webextension. webextPerms.listIntro=To vyžaduje vaše povolení oprávnění: webextPerms.add.label=Přidat webextPerms.add.accessKey=P webextPerms.cancel.label=Zrušit webextPerms.cancel.accessKey=Z # LOCALIZATION NOTE (webextPerms.sideloadMenuItem) # %1$S will be replaced with the localized name of the sideloaded add-on. # %2$S will be replace with the name of the application (e.g., Firefox, Nightly) webextPerms.sideloadMenuItem=Doplněk %1$S byl přidán do aplikace %2$S # LOCALIZATION NOTE (webextPerms.sideloadHeader) # This string is used as a header in the webextension permissions dialog # when the extension is side-loaded. # %S is replaced with the localized name of the extension being installed. # Note, this string will be used as raw markup. Avoid characters like <, >, & webextPerms.sideloadHeader=Doplněk %S byl přidán webextPerms.sideloadText2=Jiný program ve vašem počítači nainstaloval doplněk, který může ovlivnit váš prohlížeč. Prosím ověřte požadavky na oprávnění tohoto doplňku a zvolte Povolit nebo Zrušit (chcete-li jej ponechat zakázaný). webextPerms.sideloadTextNoPerms=Jiný program ve vašem počítači nainstaloval doplněk, který může ovlivnit váš prohlížeč. Prosím zvolte Povolit nebo Zrušit (chcete-li jej ponechat zakázaný). webextPerms.sideloadEnable.label=Povolit webextPerms.sideloadEnable.accessKey=P webextPerms.sideloadCancel.label=Zrušit webextPerms.sideloadCancel.accessKey=Z # LOCALIZATION NOTE (webextPerms.updateMenuItem) # %S will be replaced with the localized name of the extension which # has been updated. webextPerms.updateMenuItem=Doplněk %S vyžaduje nová oprávnění # LOCALIZATION NOTE (webextPerms.updateText) # %S is replaced with the localized name of the updated extension. # Note, this string will be used as raw markup. Avoid characters like <, >, & webextPerms.updateText=Doplněk %S byl aktualizován. Před instalací aktualizované verze je nutné schválit nová oprávnění. Zvolením „Zrušit“ bude zachována aktuální verze doplňku. webextPerms.updateAccept.label=Aktualizovat webextPerms.updateAccept.accessKey=A webextPerms.description.bookmarks=Číst a upravovat záložky webextPerms.description.clipboardRead=Získat data ze schránky webextPerms.description.clipboardWrite=Vkládat data do schránky webextPerms.description.downloads=Stahovat soubory a číst a upravovat historii stahování prohlížeče webextPerms.description.geolocation=Přistupovat k vaší poloze webextPerms.description.history=Přistupovat k historii prohlížení # LOCALIZATION NOTE (webextPerms.description.nativeMessaging) # %S will be replaced with the name of the application webextPerms.description.nativeMessaging=Vyměňovat si zprávy s jinými programy než %S webextPerms.description.notifications=Zobrazovat vám oznámení webextPerms.description.privacy=Číst a upravovat osobní nastavení webextPerms.description.sessions=Přistupovat k nedávno zavřeným panelům webextPerms.description.tabs=Přistupovat k panelům prohlížeče webextPerms.description.topSites=Přistupovat k historii prohlížení webextPerms.description.webNavigation=Přistupovat k aktivitám prohlížeče během prohlížení webextPerms.hostDescription.allUrls=Přistupovat k vašim datům pro všechny webové stránky # LOCALIZATION NOTE (webextPerms.hostDescription.wildcard) # %S will be replaced by the DNS domain for which a webextension # is requesting access (e.g., mozilla.org) webextPerms.hostDescription.wildcard=Přistupovat k vašim datům pro webovou stránku na doméně %S # LOCALIZATION NOTE (webextPerms.hostDescription.tooManyWildcards): # Semi-colon list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 will be replaced by an integer indicating the number of additional # domains for which this webextension is requesting permission. webextPerms.hostDescription.tooManyWildcards=Přistupovat k vašim datům pro #1 další doménu;Přistupovat k vašim datům pro #1 další domény;Přistupovat k vašim datům pro #1 dalších domén # LOCALIZATION NOTE (webextPerms.hostDescription.oneSite) # %S will be replaced by the DNS host name for which a webextension # is requesting access (e.g., www.mozilla.org) webextPerms.hostDescription.oneSite=Přistupovat k vašim datům pro %S # LOCALIZATION NOTE (webextPerms.hostDescription.tooManySites) # Semi-colon list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 will be replaced by an integer indicating the number of additional # hosts for which this webextension is requesting permission. webextPerms.hostDescription.tooManySites=Přistupovat k vašim datům pro #1 další stránku;Přistupovat k vašim datům pro #1 další stránky;Přistupovat k vašim datům pro #1 dalších stránek # LOCALIZATION NOTE (addonPostInstall.message) # %1$S is replaced with the localized named of the extension that was # just installed. # %2$S is replaced with the localized name of the application. addonPostInstall.message1=Doplněk %1$S byl přidán do aplikace %2$S. # LOCALIZATION NOTE (addonPostInstall.messageDetail) # %1$S is replaced with the icon for the add-ons menu. # %2$S is replaced with the icon for the toolbar menu. # Note, this string will be used as raw markup. Avoid characters like <, >, & addonPostInstall.okay.label=OK addonPostInstall.okay.key=O # LOCALIZATION NOTE (addonDownloadingAndVerifying): # Semicolon-separated list of plural forms. See: # http://developer.mozilla.org/en/docs/Localization_and_Plurals # Also see https://bugzilla.mozilla.org/show_bug.cgi?id=570012 for mockups addonDownloadingAndVerifying=Stahování a ověřování doplňku…;Stahování a ověřování #1 doplňků…;Stahování a ověřování #1 doplňků… addonDownloadVerifying=Ověřování addonInstall.unsigned=(Neověřeno) addonInstall.cancelButton.label=Zrušit addonInstall.cancelButton.accesskey=Z addonInstall.acceptButton.label=Instalovat addonInstall.acceptButton.accesskey=I # LOCALIZATION NOTE (addonConfirmInstallMessage,addonConfirmInstallUnsigned): # Semicolon-separated list of plural forms. See: # http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 is brandShortName # #2 is the number of add-ons being installed addonConfirmInstall.message=Tato stránka chce nainstalovat doplněk do aplikace #1:;Tato stránka chce nainstalovat #2 doplňky do aplikace #1:;Tato stránka chce nainstalovat #2 doplňků do aplikace #1: addonConfirmInstallUnsigned.message=Upozornění: Tato stránka chce nainstalovat neověřený doplněk do aplikace #1. Pokračujte na vlastní riziko.;Upozornění: Tato stránka chce nainstalovat #2 neověřené doplňky do aplikace #1. Pokračujte na vlastní riziko.;Upozornění: Tato stránka chce nainstalovat #2 neověřených doplňků do aplikace #1. Pokračujte na vlastní riziko. # LOCALIZATION NOTE (addonConfirmInstallSomeUnsigned.message): # Semicolon-separated list of plural forms. See: # http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 is brandShortName # #2 is the total number of add-ons being installed (at least 2) addonConfirmInstallSomeUnsigned.message=;Upozornění: Tato stránka chce nainstalovat #2 doplňky do aplikace #1, z nichž některé jsou neověřené. Pokračujte na vlastní riziko.;Upozornění: Tato stránka chce nainstalovat #2 doplňků do aplikace #1, z nichž některé jsou neověřené. Pokračujte na vlastní riziko. addonwatch.slow=%1$S může způsobovat, že %2$S běží pomalu addonwatch.disable.label=Zakázat %S addonwatch.ignoreSession.label=Ignorovat nyní addonwatch.ignoreSession.accesskey=I addonwatch.ignorePerm.label=Ignorovat trvale addonwatch.ignorePerm.accesskey=t addonwatch.restart.message=Chcete-li zakázat %1$S, je nutné restartovat %2$S addonwatch.restart.label=Restartovat %S addonwatch.restart.accesskey=R # LOCALIZATION NOTE (addonsInstalled, addonsInstalledNeedsRestart): # Semicolon-separated list of plural forms. See: # http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 first add-on's name, #2 number of add-ons, #3 application name addonsInstalled=Doplněk #1 byl úspěšně nainstalován.;#2 doplňky byly úspěšně nainstalovány.;#2 doplňků bylo úspěšně nainstalováno. addonsInstalledNeedsRestart=Doplněk #1 bude nainstalován po restartu aplikace #3.;#2 doplňky budou nainstalovány po restartu aplikace #3.;#2 doplňků bude nainstalováno po restartu aplikace #3. addonInstallRestartButton=Restartovat addonInstallRestartButton.accesskey=R addonInstallRestartIgnoreButton=Nyní ne addonInstallRestartIgnoreButton.accesskey=N # LOCALIZATION NOTE (addonInstallError-1, addonInstallError-2, addonInstallError-3, addonInstallError-4, addonInstallError-5, addonLocalInstallError-1, addonLocalInstallError-2, addonLocalInstallError-3, addonLocalInstallError-4, addonLocalInstallError-5): # %1$S is the application name, %2$S is the add-on name addonInstallError-1=Doplněk nemohl být stažen z důvodu selhání připojení. addonInstallError-2=Doplněk nemohl být nainstalován, protože neodpovídá doplňku, který je očekáván aplikací %1$S. addonInstallError-3=Doplněk stažený z tohoto serveru nemohl být nainstalován, protože je poškozený. addonInstallError-4=Doplněk %2$S nemohl být nainstalován, protože aplikace %1$S nemohla změnit potřebné soubory. addonInstallError-5=Aplikace %1$S zabránila tomuto serveru v instalaci neověřeného doplňku. addonLocalInstallError-1=Tento doplněk nemohl být nainstalován z důvodu chyby souborového systému. addonLocalInstallError-2=Tento doplněk nemohl být nainstalován, protože neodpovídá doplňku, který je očekáván aplikací %1$S. addonLocalInstallError-3=Tento doplněk nemohl být nainstalován, protože je poškozený. addonLocalInstallError-4=Doplněk %2$S nemohl být nainstalován, protože aplikace %1$S nemohla změnit potřebné soubory. addonLocalInstallError-5=Tento doplněk nemohl být nainstalován, protože nebyl ověřen. # LOCALIZATION NOTE (addonInstallErrorIncompatible): # %1$S is the application name, %2$S is the application version, %3$S is the add-on name addonInstallErrorIncompatible=Doplněk %3$S nemohl být nainstalován, protože není kompatibilní s aplikací %1$S %2$S. # LOCALIZATION NOTE (addonInstallErrorBlocklisted): %S is add-on name addonInstallErrorBlocklisted=%S nemohl být nainstalován, protože existuje vysoké riziko nestability nebo bezpečnostních problémů. unsignedAddonsDisabled.message=Jeden nebo více nainstalovaných doplňků nelze ověřit, a proto byly zakázány. unsignedAddonsDisabled.learnMore.label=Zjistit více unsignedAddonsDisabled.learnMore.accesskey=Z # LOCALIZATION NOTE (compactLightTheme.name): This is displayed in about:addons -> Appearance compactLightTheme.name=Kompaktní světlý compactLightTheme.description=Kompaktní vzhled se světlým barevným tématem. # LOCALIZATION NOTE (compactDarkTheme.name): This is displayed in about:addons -> Appearance compactDarkTheme.name=Kompaktní tmavý compactDarkTheme.description=Kompaktní vzhled s tmavým barevným tématem. # LOCALIZATION NOTE (lwthemeInstallRequest.message): %S will be replaced with # the host name of the site. lwthemeInstallRequest.message=Server (%S) se pokusil nainstalovat motiv vzhledu. lwthemeInstallRequest.allowButton=Povolit lwthemeInstallRequest.allowButton.accesskey=P lwthemePostInstallNotification.message=Byl nainstalován nový motiv vzhledu. lwthemePostInstallNotification.undoButton=Vrátit zpět lwthemePostInstallNotification.undoButton.accesskey=V lwthemePostInstallNotification.manageButton=Spravovat motivy… lwthemePostInstallNotification.manageButton.accesskey=S # LOCALIZATION NOTE (lwthemeNeedsRestart.message): # %S will be replaced with the new theme name. lwthemeNeedsRestart.message=Motiv %S bude nainstalován po restartu aplikace. lwthemeNeedsRestart.button=Restartovat lwthemeNeedsRestart.accesskey=R # LOCALIZATION NOTE (popupWarning.message): Semicolon-separated list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 is brandShortName and #2 is the number of pop-ups blocked. popupWarning.message=Aplikace #1 zabránila stránce otevřít vyskakovací okno.;Aplikace #1 zabránila stránce otevřít #2 vyskakovací okna;Aplikace #1 zabránila stránce otevřít #2 vyskakovacích oken. popupWarningButton=Možnosti popupWarningButton.accesskey=M popupWarningButtonUnix=Předvolby popupWarningButtonUnix.accesskey=P popupAllow=Povolit vyskakovací okna pro %S popupBlock=Blokovat vyskakovací okna pro %S popupWarningDontShowFromMessage=Při blokování vyskakovacích oken nezobrazovat tuto zprávu popupWarningDontShowFromLocationbar=Při blokování vyskakovacích oken nezobrazovat informační lištu popupShowPopupPrefix=Zobrazit „%S“ # Bad Content Blocker Doorhanger Notification # %S is brandShortName badContentBlocked.blocked.message=Aplikace %S blokuje obsah z této stránky. badContentBlocked.notblocked.message=Aplikace %S neblokuje žádný obsah z této stránky. crashedpluginsMessage.title=Zásuvný modul %S spadl. crashedpluginsMessage.reloadButton.label=Obnovit stránku crashedpluginsMessage.reloadButton.accesskey=O crashedpluginsMessage.submitButton.label=Odeslat hlášení o pádu crashedpluginsMessage.submitButton.accesskey=d crashedpluginsMessage.learnMore=Zjistit více… # Keyword fixup messages # LOCALIZATION NOTE (keywordURIFixup.message): Used when the user tries to visit # a local host page, by the time the DNS request recognizes it, we have already # loaded a search page for the given word. An infobar then asks to the user # whether he rather wanted to visit the host. %S is the recognized host. keywordURIFixup.message=Nechcete spíše přejít na %S? keywordURIFixup.goTo=Ano, přejít na %S keywordURIFixup.goTo.accesskey=A keywordURIFixup.dismiss=Ne, děkuji keywordURIFixup.dismiss.accesskey=N ## Plugin doorhanger strings # LOCALIZATION NOTE (pluginActivateNew.message): Used for newly-installed # plugins which are not known to be unsafe. %1$S is the plugin name and %2$S # is the site domain. pluginActivateNew.message=Povolit %2$S spustit „%1$S“? pluginActivateMultiple.message=Povolit %S spustit zásuvné moduly? pluginActivate.learnMore=Zjistit více… # LOCALIZATION NOTE (pluginActivateOutdated.message, pluginActivateOutdated.label): # These strings are used when an unsafe plugin has an update available. # %1$S is the plugin name, %2$S is the domain, and %3$S is brandShortName. pluginActivateOutdated.message=Aplikace %3$S zabránila spuštění neaktuálního zásuvného modulu „%1$S“ na %2$S. pluginActivateOutdated.label=Neaktuální zásuvný modul pluginActivate.updateLabel=Aktualizovat… # LOCALIZATION NOTE (pluginActivateVulnerable.message, pluginActivateVulnerable.label): # These strings are used when an unsafe plugin has no update available. # %1$S is the plugin name, %2$S is the domain, and %3$S is brandShortName. pluginActivateVulnerable.message=Aplikace %3$S zabránila spuštění nebezpečného zásuvného modulu „%1$S“ na %2$S. pluginActivateVulnerable.label=Zranitelný zásuvný modul! pluginActivate.riskLabel=Jaké je riziko? # LOCALIZATION NOTE (pluginActivateBlocked.message): %1$S is the plugin name, %2$S is brandShortName pluginActivateBlocked.message=Aplikace %2$S zablokovala pro vaši ochranu zásuvný modul „%1$S“. pluginActivateBlocked.label=Zablokováno pro vaši ochranu pluginActivateDisabled.message=„%S“ je zakázán. pluginActivateDisabled.label=Zakázáno pluginActivateDisabled.manage=Správa zásuvných modulů… pluginEnabled.message=„%S“ je povolen na %S. pluginEnabledOutdated.message=Neaktuální zásuvný modul „%S“ je povolen na %S. pluginEnabledVulnerable.message=Nebezpečný zásuvný modul „%S“ je povolen na %S. pluginInfo.unknownPlugin=Neznámý # LOCALIZATION NOTE (pluginActivateNow.label, pluginActivateAlways.label, pluginBlockNow.label): These should be the same as the matching strings in browser.dtd # LOCALIZATION NOTE (pluginActivateNow.label): This button will enable the # plugin in the current session for an short time (about an hour), auto-renewed # if the site keeps using the plugin. pluginActivateNow.label=Povolit nyní pluginActivateNow.accesskey=P # LOCALIZATION NOTE (pluginActivateAlways.label): This button will enable the # plugin for a long while (90 days), auto-renewed if the site keeps using the # plugin. pluginActivateAlways.label=Povolit a zapamatovat pluginActivateAlways.accesskey=o pluginBlockNow.label=Blokovat zásuvný modul pluginBlockNow.accesskey=B pluginContinue.label=Nyní povolit pluginContinue.accesskey=N # in-page UI PluginClickToActivate=Aktivovat %S. PluginVulnerableUpdatable=Tento zásuvný modul je zranitelný a měl by být aktualizován. PluginVulnerableNoUpdate=Tento zásuvný modul obsahuje bezpečnostní chyby. # infobar UI pluginContinueBlocking.label=Pokračovat v blokování pluginContinueBlocking.accesskey=B # LOCALIZATION NOTE (pluginActivateTrigger): Use the unicode ellipsis char, \u2026, # or use "..." if \u2026 doesn't suit traditions in your locale. pluginActivateTrigger.label=Povolit… pluginActivateTrigger.accesskey=P # Sanitize # LOCALIZATION NOTE (sanitizeDialog2.everything.title): When "Time range to # clear" is set to "Everything", the Clear Recent History dialog's title is # changed to this. See UI mockup and comment 11 at bug 480169 --> sanitizeDialog2.everything.title=Vymazat celou historii sanitizeButtonOK=Vymazat # LOCALIZATION NOTE (sanitizeButtonClearing): The label for the default # button between the user clicking it and the window closing. Indicates the # items are being cleared. sanitizeButtonClearing=Vymazávání # LOCALIZATION NOTE (sanitizeEverythingWarning2): Warning that appears when # "Time range to clear" is set to "Everything" in Clear Recent History dialog, # provided that the user has not modified the default set of history items to clear. sanitizeEverythingWarning2=Celá historie bude vymazána. # LOCALIZATION NOTE (sanitizeSelectedWarning): Warning that appears when # "Time range to clear" is set to "Everything" in Clear Recent History dialog, # provided that the user has modified the default set of history items to clear. sanitizeSelectedWarning=Zvolené položky budou vymazány. # LOCALIZATION NOTE (downloadAndInstallButton.label): %S is replaced by the # version of the update: "Update to 28.0". update.downloadAndInstallButton.label=Aktualizovat na %S update.downloadAndInstallButton.accesskey=A menuOpenAllInTabs.label=Otevřít vše v panelech # History menu menuRestoreAllTabs.label=Obnovit všechny panely # LOCALIZATION NOTE (menuRestoreAllTabsSubview.label): like menuRestoreAllTabs.label, # but used in the history subview in the panel UI, so needs to mention these are *closed* tabs. menuRestoreAllTabsSubview.label=Obnovit zavřené panely # LOCALIZATION NOTE (menuRestoreAllWindows, menuUndoCloseWindowLabel, menuUndoCloseWindowSingleTabLabel): # see bug 394759 menuRestoreAllWindows.label=Obnovit všechna okna # LOCALIZATION NOTE (menuRestoreAllWindowsSubview.label): like menuRestoreAllWindows.label, # but used in the history subview in the panel UI, so needs to mention these are *closed* windows. menuRestoreAllWindowsSubview.label=Obnovit zavřená okna # LOCALIZATION NOTE (menuUndoCloseWindowLabel): Semicolon-separated list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 Window Title, #2 Number of tabs menuUndoCloseWindowLabel=#1 (a #2 panel);#1 (a #2 další panely);#1 (a #2 dalších panelů) menuUndoCloseWindowSingleTabLabel=#1 # Unified Back-/Forward Popup tabHistory.current=Zůstat na této stránce tabHistory.goBack=Přejít zpět na tuto stránku tabHistory.goForward=Přejít vpřed na tuto stránku # URL Bar pasteAndGo.label=Vložit a jít # LOCALIZATION NOTE(urlbar-zoom-button.label): %S is the current zoom level, # %% will be displayed as a single % character (% is commonly used to define # format specifiers, so it needs to be escaped). urlbar-zoom-button.label = %S%% # Block autorefresh refreshBlocked.goButton=Povolit refreshBlocked.goButton.accesskey=P refreshBlocked.refreshLabel=Aplikace %S zabránila této stránce v automatickém obnovení. refreshBlocked.redirectLabel=Aplikace %S zabránila této stránce v automatickém přesměrování na jinou stránku. # General bookmarks button # LOCALIZATION NOTE (bookmarksMenuButton.tooltip): # %S is the keyboard shortcut for "Show All Bookmarks" bookmarksMenuButton.tooltip=Zobrazí vaše záložky (%S) # Star button starButtonOn.tooltip2=Upraví tuto záložku (%S) starButtonOff.tooltip2=Přidá tuto stránku do záložek (%S) starButtonOverflowed.label=Přidat stránku do záložek starButtonOverflowedStarred.label=Upravit záložku # Downloads button tooltip # LOCALIZATION NOTE (downloads.tooltip): # %S is the keyboard shortcut for "Downloads" downloads.tooltip=Zobrazí průběh stahování (%S) # Print button tooltip on OS X # LOCALIZATION NOTE (printButton.tooltip): # Use the unicode ellipsis char, \u2026, # or use "..." if \u2026 doesn't suit traditions in your locale. # %S is the keyboard shortcut for "Print" printButton.tooltip=Vytiskne tuto stránku… (%S) # New Window button tooltip # LOCALIZATION NOTE (newWindowButton.tooltip): # %S is the keyboard shortcut for "New Window" newWindowButton.tooltip=Otevře nové okno (%S) # New Tab button tooltip # LOCALIZATION NOTE (newTabButton.tooltip): # %S is the keyboard shortcut for "New Tab" newTabButton.tooltip=Otevře nový panel (%S) # Offline web applications offlineApps.available2=Chcete aplikaci %S povolit ukládání dat na váš počítač? offlineApps.allowStoring.label=Povolit ukládání dat offlineApps.allowStoring.accesskey=P offlineApps.dontAllow.label=Nepovolit offlineApps.dontAllow.accesskey=n offlineApps.usage=Tento server (%S) má na vašem počítači uloženo více než %SMB offline obsahu. offlineApps.manageUsage=Zobrazit nastavení offlineApps.manageUsageAccessKey=Z identity.identified.verifier=Ověřil: %S identity.identified.verified_by_you=Tomuto serveru jste udělili bezpečnostní výjimku identity.identified.state_and_country=%S, %S identity.icon.tooltip=Zobrazí informace o stránce trackingProtection.intro.title=Jak ochrana proti sledování funguje? # LOCALIZATION NOTE (trackingProtection.intro.description2): # %S is brandShortName. This string should match the one from Step 1 of the tour # when it starts from the button shown when a new private window is opened. trackingProtection.intro.description2=Vidíte-li štít, %S blokuje některé části stránky, které mohou sledovat vaše prohlížení na internetu. # LOCALIZATION NOTE (trackingProtection.intro.step1of3): Indicates that the intro panel is step one of three in a tour. trackingProtection.intro.step1of3=1 ze 3 trackingProtection.intro.nextButton.label=Další trackingProtection.icon.activeTooltip=Pokusy o sledování zablokovány trackingProtection.icon.disabledTooltip=Detekován sledovací obsah # Edit Bookmark UI editBookmarkPanel.pageBookmarkedTitle=Stránka přidána do záložek editBookmarkPanel.pageBookmarkedDescription=Aplikace %S si bude tuto stránku pamatovat. editBookmarkPanel.bookmarkedRemovedTitle=Záložka odebrána editBookmarkPanel.editBookmarkTitle=Úprava záložky # LOCALIZATION NOTE (editBookmark.removeBookmarks.label): Semicolon-separated list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # Replacement for #1 is the number of bookmarks to be removed. # If this causes problems with localization you can also do "Remove Bookmarks (#1)" # instead of "Remove #1 Bookmarks". editBookmark.removeBookmarks.label=Odstranit záložku;Odstranit #1 záložky;Odstranit #1 záložek # Post Update Notifications pu.notifyButton.label=Podrobnosti… pu.notifyButton.accesskey=P # LOCALIZATION NOTE %S will be replaced by the short name of the application. puNotifyText=Aplikace %S byla aktualizována puAlertTitle=Aktualizace aplikace %S puAlertText=Pro více informací klepněte zde # Geolocation UI geolocation.allowLocation=Povolit přístup k poloze geolocation.allowLocation.accesskey=P geolocation.dontAllowLocation=Nepovolit geolocation.dontAllowLocation.accesskey=n geolocation.shareWithSite3=Chcete serveru %S povolit přístup k vaší poloze? geolocation.shareWithFile3=Chcete povolit tomuto místnímu souboru přistupovat k vaší poloze? geolocation.remember=Zapamatovat si toto rozhodnutí webNotifications.remember=Zapamatovat si toto rozhodnutí webNotifications.rememberForSession=Zapamatovat si rozhodnutí pro tuto relaci webNotifications.allow=Povolit oznámení webNotifications.allow.accesskey=P webNotifications.dontAllow=Nepovolit webNotifications.dontAllow.accesskey=n webNotifications.receiveFromSite2=Chcete serveru %S povolit zasílat oznámení? # LOCALIZATION NOTE (webNotifications.upgradeTitle): When using native notifications on OS X, the title may be truncated around 32 characters. webNotifications.upgradeTitle=Modernizovaná oznámení # LOCALIZATION NOTE (webNotifications.upgradeBody): When using native notifications on OS X, the body may be truncated around 100 characters in some views. webNotifications.upgradeBody=Nyní můžete přijímat oznámení z webů, které ani nejsou načteny. Klepnutím se dozvíte více. # Phishing/Malware Notification Bar. # LOCALIZATION NOTE (notADeceptiveSite, notAnAttack) # The two button strings will never be shown at the same time, so # it's okay for them to have the same access key safebrowsing.getMeOutOfHereButton.label=Rychle odsud pryč! safebrowsing.getMeOutOfHereButton.accessKey=R safebrowsing.deceptiveSite=Klamavá stránka! safebrowsing.notADeceptiveSiteButton.label=Tato stránka není klamavá… safebrowsing.notADeceptiveSiteButton.accessKey=k safebrowsing.reportedAttackSite=Nahlášená útočná stránka! safebrowsing.notAnAttackButton.label=Toto není útočná stránka… safebrowsing.notAnAttackButton.accessKey=T safebrowsing.reportedUnwantedSite=Nahlášena nevyžádaná stránka se software! # Ctrl-Tab # LOCALIZATION NOTE (ctrlTab.listAllTabs.label): #1 represents the number # of tabs in the current browser window. It will always be 2 at least. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals ctrlTab.listAllTabs.label=Zobrazit panel;Zobrazit všechny #1 panely;Zobrazit všech #1 panelů # LOCALIZATION NOTE (addKeywordTitleAutoFill): %S will be replaced by the page's title # Used as the bookmark name when saving a keyword for a search field. addKeywordTitleAutoFill=Hledat na %S extensions.{972ce4c6-7e08-4474-a285-3208198ce6fd}.name=Výchozí extensions.{972ce4c6-7e08-4474-a285-3208198ce6fd}.description=Výchozí motiv vzhledu # safeModeRestart safeModeRestartPromptTitle=Restartovat se zakázanými doplňky safeModeRestartPromptMessage=Opravdu chcete zakázat všechny doplňky a restartovat? safeModeRestartButton=Restartovat # LOCALIZATION NOTE (browser.menu.showCharacterEncoding): Set to the string # "true" (spelled and capitalized exactly that way) to show the "Text # Encoding" menu in the main Firefox button on Windows. Any other value will # hide it. Regardless of the value of this setting, the "Text Encoding" # menu will always be accessible via the "Web Developer" menu. # This is not a string to translate; it just controls whether the menu shows # up in the Firefox button. If users frequently use the "Text Encoding" # menu, set this to "true". Otherwise, you can leave it as "false". browser.menu.showCharacterEncoding=false # Mozilla data reporting notification (Telemetry, Firefox Health Report, etc) dataReportingNotification.message = %1$S automaticky odesílá některá data organizaci %2$S z důvodu vylepšení vašeho prohlížení. dataReportingNotification.button.label = Nastavit odesílaná data dataReportingNotification.button.accessKey = N # Process hang reporter processHang.label = Tato webová stránka zpomaluje váš prohlížeč. Co si přejete udělat? processHang.button_stop.label = Zastavit načítání processHang.button_stop.accessKey = s processHang.button_wait.label = Počkat processHang.button_wait.accessKey = P processHang.button_debug.label = Ladit skript processHang.button_debug.accessKey = d # LOCALIZATION NOTE (fullscreenButton.tooltip): %S is the keyboard shortcut for full screen fullscreenButton.tooltip=Zobrazí okno v režimu celé obrazovky (%S) service.toolbarbutton.label=Služby service.toolbarbutton.tooltiptext=Služby # LOCALIZATION NOTE (social.install.description): %1$S is the hostname of the social provider, %2$S is brandShortName (e.g. Firefox) service.install.description=Chcete povolit a v liště aplikace %2$S zobrazovat službu %1$S? service.install.ok.label=Povolit službu service.install.ok.accesskey=P # LOCALIZATION NOTE (social.markpageMenu.label): %S is the name of the social provider social.markpageMenu.label=Uložit stránku do %S # LOCALIZATION NOTE (social.marklinkMenu.label): %S is the name of the social provider social.marklinkMenu.label=Uložit odkaz do %S # LOCALIZATION NOTE (social.error.message): %1$S is brandShortName (e.g. Firefox), %2$S is the name of the social provider social.error.message=%1$S se nemůže připojit ke službě %2$S. social.error.tryAgain.label=Zkusit znovu social.error.tryAgain.accesskey=Z social.error.closeSidebar.label=Zavřít postranní lištu social.error.closeSidebar.accesskey=v # LOCALIZATION NOTE: %1$S is the label for the toolbar button, %2$S is the associated badge numbering that the social provider may provide. social.aria.toolbarButtonBadgeText=%1$S (%2$S) # LOCALIZATION NOTE (getUserMedia.shareCamera2.message, # getUserMedia.shareMicrophone2.message, # getUserMedia.shareScreen3.message, # getUserMedia.shareCameraAndMicrophone2.message, # getUserMedia.shareCameraAndAudioCapture2.message, # getUserMedia.shareScreenAndMicrophone3.message, # getUserMedia.shareScreenAndAudioCapture3.message, # getUserMedia.shareAudioCapture2.message): # %S is the website origin (e.g. www.mozilla.org) getUserMedia.shareCamera2.message = Chcete serveru %S povolit používat vaši webkameru? getUserMedia.shareMicrophone2.message = Chcete serveru %S povolit používat váš mikrofon? getUserMedia.shareScreen3.message = Chcete serveru %S povolit vidět vaši obrazovku? getUserMedia.shareCameraAndMicrophone2.message = Chcete serveru %S povolit používat vaší webkameru a mikrofon? getUserMedia.shareCameraAndAudioCapture2.message = Chcete serveru %S povolit používat vaší webkameru a poslouchat zvuky z tohoto panelu? getUserMedia.shareScreenAndMicrophone3.message = Chcete serveru %S povolit používat váš mikrofon a vidět vaši obrazovku? getUserMedia.shareScreenAndAudioCapture3.message = Chcete serveru %S povolit poslouchat zvuky z tohoto panelu a vidět vaši obrazovku? getUserMedia.shareAudioCapture2.message = Chcete serveru %S povolit poslouchat zvuky z tohoto panelu? # LOCALIZATION NOTE (getUserMedia.shareScreenWarning.message): NB: inserted via innerHTML, so please don't use <, > or & in this string. # %S will be the 'learn more' link getUserMedia.shareScreenWarning.message = Obrazovku sdílejte pouze se stránkami, kterým věříte. Sdílení může umožnit klamavým stránkám sledovat vaše prohlížení a ukrást vaše osobní data. %S # LOCALIZATION NOTE (getUserMedia.shareFirefoxWarning.message): NB: inserted via innerHTML, so please don't use <, > or & in this string. # %1$S is brandShortName (eg. Firefox) # %2$S will be the 'learn more' link getUserMedia.shareFirefoxWarning.message = %1$S sdílejte pouze se stránkami, kterým věříte. Sdílení může umožnit klamavým stránkám sledovat vaše prohlížení a ukrást vaše osobní data. %2$S # LOCALIZATION NOTE(getUserMedia.shareScreen.learnMoreLabel): NB: inserted via innerHTML, so please don't use <, > or & in this string. getUserMedia.shareScreen.learnMoreLabel = Zjistit více getUserMedia.selectWindow.label=Okno ke sdílení: getUserMedia.selectWindow.accesskey=O getUserMedia.selectScreen.label=Obrazovka ke sdílení: getUserMedia.selectScreen.accesskey=s getUserMedia.selectApplication.label=Aplikace ke sdílení: getUserMedia.selectApplication.accesskey=A getUserMedia.noApplication.label = Žádná aplikace getUserMedia.noScreen.label = Žádná obrazovka getUserMedia.noWindow.label = Žádné okno getUserMedia.shareEntireScreen.label = Celou obrazovku # LOCALIZATION NOTE (getUserMedia.shareMonitor.label): # %S is screen number (digits 1, 2, etc) # Example: Screen 1, Screen 2,.. getUserMedia.shareMonitor.label = Obrazovka %S # LOCALIZATION NOTE (getUserMedia.shareApplicationWindowCount.label): # Semicolon-separated list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # Replacement for #1 is the name of the application. # Replacement for #2 is the number of windows currently displayed by the application. getUserMedia.shareApplicationWindowCount.label=#1 (#2 okno);#1 (#2 okna);#1 (#2 oken) # LOCALIZATION NOTE (getUserMedia.allow.label, # getUserMedia.dontAllow.label): # These two buttons are the possible answers to the various prompts in the # "getUserMedia.share{device}.message" strings. getUserMedia.allow.label = Povolit getUserMedia.allow.accesskey = P getUserMedia.dontAllow.label = Nepovolit getUserMedia.dontAllow.accesskey = N getUserMedia.remember=Zapamatovat si toto rozhodnutí # LOCALIZATION NOTE (getUserMedia.reasonForNoPermanentAllow.screen2, # getUserMedia.reasonForNoPermanentAllow.audio, # getUserMedia.reasonForNoPermanentAllow.insecure): # %S is brandShortName getUserMedia.reasonForNoPermanentAllow.screen2=Aplikace %S nemůže povolit trvalý přístup k vaší obrazovce bez dotazu, kterou sdílet. getUserMedia.reasonForNoPermanentAllow.audio=Aplikace %S nemůže povolit trvalý přístup ke zvuku z vašich panelů bez dotazu, který panel sdílet. getUserMedia.reasonForNoPermanentAllow.insecure=Vaše připojení k této stránce není zabezpečené. Abychom vás ochránili, %S povolí přístup pouze pro tuto relaci. getUserMedia.sharingMenu.label = Panely sdílených zařízení getUserMedia.sharingMenu.accesskey = e # LOCALIZATION NOTE (getUserMedia.sharingMenuCamera # getUserMedia.sharingMenuMicrophone, # getUserMedia.sharingMenuAudioCapture, # getUserMedia.sharingMenuApplication, # getUserMedia.sharingMenuScreen, # getUserMedia.sharingMenuWindow, # getUserMedia.sharingMenuBrowser, # getUserMedia.sharingMenuCameraMicrophone, # getUserMedia.sharingMenuCameraMicrophoneApplication, # getUserMedia.sharingMenuCameraMicrophoneScreen, # getUserMedia.sharingMenuCameraMicrophoneWindow, # getUserMedia.sharingMenuCameraMicrophoneBrowser, # getUserMedia.sharingMenuCameraAudioCapture, # getUserMedia.sharingMenuCameraAudioCaptureApplication, # getUserMedia.sharingMenuCameraAudioCaptureScreen, # getUserMedia.sharingMenuCameraAudioCaptureWindow, # getUserMedia.sharingMenuCameraAudioCaptureBrowser, # getUserMedia.sharingMenuCameraApplication, # getUserMedia.sharingMenuCameraScreen, # getUserMedia.sharingMenuCameraWindow, # getUserMedia.sharingMenuCameraBrowser, # getUserMedia.sharingMenuMicrophoneApplication, # getUserMedia.sharingMenuMicrophoneScreen, # getUserMedia.sharingMenuMicrophoneWindow, # getUserMedia.sharingMenuMicrophoneBrowser, # getUserMedia.sharingMenuAudioCaptureApplication, # getUserMedia.sharingMenuAudioCaptureScreen, # getUserMedia.sharingMenuAudioCaptureWindow, # getUserMedia.sharingMenuAudioCaptureBrowser): # %S is the website origin (e.g. www.mozilla.org) getUserMedia.sharingMenuCamera = %S (kamera) getUserMedia.sharingMenuMicrophone = %S (mikrofón) getUserMedia.sharingMenuAudioCapture = %S (audio panel) getUserMedia.sharingMenuApplication = %S (aplikace) getUserMedia.sharingMenuScreen = %S (obrazovka) getUserMedia.sharingMenuWindow = %S (okno) getUserMedia.sharingMenuBrowser = %S (panel) getUserMedia.sharingMenuCameraMicrophone = %S (kamera a mikrofón) getUserMedia.sharingMenuCameraMicrophoneApplication = %S (kamera, mikrofón a aplikace) getUserMedia.sharingMenuCameraMicrophoneScreen = %S (kamera, mikrofón a obrazovka) getUserMedia.sharingMenuCameraMicrophoneWindow = %S (kamera, mikrofón a okno) getUserMedia.sharingMenuCameraMicrophoneBrowser = %S (kamera, mikrofón a panel) getUserMedia.sharingMenuCameraAudioCapture = %S (kamera a audio panel) getUserMedia.sharingMenuCameraAudioCaptureApplication = %S (kamera, audio panel a aplikace) getUserMedia.sharingMenuCameraAudioCaptureScreen = %S (kamera, audio panel a obrazovka) getUserMedia.sharingMenuCameraAudioCaptureWindow = %S (kamera, audio panel a okno) getUserMedia.sharingMenuCameraAudioCaptureBrowser = %S (kamera, audio panel a panel) getUserMedia.sharingMenuCameraApplication = %S (kamera a aplikace) getUserMedia.sharingMenuCameraScreen = %S (kamera a obrazovka) getUserMedia.sharingMenuCameraWindow = %S (kamera a okno) getUserMedia.sharingMenuCameraBrowser = %S (kamera a panel) getUserMedia.sharingMenuMicrophoneApplication = %S (mikrofón a aplikace) getUserMedia.sharingMenuMicrophoneScreen = %S (mikrofón a obrazovka) getUserMedia.sharingMenuMicrophoneWindow = %S (mikrofón a okno) getUserMedia.sharingMenuMicrophoneBrowser = %S (mikrofón a panel) getUserMedia.sharingMenuAudioCaptureApplication = %S (audio panel a aplikace) getUserMedia.sharingMenuAudioCaptureScreen = %S (audio panel a obrazovka) getUserMedia.sharingMenuAudioCaptureWindow = %S (audio panel a okno) getUserMedia.sharingMenuAudioCaptureBrowser = %S (audio panel a panel) # LOCALIZATION NOTE(getUserMedia.sharingMenuUnknownHost): this is used for the website # origin for the sharing menu if no readable origin could be deduced from the URL. getUserMedia.sharingMenuUnknownHost = Neznámý původ # LOCALIZATION NOTE(emeNotifications.drmContentPlaying.message2): %S is brandShortName. emeNotifications.drmContentPlaying.message2 = Některé zvuky nebo videa na této stránce používají DRM software, což může omezit %S při práci s tímto obsahem. emeNotifications.drmContentPlaying.button.label = Konfigurace… emeNotifications.drmContentPlaying.button.accesskey = K emeNotifications.drmContentDisabled.button.label = Povolit DRM emeNotifications.drmContentDisabled.button.accesskey = P # LOCALIZATION NOTE(emeNotifications.drmContentDisabled.learnMoreLabel): NB: inserted via innerHTML, so please don't use <, > or & in this string. emeNotifications.drmContentDisabled.learnMoreLabel = Zjistit více # LOCALIZATION NOTE(emeNotifications.drmContentCDMInstalling.message): NB: inserted via innerHTML, so please don't use <, > or & in this string. %S is brandShortName emeNotifications.drmContentCDMInstalling.message = %S instaluje součásti potřebné pro přehrání audia nebo videa na této stránce. Zkuste to prosím znovu později. emeNotifications.unknownDRMSoftware = Neznámý # LOCALIZATION NOTE - %S is brandShortName slowStartup.message = %S se zdá startuje pomalu. slowStartup.helpButton.label = Zjistit, jak ho zrychlit slowStartup.helpButton.accesskey = Z slowStartup.disableNotificationButton.label = Příště již neinformovat. slowStartup.disableNotificationButton.accesskey = P # LOCALIZATION NOTE - %S is brandShortName flashHang.message = %S změnil některá nastavení Adobe Flash pro zlepšení výkonu. flashHang.helpButton.label = Zjistit více… flashHang.helpButton.accesskey = Z # LOCALIZATION NOTE(customizeTips.tip0): %1$S will be replaced with the text defined # in customizeTips.tip0.hint, %2$S will be replaced with brandShortName, %3$S will # be replaced with a hyperlink containing the text defined in customizeTips.tip0.learnMore. customizeTips.tip0 = %1$S: Můžete si přizpůsobit %2$S tak, aby vám co nejlépe vyhovoval. Jednoduše přetáhněte libovolnou funkci do nabídky či lišty. %3$S o přizpůsobení aplikace %2$S. customizeTips.tip0.hint = Tip customizeTips.tip0.learnMore = Zjistit více # LOCALIZATION NOTE (customizeMode.tabTitle): %S is brandShortName customizeMode.tabTitle = Přizpůsobit %S # LOCALIZATION NOTE(appmenu.*.description, appmenu.*.label): these are used for # the appmenu labels and buttons that appear when an update is staged for # installation or a background update has failed and a manual download is required. # %S is brandShortName appmenu.restartNeeded.description = Restartovat %S a nainstalovat aktualizace appmenu.updateFailed.description = Aktualizace na pozadí selhala. Stáhněte si prosím aktualizaci. appmenu.restartBrowserButton.label = Restartovat %S appmenu.downloadUpdateButton.label = Stáhnout aktualizaci # LOCALIZATION NOTE : FILE Reader View is a feature name and therefore typically used as a proper noun. readingList.promo.firstUse.readerView.title = Zobrazení čtečky readingList.promo.firstUse.readerView.body = Odstraňte rušivé elementy a zaměřte se přesně na to, co chcete číst. # LOCALIZATION NOTE (appMenuRemoteTabs.mobilePromo.text2): # %1$S will be replaced with a link, the text of which is # appMenuRemoteTabs.mobilePromo.android and the link will be to # https://www.mozilla.org/firefox/android/. # %2$S will be replaced with a link, the text of which is # appMenuRemoteTabs.mobilePromo.ios # and the link will be to https://www.mozilla.org/firefox/ios/. appMenuRemoteTabs.mobilePromo.text2 = Stáhnout %1$S nebo %2$S a připojit je k účtu Firefoxu. appMenuRemoteTabs.mobilePromo.android = Firefox pro Android appMenuRemoteTabs.mobilePromo.ios = Firefox pro iOS # LOCALIZATION NOTE (e10s.accessibilityNotice.mainMessage, # e10s.accessibilityNotice.enableAndRestart.label, # e10s.accessibilityNotice.enableAndRestart.accesskey): # These strings are related to the messages we display to offer e10s (Multi-process) to users # on the pre-release channels. They won't be used in release but they will likely be used in # beta starting from version 41, so it's still useful to have these strings properly localized. # %S is brandShortName e10s.accessibilityNotice.mainMessage2 = Podpora přístupnosti je částečně zakázána kvůli problémům s kompatibilitou nových funkcí %S. e10s.accessibilityNotice.acceptButton.label = OK e10s.accessibilityNotice.acceptButton.accesskey = O e10s.accessibilityNotice.enableAndRestart.label = Povolit (vyžaduje restart) e10s.accessibilityNotice.enableAndRestart.accesskey = e # LOCALIZATION NOTE (userContextPersonal.label, # userContextWork.label, # userContextShopping.label, # userContextBanking.label, # userContextNone.label): # These strings specify the four predefined contexts included in support of the # Contextual Identity / Containers project. Each context is meant to represent # the context that the user is in when interacting with the site. Different # contexts will store cookies and other information from those sites in # different, isolated locations. You can enable the feature by typing # about:config in the URL bar and changing privacy.userContext.enabled to true. # Once enabled, you can open a new tab in a specific context by clicking # File > New Container Tab > (1 of 4 contexts). Once opened, you will see these # strings on the right-hand side of the URL bar. userContextPersonal.label = Osobní userContextWork.label = Pracovní userContextBanking.label = Bankovnictví userContextShopping.label = Nakupování userContextNone.label = Žádný kontejner userContextPersonal.accesskey = O userContextWork.accesskey = P userContextBanking.accesskey = B userContextShopping.accesskey = N userContextNone.accesskey = d userContext.aboutPage.label = Správa kontejnerů userContext.aboutPage.accesskey = k userContextOpenLink.label = Otevřít odkaz v novém panelu - %S muteTab.label = Vypnout zvuk panelu muteTab.accesskey = u unmuteTab.label = Zapnout zvuk panelu unmuteTab.accesskey = u playTab.label = Spustit přehrávání panelu playTab.accesskey = p # LOCALIZATION NOTE (certErrorDetails*.label): These are text strings that # appear in the about:certerror page, so that the user can copy and send them to # the server administrators for troubleshooting. certErrorDetailsHSTS.label = HTTP Strict Transport Security: %S certErrorDetailsKeyPinning.label = HTTP Public Key Pinning: %S certErrorDetailsCertChain.label = Řetězec certifikátů: # LOCALIZATION NOTE (pendingCrashReports2.label): Semi-colon list of plural forms # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 is the number of pending crash reports pendingCrashReports2.label = Máte neodeslané hlášení o pádu;Máte #1 neodeslaná hlášení o pádu;Máte #1 neodeslaných hlášení o pádu pendingCrashReports.viewAll = Zobrazit pendingCrashReports.send = Odeslat pendingCrashReports.alwaysSend = Vždy odeslat decoder.noCodecs.button = Zjistěte jak decoder.noCodecs.accesskey = Z decoder.noCodecs.message = Pro přehrávání videa může být potřeba nainstalovat Media Feature Pack od Microsoftu. decoder.noCodecsLinux.message = Pro přehrávání videa může být potřeba nainstalovat video kodeky. decoder.noHWAcceleration.message = Pro zlepšení kvality videa může být potřeba nainstalovat Media Feature Pack od Microsoftu. decoder.noPulseAudio.message = Pro přehrávání hudby může být potřeba nainstalovat software PulseAudio. decoder.unsupportedLibavcodec.message = Verze knihovny libavcodec může být zranitelná nebo není podporována a pro přehrání videa je potřeba její aktualizace. # LOCALIZATION NOTE (captivePortal.infoMessage3): # Shown in a notification bar when we detect a captive portal is blocking network access # and requires the user to log in before browsing. captivePortal.infoMessage3 = Pro přístup k internetu se musíte nejdříve přihlásit k této síti. # LOCALIZATION NOTE (captivePortal.showLoginPage2): # The label for a button shown in the info bar in all tabs except the login page tab. # The button shows the portal login page tab when clicked. captivePortal.showLoginPage2 = Otevřít přihlašovací stránku k síti permissions.remove.tooltip = Zapomenout mé nastavení tohoto oprávnění a příště se zeptat znovu # LOCALIZATION NOTE (aboutDialog.architecture.*): # The sixtyFourBit and thirtyTwoBit strings describe the architecture of the # current Firefox build: 32-bit or 64-bit. These strings are used in parentheses # between the Firefox version and the "What's new" link in the About dialog, # e.g.: "48.0.2 (32-bit) " or "51.0a1 (2016-09-05) (64-bit)". aboutDialog.architecture.sixtyFourBit = 64 bitů aboutDialog.architecture.thirtyTwoBit = 32 bitů # LOCALIZATION NOTE (addonPostInstall.messageDetail) # %1$S is replaced with the icon for the add-ons menu. # %2$S is replaced with the icon for the toolbar menu. # Note, this string will be used as raw markup. Avoid characters like <, >, & addonPostInstall.messageDetail=Manage your add-ons by clicking %1$S in the %2$S menu. ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/customizableui/customizableWidgets.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. history-panelmenu.label = Historie # LOCALIZATION NOTE(history-panelmenu.tooltiptext2): %S is the keyboard shortcut history-panelmenu.tooltiptext2 = Zobrazí vaši historii (%S) remotetabs-panelmenu.label = Synchronizo- vané panely remotetabs-panelmenu.tooltiptext2 = Zobrazí panely z jiných zařízení privatebrowsing-button.label = Anonymní okno # LOCALIZATION NOTE(privatebrowsing-button.tooltiptext): %S is the keyboard shortcut privatebrowsing-button.tooltiptext = Otevře nové anonymní okno (%S) save-page-button.label = Uložit stránku # LOCALIZATION NOTE(save-page-button.tooltiptext3): %S is the keyboard shortcut save-page-button.tooltiptext3 = Uloží aktuální stránku (%S) find-button.label = Najít # LOCALIZATION NOTE(find-button.tooltiptext3): %S is the keyboard shortcut. find-button.tooltiptext3 = Prohledá aktuální stránku (%S) open-file-button.label = Otevřít soubor # LOCALIZATION NOTE (open-file-button.tooltiptext3): %S is the keyboard shortcut. open-file-button.tooltiptext3 = Otevře soubor (%S) developer-button.label = Vývojář # LOCALIZATION NOTE(developer-button.tooltiptext): %S is the keyboard shortcut developer-button.tooltiptext2 = Otevře nástroje pro webové vývojáře (%S) sidebar-button.label = Postranní lišty sidebar-button.tooltiptext2 = Zobrazí postranní lišty add-ons-button.label = Doplňky # LOCALIZATION NOTE(add-ons-button.tooltiptext3): %S is the keyboard shortcut add-ons-button.tooltiptext3 = Otevře Správce doplňků (%S) preferences-button.label = Předvolby preferences-button.tooltiptext2 = Otevře předvolby preferences-button.tooltiptext.withshortcut = Otevře předvolby (%S) # LOCALIZATION NOTE (preferences-button.labelWin): Windows-only label for Options preferences-button.labelWin = Možnosti # LOCALIZATION NOTE (preferences-button.tooltipWin): Windows-only tooltip for Options preferences-button.tooltipWin2 = Otevře možnosti zoom-controls.label = Lupa zoom-controls.tooltiptext2 = Ovládání lupy zoom-out-button.label = Zmenšit # LOCALIZATION NOTE(zoom-out-button.tooltiptext2): %S is the keyboard shortcut. zoom-out-button.tooltiptext2 = Zmenší stránku (%S) # LOCALIZATION NOTE(zoom-reset-button.label): %S is the current zoom level, # %% will be displayed as a single % character (% is commonly used to define # format specifiers, so it needs to be escaped). zoom-reset-button.label = %S%% # LOCALIZATION NOTE(zoom-reset-button.tooltiptext2): %S is the keyboard shortcut. zoom-reset-button.tooltiptext2 = Obnoví velikost stránky (%S) zoom-in-button.label = Zvětšit # LOCALIZATION NOTE(zoom-in-button.tooltiptext2): %S is the keyboard shortcut. zoom-in-button.tooltiptext2 = Zvětší stránku (%S) edit-controls.label = Upravit ovládání edit-controls.tooltiptext2 = Upraví ovládání cut-button.label = Vyjmout # LOCALIZATION NOTE(cut-button.tooltiptext2): %S is the keyboard shortcut. cut-button.tooltiptext2 = Vyjme (%S) copy-button.label = Kopírovat # LOCALIZATION NOTE(copy-button.tooltiptext2): %S is the keyboard shortcut. copy-button.tooltiptext2 = Zkopíruje (%S) paste-button.label = Vložit # LOCALIZATION NOTE(paste-button.tooltiptext2): %S is the keyboard shortcut. paste-button.tooltiptext2 = Vloží (%S) feed-button.label = Odebírat feed-button.tooltiptext2 = Odebírat tuto stránku containers-panelmenu.label = Kontejnerový panel containers-panelmenu.tooltiptext = Otevře kontejnerový panel # LOCALIZATION NOTE (characterencoding-button2.label): The \u00ad text at the beginning # of the string is used to disable auto hyphenation on the button text when it is displayed # in the menu panel. characterencoding-button2.label = \u00adZnaková sada textu characterencoding-button2.tooltiptext = Zobrazí možnosti znakové sady textu email-link-button.label = Odeslat odkaz email-link-button.tooltiptext3 = Odešle odkaz na aktuální stránku # LOCALIZATION NOTE(quit-button.tooltiptext.linux2): %1$S is the brand name (e.g. Firefox), # %2$S is the keyboard shortcut quit-button.tooltiptext.linux2 = Ukončit %1$S (%2$S) # LOCALIZATION NOTE(quit-button.tooltiptext.mac): %1$S is the brand name (e.g. Firefox), # %2$S is the keyboard shortcut quit-button.tooltiptext.mac = Ukončit %1$S (%2$S) social-share-button.label = Sdílet stránku social-share-button.tooltiptext = Sdílí tuto stránku panic-button.label = Zapomenout panic-button.tooltiptext = Zapomene část historie prohlížení # LOCALIZATION NOTE(devtools-webide-button.label, devtools-webide-button.tooltiptext): # widget is only visible after WebIDE has been started once (Tools > Web Developers > WebIDE) # %S is the keyboard shortcut devtools-webide-button2.label = WebIDE devtools-webide-button2.tooltiptext = Otevře WebIDE (%S) e10s-button.label = Non-e10s okno e10s-button.tooltiptext = Otevře nové non-e10s okno ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/VariablesView.dtd ================================================ ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/animationinspector.dtd ================================================ ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/animationinspector.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the Animation inspector # which is available as a sidebar panel in the Inspector. # The correct localization of this file might be to keep it in # English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best # documentation on web development on the web. # LOCALIZATION NOTE (player.animationNameLabel): # This string is displayed in each animation player widget. It is the label # displayed before the animation name. player.animationNameLabel=Animace: # LOCALIZATION NOTE (player.transitionNameLabel): # This string is displayed in each animation player widget. It is the label # displayed in the header, when the element is animated by mean of a css # transition player.transitionNameLabel=Přechod # LOCALIZATION NOTE (player.animationDurationLabel): # This string is displayed in each animation player widget. It is the label # displayed before the animation duration. player.animationDurationLabel=Trvání: # LOCALIZATION NOTE (player.animationDelayLabel): # This string is displayed in each animation player widget. It is the label # displayed before the animation delay. player.animationDelayLabel=Zpoždění: # LOCALIZATION NOTE (player.animationIterationCountLabel): # This string is displayed in each animation player widget. It is the label # displayed before the number of times the animation is set to repeat. player.animationIterationCountLabel=Opakování: # LOCALIZATION NOTE (player.infiniteIterationCount): # In case the animation repeats infinitely, this string is displayed next to the # player.animationIterationCountLabel string, instead of a number. player.infiniteIterationCount=∞ # LOCALIZATION NOTE (player.timeLabel): # This string is displayed in each animation player widget, to indicate either # how long (in seconds) the animation lasts, or what is the animation's current # time (in seconds too); player.timeLabel=%Ss ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/app-manager.dtd ================================================ Aplikace vám pomůže s jejich kontrolou a instalací. Na panelu Zařízení najdete informace o připojeném zařízení. Pro připojení zařízení nebo spuštění simulátoru použijte spodní lištu."> ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/app-manager.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. index.deprecationNotice=Správce aplikací bude v budoucí verzi odstraněn. Vaše projekty byly přemigrovány do WebIDE. index.launchWebIDE=Spustit WebIDE index.readMoreAboutWebIDE=Přečtěte si více # LOCALIZATION NOTE (device.deviceSize): %1$S is the device's width, %2$S is # the device's height, %3$S is the device's pixel density. # Example: 800x480 (86 DPI). device.deviceSize=Velikost zařízení: %1$Sx%2$S (%3$S DPI) # LOCALIZATION NOTE (connection.connectedToDevice, connection.connectTo): # %1$S is the host name, %2$S is the port number. connection.connectedToDevice=Připojeno k %1$S connection.connectTo=Připojit k %1$S:%2$S project.filePickerTitle=Vybrat složku webové aplikace project.installing=Instalace… project.installed=Nainstalováno! validator.nonExistingFolder=Složka projektu neexistuje validator.expectProjectFolder=Složka projektu je souborem validator.wrongManifestFileName=Zabalené aplikace musí obsahovat manifest soubor pojmenovaný 'manifest.webapp' v kořenové složce projektu validator.invalidManifestURL=Neplatná URL manifestu '%S' # LOCALIZATION NOTE (validator.invalidManifestJSON, validator.noAccessManifestURL): # %1$S is the error message, %2$S is the URI of the manifest. validator.invalidManifestJSON=Manifest webové aplikace není platný soubor JSON: %1$S na: %2$S validator.noAccessManifestURL=Nepodařilo se přečíst manifest soubor: %1$S na: %2$S # LOCALIZATION NOTE (validator.invalidHostedManifestURL): %1$S is the URI of # the manifest, %2$S is the error message. validator.invalidHostedManifestURL=Neplatná URL hostovaného manifest souboru '%1$S': %2$S validator.invalidProjectType=Neznámý typ projektu '%S' # LOCALIZATION NOTE (validator.missNameManifestProperty, validator.missIconsManifestProperty): # don't translate 'icons' and 'name'. validator.missNameManifestProperty=V Manifestu chybí 'name' (povinné). validator.missIconsManifestProperty=V Manifestu chybí 'icons'. validator.missIconMarketplace2=pro nahrání aplikace do Marketplace je třeba ikona alespoň o velikosti 128px validator.invalidAppType=Neznámý typ aplikace: '%S'. validator.invalidHostedPriviledges=Hostovaná aplikace nemůže být typu '%S'. validator.noCertifiedSupport='certifikované' aplikace nejsou Správce aplikací plně podporovány. validator.nonAbsoluteLaunchPath=Cesta ke spuštění musí být absolutní a začínat znakem '/': '%S' validator.accessFailedLaunchPath=Nepodařilo se přistoupit k úvodnímu dokumentu aplikace '%S' # LOCALIZATION NOTE (validator.accessFailedLaunchPathBadHttpCode): %1$S is the URI of # the launch document, %2$S is the http error code. validator.accessFailedLaunchPathBadHttpCode=Nepodařilo se přistoupit k úvodnímu dokumentu aplikace '%1$S', získán HTTP kód %2$S ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/appcacheutils.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the Web Console # command line which is available from the Web Developer sub-menu # -> 'Web Console'. # These messages are displayed when an attempt is made to validate a # page or a cache manifest using AppCacheUtils.jsm # The correct localization of this file might be to keep it in # English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best # documentation on web development on the web. # LOCALIZATION NOTE (noManifest): the specified page has no cache manifest. noManifest=Zadaná stránka neobsahuje manifest. # LOCALIZATION NOTE (notUTF8): the associated cache manifest has a character # encoding that is not UTF-8. Parameters: %S is the current encoding. notUTF8=Manifest je ve znakové sadě %S. Manifesty musí být ve znakové sadě utf-8. # LOCALIZATION NOTE (badMimeType): the associated cache manifest has a # mimetype that is not text/cache-manifest. Parameters: %S is the current # mimetype. badMimeType=Manifest máme typ MIME %S. Manifesty musí mít typ MIME text/cache-manifest. # LOCALIZATION NOTE (duplicateURI): the associated cache manifest references # the same URI from multiple locations. Parameters: %1$S is the URI, %2$S is a # list of references to this URI. duplicateURI=URI %1$S je odkazováno na více místech. To není povoleno: %2$S. # LOCALIZATION NOTE (networkBlocksURI, fallbackBlocksURI): the associated # cache manifest references the same URI in the NETWORK (or FALLBACK) section # as it does in other sections. Parameters: %1$S is the line number, %2$S is # the resource name, %3$S is the line number, %4$S is the resource name, %5$S # is the section name. networkBlocksURI=Řádek %1$S (%2$S) v sekci NETWORK zamezuje kešování řádku %3$S (%4$S) v sekci %5$S. fallbackBlocksURI=Řádek %1$S (%2$S) v sekci FALLBACK zamezuje kešování řádku %3$S (%4$S) v sekci %5$S. # LOCALIZATION NOTE (fileChangedButNotManifest): the associated cache manifest # references a URI that has a file modified after the cache manifest. # Parameters: %1$S is the resource name, %2$S is the cache manifest, %3$S is # the line number. fileChangedButNotManifest=Soubor %1$S byl po %2$S upraven. Dokud se text v souboru manifestu nezmění, bude použita nakešovaná verze na místo té uvedené na řádku %3$S. # LOCALIZATION NOTE (cacheControlNoStore): the specified page has a header # preventing caching or storing information. Parameters: %1$S is the resource # name, %2$S is the line number. cacheControlNoStore=%1$S obsahuje cache-control nastavený na no-store. Tím je zamezeno mezipaměti aplikace, aby na řádku %2$S uložila soubor. # LOCALIZATION NOTE (notAvailable): the specified resource is not available. # Parameters: %1$S is the resource name, %2$S is the line number. notAvailable=%1$S odkazuje na řádce %2$S. na zdroj, který není dostupný. # LOCALIZATION NOTE (invalidURI): it's used when an invalid URI is passed to # the appcache. invalidURI=URI předaná AppCacheUtils je neplatná. # LOCALIZATION NOTE (noResults): it's used when a search returns no results. noResults=Nebyly nalezeny žádné výsledky. # LOCALIZATION NOTE (cacheDisabled): it's used when the cache is disabled and # an attempt is made to view offline data. cacheDisabled=Disková mezipaměť je zakázána. Nastavte v about:config předvolbu browser.cache.disk.enable na true a zkuste to znovu. # LOCALIZATION NOTE (firstLineMustBeCacheManifest): the associated cache # manifest has a first line that is not "CACHE MANIFEST". Parameters: %S is # the line number. firstLineMustBeCacheManifest=První řádek manifestu musí být "CACHE MANIFEST", který je však na řádku %S. # LOCALIZATION NOTE (cacheManifestOnlyFirstLine2): the associated cache # manifest has "CACHE MANIFEST" on a line other than the first line. # Parameters: %S is the line number where "CACHE MANIFEST" appears. cacheManifestOnlyFirstLine2="CACHE MANIFEST" je jediný platný první řádek, ale byl však nalezen na řádku %S. # LOCALIZATION NOTE (asteriskInWrongSection2): the associated cache manifest # has an asterisk (*) in a section other than the NETWORK section. Parameters: # %1$S is the section name, %2$S is the line number. asteriskInWrongSection2=V sekci %1$S je na řádku %2$S chybně použit znak hvězdička (*). Pokud řádek v sekci NETWORK obsahuje pouze jeden znak hvězdičky, pak s každou URI, která není uvedena v manifestu, bude zacházené jako kdyby URI byla v sekci NETWORK uvedena. V opačném případě bude s URI zacházeno jako kdyby nebylo dostupné. Ostatní použití znaku * je zakázáno. # LOCALIZATION NOTE (escapeSpaces): the associated cache manifest has a space # in a URI. Spaces must be replaced with %20. Parameters: %S is the line # number where this error occurs. escapeSpaces=Mezery v URI musí být na řádku $S nahrazeny znakem %20. # LOCALIZATION NOTE (slashDotDotSlashBad): the associated cache manifest has a # URI containing /../, which is invalid. Parameters: %S is the line number # where this error occurs. slashDotDotSlashBad=/../ není platným prefixem URI na řádku %S. # LOCALIZATION NOTE (tooManyDotDotSlashes): the associated cache manifest has # a URI containing too many ../ operators. Too many of these operators mean # that the file would be below the root of the site, which is not possible. # Parameters: %S is the line number where this error occurs. tooManyDotDotSlashes=Příliš mnoho operátorů tečka tečka lomítko (../) na řádce %S. # LOCALIZATION NOTE (fallbackUseSpaces): the associated cache manifest has a # FALLBACK section containing more or less than the standard two URIs # separated by a single space. Parameters: %S is the line number where this # error occurs. fallbackUseSpaces=V sekci FALLBACK na řádce %S jsou povoleny pouze dvě URI odělené mezerou. # LOCALIZATION NOTE (fallbackAsterisk2): the associated cache manifest has a # FALLBACK section that attempts to use an asterisk (*) as a wildcard. In this # section the URI is simply a path prefix. Parameters: %S is the line number # where this error occurs. fallbackAsterisk2=V sekci FALLBACK je na řádku %S chybně použit znak hvězdička (*). URI v sekci FALLBACK potřebují odpovídat prefixu požadovaného URI. # LOCALIZATION NOTE (settingsBadValue): the associated cache manifest has a # SETTINGS section containing something other than the valid "prefer-online" # or "fast". Parameters: %S is the line number where this error occurs. settingsBadValue=V sekci SETTINGS smí být na řádce %S pouze jedna hodnota: "prefer-online" nebo "fast". # LOCALIZATION NOTE (invalidSectionName): the associated cache manifest # contains an invalid section name. Parameters: %1$S is the section name, %2$S # is the line number. invalidSectionName=Neplatný název sekce (%1$S) na řádce %2$S. # LOCALIZATION NOTE (entryNotFound): the requested cache entry that does not # exist. entryNotFound=Položka nebyla nalezena. ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/canvasdebugger.dtd ================================================ ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/canvasdebugger.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the Canvas Debugger # which is available from the Web Developer sub-menu -> 'Canvas'. # The correct localization of this file might be to keep it in # English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best # documentation on web development on the web. # LOCALIZATION NOTE (ToolboxCanvasDebugger.label): # This string is displayed in the title of the tab when the Shader Editor is # displayed inside the developer tools window and in the Developer Tools Menu. ToolboxCanvasDebugger.label=Canvas # LOCALIZATION NOTE (ToolboxCanvasDebugger.panelLabel): # This is used as the label for the toolbox panel. ToolboxCanvasDebugger.panelLabel=Panel Canvas # LOCALIZATION NOTE (ToolboxCanvasDebugger.tooltip): # This string is displayed in the tooltip of the tab when the Shader Editor is # displayed inside the developer tools window. ToolboxCanvasDebugger.tooltip=Nástroje pro zkoumání a ladění kontextů # LOCALIZATION NOTE (noSnapshotsText): The text to display in the snapshots menu # when there are no recorded snapshots yet. noSnapshotsText=Zatím zde nejsou žádné snímky. # LOCALIZATION NOTE (snapshotsList.itemLabel): # This string is displayed in the snapshots list of the Canvas Debugger, # identifying a set of function calls of a recorded animation frame. snapshotsList.itemLabel=Snímek #%S # LOCALIZATION NOTE (snapshotsList.loadingLabel): # This string is displayed in the snapshots list of the Canvas Debugger, # for an item that has not finished loading. snapshotsList.loadingLabel=Nahrávání… # LOCALIZATION NOTE (snapshotsList.saveLabel): # This string is displayed in the snapshots list of the Canvas Debugger, # for saving an item to disk. snapshotsList.saveLabel=Uložit # LOCALIZATION NOTE (snapshotsList.savingLabel): # This string is displayed in the snapshots list of the Canvas Debugger, # while saving an item to disk. snapshotsList.savingLabel=Ukládání… # LOCALIZATION NOTE (snapshotsList.loadedLabel): # This string is displayed in the snapshots list of the Canvas Debugger, # for an item which was loaded from disk snapshotsList.loadedLabel=Načteno z disku # LOCALIZATION NOTE (snapshotsList.saveDialogTitle): # This string is displayed as a title for saving a snapshot to disk. snapshotsList.saveDialogTitle=Uložit snímek animace… # LOCALIZATION NOTE (snapshotsList.saveDialogJSONFilter): # This string is displayed as a filter for saving a snapshot to disk. snapshotsList.saveDialogJSONFilter=Soubory JSON # LOCALIZATION NOTE (snapshotsList.saveDialogAllFilter): # This string is displayed as a filter for saving a snapshot to disk. snapshotsList.saveDialogAllFilter=Všechny soubory # LOCALIZATION NOTE (snapshotsList.drawCallsLabel): # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # This string is displayed in the snapshots list of the Canvas Debugger, # as a generic description about how many draw calls were made. snapshotsList.drawCallsLabel=#1 vykreslení;#1 vykreslení;#1 vykreslení # LOCALIZATION NOTE (snapshotsList.functionCallsLabel): # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # This string is displayed in the snapshots list of the Canvas Debugger, # as a generic description about how many function calls were made in total. snapshotsList.functionCallsLabel=#1 volání;#1 volání;#1 volání # LOCALIZATION NOTE (recordingTimeoutFailure): # This notification alert is displayed when attempting to record a requestAnimationFrame # cycle in the Canvas Debugger and no cycles detected. This alerts the user that no # loops were found. recordingTimeoutFailure=Canvas Debugger could not find a requestAnimationFrame or setTimeout cycle. ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/connection-screen.dtd ================================================ ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/connection-screen.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE : FILE This file contains the Remote Connection strings. # The Remote Connection window can reached from the "connect…" menuitem # in the Web Developer menu. mainProcess=Hlavní proces ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/debugger.dtd ================================================ ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/debugger.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the Debugger # which is available from the Web Developer sub-menu -> 'Debugger'. # The correct localization of this file might be to keep it in # English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best # documentation on web development on the web. # LOCALIZATION NOTE (ToolboxDebugger.label): # This string is displayed in the title of the tab when the debugger is # displayed inside the developer tools window and in the Developer Tools Menu. ToolboxDebugger.label=Debugger # LOCALIZATION NOTE (ToolboxDebugger.panelLabel): # This is used as the label for the toolbox panel. ToolboxDebugger.panelLabel=Panel Debugger # LOCALIZATION NOTE (DebuggerWindowTitle): # The title displayed for the debugger window. DebuggerWindowTitle=Debugger prohlížeče # LOCALIZATION NOTE (DebuggerWindowScriptTitle): # The title displayed for the debugger window when DebuggerWindowScriptTitle=Debugger prohlížeče - %S # LOCALIZATION NOTE (ToolboxDebugger.tooltip): # This string is displayed in the tooltip of the tab when the debugger is # displayed inside the developer tools window.. ToolboxDebugger.tooltip=Debugger JavaScriptu # LOCALIZATION NOTE (debuggerMenu.commandkey, debuggerMenu.accesskey) # Used for the menuitem in the tool menu debuggerMenu.commandkey=S debuggerMenu.accesskey=D # LOCALIZATION NOTE (collapsePanes): This is the tooltip for the button # that collapses the left and right panes in the debugger UI. collapsePanes=Sbalit panely # LOCALIZATION NOTE (expandPanes): This is the tooltip for the button # that expands the left and right panes in the debugger UI. expandPanes=Rozbalit panely # LOCALIZATION NOTE (pauseLabel): The label that is displayed on the pause # button when the debugger is in a running state. pauseButtonTooltip=Pozastaví běh skriptu (%S) # LOCALIZATION NOTE (resumeLabel): The label that is displayed on the pause # button when the debugger is in a paused state. resumeButtonTooltip=Obnoví běh skriptu (%S) # LOCALIZATION NOTE (startTracingTooltip): The label that is displayed on the trace # button when execution tracing is stopped. startTracingTooltip=Klepněte pro začátek trasování # LOCALIZATION NOTE (stopTracingTooltip): The label that is displayed on the trace # button when execution tracing is started. stopTracingTooltip=Klepněte pro ukončení trasování # LOCALIZATION NOTE (stepOverTooltip): The label that is displayed on the # button that steps over a function call. stepOverTooltip=Krokuje přes (%S) # LOCALIZATION NOTE (stepInTooltip): The label that is displayed on the # button that steps into a function call. stepInTooltip=Krokuje do (%S) # LOCALIZATION NOTE (stepOutTooltip): The label that is displayed on the # button that steps out of a function call. stepOutTooltip=Krokuje z (%S) # LOCALIZATION NOTE (emptyGlobalsText): The text to display in the menulist # when there are no chrome globals available. noGlobalsText=Žádné globální proměnné # LOCALIZATION NOTE (noSourcesText): The text to display in the sources menu # when there are no scripts. noSourcesText=Stránka nemá žádné zdroje. # LOCALIZATION NOTE (loadingSourcesText): The text to display in the sources menu # when waiting for scripts to load. loadingSourcesText=Čekání na zdroje… # LOCALIZATION NOTE (noEventsTExt): The text to display in the events tab # when there are no events. noEventListenersText=Žádné naslouchací procesy k zobrazení # LOCALIZATION NOTE (noStackFramesText): The text to display in the call stack tab # when there are no stack frames. noStackFramesText=Žádné dostupné záznamy v zásobníku # LOCALIZATION NOTE (noStackFramesText): The text to display in the traces tab # when there are no function calls. noFunctionCallsText=Žádné volání funkcí # LOCALIZATION NOTE (tracingNotStartedText): The text to display in the traces tab # when when tracing hasn't started yet. tracingNotStartedText=Trasování prozatím nebylo spuštěno # LOCALIZATION NOTE (eventCheckboxTooltip): The tooltip text to display when # the user hovers over the checkbox used to toggle an event breakpoint. eventCheckboxTooltip=Přepne přerušení na této události # LOCALIZATION NOTE (eventOnSelector): The text to display in the events tab # for every event item, between the event type and event selector. eventOnSelector=nad # LOCALIZATION NOTE (eventInSource): The text to display in the events tab # for every event item, between the event selector and listener's owner source. eventInSource=v # LOCALIZATION NOTE (eventNodes): The text to display in the events tab when # an event is listened on more than one target node. eventNodes=uzly (%S) # LOCALIZATION NOTE (eventNative): The text to display in the events tab when # a listener is added from plugins, thus getting translated to native code. eventNative=[nativní kód] # LOCALIZATION NOTE (*Events): The text to display in the events tab for # each group of sub-level event entries. animationEvents=Animace audioEvents=Audio batteryEvents=Baterie clipboardEvents=Schránka compositionEvents=Vytváření deviceEvents=Zařízení displayEvents=Zobrazení dragAndDropEvents=Přetažení gamepadEvents=Gamepad indexedDBEvents=IndexedDB interactionEvents=Interakce keyboardEvents=Klávesnice mediaEvents=HTML5 média mouseEvents=Myš mutationEvents=Mutation navigationEvents=Navigace pointerLockEvents=Pointer Lock sensorEvents=Senzor storageEvents=Úložiště timeEvents=Čas touchEvents=Dotyk otherEvents=Ostatní # LOCALIZATION NOTE (blackBoxCheckboxTooltip) = The tooltip text to display when # the user hovers over the checkbox used to toggle black boxing its associated # source. blackBoxCheckboxTooltip=Přepne black boxing # LOCALIZATION NOTE (noMatchingStringsText): The text to display in the # global search results when there are no matching strings after filtering. noMatchingStringsText=Žádné odpovídající výsledky # LOCALIZATION NOTE (emptySearchText): This is the text that appears in the # filter text box when it is empty and the scripts container is selected. emptySearchText=Vyhledat skripty (%S) # LOCALIZATION NOTE (emptyChromeGlobalsFilterText): This is the text that # appears in the filter text box when it is empty and the chrome globals # container is selected. emptyChromeGlobalsFilterText=Filtrovat globální proměnné chrome (%S) # LOCALIZATION NOTE (emptyVariablesFilterText): This is the text that # appears in the filter text box for the variables view container. emptyVariablesFilterText=Filtrovat proměnné # LOCALIZATION NOTE (emptyPropertiesFilterText): This is the text that # appears in the filter text box for the editor's variables view bubble. emptyPropertiesFilterText=Filtrovat vlastnosti # LOCALIZATION NOTE (searchPanelFilter): This is the text that appears in the # filter panel popup for the filter scripts operation. searchPanelFilter=Filtrovat skripty (%S) # LOCALIZATION NOTE (searchPanelGlobal): This is the text that appears in the # filter panel popup for the global search operation. searchPanelGlobal=Hledat ve všech souborech (%S) # LOCALIZATION NOTE (searchPanelFunction): This is the text that appears in the # filter panel popup for the function search operation. searchPanelFunction=Hledat definici funkce (%S) # LOCALIZATION NOTE (searchPanelToken): This is the text that appears in the # filter panel popup for the token search operation. searchPanelToken=Hledat v tomto souboru (%S) # LOCALIZATION NOTE (searchPanelLine): This is the text that appears in the # filter panel popup for the line search operation. searchPanelGoToLine=Jít na řádek (%S) # LOCALIZATION NOTE (searchPanelVariable): This is the text that appears in the # filter panel popup for the variables search operation. searchPanelVariable=Filtrovat proměnné (%S) # LOCALIZATION NOTE (breakpointMenuItem): The text for all the elements that # are displayed in the breakpoints menu item popup. breakpointMenuItem.setConditional=Konfigurovat podmíněnou zarážku breakpointMenuItem.enableSelf=Povolit zarážku breakpointMenuItem.disableSelf=Zakázat zarážku breakpointMenuItem.deleteSelf=Odebrat zarážku breakpointMenuItem.enableOthers=Povolit osatní breakpointMenuItem.disableOthers=Zakázat ostatní breakpointMenuItem.deleteOthers=Odebrat ostatní breakpointMenuItem.enableAll=Povolit všechny zarážky breakpointMenuItem.disableAll=Zakázat všechny zarážky breakpointMenuItem.deleteAll=Odebrat všechny zarážky # LOCALIZATION NOTE (loadingText): The text that is displayed in the script # editor when the loading process has started but there is no file to display # yet. loadingText=Nahrávání… # LOCALIZATION NOTE (errorLoadingText): The text that is displayed in the debugger # viewer when there is an error loading a file errorLoadingText=Chyba při načítání zdroje:\n # LOCALIZATION NOTE (emptyStackText): The text that is displayed in the watch # expressions list to add a new item. addWatchExpressionText=Přidat sledovaný výraz # LOCALIZATION NOTE (addWatchExpressionButton): The button that is displayed in the # variables view popup. addWatchExpressionButton=Sledovat # LOCALIZATION NOTE (emptyVariablesText): The text that is displayed in the # variables pane when there are no variables to display. emptyVariablesText=Žádné proměnné nejsou k dispozici # LOCALIZATION NOTE (scopeLabel): The text that is displayed in the variables # pane as a header for each variable scope (e.g. "Global scope, "With scope", # etc.). scopeLabel=%S rozsah # LOCALIZATION NOTE (watchExpressionsScopeLabel): The name of the watch # expressions scope. This text is displayed in the variables pane as a header for # the watch expressions scope. watchExpressionsScopeLabel=Sledované výrazy # LOCALIZATION NOTE (globalScopeLabel): The name of the global scope. This text # is added to scopeLabel and displayed in the variables pane as a header for # the global scope. globalScopeLabel=globální # LOCALIZATION NOTE (variablesViewErrorStacktrace): This is the text that is # shown before the stack trace in an error. variablesViewErrorStacktrace=Výpis zásobníku: # LOCALIZATION NOTE (variablesViewMoreObjects): the text that is displayed # when you have an object preview that does not show all of the elements. At the end of the list # you see "N more..." in the web console output. # This is a semi-colon list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 number of remaining items in the object # example: 3 more… variablesViewMoreObjects=#1 další…;#1 další…;#1 dalších… # LOCALIZATION NOTE (variablesEditableNameTooltip): The text that is displayed # in the variables list on an item with an editable name. variablesEditableNameTooltip=Dvojitým klepnutím upravíte # LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed # in the variables list on an item with an editable value. variablesEditableValueTooltip=Klepnutím změníte hodnotu # LOCALIZATION NOTE (variablesCloseButtonTooltip): The text that is displayed # in the variables list on an item which can be removed. variablesCloseButtonTooltip=Klepnutím odstraníte # LOCALIZATION NOTE (variablesEditButtonTooltip): The text that is displayed # in the variables list on a getter or setter which can be edited. variablesEditButtonTooltip=Klepnutím nastavíte hodnotu # LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed # in a tooltip on the "open in inspector" button in the the variables list for a # DOMNode item. variablesDomNodeValueTooltip=Klepněte pro volbu uzlu v průzkumníku # LOCALIZATION NOTE (configurable|...|Tooltip): The text that is displayed # in the variables list on certain variables or properties as tooltips. # Expanations of what these represent can be found at the following links: # https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty # https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible # https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen # https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed # It's probably best to keep these in English. configurableTooltip=configurable enumerableTooltip=enumerable writableTooltip=writable frozenTooltip=frozen sealedTooltip=sealed extensibleTooltip=extensible overriddenTooltip=overridden WebIDLTooltip=WebIDL # LOCALIZATION NOTE (variablesSeparatorLabel): The text that is displayed # in the variables list as a separator between the name and value. variablesSeparatorLabel=: # LOCALIZATION NOTE (watchExpressionsSeparatorLabel): The text that is displayed # in the watch expressions list as a separator between the code and evaluation. watchExpressionsSeparatorLabel=\u0020 → # LOCALIZATION NOTE (functionSearchSeparatorLabel): The text that is displayed # in the functions search panel as a separator between function's inferred name # and its real name (if available). functionSearchSeparatorLabel=← # LOCALIZATION NOTE (resumptionOrderPanelTitle): This is the text that appears # as a description in the notification panel popup, when multiple debuggers are # open in separate tabs and the user tries to resume them in the wrong order. # The substitution parameter is the URL of the last paused window that must be # resumed first. resumptionOrderPanelTitle=Jeden nebo více debuggerů je již pozastaveno. Obnovte prosím nejdříve naposledy pozastavený debugger: %S variablesViewOptimizedOut=(optimalizováno mimo) variablesViewUninitialized=(neinicializovano) variablesViewMissingArgs=(nedostupné) evalGroupLabel=Vyhodnocené zdroje ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/device.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside Device Emulation developer # tools. The correct localization of this file might be to keep it in English, # or another language commonly spoken among web developers. You want to make # that choice consistent across the developer tools. A good criteria is the # language in which you'd find the best documentation on web development on the # web. # LOCALIZATION NOTE: # These strings are category names in a list of devices that a user can choose # to simulate (e.g. "ZTE Open C", "VIA Vixen", "720p HD Television", etc). device.phones=Telefony device.tablets=Tablety device.notebooks=Notebooky device.televisions=Televize device.watches=Hodinky device.consoles=Gaming consoles device.laptops=Laptops ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/eyedropper.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used in the Eyedropper color tool. # LOCALIZATION NOTE The correct localization of this file might be to keep it # in English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best documentation # on web development on the web. # LOCALIZATION NOTE (colorValue.copied): This text is displayed when the user selects a # color with the eyedropper and it's copied to the clipboard. colorValue.copied=zkopírováno ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/font-inspector.dtd ================================================ ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/gcli.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the Web Console # command line which is available from the Web Developer sub-menu # -> 'Web Console'. # The correct localization of this file might be to keep it in # English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best # documentation on web development on the web. # For each command there are in general two strings. As an example consider # the 'pref' command. # commandDesc (e.g. prefDesc for the command 'pref'): this string contains a # very short description of the command. It's designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. # commandManual (e.g. prefManual for the command 'pref'): this string will # contain a fuller description of the command. It's diplayed when the user # asks for help about a specific command (e.g. 'help pref'). # LOCALIZATION NOTE: This message is used to describe any command or command # parameter when no description has been provided. canonDescNone=(bez popisu) # LOCALIZATION NOTE: The default name for a group of parameters. canonDefaultGroupName=Možnosti # LOCALIZATION NOTE (canonProxyDesc, canonProxyManual): These commands are # used to execute commands on a remote system (using a proxy). Parameters: %S # is the name of the remote system. canonProxyDesc=Vykonat příkaz na %S canonProxyManual=Skupina příkazů, které jsou sputěny na vzdáleném systému. Vzdálený systém je dosažen skrze %S # LOCALIZATION NOTE: This error message is displayed when we try to add a new # command (using a proxy) where one already exists with the same name. canonProxyExists=Již existuje příkaz pojmenovaný '%S' # LOCALIZATION NOTE: This message describes the '{' command, which allows # entry of JavaScript like traditional developer tool command lines. cliEvalJavascript=Vloží JavaScript # LOCALIZATION NOTE: This message is displayed when the command line has more # arguments than the current command can understand. cliUnusedArg=Příliš mnoho parametrů # LOCALIZATION NOTE: The title of the dialog which displays the options that # are available to the current command. cliOptions=Dostupné možnosti # LOCALIZATION NOTE: The error message when the user types a command that # isn't registered cliUnknownCommand=Neplatný příkaz # LOCALIZATION NOTE: A parameter should have a value, but doesn't cliIncompleteParam=Pro '%1$S' je vyžadována hodnota. # LOCALIZATION NOTE: Error message given when a file argument points to a file # that does not exist, but should (e.g. for use with File->Open) %1$S is a # filename fileErrNotExists='%1$S' neexistuje # LOCALIZATION NOTE: Error message given when a file argument points to a file # that exists, but should not (e.g. for use with File->Save As) %1$S is a # filename fileErrExists='%1$S' již existuje # LOCALIZATION NOTE: Error message given when a file argument points to a # non-file, when a file is needed. %1$S is a filename fileErrIsNotFile='%1$S' není soubor # LOCALIZATION NOTE: Error message given when a file argument points to a # non-directory, when a directory is needed (e.g. for use with 'cd') %1$S is a # filename fileErrIsNotDirectory='%1$S' není adresář # LOCALIZATION NOTE: Error message given when a file argument does not match # the specified regular expression %1$S is a filename %2$S is a regular # expression fileErrDoesntMatch='%1$S' neodpovídá '%2$S' # LOCALIZATION NOTE: When the menu has displayed all the matches that it # should (i.e. about 10 items) then we display this to alert the user that # more matches are available. fieldMenuMore=A další odpovídají, pokračujte v psaní # LOCALIZATION NOTE: The command line provides completion for JavaScript # commands, however there are times when the scope of what we're completing # against can't be used. This error message is displayed when this happens. jstypeParseScope=Rozsah ztracen # LOCALIZATION NOTE (jstypeParseMissing, jstypeBeginSyntax, # jstypeBeginUnterm): These error messages are displayed when the command line # is doing JavaScript completion and encounters errors. jstypeParseMissing=Nelze najít vlastnost „%S“ jstypeBeginSyntax=Syntaktická chyba jstypeBeginUnterm=Neukončený řetězcový literál # LOCALIZATION NOTE: This message is displayed if the system for providing # JavaScript completions encounters and error it displays this. jstypeParseError=Chyba # LOCALIZATION NOTE (typesNumberNan, typesNumberNotInt2, typesDateNan): These # error messages are displayed when the command line is passed a variable # which has the wrong format and can't be converted. Parameters: %S is the # passed variable. typesNumberNan=Nelze převést „%S“ na číslo. typesNumberNotInt2=Nelze převést "%S" na číslo. typesDateNan=Nelze převést "%S" na datum # LOCALIZATION NOTE (typesNumberMax, typesNumberMin, typesDateMax, # typesDateMin): These error messages are displayed when the command line is # passed a variable which has a value out of range (number or date). # Parameters: %1$S is the passed variable, %2$S is the limit value. typesNumberMax=%1$S je větší než povolené maximum: %2$S. typesNumberMin=%1$S je menší než povolené minimum: %2$S. typesDateMax=%1$S je pozdější než maximální povolená hodnota: %2$S. typesDateMin=%1$S je dřívější než minimální povolená hodnota: %2$S. # LOCALIZATION NOTE: This error message is displayed when the command line is # passed an option with a limited number of correct values, but the passed # value is not one of them. typesSelectionNomatch=Nelze použít hodnotu „%S“. # LOCALIZATION NOTE: This error message is displayed when the command line is # expecting a CSS query string, however the passed string is not valid. nodeParseSyntax=Syntaktická chyba v dotazu CSS # LOCALIZATION NOTE (nodeParseMultiple, nodeParseNone): These error messages # are displayed when the command line is expecting a CSS string that matches a # single node, but more nodes (or none) match. nodeParseMultiple=Odpovídá příliš mnoho uzlů (%S) nodeParseNone=Neodpovídá žádný uzel # LOCALIZATION NOTE (helpDesc, helpManual, helpSearchDesc, helpSearchManual3): # These strings describe the "help" command, used to display a description of # a command (e.g. "help pref"), and its parameter 'search'. helpDesc=Nápověda k dostupným příkazům helpManual=Poskytuje nápovědu konkrétních příkazů (je-li zadán hledací řetězec a odpovídá-li přesně) nebo dostupných příkazů (není-li zadán hledací řetězec nebo neodpovídá-li přesně). helpSearchDesc=Hledací řetězec helpSearchManual3=Hledací řetězec používaný k omezení seznamu zobrazovaných příkazů. Regulární výrazy nejsou podporovány. # LOCALIZATION NOTE (helpManSynopsis, helpManDescription): # These strings are displayed in the help page for a command in the console. helpManSynopsis=Anotace # LOCALIZATION NOTE: This message is displayed in the help page if the command # has no parameters. helpManNone=Žádné # LOCALIZATION NOTE (helpListAll): The heading shown in response to the 'help' # command when used without a filter, just above the list of known commands. helpListAll=Dostupné příkazy: # LOCALIZATION NOTE (helpListPrefix, helpListNone): These messages are # displayed in response to the 'help ' command (i.e. with a search # string), just above the list of matching commands. Parameters: %S is the # search string. helpListPrefix=Příkazy začínající s „%1$S“: helpListNone=Žádné příkazy začínající s „%1$S“: # LOCALIZATION NOTE (helpManRequired, helpManOptional, helpManDefault): When # the 'help x' command wants to show the manual for the 'x' command, it needs # to be able to describe the parameters as either required or optional, or if # they have a default value. helpManRequired=vyžadováno helpManOptional=nepovinné helpManDefault=nepovínné, výchozí=%S # LOCALIZATION NOTE (helpIntro): This forms part of the output from the 'help' # command. 'GCLI' is a project name and should be left untranslated. helpIntro=GCLI je experiment s cílem vytvořit vysoko použitelnou příkazovou řádku pro webové vývojáře. # LOCALIZATION NOTE: Text shown as part of the output of the 'help' command # when the command in question has sub-commands, before a list of the matching # sub-commands. subCommands=Pod-příkazy # LOCALIZATION NOTE: This error message is displayed when the command line is # cannot find a match for the parse types. commandParseError=Chyba při parsování příkazové řádky # LOCALIZATION NOTE (contextDesc, contextManual, contextPrefixDesc): These # strings are used to describe the 'context' command and its 'prefix' # parameter. See localization comment for 'connect' for an explanation about # 'prefix'. contextDesc=Zaměření na skupinu příkazů contextManual=Nastavení výchozího prefixu pro budoucí příkazy. Například 'context git' umožňuje zadat pouze 'commit' na místo 'git commit'. contextPrefixDesc=Prefix příkazu # LOCALIZATION NOTE: This message message displayed during the processing of # the 'context' command, when the found command is not a parent command. contextNotParentError=Nelze použít '%S' jako prefix, protože se nejedná o rodičovský příkaz. # LOCALIZATION NOTE (contextReply, contextEmptyReply): These messages are # displayed during the processing of the 'context' command, to indicate # success or that there is no command prefix. contextReply=Je použito %S jako prefix příkazu contextEmptyReply=Prefix příkazu není nastaven # LOCALIZATION NOTE (connectDesc, connectManual, connectPrefixDesc, # connectPortDesc, connectHostDesc, connectDupReply): These strings describe # the 'connect' command and all its available parameters. A 'prefix' is an # alias for the remote server (think of it as a "connection name"), and it # allows to identify a specific server when connected to multiple remote # servers. connectDesc=Proxy commands to server connectManual=Připojení k serveru a spouštění lokálních verzí příkazů na serveru. Vzdálené příkazy mají prefix, aby se odlišily od místních příkazů (pokud se jej chcete zbavit, podívejte se na příkaz context) connectPrefixDesc=Rodičovský prefix pro importované příkazy connectMethodDesc=Metoda připojení connectUrlDesc=URL, ke kterému se připojuje connectDupReply=Připojení pojmenované %S již existuje. # LOCALIZATION NOTE: The output of the 'connect' command, telling the user # what it has done. Parameters: %S is the prefix command. See localization # comment for 'connect' for an explanation about 'prefix'. connectReply=Přidáno %S příkazů. # LOCALIZATION NOTE (disconnectDesc2, disconnectManual2, # disconnectPrefixDesc): These strings describe the 'disconnect' command and # all its available parameters. See localization comment for 'connect' for an # explanation about 'prefix'. disconnectDesc2=Odpojit od serveru disconnectManual2=Odpojí od serveru, který je aktuálně připojen pro vykonávání vzdálených příkazů disconnectPrefixDesc=Rodičovský prefix pro importované příkazy # LOCALIZATION NOTE: This is the output of the 'disconnect' command, # explaining the user what has been done. Parameters: %S is the number of # commands removed. disconnectReply=Odebráno %S příkazů. # LOCALIZATION NOTE (globalDesc, globalWindowDesc, globalOutput): These # strings describe the 'global' command and its parameters globalDesc=Změní JS global globalWindowDesc=Nové okno/global globalOutput=JS global je nyní %S # LOCALIZATION NOTE: These strings describe the 'clear' command clearDesc=Vymaže výstup # LOCALIZATION NOTE (langDesc, langOutput): These strings describe the 'lang' # command and its parameters langDesc=Zadávejte příkazy v jiných jazycích langOutput=Nyní používáte %S # LOCALIZATION NOTE (prefDesc, prefManual, prefListDesc, prefListManual, # prefListSearchDesc, prefListSearchManual, prefShowDesc, prefShowManual, # prefShowSettingDesc, prefShowSettingManual): These strings describe the # 'pref' command and all its available sub-commands and parameters. prefDesc=Příkazy k ovládání předvoleb prefManual=Příkazy k zobrazení a změnu předvoleb jak v GCLI tak okolního prostředí prefListDesc=Zobrazí dostupné předvolby prefListManual=Zobrazí seznam předvoleb, volitelně filtrovaných při použití parametru 'search' prefListSearchDesc=Filtruje seznam zobrazovaných předvoleb prefListSearchManual=V seznamu dostupných předvoleb vyhledá ty, které odpovídají zadanému řetězci prefShowDesc=Zobrazí hodnotu předvolby prefShowManual=Zobrazí hodnotu zadané předvolby prefShowSettingDesc=Zobrazovaná předvolba prefShowSettingManual=Název zobrazované předvolby # LOCALIZATION NOTE: This message is used to show the preference name and the # associated preference value. Parameters: %1$S is the preference name, %2$S # is the preference value. prefShowSettingValue=%1$S: %2$S # LOCALIZATION NOTE (prefSetDesc, prefSetManual, prefSetSettingDesc, # prefSetSettingManual, prefSetValueDesc, prefSetValueManual): These strings # describe the 'pref set' command and all its parameters. prefSetDesc=Změní předvolbu prefSetManual=Změní předvolbu definovanou prostředím prefSetSettingDesc=Měněná předvolba prefSetSettingManual=Název měněné předvolby prefSetValueDesc=Nová hodnota předvolby prefSetValueManual=Nová hodnota pro zadanou předvolbu # LOCALIZATION NOTE (prefResetDesc, prefResetManual, prefResetSettingDesc, # prefResetSettingManual): These strings describe the 'pref reset' command and # all its parameters. prefResetDesc=Obnoví předvolbu prefResetManual=Obnoví předvolbu na výchozí systémovou hodnotu prefResetSettingDesc=Obnovovaná předvolba prefResetSettingManual=Název obnovované předvolby # LOCALIZATION NOTE: This string is displayed in the output from the 'pref # list' command as a label to an input element that allows the user to filter # the results. prefOutputFilter=Filtr # LOCALIZATION NOTE (prefOutputName, prefOutputValue): These strings are # displayed in the output from the 'pref list' command as table headings. prefOutputName=Název prefOutputValue=Hodnota # LOCALIZATION NOTE (introDesc, introManual): These strings describe the # 'intro' command. The localization of 'Got it!' should be the same used in # introTextGo. introDesc=Zobrazí uvítací zprávu introManual=Zobrazí zprávu zobrazovanou uživatelům, dokud nekliknou na tlačítko 'Rozumím' # LOCALIZATION NOTE (introTextOpening3, introTextCommands, introTextKeys2, # introTextF1Escape, introTextGo): These strings are displayed when the user # first opens the developer toolbar to explain the command line, and is shown # each time it is opened until the user clicks the 'Got it!' button. introTextOpening3=Tato příkazová řádka experiment snažící se vytvořit užitečnou příkazovou řádku pro webové vývojáře. introTextCommands=Seznam příkazů lze získat pomocí příkazu introTextKeys2=, pro zobrazení/skrytí nápovědy příkazu stiskněte introTextF1Escape=F1/Escape introTextGo=Rozumím # LOCALIZATION NOTE: This is a short description of the 'hideIntro' setting. hideIntroDesc=Zobrazí úvodní uvítací zprávu # LOCALIZATION NOTE: This is a description of the 'eagerHelper' setting. It's # displayed when the user asks for help on the settings. eagerHelper allows # users to select between showing no tooltips, permanent tooltips, and only # important tooltips. eagerHelperDesc=Jak rychle se zobrazuje nápověda ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/gclicommands.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside Web Console commands. # The Web Console command line is available from the Web Developer sub-menu # -> 'Web Console'. # # The correct localization of this file might be to keep it in # English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best # documentation on web development on the web. # LOCALIZATION NOTE (helpDesc) A very short string used to describe the # function of the help command. helpDesc=Zobrazí nápovědu k dostupným příkazům # LOCALIZATION NOTE (helpAvailable) Used in the output of the help command to # explain the contents of the command help table. helpAvailable=Dostupné příkazy # LOCALIZATION NOTE (notAvailableInE10S) Used in the output of any command that # is not compatible with multiprocess mode (E10S). notAvailableInE10S=Příkaz '%1$S' není dostupný v multiprocesovém režimu (E10S) # LOCALIZATION NOTE (consoleDesc) A very short string used to describe the # function of the console command. consoleDesc=Příkazy ovládající konzolu # LOCALIZATION NOTE (consoleManual) A longer description describing the # set of commands that control the console. consoleManual=Filtruje, smaže nebo zavře webovou konzolu # LOCALIZATION NOTE (consoleclearDesc) A very short string used to describe the # function of the 'console clear' command. consoleclearDesc=Vymaže konzolu # LOCALIZATION NOTE (screenshotDesc) A very short description of the # 'screenshot' command. See screenshotManual for a fuller description of what # it does. This string is designed to be shown in a menu alongside the # command name, which is why it should be as short as possible. screenshotDesc=Uloží obrázek stránky # LOCALIZATION NOTE (screenshotManual) A fuller description of the 'screenshot' # command, displayed when the user asks for help on what it does. screenshotManual=Uloží obrázek PNG celého viditelného okna (volitelně s prodlevou) # LOCALIZATION NOTE (screenshotFilenameDesc) A very short string to describe # the 'filename' parameter to the 'screenshot' command, which is displayed in # a dialog when the user is using this command. screenshotFilenameDesc=Cílový soubor # LOCALIZATION NOTE (screenshotFilenameManual) A fuller description of the # 'filename' parameter to the 'screenshot' command, displayed when the user # asks for help on what it does. screenshotFilenameManual=Jméno souboru, do kterého se uloží náhled (mělo by mít příponu '.png'). # LOCALIZATION NOTE (screenshotClipboardDesc) A very short string to describe # the 'clipboard' parameter to the 'screenshot' command, which is displayed in # a dialog when the user is using this command. screenshotClipboardDesc=Kopírovat náhled do schránky? (true/false) # LOCALIZATION NOTE (screenshotClipboardManual) A fuller description of the # 'clipboard' parameter to the 'screenshot' command, displayed when the user # asks for help on what it does. screenshotClipboardManual=Pravda, pokud chcete kopírovat náhled do schránky místo jeho uložení do souboru. # LOCALIZATION NOTE (screenshotChromeDesc) A very short string to describe # the 'chrome' parameter to the 'screenshot' command, which is displayed in # a dialog when the user is using this command. # The argument (%1$S) is the browser name. screenshotChromeDesc2=Zahrnout okno aplikace %1$S s ovládacími prvky? (true/false) # LOCALIZATION NOTE (screenshotChromeManual) A fuller description of the # 'chrome' parameter to the 'screenshot' command, displayed when the user # asks for help on what it does. # The argument (%1$S) is the browser name. screenshotChromeManual2=Pravda, pokud má náhled obsahovat celé okno aplikace %1$S s ovládacími prvky místo obsahu webové stránky. # LOCALIZATION NOTE (screenshotGroupOptions) A label for the optional options of # the screenshot command. screenshotGroupOptions=Možnosti # LOCALIZATION NOTE (screenshotDelayDesc) A very short string to describe # the 'delay' parameter to the 'screenshot' command, which is displayed in # a dialog when the user is using this command. screenshotDelayDesc=Prodleva (v sekundách) # LOCALIZATION NOTE (screenshotDelayManual) A fuller description of the # 'delay' parameter to the 'screenshot' command, displayed when the user # asks for help on what it does. screenshotDelayManual=Čas, který se čeká (v sekundách) před uložením náhledu # LOCALIZATION NOTE (screenshotFullscreenDesc) A very short string to describe # the 'fullscreen' parameter to the 'screenshot' command, which is displayed in # a dialog when the user is using this command. screenshotFullPageDesc=Celou stránku? (true/false) # LOCALIZATION NOTE (screenshotFullscreenManual) A fuller description of the # 'fullscreen' parameter to the 'screenshot' command, displayed when the user # asks for help on what it does. screenshotFullPageManual=Pravda, pokud má být uložena celá stránka včetně částí mimo zobrazenou plochu. # LOCALIZATION NOTE (screenshotSelectorChromeConflict) Exception thwon when user # tries to use 'selector' option along with 'chrome' option of the screenshot # command. Refer: https://bugzilla.mozilla.org/show_bug.cgi?id=659268#c7 screenshotSelectorChromeConflict=Volba selector není podporována se současně zapnutou volbou chrome # LOCALIZATION NOTE (screenshotGeneratedFilename) The auto generated filename # when no file name is provided. the first argument (%1$S) is the date string # in yyyy-mm-dd format and the second argument (%2$S) is the time string # in HH.MM.SS format. Please don't add the extension here. screenshotGeneratedFilename=Náhled dne %1$S v %2$S # LOCALIZATION NOTE (screenshotErrorSavingToFile) Text displayed to user upon # encountering error while saving the screenshot to the file specified. screenshotErrorSavingToFile=Chyba při ukládání do souboru # LOCALIZATION NOTE (screenshotSavedToFile) Text displayed to user when the # screenshot is successfully saved to the file specified. screenshotSavedToFile=Náhled uložen do souboru # LOCALIZATION NOTE (screenshotErrorCopying) Text displayed to user upon # encountering error while copying the screenshot to clipboard. screenshotErrorCopying=Při kopírování náhledu do schránky nastala chyba. # LOCALIZATION NOTE (screenshotCopied) Text displayed to user when the # screenshot is successfully copied to the clipboard. screenshotCopied=Náhled zkopírován do schránky. # LOCALIZATION NOTE (screenshotTooltip) Text displayed as tooltip for screenshot button in devtools ToolBox. screenshotTooltip=Vytvoří snímek celé stránky # LOCALIZATION NOTE (highlightDesc) A very short description of the # 'highlight' command. See highlightManual for a fuller description of what # it does. This string is designed to be shown in a menu alongside the # command name, which is why it should be as short as possible. highlightDesc=Zvýrazní uzly # LOCALIZATION NOTE (highlightManual) A fuller description of the 'highlight' # command, displayed when the user asks for help on what it does. highlightManual=Zvýrazní uzly, které na stránce odpovídají selektoru # LOCALIZATION NOTE (highlightSelectorDesc) A very short string to describe # the 'selector' parameter to the 'highlight' command, which is displayed in # a dialog when the user is using this command. highlightSelectorDesc=Selektor CSS # LOCALIZATION NOTE (highlightSelectorManual) A fuller description of the # 'selector' parameter to the 'highlight' command, displayed when the user # asks for help on what it does. highlightSelectorManual=Selektor CSS použitý na vyhledávání uzlů na stránce # LOCALIZATION NOTE (highlightOptionsDesc) The title of a set of options to # the 'highlight' command, displayed as a heading to the list of option. highlightOptionsDesc=Možnosti # LOCALIZATION NOTE (highlightHideGuidesDesc) A very short string to describe # the 'hideguides' option parameter to the 'highlight' command, which is # displayed in a dialog when the user is using this command. highlightHideGuidesDesc=Skryje okraje # LOCALIZATION NOTE (highlightHideGuidesManual) A fuller description of the # 'hideguides' option parameter to the 'highlight' command, displayed when the # user asks for help on what it does. highlightHideGuidesManual=Skryje okraje okolo zvýrazněného uzlu # LOCALIZATION NOTE (highlightShowInfoBarDesc) A very short string to describe # the 'showinfobar' option parameter to the 'highlight' command, which is # displayed in a dialog when the user is using this command. highlightShowInfoBarDesc=Zobrazí infopanel uzlu # LOCALIZATION NOTE (highlightShowInfoBarManual) A fuller description of the # 'showinfobar' option parameter to the 'highlight' command, displayed when the # user asks for help on what it does. highlightShowInfoBarManual=Zobrazí infopanel nad zvýrazněným uzlem (infopanel zobrazuje název značky, atributy a rozměry) # LOCALIZATION NOTE (highlightShowAllDesc) A very short string to describe # the 'showall' option parameter to the 'highlight' command, which is # displayed in a dialog when the user is using this command. highlightShowAllDesc=Zobrazí všechny výskyty # LOCALIZATION NOTE (highlightShowAllManual) A fuller description of the # 'showall' option parameter to the 'highlight' command, displayed when the # user asks for help on what it does. highlightShowAllManual=Pokud selektoru odpovídá velké množství uzlů, je kvůli zabránění zpomalení stránky zobrazeno pouze prvních 100. Použitím této volby zobrazíte všechny výskyty # LOCALIZATION NOTE (highlightRegionDesc) A very short string to describe the # 'region' option parameter to the 'highlight' command, which is displayed in a # dialog when the user is using this command. highlightRegionDesc=Oblast modelu boxu # LOCALIZATION NOTE (highlightRegionManual) A fuller description of the 'region' # option parameter to the 'highlight' command, displayed when the user asks for # help on what it does. highlightRegionManual=Která oblast modelu boxu by měla být zvýrazněna: 'content', 'padding', 'border' nebo 'margin' # LOCALIZATION NOTE (highlightFillDesc) A very short string to describe the # 'fill' option parameter to the 'highlight' command, which is displayed in a # dialog when the user is using this command. highlightFillDesc=Styl výplně # LOCALIZATION NOTE (highlightFillManual) A fuller description of the 'fill' # option parameter to the 'highlight' command, displayed when the user asks for # help on what it does. highlightFillManual=Přepíše předvolený styl výplně oblasti vlastní barvou # LOCALIZATION NOTE (highlightKeepDesc) A very short string to describe the # 'keep' option parameter to the 'highlight' command, which is displayed in a # dialog when the user is using this command. highlightKeepDesc=Ponechá existující zvýraznění # LOCALIZATION NOTE (highlightKeepManual) A fuller description of the 'keep' # option parameter to the 'highlight' command, displayed when the user asks for # help on what it does. highlightKeepManual=Ve výchozím nastavení jsou při spuštění příkazu existující zvýraznění skryta. Tato volba mění toto chování # LOCALIZATION NOTE (highlightOutputConfirm) A confirmation message for the # 'highlight' command, displayed to the user once the command has been entered, # informing the user how many nodes have been highlighted successfully and how # to turn highlighting off highlightOutputConfirm2=%1$S uzel zvýrazněn;%1$S uzly zvýrazněny;%1$S uzlů zvýrazněno # LOCALIZATION NOTE (highlightOutputMaxReached) A confirmation message for the # 'highlight' command, displayed to the user once the command has been entered, # informing the user how many nodes have been highlighted successfully and that # some nodes could not be highlighted due to the maximum number of nodes being # reached, and how to turn highlighting off highlightOutputMaxReached=Počet odpovídajících uzlů: %1$S, ale zvýrazněno pouze %2$S. Pro zvýraznění všech použijte '--showall' # LOCALIZATION NOTE (unhighlightDesc) A very short description of the # 'unhighlight' command. See unhighlightManual for a fuller description of what # it does. This string is designed to be shown in a menu alongside the # command name, which is why it should be as short as possible. unhighlightDesc=Zruší zvýraznění všech uzlů # LOCALIZATION NOTE (unhighlightManual) A fuller description of the 'unhighlight' # command, displayed when the user asks for help on what it does. unhighlightManual=Zruší zvýraznění všech uzlů, které byly zvýrazněny pomocí příkazu 'highlight' # LOCALIZATION NOTE (restartBrowserDesc) A very short description of the # 'restart' command. This string is designed to be shown in a menu alongside the # command name, which is why it should be as short as possible. # The argument (%1$S) is the browser name. restartBrowserDesc=Restartuje aplikaci %1$S # LOCALIZATION NOTE (restartBrowserNocacheDesc) A very short string to # describe the 'nocache' parameter to the 'restart' command, which is # displayed in a dialog when the user is using this command. restartBrowserNocacheDesc=Zakáže načtení obsahu z mezipaměti # LOCALIZATION NOTE (restartBrowserRequestCancelled) A string displayed to the # user when a scheduled restart has been aborted by the user. restartBrowserRequestCancelled=Restartování zrušeno uživatelem. # LOCALIZATION NOTE (restartBrowserRestarting) A string displayed to the # user when a restart has been initiated without a delay. # The argument (%1$S) is the browser name. restartBrowserRestarting=Restartování aplikace %1$S… # LOCALIZATION NOTE (inspectDesc) A very short description of the 'inspect' # command. See inspectManual for a fuller description of what it does. This # string is designed to be shown in a menu alongside the command name, which # is why it should be as short as possible. inspectDesc=Prozkoumá uzel # LOCALIZATION NOTE (inspectManual) A fuller description of the 'inspect' # command, displayed when the user asks for help on what it does. inspectManual=Otevře průzkumníka a zobrazí pomocí CSS vybraný prvek a prozkoumá jeho rozměry a vlastnosti # LOCALIZATION NOTE (inspectNodeDesc) A very short string to describe the # 'node' parameter to the 'inspect' command, which is displayed in a dialog # when the user is using this command. inspectNodeDesc=Selektor CSS # LOCALIZATION NOTE (inspectNodeManual) A fuller description of the 'node' # parameter to the 'inspect' command, displayed when the user asks for help # on what it does. inspectNodeManual=Selektor CSS používaný v Document.querySelector, který určuje jeden právě prvek # LOCALIZATION NOTE (eyedropperDesc) A very short description of the 'eyedropper' # command. See eyedropperManual for a fuller description of what it does. This # string is designed to be shown in a menu alongside the command name, which # is why it should be as short as possible. eyedropperDesc=Získá barvu ze stránky # LOCALIZATION NOTE (eyedropperManual) A fuller description of the 'eyedropper' # command, displayed when the user asks for help on what it does. eyedropperManual=Otevře panel, který zvětší zvolenou část stránky a zkopíruje definici barvy zvoleného pixelu # LOCALIZATION NOTE (eyedropperTooltip) A string displayed as the # tooltip of button in devtools toolbox which toggles the Eyedropper tool. eyedropperTooltip=Získá barvu ze stránky # LOCALIZATION NOTE (tiltDesc) A very short description of the 'tilt' # command. See tiltManual for a fuller description of what it does. This # string is designed to be shown in a menu alongside the command name, which # is why it should be as short as possible. tiltDesc=Vizualizuje webovou stránku ve 3D # LOCALIZATION NOTE (tiltManual) A fuller description of the 'tilt' # command, displayed when the user asks for help on what it does. tiltManual=Umožní prozkoumat vztahy mezi prvky stránky a jejich potomky v prostředí 3D # LOCALIZATION NOTE (tiltOpenDesc) A very short description of the 'tilt inspect' # command. See tiltOpenManual for a fuller description of what it does. This # string is designed to be shown in a menu alongside the command name, which # is why it should be as short as possible. tiltOpenDesc=Otevře průzkumníka v prostředí 3D # LOCALIZATION NOTE (tiltOpenManual) A fuller description of the 'tilt translate' # command, displayed when the user asks for help on what it does. tiltOpenManual=Otevře průzkumníka v prostředí 3D a volitelně pomocí CSS selektoru zvýrazní vybraný uzel # LOCALIZATION NOTE (tiltToggleTooltip) A string displayed as the # tooltip of button in devtools toolbox which toggles Tilt 3D View. tiltToggleTooltip=3D pohled # LOCALIZATION NOTE (tiltTranslateDesc) A very short description of the 'tilt translate' # command. See tiltTranslateManual for a fuller description of what it does. This # string is designed to be shown in a menu alongside the command name, which # is why it should be as short as possible. tiltTranslateDesc=Posune 3D síť stránky # LOCALIZATION NOTE (tiltTranslateManual) A fuller description of the 'tilt translate' # command, displayed when the user asks for help on what it does. tiltTranslateManual=Posune 3D síť webové stránky v určitém směru # LOCALIZATION NOTE (tiltTranslateXDesc) A very short string to describe the # 'x' parameter to the 'tilt translate' command, which is displayed in a dialog # when the user is using this command. tiltTranslateXDesc=X (body) # LOCALIZATION NOTE (tiltTranslateXManual) A fuller description of the 'x' # parameter to the 'translate' command, displayed when the user asks for help # on what it does. tiltTranslateXManual=Množství bodů, o které se posune 3D síť webové stránky ve směru osy X # LOCALIZATION NOTE (tiltTranslateYDesc) A very short string to describe the # 'y' parameter to the 'tilt translate' command, which is displayed in a dialog # when the user is using this command. tiltTranslateYDesc=Y (body) # LOCALIZATION NOTE (tiltTranslateYManual) A fuller description of the 'y' # parameter to the 'translate' command, displayed when the user asks for help # on what it does. tiltTranslateYManual=Množství bodů, o které se posune 3D síť webové stránky ve směru osy Y # LOCALIZATION NOTE (tiltRotateDesc) A very short description of the 'tilt rotate' # command. See tiltRotateManual for a fuller description of what it does. This # string is designed to be shown in a menu alongside the command name, which # is why it should be as short as possible. tiltRotateDesc=Otočí 3D síť stránky # LOCALIZATION NOTE (tiltRotateManual) A fuller description of the 'tilt rotate' # command, displayed when the user asks for help on what it does. tiltRotateManual=Otočí 3D síť webové stránky v určitém směru # LOCALIZATION NOTE (tiltRotateXDesc) A very short string to describe the # 'x' parameter to the 'tilt rotate' command, which is displayed in a dialog # when the user is using this command. tiltRotateXDesc=X (stupně) # LOCALIZATION NOTE (tiltRotateXManual) A fuller description of the 'x' # parameter to the 'rotate' command, displayed when the user asks for help # on what it does. tiltRotateXManual=Velikost úhlu, o který se otočí 3D síť webové stránky kolem osy X # LOCALIZATION NOTE (tiltRotateYDesc) A very short string to describe the # 'y' parameter to the 'tilt rotate' command, which is displayed in a dialog # when the user is using this command. tiltRotateYDesc=Y (stupně) # LOCALIZATION NOTE (tiltRotateYManual) A fuller description of the 'y' # parameter to the 'rotate' command, displayed when the user asks for help # on what it does. tiltRotateYManual=Velikost úhlu, o který se otočí 3D síť webové stránky kolem osy Y # LOCALIZATION NOTE (tiltRotateZDesc) A very short string to describe the # 'z' parameter to the 'tilt rotate' command, which is displayed in a dialog # when the user is using this command. tiltRotateZDesc=Z (stupně) # LOCALIZATION NOTE (tiltRotateZManual) A fuller description of the 'z' # parameter to the 'rotate' command, displayed when the user asks for help # on what it does. tiltRotateZManual=Velikost úhlu, o který se otočí 3D síť webové stránky kolem osy Z # LOCALIZATION NOTE (tiltZoomDesc) A very short description of the 'tilt zoom' # command. See tiltZoomManual for a fuller description of what it does. This # string is designed to be shown in a menu alongside the command name, which # is why it should be as short as possible. tiltZoomDesc=Změní měřítko 3D sítě stránky # LOCALIZATION NOTE (tiltZoomManual) A fuller description of the 'tilt zoom' # command, displayed when the user asks for help on what it does. tiltZoomManual=Posune 3D síť webové stránky ve směru osy Z # LOCALIZATION NOTE (tiltZoomAmountDesc) A very short string to describe the # 'zoom' parameter to the 'tilt zoom' command, which is displayed in a dialog # when the user is using this command. tiltZoomAmountDesc=Z (body) # LOCALIZATION NOTE (tiltZoomAmmuntManual) A fuller description of the 'zoom' # parameter to the 'zoom' command, displayed when the user asks for help # on what it does. tiltZoomAmountManual=Množství bodů, o které se posune 3D síť webové stránky ve směru osy Z # LOCALIZATION NOTE (tiltResetDesc) A very short description of the 'tilt reset' # command. See tiltResetManual for a fuller description of what it does. This # string is designed to be shown in a menu alongside the command name, which # is why it should be as short as possible. tiltResetDesc=Obnoví výchozí hodnoty # LOCALIZATION NOTE (tiltResetManual) A fuller description of the 'tilt reset' # command, displayed when the user asks for help on what it does. tiltResetManual=Obnoví výchozí hodnoty posunu, otočení a měřítka 3D sítě webové stránky # LOCALIZATION NOTE (tiltCloseDesc) A very short description of the 'tilt close' # command. See tiltCloseManual for a fuller description of what it does. This # string is designed to be shown in a menu alongside the command name, which # is why it should be as short as possible. tiltCloseDesc=Zavře 3D vizualizaci # LOCALIZATION NOTE (tiltCloseManual) A fuller description of the 'tilt close' # command, displayed when the user asks for help on what it does. tiltCloseManual=Zavře 3D vizualizaci a přepne zpět výchozího režimu průzkumníka # LOCALIZATION NOTE (debuggerClosed) Used in the output of several commands # to explain that the debugger must be opened first. debuggerClosed=Před použitím tohoto příkazu musí být debugger otevřený # LOCALIZATION NOTE (debuggerStopped) Used in the output of several commands # to explain that the debugger must be opened first. debuggerStopped=Před nastavením zarážky musí být debugger otevřen # LOCALIZATION NOTE (breakDesc) A very short string used to describe the # function of the break command. breakDesc=Spravuje zarážky # LOCALIZATION NOTE (breakManual) A longer description describing the # set of commands that control breakpoints. breakManual=Příkazy pro vypsání, přidání a odstranění zarážek # LOCALIZATION NOTE (breaklistDesc) A very short string used to describe the # function of the 'break list' command. breaklistDesc=Zobrazí nastavené zarážky # LOCALIZATION NOTE (breaklistNone) Used in the output of the 'break list' # command to explain that the list is empty. breaklistNone=Žádné zarážky nejsou nastaveny # LOCALIZATION NOTE (breaklistOutRemove) A title used in the output from the # 'break list' command on a button which can be used to remove breakpoints breaklistOutRemove=Odebrat # LOCALIZATION NOTE (breakaddAdded) Used in the output of the 'break add' # command to explain that a breakpoint was added. breakaddAdded=Zarážka přidána # LOCALIZATION NOTE (breakaddFailed) Used in the output of the 'break add' # command to explain that a breakpoint could not be added. breakaddFailed=Nepodařilo se nastavit zarážku: %S # LOCALIZATION NOTE (breakaddDesc) A very short string used to describe the # function of the 'break add' command. breakaddDesc=Přidá zarážku # LOCALIZATION NOTE (breakaddManual) A longer description describing the # set of commands that are responsible for adding breakpoints. breakaddManual=Podporované typy zarážek: řádek # LOCALIZATION NOTE (breakaddlineDesc) A very short string used to describe the # function of the 'break add line' command. breakaddlineDesc=Přidá řádkovou zarážku # LOCALIZATION NOTE (breakaddlineFileDesc) A very short string used to describe # the function of the file parameter in the 'break add line' command. breakaddlineFileDesc=URI souboru JS # LOCALIZATION NOTE (breakaddlineLineDesc) A very short string used to describe # the function of the line parameter in the 'break add line' command. breakaddlineLineDesc=Číslo řádku # LOCALIZATION NOTE (breakdelDesc) A very short string used to describe the # function of the 'break del' command. breakdelDesc=Odebere zarážku # LOCALIZATION NOTE (breakdelBreakidDesc) A very short string used to describe # the function of the index parameter in the 'break del' command. breakdelBreakidDesc=Index zarážky # LOCALIZATION NOTE (breakdelRemoved) Used in the output of the 'break del' # command to explain that a breakpoint was removed. breakdelRemoved=Zarážka odebrána # LOCALIZATION NOTE (dbgDesc) A very short string used to describe the # function of the dbg command. dbgDesc=Spravuje debugger # LOCALIZATION NOTE (dbgManual) A longer description describing the # set of commands that control the debugger. dbgManual=Příkazy k přerušení a obnovení běhu hlavního vlákna, krokování kódu do, z a přes # LOCALIZATION NOTE (dbgOpen) A very short string used to describe the function # of the dbg open command. dbgOpen=Otevře debugger # LOCALIZATION NOTE (dbgClose) A very short string used to describe the function # of the dbg close command. dbgClose=Zavře debugger # LOCALIZATION NOTE (dbgInterrupt) A very short string used to describe the # function of the dbg interrupt command. dbgInterrupt=Pozastaví běh hlavního vlákna # LOCALIZATION NOTE (dbgContinue) A very short string used to describe the # function of the dbg continue command. dbgContinue=Obnoví běh hlavního vlákna dokud není skript ukončen nebo není nalezena zarážka. # LOCALIZATION NOTE (dbgStepDesc) A very short string used to describe the # function of the dbg step command. dbgStepDesc=Spravuje krokování # LOCALIZATION NOTE (dbgStepManual) A longer description describing the # set of commands that control stepping. dbgStepManual=Příkazy ke krokování kódu do, z a přes # LOCALIZATION NOTE (dbgStepOverDesc) A very short string used to describe the # function of the dbg step over command. dbgStepOverDesc=Spustí aktuální řádek kódu a zastaví u další. Pokud obsahuje aktuální řádek voláním funkce, spustí debugger celou funkci. # LOCALIZATION NOTE (dbgStepInDesc) A very short string used to describe the # function of the dbg step over command. dbgStepInDesc=Spustí aktuální řádek kódu a zastaví u další. Pokud obsahuje aktuální řádek voláním funkce, krokuje debugger kód i uvnitř funkce. # LOCALIZATION NOTE (dbgStepOutDesc) A very short string used to describe the # function of the dbg step over command. dbgStepOutDesc=Krokuje kód ven z aktuální funkce o jednu úroveň výše, pokud je funkce vnořená. V hlavním těle kódu je skript vykonán až do další zarážky nebo do konce. Přeskočené řádky kódu nejsou krokovány, ale vykonány jsou. # LOCALIZATION NOTE (dbgListSourcesDesc) A very short string used to describe the # function of the dbg list command. dbgListSourcesDesc=Vypíše seznam URL zdrojů nahraných v debuggeru # LOCALIZATION NOTE (dbgBlackBoxDesc) A very short string used to describe the # function of the 'dbg blackbox' command. dbgBlackBoxDesc=Přidá v debuggeru zdroje do black boxu # LOCALIZATION NOTE (dbgBlackBoxSourceDesc) A very short string used to describe the # 'source' parameter to the 'dbg blackbox' command. dbgBlackBoxSourceDesc=Přidá konkrétní zdroj do black boxu # LOCALIZATION NOTE (dbgBlackBoxGlobDesc) A very short string used to describe the # 'glob' parameter to the 'dbg blackbox' command. dbgBlackBoxGlobDesc=Přidá do black boxu všechny zdroje, které odpovídají pravidlu (například: "*.min.js") # LOCALIZATION NOTE (dbgBlackBoxInvertDesc) A very short string used to describe the # 'invert' parameter to the 'dbg blackbox' command. dbgBlackBoxInvertDesc=Inverze pravidla. Přidá black boxing pro každý zdroj, který není uveden nebo neodpovídá zadanému pravidlu. # LOCALIZATION NOTE (dbgBlackBoxEmptyDesc) A very short string used to let the # user know that no sources were black boxed. dbgBlackBoxEmptyDesc=(Žádný zdroj není v black boxu) # LOCALIZATION NOTE (dbgBlackBoxNonEmptyDesc) A very short string used to let the # user know which sources were black boxed. dbgBlackBoxNonEmptyDesc=Následující zdroje byly přidány do black boxu: # LOCALIZATION NOTE (dbgBlackBoxErrorDesc) A very short string used to let the # user know there was an error black boxing a source (whose url follows this # text). dbgBlackBoxErrorDesc=Chyba při black boxingu: # LOCALIZATION NOTE (dbgUnBlackBoxDesc) A very short string used to describe the # function of the 'dbg unblackbox' command. dbgUnBlackBoxDesc=Ukončí black boxing zdrojů v debuggeru. # LOCALIZATION NOTE (dbgUnBlackBoxSourceDesc) A very short string used to describe the # 'source' parameter to the 'dbg unblackbox' command. dbgUnBlackBoxSourceDesc=Ukončí black boxing u konkrétního zdroje. # LOCALIZATION NOTE (dbgUnBlackBoxGlobDesc) A very short string used to describe the # 'glob' parameter to the 'dbg blackbox' command. dbgUnBlackBoxGlobDesc=Ukončí black boxing všech zdrojů, které odpovídají pravidlu (například: "*.min.js") # LOCALIZATION NOTE (dbgUnBlackBoxEmptyDesc) A very short string used to let the # user know that we did not stop black boxing any sources. dbgUnBlackBoxEmptyDesc=(Neukončí black boxing žádného zdroje) # LOCALIZATION NOTE (dbgUnBlackBoxNonEmptyDesc) A very short string used to let the # user know which sources we stopped black boxing. dbgUnBlackBoxNonEmptyDesc=Ukončí black boxing následujících zdrojů: # LOCALIZATION NOTE (dbgUnBlackBoxErrorDesc) A very short string used to let the # user know there was an error black boxing a source (whose url follows this # text). dbgUnBlackBoxErrorDesc=Chyba při ukončování black boxingu: # LOCALIZATION NOTE (dbgUnBlackBoxInvertDesc) A very short string used to describe the # 'invert' parameter to the 'dbg unblackbox' command. dbgUnBlackBoxInvertDesc=Inverze pravidla. Ukončí black boxing pro každý zdroj, který neodpovídá zadanému pravidlu. # LOCALIZATION NOTE (consolecloseDesc) A very short description of the # 'console close' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. consolecloseDesc=Zavře konzolu # LOCALIZATION NOTE (consoleopenDesc) A very short description of the # 'console open' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. consoleopenDesc=Otevře konzolu # LOCALIZATION NOTE (editDesc) A very short description of the 'edit' # command. See editManual2 for a fuller description of what it does. This # string is designed to be shown in a menu alongside the command name, which # is why it should be as short as possible. editDesc=Upraví zdroje stránky # LOCALIZATION NOTE (editManual) A fuller description of the 'edit' command, # displayed when the user asks for help on what it does. editManual2=Upraví jeden ze zdrojů, které jsou součástí této stránky # LOCALIZATION NOTE (editResourceDesc) A very short string to describe the # 'resource' parameter to the 'edit' command, which is displayed in a dialog # when the user is using this command. editResourceDesc=URL k úpravě # LOCALIZATION NOTE (editLineToJumpToDesc) A very short string to describe the # 'line' parameter to the 'edit' command, which is displayed in a dialog # when the user is using this command. editLineToJumpToDesc=Řádek k úpravě # LOCALIZATION NOTE (resizePageDesc) A very short string to describe the # 'resizepage' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. resizePageDesc=Změnit velikost stránky # LOCALIZATION NOTE (resizePageArgWidthDesc) A very short string to describe the # 'width' parameter to the 'resizepage' command, which is displayed in a dialog # when the user is using this command. resizePageArgWidthDesc=Šířka v bodech # LOCALIZATION NOTE (resizePageArgWidthDesc) A very short string to describe the # 'height' parameter to the 'resizepage' command, which is displayed in a dialog # when the user is using this command. resizePageArgHeightDesc=Výška v bodech # LOCALIZATION NOTE (resizeModeOnDesc) A very short string to describe the # 'resizeon ' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. resizeModeOnDesc=Zapne režim responzivního designu # LOCALIZATION NOTE (resizeModeOffDesc) A very short string to describe the # 'resize off' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. resizeModeOffDesc=Ukončí režim responzivního designu # LOCALIZATION NOTE (resizeModeToggleDesc) A very short string to describe the # 'resize toggle' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. resizeModeToggleDesc=Přepne režim responzivního designu # LOCALIZATION NOTE (resizeModeToggleTooltip) A string displayed as the # tooltip of button in devtools toolbox which toggles Responsive Design Mode. resizeModeToggleTooltip=Responzivní design # LOCALIZATION NOTE (resizeModeToDesc) A very short string to describe the # 'resize to' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. resizeModeToDesc=Změní velikost stránky # LOCALIZATION NOTE (resizeModeDesc) A very short string to describe the # 'resize' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. resizeModeDesc=Ovládá režim responzivního designu # LOCALIZATION NOTE (resizeModeManual) A fuller description of the 'resize' # command, displayed when the user asks for help on what it does. # The argument (%1$S) is the browser name. resizeModeManual2=Responzivní webové stránky se přizpůsobují svému prostředí a vypadají dobře jak na mobilním telefonu, filmovém plátně a vším mezi tím. Režim responzivního designu vám umožní otestovat různé velikosti stránek bez nutnosti měnit velikost aplikace %1$S. # LOCALIZATION NOTE (cmdDesc) A very short description of the 'cmd' # command. This string is designed to be shown in a menu alongside the command # name, which is why it should be as short as possible. cmdDesc=Manipuluje s příkazy # LOCALIZATION NOTE (cmdRefreshDesc) A very short description of the 'cmd refresh' # command. This string is designed to be shown in a menu alongside the command # name, which is why it should be as short as possible. cmdRefreshDesc=Znovu načte seznam příkazů # LOCALIZATION NOTE (cmdStatus3) When the we load new commands from mozcmd # directory, we report where we loaded from using %1$S. cmdStatus3=Přečteny příkazy z '%1$S' # LOCALIZATION NOTE (cmdSetdirDesc) A very short description of the 'cmd setdir' # command. This string is designed to be shown in a menu alongside the command # name, which is why it should be as short as possible. cmdSetdirDesc=Nastavení adresáře se soubory mozcmd # LOCALIZATION NOTE (cmdSetdirManual2) A fuller description of the 'cmd setdir' # command, displayed when the user asks for help on what it does. cmdSetdirManual2=Adresář s 'mozcmd' je snadný způsob, jak vytvářet nové vlastní příkazy. Pro více informací si přečtěte článek v dokumentaci na MDN. # LOCALIZATION NOTE (cmdSetdirDirectoryDesc) The description of the directory # parameter to the 'cmd setdir' command. cmdSetdirDirectoryDesc=Adresář obsahující soubory .mozcmd # LOCALIZATION NOTE (addonDesc) A very short description of the 'addon' # command. This string is designed to be shown in a menu alongside the command # name, which is why it should be as short as possible. addonDesc=Manipuluje s doplňky # LOCALIZATION NOTE (addonListDesc) A very short description of the 'addon list' # command. This string is designed to be shown in a menu alongside the command # name, which is why it should be as short as possible. addonListDesc=Vypíše seznam nainstalovaných doplňků # LOCALIZATION NOTE (addonListTypeDesc) A very short description of the # 'addon list ' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. addonListTypeDesc=Zvolí typ doplňku # LOCALIZATION NOTE (addonListDictionaryHeading, addonListExtensionHeading, # addonListLocaleHeading, addonListPluginHeading, addonListThemeHeading, # addonListUnknownHeading) Used in the output of the 'addon list' command as the # first line of output. addonListDictionaryHeading=Následující slovníky jsou nainstalovány: addonListExtensionHeading=Následující rozšíření jsou nainstalována: addonListLocaleHeading=Následující lokalizace jsou nainstalována: addonListPluginHeading=Následující zásuvné moduly jsou nainstalovány: addonListThemeHeading=Následující motivy vzhledu jsou nainstalovány: addonListAllHeading=Následující slovníky jsou nainstalovány: addonListUnknownHeading=Následující doplňky zvoleného typu jsou nainstalovány: # LOCALIZATION NOTE (addonListOutEnable, addonListOutDisable) Used in the # output of the 'addon list' command as the labels for the enable/disable # action buttons in the listing. This string is designed to be shown in a # small action button next to the addon name, which is why it should be as # short as possible. addonListOutEnable=Povolit addonListOutDisable=Zakázat # LOCALIZATION NOTE (addonPending, addonPendingEnable, addonPendingDisable, # addonPendingUninstall, addonPendingInstall, addonPendingUpgrade) Used in # the output of the 'addon list' command as the descriptions of pending # addon operations. addonPending is used as a prefix for a list of pending # actions (named by the other lookup variables). These strings are designed # to be shown alongside addon names, which is why they should be as short # as possible. addonPending=čeká na addonPendingEnable=povolení addonPendingDisable=zakázání addonPendingUninstall=odinstalaci addonPendingInstall=instalaci addonPendingUpgrade=aktualizaci # LOCALIZATION NOTE (addonNameDesc) A very short description of the # name parameter of numerous addon commands. This string is designed to be shown # in a menu alongside the command name, which is why it should be as short as # possible. addonNameDesc=Název doplňku # LOCALIZATION NOTE (addonNoneOfType) Used in the output of the 'addon list' # command when a search for addons of a particular type were not found. addonNoneOfType=Žádné doplňky zvoleného typu nejsou nainstalovány: # LOCALIZATION NOTE (addonEnableDesc) A very short description of the # 'addon enable ' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. addonEnableDesc=Povolí zvolený doplněk # LOCALIZATION NOTE (addonAlreadyEnabled) Used in the output of the # 'addon enable' command when an attempt is made to enable an add-on that is # already enabled. addonAlreadyEnabled=Doplněk %S je již povolený. # LOCALIZATION NOTE (addonEnabled) Used in the output of the 'addon enable' # command when an addon is enabled. addonEnabled=Doplněk %S byl povolený. # LOCALIZATION NOTE (addonDisableDesc) A very short description of the # 'addon disable ' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. addonDisableDesc=Disable the specified add-on # LOCALIZATION NOTE (addonAlreadyDisabled) Used in the output of the # 'addon disable' command when an attempt is made to disable an add-on that is # already disabled. addonAlreadyDisabled=Doplněk %S je již zakázaný. # LOCALIZATION NOTE (addonDisabled) Used in the output of the 'addon disable' # command when an addon is disabled. addonDisabled=Doplněk %S byl zakázán. # LOCALIZATION NOTE (exportDesc) A very short description of the 'export' # command. This string is designed to be shown in a menu alongside the command # name, which is why it should be as short as possible. exportDesc=Exportuje zdroje stránky # LOCALIZATION NOTE (exportHtmlDesc) A very short description of the 'export # html' command. This string is designed to be shown in a menu alongside the # command name, which is why it should be as short as possible. exportHtmlDesc=Exportuje HTML kód stránky # LOCALIZATION NOTE (pagemodDesc) A very short description of the 'pagemod' # command. This string is designed to be shown in a menu alongside the command # name, which is why it should be as short as possible. pagemodDesc=Změní strukturu stránky # LOCALIZATION NOTE (pagemodReplaceDesc) A very short description of the # 'pagemod replace' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. pagemodReplaceDesc=Vyhledá a nahradí prvky stránky # LOCALIZATION NOTE (pagemodReplaceSearchDesc) A very short string to describe # the 'search' parameter to the 'pagemod replace' command, which is displayed in # a dialog when the user is using this command. pagemodReplaceSearchDesc=Hledaný řetězec # LOCALIZATION NOTE (pagemodReplaceReplaceDesc) A very short string to describe # the 'replace' parameter to the 'pagemod replace' command, which is displayed in # a dialog when the user is using this command. pagemodReplaceReplaceDesc=Nahrazovaný řetězec # LOCALIZATION NOTE (pagemodReplaceIgnoreCaseDesc) A very short string to # describe the 'ignoreCase' parameter to the 'pagemod replace' command, which is # displayed in a dialog when the user is using this command. pagemodReplaceIgnoreCaseDesc=Hledá bez rozlišení velikosti # LOCALIZATION NOTE (pagemodReplaceRootDesc) A very short string to describe the # 'root' parameter to the 'pagemod replace' command, which is displayed in # a dialog when the user is using this command. pagemodReplaceRootDesc=Hledá z kořene určeným selektorem CSS # LOCALIZATION NOTE (pagemodReplaceSelectorDesc) A very short string to describe # the 'selector' parameter to the 'pagemod replace' command, which is displayed # in a dialog when the user is using this command. pagemodReplaceSelectorDesc=Hledá jako CSS selektor # LOCALIZATION NOTE (pagemodReplaceAttributesDesc) A very short string to # describe the 'attributes' parameter to the 'pagemod replace' command, which is # displayed in a dialog when the user is using this command. pagemodReplaceAttributesDesc=Hledá attributy odpovídající regexpu # LOCALIZATION NOTE (pagemodReplaceAttrOnlyDesc) A very short string to describe # the 'attrOnly' parameter to the 'pagemod replace' command, which is displayed # in a dialog when the user is using this command. pagemodReplaceAttrOnlyDesc=Hledá pouze atributy # LOCALIZATION NOTE (pagemodReplaceContentOnlyDesc) A very short string to # describe the 'contentOnly' parameter to the 'pagemod replace' command, which # is displayed in a dialog when the user is using this command. pagemodReplaceContentOnlyDesc=Hledá pouze textové uzly # LOCALIZATION NOTE (pagemodReplaceResultMatchedElements) A string displayed as # the result of the 'pagemod replace' command. pagemodReplaceResult=Prvky odpovídající selektoru: %1$S. Nahrazení v textových uzlech: %2$S. Nahrazení v atributech: %3$S. # LOCALIZATION NOTE (pagemodRemoveDesc) A very short description of the # 'pagemod remove' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. pagemodRemoveDesc=Odebere ze stránky prvky a atributy # LOCALIZATION NOTE (pagemodRemoveElementDesc) A very short description of the # 'pagemod remove element' command. This string is designed to be shown in # a menu alongside the command name, which is why it should be as short as # possible. pagemodRemoveElementDesc=Odebere ze stránky prvky # LOCALIZATION NOTE (pagemodRemoveElementSearchDesc) A very short string to # describe the 'search' parameter to the 'pagemod remove element' command, which # is displayed in a dialog when the user is using this command. pagemodRemoveElementSearchDesc=CSS selektor určující odebírané prvky a atributy # LOCALIZATION NOTE (pagemodRemoveElementRootDesc) A very short string to # describe the 'root' parameter to the 'pagemod remove element' command, which # is displayed in a dialog when the user is using this command. pagemodRemoveElementRootDesc=CSS selektor určující kořen hledání # LOCALIZATION NOTE (pagemodRemoveElementStripOnlyDesc) A very short string to # describe the 'stripOnly' parameter to the 'pagemod remove element' command, # which is displayed in a dialog when the user is using this command. pagemodRemoveElementStripOnlyDesc=Odebere prvky, ale nechá obsah # LOCALIZATION NOTE (pagemodRemoveElementIfEmptyOnlyDesc) A very short string to # describe the 'ifEmptyOnly' parameter to the 'pagemod remove element' command, # which is displayed in a dialog when the user is using this command. pagemodRemoveElementIfEmptyOnlyDesc=Odebere pouze prázdné prvky # LOCALIZATION NOTE (pagemodRemoveElementResultMatchedAndRemovedElements) # A string displayed as the result of the 'pagemod remove element' command. pagemodRemoveElementResultMatchedAndRemovedElements=Prvky odpovídající selektoru: %1$S. Odebrané prvky: %2$S. # LOCALIZATION NOTE (pagemodRemoveAttributeDesc) A very short description of the # 'pagemod remove attribute' command. This string is designed to be shown in # a menu alongside the command name, which is why it should be as short as # possible. pagemodRemoveAttributeDesc=Odebere odpovídající atributy # LOCALIZATION NOTE (pagemodRemoveAttributeSearchAttributesDesc) A very short # string to describe the 'searchAttributes' parameter to the 'pagemod remove # attribute' command, which is displayed in a dialog when the user is using this # command. pagemodRemoveAttributeSearchAttributesDesc=Regexp určující odebírané atributy # LOCALIZATION NOTE (pagemodRemoveAttributeSearchElementsDesc) A very short # string to describe the 'searchElements' parameter to the 'pagemod remove # attribute' command, which is displayed in a dialog when the user is using this # command. pagemodRemoveAttributeSearchElementsDesc=Selektor CSS určující vybírané prvky # LOCALIZATION NOTE (pagemodRemoveAttributeRootDesc) A very short string to # describe the 'root' parameter to the 'pagemod remove attribute' command, which # is displayed in a dialog when the user is using this command. pagemodRemoveAttributeRootDesc=Selektor CSS určující kořen hledání # LOCALIZATION NOTE (pagemodRemoveAttributeIgnoreCaseDesc) A very short string # to describe the 'ignoreCase' parameter to the 'pagemod remove attribute' # command, which is displayed in a dialog when the user is using this command. pagemodRemoveAttributeIgnoreCaseDesc=Provede hledání bez ohledu na velikost # LOCALIZATION NOTE (pagemodRemoveAttributeResult) A string displayed as the # result of the 'pagemod remove attribute' command. pagemodRemoveAttributeResult=Prvky odpovídající selektoru: %1$S. Odebrané atributy: %2$S. # LOCALIZATION NOTE (toolsDesc2) A very short description of the 'tools' # command, the parent command for tool-hacking commands. # The argument (%1$S) is the browser name. toolsDesc2=Upravování nástrojů vývojáře aplikace %1$S # LOCALIZATION NOTE (toolsManual2) A fuller description of the 'tools' # command. The argument (%1$S) is the browser name. toolsManual2=Řada příkazů souvisejících s přímou úpravou nástrojů vývojáře aplikace %1$S. # LOCALIZATION NOTE (toolsSrcdirDesc) A very short description of the 'tools srcdir' # command, for pointing your developer tools loader at a mozilla-central source tree. toolsSrcdirDesc=Načtení nástrojů z kopie mozilla-central # LOCALIZATION NOTE (toolsSrcdirNotFound) Shown when the 'tools srcdir' command was handed # an invalid srcdir. toolsSrcdirNotFound=Adresář %1$s neexistuje nebo se nejedná o platnou kopii mozilla-central. # LOCALIZATION NOTE (toolsSrcdirReloaded) Displayed when tools have been reloaded by the # 'tools srcdir' command. toolsSrcdirReloaded=Nástroje byly načteny z adresáře %1$s. # LOCALIZATION NOTE (toolsSrcdirManual2) A full description of the 'tools srcdir' # command. The argument (%1$S) is the browser name. toolsSrcdirManual2=Načte nástroje vývojáře aplikace %1$S z kopie mozilla-central. # LOCALIZATION NOTE (toolsSrcdirDir) The srcdir argument to the 'tools srcdir' command. toolsSrcdirDir=Kopie mozilla-central # LOCALIZATION NOTE (toolsBuiltinDesc) A short description of the 'tools builtin' # command, which overrides a previous 'tools srcdir' command. toolsBuiltinDesc=Použití vestavěných nástrojů # LOCALIZATION NOTE (toolsBuiltinDesc) A fuller description of the 'tools builtin' # command. toolsBuiltinManual=Použití vestavěných nástrojů. Přepíše libovolný předchozí příkaz srcdir. # LOCALIZATION NOTE (toolsBuiltinReloaded) Displayed when tools are loaded with the # 'tools builtin' command. toolsBuiltinReloaded=Vestavěné nástroje načteny. # LOCALIZATION NOTE (toolsReloadDesc) A short description of the 'tools reload' command. # which will reload the tools from the current srcdir. toolsReloadDesc=Obnovení nástrojů vývojáře # LOCALIZATION NOTE (toolsReloaded2) Displayed when tools are reloaded with the 'tools # reload' command. toolsReloaded2=Nástroje obnoveny. # LOCALIZATION NOTE (cookieDesc) A very short description of the 'cookie' # command. See cookieManual for a fuller description of what it does. This # string is designed to be shown in a menu alongside the command name, which # is why it should be as short as possible. cookieDesc=Zobrazí a změní cookies # LOCALIZATION NOTE (cookieManual) A fuller description of the 'cookie' # command, displayed when the user asks for help on what it does. cookieManual=Příkazy k vypsaní, vytvoření, smazání a změně cookies v aktální doméně. # LOCALIZATION NOTE (cookieListDesc) A very short description of the # 'cookie list' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. cookieListDesc=Zobrazí cookies # LOCALIZATION NOTE (cookieListManual) A fuller description of the 'cookie list' # command, displayed when the user asks for help on what it does. cookieListManual=Zobrazí seznam cookies odpovídající aktuální stránce # LOCALIZATION NOTE (cookieListOutHost,cookieListOutPath,cookieListOutExpires,cookieListOutAttributes): # The 'cookie list' command has a number of headings for cookie properties. # Particular care should be taken in translating these strings as they have # references to names in the cookies spec. cookieListOutHost=Server: cookieListOutPath=Cesta: cookieListOutExpires=Platnost do: cookieListOutAttributes=Atributy: # LOCALIZATION NOTE (cookieListOutNone) The output of the 'cookie list' command # uses this string when no cookie attributes (like httpOnly, secure, etc) apply cookieListOutNone=Žádné # LOCALIZATION NOTE (cookieListOutSession) The output of the 'cookie list' # command uses this string to describe a cookie with an expiry value of '0' # that is to say it is a session cookie cookieListOutSession=Ukončení prohlížeče (relace) # LOCALIZATION NOTE (cookieListOutNonePage) The output of the 'cookie list' # command uses this string for pages like 'about:blank' which can't contain # cookies cookieListOutNonePage=Pro tuto stránku nebylo nalezeno žádné cookie # LOCALIZATION NOTE (cookieListOutNoneHost) The output of the 'cookie list' # command uses this string when there are no cookies on a given web page cookieListOutNoneHost=Pro server „%1$S“ nebylo nalezeno žádné cookie # LOCALIZATION NOTE (cookieListOutEdit) A title used in the output from the # 'cookie list' command on a button which can be used to edit cookie values cookieListOutEdit=Upravit # LOCALIZATION NOTE (cookieListOutRemove) A title used in the output from the # 'cookie list' command on a button which can be used to remove cookies cookieListOutRemove=Odebrat # LOCALIZATION NOTE (cookieRemoveDesc) A very short description of the # 'cookie remove' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. cookieRemoveDesc=Odebere cookie # LOCALIZATION NOTE (cookieRemoveManual) A fuller description of the 'cookie remove' # command, displayed when the user asks for help on what it does. cookieRemoveManual=Odebere cookie zadané svým klíčem # LOCALIZATION NOTE (cookieRemoveKeyDesc) A very short string to describe the # 'key' parameter to the 'cookie remove' command, which is displayed in a dialog # when the user is using this command. cookieRemoveKeyDesc=Klíč odebíraného cookie # LOCALIZATION NOTE (cookieSetDesc) A very short description of the # 'cookie set' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. cookieSetDesc=Nastaví cookie # LOCALIZATION NOTE (cookieSetManual) A fuller description of the 'cookie set' # command, displayed when the user asks for help on what it does. cookieSetManual=Nastaví do zadaného klíče cookie určené nepovinně jedním nebo více parametry: platnost (maximální platnost v sekundách nebo datum konce platnosti ve formátu GMT), cesta, doména, zabezpečení # LOCALIZATION NOTE (cookieSetKeyDesc) A very short string to describe the # 'key' parameter to the 'cookie set' command, which is displayed in a dialog # when the user is using this command. cookieSetKeyDesc=Klíč nastavovaného cookie # LOCALIZATION NOTE (cookieSetValueDesc) A very short string to describe the # 'value' parameter to the 'cookie set' command, which is displayed in a dialog # when the user is using this command. cookieSetValueDesc=Hodnota nastavovaného cookie # LOCALIZATION NOTE (cookieSetOptionsDesc) The title of a set of options to # the 'cookie set' command, displayed as a heading to the list of option. cookieSetOptionsDesc=Možnosti # LOCALIZATION NOTE (cookieSetPathDesc) A very short string to describe the # 'path' parameter to the 'cookie set' command, which is displayed in a dialog # when the user is using this command. cookieSetPathDesc=Cesta nastavovaného cookie # LOCALIZATION NOTE (cookieSetDomainDesc) A very short string to describe the # 'domain' parameter to the 'cookie set' command, which is displayed in a dialog # when the user is using this command. cookieSetDomainDesc=Doména nastavovaného cookie # LOCALIZATION NOTE (cookieSetSecureDesc) A very short string to describe the # 'secure' parameter to the 'cookie set' command, which is displayed in a dialog # when the user is using this command. cookieSetSecureDesc=Cookie přenášené pouze pomocí https # LOCALIZATION NOTE (cookieSetHttpOnlyDesc) A very short string to describe the # 'httpOnly' parameter to the 'cookie set' command, which is displayed in a dialog # when the user is using this command. cookieSetHttpOnlyDesc=Není dostupné pomocí skriptu na straně klienta # LOCALIZATION NOTE (cookieSetSessionDesc) A very short string to describe the # 'session' parameter to the 'cookie set' command, which is displayed in a dialog # when the user is using this command. cookieSetSessionDesc=Je platné pouze po dobu relace prohlížeče # LOCALIZATION NOTE (cookieSetExpiresDesc) A very short string to describe the # 'expires' parameter to the 'cookie set' command, which is displayed in a dialog # when the user is using this command. cookieSetExpiresDesc=Datum platnosti cookie (datum dle RFC2822 v uvozovkách nebo dle ISO 8601) # LOCALIZATION NOTE (jsbDesc) A very short description of the # 'jsb' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. jsbDesc=Zkrášlovač Javascriptu # LOCALIZATION NOTE (jsbUrlDesc) A very short description of the # 'jsb ' parameter. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. jsbUrlDesc=Adresa ke zkrášlovanému souboru JS # LOCALIZATION NOTE (jsbIndentSizeDesc) A very short description of the # 'jsb ' parameter. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. jsbIndentSizeDesc=Počet odsazujících znaků # LOCALIZATION NOTE (jsbIndentSizeManual) A fuller description of the # 'jsb ' parameter, displayed when the user asks for help on what it # does. jsbIndentSizeManual=Počet znaků, které odsadí každý řádek # LOCALIZATION NOTE (jsbIndentCharDesc) A very short description of the # 'jsb ' parameter. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. jsbIndentCharDesc=Znaky odsazující každý řádek # LOCALIZATION NOTE (jsbIndentCharManual) A fuller description of the # 'jsb ' parameter, displayed when the user asks for help on what it # does. jsbIndentCharManual=Znaky odsazující každý řádek - mezera nebo tabulátor # the 'jsb ' parameter. This string is designed to be # shown in a menu alongside the command name, which is why it should be as short # as possible. jsbDoNotPreserveNewlinesDesc=Nezachová existující konce řádků # LOCALIZATION NOTE (jsbPreserveNewlinesManual) A fuller description of the # 'jsb ' parameter, displayed when the user asks for help # on what it does. jsbPreserveNewlinesManual=Měli by být zachovány existující konce řádků # LOCALIZATION NOTE (jsbPreserveMaxNewlinesDesc) A very short description of the # 'jsb ' parameter. This string is designed to be shown # in a menu alongside the command name, which is why it should be as short as # possible. jsbPreserveMaxNewlinesDesc=Maximální počet konců řádků # LOCALIZATION NOTE (jsbPreserveMaxNewlinesManual) A fuller description of the # 'jsb ' parameter, displayed when the user asks for help # on what it does. jsbPreserveMaxNewlinesManual=Maximální počet za sebou následujících konců řádků # LOCALIZATION NOTE (jsbJslintHappyDesc) A very short description of the # 'jsb ' parameter. This string is designed to be shown # in a menu alongside the command name, which is why it should be as short as # possible. jsbJslintHappyDesc=Vynutit řežim jslint-stricter? # LOCALIZATION NOTE (jsbJslintHappyManual) A fuller description of the # 'jsb ' parameter, displayed when the user asks for help # on what it does. jsbJslintHappyManual=Je-li nastaveno na true, je vynucen režim jslint-stricter # LOCALIZATION NOTE (jsbBraceStyleDesc2) A very short description of the # 'jsb ' parameter. This string is designed to be shown # in a menu alongside the command name, which is why it should be as short as # possible. jsbBraceStyleDesc2=Výběr stylu závorek # LOCALIZATION NOTE (jsbBraceStyleManual2) A fuller description of the # 'jsb ' parameter, displayed when the user asks for help # on what it does. # # NOTES: The keywords collapse, expand, end-expand and expand-strict should not # be translated. "even if it will break your code" means that the resulting code # may no longer be functional. jsbBraceStyleManual2=Výběr stylu závorek: collapse - umístí závorky na stejnou řádku jako výraz; expand - umístí závorky na samostatné řádky (styl Allman / ANSI); end-expand - umístí koncovou závorku na samostatný řádek; expand-strict - umístí závorky na samostatné řádky, i když to rozbije kód. # LOCALIZATION NOTE (jsbNoSpaceBeforeConditionalDesc) A very short description # of the 'jsb ' parameter. This string is designed to # be shown in a menu alongside the command name, which is why it should be as # short as possible. jsbNoSpaceBeforeConditionalDesc=Žádná mezera před if # LOCALIZATION NOTE (jsbUnescapeStringsDesc) A very short description of the # 'jsb ' parameter. This string is designed to be shown # in a menu alongside the command name, which is why it should be as short as # possible. jsbUnescapeStringsDesc=Odescapování znaků \\xNN? # LOCALIZATION NOTE (jsbUnescapeStringsManual) A fuller description of the # 'jsb ' parameter, displayed when the user asks for help # on what it does. jsbUnescapeStringsManual=Měli by být tisknutelné znaky zakódvané jako \\xNN odescapovány? # LOCALIZATION NOTE (jsbInvalidURL) Displayed when an invalid URL is passed to # the jsb command. jsbInvalidURL=Vložte prosím platnou adresu # LOCALIZATION NOTE (jsbOptionsDesc) The title of a set of options to # the 'jsb' command, displayed as a heading to the list of options. jsbOptionsDesc=Možnosti # LOCALIZATION NOTE (calllogDesc) A very short description of the # 'calllog' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. calllogDesc=Příkazy k žurnálování volání funkcí # LOCALIZATION NOTE (calllogStartDesc) A very short description of the # 'calllog start' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. calllogStartDesc=Zapne žurnálování volání funkcí do konzoly # LOCALIZATION NOTE (calllogStartReply) A string displayed as the result of # the 'calllog start' command. calllogStartReply=Žurnálování zapnuto. # LOCALIZATION NOTE (calllogStopDesc) A very short description of the # 'calllog stop' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. calllogStopDesc=Vypne žurnálování volání funkcí # LOCALIZATION NOTE (calllogStopNoLogging) A string displayed as the result of # the 'calllog stop' command when there is nothing to stop. calllogStopNoLogging=Žádné žurnálování není aktuálně aktivní # LOCALIZATION NOTE (calllogStopReply) A string displayed as the result of # the 'calllog stop' command when there are logging actions to stop. calllogStopReply=Žurnálování vypnuto. Aktivní kontext: %1$S. # LOCALIZATION NOTE (calllogStartChromeDesc) A very short description of the # 'calllog chromestart' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. calllogChromeStartDesc=Zapne žurnálování volání funkcí chrome do konzoly # LOCALIZATION NOTE (calllogChromeSourceTypeDesc) A very short description of the # 'calllog chromestart ' parameter. This string is designed to be # shown in a menu alongside the command name, which is why it should be as short as possible. calllogChromeSourceTypeDesc=Globální object, JSM URI nebo JS poskytující globální objekt # LOCALIZATION NOTE (calllogChromeSourceTypeDesc) A very short description of the # 'calllog chromestart' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. calllogChromeSourceTypeManual=Globální objekt, JSM URI nebo JS vykonávaný v okně chrome, ze kterého se získává globální objekt # LOCALIZATION NOTE (calllogChromeStartReply) A string displayed as the result # of the 'calllog chromestart' command. calllogChromeStartReply=Žurnálování zapnuto. # LOCALIZATION NOTE (calllogChromeStopDesc) A very short description of the # 'calllog chromestop' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. calllogChromeStopDesc=Vypne žurnálování volání funkcí chrome # LOCALIZATION NOTE (calllogChromeStopNoLogging) A string displayed as the # result of the 'calllog chromestop' command when there is nothing to stop. calllogChromeStopNoLogging=Žádné žurnálování funkcí chrome není aktuálné aktivní # LOCALIZATION NOTE (calllogStopReply) A string displayed as the result of # the 'calllog chromestop' command when there are logging actions to stop. calllogChromeStopReply=Žurnálování vypnuto. Activní kontext: %1$S. # LOCALIZATION NOTE (callLogChromeAnonFunction) A string displayed as the result # of the 'calllog chromestart' command when an anonymouse function is to be # logged. callLogChromeAnonFunction= # LOCALIZATION NOTE (callLogChromeMethodCall) A string displayed as the result # of the 'calllog chromestart' command to proceed a method name when it is to be # logged. callLogChromeMethodCall=Volání metody # LOCALIZATION NOTE (callLogChromeInvalidJSM) A string displayed as the result # of the 'calllog chromestart' command with an invalid JSM or JSM path. callLogChromeInvalidJSM=Neplatný JSM! # LOCALIZATION NOTE (callLogChromeVarNotFoundContent) A string displayed as the # result of the 'calllog chromestart' command with a source type of # content-variable and an invalid variable name. callLogChromeVarNotFoundContent=Proměnná nebyla v okně obsahu nalezena. # LOCALIZATION NOTE (callLogChromeVarNotFoundChrome) A string displayed as the # result of the 'calllog chromestart' command with a source type of # chrome-variable and an invalid variable name. callLogChromeVarNotFoundChrome=Proměnná nebyla v okně chrome nalezena. # LOCALIZATION NOTE (callLogChromeEvalException) A string displayed as the # result of the 'calllog chromestart' command with a source type of javascript # and invalid JavaScript code. callLogChromeEvalException=Vyhodnocovaný JavaScript vyhodil následující výjimku # LOCALIZATION NOTE (callLogChromeEvalNeedsObject) A string displayed as the # result of passing a non-JavaScript object creating source via the # 'calllog chromestart javascript' command. callLogChromeEvalNeedsObject=Kód JavaScriptu se musí vyhodnotit do objektu, volání jehož metod se má žurnálovat např."({a1: function() {this.a2()},a2: function() {}});" # LOCALIZATION NOTE (scratchpadOpenTooltip) A string displayed as the # tooltip of button in devtools toolbox which opens Scratchpad. scratchpadOpenTooltip=Zápisník # LOCALIZATION NOTE (paintflashingDesc) A very short string used to describe the # function of the "paintflashing" command paintflashingDesc=Zvýrazní vykreslovanou obast # LOCALIZATION NOTE (paintflashingOnDesc) A very short string used to describe the # function of the "paintflashing on" command. paintflashingOnDesc=Zapne zvýraznění překreslování # LOCALIZATION NOTE (paintflashingOffDesc) A very short string used to describe the # function of the "paintflashing off" command. paintflashingOffDesc=Vypne zvýraznění překreslování # LOCALIZATION NOTE (paintflashingChrome) A very short string used to describe the # function of the "paintflashing on/off chrome" command. paintflashingChromeDesc=rámce chrome # LOCALIZATION NOTE (paintflashingManual) A longer description describing the # set of commands that control paint flashing. paintflashingManual=Vykreslí překreslované oblasti v různých barvách # LOCALIZATION NOTE (paintflashingTooltip) A string displayed as the # tooltip of button in devtools toolbox which toggles paint flashing. paintflashingTooltip=Zvýrazní překreslované oblasti # LOCALIZATION NOTE (paintflashingOnDesc) A very short string used to describe the # function of the "paintflashing on" command. paintflashingToggleDesc=Přepne zvýrazňování překreslování # LOCALIZATION NOTE (splitconsoleTooltip) A string displayed as the # tooltip of button in devtools toolbox which toggles the split webconsole. splitconsoleTooltip=Přepne rozdělení konzole # LOCALIZATION NOTE (appCacheDesc) A very short string used to describe the # function of the "appcache" command appCacheDesc=Nástroje aplikační mezipaměti # LOCALIZATION NOTE (appCacheValidateDesc) A very short string used to describe # the function of the "appcache validate" command. appCacheValidateDesc=Zkontroluje aplikační mezipaměti # LOCALIZATION NOTE (appCacheValidateManual) A fuller description of the # 'validate' parameter to the 'appcache' command, displayed when the user asks # for help on what it does. appCacheValidateManual=Nalezne problémy související s manifestem mezipaměti a soubory, na které odkazuje # LOCALIZATION NOTE (appCacheValidateUriDesc) A very short string used to describe # the function of the "uri" parameter of the appcache validate" command. appCacheValidateUriDesc=URI pro kontrolu # LOCALIZATION NOTE (appCacheValidated) Displayed by the "appcache validate" # command when it has been successfully validated. appCacheValidatedSuccessfully=Kontrola appcache byla úspěšná. # LOCALIZATION NOTE (appCacheClearDesc) A very short string used to describe # the function of the "appcache clear" command. appCacheClearDesc=Vymaže položky z aplikační mezipaměti # LOCALIZATION NOTE (appCacheClearManual) A fuller description of the # 'appcache clear' command, displayed when the user asks for help on what it does. appCacheClearManual=Vymaže jednu či více položek z aplikační mezipaměti # LOCALIZATION NOTE (appCacheClearCleared) Displayed by the "appcache clear" # command when entries are successfully cleared. appCacheClearCleared=Položky byly úspěšně vymazány. # LOCALIZATION NOTE (AppCacheListDesc) A very short string used to describe # the function of the "appcache list" command. appCacheListDesc=Zobrazí seznam položek aplikační mezipaměti. # LOCALIZATION NOTE (AppCacheListManual) A fuller description of the # 'appcache list' command, displayed when the user asks for help on what it does. appCacheListManual=Zobrazí seznam všech položek aplikační mezipaměti. Pokud je použit parametr pro vyhledání, pak se v tabulce zobrazí pouze položky obsahující hledaný výraz. # LOCALIZATION NOTE (AppCacheListSearchDesc) A very short string used to describe # the function of the "search" parameter of the appcache list" command. appCacheListSearchDesc=Filtr výsledků dle vyhledaného výrazu. # LOCALIZATION NOTE (AppCacheList*) Row headers for the 'appcache list' command. appCacheListKey=Klíč: appCacheListDataSize=Velikost dat: appCacheListDeviceID=ID zařízení: appCacheListExpirationTime=Platnost do: appCacheListFetchCount=Počet vrácení: appCacheListLastFetched=Naposledy vráceno: appCacheListLastModified=Naposledy upraveno: # LOCALIZATION NOTE (appCacheListViewEntry) The text for the view entry button # of the 'appcache list' command. appCacheListViewEntry=Zobrazit položku # LOCALIZATION NOTE (appCacheViewEntryDesc) A very short string used to describe # the function of the "appcache viewentry" command. appCacheViewEntryDesc=Otevře nový panel obsahující informace o konkrétní položce mezipaměti. # LOCALIZATION NOTE (appCacheViewEntryManual) A fuller description of the # 'appcache viewentry' command, displayed when the user asks for help on what it # does. appCacheViewEntryManual=Otevře nový panel obsahující informace o konkrétní položce mezipaměti. # LOCALIZATION NOTE (appCacheViewEntryKey) A very short string used to describe # the function of the "key" parameter of the 'appcache viewentry' command. appCacheViewEntryKey=Klíč položky, která se má zobrazit. # LOCALIZATION NOTE (profilerDesc) A very short string used to describe the # function of the profiler command. profilerDesc=Správa profileru # LOCALIZATION NOTE (profilerManual) A longer description describing the # set of commands that control the profiler. profilerManual=Příkazy na spuštění či zastavení profileru JavaScriptu # LOCALIZATION NOTE (profilerOpen) A very short string used to describe the function # of the profiler open command. profilerOpenDesc=Otevře profiler # LOCALIZATION NOTE (profilerClose) A very short string used to describe the function # of the profiler close command. profilerCloseDesc=Zavře profiler # LOCALIZATION NOTE (profilerStart) A very short string used to describe the function # of the profiler start command. profilerStartDesc=Spustí profilování # LOCALIZATION NOTE (profilerStartManual) A fuller description of the 'profile name' # parameter. This parameter is used to name a newly created profile or to lookup # an existing profile by its name. profilerStartManual=Název profilu, který si přejete spustit. # LOCALIZATION NOTE (profilerStop) A very short string used to describe the function # of the profiler stop command. profilerStopDesc=Ukončí profilování # LOCALIZATION NOTE (profilerStopManual) A fuller description of the 'profile name' # parameter. This parameter is used to lookup an existing profile by its name. profilerStopManual=Název profilu, který si přejete ukončit. # LOCALIZATION NOTE (profilerList) A very short string used to describe the function # of the profiler list command. profilerListDesc=Seznam všech profilů # LOCALIZATION NOTE (profilerShow) A very short string used to describe the function # of the profiler show command. profilerShowDesc=Zobrazí konkrétní profil # LOCALIZATION NOTE (profilerShowManual) A fuller description of the 'profile name' # parameter. This parameter is used to name a newly created profile or to lookup # an existing profile by its name. profilerShowManual=Název profilu. # LOCALIZATION NOTE (profilerAlreadyStarted) A message that is displayed whenever # an operation cannot be completed because the profile in question has already # been started. profilerAlreadyStarted2=Tento profil byl již spuštěn # LOCALIZATION NOTE (profilerNotFound) A message that is displayed whenever # an operation cannot be completed because the profile in question could not be # found. profilerNotFound=Profil nenalezen # LOCALIZATION NOTE (profilerNotStarted) A message that is displayed whenever # an operation cannot be completed because the profile in question has not been # started yet. It also contains a hint to use the 'profile start' command to # start the profiler. profilerNotStarted3=Tento profil nebyl ještě spuštěn. K zobrazení výsledků použijte příkaz 'profile start' # LOCALIZATION NOTE (profilerStarted2) A very short string that indicates that # we have started recording. profilerStarted2=Nahrávání… # LOCALIZATION NOTE (profilerStopped) A very short string that indicates that # we have stopped recording. profilerStopped=Ukončování… # LOCALIZATION NOTE (profilerNotReady) A message that is displayed whenever # an operation cannot be completed because the profiler has not been opened yet. profilerNotReady=Aby tento příkaz fungoval, musíte nejdříve otevřít profiler # LOCALIZATION NOTE (listenDesc) A very short string used to describe the # function of the 'listen' command. listenDesc=Otevře vzdálený port pro ladění # LOCALIZATION NOTE (listenManual2) A longer description of the 'listen' # command. listenManual2=%1$S může umožnit vzdálené ladění přes TCP/IP spojení. Z bezpečnostních důvodů je to ve výchozím nastavení zakázané, ale může to být pomocí tohoto příkazu povoleno. # LOCALIZATION NOTE (listenPortDesc) A very short string used to describe the # function of 'port' parameter to the 'listen' command. listenPortDesc=TCP port pro naslouchání # LOCALIZATION NOTE (listenDisabledOutput) Text of a message output during the # execution of the 'listen' command. listenDisabledOutput=Naslouchání je zakázáno předvolbou devtools.debugger.remote-enabled # LOCALIZATION NOTE (listenInitOutput) Text of a message output during the # execution of the 'listen' command. %1$S is a port number listenInitOutput=Naslouchání na portu %1$S # LOCALIZATION NOTE (listenNoInitOutput) Text of a message output during the # execution of the 'listen' command. listenNoInitOutput=DebuggerServer nebyl inicializován # LOCALIZATION NOTE (mediaDesc, mediaEmulateDesc, mediaEmulateManual, # mediaEmulateType, mediaResetDesc, mediaResetManual) These strings describe # the 'media' commands and all available parameters. mediaDesc=Emulace konkrétního typu CSS media mediaEmulateDesc=Emulace konkrétního typu CSS media mediaEmulateManual=Zobrazí dokument, jako kdyby byl vykresen na zřízení podporující konkrétní typ média. Zobrazí odpovídající CSS pravidla. mediaEmulateType=Typy média, které bude emulováno mediaResetDesc=Ukončí emulaci konkrétního typu CSS media # LOCALIZATION NOTE (injectDesc, injectManual, injectLibraryDesc, injectLoaded, # injectFailed) These strings describe the 'inject' commands and all available # parameters. injectDesc=Vloží běžné knihovny do stránky injectManual2=Vloží běžné knihovny co kontextu stránky, které mohou být následně přístupné z konzole. injectLibraryDesc=Zvolte knihovny, keré chcete vložit nebo vložte platnou URL skriptu, který chcete vložit. injectLoaded=%1$S načteno injectFailed=Načtení %1$S selhalo - neplatné URI # LOCALIZATION NOTE (folderDesc, folderOpenDesc, folderOpenDir, # folderOpenProfileDesc) These strings describe the 'folder' commands and # all available parameters. folderDesc=Otevře složky folderOpenDesc=Otevře složku na konkrétní cestě folderOpenDir=Cesta k adresáři folderOpenProfileDesc=Otevře adresář s profilem # LOCALIZATION NOTE (folderInvalidPath) A string displayed as the result # of the 'folder open' command with an invalid folder path. folderInvalidPath=Vložte prosím platnou cestu # LOCALIZATION NOTE (folderOpenDirResult) A very short string used to # describe the result of the 'folder open' command. # The argument (%1$S) is the folder path. folderOpenDirResult=Otevřeno %1$S ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/inspector.dtd ================================================ ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/inspector.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the Inspector # which is available from the Web Developer sub-menu -> 'Inspect'. # # The correct localization of this file might be to keep it in # English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best # documentation on web development on the web. # LOCALIZATION NOTE (confirmNavigationAway): Used in the Inspector tool, when # the user tries to navigate away from a web page, to confirm the change of # page. confirmNavigationAway.message2=Pokud opustíte tuto stránku, všechny vámi provedené změny budou ztraceny. confirmNavigationAway.buttonLeave=Opustit stránku confirmNavigationAway.buttonLeaveAccesskey=O confirmNavigationAway.buttonStay=Zůstat na stránce confirmNavigationAway.buttonStayAccesskey=Z breadcrumbs.siblings=Siblings # LOCALIZATION NOTE (debuggerPausedWarning): Used in the Inspector tool, when # the user switch to the inspector when the debugger is paused. debuggerPausedWarning.message=Debugger je pozastaven. Některé věci jako např. označení myší nebudou fungovat. # LOCALIZATION NOTE (nodeMenu.tooltiptext) # This menu appears in the Infobar (on top of the highlighted node) once # the node is selected. nodeMenu.tooltiptext=Operace s uzlem # LOCALIZATION NOTE (inspector.*) # Used for the menuitem in the tool menu inspector.label=Průzkumník inspector.commandkey=I inspector.accesskey=r # LOCALIZATION NOTE (inspector.panelLabel.*) # Labels applied to the panel and views within the panel in the toolbox inspector.panelLabel=Panel Průzkumník inspector.panelLabel.markupView=Pohled zápisu # LOCALIZATION NOTE (markupView.more.*) # When there are too many nodes to load at once, we will offer to # show all the nodes. markupView.more.showing=Některé uzly jsou skryté. markupView.more.showAll=Zobrazit všech %S uzlů inspector.tooltip=Průzkumník DOM a stylů #LOCALIZATION NOTE: Used in the image preview tooltip when the image could not be loaded previewTooltip.image.brokenImage=Nepodařilo se načíst obrázek #LOCALIZATION NOTE: Used in the image preview tooltip when the image could not be loaded eventsTooltip.openInDebugger=Otevřít v debuggeru ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/layoutview.dtd ================================================ ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/netmonitor.dtd ================================================ ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/netmonitor.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the Network Monitor # which is available from the Web Developer sub-menu -> 'Network Monitor'. # The correct localization of this file might be to keep it in # English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best # documentation on web development on the web. # LOCALIZATION NOTE (netmonitor.label): # This string is displayed in the title of the tab when the Network Monitor is # displayed inside the developer tools window and in the Developer Tools Menu. netmonitor.label=Síť # LOCALIZATION NOTE (netmonitor.panelLabel): # This is used as the label for the toolbox panel. netmonitor.panelLabel=Panel Síť # LOCALIZATION NOTE (netmonitor.commandkey, netmonitor.accesskey) # Used for the menuitem in the tool menu netmonitor.commandkey=Q netmonitor.accesskey=S # LOCALIZATION NOTE (netmonitor.tooltip): # This string is displayed in the tooltip of the tab when the Network Monitor is # displayed inside the developer tools window. netmonitor.tooltip=Monitor síťové aktivity # LOCALIZATION NOTE (netmonitor.security.state.secure) # This string is used as an tooltip for request that was performed over secure # channel i.e. the connection was encrypted. netmonitor.security.state.secure=Připojení použité pro získání tohoto zdroje bylo šifrované. # LOCALIZATION NOTE (netmonitor.security.state.insecure) # This string is used as an tooltip for request that was performed over insecure # channel i.e. the connection was not encrypted. netmonitor.security.state.insecure=Připojení použité na získání tohoto zdroje nebylo šifrované. # LOCALIZATION NOTE (netmonitor.security.state.broken) # This string is used as an tooltip for request that failed due to security # issues. netmonitor.security.state.broken=Bezpečnostní chyba zabránila načítání zdroje. # LOCALIZATION NOTE (netmonitor.security.state.weak) # This string is used as an tooltip for request that had minor security issues netmonitor.security.state.weak=Tento zdroj byl přenesen připojením, které používalo slabé šifrování. # LOCALIZATION NOTE (netmonitor.security.enabled): # This string is used to indicate that a specific security feature is used by # a connection in the security details tab. # For example: "HTTP Strict Transport Security: Enabled" netmonitor.security.enabled=povolené # LOCALIZATION NOTE (netmonitor.security.disabled): # This string is used to indicate that a specific security feature is not used by # a connection in the security details tab. # For example: "HTTP Strict Transport Security: Disabled" netmonitor.security.disabled=zakázané # LOCALIZATION NOTE (netmonitor.security.hostHeader): # This string is used as a header for section containing security information # related to the remote host. %S is replaced with the domain name of the remote # host. For example: Host example.com netmonitor.security.hostHeader=Server %S: # LOCALIZATION NOTE (netmonitor.security.notAvailable): # This string is used to indicate that a certain piece of information is not # available to be displayd. For example a certificate that has no organization # defined: # Organization: netmonitor.security.notAvailable= # LOCALIZATION NOTE (collapseDetailsPane): This is the tooltip for the button # that collapses the network details pane in the UI. collapseDetailsPane=Skryje detaily o požadavku # LOCALIZATION NOTE (expandDetailsPane): This is the tooltip for the button # that expands the network details pane in the UI. expandDetailsPane=Zobrazí detaily o požadavku # LOCALIZATION NOTE (headersEmptyText): This is the text displayed in the # headers tab of the network details pane when there are no headers available. headersEmptyText=Pro tento požadavek nejsou žádné hlavičky # LOCALIZATION NOTE (headersFilterText): This is the text displayed in the # headers tab of the network details pane for the filtering input. headersFilterText=Filtr hlaviček # LOCALIZATION NOTE (cookiesEmptyText): This is the text displayed in the # cookies tab of the network details pane when there are no cookies available. cookiesEmptyText=Pro tento požadavek nejsou žádná cookies # LOCALIZATION NOTE (cookiesFilterText): This is the text displayed in the # cookies tab of the network details pane for the filtering input. cookiesFilterText=Filtr cookies # LOCALIZATION NOTE (paramsEmptyText): This is the text displayed in the # params tab of the network details pane when there are no params available. paramsEmptyText=Pro tento požadavek nejsou žádné parametry # LOCALIZATION NOTE (paramsFilterText): This is the text displayed in the # params tab of the network details pane for the filtering input. paramsFilterText=Filtr parametrů požadavku # LOCALIZATION NOTE (paramsQueryString): This is the label displayed # in the network details params tab identifying the query string. paramsQueryString=Řetězec dotazu # LOCALIZATION NOTE (paramsFormData): This is the label displayed # in the network details params tab identifying the form data. paramsFormData=Data formuláře # LOCALIZATION NOTE (paramsPostPayload): This is the label displayed # in the network details params tab identifying the request payload. paramsPostPayload=Obsah požadavku # LOCALIZATION NOTE (requestHeaders): This is the label displayed # in the network details headers tab identifying the request headers. requestHeaders=Hlavičky požadavku # LOCALIZATION NOTE (requestHeadersFromUpload): This is the label displayed # in the network details headers tab identifying the request headers from # the upload stream of a POST request's body. requestHeadersFromUpload=Hlavičky požadavku ze streamu nahrávání # LOCALIZATION NOTE (responseHeaders): This is the label displayed # in the network details headers tab identifying the response headers. responseHeaders=Hlavičky odpovědi # LOCALIZATION NOTE (requestCookies): This is the label displayed # in the network details params tab identifying the request cookies. requestCookies=Požadavek na cookies # LOCALIZATION NOTE (responseCookies): This is the label displayed # in the network details params tab identifying the response cookies. responseCookies=Vrácené cookies # LOCALIZATION NOTE (jsonFilterText): This is the text displayed # in the response tab of the network details pane for the JSON filtering input. jsonFilterText=Filtr vlastností # LOCALIZATION NOTE (jsonScopeName): This is the text displayed # in the response tab of the network details pane for a JSON scope. jsonScopeName=JSON # LOCALIZATION NOTE (jsonpScopeName): This is the text displayed # in the response tab of the network details pane for a JSONP scope. jsonpScopeName=JSONP → callback %S() # LOCALIZATION NOTE (networkMenu.sortedAsc): This is the tooltip displayed # in the network table toolbar, for any column that is sorted ascending. networkMenu.sortedAsc=Řazení vzestupně # LOCALIZATION NOTE (networkMenu.sortedDesc): This is the tooltip displayed # in the network table toolbar, for any column that is sorted descending. networkMenu.sortedDesc=Řazení sestupně # LOCALIZATION NOTE (networkMenu.empty): This is the label displayed # in the network table footer when there are no requests available. networkMenu.empty=Žádné požadavky # LOCALIZATION NOTE (networkMenu.summary): Semi-colon list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # This label is displayed in the network table footer providing concise # information about all requests. Parameters: #1 is the number of requests, # #2 is the size, #3 is the number of seconds. networkMenu.summary=Jeden požadavek, #2 kB, #3 s;#1 požadavky, #2 kB, #3 s;#1 požadavků, #2 kB, #3 s # LOCALIZATION NOTE (networkMenu.sizeKB): This is the label displayed # in the network menu specifying the size of a request (in kilobytes). networkMenu.sizeKB=%S kB # LOCALIZATION NOTE (networkMenu.sizeUnavailable): This is the label displayed # in the network menu specifying the transferred size of a request is # unavailable. networkMenu.sizeUnavailable=— # LOCALIZATION NOTE (networkMenu.totalMS): This is the label displayed # in the network menu specifying the time for a request to finish (in milliseconds). networkMenu.totalMS=→ %S ms # LOCALIZATION NOTE (networkMenu.millisecond): This is the label displayed # in the network menu specifying timing interval divisions (in milliseconds). networkMenu.millisecond=%S ms # LOCALIZATION NOTE (networkMenu.second): This is the label displayed # in the network menu specifying timing interval divisions (in seconds). networkMenu.second=%S s # LOCALIZATION NOTE (networkMenu.minute): This is the label displayed # in the network menu specifying timing interval divisions (in minutes). networkMenu.minute=%S min # LOCALIZATION NOTE (pieChart.loading): This is the label displayed # for pie charts (e.g., in the performance analysis view) when there is # no data available yet. pieChart.loading=Nahrávání # LOCALIZATION NOTE (pieChart.unavailable): This is the label displayed # for pie charts (e.g., in the performance analysis view) when there is # no data available, even after loading it. pieChart.unavailable=Prázdný # LOCALIZATION NOTE (tableChart.loading): This is the label displayed # for table charts (e.g., in the performance analysis view) when there is # no data available yet. tableChart.loading=Čekejte prosím… # LOCALIZATION NOTE (tableChart.unavailable): This is the label displayed # for table charts (e.g., in the performance analysis view) when there is # no data available, even after loading it. tableChart.unavailable=Nejsou k dispozici žádná data # LOCALIZATION NOTE (charts.sizeKB): This is the label displayed # in pie or table charts specifying the size of a request (in kilobytes). charts.sizeKB=%S kB # LOCALIZATION NOTE (charts.totalS): This is the label displayed # in pie or table charts specifying the time for a request to finish (in seconds). charts.totalS=%S s # LOCALIZATION NOTE (charts.cacheEnabled): This is the label displayed # in the performance analysis view for "cache enabled" charts. charts.cacheEnabled=Primární mezipaměť # LOCALIZATION NOTE (charts.cacheDisabled): This is the label displayed # in the performance analysis view for "cache disabled" charts. charts.cacheDisabled=Prázdná mezipaměť # LOCALIZATION NOTE (charts.totalSize): This is the label displayed # in the performance analysis view for total requests size, in kilobytes. charts.totalSize=Velikost: %S kB # LOCALIZATION NOTE (charts.totalSeconds): Semi-colon list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # This is the label displayed in the performance analysis view for the # total requests time, in seconds. charts.totalSeconds=Čas: #1 sekunda;Čas: #1 sekundy;Čas: #1 sekund # LOCALIZATION NOTE (charts.totalCached): This is the label displayed # in the performance analysis view for total cached responses. charts.totalCached=Odpovědi z mezipaměti: %S # LOCALIZATION NOTE (charts.totalCount): This is the label displayed # in the performance analysis view for total requests. charts.totalCount=Celkem požadavků: %S ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/profiler.dtd ================================================ ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/profiler.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the Profiler # which is available from the Web Developer sub-menu -> 'Profiler'. # The correct localization of this file might be to keep it in # English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best # documentation on web development on the web. # LOCALIZATION NOTE (profiler.label): # This string is displayed in the title of the tab when the profiler is # displayed inside the developer tools window and in the Developer Tools Menu. profiler.label2=Výkon # LOCALIZATION NOTE (profiler.panelLabel): # This is used as the label for the toolbox panel. profiler.panelLabel2=Panel Výkon # LOCALIZATION NOTE (profiler2.commandkey, profiler.accesskey) # Used for the menuitem in the tool menu profiler.commandkey2=VK_F5 profiler.accesskey=V # LOCALIZATION NOTE (profiler.tooltip2): # This string is displayed in the tooltip of the tab when the profiler is # displayed inside the developer tools window. profiler.tooltip2=Nástroj na profilování JavaScriptu # LOCALIZATION NOTE (noRecordingsText): The text to display in the # recordings menu when there are no recorded profiles yet. noRecordingsText=Dosud nejsou žádné profily. # LOCALIZATION NOTE (recordingsList.itemLabel): # This string is displayed in the recordings list of the Profiler, # identifying a set of function calls. recordingsList.itemLabel=Nahrání #%S # LOCALIZATION NOTE (recordingsList.recordingLabel): # This string is displayed in the recordings list of the Profiler, # for an item that has not finished recording. recordingsList.recordingLabel=Probíhá… # LOCALIZATION NOTE (recordingsList.durationLabel): # This string is displayed in the recordings list of the Profiler, # for an item that has finished recording. recordingsList.durationLabel=%S ms # LOCALIZATION NOTE (recordingsList.saveLabel): # This string is displayed in the recordings list of the Profiler, # for saving an item to disk. recordingsList.saveLabel=Uložit # LOCALIZATION NOTE (profile.tab): # This string is displayed in the profile view for a tab, after the # recording has finished, as the recording 'start → stop' range in milliseconds. profile.tab=%1$S ms → %2$S ms # LOCALIZATION NOTE (graphs.fps): # This string is displayed in the framerate graph of the Profiler, # as the unit used to measure frames per second. This label should be kept # AS SHORT AS POSSIBLE so it doesn't obstruct important parts of the graph. graphs.fps=fps # LOCALIZATION NOTE (graphs.ms): # This string is displayed in the flamegraph of the Profiler, # as the unit used to measure time (in milliseconds). This label should be kept # AS SHORT AS POSSIBLE so it doesn't obstruct important parts of the graph. graphs.ms=ms # LOCALIZATION NOTE (category.*): # These strings are displayed in the categories graph of the Profiler, # as the legend for each block in every bar. These labels should be kept # AS SHORT AS POSSIBLE so they don't obstruct important parts of the graph. category.other=Gecko category.css=Styly category.js=JIT category.gc=GC category.network=Síť category.graphics=Grafika category.storage=Úložiště category.events=Vstup a události # LOCALIZATION NOTE (graphs.ms): # This string is displayed in the call tree after units of time in milliseconds. table.ms=ms # LOCALIZATION NOTE (graphs.ms): # This string is displayed in the call tree after units representing percentages. table.percentage=% # LOCALIZATION NOTE (table.root): # This string is displayed in the call tree for the root node. table.root=(hlavní) # LOCALIZATION NOTE (table.idle): # This string is displayed in the call tree for the idle blocks. table.idle=(idle) # LOCALIZATION NOTE (table.url.tooltiptext): # This string is displayed in the call tree as the tooltip text for the url # labels which, when clicked, jump to the debugger. table.url.tooltiptext=Zobrazí zdroj v Debuggeru # LOCALIZATION NOTE (table.zoom.tooltiptext): # This string is displayed in the call tree as the tooltip text for the 'zoom' # buttons (small magnifying glass icons) which spawn a new tab. table.zoom.tooltiptext=Prozkoumá snímek v novém panelu # LOCALIZATION NOTE (recordingsList.saveDialogTitle): # This string is displayed as a title for saving a recording to disk. recordingsList.saveDialogTitle=Uložení profilu… # LOCALIZATION NOTE (recordingsList.saveDialogJSONFilter): # This string is displayed as a filter for saving a recording to disk. recordingsList.saveDialogJSONFilter=Soubory JSON # LOCALIZATION NOTE (recordingsList.saveDialogAllFilter): # This string is displayed as a filter for saving a recording to disk. recordingsList.saveDialogAllFilter=Všechny soubory ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/projecteditor.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the ProjectEditor component # which is used for editing files in a directory and is used inside the # App Manager. # The correct localization of this file might be to keep it in # English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best # documentation on web development on the web. # LOCALIZATION NOTE (projecteditor.confirmUnsavedTitle): # This string is displayed as as the title of the confirm prompt that checks # to make sure if the project editor can be closed without saving changes projecteditor.confirmUnsavedTitle=Neuložené změny # LOCALIZATION NOTE (projecteditor.confirmUnsavedLabel2): # This string is displayed as the message of the confirm prompt that checks # to make sure if the project can be closed/switched without saving changes projecteditor.confirmUnsavedLabel2=Máte neuložené změny, které budou ztraceny. Chcete skutečně pokračovat? # LOCALIZATION NOTE (projecteditor.deleteLabel): # This string is displayed as a context menu item for allowing the selected # file / folder to be deleted. projecteditor.deleteLabel=Smazat # LOCALIZATION NOTE (projecteditor.deletePromptTitle): # This string is displayed as as the title of the confirm prompt that checks # to make sure if a file or folder should be removed. projecteditor.deletePromptTitle=Smazání # LOCALIZATION NOTE (projecteditor.deleteFolderPromptMessage): # This string is displayed as as the message of the confirm prompt that checks # to make sure if a folder should be removed. projecteditor.deleteFolderPromptMessage=Jste si jist(a), že chcete smazat tuto složku? # LOCALIZATION NOTE (projecteditor.deleteFilePromptMessage): # This string is displayed as as the message of the confirm prompt that checks # to make sure if a file should be removed. projecteditor.deleteFilePromptMessage=Jste si jist(a), že chcete smazat tento soubor? # LOCALIZATION NOTE (projecteditor.newLabel): # This string is displayed as a context menu item for adding a new file to # the directory. projecteditor.newLabel=Nový… # LOCALIZATION NOTE (projecteditor.renameLabel): # This string is displayed as a menu item for renaming a file in # the directory. projecteditor.renameLabel=Přejmenovat # LOCALIZATION NOTE (projecteditor.saveLabel): # This string is displayed as a menu item for saving the current file. projecteditor.saveLabel=Uložit # LOCALIZATION NOTE (projecteditor.saveAsLabel): # This string is displayed as a menu item for saving the current file # with a new name. projecteditor.saveAsLabel=Uložit jako… # LOCALIZATION NOTE (projecteditor.selectFileLabel): # This string is displayed as the title on the file picker when saving a file. projecteditor.selectFileLabel=Volba souboru # LOCALIZATION NOTE (projecteditor.openFolderLabel): # This string is displayed as the title on the file picker when opening a folder. projecteditor.openFolderLabel=Volba složky # LOCALIZATION NOTE (projecteditor.openFileLabel): # This string is displayed as the title on the file picker when opening a file. projecteditor.openFileLabel=Otevření souboru # LOCALIZATION NOTE (projecteditor.find.commandkey): This is the key to use in # conjunction with accel (Command on Mac or Ctrl on other platforms) to search # text in the files. projecteditor.find.commandkey=F # LOCALIZATION NOTE (projecteditor.save.commandkey): This is the key to use in # conjunction with accel (Command on Mac or Ctrl on other platforms) to # save the file. It is used with accel+shift to "save as". projecteditor.save.commandkey=S # LOCALIZATION NOTE (projecteditor.new.commandkey): This is the key to use in # conjunction with accel (Command on Mac or Ctrl on other platforms) to # create a new file. projecteditor.new.commandkey=N ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/responsiveUI.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the Responsive Mode # which is available from the Web Developer sub-menu -> 'Responsive Mode'. # # The correct localization of this file might be to keep it in # English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best # documentation on web development on the web. # LOCALIZATION NOTE (responsiveUI.rotate): label of the rotate button. responsiveUI.rotate2=Otočit # LOCALIZATION NOTE (responsiveUI.screenshot): tooltip of the screenshot button. responsiveUI.screenshot=Snímek obrazovky # LOCALIZATION NOTE (responsiveUI.screenshotGeneratedFilename): The auto generated filename. # The first argument (%1$S) is the date string in yyyy-mm-dd format and the second # argument (%2$S) is the time string in HH.MM.SS format. responsiveUI.screenshotGeneratedFilename=Snímek obrazovky %1$S v %2$S # LOCALIZATION NOTE (responsiveUI.touch): tooltip of the touch button. responsiveUI.touch=Simuluje události klepnutí (může být vyžadováno obnovení stránky) # LOCALIZATION NOTE (responsiveUI.addPreset): label of the add preset button. responsiveUI.addPreset=Přidat rozlišení # LOCALIZATION NOTE (responsiveUI.removePreset): label of the remove preset button. responsiveUI.removePreset=Odebrat rozlišení # LOCALIZATION NOTE (responsiveUI.customResolution): label of the first item # in the menulist at the beginning of the toolbar. For %S is replace with the # current size of the page. For example: "400x600". responsiveUI.customResolution=%S (aktuální) # LOCALIZATION NOTE (responsiveUI.namedResolution): label of custom items with a name # in the menulist of the toolbar. # For example: "320x480 (phone)". responsiveUI.namedResolution=%S (%S) # LOCALIZATION NOTE (responsiveUI.customNamePromptTitle): prompt title when asking # the user to specify a name for a new custom preset. responsiveUI.customNamePromptTitle=Režim responzivního designu # LOCALIZATION NOTE (responsiveUI.close): tooltip text of the close button. responsiveUI.close=Ukončí režim responzivního designu # LOCALIZATION NOTE (responsiveUI.customNamePromptMsg): prompt message when asking # the user to specify a name for a new custom preset. responsiveUI.customNamePromptMsg=Pojmenujte rozlišení %Sx%S # LOCALIZATION NOTE (responsiveUI.resizer): tooltip showed when # overring the resizers. responsiveUI.resizerTooltip=Použijte klávesu Control pro větší přesnost. Pro zaokrouhlené rozměry použijte klávesu Shift. # LOCALIZATION NOTE (responsiveUI.needReload): notification that appears # when touch events are enabled responsiveUI.needReload=Pokud byl naslouchací proces přidán později, je potřeba stránku obnovit. responsiveUI.notificationReload=Obnovit responsiveUI.notificationReload_accesskey=O responsiveUI.dontShowReloadNotification=Příště již nezobrazovat responsiveUI.dontShowReloadNotification_accesskey=P ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/scratchpad.dtd ================================================ ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/scratchpad.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the JavaScript scratchpad # which is available from the Web Developer sub-menu -> 'Scratchpad'. # # The correct localization of this file might be to keep it in # English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best # documentation on web development on the web. # LOCALIZATION NOTE (export.fileOverwriteConfirmation): This is displayed when # the user attempts to save to an already existing file. export.fileOverwriteConfirmation=Soubor již existuje. Chcete ho přepsat? # LOCALIZATION NOTE (browserWindow.unavailable): This error message is shown # when Scratchpad does not find any recently active window of navigator:browser # type. browserWindow.unavailable=Zápisník nemůže nalézt žádné okno prohlížeče, ve kterém by mohl vykonat kód. # LOCALIZATION NOTE (scratchpadContext.invalid): This error message is shown # when user tries to run an operation in Scratchpad in an unsupported context. scratchpadContext.invalid=Tuto operaci nelze provést v současném režimu zápisníku. # LOCALIZATION NOTE (openFile.title): This is the file picker title, when you # open a file from Scratchpad. openFile.title=Otevřít soubor # LOCALIZATION NOTE (openFile.failed): This is the message displayed when file # open fails. openFile.failed=Při čtení souboru nastala chyba. # LOCALIZATION NOTE (openFile.failed): This is the message displayed when file # open fails. importFromFile.convert.failed=Konverze souboru z %1$S na Unicode selhala. # LOCALIZATION NOTE (clearRecentMenuItems.label): This is the label for the # menuitem in the 'Open Recent'-menu which clears all recent files. clearRecentMenuItems.label=Smazat položky # LOCALIZATION NOTE (saveFileAs): This is the file picker title, when you save # a file in Scratchpad. saveFileAs=Uložit soubor jako # LOCALIZATION NOTE (saveFile.failed): This is the message displayed when file # save fails. saveFile.failed=Při ukládání souboru nastala chyba. # LOCALIZATION NOTE (confirmClose): This is message in the prompt dialog when # you try to close a scratchpad with unsaved changes. confirmClose=Chcete uložit provedené změny? # LOCALIZATION NOTE (confirmClose.title): This is title of the prompt dialog when # you try to close a scratchpad with unsaved changes. confirmClose.title=Neuložené změny # LOCALIZATION NOTE (confirmRevert): This is message in the prompt dialog when # you try to revert unsaved content of scratchpad. confirmRevert=Opravdu chcete vrátit zpět provedené úpravy? # LOCALIZATION NOTE (confirmRevert.title): This is title of the prompt dialog when # you try to revert unsaved content of scratchpad. confirmRevert.title=Vrátit zpět úpravy # LOCALIZATION NOTE (scratchpadIntro): This is a multi-line comment explaining # how to use the Scratchpad. Note that this should be a valid JavaScript # comment inside /* and */. scratchpadIntro1=/*\n * Toto je zápisník JavaScriptu.\n *\n * Vložte kód JavaScriptu a pak na něj klepněte pravým tlačítkem nebo z nabídky Vykonat zvolte:\n * 1. Spustit pro vyhodnocení vybraného kódu (%1$S),\n * 2. Prozkoumat pro otevření výsledku v průzkumníku objektů (%2$S),\n * 3. Zobrazit pro vložení výsledku do komentáře za vybraný kód. (%3$S)\n */\n\n # LOCALIZATION NOTE (scratchpad.noargs): This error message is shown when # Scratchpad instance is created without any arguments. Scratchpad window # expects to receive its unique identifier as the first window argument. scratchpad.noargs=Zápisník byl otevřen bez očekávaných paramtrů. # LOCALIZATION NOTE (scratchpad.noargs): This error message is shown when # Scratchpad instance is created without any arguments. Scratchpad window # expects to receive its unique identifier as the first window argument. scratchpad.noargs=Zápisník byl vytvořen bez potřebných parametrů. # LOCALIZATION NOTE (notification.browserContext): This is the message displayed # over the top of the editor when the user has switched to browser context. browserContext.notification=Tento zápisník je nyní spouštěn v kontextu prohlížeče. # LOCALIZATION NOTE (help.openDocumentationPage): This returns a localized link with # documentation for Scratchpad on MDN. help.openDocumentationPage=https://developer.mozilla.org/en/Tools/Scratchpad # LOCALIZATION NOTE (scratchpad.statusBarLineCol): Line, Column # information displayed in statusbar when selection is made in # Scratchpad. scratchpad.statusBarLineCol = Řádek %1$S, sloupec %2$S # LOCALIZATION NOTE (fileExists.notification): This is the message displayed # over the top of the the editor when a file does not exist. fileNoLongerExists.notification=Tento soubor již neexistuje. # LOCALIZATION NOTE (propertiesFilterPlaceholder): this is the text that # appears in the filter text box for the properties view container. propertiesFilterPlaceholder=Filtr vlastností # LOCALIZATION NOTE (connectionTimeout): message displayed when the Remote Scratchpad # fails to connect to the server due to a timeout. connectionTimeout=Vypršel časový limit připojení. Zkontrolujte obsah Chybové konzoly, zda se v ní nenachází potenciální chybové zprávy. Otevřete znovu Zápisník a zkuste to znovu. # LOCALIZATION NOTE (scratchpad.label): this string is displayed in the title of # the tab when the Scratchpad is displayed inside the developer tools window and # in the Developer Tools Menu. scratchpad.label=Zápisník # LOCALIZATION NOTE (scratchpad.panelLabel): this is used as the # label for the toolbox panel. scratchpad.panelLabel=Panel Zápisník # LOCALIZATION NOTE (scratchpad.tooltip): This string is displayed in the # tooltip of the tab when the Scratchpad is displayed inside the developer tools # window. scratchpad.tooltip=Zápisník # LOCALIZATION NOTE (selfxss.msg): the text that is displayed when # a new user of the developer tools pastes code into the console # %1 is the text of selfxss.okstring selfxss.msg=Bezpečnostní varování: Mějte se na pozoru před vkládáním věcí, kterým nerozumíte. Můžete tak umožňit útočníkům ukrást vaši identitu či převzít kontrolu nad vaším počítačem. Pro povolení vkládání vložte prosím '%S' níže (není potřeba stisk klávesy enter). # LOCALIZATION NOTE (selfxss.msg): the string to be typed # in by a new user of the developer tools when they receive the sefxss.msg prompt. # Please avoid using non-keyboard characters here selfxss.okstring=povolit vkládání ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/shadereditor.dtd ================================================ ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/shadereditor.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the Debugger # which is available from the Web Developer sub-menu -> 'Debugger'. # The correct localization of this file might be to keep it in # English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best # documentation on web development on the web. # LOCALIZATION NOTE (ToolboxShaderEditor.label): # This string is displayed in the title of the tab when the Shader Editor is # displayed inside the developer tools window and in the Developer Tools Menu. ToolboxShaderEditor.label=Shader Editor # LOCALIZATION NOTE (ToolboxShaderEditor.panelLabel): # This is used as the label for the toolbox panel. ToolboxShaderEditor.panelLabel=Panel Shader Editor # LOCALIZATION NOTE (ToolboxShaderEditor.tooltip): # This string is displayed in the tooltip of the tab when the Shader Editor is # displayed inside the developer tools window. ToolboxShaderEditor.tooltip=Live GLSL shader language editor for WebGL # LOCALIZATION NOTE (shadersList.programLabel): # This string is displayed in the programs list of the Shader Editor, # identifying a set of linked GLSL shaders. shadersList.programLabel=Program %S # LOCALIZATION NOTE (shadersList.blackboxLabel): # This string is displayed in the programs list of the Shader Editor, while # the user hovers over the checkbox used to toggle blackboxing of a program's # associated fragment shader. shadersList.blackboxLabel=Přepnout viditelnost geometrie ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/shared.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE (dimensions): This is used to display the dimensions # of a node or image, like 100×200. dimensions=%S\u00D7%S ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/sourceeditor.dtd ================================================ ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/sourceeditor.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the Source Editor component. # This component is used whenever source code is displayed for the purpose of # being edited, inside the Firefox developer tools - current examples are the # Scratchpad and the Style Editor tools. # LOCALIZATION NOTE The correct localization of this file might be to keep it # in English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best documentation # on web development on the web. # LOCALIZATION NOTE (findCmd.promptTitle): This is the dialog title used # when the user wants to search for a string in the code. You can # access this feature by pressing Ctrl-F on Windows/Linux or Cmd-F on Mac. findCmd.promptTitle=Najít… # LOCALIZATION NOTE (gotoLineCmd.promptMessage): This is the message shown when # the user wants to search for a string in the code. You can # access this feature by pressing Ctrl-F on Windows/Linux or Cmd-F on Mac. findCmd.promptMessage=Hledat: # LOCALIZATION NOTE (gotoLineCmd.promptTitle): This is the dialog title used # when the user wants to jump to a specific line number in the code. You can # access this feature by pressing Ctrl-J on Windows/Linux or Cmd-J on Mac. gotoLineCmd.promptTitle=Jít na řádek… # LOCALIZATION NOTE (gotoLineCmd.promptMessage): This is the message shown when # the user wants to jump to a specific line number in the code. You can # access this feature by pressing Ctrl-J on Windows/Linux or Cmd-J on Mac. gotoLineCmd.promptMessage=Jít na řádek číslo: # LOCALIZATION NOTE (annotation.breakpoint.title): This is the text shown in # front of any breakpoint annotation when it is displayed as a tooltip in one of # the editor gutters. This feature is used in the JavaScript Debugger. annotation.breakpoint.title=Zarážka: %S # LOCALIZATION NOTE (annotation.currentLine): This is the text shown in # a tooltip displayed in any of the editor gutters when the user hovers the # current line. annotation.currentLine=Aktuální řádek # LOCALIZATION NOTE (annotation.debugLocation.title): This is the text shown in # a tooltip displayed in any of the editor gutters when the user hovers the # current debugger location. The debugger can pause the JavaScript execution at # user-defined lines. annotation.debugLocation.title=Aktuální krok: %S # LOCALIZATION NOTE (autocompletion.docsLink): This is the text shown on # the link inside of the documentation popup. If you type 'document' in Scratchpad # then press Shift+Space you can see the popup. autocompletion.docsLink=dokumentace # LOCALIZATION NOTE (autocompletion.notFound): This is the text shown in # the documentation popup if Tern fails to find a type for the object. autocompletion.notFound=nenalezeno # LOCALIZATION NOTE (jumpToLine.commandkey): This the key to use in # conjunction with accel (Command on Mac or Ctrl on other platforms) to jump to # a specific line in the editor. jumpToLine.commandkey=J # LOCALIZATION NOTE (toggleComment.commandkey): This the key to use in # conjunction with accel (Command on Mac or Ctrl on other platforms) to either # comment or uncomment selected lines in the editor. toggleComment.commandkey=/ # LOCALIZATION NOTE (indentLess.commandkey): This is the key to use in # conjunction with accel (Command on Mac or Ctrl on other platforms) to reduce # indentation level in CodeMirror. However, its default value also used by # the Toolbox to switch between tools so we disable it. # # DO NOT translate this key without proper synchronization with toolbox.dtd. indentLess.commandkey=[ # LOCALIZATION NOTE (indentMore.commandkey): This is the key to use in # conjunction with accel (Command on Mac or Ctrl on other platforms) to increase # indentation level in CodeMirror. However, its default value also used by # the Toolbox to switch between tools # # DO NOT translate this key without proper synchronization with toolbox.dtd. indentMore.commandkey=] # LOCALIZATION NOTE (moveLineUp.commandkey): This is the key to use to move # the selected lines up. moveLineUp.commandkey=Alt-Up # LOCALIZATION NOTE (moveLineDown.commandkey): This is the key to use to move # the selected lines down. moveLineDown.commandkey=Alt-Down # LOCALIZATION NOTE (autocomplete.commandkey): This is the key to use # in conjunction with Ctrl for autocompletion. autocompletion.commandkey=Space # LOCALIZATION NOTE (showInformation2.commandkey): This is the key to use to # show more information, like type inference. showInformation2.commandkey=Shift-Ctrl-Space ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/storage.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the Storage Editor tool. # LOCALIZATION NOTE The correct localization of this file might be to keep it # in English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best documentation # on web development on the web. # LOCALIZATION NOTE (storage.commandkey): This the key to use in # conjunction with shift to open the storage editor storage.commandkey=VK_F9 # LOCALIZATION NOTE (storage.accesskey): The access key used to open the storage # editor. storage.accesskey=o # LOCALIZATION NOTE (storage.label): # This string is displayed as the label of the tab in the developer tools window storage.label=Úložiště # LOCALIZATION NOTE (storage.menuLabel): # This string is displayed in the Tools menu as a shortcut to open the devtools # with the Storage Inspector tab selected. storage.menuLabel=Průzkumník úložiště # LOCALIZATION NOTE (storage.panelLabel): # This string is used as the aria-label for the iframe of the Storage Inspector # tool in developer tools toolbox. storage.panelLabel=Panel Úložiště # LOCALIZATION NOTE (storage.tooltip): # This string is displayed in the tooltip of the tab when the storage editor is # displayed inside the developer tools window. storage.tooltip2=Průzkumník úložiště(Cookies, Local Storage …) # LOCALIZATION NOTE (tree.emptyText): # This string is displayed when the Storage Tree is empty. This can happen when # there are no websites on the current page (about:blank) tree.emptyText=Žádný host pro stránku # LOCALIZATION NOTE (table.emptyText): # This string is displayed when there are no rows in the Storage Table for the # selected host. table.emptyText=Pro zvolený host nejsou žádná data pro zobrazení # LOCALIZATION NOTE (tree.labels.*): # These strings are the labels for Storage type groups present in the Storage # Tree, like cookies, local storage etc. tree.labels.cookies=Cookies tree.labels.localStorage=Local Storage tree.labels.sessionStorage=Session Storage tree.labels.indexedDB=Indexed DB # LOCALIZATION NOTE (table.headers.*.*): # These strings are the header names of the columns in the Storage Table for # each type of storage available through the Storage Tree to the side. table.headers.cookies.name=Název table.headers.cookies.path=Cesta table.headers.cookies.host=Doména table.headers.cookies.expires=Expiruje dne table.headers.cookies.value=Hodnota table.headers.cookies.lastAccessed=Poslední přístup dne table.headers.cookies.creationTime=Vytvořeno dne # LOCALIZATION NOTE (table.headers.cookies.isHttpOnly): # This string is used in the header for the column which denotes whether a # cookie is HTTP only or not. table.headers.cookies.isHttpOnly=isHttpOnly # LOCALIZATION NOTE (table.headers.cookies.isSecure): # This string is used in the header for the column which denotes whether a # cookie can be accessed via a secure channel only or not. table.headers.cookies.isSecure=isSecure # LOCALIZATION NOTE (table.headers.cookies.isDomain): # This string is used in the header for the column which denotes whether a # cookie is a domain cookie only or not. table.headers.cookies.isDomain=isDomain table.headers.localStorage.name=Klíč table.headers.localStorage.value=Hodnota table.headers.sessionStorage.name=Klíč table.headers.sessionStorage.value=Hodnota table.headers.indexedDB.name=Klíč table.headers.indexedDB.db=Název databáze table.headers.indexedDB.objectStore=Název uloženého objektu table.headers.indexedDB.value=Hodnota table.headers.indexedDB.origin=Původ table.headers.indexedDB.version=Verze table.headers.indexedDB.objectStores=Úložiště objektu table.headers.indexedDB.keyPath=Klíč table.headers.indexedDB.autoIncrement=Automatické povyšování table.headers.indexedDB.indexes=Indexy # LOCALIZATION NOTE (label.expires.session): # This string is displayed in the expires column when the cookie is Session # Cookie label.expires.session=Relace # LOCALIZATION NOTE (storage.search.placeholder): # This is the placeholder text in the sidebar search box storage.search.placeholder=Filtr hodnot # LOCALIZATION NOTE (storage.data.label): # This is the heading displayed over the item value in the sidebar storage.data.label=Data # LOCALIZATION NOTE (storage.parsedValue.label): # This is the heading displayed over the item parsed value in the sidebar storage.parsedValue.label=Parsovaná hodnota ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/styleeditor.dtd ================================================ ================================================ FILE: langpacks/cs/browser/chrome/cs/locale/browser/devtools/styleeditor.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the Style Editor. # LOCALIZATION NOTE The correct localization of this file might be to keep it # in English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best documentation # on web development on the web. # LOCALIZATION NOTE (chromeWindowTitle): This is the title of the Style Editor # 'chrome' window. That is, the main window with the stylesheets list. # The argument is either the content document's title or its href if no title # is available. chromeWindowTitle=Editor stylů [%S] # LOCALIZATION NOTE (inlineStyleSheet): This is the name used for an style sheet # that is declared inline in the 邪神マモンは眠りに落ちた。復活せし野獣は大地を巡り、数を増やして軍勢をなした。新たな時の到来は広く告げられ、人々は狐の叡智をもって実りを炎の供物とした。そして聖なる書の約束の地、夢を紡いだ第二の世界を築いた人々は、その子らに野獣を語り継いだ。マモンが目覚めた時、見よ!残されしはただ一人の従者のみ。 '> --> The Book of Mozilla, 15:1'> ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/narrate.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # Narrate, meaning "read the page out loud". This is the name of the feature # and it is the label for the popup button. narrate =読み上げ back =戻る start =開始 stop =停止 forward =進む speed =速さ selectvoicelabel =ボイス: # Default voice is determined by the language of the document. defaultvoice =既定 # Voice name and language. # eg. David (English) voiceLabel =%S (%S) ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/netError.dtd ================================================ サイトアドレスは有効なようですが、接続を確立できませんでした。

      • サイトが一時的に利用できなくなっている場合、再度後で試してください。
      • 他のサイトも表示できない場合、コンピューターのネットワーク接続を確認してください。
      • ファイアーウォールやプロキシでネットワークが保護されている場合、その設定に問題があると正常に表示できなくなることがあります。
      "> リクエストされたアドレスのポート (例えば mozilla.jp のポート80であればmozilla.jp:80) は普通ウェブサイトの表示以外の目的で使用されます。ユーザーの保護とセキュリティのため、リクエストは中止されました。

      "> 指定されたアドレスのホストサーバーが見つかりませんでした。

      • ドメイン名の入力を間違っていないか確認してください。(例えば www.mozilla-japan.org を間違えて ww.mozilla-japan.org などと入力していないか)
      • 指定されたアドレスのドメインが存在しないかもしれません。すでに有効期限が切れて廃止されている可能性もあります。
      • 他のサイトも表示できない場合、コンピューターのネットワーク接続を確認してください。
      • ファイアーウォールやプロキシでネットワークが保護されている場合、その設定に問題があると正常に表示できなくなることがあります。
      ">
    • ファイルの名前が変更、削除、または移動されている可能性があります。
    • アドレスに入力ミス、大文字/小文字の違い、その他の間違いがないか確認してください。
    • リソースへのアクセス権限があるか確認してください。
    • ">
    • ファイルが削除または移動されているかファイルの許可属性によりアクセスが拒否された可能性があります。
    • "> 現在のところこの問題やエラーについての詳細情報はありません。

      "> 指定されたアドレスの書式が正しくありません。ミスがないかロケーションバーを確認してください。

      "> サイトに正常に接続できましたが、データの転送中にネットワーク接続が切断されました。再度試してください。

      • 他のサイトも表示できない場合、コンピューターのネットワーク接続を確認してください。
      • 問題が繰り返される場合、ネットワーク管理者またはインターネットプロバイダに問い合わせてください。
      "> リクエストされたブラウザーキャッシュ内のドキュメントは利用できません。

      • 安全対策のため、ブラウザーは注意を要するドキュメントを自動的に再リクエストしません。
      • "再試行" ボタンをクリックしてドキュメントをウェブサイトから読み込んでください。
      "> ブラウザーは現在オフラインモードで動作しており、リクエスト対象に接続できません。

      • コンピューターが有効なネットワークに接続されているか確認してください。
      • "再試行" ボタンを押してブラウザーをオンラインモードに切り替え、ページを再読み込みしてください。
      "> 不正または不明な形式で圧縮されているため、ページを表示できません。

      • この問題についてはウェブサイトの管理者に問い合わせてください。
      ">
    • この問題をウェブサイトの管理者に報告してください。
    • "> ネットワーク接続の確立中にリンクが切れました。再度試してください。

      "> 接続リクエストに対してリクエスト先サーバーが応答を返さなかったため、接続を中止しました。

      • サーバーに負荷が集中したり、一時的に停止している可能性があります。しばらく後で再度試してください。
      • 他のサイトも表示できない場合、コンピューターのネットワーク接続を確認してください。
      • ファイアーウォールやプロキシでネットワークが保護されている場合、その設定に問題があると正常に表示できなくなることがあります。
      • 問題が繰り返される場合、ネットワーク管理者またはインターネットプロバイダに問い合わせてください。
      "> 指定されたプロトコル (例えば wxyz://) を認識できないため、サイトに正常に接続できませんでした。

      • マルチメディアファイルなど非テキストデータにアクセスしようとしている場合、サイトによる特別な動作要件がないか確認してください。
      • 一部のプロトコルを使用するにはサードパーティのソフトウェアやプラグインが必要になります。
      "> プロキシサーバーを使用する設定になっていますが、プロキシサーバーは接続を拒否しました。

      • ブラウザーのプロキシ設定が正しいか確認してください。
      • このネットワークからプロキシサービスへの接続が許可されているか確認してください。
      • 問題が繰り返される場合、ネットワーク管理者またはインターネットプロバイダに問い合わせてください。
      "> プロキシサーバーを使用する設定になっていますが、プロキシサーバーが見つかりませんでした。

      • ブラウザーのプロキシ設定が正しいか確認してください。
      • コンピューターが有効なネットワークに接続されているか確認してください。
      • 問題が繰り返される場合、ネットワーク管理者またはインターネットプロバイダに問い合わせてください。
      "> リクエストされたリソースの取得を中止しました。このサイトではリクエストの自動転送がループしています。

      • このサイトで要求されている Cookie を無効化またはブロックしていないか確認してください。
      • 注意: サイトによる Cookie の使用を許可しても解決しない場合、これはご利用のコンピューターではなくサーバーの設定に問題があると思われます。
      "> ネットワークリクエストに対するサイトの応答が正しくなかったため、接続を中断しました。

      "> 受信したデータの真正性を検証できなかったため、このページは表示できません。

      • この問題についてはウェブサイトの管理者に問い合わせてください。
      ">
    • サーバーの設定に問題があるか、誰かが正規のサーバーになりすましている可能性があります。
    • 以前は正常に接続できていた場合、この問題は恐らく一時的なものですので、後で再度試してみてください。
    • "> インターネット接続環境を完全には信頼できない場合や、これまでこのサーバーではこの警告が表示されなかった場合は、このサイトを例外として追加しないでください。

      どうしてもこのサイトを例外として追加したい場合は、暗号化の高度な設定で追加してください。

      "> セキュリティポリシーにより読み込みが禁止されたコンテンツが含まれているため、このページの読み込みを中止しました。

      "> このページは、データの伝送中にエラーが検出されたため表示できません。

      • ウェブサイトの所有者に連絡を取り、この問題を報告してください。
      ">
      • ウェブサイトの所有者に連絡を取り、この問題を報告してください。

      "> は攻撃に対して脆弱な古いセキュリティ技術を使用しています。攻撃者は保護された情報を簡単に暴露できます。サイトを安全に訪れるには、このウェブサイトの管理者にサーバーの問題を修正してもらう必要があります。

      エラーコード: NS_ERROR_NET_INADEQUATE_SECURITY

      "> ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/netErrorApp.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/notification.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/nsWebBrowserPersist.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. readError =ダウンロード元ファイルが読み取れないため %S を保存できませんでした。\n\nしばらく後で再度試すか、サーバー管理者に問い合わせてください。 writeError =原因不明のエラーにより %S を保存できませんでした。\n\n別の場所に保存してください。 launchError =原因不明のエラーにより %S を開けませんでした。\n\n一度ディスクに保存してからそのファイルを開いてください。 diskFull =%S を保存するディスクの空き領域が不足しています。\n\nディスク上の不要なファイルを削除してから再度試すか、別の場所に保存してください。 readOnly =ディスク、フォルダーまたはファイルが書き込み禁止になっているため %S を保存できませんでした。\n\n書き込み可能にしてから再度試すか、別の場所に保存してください。 accessError =フォルダーの中身を書き換えることができないため %S を保存できませんでした。\n\nフォルダーのプロパティを変更してから再度試すか、別の場所に保存してください。 SDAccessErrorCardReadOnly =SD カードが使用中のためファイルをダウンロードできません。 SDAccessErrorCardMissing =SD カードがないためファイルをダウンロードできません。 helperAppNotFound =関連づけされたプログラムが存在しないため %S を開けませんでした。関連づけの設定を変更してください。 noMemory =要求された操作を実行するのに必要なメモリーが不足しています。\n\nプログラムを終了させてから再度お試しください。 title =%S をダウンロードしています fileAlreadyExistsError =‘_files’ ディレクトリーと同じ名前のファイルがすでに存在しているため %S を保存できませんでした。\n\n別の場所に保存してください。 fileNameTooLongError =ファイル名が長すぎるため %S を保存できませんでした。\n\n短い名前で保存してください。 ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/plugins.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE (plugins.properties): # Those strings are inserted into an HTML page, so all HTML characters # have to be escaped in a way that they show up correctly in HTML! # (^^; about:plugins ページ title_label =プラグインについて installedplugins_label =インストールされたプラグイン nopluginsareinstalled_label =インストールされたプラグインが見つかりませんでした findpluginupdates_label =インストールされたプラグインの更新確認: file_label =ファイル: path_label =パス: version_label =バージョン: state_label =状態: state_enabled =有効 state_disabled =無効 mimetype_label =MIME タイプ description_label =ファイルの種類 suffixes_label =拡張子 learn_more_label =詳細 deprecation_description =サポートを終了したプラグインは表示されません。 deprecation_learn_more =詳細 # GMP Plugins gmp_license_info =ライセンス情報 gmp_privacy_info =プライバシー情報 openH264_name =OpenH264 Video Codec (Cisco Systems, Inc. 提供) openH264_description2 =このプラグインは、WebRTC 仕様に従うため Mozilla により自動的にインストールされ、H.264 動画コーデックを必要とする端末で WebRTC 通話を有効にします。このコーデックのソースコードと実装についての詳細は、http://www.openh264.org/ を参照してください。 cdm_description =保護されたウェブ動画の再生に使用されます。 widevine_description =Widevine Content Decryption Module (Google Inc. 提供) ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/preferences.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/printPageSetup.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/printPreview.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/printPreviewProgress.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/printProgress.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/printdialog.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/printdialog.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # These strings are used in the native GTK, Mac and Windows print dialogs. # GTK titles: printTitleGTK =印刷 optionsTabLabelGTK =オプション printFramesTitleGTK =フレームの印刷 # Mac titles: optionsTitleMac =オプション: appearanceTitleMac =アピアランス: framesTitleMac =フレーム: pageHeadersTitleMac =ページヘッダー: pageFootersTitleMac =ページフッター: # Windows titles: optionsTitleWindows =オプション printFramesTitleWindows =フレームを印刷 # TRANSLATOR NOTE: For radio button labels and check button labels, an underscore _ # before a character will turn that character into an accesskey in the GTK dialog. # e.g. "_As laid out" will make A the accesskey. # In the Windows labels, use an ampersand (&). # On Mac, underscores will be stripped. # (^^; アクセスキーの扱い要注意 asLaidOut =画面上の表示通りに印刷(_A) asLaidOutWindows =画面表示に合わせる(&L) selectedFrame =選択したフレームだけを印刷(_S) selectedFrameWindows =選択されたフレーム(&F) separateFrames =フレームごとに別のページとして印刷(_P) separateFramesWindows =フレームごとに別々に(&E) shrinkToFit =拡大率を無視してページ幅に合わせて印刷(_H) selectionOnly =選択した部分だけを印刷(_O) printBGOptions =背景の印刷 printBGColors =背景色を印刷(_C) printBGImages =背景画像を印刷(_M) headerFooter =ヘッダーとフッター left =左 center =中央 right =右 headerFooterBlank =-- なし -- headerFooterTitle =タイトル headerFooterURL =URL headerFooterDate =印刷日時 headerFooterPage =ページ # headerFooterPageTotal =ページ #/# headerFooterCustom =ユーザー設定... customHeaderFooterPrompt=ヘッダー/フッターとして使用するテキストを入力してください # (^m^) 要確認 # These are for the summary view in the Mac dialog: summaryFramesTitle =フレームのプリント summarySelectionOnlyTitle =選択範囲のプリント summaryShrinkToFitTitle =用紙に合わせて縮小 summaryPrintBGColorsTitle =背景色のプリント summaryPrintBGImagesTitle =背景画像のプリント summaryHeaderTitle =ページヘッダー summaryFooterTitle =ページヘッダー summaryNAValue =N/A summaryOnValue =オン summaryOffValue =オフ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/printing.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # Page number formatting ## @page_number The current page number #LOCALIZATION NOTE (pageofpages): Do not translate %ld in the following line. # Place the word %ld where the page number and number of pages should be # The first %ld will receive the the page number pagenumber =%1$d # Page number formatting ## @page_number The current page number ## @page_total The total number of pages #LOCALIZATION NOTE (pageofpages): Do not translate %ld in the following line. # Place the word %ld where the page number and number of pages should be # The first %ld will receive the the page number # the second %ld will receive the total number of pages pageofpages =%1$d / %2$d noprinter =有効なプリンタがありません PrintToFile =ファイルへ印刷する noPrintFilename.title =ファイル名がありません noPrintFilename.alert =[ファイルへ出力] が選択されていますが、ファイル名が指定されていません。 fileConfirm.exists =%S はすでに存在します。\n上書きしますか? print_error_dialog_title =印刷エラー printpreview_error_dialog_title =印刷プレビューエラー # Printing error messages. #LOCALIZATION NOTE: Some of these messages come in pairs, one # for printing and one for print previewing. You can remove that # distinction in your language by removing the entity with the _PP # suffix; then the entity without a suffix will be used for both. # You can also add that distinction to any of the messages that don't # already have it by adding a new entity with a _PP suffix. # # For instance, if you delete PERR_GFX_PRINTER_DOC_IS_BUSY_PP, then # the PERR_GFX_PRINTER_DOC_IS_BUSY message will be used for that error # condition when print previewing as well as when printing. If you # add PERR_FAILURE_PP, then PERR_FAILURE will only be used when # printing, and PERR_FAILURE_PP will be used under the same conditions # when print previewing. # PERR_FAILURE =印刷中にエラーが発生しました。 PERR_ABORT =印刷ジョブが中断またはキャンセルされました。 PERR_NOT_AVAILABLE =一部の印刷機能は現在利用できません。 PERR_NOT_IMPLEMENTED =いくつかの印刷機能はまだ実装されていません。 PERR_OUT_OF_MEMORY =印刷に必要なメモリーが不足しています。 PERR_UNEXPECTED =印刷中に予期せぬ問題が発生しました。 PERR_GFX_PRINTER_NO_PRINTER_AVAILABLE =使用可能なプリンタが見つかりません。 PERR_GFX_PRINTER_NO_PRINTER_AVAILABLE_PP =使用可能なプリンタが見つからないため印刷プレビューを表示できません。 PERR_GFX_PRINTER_NAME_NOT_FOUND =選択されたプリンタが見つかりません。 PERR_GFX_PRINTER_COULD_NOT_OPEN_FILE =印刷の出力先ファイルを開けません。 PERR_GFX_PRINTER_STARTDOC =印刷ジョブの開始処理中にエラーが発生しました。 PERR_GFX_PRINTER_ENDDOC =印刷ジョブの終了処理中にエラーが発生しました。 PERR_GFX_PRINTER_STARTPAGE =新しいページの印刷開始処理中にエラーが発生しました。 PERR_GFX_PRINTER_DOC_IS_BUSY =ドキュメントが読み込み中のため印刷できません。 PERR_GFX_PRINTER_DOC_IS_BUSY_PP =ドキュメントが読み込み中のため印刷プレビューを実行できません。 ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/printjoboptions.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/regionNames.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # (^^; Windows での表記を原則とした(中黒は半角空白に) ad = アンドラ ae = アラブ首長国連邦 af = アフガニスタン ag = アンティグア バーブーダ ai = アングイラ al = アルバニア am = アルメニア ao = アンゴラ aq = 南極大陸 ar = アルゼンチン as = 米領サモア at = オーストリア au = オーストラリア aw = アルバ az = アゼルバイジャン ba = ボスニア ヘルツェゴヴィナ bb = バルバドス bd = バングラデシュ be = ベルギー bf = ブルキナファソ bg = ブルガリア bh = バーレーン bi = ブルンジ bj = ベニン bl = セント バーソロミュー bm = バミューダ諸島 bn = ブルネイ bo = ボリビア bq = ボネール、シント ユースタティウス、サバ br = ブラジル bs = バハマ国 bt = ブータン bv = ブーベ島 bw = ボツワナ by = ベラルーシ bz = ベリーズ ca = カナダ #cc = ココス (キーリング) 諸島 cc = ココス諸島 #cd = コンゴ民主共和国 cd = コンゴ (キンシャサ) cf = 中央アフリカ共和国 #cg = コンゴ共和国 cg = コンゴ (ブラザヴィル) ch = スイス ci = コートジボワール ck = クック諸島 cl = チリ cm = カメルーン cn = 中国 co = コロンビア cp = クリッパートン島 cr = コスタ リカ cu = キューバ cv = カーボベルデ cw = キュラソー cx = クリスマス島 cy = キプロス cz = チェコ共和国 de = ドイツ dg = ディエゴガルシア dj = ジブチ dk = デンマーク dm = ドミニカ do = ドミニカ共和国 dz = アルジェリア ec = エクアドル ee = エストニア eg = エジプト eh = 西サハラ er = エリトリア es = スペイン et = エチオピア fi = フィンランド fj = フィジー fk = フォークランド諸島 (マルビナス諸島) fm = ミクロネシア連邦 fo = フェロー諸島 fr = フランス ga = ガボン gb = 英国 gd = グレナダ ge = ジョージア gf = フランス領ギアナ gg = ガーンジー gh = ガーナ gi = ジブラルタル gl = グリーンランド gm = ガンビア gn = ギニア gp = グアドループ gq = ギニア共和国 gr = ギリシャ gs = 南ジョージア 南サンドイッチ諸島 gt = グアテマラ gu = グアム gw = ギニアビサウ gy = ガイアナ #hk = 中華人民共和国香港特別行政区 hk = 香港 hm = ハード マクドナルド諸島 hn = ホンジュラス hr = クロアチア ht = ハイチ hu = ハンガリー id = インドネシア ie = アイルランド il = イスラエル im = マン島 in = インド io = 英領インド洋地域 iq = イラク ir = イラン is = アイスランド it = イタリア je = ジャージー島 jm = ジャマイカ jo = ヨルダン jp = 日本 ke = ケニア kg = キルギスタン kh = カンボジア ki = キリバス km = コモロ kn = セントクリストファー ネイビス kp = 北朝鮮 kr = 韓国 kw = クウェート ky = ケイマン諸島 kz = カザフスタン la = ラオス lb = レバノン lc = セントルシア li = リヒテンシュタイン lk = スリランカ lr = リベリア ls = レソト lt = リトアニア lu = ルクセンブルグ lv = ラトビア ly = リビア ma = モロッコ mc = モナコ md = モルドバ me = モンテネグロ mf = サンマルタン mg = マダガスカル mh = マーシャル諸島 #mk = マケドニア 旧ユーゴスラビア共和国 mk = マケドニア ml = マリ mm = ミャンマー (ビルマ) mn = モンゴル #mo = 中華人民共和国マカオ特別行政区 mo = マカオ mp = 北マリアナ諸島 mq = マルティニーク島 mr = モーリタニア ms = モンセラット mt = マルタ mu = モーリシャス mv = モルディブ mw = マラウイ mx = メキシコ my = マレーシア mz = モザンビーク na = ナミビア nc = ニューカレドニア ne = ニジェール nf = ノーフォーク島 ng = ナイジェリア ni = ニカラグア nl = オランダ no = ノルウェー np = ネパール nr = ナウル nu = ニウエ nz = ニュージーランド om = オマーン pa = パナマ pe = ペルー pf = フランス領ポリネシア pg = パプアニューギニア ph = フィリピン pk = パキスタン pl = ポーランド pm = サンピエール島 ミクロン島 pn = ピトケアン諸島 pr = プエルトリコ pt = ポルトガル pw = パラオ py = パラグアイ qa = カタール qm = ミッドウェー島 qs = バサス ダ インディア qu = フアン デ ノヴァ島 qw = ウェーク島 qx = グロリオソ諸島 qz = アクロティリ re = レユニオン ro = ルーマニア rs = セルビア ru = ロシア rw = ルワンダ sa = サウジアラビア sb = ソロモン諸島 sc = セイシェル sd = スーダン se = スウェーデン sg = シンガポール sh = セントヘレナ アセンションおよびトリスタンダクーニャ si = スロベニア sk = スロバキア sl = シエラレオネ sm = サンマリノ sn = セネガル so = ソマリア sr = スリナム ss = 南スーダン st = サントメ プリンシペ sv = エルサルバドル sx = シント マールテン sy = シリア sz = スワジランド tc = タークス諸島 カイコス諸島 td = チャド tf = フランス領南方 南極地域 tg = トーゴ th = タイ tj = タジキスタン tk = トケラウ tl = 東ティモール tm = トルクメニスタン tn = チュニジア to = トンガ tr = トルコ tt = トリニダード トバゴ tv = ツバル tw = 台湾 tz = タンザニア ua = ウクライナ ug = ウガンダ us = アメリカ合衆国 uy = ウルグアイ uz = ウズベキスタン #va = バチカン市国 va = バチカン vc = セントビンセントおよびグレナディーン諸島 ve = ベネズエラ vg = 英領バージン諸島 vi = 米領バージン諸島 vn = ベトナム vu = バヌアツ wf = ワリス フテュナ諸島 ws = サモア xa = アシュモア カルティエ諸島 xb = ベーカー島 xc = コーラル シー諸島 xd = デケリア xe = ユローパ島 xg = ガザ地区 xh = ハウランド島 xj = ヤンマイエン島 xk = コソボ xl = パルミラ環礁 xm = キングマン岩礁 xp = パラセル諸島 xq = ジャーヴィス島 xr = スヴァールバル諸島 xs = スプラトリー諸島 xt = トロメリン島 xu = ジョンストン環礁 xv = ナヴァッサ島 xw = ヨルダン川西岸地区 ye = イエメン yt = マヨット za = 南アフリカ zm = ザンビア zw = ジンバブエ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/resetProfile.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/resetProfile.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE: These strings are used for profile reset. # LOCALIZATION NOTE (resetUnusedProfile.message): %S is brandShortName. ## 60 日以上経過で表示 (Bug 498181) resetUnusedProfile.message =お久しぶりです! %S はしばらく使われていないようです。プロファイルを掃除して新品のようにきれいにしますか? # LOCALIZATION NOTE (resetUninstalled.message): %S is brandShortName. resetUninstalled.message =%S が再インストールされ前回のプロファイルが残っています。新品の状態にリフレッシュしますか? # LOCALIZATION NOTE (refreshProfile.resetButton.label): %S is brandShortName. refreshProfile.resetButton.label =%S をリフレッシュ... refreshProfile.resetButton.accesskey =e ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/search/search.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. addEngineConfirmTitle =検索エンジンの追加 addEngineConfirmation =“%S” を検索バーの検索エンジン一覧に追加しますか?\n\n配布元サイト: %S addEngineAsCurrentText =この検索エンジンを選択(&U) addEngineAddButtonLabel =追加 error_loading_engine_title =ダウンロード失敗 # LOCALIZATION NOTE (error_loading_engine_msg2): %1$S = brandShortName, %2$S = location error_loading_engine_msg2 =%S は次の場所から検索エンジンをダウンロードできませんでした:\n%S error_duplicate_engine_msg =同じ名前の検索エンジンがすでに存在するため、%S は “%S” から検索エンジンをインストールできませんでした。 error_invalid_engine_title =インストールエラー # LOCALIZATION NOTE (error_invalid_engine_msg): %S = brandShortName error_invalid_engine_msg =この検索エンジンは %S でサポートされていないため、インストールできませんでした。 suggestion_label =候補 # LOCALIZATION NOTE (error_invalid_engine_msg2): %1$S = brandShortName, %2$S = location (url) error_invalid_engine_msg2=%1$S could not install the search engine from: %2$S error_invalid_format_title=Invalid Format ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/security/caps.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # (^^; 特権名はプログラム中のコードから... http://lxr.mozilla.org/aviarybranch/source/caps/src/nsScriptSecurityManager.cpp#2293 CheckLoadURIError =セキュリティエラー: %1$S のコンテンツが %2$S を読み込み、またはこれにリンクすることは禁止されています。 CheckSameOriginError =セキュリティエラー: %1$S のコンテンツが %2$S からデータを読み取ることは禁止されています。 ExternalDataError =セキュリティエラー: %1$S のコンテンツが %2$S を読み込もうとしていますが、画像として使用される外部データの読み込みは禁止されています。 # LOCALIZATION NOTE (GetPropertyDeniedOrigins): # %1$S is the origin of the script which was denied access. # %2$S is the type of object it was. # %3$S is the property of that object that access was denied for. # %4$S is the origin of the object access was denied to. GetPropertyDeniedOrigins =<%4$S> から %2$S.%3$S プロパティを読み取る <%1$S> へのアクセス権限がありません。 # LOCALIZATION NOTE (GetPropertyDeniedOriginsSubjectDomain): # %1$S is the origin of the script which was denied access. # %2$S is the type of object it was. # %3$S is the property of that object that access was denied for. # %4$S is the origin of the object access was denied to. # %5$S is the value of document.domain for the script which was denied access; # don't translate "document.domain". GetPropertyDeniedOriginsSubjectDomain =<%4$S> (document.domain が未設定) から %2$S.%3$S プロパティを読み取る <%1$S> (document.domain=<%5$S>) へのアクセス権限がありません。 # LOCALIZATION NOTE (GetPropertyDeniedOriginsObjectDomain): # %1$S is the origin of the script which was denied access. # %2$S is the type of object it was. # %3$S is the property of that object that access was denied for. # %4$S is the origin of the object access was denied to. # %5$S is the value of document.domain for the object being accessed; # don't translate "document.domain". GetPropertyDeniedOriginsObjectDomain =<%4$S> (document.domain=<%5$S>) から %2$S.%3$S プロパティを読み取る <%1$S> (document.domain が未設定) へのアクセス権限がありません。 # LOCALIZATION NOTE (GetPropertyDeniedOriginsSubjectDomainObjectDomain): # %1$S is the origin of the script which was denied access. # %2$S is the type of object it was. # %3$S is the property of that object that access was denied for. # %4$S is the origin of the object access was denied to. # %5$S is the value of document.domain for the script which was denied access; # don't translate "document.domain" # %6$S is the value of document.domain for the object being accessed; # don't translate "document.domain". GetPropertyDeniedOriginsSubjectDomainObjectDomain =<%4$S> (document.domain=<%6$S>) から %2$S.%3$S プロパティを読み取る <%1$S> (document.domain=<%5$S>) へのアクセス権限がありません。 # LOCALIZATION NOTE (SetPropertyDeniedOrigins): # %1$S is the origin of the script which was denied access. # %2$S is the type of object it was. # %3$S is the property of that object that access was denied for. # %4$S is the origin of the object access was denied to. SetPropertyDeniedOrigins =<%4$S> に %2$S.%3$S プロパティを書き込む <%1$S> へのアクセス権限がありません。 # LOCALIZATION NOTE (SetPropertyDeniedOriginsSubjectDomain): # %1$S is the origin of the script which was denied access. # %2$S is the type of object it was. # %3$S is the property of that object that access was denied for. # %4$S is the origin of the object access was denied to. # %5$S is the value of document.domain for the script which was denied access; # don't translate "document.domain". SetPropertyDeniedOriginsSubjectDomain =<%4$S> (document.domain が未設定) に %2$S.%3$S プロパティを書き込む <%1$S> (document.domain=<%5$S>) へのアクセス権限がありません。 # LOCALIZATION NOTE (SetPropertyDeniedOriginsObjectDomain): # %1$S is the origin of the script which was denied access. # %2$S is the type of object it was. # %3$S is the property of that object that access was denied for. # %4$S is the origin of the object access was denied to. # %5$S is the value of document.domain for the object being accessed; # don't translate "document.domain". SetPropertyDeniedOriginsObjectDomain =<%4$S> (document.domain=<%5$S>) に %2$S.%3$S プロパティを書き込む <%1$S> (document.domain が未設定) へのアクセス権限がありません。 # LOCALIZATION NOTE (SetPropertyDeniedOriginsSubjectDomainObjectDomain): # %1$S is the origin of the script which was denied access. # %2$S is the type of object it was. # %3$S is the property of that object that access was denied for. # %4$S is the origin of the object access was denied to. # %5$S is the value of document.domain for the script which was denied access; # don't translate "document.domain" # %6$S is the value of document.domain for the object being accessed; # don't translate "document.domain". SetPropertyDeniedOriginsSubjectDomainObjectDomain=<%4$S> (document.domain=<%6$S>) に %2$S.%3$S プロパティを書き込む <%1$S> (document.domain=<%5$S>) へのアクセス権限がありません。 # LOCALIZATION NOTE (CallMethodDeniedOrigins): # %1$S is the origin of the script which was denied access. # %2$S is the type of object it was. # %3$S is the method of that object that access was denied for. # %4$S is the origin of the object access was denied to. CallMethodDeniedOrigins =<%4$S> の %2$S.%3$S メソッドを呼び出す <%1$S> へのアクセス権限がありません。 # LOCALIZATION NOTE (CallMethodDeniedOriginsSubjectDomain): # %1$S is the origin of the script which was denied access. # %2$S is the type of object it was. # %3$S is the method of that object that access was denied for. # %4$S is the origin of the object access was denied to. # %5$S is the value of document.domain for the script which was denied access; # don't translate "document.domain". CallMethodDeniedOriginsSubjectDomain =<%4$S> (document.domain が未設定) の %2$S.%3$S メソッドを呼び出す <%1$S> (document.domain=<%5$S>) へのアクセス権限がありません。 # LOCALIZATION NOTE (CallMethodDeniedOriginsObjectDomain): # %1$S is the origin of the script which was denied access. # %2$S is the type of object it was. # %3$S is the method of that object that access was denied for. # %4$S is the origin of the object access was denied to. # %5$S is the value of document.domain for the object being accessed; # don't translate "document.domain". CallMethodDeniedOriginsObjectDomain =<%4$S> (document.domain=<%5$S>) の %2$S.%3$S メソッドを呼び出す <%1$S> (document.domain が未設定) へのアクセス権限がありません。 # LOCALIZATION NOTE (CallMethodDeniedOriginsSubjectDomainObjectDomain): # %1$S is the origin of the script which was denied access. # %2$S is the type of object it was. # %3$S is the method of that object that access was denied for. # %4$S is the origin of the object access was denied to. # %5$S is the value of document.domain for the script which was denied access; # don't translate "document.domain" # %6$S is the value of document.domain for the object being accessed; # don't translate "document.domain". CallMethodDeniedOriginsSubjectDomainObjectDomain =<%4$S> (document.domain=<%6$S>) の %2$S.%3$S メソッドを呼び出す <%1$S> (document.domain=<%5$S>) へのアクセス権限がありません。 GetPropertyDeniedOriginsOnlySubject =%2$S.%3$S プロパティを読み取る <%1$S> へのアクセス権限がありません。 SetPropertyDeniedOriginsOnlySubject =%2$S.%3$S プロパティを書き込む <%1$S> へのアクセス権限がありません。 CallMethodDeniedOriginsOnlySubject =%2$S.%3$S メソッドを呼び出す <%1$S> へのアクセス権限がありません。 CreateWrapperDenied =%S クラスのオブジェクトのラッパーを作成する権限がありません CreateWrapperDeniedForOrigin =%1$S クラスのオブジェクトのラッパーを作成する <%2$S> へのアクセス権限がありません。 ProtocolFlagError =警告: ‘%S’ のプロトコルハンドラーにはセキュリティポリシーがありません。今のところ許可されていますが、このプロトコルの読み込みは推奨されません。詳しくは nsIProtocolHandler.idl に書かれている説明をご覧ください。 ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/security/csp.properties ================================================ ## (^m^) 未訳 # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # CSP Warnings: # LOCALIZATION NOTE (CSPViolation): # %1$S is the reason why the resource has not been loaded. CSPViolation =ページの設定によりリソースの読み込みをブロックしました: %1$S # LOCALIZATION NOTE (CSPViolationWithURI): # %1$S is the directive that has been violated. # %2$S is the URI of the resource which violated the directive. CSPViolationWithURI =ページの設定により次のリソースの読み込みをブロックしました: %2$S (“%1$S”) # LOCALIZATION NOTE (CSPROViolation): # %1$S is the reason why the resource has not been loaded. CSPROViolation =Report-Only CSP ポリシーに対する違反が発生しました (“%1$S”)。この振る舞いは許可され、CSP レポートが送信されました。 # LOCALIZATION NOTE (CSPROViolationWithURI): # %1$S is the directive that has been violated. # %2$S is the URI of the resource which violated the directive. CSPROViolationWithURI =ページの設定により次のリソースの読み込みを監視します %2$S (“%1$S”)。CSP レポートが送信されました。 # LOCALIZATION NOTE (triedToSendReport): # %1$S is the URI we attempted to send a report to. triedToSendReport =不正な URI にレポートの送信を試みました: “%1$S” # LOCALIZATION NOTE (couldNotParseReportURI): # %1$S is the report URI that could not be parsed couldNotParseReportURI =レポート URI を解析できませんでした: %1$S # LOCALIZATION NOTE (couldNotProcessUnknownDirective): # %1$S is the unknown directive couldNotProcessUnknownDirective =不明なディレクティブ ‘%1$S’ を処理できませんでした。 # LOCALIZATION NOTE (ignoringUnknownOption): # %1$S is the option that could not be understood ignoringUnknownOption =不明なオプションを無視しました: %1$S # LOCALIZATION NOTE (ignoringDuplicateSrc): # %1$S defines the duplicate src ignoringDuplicateSrc =重複ソースを無視しました: %1$S # LOCALIZATION NOTE (ignoringSrcFromMetaCSP): # %1$S defines the ignored src ignoringSrcFromMetaCSP =ソースを無視しました (meta 要素経由で与えられた時点では未サポートです): ‘%1$S’ # LOCALIZATION NOTE (ignoringSrcWithinScriptStyleSrc): # %1$S is the ignored src # script-src and style-src are directive names and should not be localized ignoringSrcWithinScriptStyleSrc =script-src または style-src: に nonce-source または hash-source が指定された “%1$S” を無視しました。 # LOCALIZATION NOTE (ignoringSrcForStrictDynamic): # %1$S is the ignored src # script-src, as well as 'strict-dynamic' should not be localized ignoringSrcForStrictDynamic =script-src: ‘strict-dynamic’ が指定された “%1$S” を無視します。 # LOCALIZATION NOTE (ignoringStrictDynamic): # %1$S is the ignored src ignoringStrictDynamic =ソース “%1$S” を無視します (script-src 内のみでサポートされます)。 # LOCALIZATION NOTE (strictDynamicButNoHashOrNonce): # %1$S is the csp directive that contains 'strict-dynamic' # 'strict-dynamic' should not be localized strictDynamicButNoHashOrNonce =有効な nonce またはハッシュ値が指定されていない “%1$S” 内の ‘strict-dynamic’ キーワードは、すべてのスクリプトの読み込みをブロックします。 # LOCALIZATION NOTE (reportURInotHttpsOrHttp2): # %1$S is the ETLD of the report URI that is not HTTP or HTTPS reportURInotHttpsOrHttp2 =レポート URI (%1$S) が HTTP または HTTPS の URI ではありません。 # LOCALIZATION NOTE (reportURInotInReportOnlyHeader): # %1$S is the ETLD of the page with the policy reportURInotInReportOnlyHeader =このサイト (%1$S) に設定された Report-Only ポリシーにレポート URI がありません。CSP はこのポリシーに対する違反をブロックしません。また、違反をレポートできません。 # LOCALIZATION NOTE (failedToParseUnrecognizedSource): # %1$S is the CSP Source that could not be parsed failedToParseUnrecognizedSource =認識できないソースの解析に失敗しました: %1$S # LOCALIZATION NOTE (inlineScriptBlocked): # inline script refers to JavaScript code that is embedded into the HTML document. inlineScriptBlocked =インラインスクリプトが実行前にブロックされました。 # LOCALIZATION NOTE (inlineStyleBlocked): # inline style refers to CSS code that is embedded into the HTML document. inlineStyleBlocked =インラインスタイルシートが適用前にブロックされました。 # LOCALIZATION NOTE (scriptFromStringBlocked): # eval is a name and should not be localized. scriptFromStringBlocked =文字列 (eval のような関数の呼び出し) からの JavaScript コードが呼び出し前にブロックされました。 # LOCALIZATION NOTE (upgradeInsecureRequest): # %1$S is the URL of the upgraded request; %2$S is the upgraded scheme. upgradeInsecureRequest =安全でない要求 ‘%1$S’ をアップグレードして ‘%2$S’ を使用します # LOCALIZATION NOTE (ignoreSrcForDirective): ignoreSrcForDirective =ディレクティブ ‘%1$S’ の src を無視します # LOCALIZATION NOTE (hostNameMightBeKeyword): # %1$S is the hostname in question and %2$S is the keyword hostNameMightBeKeyword =%1$S をキーワードではなくホスト名として割り込みます。キーワードとして処理するには ‘%2$S’ を (シングルクォートで囲み) 使用してください。 # LOCALIZATION NOTE (notSupportingDirective): # directive is not supported (e.g. 'reflected-xss') notSupportingDirective =‘%1$S’ はサポートされていないディレクティブです。ディレクティブと値は無視されます。 # LOCALIZATION NOTE (blockAllMixedContent): # %1$S is the URL of the blocked resource load. blockAllMixedContent =安全でない要求 ‘%1$S’ をブロックしました。 # LOCALIZATION NOTE (ignoringDirectiveWithNoValues): # %1$S is the name of a CSP directive that requires additional values (e.g., 'require-sri-for') ignoringDirectiveWithNoValues =引数が含まれないため ‘%1$S’ を無視しました。 # LOCALIZATION NOTE (ignoringReportOnlyDirective): # %1$S is the directive that is ignored in report-only mode. ignoringReportOnlyDirective =report-only ポリシー ‘%1$S’ で配信された場合の sandbox ディレクティブを無視しました。 # LOCALIZATION NOTE (deprecatedReferrerDirective): # %1$S is the value of the deprecated Referrer Directive. deprecatedReferrerDirective =referrer ディレクティブ ‘%1$S’ は推奨されません。代わりに Referrer-Policy ヘッダーを使用してください。 # CSP Errors: # LOCALIZATION NOTE (couldntParseInvalidSource): # %1$S is the source that could not be parsed couldntParseInvalidSource =不正なソースを解析できませんでした: %1$S # LOCALIZATION NOTE (couldntParseInvalidHost): # %1$S is the host that's invalid couldntParseInvalidHost =不正なホストを解析できませんでした: %1$S # LOCALIZATION NOTE (couldntParseScheme): # %1$S is the string source couldntParseScheme =スキームを解析できませんでした: %1$S # LOCALIZATION NOTE (couldntParsePort): # %1$S is the string source couldntParsePort =ポートを解析できませんでした: %1$S # LOCALIZATION NOTE (duplicateDirective): # %1$S is the name of the duplicate directive duplicateDirective =重複した %1$S ディレクティブが検出されました。最初のインスタンスを除き重複はすべて無視されます。 # LOCALIZATION NOTE (deprecatedDirective): # %1$S is the name of the deprecated directive, %2$S is the name of the replacement. deprecatedDirective =ディレクティブ ‘%1$S’ は推奨されません。代わりにディレクティブ ‘%2$S’ を使用してください。 # LOCALIZATION NOTE (couldntParseInvalidSandboxFlag): # %1$S is the option that could not be understood couldntParseInvalidSandboxFlag =不正な sandbox フラグを解析できませんでした: %1$S ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/security/security.properties ================================================ # Mixed Content Blocker # LOCALIZATION NOTE: "%1$S" is the URI of the blocked mixed content resource # Mixed Content Blocker BlockMixedDisplayContent =混在表示コンテンツ “%1$S” の読み込みをブロックしました BlockMixedActiveContent =混在アクティブコンテンツ “%1$S” の読み込みをブロックしました # CORS # LOCALIZATION NOTE: Do not translate "Access-Control-Allow-Origin", Access-Control-Allow-Credentials, Access-Control-Allow-Methods, Access-Control-Allow-Headers CORSDisabled =クロスオリジン要求をブロックしました: 同一生成元ポリシーにより、%1$S にあるリモートリソースの読み込みは拒否されます (理由: CORS が無効)。 CORSRequestNotHttp =クロスオリジン要求をブロックしました: 同一生成元ポリシーにより、%1$S にあるリモートリソースの読み込みは拒否されます (理由: CORS 要求が http でない)。 CORSMissingAllowOrigin =クロスオリジン要求をブロックしました: 同一生成元ポリシーにより、%1$S にあるリモートリソースの読み込みは拒否されます (理由: CORS ヘッダー ‘Access-Control-Allow-Origin’ が足りない)。 CORSAllowOriginNotMatchingOrigin =クロスオリジン要求をブロックしました: 同一生成元ポリシーにより、%1$S にあるリモートリソースの読み込みは拒否されます (理由: CORS ヘッダー ‘Access-Control-Allow-Origin’ が ‘%2$S’ と異なる)。 CORSNotSupportingCredentials =クロスオリジン要求をブロックしました: 同一生成元ポリシーにより、%1$S にあるリモートリソースの読み込みは拒否されます (理由: CORS ヘッダー ‘Access-Control-Allow-Origin’ が ‘*’ である場合、認証情報はサポートされない)。 CORSMethodNotFound =クロスオリジン要求をブロックしました: 同一生成元ポリシーにより、%1$S にあるリモートリソースの読み込みは拒否されます (理由: CORS ヘッダー ‘Access-Control-Allow-Methods’ にメソッドが見つからない)。 CORSMissingAllowCredentials =クロスオリジン要求をブロックしました: 同一生成元ポリシーにより、%1$S にあるリモートリソースの読み込みは拒否されます (理由: CORS ヘッダー ‘Access-Control-Allow-Credentials’ は ‘ture’ であるべき)。 CORSPreflightDidNotSucceed =クロスオリジン要求をブロックしました: 同一生成元ポリシーにより、%1$S にあるリモートリソースの読み込みは拒否されます (理由: CORS プリフライトチャンネルが継承されていない)。 CORSInvalidAllowMethod =クロスオリジン要求をブロックしました: 同一生成元ポリシーにより、%1$S にあるリモートリソースの読み込みは拒否されます (理由: CORS ヘッダー ‘Access-Control-Allow-Methods’ に不正なトークン ‘%2$S’ が含まれる)。 CORSInvalidAllowHeader =クロスオリジン要求をブロックしました: 同一生成元ポリシーにより、%1$S にあるリモートリソースの読み込みは拒否されます (理由: CORS ヘッダー ‘Access-Control-Allow-Headers’ に不正なトークン ‘%2$S’ が含まれる)。 CORSMissingAllowHeaderFromPreflight =クロスオリジン要求をブロックしました: 同一生成元ポリシーにより、%1$S にあるリモートリソースの読み込みは拒否されます (理由: CORS プリフライトチャンネルからの CORS ヘッダー ‘Access-Control-Allow-Headers’ にトークン ‘%2$S’ が足りない)。 # LOCALIZATION NOTE: Do not translate "Strict-Transport-Security", "HSTS", "max-age" or "includeSubDomains" STSUnknownError =Strict-Transport-Security: サイトに指定されたヘッダーの処理中に未知のエラーが発生しました。 STSUntrustworthyConnection =Strict-Transport-Security: サイトへの接続が信頼できないため、指定されたヘッダーは無視されました。 STSCouldNotParseHeader =Strict-Transport-Security: サイトに指定されたヘッダーを正しく解析できませんでした。 STSNoMaxAge =Strict-Transport-Security: サイトに指定されたヘッダーに ‘max-age’ ディレクティブが含まれていません。 STSMultipleMaxAges =Strict-Transport-Security: サイトに指定されたヘッダーに複数の ‘max-age’ ディレクティブが含まれています。 STSInvalidMaxAge =Strict-Transport-Security: サイトに指定されたヘッダーに不正な ‘max-age’ ディレクティブが含まれています。 STSMultipleIncludeSubdomains =Strict-Transport-Security: サイトに指定されたヘッダーに複数の ‘includeSubDomains’ ディレクティブが含まれています。 STSInvalidIncludeSubdomains =Strict-Transport-Security: サイトに指定されたヘッダーに不正な ‘includeSubDomains’ ディレクティブが含まれています。 STSCouldNotSaveState =Strict-Transport-Security: サイトを Strict-Transport-Security ホストとして通知中にエラーが発生しました。 # LOCALIZATION NOTE: Do not translate "Public-Key-Pins", "HPKP", "max-age", "report-uri" or "includeSubDomains" PKPUnknownError =Public-Key-Pins: サイトに指定されたヘッダーの処理中に未知のエラーが発生しました。 PKPUntrustworthyConnection =Public-Key-Pins: サイトへの接続が信頼できないため、指定されたヘッダーは無視されました。 PKPCouldNotParseHeader =Public-Key-Pins: サイトに指定されたヘッダーを正しく解析できませんでした。 PKPNoMaxAge =Public-Key-Pins: サイトに指定されたヘッダーに ‘max-age’ ディレクティブが含まれていません。 PKPMultipleMaxAges =Public-Key-Pins: サイトに指定されたヘッダーに複数の ‘max-age’ ディレクティブが含まれています。 PKPInvalidMaxAge =Public-Key-Pins: サイトに指定されたヘッダーに不正な ‘max-age’ ディレクティブが含まれています。 PKPMultipleIncludeSubdomains =Public-Key-Pins: サイトに指定されたヘッダーに複数の ‘includeSubDomains’ ディレクティブが含まれています。 PKPInvalidIncludeSubdomains =Public-Key-Pins: サイトに指定されたヘッダーに不正な ‘includeSubDomains’ ディレクティブが含まれています。 PKPInvalidPin =Public-Key-Pins: サイトに指定されたヘッダーに不正な pin が含まれています。 PKPMultipleReportURIs =Public-Key-Pins: サイトに指定されたヘッダーに複数の ‘report-uri’ ディレクティブが含まれています。 PKPPinsetDoesNotMatch =Public-Key-Pins: サイトに指定されたヘッダーにマッチング pin が含まれていません。 PKPNoBackupPin =Public-Key-Pins: サイトに指定されたヘッダーにバックアップ pin が含まれていません。 PKPCouldNotSaveState =Public-Key-Pins: サイトを Public-Key-Pins ホストとして記録中にエラーが発生しました。 PKPRootNotBuiltIn =Public-Key-Pins: サイトに使用されている証明書が既定のルート証明書ストアの証明書により発行されたものではありません。不慮の破損を防ぐため、指定されたヘッダーは無視されました。 # LOCALIZATION NOTE: Do not translate "SHA-1" SHA1Sig =このサイトは SHA-1 証明書を利用しています。SHA-1 より強固なハッシュアルゴリズムを使用した証明書の利用をお勧めします。 InsecurePasswordsPresentOnPage =パスワードフィールドが安全でない (http://) ページ上にあり、ユーザーのログイン情報の盗難を許すセキュリティ上の危険性があります。 InsecureFormActionPasswordsPresent =パスワードフィールドが安全でない (http://) フォームアクションを持つフォーム要素内にあり、ユーザーのログイン情報の盗難を許すセキュリティ上の危険性があります。 InsecurePasswordsPresentOnIframe =パスワードフィールドが安全でない (http://) iframe 内にあり、ユーザーのログイン情報の盗難を許すセキュリティ上の危険性があります。 # LOCALIZATION NOTE: "%1$S" is the URI of the insecure mixed content resource LoadingMixedActiveContent2 =安全なページ上で (安全でない) 混在アクティブコンテンツ “%1$S” を読み込んでいます LoadingMixedDisplayContent2 =安全なページ上で (安全でない) 混在表示コンテンツ “%1$S” を読み込んでいます # LOCALIZATION NOTE: Do not translate "allow-scripts", "allow-same-origin", "sandbox" or "iframe" BothAllowScriptsAndSameOriginPresent =iframe の sandbox 属性にサンドボックスを解除できる allow-scripts 属性と allow-same-origin 属性の両方が指定されています。 # Sub-Resource Integrity # LOCALIZATION NOTE: Do not translate "script" or "integrity". "%1$S" is the invalid token found in the attribute. MalformedIntegrityHash =script 要素の integrity 属性に改ざんされたハッシュが含まれています: “%1$S”。正しい書式は “<ハッシュアルゴリズム>-<ハッシュ値>” です。 # LOCALIZATION NOTE: Do not translate "integrity" InvalidIntegrityLength =integrity 属性に含まれているハッシュの長さが正しくありません。 # LOCALIZATION NOTE: Do not translate "integrity" InvalidIntegrityBase64 =integrity 属性に含まれているハッシュをデコードできませんでした。 # LOCALIZATION NOTE: Do not translate "integrity". "%1$S" is the type of hash algorigthm in use (e.g. "sha256"). IntegrityMismatch =integrity 属性内の “%1$S” ハッシュが subresource のコンテンツと一致しません。 # LOCALIZATION NOTE: "%1$S" is the URI of the sub-resource that cannot be protected using SRI. IneligibleResource =“%1$S” は CORS が有効ではなく同一生成元でもないため integrity チェックに適格ではありません。 # LOCALIZATION NOTE: Do not translate "integrity". "%1$S" is the invalid hash algorithm found in the attribute. UnsupportedHashAlg =integrity 属性に未サポートのハッシュアルゴリズムが指定されています: “%1$S” # LOCALIZATION NOTE: Do not translate "integrity" NoValidMetadata =integrity 属性に正しいメタデータが含まれていません。 # LOCALIZATION NOTE: Do not translate "RC4". WeakCipherSuiteWarning =このサイトは非推奨の安全でない暗号方式の RC4 を使用しています。 #XCTO: nosniff # LOCALIZATION NOTE: Do not translate "X-Content-Type-Options: nosniff". MimeTypeMismatch =MIME タイプの不一致により “%1$S” からのリソースがブロックされました (X-Content-Type-Options: nosniff)。 # LOCALIZATION NOTE: Do not translate "X-Content-Type-Options" and also do not trasnlate "nosniff". XCTOHeaderValueMissing =X-Content-Type-Options ヘッダー警告: 値は “%1$S” です。“nosniff” を送信することを意味しますか? BlockScriptWithWrongMimeType =許可されていない MIME タイプにより “%1$S” からのスクリプトがブロックされました。 ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/storage.properties ================================================ # ***** BEGIN LICENSE BLOCK ***** # Version: MPL 1.1/GPL 2.0/LGPL 2.1 # # The contents of this file are subject to the Mozilla Public License Version # 1.1 (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. # # The Original Code is Storage code. # # The Initial Developer of the Original Code is Google Inc. # Portions created by the Initial Developer are Copyright (C) 2006 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Brett Wilson # # Localizer(s): # dynamis # # Alternatively, the contents of this file may be used under the terms of # either of the GNU General Public License Version 2 or later (the "GPL"), # or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), # in which case the provisions of the GPL or the LGPL are applicable instead # of those above. If you wish to allow use of your version of this file only # under the terms of either the GPL or the LGPL, and not to allow others to # use your version of this file under the terms of the MPL, indicate your # decision by deleting the provisions above and replace them with the notice # and other provisions required by the GPL or the LGPL. If you do not delete # the provisions above, a recipient may use your version of this file under # the terms of any one of the MPL, the GPL or the LGPL. # # ***** END LICENSE BLOCK ***** storageWriteError = ディスクへのデータ書き込み中にエラーが発生しました。ディスク領域が不足している可能性があります。\n\nこのプログラムを再起動してください。 ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/svg/svg.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. AttributeParseWarning = %1$S 属性のパース中に予期せぬ値 %2$S が見つかりました。 ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/textcontext.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/tree.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/videocontrols.dtd ================================================ / #2"> ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/viewSource.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/viewSource.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. goToLineTitle =指定行へ移動 goToLineText =行番号を入力してください invalidInputTitle =不正な行番号 invalidInputText =正しい行番号を入力してください。 outOfRangeTitle =該当行なし outOfRangeText =指定された行がありません。 statusBarLineCol =行 %1$S, 列 %2$S viewSelectionSourceTitle =選択した部分の DOM ソース viewMathMLSourceTitle =MathML の DOM ソース context_goToLine_label =指定行へ移動... context_goToLine_accesskey =L context_wrapLongLines_label =長い行を折り返す context_highlightSyntax_label =構文を強調表示 ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/webConsole.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/webapps.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE (webapps.uninstall.notification): %S will be replaced with the name of the uninstalled web app uninstall.notification = コンピュータから %S をアンインストールしました。 uninstall.label = アプリをアンインストールする ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/wizard.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/wizard.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. default-first-title = %Sの開始 default-last-title = %Sの完了 default-first-title-mac = はじめに default-last-title-mac = 完了 ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/xbl.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. UnexpectedElement =<%1$S> 要素の位置が不正です。 # LOCALIZATION NOTE: do not localize key=“%S” modifiers=“%S” id=“%S” GTK2Conflict2 =このキーイベントは GTK2 では使用できません: key=“%S” modifiers=“%S” id=“%S” WinConflict2 =このキーイベントは一部のキーボードレイアウトでは使用できません: key=“%S” modifiers=“%S” id=“%S” TooDeepBindingRecursion =祖先の要素に対して使われている XBL バインディング “%S” が多すぎます。無限ループを防ぐため、このバインディングは適用しません。 CircularExtendsBinding =XBL バインディング “%1$S” を “%2$S” で拡張すると再帰的拡張になってしまいます。 # LOCALIZATION NOTE: do not localize CommandNotInChrome = は chrome 外では使用できません。 MalformedXBL =XBL ファイルの書式が異常です。バインドするタグ上の XBL 名前空間の指定を確認してください。 InvalidExtendsBinding =“%S” は拡張できません。一般に、タグ名を拡張することはできません。 MissingIdAttr =バインドするタグ上に “id” 属性がありません。 ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/xml/prettyprint.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/xpinstall/xpinstall.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. #-------------------------------------------------------------------- # Install Actions #-------------------------------------------------------------------- InstallFile = ファイルをインストールしています: %s InstallSharedFile = 共有ファイルをインストールしています: %s ReplaceFile = ファイルを置き換えています: %s ReplaceSharedFile = 共有ファイルを置き換えています: %s SkipFile = スキップしています: %s SkipSharedFile = 共有ファイルをスキップしています: %s DeleteFile = ファイルを削除しています: %s DeleteComponent = コンポーネントを削除しています: %s Execute = 実行しています: %s ExecuteWithArgs = 実行しています: %s 引数: %s CopyFile = ファイルのコピー: %s から %s へ ExecuteFile = ファイルの実行: %s ExecuteFileWithArgs = ファイルを実行しています: %s 引数: %s MoveFile = ファイルの移動: %s から %s へ RenameFile = ファイル名の変更: %s から %s へ CreateFolder = フォルダの作成: %s RemoveFolder = フォルダの削除: %s RenameFolder = フォルダ名の変更: %s から %s へ WindowsShortcut = Windows ショートカット: %s MacAlias = Mac エイリアス: %s WindowsRegisterServer = Windows 登録サーバ: %s UnknownFileOpCommand = ファイル操作コマンドが不明です。 Patch = 変更しています: %s Uninstall = アンインストールしています: %s RegSkin = スキンの登録: %s RegLocale = 言語の登録: %s RegContent = コンテンツの登録: %s RegPackage = パッケージの登録: %s #-------------------------------------------------------------------- # Dialog Messages #-------------------------------------------------------------------- ApplyNowSkin = このテーマを使用する ApplyNowLocale = この言語を使用する ConfirmSkin = %2$S から テーマ "%1$S" をインストールしますか? ConfirmLocale = %2$S から 言語 "%1$S" をインストールしますか? OK = インストール progress.queued = 待機 progress.downloading = ダウンロードしています... progress.downloaded = ダウンロード完了 progress.installing = インストールしています... Unsigned = 署名なし #-------------------------------------------------------------------- # Miscellaneous #-------------------------------------------------------------------- ERROR = エラー error0 = 正常に終了しました error999 = 完了するには再起動が必要です error-202 = アクセスが拒否されました error-203 = 予期せぬエラーが発生しました。\n詳細についてはエラーコンソールのログを参照してください。 error-204 = インストールスクリプトが見つかりません error-207 = インストールパッケージが正しくありません error-208 = 無効な引数が渡されました error-210 = ユーザによりキャンセルされました error-214 = 要求されたファイルが存在しません error-215 = 読み込み専用 error-218 = AppleSingle の抽出エラー error-219 = 無効なパスが指定されました error-225 = 展開できませんでした error-227 = キャンセルされました error-228 = ダウンロードのエラー error-229 = スクリプトのエラー error-230 = すでに存在しています error-235 = 空き領域が足りません error-239 = Chrome に登録できませんでした error-240 = インストールは完了していません error-244 = サポートしていないパッケージです error-260 = 署名が検証されていません error-261 = ファイルのハッシュが正しくありません (ダウンロードに失敗した可能性があります) error-262 = ファイルのハッシュタイプが不明または不正です error-299 = メモリが不足しています # there are other error codes, either rare or obsolete, # that are not worth translating at this time. unknown.error = 不明なエラー %S ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/xslt/xslt.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. 1 =XSLT スタイルシートの構文解析に失敗しました。 2 =XPath 式の構文解析に失敗しました。 3 = 4 =XSLT 変換に失敗しました。 5 =不正な XSLT/XPath 関数です。 6 =XSLT スタイルシートが無限ループしていると思われます。 7 =属性値が XSLT 1.0 仕様に適合していません。 8 =XPath 式はノード集合を返さなければなりません。 9 =XSLT 変換が によって中断されました。 10 =XSLT スタイルシート読み込み中にネットワークエラーが発生しました: 11 =XSLT スタイルシートの MIMEタイプ が XML ではありません: 12 =XSLT スタイルシートが直接あるいは間接的に自分自身を import あるいは include しています。 13 =XPath 関数に渡される引数の数が間違っています。 14 =定義されていない XPath 拡張関数が呼ばれました。 15 =XPath 構文解析エラー: ‘)’ が不足しています: 16 =XPath 構文解析エラー: 軸 (axis) が不正です: 17 =XPath 構文解析エラー: 名前または Nodetype テストでなければなりません: 18 =XPath 構文解析エラー: ‘]’ が不足しています: 19 =XPath 構文解析エラー: 変数名が無効です: 20 =XPath 構文解析エラー: 式の構文が間違っています: 21 =XPath 構文解析エラー: 演算子が不足しています: 22 =XPath 構文解析エラー: リテラルが閉じられていません: 23 =XPath 構文解析エラー: ‘:’ の位置が不正です: 24 =XPath 構文解析エラー: ‘!’ の位置が不正です。否定を表すには not() 関数を使います: 25 =XPath 構文解析エラー: 不正な文字が含まれています。 26 =XPath 構文解析エラー: 二項演算子が不足しています。 27 =セキュリティ上の理由により、XSLT スタイルシートの読み込みはブロックされました。 28 =評価する式が不正です。 29 =開き括弧と閉じ括弧の対応が正しくありません。 30 =生成する要素の有修飾名 (QName) が不正です。 31 =同じテンプレートで割り当てた変数を上書きすることはできません。 32 =key 関数の呼び出しは許可されていません。 LoadingError =スタイルシートの読み込み中にエラーが発生しました: %S TransformError =XSLT 変換中にエラーが発生しました: %S ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global/xul.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. MissingOverlay =オーバーレイ %1$S を正しく読み込めませんでした。 PINotInProlog = 処理命令は prolog 外では無効です (bug 360119 参照)。 NeededToWrapXUL =%1$S 要素の XUL ボックスがインラインの子要素 %2$S を含んでいるため、すべての子はブロック中で折り返されます。 NeededToWrapXULInlineBox=%1$S 要素の XUL ボックスがインラインの子要素 %2$S を含んでいるため、すべての子はブロック中で折り返されます。このエラーは “display: -moz-inline-box” を “display: -moz-inline-box; display: inline-block” で置き換えると解決できるでしょう。 ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global-platform/mac/accessible.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. jump = 移動 press = 押す check = チェック uncheck = チェックしない select = 選択 open = 開く close = 閉じる switch = 切り替え click = クリック collapse= 折りたたむ expand = 展開する activate= 動作させる cycle = 切り替え # Universal Access API support # (Mac Only) # The Role Description for AXWebArea (the web widget). Like in Safari. htmlContent = HTML コンテント # The Role Description for the Tab button. tab = タブ # The Role Description for definition list dl, dt and dd term = 用語 definition = 定義 # The Role Description for an input type="search" text field searchTextField = テキスト検索フィールド # The Role Description for WAI-ARIA Landmarks application = アプリケーション search = 検索 banner = バナー navigation = ナビゲーション complementary = 補完コンテント content = コンテント main = メイン # The (spoken) role description for various WAI-ARIA roles alert = 警告 alertDialog = 警告ダイアログ article = 記事 document = 文書 log = ログ marquee = マーキー math = 数式 note = 注釈 region = 領域 status = アプリケーション状態 timer = タイマー tooltip = ツールチップ separator = 区切り tabPanel = タブパネル ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global-platform/mac/intl.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE (intl.ellipsis): Use the unicode ellipsis char, \u2026, # or use "..." if \u2026 doesn't suit traditions in your locale. intl.ellipsis=… ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global-platform/mac/platformKeys.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. #mac #this file defines the on screen display names for the various modifier keys #these are used in XP menus to show keyboard shortcuts #the shift key - open up arrow symbol (ctrl-e) VK_SHIFT=\u21e7 #the command key - clover leaf symbol (ctrl-q) VK_META=\u2318 #the win key - never generated by native key event VK_WIN=win #the option/alt key - splitting tracks symbol (ctrl-g) VK_ALT=\u2325 #the control key. hat symbol (ctrl-f) VK_CONTROL=\u2303 #the separator character used between modifiers (none on Mac OS) MODIFIER_SEPARATOR= ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global-platform/unix/accessible.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. jump = 移動 press = 押す check = チェック uncheck = チェックしない select = 選択 open = 開く close = 閉じる switch = 切り替え click = クリック collapse= 折りたたむ expand = 展開する activate= 動作させる cycle = 切り替え ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global-platform/unix/intl.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE (intl.ellipsis): Use the unicode ellipsis char, \u2026, # or use "..." if \u2026 doesn't suit traditions in your locale. intl.ellipsis=... ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global-platform/unix/platformKeys.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. #default #this file defines the on screen display names for the various modifier keys #these are used in XP menus to show keyboard shortcuts #the shift key VK_SHIFT = Shift #the command key VK_META = Meta #the win key (Super key and Hyper keys are mapped to DOM Win key) VK_WIN = Win #the alt key VK_ALT = Alt #the control key VK_CONTROL = Ctrl #the separator character used between modifiers MODIFIER_SEPARATOR = + ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global-platform/win/accessible.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. jump = 移動 press = 押す check = チェック uncheck = チェックしない select = 選択 open = 開く close = 閉じる switch = 切り替え click = クリック collapse= 折りたたむ expand = 展開する activate= 動作させる cycle = 切り替え ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global-platform/win/intl.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE (intl.ellipsis): Use the unicode ellipsis char, \u2026, # or use "..." if \u2026 doesn't suit traditions in your locale. intl.ellipsis=... ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global-platform/win/platformKeys.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. #default #this file defines the on screen display names for the various modifier keys #these are used in XP menus to show keyboard shortcuts #the shift key VK_SHIFT = Shift #the command key VK_META = Meta #the win key VK_WIN = Win #the alt key VK_ALT = Alt #the control key VK_CONTROL = Ctrl #the separator character used between modifiers MODIFIER_SEPARATOR = + ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/global-region/region.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # # Localizable URLs # pluginStartupMessage = 次の種類のプラグインを起動します # plug-ins URLs pluginupdates_label = mozilla.com/plugincheck pluginupdates_url = http://www.mozilla.com/plugincheck/ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/downloads/downloads.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/downloads/downloads.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE (shortSeconds): Semi-colon list of plural # forms. See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # s is the short form for seconds shortSeconds=秒 # LOCALIZATION NOTE (shortMinutes): Semi-colon list of plural # forms. See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # m is the short form for minutes shortMinutes=分 # LOCALIZATION NOTE (shortHours): Semi-colon list of plural # forms. See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # h is the short form for hours shortHours=時間 # LOCALIZATION NOTE (shortDays): Semi-colon list of plural # forms. See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # d is the short form for days shortDays=日 # LOCALIZATION NOTE (paused): — is the "em dash" (long dash) paused =中断しています — #1 downloading =ダウンロードしています notStarted =開始していません failed =失敗しました finished =完了しました canceled =キャンセルされました downloadErrorAlertTitle =ダウンロードエラー downloadErrorGeneric =不明なエラーが発生し、ダウンロードファイルを保存できませんでした。\n\n再度試してください。 # LOCALIZATION NOTE: we don't have proper plural support in the CPP code; bug 463102 quitCancelDownloadsAlertTitle =すべてのダウンロードをキャンセルしますか? quitCancelDownloadsAlertMsg =今終了すると 1 個のダウンロードがキャンセルされます。終了してもよろしいですか? quitCancelDownloadsAlertMsgMultiple =今終了すると %S 個のダウンロードがキャンセルされます。終了してもよろしいですか? quitCancelDownloadsAlertMsgMac =今終了すると 1 個のダウンロードがキャンセルされます。終了してもよろしいですか? quitCancelDownloadsAlertMsgMacMultiple =今終了すると %S 個のダウンロードがキャンセルされます。終了してもよろしいですか? offlineCancelDownloadsAlertTitle =すべてのダウンロードをキャンセルしますか? offlineCancelDownloadsAlertMsg =今オフラインにすると 1 個のダウンロードがキャンセルされます。オフラインにしてもよろしいですか? offlineCancelDownloadsAlertMsgMultiple =今オフラインにすると %S 個のダウンロードがキャンセルされます。オフラインにしてもよろしいですか? leavePrivateBrowsingCancelDownloadsAlertTitle =すべてのダウンロードをキャンセルしますか? leavePrivateBrowsingWindowsCancelDownloadsAlertMsg2 =プライベートブラウジングウィンドウを今すぐ閉じると、1 個のダウンロードがキャンセルされます。プライベートブラウジングモードを終了してもよろしいですか? leavePrivateBrowsingWindowsCancelDownloadsAlertMsgMultiple2 =プライベートブラウジングウィンドウを今すぐ閉じると、%S 個のダウンロードがキャンセルされます。プライベートブラウジングモードを終了してもよろしいですか? cancelDownloadsOKText =1 個のダウンロードをキャンセル cancelDownloadsOKTextMultiple =%S 個のダウンロードをキャンセル dontQuitButtonWin =終了しない dontQuitButtonMac =終了しない dontGoOfflineButton =オンラインを維持する dontLeavePrivateBrowsingButton2 =プライベートブラウジングを継続する downloadsCompleteTitle =ダウンロードが完了しました downloadsCompleteMsg =すべてのファイルのダウンロードが完了しました。 # LOCALIZATION NOTE (infiniteRate): # If download speed is a JavaScript Infinity value, this phrase is used infiniteRate =実効速度 # LOCALIZATION NOTE (statusFormat3): — is the "em dash" (long dash) # %1$S transfer progress; %2$S rate number; %3$S rate unit; %4$S time left # example: 4 minutes left — 1.1 of 11.1 GB (2.2 MB/sec) statusFormat3 =%4$S — %1$S (%2$S %3$S/秒) # LOCALIZATION NOTE (statusFormatInfiniteRate): — is the "em dash" (long dash) # %1$S transfer progress; %2$S substitute phrase for Infinity speed; %3$S time left # example: 4 minutes left — 1.1 of 11.1 GB (Really fast) statusFormatInfiniteRate =%3$S — %1$S (%2$S) # LOCALIZATION NOTE (statusFormatNoRate): — is the "em dash" (long dash) # %1$S transfer progress; %2$S time left # example: 4 minutes left — 1.1 of 11.1 GB statusFormatNoRate =%2$S — %1$S bytes =bytes kilobyte =KB megabyte =MB gigabyte =GB # LOCALIZATION NOTE (transferSameUnits2): # %1$S progress number; %2$S total number; %3$S total unit # example: 1.1 of 333 MB transferSameUnits2 =%1$S / %2$S %3$S # LOCALIZATION NOTE (transferDiffUnits2): # %1$S progress number; %2$S progress unit; %3$S total number; %4$S total unit # example: 11.1 MB of 3.3 GB transferDiffUnits2 =%1$S %2$S / %3$S %4$S # LOCALIZATION NOTE (transferNoTotal2): # %1$S progress number; %2$S unit # example: 111 KB transferNoTotal2 =%1$S %2$S # LOCALIZATION NOTE (timePair3): %1$S time number; %2$S time unit # example: 1m; 11h timePair3 =%1$S %2$S # LOCALIZATION NOTE (timeLeftSingle3): %1$S time left # example: 1m left; 11h left timeLeftSingle3 =残り %1$S # LOCALIZATION NOTE (timeLeftDouble3): %1$S time left; %2$S time left sub units # example: 11h 2m left; 1d 22h left timeLeftDouble3 =残り %1$S %2$S timeFewSeconds2 =残り数秒 timeUnknown2 =残り時間不明 # LOCALIZATION NOTE (doneSize): #1 size number; #2 size unit doneSize =#1 #2 # LOCALIZATION NOTE (doneScheme2): %1$S URI scheme like data: jar: about: doneScheme2 =%1$S リソース # LOCALIZATION NOTE (doneFileScheme): Special case of doneScheme for file: # This is used as an eTLD replacement for local files, so make it lower case doneFileScheme =ローカルファイル # LOCALIZATION NOTE (yesterday): Displayed time for files finished yesterday yesterday =昨日 # LOCALIZATION NOTE (monthDate): #1 month name; #2 date number; e.g., January 22 monthDate2 =%1$S%2$S日 fileExecutableSecurityWarning =“%S” は実行可能なファイルです。実行可能なファイルにはあなたのコンピューターを破壊するウイルス、その他の悪意あるコードが含まれていることがあります。この形式のファイルを開く場合には注意してください。“%S” を実行してもよろしいですか? fileExecutableSecurityWarningTitle =実行可能なファイルを開きますか? fileExecutableSecurityWarningDontAsk =今後も同様に処理する # Desktop folder name for downloaded files downloadsFolder =ダウンロード ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/downloads/settingsChange.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/downloads/unknownContentType.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/downloads/unknownContentType.properties ================================================ # -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. title =%S を開く saveDialogTitle =保存ファイル名を入力してください... defaultApp =%S (既定) chooseAppFilePickerTitle=プログラムの選択 badApp =選択されたプログラム (“%S”) が見つかりません。ファイル名を確認するか、他のプログラムを選択してください。 badApp.title =プログラムが見つかりません badPermissions =適切なアクセス権限がないため、ファイルを保存できませんでした。他の保存フォルダーを選択してください。 badPermissions.title =ファイルを保存する権限がありません selectDownloadDir =ダウンロードフォルダーを選択してください unknownAccept.label =ファイルを保存 unknownCancel.label =キャンセル fileType =%S ファイル # LOCALIZATION NOTE (orderedFileSizeWithType): first %S is type, second %S is size, and third %S is unit orderedFileSizeWithType =%1$S (%2$S %3$S) ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/extensions/about.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/extensions/blocklist.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/extensions/extensions.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/extensions/extensions.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. #LOCALIZATION NOTE (aboutWindowTitle) %S is the addon name aboutWindowTitle =%S について aboutWindowCloseButton =閉じる #LOCALIZATION NOTE (aboutWindowVersionString) %S is the addon version aboutWindowVersionString =バージョン %S #LOCALIZATION NOTE (aboutAddon) %S is the addon name aboutAddon =%S について #LOCALIZATION NOTE (uninstallNotice) %S is the add-on name uninstallNotice =%S が削除されました。 #LOCALIZATION NOTE (numReviews): Semicolon-separated list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 is the number of reviews numReviews =レビュー数: #1 #LOCALIZATION NOTE (dateUpdated) %S is the date the addon was last updated dateUpdated =更新日: %S #LOCALIZATION NOTE (notification.incompatible) %1$S is the add-on name, %2$S is brand name, %3$S is application version notification.incompatible =%1$S は %2$S %3$S と互換性がありません。 #LOCALIZATION NOTE (notification.unsigned, notification.unsignedAndDisabled) %1$S is the add-on name, %2$S is brand name notification.unsignedAndDisabled =%1$S は %2$S での使用が検証できないため無効化されています。 notification.unsigned =%1$S は %2$S での使用が検証できません。配布元を確認して慎重に使用してください。 notification.unsigned.link =詳細情報 #LOCALIZATION NOTE (notification.blocked) %1$S is the add-on name notification.blocked =%1$S はセキュリティまたは安定性に問題があるため無効化されました。 notification.blocked.link =詳細情報 #LOCALIZATION NOTE (notification.softblocked) %1$S is the add-on name notification.softblocked =%1$S はセキュリティまたは安定性に問題があります。 notification.softblocked.link =詳細情報 #LOCALIZATION NOTE (notification.outdated) %1$S is the add-on name notification.outdated =%1$S の重要な更新があります。 notification.outdated.link =今すぐ更新する #LOCALIZATION NOTE (notification.vulnerableUpdatable) %1$S is the add-on name notification.vulnerableUpdatable =%1$S は安全ではありません。更新してください。 notification.vulnerableUpdatable.link =今すぐ更新する #LOCALIZATION NOTE (notification.vulnerableNoUpdate) %1$S is the add-on name notification.vulnerableNoUpdate =%1$S は安全ではありません。注意が必要です。 notification.vulnerableNoUpdate.link =詳細情報 #LOCALIZATION NOTE (notification.enable) %1$S is the add-on name, %2$S is brand name notification.enable =%1$S は %2$S の再起動後に有効化されます。 #LOCALIZATION NOTE (notification.disable) %1$S is the add-on name, %2$S is brand name notification.disable =%1$S は %2$S の再起動後に無効化されます。 #LOCALIZATION NOTE (notification.install) %1$S is the add-on name, %2$S is brand name notification.install =%1$S は %2$S の再起動後にインストールされます。 #LOCALIZATION NOTE (notification.uninstall) %1$S is the add-on name, %2$S is brand name notification.uninstall =%1$S は %2$S の再起動後に削除されます。 #LOCALIZATION NOTE (notification.upgrade) %1$S is the add-on name, %2$S is brand name notification.upgrade =%1$S は %2$S の再起動後に更新されます。 #LOCALIZATION NOTE (notification.downloadError) %1$S is the add-on name. notification.downloadError =%1$S のダウンロード中にエラーが発生しました。 notification.downloadError.retry =再試行 notification.downloadError.retry.tooltip =このアドオンのダウンロードを再び試みます #LOCALIZATION NOTE (notification.installError) %1$S is the add-on name. notification.installError =%1$S のインストール中にエラーが発生しました。 notification.installError.retry =再試行 notification.installError.retry.tooltip =このアドオンのダウンロードとインストールを再び試みます #LOCALIZATION NOTE (notification.gmpPending) %1$S is the add-on name. notification.gmpPending =%1$S はすぐにインストールされます。 #LOCALIZATION NOTE (contributionAmount2) %S is the currency amount recommended for contributions contributionAmount2 =寄付希望額: %S installDownloading =ダウンロードしています installDownloaded =ダウンロード完了 installDownloadFailed =ダウンロード中にエラーが発生しました installVerifying =検証しています installInstalling =インストールしています installEnablePending =再起動後に有効になります installDisablePending =再起動後に無効になります installFailed =インストール中にエラーが発生しました installCancelled =インストールをキャンセルしました #LOCALIZATION NOTE (details.notification.incompatible) %1$S is the add-on name, %2$S is brand name, %3$S is application version details.notification.incompatible =%1$S は %2$S %3$S と互換性がありません。 #LOCALIZATION NOTE (details.notification.unsigned, details.notification.unsignedAndDisabled) %1$S is the add-on name, %2$S is brand name details.notification.unsignedAndDisabled =%1$S は %2$S での使用が検証できないため無効化されています。 details.notification.unsigned =%1$S は %2$S での使用が検証できません。配布元を確認して慎重に使用してください。 details.notification.unsigned.link =詳細情報 #LOCALIZATION NOTE (details.notification.blocked) %1$S is the add-on name details.notification.blocked =%1$S はセキュリティまたは安定性に問題があるため無効化されました。 details.notification.blocked.link =詳細情報 #LOCALIZATION NOTE (details.notification.softblocked) %1$S is the add-on name details.notification.softblocked =%1$S はセキュリティまたは安定性の問題を引き起こすことが知られています。 details.notification.softblocked.link =詳細情報 #LOCALIZATION NOTE (details.notification.outdated) %1$S is the add-on name details.notification.outdated =%1$S の重要な更新があります。 details.notification.outdated.link =今すぐ更新する #LOCALIZATION NOTE (details.notification.vulnerableUpdatable) %1$S is the add-on name details.notification.vulnerableUpdatable =%1$S は安全ではありません。更新してください。 details.notification.vulnerableUpdatable.link =今すぐ更新する #LOCALIZATION NOTE (details.notification.vulnerableNoUpdate) %1$S is the add-on name details.notification.vulnerableNoUpdate =%1$S は安全ではありません。注意が必要です。 details.notification.vulnerableNoUpdate.link =詳細情報 #LOCALIZATION NOTE (details.notification.enable) %1$S is the add-on name, %2$S is brand name details.notification.enable =%1$S は %2$S の再起動後に有効化されます。 #LOCALIZATION NOTE (details.notification.disable) %1$S is the add-on name, %2$S is brand name details.notification.disable =%1$S は %2$S の再起動後に無効化されます。 #LOCALIZATION NOTE (details.notification.install) %1$S is the add-on name, %2$S is brand name details.notification.install =%1$S は %2$S の再起動後にインストールされます。 #LOCALIZATION NOTE (details.notification.uninstall) %1$S is the add-on name, %2$S is brand name details.notification.uninstall =%1$S は %2$S の再起動後に削除されます。 #LOCALIZATION NOTE (details.notification.upgrade) %1$S is the add-on name, %2$S is brand name details.notification.upgrade =%1$S は %2$S の再起動後に更新されます。 #LOCALIZATION NOTE (details.notification.gmpPending) %1$S is the add-on name details.notification.gmpPending =%1$S はすぐにインストールされます。 # LOCALIZATION NOTE (details.experiment.time.daysRemaining): # Semicolon-separated list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 is the number of days from now that the experiment will remain active (detail view). details.experiment.time.daysRemaining =残り #1 日 #LOCALIZATION NOTE (details.experiment.time.endsToday) The experiment will end in less than a day (detail view). details.experiment.time.endsToday =残り 1 日未満 # LOCALIZATION NOTE (details.experiment.time.daysPassed): # Semicolon-separated list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 is the number of days since the experiment ran (detail view). details.experiment.time.daysPassed =#1 日前 #LOCALIZATION NOTE (details.experiment.time.endedToday) The experiment ended less than a day ago (detail view). details.experiment.time.endedToday =1 日以内 #LOCALIZATION NOTE (details.experiment.state.active) This experiment is active (detail view). details.experiment.state.active =実行中 #LOCALIZATION NOTE (details.experiment.state.complete) This experiment is complete (it was previously active) (detail view). details.experiment.state.complete =完了 # LOCALIZATION NOTE (experiment.time.daysRemaining): # Semicolon-separated list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 is the number of days from now that the experiment will remain active (list view item). experiment.time.daysRemaining =残り #1 日 #LOCALIZATION NOTE (experiment.time.endsToday) The experiment will end in less than a day (list view item). experiment.time.endsToday =残り 1 日未満 # LOCALIZATION NOTE (experiment.time.daysPassed): # Semicolon-separated list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 is the number of days since the experiment ran (list view item). experiment.time.daysPassed =#1 日前 #LOCALIZATION NOTE (experiment.time.endedToday) The experiment ended less than a day ago (list view item). experiment.time.endedToday =1 日以内 #LOCALIZATION NOTE (experiment.state.active) This experiment is active (list view item). experiment.state.active =実行中 #LOCALIZATION NOTE (experiment.state.complete) This experiment is complete (it was previously active) (list view item). experiment.state.complete =完了 installFromFile.dialogTitle =インストールするアドオンを選択してください installFromFile.filterName =アドオン uninstallAddonTooltip =このアドオンを削除します uninstallAddonRestartRequiredTooltip =このアドオンを削除します (再起動が必要) enableAddonTooltip =このアドオンを有効化します enableAddonRestartRequiredTooltip =このアドオンを有効化します (再起動が必要) disableAddonTooltip =このアドオンを無効化します disableAddonRestartRequiredTooltip =このアドオンを無効化します (再起動が必要) #LOCALIZATION NOTE (showAllSearchResults) #1 is the total number of search results showAllSearchResults =#1 件の検索結果を表示 #LOCALIZATION NOTE (addon.purchase.label) displayed on a button in the list # view, %S is the price of the add-on including currency symbol addon.purchase.label =%S を支払う... addon.purchase.tooltip =アドオンギャラリーを開いてこのアドオンの代金を支払います #LOCALIZATION NOTE (cmd.purchaseAddon.label) displayed on a button in the detail # view, %S is the price of the add-on including currency symbol cmd.purchaseAddon.label =%S を支払う... cmd.purchaseAddon.accesskey =u #LOCALIZATION NOTE (eulaHeader) %S is name of the add-on asking the user to agree to the EULA eulaHeader =%S をインストールするには、次のエンドユーザーライセンス契約に同意する必要があります: type.extension.name =拡張機能 type.theme.name =テーマ type.locale.name =言語パック type.plugin.name =プラグイン type.dictionary.name =辞書 type.service.name =サービス type.experiment.name =実験 ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/extensions/newaddon.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/extensions/newaddon.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. #LOCALIZATION NOTE (name) %1$S is the add-on name, %2$S is the add-on version name=%1$S %2$S #LOCALIZATION NOTE (author) %S is the author of the add-on author=作者: %S #LOCALIZATION NOTE (location) %S is the path the add-on is installed in location=インストール先: %S ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/extensions/selectAddons.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/extensions/selectAddons.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. #LOCALIZATION NOTE (source.profile) add-ons installed by the user, this may be # translated as "You" or "User" depending on the locale source.profile = ユーザ #LOCALIZATION NOTE (source.bundled) add-ons shipped with the application, and thus # treated as installed by the user. This may be # translated as "You" or "User" depending on the locale source.bundled = ユーザ (バンドル) #LOCALIZATION NOTE (source.other) add-ons installed by other applications # installed on the computer ## en-US: Third Party source.other = 外部プログラム action.enabled = 有効化されます action.disabled = 無効化されます action.autoupdate = 互換性のあるバージョンに更新されます action.incompatible = 互換性のあるバージョンの公開時に有効化されます ## en-US: Update to make compatible action.neededupdate = 互換性のあるバージョンに更新する ## en-US: Optional update action.unneededupdate = 更新する ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/extensions/update.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/extensions/update.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. mismatchCheckNow =今すぐ確認 mismatchCheckNowAccesskey =C mismatchDontCheck =確認しない mismatchDontCheckAccesskey =D installButtonText =今すぐインストール installButtonTextAccesskey =I nextButtonText =次へ nextButtonTextAccesskey =N cancelButtonText =キャンセル cancelButtonTextAccesskey =C statusPrefix =%S の確認を完了しました downloadingPrefix =ダウンロード: %S installingPrefix =インストール: %S closeButton =閉じる # LOCALIZATION NOTE: When present %S is brandShortName (installErrors, checkingErrors) # (^m^) %S は不要。 # (^^; %1$0.S is a special replacement to generate nothing for %1$S without error installErrors =%1$0.S次のアドオンの更新をインストールできませんでした: checkingErrors =%1$0.S次のアドオンの更新を確認できませんでした: installErrorItemFormat =%S (%S) ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/handling/handling.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/handling/handling.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. protocol.title =プログラムを起動 protocol.description =このリンクは他のプログラムで開く必要があります。 protocol.choices.label =プログラムの選択: protocol.checkbox.label =今後 %S リンクは同様に処理する protocol.checkbox.accesskey =R protocol.checkbox.extra =この設定は %S の設定画面で変更できます。 choose.application.title =他のプログラム ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/plugins/plugins.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/plugins/plugins.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. pluginLicenseAgreement.label = %S をインストールするには、以下の文書をよく読んで同意しなければなりません: pluginInstallation.download.start = %S をダウンロードしています... pluginInstallation.download.finish = %S のダウンロードが完了しました。 pluginInstallation.install.start = %S をインストールしています... pluginInstallation.install.finish = %S のインストールが正常に終了しました。 pluginInstallation.install.error = %S (%S) のインストールに失敗しました。 pluginInstallation.complete = プラグインのインストールが完了しました。 pluginInstallationSummary.success = 正常にインストールしました pluginInstallationSummary.failed = 正常にインストールできませんでした pluginInstallationSummary.licenseNotAccepted = ライセンスに同意しませんでした pluginInstallationSummary.notAvailable = 利用できません pluginInstallationSummary.manualInstall.label = 手動インストール pluginInstallationSummary.manualInstall.tooltip = プラグインを手動でインストールします。 pluginInstallation.noPluginsFound = 適切なプラグインが見つかりませんでした。 pluginInstallation.noPluginsInstalled = プラグインはインストールされませんでした。 pluginInstallation.unknownPlugin = 不明なプラグインです (%S) pluginInstallation.restart.label = %S を再起動 pluginInstallation.restart.accesskey = R pluginInstallation.close.label = 閉じる pluginInstallation.close.accesskey = C ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/preferences/changemp.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/preferences/ocsp.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/preferences/preferences.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. #### Master Password password_not_set = (なし) failed_pw_change = マスターパスワードを変更できませんでした。 incorrect_pw = 入力された現在のマスターパスワードが正しくありません。入力し直してください。 pw_change_ok = マスターパスワードが正常に変更されました。 pw_erased_ok = マスターパスワードを削除しました。 pw_not_wanted = 警告: マスターパスワードを使用しないように設定しました。 pw_empty_warning = ウェブとメールのパスワード、フォームデータや秘密鍵は保護されません。 pw_change2empty_in_fips_mode = 現在 FIPS モードです。FIPS モードではマスターパスワードを空にすることができません。 pw_change_success_title = パスワードを正常に変更しました pw_change_failed_title = パスワードを変更できませんでした pw_remove_button = 削除 ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/preferences/removemp.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/profile/createProfileWizard.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/profile/profileSelection.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/profile/profileSelection.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE: These strings are used for startup/profile problems and the profile manager. # Application not responding # LOCALIZATION NOTE (restartTitle, restartMessageNoUnlocker, restartMessageUnlocker, restartMessageNoUnlockerMac, restartMessageUnlockerMac): Messages displayed when the application is running but is not responding to commands. %S is the application name. restartTitle =%S の終了 restartMessageNoUnlocker =%S は起動していますが応答しません。新しいウィンドウを開くにはまず既存の %S プロセスを終了させるか、コンピューターを再起動させなければなりません。 restartMessageUnlocker =%S は起動していますが応答しません。新しいウィンドウを開くには既存の %S プロセスを終了させなければなりません。 restartMessageNoUnlockerMac =すでに別の %S を開いています。同時に複数の %S を開くことはできません。 restartMessageUnlockerMac =すでに別の %S を開いています。この %S を開くために実行中のものを終了させます。 # Profile manager # LOCALIZATION NOTE (profileTooltip): First %S is the profile name, second %S is the path to the profile folder. profileTooltip =プロファイル: ‘%S’ - パス: ‘%S’ pleaseSelectTitle =プロファイルの選択 pleaseSelect =%S で使用するプロファイルを選択するか、新しいプロファイルを作成してください。 profileLockedTitle =使用中のプロファイル profileLocked2 =現在使用中であるため %S はプロファイル “%S” を使用できません。\n\n起動中の %S を終了するか、別のプロファイルを選択してください。 renameProfileTitle =プロファイル名の変更 renameProfilePrompt =プロファイル “%S” の変更後の名前を入力してください: profileNameInvalidTitle =無効なプロファイル名 profileNameInvalid =プロファイル名として “%S” を使用することはできません。 chooseFolder =プロファイルフォルダーの選択 profileNameEmpty =名前のないプロファイルは作成できません。 invalidChar =プロファイル名には “%S” といった文字は使用できません。名前を変更してください。 deleteTitle =プロファイルの削除 deleteProfileConfirm =プロファイルを削除するとプロファイルの一覧から削除され、元には戻せません。\nプロファイルの登録だけでなくあなたのユーザー設定や証明書などユーザーデータの入っているプロファイルデータファイルすべてを削除することもできます。この場合にはプロファイルフォルダー “%S” 自体もすべて削除され、元には戻せません。\nプロファイルのデータファイルも一緒に削除してよろしいですか? deleteFiles =ファイルもすべて削除 dontDeleteFiles =プロファイル登録だけ削除 profileCreationFailed =プロファイルは作成できませんでした。おそらく選択されたフォルダーは書き込み可能ではありません。 profileCreationFailedTitle =プロファイル作成失敗 profileExists =この名前のプロファイルはすでに存在します。他の名前を指定してください。 profileExistsTitle =既存プロファイルとの重複 profileFinishText =新しいプロファイルを作成するには [完了] をクリックしてください。 profileFinishTextMac =新しいプロファイルを作成するには [完了] をクリックしてください。 profileMissing =あなたの %S プロファイルを読み込めませんでした。プロファイルが存在しないかアクセスできません。 profileMissingTitle =プロファイルが見つかりません # Profile reset # LOCALIZATION NOTE (resetBackupDirectory): Directory name for the profile directory backup created during reset. This directory is placed in a location users will see it (ie. their desktop). %S is the application name. resetBackupDirectory =Old %S Data ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/update/history.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/update/updates.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/update/updates.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE: The 1st %S is the update name and the 2nd %S is the build # identifier from the local updates.xml for displaying update history # example: MyApplication (20081022033543) updateFullName =%1$S (%2$S) # LOCALIZATION NOTE: The 1st %S is brandShortName and 2nd %S is update version # where update version from the update xml # example: MyApplication 10.0.5 updateName =%1$S %2$S # LOCALIZATION NOTE: When present # %1$S is the brandShortName. Ex: MyApplication # %2$S is the update version - provided by the update xml. Ex: version 10.0.5 # %3$S is the build identifier - provided by the update xml. Ex: 20081022033543 updateNightlyName =%1$S %2$S %3$S nightly intro_major =%1$S %2$S に今すぐアップグレードしますか? intro_minor =%1$S のセキュリティと安定性を向上する更新が公開されています: updateType_major =新しいバージョン updateType_minor =セキュリティの更新 # LOCALIZATION NOTE: When present %S is brandShortName # (^^; %1$0.S is a special replacement to generate nothing for %1$S without error verificationError =%1$0.S更新パッケージの完全性が確認できませんでした。 resumePausedAfterCloseTitle =ソフトウェアの更新 resumePausedAfterCloseMsg =この更新のダウンロードを中断しました。%S を使用しながらバックグラウンドで更新のダウンロードを継続しますか? updaterIOErrorTitle =ソフトウェアを更新できませんでした updaterIOErrorMsg =更新をインストールできませんでした。%S が他には起動していないことを確認した後にもう一度 %S を再起動してみてください。 okButton =OK okButton.accesskey =O askLaterButton =後で確認する askLaterButton.accesskey =A noThanksButton =更新しない noThanksButton.accesskey =N updateButton_minor =%S を更新する updateButton_minor.accesskey =U updateButton_major =新しいバージョンを入手する updateButton_major.accesskey =G backButton =戻る backButton.accesskey =B acceptTermsButton =同意する acceptTermsButton.accesskey =A # NOTE: The restartLaterButton string is also used in # mozapps/extensions/content/blocklist.js restartLaterButton =後で再起動 restartLaterButton.accesskey =L restartNowButton =%S を再起動 restartNowButton.accesskey =R # LOCALIZATION NOTE: %S is the date the update was installed from the local # updates.xml for displaying update history statusSucceededFormat =インストールしました: %S statusFailed =インストールできませんでした pauseButtonPause =中断 pauseButtonResume =再開 hideButton =隠す hideButton.accesskey =H applyingUpdate =更新を適用しています... updatesfound_minor.title =更新が見つかりました updatesfound_major.title =新しいバージョンが見つかりました installSuccess =更新を正常にインストールしました installPending =次の起動時にインストールします patchApplyFailure =更新をインストールできませんでした (パッチを適用できませんでした) elevationFailure =この更新をインストールするのに必要な権限がありません。システムの管理者に問い合わせてください。 # LOCALIZATION NOTE: %S is the amount downloaded so far # example: Paused — 879 KB of 2.1 MB downloadPausedStatus =中断 — %S check_error-200 =更新情報 XML ファイルが整形式になっていません (200) check_error-403 =アクセス拒否されました (403) check_error-404 =更新情報 XML ファイルが見つかりませんでした (404) check_error-500 =サーバー内部でエラーが発生しました (500) check_error-2152398849 =失敗しました (原因不明) check_error-2152398861 =接続を拒否されました check_error-2152398862 =接続がタイムアウトしました # NS_ERROR_OFFLINE check_error-2152398864 =ネットワーク接続がオフラインになっています (オンラインにしてください) check_error-2152398867 =ポートの使用を許可されていません check_error-2152398868 =データを受信できませんでした (再度試してください) check_error-2152398878 =更新サーバーが見つかりませんでした (インターネット接続を確認してください) check_error-2152398890 =プロキシサーバーが見つかりませんでした (インターネット接続を確認してください) # NS_ERROR_DOCUMENT_NOT_CACHED check_error-2152398918 =ネットワークがオフラインです (オンラインにしてください) check_error-2152398919 =データ転送が中断されました (再度試してください) check_error-2152398920 =プロキシサーバーへの接続を拒否されました check_error-2153390069 =サーバーの証明書が有効期限を過ぎています (コンピューターの日時が狂っていたら正しく設定してください) check_error-verification_failed =更新の完全性を確認できませんでした ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/xpinstall/xpinstallConfirm.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/mozapps/xpinstall/xpinstallConfirm.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. unverified =(作者情報未検証) signed =(%S) itemWarnIntroMultiple =%S 個のソフトウェアをインストールする許可を求めています: itemWarnIntroSingle =次のソフトウェアをインストールする許可を求めています: installButtonDisabledLabel =インストール (%S) installButtonLabel =今すぐインストール ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/necko/necko.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. #ResolvingHost=Looking up #ConnectedTo=Connected to #ConnectingTo=Connecting to #SendingRequestTo=Sending request to #TransferringDataFrom=Transferring data from 3 =%1$S のアドレス解決をしています... 4 =%1$S に接続しました... 5 =%1$S に要求を送信しています... 6 =%1$S からデータを転送しています... 7 =%1$S に接続しています... 8 =%1$S を読み込みました 9 =%1$S を書き込みました 10=%1$S の応答を待っています... 11=%1$S を調べています... 27=FTP トランザクションを開始しています... 28=FTP トランザクションを終了しました UnsupportedFTPServer =この FTP サーバー %1$S は現在サポートしていません。 RepostFormData =このウェブページは新しい URL に自動転送されています。入力したフォームデータをその URL に送信しますか? # Directory listing strings DirTitle =%1$S の一覧 DirGoUp =上位のディレクトリーへ移動 ShowHidden =隠しファイルを表示する DirColName =名前 DirColSize =サイズ DirColMTime =最終更新日時 DirFileLabel =ファイル: # (^^; 表現イマイチだがすでに使われていないので無視 PhishingAuth =“%1$S” を訪れようとしています。このサイトはあなたが違うサイトを訪れていると思わせようとしている可能性があります。十分に注意してください。 PhishingAuthAccept =理解し十分に注意を払います SuperfluousAuth =サイト “%1$S” にユーザー名 “%2$S” でログインしようとしていますが、ウェブサイトは認証を必要としていません。このサイトはあなたをだまそうとしている可能性があります。\n\nサイト “%1$S” に接続しますか? AutomaticAuth =サイト “%1$S” にユーザー名 “%2$S” でログインしようとしています。 TrackingUriBlocked =追跡からの保護機能が有効なため、“%1$S” のリソースがブロックされました。 # LOCALIZATION NOTE (APIDeprecationWarning): # %1$S is the deprecated API; %2$S is the API function that should be used. APIDeprecationWarning =警告: ‘%1$S’ は非推奨です。‘%2$S’ を使用してください。 # LOCALIZATION NOTE (nsICookieManagerDeprecated): don't localize originAttributes. # %1$S is the deprecated API; %2$S is the interface suffix that the given deprecated API belongs to. nsICookieManagerAPIDeprecated =“%1$S” は変更されました。コードを変更して正しい originAttributes を渡してください。詳細は MDN の https://developer.mozilla.org/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsICookieManager%2$S を参照してください。 12=Performing a TLS handshake to %1$S… 13=The TLS handshake finished for %1$S… UnsafeUriBlocked=The resource at “%1$S” was blocked by Safe Browsing. ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/passwordmgr/passwordManager.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/passwordmgr/passwordmgr.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. rememberValue =パスワードマネージャーにこの値を保存する。 rememberPassword =パスワードマネージャーにこのパスワードを保存する。 savePasswordTitle =確認 # LOCALIZATION NOTE (saveLoginMsg, saveLoginMsgNoUser): # %1$S is brandShortName, %2$S is the login's hostname. saveLoginMsg =%2$S のログイン情報を %1$S に保存しますか? saveLoginMsgNoUser =%2$S のパスワードを %1$S に保存しますか? saveLoginButtonAllow.label =保存する saveLoginButtonAllow.accesskey =S saveLoginButtonDeny.label =保存しない saveLoginButtonDeny.accesskey =D updateLoginMsg =このログイン情報を更新しますか? updateLoginMsgNoUser =このパスワードを更新しますか? updateLoginButtonText =更新する updateLoginButtonAccessKey =U updateLoginButtonDeny.label =更新しない updateLoginButtonDeny.accesskey =D # LOCALIZATION NOTE (rememberPasswordMsg): # 1st string is the username for the login, 2nd is the login's hostname. # Note that long usernames may be truncated. rememberPasswordMsg =%2$S で使用する “%1$S” のパスワードを記憶させますか? # LOCALIZATION NOTE (rememberPasswordMsgNoUsername): # String is the login's hostname. rememberPasswordMsgNoUsername =%S で使用するパスワードを記憶させますか? # LOCALIZATION NOTE (noUsernamePlaceholder): # This is displayed in place of the username when it is missing. noUsernamePlaceholder =ユーザー名を入力してください togglePasswordLabel =パスワードを開示 togglePasswordAccessKey2 =h notNowButtonText =今回は記憶しない(&N) notifyBarNotNowButtonText =今回は記憶しない notifyBarNotNowButtonAccessKey =N neverForSiteButtonText =このサイトでは記憶しない(&V) notifyBarNeverRememberButtonText2 =保存しない notifyBarNeverRememberButtonAccessKey2 =e rememberButtonText =記憶する(&R) notifyBarRememberPasswordButtonText =パスワードを記憶する notifyBarRememberPasswordButtonAccessKey =R passwordChangeTitle =パスワード変更の確認 # LOCALIZATION NOTE (updatePasswordMsg): # String is the username for the login. updatePasswordMsg =記憶されている “%S” のパスワードを更新しますか? updatePasswordMsgNoUser =記憶されているパスワードを更新しますか? notifyBarUpdateButtonText =パスワードを更新する notifyBarUpdateButtonAccessKey =U notifyBarDontChangeButtonText =変更しない notifyBarDontChangeButtonAccessKey =D userSelectText =次のサイトのパスワードを変更するユーザーを確認してください: hidePasswords =パスワードを隠す hidePasswordsAccessKey =P showPasswords =パスワードを表示する showPasswordsAccessKey =P noMasterPasswordPrompt =パスワードを表示しますか? removeAllPasswordsPrompt =本当にすべてのパスワードを消去しますか? removeAllPasswordsTitle =すべてのパスワードを消去 removeLoginPrompt =このログイン情報を削除してもよろしいですか? removeLoginTitle =ログイン情報の削除 loginsDescriptionAll =このコンピューターには以下のサイトのログイン情報が保存されています: loginsDescriptionFiltered =次のログイン情報が検索語と一致しました: # LOCALIZATION NOTE (loginHostAge): # This is used to show the context menu login items with their age. # 1st string is the username for the login, 2nd is the login's age. loginHostAge =%1$S (%2$S) # LOCALIZATION NOTE (noUsername): # String is used on the context menu when a login doesn't have a username. noUsername =ユーザー名なし duplicateLoginTitle =ログイン情報が存在します duplicateLogin =重複するログイン情報がすでに存在しています。 insecureFieldWarningDescription =この接続は安全ではありません。ここに入力したログイン情報は漏えいする可能性があります。 # LOCALIZATION NOTE (insecureFieldWarningDescription2, insecureFieldWarningDescription3): # %1$S will contain insecureFieldWarningLearnMore and look like a link to indicate that clicking will open a tab with support information. insecureFieldWarningDescription2 =この接続は安全ではありません。ここに入力したログイン情報は漏えいする可能性があります。%1$S insecureFieldWarningDescription3 =ここに入力したログイン情報は漏えいする可能性があります。%1$S insecureFieldWarningLearnMore =詳細 removeAll.accesskey=A # LOCALIZATION NOTE (removeAll, removeAllShown): # removeAll and removeAllShown are both used on the same one button, # never displayed together and can share the same accesskey. # When only partial sites are shown as a result of keyword search, # removeAllShown is displayed as button label. # removeAll is displayed when no keyword search and all sites are shown. removeAll.label=Remove All removeAllShown.accesskey=A removeAllShown.label=Remove All Shown ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/pipnss/nsserrors.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # (^^; 後回し SSL_ERROR_EXPORT_ONLY_SERVER=Unable to communicate securely. Peer does not support high-grade encryption. SSL_ERROR_US_ONLY_SERVER=Unable to communicate securely. Peer requires high-grade encryption which is not supported. SSL_ERROR_NO_CYPHER_OVERLAP=Cannot communicate securely with peer: no common encryption algorithm(s). SSL_ERROR_NO_CERTIFICATE=Unable to find the certificate or key necessary for authentication. SSL_ERROR_BAD_CERTIFICATE=Unable to communicate securely with peer: peers’s certificate was rejected. SSL_ERROR_BAD_CLIENT=The server has encountered bad data from the client. SSL_ERROR_BAD_SERVER=The client has encountered bad data from the server. SSL_ERROR_UNSUPPORTED_CERTIFICATE_TYPE=Unsupported certificate type. SSL_ERROR_UNSUPPORTED_VERSION=Peer using unsupported version of security protocol. SSL_ERROR_WRONG_CERTIFICATE=Client authentication failed: private key in key database does not match public key in certificate database. SSL_ERROR_BAD_CERT_DOMAIN=Unable to communicate securely with peer: requested domain name does not match the server’s certificate. SSL_ERROR_POST_WARNING=Unrecognized SSL error code. SSL_ERROR_SSL2_DISABLED=Peer only supports SSL version 2, which is locally disabled. SSL_ERROR_BAD_MAC_READ=SSL received a record with an incorrect Message Authentication Code. SSL_ERROR_BAD_MAC_ALERT=SSL peer reports incorrect Message Authentication Code. SSL_ERROR_BAD_CERT_ALERT=SSL peer cannot verify your certificate. SSL_ERROR_REVOKED_CERT_ALERT=SSL peer rejected your certificate as revoked. SSL_ERROR_EXPIRED_CERT_ALERT=SSL peer rejected your certificate as expired. SSL_ERROR_SSL_DISABLED=Cannot connect: SSL is disabled. SSL_ERROR_FORTEZZA_PQG=Cannot connect: SSL peer is in another FORTEZZA domain. SSL_ERROR_UNKNOWN_CIPHER_SUITE=An unknown SSL cipher suite has been requested. SSL_ERROR_NO_CIPHERS_SUPPORTED=No cipher suites are present and enabled in this program. SSL_ERROR_BAD_BLOCK_PADDING=SSL received a record with bad block padding. SSL_ERROR_RX_RECORD_TOO_LONG=SSL received a record that exceeded the maximum permissible length. SSL_ERROR_TX_RECORD_TOO_LONG=SSL attempted to send a record that exceeded the maximum permissible length. SSL_ERROR_RX_MALFORMED_HELLO_REQUEST=SSL received a malformed Hello Request handshake message. SSL_ERROR_RX_MALFORMED_CLIENT_HELLO=SSL received a malformed Client Hello handshake message. SSL_ERROR_RX_MALFORMED_SERVER_HELLO=SSL received a malformed Server Hello handshake message. SSL_ERROR_RX_MALFORMED_CERTIFICATE=SSL received a malformed Certificate handshake message. SSL_ERROR_RX_MALFORMED_SERVER_KEY_EXCH=SSL received a malformed Server Key Exchange handshake message. SSL_ERROR_RX_MALFORMED_CERT_REQUEST=SSL received a malformed Certificate Request handshake message. SSL_ERROR_RX_MALFORMED_HELLO_DONE=SSL received a malformed Server Hello Done handshake message. SSL_ERROR_RX_MALFORMED_CERT_VERIFY=SSL received a malformed Certificate Verify handshake message. SSL_ERROR_RX_MALFORMED_CLIENT_KEY_EXCH=SSL received a malformed Client Key Exchange handshake message. SSL_ERROR_RX_MALFORMED_FINISHED=SSL received a malformed Finished handshake message. SSL_ERROR_RX_MALFORMED_CHANGE_CIPHER=SSL received a malformed Change Cipher Spec record. SSL_ERROR_RX_MALFORMED_ALERT=SSL received a malformed Alert record. SSL_ERROR_RX_MALFORMED_HANDSHAKE=SSL received a malformed Handshake record. SSL_ERROR_RX_MALFORMED_APPLICATION_DATA=SSL received a malformed Application Data record. SSL_ERROR_RX_UNEXPECTED_HELLO_REQUEST=SSL received an unexpected Hello Request handshake message. SSL_ERROR_RX_UNEXPECTED_CLIENT_HELLO=SSL received an unexpected Client Hello handshake message. SSL_ERROR_RX_UNEXPECTED_SERVER_HELLO=SSL received an unexpected Server Hello handshake message. SSL_ERROR_RX_UNEXPECTED_CERTIFICATE=SSL received an unexpected Certificate handshake message. SSL_ERROR_RX_UNEXPECTED_SERVER_KEY_EXCH=SSL received an unexpected Server Key Exchange handshake message. SSL_ERROR_RX_UNEXPECTED_CERT_REQUEST=SSL received an unexpected Certificate Request handshake message. SSL_ERROR_RX_UNEXPECTED_HELLO_DONE=SSL received an unexpected Server Hello Done handshake message. SSL_ERROR_RX_UNEXPECTED_CERT_VERIFY=SSL received an unexpected Certificate Verify handshake message. SSL_ERROR_RX_UNEXPECTED_CLIENT_KEY_EXCH=SSL received an unexpected Client Key Exchange handshake message. SSL_ERROR_RX_UNEXPECTED_FINISHED=SSL received an unexpected Finished handshake message. SSL_ERROR_RX_UNEXPECTED_CHANGE_CIPHER=SSL received an unexpected Change Cipher Spec record. SSL_ERROR_RX_UNEXPECTED_ALERT=SSL received an unexpected Alert record. SSL_ERROR_RX_UNEXPECTED_HANDSHAKE=SSL received an unexpected Handshake record. SSL_ERROR_RX_UNEXPECTED_APPLICATION_DATA=SSL received an unexpected Application Data record. SSL_ERROR_RX_UNKNOWN_RECORD_TYPE=SSL received a record with an unknown content type. SSL_ERROR_RX_UNKNOWN_HANDSHAKE=SSL received a handshake message with an unknown message type. SSL_ERROR_RX_UNKNOWN_ALERT=SSL received an alert record with an unknown alert description. SSL_ERROR_CLOSE_NOTIFY_ALERT=SSL peer has closed this connection. SSL_ERROR_HANDSHAKE_UNEXPECTED_ALERT=SSL peer was not expecting a handshake message it received. SSL_ERROR_DECOMPRESSION_FAILURE_ALERT=SSL peer was unable to successfully decompress an SSL record it received. SSL_ERROR_HANDSHAKE_FAILURE_ALERT=SSL peer was unable to negotiate an acceptable set of security parameters. SSL_ERROR_ILLEGAL_PARAMETER_ALERT=SSL peer rejected a handshake message for unacceptable content. SSL_ERROR_UNSUPPORTED_CERT_ALERT=SSL peer does not support certificates of the type it received. SSL_ERROR_CERTIFICATE_UNKNOWN_ALERT=SSL peer had some unspecified issue with the certificate it received. SSL_ERROR_GENERATE_RANDOM_FAILURE=SSL experienced a failure of its random number generator. SSL_ERROR_SIGN_HASHES_FAILURE=Unable to digitally sign data required to verify your certificate. SSL_ERROR_EXTRACT_PUBLIC_KEY_FAILURE=SSL was unable to extract the public key from the peer’s certificate. SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE=Unspecified failure while processing SSL Server Key Exchange handshake. SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE=Unspecified failure while processing SSL Client Key Exchange handshake. SSL_ERROR_ENCRYPTION_FAILURE=Bulk data encryption algorithm failed in selected cipher suite. SSL_ERROR_DECRYPTION_FAILURE=Bulk data decryption algorithm failed in selected cipher suite. SSL_ERROR_SOCKET_WRITE_FAILURE=Attempt to write encrypted data to underlying socket failed. SSL_ERROR_MD5_DIGEST_FAILURE=MD5 digest function failed. SSL_ERROR_SHA_DIGEST_FAILURE=SHA-1 digest function failed. SSL_ERROR_MAC_COMPUTATION_FAILURE=MAC computation failed. SSL_ERROR_SYM_KEY_CONTEXT_FAILURE=Failure to create Symmetric Key context. SSL_ERROR_SYM_KEY_UNWRAP_FAILURE=Failure to unwrap the Symmetric key in Client Key Exchange message. SSL_ERROR_PUB_KEY_SIZE_LIMIT_EXCEEDED=SSL Server attempted to use domestic-grade public key with export cipher suite. SSL_ERROR_IV_PARAM_FAILURE=PKCS11 code failed to translate an IV into a param. SSL_ERROR_INIT_CIPHER_SUITE_FAILURE=Failed to initialize the selected cipher suite. SSL_ERROR_SESSION_KEY_GEN_FAILURE=Client failed to generate session keys for SSL session. SSL_ERROR_NO_SERVER_KEY_FOR_ALG=Server has no key for the attempted key exchange algorithm. SSL_ERROR_TOKEN_INSERTION_REMOVAL=PKCS#11 token was inserted or removed while operation was in progress. SSL_ERROR_TOKEN_SLOT_NOT_FOUND=No PKCS#11 token could be found to do a required operation. SSL_ERROR_NO_COMPRESSION_OVERLAP=Cannot communicate securely with peer: no common compression algorithm(s). SSL_ERROR_HANDSHAKE_NOT_COMPLETED=Cannot initiate another SSL handshake until current handshake is complete. SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE=Received incorrect handshakes hash values from peer. SSL_ERROR_CERT_KEA_MISMATCH=The certificate provided cannot be used with the selected key exchange algorithm. SSL_ERROR_NO_TRUSTED_SSL_CLIENT_CA=No certificate authority is trusted for SSL client authentication. SSL_ERROR_SESSION_NOT_FOUND=Client’s SSL session ID not found in server’s session cache. SSL_ERROR_DECRYPTION_FAILED_ALERT=Peer was unable to decrypt an SSL record it received. SSL_ERROR_RECORD_OVERFLOW_ALERT=Peer received an SSL record that was longer than is permitted. SSL_ERROR_UNKNOWN_CA_ALERT=Peer does not recognize and trust the CA that issued your certificate. SSL_ERROR_ACCESS_DENIED_ALERT=Peer received a valid certificate, but access was denied. SSL_ERROR_DECODE_ERROR_ALERT=Peer could not decode an SSL handshake message. SSL_ERROR_DECRYPT_ERROR_ALERT=Peer reports failure of signature verification or key exchange. SSL_ERROR_EXPORT_RESTRICTION_ALERT=Peer reports negotiation not in compliance with export regulations. SSL_ERROR_PROTOCOL_VERSION_ALERT=Peer reports incompatible or unsupported protocol version. SSL_ERROR_INSUFFICIENT_SECURITY_ALERT=Server requires ciphers more secure than those supported by client. SSL_ERROR_INTERNAL_ERROR_ALERT=Peer reports it experienced an internal error. SSL_ERROR_USER_CANCELED_ALERT=Peer user canceled handshake. SSL_ERROR_NO_RENEGOTIATION_ALERT=Peer does not permit renegotiation of SSL security parameters. SSL_ERROR_SERVER_CACHE_NOT_CONFIGURED=SSL server cache not configured and not disabled for this socket. SSL_ERROR_UNSUPPORTED_EXTENSION_ALERT=SSL peer does not support requested TLS hello extension. SSL_ERROR_CERTIFICATE_UNOBTAINABLE_ALERT=SSL peer could not obtain your certificate from the supplied URL. SSL_ERROR_UNRECOGNIZED_NAME_ALERT=SSL peer has no certificate for the requested DNS name. SSL_ERROR_BAD_CERT_STATUS_RESPONSE_ALERT=SSL peer was unable to get an OCSP response for its certificate. SSL_ERROR_BAD_CERT_HASH_VALUE_ALERT=SSL peer reported bad certificate hash value. SSL_ERROR_RX_UNEXPECTED_NEW_SESSION_TICKET=SSL received an unexpected New Session Ticket handshake message. SSL_ERROR_RX_MALFORMED_NEW_SESSION_TICKET=SSL received a malformed New Session Ticket handshake message. SSL_ERROR_DECOMPRESSION_FAILURE=SSL received a compressed record that could not be decompressed. SSL_ERROR_RENEGOTIATION_NOT_ALLOWED=Renegotiation is not allowed on this SSL socket. SSL_ERROR_UNSAFE_NEGOTIATION=Peer attempted old style (potentially vulnerable) handshake. SSL_ERROR_RX_UNEXPECTED_UNCOMPRESSED_RECORD=SSL received an unexpected uncompressed record. SSL_ERROR_WEAK_SERVER_EPHEMERAL_DH_KEY=SSL received a weak ephemeral Diffie-Hellman key in Server Key Exchange handshake message. SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID=SSL received invalid NPN extension data. SSL_ERROR_FEATURE_NOT_SUPPORTED_FOR_SSL2=SSL feature not supported for SSL 2.0 connections. SSL_ERROR_FEATURE_NOT_SUPPORTED_FOR_SERVERS=SSL feature not supported for servers. SSL_ERROR_FEATURE_NOT_SUPPORTED_FOR_CLIENTS=SSL feature not supported for clients. SSL_ERROR_INVALID_VERSION_RANGE=SSL version range is not valid. SSL_ERROR_CIPHER_DISALLOWED_FOR_VERSION=SSL peer selected a cipher suite disallowed for the selected protocol version. SSL_ERROR_RX_MALFORMED_HELLO_VERIFY_REQUEST=SSL received a malformed Hello Verify Request handshake message. SSL_ERROR_RX_UNEXPECTED_HELLO_VERIFY_REQUEST=SSL received an unexpected Hello Verify Request handshake message. SSL_ERROR_FEATURE_NOT_SUPPORTED_FOR_VERSION=SSL feature not supported for the protocol version. SSL_ERROR_RX_UNEXPECTED_CERT_STATUS=SSL received an unexpected Certificate Status handshake message. SSL_ERROR_UNSUPPORTED_HASH_ALGORITHM=Unsupported hash algorithm used by TLS peer. SSL_ERROR_DIGEST_FAILURE=Digest function failed. SSL_ERROR_INCORRECT_SIGNATURE_ALGORITHM=Incorrect signature algorithm specified in a digitally-signed element. SSL_ERROR_NEXT_PROTOCOL_NO_CALLBACK=The next protocol negotiation extension was enabled, but the callback was cleared prior to being needed. SSL_ERROR_NEXT_PROTOCOL_NO_PROTOCOL=The server supports no protocols that the client advertises in the ALPN extension. SSL_ERROR_INAPPROPRIATE_FALLBACK_ALERT=The server rejected the handshake because the client downgraded to a lower TLS version than the server supports. SSL_ERROR_WEAK_SERVER_CERT_KEY=The server certificate included a public key that was too weak. SSL_ERROR_RX_SHORT_DTLS_READ=Not enough room in buffer for DTLS record. SSL_ERROR_NO_SUPPORTED_SIGNATURE_ALGORITHM=No supported TLS signature algorithm was configured. SSL_ERROR_UNSUPPORTED_SIGNATURE_ALGORITHM=The peer used an unsupported combination of signature and hash algorithm. SSL_ERROR_MISSING_EXTENDED_MASTER_SECRET=The peer tried to resume without a correct extended_master_secret extension. SSL_ERROR_UNEXPECTED_EXTENDED_MASTER_SECRET=The peer tried to resume with an unexpected extended_master_secret extension. SEC_ERROR_IO=An I/O error occurred during security authorization. SEC_ERROR_LIBRARY_FAILURE=security library failure. SEC_ERROR_BAD_DATA=security library: received bad data. SEC_ERROR_OUTPUT_LEN=security library: output length error. SEC_ERROR_INPUT_LEN=security library has experienced an input length error. SEC_ERROR_INVALID_ARGS=security library: invalid arguments. SEC_ERROR_INVALID_ALGORITHM=security library: invalid algorithm. SEC_ERROR_INVALID_AVA=security library: invalid AVA. SEC_ERROR_INVALID_TIME=Improperly formatted time string. SEC_ERROR_BAD_DER=security library: improperly formatted DER-encoded message. SEC_ERROR_BAD_SIGNATURE=Peer’s certificate has an invalid signature. SEC_ERROR_EXPIRED_CERTIFICATE=Peer’s Certificate has expired. SEC_ERROR_REVOKED_CERTIFICATE=Peer’s Certificate has been revoked. SEC_ERROR_UNKNOWN_ISSUER=Peer’s Certificate issuer is not recognized. SEC_ERROR_BAD_KEY=Peer’s public key is invalid. SEC_ERROR_BAD_PASSWORD=The security password entered is incorrect. SEC_ERROR_RETRY_PASSWORD=New password entered incorrectly. Please try again. SEC_ERROR_NO_NODELOCK=security library: no nodelock. SEC_ERROR_BAD_DATABASE=security library: bad database. SEC_ERROR_NO_MEMORY=security library: memory allocation failure. SEC_ERROR_UNTRUSTED_ISSUER=Peer’s certificate issuer has been marked as not trusted by the user. SEC_ERROR_UNTRUSTED_CERT=Peer’s certificate has been marked as not trusted by the user. SEC_ERROR_DUPLICATE_CERT=Certificate already exists in your database. SEC_ERROR_DUPLICATE_CERT_NAME=Downloaded certificate’s name duplicates one already in your database. SEC_ERROR_ADDING_CERT=Error adding certificate to database. SEC_ERROR_FILING_KEY=Error refiling the key for this certificate. SEC_ERROR_NO_KEY=The private key for this certificate cannot be found in key database SEC_ERROR_CERT_VALID=This certificate is valid. SEC_ERROR_CERT_NOT_VALID=This certificate is not valid. SEC_ERROR_CERT_NO_RESPONSE=Cert Library: No Response SEC_ERROR_EXPIRED_ISSUER_CERTIFICATE=The certificate issuer’s certificate has expired. Check your system date and time. SEC_ERROR_CRL_EXPIRED=The CRL for the certificate’s issuer has expired. Update it or check your system date and time. SEC_ERROR_CRL_BAD_SIGNATURE=The CRL for the certificate’s issuer has an invalid signature. SEC_ERROR_CRL_INVALID=New CRL has an invalid format. SEC_ERROR_EXTENSION_VALUE_INVALID=Certificate extension value is invalid. SEC_ERROR_EXTENSION_NOT_FOUND=Certificate extension not found. SEC_ERROR_CA_CERT_INVALID=Issuer certificate is invalid. SEC_ERROR_PATH_LEN_CONSTRAINT_INVALID=Certificate path length constraint is invalid. SEC_ERROR_CERT_USAGES_INVALID=Certificate usages field is invalid. SEC_INTERNAL_ONLY=**Internal ONLY module** SEC_ERROR_INVALID_KEY=The key does not support the requested operation. SEC_ERROR_UNKNOWN_CRITICAL_EXTENSION=Certificate contains unknown critical extension. SEC_ERROR_OLD_CRL=New CRL is not later than the current one. SEC_ERROR_NO_EMAIL_CERT=Not encrypted or signed: you do not yet have an email certificate. SEC_ERROR_NO_RECIPIENT_CERTS_QUERY=Not encrypted: you do not have certificates for each of the recipients. SEC_ERROR_NOT_A_RECIPIENT=Cannot decrypt: you are not a recipient, or matching certificate and private key not found. SEC_ERROR_PKCS7_KEYALG_MISMATCH=Cannot decrypt: key encryption algorithm does not match your certificate. SEC_ERROR_PKCS7_BAD_SIGNATURE=Signature verification failed: no signer found, too many signers found, or improper or corrupted data. SEC_ERROR_UNSUPPORTED_KEYALG=Unsupported or unknown key algorithm. SEC_ERROR_DECRYPTION_DISALLOWED=Cannot decrypt: encrypted using a disallowed algorithm or key size. XP_SEC_FORTEZZA_BAD_CARD=Fortezza card has not been properly initialized. Please remove it and return it to your issuer. XP_SEC_FORTEZZA_NO_CARD=No Fortezza cards Found XP_SEC_FORTEZZA_NONE_SELECTED=No Fortezza card selected XP_SEC_FORTEZZA_MORE_INFO=Please select a personality to get more info on XP_SEC_FORTEZZA_PERSON_NOT_FOUND=Personality not found XP_SEC_FORTEZZA_NO_MORE_INFO=No more information on that Personality XP_SEC_FORTEZZA_BAD_PIN=Invalid Pin XP_SEC_FORTEZZA_PERSON_ERROR=Couldn’t initialize Fortezza personalities. SEC_ERROR_NO_KRL=No KRL for this site’s certificate has been found. SEC_ERROR_KRL_EXPIRED=The KRL for this site’s certificate has expired. SEC_ERROR_KRL_BAD_SIGNATURE=The KRL for this site’s certificate has an invalid signature. SEC_ERROR_REVOKED_KEY=The key for this site’s certificate has been revoked. SEC_ERROR_KRL_INVALID=New KRL has an invalid format. SEC_ERROR_NEED_RANDOM=security library: need random data. SEC_ERROR_NO_MODULE=security library: no security module can perform the requested operation. SEC_ERROR_NO_TOKEN=The security card or token does not exist, needs to be initialized, or has been removed. SEC_ERROR_READ_ONLY=security library: read-only database. SEC_ERROR_NO_SLOT_SELECTED=No slot or token was selected. SEC_ERROR_CERT_NICKNAME_COLLISION=A certificate with the same nickname already exists. SEC_ERROR_KEY_NICKNAME_COLLISION=A key with the same nickname already exists. SEC_ERROR_SAFE_NOT_CREATED=error while creating safe object SEC_ERROR_BAGGAGE_NOT_CREATED=error while creating baggage object XP_JAVA_REMOVE_PRINCIPAL_ERROR=Couldn’t remove the principal XP_JAVA_DELETE_PRIVILEGE_ERROR=Couldn’t delete the privilege XP_JAVA_CERT_NOT_EXISTS_ERROR=This principal doesn’t have a certificate SEC_ERROR_BAD_EXPORT_ALGORITHM=Required algorithm is not allowed. SEC_ERROR_EXPORTING_CERTIFICATES=Error attempting to export certificates. SEC_ERROR_IMPORTING_CERTIFICATES=Error attempting to import certificates. SEC_ERROR_PKCS12_DECODING_PFX=Unable to import. Decoding error. File not valid. SEC_ERROR_PKCS12_INVALID_MAC=Unable to import. Invalid MAC. Incorrect password or corrupt file. SEC_ERROR_PKCS12_UNSUPPORTED_MAC_ALGORITHM=Unable to import. MAC algorithm not supported. SEC_ERROR_PKCS12_UNSUPPORTED_TRANSPORT_MODE=Unable to import. Only password integrity and privacy modes supported. SEC_ERROR_PKCS12_CORRUPT_PFX_STRUCTURE=Unable to import. File structure is corrupt. SEC_ERROR_PKCS12_UNSUPPORTED_PBE_ALGORITHM=Unable to import. Encryption algorithm not supported. SEC_ERROR_PKCS12_UNSUPPORTED_VERSION=Unable to import. File version not supported. SEC_ERROR_PKCS12_PRIVACY_PASSWORD_INCORRECT=Unable to import. Incorrect privacy password. SEC_ERROR_PKCS12_CERT_COLLISION=Unable to import. Same nickname already exists in database. SEC_ERROR_USER_CANCELLED=The user pressed cancel. SEC_ERROR_PKCS12_DUPLICATE_DATA=Not imported, already in database. SEC_ERROR_MESSAGE_SEND_ABORTED=Message not sent. SEC_ERROR_INADEQUATE_KEY_USAGE=Certificate key usage inadequate for attempted operation. SEC_ERROR_INADEQUATE_CERT_TYPE=Certificate type not approved for application. SEC_ERROR_CERT_ADDR_MISMATCH=Address in signing certificate does not match address in message headers. SEC_ERROR_PKCS12_UNABLE_TO_IMPORT_KEY=Unable to import. Error attempting to import private key. SEC_ERROR_PKCS12_IMPORTING_CERT_CHAIN=Unable to import. Error attempting to import certificate chain. SEC_ERROR_PKCS12_UNABLE_TO_LOCATE_OBJECT_BY_NAME=Unable to export. Unable to locate certificate or key by nickname. SEC_ERROR_PKCS12_UNABLE_TO_EXPORT_KEY=Unable to export. Private Key could not be located and exported. SEC_ERROR_PKCS12_UNABLE_TO_WRITE=Unable to export. Unable to write the export file. SEC_ERROR_PKCS12_UNABLE_TO_READ=Unable to import. Unable to read the import file. SEC_ERROR_PKCS12_KEY_DATABASE_NOT_INITIALIZED=Unable to export. Key database corrupt or deleted. SEC_ERROR_KEYGEN_FAIL=Unable to generate public/private key pair. SEC_ERROR_INVALID_PASSWORD=Password entered is invalid. Please pick a different one. SEC_ERROR_RETRY_OLD_PASSWORD=Old password entered incorrectly. Please try again. SEC_ERROR_BAD_NICKNAME=Certificate nickname already in use. SEC_ERROR_NOT_FORTEZZA_ISSUER=Peer FORTEZZA chain has a non-FORTEZZA Certificate. SEC_ERROR_CANNOT_MOVE_SENSITIVE_KEY=A sensitive key cannot be moved to the slot where it is needed. SEC_ERROR_JS_INVALID_MODULE_NAME=Invalid module name. SEC_ERROR_JS_INVALID_DLL=Invalid module path/filename SEC_ERROR_JS_ADD_MOD_FAILURE=Unable to add module SEC_ERROR_JS_DEL_MOD_FAILURE=Unable to delete module SEC_ERROR_OLD_KRL=New KRL is not later than the current one. SEC_ERROR_CKL_CONFLICT=New CKL has different issuer than current CKL. Delete current CKL. SEC_ERROR_CERT_NOT_IN_NAME_SPACE=The Certifying Authority for this certificate is not permitted to issue a certificate with this name. SEC_ERROR_KRL_NOT_YET_VALID=The key revocation list for this certificate is not yet valid. SEC_ERROR_CRL_NOT_YET_VALID=The certificate revocation list for this certificate is not yet valid. SEC_ERROR_UNKNOWN_CERT=The requested certificate could not be found. SEC_ERROR_UNKNOWN_SIGNER=The signer’s certificate could not be found. SEC_ERROR_CERT_BAD_ACCESS_LOCATION=The location for the certificate status server has invalid format. SEC_ERROR_OCSP_UNKNOWN_RESPONSE_TYPE=The OCSP response cannot be fully decoded; it is of an unknown type. SEC_ERROR_OCSP_BAD_HTTP_RESPONSE=The OCSP server returned unexpected/invalid HTTP data. SEC_ERROR_OCSP_MALFORMED_REQUEST=The OCSP server found the request to be corrupted or improperly formed. SEC_ERROR_OCSP_SERVER_ERROR=The OCSP server experienced an internal error. SEC_ERROR_OCSP_TRY_SERVER_LATER=The OCSP server suggests trying again later. SEC_ERROR_OCSP_REQUEST_NEEDS_SIG=The OCSP server requires a signature on this request. SEC_ERROR_OCSP_UNAUTHORIZED_REQUEST=The OCSP server has refused this request as unauthorized. SEC_ERROR_OCSP_UNKNOWN_RESPONSE_STATUS=The OCSP server returned an unrecognizable status. SEC_ERROR_OCSP_UNKNOWN_CERT=The OCSP server has no status for the certificate. SEC_ERROR_OCSP_NOT_ENABLED=You must enable OCSP before performing this operation. SEC_ERROR_OCSP_NO_DEFAULT_RESPONDER=You must set the OCSP default responder before performing this operation. SEC_ERROR_OCSP_MALFORMED_RESPONSE=The response from the OCSP server was corrupted or improperly formed. SEC_ERROR_OCSP_UNAUTHORIZED_RESPONSE=The signer of the OCSP response is not authorized to give status for this certificate. SEC_ERROR_OCSP_FUTURE_RESPONSE=The OCSP response is not yet valid (contains a date in the future). SEC_ERROR_OCSP_OLD_RESPONSE=The OCSP response contains out-of-date information. SEC_ERROR_DIGEST_NOT_FOUND=The CMS or PKCS #7 Digest was not found in signed message. SEC_ERROR_UNSUPPORTED_MESSAGE_TYPE=The CMS or PKCS #7 Message type is unsupported. SEC_ERROR_MODULE_STUCK=PKCS #11 module could not be removed because it is still in use. SEC_ERROR_BAD_TEMPLATE=Could not decode ASN.1 data. Specified template was invalid. SEC_ERROR_CRL_NOT_FOUND=No matching CRL was found. SEC_ERROR_REUSED_ISSUER_AND_SERIAL=You are attempting to import a cert with the same issuer/serial as an existing cert, but that is not the same cert. SEC_ERROR_BUSY=NSS could not shutdown. Objects are still in use. SEC_ERROR_EXTRA_INPUT=DER-encoded message contained extra unused data. SEC_ERROR_UNSUPPORTED_ELLIPTIC_CURVE=Unsupported elliptic curve. SEC_ERROR_UNSUPPORTED_EC_POINT_FORM=Unsupported elliptic curve point form. SEC_ERROR_UNRECOGNIZED_OID=Unrecognized Object Identifier. SEC_ERROR_OCSP_INVALID_SIGNING_CERT=Invalid OCSP signing certificate in OCSP response. SEC_ERROR_REVOKED_CERTIFICATE_CRL=Certificate is revoked in issuer’s certificate revocation list. SEC_ERROR_REVOKED_CERTIFICATE_OCSP=Issuer’s OCSP responder reports certificate is revoked. SEC_ERROR_CRL_INVALID_VERSION=Issuer’s Certificate Revocation List has an unknown version number. SEC_ERROR_CRL_V1_CRITICAL_EXTENSION=Issuer’s V1 Certificate Revocation List has a critical extension. SEC_ERROR_CRL_UNKNOWN_CRITICAL_EXTENSION=Issuer’s V2 Certificate Revocation List has an unknown critical extension. SEC_ERROR_UNKNOWN_OBJECT_TYPE=Unknown object type specified. SEC_ERROR_INCOMPATIBLE_PKCS11=PKCS #11 driver violates the spec in an incompatible way. SEC_ERROR_NO_EVENT=No new slot event is available at this time. SEC_ERROR_CRL_ALREADY_EXISTS=CRL already exists. SEC_ERROR_NOT_INITIALIZED=NSS is not initialized. SEC_ERROR_TOKEN_NOT_LOGGED_IN=The operation failed because the PKCS#11 token is not logged in. SEC_ERROR_OCSP_RESPONDER_CERT_INVALID=Configured OCSP responder’s certificate is invalid. SEC_ERROR_OCSP_BAD_SIGNATURE=OCSP response has an invalid signature. SEC_ERROR_OUT_OF_SEARCH_LIMITS=Cert validation search is out of search limits SEC_ERROR_INVALID_POLICY_MAPPING=Policy mapping contains anypolicy SEC_ERROR_POLICY_VALIDATION_FAILED=Cert chain fails policy validation SEC_ERROR_UNKNOWN_AIA_LOCATION_TYPE=Unknown location type in cert AIA extension SEC_ERROR_BAD_HTTP_RESPONSE=Server returned bad HTTP response SEC_ERROR_BAD_LDAP_RESPONSE=Server returned bad LDAP response SEC_ERROR_FAILED_TO_ENCODE_DATA=Failed to encode data with ASN1 encoder SEC_ERROR_BAD_INFO_ACCESS_LOCATION=Bad information access location in cert extension SEC_ERROR_LIBPKIX_INTERNAL=Libpkix internal error occurred during cert validation. SEC_ERROR_PKCS11_GENERAL_ERROR=A PKCS #11 module returned CKR_GENERAL_ERROR, indicating that an unrecoverable error has occurred. SEC_ERROR_PKCS11_FUNCTION_FAILED=A PKCS #11 module returned CKR_FUNCTION_FAILED, indicating that the requested function could not be performed. Trying the same operation again might succeed. SEC_ERROR_PKCS11_DEVICE_ERROR=A PKCS #11 module returned CKR_DEVICE_ERROR, indicating that a problem has occurred with the token or slot. SEC_ERROR_BAD_INFO_ACCESS_METHOD=Unknown information access method in certificate extension. SEC_ERROR_CRL_IMPORT_FAILED=Error attempting to import a CRL. SEC_ERROR_EXPIRED_PASSWORD=The password expired. SEC_ERROR_LOCKED_PASSWORD=The password is locked. SEC_ERROR_UNKNOWN_PKCS11_ERROR=Unknown PKCS #11 error. SEC_ERROR_BAD_CRL_DP_URL=Invalid or unsupported URL in CRL distribution point name. SEC_ERROR_CERT_SIGNATURE_ALGORITHM_DISABLED=The certificate was signed using a signature algorithm that is disabled because it is not secure. MOZILLA_PKIX_ERROR_KEY_PINNING_FAILURE=The server uses key pinning (HPKP) but no trusted certificate chain could be constructed that matches the pinset. Key pinning violations cannot be overridden. MOZILLA_PKIX_ERROR_CA_CERT_USED_AS_END_ENTITY=The server uses a certificate with a basic constraints extension identifying it as a certificate authority. For a properly-issued certificate, this should not be the case. MOZILLA_PKIX_ERROR_INADEQUATE_KEY_SIZE=The server presented a certificate with a key size that is too small to establish a secure connection. MOZILLA_PKIX_ERROR_V1_CERT_USED_AS_CA=An X.509 version 1 certificate that is not a trust anchor was used to issue the server’s certificate. X.509 version 1 certificates are deprecated and should not be used to sign other certificates. MOZILLA_PKIX_ERROR_NOT_YET_VALID_CERTIFICATE=The server presented a certificate that is not yet valid. MOZILLA_PKIX_ERROR_NOT_YET_VALID_ISSUER_CERTIFICATE=A certificate that is not yet valid was used to issue the server’s certificate. MOZILLA_PKIX_ERROR_SIGNATURE_ALGORITHM_MISMATCH=The signature algorithm in the signature field of the certificate does not match the algorithm in its signatureAlgorithm field. MOZILLA_PKIX_ERROR_OCSP_RESPONSE_FOR_CERT_MISSING=The OCSP response does not include a status for the certificate being verified. MOZILLA_PKIX_ERROR_VALIDITY_TOO_LONG=The server presented a certificate that is valid for too long. MOZILLA_PKIX_ERROR_REQUIRED_TLS_FEATURE_MISSING=A required TLS feature is missing. MOZILLA_PKIX_ERROR_INVALID_INTEGER_ENCODING=The server presented a certificate that contains an invalid encoding of an integer. Common causes include negative serial numbers, negative RSA moduli, and encodings that are longer than necessary. MOZILLA_PKIX_ERROR_EMPTY_ISSUER_NAME=The server presented a certificate with an empty issuer distinguished name. ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/pipnss/pipnss.properties ================================================ # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. CertPassPrompt =%S のマスターパスワードを入力してください。 # the following strings have special requirements: # they must fit in a 32 or 64 byte buffer after being translated # to UTF8. Note to translator. It's not easy for you to figure # whether the escaped unicode string you produce will fit in # the space allocated. # # (^^; 日本語一字が 5 bytes になるハズで、すべての語を制限に収めるのは無理 # (^^; Unicode エスケープじゃなくなったので一字 3Byte になったハズだが、それでも一部無理。 # 64 bytes long after conversion to UTF8 RootCertModuleName =Builtin Roots Module # # 32 bytes long after conversion to UTF8 ManufacturerID =Mozilla.org # # 32 bytes long after conversion to UTF8 LibraryDescription =PSM Internal Crypto Services # # 32 bytes long after conversion to UTF8 TokenDescription =Generic Crypto Services # # 32 bytes long after conversion to UTF8 PrivateTokenDescription =Software Security Device # # 64 bytes long after conversion to UTF8 SlotDescription =PSM Internal Cryptographic Services # # 64 bytes long after conversion to UTF8 PrivateSlotDescription =PSM Private Keys # # 32 Fips140TokenDescription =Software Security Device (FIPS) # 64 Fips140SlotDescription =FIPS 140 Cryptographic, Key and Certificate Services # 32 InternalToken =Software Security Device # End of size restriction. VerifySSLClient =SSL クライアント証明書 VerifySSLServer =SSL サーバー証明書 VerifySSLCA =SSL 認証局 VerifyEmailSigner =メール署名者の証明書 VerifyEmailRecip =メール受信者の証明書 VerifyObjSign =オブジェクトへの署名者 HighGrade =高強度の暗号化 MediumGrade =中強度の暗号化 # LOCALIZATION NOTE (nick_template): $1s is the common name from a cert (e.g. "Mozilla"), $2s is the CA name (e.g. VeriSign) nick_template =%1$s の %2$s ID #These are the strings set for the ASN1 objects in a certificate. # (^^; CertDump.+ は下手にいじらない方が安全か... CertDumpCertificate =Certificate CertDumpVersion =Version # LOCALIZATION NOTE (CertDumpVersionValue): %S is a version number (e.g. "3" in "Version 3") CertDumpVersionValue =Version %S CertDumpSerialNo =Serial Number CertDumpMD2WithRSA =PKCS #1 MD2 With RSA Encryption CertDumpMD5WithRSA =PKCS #1 MD5 With RSA Encryption CertDumpSHA1WithRSA =PKCS #1 SHA-1 With RSA Encryption CertDumpSHA256WithRSA =PKCS #1 SHA-256 With RSA Encryption CertDumpSHA384WithRSA =PKCS #1 SHA-384 With RSA Encryption CertDumpSHA512WithRSA =PKCS #1 SHA-512 With RSA Encryption CertDumpDefOID =Object Identifier (%S) CertDumpIssuer =Issuer CertDumpSubject =Subject CertDumpAVACountry =C CertDumpAVAState =ST CertDumpAVALocality =L CertDumpAVAOrg =O CertDumpAVAOU =OU CertDumpAVACN =CN CertDumpUserID =UID CertDumpPK9Email =E CertDumpAVADN =DN CertDumpAVADC =DC CertDumpSurname =Surname CertDumpGivenName =Given Name CertDumpValidity =Validity CertDumpNotBefore =Not Before CertDumpNotAfter =Not After CertDumpSPKI =Subject Public Key Info CertDumpSPKIAlg =Subject Public Key Algorithm CertDumpAlgID =Algorithm Identifier CertDumpParams =Algorithm Parameters CertDumpRSAEncr =PKCS #1 RSA Encryption CertDumpRSAPSSSignature =PKCS #1 RSASSA-PSS Signature CertDumpRSATemplate =Modulus (%S bits):\n%S\nExponent (%S bits):\n%S CertDumpECTemplate =Key size: %S bits\nBase point order length: %S bits\nPublic value:\n%S CertDumpIssuerUniqueID =Issuer Unique ID CertDumpSubjPubKey =Subject’s Public Key CertDumpSubjectUniqueID =Subject Unique ID CertDumpExtensions =Extensions CertDumpSubjectDirectoryAttr =Certificate Subject Directory Attributes CertDumpSubjectKeyID =Certificate Subject Key ID CertDumpKeyUsage =Certificate Key Usage CertDumpSubjectAltName =Certificate Subject Alt Name CertDumpIssuerAltName =Certificate Issuer Alt Name CertDumpBasicConstraints =Certificate Basic Constraints CertDumpNameConstraints =Certificate Name Constraints CertDumpCrlDistPoints =CRL Distribution Points CertDumpCertPolicies =Certificate Policies CertDumpPolicyMappings =Certificate Policy Mappings CertDumpPolicyConstraints =Certificate Policy Constraints CertDumpAuthKeyID =Certificate Authority Key Identifier CertDumpExtKeyUsage =Extended Key Usage CertDumpAuthInfoAccess =Authority Information Access CertDumpAnsiX9DsaSignature =ANSI X9.57 DSA Signature CertDumpAnsiX9DsaSignatureWithSha1 =ANSI X9.57 DSA Signature with SHA1 Digest CertDumpAnsiX962ECDsaSignatureWithSha1 =ANSI X9.62 ECDSA Signature with SHA1 CertDumpAnsiX962ECDsaSignatureWithSha224 =ANSI X9.62 ECDSA Signature with SHA224 CertDumpAnsiX962ECDsaSignatureWithSha256 =ANSI X9.62 ECDSA Signature with SHA256 CertDumpAnsiX962ECDsaSignatureWithSha384 =ANSI X9.62 ECDSA Signature with SHA384 CertDumpAnsiX962ECDsaSignatureWithSha512 =ANSI X9.62 ECDSA Signature with SHA512 CertDumpKUSign =Signing CertDumpKUNonRep =Non-repudiation CertDumpKUEnc =Key Encipherment CertDumpKUDEnc =Data Encipherment CertDumpKUKA =Key Agreement CertDumpKUCertSign =Certificate Signer CertDumpKUCRLSigner =CRL Signer CertDumpCritical =Critical CertDumpNonCritical =Not Critical CertDumpSigAlg =Certificate Signature Algorithm CertDumpCertSig =Certificate Signature Value CertDumpExtensionFailure =Error: Unable to process extension CertDumpIsCA =Is a Certificate Authority CertDumpIsNotCA =Is not a Certificate Authority CertDumpPathLen =Maximum number of intermediate CAs: %S CertDumpPathLenUnlimited =unlimited CertDumpEKU_1_3_6_1_5_5_7_3_1 =TLS Web Server Authentication CertDumpEKU_1_3_6_1_5_5_7_3_2 =TLS Web Client Authentication CertDumpEKU_1_3_6_1_5_5_7_3_3 =Code Signing CertDumpEKU_1_3_6_1_5_5_7_3_4 =E-mail protection CertDumpEKU_1_3_6_1_5_5_7_3_8 =Time Stamping CertDumpEKU_1_3_6_1_5_5_7_3_9 =OCSP Signing CertDumpEKU_1_3_6_1_4_1_311_2_1_21 =Microsoft Individual Code Signing CertDumpEKU_1_3_6_1_4_1_311_2_1_22 =Microsoft Commercial Code Signing CertDumpEKU_1_3_6_1_4_1_311_10_3_1 =Microsoft Trust List Signing CertDumpEKU_1_3_6_1_4_1_311_10_3_2 =Microsoft Time Stamping CertDumpEKU_1_3_6_1_4_1_311_10_3_3 =Microsoft Server Gated Crypto CertDumpEKU_1_3_6_1_4_1_311_10_3_4 =Microsoft Encrypting File System CertDumpEKU_1_3_6_1_4_1_311_10_3_4_1 =Microsoft File Recovery CertDumpEKU_1_3_6_1_4_1_311_10_3_5 =Microsoft Windows Hardware Driver Verification CertDumpEKU_1_3_6_1_4_1_311_10_3_10 =Microsoft Qualified Subordination CertDumpEKU_1_3_6_1_4_1_311_10_3_11 =Microsoft Key Recovery CertDumpEKU_1_3_6_1_4_1_311_10_3_12 =Microsoft Document Signing CertDumpEKU_1_3_6_1_4_1_311_10_3_13 =Microsoft Lifetime Signing CertDumpEKU_1_3_6_1_4_1_311_20_2_2 =Microsoft Smart Card Logon CertDumpEKU_1_3_6_1_4_1_311_21_6 =Microsoft Key Recovery Agent CertDumpMSCerttype =Microsoft Certificate Template Name CertDumpMSNTPrincipal =Microsoft Principal Name CertDumpMSCAVersion =Microsoft CA Version CertDumpMSDomainGUID =Microsoft Domain GUID CertDumpEKU_2_16_840_1_113730_4_1 =Netscape Server Gated Crypto CertDumpRFC822Name =E-Mail Address CertDumpDNSName =DNS Name CertDumpX400Address =X.400 Address CertDumpDirectoryName =X.500 Name CertDumpEDIPartyName =EDI Party Name CertDumpURI =URI CertDumpIPAddress =IP Address CertDumpRegisterID =Registered OID CertDumpKeyID =Key ID CertDumpVerisignNotices =Verisign User Notices CertDumpUnused =Unused CertDumpKeyCompromise =Key Compromise CertDumpCACompromise =CA Compromise CertDumpAffiliationChanged =Affiliation Changed CertDumpSuperseded =Superseded CertDumpCessation =Cessation of Operation CertDumpHold =Certificate Hold CertDumpOCSPResponder =OCSP CertDumpCAIssuers =CA Issuers CertDumpCPSPointer =Certification Practice Statement pointer CertDumpUserNotice =User Notice CertDumpLogotype =Logotype CertDumpECPublicKey =Elliptic Curve Public Key CertDumpECDSAWithSHA1 =X9.62 ECDSA Signature with SHA1 CertDumpECprime192v1 =ANSI X9.62 elliptic curve prime192v1 (aka secp192r1, NIST P-192) CertDumpECprime192v2 =ANSI X9.62 elliptic curve prime192v2 CertDumpECprime192v3 =ANSI X9.62 elliptic curve prime192v3 CertDumpECprime239v1 =ANSI X9.62 elliptic curve prime239v1 CertDumpECprime239v2 =ANSI X9.62 elliptic curve prime239v2 CertDumpECprime239v3 =ANSI X9.62 elliptic curve prime239v3 CertDumpECprime256v1 =ANSI X9.62 elliptic curve prime256v1 (aka secp256r1, NIST P-256) CertDumpECsecp112r1 =SECG elliptic curve secp112r1 CertDumpECsecp112r2 =SECG elliptic curve secp112r2 CertDumpECsecp128r1 =SECG elliptic curve secp128r1 CertDumpECsecp128r2 =SECG elliptic curve secp128r2 CertDumpECsecp160k1 =SECG elliptic curve secp160k1 CertDumpECsecp160r1 =SECG elliptic curve secp160r1 CertDumpECsecp160r2 =SECG elliptic curve secp160r2 CertDumpECsecp192k1 =SECG elliptic curve secp192k1 CertDumpECsecp224k1 =SECG elliptic curve secp224k1 CertDumpECsecp224r1 =SECG elliptic curve secp224r1 (aka NIST P-224) CertDumpECsecp256k1 =SECG elliptic curve secp256k1 CertDumpECsecp384r1 =SECG elliptic curve secp384r1 (aka NIST P-384) CertDumpECsecp521r1 =SECG elliptic curve secp521r1 (aka NIST P-521) CertDumpECc2pnb163v1 =ANSI X9.62 elliptic curve c2pnb163v1 CertDumpECc2pnb163v2 =ANSI X9.62 elliptic curve c2pnb163v2 CertDumpECc2pnb163v3 =ANSI X9.62 elliptic curve c2pnb163v3 CertDumpECc2pnb176v1 =ANSI X9.62 elliptic curve c2pnb176v1 CertDumpECc2tnb191v1 =ANSI X9.62 elliptic curve c2tnb191v1 CertDumpECc2tnb191v2 =ANSI X9.62 elliptic curve c2tnb191v2 CertDumpECc2tnb191v3 =ANSI X9.62 elliptic curve c2tnb191v3 CertDumpECc2onb191v4 =ANSI X9.62 elliptic curve c2onb191v4 CertDumpECc2onb191v5 =ANSI X9.62 elliptic curve c2onb191v5 CertDumpECc2pnb208w1 =ANSI X9.62 elliptic curve c2pnb208w1 CertDumpECc2tnb239v1 =ANSI X9.62 elliptic curve c2tnb239v1 CertDumpECc2tnb239v2 =ANSI X9.62 elliptic curve c2tnb239v2 CertDumpECc2tnb239v3 =ANSI X9.62 elliptic curve c2tnb239v3 CertDumpECc2onb239v4 =ANSI X9.62 elliptic curve c2onb239v4 CertDumpECc2onb239v5 =ANSI X9.62 elliptic curve c2onb239v5 CertDumpECc2pnb272w1 =ANSI X9.62 elliptic curve c2pnb272w1 CertDumpECc2pnb304w1 =ANSI X9.62 elliptic curve c2pnb304w1 CertDumpECc2tnb359v1 =ANSI X9.62 elliptic curve c2tnb359v1 CertDumpECc2pnb368w1 =ANSI X9.62 elliptic curve c2pnb368w1 CertDumpECc2tnb431r1 =ANSI X9.62 elliptic curve c2tnb431r1 CertDumpECsect113r1 =SECG elliptic curve sect113r1 CertDumpECsect113r2 =SECG elliptic curve sect113r2 CertDumpECsect131r1 =SECG elliptic curve sect131r1 CertDumpECsect131r2 =SECG elliptic curve sect131r2 CertDumpECsect163k1 =SECG elliptic curve sect163k1 (aka NIST K-163) CertDumpECsect163r1 =SECG elliptic curve sect163r1 CertDumpECsect163r2 =SECG elliptic curve sect163r2 (aka NIST B-163) CertDumpECsect193r1 =SECG elliptic curve sect193r1 CertDumpECsect193r2 =SECG elliptic curve sect193r2 CertDumpECsect233k1 =SECG elliptic curve sect233k1 (aka NIST K-233) CertDumpECsect233r1 =SECG elliptic curve sect233r1 (aka NIST B-233) CertDumpECsect239k1 =SECG elliptic curve sect239k1 CertDumpECsect283k1 =SECG elliptic curve sect283k1 (aka NIST K-283) CertDumpECsect283r1 =SECG elliptic curve sect283r1 (aka NIST B-283) CertDumpECsect409k1 =SECG elliptic curve sect409k1 (aka NIST K-409) CertDumpECsect409r1 =SECG elliptic curve sect409r1 (aka NIST B-409) CertDumpECsect571k1 =SECG elliptic curve sect571k1 (aka NIST K-571) CertDumpECsect571r1 =SECG elliptic curve sect571r1 (aka NIST B-571) CertDumpRawBytesHeader =Size: %S Bytes / %S Bits PK11BadPassword =入力されたパスワードは正しくありません。 SuccessfulP12Backup =証明書と秘密鍵が正常にバックアップされました。 SuccessfulP12Restore =証明書と秘密鍵が正常に復元されました。 PKCS12DecodeErr =ファイルをデコードできませんでした。ファイルが PKCS #12 形式ではないか、破損しているか、あるいは入力されたパスワードが間違っています。 PKCS12UnknownErrRestore =原因不明の問題により PKCS #12 ファイルの復元に失敗しました。 PKCS12UnknownErrBackup =原因不明の問題により PKCS #12 バックアップファイルを作成できませんでした。 PKCS12UnknownErr =原因不明の問題により PKCS #12 の操作に失敗しました。 PKCS12InfoNoSmartcardBackup =スマートカードなどのハードウェアセキュリティデバイスからは証明書をバックアップできません。 PKCS12DupData =証明書と秘密鍵はすでにセキュリティデバイスに存在します。 AddModuleFailure =モジュールを追加できません AddModuleDup =セキュリティモジュールがすでに存在しています DelModuleWarning =このセキュリティモジュールを削除してもよろしいですか? DelModuleError =モジュールを削除できません AVATemplate =%S = %S PSMERR_SSL_Disabled =SSL プロトコルが無効になっているため、安全な接続ができませんでした。 PSMERR_SSL2_Disabled =サイトが古くて安全でないバージョンの SSL プロトコルを使用しているため、安全な接続ができませんでした。 PSMERR_HostReusedIssuerSerial =無効な証明書を受信しました。サーバー管理者またはメール送信者に次の情報を知らせてください:\n\nあなたのサーバー証明書は認証局によって発行された他の証明書と同じシリアル番号を持っています。一意なシリアル番号を持つ新しい証明書を取得してください。 SSLConnectionErrorPrefix =%S への接続中にエラーが発生しました。 certErrorIntro =%S は不正なセキュリティ証明書を使用しています。 certErrorTrust_SelfSigned =自己署名をしているためこの証明書は信頼されません。 certErrorTrust_UnknownIssuer =発行者の証明書が不明であるためこの証明書は信頼されません。 certErrorTrust_UnknownIssuer2 =サーバーが適正な中間証明書を送信しない可能性があります。 certErrorTrust_UnknownIssuer3 =追加のルート証明書をインポートする必要があるでしょう。 certErrorTrust_CaInvalid =不正な認証局の証明書で発行されているためこの証明書は信頼されません。 certErrorTrust_Issuer =発行者の証明書が信頼されていないためこの証明書は信頼されません。 certErrorTrust_SignatureAlgorithmDisabled =安全ではない署名アルゴリズムによって署名されているためこの証明書は信頼されません。 certErrorTrust_ExpiredIssuer =発行者の証明書が期限切れになっているためこの証明書は信頼されません。 # (^^; 条件分岐としては上記以外の default certErrorTrust_Untrusted =この証明書は信頼されている提供元から得られたものではありません。 certErrorMismatch =この証明書は %S には無効です。 # LOCALIZATION NOTE (certErrorMismatchSingle2): Do not translate %1$S certErrorMismatchSingle2 =この証明書は %1$S にだけ有効なものです。 certErrorMismatchSinglePlain =この証明書は %S にだけ有効なものです。 certErrorMismatchMultiple =この証明書は次のドメイン名にだけ有効なものです: # LOCALIZATION NOTE (certErrorExpiredNow): Do not translate %1$S (date+time of expired certificate) or %2$S (current date+time) certErrorExpiredNow =この証明書の有効期限は %1$S に切れています。現在時刻は %2$S です。 # LOCALIZATION NOTE (certErrorNotYetValidNow): Do not translate %1$S (date+time certificate will become valid) or %2$S (current date+time) certErrorNotYetValidNow =この証明書は %1$S まで有効になりません。現在時刻は %2$S です。 # LOCALIZATION NOTE (certErrorCodePrefix2): Do not translate %1$S certErrorCodePrefix2 =エラーコード: %1$S P12DefaultNickname =インポートされた証明書 CertUnknown =不明 CertNoEmailAddress =(メールアドレスなし) CaCertExists =この証明書はすでに認証局の証明書としてインストールされています。 NotACACert =この証明書は認証局の証明書ではないため、認証局の一覧には追加できません。 NotImportingUnverifiedCert =この証明書は有効性を検証できなかったため、インポートされません。この証明書は発行者が不明または信頼されていない、期限が切れているまたは失効している、あるいは承認されていません。 UserCertIgnoredNoPrivateKey =証明書の発行要求時に作成された秘密鍵がないため、この個人証明書をインストールできませんでした。 UserCertImported =個人証明書がインストールされました。この証明書のバックアップコピーをとっておくことをお勧めします。 CertOrgUnknown =(不明) CertNotStored =(保存されていません) # (^^; CertExceptionPermanent =恒久的 CertExceptionTemporary =一時的 ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/pipnss/security.properties ================================================ # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. Title = セキュリティ警告 MixedContentMessage = 要求したページは暗号化されていますが、暗号化されていない項目を含んでいます。あなたがこのページで表示や入力する情報は第三者が簡単に傍受できます。 LeaveSecureMessage = 暗号化されたページから去ろうとしています。今後送受信する情報は第三者が簡単に傍受できます。 EnterSecureMessage = 暗号化されたページを要求しています。このサイトの認証情報は正しく検証されており、あなたがこのページで表示や入力する情報は第三者が簡単に傍受できません。 WeakSecureMessage = 強度の低い暗号化を使用するページを要求しています。このサイトの識別情報は正しく検証されていますが、あなたがこのページで表示や入力する情報は第三者に傍受される可能性があります。 PostToInsecureFromSecureMessage = このページは暗号化されていますが、あなたがこのページで入力する情報は暗号化されていない接続を通して送られようとしており、第三者が簡単に傍受できます。 ## 本当にこの情報の送信を続けてもよろしいですか? ## PostToInsecureFromInsecureMessage = あなたが入力した情報は暗号化されていない接続を通して送信されようとしており、第三者が簡単に傍受できます。 ## 本当にこの情報の送信を続けてもよろしいですか? ## # browser/chrome/browser/preferences/securityWarnings.dtd と表現統一 MixedContentShowAgain = 暗号化されていない情報を含む暗号化ページを表示するときには毎回警告する LeaveSecureShowAgain = 暗号化されているページから暗号化されていないページに移るときには毎回警告する EnterSecureShowAgain = 暗号化されているページを表示するときには毎回警告する WeakSecureShowAgain = 強度の低い暗号化を使用しているページを表示するときには毎回警告する PostToInsecureFromInsecureShowAgain = 暗号化されていない情報を送信しようとしたときには毎回警告する SecurityButtonTooltipText = 現在のページのセキュリティ情報を表示する SecurityButtonMixedContentTooltipText = 警告: 安全性が確認できない項目が含まれています Continue = 続ける ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/pippki/certManager.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/pippki/deviceManager.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/pippki/pippki.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/pippki/pippki.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. CertPassPrompt =PSM 秘密鍵セキュリティデバイスのパスワードを入力してください。 # LOCALIZATION NOTE(certWithSerial): Used for semi-uniquely representing a cert. # %1$S is the serial number of the cert in AA:BB:CC hex format. certWithSerial =シリアル番号付きの証明書: %1$S # Download Cert dialog # LOCALIZATION NOTE(newCAMessage1): # %S is a string representative of the certificate being downloaded/imported. newCAMessage1 =“%S” が行う認証のうち、信頼するものを選択してください。 unnamedCA =名前のない認証局 # For editing cert trust editTrustCA =証明書 “%S” は認証局の証明書です # For Deleting Certificates deleteSslCertConfirm3 =これらのサーバー証明書の例外を削除してもよろしいですか? deleteSslCertImpact3 =サーバー証明書の例外を削除すると、サーバーのセキュリティを通常の手順で確認するようになり、各サーバーに有効な証明書が求められます。 deleteSslCertTitle3 =サーバー証明書の例外を削除 deleteUserCertConfirm =本当にこの証明書を削除してもよろしいですか? deleteUserCertImpact =あなたの証明書を削除すると、今後この証明書で個人認証ができなくなります。 deleteUserCertTitle =あなたの証明書を削除 deleteCaCertConfirm2 =この認証局 (CA) の証明書を削除しようとしています。削除すると組み込まれた証明書のすべての信頼性が失われます。本当にこの認証局証明書を削除するか信頼しない設定にしてもよろしいですか? deleteCaCertImpactX2 =認証局 (CA) の証明書を削除するか信頼しない場合、その認証局により発行されたすべての証明書が信頼されなくなります。 deleteCaCertTitle2 =認証局の証明書を削除または信頼しない deleteEmailCertConfirm =本当にこの人たちのメール証明書を削除してもよろしいですか? deleteEmailCertImpactDesc =メール証明書を削除すると、その人たちにメールを暗号化して送信できなくなります。 deleteEmailCertTitle =メール証明書を削除 deleteOrphanCertConfirm =本当にこれらの証明書を削除してもよろしいですか? deleteOrphanCertTitle =証明書を削除 # PKCS#12 file dialogs chooseP12RestoreFileDialog2 =インポートする証明書ファイル chooseP12BackupFileDialog =バックアップファイル名 file_browse_PKCS12_spec =PKCS12 のファイル getPKCS12FilePasswordMessage =この証明書のバックアップの暗号化に用いるパスワードを入力してください: # Cert verification certVerified =この証明書は以下の用途に使用する証明書であると検証されました: certNotVerified_CertRevoked =この証明書はすでに失効しているため、有効性を検証できませんでした。 certNotVerified_CertExpired =この証明書は期限が切れているため、有効性を検証できませんでした。 certNotVerified_CertNotTrusted =この証明書を信頼していないため、有効性を検証できませんでした。 certNotVerified_IssuerNotTrusted =発行者を信頼していないため、この証明書の有効性を検証できませんでした。 certNotVerified_IssuerUnknown =発行者が不明であるため、この証明書の有効性を検証できませんでした。 certNotVerified_CAInvalid =認証局の証明書が無効であるため、この証明書の有効性を検証できませんでした。 certNotVerified_AlgorithmDisabled =安全ではない署名アルゴリズムによって署名されているため、この証明書の有効性を検証できませんでした。 certNotVerified_Unknown =原因不明の問題により、この証明書の有効性を検証できませんでした。 # Client auth clientAuthRemember =今後も同様に処理する # LOCALIZATION NOTE(clientAuthNickAndSerial): Represents a single cert when the # user is choosing from a list of certificates. # %1$S is the nickname of the cert. # %2$S is the serial number of the cert in AA:BB:CC hex format. clientAuthNickAndSerial =%1$S [%2$S] # LOCALIZATION NOTE(clientAuthHostnameAndPort): # %1$S is the hostname of the server. # %2$S is the port of the server. clientAuthHostnameAndPort =%1$S:%2$S # LOCALIZATION NOTE(clientAuthMessage1): %S is the Organization of the server # cert. clientAuthMessage1 =組織: “%S” # LOCALIZATION NOTE(clientAuthMessage2): %S is the Organization of the issuer # cert of the server cert. clientAuthMessage2 =発行者: “%S” # LOCALIZATION NOTE(clientAuthIssuedTo): %1$S is the Distinguished Name of the # currently selected client cert, such as "CN=John Doe,OU=Example" (without # quotes). clientAuthIssuedTo =発行先: %1$S # LOCALIZATION NOTE(clientAuthSerial): %1$S is the serial number of the selected # cert in AA:BB:CC hex format. clientAuthSerial =シリアル番号: %1$S # LOCALIZATION NOTE(clientAuthValidityPeriod): # %1$S is the already localized notBefore date of the selected cert. # %2$S is the already localized notAfter date of the selected cert. clientAuthValidityPeriod =%1$S から %2$S まで有効 # LOCALIZATION NOTE(clientAuthKeyUsages): %1$S is a comma separated list of # already localized key usages the selected cert is valid for. clientAuthKeyUsages =鍵用途: %1$S # LOCALIZATION NOTE(clientAuthEmailAddresses): %1$S is a comma separated list of # e-mail addresses the selected cert is valid for. clientAuthEmailAddresses =メールアドレス: %1$S # LOCALIZATION NOTE(clientAuthIssuedBy): %1$S is the Distinguished Name of the # cert which issued the selected cert. clientAuthIssuedBy =発行者名: %1$S # LOCALIZATION NOTE(clientAuthStoredOn): %1$S is the name of the PKCS #11 token # the selected cert is stored on. clientAuthStoredOn =格納先: %1$S # Page Info pageInfo_NoEncryption =接続が暗号化されていません pageInfo_Privacy_None1 =ウェブサイト %S は表示中のページの暗号化をサポートしていません。 pageInfo_Privacy_None2 =暗号化せずにインターネットに送信された情報は他人に傍受される可能性があります。 pageInfo_Privacy_None4 =表示中のページは転送される前から暗号化されていません。 # LOCALIZATION NOTE (pageInfo_EncryptionWithBitsAndProtocol and pageInfo_BrokenEncryption): # %1$S is the name of the encryption standard, # %2$S is the key size of the cipher. # %3$S is protocol version like "SSL 3" or "TLS 1.2" pageInfo_EncryptionWithBitsAndProtocol =接続が暗号化されています (%1$S、鍵長 %2$S bit、%3$S) pageInfo_BrokenEncryption =脆弱な暗号化 (%1$S、鍵長 %2$S bit、%3$S) pageInfo_Privacy_Encrypted1 =表示中のページはインターネット上に送信される前に暗号化されています。 pageInfo_Privacy_Encrypted2 =暗号化によってコンピューター間の通信の傍受は困難になり、このページをネットワークで転送中に誰かにその内容をのぞき見られる可能性は低くなります。 pageInfo_MixedContent =一部の接続だけが暗号化されています pageInfo_MixedContent2 =表示しているページの一部はインターネットに転送される前に暗号化されていません。 pageInfo_WeakCipher =このウェブサイトへの接続に使用されている暗号は強度が弱くプライベートではありません。他者があなたの情報を見たりウェブサイトの動作を変更できます。 pageInfo_CertificateTransparency_None =このウェブサイトは Certificate Transparency 監査記録を提供しません。 pageInfo_CertificateTransparency_OK =このウェブサイトは公開監査可能な Certificate Transparency 記録を提供します。 pageInfo_CertificateTransparency_UnknownLog =このウェブサイトは Certificate Transparency 監査記録を求めていますが、記録の発行者が不明なため検証できません。 pageInfo_CertificateTransparency_Invalid =このウェブサイトは Certificate Transparency 監査記録を提供しますが、記録の検証に失敗しました。 # Cert Viewer # LOCALIZATION NOTE(certViewerTitle): Title used for the Certificate Viewer. # %1$S is a string representative of the certificate being viewed. certViewerTitle =証明書ビューアー: “%1$S” notPresent =<証明書に記載されていません> # Token Manager password_not_set =(設定なし) failed_pw_change =マスターパスワードを変更できませんでした。 incorrect_pw =入力されたマスターパスワードが正しくありません。再度確認してください。 pw_change_ok =マスターパスワードが正常に変更されました。 pw_erased_ok =警告! マスターパスワードが削除されました。 pw_not_wanted =警告! マスターパスワードが使用されません。 pw_empty_warning =ウェブとメールのパスワード、フォームのデータ、秘密鍵が保護されません。 pw_change2empty_in_fips_mode =現在 FIPS モードです。FIPS モードでは空のマスターパスワードは使えません。 login_failed =ログインに失敗しました loadPK11TokenDialog =読み込む PKCS#11 デバイスを選択してください devinfo_modname =モジュール devinfo_modpath =パス devinfo_label =ラベル devinfo_manID =製造元 devinfo_serialnum =シリアル番号 devinfo_hwversion =ハードウェアバージョン devinfo_fwversion =ファームウェアバージョン devinfo_status =状態 devinfo_desc =詳細説明 devinfo_stat_disabled =無効 devinfo_stat_notpresent =存在しない devinfo_stat_uninitialized =未初期化 devinfo_stat_notloggedin =未ログイン devinfo_stat_loggedin =ログイン済み devinfo_stat_ready =使用可能 enable_fips =FIPS を有効にする disable_fips =FIPS を無効にする fips_nonempty_password_required =FIPS モードではすべてのセキュリティデバイスにマスターパスワードが設定されている必要があります。FIPS モードを有効にする前に、パスワードを設定してください。 unable_to_toggle_fips =セキュリティデバイスの FIPS モードを変更できません。このアプリケーションを終了し、再起動してください。 resetPasswordConfirmationTitle =マスターパスワードのリセット resetPasswordConfirmationMessage =パスワードはリセットされました。 # Import certificate(s) file dialog importEmailCertPrompt =メール証明書を含むファイルを選択してください importCACertsPrompt =認証局証明書を含むファイルを選択してください file_browse_Certificate_spec =証明書ファイル # Cert export SaveCertAs =証明書をファイルに保存 CertFormatBase64 =X.509 証明書 (PEM) CertFormatBase64Chain =証明書パスを含む X.509 証明書 (PEM) CertFormatDER =X.509 証明書 (DER) CertFormatPKCS7 =X.509 証明書 (PKCS#7) CertFormatPKCS7Chain =証明書パスを含む X.509 証明書 (PKCS#7) writeFileFailure =ファイルエラー writeFileFailed =%S に書き込めませんでした:\n%S. writeFileAccessDenied =アクセスが拒否されました writeFileIsLocked =ファイルがロックされています writeFileNoDeviceSpace =デバイスの空き領域が不足しています writeFileUnknownError =不明なエラーです # (^^; 証明書ベースの表現にしたが information/identity などについて要再検討 # Add Security Exception dialog addExceptionBrandedWarning2 =%1$0.S例外的に信頼する証明書としてこのサイトの証明書を登録しようとしています。 addExceptionInvalidHeader =このサイトでは不正な証明書が使用されており、サイトの識別情報を確認できません。 addExceptionDomainMismatchShort =他のサイトの証明書です addExceptionDomainMismatchLong2 =他のサイト用の証明書が使われています。誰かがこのサイトを偽装しようとしています。 addExceptionExpiredShort =証明書の有効期限を過ぎています addExceptionExpiredLong2 =このサイトの証明書は現在有効ではありません。この証明書は盗難または紛失した可能性があり、誰かがこのサイトを偽装するために使用している可能性があります。 addExceptionUnverifiedOrBadSignatureShort =不明な証明書です addExceptionUnverifiedOrBadSignatureLong2 =安全な署名を使っている信頼できる認証局が発行されたものとして検証されていないため、このサイトの証明書は信頼されません。 addExceptionValidShort =有効な証明書です addExceptionValidLong =このサイトでは正しく検証された有効な証明書を使用しています。このサイトの証明書を例外として追加する必要はありません。 addExceptionCheckingShort =証明書を確認中 addExceptionCheckingLong2 =このサイトの識別情報を確認しています... addExceptionNoCertShort =証明書がありません addExceptionNoCertLong2 =このサイトを識別するための証明書を取得できませんでした pageInfo_CertificateTransparency_Compliant=This website complies with the Certificate Transparency policy. ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/pippki/validation.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/places/places.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. BookmarksMenuFolderTitle =ブックマークメニュー BookmarksToolbarFolderTitle =ブックマークツールバー OtherBookmarksFolderTitle =他のブックマーク TagsFolderTitle =タグ MobileBookmarksFolderTitle =モバイルのブックマーク # LOCALIZATION NOTE (dateName): # These are used to generate history containers when history is grouped by date finduri-AgeInDays-is-0 =今日 finduri-AgeInDays-is-1 =昨日 finduri-AgeInDays-is =%S 日前 finduri-AgeInDays-last-is =%S 日以内 finduri-AgeInDays-isgreater =%S 日以上前 finduri-AgeInMonths-is-0 =今月 finduri-AgeInMonths-isgreater =%S カ月以上前 # LOCALIZATION NOTE (finduri-MonthYear): # %1$S is the month name, %2$S is the year (4 digits format). #(^m^) %1$S: /toolkit/chrome/global/dateFormat.properties の month.*.name finduri-MonthYear =%2$S年%1$S # LOCALIZATION NOTE (localFiles): # This is used to generate local files container when history is grouped by site localhost =(ローカルファイル) # LOCALIZATION NOTE # The string is used for showing file size of each backup in the "fileRestorePopup" popup # %1$S is the file size # %2$S is the file size unit backupFileSizeText =%1$S %2$S ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/pluginproblem/pluginproblem.dtd ================================================ ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/services/errors.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. error.login.reason.network =サーバーへの接続に失敗しました error.login.reason.recoverykey =リカバリキーが間違っています error.login.reason.account =アカウント名もしくはパスワードが間違っています error.login.reason.no_username =アカウント名が入力されていません error.login.reason.no_password2 =パスワードが入力されていません error.login.reason.no_recoverykey =保存されているリカバリキーがありません error.login.reason.server =サーバーの設定が間違っています error.sync.failed_partial =ひとつあるいは複数の種類のデータを同期できませんでした # LOCALIZATION NOTE (error.sync.reason.serverMaintenance): We removed the extraneous period from this string error.sync.reason.serverMaintenance =Sync サーバーのメンテナンス中です。同期は自動的に再開します invalid-captcha =入力された単語が間違っています。再度入力してください weak-password =強度の高いパスワードを使用してください # this is the fallback, if we hit an error we didn't bother to localize error.reason.unknown =原因不明のエラー change.password.pwSameAsPassword =現在のパスワードと同じパスワードは使用できません change.password.pwSameAsUsername =ユーザー名と同じパスワードは使用できません change.password.pwSameAsEmail =メールアドレスと同じパスワードは使用できません change.password.mismatch =入力されたパスワードが一致しません change.password.tooShort =入力されたパスワードは短すぎます ================================================ FILE: langpacks/ja/chrome/ja/locale/ja/services/sync.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # %1: the user name (Ed), %2: the app name (Firefox), %3: the operating system (Android) client.name2 =%3$S 上で使用している %1$S の %2$S # %S is the date and time at which the last sync successfully completed lastSync2.label =最終更新日時: %S # signInToSync.description is the tooltip for the Sync buttons when Sync is # not configured. signInToSync.description =Sync にログインします error.sync.title =同期中にエラーが発生しました error.sync.description =Sync の同期中にエラーが発生しました: %1$S。この処理は自動的に再試行されます。 warning.sync.eol.label =サービスが終了します # %1: the app name (Firefox) warning.sync.eol.description =ご利用の Firefox Sync サービスは間もなく終了します。同期を維持するには %1$S をアップグレードしてください。 error.sync.eol.label =サービスが利用できません # %1: the app name (Firefox) error.sync.eol.description =Firefox Sync サービスは利用できなくなりました。同期を維持するには %1$S をアップグレードする必要があります。 sync.eol.learnMore.label =詳細情報 sync.eol.learnMore.accesskey =L syncnow.label =今すぐ同期 syncing2.label =同期中... ================================================ FILE: langpacks/ja/chrome/ja.manifest ================================================ locale alerts ja ja/locale/ja/alerts/ locale autoconfig ja ja/locale/ja/autoconfig/ locale global ja ja/locale/ja/global/ locale global-platform ja ja/locale/ja/global-platform/ locale mozapps ja ja/locale/ja/mozapps/ locale necko ja ja/locale/ja/necko/ locale passwordmgr ja ja/locale/ja/passwordmgr/ locale pipnss ja ja/locale/ja/pipnss/ locale pippki ja ja/locale/ja/pippki/ locale places ja ja/locale/ja/places/ locale pluginproblem ja ja/locale/ja/pluginproblem/ locale weave ja ja/locale/ja/ ================================================ FILE: langpacks/ja/chrome.manifest ================================================ manifest browser/chrome.manifest application=bluegriffon@bluegriffon.com manifest chrome/ja.manifest manifest bluegriffon/chrome.manifest application=bluegriffon@bluegriffon.com ================================================ FILE: langpacks/ja/install.rdf ================================================ Hiroki AbeMakoto AraiTomoya AsaiHideyuki EMURAShaw HosakaJoji IkedaMasahiko ImanakaKosuke KaizukaHidehiro KozawaTeiji MatsubaShigeki NarisawaTakeshi NishimuraToshiyuki OkaAtsushi SakaiHiroshi SekiyaYouhei TooyamaSatoru Yamaguchi bluegriffon@bluegriffon.com 3.2 3.2 ================================================ FILE: langpacks/ko/bluegriffon/chrome.manifest ================================================ locale bluegriffon ko base/locale/bluegriffon/ locale branding ko base/locale/branding/ locale fs ko extensions/fs/ locale gfd ko extensions/gfd/ locale cssproperties ko sidebars/cssproperties/ locale domexplorer ko sidebars/domexplorer/ locale scripteditor ko sidebars/scripteditor/ locale stylesheets ko sidebars/stylesheets/ locale tipoftheday ko extensions/tipoftheday/ locale aria ko sidebars/aria/ ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/branding/brand.dtd ================================================ ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/branding/brand.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. brandShorterName=Firefox brandShortName=Firefox Developer Edition brandFullName=Firefox Developer Edition vendorShortName=Mozilla syncBrandShortName=Sync ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/branding/browserconfig.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # Do NOT localize or otherwise change these values browser.startup.homepage=about:home ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/aboutAccounts.dtd ================================================ ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/aboutCertError.dtd ================================================ %brandDTD; 의 관리자가 웹사이트를 잘못 설정했습니다. 여러분의 정보가 탈취되는 것을 막기 위해 &brandShortName; 는 이 웹사이트에 접속하지 않았습니다."> 비록 현재 사이트를 신뢰한다고 하더라도 본 오류 코드는 연결 중 제3자가 침입했을 수 있기 때문입니다."> ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/aboutDialog.dtd ================================================ ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/aboutHealthReport.dtd ================================================ ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/aboutHome.dtd ================================================ %brandDTD; %syncBrandDTD; 주요 기능을 살펴 보시기 바랍니다."> 수천개 부가 기능에서 골라 보십시오."> 권리 읽기…"> ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/aboutPrivateBrowsing.dtd ================================================ ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/aboutPrivateBrowsing.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. title.head=사생활보호 브라우징 title.normal=사생활 보호 창을 여시겠습니까? ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/aboutRobots.dtd ================================================ ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/aboutSearchReset.dtd ================================================ ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/aboutSessionRestore.dtd ================================================ ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/aboutSyncTabs.dtd ================================================ ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/aboutTabCrashed.dtd ================================================ ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/accounts.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE (reconnectDescription) - %S = Email address of user's Firefox Account reconnectDescription = %S 다시 연결 # LOCALIZATION NOTE (verifyDescription) - %S = Email address of user's Firefox Account verifyDescription = %S 확인 # These strings are shown in a desktop notification after the # user requests we resend a verification email. verificationSentTitle = 인증을 보냄 # LOCALIZATION NOTE (verificationSentBody) - %S = Email address of user's Firefox Account verificationSentBody = %S로 인증 링크를 보냈습니다. verificationNotSentTitle = 인증을 보낼 수 없음 verificationNotSentBody = 지금 인증 메일을 보낼 수가 없습니다. 잠시 후에 다시 시도해 주세요. # LOCALIZATION NOTE (deviceConnectedTitle, deviceConnectedBody, deviceConnectedBody.noDeviceName) # These strings are used in a notification shown when a new device joins the Sync account. # deviceConnectedBody.noDeviceName is shown instead of deviceConnectedBody when we # could not get the device name that joined deviceConnectedTitle = Firefox Sync deviceConnectedBody = 이 컴퓨터는 지금 %S와 동기화되고 있습니다. # LOCALIZATION NOTE (syncStartNotification.title, syncStartNotification.body) # These strings are used in a notification shown after Sync is connected. syncStartNotification.title = Sync 켜짐 # %S is brandShortName syncStartNotification.body2 = %S가 곧 동기화를 시작합니다. # LOCALIZATION NOTE (deviceDisconnectedNotification.title, deviceDisconnectedNotification.body) # These strings are used in a notification shown after Sync was disconnected remotely. deviceDisconnectedNotification.title = 동기화 연결끊김 deviceDisconnectedNotification.body = 이 컴퓨터는 Firefox Sync에서 연결이 끊어졌습니다. # LOCALIZATION NOTE (sendTabToAllDevices.menuitem) # Displayed in the Send Tabs context menu when right clicking a tab, a page or a link. sendTabToAllDevices.menuitem = 모든 기기 # LOCALIZATION NOTE (tabArrivingNotification.title, tabArrivingNotificationWithDevice.title, # tabsArrivingNotification.title, unnamedTabsArrivingNotification2.body, # unnamedTabsArrivingNotificationMultiple2.body, unnamedTabsArrivingNotificationNoDevice.body) # These strings are used in a notification shown when we're opening tab(s) another device sent us to display. # LOCALIZATION NOTE (tabArrivingNotification.title, tabArrivingNotificationWithDevice.title) # The body for these is the URL of the tab recieved tabArrivingNotification.title = 전송 받은 탭 # LOCALIZATION NOTE (tabArrivingNotificationWithDevice.title) %S is the device name tabArrivingNotificationWithDevice.title = %S에 있는 탭 tabsArrivingNotification.title = 여러개의 탭 전송 받음 # LOCALIZATION NOTE (unnamedTabsArrivingNotification2.body): # Semi-colon list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 is the number of tabs received and #2 is the device name. unnamedTabsArrivingNotification2.body = #2에서 #1 탭이 도착 # LOCALIZATION NOTE (unnamedTabsArrivingNotificationMultiple2.body): # Semi-colon list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 is the number of tabs received. unnamedTabsArrivingNotificationMultiple2.body = 연결된 기기에서 #1 탭이 도착 # LOCALIZATION NOTE (unnamedTabsArrivingNotificationNoDevice.body): # Semi-colon list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 is the number of tabs received # This version is used when we don't know any device names. unnamedTabsArrivingNotificationNoDevice.body = #1 탭이 도착 deviceConnectedBody.noDeviceName = This computer is now syncing with a new device. ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/appstrings.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. malformedURI=URL이 유효하지 않아 페이지를 열 수 없습니다. fileNotFound=Firefox는 %S 파일을 찾을 수 없습니다. fileAccessDenied=%S에 있는 파일을 읽을 수 없습니다. dnsNotFound=Firefox는 %S 서버를 찾을 수 없습니다. unknownProtocolFound=프로토콜 %S 가운데 하나가 어떤 프로그램과도 연결되어 있지 않거나 이 컨텍스트에서 허용되어 있지 않기 때문에 주소를 열 수 없습니다. connectionFailure=%S 서버와 연결할 수 없습니다. netInterrupt=%S와(과)의 연결이 로딩 중에 끊어졌습니다. netTimeout=%S 서버의 응답이 너무 늦습니다. redirectLoop=이 주소에 대하여 완전하지 못한 방법의 연결 이동 요청이 감지되었습니다. ## LOCALIZATION NOTE (confirmRepostPrompt): In this item, don’t translate "%S" confirmRepostPrompt=현재 페이지를 표시하려면, %S가 이전에 수행했던 정보가 필요합니다. 이전에 수행했던 작업(검색 혹은 입력 양식 제출)을 다시 반복 합니다. resendButton.label=다시 보내기 unknownSocketType=이 서버와의 통신 방법을 알 수 없습니다. netReset=페이지 로딩 중 서버와의 연결이 초기화 되었습니다. notCached=현재 페이지는 더 이상 제공되지 않습니다. netOffline=오프라인 상태에서는 웹에 연결할 수 없습니다. isprinting=인쇄 중 또는 미리 보기에서는 문서를 수정할 수 없습니다. deniedPortAccess=이 주소가 일반적으로 웹이 아닌 다른 목적으로 사용되는 포트에 연결하려고 합니다. 보안상의 이유로 연결을 취소합니다. proxyResolveFailure=설정된 프록시 서버를 찾을 수 없습니다. proxyConnectFailure=프록시 서버에서 연결을 거부하도록 설정되어 있습니다. contentEncodingError=유효하지 않거나 지원하지 않는 압축 형식을 사용하므로 현재 페이지를 표시할 수 없습니다. unsafeContentType=현재 접속하고자 하는 페이지는 안전하지 않는 형식의 파일을 포함 하고 있습니다. 현재 문제에 대해 웹 사이트 관리자에게 알려 주십시오. externalProtocolTitle=외부 프로토콜 요청 externalProtocolPrompt=외부 프로그램은 %1$S: 링크에 의해 실행됩니다. \n\n\n요청 링크: %2$S\n프로그램: %3$S\n\n\n만약 이 요청이 사용자가 기대한 실행이 아니라면 다른 프로그램의 취약점을 공격하기 위한 시도일 수도 있습니다. 정상적인 요청으로 판단이 되지 않으면 취소를 선택하십시오. #LOCALIZATION NOTE (externalProtocolUnknown): The following string is shown if the application name can't be determined externalProtocolUnknown=<알 수 없음> externalProtocolChkMsg=이 형식의 모든 링크를 기록 externalProtocolLaunchBtn=프로그램 실행 malwareBlocked=%S에서 현재 웹 사이트를 공격 사이트로 판단하여 보안 설정에 따라 차단합니다. unwantedBlocked=%S에 있는 사이트가 원치않는 소프트웨어를 제공하고 있어서 보안설정에 의해 차단되었습니다. deceptiveBlocked=%S에 있는 웹 페이지가 가짜 사이트로 보고되어서 보안 설정에 의해 차단되었습니다. cspBlocked=이 페이지는 이 방법으로 로드되지 않도록 막는 콘텐츠 보안 정책을 가지고 있습니다. corruptedContentErrorv2=%S에 있는 사이트가 복구될 수 없는 네트워크 프로토콜 위반을 겪고 있습니다. remoteXUL=이 페이지는 Firefox에서 아직 지원하지 않는 기술을 사용하고 있습니다. ## LOCALIZATION NOTE (sslv3Used) - Do not translate "%S". sslv3Used=깨진 보안 프로토콜인 SSLv3를 사용하기 때문에 %S에 있는 데이터의 안정성을 Firefox는 보장할 수 없습니다. inadequateSecurityError=웹사이트가 불충분한 수준의 보안으로 연결을 시도했습니다. ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/baseMenuOverlay.dtd ================================================ ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/bookmarks.html ================================================ 북마크

      북마크

      북마크 도구 모음

      북마크 도구 모음에 표시할 북마크를 이 폴더에 추가하십시오.

      Firefox 시작하기

      Mozilla Firefox

      도움말 및 사용법
      나만의 Firefox 만들기
      사용자 모임 참여하기
      만든 사람들 소개
      ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/browser.dtd ================================================ 쿠키 삭제"> 방문기록 삭제"> 탭과 닫기"> ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/browser.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. nv_timeout=시간 초과 openFile=파일 열기 droponhometitle=홈 페이지로 설정 droponhomemsg=이 문서를 새로운 홈 페이지로 설정하시겠습니까? droponhomemsgMultiple=이 문서들을 새로운 홈페이지로 설정하시겠습니까? # context menu strings # LOCALIZATION NOTE (contextMenuSearch): %1$S is the search engine, # %2$S is the selection string. contextMenuSearch=%S 검색: "%S" contextMenuSearch.accesskey=S # bookmark dialog strings bookmarkAllTabsDefault=(폴더 이름) xpinstallPromptMessage=%S에서 이 사이트가 소프트웨어 설치를 할 것인지 물어보는 것을 막았습니다. xpinstallPromptMessage.dontAllow=허용하지 않음 xpinstallPromptMessage.dontAllow.accesskey=D xpinstallPromptAllowButton=허용 # Accessibility Note: # Be sure you do not choose an accesskey that is used elsewhere in the active context (e.g. main menu bar, submenu of the warning popup button) # See http://www.mozilla.org/access/keyboard/accesskey for details xpinstallPromptAllowButton.accesskey=A xpinstallDisabledMessageLocked=시스템 관리자로 인해 소프트웨어 설치 기능을 사용할 수 없습니다. xpinstallDisabledMessage=소프트웨어 설치 기능을 사용할 수 없습니다. 사용 허가를 선택한 후 다시 시도하십시오. xpinstallDisabledButton=사용 허가 xpinstallDisabledButton.accesskey=n # LOCALIZATION NOTE (webextPerms.header) # This string is used as a header in the webextension permissions dialog, # %S is replaced with the localized name of the extension being installed. # See https://bug1308309.bmoattachments.org/attachment.cgi?id=8814612 # for an example of the full dialog. # Note, this string will be used as raw markup. Avoid characters like <, >, & webextPerms.header=%S 추가? # LOCALIZATION NOTE (webextPerms.listIntro) # This string will be followed by a list of permissions requested # by the webextension. webextPerms.listIntro=다음의 권한 필요: webextPerms.add.label=추가 webextPerms.add.accessKey=A webextPerms.cancel.label=취소 webextPerms.cancel.accessKey=C # LOCALIZATION NOTE (webextPerms.sideloadMenuItem) # %1$S will be replaced with the localized name of the sideloaded add-on. # %2$S will be replace with the name of the application (e.g., Firefox, Nightly) webextPerms.sideloadMenuItem=%2$S에 %1$S 추가됨 # LOCALIZATION NOTE (webextPerms.sideloadHeader) # This string is used as a header in the webextension permissions dialog # when the extension is side-loaded. # %S is replaced with the localized name of the extension being installed. # Note, this string will be used as raw markup. Avoid characters like <, >, & webextPerms.sideloadHeader=%S 추가됨 webextPerms.sideloadEnable.label=활성화 webextPerms.sideloadEnable.accessKey=E # LOCALIZATION NOTE (webextPerms.updateMenuItem) # %S will be replaced with the localized name of the extension which # has been updated. webextPerms.updateMenuItem=%S 부가 기능이 새 권한을 요청 # LOCALIZATION NOTE (webextPerms.updateText) # %S is replaced with the localized name of the updated extension. # Note, this string will be used as raw markup. Avoid characters like <, >, & webextPerms.updateText=%S 부가 기능이 업데이트 되었습니다. 업데이트된 버전이 설치되기 전에 새 권한을 승인해야 합니다. “취소”를 누르면 현재 설치된 버전을 유지합니다. webextPerms.updateAccept.label=업데이트 webextPerms.updateAccept.accessKey=U webextPerms.description.bookmarks=즐겨찾기 읽고 수정 webextPerms.description.downloads=파일을 다운로드하고 브라우저의 다운로드 기록을 변경함 webextPerms.description.history=브라우징 기록에 접근함 # LOCALIZATION NOTE (webextPerms.description.nativeMessaging) # %S will be replaced with the name of the application webextPerms.description.nativeMessaging=%S 이외의 프로그램과 메시지를 주고 받음 webextPerms.description.notifications=알림을 표시 webextPerms.description.sessions=최근에 닫힌 탭에 접근 webextPerms.description.tabs=브라우저 탭에 접근 webextPerms.description.topSites=브라우징 기록에 접근 webextPerms.description.webNavigation=탐색중에 브라우저 활동에 접근 webextPerms.hostDescription.allUrls=모든 웹사이트에 대한 사용자 데이터에 접근 # LOCALIZATION NOTE (webextPerms.hostDescription.wildcard) # %S will be replaced by the DNS domain for which a webextension # is requesting access (e.g., mozilla.org) webextPerms.hostDescription.wildcard=%S 도메인 사이트에 대한 사용자 데이터에 접근 # LOCALIZATION NOTE (webextPerms.hostDescription.tooManyWildcards): # Semi-colon list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 will be replaced by an integer indicating the number of additional # domains for which this webextension is requesting permission. webextPerms.hostDescription.tooManyWildcards=다른 #1 개의 도메인에 대한 사용자 데이터에 접근 # LOCALIZATION NOTE (webextPerms.hostDescription.oneSite) # %S will be replaced by the DNS host name for which a webextension # is requesting access (e.g., www.mozilla.org) webextPerms.hostDescription.oneSite=%S에 대한 사용자 데이터에 접근 # LOCALIZATION NOTE (webextPerms.hostDescription.tooManySites) # Semi-colon list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 will be replaced by an integer indicating the number of additional # hosts for which this webextension is requesting permission. webextPerms.hostDescription.tooManySites=다른 #1 개의 사이트에 대한 사용자 데이터에 접근 # LOCALIZATION NOTE (addonPostInstall.message) # %1$S is replaced with the localized named of the extension that was # just installed. # %2$S is replaced with the localized name of the application. addonPostInstall.message1=%2$S에 %1$S 부가기능이 추가되었습니다. # LOCALIZATION NOTE (addonPostInstall.messageDetail) # %1$S is replaced with the icon for the add-ons menu. # %2$S is replaced with the icon for the toolbar menu. # Note, this string will be used as raw markup. Avoid characters like <, >, & addonPostInstall.okay.label=확인 addonPostInstall.okay.key=O # LOCALIZATION NOTE (addonDownloadingAndVerifying): # Semicolon-separated list of plural forms. See: # http://developer.mozilla.org/en/docs/Localization_and_Plurals # Also see https://bugzilla.mozilla.org/show_bug.cgi?id=570012 for mockups addonDownloadingAndVerifying=#1번째 부가 기능을 내려받아 검사하고 있습니다… addonDownloadVerifying=검사하는 중 addonInstall.unsigned=(검사하지 않았음) addonInstall.cancelButton.label=취소 addonInstall.cancelButton.accesskey=C addonInstall.acceptButton.label=설치 addonInstall.acceptButton.accesskey=I # LOCALIZATION NOTE (addonConfirmInstallMessage,addonConfirmInstallUnsigned): # Semicolon-separated list of plural forms. See: # http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 is brandShortName # #2 is the number of add-ons being installed addonConfirmInstall.message=이 사이트에서 #1에 부가 기능 #2개를 설치하려고 합니다: addonConfirmInstallUnsigned.message=경고: 이 사이트에서 #1에 검사를 받지 않은 부가기능 #2개를 설치하려고 합니다. 하실 거라면 위험을 무릅쓰고 하십시오. # LOCALIZATION NOTE (addonConfirmInstallSomeUnsigned.message): # Semicolon-separated list of plural forms. See: # http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 is brandShortName # #2 is the total number of add-ons being installed (at least 2) addonConfirmInstallSomeUnsigned.message=경고: 이 사이트에서 #1에 부가기능 #2개를 설치하려고 합니다. 여기엔 검사받지 않은 것도 섞여 있으니 하실 거라면 위험을 무릅쓰고 하십시오. addonwatch.slow=%1$S가 %2$S를 느리게 돌아가도록 만드는 것 같습니다 addonwatch.disable.label=%S 끄기 addonwatch.ignoreSession.label=지금만 무시하기 addonwatch.ignoreSession.accesskey=I addonwatch.ignorePerm.label=앞으로도 무시하기 addonwatch.ignorePerm.accesskey=p addonwatch.restart.message=%1$S를 끄려면 %2$S를 다시 시작해야 합니다 addonwatch.restart.label=%S 다시 시작 addonwatch.restart.accesskey=R # LOCALIZATION NOTE (addonsInstalled, addonsInstalledNeedsRestart): # Semicolon-separated list of plural forms. See: # http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 first add-on's name, #2 number of add-ons, #3 application name addonsInstalled=#1이 성공적으로 설치되었습니다.;#2 부가기능이 성공적으로 설치되었습니다. addonsInstalledNeedsRestart=#3를 재시작 한 후에 #1가 설치됩니다.;#3를 재시작 한 후에 #2 부가기능이 설치됩니다. addonInstallRestartButton=지금 다시 시작 addonInstallRestartButton.accesskey=R addonInstallRestartIgnoreButton=지금 안 함 addonInstallRestartIgnoreButton.accesskey=N # LOCALIZATION NOTE (addonInstallError-1, addonInstallError-2, addonInstallError-3, addonInstallError-4, addonInstallError-5, addonLocalInstallError-1, addonLocalInstallError-2, addonLocalInstallError-3, addonLocalInstallError-4, addonLocalInstallError-5): # %1$S is the application name, %2$S is the add-on name addonInstallError-1=연결 실패로 부가 기능을 내려받을 수 없습니다. addonInstallError-2=이 부가 기능은 %1$S가 찾고 있던 부가기능과 달라 설치할 수 없습니다. addonInstallError-3=내려받은 부가 기능 파일이 깨져있어 설치할 수 없습니다. addonInstallError-4=%1$S가 필요한 파일을 고칠 수 없어 %2$S를 설치할 수 없습니다. addonInstallError-5=%1$S가 이 사이트에서 검사받지 않은 부가 기능을 설치하지 못하게 막았습니다. addonLocalInstallError-1=이 부가 기능은 파일 시스템에서 잘못되어 설치할 수 없습니다. addonLocalInstallError-2=이 부가 기능은 %1$S가 찾고 있던 것과 다므르로 설치할 수 없습니다. addonLocalInstallError-3=이 부가 기능은 파일이 깨져서 설치할 수 없습니다. addonLocalInstallError-4=%1$S가 필요한 파일을 고칠 수 없어 %2$S를 설치할 수 없습니다. addonLocalInstallError-5=이 부가 기능은 검사를 받지 않았으므로 설치할 수 없습니다. # LOCALIZATION NOTE (addonInstallErrorIncompatible): # %1$S is the application name, %2$S is the application version, %3$S is the add-on name addonInstallErrorIncompatible=%3$S는 %1$S %2$S에서 돌아가지 않으므로 설치할 수 없습니다. # LOCALIZATION NOTE (addonInstallErrorBlocklisted): %S is add-on name addonInstallErrorBlocklisted=%S는 불안정하게 만들고 보안 문제를 일으킬 것으로 보여 설치할 수 없습니다. unsignedAddonsDisabled.message=검사할 수 없는 부가 기능이 나와 이를 모두 껐습니다. unsignedAddonsDisabled.learnMore.label=더 알아보기 unsignedAddonsDisabled.learnMore.accesskey=L # LOCALIZATION NOTE (compactLightTheme.name): This is displayed in about:addons -> Appearance compactLightTheme.name=Compact Light compactLightTheme.description=밝은 색상으로 이루어진 간결한 테마입니다. # LOCALIZATION NOTE (compactDarkTheme.name): This is displayed in about:addons -> Appearance compactDarkTheme.name=Compact Dark compactDarkTheme.description=어두운 색상으로 이루어진 간결한 테마입니다. # LOCALIZATION NOTE (lwthemeInstallRequest.message): %S will be replaced with # the host name of the site. lwthemeInstallRequest.message=이 사이트(%S)에서 테마를 설치하려고 합니다. lwthemeInstallRequest.allowButton=허가 lwthemeInstallRequest.allowButton.accesskey=a lwthemePostInstallNotification.message=새 테마를 설치하였습니다. lwthemePostInstallNotification.undoButton=실행 취소 lwthemePostInstallNotification.undoButton.accesskey=U lwthemePostInstallNotification.manageButton=테마 관리… lwthemePostInstallNotification.manageButton.accesskey=M # LOCALIZATION NOTE (lwthemeNeedsRestart.message): # %S will be replaced with the new theme name. lwthemeNeedsRestart.message=%S는 다시 시작한 후 설치 완료됩니다. lwthemeNeedsRestart.button=다시 시작하기 lwthemeNeedsRestart.accesskey=R # LOCALIZATION NOTE (popupWarning.message): Semicolon-separated list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 is brandShortName and #2 is the number of pop-ups blocked. popupWarning.message=#1가 이 사이트에서 팝업창 #2개를 차단하였습니다. popupWarningButton=설정 popupWarningButton.accesskey=O popupWarningButtonUnix=환경 설정 popupWarningButtonUnix.accesskey=P popupAllow=%S 팝업창 허가 popupBlock=%S 팝업창 차단 popupWarningDontShowFromMessage=팝업창이 차단될 때 메시지를 표시하지 않음 popupWarningDontShowFromLocationbar=팝업창이 차단될 때 주소창에 표시하지 않음 popupShowPopupPrefix='%S' 보이기 # Bad Content Blocker Doorhanger Notification # %S is brandShortName badContentBlocked.blocked.message=%S가 이 페이지의 콘텐츠를 차단했습니다. badContentBlocked.notblocked.message=%S는 이 페이지의 어떤 콘텐츠도 차단하지 않았습니다. crashedpluginsMessage.title=%S 플러그인이 충돌하였습니다. crashedpluginsMessage.reloadButton.label=페이지 갱신 crashedpluginsMessage.reloadButton.accesskey=R crashedpluginsMessage.submitButton.label=충돌 보고서 제출 crashedpluginsMessage.submitButton.accesskey=S crashedpluginsMessage.learnMore=자세히 보기… # Keyword fixup messages # LOCALIZATION NOTE (keywordURIFixup.message): Used when the user tries to visit # a local host page, by the time the DNS request recognizes it, we have already # loaded a search page for the given word. An infobar then asks to the user # whether he rather wanted to visit the host. %S is the recognized host. keywordURIFixup.message=%S로 이동하시겠습니까? keywordURIFixup.goTo=예, %S로 이동합니다 keywordURIFixup.goTo.accesskey=Y keywordURIFixup.dismiss=아니요 keywordURIFixup.dismiss.accesskey=N ## Plugin doorhanger strings # LOCALIZATION NOTE (pluginActivateNew.message): Used for newly-installed # plugins which are not known to be unsafe. %1$S is the plugin name and %2$S # is the site domain. pluginActivateNew.message=%2$S에서 "%1$S"를 실행하는 것을 허가하시겠습니까? pluginActivateMultiple.message=%S에서 플러그인을 실행하는 것을 허가하시겠습니까? pluginActivate.learnMore=더 알아보기… # LOCALIZATION NOTE (pluginActivateOutdated.message, pluginActivateOutdated.label): # These strings are used when an unsafe plugin has an update available. # %1$S is the plugin name, %2$S is the domain, and %3$S is brandShortName. pluginActivateOutdated.message=%3$S가 낡은 "%1$S" 플러그인이 %2$S에서 실행되는 것을 차단했습니다. pluginActivateOutdated.label=낡은 플러그인 pluginActivate.updateLabel=지금 업데이트… # LOCALIZATION NOTE (pluginActivateVulnerable.message, pluginActivateVulnerable.label): # These strings are used when an unsafe plugin has no update available. # %1$S is the plugin name, %2$S is the domain, and %3$S is brandShortName. pluginActivateVulnerable.message=%3$S가 안전하지 않은 "%1$S" 플러그인이 %2$S에서 실행되는 것을 차단했습니다. pluginActivateVulnerable.label=보안상 취약한 플러그인! pluginActivate.riskLabel=무엇이 위험합니까? # LOCALIZATION NOTE (pluginActivateBlocked.message): %1$S is the plugin name, %2$S is brandShortName pluginActivateBlocked.message=%2$S가 여러분을 보호하기 위해 "%1$S"를 막았습니다. pluginActivateBlocked.label=여러분을 보호하기 위해 막음 pluginActivateDisabled.message="%S"이 비활성화되어 있습니다. pluginActivateDisabled.label=비활성화됨 pluginActivateDisabled.manage=플러그인 관리… pluginEnabled.message="%1$S"가 %2$S에서 활성화되어 있습니다. pluginEnabledOutdated.message=낡은 "%1$S" 플러그인이 %2$S에서 활성화되어 있습니다. pluginEnabledVulnerable.message=%2$S에서 안전하지 않은 "%1$S" 플러그인이 활성화되어 있습니다. pluginInfo.unknownPlugin=알 수 없음 # LOCALIZATION NOTE (pluginActivateNow.label, pluginActivateAlways.label, pluginBlockNow.label): These should be the same as the matching strings in browser.dtd # LOCALIZATION NOTE (pluginActivateNow.label): This button will enable the # plugin in the current session for an short time (about an hour), auto-renewed # if the site keeps using the plugin. pluginActivateNow.label=지금만 허가 pluginActivateNow.accesskey=N # LOCALIZATION NOTE (pluginActivateAlways.label): This button will enable the # plugin for a long while (90 days), auto-renewed if the site keeps using the # plugin. pluginActivateAlways.label=허가하고 기억 pluginActivateAlways.accesskey=R pluginBlockNow.label=플러그인 차단 pluginBlockNow.accesskey=B pluginContinue.label=계속 허가 pluginContinue.accesskey=C # in-page UI PluginClickToActivate=%S을 활성화합니다. PluginVulnerableUpdatable=이 플러그인은 보안상 취약하며 업데이트를 해야 합니다. PluginVulnerableNoUpdate=이 플러그인은 여러 보안 취약점이 있습니다. # infobar UI pluginContinueBlocking.label=계속 차단 pluginContinueBlocking.accesskey=B # LOCALIZATION NOTE (pluginActivateTrigger): Use the unicode ellipsis char, \u2026, # or use "..." if \u2026 doesn't suit traditions in your locale. pluginActivateTrigger.label=허가… pluginActivateTrigger.accesskey=A # Sanitize # LOCALIZATION NOTE (sanitizeDialog2.everything.title): When "Time range to # clear" is set to "Everything", the Clear Recent History dialog's title is # changed to this. See UI mockup and comment 11 at bug 480169 --> sanitizeDialog2.everything.title=모든 기록 삭제 sanitizeButtonOK=지금 삭제 # LOCALIZATION NOTE (sanitizeButtonClearing): The label for the default # button between the user clicking it and the window closing. Indicates the # items are being cleared. sanitizeButtonClearing=삭제하고 있음 # LOCALIZATION NOTE (sanitizeEverythingWarning2): Warning that appears when # "Time range to clear" is set to "Everything" in Clear Recent History dialog, # provided that the user has not modified the default set of history items to clear. sanitizeEverythingWarning2=모든 방문 기록이 삭제됩니다. # LOCALIZATION NOTE (sanitizeSelectedWarning): Warning that appears when # "Time range to clear" is set to "Everything" in Clear Recent History dialog, # provided that the user has modified the default set of history items to clear. sanitizeSelectedWarning=선택 항목의 방문 기록이 삭제됩니다. # LOCALIZATION NOTE (downloadAndInstallButton.label): %S is replaced by the # version of the update: "Update to 28.0". update.downloadAndInstallButton.label=%S으로 업데이트 update.downloadAndInstallButton.accesskey=U menuOpenAllInTabs.label=탭으로 모두 열기 # History menu menuRestoreAllTabs.label=모든 탭 복원 # LOCALIZATION NOTE (menuRestoreAllTabsSubview.label): like menuRestoreAllTabs.label, # but used in the history subview in the panel UI, so needs to mention these are *closed* tabs. menuRestoreAllTabsSubview.label=닫은 탭 복원 # LOCALIZATION NOTE (menuRestoreAllWindows, menuUndoCloseWindowLabel, menuUndoCloseWindowSingleTabLabel): # see bug 394759 menuRestoreAllWindows.label=모든 창 복원 # LOCALIZATION NOTE (menuRestoreAllWindowsSubview.label): like menuRestoreAllWindows.label, # but used in the history subview in the panel UI, so needs to mention these are *closed* windows. menuRestoreAllWindowsSubview.label=닫은 창 복원 # LOCALIZATION NOTE (menuUndoCloseWindowLabel): Semicolon-separated list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 Window Title, #2 Number of tabs menuUndoCloseWindowLabel=#1 (#2 다른 탭) menuUndoCloseWindowSingleTabLabel=#1 # Unified Back-/Forward Popup tabHistory.current=현재 페이지 tabHistory.goBack=현재 페이지 뒤로 가기 tabHistory.goForward=현재 페이지 앞으로 가기 # URL Bar pasteAndGo.label=붙여넣고 바로 가기 # LOCALIZATION NOTE(urlbar-zoom-button.label): %S is the current zoom level, # %% will be displayed as a single % character (% is commonly used to define # format specifiers, so it needs to be escaped). urlbar-zoom-button.label = %S%% # Block autorefresh refreshBlocked.goButton=허가 refreshBlocked.goButton.accesskey=A refreshBlocked.refreshLabel=%S가 현재 페이지를 자동적으로 읽지 않도록 차단했습니다. refreshBlocked.redirectLabel=%S가 현재 페이지에서 다른 페이지로 자동으로 바뀌는 것을 차단했습니다. # General bookmarks button # LOCALIZATION NOTE (bookmarksMenuButton.tooltip): # %S is the keyboard shortcut for "Show All Bookmarks" bookmarksMenuButton.tooltip=북마크 보기(%S) # Star button starButtonOn.tooltip2=북마크 편집 (%S) starButtonOff.tooltip2=북마크 추가 (%S) starButtonOverflowed.label=북마크 추가 starButtonOverflowedStarred.label=북마크 편집 # Downloads button tooltip # LOCALIZATION NOTE (downloads.tooltip): # %S is the keyboard shortcut for "Downloads" downloads.tooltip=진행 중인 다운로드 상태 표시 (%S) # Print button tooltip on OS X # LOCALIZATION NOTE (printButton.tooltip): # Use the unicode ellipsis char, \u2026, # or use "..." if \u2026 doesn't suit traditions in your locale. # %S is the keyboard shortcut for "Print" printButton.tooltip=현재 페이지 인쇄… (%S) # New Window button tooltip # LOCALIZATION NOTE (newWindowButton.tooltip): # %S is the keyboard shortcut for "New Window" newWindowButton.tooltip=새 창 열기 (%S) # New Tab button tooltip # LOCALIZATION NOTE (newTabButton.tooltip): # %S is the keyboard shortcut for "New Tab" newTabButton.tooltip=새 탭 열기 (%S) # Offline web applications offlineApps.available2=%S 컴퓨터 데이터 저장을 허용하시겠습니까? offlineApps.allowStoring.label=데이터 저장 허용 offlineApps.allowStoring.accesskey=A offlineApps.dontAllow.label=허용하지 않음 offlineApps.dontAllow.accesskey=n offlineApps.usage=인터넷에 연결되지 않았을 때도 현재 웹 사이트(%S)를 이용할 수 있도록 하기 위하여 %SMB 이상의 저장 공간을 사용합니다. offlineApps.manageUsage=설정 보기 offlineApps.manageUsageAccessKey=S identity.identified.verifier=인증 기관: %S identity.identified.verified_by_you=이 사이트를 보안 예외로 추가하였습니다. identity.identified.state_and_country=%S, %S identity.icon.tooltip=사이트 정보 보기 trackingProtection.intro.title=추적 보호 작동 원리 # LOCALIZATION NOTE (trackingProtection.intro.description2): # %S is brandShortName. This string should match the one from Step 1 of the tour # when it starts from the button shown when a new private window is opened. trackingProtection.intro.description2=방패가 나타나면 %S가 사용자 탐색 활동을 추적할 수 있는 페이지의 일부분을 차단했다는 것을 의미합니다. # LOCALIZATION NOTE (trackingProtection.intro.step1of3): Indicates that the intro panel is step one of three in a tour. trackingProtection.intro.step1of3=3개 중 1 trackingProtection.intro.nextButton.label=다음 trackingProtection.icon.activeTooltip=추적 시도 차단됨 trackingProtection.icon.disabledTooltip=추적 콘텐츠 감지됨 # Edit Bookmark UI editBookmarkPanel.pageBookmarkedTitle=문서 북마크 editBookmarkPanel.pageBookmarkedDescription=%S는 항상 이 문서를 기억하게 됩니다. editBookmarkPanel.bookmarkedRemovedTitle=북마크 제거 editBookmarkPanel.editBookmarkTitle=북마크 편집 # LOCALIZATION NOTE (editBookmark.removeBookmarks.label): Semicolon-separated list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # Replacement for #1 is the number of bookmarks to be removed. # If this causes problems with localization you can also do "Remove Bookmarks (#1)" # instead of "Remove #1 Bookmarks". editBookmark.removeBookmarks.label=#1개 북마크 삭제 # Post Update Notifications pu.notifyButton.label=자세히… pu.notifyButton.accesskey=D # LOCALIZATION NOTE %S will be replaced by the short name of the application. puNotifyText=%S 업데이트 완료하였습니다. puAlertTitle=%S 업데이트 완료 puAlertText=상세 정보를 확인하시려면 선택하세요. # Geolocation UI geolocation.allowLocation=위치 정보 접근 허용 geolocation.allowLocation.accesskey=A geolocation.dontAllowLocation=허용하지 않음 geolocation.dontAllowLocation.accesskey=n geolocation.shareWithSite3=%S의 위치 정보 접근을 허용하시겠습니까? geolocation.shareWithFile3=이 로컬 파일이 위치 정보에 접근하는 것을 허용하시겠습니까? geolocation.remember=이 결정 저장 webNotifications.remember=이 결정 저장 webNotifications.rememberForSession=이 세션에 대해 이 결정 저장 webNotifications.allow=알림 허용 webNotifications.allow.accesskey=A webNotifications.dontAllow=허용하지 않음 webNotifications.dontAllow.accesskey=n webNotifications.receiveFromSite2=%S의 알림 전송을 허용하시겠습니까? # LOCALIZATION NOTE (webNotifications.upgradeTitle): When using native notifications on OS X, the title may be truncated around 32 characters. webNotifications.upgradeTitle=개선된 알림 # LOCALIZATION NOTE (webNotifications.upgradeBody): When using native notifications on OS X, the body may be truncated around 100 characters in some views. webNotifications.upgradeBody=현재 로드되지 않은 사이트에서도 이제 알림을 받을 수 있습니다. 클릭해서 자세히 알아 보세요. # Phishing/Malware Notification Bar. # LOCALIZATION NOTE (notADeceptiveSite, notAnAttack) # The two button strings will never be shown at the same time, so # it's okay for them to have the same access key safebrowsing.getMeOutOfHereButton.label=밖으로 나가기! safebrowsing.getMeOutOfHereButton.accessKey=G safebrowsing.deceptiveSite=사기 사이트! safebrowsing.notADeceptiveSiteButton.label=이 사이트는 사기 사이트가 아닙니다… safebrowsing.notADeceptiveSiteButton.accessKey=D safebrowsing.reportedAttackSite=보고된 공격 사이트! safebrowsing.notAnAttackButton.label=공격 사이트 아님… safebrowsing.notAnAttackButton.accessKey=A safebrowsing.reportedUnwantedSite=원하지않는 소프트웨어 사이트로 알려져 있습니다! # Ctrl-Tab # LOCALIZATION NOTE (ctrlTab.listAllTabs.label): #1 represents the number # of tabs in the current browser window. It will always be 2 at least. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals ctrlTab.listAllTabs.label=#1개 탭의 목록 보기 # LOCALIZATION NOTE (addKeywordTitleAutoFill): %S will be replaced by the page's title # Used as the bookmark name when saving a keyword for a search field. addKeywordTitleAutoFill=검색: %S extensions.{972ce4c6-7e08-4474-a285-3208198ce6fd}.name=기본 extensions.{972ce4c6-7e08-4474-a285-3208198ce6fd}.description=표준 설정 테마입니다. # safeModeRestart safeModeRestartPromptTitle=부가 기능 중지 후 다시 시작 safeModeRestartPromptMessage=모든 부가 기능을 사용 하지 않은 상태로 만든 후 다시 시작하시겠습니까? safeModeRestartButton=다시 시작 # LOCALIZATION NOTE (browser.menu.showCharacterEncoding): Set to the string # "true" (spelled and capitalized exactly that way) to show the "Text # Encoding" menu in the main Firefox button on Windows. Any other value will # hide it. Regardless of the value of this setting, the "Text Encoding" # menu will always be accessible via the "Web Developer" menu. # This is not a string to translate; it just controls whether the menu shows # up in the Firefox button. If users frequently use the "Text Encoding" # menu, set this to "true". Otherwise, you can leave it as "false". browser.menu.showCharacterEncoding=true # Mozilla data reporting notification (Telemetry, Firefox Health Report, etc) dataReportingNotification.message = 여러분이 보다 나은 경험을 할 수 있도록 %1$S는 %2$S에 자동으로 일부 데이터를 전송합니다. dataReportingNotification.button.label = 공유할 데이터 선택 dataReportingNotification.button.accessKey = C # Process hang reporter processHang.label = 당신의 브라우저를 느려지게 만드는 웹페이지가 있습니다. 무엇을 하시겠습니까? processHang.button_stop.label = 중지 processHang.button_stop.accessKey = S processHang.button_wait.label = 대기 processHang.button_wait.accessKey = W processHang.button_debug.label = 스크립트 디버그 processHang.button_debug.accessKey = D # LOCALIZATION NOTE (fullscreenButton.tooltip): %S is the keyboard shortcut for full screen fullscreenButton.tooltip=창을 화면 전체에 표시하기 (%S) service.toolbarbutton.label=서비스 service.toolbarbutton.tooltiptext=서비스 # LOCALIZATION NOTE (social.install.description): %1$S is the hostname of the social provider, %2$S is brandShortName (e.g. Firefox) service.install.description=%1$S의 서비스를 활성화하여 %2$S의 도구모음과 사이드바에 보이시겠습니까? service.install.ok.label=서비스 활성화 service.install.ok.accesskey=E # LOCALIZATION NOTE (social.markpageMenu.label): %S is the name of the social provider social.markpageMenu.label=페이지 %S에 올리기 # LOCALIZATION NOTE (social.marklinkMenu.label): %S is the name of the social provider social.marklinkMenu.label=링크 %S에 올리기 # LOCALIZATION NOTE (social.error.message): %1$S is brandShortName (e.g. Firefox), %2$S is the name of the social provider social.error.message=%1$S가 지금 %2$S에 연결할 수 없습니다. social.error.tryAgain.label=다시 시도 social.error.tryAgain.accesskey=T social.error.closeSidebar.label=탐색창 닫기 social.error.closeSidebar.accesskey=C # LOCALIZATION NOTE: %1$S is the label for the toolbar button, %2$S is the associated badge numbering that the social provider may provide. social.aria.toolbarButtonBadgeText=%1$S (%2$S) # LOCALIZATION NOTE (getUserMedia.shareCamera2.message, # getUserMedia.shareMicrophone2.message, # getUserMedia.shareScreen3.message, # getUserMedia.shareCameraAndMicrophone2.message, # getUserMedia.shareCameraAndAudioCapture2.message, # getUserMedia.shareScreenAndMicrophone3.message, # getUserMedia.shareScreenAndAudioCapture3.message, # getUserMedia.shareAudioCapture2.message): # %S is the website origin (e.g. www.mozilla.org) getUserMedia.shareCamera2.message = %S의 카메라 사용을 허용하시겠습니까? getUserMedia.shareMicrophone2.message = %S의 마이크 사용을 허용하시겠습니까? getUserMedia.shareScreen3.message = %S의 화면 보기를 허용하시겠습니까? getUserMedia.shareCameraAndMicrophone2.message = %S의 카메라와 마이크 사용을 허용하시겠습니까? getUserMedia.shareCameraAndAudioCapture2.message = %S의 카메라 사용과 탭의 소리 듣기를 허용하시겠습니까? getUserMedia.shareScreenAndMicrophone3.message = %S의 마이크와 화면 보기를 허용하시겠습니까? getUserMedia.shareScreenAndAudioCapture3.message = %S의 이 탭의 소리 듣기와 화면 보기를 허용하시겠습니까? getUserMedia.shareAudioCapture2.message = %S의 이 탭의 소리 듣기를 허용하시겠습니까? # LOCALIZATION NOTE (getUserMedia.shareScreenWarning.message): NB: inserted via innerHTML, so please don't use <, > or & in this string. # %S will be the 'learn more' link getUserMedia.shareScreenWarning.message = 신뢰할 수 있는 사이트에서만 화면을 공유하십시오. 화면 공유는 의심되는 사이트가 당신을 사칭하고 개인 정보를 빼앗아갈 수 있게 합니다. %S # LOCALIZATION NOTE (getUserMedia.shareFirefoxWarning.message): NB: inserted via innerHTML, so please don't use <, > or & in this string. # %1$S is brandShortName (eg. Firefox) # %2$S will be the 'learn more' link getUserMedia.shareFirefoxWarning.message = 신뢰할 수 있는 %1$S 사이트에서만 화면을 공유하십시오. 화면 공유는 의심되는 사이트가 당신을 사칭하고 개인 정보를 빼앗아갈 수 있게 합니다. %2$S # LOCALIZATION NOTE(getUserMedia.shareScreen.learnMoreLabel): NB: inserted via innerHTML, so please don't use <, > or & in this string. getUserMedia.shareScreen.learnMoreLabel = 더 알아보기 getUserMedia.selectWindow.label=공유할 창: getUserMedia.selectWindow.accesskey=W getUserMedia.selectScreen.label=공유할 화면: getUserMedia.selectScreen.accesskey=S getUserMedia.selectApplication.label=공유할 애플리케이션: getUserMedia.selectApplication.accesskey=A getUserMedia.noApplication.label = 애플리케이션 없음 getUserMedia.noScreen.label = 화면 없음 getUserMedia.noWindow.label = 창 없음 getUserMedia.shareEntireScreen.label = 전체 화면 # LOCALIZATION NOTE (getUserMedia.shareMonitor.label): # %S is screen number (digits 1, 2, etc) # Example: Screen 1, Screen 2,.. getUserMedia.shareMonitor.label = 화면 %S # LOCALIZATION NOTE (getUserMedia.shareApplicationWindowCount.label): # Semicolon-separated list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # Replacement for #1 is the name of the application. # Replacement for #2 is the number of windows currently displayed by the application. getUserMedia.shareApplicationWindowCount.label=#1 (#2창) # LOCALIZATION NOTE (getUserMedia.allow.label, # getUserMedia.dontAllow.label): # These two buttons are the possible answers to the various prompts in the # "getUserMedia.share{device}.message" strings. getUserMedia.allow.label = 허용 getUserMedia.allow.accesskey = A getUserMedia.dontAllow.label = 허용하지 않음 getUserMedia.dontAllow.accesskey = D getUserMedia.remember=이 결정 저장 # LOCALIZATION NOTE (getUserMedia.reasonForNoPermanentAllow.screen2, # getUserMedia.reasonForNoPermanentAllow.audio, # getUserMedia.reasonForNoPermanentAllow.insecure): # %S is brandShortName getUserMedia.reasonForNoPermanentAllow.screen2=%S가 이제 어느 화면을 공유할지를 더이상 묻지 않고 화면에 접근합니다. getUserMedia.reasonForNoPermanentAllow.audio=%S가 이제 어느 탭을 공유할지 더이상 묻지 않고 탭의 소리에 접근합니다. getUserMedia.reasonForNoPermanentAllow.insecure=이 사이트로의 연결이 안전하지 않습니다. 정보 보호를 위해서 %S가 현재 세션에서만 접근을 허용할 것입니다. getUserMedia.sharingMenu.label = 기기를 공유하는 탭 getUserMedia.sharingMenu.accesskey = d # LOCALIZATION NOTE (getUserMedia.sharingMenuCamera # getUserMedia.sharingMenuMicrophone, # getUserMedia.sharingMenuAudioCapture, # getUserMedia.sharingMenuApplication, # getUserMedia.sharingMenuScreen, # getUserMedia.sharingMenuWindow, # getUserMedia.sharingMenuBrowser, # getUserMedia.sharingMenuCameraMicrophone, # getUserMedia.sharingMenuCameraMicrophoneApplication, # getUserMedia.sharingMenuCameraMicrophoneScreen, # getUserMedia.sharingMenuCameraMicrophoneWindow, # getUserMedia.sharingMenuCameraMicrophoneBrowser, # getUserMedia.sharingMenuCameraAudioCapture, # getUserMedia.sharingMenuCameraAudioCaptureApplication, # getUserMedia.sharingMenuCameraAudioCaptureScreen, # getUserMedia.sharingMenuCameraAudioCaptureWindow, # getUserMedia.sharingMenuCameraAudioCaptureBrowser, # getUserMedia.sharingMenuCameraApplication, # getUserMedia.sharingMenuCameraScreen, # getUserMedia.sharingMenuCameraWindow, # getUserMedia.sharingMenuCameraBrowser, # getUserMedia.sharingMenuMicrophoneApplication, # getUserMedia.sharingMenuMicrophoneScreen, # getUserMedia.sharingMenuMicrophoneWindow, # getUserMedia.sharingMenuMicrophoneBrowser, # getUserMedia.sharingMenuAudioCaptureApplication, # getUserMedia.sharingMenuAudioCaptureScreen, # getUserMedia.sharingMenuAudioCaptureWindow, # getUserMedia.sharingMenuAudioCaptureBrowser): # %S is the website origin (e.g. www.mozilla.org) getUserMedia.sharingMenuCamera = %S (카메라) getUserMedia.sharingMenuMicrophone = %S (마이크) getUserMedia.sharingMenuAudioCapture = %S (탭 소리) getUserMedia.sharingMenuApplication = %S (애플리케이션) getUserMedia.sharingMenuScreen = %S (화면) getUserMedia.sharingMenuWindow = %S (창) getUserMedia.sharingMenuBrowser = %S (탭) getUserMedia.sharingMenuCameraMicrophone = %S (카메라와 마이크) getUserMedia.sharingMenuCameraMicrophoneApplication = %S (카메라, 마이크, 애플리케이션) getUserMedia.sharingMenuCameraMicrophoneScreen = %S (카메라, 마이크, 화면) getUserMedia.sharingMenuCameraMicrophoneWindow = %S (카메라, 마이크, 창) getUserMedia.sharingMenuCameraMicrophoneBrowser = %S (카메라, 마이크, 탭) getUserMedia.sharingMenuCameraAudioCapture = %S (카메라, 탭 소리) getUserMedia.sharingMenuCameraAudioCaptureApplication = %S (카메라, 탭 소리, 애플리케이션) getUserMedia.sharingMenuCameraAudioCaptureScreen = %S (카메라, 탭 소리, 화면) getUserMedia.sharingMenuCameraAudioCaptureWindow = %S (카메라, 탭 소리, 창) getUserMedia.sharingMenuCameraAudioCaptureBrowser = %S (카메라, 탭 소리, 탭) getUserMedia.sharingMenuCameraApplication = %S (카메라, 애플리케이션) getUserMedia.sharingMenuCameraScreen = %S (카메라, 화면) getUserMedia.sharingMenuCameraWindow = %S (카메라, 창) getUserMedia.sharingMenuCameraBrowser = %S (카메라, 탭) getUserMedia.sharingMenuMicrophoneApplication = %S (마이크, 애플리케이션) getUserMedia.sharingMenuMicrophoneScreen = %S (마이크, 화면) getUserMedia.sharingMenuMicrophoneWindow = %S (마이크, 창) getUserMedia.sharingMenuMicrophoneBrowser = %S (마이크, 탭) getUserMedia.sharingMenuAudioCaptureApplication = %S (탭 소리, 애플리케이션) getUserMedia.sharingMenuAudioCaptureScreen = %S (탭 소리, 화면) getUserMedia.sharingMenuAudioCaptureWindow = %S (탭 소리, 창) getUserMedia.sharingMenuAudioCaptureBrowser = %S (탭 소리, 탭) # LOCALIZATION NOTE(getUserMedia.sharingMenuUnknownHost): this is used for the website # origin for the sharing menu if no readable origin could be deduced from the URL. getUserMedia.sharingMenuUnknownHost = 알 수 없는 곳에서 옴 # LOCALIZATION NOTE(emeNotifications.drmContentPlaying.message2): %S is brandShortName. emeNotifications.drmContentPlaying.message2 = 여러분이 마음대로 %S를 쓰지 못하게 할 수 있는 DRM 소프트웨어가 이 사이트의 일부 오디오나 동영상에 쓰이고 있습니다. emeNotifications.drmContentPlaying.button.label = 설정… emeNotifications.drmContentPlaying.button.accesskey = C emeNotifications.drmContentDisabled.button.label = DRM 활성화 emeNotifications.drmContentDisabled.button.accesskey = E # LOCALIZATION NOTE(emeNotifications.drmContentDisabled.learnMoreLabel): NB: inserted via innerHTML, so please don't use <, > or & in this string. emeNotifications.drmContentDisabled.learnMoreLabel = 더 알아보기 # LOCALIZATION NOTE(emeNotifications.drmContentCDMInstalling.message): NB: inserted via innerHTML, so please don't use <, > or & in this string. %S is brandShortName emeNotifications.drmContentCDMInstalling.message = %S가 이 페이지의 오디오나 동영상을 재생하기 위한 요소를 설치하고 있습니다. 다시 시도해 주십시오. emeNotifications.unknownDRMSoftware = 알 수 없음 # LOCALIZATION NOTE - %S is brandShortName slowStartup.message = %S가 너무…느리게…열리는 것 같습니다. slowStartup.helpButton.label = 보다 빨라지도록 하는 방법에 대해 알아보기 slowStartup.helpButton.accesskey = L slowStartup.disableNotificationButton.label = 다시 알리지 않음 slowStartup.disableNotificationButton.accesskey = A # LOCALIZATION NOTE - %S is brandShortName flashHang.message = %S가 성능을 끌어올리기 위해 Adobe Flash의 몇몇 설정을 바꾸었습니다. flashHang.helpButton.label = 더 알아보기… flashHang.helpButton.accesskey = L # LOCALIZATION NOTE(customizeTips.tip0): %1$S will be replaced with the text defined # in customizeTips.tip0.hint, %2$S will be replaced with brandShortName, %3$S will # be replaced with a hyperlink containing the text defined in customizeTips.tip0.learnMore. customizeTips.tip0 = %1$S: %2$S를 자기 입맛에 맞게 고치실 수 있습니다. 아무거나 끌어서 메뉴나 도구 모음에 놓기만 하면 됩니다. 여러분에게 맞는 %2$S를 만드는 방법에 대해 %3$S. customizeTips.tip0.hint = 도움말 customizeTips.tip0.learnMore = 더 알아보실 수 있습니다 # LOCALIZATION NOTE (customizeMode.tabTitle): %S is brandShortName customizeMode.tabTitle = %S 사용자 지정 # LOCALIZATION NOTE(appmenu.*.description, appmenu.*.label): these are used for # the appmenu labels and buttons that appear when an update is staged for # installation or a background update has failed and a manual download is required. # %S is brandShortName appmenu.restartNeeded.description = 업데이트를 적용하기 위해 %S를 다시 시작 appmenu.updateFailed.description = 백그라운드에서 업데이트가 제대로 되지 않았습니다. 업데이트를 내려받아 주십시오. appmenu.restartBrowserButton.label = %S 다시 시작 appmenu.downloadUpdateButton.label = 업데이트 내려받기 # LOCALIZATION NOTE : FILE Reader View is a feature name and therefore typically used as a proper noun. readingList.promo.firstUse.readerView.title = 리더뷰 readingList.promo.firstUse.readerView.body = 지저분한 곳을 없애 읽으려는 부분에 집중할 수 있게 합니다. # LOCALIZATION NOTE (appMenuRemoteTabs.mobilePromo.text2): # %1$S will be replaced with a link, the text of which is # appMenuRemoteTabs.mobilePromo.android and the link will be to # https://www.mozilla.org/firefox/android/. # %2$S will be replaced with a link, the text of which is # appMenuRemoteTabs.mobilePromo.ios # and the link will be to https://www.mozilla.org/firefox/ios/. appMenuRemoteTabs.mobilePromo.text2 = %1$S 또는 %2$S를 다운로드 하고 Firefox Account 계정에 연결합니다. appMenuRemoteTabs.mobilePromo.android = Android용 Firefox appMenuRemoteTabs.mobilePromo.ios = iOS용 Firefox # LOCALIZATION NOTE (e10s.accessibilityNotice.mainMessage, # e10s.accessibilityNotice.enableAndRestart.label, # e10s.accessibilityNotice.enableAndRestart.accesskey): # These strings are related to the messages we display to offer e10s (Multi-process) to users # on the pre-release channels. They won't be used in release but they will likely be used in # beta starting from version 41, so it's still useful to have these strings properly localized. # %S is brandShortName e10s.accessibilityNotice.mainMessage2 = 새 %S 기능 호환성 문제 때문에 접근성 지원이 부분적으로 비활성화 됩니다. e10s.accessibilityNotice.acceptButton.label = 확인 e10s.accessibilityNotice.acceptButton.accesskey = O e10s.accessibilityNotice.enableAndRestart.label = 사용 (다시 시작 해야 함) e10s.accessibilityNotice.enableAndRestart.accesskey = E # LOCALIZATION NOTE (userContextPersonal.label, # userContextWork.label, # userContextShopping.label, # userContextBanking.label, # userContextNone.label): # These strings specify the four predefined contexts included in support of the # Contextual Identity / Containers project. Each context is meant to represent # the context that the user is in when interacting with the site. Different # contexts will store cookies and other information from those sites in # different, isolated locations. You can enable the feature by typing # about:config in the URL bar and changing privacy.userContext.enabled to true. # Once enabled, you can open a new tab in a specific context by clicking # File > New Container Tab > (1 of 4 contexts). Once opened, you will see these # strings on the right-hand side of the URL bar. userContextPersonal.label = 개인 userContextWork.label = 업무 userContextBanking.label = 은행 userContextShopping.label = 쇼핑 userContextNone.label = 컨테이너 없음 userContextPersonal.accesskey = P userContextWork.accesskey = W userContextBanking.accesskey = B userContextShopping.accesskey = S userContextNone.accesskey = N userContext.aboutPage.label = 컨테이너 관리 userContext.aboutPage.accesskey = O userContextOpenLink.label = 새 %S 탭에서 링크 열기 muteTab.label = 탭 음소거 muteTab.accesskey = M unmuteTab.label = 탭 음소거 해제 unmuteTab.accesskey = M playTab.label = 탭 재생 playTab.accesskey = P # LOCALIZATION NOTE (certErrorDetails*.label): These are text strings that # appear in the about:certerror page, so that the user can copy and send them to # the server administrators for troubleshooting. certErrorDetailsHSTS.label = HTTP 보안 강화 프로토콜: %S certErrorDetailsKeyPinning.label = HTTP 공개 키 고정: %S certErrorDetailsCertChain.label = 인증 체인: # LOCALIZATION NOTE (pendingCrashReports2.label): Semi-colon list of plural forms # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 is the number of pending crash reports pendingCrashReports2.label = 보내지 않은 충돌 보고서가 있습니다;보내지 않은 충돌 보고서가 #1개 있습니다 pendingCrashReports.viewAll = 보기 pendingCrashReports.send = 보내기 pendingCrashReports.alwaysSend = 항상 보내기 decoder.noCodecs.button = 방법 알아보기 decoder.noCodecs.accesskey = L decoder.noCodecs.message = 동영상을 재생하기 위해 Microsoft의 Media Feature Pack이 필요합니다. decoder.noCodecsLinux.message = 동영상을 재생하기 위해 동영상 코덱을 설치해야 합니다. decoder.noHWAcceleration.message = 동영상 재생 품질을 높이기 위해 Microsoft의 Media Feature Pack을 설치해야 합니다. decoder.noPulseAudio.message = 소리를 재생하기 위해서는 PulseAudio 소프트웨어가 필요합니다. decoder.unsupportedLibavcodec.message = libavcodec은 취약하거나 지원되지 않을 수 있으므로 동영상을 재생하기 위해서 업데이트되어야 합니다. # LOCALIZATION NOTE (captivePortal.infoMessage3): # Shown in a notification bar when we detect a captive portal is blocking network access # and requires the user to log in before browsing. # LOCALIZATION NOTE (captivePortal.showLoginPage2): # The label for a button shown in the info bar in all tabs except the login page tab. # The button shows the portal login page tab when clicked. permissions.remove.tooltip = 이 승인을 초기화하고 다시 묻기 # LOCALIZATION NOTE (aboutDialog.architecture.*): # The sixtyFourBit and thirtyTwoBit strings describe the architecture of the # current Firefox build: 32-bit or 64-bit. These strings are used in parentheses # between the Firefox version and the "What's new" link in the About dialog, # e.g.: "48.0.2 (32-bit) " or "51.0a1 (2016-09-05) (64-bit)". aboutDialog.architecture.sixtyFourBit = 64비트 aboutDialog.architecture.thirtyTwoBit = 32비트 # LOCALIZATION NOTE (addonPostInstall.messageDetail) # %1$S is replaced with the icon for the add-ons menu. # %2$S is replaced with the icon for the toolbar menu. # Note, this string will be used as raw markup. Avoid characters like <, >, & addonPostInstall.messageDetail=Manage your add-ons by clicking %1$S in the %2$S menu. # LOCALIZATION NOTE (captivePortal.infoMessage3): # Shown in a notification bar when we detect a captive portal is blocking network access # and requires the user to log in before browsing. captivePortal.infoMessage3 = You must log in to this network before you can access the Internet. # LOCALIZATION NOTE (captivePortal.showLoginPage2): # The label for a button shown in the info bar in all tabs except the login page tab. # The button shows the portal login page tab when clicked. captivePortal.showLoginPage2 = Open Network Login Page webextPerms.description.clipboardRead=Get data from the clipboard webextPerms.description.clipboardWrite=Input data to the clipboard webextPerms.description.geolocation=Access your location webextPerms.description.privacy=Read and modify privacy settings webextPerms.sideloadCancel.accessKey=C webextPerms.sideloadCancel.label=Cancel webextPerms.sideloadText2=Another program on your computer installed an add-on that may affect your browser. Please review this add-on’s permissions requests and choose to Enable or Cancel (to leave it disabled). webextPerms.sideloadTextNoPerms=Another program on your computer installed an add-on that may affect your browser. Please choose to Enable or Cancel (to leave it disabled). ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/customizableui/customizableWidgets.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. history-panelmenu.label = 방문 기록 # LOCALIZATION NOTE(history-panelmenu.tooltiptext2): %S is the keyboard shortcut history-panelmenu.tooltiptext2 = 방문 기록 보기 (%S) remotetabs-panelmenu.label = 동기화 탭 remotetabs-panelmenu.tooltiptext2 = 다른 기기의 탭 보기 privatebrowsing-button.label = 새 사생활 보호 창 # LOCALIZATION NOTE(privatebrowsing-button.tooltiptext): %S is the keyboard shortcut privatebrowsing-button.tooltiptext = 새 창 사생활 보호 모드로 열기 (%S) save-page-button.label = 페이지 저장 # LOCALIZATION NOTE(save-page-button.tooltiptext3): %S is the keyboard shortcut save-page-button.tooltiptext3 = 이 페이지 저장 (%S) find-button.label = 찾기 # LOCALIZATION NOTE(find-button.tooltiptext3): %S is the keyboard shortcut. find-button.tooltiptext3 = 이 페이지에서 찾기 (%S) open-file-button.label = 파일 열기 # LOCALIZATION NOTE (open-file-button.tooltiptext3): %S is the keyboard shortcut. open-file-button.tooltiptext3 = 파일 열기 (%S) developer-button.label = 개발자 # LOCALIZATION NOTE(developer-button.tooltiptext): %S is the keyboard shortcut developer-button.tooltiptext2 = 웹 개발자 도구 열기 (%S) sidebar-button.label = 탐색창 sidebar-button.tooltiptext2 = 탐색창 보기 add-ons-button.label = 부가 기능 # LOCALIZATION NOTE(add-ons-button.tooltiptext3): %S is the keyboard shortcut add-ons-button.tooltiptext3 = 부가 기능 관리 (%S) preferences-button.label = 환경 설정 preferences-button.tooltiptext2 = 환경 설정 열기 preferences-button.tooltiptext.withshortcut = 환경 설정 열기 (%S) # LOCALIZATION NOTE (preferences-button.labelWin): Windows-only label for Options preferences-button.labelWin = 설정 # LOCALIZATION NOTE (preferences-button.tooltipWin): Windows-only tooltip for Options preferences-button.tooltipWin2 = 설정 열기 zoom-controls.label = 크기 버튼 zoom-controls.tooltiptext2 = 크기 버튼 zoom-out-button.label = 축소 # LOCALIZATION NOTE(zoom-out-button.tooltiptext2): %S is the keyboard shortcut. zoom-out-button.tooltiptext2 = 축소 (%S) # LOCALIZATION NOTE(zoom-reset-button.label): %S is the current zoom level, # %% will be displayed as a single % character (% is commonly used to define # format specifiers, so it needs to be escaped). zoom-reset-button.label = %S%% # LOCALIZATION NOTE(zoom-reset-button.tooltiptext2): %S is the keyboard shortcut. zoom-reset-button.tooltiptext2 = 처음 크기로 (%S) zoom-in-button.label = 확대 # LOCALIZATION NOTE(zoom-in-button.tooltiptext2): %S is the keyboard shortcut. zoom-in-button.tooltiptext2 = 확대 (%S) edit-controls.label = 편집 버튼 edit-controls.tooltiptext2 = 편집 버튼 cut-button.label = 잘라내기 # LOCALIZATION NOTE(cut-button.tooltiptext2): %S is the keyboard shortcut. cut-button.tooltiptext2 = 잘라내기 (%S) copy-button.label = 복사하기 # LOCALIZATION NOTE(copy-button.tooltiptext2): %S is the keyboard shortcut. copy-button.tooltiptext2 = 복사하기 (%S) paste-button.label = 붙여넣기 # LOCALIZATION NOTE(paste-button.tooltiptext2): %S is the keyboard shortcut. paste-button.tooltiptext2 = 붙여넣기 (%S) feed-button.label = 구독 feed-button.tooltiptext2 = 이 페이지 구독하기 containers-panelmenu.label = 포함 탭 열기 containers-panelmenu.tooltiptext = 포함 탭 열기 # LOCALIZATION NOTE (characterencoding-button2.label): The \u00ad text at the beginning # of the string is used to disable auto hyphenation on the button text when it is displayed # in the menu panel. characterencoding-button2.label = \u00ad글자 인코딩 characterencoding-button2.tooltiptext = 글자 인코딩 설정 보기 email-link-button.label = 메일로 링크 보내기 email-link-button.tooltiptext3 = 이 페이지로 가는 링크 메일로 보내기 # LOCALIZATION NOTE(quit-button.tooltiptext.linux2): %1$S is the brand name (e.g. Firefox), # %2$S is the keyboard shortcut quit-button.tooltiptext.linux2 = %1$S 종료 (%2$S) # LOCALIZATION NOTE(quit-button.tooltiptext.mac): %1$S is the brand name (e.g. Firefox), # %2$S is the keyboard shortcut quit-button.tooltiptext.mac = %1$S 종료 (%2$S) social-share-button.label = 이 페이지 공유 social-share-button.tooltiptext = 이 페이지 공유 panic-button.label = 삭제 panic-button.tooltiptext = 지난 방문기록 일부 삭제 # LOCALIZATION NOTE(devtools-webide-button.label, devtools-webide-button.tooltiptext): # widget is only visible after WebIDE has been started once (Tools > Web Developers > WebIDE) # %S is the keyboard shortcut devtools-webide-button2.label = 웹IDE devtools-webide-button2.tooltiptext = 웹IDE 열기(%S) e10s-button.label = e10s가 아닌 새 창 e10s-button.tooltiptext = e10s가 아닌 새 창 열기 ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/VariablesView.dtd ================================================ ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/animationinspector.dtd ================================================ ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/animationinspector.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the Animation inspector # which is available as a sidebar panel in the Inspector. # The correct localization of this file might be to keep it in # English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best # documentation on web development on the web. # LOCALIZATION NOTE (player.animationNameLabel): # This string is displayed in each animation player widget. It is the label # displayed before the animation name. player.animationNameLabel=Animation: # LOCALIZATION NOTE (player.transitionNameLabel): # This string is displayed in each animation player widget. It is the label # displayed in the header, when the element is animated by mean of a css # transition player.transitionNameLabel=Transition # LOCALIZATION NOTE (player.animationDurationLabel): # This string is displayed in each animation player widget. It is the label # displayed before the animation duration. player.animationDurationLabel=Duration: # LOCALIZATION NOTE (player.animationDelayLabel): # This string is displayed in each animation player widget. It is the label # displayed before the animation delay. player.animationDelayLabel=Delay: # LOCALIZATION NOTE (player.animationIterationCountLabel): # This string is displayed in each animation player widget. It is the label # displayed before the number of times the animation is set to repeat. player.animationIterationCountLabel=Repeats: # LOCALIZATION NOTE (player.infiniteIterationCount): # In case the animation repeats infinitely, this string is displayed next to the # player.animationIterationCountLabel string, instead of a number. player.infiniteIterationCount=∞ # LOCALIZATION NOTE (player.timeLabel): # This string is displayed in each animation player widget, to indicate either # how long (in seconds) the animation lasts, or what is the animation's current # time (in seconds too); player.timeLabel=%Ss ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/app-manager.dtd ================================================ 앱 탭에서는 앱이 유효한지 검사한 다음 설치하는 과정을 도와줄 것입니다. 기기 탭에서는 연결된 기기에 대한 정보를 줄 것입니다. 아래에 있는 도구 모음에서 기기에 연결하거나 시뮬레이터를 시작할 수 있습니다."> ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/app-manager.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE (device.deviceSize): %1$S is the device's width, %2$S is # the device's height, %3$S is the device's pixel density. # Example: 800x480 (86 DPI). device.deviceSize=기기 크기: %1$Sx%2$S (%3$S DPI) # LOCALIZATION NOTE (connection.connectedToDevice, connection.connectTo): # %1$S is the host name, %2$S is the port number. connection.connectedToDevice=%1$S에 연결됨 connection.connectTo=%1$S:%2$S에 연결 project.filePickerTitle=웹앱 폴더 선택하기 project.installing=설치하는 중… project.installed=설치했습니다! validator.nonExistingFolder=프로젝트 폴더가 존재하지 않음 validator.expectProjectFolder=프로젝트 폴더가 파일로 끝남 validator.wrongManifestFileName=패키지형 앱은 매니페스트 파일이 프로젝트의 최상위 폴더에 'manifest.webapp'이라는 이름으로 있어야 합니다 validator.invalidManifestURL=잘못된 매니페스트 URL '%S' # LOCALIZATION NOTE (validator.invalidManifestJSON, validator.noAccessManifestURL): # %1$S is the error message, %2$S is the URI of the manifest. validator.invalidManifestJSON=웹앱 매니페스트 '%2$S'가 올바른 JSON 파일이 아님: %1$S validator.noAccessManifestURL=매니페스트 파일 '%2$S'을 읽을 수 없음: %1$S # LOCALIZATION NOTE (validator.invalidHostedManifestURL): %1$S is the URI of # the manifest, %2$S is the error message. validator.invalidHostedManifestURL=호스트형 매니페스트 '%1$S'의 URL가 잘못됨: %2$S validator.invalidProjectType=알 수 없는 프로젝트 형식 '%S' # LOCALIZATION NOTE (validator.missNameManifestProperty, validator.missIconsManifestProperty): # don't translate 'icons' and 'name'. validator.missNameManifestProperty=매니페스트에 꼭 있어야 하는 'name'이 없습니다. validator.missIconsManifestProperty=매니페스트에 꼭 있어야 하는 'icons'이 없습니다. validator.missIconMarketplace2=Marketplace 제출 앱은 128px 아이콘이 포함되어야 함 validator.invalidAppType='%S'은 알 수 없는 앱 형식입니다. validator.invalidHostedPriviledges=호스트형 앱은 '%S' 형식이 될 수 없습니다. validator.noCertifiedSupport='certified' 앱은 앱 관리자에서 완전히 지원하지 않습니다. validator.nonAbsoluteLaunchPath=실행 경로는 '/'로 시작하는 절대 경로여야 함: '%S' validator.accessFailedLaunchPath=앱의 시작 문서인 '%S'에 접근할 수 없음 # LOCALIZATION NOTE (validator.accessFailedLaunchPathBadHttpCode): %1$S is the URI of # the launch document, %2$S is the http error code. validator.accessFailedLaunchPathBadHttpCode=앱의 시작 문서인 '%1$S'에 접근할 수 없음, HTTP 코드 %2$S를 받음 index.deprecationNotice=The App Manager will be removed in a future release. Your projects have been migrated to WebIDE. index.launchWebIDE=Launch WebIDE index.readMoreAboutWebIDE=Read More ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/appcacheutils.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the Web Console # command line which is available from the Web Developer sub-menu # -> 'Web Console'. # These messages are displayed when an attempt is made to validate a # page or a cache manifest using AppCacheUtils.jsm # The correct localization of this file might be to keep it in # English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best # documentation on web development on the web. # LOCALIZATION NOTE (noManifest): the specified page has no cache manifest. noManifest=지정된 페이지에 매니페스트가 없습니다. # LOCALIZATION NOTE (notUTF8): the associated cache manifest has a character # encoding that is not UTF-8. Parameters: %S is the current encoding. notUTF8=매니페스트의 글자 인코딩은 utf-8이어야 하나 %S입니다. # LOCALIZATION NOTE (badMimeType): the associated cache manifest has a # mimetype that is not text/cache-manifest. Parameters: %S is the current # mimetype. badMimeType=매니페스트의 MIME-TYPE은 text/cache-manifest이어야 하나 %S입니다. # LOCALIZATION NOTE (duplicateURI): the associated cache manifest references # the same URI from multiple locations. Parameters: %1$S is the URI, %2$S is a # list of references to this URI. duplicateURI=여러 위치에서 URI %1$S를 참조하고 있으나 이는 허용되지 않습니다: %2$S. # LOCALIZATION NOTE (networkBlocksURI, fallbackBlocksURI): the associated # cache manifest references the same URI in the NETWORK (or FALLBACK) section # as it does in other sections. Parameters: %1$S is the line number, %2$S is # the resource name, %3$S is the line number, %4$S is the resource name, %5$S # is the section name. networkBlocksURI=NETWORK 섹션의 %1$S줄(%2$S)이 %5$S 섹션의 %3$S줄(%4$S)을 캐싱하지 못하게 하고 있습니다. fallbackBlocksURI=FALLBACK 섹션의 %1$S줄(%2$S)이 %5$S 섹션의 %3$S줄(%4$S)을 캐싱하지 못하게 하고 있습니다. # LOCALIZATION NOTE (fileChangedButNotManifest): the associated cache manifest # references a URI that has a file modified after the cache manifest. # Parameters: %1$S is the resource name, %2$S is the cache manifest, %3$S is # the line number. fileChangedButNotManifest=%1$S 파일이 %2$S보다 뒤에 고쳐졌습니다. 매니페스트 파일의 내용이 바뀌기 전까지 %3$S줄 대신 캐싱된 것이 사용될 것입니다. # LOCALIZATION NOTE (cacheControlNoStore): the specified page has a header # preventing caching or storing information. Parameters: %1$S is the resource # name, %2$S is the line number. cacheControlNoStore=%1$S는 cache-control이 no-store로 되어 있습니다. 이는 애플리케이션이 파일의 %2$S줄에서 캐시하는 것을 막을 것입니다. # LOCALIZATION NOTE (notAvailable): the specified resource is not available. # Parameters: %1$S is the resource name, %2$S is the line number. notAvailable=%1$S는 %2$S줄에 있는 가능하지 않은 리소스를 가리킵니다. # LOCALIZATION NOTE (invalidURI): it's used when an invalid URI is passed to # the appcache. invalidURI=AppCacheUtils로 보낸 URI가 유효하지 않습니다. # LOCALIZATION NOTE (noResults): it's used when a search returns no results. noResults=검색 결과가 없습니다. # LOCALIZATION NOTE (cacheDisabled): it's used when the cache is disabled and # an attempt is made to view offline data. cacheDisabled=디스크 캐시가 꺼져있습니다. about:config의 browser.cache.disk.enable about:config를 true로 하고 다시 해 보십시오. # LOCALIZATION NOTE (firstLineMustBeCacheManifest): the associated cache # manifest has a first line that is not "CACHE MANIFEST". Parameters: %S is # the line number. firstLineMustBeCacheManifest=%S줄에서 매니페스트의 첫 줄은 반드시 "CACHE MANIFEST"이어야 합니다. # LOCALIZATION NOTE (cacheManifestOnlyFirstLine2): the associated cache # manifest has "CACHE MANIFEST" on a line other than the first line. # Parameters: %S is the line number where "CACHE MANIFEST" appears. cacheManifestOnlyFirstLine2=%S줄의 "CACHE MANIFEST"는 첫 번째 줄에서만 유효합니다. # LOCALIZATION NOTE (asteriskInWrongSection2): the associated cache manifest # has an asterisk (*) in a section other than the NETWORK section. Parameters: # %1$S is the section name, %2$S is the line number. asteriskInWrongSection2=%1$S 섹션의 %2$S줄에서 별표(*)가 잘못 쓰이고 있습니다. NETWORK 섹션의 한 줄이 별표 한 글자로 되어 있으면 매니페스트에 없는 다른 모든 URI는 NETWORK 섹션에 있는 것으로 다뤄집니다. 그렇지 않으면 그런 URI는 쓸 수 없는 것으로 다뤄집니다. 이외에 다른 방법으로 * 글자를 사용하는 것은 막혀 있습니다. # LOCALIZATION NOTE (escapeSpaces): the associated cache manifest has a space # in a URI. Spaces must be replaced with %20. Parameters: %S is the line # number where this error occurs. escapeSpaces=%S줄에서 URI의 빈칸은 %20로 바꿔야 합니다. # LOCALIZATION NOTE (slashDotDotSlashBad): the associated cache manifest has a # URI containing /../, which is invalid. Parameters: %S is the line number # where this error occurs. slashDotDotSlashBad=%S줄에서 /../은 유효한 URI prefix가 아닙니다. # LOCALIZATION NOTE (tooManyDotDotSlashes): the associated cache manifest has # a URI containing too many ../ operators. Too many of these operators mean # that the file would be below the root of the site, which is not possible. # Parameters: %S is the line number where this error occurs. tooManyDotDotSlashes=%S줄에서 점 점 빗줄 연산자(../)가 너무 많습니다. # LOCALIZATION NOTE (fallbackUseSpaces): the associated cache manifest has a # FALLBACK section containing more or less than the standard two URIs # separated by a single space. Parameters: %S is the line number where this # error occurs. fallbackUseSpaces=%S줄에서 FALLBACK 세션은 두 URI을 빈칸으로 분리한 것만이 허용됩니다. # LOCALIZATION NOTE (fallbackAsterisk2): the associated cache manifest has a # FALLBACK section that attempts to use an asterisk (*) as a wildcard. In this # section the URI is simply a path prefix. Parameters: %S is the line number # where this error occurs. fallbackAsterisk2=FALLBACK 세션의 %S줄에서 별표(*)가 와일드카드로 잘못 사용되었습니다. FALLBACK 섹션의 URI는 요청 URI의 접두사와 완전히 맞아야 합니다. # LOCALIZATION NOTE (settingsBadValue): the associated cache manifest has a # SETTINGS section containing something other than the valid "prefer-online" # or "fast". Parameters: %S is the line number where this error occurs. settingsBadValue=%S줄에서 SETTINGS 섹션은 "prefer-online"과 "fast" 가운데 한 값만 가져야 합니다. # LOCALIZATION NOTE (invalidSectionName): the associated cache manifest # contains an invalid section name. Parameters: %1$S is the section name, %2$S # is the line number. invalidSectionName=%2$S줄에서 %1$S은 유효하지 않은 세션 이름입니다. # LOCALIZATION NOTE (entryNotFound): the requested cache entry that does not # exist. entryNotFound=항목을 찾지 못했습니다. ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/canvasdebugger.dtd ================================================ ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/canvasdebugger.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the Canvas Debugger # which is available from the Web Developer sub-menu -> 'Canvas'. # The correct localization of this file might be to keep it in # English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best # documentation on web development on the web. # LOCALIZATION NOTE (ToolboxCanvasDebugger.label): # This string is displayed in the title of the tab when the Shader Editor is # displayed inside the developer tools window and in the Developer Tools Menu. ToolboxCanvasDebugger.label=Canvas # LOCALIZATION NOTE (ToolboxCanvasDebugger.panelLabel): # This is used as the label for the toolbox panel. ToolboxCanvasDebugger.panelLabel = Canvas 패널 # LOCALIZATION NOTE (ToolboxCanvasDebugger.tooltip): # This string is displayed in the tooltip of the tab when the Shader Editor is # displayed inside the developer tools window. ToolboxCanvasDebugger.tooltip= 컨텍스트를 검사하고 디버깅하는 도구 # LOCALIZATION NOTE (noSnapshotsText): The text to display in the snapshots menu # when there are no recorded snapshots yet. noSnapshotsText=아직 스냅샷이 없습니다. # LOCALIZATION NOTE (snapshotsList.itemLabel): # This string is displayed in the snapshots list of the Canvas Debugger, # identifying a set of function calls of a recorded animation frame. snapshotsList.itemLabel=스냅샷 #%S # LOCALIZATION NOTE (snapshotsList.loadingLabel): # This string is displayed in the snapshots list of the Canvas Debugger, # for an item that has not finished loading. snapshotsList.loadingLabel=읽는 중… # LOCALIZATION NOTE (snapshotsList.saveLabel): # This string is displayed in the snapshots list of the Canvas Debugger, # for saving an item to disk. snapshotsList.saveLabel=저장 # LOCALIZATION NOTE (snapshotsList.savingLabel): # This string is displayed in the snapshots list of the Canvas Debugger, # while saving an item to disk. snapshotsList.savingLabel=저장하는 중… # LOCALIZATION NOTE (snapshotsList.loadedLabel): # This string is displayed in the snapshots list of the Canvas Debugger, # for an item which was loaded from disk snapshotsList.loadedLabel=디스크에서 읽어옴 # LOCALIZATION NOTE (snapshotsList.saveDialogTitle): # This string is displayed as a title for saving a snapshot to disk. snapshotsList.saveDialogTitle=애니메이션 프레임 스냅샷 저장… # LOCALIZATION NOTE (snapshotsList.saveDialogJSONFilter): # This string is displayed as a filter for saving a snapshot to disk. snapshotsList.saveDialogJSONFilter=JSON 파일 # LOCALIZATION NOTE (snapshotsList.saveDialogAllFilter): # This string is displayed as a filter for saving a snapshot to disk. snapshotsList.saveDialogAllFilter=모든 파일 # LOCALIZATION NOTE (snapshotsList.drawCallsLabel): # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # This string is displayed in the snapshots list of the Canvas Debugger, # as a generic description about how many draw calls were made. snapshotsList.drawCallsLabel=#1번 그림 # LOCALIZATION NOTE (snapshotsList.functionCallsLabel): # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # This string is displayed in the snapshots list of the Canvas Debugger, # as a generic description about how many function calls were made in total. snapshotsList.functionCallsLabel=#1번 호출 # LOCALIZATION NOTE (recordingTimeoutFailure): # This notification alert is displayed when attempting to record a requestAnimationFrame # cycle in the Canvas Debugger and no cycles detected. This alerts the user that no # loops were found. recordingTimeoutFailure=Canvas Debugger could not find a requestAnimationFrame or setTimeout cycle. ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/connection-screen.dtd ================================================ ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/connection-screen.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE : FILE This file contains the Remote Connection strings. # The Remote Connection window can reached from the "connect…" menuitem # in the Web Developer menu. mainProcess=주요 프로세스 ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/debugger.dtd ================================================ ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/debugger.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the Debugger # which is available from the Web Developer sub-menu -> 'Debugger'. # The correct localization of this file might be to keep it in # English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best # documentation on web development on the web. # LOCALIZATION NOTE (ToolboxDebugger.label): # This string is displayed in the title of the tab when the debugger is # displayed inside the developer tools window and in the Developer Tools Menu. ToolboxDebugger.label=디버거 # LOCALIZATION NOTE (ToolboxDebugger.panelLabel): # This is used as the label for the toolbox panel. ToolboxDebugger.panelLabel=디버거 패널 # LOCALIZATION NOTE (DebuggerWindowTitle): # The title displayed for the debugger window. DebuggerWindowTitle=브라우저 디버거 # LOCALIZATION NOTE (DebuggerWindowScriptTitle): # The title displayed for the debugger window when a script is selected. DebuggerWindowScriptTitle=브라우저 디버거 - %S # LOCALIZATION NOTE (ToolboxDebugger.tooltip): # This string is displayed in the tooltip of the tab when the debugger is # displayed inside the developer tools window.. ToolboxDebugger.tooltip=JavaScript 디버거 # LOCALIZATION NOTE (debuggerMenu.accesskey): The access key used to open the # debugger. debuggerMenu.commandkey=S debuggerMenu.accesskey=D # LOCALIZATION NOTE (collapsePanes): This is the tooltip for the button # that collapses the left and right panes in the debugger UI. --> collapsePanes=창 닫기 # LOCALIZATION NOTE (expandPanes): This is the tooltip for the button # that expands the left and right panes in the debugger UI. --> expandPanes=창 열기 # LOCALIZATION NOTE (pauseLabel): The label that is displayed on the pause # button when the debugger is in a running state. pauseButtonTooltip=정지 (%S) # LOCALIZATION NOTE (resumeLabel): The label that is displayed on the pause # button when the debugger is in a paused state. resumeButtonTooltip=계속 (%S) # LOCALIZATION NOTE (startTracingTooltip): The label that is displayed on the trace # button when execution tracing is stopped. startTracingTooltip=추적 시작 # LOCALIZATION NOTE (stopTracingTooltip): The label that is displayed on the trace # button when execution tracing is started. stopTracingTooltip=추적 중지 # LOCALIZATION NOTE (stepOverTooltip): The label that is displayed on the # button that steps over a function call. stepOverTooltip=다음줄 실행 (%S) # LOCALIZATION NOTE (stepInTooltip): The label that is displayed on the # button that steps into a function call. stepInTooltip=함수 안으로 (%S) # LOCALIZATION NOTE (stepOutTooltip): The label that is displayed on the # button that steps out of a function call. stepOutTooltip=함수 밖으로 (%S) # LOCALIZATION NOTE (emptyGlobalsText): The text to display in the menulist # when there are no chrome globals available. noGlobalsText=global 없음 # LOCALIZATION NOTE (noSourcesText): The text to display in the sources menu # when there are no scripts. noSourcesText=이 페이지에는 소스가 없습니다. # LOCALIZATION NOTE (loadingSourcesText): The text to display in the sources menu # when waiting for scripts to load. loadingSourcesText=소스를 기다리는 중… # LOCALIZATION NOTE (noEventsTExt): The text to display in the events tab # when there are no events. noEventListenersText=표시할 이벤트 리스너가 없음 # LOCALIZATION NOTE (noStackFramesText): The text to display in the call stack tab # when there are no stack frames. noStackFramesText=표시할 스택 프레임이 없음 # LOCALIZATION NOTE (noStackFramesText): The text to display in the traces tab # when there are no function calls. noFunctionCallsText=표시할 함수 호출이 없음 # LOCALIZATION NOTE (tracingNotStartedText): The text to display in the traces tab # when when tracing hasn't started yet. tracingNotStartedText=추적을 하고있지 않음 # LOCALIZATION NOTE (eventCheckboxTooltip): The tooltip text to display when # the user hovers over the checkbox used to toggle an event breakpoint. eventCheckboxTooltip=이 이벤트를 중단하거나 하지 않음 # 한글과 번역 (eventOnSelector, eventInSource): 반드시 기능을 사용해보고 번역 # LOCALIZATION NOTE (eventOnSelector): The text to display in the events tab # for every event item, between the event type and event selector. eventOnSelector=은 # LOCALIZATION NOTE (eventInSource): The text to display in the events tab # for every event item, between the event selector and listener's owner source. eventInSource=에 있음 - # LOCALIZATION NOTE (eventNodes): The text to display in the events tab when # an event is listened on more than one target node. eventNodes=노드 %S개 # LOCALIZATION NOTE (eventNative): The text to display in the events tab when # a listener is added from plugins, thus getting translated to native code. eventNative=[네이티브 코드] # LOCALIZATION NOTE (*Events): The text to display in the events tab for # each group of sub-level event entries. animationEvents=애니메이션 audioEvents=오디오 batteryEvents=배터리 clipboardEvents=클립보드 compositionEvents=글자 조합 deviceEvents=디바이스 displayEvents=디스플레이 dragAndDropEvents=드래그 앤 드롭 gamepadEvents=게임패드 indexedDBEvents=IndexedDB interactionEvents=상호작용 keyboardEvents=키보드 mediaEvents=HTML5 미디어 mouseEvents=마우스 mutationEvents=변형 navigationEvents=내비게이션 pointerLockEvents=포인터 잠금 sensorEvents=센서 storageEvents=저장소 timeEvents=시간 touchEvents=터치 otherEvents=기타 # LOCALIZATION NOTE (blackBoxCheckboxTooltip) = The tooltip text to display when # the user hovers over the checkbox used to toggle black boxing its associated # source. blackBoxCheckboxTooltip=검은 상자에 넣거나 꺼내기 # LOCALIZATION NOTE (noMatchingStringsText): The text to display in the # global search results when there are no matching strings after filtering. noMatchingStringsText=일치하는 것 없음 # LOCALIZATION NOTE (emptySearchText): This is the text that appears in the # filter text box when it is empty and the scripts container is selected. emptySearchText=스크립트 찾기 (%S) # LOCALIZATION NOTE (emptyChromeGlobalsFilterText): This is the text that # appears in the filter text box when it is empty and the chrome globals # container is selected. emptyChromeGlobalsFilterText=chrome global 필터 (%S) # LOCALIZATION NOTE (emptyVariablesFilterText): This is the text that # appears in the filter text box for the variables view container. emptyVariablesFilterText=변수 필터 # LOCALIZATION NOTE (emptyPropertiesFilterText): This is the text that # appears in the filter text box for the editor's variables view bubble. emptyPropertiesFilterText=속성 필터 # LOCALIZATION NOTE (searchPanelFilter): This is the text that appears in the # filter panel popup for the filter scripts operation. searchPanelFilter=스크립트 필터 (%S) # LOCALIZATION NOTE (searchPanelGlobal): This is the text that appears in the # filter panel popup for the global search operation. searchPanelGlobal=모든 파일에서 찾기 (%S) # LOCALIZATION NOTE (searchPanelFunction): This is the text that appears in the # filter panel popup for the function search operation. searchPanelFunction=함수 정의 찾기 (%S) # LOCALIZATION NOTE (searchPanelToken): This is the text that appears in the # filter panel popup for the token search operation. searchPanelToken=현재 파일에서 찾기 (%S) # LOCALIZATION NOTE (searchPanelGoToLine): This is the text that appears in the # filter panel popup for the line search operation. searchPanelGoToLine=다른 줄로 가기 (%S) # LOCALIZATION NOTE (searchPanelVariable): This is the text that appears in the # filter panel popup for the variables search operation. searchPanelVariable=변수 필터 (%S) # LOCALIZATION NOTE (breakpointMenuItem): The text for all the elements that # are displayed in the breakpoints menu item popup. breakpointMenuItem.setConditional=조건 breakpoint 설정 breakpointMenuItem.enableSelf=breakpoint 활성화 breakpointMenuItem.disableSelf=breakpoint 비활성화 breakpointMenuItem.deleteSelf=breakpoint 삭제 breakpointMenuItem.enableOthers=다른 breakpoint 활성화 breakpointMenuItem.disableOthers=다른 breakpoint 비활성화 breakpointMenuItem.deleteOthers=다른 breakpoint 삭제 breakpointMenuItem.enableAll=모든 breakpoint 활성화 breakpointMenuItem.disableAll=모든 breakpoint 비활성화 breakpointMenuItem.deleteAll=모든 breakpoint 삭제 # LOCALIZATION NOTE (loadingText): The text that is displayed in the script # editor when the laoding process has started but there is no file to display # yet. loadingText = 로드 중\u2026 # LOCALIZATION NOTE (errorLoadingText): The text that is displayed in the debugger # viewer when there is an error loading a file errorLoadingText=소스 읽기 오류:\n # LOCALIZATION NOTE (emptyStackText): The text that is displayed in the watch # expressions list to add a new item. addWatchExpressionText=조사식 추가 # LOCALIZATION NOTE (addWatchExpressionButton): The button that is displayed in the # variables view popup. addWatchExpressionButton=조사 # LOCALIZATION NOTE (emptyVariablesText): The text that is displayed in the # variables pane when there are no variables to display. emptyVariablesText = 표시할 수 있는 변수는 없습니다. # LOCALIZATION NOTE (scopeLabel): The text that is displayed in the variables # pane as a header for each variable scope (e.g. "Global scope, "With scope", # etc.). scopeLabel=%S 범위 # LOCALIZATION NOTE (watchExpressionsScopeLabel): The name of the watch # expressions scope. This text is displayed in the variables pane as a header for # the watch expressions scope. watchExpressionsScopeLabel=조사식 # LOCALIZATION NOTE (globalScopeLabel): The name of the global scope. This text # is added to scopeLabel and displayed in the variables pane as a header for # the global scope. globalScopeLabel=전역 # LOCALIZATION NOTE (variablesViewErrorStacktrace): This is the text that is # shown before the stack trace in an error. variablesViewErrorStacktrace=스택 추적: # LOCALIZATION NOTE (variablesViewMoreObjects): the text that is displayed # when you have an object preview that does not show all of the elements. At the end of the list # you see "N more..." in the web console output. # This is a semi-colon list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # #1 number of remaining items in the object # example: 3 more… variablesViewMoreObjects=#1 더 있음… # LOCALIZATION NOTE (variablesEditableNameTooltip): The text that is displayed # in the variables list on an item with an editable name. variablesEditableNameTooltip=편집하려면 더블 클릭 # LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed # in the variables list on an item with an editable name. variablesEditableValueTooltip=값을 바꾸려면 클릭 # LOCALIZATION NOTE (variablesCloseButtonTooltip): The text that is displayed # in the variables list on an item with which can be removed. variablesCloseButtonTooltip=삭제하려면 클릭 # LOCALIZATION NOTE (variablesEditButtonTooltip): The text that is displayed # in the variables list on a getter or setter which can be edited. variablesEditButtonTooltip=값을 설정하려면 클릭 # LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed # in a tooltip on the "open in inspector" button in the the variables list for a # DOMNode item. variablesDomNodeValueTooltip=검사기에서 노드를 눌러서 선택 # LOCALIZATION NOTE (configurable|...|Tooltip): The text that is displayed # in the variables list on certain variables or properties as tooltips. # Expanations of what these represent can be found at the following links: # https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty # https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible # https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen # https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed # It's probably best to keep these in English. <- 맞는 말 같아 그대로 둡니다. configurableTooltip=configurable enumerableTooltip=enumerable writableTooltip=writable frozenTooltip=frozen sealedTooltip=sealed extensibleTooltip=extensible overriddenTooltip=overridden WebIDLTooltip=WebIDL # LOCALIZATION NOTE (variablesSeparatorLabel): The text that is displayed # in the variables list as a separator between the name and value. variablesSeparatorLabel=: # LOCALIZATION NOTE (watchExpressionsSeparatorLabel): The text that is displayed # in the watch expressions list as a separator between the code and evaluation. watchExpressionsSeparatorLabel=\ → # LOCALIZATION NOTE (functionSearchSeparatorLabel): The text that is displayed # in the functions search panel as a separator between function's inferred name # and its real name (if available). functionSearchSeparatorLabel=← # LOCALIZATION NOTE (resumptionOrderPanelTitle): This is the text that appears # as a description in the notification panel popup, when multiple debuggers are # open in separate tabs and the user tries to resume them in the wrong order. # The substitution parameter is the URL of the last paused window that must be # resumed first. resumptionOrderPanelTitle=하나 이상의 디버거가 중단하고 있습니다. 가장 마지막으로 중단한 다음 위치에 있는 디버거를 풀어 주십시오.: %S evalGroupLabel=Evaluated Sources variablesViewMissingArgs=(unavailable) variablesViewOptimizedOut=(optimized away) variablesViewUninitialized=(uninitialized) ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/device.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside Device Emulation developer # tools. The correct localization of this file might be to keep it in English, # or another language commonly spoken among web developers. You want to make # that choice consistent across the developer tools. A good criteria is the # language in which you'd find the best documentation on web development on the # web. # LOCALIZATION NOTE: # These strings are category names in a list of devices that a user can choose # to simulate (e.g. "ZTE Open C", "VIA Vixen", "720p HD Television", etc). device.phones=Phones device.tablets=Tablets device.laptops=Laptops device.televisions=TVs device.consoles=Gaming consoles device.watches=Watches ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/eyedropper.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used in the Eyedropper color tool. # LOCALIZATION NOTE The correct localization of this file might be to keep it # in English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best documentation # on web development on the web. # LOCALIZATION NOTE (colorValue.copied): This text is displayed when the user selects a # color with the eyedropper and it's copied to the clipboard. colorValue.copied=복사함 ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/font-inspector.dtd ================================================ ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/gcli.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the Web Console # command line which is available from the Web Developer sub-menu # -> 'Web Console'. # The correct localization of this file might be to keep it in # English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best # documentation on web development on the web. # For each command there are in general two strings. As an example consider # the 'pref' command. # commandDesc (e.g. prefDesc for the command 'pref'): this string contains a # very short description of the command. It's designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. # commandManual (e.g. prefManual for the command 'pref'): this string will # contain a fuller description of the command. It's diplayed when the user # asks for help about a specific command (e.g. 'help pref'). # LOCALIZATION NOTE: This message is used to describe any command or command # parameter when no description has been provided. canonDescNone=(설명 없음) # LOCALIZATION NOTE: The default name for a group of parameters. canonDefaultGroupName=설정 # LOCALIZATION NOTE (canonProxyDesc, canonProxyManual): These commands are # used to execute commands on a remote system (using a proxy). Parameters: %S # is the name of the remote system. canonProxyDesc=%S에서 명령어 실행 canonProxyManual=원격 시스템에서 실행한 명령어 목록. 원격 시스템에 %S로 도달합니다. # LOCALIZATION NOTE: This error message is displayed when we try to add a new # command (using a proxy) where one already exists with the same name. canonProxyExists=이미 '%S'라는 명령어가 있습니다. # LOCALIZATION NOTE: This message describes the '{' command, which allows # entry of JavaScript like traditional developer tool command lines. cliEvalJavascript=바로 JavaScript 쓰기 # LOCALIZATION NOTE: This message is displayed when the command line has more # arguments than the current command can understand. cliUnusedArg=인자가 너무 많음 # LOCALIZATION NOTE: The title of the dialog which displays the options that # are available to the current command. cliOptions=사용 가능한 선택 # LOCALIZATION NOTE: The error message when the user types a command that # isn't registered cliUnknownCommand=유효하지 않은 명령어 # LOCALIZATION NOTE: A parameter should have a value, but doesn't cliIncompleteParam='%1$S' 값이 있어야 합니다. # LOCALIZATION NOTE: Error message given when a file argument points to a file # that does not exist, but should (e.g. for use with File->Open) %1$S is a # filename fileErrNotExists='%1$S'이 존재하지 않음 # LOCALIZATION NOTE: Error message given when a file argument points to a file # that exists, but should not (e.g. for use with File->Save As) %1$S is a # filename fileErrExists='%1$S'은 이미 있음 # LOCALIZATION NOTE: Error message given when a file argument points to a # non-file, when a file is needed. %1$S is a filename fileErrIsNotFile='%1$S'은 파일이 아님 # LOCALIZATION NOTE: Error message given when a file argument points to a # non-directory, when a directory is needed (e.g. for use with 'cd') %1$S is a # filename fileErrIsNotDirectory='%1$S'은 폴더가 아님 # LOCALIZATION NOTE: Error message given when a file argument does not match # the specified regular expression %1$S is a filename %2$S is a regular # expression fileErrDoesntMatch='%1$S'은 '%2$S'에 맞지 않음 # LOCALIZATION NOTE: When the menu has displayed all the matches that it # should (i.e. about 10 items) then we display this to alert the user that # more matches are available. fieldMenuMore=여러 개 일치, 글자를 더 쳐야 함 # LOCALIZATION NOTE: The command line provides completion for JavaScript # commands, however there are times when the scope of what we're completing # against can't be used. This error message is displayed when this happens. jstypeParseScope=범위 # LOCALIZATION NOTE (jstypeParseMissing, jstypeBeginSyntax, # jstypeBeginUnterm): These error messages are displayed when the command line # is doing JavaScript completion and encounters errors. jstypeParseMissing='%S' 프로퍼티 찾을 수 없음 jstypeBeginSyntax=문법 오류 jstypeBeginUnterm=string literal을 찾을 수 없음 # LOCALIZATION NOTE: This message is displayed if the system for providing # JavaScript completions encounters and error it displays this. jstypeParseError=오류 # LOCALIZATION NOTE (typesNumberNan, typesNumberNotInt2, typesDateNan): These # error messages are displayed when the command line is passed a variable # which has the wrong format and can't be converted. Parameters: %S is the # passed variable. typesNumberNan="%S"를 숫자로 변환할 수 없습니다. typesNumberNotInt2="%S"를 정수로 변환할 수 없습니다. typesDateNan="%S"를 날짜로 변환할 수 없습니다. # LOCALIZATION NOTE (typesNumberMax, typesNumberMin, typesDateMax, # typesDateMin): These error messages are displayed when the command line is # passed a variable which has a value out of range (number or date). # Parameters: %1$S is the passed variable, %2$S is the limit value. typesNumberMax=%1$S는 최대값을 넘을 수 없음: %2$S. typesNumberMin=%1$S는 최소값을 넘을 수 없음: %2$S. typesDateMax=%1$S은 허용되는 마지막 날짜를 지납니다: %2$S. typesDateMin=%1$S은 허용되는 첫 날짜를 지납니다: %2$S. # LOCALIZATION NOTE: This error message is displayed when the command line is # passed an option with a limited number of correct values, but the passed # value is not one of them. typesSelectionNomatch='%S'는 사용할 수 없습니다. # LOCALIZATION NOTE: This error message is displayed when the command line is # expecting a CSS query string, however the passed string is not valid. nodeParseSyntax=CSS 쿼리 문법 오류 # LOCALIZATION NOTE (nodeParseMultiple, nodeParseNone): These error messages # are displayed when the command line is expecting a CSS string that matches a # single node, but more nodes (or none) match. nodeParseMultiple=일치 결과 너무 많음 (%S) nodeParseNone=일치 결과 없음 # LOCALIZATION NOTE (helpDesc, helpManual, helpSearchDesc, helpSearchManual3): # These strings describe the "help" command, used to display a description of # a command (e.g. "help pref"), and its parameter 'search'. helpDesc=사용 가능한 명령어 도움말 helpManual=특정 명령어(검색 문자열이 일치했을 경우) 또는 사용 가능한 명령어(검색 문자열이 없거나 일치하는 것이 없는 경우)에 도움말을 표시합니다. helpSearchDesc=명령어 검색 helpSearchManual3=사용자 전용으로 표시되는 명령어 후보를 추천하기 위한 검색 문자열을 지정합니다. 정규 표현은 지원하지 않습니다. # LOCALIZATION NOTE: These strings are displayed in the help page for a # command in the console. helpManSynopsis=개요 # LOCALIZATION NOTE: This message is displayed in the help page if the command # has no parameters. helpManNone=없음 # LOCALIZATION NOTE (helpListAll): The heading shown in response to the 'help' # command when used without a filter, just above the list of known commands. helpListAll=사용 가능한 명령어: # LOCALIZATION NOTE (helpListPrefix, helpListNone): These messages are # displayed in response to the 'help ' command (i.e. with a search # string), just above the list of matching commands. Parameters: %S is the # search string. helpListPrefix='%1$S'(으)로 시작하는 명령어: helpListNone='%1$S'(으)로 시작하는 명령어가 없음 # LOCALIZATION NOTE (helpManRequired, helpManOptional, helpManDefault): When # the 'help x' command wants to show the manual for the 'x' command, it needs # to be able to describe the parameters as either required or optional, or if # they have a default value. helpManRequired=필수 helpManOptional=선택 helpManDefault=선택, 기본값=%1$S # LOCALIZATION NOTE: This forms part of the output from the 'help' command. # 'GCLI' is a project name and should be left untranslated. helpIntro=GCLI는 웹 개발자에게 매우 쓸모있는 명령줄을 만드려는 시도입니다. # LOCALIZATION NOTE: Text shown as part of the output of the 'help' command # when the command in question has sub-commands, before a list of the matching # sub-commands. subCommands=서브 명령어 # LOCALIZATION NOTE:This error message is displayed when the command line is # cannot find a match for the parse types. commandParseError=명령 행 구문 오류 # LOCALIZATION NOTE (contextDesc, contextManual, contextPrefixDesc): These # strings are used to describe the 'context' command and its 'prefix' # parameter. See localization comment for 'connect' for an explanation about # 'prefix'. contextDesc=한 무리의 명령어에 집중함 contextManual=앞으로 입력할 명령어의 prefix를 지정합니다. 예를 들어, 'context git'은 'git commit'이 아닌 'commit'만 쳐도 되게 합니다. contextPrefixDesc=명령어 prefix # LOCALIZATION NOTE: This message message displayed during the processing of # the 'context' command, when the found command is not a parent command. contextNotParentError='%1$S'은 부모 명령어가 아니므로 prefix로 사용할 수 없습니다. # LOCALIZATION NOTE (contextReply, contextEmptyReply): These messages are # displayed during the processing of the 'context' command, to indicate # success or that there is no command prefix. contextReply=%1$S를 prefix로 사용함 contextEmptyReply=명령어 prefix를 해제함 # LOCALIZATION NOTE (connectDesc, connectManual, connectPrefixDesc, # connectPortDesc, connectHostDesc, connectDupReply): These strings describe # the 'connect' command and all its available parameters. A 'prefix' is an # alias for the remote server (think of it as a "connection name"), and it # allows to identify a specific server when connected to multiple remote # servers. connectDesc=서버에 연결하는 대리 명령어 connectManual=서버에 연결하여 서버 명령어의 로컬 판을 만듭니다. 원격 명령어는 로컬 명령어와 구별할 수 있도록 처음에는 prefix가 붙습니다(이를 피하려면 context 명령어를 보십시오). connectPrefixDesc=가져온 명령어의 부모 prefix connectMethodDesc=연결 방식 connectUrlDesc=연결할 URL connectDupReply=%S라는 이름의 연결이 이미 있습니다. # LOCALIZATION NOTE: The output of the 'connect' command, telling the user # what it has done. Parameters: %S is the prefix command. See localization # comment for 'connect' for an explanation about 'prefix'. connectReply=명령어 %S를 추가했습니다 . # LOCALIZATION NOTE (disconnectDesc2, disconnectManual2, # disconnectPrefixDesc): These strings describe the 'disconnect' command and # all its available parameters. See localization comment for 'connect' for an # explanation about 'prefix'. disconnectDesc2=서버와의 연결 끊기 disconnectManual2=원격으로 명령어를 실행하는 현재 연결을 끊음 disconnectPrefixDesc=가져온 명령어의 대한 부모 prefix # LOCALIZATION NOTE: This is the output of the 'disconnect' command, # explaining the user what has been done. Parameters: %S is the number of # commands removed. disconnectReply=명령어 %S를 지웠습니다. # LOCALIZATION NOTE (globalDesc, globalWindowDesc, globalOutput): These # strings describe the 'global' command and its parameters globalDesc=JS 전역 바꾸기 globalWindowDesc=새 창/전역 globalOutput=JS 전역은 이제 %S 입니다. # LOCALIZATION NOTE: These strings describe the 'clear' command clearDesc=출력 영역 모두 지우기 # LOCALIZATION NOTE (langDesc, langOutput): These strings describe the 'lang' # command and its parameters langDesc=다른 언어로 명령어를 입력하기 langOutput=이제 %S를 사용합니다. # LOCALIZATION NOTE (prefDesc, prefManual, prefListDesc, prefListManual, # prefListSearchDesc, prefListSearchManual, prefShowDesc, prefShowManual, # prefShowSettingDesc, prefShowSettingManual): These strings describe the # 'pref' command and all its available sub-commands and parameters. prefDesc=설정에 대한 명령어 모음 prefManual=GCLI나 환경 설정을 표시 또는 변경하는 명령어입니다 prefListDesc=이용 가능한 설정값 표시하기 prefListManual=설정값의 목록을 표시합니다. 'search' 파라미터로 검색이 가능합니다 prefListSearchDesc=설정값 목록에서 검색 prefListSearchManual=입력된 문자열로 이용 가능한 설정값를 검색합니다. prefShowDesc=설정 표시 prefShowManual=지정된 설정 항목의 값을 표시합니다. prefShowSettingDesc=표시 설정 항목 prefShowSettingManual=표시 설정 항목 이름 # LOCALIZATION NOTE: This message is used to show the preference name and the # associated preference value. Parameters: %1$S is the preference name, %2$S # is the preference value. prefShowSettingValue=%1$S: %2$S # LOCALIZATION NOTE (prefSetDesc, prefSetManual, prefSetSettingDesc, # prefSetSettingManual, prefSetValueDesc, prefSetValueManual): These strings # describe the 'pref set' command and all its parameters. prefSetDesc=설정 변경 prefSetManual=환경에서 정의된 설정을 변경합니다. prefSetSettingDesc=변경할 설정 항목 prefSetSettingManual=변경할 설정 항목 이름 prefSetValueDesc=새 값 prefSetValueManual=지정된 설정 항목이 새 값입니다. # LOCALIZATION NOTE (prefResetDesc, prefResetManual, prefResetSettingDesc, # prefResetSettingManual): These strings describe the 'pref reset' command and # all its parameters. prefResetDesc=설정 다시 바꾸기 prefResetManual=설정 항목 값을 시스템의 기본 값으로 재설정합니다. prefResetSettingDesc=재설정 항목 prefResetSettingManual=시스템의 기본값 재설정 하는 설정 항목의 이름 # LOCALIZATION NOTE (prefOutputFilter): Displayed in the output from the 'pref # list' command as a label to an input element that allows the user to filter # the results prefOutputFilter=필터 # LOCALIZATION NOTE (prefOutputName, prefOutputValue): These strings are # displayed in the output from the 'pref list' command as table headings. prefOutputName=이름 prefOutputValue=값 # LOCALIZATION NOTE (introDesc, introManual): These strings describe the # 'intro' command. The localization of 'Got it!' should be the same used in # introTextGo. introDesc=첫번째 메시지 표시 introManual='알겠습니다!' 버튼이 클릭될 때까지 새로운 사용자에게 표시되어 있던 첫번째 메시지를 다시 표시합니다 # LOCALIZATION NOTE (introTextOpening3, introTextCommands, introTextKeys2, # introTextF1Escape, introTextGo): These strings are displayed when the user # first opens the developer toolbar to explain the command line, and is shown # each time it is opened until the user clicks the 'Got it!' button. introTextOpening3=GCLI는 웹 개발자에게 매우 쓸모있는 명령줄을 만드려는 시도입니다. introTextCommands=명령어 목록을 보려면 introTextKeys2=를 입력하시고, 명령어에 대한 도움말을 보려면 F1을, 닫으려면 ESC를 누르십시오. introTextF1Escape= introTextGo=알겠습니다! # LOCALIZATION NOTE: This is a short description of the 'hideIntro' setting. hideIntroDesc=첫번째 메시지 표시 # LOCALIZATION NOTE: This is a description of the 'eagerHelper' setting. It's # displayed when the user asks for help on the settings. eagerHelper allows # users to select between showing no tooltips, permanent tooltips, and only # important tooltips. eagerHelperDesc=도구 팁 표시 빈도 ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/gclicommands.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside Web Console commands. # The Web Console command line is available from the Web Developer sub-menu # -> 'Web Console'. # # The correct localization of this file might be to keep it in # English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best # documentation on web development on the web. # LOCALIZATION NOTE (helpDesc) A very short string used to describe the # function of the help command. helpDesc=사용 가능한 명령어 도움말 보기 # LOCALIZATION NOTE (helpAvailable) Used in the output of the help command to # explain the contents of the command help table. helpAvailable=사용 가능한 명령어 # LOCALIZATION NOTE (consoleDesc) A very short string used to describe the # function of the console command. consoleDesc=콘솔 제어 가능 명령어 # LOCALIZATION NOTE (consoleManual) A longer description describing the # set of commands that control the console. consoleManual=웹 콘솔 삭제 후 닫기 # LOCALIZATION NOTE (consoleclearDesc) A very short string used to describe the # function of the 'console clear' command. consoleclearDesc=콘솔 내용 지우기 # LOCALIZATION NOTE (screenshotDesc) A very short description of the # 'screenshot' command. See screenshotManual for a fuller description of what # it does. This string is designed to be shown in a menu alongside the # command name, which is why it should be as short as possible. screenshotDesc=페이지 이미지 저장 # LOCALIZATION NOTE (screenshotManual) A fuller description of the 'screenshot' # command, displayed when the user asks for help on what it does. screenshotManual=현재 보이는 페이지를 PNG 파일로 저장합니다. (약간 지연 있을 수 있음) # LOCALIZATION NOTE (screenshotFilenameDesc) A very short string to describe # the 'filename' parameter to the 'screenshot' command, which is displayed in # a dialog when the user is using this command. screenshotFilenameDesc=파일명 # LOCALIZATION NOTE (screenshotFilenameManual) A fuller description of the # 'filename' parameter to the 'screenshot' command, displayed when the user # asks for help on what it does. screenshotFilenameManual=스크린샷을 저장할 파일명은 .png 확장자를 가져야 합니다. # LOCALIZATION NOTE (screenshotClipboardDesc) A very short string to describe # the 'clipboard' parameter to the 'screenshot' command, which is displayed in # a dialog when the user is using this command. screenshotClipboardDesc=스크린샷을 클립보드에 저장하시겠습니까? (true/false) # LOCALIZATION NOTE (screenshotClipboardManual) A fuller description of the # 'clipboard' parameter to the 'screenshot' command, displayed when the user # asks for help on what it does. screenshotClipboardManual=스크린샷을 파일로 저장하지 않고 복사하려면 true. # LOCALIZATION NOTE (screenshotChromeDesc) A very short string to describe # the 'chrome' parameter to the 'screenshot' command, which is displayed in # a dialog when the user is using this command. # The argument (%1$S) is the browser name. screenshotChromeDesc2=%1$S의 chrome 창도 캡쳐하시겠습니까? (true/false) # LOCALIZATION NOTE (screenshotChromeManual) A fuller description of the # 'chrome' parameter to the 'screenshot' command, displayed when the user # asks for help on what it does. # The argument (%1$S) is the browser name. screenshotChromeManual2=웹페이지의 콘텐츠 창 대신 %1$S 창의 스크린샷을 찍으려면 true로 하십시오. # LOCALIZATION NOTE (screenshotGroupOptions) A label for the optional options of # the screenshot command. screenshotGroupOptions=옵션 # LOCALIZATION NOTE (screenshotDelayDesc) A very short string to describe # the 'delay' parameter to the 'screenshot' command, which is displayed in # a dialog when the user is using this command. screenshotDelayDesc=지연 (초) # LOCALIZATION NOTE (screenshotDelayManual) A fuller description of the # 'delay' parameter to the 'screenshot' command, displayed when the user # asks for help on what it does. screenshotDelayManual=스크린샷을 저장하기 전 지연할 시간입니다. (초 단위) # LOCALIZATION NOTE (screenshotFullscreenDesc) A very short string to describe # the 'fullscreen' parameter to the 'screenshot' command, which is displayed in # a dialog when the user is using this command. screenshotFullPageDesc=전체 웹 페이지를 캡쳐할까요? (true/false) # LOCALIZATION NOTE (screenshotFullscreenManual) A fuller description of the # 'fullscreen' parameter to the 'screenshot' command, displayed when the user # asks for help on what it does. screenshotFullPageManual=True를 선택하면 스크롤 범위 밖의 전체 웹 페이지를 포함하게 됩니다. # LOCALIZATION NOTE (screenshotSelectorChromeConflict) Exception thwon when user # tries to use 'selector' option along with 'chrome' option of the screenshot # command. Refer: https://bugzilla.mozilla.org/show_bug.cgi?id=659268#c7 screenshotSelectorChromeConflict=chrome 설정이 true일 때에는 선택자 설정을 사용할 수 없음 # LOCALIZATION NOTE (screenshotGeneratedFilename) The auto generated filename # when no file name is provided. the first argument (%1$S) is the date string # in yyyy-mm-dd format and the second argument (%2$S) is the time string # in HH.MM.SS format. Please don't add the extension here. screenshotGeneratedFilename=스크린샷 %1$S %2$S # LOCALIZATION NOTE (screenshotErrorSavingToFile) Text displayed to user upon # encountering error while saving the screenshot to the file specified. screenshotErrorSavingToFile=저장 오류 # LOCALIZATION NOTE (screenshotSavedToFile) Text displayed to user when the # screenshot is successfully saved to the file specified. screenshotSavedToFile=저장 # LOCALIZATION NOTE (screenshotErrorCopying) Text displayed to user upon # encountering error while copying the screenshot to clipboard. screenshotErrorCopying=클립보드에 복사하는 중에 오류가 발생하였습니다. # LOCALIZATION NOTE (screenshotCopied) Text displayed to user when the # screenshot is successfully copied to the clipboard. screenshotCopied=클립보드에 복사하였습니다. # LOCALIZATION NOTE (screenshotTooltip) Text displayed as tooltip for screenshot button in devtools ToolBox. screenshotTooltip=전체 페이지의 스크린샷을 찍기 # LOCALIZATION NOTE (highlightDesc)A very short description of the # 'highlight'command. See highlightManual for a fuller description of what # it does. This string is designed to be shown in a menu alongside the # command name, which is why it should be as short as possible. highlightDesc =노드 강조 표시 # LOCALIZATION NOTE (highlightManual)A fuller description of the'highlight' # command, displayed when the user asks for help on what it does. highlightManual = 페이지 내에서 선택자에 부합하는 노드 강조 표시 #LOCALIZATION NOTE (highlightSelectorDesc)A very short string to describe #the'selector'parameter to the'highlight'command, which is displayed in #a dialog when the user is using this command. highlightSelectorDesc =CSS 선택자 #LOCALIZATION NOTE (highlightSelectorManual)A fuller description of the #'selector'parameter to the'highlight'command, displayed when the user #asks for help on what it does. highlightSelectorManual =페이지 내 노드에 부합하는 CSS 선택자 #LOCALIZATION NOTE (highlightOptionsDesc)The title of a set of options to #the'highlight'command, displayed as a heading to the list of option. highlightOptionsDesc =옵션 #LOCALIZATION NOTE (highlightHideGuidesDesc)A very short string to describe #the'hideguides'option parameter to the'highlight'command, which is #displayed in a dialog when the user is using this command. highlightHideGuidesDesc =가이드 라인 숨김 #LOCALIZATION NOTE (highlightHideGuidesManual)A fuller description of the #'hideguides'option parameter to the'highlight'command, displayed when the #user asks for help on what it does. highlightHideGuidesManual =강조 표시된 노드의 가이드 라인을 숨깁니다. #LOCALIZATION NOTE (highlightShowInfoBarDesc)A very short string to describe #the'showinfobar'option parameter to the'highlight'command, which is #displayed in a dialog when the user is using this command. highlightShowInfoBarDesc =노드 정보 표시 #LOCALIZATION NOTE (highlightShowInfoBarManual)A fuller description of the #'showinfobar'option parameter to the'highlight'command, displayed when the #user asks for help on what it does. highlightShowInfoBarManual =강조 표시된 노드 정보를 표시합니다. (태그 이름과 속성과 크기가 표시) #LOCALIZATION NOTE (highlightShowAllDesc)A very short string to describe #the'showall'option parameter to the'highlight'command, which is #displayed in a dialog when the user is using this command. highlightShowAllDesc =같은 항목 모두 표시 #LOCALIZATION NOTE (highlightShowAllManual)A fuller description of the #'showall'option parameter to the'highlight'command, displayed when the #user asks for help on what it does. highlightShowAllManual =대부분의 노드가 부합하는 경우, 페이지가 느려지는 것을 막기 위해 첫 100개만 표시합니다. 현재 옵션을 지정하면 같은 것을 모두 표시합니다. #LOCALIZATION NOTE (highlightRegionDesc)A very short string to describe the #'region'option parameter to the'highlight'command, which is displayed in a #dialog when the user is using this command. highlightRegionDesc =박스 모델 #LOCALIZATION NOTE (highlightRegionManual)A fuller description of the'region' #option parameter to the'highlight'command, displayed when the user asks for #help on what it does. highlightRegionManual =박스 모델을 강조 표시합니다: 'content','padding','border','margin' #LOCALIZATION NOTE (highlightFillDesc)A very short string to describe the #'fill'option parameter to the'highlight'command, which is displayed in a #dialog when the user is using this command. highlightFillDesc = 채우기 #LOCALIZATION NOTE (highlightFillManual)A fuller description of the'fill' #option parameter to the'highlight'command, displayed when the user asks for #help on what it does. highlightFillManual =지정한 색상으로 박스를 채웁니다. #LOCALIZATION NOTE (highlightKeepDesc)A very short string to describe the #'keep'option parameter to the'highlight'command, which is displayed in a #dialog when the user is using this command. highlightKeepDesc =강조 표시 유지 #LOCALIZATION NOTE (highlightKeepManual)A fuller description of the'keep' #option parameter to the'highlight'command, displayed when the user asks for #help on what it does. highlightKeepManual =명령어를 실행하면 강조표시가 숨김에 되는데, 현재 옵션을 지정한대로 표시됩니다. #LOCALIZATION NOTE (highlightOutputConfirm)A confirmation message for the #'highlight'command, displayed to the user once the command has been entered, #informing the user how many nodes have been highlighted successfully and how #to turn highlighting off highlightOutputConfirm =%1$S개 노드 표시 #LOCALIZATION NOTE (highlightOutputMaxReached)A confirmation message for the #'highlight'command, displayed to the user once the command has been entered, #informing the user how many nodes have been highlighted successfully and that #some nodes could not be highlighted due to the maximum number of nodes being #reached, and how to turn highlighting off highlightOutputMaxReached =%1$S개의 노드를 찾았지만 %2$S개 노드에 표시하지 않습니다. '-showall'을 지정하면 모두 표시합니다. #LOCALIZATION NOTE (unhighlightDesc)A very short description of the #'unhighlight'command. See unhighlightManual for a fuller description of what #it does. This string is designed to be shown in a menu alongside the #command name, which is why it should be as short as possible. unhighlightDesc = 강조 표시 제거 #LOCALIZATION NOTE (unhighlightManual)A fuller description of the'unhighlight' #command, displayed when the user asks for help on what it does. unhighlightManual ='highlight'명령으로 이전에 표시한 노드의 강조표시를 제거합니다 # LOCALIZATION NOTE (restartBrowserDesc) A very short description of the # 'restart' command. This string is designed to be shown in a menu alongside the # command name, which is why it should be as short as possible. # The argument (%1$S) is the browser name. restartBrowserDesc=%1$S 다시 시작 # LOCALIZATION NOTE (restartBrowserNocacheDesc) A very short string to # describe the 'nocache' parameter to the 'restart' command, which is # displayed in a dialog when the user is using this command. restartBrowserNocacheDesc=다시 시작할 때 콘텐츠를 읽지 않음 # LOCALIZATION NOTE (restartBrowserRequestCancelled) A string displayed to the # user when a scheduled restart has been aborted by the user. restartBrowserRequestCancelled=사용자가 다시 시작 요청을 취소했습니다. # LOCALIZATION NOTE (restartBrowserRestarting) A string displayed to the # user when a restart has been initiated without a delay. # The argument (%1$S) is the browser name. restartBrowserRestarting=%1$S를 다시 시작하는 중… # LOCALIZATION NOTE (inspectDesc) A very short description of the 'inspect' # command. See inspectManual for a fuller description of what it does. This # string is designed to be shown in a menu alongside the command name, which # is why it should be as short as possible. inspectDesc=노드 검사 # LOCALIZATION NOTE (inspectManual) A fuller description of the 'inspect' # command, displayed when the user asks for help on what it does. inspectManual=DOM 하이라이터를 여는 CSS 선택자를 사용하는 속성의 프로퍼티와 차원 조사하기 # LOCALIZATION NOTE (inspectNodeDesc) A very short string to describe the # 'node' parameter to the 'inspect' command, which is displayed in a dialog # when the user is using this command. inspectNodeDesc=CSS 선택자 # LOCALIZATION NOTE (inspectNodeManual) A fuller description of the 'node' # parameter to the 'inspect' command, displayed when the user asks for help # on what it does. inspectNodeManual=싱글 요소를 인식하는 Document.querySelector를 사용하는 CSS 선택자 # LOCALIZATION NOTE (eyedropperDesc) A very short description of the 'eyedropper' # command. See eyedropperManual for a fuller description of what it does. This # string is designed to be shown in a menu alongside the command name, which # is why it should be as short as possible. eyedropperDesc=페이지에서 색상 뽑아내기 # LOCALIZATION NOTE (eyedropperManual) A fuller description of the 'eyedropper' # command, displayed when the user asks for help on what it does. eyedropperManual=페이지의 한 곳을 크게 하여 픽셀을 검사하고 색상값을 복사함 # LOCALIZATION NOTE (eyedropperTooltip) A string displayed as the # tooltip of button in devtools toolbox which toggles the Eyedropper tool. eyedropperTooltip=페이지에서 색상 뽑아내기 # LOCALIZATION NOTE (tiltDesc) A very short description of the 'tilt' # command. See tiltManual for a fuller description of what it does. This # string is designed to be shown in a menu alongside the command name, which # is why it should be as short as possible. tiltDesc=웹 페이지 3D 표시 # LOCALIZATION NOTE (tiltManual) A fuller description of the 'tilt' # command, displayed when the user asks for help on what it does. tiltManual=웹 페이지의 다양한 파트의 연결을 3D 공간에 표시하고 검사합니다. # LOCALIZATION NOTE (tiltOpenDesc) A very short description of the 'tilt inspect' # command. See tiltOpenManual for a fuller description of what it does. This # string is designed to be shown in a menu alongside the command name, which # is why it should be as short as possible. tiltOpenDesc=3D 검사 열기 # LOCALIZATION NOTE (tiltOpenManual) A fuller description of the 'tilt translate' # command, displayed when the user asks for help on what it does. tiltOpenManual=3D 검사 보기를 초기화하고 CSS 선택자로 지정된 노드를 보여 줍니다. # LOCALIZATION NOTE (tiltToggleTooltip) A string displayed as the # tooltip of button in devtools toolbox which toggles Tilt 3D View. tiltToggleTooltip=3D 보기 # LOCALIZATION NOTE (tiltTranslateDesc) A very short description of the 'tilt translate' # command. See tiltTranslateManual for a fuller description of what it does. This # string is designed to be shown in a menu alongside the command name, which # is why it should be as short as possible. tiltTranslateDesc=3D 객체 움직이기 # LOCALIZATION NOTE (tiltTranslateManual) A fuller description of the 'tilt translate' # command, displayed when the user asks for help on what it does. tiltTranslateManual=3D 객체를 특정의 방향에 평행이동 시킵니다. # LOCALIZATION NOTE (tiltTranslateXDesc) A very short string to describe the # 'x' parameter to the 'tilt translate' command, which is displayed in a dialog # when the user is using this command. tiltTranslateXDesc=X축 (픽셀) # LOCALIZATION NOTE (tiltTranslateXManual) A fuller description of the 'x' # parameter to the 'translate' command, displayed when the user asks for help # on what it does. tiltTranslateXManual=X축방향 이동량 (픽셀 단위) # LOCALIZATION NOTE (tiltTranslateYDesc) A very short string to describe the # 'y' parameter to the 'tilt translate' command, which is displayed in a dialog # when the user is using this command. tiltTranslateYDesc=Y축 (픽셀) # LOCALIZATION NOTE (tiltTranslateYManual) A fuller description of the 'y' # parameter to the 'translate' command, displayed when the user asks for help # on what it does. tiltTranslateYManual=Y축방향 이동량 (픽셀 단위) # LOCALIZATION NOTE (tiltRotateDesc) A very short description of the 'tilt rotate' # command. See tiltRotateManual for a fuller description of what it does. This # string is designed to be shown in a menu alongside the command name, which # is why it should be as short as possible. tiltRotateDesc=3D 객체 회전 하기 # LOCALIZATION NOTE (tiltRotateManual) A fuller description of the 'tilt rotate' # command, displayed when the user asks for help on what it does. tiltRotateManual=3D 객체를 특정의 방향에 회전시킵니다 # LOCALIZATION NOTE (tiltRotateXDesc) A very short string to describe the # 'x' parameter to the 'tilt rotate' command, which is displayed in a dialog # when the user is using this command. tiltRotateXDesc=X축 (각도) # LOCALIZATION NOTE (tiltRotateXManual) A fuller description of the 'x' # parameter to the 'rotate' command, displayed when the user asks for help # on what it does. tiltRotateXManual=X축방향 회전량 (각도) # LOCALIZATION NOTE (tiltRotateYDesc) A very short string to describe the # 'y' parameter to the 'tilt rotate' command, which is displayed in a dialog # when the user is using this command. tiltRotateYDesc=Y축 (각도) # LOCALIZATION NOTE (tiltRotateYManual) A fuller description of the 'y' # parameter to the 'rotate' command, displayed when the user asks for help # on what it does. tiltRotateYManual=Y축방향 회전량 (각도) # LOCALIZATION NOTE (tiltRotateZDesc) A very short string to describe the # 'z' parameter to the 'tilt rotate' command, which is displayed in a dialog # when the user is using this command. tiltRotateZDesc=Z축 (각도) # LOCALIZATION NOTE (tiltRotateZManual) A fuller description of the 'z' # parameter to the 'rotate' command, displayed when the user asks for help # on what it does. tiltRotateZManual=Z축방향 회전량 (각도) # LOCALIZATION NOTE (tiltZoomDesc) A very short description of the 'tilt zoom' # command. See tiltZoomManual for a fuller description of what it does. This # string is designed to be shown in a menu alongside the command name, which # is why it should be as short as possible. tiltZoomDesc=3D 객체 확대/축소 # LOCALIZATION NOTE (tiltZoomManual) A fuller description of the 'tilt zoom' # command, displayed when the user asks for help on what it does. tiltZoomManual=3D 객체를 Z축방향으로 작동시킵니다 # LOCALIZATION NOTE (tiltZoomAmountDesc) A very short string to describe the # 'zoom' parameter to the 'tilt zoom' command, which is displayed in a dialog # when the user is using this command. tiltZoomAmountDesc=확대/축소 (픽셀 단위) # LOCALIZATION NOTE (tiltZoomAmmuntManual) A fuller description of the 'zoom' # parameter to the 'zoom' command, displayed when the user asks for help # on what it does. tiltZoomAmountManual=Z축방향 이동량 (픽셀 단위) # LOCALIZATION NOTE (tiltResetDesc) A very short description of the 'tilt reset' # command. See tiltResetManual for a fuller description of what it does. This # string is designed to be shown in a menu alongside the command name, which # is why it should be as short as possible. tiltResetDesc=평행이동, 회전, 확대/축소를 재설정 합니다. # LOCALIZATION NOTE (tiltResetManual) A fuller description of the 'tilt reset' # command, displayed when the user asks for help on what it does. tiltResetManual=3D 객체에 적용된 변형 처리를 재설정 합니다. # LOCALIZATION NOTE (tiltCloseDesc) A very short description of the 'tilt close' # command. See tiltCloseManual for a fuller description of what it does. This # string is designed to be shown in a menu alongside the command name, which # is why it should be as short as possible. tiltCloseDesc=3D 검사 보기 닫기 # LOCALIZATION NOTE (tiltCloseManual) A fuller description of the 'tilt close' # command, displayed when the user asks for help on what it does. tiltCloseManual=3D 검사 보기를 닫고, 표준 검사하기로 돌아옵니다. # LOCALIZATION NOTE (debuggerClosed) Used in the output of several commands # to explain that the debugger must be opened first. debuggerClosed=이 명령어를 사용하려면 디버거가 반드시 열려 있어야 함 # LOCALIZATION NOTE (debuggerStopped) Used in the output of several commands # to explain that the debugger must be opened first. debuggerStopped=디버거가 열린 다음에 중단점을 설치해야 함 # LOCALIZATION NOTE (breakDesc) A very short string used to describe the # function of the break command. breakDesc=중단점 관리 # LOCALIZATION NOTE (breakManual) A longer description describing the # set of commands that control breakpoints. breakManual=중단점을 나열, 추가, 또는 삭제합니다. # LOCALIZATION NOTE (breaklistDesc) A very short string used to describe the # function of the 'break list' command. breaklistDesc=기존 중단점을 표시 # LOCALIZATION NOTE (breaklistNone) Used in the output of the 'break list' # command to explain that the list is empty. breaklistNone=설치한 중단점이 없음 # LOCALIZATION NOTE (breaklistOutRemove) A title used in the output from the # 'break list' command on a button which can be used to remove breakpoints breaklistOutRemove=삭제 # LOCALIZATION NOTE (breakaddAdded) Used in the output of the 'break add' # command to explain that a breakpoint was added. breakaddAdded=설치된 중단점 # LOCALIZATION NOTE (breakaddFailed) Used in the output of the 'break add' # command to explain that a breakpoint could not be added. breakaddFailed=중단점을 설치할 수 없습니다: %S # LOCALIZATION NOTE (breakaddDesc) A very short string used to describe the # function of the 'break add' command. breakaddDesc=중단점 설치 # LOCALIZATION NOTE (breakaddManual) A longer description describing the # set of commands that are responsible for adding breakpoints. breakaddManual=지원하는 중단점 종류: 행 중단점 # LOCALIZATION NOTE (breakaddlineDesc) A very short string used to describe the # function of the 'break add line' command. breakaddlineDesc=행 중단점 설치 # LOCALIZATION NOTE (breakaddlineFileDesc) A very short string used to describe # the function of the file parameter in the 'break add line' command. breakaddlineFileDesc=JavaScript 파일 URI # LOCALIZATION NOTE (breakaddlineLineDesc) A very short string used to describe # the function of the line parameter in the 'break add line' command. breakaddlineLineDesc=행 번호 # LOCALIZATION NOTE (breakdelDesc) A very short string used to describe the # function of the 'break del' command. breakdelDesc=중단점을 지움 # LOCALIZATION NOTE (breakdelBreakidDesc) A very short string used to describe # the function of the index parameter in the 'break del' command. breakdelBreakidDesc=중단점 인덱스 # LOCALIZATION NOTE (breakdelRemoved) Used in the output of the 'break del' # command to explain that a breakpoint was removed. breakdelRemoved=중단점이 제거됨 # LOCALIZATION NOTE (dbgDesc) A very short string used to describe the # function of the dbg command. dbgDesc=디버거 관리 # LOCALIZATION NOTE (dbgManual) A longer description describing the # set of commands that control the debugger. dbgManual=코드 줄에서 메인 스레드의 정지와 복귀, 호출 시작과 정지 및 건너뛰기를 하는 명령어 # LOCALIZATION NOTE (dbgOpen) A very short string used to describe the function # of the dbg open command. dbgOpen=디버거 열기 # LOCALIZATION NOTE (dbgClose) A very short string used to describe the function # of the dbg close command. dbgClose=디버거 닫기 # LOCALIZATION NOTE (dbgInterrupt) A very short string used to describe the # function of the dbg interrupt command. dbgInterrupt=메인 스레드 정지 # LOCALIZATION NOTE (dbgContinue) A very short string used to describe the # function of the dbg continue command. dbgContinue=메인 스레드를 복귀하고 다음 중단점이 나오거나 스크립트가 끝날 때까지 중단점를 따라 이어서 실행합니다. # LOCALIZATION NOTE (dbgStepDesc) A very short string used to describe the # function of the dbg step command. dbgStepDesc=호출 관리 # LOCALIZATION NOTE (dbgStepManual) A longer description describing the # set of commands that control stepping. dbgStepManual=코드 줄에서 호출 시작과 정지 및 건너뛰기를 하는 명령어 # LOCALIZATION NOTE (dbgStepOverDesc) A very short string used to describe the # function of the dbg step over command. dbgStepOverDesc=현재 구문을 실행하고 다음 구문에서 멈춥니다. 현재 구문이 함수 호출이면 디버거는 함수 전체를 실행하고 함수 호출 뒤에 나오는 다음 구문에서 멈춥니다. # LOCALIZATION NOTE (dbgStepInDesc) A very short string used to describe the # function of the dbg step over command. dbgStepInDesc=현재 구문을 실행하고 다음 구문에서 멈춥니다. 현재 구문이 함수 호출이면 디버거는 그 함수로 호출 시작을 하고, 그렇지 않으면 다음 구문에서 멈춥니다. # LOCALIZATION NOTE (dbgStepOutDesc) A very short string used to describe the # function of the dbg step over command. dbgStepOutDesc=함수가 다른 함수 안에 있으면 현재 함수에서 나와 한 단계 위로 올라갑니다. 메인 바디 안에 있으면 스크립트는 끝이나 다음 중단점까지 실행됩니다. 넘어간 구문은 실행되나 호출하지는 않습니다. # LOCALIZATION NOTE (dbgListSourcesDesc) A very short string used to describe the # function of the dbg list command. dbgListSourcesDesc=디버거가 읽어들인 소스 URL을 나열함 # LOCALIZATION NOTE (dbgBlackBoxDesc) A very short string used to describe the # function of the 'dbg blackbox' command. dbgBlackBoxDesc=디버거에서 소스를 검은 상자에 넣기 # LOCALIZATION NOTE (dbgBlackBoxSourceDesc) A very short string used to describe the # 'source' parameter to the 'dbg blackbox' command. dbgBlackBoxSourceDesc=검은 상자에 넣을 소스 # LOCALIZATION NOTE (dbgBlackBoxGlobDesc) A very short string used to describe the # 'glob' parameter to the 'dbg blackbox' command. dbgBlackBoxGlobDesc=이 glob에 맞는 모든 소스 검은 상자에 넣기 (예: "*.min.js") # LOCALIZATION NOTE (dbgBlackBoxInvertDesc) A very short string used to describe the # 'invert' parameter to the 'dbg blackbox' command. dbgBlackBoxInvertDesc=조건을 뒤집습니다. 즉, 주어진 소스를 뺀 모든 소스나 주어진 glob 패턴에 맞지 않은 소스를 검은 상자에 넣습니다. # LOCALIZATION NOTE (dbgBlackBoxEmptyDesc) A very short string used to let the # user know that no sources were black boxed. dbgBlackBoxEmptyDesc=(검은 상자에 소스가 없음) # LOCALIZATION NOTE (dbgBlackBoxNonEmptyDesc) A very short string used to let the # user know which sources were black boxed. dbgBlackBoxNonEmptyDesc=검은 상자에 다음 소스가 들어 있음: # LOCALIZATION NOTE (dbgBlackBoxErrorDesc) A very short string used to let the # user know there was an error black boxing a source (whose url follows this # text). dbgBlackBoxErrorDesc=검은 상자에 넣기 오류: # LOCALIZATION NOTE (dbgUnBlackBoxDesc) A very short string used to describe the # function of the 'dbg unblackbox' command. dbgUnBlackBoxDesc=디버거에서 소스를 검은 상자에서 꺼내기 # LOCALIZATION NOTE (dbgUnBlackBoxSourceDesc) A very short string used to describe the # 'source' parameter to the 'dbg unblackbox' command. dbgUnBlackBoxSourceDesc=검은 상자에서 꺼낼 소스 # LOCALIZATION NOTE (dbgUnBlackBoxGlobDesc) A very short string used to describe the # 'glob' parameter to the 'dbg blackbox' command. dbgUnBlackBoxGlobDesc=이 glob에 맞는 모든 소스 검은 상자에서 꺼내기 (예: "*.min.js") # LOCALIZATION NOTE (dbgUnBlackBoxEmptyDesc) A very short string used to let the # user know that we did not stop black boxing any sources. dbgUnBlackBoxEmptyDesc=(검은 상자에서 소스를 하나도 꺼내지 않았음) # LOCALIZATION NOTE (dbgUnBlackBoxNonEmptyDesc) A very short string used to let the # user know which sources we stopped black boxing. dbgUnBlackBoxNonEmptyDesc=검은 상자에서 다음 소스를 꺼냄: # LOCALIZATION NOTE (dbgUnBlackBoxErrorDesc) A very short string used to let the # user know there was an error black boxing a source (whose url follows this # text). dbgUnBlackBoxErrorDesc=검은 상자에서 소스 꺼내기 오류: # LOCALIZATION NOTE (dbgUnBlackBoxInvertDesc) A very short string used to describe the # 'invert' parameter to the 'dbg unblackbox' command. dbgUnBlackBoxInvertDesc=조건을 뒤집습니다. 즉, 주어진 소스를 뺀 모든 소스나 주어진 glob 패턴에 맞지 않은 소스를 검은 상자에서 꺼냅니다. # LOCALIZATION NOTE (consolecloseDesc) A very short description of the # 'console close' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. consolecloseDesc=콘솔 닫기 # LOCALIZATION NOTE (consoleopenDesc) A very short description of the # 'console open' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. consoleopenDesc=콘솔 열기 # LOCALIZATION NOTE (editDesc) A very short description of the 'edit' # command. See editManual2 for a fuller description of what it does. This # string is designed to be shown in a menu alongside the command name, which # is why it should be as short as possible. editDesc=웹 페이지 미조정 # LOCALIZATION NOTE (editManual2) A fuller description of the 'edit' command, # displayed when the user asks for help on what it does. editManual2=이 웹 페이지의 자원 중 하나를 편집 # LOCALIZATION NOTE (editResourceDesc) A very short string to describe the # 'resource' parameter to the 'edit' command, which is displayed in a dialog # when the user is using this command. editResourceDesc=편집 자원 URL # LOCALIZATION NOTE (editLineToJumpToDesc) A very short string to describe the # 'line' parameter to the 'edit' command, which is displayed in a dialog # when the user is using this command. editLineToJumpToDesc=지정 행 이동 # LOCALIZATION NOTE (resizePageDesc) A very short string to describe the # 'resizepage' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. resizePageDesc=페이지 크기 조절 # LOCALIZATION NOTE (resizePageArgWidthDesc) A very short string to describe the # 'width' parameter to the 'resizepage' command, which is displayed in a dialog # when the user is using this command. resizePageArgWidthDesc=픽셀 단위 너비 # LOCALIZATION NOTE (resizePageArgWidthDesc) A very short string to describe the # 'height' parameter to the 'resizepage' command, which is displayed in a dialog # when the user is using this command. resizePageArgHeightDesc=픽셀 단위 높이 # LOCALIZATION NOTE (resizeModeOnDesc) A very short string to describe the # 'resizeon ' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. resizeModeOnDesc=반응형 웹 디자인 보기로 들어가기 # LOCALIZATION NOTE (resizeModeOffDesc) A very short string to describe the # 'resize off' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. resizeModeOffDesc=반응형 웹 디자인 보기에서 나오기 # LOCALIZATION NOTE (resizeModeToggleDesc) A very short string to describe the # 'resize toggle' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. resizeModeToggleDesc=반응형 웹 디자인 보기 열고 닫기 # LOCALIZATION NOTE (resizeModeToggleTooltip) A string displayed as the # tooltip of button in devtools toolbox which toggles Responsive Design Mode. resizeModeToggleTooltip=반응형 웹 디자인 보기 # LOCALIZATION NOTE (resizeModeToDesc) A very short string to describe the # 'resize to' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. resizeModeToDesc=페이지 크기 변경 # LOCALIZATION NOTE (resizeModeDesc) A very short string to describe the # 'resize' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. resizeModeDesc=반응형 웹 디자인 보기 제어 # LOCALIZATION NOTE (resizeModeManual) A fuller description of the 'resize' # command, displayed when the user asks for help on what it does. # The argument (%1$S) is the browser name. resizeModeManual2=반응형 웹사이트는 환경에 반응하므로 모바일에서 시네마까지 모든 디스플레이에서 잘 보입니다. 반응형 웹 디자인 보기는 여러분이 브라우저 자체의 크기를 바꾸지 않고도 %1$S에서 쉽게 여러 페이지 크기에서 시험해볼 수 있게 합니다. # LOCALIZATION NOTE (cmdDesc) A very short description of the 'cmd' # command. This string is designed to be shown in a menu alongside the command # name, which is why it should be as short as possible. cmdDesc=명령어를 조작함 # LOCALIZATION NOTE (cmdRefreshDesc) A very short description of the 'cmd refresh' # command. This string is designed to be shown in a menu alongside the command # name, which is why it should be as short as possible. cmdRefreshDesc=mozcmd 디렉터리를 다시 읽음 # LOCALIZATION NOTE (cmdStatus3) When the we load new commands from mozcmd # directory, we report where we loaded from using %1$S. cmdStatus3='%1$S'에서 읽어들인 명령어 # LOCALIZATION NOTE (cmdSetdirDesc) A very short description of the 'cmd setdir' # command. This string is designed to be shown in a menu alongside the command # name, which is why it should be as short as possible. cmdSetdirDesc=mozcmd 디렉터리 설정 # LOCALIZATION NOTE (cmdSetdirManual2) A fuller description of the 'cmd setdir' # command, displayed when the user asks for help on what it does. cmdSetdirManual2='mozcmd' 디렉터리는 나만의 명령어를 만드는 쉬운 방법입니다. directory is an easy way to create new custom commands for the Firefox command line. 자세한 것은 MDN 문서를 살펴 보십시오. # LOCALIZATION NOTE (cmdSetdirDirectoryDesc) The description of the directory # parameter to the 'cmd setdir' command. cmdSetdirDirectoryDesc=.mozcmd 파일이 들어있는 디렉터리 # LOCALIZATION NOTE (addonDesc) A very short description of the 'addon' # command. This string is designed to be shown in a menu alongside the command # name, which is why it should be as short as possible. addonDesc=부가 기능을 조작함 # LOCALIZATION NOTE (addonListDesc) A very short description of the 'addon list' # command. This string is designed to be shown in a menu alongside the command # name, which is why it should be as short as possible. addonListDesc=설치된 부가 기능을 나열함 # LOCALIZATION NOTE (addonListTypeDesc) A very short description of the # 'addon list ' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. addonListTypeDesc=부가 기능 유형 고르기 # LOCALIZATION NOTE (addonListDictionaryHeading, addonListExtensionHeading, # addonListLocaleHeading, addonListPluginHeading, addonListThemeHeading, # addonListUnknownHeading) Used in the output of the 'addon list' command as the # first line of output. addonListDictionaryHeading=현재 설치된 사전은 다음과 같습니다: addonListExtensionHeading=현재 설치된 확장 기능은 다음과 같습니다: addonListLocaleHeading=현재 설치된 언어는 다음과 같습니다: addonListPluginHeading=현재 설치된 플러그인은 다음과 같습니다: addonListThemeHeading=현재 설치된 테마는 다음과 같습니다: addonListAllHeading=현재 설치된 부가 기능은 다음과 같습니다 addonListUnknownHeading=현재 설치된 부가 기능 가운데 선택한 유형인 것은 다음과 같습니다: # LOCALIZATION NOTE (addonListOutEnable, addonListOutDisable) Used in the # output of the 'addon list' command as the labels for the enable/disable # action buttons in the listing. This string is designed to be shown in a # small action button next to the addon name, which is why it should be as # short as possible. addonListOutEnable=사용함 addonListOutDisable=사용 안 함 # LOCALIZATION NOTE (addonPending, addonPendingEnable, addonPendingDisable, # addonPendingUninstall, addonPendingInstall, addonPendingUpgrade) Used in # the output of the 'addon list' command as the descriptions of pending # addon operations. addonPending is used as a prefix for a list of pending # actions (named by the other lookup variables). These strings are designed # to be shown alongside addon names, which is why they should be as short # as possible. addonPending=기다림 addonPendingEnable=사용함 addonPendingDisable=사용 안 함 addonPendingUninstall=제거 addonPendingInstall=설치 addonPendingUpgrade=업그레이드 # LOCALIZATION NOTE (addonNameDesc) A very short description of the # name parameter of numerous addon commands. This string is designed to be shown # in a menu alongside the command name, which is why it should be as short as # possible. addonNameDesc=부가 기능 이름 # LOCALIZATION NOTE (addonNoneOfType) Used in the output of the 'addon list' addonNoneOfType=그 유형으로 설치된 부가 기능은 없습니다. # LOCALIZATION NOTE (addonEnableDesc) A very short description of the # 'addon enable ' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. addonEnableDesc=지정한 부가 기능 활성화 # LOCALIZATION NOTE (addonAlreadyEnabled) Used in the output of the # 'addon enable' command when an attempt is made to enable an addon is already # enabled. addonAlreadyEnabled=%S은(는) 이미 활성화되어 있습니다. # LOCALIZATION NOTE (addonEnabled) Used in the output of the 'addon enable' # command when an addon is enabled. addonEnabled=%S이(가) 활성화됐습니다. # LOCALIZATION NOTE (addonDisableDesc) A very short description of the # 'addon disable ' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. addonDisableDesc=지정한 부가 기능 비활성화 # LOCALIZATION NOTE (addonAlreadyDisabled) Used in the output of the # 'addon disable' command when an attempt is made to disable an addon is already # disabled. addonAlreadyDisabled=%S은(는) 이미 비활성화되어 있습니다. # LOCALIZATION NOTE (addonDisabled) Used in the output of the 'addon disable' # command when an addon is disabled. addonDisabled=%S이(가) 비활성화됐습니다. # LOCALIZATION NOTE (exportDesc) A very short description of the 'export' # command. This string is designed to be shown in a menu alongside the command # name, which is why it should be as short as possible. exportDesc=자원을 내보냄 # LOCALIZATION NOTE (exportHtmlDesc) A very short description of the 'export # html' command. This string is designed to be shown in a menu alongside the # command name, which is why it should be as short as possible. exportHtmlDesc=페이지에서 HTML 내보냄 # LOCALIZATION NOTE (pagemodDesc) A very short description of the 'pagemod' # command. This string is designed to be shown in a menu alongside the command # name, which is why it should be as short as possible. pagemodDesc=페이지를 고침 # LOCALIZATION NOTE (pagemodReplaceDesc) A very short description of the # 'pagemod replace' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. pagemodReplaceDesc=페이지 요소를 찾아 바꿈 # LOCALIZATION NOTE (pagemodReplaceSearchDesc) A very short string to describe # the 'search' parameter to the 'pagemod replace' command, which is displayed in # a dialog when the user is using this command. pagemodReplaceSearchDesc=찾을 것 # LOCALIZATION NOTE (pagemodReplaceReplaceDesc) A very short string to describe # the 'replace' parameter to the 'pagemod replace' command, which is displayed in # a dialog when the user is using this command. pagemodReplaceReplaceDesc=바꿀 문자열 # LOCALIZATION NOTE (pagemodReplaceIgnoreCaseDesc) A very short string to # describe the 'ignoreCase' parameter to the 'pagemod replace' command, which is # displayed in a dialog when the user is using this command. pagemodReplaceIgnoreCaseDesc=대소문자 구별을 하지 않고 찾음 # LOCALIZATION NOTE (pagemodReplaceRootDesc) A very short string to describe the # 'root' parameter to the 'pagemod replace' command, which is displayed in # a dialog when the user is using this command. pagemodReplaceRootDesc=CSS 선택자로 root를 찾음 # LOCALIZATION NOTE (pagemodReplaceSelectorDesc) A very short string to describe # the 'selector' parameter to the 'pagemod replace' command, which is displayed # in a dialog when the user is using this command. pagemodReplaceSelectorDesc=CSS 선택자로 일치하는 것을 찾음 # LOCALIZATION NOTE (pagemodReplaceAttributesDesc) A very short string to # describe the 'attributes' parameter to the 'pagemod replace' command, which is # displayed in a dialog when the user is using this command. pagemodReplaceAttributesDesc=정규식에 일치하는 속성 # LOCALIZATION NOTE (pagemodReplaceAttrOnlyDesc) A very short string to describe # the 'attrOnly' parameter to the 'pagemod replace' command, which is displayed # in a dialog when the user is using this command. pagemodReplaceAttrOnlyDesc=속성만 찾음 # LOCALIZATION NOTE (pagemodReplaceContentOnlyDesc) A very short string to # describe the 'contentOnly' parameter to the 'pagemod replace' command, which # is displayed in a dialog when the user is using this command. pagemodReplaceContentOnlyDesc=텍스트 노드만 찾음 # LOCALIZATION NOTE (pagemodReplaceResultMatchedElements) A string displayed as # the result of the 'pagemod replace' command. pagemodReplaceResult=선택자에 일치하는 요소는 다음과 같습니다: %1$S. 바뀐 텍스트 노드는 다음과 같습니다.: %2$S. 바뀐 속성은 다음과 같습니다: %3$S. # LOCALIZATION NOTE (pagemodRemoveDesc) A very short description of the # 'pagemod remove' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. pagemodRemoveDesc=페이지에서 요소와 속성 삭제 # LOCALIZATION NOTE (pagemodRemoveElementDesc) A very short description of the # 'pagemod remove element' command. This string is designed to be shown in # a menu alongside the command name, which is why it should be as short as # possible. pagemodRemoveElementDesc=페이지에서 요소 삭제 # LOCALIZATION NOTE (pagemodRemoveElementSearchDesc) A very short string to # describe the 'search' parameter to the 'pagemod remove element' command, which # is displayed in a dialog when the user is using this command. pagemodRemoveElementSearchDesc=삭제할 요소가 지정된 CSS 선택자 # LOCALIZATION NOTE (pagemodRemoveElementRootDesc) A very short string to # describe the 'root' parameter to the 'pagemod remove element' command, which # is displayed in a dialog when the user is using this command. pagemodRemoveElementRootDesc=찾기에서 root가 지정된 CSS 선택자 # LOCALIZATION NOTE (pagemodRemoveElementStripOnlyDesc) A very short string to # describe the 'stripOnly' parameter to the 'pagemod remove element' command, # which is displayed in a dialog when the user is using this command. pagemodRemoveElementStripOnlyDesc=요소만 삭제하고 콘텐츠는 남겨둠 # LOCALIZATION NOTE (pagemodRemoveElementIfEmptyOnlyDesc) A very short string to # describe the 'ifEmptyOnly' parameter to the 'pagemod remove element' command, # which is displayed in a dialog when the user is using this command. pagemodRemoveElementIfEmptyOnlyDesc=빈 요소만 삭제 # LOCALIZATION NOTE (pagemodRemoveElementResultMatchedAndRemovedElements) # A string displayed as the result of the 'pagemod remove element' command. pagemodRemoveElementResultMatchedAndRemovedElements=선택자에 일치하는 요소는 다음과 같습니다: %1$S. 삭제된 요소는 다음과 같습니다: %2$S. # LOCALIZATION NOTE (pagemodRemoveAttributeDesc) A very short description of the # 'pagemod remove attribute' command. This string is designed to be shown in # a menu alongside the command name, which is why it should be as short as # possible. pagemodRemoveAttributeDesc=일치하는 속성 삭제 # LOCALIZATION NOTE (pagemodRemoveAttributeSearchAttributesDesc) A very short # string to describe the 'searchAttributes' parameter to the 'pagemod remove # attribute' command, which is displayed in a dialog when the user is using this # command. pagemodRemoveAttributeSearchAttributesDesc=삭제할 속성이 지정된 정규식 # LOCALIZATION NOTE (pagemodRemoveAttributeSearchElementsDesc) A very short # string to describe the 'searchElements' parameter to the 'pagemod remove # attribute' command, which is displayed in a dialog when the user is using this # command. pagemodRemoveAttributeSearchElementsDesc=요소가 들어있는 CSS 선택자 # LOCALIZATION NOTE (pagemodRemoveAttributeRootDesc) A very short string to # describe the 'root' parameter to the 'pagemod remove attribute' command, which # is displayed in a dialog when the user is using this command. pagemodRemoveAttributeRootDesc=찾을 때 root의 CSS 선택자 # LOCALIZATION NOTE (pagemodRemoveAttributeIgnoreCaseDesc) A very short string # to describe the 'ignoreCase' parameter to the 'pagemod remove attribute' # command, which is displayed in a dialog when the user is using this command. pagemodRemoveAttributeIgnoreCaseDesc=대소문자를 구별하지 않고 찾기 # LOCALIZATION NOTE (pagemodRemoveAttributeResult) A string displayed as the # result of the 'pagemod remove attribute' command. pagemodRemoveAttributeResult=선택자에 일치하는 속성은 다음과 같습니다: %1$S. 삭제된 속성은 다음과 같습니다: %2$S. # LOCALIZATION NOTE (toolsDesc2) A very short description of the 'tools' # command, the parent command for tool-hacking commands. # The argument (%1$S) is the browser name. toolsDesc2=%1$S 개발자 도구 해킹 # LOCALIZATION NOTE (toolsManual2) A fuller description of the 'tools' # command. The argument (%1$S) is the browser name. toolsManual2=%1$S 개발자 도구를 직접 해킹하는 것과 관련된 여러 가지 명령어 # LOCALIZATION NOTE (toolsSrcdirDesc) A very short description of the 'tools srcdir' # command, for pointing your developer tools loader at a mozilla-central source tree. toolsSrcdirDesc=mozilla-central checkout에서 도구 읽어오기 # LOCALIZATION NOTE (toolsSrcdirNotFound) Shown when the 'tools srcdir' command was handed # an invalid srcdir. toolsSrcdirNotFound=%1$s은 없거나 mozilla-central checkout이 아닙니다. # LOCALIZATION NOTE (toolsSrcdirReloaded) Displayed when tools have been reloaded by the # 'tools srcdir' command. toolsSrcdirReloaded=%1$s에서 읽어온 도구입니다. # LOCALIZATION NOTE (toolsSrcdirManual2) A full description of the 'tools srcdir' # command. The argument (%1$S) is the browser name. toolsSrcdirManual2=완전한 mozilla-central checkout에서 %1$S 개발자 도구를 읽어옵니다. # LOCALIZATION NOTE (toolsSrcdirDir) The srcdir argument to the 'tools srcdir' command. toolsSrcdirDir=mozilla-central checkout # LOCALIZATION NOTE (toolsBuiltinDesc) A short description of the 'tools builtin' # command, which overrides a previous 'tools srcdir' command. toolsBuiltinDesc=내장 도구 쓰기 # LOCALIZATION NOTE (toolsBuiltinDesc) A fuller description of the 'tools builtin' # command. toolsBuiltinManual=이전의 모든 srcdir 명령어를 무시하고 내장된 도구를 씁니다. # LOCALIZATION NOTE (toolsBuiltinReloaded) Displayed when tools are loaded with the # 'tools builtin' command. toolsBuiltinReloaded=내장된 도구를 읽어들였습니다. # LOCALIZATION NOTE (toolsReloadDesc) A short description of the 'tools reload' command. # which will reload the tools from the current srcdir. toolsReloadDesc=개발자 도구 다시 읽어들이기 # LOCALIZATION NOTE (toolsReloaded2) Displayed when tools are reloaded with the 'tools # reload' command. toolsReloaded2=개발자 도구를 다시 읽어들였습니다. # LOCALIZATION NOTE (cookieDesc) A very short description of the 'cookie' # command. See cookieManual for a fuller description of what it does. This # string is designed to be shown in a menu alongside the command name, which # is why it should be as short as possible. cookieDesc=쿠키를 보이고 고침 # LOCALIZATION NOTE (cookieManual) A fuller description of the 'cookie' # command, displayed when the user asks for help on what it does. cookieManual=현재 도메인의 쿠키를 나열하고, 만들고, 지우고 고치는 명령어입니다. # LOCALIZATION NOTE (cookieListDesc) A very short description of the # 'cookie list' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. cookieListDesc=쿠키 보기 # LOCALIZATION NOTE (cookieListManual) A fuller description of the 'cookie list' # command, displayed when the user asks for help on what it does. cookieListManual=현재 페이지와 관련된 쿠키를 나열해서 보여줍니다. # LOCALIZATION NOTE (cookieListOutHost,cookieListOutPath,cookieListOutExpires,cookieListOutAttributes): # The 'cookie list' command has a number of headings for cookie properties. # Particular care should be taken in translating these strings as they have # references to names in the cookies spec. cookieListOutHost=호스트: cookieListOutPath=경로: cookieListOutExpires=만료: cookieListOutAttributes=속성: # LOCALIZATION NOTE (cookieListOutNone) The output of the 'cookie list' command # uses this string when no cookie attributes (like httpOnly, secure, etc) apply cookieListOutNone=없음 # LOCALIZATION NOTE (cookieListOutSession) The output of the 'cookie list' # command uses this string to describe a cookie with an expiry value of '0' # that is to say it is a session cookie cookieListOutSession=브라우저를 종료할 때까지 (세션) # LOCALIZATION NOTE (cookieListOutNonePage) The output of the 'cookie list' # command uses this string for pages like 'about:blank' which can't contain # cookies cookieListOutNonePage=이 페이지에서 쿠키를 찾을 수 없음 # LOCALIZATION NOTE (cookieListOutNoneHost) The output of the 'cookie list' # command uses this string when there are no cookies on a given web page cookieListOutNoneHost=호스트 %1$S에서 쿠키를 찾을 수 없음 # LOCALIZATION NOTE (cookieListOutEdit) A title used in the output from the # 'cookie list' command on a button which can be used to edit cookie values cookieListOutEdit=편집 # LOCALIZATION NOTE (cookieListOutRemove) A title used in the output from the # 'cookie list' command on a button which can be used to remove cookies cookieListOutRemove=삭제 # LOCALIZATION NOTE (cookieRemoveDesc) A very short description of the # 'cookie remove' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. cookieRemoveDesc=쿠키 삭제 # LOCALIZATION NOTE (cookieRemoveManual) A fuller description of the 'cookie remove' # command, displayed when the user asks for help on what it does. cookieRemoveManual=주어진 키로 쿠키 삭제 # LOCALIZATION NOTE (cookieRemoveKeyDesc) A very short string to describe the # 'key' parameter to the 'cookie remove' command, which is displayed in a dialog # when the user is using this command. cookieRemoveKeyDesc=해당 키에 대한 쿠키 삭제됨 # LOCALIZATION NOTE (cookieSetDesc) A very short description of the # 'cookie set' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. cookieSetDesc=쿠키 설정 # LOCALIZATION NOTE (cookieSetManual) A fuller description of the 'cookie set' # command, displayed when the user asks for help on what it does. cookieSetManual=키 이름, 값, 그리고 다음 속성 가운데 하나 이상을 지정하여 쿠키를 설정합니다: 만료 (초 단위의 최대 수명이나 GMTString 형식의 만료 날짜), 경로, 도메인, 보안 # LOCALIZATION NOTE (cookieSetKeyDesc) A very short string to describe the # 'key' parameter to the 'cookie set' command, which is displayed in a dialog # when the user is using this command. cookieSetKeyDesc=쿠키에서 설정할 키 # LOCALIZATION NOTE (cookieSetValueDesc) A very short string to describe the # 'value' parameter to the 'cookie set' command, which is displayed in a dialog # when the user is using this command. cookieSetValueDesc=쿠키에서 설정할 값 # LOCALIZATION NOTE (cookieSetOptionsDesc) The title of a set of options to # the 'cookie set' command, displayed as a heading to the list of option. cookieSetOptionsDesc=선택 # LOCALIZATION NOTE (cookieSetPathDesc) A very short string to describe the # 'path' parameter to the 'cookie set' command, which is displayed in a dialog # when the user is using this command. cookieSetPathDesc=쿠키에서 설정할 경로 # LOCALIZATION NOTE (cookieSetDomainDesc) A very short string to describe the # 'domain' parameter to the 'cookie set' command, which is displayed in a dialog # when the user is using this command. cookieSetDomainDesc=쿠키에서 설정할 도메인 # LOCALIZATION NOTE (cookieSetSecureDesc) A very short string to describe the # 'secure' parameter to the 'cookie set' command, which is displayed in a dialog # when the user is using this command. cookieSetSecureDesc=https를 통해서만 전송 # LOCALIZATION NOTE (cookieSetHttpOnlyDesc) A very short string to describe the # 'httpOnly' parameter to the 'cookie set' command, which is displayed in a dialog # when the user is using this command. cookieSetHttpOnlyDesc=클라이언트쪽 스크립트에서 접근할 수 없음 # LOCALIZATION NOTE (cookieSetSessionDesc) A very short string to describe the # 'session' parameter to the 'cookie set' command, which is displayed in a dialog # when the user is using this command. cookieSetSessionDesc=브라우저 세션의 수명만 유효 # LOCALIZATION NOTE (cookieSetExpiresDesc) A very short string to describe the # 'expires' parameter to the 'cookie set' command, which is displayed in a dialog # when the user is using this command. cookieSetExpiresDesc=쿠키 만료일 (RFC2822 또는 ISO 8601 날짜 인용) # LOCALIZATION NOTE (jsbDesc) A very short description of the # 'jsb' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. jsbDesc=Javascript 다듬기 # LOCALIZATION NOTE (jsbUrlDesc) A very short description of the # 'jsb ' parameter. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. jsbUrlDesc=다듬을 JavaScript 파일의 경로 # LOCALIZATION NOTE (jsbIndentSizeDesc) A very short description of the # 'jsb ' parameter. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. jsbIndentSizeDesc=들여쓸 글자 수 # LOCALIZATION NOTE (jsbIndentSizeManual) A fuller description of the # 'jsb ' parameter, displayed when the user asks for help on what it # does. jsbIndentSizeManual=각 줄에서 들여쓸 글자 수 # LOCALIZATION NOTE (jsbIndentCharDesc) A very short description of the # 'jsb ' parameter. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. jsbIndentCharDesc=각 줄에서 들여쓸 때 쓸 글자 # LOCALIZATION NOTE (jsbIndentCharManual) A fuller description of the # 'jsb ' parameter, displayed when the user asks for help on what it # does. jsbIndentCharManual=각 줄에서 들여쓸 때 쓰이는 글자로 빈칸과 탭을 쓸 수 있습니다. # the 'jsb ' parameter. This string is designed to be # shown in a menu alongside the command name, which is why it should be as short # as possible. jsbDoNotPreserveNewlinesDesc=줄바꿈 유지하지 않음 # LOCALIZATION NOTE (jsbPreserveNewlinesManual) A fuller description of the # 'jsb ' parameter, displayed when the user asks for help # on what it does. jsbPreserveNewlinesManual=줄바꿈을 그대로 둘지 안둘지 고름 # LOCALIZATION NOTE (jsbPreserveMaxNewlinesDesc) A very short description of the # 'jsb ' parameter. This string is designed to be shown # in a menu alongside the command name, which is why it should be as short as # possible. jsbPreserveMaxNewlinesDesc=줄바꿈이 이어져 있는 최대 줄 수 # LOCALIZATION NOTE (jsbPreserveMaxNewlinesManual) A fuller description of the # 'jsb ' parameter, displayed when the user asks for help # on what it does. jsbPreserveMaxNewlinesManual=이어져 있는 줄바꿈을 그대로 둘 최대 줄 수 # LOCALIZATION NOTE (jsbJslintHappyDesc) A very short description of the # 'jsb ' parameter. This string is designed to be shown # in a menu alongside the command name, which is why it should be as short as # possible. jsbJslintHappyDesc=jslint-엄격함 모드 시행? # LOCALIZATION NOTE (jsbJslintHappyManual) A fuller description of the # 'jsb ' parameter, displayed when the user asks for help # on what it does. jsbJslintHappyManual=true로 설정되어 있으면 jslint-엄격함 모드를 시행합니다. # LOCALIZATION NOTE (jsbBraceStyleDesc2) A very short description of the # 'jsb ' parameter. This string is designed to be shown # in a menu alongside the command name, which is why it should be as short as # possible. jsbBraceStyleDesc2=괄호 코딩 스타일 선택 # LOCALIZATION NOTE (jsbBraceStyleManual2) A fuller description of the # 'jsb ' parameter, displayed when the user asks for help # on what it does. # # NOTES: The keywords collapse, expand, end-expand and expand-strict should not # be translated. "even if it will break your code" means that the resulting code # may no longer be functional. jsbBraceStyleManual2=괄호 코딩 스타일 선택: collapse - 제어문처럼 같은 줄에 중괄호를 놓습니다; expand - 중괄호를 서로 다른 줄에 놓습니다 (Allman / ANSI 스타일); end-expand - 닫는 중괄호만 다른 줄에 놓습니다; expand-strict - 코드를 망가뜨리더라도 중괄호를 서로 다른 줄에 놓습니다. # LOCALIZATION NOTE (jsbNoSpaceBeforeConditionalDesc) A very short description # of the 'jsb ' parameter. This string is designed to # be shown in a menu alongside the command name, which is why it should be as # short as possible. jsbNoSpaceBeforeConditionalDesc=조건문 앞의 빈칸 없음 # LOCALIZATION NOTE (jsbUnescapeStringsDesc) A very short description of the # 'jsb ' parameter. This string is designed to be shown # in a menu alongside the command name, which is why it should be as short as # possible. jsbUnescapeStringsDesc=\\xNN을 이스케이프 문자로 처리하지 않음? # LOCALIZATION NOTE (jsbUnescapeStringsManual) A fuller description of the # 'jsb ' parameter, displayed when the user asks for help # on what it does. jsbUnescapeStringsManual=문자열에서 \\xNN와 같이 표기된 인쇄용 문자를 이스케이프 문자로 처리하지 않으시겠습니까? # LOCALIZATION NOTE (jsbInvalidURL) Displayed when an invalid URL is passed to # the jsb command. jsbInvalidURL=올바른 URL을 입력해주십시오. # LOCALIZATION NOTE (jsbOptionsDesc) The title of a set of options to # the 'jsb' command, displayed as a heading to the list of options. jsbOptionsDesc=옵션 # LOCALIZATION NOTE (calllogDesc) A very short description of the # 'calllog' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. calllogDesc=함수 호출 로깅을 조작하는 명령어 # LOCALIZATION NOTE (calllogStartDesc) A very short description of the # 'calllog start' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. calllogStartDesc=콘솔로 함수 호출 로깅을 시작 # LOCALIZATION NOTE (calllogStartReply) A string displayed as the result of # the 'calllog start' command. calllogStartReply=호출 로깅이 시작되었습니다. # LOCALIZATION NOTE (calllogStopDesc) A very short description of the # 'calllog stop' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. calllogStopDesc=함수 호출 로깅 중단 # LOCALIZATION NOTE (calllogStopNoLogging) A string displayed as the result of # the 'calllog stop' command when there is nothing to stop. calllogStopNoLogging=현재 활성화된 호출 로깅이 없습니다. # LOCALIZATION NOTE (calllogStopReply) A string displayed as the result of # the 'calllog stop' command when there are logging actions to stop. calllogStopReply=호출 로깅이 중단되었습니다. 활성화된 컨텍스트: %1$S. # LOCALIZATION NOTE (calllogStartChromeDesc) A very short description of the # 'calllog chromestart' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. calllogChromeStartDesc=콘솔로 chrome 코드에 대한 함수 호출 로깅을 시작 # LOCALIZATION NOTE (calllogChromeSourceTypeDesc) A very short description of the # 'calllog chromestart ' parameter. This string is designed to be # shown in a menu alongside the command name, which is why it should be as short as possible. calllogChromeSourceTypeDesc=전역 객체를 가져올 전역 객체, JSM URI, 또는 JS # LOCALIZATION NOTE (calllogChromeSourceTypeDesc) A very short description of the # 'calllog chromestart' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. calllogChromeSourceTypeManual=chrome 창 안에서 실행되는 전역 객체를 얻어오는 다른 전역 객체, JSM의 URI, 또는 JS # LOCALIZATION NOTE (calllogChromeStartReply) A string displayed as the result # of the 'calllog chromestart' command. calllogChromeStartReply=호출 로깅이 시작되었습니다. # LOCALIZATION NOTE (calllogChromeStopDesc) A very short description of the # 'calllog chromestop' command. This string is designed to be shown in a menu # alongside the command name, which is why it should be as short as possible. calllogChromeStopDesc=함수 호출 로깅 중단 # LOCALIZATION NOTE (calllogChromeStopNoLogging) A string displayed as the # result of the 'calllog chromestop' command when there is nothing to stop. calllogChromeStopNoLogging=현재 호출 로깅을 하는 chrome 코드는 없습니다. # LOCALIZATION NOTE (calllogStopReply) A string displayed as the result of # the 'calllog chromestop' command when there are logging actions to stop. calllogChromeStopReply=호출 로깅이 중단되었습니다. 활성화된 컨텍스트: %1$S. # LOCALIZATION NOTE (callLogChromeAnonFunction) A string displayed as the result # of the 'calllog chromestart' command when an anonymouse function is to be # logged. callLogChromeAnonFunction=<익명> # LOCALIZATION NOTE (callLogChromeMethodCall) A string displayed as the result # of the 'calllog chromestart' command to proceed a method name when it is to be # logged. callLogChromeMethodCall=메소드 호출 # LOCALIZATION NOTE (callLogChromeInvalidJSM) A string displayed as the result # of the 'calllog chromestart' command with an invalid JSM or JSM path. callLogChromeInvalidJSM=JSM이 올바르지 않음! # LOCALIZATION NOTE (callLogChromeVarNotFoundContent) A string displayed as the # result of the 'calllog chromestart' command with a source type of # content-variable and an invalid variable name. callLogChromeVarNotFoundContent=content 창에서 변수를 찾지 못했습니다. # LOCALIZATION NOTE (callLogChromeVarNotFoundChrome) A string displayed as the # result of the 'calllog chromestart' command with a source type of # chrome-variable and an invalid variable name. callLogChromeVarNotFoundChrome=chrome 창에서 변수를 찾지 못했습니다. # LOCALIZATION NOTE (callLogChromeEvalException) A string displayed as the # result of the 'calllog chromestart' command with a source type of javascript # and invalid JavaScript code. callLogChromeEvalException=다음 예외로 평가된 JavaScript # LOCALIZATION NOTE (callLogChromeEvalNeedsObject) A string displayed as the # result of passing a non-JavaScript object creating source via the # 'calllog chromestart javascript' command. callLogChromeEvalNeedsObject=JavaScript 소스는 메소드 호출이 다음 예와 같이 로깅되는 객체로 평가되어야 합니다. "({a1: function() {this.a2()},a2: function() {}});" # LOCALIZATION NOTE (scratchpadOpenTooltip) A string displayed as the # tooltip of button in devtools toolbox which opens Scratchpad. scratchpadOpenTooltip=스크래치패드 # LOCALIZATION NOTE (paintflashingDesc) A very short string used to describe the # function of the "paintflashing" command paintflashingDesc=그려진 자리를 두드러지게 보이기 # LOCALIZATION NOTE (paintflashingOnDesc) A very short string used to describe the # function of the "paintflashing on" command. paintflashingOnDesc=그려진 자리 보이기 켜기 # LOCALIZATION NOTE (paintflashingOffDesc) A very short string used to describe the # function of the "paintflashing off" command. paintflashingOffDesc=그려진 자리 보이기 끄기 # LOCALIZATION NOTE (paintflashingChrome) A very short string used to describe the # function of the "paintflashing on/off chrome" command. paintflashingChromeDesc=chrome 프레임 # LOCALIZATION NOTE (paintflashingManual) A longer description describing the # set of commands that control paint flashing. paintflashingManual=새로 그려진 자리 다른 색으로 칠하기 # LOCALIZATION NOTE (paintflashingTooltip) A string displayed as the # tooltip of button in devtools toolbox which toggles paint flashing. paintflashingTooltip=그려진 자리 두드러지게 보이기 # LOCALIZATION NOTE (paintflashingOnDesc) A very short string used to describe the # function of the "paintflashing on" command. paintflashingToggleDesc=그려진 자리를 보이거나 보이지 않기 # 한글 (splitconsoleTooltip) split이 웹콘솔 창을 나누는 게 아님 # LOCALIZATION NOTE (splitconsoleTooltip) A string displayed as the # tooltip of button in devtools toolbox which toggles the split webconsole. splitconsoleTooltip=한쪽에 콘솔 놓기 # LOCALIZATION NOTE (appCacheDesc) A very short string used to describe the # function of the "appcache" command appCacheDesc=애플리케이션 캐시 도구 # LOCALIZATION NOTE (appCacheValidateDesc) A very short string used to describe # the function of the "appcache validate" command. appCacheValidateDesc=캐시 매니페스트 검사 # LOCALIZATION NOTE (appCacheValidateManual) A fuller description of the # 'validate' parameter to the 'appcache' command, displayed when the user asks # for help on what it does. appCacheValidateManual=캐시 매니페스트와 참조된 파일과 관련된 문제를 찾음 # LOCALIZATION NOTE (appCacheValidateUriDesc) A very short string used to describe # the function of the "uri" parameter of the appcache validate" command. appCacheValidateUriDesc=확인할 URI # LOCALIZATION NOTE (appCacheValidated) Displayed by the "appcache validate" # command when it has been successfully validated. appCacheValidatedSuccessfully=Appcache를 성공적으로 검사했습니다. # LOCALIZATION NOTE (appCacheClearDesc) A very short string used to describe # the function of the "appcache clear" command. appCacheClearDesc=애플리케이션 캐시의 항목을 지움 # LOCALIZATION NOTE (appCacheClearManual) A fuller description of the # 'appcache clear' command, displayed when the user asks for help on what it does. appCacheClearManual=애플리케이션 캐시에서 하나 이상의 항목을 지움 # LOCALIZATION NOTE (appCacheClearCleared) Displayed by the "appcache clear" # command when entries are successfully cleared. appCacheClearCleared=항목을 성공적으로 지웠습니다. # LOCALIZATION NOTE (AppCacheListDesc) A very short string used to describe # the function of the "appcache list" command. appCacheListDesc=애플리케이션 캐시의 항목 목록을 보여줍니다. # LOCALIZATION NOTE (AppCacheListManual) A fuller description of the # 'appcache list' command, displayed when the user asks for help on what it does. appCacheListManual=애플리케이션 캐시의 모든 항목 목록을 보여줍니다. search 파라미터를 사용하면 검색어가 들어있는 항목만 보여줍니다. # LOCALIZATION NOTE (AppCacheListSearchDesc) A very short string used to describe # the function of the "search" parameter of the appcache list" command. appCacheListSearchDesc=검색어로 결과를 거릅니다. # LOCALIZATION NOTE (AppCacheList*) Row headers for the 'appcache list' command. appCacheListKey=키: appCacheListDataSize=데이터 크기: appCacheListDeviceID=장치 ID: appCacheListExpirationTime=만료: appCacheListFetchCount=가져온 횟수: appCacheListLastFetched=마지막으로 가져옴: appCacheListLastModified=마지막으로 고침: # LOCALIZATION NOTE (appCacheListViewEntry) The text for the view entry button # of the 'appcache list' command. appCacheListViewEntry=항목 보기 # LOCALIZATION NOTE (appCacheViewEntryDesc) A very short string used to describe # the function of the "appcache viewentry" command. appCacheViewEntryDesc=지정한 캐시 항목에 대한 정보가 들어있는 새 탭을 엽니다. # LOCALIZATION NOTE (appCacheViewEntryManual) A fuller description of the # 'appcache viewentry' command, displayed when the user asks for help on what it # does. appCacheViewEntryManual=지정한 캐시 항목에 대한 정보가 들어있는 새 탭을 엽니다. # LOCALIZATION NOTE (appCacheViewEntryKey) A very short string used to describe # the function of the "key" parameter of the 'appcache viewentry' command. appCacheViewEntryKey=보일 항목에 대한 key # LOCALIZATION NOTE (profilerDesc) A very short string used to describe the # function of the profiler command. profilerDesc=프로파일러 관리 # LOCALIZATION NOTE (profilerManual) A longer description describing the # set of commands that control the profiler. profilerManual=JavaScript 프로파일러를 시작하거나 중지하는 명령어 # LOCALIZATION NOTE (profilerOpen) A very short string used to describe the function # of the profiler open command. profilerOpenDesc=프로파일러 열기 # LOCALIZATION NOTE (profilerClose) A very short string used to describe the function # of the profiler close command. profilerCloseDesc=프로파일러 닫기 # LOCALIZATION NOTE (profilerStart) A very short string used to describe the function # of the profiler start command. profilerStartDesc=프로파일러 시작하기 # LOCALIZATION NOTE (profilerStartManual) A fuller description of the 'profile name' # parameter. This parameter is used to name a newly created profile or to lookup # an existing profile by its name. profilerStartManual=시작할 프로필 이름입니다. # LOCALIZATION NOTE (profilerStop) A very short string used to describe the function # of the profiler stop command. profilerStopDesc=프로파일러 멈추기 # LOCALIZATION NOTE (profilerStopManual) A fuller description of the 'profile name' # parameter. This parameter is used to lookup an existing profile by its name. profilerStopManual=멈출 프로필 이름입니다. # LOCALIZATION NOTE (profilerList) A very short string used to describe the function # of the profiler list command. profilerListDesc=프로필 모두 보기 # LOCALIZATION NOTE (profilerShow) A very short string used to describe the function # of the profiler show command. profilerShowDesc=한 프로필에 대해 보기 # LOCALIZATION NOTE (profilerShowManual) A fuller description of the 'profile name' # parameter. This parameter is used to name a newly created profile or to lookup # an existing profile by its name. profilerShowManual=프로필 이름입니다. # LOCALIZATION NOTE (profilerAlreadyStarted) A message that is displayed whenever # an operation cannot be completed because the profile in question has already # been started. profilerAlreadyStarted2=이미 프로파일링을 시작함 # LOCALIZATION NOTE (profilerNotFound) A message that is displayed whenever # an operation cannot be completed because the profile in question could not be # found. profilerNotFound=프로필을 찾을 수 없음 # LOCALIZATION NOTE (profilerNotStarted) A message that is displayed whenever # an operation cannot be completed because the profile in question has not been # started yet. It also contains a hint to use the 'profile start' command to # start the profiler. profilerNotStarted3=프로파일러를 아직 시작하지 않았습니다. 'profile start' 명령어를 사용하여 프로파일링을 시작하십시오. # LOCALIZATION NOTE (profilerStarted2) A very short string that indicates that # we have started recording. profilerStarted2=기록하고 있습니다… # LOCALIZATION NOTE (profilerStopped) A very short string that indicates that # we have stopped recording. profilerStopped=멈췄습니다… # LOCALIZATION NOTE (profilerNotReady) A message that is displayed whenever # an operation cannot be completed because the profiler has not been opened yet. profilerNotReady=이 명령어는 프로파일러를 연 다음에 사용할 수 있습니다. # LOCALIZATION NOTE (listenDesc) A very short string used to describe the # function of the 'listen' command. listenDesc=원격 디버그 포트 열기 # LOCALIZATION NOTE (listenManual) A longer description of the 'listen' # command. listenManual2=%1$S는 TCP/IP 연결을 통한 원격 디버깅을 허용할 수 있습니다. 보안상 이유로 이 기능은 기본적으로 꺼져 있으나 이 명령어로 켤 수 있습니다. # LOCALIZATION NOTE (listenPortDesc) A very short string used to describe the # function of 'port' parameter to the 'listen' command. listenPortDesc=들을 TCP 포트 # LOCALIZATION NOTE (listenDisabledOutput) Text of a message output during the # execution of the 'listen' command. listenDisabledOutput=listen은 devtools.debugger.remote-enabled 설정에 따라 막혀 있습니다. # LOCALIZATION NOTE (listenInitOutput) Text of a message output during the # execution of the 'listen' command. %1$S is a port number listenInitOutput=%1$S번 포트를 듣고 있음 # LOCALIZATION NOTE (listenNoInitOutput) Text of a message output during the # execution of the 'listen' command. listenNoInitOutput=DebuggerServer가 초기화되지 않음 # LOCALIZATION NOTE (mediaDesc, mediaEmulateDesc, mediaEmulateManual, # mediaEmulateType, mediaResetDesc, mediaResetManual) These strings describe # the 'media' commands and all available parameters. mediaDesc=CSS 미디어타입 에뮬레이션 mediaEmulateDesc =지정 CSS 미디어 타입을 에뮬레이션 합니다. mediaEmulateManual =지정 미디어 타입에 대응하는 기기 상에서 표시된 것처럼 페이지를 표시합니다. 관련 CSS규칙도 적용됩니다. mediaEmulateType =에뮬레이션 미디어 타입 mediaResetDesc =미디어타입 에뮬레이션 종료 #LOCALIZATION NOTE(injectDesc, injectManual, injectLibraryDesc, injectLoaded, #injectFailed)These strings describe the'inject'commands and all available #parameters. injectDesc =페이지에 라이브러리 추가 injectManual2 =콘솔에서 접근할 수 있는 페이지의 콘텐츠 라이브러리 추가합니다. injectLibraryDesc =연결 라이브러리를 선택하거나 스크립트 URL 입력 injectLoaded =%1$S 로딩 완료 injectFailed =%1$S는 로딩 되지 않음 - URL을 확인하세요. #LOCALIZATION NOTE(folderDesc, folderOpenDesc, folderOpenDir, #folderOpenProfileDesc)These strings describe the'folder'commands and #all available parameters. folderDesc =폴더 열기 folderOpenDesc =폴더 열기 경로 folderOpenDir =디렉토리 경로 folderOpenProfileDesc =프로파일 폴더 경로 #LOCALIZATION NOTE(folderInvalidPath)A string displayed as the result #of the'folder open'command with an invalid folder path. folderInvalidPath =올바른 경로를 입력하세요. #LOCALIZATION NOTE(folderOpenDirResult)A very short string used to #describe the result of the'folder open'command. #The argument(%1$S)is the folder path. folderOpenDirResult =%1$S 열기 # LOCALIZATION NOTE (highlightOutputConfirm) A confirmation message for the # 'highlight' command, displayed to the user once the command has been entered, # informing the user how many nodes have been highlighted successfully and how # to turn highlighting off highlightOutputConfirm2=%1$S node highlighted;%1$S nodes highlighted # LOCALIZATION NOTE (notAvailableInE10S) Used in the output of any command that # is not compatible with multiprocess mode (E10S). notAvailableInE10S=The command '%1$S' is not available in multiprocess mode (E10S) ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/inspector.dtd ================================================ ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/inspector.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the Inspector # which is available from the Web Developer sub-menu -> 'Inspect'. # # The correct localization of this file might be to keep it in # English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best # documentation on web development on the web. # LOCALIZATION NOTE (confirmNavigationAway): Used in the Inspector tool, when # the user tries to navigate away from a web page, to confirm the change of # page. confirmNavigationAway.message2= 이 페이지에서 나가면 변경 내용이 없어집니다. confirmNavigationAway.buttonLeave=나가기 confirmNavigationAway.buttonLeaveAccesskey=L confirmNavigationAway.buttonStay=계속 confirmNavigationAway.buttonStayAccesskey=S breadcrumbs.siblings=형제 # LOCALIZATION NOTE (debuggerPausedWarning): Used in the Inspector tool, when # the user switch to the inspector when the debugger is paused. debuggerPausedWarning.message=디버거가 중단되어 있습니다. 마우스 선택과 같은 몇몇 기능은 돌아가지 않을 것입니다. # LOCALIZATION NOTE (nodeMenu.tooltiptext) # This menu appears in the Infobar (on top of the highlighted node) once # the node is selected. nodeMenu.tooltiptext=노드 동작 # LOCALIZATION NOTE (inspector.*) # Used for the menuitem in the tool menu inspector.label=검사기 inspector.commandkey=I inspector.accesskey=I #LOCALIZATION NOTE(inspector.panelLabel.*) #Labels applied to the panel and views within the panel in the toolbox inspector.panelLabel =검사기 패널 inspector.panelLabel.markupView =마크업 보기 # LOCALIZATION NOTE (markupView.more.*) # When there are too many nodes to load at once, we will offer to # show all the nodes. markupView.more.showing=몇몇 노드는 숨겨져 있습니다. markupView.more.showAll=모두 %S개인 노드 다 보기 inspector.tooltip=DOM 및 스타일 검사기 #LOCALIZATION NOTE: Used in the image preview tooltip when the image could not be loaded previewTooltip.image.brokenImage=이미지를 읽어들이지 못했음 #LOCALIZATION NOTE: Used in the image preview tooltip when the image could not be loaded eventsTooltip.openInDebugger =디버거에서 열기 ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/layoutview.dtd ================================================ ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/netmonitor.dtd ================================================ ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/netmonitor.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the Network Monitor # which is available from the Web Developer sub-menu -> 'Network Monitor'. # The correct localization of this file might be to keep it in # English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best # documentation on web development on the web. # LOCALIZATION NOTE (netmonitor.label): # This string is displayed in the title of the tab when the Network Monitor is # displayed inside the developer tools window and in the Developer Tools Menu. netmonitor.label=네트워크 # LOCALIZATION NOTE (netmonitor.panelLabel): # This is used as the label for the toolbox panel. netmonitor.panelLabel=네트워크 패널 # LOCALIZATION NOTE (netmonitor.commandkey, netmonitor.accesskey) # Used for the menuitem in the tool menu netmonitor.commandkey=Q netmonitor.accesskey=N # LOCALIZATION NOTE (netmonitor.tooltip): # This string is displayed in the tooltip of the tab when the Network Monitor is # displayed inside the developer tools window. netmonitor.tooltip=네트워크 모니터 # LOCALIZATION NOTE (collapseDetailsPane): This is the tooltip for the button # that collapses the network details pane in the UI. collapseDetailsPane=요청의 상세 정보 숨기기 # LOCALIZATION NOTE (expandDetailsPane): This is the tooltip for the button # that expands the network details pane in the UI. expandDetailsPane=요청의 상세 정보 보이기 # LOCALIZATION NOTE (headersEmptyText): This is the text displayed in the # headers tab of the network details pane when there are no headers available. headersEmptyText=이 요청에는 헤더가 없음 # LOCALIZATION NOTE (headersFilterText): This is the text displayed in the # headers tab of the network details pane for the filtering input. headersFilterText=필터 거르기 # LOCALIZATION NOTE (cookiesEmptyText): This is the text displayed in the # cookies tab of the network details pane when there are no cookies available. cookiesEmptyText=이 요청에는 쿠키가 없음 # LOCALIZATION NOTE (cookiesFilterText): This is the text displayed in the # cookies tab of the network details pane for the filtering input. cookiesFilterText=쿠키 거르기 # LOCALIZATION NOTE (paramsEmptyText): This is the text displayed in the # params tab of the network details pane when there are no params available. paramsEmptyText=이 요청에는 파라미터가 없음 # LOCALIZATION NOTE (paramsFilterText): This is the text displayed in the # params tab of the network details pane for the filtering input. paramsFilterText=요청 파라미터 거르기 # LOCALIZATION NOTE (paramsQueryString): This is the label displayed # in the network details params tab identifying the query string. paramsQueryString=쿼리 문자열 # LOCALIZATION NOTE (paramsFormData): This is the label displayed # in the network details params tab identifying the form data. paramsFormData=폼 데이터 # LOCALIZATION NOTE (paramsPostPayload): This is the label displayed # in the network details params tab identifying the request payload. paramsPostPayload=요청 페이로드 # LOCALIZATION NOTE (requestHeaders): This is the label displayed # in the network details headers tab identifying the request headers. requestHeaders=요청 헤더 # LOCALIZATION NOTE (requestHeadersFromUpload): This is the label displayed # in the network details headers tab identifying the request headers from # the upload stream of a POST request's body. requestHeadersFromUpload=업로드 스트림의 요청 헤더 # LOCALIZATION NOTE (responseHeaders): This is the label displayed # in the network details headers tab identifying the response headers. responseHeaders=응답 헤더 # LOCALIZATION NOTE (requestCookies): This is the label displayed # in the network details params tab identifying the request cookies. requestCookies=요청 쿠키 # LOCALIZATION NOTE (responseCookies): This is the label displayed # in the network details params tab identifying the response cookies. responseCookies=응답 쿠키 # LOCALIZATION NOTE (jsonFilterText): This is the text displayed # in the response tab of the network details pane for the JSON filtering input. jsonFilterText=속성 거르기 # LOCALIZATION NOTE (jsonScopeName): This is the text displayed # in the response tab of the network details pane for a JSON scope. jsonScopeName=JSON # LOCALIZATION NOTE (jsonpScopeName): This is the text displayed # in the response tab of the network details pane for a JSONP scope. jsonpScopeName=JSONP → 콜백 %S() # LOCALIZATION NOTE (networkMenu.sortedAsc): This is the tooltip displayed # in the network table toolbar, for any column that is sorted ascending. networkMenu.sortedAsc=오름차순 정렬 # LOCALIZATION NOTE (networkMenu.sortedDesc): This is the tooltip displayed # in the network table toolbar, for any column that is sorted descending. networkMenu.sortedDesc=내림차순 정렬 # LOCALIZATION NOTE (networkMenu.empty): This is the label displayed # in the network table footer when there are no requests available. networkMenu.empty=요청 없음 # LOCALIZATION NOTE (networkMenu.summary): Semi-colon list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # This label is displayed in the network table footer providing concise # information about all requests. Parameters: #1 is the number of requests, # #2 is the size, #3 is the number of seconds. networkMenu.summary=요청 #1, #2KB, #3초 # LOCALIZATION NOTE (networkMenu.sizeKB): This is the label displayed # in the network menu specifying the size of a request (in kilobytes). networkMenu.sizeKB=%S KB # LOCALIZATION NOTE (networkMenu.totalMS): This is the label displayed # in the network menu specifying the time for a request to finish (in milliseconds). networkMenu.totalMS=→ %S밀리초 # LOCALIZATION NOTE (networkMenu.millisecond): This is the label displayed # in the network menu specifying timing interval divisions (in milliseconds). networkMenu.millisecond=%S밀리초 # LOCALIZATION NOTE (networkMenu.second): This is the label displayed # in the network menu specifying timing interval divisions (in seconds). networkMenu.second=%S초 # LOCALIZATION NOTE (networkMenu.minute): This is the label displayed # in the network menu specifying timing interval divisions (in minutes). networkMenu.minute=%S분 # LOCALIZATION NOTE (pieChart.loading): This is the label displayed # for pie charts (e.g., in the performance analysis view) when there is # no data available yet. pieChart.loading=읽는 중 # LOCALIZATION NOTE (pieChart.unavailable): This is the label displayed # for pie charts (e.g., in the performance analysis view) when there is # no data available, even after loading it. pieChart.unavailable=아무것도 없음 # LOCALIZATION NOTE (tableChart.loading): This is the label displayed # for table charts (e.g., in the performance analysis view) when there is # no data available yet. tableChart.loading=잠시만 기다려 주십시오… # LOCALIZATION NOTE (tableChart.unavailable): This is the label displayed # for table charts (e.g., in the performance analysis view) when there is # no data available, even after loading it. tableChart.unavailable=사용 가능한 데이터가 없음 # LOCALIZATION NOTE (charts.sizeKB): This is the label displayed # in pie or table charts specifying the size of a request (in kilobytes). charts.sizeKB=%S KB # LOCALIZATION NOTE (charts.totalS): This is the label displayed # in pie or table charts specifying the time for a request to finish (in seconds). charts.totalS=%S 초 # LOCALIZATION NOTE (charts.cacheEnabled): This is the label displayed # in the performance analysis view for "cache enabled" charts. charts.cacheEnabled=캐시함 # LOCALIZATION NOTE (charts.cacheDisabled): This is the label displayed # in the performance analysis view for "cache disabled" charts. charts.cacheDisabled=캐시하지 않음 # LOCALIZATION NOTE (charts.totalSize): This is the label displayed # in the performance analysis view for total requests size, in kilobytes. charts.totalSize=크기: %S KB # LOCALIZATION NOTE (charts.totalSeconds): Semi-colon list of plural forms. # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals # This is the label displayed in the performance analysis view for the # total requests time, in seconds. charts.totalSeconds=시간: #1 초 # LOCALIZATION NOTE (charts.totalCached): This is the label displayed # in the performance analysis view for total cached responses. charts.totalCached=캐시 응답 수: %S # LOCALIZATION NOTE (charts.totalCount): This is the label displayed # in the performance analysis view for total requests. charts.totalCount=총 요청 수: %S # LOCALIZATION NOTE (netmonitor.security.disabled): # This string is used to indicate that a specific security feature is not used by # a connection in the security details tab. # For example: "HTTP Strict Transport Security: Disabled" netmonitor.security.disabled=Disabled # LOCALIZATION NOTE (netmonitor.security.enabled): # This string is used to indicate that a specific security feature is used by # a connection in the security details tab. # For example: "HTTP Strict Transport Security: Enabled" netmonitor.security.enabled=Enabled # LOCALIZATION NOTE (netmonitor.security.hostHeader): # This string is used as a header for section containing security information # related to the remote host. %S is replaced with the domain name of the remote # host. For example: Host example.com netmonitor.security.hostHeader=Host %S: # LOCALIZATION NOTE (netmonitor.security.notAvailable): # This string is used to indicate that a certain piece of information is not # available to be displayd. For example a certificate that has no organization # defined: # Organization: netmonitor.security.notAvailable= # LOCALIZATION NOTE (netmonitor.security.state.broken) # This string is used as an tooltip for request that failed due to security # issues. netmonitor.security.state.broken=A security error prevented the resource from being loaded. # LOCALIZATION NOTE (netmonitor.security.state.insecure) # This string is used as an tooltip for request that was performed over insecure # channel i.e. the connection was not encrypted. netmonitor.security.state.insecure=The connection used to fetch this resource was not encrypted. # LOCALIZATION NOTE (netmonitor.security.state.secure) # This string is used as an tooltip for request that was performed over secure # channel i.e. the connection was encrypted. netmonitor.security.state.secure=The connection used to fetch this resource was secure. # LOCALIZATION NOTE (netmonitor.security.state.weak) # This string is used as an tooltip for request that had minor security issues netmonitor.security.state.weak=This resource was transferred over a connection that used weak encryption. # LOCALIZATION NOTE (networkMenu.sizeUnavailable): This is the label displayed # in the network menu specifying the transferred size of a request is # unavailable. networkMenu.sizeUnavailable=— ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/profiler.dtd ================================================ ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/profiler.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the Debugger # which is available from the Web Developer sub-menu -> 'Debugger'. # The correct localization of this file might be to keep it in # English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best # documentation on web development on the web. # LOCALIZATION NOTE (profiler.label2): # This string is displayed in the title of the tab when the profiler is # displayed inside the developer tools window and in the Developer Tools Menu. profiler.label2=성능 # LOCALIZATION NOTE (profiler.panelLabel2): # This is used as the label for the toolbox panel. profiler.panelLabel2=성능 패널 # LOCALIZATION NOTE (profiler.commandkey2, profiler.accesskey) # Used for the menuitem in the tool menu profiler.commandkey2=VK_F5 profiler.accesskey=P # LOCALIZATION NOTE (profiler.tooltip2): # This string is displayed in the tooltip of the tab when the profiler is # displayed inside the developer tools window. profiler.tooltip2=JavaScript 프로파일러 # LOCALIZATION NOTE (noRecordingsText): The text to display in the # recordings menu when there are no recorded profiles yet. noRecordingsText=아직 프로필이 없습니다. # LOCALIZATION NOTE (recordingsList.itemLabel): # This string is displayed in the recordings list of the Profiler, # identifying a set of function calls. recordingsList.itemLabel=기록 #%S # LOCALIZATION NOTE (recordingsList.recordingLabel): # This string is displayed in the recordings list of the Profiler, # for an item that has not finished recording. recordingsList.recordingLabel=진행 중… # LOCALIZATION NOTE (recordingsList.durationLabel): # This string is displayed in the recordings list of the Profiler, # for an item that has finished recording. recordingsList.durationLabel=%S ms # LOCALIZATION NOTE (recordingsList.saveLabel): # This string is displayed in the recordings list of the Profiler, # for saving an item to disk. recordingsList.saveLabel=저장 # LOCALIZATION NOTE (profile.tab): # This string is displayed in the profile view for a tab, after the # recording has finished, as the recording 'start → stop' range in milliseconds. profile.tab=%1$S ms → %2$S ms # LOCALIZATION NOTE (graphs.fps): # This string is displayed in the framerate graph of the Profiler, # as the unit used to measure frames per second. This label should be kept # AS SHORT AS POSSIBLE so it doesn't obstruct important parts of the graph. graphs.fps=fps # LOCALIZATION NOTE (category.*): # These strings are displayed in the categories graph of the Profiler, # as the legend for each block in every bar. These labels should be kept # AS SHORT AS POSSIBLE so they don't obstruct important parts of the graph. category.other=Gecko category.css=스타일 category.js=JIT category.gc=GC category.network=네트워크 category.graphics=그래픽 category.storage=저장소 category.events=입력 및 이벤트 # LOCALIZATION NOTE (table.root): # This string is displayed in the call tree for the root node. table.root=(root) # LOCALIZATION NOTE (table.url.tooltiptext): # This string is displayed in the call tree as the tooltip text for the url # labels which, when clicked, jump to the debugger. table.url.tooltiptext=디버거에서 소스 보기 # LOCALIZATION NOTE (table.zoom.tooltiptext): # This string is displayed in the call tree as the tooltip text for the 'zoom' # buttons (small magnifying glass icons) which spawn a new tab. table.zoom.tooltiptext=새 탭에서 프레임 검사 # LOCALIZATION NOTE (recordingsList.saveDialogTitle): # This string is displayed as a title for saving a recording to disk. recordingsList.saveDialogTitle=프로필 저장… # LOCALIZATION NOTE (recordingsList.saveDialogJSONFilter): # This string is displayed as a filter for saving a recording to disk. recordingsList.saveDialogJSONFilter=JSON 파일 # LOCALIZATION NOTE (recordingsList.saveDialogAllFilter): # This string is displayed as a filter for saving a recording to disk. recordingsList.saveDialogAllFilter=모든 파일 # LOCALIZATION NOTE (graphs.ms): # This string is displayed in the flamegraph of the Profiler, # as the unit used to measure time (in milliseconds). This label should be kept # AS SHORT AS POSSIBLE so it doesn't obstruct important parts of the graph. graphs.ms=ms # LOCALIZATION NOTE (table.idle): # This string is displayed in the call tree for the idle blocks. table.idle=(idle) # LOCALIZATION NOTE (graphs.ms): # This string is displayed in the call tree after units of time in milliseconds. table.ms=ms # LOCALIZATION NOTE (graphs.ms): # This string is displayed in the call tree after units representing percentages. table.percentage=% ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/projecteditor.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the ProjectEditor component # which is used for editing files in a directory and is used inside the # App Manager. # The correct localization of this file might be to keep it in # English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best # documentation on web development on the web. # LOCALIZATION NOTE (projecteditor.confirmUnsavedTitle): # This string is displayed as as the title of the confirm prompt that checks # to make sure if the project editor can be closed without saving changes projecteditor.confirmUnsavedTitle=변경 사항 저장 안함 # LOCALIZATION NOTE (projecteditor.confirmUnsavedLabel): # This string is displayed as the message of the confirm prompt that checks # to make sure if the project editor can be closed without saving changes projecteditor.confirmUnsavedLabel=나가면 모두 날아갈 저장하지 않은 변경 사항이 있습니다. 계속 하시겠습니까? # LOCALIZATION NOTE (projecteditor.deleteLabel): # This string is displayed as a context menu item for allowing the selected # file / folder to be deleted projecteditor.deleteLabel=삭제 # LOCALIZATION NOTE (projecteditor.deletePromptTitle): # This string is displayed as as the title of the confirm prompt that checks # to make sure if a file or folder should be removed. projecteditor.deletePromptTitle=삭제 # LOCALIZATION NOTE (projecteditor.deleteFolderPromptMessage): # This string is displayed as as the message of the confirm prompt that checks # to make sure if a folder should be removed. projecteditor.deleteFolderPromptMessage=이 폴더를 삭제하시겠습니까? # LOCALIZATION NOTE (projecteditor.deleteFilePromptMessage): # This string is displayed as as the message of the confirm prompt that checks # to make sure if a file should be removed. projecteditor.deleteFilePromptMessage=이 파일을 삭제하시겠습니까? # LOCALIZATION NOTE (projecteditor.newLabel): # This string is displayed as a context menu item for adding a new file to # the directory projecteditor.newLabel=새 파일… # LOCALIZATION NOTE (projecteditor.saveLabel): # This string is displayed as a menu item for saving the current file. projecteditor.saveLabel=저장 # LOCALIZATION NOTE (projecteditor.saveAsLabel): # This string is displayed as a menu item for saving the current file # with a new name. projecteditor.saveAsLabel=다른 이름으로 저장… # LOCALIZATION NOTE (projecteditor.selectFileLabel): # This string is displayed as the title on the file picker when saving a file. projecteditor.selectFileLabel=파일 선택 # LOCALIZATION NOTE (projecteditor.openFolderLabel): # This string is displayed as the title on the file picker when opening a folder. projecteditor.openFolderLabel=폴더 선택 # LOCALIZATION NOTE (projecteditor.openFileLabel): # This string is displayed as the title on the file picker when opening a file. projecteditor.openFileLabel=파일 열기 # LOCALIZATION NOTE (projecteditor.find.commandkey): This is the key to use in # conjunction with accel (Command on Mac or Ctrl on other platforms) to search # text in the files. projecteditor.find.commandkey=F # LOCALIZATION NOTE (projecteditor.save.commandkey): This is the key to use in # conjunction with accel (Command on Mac or Ctrl on other platforms) to # save the file. It is used with accel+shift to "save as". projecteditor.save.commandkey=S # LOCALIZATION NOTE (projecteditor.new.commandkey): This is the key to use in # conjunction with accel (Command on Mac or Ctrl on other platforms) to # create a new file. projecteditor.new.commandkey=N # LOCALIZATION NOTE (projecteditor.confirmUnsavedLabel2): # This string is displayed as the message of the confirm prompt that checks # to make sure if the project can be closed/switched without saving changes projecteditor.confirmUnsavedLabel2=You have unsaved changes that will be lost. Are you sure you want to continue? # LOCALIZATION NOTE (projecteditor.renameLabel): # This string is displayed as a menu item for renaming a file in # the directory. projecteditor.renameLabel=Rename ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/responsiveUI.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the Responsive Mode # which is available from the Web Developer sub-menu -> 'Responsive Mode'. # # The correct localization of this file might be to keep it in # English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best # documentation on web development on the web. # LOCALIZATION NOTE (responsiveUI.rotate): label of the rotate button. responsiveUI.rotate2=회전하기 # LOCALIZATION NOTE (responsiveUI.screenshot): tooltip of the screenshot button. responsiveUI.screenshot=스크린샷 # LOCALIZATION NOTE (responsiveUI.screenshotGeneratedFilename): The auto generated filename. # The first argument (%1$S) is the date string in yyyy-mm-dd format and the second # argument (%2$S) is the time string in HH.MM.SS format. responsiveUI.screenshotGeneratedFilename=스크린샷 %1$S %2$S # LOCALIZATION NOTE (responsiveUI.touch): tooltip of the touch button. responsiveUI.touch=터치 이벤트 흉내내기 (페이지를 새로고침해야 할 수 있음) # LOCALIZATION NOTE (responsiveUI.addPreset): label of the add preset button. responsiveUI.addPreset=프리셋 추가 # LOCALIZATION NOTE (responsiveUI.removePreset): label of the remove preset button. responsiveUI.removePreset=프리셋 제거 # LOCALIZATION NOTE (responsiveUI.customResolution): label of the first item # in the menulist at the beginning of the toolbar. For %S is replace with the # current size of the page. For example: "400x600". responsiveUI.customResolution=%S (사용자 정의) # LOCALIZATION NOTE (responsiveUI.namedResolution): label of custom items with a name # in the menulist of the toolbar. # For example: "320x480 (phone)". responsiveUI.namedResolution=%S (%S) # LOCALIZATION NOTE (responsiveUI.customNamePromptTitle): prompt title when asking # the user to specify a name for a new custom preset. responsiveUI.customNamePromptTitle=반응형 웹디자인 보기 # LOCALIZATION NOTE (responsiveUI.close): tooltip text of the close button. responsiveUI.close=반응형 웹디자인 보기에서 나가기 # LOCALIZATION NOTE (responsiveUI.customNamePromptMsg): prompt message when asking # the user to specify a name for a new custom preset. responsiveUI.customNamePromptMsg=%Sx%S 해상도 프리셋의 이름을 지정하세요. # LOCALIZATION NOTE (responsiveUI.resizer): tooltip showed when # overring the resizers. responsiveUI.resizerTooltip=정밀하게 하려면 Control 키를 사용하십시오. 반올림된 크기에는 Shift 키를 사용하십시오. # LOCALIZATION NOTE (responsiveUI.needReload): notification that appears # when touch events are enabled responsiveUI.needReload=이벤트 리스너가 이미 추가되어 있으면 페이지를 새로고침해야 합니다. responsiveUI.notificationReload=새로 고침 responsiveUI.notificationReload_accesskey=R responsiveUI.dontShowReloadNotification=다시 보이지 않기 responsiveUI.dontShowReloadNotification_accesskey=N ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/scratchpad.dtd ================================================ ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/scratchpad.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the JavaScript scratchpad # which is available from the Web Developer sub-menu -> 'Scratchpad'. # # The correct localization of this file might be to keep it in # English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best # documentation on web development on the web. # LOCALIZATION NOTE (export.fileOverwriteConfirmation): This is displayed when # the user attempts to save to an already existing file. export.fileOverwriteConfirmation=파일이 이미 존재합니다. 덮어 쓰시겠습니까? # LOCALIZATION NOTE (browserWindow.unavailable): This error message is shown # when Scratchpad does not find any recently active window of navigator:browser # type. browserWindow.unavailable=코드를 실행하는 브라우저 창이 발견되지 않습니다. # LOCALIZATION NOTE (scratchpadContext.invalid): This error message is shown # when user tries to run an operation in Scratchpad in an unsupported context. scratchpadContext.invalid=현재의 모드에서 스크래치패드가 이 작업을 수행할 수 없습니다. # LOCALIZATION NOTE (openFile.title): This is the file picker title, when you # open a file from Scratchpad. openFile.title=파일 열기 # LOCALIZATION NOTE (openFile.failed): This is the message displayed when file # open fails. openFile.failed=파일을 열지 못했습니다. # LOCALIZATION NOTE (clearRecentMenuItems.label): This is the label for the # menuitem in the 'Open Recent'-menu which clears all recent files. clearRecentMenuItems.label=목록 지우기 # LOCALIZATION NOTE (saveFileAs): This is the file picker title, when you save # a file in Scratchpad. saveFileAs=다른 이름으로 저장하기 # LOCALIZATION NOTE (saveFile.failed): This is the message displayed when file # save fails. saveFile.failed=파일을 저장할 수 없었습니다. # LOCALIZATION NOTE (confirmClose): This is message in the prompt dialog when # you try to close a scratchpad with unsaved changes. confirmClose=이 스크래치패드의 변경 사항을 저장하시겠습니까? # LOCALIZATION NOTE (confirmClose.title): This is title of the prompt dialog when # you try to close a scratchpad with unsaved changes. confirmClose.title=변경 사항 저장 안함 # LOCALIZATION NOTE (confirmRevert): This is message in the prompt dialog when # you try to revert unsaved content of scratchpad. confirmRevert=이 스크래치패드의 변경 사항을 되돌리겠습니까? # LOCALIZATION NOTE (confirmRevert.title): This is title of the prompt dialog when # you try to revert unsaved content of scratchpad. confirmRevert.title=변경사항 되돌리기 # LOCALIZATION NOTE (scratchpadIntro): This is a multi-line comment explaining # how to use the Scratchpad. Note that this should be a valid JavaScript # comment inside /* and */. scratchpadIntro1=/*\n * 이 화면은 JavaScript 스크래치패드입니다.\n *\n * JavaScript 코드를 입력하고, 마우스 오른쪽 클릭을 하거나 실행 메뉴에서 다음 중 하나를 선택하세요:\n * 1. 실행: 선택한 코드를 실행하여 평가합니다. (%1$S),\n * 2. 검사: 객체 검사기를 띄워 결과를 표시합니다. (%2$S), or,\n * 3. 표시: 실행 결과를 선택 부분 아래에 주석으로 삽입합니다. (%3$S)\n */\n\n # LOCALIZATION NOTE (scratchpad.noargs): This error message is shown when # Scratchpad instance is created without any arguments. Scratchpad window # expects to receive its unique identifier as the first window argument. scratchpad.noargs=스크래치패드가 아무런 인자 없이 만들어졌습니다. # LOCALIZATION NOTE (notification.browserContext): This is the message displayed # over the top of the editor when the user has switched to browser context. browserContext.notification=스크래치패드는 브라우저 내에서 실행 합니다. # LOCALIZATION NOTE (help.openDocumentationPage): This returns a localized link with # documentation for Scratchpad on MDN. help.openDocumentationPage=https://developer.mozilla.org/ko/Tools/Scratchpad # LOCALIZATION NOTE (fileExists.notification): This is the message displayed # over the top of the the editor when a file does not exist. fileNoLongerExists.notification=이 파일은 더 이상 존재하지 않습니다. # LOCALIZATION NOTE (propertiesFilterPlaceholder): this is the text that # appears in the filter text box for the properties view container. propertiesFilterPlaceholder=속성 거르기 # LOCALIZATION NOTE (connectionTimeout): message displayed when the Remote Scratchpad # fails to connect to the server due to a timeout. connectionTimeout=연결 시간이 초과되었습니다. 각각의 오류 콘솔에서 가능성 있는 오류 메시지를 확인하십시오. 웹 콘솔을 다시 열고 시도해 보십시오. # LOCALIZATION NOTE (scratchpad.label): this string is displayed in the title of # the tab when the Scratchpad is displayed inside the developer tools window and # in the Developer Tools Menu. scratchpad.label=스크래치패드 # LOCALIZATION NOTE (scratchpad.panelLabel): this is used as the # label for the toolbox panel. scratchpad.panelLabel=스크래치패드 패널 # LOCALIZATION NOTE (scratchpad.tooltip): This string is displayed in the # tooltip of the tab when the Scratchpad is displayed inside the developer tools # window. scratchpad.tooltip=스크래치패드 # LOCALIZATION NOTE (selfxss.msg): the text that is displayed when # a new user of the developer tools pastes code into the console # %1 is the text of selfxss.okstring selfxss.msg=Scam Warning: 사기 주의: 자신이 이해하지 못하는 것을 붙여넣을 때에는 조심하십시오. 이를 통해 공격자가 여러분의 개인 정보를 훔치거나 컴퓨터를 제어할 수 있습니다. 붙여넣기를 허용하려면 '%S'를 아래 스크래치패드에 치십시오. # LOCALIZATION NOTE (selfxss.msg): the string to be typed # in by a new user of the developer tools when they receive the sefxss.msg prompt. # Please avoid using non-keyboard characters here selfxss.okstring=붙여넣기 허가! # LOCALIZATION NOTE (importFromFile.convert.failed): This is the message # displayed when file conversion from some charset to Unicode fails. # %1 is the name of the charset from which the conversion failed. importFromFile.convert.failed=Failed to convert file to Unicode from %1$S. # LOCALIZATION NOTE (scratchpad.statusBarLineCol): Line, Column # information displayed in statusbar when selection is made in # Scratchpad. scratchpad.statusBarLineCol = Line %1$S, Col %2$S ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/shadereditor.dtd ================================================ ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/shadereditor.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the Debugger # which is available from the Web Developer sub-menu -> 'Debugger'. # The correct localization of this file might be to keep it in # English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best # documentation on web development on the web. # LOCALIZATION NOTE (ToolboxShaderEditor.label): # This string is displayed in the title of the tab when the Shader Editor is # displayed inside the developer tools window and in the Developer Tools Menu. ToolboxShaderEditor.label=셰이더 에디터 # LOCALIZATION NOTE (ToolboxShaderEditor.panelLabel): # This is used as the label for the toolbox panel. ToolboxShaderEditor.panelLabel=셰이더 에디터 패널 # LOCALIZATION NOTE (ToolboxShaderEditor.tooltip): # This string is displayed in the tooltip of the tab when the Shader Editor is # displayed inside the developer tools window. ToolboxShaderEditor.tooltip=WebGL용 라이브 GLSL 셰이더 언어 편집기 # LOCALIZATION NOTE (shadersList.programLabel): # This string is displayed in the programs list of the Shader Editor, # identifying a set of linked GLSL shaders. shadersList.programLabel=프로그램 %S # LOCALIZATION NOTE (shadersList.blackboxLabel): # This string is displayed in the programs list of the Shader Editor, while # the user hovers over the checkbox used to toggle blackboxing of a program's # associated fragment shader. shadersList.blackboxLabel=지오메트리를 보이거나 숨기기 ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/shared.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE (dimensions): This is used to display the dimensions # of a node or image, like 100×200. dimensions=%S\u00D7%S ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/sourceeditor.dtd ================================================ ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/sourceeditor.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the Source Editor component. # This component is used whenever source code is displayed for the purpose of # being edited, inside the Firefox developer tools - current examples are the # Scratchpad and the Style Editor tools. # LOCALIZATION NOTE The correct localization of this file might be to keep it # in English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best documentation # on web development on the web. # LOCALIZATION NOTE (findCmd.promptTitle): This is the dialog title used # when the user wants to search for a string in the code. You can # access this feature by pressing Ctrl-F on Windows/Linux or Cmd-F on Mac. findCmd.promptTitle=검색… # LOCALIZATION NOTE (findCmd.promptMessage): This is the message shown when # the user wants to search for a string in the code. You can # access this feature by pressing Ctrl-F on Windows/Linux or Cmd-F on Mac. findCmd.promptMessage=검색: # LOCALIZATION NOTE (gotoLineCmd.promptTitle): This is the dialog title used # when the user wants to jump to a specific line number in the code. You can # access this feature by pressing Ctrl-J on Windows/Linux or Cmd-J on Mac. gotoLineCmd.promptTitle=지정행 이동… # LOCALIZATION NOTE (gotoLineCmd.promptMessage): This is the message shown when # the user wants to jump to a specific line number in the code. You can # access this feature by pressing Ctrl-J on Windows/Linux or Cmd-J on Mac. gotoLineCmd.promptMessage=지정행 이동: # LOCALIZATION NOTE (annotation.breakpoint.title): This is the text shown in # front of any breakpoint annotation when it is displayed as a tooltip in one of # the editor gutters. This feature is used in the JavaScript Debugger. annotation.breakpoint.title=검사지점: %S # LOCALIZATION NOTE (annotation.currentLine): This is the text shown in # a tooltip displayed in any of the editor gutters when the user hovers the # current line. annotation.currentLine=현재 행 # LOCALIZATION NOTE (annotation.debugLocation.title): This is the text shown in # a tooltip displayed in any of the editor gutters when the user hovers the # current debugger location. The debugger can pause the JavaScript execution at # user-defined lines. annotation.debugLocation.title=현재 단계: %S # LOCALIZATION NOTE(autocompletion.docsLink):This is the text shown on # the link inside of the documentation popup. If you type'document'in Scratchpad # then press Shift+Space you can see the popup. autocompletion.docsLink =문서 # LOCALIZATION NOTE(autocompletion.notFound):This is the text shown in # the documentation popup if Tern fails to find a type for the object. autocompletion.notFound =결과 없음 # LOCALIZATION NOTE (jumpToLine.commandkey): This the key to use in # conjunction with accel (Command on Mac or Ctrl on other platforms) to jump to # a specific line in the editor. jumpToLine.commandkey=J # LOCALIZATION NOTE (toggleComment.commandkey): This the key to use in # conjunction with accel (Command on Mac or Ctrl on other platforms) to either # comment or uncomment selected lines in the editor. toggleComment.commandkey=/ # LOCALIZATION NOTE (toolboxPrevTool.commandkey): This the key to use in # conjunction with accel (Command on Mac or Ctrl on other platforms) to reduce # indentation level in CodeMirror. However, its default value also used by # the Toolbox to switch between tools so we disable it. # # DO NOT translate this key without proper synchronization with toolbox.dtd. indentLess.commandkey=[ # LOCALIZATION NOTE (toolboxPrevTool.commandkey): This the key to use in # conjunction with accel (Command on Mac or Ctrl on other platforms) to increase # indentation level in CodeMirror. However, its default value also used by # the Toolbox to switch between tools # # DO NOT translate this key without proper synchronization with toolbox.dtd. indentMore.commandkey=] # LOCALIZATION NOTE (moveLineUp.commandkey): This is the key to use to move # the selected lines up. moveLineUp.commandkey=Alt-Up # LOCALIZATION NOTE (moveLineDown.commandkey): This is the key to use to move # the selected lines down. moveLineDown.commandkey=Alt-Down # LOCALIZATION NOTE (autocomplete.commandkey): This is the key to use # in conjunction with Ctrl for autocompletion. autocompletion.commandkey=Space # LOCALIZATION NOTE (showInformation2.commandkey): This is the key to use to # show more information, like type inference. showInformation2.commandkey=Shift-Ctrl-Space ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/storage.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the Storage Editor tool. # LOCALIZATION NOTE The correct localization of this file might be to keep it # in English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best documentation # on web development on the web. # LOCALIZATION NOTE (storage.commandkey): This the key to use in # conjunction with shift to open the storage editor storage.commandkey=VK_F9 # LOCALIZATION NOTE (storage.accesskey): The access key used to open the storage # editor. storage.accesskey=a # LOCALIZATION NOTE (storage.label): # This string is displayed as the label of the tab in the developer tools window storage.label=저장소 # LOCALIZATION NOTE (storage.menuLabel): # This string is displayed in the Tools menu as a shortcut to open the devtools # with the Storage Inspector tab selected. storage.menuLabel=저장소 검사기 # LOCALIZATION NOTE (storage.panelLabel): # This string is used as the aria-label for the iframe of the Storage Inspector # tool in developer tools toolbox. storage.panelLabel=저장소 패널 # LOCALIZATION NOTE (storage.tooltip): # This string is displayed in the tooltip of the tab when the storage editor is # displayed inside the developer tools window. storage.tooltip2=저장소 검사기 (쿠키, 로컬 스토리지 …) # LOCALIZATION NOTE (tree.emptyText): # This string is displayed when the Storage Tree is empty. This can happen when # there are no websites on the current page (about:blank) tree.emptyText=이 페이지에는 호스트가 없음 # LOCALIZATION NOTE (table.emptyText): # This string is displayed when there are no rows in the Storage Table for the # selected host. table.emptyText=선택한 호스트에 데이터가 없음 # LOCALIZATION NOTE (tree.labels.*): # These strings are the labels for Storage type groups present in the Storage # Tree, like cookies, local storage etc. tree.labels.cookies=쿠키 tree.labels.localStorage=로컬 스토리지 tree.labels.sessionStorage=세션 스토리지 tree.labels.indexedDB=Indexed DB # LOCALIZATION NOTE (table.headers.*.*): # These strings are the header names of the columns in the Storage Table for # each type of storage available through the Storage Tree to the side. table.headers.cookies.name=이름 table.headers.cookies.path=경로 table.headers.cookies.host=도메인 table.headers.cookies.expires=만료하는 날짜 table.headers.cookies.value=값 table.headers.cookies.lastAccessed=마지막으로 접근한 날짜 table.headers.cookies.creationTime=만들어진 날짜 # LOCALIZATION NOTE (table.headers.cookies.isHttpOnly): # This string is used in the header for the column which denotes whether a # cookie is HTTP only or not. table.headers.cookies.isHttpOnly=HttpOnly # LOCALIZATION NOTE (table.headers.cookies.isSecure): # This string is used in the header for the column which denotes whether a # cookie can be accessed via a secure channel only or not. table.headers.cookies.isSecure=Secure # LOCALIZATION NOTE (table.headers.cookies.isDomain): # This string is used in the header for the column which denotes whether a # cookie is a domain cookie only or not. table.headers.cookies.isDomain=Domain table.headers.localStorage.name=키 table.headers.localStorage.value=값 table.headers.sessionStorage.name=키 table.headers.sessionStorage.value=값 table.headers.indexedDB.name=키 table.headers.indexedDB.db=데이터베이스 이름 table.headers.indexedDB.objectStore=객체 저장소 이름 table.headers.indexedDB.value=값 table.headers.indexedDB.origin=출처 table.headers.indexedDB.version=버전 table.headers.indexedDB.objectStores=객체 저장소 table.headers.indexedDB.keyPath=키 table.headers.indexedDB.autoIncrement=Auto Increment table.headers.indexedDB.indexes=인덱스 # LOCALIZATION NOTE (label.expires.session): # This string is displayed in the expires column when the cookie is Session # Cookie label.expires.session=세션 # LOCALIZATION NOTE (storage.search.placeholder): # This is the placeholder text in the sidebar search box storage.search.placeholder=값 걸러내기 # LOCALIZATION NOTE (storage.data.label): # This is the heading displayed over the item value in the sidebar storage.data.label=데이터 # LOCALIZATION NOTE (storage.parsedValue.label): # This is the heading displayed over the item parsed value in the sidebar storage.parsedValue.label=파싱한 값 ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/styleeditor.dtd ================================================ ================================================ FILE: langpacks/ko/browser/chrome/ko/locale/browser/devtools/styleeditor.properties ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # LOCALIZATION NOTE These strings are used inside the Style Editor. # LOCALIZATION NOTE The correct localization of this file might be to keep it # in English, or another language commonly spoken among web developers. # You want to make that choice consistent across the developer tools. # A good criteria is the language in which you'd find the best documentation # on web development on the web. # LOCALIZATION NOTE (chromeWindowTitle): This is the title of the Style Editor # 'chrome' window. That is, the main window with the stylesheets list. # The argument is either the content document's title or its href if no title # is available. chromeWindowTitle=스타일 편집기 [%S] # LOCALIZATION NOTE (inlineStyleSheet): This is the name used for an style sheet # that is declared inline in the

      Takto bude vypadat normln text !

      Takto budou vypadat navstven odkazy !

      Takto budou vypadat aktivn odkazy !

      ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/panels.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/parsingError.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/polyglot.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/prefs/advanced.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/prefs/connection.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/prefs/deactivateLicense.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/prefs/file.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/prefs/general.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/prefs/license.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/prefs/license.properties ================================================ activateWarning=BlueGriffon needs to restart to activate your license. Do you want to restart now? confirmRestart=Restart BlueGriffon? fullResetTitle=License activation reset fullResetErrorLabel=Impossible to perform the operation, a network error occurred. fullResetRequested=A reset link was sent to the owner of the license/transaction. BlueGriffon must now restart. fullResetInvalid=The transaction ID is invalid. ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/prefs/newPage.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/prefs/osx.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.properties ================================================ NoMainWindowAvaialble=Nelze změnit klávesové zkratky PleaseOpenOneMainWindow=Pro změnu klávesových zkratek musí být otevřeno alespoň jedno hlavní okno BlueGriffonu. ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/prefs/source.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/prefs/styles.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/prefs/update.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/prefs/update.properties ================================================ SoftwareUpdates=Aktualizace aplikace UnableToCheck=Nelze zkontrolovat dostupnost UpToDate=BlueGriffon je aktuální ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/prefs.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/propertiesDeck.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/rotator.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/spellCheck.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/spellCheck.properties ================================================ CorrectSpelling=(bez překlepů) NoSuggestedWords=(žádné návrhy) NoMisspelledWord=Bez překlepů CheckSpellingDone=Kontrola pravopisu dokončena. CheckSpelling=Kontrola pravopisu ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/structurebar.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/svg-edit.properties ================================================ SvgEdit=SVG Edit ConfirmClose=Soubor obsahuje neuložené změny. Jste si jisti, že chcete ukončit SVG Edit? ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/tabeditor.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/updateAvailable.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/base/locale/bluegriffon/updates.properties ================================================ update.checkInsideButton.label=Zkontrolovat aktualizace update.checkInsideButton.accesskey=Z update.resumeButton.label=Obnovit stahování %S… update.resumeButton.accesskey=O update.openUpdateUI.applyButton.label=Aktualizovat… update.openUpdateUI.applyButton.accesskey=A update.restart.applyButton.label=Aktualizovat update.restart.applyButton.accesskey=A update.openUpdateUI.upgradeButton.label=Aktualizovat… update.openUpdateUI.upgradeButton.accesskey=A update.restart.upgradeButton.label=Aktualizovat update.restart.upgradeButton.accesskey=A ================================================ FILE: locales/cs/bluegriffon/base/locale/branding/brand.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/base/locale/branding/brand.properties ================================================ brandShortName=BlueGriffon brandFullName=BlueGriffon vendorShortName=Disruptive Innovations sidebarName=Postranní lišta ================================================ FILE: locales/cs/bluegriffon/extensions/fs/addFont.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/extensions/fs/fs.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/extensions/fs/fs.properties ================================================ SelectDir=Vyberte umístění pro rozbalení balíčku fontu SelectFile=Vyberte existující stylesheet.css pro balíček fontu Stylesheet=Styl FontSquirrel balíčku MustBeSavedTitle=Dokument zatím nebyl uložen MustBeSavedMessage=Soubor musíte alespoň jednou uložit před odkazováním na lokální font pomocí relativní URL. Dokument prosím zavřete a znovu otevřete po jeho uložení. ================================================ FILE: locales/cs/bluegriffon/extensions/fs/fsOverlay.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/extensions/gfd/addFont.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/extensions/gfd/gfd.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/extensions/gfd/gfdOverlay.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/extensions/markdown/markdown.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/extensions/markdown/markdownOverlay.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/extensions/op1/a11yFirstStep.properties ================================================ ConformingDTDSyntax=Use a W3C-conforming DTD syntax before the html element NoWrongSyntaxOrNonConformingHierarchy=Don't use wrong attribute syntax or non-conforming element hierarchy inside the html element OneTitleInHead=Use a title element as a child of the head element NoEmptyTitle=When you provide a title element, do not leave it empty NoMetaRefresh=Don't use a meta element with an http-equiv attribute and a value equal to refresh HTMLElementHasLangAttribute=Use the lang attribute for the html element HTMLElementHasValidLangAttribute=Use a valid language code for the lang attribute NoInvalidDir=Don't use a value other than ltr, rtl or empty for the dir attribute TitleForFrames=Use the title attribute for every frame element NoEmptyTitleForFrames=When you provide a title attribute for a frame element, do not leave it empty TitleForIFrames=Use the title attribute for every iframe element NoEmptyTitleForIFrames=When you provide a title attribute for an iframe element, do not leave it empty AtLeastOneH1InBody=There must be at least one h1 element inside (at any level) the body element NoEmptyH1=When you provide a h1 element, do not leave it empty NoEmptyH2=When you provide a h2 element, do not leave it empty NoEmptyH3=When you provide a h3 element, do not leave it empty NoEmptyH4=When you provide a h4 element, do not leave it empty NoEmptyH5=When you provide a h5 element, do not leave it empty NoEmptyH6=When you provide a h6 element, do not leave it empty H2Order=Use  a h1, h2, h3, h4, h5 or h6 element as a first heading before a h2 element in the source order H3Order=Use a h2, h3, h4, h5 or h6 element as a first heading before a h3 element in the source order H4Order=Use a h3, h4, h5 or h6 element as a first heading before a h4 element in the source order H5Order=Use a h4, h5 or h6 element as a first heading before a h5 element in the source order H6Order=Use a h5 or h6 element as a first heading before a h6 element in the source order DTAsFirstChildOfDL=Use a dt element as the first child of a dl element NoEmptyLI=When you provide a li element, do not leave it empty NoAlignAttribute=Don't use the align attribute NoXmpElement=Don't use the xmp element NoEmptyP=When you provide a p element, do not leave it empty NoEmptyAExceptAnchors=When you provide an a element, do not leave it empty except if it is used as an anchor NoEmptyButton=When you provide a button element, do not leave it empty NoVlinkAttribute=Don't use the vlink attribute NoTextAttribute=Don't use the text attribute NoLinkAttribute=Don't use the link attribute noImgWithoutAlt=Use the alt attribute for every img element noAreaWithoutAlt=Use the alt attribute for every area element noAppletWithoutAlt=Use the alt attribute for every applet element noImageInputWithoutAlt=Use the alt attribute for every input type=image element noEmptyAltForImageLoneChildOfAnchorOrButton=If the img element is the only child of a button or an a element, do not leave its alt attribute empty noEmptyAltForInputImage=When you provide an alt attribute for an input type=image element, do not leave it empty noEmptyAltForAreaWithHref=When you provide an alt attribute for an area element holding an href attribute, do not leave it empty noAltSimilarToTextContent=If an img element is a child of an a element with text, do not use the same text for its alt attribute as the text inside the a element noBorderAttribute=Don't use the border attribute noSimilarAltForAreasWithDifferentHref=Don't use the same value for alt attributes for multiple area elements with different href values LongdescIsURI=Use a URI as the value for a longdesc attribute noBackgroundAttribute=Don't use the background attribute noBgsoundElement=Don't use the bgsound element TablesWithAtLeastOneTHHaveACaption=Use a caption element as the first child of a table element containing at least one th element CaptionIsDifferentFromSummaryAttribute=Don't use the same content for a caption element and a summary attribute noEmptyCaption=When you provide a caption element, do not leave it empty noCaptionInATableWithOnlyTDs=Don't use a caption element in a table element containing only td elements noAlinkAttribute=Don't use an alink attribute noSummaryAttributeSimilarToCaption=Don't use the same content for a summary attribute and a caption element noEmptySummaryIfTableHasTHOrCaption=When you provide a summary attribute for a table element containing a th or a caption element, do not leave it empty noSummaryAttributeIfOnlyTDs=Don't use a summary attribute on a table element containg only td elements noStrikeElement=Don't use the strike element noListingElement=Don't use the listing element AtLeastOneTHIfCaptionOrSummary=Use at least one th element inside a table element with a caption element or a non-empty summary attribute AllNonEmptyTHHaveScopeOrId=Use a scope or id attribute for every non-empty th element ScopeAttributeIsRowOrCol=Don't use a value other than row or col for the scope attribute noBgcolorAttribute=Don't use the bgcolor attribute noTTElement=Don't use the tt element TDHaveHeadersAttributeIfTHHasId=Use a headers attribute on every td element if the corresponding th element has an id attribute noPlaintextElement=Don't use the plaintext element noHeadersAttributeThatIsNotATHId=Don't use for a headers attribute a value which matches an id attribute used for a td of the table element AllFormsHaveAButton=Use a button, or an input of type submit, image or button inside a form element SubmitButtonsHaveNonEmptyValue=When you provide an input type=submit, do not leave its value attribute empty noMarqueeElement=Don't use the marquee element FieldsetHasALegend=Use a legend element as a child of every fieldset element FieldsetsAreInForms=Don't use a fieldset element without a form element noEmptyLegendElement=When you provide a legend element, do not leave it empty LabelElementHasForAttribute=Use the for attribute for every label element noEmptyForAttributeOnLabel=When you provide a for attribute for a label element, do not leave it empty ForAttributeMatchesAnIdInSameForm=A for attribute must have a value that matches an id attribute inside the form element OptgroupElementHasALabel=Use the label attribute for every optgroup element NoSimilarLabelInOptgroupsOfSameSelect=Don't use the same label attribute for different optgroup elements of the same select element noEmptyLabelAttributeOnOptgroup=When you provide a label attribute for an optgroup element, do not leave it empty noBasefontElement=Don't use the basefont element noBlinkElement=Don't use the blink element noCenterElement=Don't use the center element noFontElement=Don't use the font element ================================================ FILE: locales/cs/bluegriffon/extensions/op1/op1.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/extensions/op1/op1Overlay.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/extensions/tipoftheday/tipoftheday.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/extensions/tipoftheday/tipoftheday.rdf ================================================ %brandDTD; ]> &brandShortName; tipy http://bluegriffon.org/ &brandShortName; tip dne Archiv cs …&brandShortName; je multi-platformní? …&brandShortName; je dostupný široký výběr operačních systémů, včetně Windows, Mac OS X, mnoho verzí Linux, OS/2, … …&brandShortName; zobrazuje nadpis každé neuložené stránky s červeným stínem? Soubor můžete uložit z kteréhokoliv zobrazení. …máte přímý přístup ke komunitě &brandShortName;? Stačí otevřít nabídku Nápověda. …můžete snadno vkládat HTML5 elementy? Stačí vybrat “Vložit > HTML5 Element”. …můžete zavřít současný panel jedním stiskem? Control+w (Command +w na Mac OS X) zavře současný panel. …můžete otevřít nový panel klávesovou zkratkou? Control+n (Command +n na Mac OS X) otevře nový prázdný panel se stejným doctype jako poslední vytvořená stránka. …se můžete vrátit k dříve uložené verzi aktuálně upravovaného dokumentu? Klikněte pravým tlačítkem (context-click na Mac OS X) na panel dokumentu a vyberte Revert menu. …můžete publikovat stránky přímo z &brandShortName; Nejdříve nainstalujte volný doplněk FireFTP a nastavte jej. Poté bude dostupný z nabídky Nástroje. …&brandShortName; umí snadno vložit jakýkoliv znak? Použijte “Vložit > Znaky a symboly”. Poté můžete vyhledat jakýkoliv znak Unicode podle názvu nebo pomocí prohlížení. …&brandShortName; obsahuje kontrolu pravopisu? Klepnutím pravého tlačítka na slovo zobrazíte návrhy. Kontrolu zapnete nebo vypnuté v nabídce “Nástroje > Možnosti > Obecné” . …&brandShortName; umí spolehlivě vybrat element? Jednoduše klepněte na jeho název v liště struktury. …můžete přesouvat elementy v dokumentu pomocí myši? Nejprve vyberte element klepnutím a pak jej přesuňte, kam je potřeba. …můžete rychle otevřít existující stránky? Placený doplněk Project manager poskytuje rychlý přístup ke stránkám a obrázkům, které jsou organizovány jako ucelený projekt. …si můžete vybrat výchozí prohlížeč? V nabídce “Nástroje > Možnosti > Rozšířené > Resetovat externí nastavení prohlížeče”. Při příštím procházení budete moci vybrat prohlížeč. …&brandShortName; umožňuje používat externí kaskádové stylování? Pro jeho vytvoření přejděte do nabídky “Panels > Stylesheets”. Klepněte na symbol plus a vyberte “Linked to the document”. …&brandShortName; umí spravovat kaskádové styly a complex selectors? Pomocí placeného doplňku CSS Pro Editor můžete měnit pořadí a přidávat atributy rel a titulky ke stylování a vytvářet complex CSS 2 a 3 selectors s pokročilou nápovědou. …můžete měnit velikost panelů? chytněte pravý dolní roh a táhněte na potřebnou velikost. …atributy mohou být přidány k jakémukoliv elementu? Otevřete “Panely > DOM Explorer”. V zobrazení WYSIWYG klepněte na element, vyberte ouško Atributy a klepněte na symbol plus. …&brandShortName; ovládá vlastnosti CSS3? Potřebné prefixy budou doplněny pro prohlížeče, které je vyžadují. …můžete přizpůsobovat klávesové zkratky? Každá položka v nabídkách může mít přidruženu klávesovou zkratku. Otevřete “Nástroje > Možnosti > Klávesové zkratky”. Najděte a poklepejte na požadovanou položku. V novém okně zadejte zkratku. …můžete odstranit třídu (class) od elementu? Jednoduše vyberte element a ve vyskakovacím boxu znovu vyberte třídu. ================================================ FILE: locales/cs/bluegriffon/extensions/tipoftheday/tipofthedayOverlay.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/sidebars/aria/aria.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/sidebars/aria/aria.properties ================================================ mustBeContainedIn=must be contained in or= or ok=OK mustContain=must contain and= and deprecated=deprecated missingTextbox=missing textbox missingListboxTreeGridDialog=missing listbox, tree, grid or dialog ================================================ FILE: locales/cs/bluegriffon/sidebars/aria/ariaOverlay.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/sidebars/cssproperties/backgrounditem.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/sidebars/cssproperties/backgrounditem.properties ================================================ backgroundColorTitle=Barva backgroundImageTitle=Obrázek backgroundLinearGradientTitle=Lineární přechod backgroundRadialGradientTitle=Radiální přechod ================================================ FILE: locales/cs/bluegriffon/sidebars/cssproperties/colorstopitem.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/sidebars/cssproperties/cssproperties.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/sidebars/cssproperties/cssproperties.properties ================================================ EnterAnId=Vložte prosím ID EnterUniqueId=Musíte vložit unikátní ID: NoClasSelected=Musíte vybrat název třídy (class) PleaseSelectAClass=Třída (class) musí být vybrána pro použití požadovaných změn ================================================ FILE: locales/cs/bluegriffon/sidebars/cssproperties/csspropertiesOverlay.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/sidebars/cssproperties/editGridTemplate.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/sidebars/cssproperties/fontFeatures.properties ================================================ FFaalt=Access all alternates FFcalt=Contextual alternates FFsalt=Stylistic alternates FFliga=Standard ligatures FFclig=Contextual ligatures FFdlig=Discretionary ligatures FFhist=Historical forms FFhlig=Historical ligatures FFunic=Unicase FFsmcp=Small capitals FFc2sc=Small capitals from capitals FFc2pc=Petite capitals from capitals FFpcap=Petite capitals FFcase=Case sensitive forms FFcpsp=Capital spacing FFtitl=Titling FFswsh=Swash FFcswh=Contextual swash FFfrac=Fractions FFafrc=Alternative fractions FFordn=Ordinals FFnumr=Numerators FFdnom=Denominators FFsinf=Scientific inferiors FFsups=Superscript FFsubs=Subscript FFonum=Oldstyle figures FFlnum=Lining Figures FFpnum=Proportional figures FFtnum=Tabular figures FFzero=Slashed zero FFmgrk=Mathematical greek FFnalt=Alternate annotation forms FFornm=Ornaments FFlocl=Localized forms FFsize=Optical size FFisol=Isolated forms FFinit=Initial forms FFmedi=Medial forms FFfinal=Final forms FFrlig=Requird ligatures FFccmp=Glyph composition/decomposition FFmark=Mark to base positioning FFmkmj=Mark to mark positioning FFhwid=Half widths ================================================ FILE: locales/cs/bluegriffon/sidebars/cssproperties/griditemposition.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/sidebars/cssproperties/textshadowitem.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/sidebars/cssproperties/transformationitem.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/sidebars/cssproperties/transitionitem.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/sidebars/domexplorer/domexplorer.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/sidebars/domexplorer/domexplorerOverlay.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/sidebars/its20/its20.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/sidebars/its20/its20.properties ================================================ LoadError=Chyba čtení InlineParseError=Inline zdroj není dokumentem ITS 2.0 CannotFetch=Nelze získat URL NotITS=Zdroj není dokumentem ITS 2.0 TranslatableByGlobalRule=Přeložitelné pomocí globálního pravidla NotTranslatableByGlobalRule=Nepřeložitelné pomocí globálního pravidla InlineRules=Inline pravidla translateRule=Přeložit locNoteRule=Poznámka k překladu termRule=Terminologie dirRule=Directionality langRule=Informace k jazyku withinTextRule=Element uvnitř textu domainRule=Doména textAnalysisRule=Analýza textu localeFilterRule=Filtr překladu provRule=Původ externalResourceRefRule=Externí zdroj targetPointerRule=Cílový ukazatel idValueRule=Hodnota ID preserveSpaceRule=Preserve Space locQualityIssueRule=Localization Quality Issue mtConfidenceRule=Machine-Translation Confidence allowedCharactersRule=Povolené znaky storageSizeRule=Velikost úložiště DontWarnAgainForUrl=Znovu neupozorňovat pro tuto URL DontWarnAgainForInline=Znovu neupozorňovat o inline globálních pravidlech NewITSFile=Nový soubor ITS 2.0 CannotResolveXPath=Cannot resolve the following XPath selector (undeclared HTML namespace?): XPathParsingError=XPath Parsing Error DontWarnAgainForSelector=Don't warn me again about this selector CSSParsingError=CSS Parsing Error CannotResolveCSS=Cannot resolve the following CSS selector: ================================================ FILE: locales/cs/bluegriffon/sidebars/its20/its20Overlay.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/sidebars/its20/locNoteRule.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/sidebars/its20/selector.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/sidebars/its20/termRule.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/sidebars/its20/translateRule.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/sidebars/scripteditor/editor.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/sidebars/scripteditor/scripteditor.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/sidebars/scripteditor/scripteditor.properties ================================================ ConfirmDeletionTitle=Odstranit skript ConfirmDeletion=Jste si jisti, že chcete smazat tento skript? AddExternalScriptTitle=Přidat externí skript PromptScriptURL=URL adresa skriptu? ================================================ FILE: locales/cs/bluegriffon/sidebars/scripteditor/scripteditorOverlay.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/sidebars/stylesheets/editor.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/sidebars/stylesheets/stylesheets.dtd ================================================ ================================================ FILE: locales/cs/bluegriffon/sidebars/stylesheets/stylesheetsOverlay.dtd ================================================ ================================================ FILE: locales/cs/cssproperties.mn ================================================ bluegriffon-cs.jar: % locale cssproperties cs %locale/cs/cssproperties/ locale/cs/cssproperties/csspropertiesOverlay.dtd (locale/cs/csspropertiesOverlay.dtd) locale/cs/cssproperties/cssproperties.dtd (locale/cs/cssproperties.dtd) locale/cs/cssproperties/editGridTemplate.dtd (locale/cs/editGridTemplate.dtd) locale/cs/cssproperties/backgrounditem.dtd (locale/cs/backgrounditem.dtd) locale/cs/cssproperties/griditemposition.dtd (locale/cs/griditemposition.dtd) locale/cs/cssproperties/transformationitem.dtd (locale/cs/transformationitem.dtd) locale/cs/cssproperties/transitionitem.dtd (locale/cs/transitionitem.dtd) locale/cs/cssproperties/textshadowitem.dtd (locale/cs/textshadowitem.dtd) locale/cs/cssproperties/colorstopitem.dtd (locale/cs/colorstopitem.dtd) locale/cs/cssproperties/backgrounditem.properties (locale/cs/backgrounditem.properties) locale/cs/cssproperties/cssproperties.properties (locale/cs/cssproperties.properties) locale/cs/cssproperties/fontFeatures.properties (locale/cs/fontFeatures.properties) ================================================ FILE: locales/cs/domexplorer.mn ================================================ bluegriffon-cs.jar: % locale domexplorer cs %locale/cs/domexplorer/ locale/cs/domexplorer/domexplorerOverlay.dtd (locale/cs/domexplorerOverlay.dtd) locale/cs/domexplorer/domexplorer.dtd (locale/cs/domexplorer.dtd) ================================================ FILE: locales/cs/fs.mn ================================================ fs-cs.jar: % locale fs cs %locale/cs/fs/ locale/cs/fs/fsOverlay.dtd (locale/cs/fsOverlay.dtd) locale/cs/fs/fs.dtd (locale/cs/fs.dtd) locale/cs/fs/fs.properties (locale/cs/fs.properties) locale/cs/fs/addFont.dtd (locale/cs/addFont.dtd) ================================================ FILE: locales/cs/gfd.mn ================================================ gfd-cs.jar: % locale gfd cs %locale/cs/gfd/ locale/cs/gfd/gfdOverlay.dtd (locale/cs/gfdOverlay.dtd) locale/cs/gfd/gfd.dtd (locale/cs/gfd.dtd) locale/cs/gfd/addFont.dtd (locale/cs/addFont.dtd) ================================================ FILE: locales/cs/its20.mn ================================================ bluegriffon-cs.jar: % locale its20 cs %locale/cs/its20/ locale/cs/its20/its20Overlay.dtd (locale/cs/its20Overlay.dtd) locale/cs/its20/its20.properties (locale/cs/its20.properties) locale/cs/its20/its20.dtd (locale/cs/its20.dtd) locale/cs/its20/translateRule.dtd (locale/cs/translateRule.dtd) locale/cs/its20/locNoteRule.dtd (locale/cs/locNoteRule.dtd) locale/cs/its20/termRule.dtd (locale/cs/termRule.dtd) locale/cs/its20/selector.dtd (locale/cs/selector.dtd) ================================================ FILE: locales/cs/markdown.mn ================================================ markdown-cs.jar: % locale markdown cs %locale/cs/markdown/ locale/cs/markdown/markdownOverlay.dtd (locale/cs/markdownOverlay.dtd) locale/cs/markdown/markdown.dtd (locale/cs/markdown.dtd) ================================================ FILE: locales/cs/op1.mn ================================================ op1-cs.jar: % locale op1 cs %locale/cs/op1/ locale/cs/op1/op1Overlay.dtd (locale/cs/op1Overlay.dtd) locale/cs/op1/op1.dtd (locale/cs/op1.dtd) locale/cs/op1/a11yFirstStep.properties (locale/cs/a11yFirstStep.properties) ================================================ FILE: locales/cs/scripteditor.mn ================================================ bluegriffon-cs.jar: % locale scripteditor cs %locale/cs/scripteditor/ locale/cs/scripteditor/scripteditorOverlay.dtd (locale/cs/scripteditorOverlay.dtd) locale/cs/scripteditor/scripteditor.dtd (locale/cs/scripteditor.dtd) locale/cs/scripteditor/scripteditor.properties (locale/cs/scripteditor.properties) locale/cs/scripteditor/editor.dtd (locale/cs/editor.dtd) ================================================ FILE: locales/cs/stylesheets.mn ================================================ bluegriffon-cs.jar: % locale stylesheets cs %locale/cs/stylesheets/ locale/cs/stylesheets/stylesheetsOverlay.dtd (locale/cs/stylesheetsOverlay.dtd) locale/cs/stylesheets/stylesheets.dtd (locale/cs/stylesheets.dtd) locale/cs/stylesheets/editor.dtd (locale/cs/editor.dtd) ================================================ FILE: locales/cs/tipoftheday.mn ================================================ tipoftheday-cs.jar: % locale tipoftheday cs %locale/cs/tipoftheday/ locale/cs/tipoftheday/tipoftheday.dtd (locale/cs/tipoftheday.dtd) locale/cs/tipoftheday/tipofthedayOverlay.dtd (locale/cs/tipofthedayOverlay.dtd) locale/cs/tipoftheday/tipoftheday.rdf (locale/cs/tipoftheday.rdf) ================================================ FILE: locales/de/aria.mn ================================================ bluegriffon-de.jar: % locale aria de %locale/de/aria/ locale/de/aria/ariaOverlay.dtd (locale/de/ariaOverlay.dtd) locale/de/aria/aria.dtd (locale/de/aria.dtd) locale/de/aria/aria.properties (locale/de/aria.properties) ================================================ FILE: locales/de/base.mn ================================================ bluegriffon-de.jar: % locale bluegriffon de %locale/de/bluegriffon/ % locale branding de %locale/de/branding/ locale/de/bluegriffon/aboutDialog.dtd (locale/de/bluegriffon/aboutDialog.dtd) locale/de/bluegriffon/bluegriffon.dtd (locale/de/bluegriffon/bluegriffon.dtd) locale/de/bluegriffon/polyglot.dtd (locale/de/bluegriffon/polyglot.dtd) locale/de/bluegriffon/findbar.dtd (locale/de/bluegriffon/findbar.dtd) locale/de/bluegriffon/bluegriffon.properties (locale/de/bluegriffon/bluegriffon.properties) locale/de/bluegriffon/colourPicker.dtd (locale/de/bluegriffon/colourPicker.dtd) locale/de/bluegriffon/credits.dtd (locale/de/bluegriffon/credits.dtd) locale/de/bluegriffon/filepickerbutton.dtd (locale/de/bluegriffon/filepickerbutton.dtd) locale/de/bluegriffon/filePicking.dtd (locale/de/bluegriffon/filePicking.dtd) locale/de/bluegriffon/insertTable.dtd (locale/de/bluegriffon/insertTable.dtd) locale/de/bluegriffon/insertTable.properties (locale/de/bluegriffon/insertTable.properties) locale/de/bluegriffon/language.properties (locale/de/bluegriffon/language.properties) locale/de/bluegriffon/languages.dtd (locale/de/bluegriffon/languages.dtd) locale/de/bluegriffon/markupCleaner.dtd (locale/de/bluegriffon/markupCleaner.dtd) locale/de/bluegriffon/openLocation.dtd (locale/de/bluegriffon/openLocation.dtd) locale/de/bluegriffon/openLocation.properties (locale/de/bluegriffon/openLocation.properties) locale/de/bluegriffon/newPageWizard.dtd (locale/de/bluegriffon/newPageWizard.dtd) locale/de/bluegriffon/newPageWizard.properties (locale/de/bluegriffon/newPageWizard.properties) locale/de/bluegriffon/propertiesDeck.dtd (locale/de/bluegriffon/propertiesDeck.dtd) locale/de/bluegriffon/aria.dtd (locale/de/bluegriffon/aria.dtd) locale/de/bluegriffon/structurebar.dtd (locale/de/bluegriffon/structurebar.dtd) locale/de/bluegriffon/tabeditor.dtd (locale/de/bluegriffon/tabeditor.dtd) locale/de/bluegriffon/masterPasswordQuery.properties (locale/de/bluegriffon/masterPasswordQuery.properties) locale/de/bluegriffon/newDocument.dtd (locale/de/bluegriffon/newDocument.dtd) locale/de/bluegriffon/prefs/file.dtd (locale/de/bluegriffon/prefs/file.dtd) locale/de/bluegriffon/prefs/source.dtd (locale/de/bluegriffon/prefs/source.dtd) locale/de/bluegriffon/prefs/general.dtd (locale/de/bluegriffon/prefs/general.dtd) locale/de/bluegriffon/prefs/newPage.dtd (locale/de/bluegriffon/prefs/newPage.dtd) locale/de/bluegriffon/prefs/update.dtd (locale/de/bluegriffon/prefs/update.dtd) locale/de/bluegriffon/prefs/styles.dtd (locale/de/bluegriffon/prefs/styles.dtd) locale/de/bluegriffon/prefs/advanced.dtd (locale/de/bluegriffon/prefs/advanced.dtd) locale/de/bluegriffon/prefs/connection.dtd (locale/de/bluegriffon/prefs/connection.dtd) locale/de/bluegriffon/prefs/osx.dtd (locale/de/bluegriffon/prefs/osx.dtd) locale/de/bluegriffon/prefs/shortcuts.dtd (locale/de/bluegriffon/prefs/shortcuts.dtd) locale/de/bluegriffon/prefs/update.properties (locale/de/bluegriffon/prefs/update.properties) locale/de/bluegriffon/prefs/license.dtd (locale/de/bluegriffon/prefs/license.dtd) locale/de/bluegriffon/prefs/license.properties (locale/de/bluegriffon/prefs/license.properties) locale/de/bluegriffon/prefs/deactivateLicense.dtd (locale/de/bluegriffon/prefs/deactivateLicense.dtd) locale/de/bluegriffon/prefs.dtd (locale/de/bluegriffon/prefs.dtd) locale/de/bluegriffon/updateAvailable.dtd (locale/de/bluegriffon/updateAvailable.dtd) locale/de/bluegriffon/updates.properties (locale/de/bluegriffon/updates.properties) locale/de/branding/brand.dtd (locale/de/branding/brand.dtd) locale/de/branding/brand.properties (locale/de/branding/brand.properties) locale/de/bluegriffon/insertImage.dtd (locale/de/bluegriffon/insertImage.dtd) locale/de/bluegriffon/insertAnchor.dtd (locale/de/bluegriffon/insertAnchor.dtd) locale/de/bluegriffon/insertCommentOrPI.dtd (locale/de/bluegriffon/insertCommentOrPI.dtd) locale/de/bluegriffon/insertLink.dtd (locale/de/bluegriffon/insertLink.dtd) locale/de/bluegriffon/insertLink.properties (locale/de/bluegriffon/insertLink.properties) locale/de/bluegriffon/cssClassPicker.dtd (locale/de/bluegriffon/cssClassPicker.dtd) locale/de/bluegriffon/insertVideo.dtd (locale/de/bluegriffon/insertVideo.dtd) locale/de/bluegriffon/insertAudio.dtd (locale/de/bluegriffon/insertAudio.dtd) locale/de/bluegriffon/insertVideo.properties (locale/de/bluegriffon/insertVideo.properties) locale/de/bluegriffon/insertHTML.dtd (locale/de/bluegriffon/insertHTML.dtd) locale/de/bluegriffon/insertHR.dtd (locale/de/bluegriffon/insertHR.dtd) locale/de/bluegriffon/insertForm.dtd (locale/de/bluegriffon/insertForm.dtd) locale/de/bluegriffon/parsingError.dtd (locale/de/bluegriffon/parsingError.dtd) locale/de/bluegriffon/insertFormInput.dtd (locale/de/bluegriffon/insertFormInput.dtd) locale/de/bluegriffon/insertFieldset.dtd (locale/de/bluegriffon/insertFieldset.dtd) locale/de/bluegriffon/insertLabel.dtd (locale/de/bluegriffon/insertLabel.dtd) locale/de/bluegriffon/insertButton.dtd (locale/de/bluegriffon/insertButton.dtd) locale/de/bluegriffon/insertSelect.dtd (locale/de/bluegriffon/insertSelect.dtd) locale/de/bluegriffon/insertTextarea.dtd (locale/de/bluegriffon/insertTextarea.dtd) locale/de/bluegriffon/insertKeygen.dtd (locale/de/bluegriffon/insertKeygen.dtd) locale/de/bluegriffon/insertOutput.dtd (locale/de/bluegriffon/insertOutput.dtd) locale/de/bluegriffon/insertProgress.dtd (locale/de/bluegriffon/insertProgress.dtd) locale/de/bluegriffon/insertMeter.dtd (locale/de/bluegriffon/insertMeter.dtd) locale/de/bluegriffon/insertStylesheet.dtd (locale/de/bluegriffon/insertStylesheet.dtd) locale/de/bluegriffon/editStylesheet.dtd (locale/de/bluegriffon/editStylesheet.dtd) locale/de/bluegriffon/media.dtd (locale/de/bluegriffon/media.dtd) locale/de/bluegriffon/media.properties (locale/de/bluegriffon/media.properties) locale/de/bluegriffon/insertChars.dtd (locale/de/bluegriffon/insertChars.dtd) locale/de/bluegriffon/convertToTable.dtd (locale/de/bluegriffon/convertToTable.dtd) locale/de/bluegriffon/pageProperties.dtd (locale/de/bluegriffon/pageProperties.dtd) locale/de/bluegriffon/spellCheck.dtd (locale/de/bluegriffon/spellCheck.dtd) locale/de/bluegriffon/spellCheck.properties (locale/de/bluegriffon/spellCheck.properties) locale/de/bluegriffon/dictionary.dtd (locale/de/bluegriffon/dictionary.dtd) locale/de/bluegriffon/html5.properties (locale/de/bluegriffon/html5.properties) locale/de/bluegriffon/listProperties.dtd (locale/de/bluegriffon/listProperties.dtd) locale/de/bluegriffon/insertTOC.dtd (locale/de/bluegriffon/insertTOC.dtd) locale/de/bluegriffon/svg-edit.properties (locale/de/bluegriffon/svg-edit.properties) locale/de/bluegriffon/panels.dtd (locale/de/bluegriffon/panels.dtd) locale/de/bluegriffon/rotator.dtd (locale/de/bluegriffon/rotator.dtd) ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/aboutDialog.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/aria.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/bluegriffon.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/bluegriffon.properties ================================================ titleModifier=BlueGriffon # in the following string, %t represents the title of the page or its URL # and %b the titleModifier above titleFormat=%S - %S Unknown=[Unbekannt] NoClassAvailable=(keine Klasse) NoIdAvailable=(keine ID) DocumentTitle=Seitentitel NeedDocTitle=Bitte einen Titel für die aktuelle Seite angeben. DocTitleHelp=Identifiziert die Seite mit Seitentitel und Lesezeichen. ExportToText=Als Text exportieren SaveDocumentAs=Seite speichern unter XHTMLfiles=XHTML Dateien untitled=ohne Titel SaveDocument=Seite speichern SaveFileFailed=Seite speichern fehlgeschlagen! ExportToText=Als Text exporteren FileNotSaved=Datei ist noch nicht gespeichert! SaveFileBeforeClosing=Vor dem Schliessen dieses Tabs speichern? YesSaveFile=Ja, speichern NoDiscardChanges=Nein, Änderungen verwerfen DontCloseTab=Tab nicht schliessen! IdAlreadyTaken=ID bereits in diesem Dokument verwendet RemoveIdFromElement=ID des betreffenden Elements entfernen oder abbrechen? YesRemoveId=ID entfernen NoCancel=Abbrechen ReplaceAll=Alle entfernen... ReplacedPart1=Ersetzt ReplacedPart2=Funde AFileWasChanged=Eine Datei wurde ausserhalb Bluegriffons verändert ReloadFile=Die Datei %S wurde ausserhalb Bluegriffons verändert. Bluegriffon muss diese neu laden. DontAskForFileChangesAgain=Diese Meldung nicht mehr anzeigen AbandonChanges=Alle ungespeicherten Änderungen in "%title%" zurücksetzen und Seite neu laden? RevertCaption=Zum letzten Speicherpunkt zurücksetzen HTMLCommentsInXHTMLTitle=HTML-Kommentar innerhalb eines

      So sieht normaler Text aus !

      So sehen besuchte Links aus !

      So sehen aktive Links aus !

      ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/panels.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/parsingError.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/polyglot.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/prefs/advanced.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/prefs/connection.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/prefs/deactivateLicense.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/prefs/file.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/prefs/general.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/prefs/license.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/prefs/license.properties ================================================ activateWarning=BlueGriffon needs to restart to activate your license. Do you want to restart now? confirmRestart=Restart BlueGriffon? fullResetTitle=License activation reset fullResetErrorLabel=Impossible to perform the operation, a network error occurred. fullResetRequested=A reset link was sent to the owner of the license/transaction. BlueGriffon must now restart. fullResetInvalid=The transaction ID is invalid. ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/prefs/newPage.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/prefs/osx.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.properties ================================================ NoMainWindowAvaialble=Kann die Tastaturkürzel nicht bearbeiten. PleaseOpenOneMainWindow=Mindestens ein BlueGriffon-Hauptfenster muss geöffnet sein, um Tastaturkürzel zu bearbeiten. ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/prefs/source.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/prefs/styles.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/prefs/update.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/prefs/update.properties ================================================ SoftwareUpdates=Programmaktualisierungen UnableToCheck=Verfügbarkeit konnte nicht geprüft werden UpToDate=BlueGriffon ist auf dem neuesten Stand ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/prefs.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/propertiesDeck.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/rotator.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/spellCheck.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/spellCheck.properties ================================================ CorrectSpelling=(Wort korrekt geschrieben) NoSuggestedWords=(Keine Vorgeschläge) NoMisspelledWord=Keine falsch geschriebene Wörter CheckSpellingDone=Rechtschreibprüfung abgeschlossen. CheckSpelling=Rechtschreibung prüfen ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/structurebar.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/svg-edit.properties ================================================ SvgEdit=SVG Edit ConfirmClose=Es gibt ungespeicherte Änderungen. Möchten Sie SVG Edit wirklich beenden? ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/tabeditor.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/updateAvailable.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/base/locale/bluegriffon/updates.properties ================================================ update.checkInsideButton.label=Nach Updates suchen update.checkInsideButton.accesskey=N update.resumeButton.label=Herunterladen von %S fortsetzen… update.resumeButton.accesskey=H update.openUpdateUI.applyButton.label=Update installieren… update.openUpdateUI.applyButton.accesskey=U update.restart.applyButton.label=Update installieren update.restart.applyButton.accesskey=U update.openUpdateUI.upgradeButton.label=Jetzt aktualisieren… update.openUpdateUI.upgradeButton.accesskey=a update.restart.upgradeButton.label=Jetzt aktualisieren update.restart.upgradeButton.accesskey=a ================================================ FILE: locales/de/bluegriffon/base/locale/branding/brand.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/base/locale/branding/brand.properties ================================================ brandShortName=BlueGriffon brandFullName=BlueGriffon vendorShortName=Disruptive Innovations sidebarName=Seitenleiste ================================================ FILE: locales/de/bluegriffon/extensions/fs/addFont.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/extensions/fs/fs.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/extensions/fs/fs.properties ================================================ SelectDir=Verzeichnis wählen, wo das Schriftartpaket entpackt werden kann SelectFile=stylesheet.css eines existierenden Schriftartpakets auswählen Stylesheet=Stylesheet eines FontSquirrel Pakets MustBeSavedTitle=Dokument wurde noch nicht gespeichert MustBeSavedMessage=Datei muss mindestens einmal gespeichert worden sein bevor eine lokale Schriftart mit einem relativen URL verlinkt werden kann. Bitte Dokument schliessen, speichern und erneut öffnen. ================================================ FILE: locales/de/bluegriffon/extensions/fs/fsOverlay.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/extensions/gfd/addFont.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/extensions/gfd/gfd.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/extensions/gfd/gfdOverlay.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/extensions/markdown/markdown.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/extensions/markdown/markdownOverlay.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/extensions/op1/a11yFirstStep.properties ================================================ ConformingDTDSyntax=Verwenden Sie eine W3C-konforme DTD-Syntax vor dem HTML-Element! NoWrongSyntaxOrNonConformingHierarchy=Verwenden Sie weder falsche Attributsyntax noch nicht-konforme Element Hierarchie innerhalb des HTML-Elements! OneTitleInHead=Verwenden Sie eine Titel-Element als untergeordnetes Element des Kopf-Elements! NoEmptyTitle=Wenn Sie ein Titel-Element liefern, lassen Sie es nicht leer! NoMetaRefresh=Verwenden Sie kein Meta-Element mit einem http-equiv-Attribut und einem Wert 'refresh'! HTMLElementHasLangAttribute=Verwenden Sie das lang-Attribut für das HTML-Element! HTMLElementHasValidLangAttribute=Benutzen Sie einen gültigen Sprachcode für das lang-Attribut! NoInvalidDir=Verwenden Sie keinen anderen Wert als ltr, rtl oder leer für das DIR-Attribut! TitleForFrames=Verwenden Sie das title-Attribut für jedes frame-Element! NoEmptyTitleForFrames=Wenn Sie ein title-Attribut für ein frame-Element anbieten, lassen Sie es nicht leer! TitleForIFrames=Verwenden Sie das title-Attribut für jedes iframe-Element! NoEmptyTitleForIFrames=Wenn Sie ein title-Attribut für eine iframe-Element anbieten, lassen Sie es nicht leer! AtLeastOneH1InBody=Innerhalb des Body-Elements muss sich mindestens ein H1-Element in jedem Bereich befinden! NoEmptyH1=Wenn Sie ein h1-Element anbieten, lassen Sie es nicht leer! NoEmptyH2=Wenn Sie ein h2-Element anbieten, lassen Sie es nicht leer! NoEmptyH3=Wenn Sie ein h3-Element anbieten, lassen Sie es nicht leer! NoEmptyH4=Wenn Sie ein h4-Element anbieten, lassen Sie es nicht leer! NoEmptyH5=Wenn Sie ein h5-Element anbieten, lassen Sie es nicht leer! NoEmptyH6=Wenn Sie ein h6-Element anbieten, lassen Sie es nicht leer! H2Order=Verwenden Sie ein H1, H2, H3, H4, H5 oder H6-Element als erste Überschrift vor einem h2-Element in der Quellenreihenfolge! H3Order=Verwenden Sie ein H2, H3, H4, H5 oder H6-Element als erste Überschrift vor einem h3-Element in der Quellenreihenfolge! H4Order=Verwenden Sie ein H3, H4, H5 oder H6-Element als erste Überschrift vor einem H4-Element in der Quellenreihenfolge! H5Order=Verwenden Sie ein H4, H5 oder H6-Element als erste Überschrift h5 vor einem Element in der Quellenreihenfolge! H6Order=Verwenden Sie ein H5 oder H6-Element als erste Überschrift vor einem H6-Element in der Quellenreihenfolge! DTAsFirstChildOfDL=Verwenden Sie ein dt-Element als erstes Kind eines dl-Elements! NoEmptyLI=Wenn Sie ein li-Element anbieten, lassen Sie es nicht leer! NoAlignAttribute=Verwenden Sie nicht das Attribut 'align'! NoXmpElement=Verwenden Sie nicht die XMP-Element! NoEmptyP=Wenn Sie ein P-Element anbieten, lassen Sie es nicht leer! NoEmptyAExceptAnchors=Wenn Sie ein Element anbieten, lassen Sie es nicht leer, außer wenn es als Anker verwendet wird! NoEmptyButton=Wenn Sie ein Button-Element anbieten, lassen Sie es nicht leer! NoVlinkAttribute=Verwenden Sie nicht das Attribut 'vlink'! NoTextAttribute=Verwenden Sie nicht das Attribut 'text'! NoLinkAttribute=Verwenden Sie nicht das Attribut 'link'! noImgWithoutAlt=Verwenden Sie das alt-Attribut für jedes img-Element! noAreaWithoutAlt=Verwenden Sie das alt-Attribut für jedes area-Element! noAppletWithoutAlt=Verwenden Sie das alt-Attribut für jedes Applet-Element! noImageInputWithoutAlt=Verwenden Sie das alt-Attribut für jedes input-Element vom Typ image! noEmptyAltForImageLoneChildOfAnchorOrButton=Wenn das img-Element das einzige Kind von einem Knopf oder einem Anker-Element ist, lassen Sie sein alt-Attribut nicht leer! noEmptyAltForInputImage=Wenn Sie ein alt-Attribut für ein input-Element vom Typ image anbieten, lassen Sie es nicht leer! noEmptyAltForAreaWithHref=Wenn Sie ein alt-Attribut für ein area-Element anbieten, lassen Sie es nicht leer! noAltSimilarToTextContent=Wenn ein img-Element ein Kind von einem Element mit einem Text ist, verwenden Sie nicht den gleichen Text wie der Text innerhalb des Elements für sein alt-Attribut! noBorderAttribute=Verwenden Sie nicht das Attribut 'border'! noSimilarAltForAreasWithDifferentHref=Verwenden Sie nicht den gleichen Wert für alt-Attribute für mehrere area-Elemente mit verschiedenen href Werten! LongdescIsURI=Verwenden Sie einen URI als Wert für ein Attribut 'longdesc'! noBackgroundAttribute=Verwenden Sie nicht das Attribut 'background'! noBgsoundElement=Verwenden Sie nicht den bgsound-Element! TablesWithAtLeastOneTHHaveACaption=Verwenden Sie ein caption-Element als erstes Kind von einem Tabellen-Element mit mindestens einem th-Element! CaptionIsDifferentFromSummaryAttribute=Verwenden Sie nicht den gleichen Inhalt für ein Beschriftungselement und ein summary-Attribut! noEmptyCaption=Wenn Sie ein Beschriftung-Element anbieten, lassen Sie es nicht leer! noCaptionInATableWithOnlyTDs=Verwenden Sie kein caption-Element in einer Tabelle, die nur td-Elemente enthält! noAlinkAttribute=Verwenden Sie kein Attribut 'alink'! noSummaryAttributeSimilarToCaption=Verwenden Sie nicht den gleichen Inhalt für ein summary-Attribut und ein caption-Element! noEmptySummaryIfTableHasTHOrCaption=Wenn Sie ein summary-Attribut für ein Tabellen-Element mit einem th-Element oder einer Beschriftung anbieten, lassen Sie es nicht leer! noSummaryAttributeIfOnlyTDs=Verwenden Sie kein summary-Attribut zu einem Tabellen-Element das nur td-Elemente enthält! noStrikeElement=Verwenden Sie kein strike-Element! noListingElement=Verwenden Sie kein listung-Element AtLeastOneTHIfCaptionOrSummary=Verwenden Sie mindestens ein th-Element in einer Tabelle mit einem caption-Element oder einem nicht-leeren summary-Attribut! AllNonEmptyTHHaveScopeOrId=Verwenden Sie ein scope- oder id-Attribut für jedes nicht-leere th-Element! ScopeAttributeIsRowOrCol=Verwenden Sie keinen anderen Wert als Zeile oder Spalte für das scope-Attribut! noBgcolorAttribute=Verwenden Sie nicht das Attribut 'bgcolor'! noTTElement=Verwenden Sie nicht das tt-Element! TDHaveHeadersAttributeIfTHHasId=Verwenden Sie ein header-Attribut für jedes td-Element, wenn das entsprechende th-Element ein id-Attribut hat! noPlaintextElement=Verwenden Sie nicht das plaintext-Element! noHeadersAttributeThatIsNotATHId=Benutzen Sie für ein headers-Attribut keinen Wert, der mit einem id-Attribut, das für ein td-Element einer der Tabelle verwendet wird! AllFormsHaveAButton=Verwenden Sie eine Schaltfläche oder ein input-Element des Typs submit, image oder button in einem form-Element! SubmitButtonsHaveNonEmptyValue=Wenn Sie ein input-Element vom Typ submit anbieten, lassen Sie nicht ihren Wert Attribut leer! noMarqueeElement=Verwenden Sie nicht das marquee-Element! FieldsetHasALegend=Verwenden Sie ein legend-Element als untergeordnetes Element eines jeden fieldset-Elements! FieldsetsAreInForms=Verwenden Sie ein fieldset-Element nicht ohne form-Element! noEmptyLegendElement=Wenn Sie ein legend-Element anbieten, lassen Sie es nicht leer! LabelElementHasForAttribute=Verwenden Sie das for-Attribut für jedes label-Element! noEmptyForAttributeOnLabel=Wenn Sie ein Attribut für ein Label-Element anbieten, lassen Sie es nicht leer! ForAttributeMatchesAnIdInSameForm=Ein for-Attribut muss einen Wert haben, der zu einem id-Attribut im form-Element passt. OptgroupElementHasALabel=Verwenden Sie das label-Attribut für jedes optgroup-Element! NoSimilarLabelInOptgroupsOfSameSelect=Verwenden Sie nicht das gleiche label-Attribut für verschiedene optgroup-Elemente desselben select-Elements! noEmptyLabelAttributeOnOptgroup=Wenn Sie ein label-Attribut für ein optgroup-Element anbieten, lassen Sie es nicht leer! noBasefontElement=Verwenden Sie nicht das basefont-Element! noBlinkElement=Verwenden Sie nicht das blink-Element! noCenterElement=Verwenden Sie nicht das center-Element! noFontElement=Verwenden Sie nicht das font-Element! ================================================ FILE: locales/de/bluegriffon/extensions/op1/op1.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/extensions/op1/op1Overlay.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/extensions/tipoftheday/tipoftheday.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/extensions/tipoftheday/tipoftheday.rdf ================================================ %brandDTD; ]> &brandShortName; Tipps http://bluegriffon.org/ &brandShortName; Tipp des Tages Archiv de … &brandShortName; plattformunabhängig ist? &brandShortName; gibt es für für viele Betriebssysteme inklusive Windows, Mac OS X, viele Linux-Varianten, OS/2, … … &brandShortName; die Titel aller ungespeicherten Seiten mit einem roten Schatten darstellt? Sie können Dateien jetzt aus jedem Anshichtsmodus heraus speichern. … Sie direkten Zugriff auf die &brandShortName;-Gemeinschaft haben? Öffnen Sie einfach “Hilfe > Benutzer Gemeinschaft”. … Sie ein HTML5-Element einfach einfügen können? Wählen Sie einfach “Einfügen > HTML5 Element”. … Sie die aktuelle Registerkarte mit einer Tastenkombination schließen können? Strg+w (Command+w auf Mac OS X) schließt die aktuelle Registerkarte. … Sie eine neue Registerkarte mit einer Tastenkombination erstellen können? Strg+n (Command+n auf Mac OS X) wird eine neue Registerkarte mit demselben Dokumententyp wie die zuletzt erstellte Seite erstellen. … Sie zu einer zuvor gespeicherten Version des aktuell bearbeiteten Dokuments zurückgehen? Rechts-Klick (Kontext-Klick auf Mac OS X) auf den Tab des Dokuments und wählen Sie das Zurückkehren-Menü. … Sie Seiten direkt aus &brandShortName; heraus veröffentlichen können? Installieren Sie zunächst das freie FireFTP-AddOn und richten Sie es ein. Es wird dann im Extras-Menü verfügbar sein. … &brandShortName; jedes Zeichen einfach einfügen kann? Benutzen Sie “Spezielle Zeichen einfügen”. Sie können dann nach jedem Unicode-Zeichen nach dem Namen suchen oder einen Block zur Auswahl öffnen. … &brandShortName; in Voreinstellung die Rechtschreibprüfung prüft? Klicken Sie rechts auf ein Word um Vorschläge zu erhalten. Die Prüfung können Sie mit “Extras > Einstellungen > Einstellungen“ an und abschalten. … &brandShortName; ein Element verlässlich auswählen kann? Klicken Sie einfach auf dessen Namen in der Struktur-Leiste. … Sie ein Element in Ihrem Dokument mit der Maus bewegen können? Wählen Sie es zunächst wie im vorangegangenen Tipp aus und ziehen Sie es wohin Sie möchten. … Sie schnell existierende Seiten öffnen können? Das kostenpflichtige Projektmanager-AddOn erlaubt unmittelbaren Zugang zu Seiten und Bildern die als Projekt organisiert sind. … Sie den Vorgabebrowser wählen können? Benutzen Sie “Extras > Einstellungen > Erweitert > Advanced > externe Browsereinstellungen zurücksetzen”. Beim nächsten Mal werden Sie nach einem Browser gefragt. … &brandShortName; ihnen erlaubt, externe Stile zu benutzen? Um einen nutzungsbereit zu erstellen klicken Sie “Konsolen > Stile”. Klicken Sie auf das Plus-Symbol und wählen “Mit dem Dokument verlinkt”. … &brandShortName; Stile und komplexe Selektoren verwalten kann? Mit dem kostenpflichtigen AddOn CSS Pro Editor können Sie die Reihenfolge ändern und Titel sowie relative Attribute zu Stilen hinzufügen. Sie können damit auch komplexe CSS2- und CSS3-Selektoren mit erweiterter Hilfe entwickeln. … Konsolen vergrößert und verkleinert werden können? Ziehen Sie den Anfasser an der unteren rechten Ecke zur gewünschten Größe. … Attribute zu jedem Element hinzugefügt werden kann? Öffnen Sie “Konsolen > DOM Explorer”. In der WYSIWYG-Ansicht klicken Sie in das Element, wählen den Attribut-Reiter und klicken Sie auf das Plus-Zeichen. … &brandShortName; CSS3-Eigenschaften verarbeiten kann? Hestellerpräfixe werden für Browser die diese benötigen hinzugefügt. … Sie Tastaturkürzel personalisieren können? Jeder Menüeintrag kann mit einer bevorzugten Taste verbunden werden. Öffnen Sie “Extras > Einstellungen > Tastaturkürzel”. Finden und doppelklicken Sie das gewünschte Kommando und legen Sie in einem neuen Fenster ein Kürzel fest. … Sie eine Stilklasse eines Elements entfernen können? Wählen Sie einfach ein Element aus und entfernen Sie die Klasse im Klassen-DropDown. ================================================ FILE: locales/de/bluegriffon/extensions/tipoftheday/tipofthedayOverlay.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/sidebars/aria/aria.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/sidebars/aria/aria.properties ================================================ mustBeContainedIn=must be contained in or= or ok=OK mustContain=must contain and= and deprecated=deprecated missingTextbox=missing textbox missingListboxTreeGridDialog=missing listbox, tree, grid or dialog ================================================ FILE: locales/de/bluegriffon/sidebars/aria/ariaOverlay.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/sidebars/cssproperties/backgrounditem.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/sidebars/cssproperties/backgrounditem.properties ================================================ backgroundColorTitle=Farbe backgroundImageTitle=Bild backgroundLinearGradientTitle=Linearer Gradient backgroundRadialGradientTitle=Radialer Gradient ================================================ FILE: locales/de/bluegriffon/sidebars/cssproperties/colorstopitem.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/sidebars/cssproperties/cssproperties.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/sidebars/cssproperties/cssproperties.properties ================================================ EnterAnId=Bitte ID eingeben EnterUniqueId=Element benötigt eine eindeutige ID: NoClasSelected=Klassenname muss gewählt werden PleaseSelectAClass=Klasse muss gewählt sein, damit Änderungen angewendet werden können ================================================ FILE: locales/de/bluegriffon/sidebars/cssproperties/csspropertiesOverlay.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/sidebars/cssproperties/editGridTemplate.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/sidebars/cssproperties/fontFeatures.properties ================================================ FFaalt=Alle Alterniativen FFcalt=kontextabhängige Alternativen FFsalt=stilistische Alternativen FFliga=Standard Ligaturen FFclig=kontextabhängige Ligaturen FFdlig=beliebige Ligaturen FFhist=historische Formen FFhlig=historische Ligaturen FFunic=Unicase FFsmcp=kleine Kapitälchen FFc2sc=kleine Kapitälchen von Kapitälchen FFc2pc=zierliche Kapitälchen von Kapitälchen FFpcap=zierliche Kapitälchen FFcase=Schriftabhängige Formen FFcpsp=Kapitälchen Größe FFtitl=Betitelung FFswsh=Zierbuchstabe FFcswh=kontextabhängige Zierbuchstaben FFfrac=Brüche FFafrc=Alternative Brüche FFordn=Ordinale FFnumr=Zähler FFdnom=Nenner FFsinf=wissenschaftlich FFsups=Überschift FFsubs=Unterschrift FFonum=Mediävalziffern FFlnum=Tabellenziffern FFpnum=Proportionalziffern FFtnum=Zahlenkolonnen FFzero=gestrichene Null FFmgrk=Mathematitisches griechisch FFnalt=alternative Anmerkungsformen FFornm=Ornamente FFlocl=Übersetzte Formen FFsize=Optische Größe FFisol=Einzelformen FFinit=Initial Formen FFmedi=Inlaut Formen FFfinal=Abschließende Formen FFrlig=notwendige Ligaturen FFccmp=bildliche Gestaltung/Auflösung FFmark=Zeichen zu Basis Positionierung FFmkmj=Zeichen zu Zeichen Positionierung FFhwid=Halbwertsbreiten ================================================ FILE: locales/de/bluegriffon/sidebars/cssproperties/griditemposition.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/sidebars/cssproperties/textshadowitem.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/sidebars/cssproperties/transformationitem.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/sidebars/cssproperties/transitionitem.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/sidebars/domexplorer/domexplorer.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/sidebars/domexplorer/domexplorerOverlay.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/sidebars/its20/its20.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/sidebars/its20/its20.properties ================================================ LoadError=Ladefehler InlineParseError=Eingebettete Ressource ist kein ITS 2.0 Dokument CannotFetch=Kann URL nicht ermitteln NotITS=Ressource ist kein ITS 2.0 Dokument TranslatableByGlobalRule=Durch globale Regel übersetzbar NotTranslatableByGlobalRule=Durch globale Regel nicht übersetzbar InlineRules=Eingebettete Regeln translateRule=Übersetzen locNoteRule=Lokalisierungsnotiz termRule=Terminologie dirRule=Richtungsabhängigkeit langRule=Sprachinformation withinTextRule=Elemente inmitten des Textes domainRule=Domain textAnalysisRule=Text Analyse localeFilterRule=Übersetzungsfilter provRule=Herkunft externalResourceRefRule=Externe Ressource targetPointerRule=Zielzeiger idValueRule=Id-Wert preserveSpaceRule=Platz erhalten locQualityIssueRule=Überstzungsqualitätsproblem mtConfidenceRule=maschinelles Übersetzungsvertrauen allowedCharactersRule=Erlaubte Zeichen storageSizeRule=Speichergröße DontWarnAgainForUrl=Warnen Sie mich nicht wegen dieser URL DontWarnAgainForInline=Warnen Sie mich nicht wegen eingebetteter globaler Regeln NewITSFile=Neue ITS 2.0 Datei CannotResolveXPath=Kann den folgenden XPath-Wähler nicht ermitteln (undeklarierter HTML-Namespace?): XPathParsingError=XPath-Syntaxanalysefehler DontWarnAgainForSelector=Warnen Sie mich nicht wegen diesem Wähler CSSParsingError=CSS-Syntaxanalysefehler CannotResolveCSS=Kann den folgenden CSS-Wähler nicht ermitteln: ================================================ FILE: locales/de/bluegriffon/sidebars/its20/its20Overlay.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/sidebars/its20/locNoteRule.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/sidebars/its20/selector.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/sidebars/its20/termRule.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/sidebars/its20/translateRule.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/sidebars/scripteditor/editor.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/sidebars/scripteditor/scripteditor.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/sidebars/scripteditor/scripteditor.properties ================================================ ConfirmDeletionTitle=Dieses Skript löschen ConfirmDeletion=Sind Sie sicher, dass Sie dieses Skript löschen möchten? AddExternalScriptTitle=Ein externes Skript hinzufügen PromptScriptURL=URL des Skripts ================================================ FILE: locales/de/bluegriffon/sidebars/scripteditor/scripteditorOverlay.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/sidebars/stylesheets/editor.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/sidebars/stylesheets/stylesheets.dtd ================================================ ================================================ FILE: locales/de/bluegriffon/sidebars/stylesheets/stylesheetsOverlay.dtd ================================================ ================================================ FILE: locales/de/cssproperties.mn ================================================ bluegriffon-de.jar: % locale cssproperties de %locale/de/cssproperties/ locale/de/cssproperties/csspropertiesOverlay.dtd (locale/de/csspropertiesOverlay.dtd) locale/de/cssproperties/cssproperties.dtd (locale/de/cssproperties.dtd) locale/de/cssproperties/editGridTemplate.dtd (locale/de/editGridTemplate.dtd) locale/de/cssproperties/backgrounditem.dtd (locale/de/backgrounditem.dtd) locale/de/cssproperties/griditemposition.dtd (locale/de/griditemposition.dtd) locale/de/cssproperties/transformationitem.dtd (locale/de/transformationitem.dtd) locale/de/cssproperties/transitionitem.dtd (locale/de/transitionitem.dtd) locale/de/cssproperties/textshadowitem.dtd (locale/de/textshadowitem.dtd) locale/de/cssproperties/colorstopitem.dtd (locale/de/colorstopitem.dtd) locale/de/cssproperties/backgrounditem.properties (locale/de/backgrounditem.properties) locale/de/cssproperties/cssproperties.properties (locale/de/cssproperties.properties) locale/de/cssproperties/fontFeatures.properties (locale/de/fontFeatures.properties) ================================================ FILE: locales/de/domexplorer.mn ================================================ bluegriffon-de.jar: % locale domexplorer de %locale/de/domexplorer/ locale/de/domexplorer/domexplorerOverlay.dtd (locale/de/domexplorerOverlay.dtd) locale/de/domexplorer/domexplorer.dtd (locale/de/domexplorer.dtd) ================================================ FILE: locales/de/fs.mn ================================================ fs-de.jar: % locale fs de %locale/de/fs/ locale/de/fs/fsOverlay.dtd (locale/de/fsOverlay.dtd) locale/de/fs/fs.dtd (locale/de/fs.dtd) locale/de/fs/fs.properties (locale/de/fs.properties) locale/de/fs/addFont.dtd (locale/de/addFont.dtd) ================================================ FILE: locales/de/gfd.mn ================================================ gfd-de.jar: % locale gfd de %locale/de/gfd/ locale/de/gfd/gfdOverlay.dtd (locale/de/gfdOverlay.dtd) locale/de/gfd/gfd.dtd (locale/de/gfd.dtd) locale/de/gfd/addFont.dtd (locale/de/addFont.dtd) ================================================ FILE: locales/de/its20.mn ================================================ bluegriffon-de.jar: % locale its20 de %locale/de/its20/ locale/de/its20/its20Overlay.dtd (locale/de/its20Overlay.dtd) locale/de/its20/its20.properties (locale/de/its20.properties) locale/de/its20/its20.dtd (locale/de/its20.dtd) locale/de/its20/translateRule.dtd (locale/de/translateRule.dtd) locale/de/its20/locNoteRule.dtd (locale/de/locNoteRule.dtd) locale/de/its20/termRule.dtd (locale/de/termRule.dtd) locale/de/its20/selector.dtd (locale/de/selector.dtd) ================================================ FILE: locales/de/markdown.mn ================================================ markdown-de.jar: % locale markdown de %locale/de/markdown/ locale/de/markdown/markdownOverlay.dtd (locale/de/markdownOverlay.dtd) locale/de/markdown/markdown.dtd (locale/de/markdown.dtd) ================================================ FILE: locales/de/op1.mn ================================================ op1-de.jar: % locale op1 de %locale/de/op1/ locale/de/op1/op1Overlay.dtd (locale/de/op1Overlay.dtd) locale/de/op1/op1.dtd (locale/de/op1.dtd) locale/de/op1/a11yFirstStep.properties (locale/de/a11yFirstStep.properties) ================================================ FILE: locales/de/scripteditor.mn ================================================ bluegriffon-de.jar: % locale scripteditor de %locale/de/scripteditor/ locale/de/scripteditor/scripteditorOverlay.dtd (locale/de/scripteditorOverlay.dtd) locale/de/scripteditor/scripteditor.dtd (locale/de/scripteditor.dtd) locale/de/scripteditor/scripteditor.properties (locale/de/scripteditor.properties) locale/de/scripteditor/editor.dtd (locale/de/editor.dtd) ================================================ FILE: locales/de/stylesheets.mn ================================================ bluegriffon-de.jar: % locale stylesheets de %locale/de/stylesheets/ locale/de/stylesheets/stylesheetsOverlay.dtd (locale/de/stylesheetsOverlay.dtd) locale/de/stylesheets/stylesheets.dtd (locale/de/stylesheets.dtd) locale/de/stylesheets/editor.dtd (locale/de/editor.dtd) ================================================ FILE: locales/de/tipoftheday.mn ================================================ tipoftheday-de.jar: % locale tipoftheday de %locale/de/tipoftheday/ locale/de/tipoftheday/tipoftheday.dtd (locale/de/tipoftheday.dtd) locale/de/tipoftheday/tipofthedayOverlay.dtd (locale/de/tipofthedayOverlay.dtd) locale/de/tipoftheday/tipoftheday.rdf (locale/de/tipoftheday.rdf) ================================================ FILE: locales/en-US/aria.mn ================================================ bluegriffon-en-US.jar: % locale aria en-US %locale/en-US/aria/ locale/en-US/aria/ariaOverlay.dtd (locale/en-US/ariaOverlay.dtd) locale/en-US/aria/aria.dtd (locale/en-US/aria.dtd) locale/en-US/aria/aria.properties (locale/en-US/aria.properties) ================================================ FILE: locales/en-US/base.mn ================================================ bluegriffon-en-US.jar: % locale bluegriffon en-US %locale/en-US/bluegriffon/ % locale branding en-US %locale/en-US/branding/ locale/en-US/bluegriffon/aboutDialog.dtd (locale/en-US/bluegriffon/aboutDialog.dtd) locale/en-US/bluegriffon/bluegriffon.dtd (locale/en-US/bluegriffon/bluegriffon.dtd) locale/en-US/bluegriffon/polyglot.dtd (locale/en-US/bluegriffon/polyglot.dtd) locale/en-US/bluegriffon/findbar.dtd (locale/en-US/bluegriffon/findbar.dtd) locale/en-US/bluegriffon/bluegriffon.properties (locale/en-US/bluegriffon/bluegriffon.properties) locale/en-US/bluegriffon/colourPicker.dtd (locale/en-US/bluegriffon/colourPicker.dtd) locale/en-US/bluegriffon/credits.dtd (locale/en-US/bluegriffon/credits.dtd) locale/en-US/bluegriffon/filepickerbutton.dtd (locale/en-US/bluegriffon/filepickerbutton.dtd) locale/en-US/bluegriffon/filePicking.dtd (locale/en-US/bluegriffon/filePicking.dtd) locale/en-US/bluegriffon/insertTable.dtd (locale/en-US/bluegriffon/insertTable.dtd) locale/en-US/bluegriffon/insertTable.properties (locale/en-US/bluegriffon/insertTable.properties) locale/en-US/bluegriffon/language.properties (locale/en-US/bluegriffon/language.properties) locale/en-US/bluegriffon/languages.dtd (locale/en-US/bluegriffon/languages.dtd) locale/en-US/bluegriffon/markupCleaner.dtd (locale/en-US/bluegriffon/markupCleaner.dtd) locale/en-US/bluegriffon/openLocation.dtd (locale/en-US/bluegriffon/openLocation.dtd) locale/en-US/bluegriffon/openLocation.properties (locale/en-US/bluegriffon/openLocation.properties) locale/en-US/bluegriffon/newPageWizard.dtd (locale/en-US/bluegriffon/newPageWizard.dtd) locale/en-US/bluegriffon/newPageWizard.properties (locale/en-US/bluegriffon/newPageWizard.properties) locale/en-US/bluegriffon/propertiesDeck.dtd (locale/en-US/bluegriffon/propertiesDeck.dtd) locale/en-US/bluegriffon/aria.dtd (locale/en-US/bluegriffon/aria.dtd) locale/en-US/bluegriffon/structurebar.dtd (locale/en-US/bluegriffon/structurebar.dtd) locale/en-US/bluegriffon/tabeditor.dtd (locale/en-US/bluegriffon/tabeditor.dtd) locale/en-US/bluegriffon/masterPasswordQuery.properties (locale/en-US/bluegriffon/masterPasswordQuery.properties) locale/en-US/bluegriffon/newDocument.dtd (locale/en-US/bluegriffon/newDocument.dtd) locale/en-US/bluegriffon/prefs/file.dtd (locale/en-US/bluegriffon/prefs/file.dtd) locale/en-US/bluegriffon/prefs/source.dtd (locale/en-US/bluegriffon/prefs/source.dtd) locale/en-US/bluegriffon/prefs/general.dtd (locale/en-US/bluegriffon/prefs/general.dtd) locale/en-US/bluegriffon/prefs/newPage.dtd (locale/en-US/bluegriffon/prefs/newPage.dtd) locale/en-US/bluegriffon/prefs/update.dtd (locale/en-US/bluegriffon/prefs/update.dtd) locale/en-US/bluegriffon/prefs/styles.dtd (locale/en-US/bluegriffon/prefs/styles.dtd) locale/en-US/bluegriffon/prefs/advanced.dtd (locale/en-US/bluegriffon/prefs/advanced.dtd) locale/en-US/bluegriffon/prefs/connection.dtd (locale/en-US/bluegriffon/prefs/connection.dtd) locale/en-US/bluegriffon/prefs/osx.dtd (locale/en-US/bluegriffon/prefs/osx.dtd) locale/en-US/bluegriffon/prefs/shortcuts.dtd (locale/en-US/bluegriffon/prefs/shortcuts.dtd) locale/en-US/bluegriffon/prefs/update.properties (locale/en-US/bluegriffon/prefs/update.properties) locale/en-US/bluegriffon/prefs/license.dtd (locale/en-US/bluegriffon/prefs/license.dtd) locale/en-US/bluegriffon/prefs/license.properties (locale/en-US/bluegriffon/prefs/license.properties) locale/en-US/bluegriffon/prefs/deactivateLicense.dtd (locale/en-US/bluegriffon/prefs/deactivateLicense.dtd) locale/en-US/bluegriffon/prefs.dtd (locale/en-US/bluegriffon/prefs.dtd) locale/en-US/bluegriffon/updateAvailable.dtd (locale/en-US/bluegriffon/updateAvailable.dtd) locale/en-US/bluegriffon/updates.properties (locale/en-US/bluegriffon/updates.properties) locale/en-US/branding/brand.dtd (locale/en-US/branding/brand.dtd) locale/en-US/branding/brand.properties (locale/en-US/branding/brand.properties) locale/en-US/bluegriffon/insertImage.dtd (locale/en-US/bluegriffon/insertImage.dtd) locale/en-US/bluegriffon/insertAnchor.dtd (locale/en-US/bluegriffon/insertAnchor.dtd) locale/en-US/bluegriffon/insertCommentOrPI.dtd (locale/en-US/bluegriffon/insertCommentOrPI.dtd) locale/en-US/bluegriffon/insertLink.dtd (locale/en-US/bluegriffon/insertLink.dtd) locale/en-US/bluegriffon/insertLink.properties (locale/en-US/bluegriffon/insertLink.properties) locale/en-US/bluegriffon/cssClassPicker.dtd (locale/en-US/bluegriffon/cssClassPicker.dtd) locale/en-US/bluegriffon/insertVideo.dtd (locale/en-US/bluegriffon/insertVideo.dtd) locale/en-US/bluegriffon/insertAudio.dtd (locale/en-US/bluegriffon/insertAudio.dtd) locale/en-US/bluegriffon/insertVideo.properties (locale/en-US/bluegriffon/insertVideo.properties) locale/en-US/bluegriffon/insertHTML.dtd (locale/en-US/bluegriffon/insertHTML.dtd) locale/en-US/bluegriffon/insertHR.dtd (locale/en-US/bluegriffon/insertHR.dtd) locale/en-US/bluegriffon/insertForm.dtd (locale/en-US/bluegriffon/insertForm.dtd) locale/en-US/bluegriffon/parsingError.dtd (locale/en-US/bluegriffon/parsingError.dtd) locale/en-US/bluegriffon/insertFormInput.dtd (locale/en-US/bluegriffon/insertFormInput.dtd) locale/en-US/bluegriffon/insertFieldset.dtd (locale/en-US/bluegriffon/insertFieldset.dtd) locale/en-US/bluegriffon/insertLabel.dtd (locale/en-US/bluegriffon/insertLabel.dtd) locale/en-US/bluegriffon/insertButton.dtd (locale/en-US/bluegriffon/insertButton.dtd) locale/en-US/bluegriffon/insertSelect.dtd (locale/en-US/bluegriffon/insertSelect.dtd) locale/en-US/bluegriffon/insertTextarea.dtd (locale/en-US/bluegriffon/insertTextarea.dtd) locale/en-US/bluegriffon/insertKeygen.dtd (locale/en-US/bluegriffon/insertKeygen.dtd) locale/en-US/bluegriffon/insertOutput.dtd (locale/en-US/bluegriffon/insertOutput.dtd) locale/en-US/bluegriffon/insertProgress.dtd (locale/en-US/bluegriffon/insertProgress.dtd) locale/en-US/bluegriffon/insertMeter.dtd (locale/en-US/bluegriffon/insertMeter.dtd) locale/en-US/bluegriffon/insertStylesheet.dtd (locale/en-US/bluegriffon/insertStylesheet.dtd) locale/en-US/bluegriffon/editStylesheet.dtd (locale/en-US/bluegriffon/editStylesheet.dtd) locale/en-US/bluegriffon/media.dtd (locale/en-US/bluegriffon/media.dtd) locale/en-US/bluegriffon/media.properties (locale/en-US/bluegriffon/media.properties) locale/en-US/bluegriffon/insertChars.dtd (locale/en-US/bluegriffon/insertChars.dtd) locale/en-US/bluegriffon/convertToTable.dtd (locale/en-US/bluegriffon/convertToTable.dtd) locale/en-US/bluegriffon/pageProperties.dtd (locale/en-US/bluegriffon/pageProperties.dtd) locale/en-US/bluegriffon/spellCheck.dtd (locale/en-US/bluegriffon/spellCheck.dtd) locale/en-US/bluegriffon/spellCheck.properties (locale/en-US/bluegriffon/spellCheck.properties) locale/en-US/bluegriffon/dictionary.dtd (locale/en-US/bluegriffon/dictionary.dtd) locale/en-US/bluegriffon/html5.properties (locale/en-US/bluegriffon/html5.properties) locale/en-US/bluegriffon/listProperties.dtd (locale/en-US/bluegriffon/listProperties.dtd) locale/en-US/bluegriffon/insertTOC.dtd (locale/en-US/bluegriffon/insertTOC.dtd) locale/en-US/bluegriffon/svg-edit.properties (locale/en-US/bluegriffon/svg-edit.properties) locale/en-US/bluegriffon/panels.dtd (locale/en-US/bluegriffon/panels.dtd) locale/en-US/bluegriffon/rotator.dtd (locale/en-US/bluegriffon/rotator.dtd) ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/aboutDialog.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/aria.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/bluegriffon.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/bluegriffon.properties ================================================ titleModifier=BlueGriffon # in the following string, %t represents the title of the page or its URL # and %b the titleModifier above titleFormat=%S - %S Unknown=[Unknown] NoClassAvailable=(no class) NoIdAvailable=(no ID) DocumentTitle=Page Title NeedDocTitle=Please enter a title for the current page. DocTitleHelp=This identifies the page in the window title and bookmarks. ExportToText=Export to Text SaveDocumentAs=Save Page As XHTMLfiles=XHTML Files untitled=untitled SaveDocument=Save Page SaveFileFailed=Saving file failed! ExportToText=Export to Text FileNotSaved=File's not saved! SaveFileBeforeClosing=Do you want to save file before closing this tab? YesSaveFile=Yes, save it NoDiscardChanges=No, discard changes DontCloseTab=Don't close tab! IdAlreadyTaken=This ID is already in use in the document RemoveIdFromElement=Do you want to remove the ID from the element already carrying it or cancel the action? YesRemoveId=Remove the ID NoCancel=Cancel ReplaceAll=Replace All... ReplacedPart1=Replaced ReplacedPart2=occurences AFileWasChanged=A file was changed on disk ReloadFile=File %S changed on disk, BlueGriffon must reload it DontAskForFileChangesAgain=don't show this alert again AbandonChanges=Abandon unsaved changes to "%title%" and reload page? RevertCaption=Revert To Last Saved HTMLCommentsInXHTMLTitle=HTML comment inside a

      Normal text will look like this !

      Visited will look like this !

      Active Links will look like this !

      ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/panels.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/parsingError.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/polyglot.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/prefs/advanced.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/prefs/connection.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/prefs/deactivateLicense.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/prefs/file.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/prefs/general.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/prefs/license.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/prefs/license.properties ================================================ activateWarning=BlueGriffon needs to restart to activate your license. Do you want to restart now? confirmRestart=Restart BlueGriffon? fullResetTitle=License activation reset fullResetErrorLabel=Impossible to perform the operation, a network error occurred. fullResetRequested=A reset link was sent to the owner of the license/transaction. BlueGriffon must now restart. fullResetInvalid=The transaction ID is invalid. ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/prefs/newPage.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/prefs/osx.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.properties ================================================ NoMainWindowAvaialble=Cannot edit keyboard shortcuts PleaseOpenOneMainWindow=At least one main BlueGriffon window must be opened to edit keyboard shortcuts. ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/prefs/source.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/prefs/styles.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/prefs/update.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/prefs/update.properties ================================================ SoftwareUpdates=Software Updates UnableToCheck=Unable to check availability UpToDate=BlueGriffon is up to date ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/prefs.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/propertiesDeck.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/rotator.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/spellCheck.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/spellCheck.properties ================================================ CorrectSpelling=(correct spelling) NoSuggestedWords=(no suggested words) NoMisspelledWord=No misspelled words CheckSpellingDone=Completed spell checking. CheckSpelling=Check Spelling ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/structurebar.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/svg-edit.properties ================================================ SvgEdit=SVG Edit ConfirmClose=There are unsaved changes, do you really want to close SVG Edit? ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/tabeditor.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/updateAvailable.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/base/locale/bluegriffon/updates.properties ================================================ update.checkInsideButton.label=Check for Updates update.checkInsideButton.accesskey=C update.resumeButton.label=Resume Downloading %S… update.resumeButton.accesskey=D update.openUpdateUI.applyButton.label=Apply Update… update.openUpdateUI.applyButton.accesskey=A update.restart.applyButton.label=Apply Update update.restart.applyButton.accesskey=A update.openUpdateUI.upgradeButton.label=Upgrade Now… update.openUpdateUI.upgradeButton.accesskey=U update.restart.upgradeButton.label=Upgrade Now update.restart.upgradeButton.accesskey=U ================================================ FILE: locales/en-US/bluegriffon/base/locale/branding/brand.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/base/locale/branding/brand.properties ================================================ brandShortName=BlueGriffon brandFullName=BlueGriffon vendorShortName=Disruptive Innovations sidebarName=Sidebar ================================================ FILE: locales/en-US/bluegriffon/extensions/fs/addFont.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/extensions/fs/fs.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/extensions/fs/fs.properties ================================================ SelectDir=Select a directory where to unzip the font package SelectFile=Select an existing font package's stylesheet.css Stylesheet=A FontSquirrel package's stylesheet MustBeSavedTitle=Document has never been saved MustBeSavedMessage=You must save the file at least once before trying to link a local font using a relative URL. Please close the document and reopen it after saving it. ================================================ FILE: locales/en-US/bluegriffon/extensions/fs/fsOverlay.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/extensions/gfd/addFont.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/extensions/gfd/gfd.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/extensions/gfd/gfdOverlay.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/extensions/markdown/markdown.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/extensions/markdown/markdownOverlay.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/extensions/op1/a11yFirstStep.properties ================================================ ConformingDTDSyntax=Use a W3C-conforming DTD syntax before the html element NoWrongSyntaxOrNonConformingHierarchy=Don't use wrong attribute syntax or non-conforming element hierarchy inside the html element OneTitleInHead=Use a title element as a child of the head element NoEmptyTitle=When you provide a title element, do not leave it empty NoMetaRefresh=Don't use a meta element with an http-equiv attribute and a value equal to refresh HTMLElementHasLangAttribute=Use the lang attribute for the html element HTMLElementHasValidLangAttribute=Use a valid language code for the lang attribute NoInvalidDir=Don't use a value other than ltr, rtl or empty for the dir attribute TitleForFrames=Use the title attribute for every frame element NoEmptyTitleForFrames=When you provide a title attribute for a frame element, do not leave it empty TitleForIFrames=Use the title attribute for every iframe element NoEmptyTitleForIFrames=When you provide a title attribute for an iframe element, do not leave it empty AtLeastOneH1InBody=There must be at least one h1 element inside (at any level) the body element NoEmptyH1=When you provide a h1 element, do not leave it empty NoEmptyH2=When you provide a h2 element, do not leave it empty NoEmptyH3=When you provide a h3 element, do not leave it empty NoEmptyH4=When you provide a h4 element, do not leave it empty NoEmptyH5=When you provide a h5 element, do not leave it empty NoEmptyH6=When you provide a h6 element, do not leave it empty H2Order=Use  a h1, h2, h3, h4, h5 or h6 element as a first heading before a h2 element in the source order H3Order=Use a h2, h3, h4, h5 or h6 element as a first heading before a h3 element in the source order H4Order=Use a h3, h4, h5 or h6 element as a first heading before a h4 element in the source order H5Order=Use a h4, h5 or h6 element as a first heading before a h5 element in the source order H6Order=Use a h5 or h6 element as a first heading before a h6 element in the source order DTAsFirstChildOfDL=Use a dt element as the first child of a dl element NoEmptyLI=When you provide a li element, do not leave it empty NoAlignAttribute=Don't use the align attribute NoXmpElement=Don't use the xmp element NoEmptyP=When you provide a p element, do not leave it empty NoEmptyAExceptAnchors=When you provide an a element, do not leave it empty except if it is used as an anchor NoEmptyButton=When you provide a button element, do not leave it empty NoVlinkAttribute=Don't use the vlink attribute NoTextAttribute=Don't use the text attribute NoLinkAttribute=Don't use the link attribute noImgWithoutAlt=Use the alt attribute for every img element noAreaWithoutAlt=Use the alt attribute for every area element noAppletWithoutAlt=Use the alt attribute for every applet element noImageInputWithoutAlt=Use the alt attribute for every input type=image element noEmptyAltForImageLoneChildOfAnchorOrButton=If the img element is the only child of a button or an a element, do not leave its alt attribute empty noEmptyAltForInputImage=When you provide an alt attribute for an input type=image element, do not leave it empty noEmptyAltForAreaWithHref=When you provide an alt attribute for an area element holding an href attribute, do not leave it empty noAltSimilarToTextContent=If an img element is a child of an a element with text, do not use the same text for its alt attribute as the text inside the a element noBorderAttribute=Don't use the border attribute noSimilarAltForAreasWithDifferentHref=Don't use the same value for alt attributes for multiple area elements with different href values LongdescIsURI=Use a URI as the value for a longdesc attribute noBackgroundAttribute=Don't use the background attribute noBgsoundElement=Don't use the bgsound element TablesWithAtLeastOneTHHaveACaption=Use a caption element as the first child of a table element containing at least one th element CaptionIsDifferentFromSummaryAttribute=Don't use the same content for a caption element and a summary attribute noEmptyCaption=When you provide a caption element, do not leave it empty noCaptionInATableWithOnlyTDs=Don't use a caption element in a table element containing only td elements noAlinkAttribute=Don't use an alink attribute noSummaryAttributeSimilarToCaption=Don't use the same content for a summary attribute and a caption element noEmptySummaryIfTableHasTHOrCaption=When you provide a summary attribute for a table element containing a th or a caption element, do not leave it empty noSummaryAttributeIfOnlyTDs=Don't use a summary attribute on a table element containg only td elements noStrikeElement=Don't use the strike element noListingElement=Don't use the listing element AtLeastOneTHIfCaptionOrSummary=Use at least one th element inside a table element with a caption element or a non-empty summary attribute AllNonEmptyTHHaveScopeOrId=Use a scope or id attribute for every non-empty th element ScopeAttributeIsRowOrCol=Don't use a value other than row or col for the scope attribute noBgcolorAttribute=Don't use the bgcolor attribute noTTElement=Don't use the tt element TDHaveHeadersAttributeIfTHHasId=Use a headers attribute on every td element if the corresponding th element has an id attribute noPlaintextElement=Don't use the plaintext element noHeadersAttributeThatIsNotATHId=Don't use for a headers attribute a value which matches an id attribute used for a td of the table element AllFormsHaveAButton=Use a button, or an input of type submit, image or button inside a form element SubmitButtonsHaveNonEmptyValue=When you provide an input type=submit, do not leave its value attribute empty noMarqueeElement=Don't use the marquee element FieldsetHasALegend=Use a legend element as a child of every fieldset element FieldsetsAreInForms=Don't use a fieldset element without a form element noEmptyLegendElement=When you provide a legend element, do not leave it empty LabelElementHasForAttribute=Use the for attribute for every label element noEmptyForAttributeOnLabel=When you provide a for attribute for a label element, do not leave it empty ForAttributeMatchesAnIdInSameForm=A for attribute must have a value that matches an id attribute inside the form element OptgroupElementHasALabel=Use the label attribute for every optgroup element NoSimilarLabelInOptgroupsOfSameSelect=Don't use the same label attribute for different optgroup elements of the same select element noEmptyLabelAttributeOnOptgroup=When you provide a label attribute for an optgroup element, do not leave it empty noBasefontElement=Don't use the basefont element noBlinkElement=Don't use the blink element noCenterElement=Don't use the center element noFontElement=Don't use the font element ================================================ FILE: locales/en-US/bluegriffon/extensions/op1/op1.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/extensions/op1/op1Overlay.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/extensions/tipoftheday/tipoftheday.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/extensions/tipoftheday/tipoftheday.rdf ================================================ %brandDTD; ]> &brandShortName; tips http://bluegriffon.org/ &brandShortName; tip of the day Archive en-us …&brandShortName; is cross platform? …&brandShortName; exists on a wide variety of operating systems including Windows, Mac OS X, and many flavors of Linux, OS/2 … …&brandShortName; shows the title of any unsaved page with a red shadow? You can now save files from any viewing mode. …you have direct access to the &brandShortName; community? Just select “Help > User’s Community”. …you can insert HTML5 elements easily? Just select “Insert > HTML5 Element”. …you can close the current tab with one key? Control+w (Command +w on Mac OS X) will close the current tab. …you can create a new tab with a key combination? Control+n (Command +n on Mac OS X) will create a new blank tab using the same doctype as the last page created. …you can revert to a previously saved version of the currently edited document? Righ-click (context-click on Mac OS X) on the document's tab and select the Revert menu. …you can publish pages directly from &brandShortName; First install the free FireFTP add-on and set it up. It will then be available on the Tools menu. …&brandShortName; can insert any character easily? Use “Insert characters and symbols”. You can then search for any Unicode character by name or open a block for inspection. …&brandShortName; runs spellcheck by default? Right click a word to find suggestions. Switch checking on or off using “Tools > Preferences > General” . …&brandShortName; can reliably select an element? Simply click its name in the structure bar. …you can move an element in your document using the mouse? First select as in previous tip then just drag it to where needed. …you can quickly open existing pages? The paid for Project manager add-on permits instant access to pages and images which are organised as a project. …you can choose your default browser? Use “Tools > Preferences > Advanced > Reset external browser settings”. Next time you browse you can choose a browser. …&brandShortName; allows you to use external stylesheets? To create one ready for use click “Panels > Stylesheets”. Click the plus sign and select “Linked to the document”. …&brandShortName; can manage stylesheets and complex selectors? Using the CSS Pro Editor (a paid for add-on) you change the order of and add titles and rel attribute to stylesheets and develop complex CSS 2 and 3 selectors with advanced help. …panels can be resized? Drag the grab handle at the bottom right corner to the size needed. …attributes can be added to any element? Open “Panels > DOM Explorer”. In wysiwyg view click in the element, select use the Attributes tab and click the plus sign. …&brandShortName; can handle CSS3 properties? Vendor prefixes will be added for browsers that need them. …you can personalize keyboard shortcuts? Any menu item can be allocated to your preferred key. Open “Tools > Preferences > Keyboard Shortcuts”. Find and double-click the command wanted. In the new window key a shortcut. …you can remove a class from an element? Just select the element and in the Class drop down box re-apply the class. ================================================ FILE: locales/en-US/bluegriffon/extensions/tipoftheday/tipofthedayOverlay.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/sidebars/aria/aria.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/sidebars/aria/aria.properties ================================================ mustBeContainedIn=must be contained in or= or ok=OK mustContain=must contain and= and deprecated=deprecated missingTextbox=missing textbox missingListboxTreeGridDialog=missing listbox, tree, grid or dialog ================================================ FILE: locales/en-US/bluegriffon/sidebars/aria/ariaOverlay.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/sidebars/cssproperties/backgrounditem.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/sidebars/cssproperties/backgrounditem.properties ================================================ backgroundColorTitle=Color backgroundImageTitle=Image backgroundLinearGradientTitle=Linear gradient backgroundRadialGradientTitle=Radial gradient ================================================ FILE: locales/en-US/bluegriffon/sidebars/cssproperties/colorstopitem.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/sidebars/cssproperties/cssproperties.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/sidebars/cssproperties/cssproperties.properties ================================================ EnterAnId=Please enter an ID EnterUniqueId=You must give a unique ID to the element: NoClasSelected=You must select a class name PleaseSelectAClass=A class must be selected to apply the requested changes ================================================ FILE: locales/en-US/bluegriffon/sidebars/cssproperties/csspropertiesOverlay.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/sidebars/cssproperties/editGridTemplate.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/sidebars/cssproperties/fontFeatures.properties ================================================ FFaalt=Access all alternates FFcalt=Contextual alternates FFsalt=Stylistic alternates FFliga=Standard ligatures FFclig=Contextual ligatures FFdlig=Discretionary ligatures FFhist=Historical forms FFhlig=Historical ligatures FFunic=Unicase FFsmcp=Small capitals FFc2sc=Small capitals from capitals FFc2pc=Petite capitals from capitals FFpcap=Petite capitals FFcase=Case sensitive forms FFcpsp=Capital spacing FFtitl=Titling FFswsh=Swash FFcswh=Contextual swash FFfrac=Fractions FFafrc=Alternative fractions FFordn=Ordinals FFnumr=Numerators FFdnom=Denominators FFsinf=Scientific inferiors FFsups=Superscript FFsubs=Subscript FFonum=Oldstyle figures FFlnum=Lining Figures FFpnum=Proportional figures FFtnum=Tabular figures FFzero=Slashed zero FFmgrk=Mathematical greek FFnalt=Alternate annotation forms FFornm=Ornaments FFlocl=Localized forms FFsize=Optical size FFisol=Isolated forms FFinit=Initial forms FFmedi=Medial forms FFfinal=Final forms FFrlig=Requird ligatures FFccmp=Glyph composition/decomposition FFmark=Mark to base positioning FFmkmj=Mark to mark positioning FFhwid=Half widths ================================================ FILE: locales/en-US/bluegriffon/sidebars/cssproperties/griditemposition.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/sidebars/cssproperties/textshadowitem.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/sidebars/cssproperties/transformationitem.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/sidebars/cssproperties/transitionitem.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/sidebars/domexplorer/domexplorer.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/sidebars/domexplorer/domexplorerOverlay.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/sidebars/its20/its20.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/sidebars/its20/its20.properties ================================================ LoadError=Load Error InlineParseError=Inline resource is not an ITS 2.0 document CannotFetch=Cannot fetch URL NotITS=Resource is not an ITS 2.0 document TranslatableByGlobalRule=Translatable by global rule NotTranslatableByGlobalRule=Not translatable by global rule InlineRules= translateRule=Translate locNoteRule=Localization Note termRule=Terminology dirRule=Directionality langRule=Language Information withinTextRule=Elements Within Text domainRule=Domain textAnalysisRule=Text Analysis localeFilterRule=Locale Filter provRule=Provenance externalResourceRefRule=External Resource targetPointerRule=Target Pointer idValueRule=Id Value preserveSpaceRule=Preserve Space locQualityIssueRule=Localization Quality Issue mtConfidenceRule=Machine-Translation Confidence allowedCharactersRule=Allowed Characters storageSizeRule=Storage Size DontWarnAgainForUrl=Don't warn me again about this URL DontWarnAgainForInline=Don't warn me again about inline global rules NewITSFile=New ITS 2.0 File CannotResolveXPath=Cannot resolve the following XPath selector (undeclared HTML namespace?): XPathParsingError=XPath Parsing Error DontWarnAgainForSelector=Don't warn me again about this selector CSSParsingError=CSS Parsing Error CannotResolveCSS=Cannot resolve the following CSS selector: ================================================ FILE: locales/en-US/bluegriffon/sidebars/its20/its20Overlay.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/sidebars/its20/locNoteRule.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/sidebars/its20/selector.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/sidebars/its20/termRule.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/sidebars/its20/translateRule.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/sidebars/scripteditor/editor.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/sidebars/scripteditor/scripteditor.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/sidebars/scripteditor/scripteditor.properties ================================================ ConfirmDeletionTitle=Delete a script ConfirmDeletion=Are you sure you want to delete this script? AddExternalScriptTitle=Add an external script PromptScriptURL=URL of the script? ================================================ FILE: locales/en-US/bluegriffon/sidebars/scripteditor/scripteditorOverlay.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/sidebars/stylesheets/editor.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/sidebars/stylesheets/stylesheets.dtd ================================================ ================================================ FILE: locales/en-US/bluegriffon/sidebars/stylesheets/stylesheetsOverlay.dtd ================================================ ================================================ FILE: locales/en-US/cssproperties.mn ================================================ bluegriffon-en-US.jar: % locale cssproperties en-US %locale/en-US/cssproperties/ locale/en-US/cssproperties/csspropertiesOverlay.dtd (locale/en-US/csspropertiesOverlay.dtd) locale/en-US/cssproperties/cssproperties.dtd (locale/en-US/cssproperties.dtd) locale/en-US/cssproperties/editGridTemplate.dtd (locale/en-US/editGridTemplate.dtd) locale/en-US/cssproperties/backgrounditem.dtd (locale/en-US/backgrounditem.dtd) locale/en-US/cssproperties/griditemposition.dtd (locale/en-US/griditemposition.dtd) locale/en-US/cssproperties/transformationitem.dtd (locale/en-US/transformationitem.dtd) locale/en-US/cssproperties/transitionitem.dtd (locale/en-US/transitionitem.dtd) locale/en-US/cssproperties/textshadowitem.dtd (locale/en-US/textshadowitem.dtd) locale/en-US/cssproperties/colorstopitem.dtd (locale/en-US/colorstopitem.dtd) locale/en-US/cssproperties/backgrounditem.properties (locale/en-US/backgrounditem.properties) locale/en-US/cssproperties/cssproperties.properties (locale/en-US/cssproperties.properties) locale/en-US/cssproperties/fontFeatures.properties (locale/en-US/fontFeatures.properties) ================================================ FILE: locales/en-US/domexplorer.mn ================================================ bluegriffon-en-US.jar: % locale domexplorer en-US %locale/en-US/domexplorer/ locale/en-US/domexplorer/domexplorerOverlay.dtd (locale/en-US/domexplorerOverlay.dtd) locale/en-US/domexplorer/domexplorer.dtd (locale/en-US/domexplorer.dtd) ================================================ FILE: locales/en-US/fs.mn ================================================ fs-en-US.jar: % locale fs en-US %locale/en-US/fs/ locale/en-US/fs/fsOverlay.dtd (locale/en-US/fsOverlay.dtd) locale/en-US/fs/fs.dtd (locale/en-US/fs.dtd) locale/en-US/fs/fs.properties (locale/en-US/fs.properties) locale/en-US/fs/addFont.dtd (locale/en-US/addFont.dtd) ================================================ FILE: locales/en-US/gfd.mn ================================================ gfd-en-US.jar: % locale gfd en-US %locale/en-US/gfd/ locale/en-US/gfd/gfdOverlay.dtd (locale/en-US/gfdOverlay.dtd) locale/en-US/gfd/gfd.dtd (locale/en-US/gfd.dtd) locale/en-US/gfd/addFont.dtd (locale/en-US/addFont.dtd) ================================================ FILE: locales/en-US/its20.mn ================================================ bluegriffon-en-US.jar: % locale its20 en-US %locale/en-US/its20/ locale/en-US/its20/its20Overlay.dtd (locale/en-US/its20Overlay.dtd) locale/en-US/its20/its20.properties (locale/en-US/its20.properties) locale/en-US/its20/its20.dtd (locale/en-US/its20.dtd) locale/en-US/its20/translateRule.dtd (locale/en-US/translateRule.dtd) locale/en-US/its20/locNoteRule.dtd (locale/en-US/locNoteRule.dtd) locale/en-US/its20/termRule.dtd (locale/en-US/termRule.dtd) locale/en-US/its20/selector.dtd (locale/en-US/selector.dtd) ================================================ FILE: locales/en-US/markdown.mn ================================================ markdown-en-US.jar: % locale markdown en-US %locale/en-US/markdown/ locale/en-US/markdown/markdownOverlay.dtd (locale/en-US/markdownOverlay.dtd) locale/en-US/markdown/markdown.dtd (locale/en-US/markdown.dtd) ================================================ FILE: locales/en-US/op1.mn ================================================ op1-en-US.jar: % locale op1 en-US %locale/en-US/op1/ locale/en-US/op1/op1Overlay.dtd (locale/en-US/op1Overlay.dtd) locale/en-US/op1/op1.dtd (locale/en-US/op1.dtd) locale/en-US/op1/a11yFirstStep.properties (locale/en-US/a11yFirstStep.properties) ================================================ FILE: locales/en-US/scripteditor.mn ================================================ bluegriffon-en-US.jar: % locale scripteditor en-US %locale/en-US/scripteditor/ locale/en-US/scripteditor/scripteditorOverlay.dtd (locale/en-US/scripteditorOverlay.dtd) locale/en-US/scripteditor/scripteditor.dtd (locale/en-US/scripteditor.dtd) locale/en-US/scripteditor/scripteditor.properties (locale/en-US/scripteditor.properties) locale/en-US/scripteditor/editor.dtd (locale/en-US/editor.dtd) ================================================ FILE: locales/en-US/stylesheets.mn ================================================ bluegriffon-en-US.jar: % locale stylesheets en-US %locale/en-US/stylesheets/ locale/en-US/stylesheets/stylesheetsOverlay.dtd (locale/en-US/stylesheetsOverlay.dtd) locale/en-US/stylesheets/stylesheets.dtd (locale/en-US/stylesheets.dtd) locale/en-US/stylesheets/editor.dtd (locale/en-US/editor.dtd) ================================================ FILE: locales/en-US/tipoftheday.mn ================================================ tipoftheday-en-US.jar: % locale tipoftheday en-US %locale/en-US/tipoftheday/ locale/en-US/tipoftheday/tipoftheday.dtd (locale/en-US/tipoftheday.dtd) locale/en-US/tipoftheday/tipofthedayOverlay.dtd (locale/en-US/tipofthedayOverlay.dtd) locale/en-US/tipoftheday/tipoftheday.rdf (locale/en-US/tipoftheday.rdf) ================================================ FILE: locales/es-ES/aria.mn ================================================ bluegriffon-es-ES.jar: % locale aria es-ES %locale/es-ES/aria/ locale/es-ES/aria/ariaOverlay.dtd (locale/es-ES/ariaOverlay.dtd) locale/es-ES/aria/aria.dtd (locale/es-ES/aria.dtd) locale/es-ES/aria/aria.properties (locale/es-ES/aria.properties) ================================================ FILE: locales/es-ES/base.mn ================================================ bluegriffon-es-ES.jar: % locale bluegriffon es-ES %locale/es-ES/bluegriffon/ % locale branding es-ES %locale/es-ES/branding/ locale/es-ES/bluegriffon/aboutDialog.dtd (locale/es-ES/bluegriffon/aboutDialog.dtd) locale/es-ES/bluegriffon/bluegriffon.dtd (locale/es-ES/bluegriffon/bluegriffon.dtd) locale/es-ES/bluegriffon/polyglot.dtd (locale/es-ES/bluegriffon/polyglot.dtd) locale/es-ES/bluegriffon/findbar.dtd (locale/es-ES/bluegriffon/findbar.dtd) locale/es-ES/bluegriffon/bluegriffon.properties (locale/es-ES/bluegriffon/bluegriffon.properties) locale/es-ES/bluegriffon/colourPicker.dtd (locale/es-ES/bluegriffon/colourPicker.dtd) locale/es-ES/bluegriffon/credits.dtd (locale/es-ES/bluegriffon/credits.dtd) locale/es-ES/bluegriffon/filepickerbutton.dtd (locale/es-ES/bluegriffon/filepickerbutton.dtd) locale/es-ES/bluegriffon/filePicking.dtd (locale/es-ES/bluegriffon/filePicking.dtd) locale/es-ES/bluegriffon/insertTable.dtd (locale/es-ES/bluegriffon/insertTable.dtd) locale/es-ES/bluegriffon/insertTable.properties (locale/es-ES/bluegriffon/insertTable.properties) locale/es-ES/bluegriffon/language.properties (locale/es-ES/bluegriffon/language.properties) locale/es-ES/bluegriffon/languages.dtd (locale/es-ES/bluegriffon/languages.dtd) locale/es-ES/bluegriffon/markupCleaner.dtd (locale/es-ES/bluegriffon/markupCleaner.dtd) locale/es-ES/bluegriffon/openLocation.dtd (locale/es-ES/bluegriffon/openLocation.dtd) locale/es-ES/bluegriffon/openLocation.properties (locale/es-ES/bluegriffon/openLocation.properties) locale/es-ES/bluegriffon/newPageWizard.dtd (locale/es-ES/bluegriffon/newPageWizard.dtd) locale/es-ES/bluegriffon/newPageWizard.properties (locale/es-ES/bluegriffon/newPageWizard.properties) locale/es-ES/bluegriffon/propertiesDeck.dtd (locale/es-ES/bluegriffon/propertiesDeck.dtd) locale/es-ES/bluegriffon/aria.dtd (locale/es-ES/bluegriffon/aria.dtd) locale/es-ES/bluegriffon/structurebar.dtd (locale/es-ES/bluegriffon/structurebar.dtd) locale/es-ES/bluegriffon/tabeditor.dtd (locale/es-ES/bluegriffon/tabeditor.dtd) locale/es-ES/bluegriffon/masterPasswordQuery.properties (locale/es-ES/bluegriffon/masterPasswordQuery.properties) locale/es-ES/bluegriffon/newDocument.dtd (locale/es-ES/bluegriffon/newDocument.dtd) locale/es-ES/bluegriffon/prefs/file.dtd (locale/es-ES/bluegriffon/prefs/file.dtd) locale/es-ES/bluegriffon/prefs/source.dtd (locale/es-ES/bluegriffon/prefs/source.dtd) locale/es-ES/bluegriffon/prefs/general.dtd (locale/es-ES/bluegriffon/prefs/general.dtd) locale/es-ES/bluegriffon/prefs/newPage.dtd (locale/es-ES/bluegriffon/prefs/newPage.dtd) locale/es-ES/bluegriffon/prefs/update.dtd (locale/es-ES/bluegriffon/prefs/update.dtd) locale/es-ES/bluegriffon/prefs/styles.dtd (locale/es-ES/bluegriffon/prefs/styles.dtd) locale/es-ES/bluegriffon/prefs/advanced.dtd (locale/es-ES/bluegriffon/prefs/advanced.dtd) locale/es-ES/bluegriffon/prefs/connection.dtd (locale/es-ES/bluegriffon/prefs/connection.dtd) locale/es-ES/bluegriffon/prefs/osx.dtd (locale/es-ES/bluegriffon/prefs/osx.dtd) locale/es-ES/bluegriffon/prefs/shortcuts.dtd (locale/es-ES/bluegriffon/prefs/shortcuts.dtd) locale/es-ES/bluegriffon/prefs/update.properties (locale/es-ES/bluegriffon/prefs/update.properties) locale/es-ES/bluegriffon/prefs/license.dtd (locale/es-ES/bluegriffon/prefs/license.dtd) locale/es-ES/bluegriffon/prefs/license.properties (locale/es-ES/bluegriffon/prefs/license.properties) locale/es-ES/bluegriffon/prefs/deactivateLicense.dtd (locale/es-ES/bluegriffon/prefs/deactivateLicense.dtd) locale/es-ES/bluegriffon/prefs.dtd (locale/es-ES/bluegriffon/prefs.dtd) locale/es-ES/bluegriffon/updateAvailable.dtd (locale/es-ES/bluegriffon/updateAvailable.dtd) locale/es-ES/bluegriffon/updates.properties (locale/es-ES/bluegriffon/updates.properties) locale/es-ES/branding/brand.dtd (locale/es-ES/branding/brand.dtd) locale/es-ES/branding/brand.properties (locale/es-ES/branding/brand.properties) locale/es-ES/bluegriffon/insertImage.dtd (locale/es-ES/bluegriffon/insertImage.dtd) locale/es-ES/bluegriffon/insertAnchor.dtd (locale/es-ES/bluegriffon/insertAnchor.dtd) locale/es-ES/bluegriffon/insertCommentOrPI.dtd (locale/es-ES/bluegriffon/insertCommentOrPI.dtd) locale/es-ES/bluegriffon/insertLink.dtd (locale/es-ES/bluegriffon/insertLink.dtd) locale/es-ES/bluegriffon/insertLink.properties (locale/es-ES/bluegriffon/insertLink.properties) locale/es-ES/bluegriffon/cssClassPicker.dtd (locale/es-ES/bluegriffon/cssClassPicker.dtd) locale/es-ES/bluegriffon/insertVideo.dtd (locale/es-ES/bluegriffon/insertVideo.dtd) locale/es-ES/bluegriffon/insertAudio.dtd (locale/es-ES/bluegriffon/insertAudio.dtd) locale/es-ES/bluegriffon/insertVideo.properties (locale/es-ES/bluegriffon/insertVideo.properties) locale/es-ES/bluegriffon/insertHTML.dtd (locale/es-ES/bluegriffon/insertHTML.dtd) locale/es-ES/bluegriffon/insertHR.dtd (locale/es-ES/bluegriffon/insertHR.dtd) locale/es-ES/bluegriffon/insertForm.dtd (locale/es-ES/bluegriffon/insertForm.dtd) locale/es-ES/bluegriffon/parsingError.dtd (locale/es-ES/bluegriffon/parsingError.dtd) locale/es-ES/bluegriffon/insertFormInput.dtd (locale/es-ES/bluegriffon/insertFormInput.dtd) locale/es-ES/bluegriffon/insertFieldset.dtd (locale/es-ES/bluegriffon/insertFieldset.dtd) locale/es-ES/bluegriffon/insertLabel.dtd (locale/es-ES/bluegriffon/insertLabel.dtd) locale/es-ES/bluegriffon/insertButton.dtd (locale/es-ES/bluegriffon/insertButton.dtd) locale/es-ES/bluegriffon/insertSelect.dtd (locale/es-ES/bluegriffon/insertSelect.dtd) locale/es-ES/bluegriffon/insertTextarea.dtd (locale/es-ES/bluegriffon/insertTextarea.dtd) locale/es-ES/bluegriffon/insertKeygen.dtd (locale/es-ES/bluegriffon/insertKeygen.dtd) locale/es-ES/bluegriffon/insertOutput.dtd (locale/es-ES/bluegriffon/insertOutput.dtd) locale/es-ES/bluegriffon/insertProgress.dtd (locale/es-ES/bluegriffon/insertProgress.dtd) locale/es-ES/bluegriffon/insertMeter.dtd (locale/es-ES/bluegriffon/insertMeter.dtd) locale/es-ES/bluegriffon/insertStylesheet.dtd (locale/es-ES/bluegriffon/insertStylesheet.dtd) locale/es-ES/bluegriffon/editStylesheet.dtd (locale/es-ES/bluegriffon/editStylesheet.dtd) locale/es-ES/bluegriffon/media.dtd (locale/es-ES/bluegriffon/media.dtd) locale/es-ES/bluegriffon/media.properties (locale/es-ES/bluegriffon/media.properties) locale/es-ES/bluegriffon/insertChars.dtd (locale/es-ES/bluegriffon/insertChars.dtd) locale/es-ES/bluegriffon/convertToTable.dtd (locale/es-ES/bluegriffon/convertToTable.dtd) locale/es-ES/bluegriffon/pageProperties.dtd (locale/es-ES/bluegriffon/pageProperties.dtd) locale/es-ES/bluegriffon/spellCheck.dtd (locale/es-ES/bluegriffon/spellCheck.dtd) locale/es-ES/bluegriffon/spellCheck.properties (locale/es-ES/bluegriffon/spellCheck.properties) locale/es-ES/bluegriffon/dictionary.dtd (locale/es-ES/bluegriffon/dictionary.dtd) locale/es-ES/bluegriffon/html5.properties (locale/es-ES/bluegriffon/html5.properties) locale/es-ES/bluegriffon/listProperties.dtd (locale/es-ES/bluegriffon/listProperties.dtd) locale/es-ES/bluegriffon/insertTOC.dtd (locale/es-ES/bluegriffon/insertTOC.dtd) locale/es-ES/bluegriffon/svg-edit.properties (locale/es-ES/bluegriffon/svg-edit.properties) locale/es-ES/bluegriffon/panels.dtd (locale/es-ES/bluegriffon/panels.dtd) locale/es-ES/bluegriffon/rotator.dtd (locale/es-ES/bluegriffon/rotator.dtd) ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/aboutDialog.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/aria.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/bluegriffon.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/bluegriffon.properties ================================================ titleModifier = BlueGriffon titleFormat = %S - %S Unknown = [Desconocido] NoClassAvailable = (sin clase) NoIdAvailable = (sin ID) DocumentTitle = Título de página NeedDocTitle = Introduzca un título para la página actual DocTitleHelp = Identifica a la página en la ventana de título y en los marcadores. ExportToText = Exportar como texto SaveDocumentAs = Guardar página como XHTMLfiles = Archivos XHTML untitled = sin título SaveDocument = Guardar página SaveFileFailed = Fallo al guardar el archivo FileNotSaved = Archivo no guardado SaveFileBeforeClosing = ¿Quiere guardar el archivo antes de cerrar esta pestaña? YesSaveFile = Sí, guardar NoDiscardChanges = No, descartar los cambios DontCloseTab = No cerrar la pestaña IdAlreadyTaken = Este ID ya está siendo utilizado en el documento RemoveIdFromElement = ¿Quiere eliminar el ID del elemento que lo tiene actualmente o cancelar la acción? YesRemoveId = Eliminar el ID NoCancel = Cancelar ReplaceAll = Reemplazar todo… ReplacedPart1 = Reemplazado ReplacedPart2 = veces AFileWasChanged=A file was changed on disk ReloadFile=File %S changed on disk, BlueGriffon must reload it DontAskForFileChangesAgain=don't show this alert again AbandonChanges = ¿Abandonar cambios no guardados a "%title%" y recargar la página? RevertCaption = Revertir a la última copia guardada HTMLCommentsInXHTMLTitle=HTML comment inside a

      ¡El texto normal se verá así!

      ¡Los enlaces visitados de esta manera!

      ¡Y los enlaces activos de esta otra!

      ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/panels.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/parsingError.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/polyglot.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/prefs/advanced.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/prefs/connection.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/prefs/deactivateLicense.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/prefs/file.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/prefs/general.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/prefs/license.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/prefs/license.properties ================================================ activateWarning=BlueGriffon needs to restart to activate your license. Do you want to restart now? confirmRestart=Restart BlueGriffon? fullResetTitle=License activation reset fullResetErrorLabel=Impossible to perform the operation, a network error occurred. fullResetRequested=A reset link was sent to the owner of the license/transaction. BlueGriffon must now restart. fullResetInvalid=The transaction ID is invalid. ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/prefs/newPage.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/prefs/osx.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.properties ================================================ NoMainWindowAvaialble=No se puede editor los atajos de teclado PleaseOpenOneMainWindow=Debe estar abierta al menoas una ventana principal de BlueGriffon para editar atajos de teclado. ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/prefs/source.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/prefs/styles.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/prefs/update.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/prefs/update.properties ================================================ SoftwareUpdates=Actualizaciones de software UnableToCheck=No se pudo compobar la disponibilidad UpToDate=BlueGriffon está actualizado ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/prefs.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/propertiesDeck.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/rotator.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/spellCheck.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/spellCheck.properties ================================================ CorrectSpelling = (corrección de ortografía) NoSuggestedWords = (no hay sugerencias) NoMisspelledWord = No hay errores CheckSpellingDone = Corrección ortográfica completada. CheckSpelling = Comprobar ortografía ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/structurebar.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/svg-edit.properties ================================================ SvgEdit=Editor SVG ConfirmClose=Hay cambios sin guardar. ¿Está seguro de querer cerrar el Editor SVG? ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/tabeditor.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/updateAvailable.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/base/locale/bluegriffon/updates.properties ================================================ update.checkInsideButton.label = Buscar actualizaciones update.checkInsideButton.accesskey = C update.resumeButton.label = Continuar descargando %S update.resumeButton.accesskey = D update.openUpdateUI.applyButton.label = Aplicar actualización… update.openUpdateUI.applyButton.accesskey = A update.restart.applyButton.label = Aplicar actualización update.restart.applyButton.accesskey = A update.openUpdateUI.upgradeButton.label = Actualizar ahora… update.openUpdateUI.upgradeButton.accesskey = U update.restart.upgradeButton.label = Actualizar ahora update.restart.upgradeButton.accesskey = U ================================================ FILE: locales/es-ES/bluegriffon/base/locale/branding/brand.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/base/locale/branding/brand.properties ================================================ brandShortName = BlueGriffon brandFullName = BlueGriffon vendorShortName = Disruptive Innovations sidebarName = Barra lateral ================================================ FILE: locales/es-ES/bluegriffon/extensions/fs/addFont.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/extensions/fs/fs.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/extensions/fs/fs.properties ================================================ SelectDir = Seleccione un directorio para descomprimir el paquete de fuente SelectFile = Seleccione una hoja de estilos del paquete de fuente ya existente Stylesheet = Una hoja de estilos de un paquete FontSquirrel MustBeSavedTitle = El documento no se ha guardado nunca MustBeSavedMessage = Debe guardar el archivo al menos una vez antes de intentar enlazarlo con una fuente local utilizando una URL relativa. Cierre el documento y vuelva a abrirlo después de haberlo guardado. ================================================ FILE: locales/es-ES/bluegriffon/extensions/fs/fsOverlay.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/extensions/gfd/addFont.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/extensions/gfd/gfd.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/extensions/gfd/gfdOverlay.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/extensions/markdown/markdown.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/extensions/markdown/markdownOverlay.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/extensions/op1/a11yFirstStep.properties ================================================ ConformingDTDSyntax=Use a W3C-conforming DTD syntax before the html element NoWrongSyntaxOrNonConformingHierarchy=Don't use wrong attribute syntax or non-conforming element hierarchy inside the html element OneTitleInHead=Use a title element as a child of the head element NoEmptyTitle=When you provide a title element, do not leave it empty NoMetaRefresh=Don't use a meta element with an http-equiv attribute and a value equal to refresh HTMLElementHasLangAttribute=Use the lang attribute for the html element HTMLElementHasValidLangAttribute=Use a valid language code for the lang attribute NoInvalidDir=Don't use a value other than ltr, rtl or empty for the dir attribute TitleForFrames=Use the title attribute for every frame element NoEmptyTitleForFrames=When you provide a title attribute for a frame element, do not leave it empty TitleForIFrames=Use the title attribute for every iframe element NoEmptyTitleForIFrames=When you provide a title attribute for an iframe element, do not leave it empty AtLeastOneH1InBody=There must be at least one h1 element inside (at any level) the body element NoEmptyH1=When you provide a h1 element, do not leave it empty NoEmptyH2=When you provide a h2 element, do not leave it empty NoEmptyH3=When you provide a h3 element, do not leave it empty NoEmptyH4=When you provide a h4 element, do not leave it empty NoEmptyH5=When you provide a h5 element, do not leave it empty NoEmptyH6=When you provide a h6 element, do not leave it empty H2Order=Use  a h1, h2, h3, h4, h5 or h6 element as a first heading before a h2 element in the source order H3Order=Use a h2, h3, h4, h5 or h6 element as a first heading before a h3 element in the source order H4Order=Use a h3, h4, h5 or h6 element as a first heading before a h4 element in the source order H5Order=Use a h4, h5 or h6 element as a first heading before a h5 element in the source order H6Order=Use a h5 or h6 element as a first heading before a h6 element in the source order DTAsFirstChildOfDL=Use a dt element as the first child of a dl element NoEmptyLI=When you provide a li element, do not leave it empty NoAlignAttribute=Don't use the align attribute NoXmpElement=Don't use the xmp element NoEmptyP=When you provide a p element, do not leave it empty NoEmptyAExceptAnchors=When you provide an a element, do not leave it empty except if it is used as an anchor NoEmptyButton=When you provide a button element, do not leave it empty NoVlinkAttribute=Don't use the vlink attribute NoTextAttribute=Don't use the text attribute NoLinkAttribute=Don't use the link attribute noImgWithoutAlt=Use the alt attribute for every img element noAreaWithoutAlt=Use the alt attribute for every area element noAppletWithoutAlt=Use the alt attribute for every applet element noImageInputWithoutAlt=Use the alt attribute for every input type=image element noEmptyAltForImageLoneChildOfAnchorOrButton=If the img element is the only child of a button or an a element, do not leave its alt attribute empty noEmptyAltForInputImage=When you provide an alt attribute for an input type=image element, do not leave it empty noEmptyAltForAreaWithHref=When you provide an alt attribute for an area element holding an href attribute, do not leave it empty noAltSimilarToTextContent=If an img element is a child of an a element with text, do not use the same text for its alt attribute as the text inside the a element noBorderAttribute=Don't use the border attribute noSimilarAltForAreasWithDifferentHref=Don't use the same value for alt attributes for multiple area elements with different href values LongdescIsURI=Use a URI as the value for a longdesc attribute noBackgroundAttribute=Don't use the background attribute noBgsoundElement=Don't use the bgsound element TablesWithAtLeastOneTHHaveACaption=Use a caption element as the first child of a table element containing at least one th element CaptionIsDifferentFromSummaryAttribute=Don't use the same content for a caption element and a summary attribute noEmptyCaption=When you provide a caption element, do not leave it empty noCaptionInATableWithOnlyTDs=Don't use a caption element in a table element containing only td elements noAlinkAttribute=Don't use an alink attribute noSummaryAttributeSimilarToCaption=Don't use the same content for a summary attribute and a caption element noEmptySummaryIfTableHasTHOrCaption=When you provide a summary attribute for a table element containing a th or a caption element, do not leave it empty noSummaryAttributeIfOnlyTDs=Don't use a summary attribute on a table element containg only td elements noStrikeElement=Don't use the strike element noListingElement=Don't use the listing element AtLeastOneTHIfCaptionOrSummary=Use at least one th element inside a table element with a caption element or a non-empty summary attribute AllNonEmptyTHHaveScopeOrId=Use a scope or id attribute for every non-empty th element ScopeAttributeIsRowOrCol=Don't use a value other than row or col for the scope attribute noBgcolorAttribute=Don't use the bgcolor attribute noTTElement=Don't use the tt element TDHaveHeadersAttributeIfTHHasId=Use a headers attribute on every td element if the corresponding th element has an id attribute noPlaintextElement=Don't use the plaintext element noHeadersAttributeThatIsNotATHId=Don't use for a headers attribute a value which matches an id attribute used for a td of the table element AllFormsHaveAButton=Use a button, or an input of type submit, image or button inside a form element SubmitButtonsHaveNonEmptyValue=When you provide an input type=submit, do not leave its value attribute empty noMarqueeElement=Don't use the marquee element FieldsetHasALegend=Use a legend element as a child of every fieldset element FieldsetsAreInForms=Don't use a fieldset element without a form element noEmptyLegendElement=When you provide a legend element, do not leave it empty LabelElementHasForAttribute=Use the for attribute for every label element noEmptyForAttributeOnLabel=When you provide a for attribute for a label element, do not leave it empty ForAttributeMatchesAnIdInSameForm=A for attribute must have a value that matches an id attribute inside the form element OptgroupElementHasALabel=Use the label attribute for every optgroup element NoSimilarLabelInOptgroupsOfSameSelect=Don't use the same label attribute for different optgroup elements of the same select element noEmptyLabelAttributeOnOptgroup=When you provide a label attribute for an optgroup element, do not leave it empty noBasefontElement=Don't use the basefont element noBlinkElement=Don't use the blink element noCenterElement=Don't use the center element noFontElement=Don't use the font element ================================================ FILE: locales/es-ES/bluegriffon/extensions/op1/op1.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/extensions/op1/op1Overlay.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/extensions/tipoftheday/tipoftheday.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/extensions/tipoftheday/tipoftheday.rdf ================================================ %brandDTD; ]> &brandShortName; tips http://bluegriffon.org/ &brandShortName; tip of the day Archive en-us …&brandShortName; is cross platform? …&brandShortName; exists on a wide variety of operating systems including Windows, Mac OS X, and many flavors of Linux, OS/2 … …&brandShortName; shows the title of any unsaved page with a red shadow? You can now save files from any viewing mode. …you have direct access to the &brandShortName; community? Just select “Help > User’s Community”. …you can insert HTML5 elements easily? Just select “Insert > HTML5 Element”. …you can close the current tab with one key? Control+w (Command +w on Mac OS X) will close the current tab. …you can create a new tab with a key combination? Control+n (Command +n on Mac OS X) will create a new blank tab using the same doctype as the last page created. …you can revert to a previously saved version of the currently edited document? Righ-click (context-click on Mac OS X) on the document's tab and select the Revert menu. …you can publish pages directly from &brandShortName; First install the free FireFTP add-on and set it up. It will then be available on the Tools menu. …&brandShortName; can insert any character easily? Use “Insert characters and symbols”. You can then search for any Unicode character by name or open a block for inspection. …&brandShortName; runs spellcheck by default? Right click a word to find suggestions. Switch checking on or off using “Tools > Preferences > General” . …&brandShortName; can reliably select an element? Simply click its name in the structure bar. …you can move an element in your document using the mouse? First select as in previous tip then just drag it to where needed. …you can quickly open existing pages? The paid for Project manager add-on permits instant access to pages and images which are organised as a project. …you can choose your default browser? Use “Tools > Preferences > Advanced > Reset external browser settings”. Next time you browse you can choose a browser. …&brandShortName; allows you to use external stylesheets? To create one ready for use click “Panels > Stylesheets”. Click the plus sign and select “Linked to the document”. …&brandShortName; can manage stylesheets and complex selectors? Using the CSS Pro Editor (a paid for add-on) you change the order of and add titles and rel attribute to stylesheets and develop complex CSS 2 and 3 selectors with advanced help. …panels can be resized? Drag the grab handle at the bottom right corner to the size needed. …attributes can be added to any element? Open “Panels > DOM Explorer”. In wysiwyg view click in the element, select use the Attributes tab and click the plus sign. …&brandShortName; can handle CSS3 properties? Vendor prefixes will be added for browsers that need them. …you can personalize keyboard shortcuts? Any menu item can be allocated to your preferred key. Open “Tools > Preferences > Keyboard Shortcuts”. Find and double-click the command wanted. In the new window key a shortcut. …you can remove a class from an element? Just select the element and in the Class drop down box re-apply the class. ================================================ FILE: locales/es-ES/bluegriffon/extensions/tipoftheday/tipofthedayOverlay.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/sidebars/aria/aria.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/sidebars/aria/aria.properties ================================================ mustBeContainedIn=must be contained in or= or ok=OK mustContain=must contain and= and deprecated=deprecated missingTextbox=missing textbox missingListboxTreeGridDialog=missing listbox, tree, grid or dialog ================================================ FILE: locales/es-ES/bluegriffon/sidebars/aria/ariaOverlay.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/sidebars/cssproperties/backgrounditem.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/sidebars/cssproperties/backgrounditem.properties ================================================ backgroundColorTitle = Color backgroundImageTitle = Imagen backgroundLinearGradientTitle = Degradado lineal backgroundRadialGradientTitle = Degradado radial ================================================ FILE: locales/es-ES/bluegriffon/sidebars/cssproperties/colorstopitem.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/sidebars/cssproperties/cssproperties.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/sidebars/cssproperties/cssproperties.properties ================================================ EnterAnId = Introduzca un ID EnterUniqueId = Debe indicar un ID único para el elemento: NoClasSelected = Debe seleccionar un nombre de clase PleaseSelectAClass = Se debe seleccionar una clase para aplicar los cambios indicados ================================================ FILE: locales/es-ES/bluegriffon/sidebars/cssproperties/csspropertiesOverlay.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/sidebars/cssproperties/editGridTemplate.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/sidebars/cssproperties/fontFeatures.properties ================================================ FFaalt=Access all alternates FFcalt=Contextual alternates FFsalt=Stylistic alternates FFliga=Standard ligatures FFclig=Contextual ligatures FFdlig=Discretionary ligatures FFhist=Historical forms FFhlig=Historical ligatures FFunic=Unicase FFsmcp=Small capitals FFc2sc=Small capitals from capitals FFc2pc=Petite capitals from capitals FFpcap=Petite capitals FFcase=Case sensitive forms FFcpsp=Capital spacing FFtitl=Titling FFswsh=Swash FFcswh=Contextual swash FFfrac=Fractions FFafrc=Alternative fractions FFordn=Ordinals FFnumr=Numerators FFdnom=Denominators FFsinf=Scientific inferiors FFsups=Superscript FFsubs=Subscript FFonum=Oldstyle figures FFlnum=Lining Figures FFpnum=Proportional figures FFtnum=Tabular figures FFzero=Slashed zero FFmgrk=Mathematical greek FFnalt=Alternate annotation forms FFornm=Ornaments FFlocl=Localized forms FFsize=Optical size FFisol=Isolated forms FFinit=Initial forms FFmedi=Medial forms FFfinal=Final forms FFrlig=Requird ligatures FFccmp=Glyph composition/decomposition FFmark=Mark to base positioning FFmkmj=Mark to mark positioning FFhwid=Half widths ================================================ FILE: locales/es-ES/bluegriffon/sidebars/cssproperties/griditemposition.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/sidebars/cssproperties/textshadowitem.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/sidebars/cssproperties/transformationitem.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/sidebars/cssproperties/transitionitem.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/sidebars/domexplorer/domexplorer.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/sidebars/domexplorer/domexplorerOverlay.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/sidebars/its20/its20.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/sidebars/its20/its20.properties ================================================ LoadError=Load Error InlineParseError=Inline resource is not an ITS 2.0 document CannotFetch=Cannot fetch URL NotITS=Resource is not an ITS 2.0 document TranslatableByGlobalRule=Translatable by global rule NotTranslatableByGlobalRule=Not translatable by global rule InlineRules=Inline rules translateRule=Translate locNoteRule=Localization Note termRule=Terminology dirRule=Directionality langRule=Language Information withinTextRule=Elements Within Text domainRule=Domain textAnalysisRule=Text Analysis localeFilterRule=Locale Filter provRule=Provenance externalResourceRefRule=External Resource targetPointerRule=Target Pointer idValueRule=Id Value preserveSpaceRule=Preserve Space locQualityIssueRule=Localization Quality Issue mtConfidenceRule=Machine-Translation Confidence allowedCharactersRule=Allowed Characters storageSizeRule=Storage Size DontWarnAgainForUrl=Don't warn me again about this URL DontWarnAgainForInline=Don't warn me again about inline global rules NewITSFile=New ITS 2.0 File CannotResolveXPath=Cannot resolve the following XPath selector (undeclared HTML namespace?): XPathParsingError=XPath Parsing Error DontWarnAgainForSelector=Don't warn me again about this selector CSSParsingError=CSS Parsing Error CannotResolveCSS=Cannot resolve the following CSS selector: ================================================ FILE: locales/es-ES/bluegriffon/sidebars/its20/its20Overlay.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/sidebars/its20/locNoteRule.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/sidebars/its20/selector.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/sidebars/its20/termRule.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/sidebars/its20/translateRule.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/sidebars/scripteditor/editor.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/sidebars/scripteditor/scripteditor.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/sidebars/scripteditor/scripteditor.properties ================================================ ConfirmDeletionTitle=Eliminar un script ConfirmDeletion=¿Está seguro de querer eliminar este script? AddExternalScriptTitle=Añadir script externo PromptScriptURL=¿URL del script? ================================================ FILE: locales/es-ES/bluegriffon/sidebars/scripteditor/scripteditorOverlay.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/sidebars/stylesheets/editor.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/sidebars/stylesheets/stylesheets.dtd ================================================ ================================================ FILE: locales/es-ES/bluegriffon/sidebars/stylesheets/stylesheetsOverlay.dtd ================================================ ================================================ FILE: locales/es-ES/cssproperties.mn ================================================ bluegriffon-es-ES.jar: % locale cssproperties es-ES %locale/es-ES/cssproperties/ locale/es-ES/cssproperties/csspropertiesOverlay.dtd (locale/es-ES/csspropertiesOverlay.dtd) locale/es-ES/cssproperties/cssproperties.dtd (locale/es-ES/cssproperties.dtd) locale/es-ES/cssproperties/editGridTemplate.dtd (locale/es-ES/editGridTemplate.dtd) locale/es-ES/cssproperties/backgrounditem.dtd (locale/es-ES/backgrounditem.dtd) locale/es-ES/cssproperties/griditemposition.dtd (locale/es-ES/griditemposition.dtd) locale/es-ES/cssproperties/transformationitem.dtd (locale/es-ES/transformationitem.dtd) locale/es-ES/cssproperties/transitionitem.dtd (locale/es-ES/transitionitem.dtd) locale/es-ES/cssproperties/textshadowitem.dtd (locale/es-ES/textshadowitem.dtd) locale/es-ES/cssproperties/colorstopitem.dtd (locale/es-ES/colorstopitem.dtd) locale/es-ES/cssproperties/backgrounditem.properties (locale/es-ES/backgrounditem.properties) locale/es-ES/cssproperties/cssproperties.properties (locale/es-ES/cssproperties.properties) locale/es-ES/cssproperties/fontFeatures.properties (locale/es-ES/fontFeatures.properties) ================================================ FILE: locales/es-ES/domexplorer.mn ================================================ bluegriffon-es-ES.jar: % locale domexplorer es-ES %locale/es-ES/domexplorer/ locale/es-ES/domexplorer/domexplorerOverlay.dtd (locale/es-ES/domexplorerOverlay.dtd) locale/es-ES/domexplorer/domexplorer.dtd (locale/es-ES/domexplorer.dtd) ================================================ FILE: locales/es-ES/fs.mn ================================================ fs-es-ES.jar: % locale fs es-ES %locale/es-ES/fs/ locale/es-ES/fs/fsOverlay.dtd (locale/es-ES/fsOverlay.dtd) locale/es-ES/fs/fs.dtd (locale/es-ES/fs.dtd) locale/es-ES/fs/fs.properties (locale/es-ES/fs.properties) locale/es-ES/fs/addFont.dtd (locale/es-ES/addFont.dtd) ================================================ FILE: locales/es-ES/gfd.mn ================================================ gfd-es-ES.jar: % locale gfd es-ES %locale/es-ES/gfd/ locale/es-ES/gfd/gfdOverlay.dtd (locale/es-ES/gfdOverlay.dtd) locale/es-ES/gfd/gfd.dtd (locale/es-ES/gfd.dtd) locale/es-ES/gfd/addFont.dtd (locale/es-ES/addFont.dtd) ================================================ FILE: locales/es-ES/its20.mn ================================================ bluegriffon-es-ES.jar: % locale its20 es-ES %locale/es-ES/its20/ locale/es-ES/its20/its20Overlay.dtd (locale/es-ES/its20Overlay.dtd) locale/es-ES/its20/its20.properties (locale/es-ES/its20.properties) locale/es-ES/its20/its20.dtd (locale/es-ES/its20.dtd) locale/es-ES/its20/translateRule.dtd (locale/es-ES/translateRule.dtd) locale/es-ES/its20/locNoteRule.dtd (locale/es-ES/locNoteRule.dtd) locale/es-ES/its20/termRule.dtd (locale/es-ES/termRule.dtd) locale/es-ES/its20/selector.dtd (locale/es-ES/selector.dtd) ================================================ FILE: locales/es-ES/markdown.mn ================================================ markdown-es-ES.jar: % locale markdown es-ES %locale/es-ES/markdown/ locale/es-ES/markdown/markdownOverlay.dtd (locale/es-ES/markdownOverlay.dtd) locale/es-ES/markdown/markdown.dtd (locale/es-ES/markdown.dtd) ================================================ FILE: locales/es-ES/op1.mn ================================================ op1-es-ES.jar: % locale op1 es-ES %locale/es-ES/op1/ locale/es-ES/op1/op1Overlay.dtd (locale/es-ES/op1Overlay.dtd) locale/es-ES/op1/op1.dtd (locale/es-ES/op1.dtd) locale/es-ES/op1/a11yFirstStep.properties (locale/es-ES/a11yFirstStep.properties) ================================================ FILE: locales/es-ES/scripteditor.mn ================================================ bluegriffon-es-ES.jar: % locale scripteditor es-ES %locale/es-ES/scripteditor/ locale/es-ES/scripteditor/scripteditorOverlay.dtd (locale/es-ES/scripteditorOverlay.dtd) locale/es-ES/scripteditor/scripteditor.dtd (locale/es-ES/scripteditor.dtd) locale/es-ES/scripteditor/scripteditor.properties (locale/es-ES/scripteditor.properties) locale/es-ES/scripteditor/editor.dtd (locale/es-ES/editor.dtd) ================================================ FILE: locales/es-ES/stylesheets.mn ================================================ bluegriffon-es-ES.jar: % locale stylesheets es-ES %locale/es-ES/stylesheets/ locale/es-ES/stylesheets/stylesheetsOverlay.dtd (locale/es-ES/stylesheetsOverlay.dtd) locale/es-ES/stylesheets/stylesheets.dtd (locale/es-ES/stylesheets.dtd) locale/es-ES/stylesheets/editor.dtd (locale/es-ES/editor.dtd) ================================================ FILE: locales/es-ES/tipoftheday.mn ================================================ tipoftheday-es-ES.jar: % locale tipoftheday es-ES %locale/es-ES/tipoftheday/ locale/es-ES/tipoftheday/tipoftheday.dtd (locale/es-ES/tipoftheday.dtd) locale/es-ES/tipoftheday/tipofthedayOverlay.dtd (locale/es-ES/tipofthedayOverlay.dtd) locale/es-ES/tipoftheday/tipoftheday.rdf (locale/es-ES/tipoftheday.rdf) ================================================ FILE: locales/fi/aria.mn ================================================ bluegriffon-fi.jar: % locale aria fi %locale/fi/aria/ locale/fi/aria/ariaOverlay.dtd (locale/fi/ariaOverlay.dtd) locale/fi/aria/aria.dtd (locale/fi/aria.dtd) locale/fi/aria/aria.properties (locale/fi/aria.properties) ================================================ FILE: locales/fi/base.mn ================================================ bluegriffon-fi.jar: % locale bluegriffon fi %locale/fi/bluegriffon/ % locale branding fi %locale/fi/branding/ locale/fi/bluegriffon/aboutDialog.dtd (locale/fi/bluegriffon/aboutDialog.dtd) locale/fi/bluegriffon/bluegriffon.dtd (locale/fi/bluegriffon/bluegriffon.dtd) locale/fi/bluegriffon/polyglot.dtd (locale/fi/bluegriffon/polyglot.dtd) locale/fi/bluegriffon/findbar.dtd (locale/fi/bluegriffon/findbar.dtd) locale/fi/bluegriffon/bluegriffon.properties (locale/fi/bluegriffon/bluegriffon.properties) locale/fi/bluegriffon/colourPicker.dtd (locale/fi/bluegriffon/colourPicker.dtd) locale/fi/bluegriffon/credits.dtd (locale/fi/bluegriffon/credits.dtd) locale/fi/bluegriffon/filepickerbutton.dtd (locale/fi/bluegriffon/filepickerbutton.dtd) locale/fi/bluegriffon/filePicking.dtd (locale/fi/bluegriffon/filePicking.dtd) locale/fi/bluegriffon/insertTable.dtd (locale/fi/bluegriffon/insertTable.dtd) locale/fi/bluegriffon/insertTable.properties (locale/fi/bluegriffon/insertTable.properties) locale/fi/bluegriffon/language.properties (locale/fi/bluegriffon/language.properties) locale/fi/bluegriffon/languages.dtd (locale/fi/bluegriffon/languages.dtd) locale/fi/bluegriffon/markupCleaner.dtd (locale/fi/bluegriffon/markupCleaner.dtd) locale/fi/bluegriffon/openLocation.dtd (locale/fi/bluegriffon/openLocation.dtd) locale/fi/bluegriffon/openLocation.properties (locale/fi/bluegriffon/openLocation.properties) locale/fi/bluegriffon/newPageWizard.dtd (locale/fi/bluegriffon/newPageWizard.dtd) locale/fi/bluegriffon/newPageWizard.properties (locale/fi/bluegriffon/newPageWizard.properties) locale/fi/bluegriffon/propertiesDeck.dtd (locale/fi/bluegriffon/propertiesDeck.dtd) locale/fi/bluegriffon/aria.dtd (locale/fi/bluegriffon/aria.dtd) locale/fi/bluegriffon/structurebar.dtd (locale/fi/bluegriffon/structurebar.dtd) locale/fi/bluegriffon/tabeditor.dtd (locale/fi/bluegriffon/tabeditor.dtd) locale/fi/bluegriffon/masterPasswordQuery.properties (locale/fi/bluegriffon/masterPasswordQuery.properties) locale/fi/bluegriffon/newDocument.dtd (locale/fi/bluegriffon/newDocument.dtd) locale/fi/bluegriffon/prefs/file.dtd (locale/fi/bluegriffon/prefs/file.dtd) locale/fi/bluegriffon/prefs/source.dtd (locale/fi/bluegriffon/prefs/source.dtd) locale/fi/bluegriffon/prefs/general.dtd (locale/fi/bluegriffon/prefs/general.dtd) locale/fi/bluegriffon/prefs/newPage.dtd (locale/fi/bluegriffon/prefs/newPage.dtd) locale/fi/bluegriffon/prefs/update.dtd (locale/fi/bluegriffon/prefs/update.dtd) locale/fi/bluegriffon/prefs/styles.dtd (locale/fi/bluegriffon/prefs/styles.dtd) locale/fi/bluegriffon/prefs/advanced.dtd (locale/fi/bluegriffon/prefs/advanced.dtd) locale/fi/bluegriffon/prefs/connection.dtd (locale/fi/bluegriffon/prefs/connection.dtd) locale/fi/bluegriffon/prefs/osx.dtd (locale/fi/bluegriffon/prefs/osx.dtd) locale/fi/bluegriffon/prefs/shortcuts.dtd (locale/fi/bluegriffon/prefs/shortcuts.dtd) locale/fi/bluegriffon/prefs/update.properties (locale/fi/bluegriffon/prefs/update.properties) locale/fi/bluegriffon/prefs/license.dtd (locale/fi/bluegriffon/prefs/license.dtd) locale/fi/bluegriffon/prefs/license.properties (locale/fi/bluegriffon/prefs/license.properties) locale/fi/bluegriffon/prefs/deactivateLicense.dtd (locale/fi/bluegriffon/prefs/deactivateLicense.dtd) locale/fi/bluegriffon/prefs.dtd (locale/fi/bluegriffon/prefs.dtd) locale/fi/bluegriffon/updateAvailable.dtd (locale/fi/bluegriffon/updateAvailable.dtd) locale/fi/bluegriffon/updates.properties (locale/fi/bluegriffon/updates.properties) locale/fi/branding/brand.dtd (locale/fi/branding/brand.dtd) locale/fi/branding/brand.properties (locale/fi/branding/brand.properties) locale/fi/bluegriffon/insertImage.dtd (locale/fi/bluegriffon/insertImage.dtd) locale/fi/bluegriffon/insertAnchor.dtd (locale/fi/bluegriffon/insertAnchor.dtd) locale/fi/bluegriffon/insertCommentOrPI.dtd (locale/fi/bluegriffon/insertCommentOrPI.dtd) locale/fi/bluegriffon/insertLink.dtd (locale/fi/bluegriffon/insertLink.dtd) locale/fi/bluegriffon/insertLink.properties (locale/fi/bluegriffon/insertLink.properties) locale/fi/bluegriffon/cssClassPicker.dtd (locale/fi/bluegriffon/cssClassPicker.dtd) locale/fi/bluegriffon/insertVideo.dtd (locale/fi/bluegriffon/insertVideo.dtd) locale/fi/bluegriffon/insertAudio.dtd (locale/fi/bluegriffon/insertAudio.dtd) locale/fi/bluegriffon/insertVideo.properties (locale/fi/bluegriffon/insertVideo.properties) locale/fi/bluegriffon/insertHTML.dtd (locale/fi/bluegriffon/insertHTML.dtd) locale/fi/bluegriffon/insertHR.dtd (locale/fi/bluegriffon/insertHR.dtd) locale/fi/bluegriffon/insertForm.dtd (locale/fi/bluegriffon/insertForm.dtd) locale/fi/bluegriffon/parsingError.dtd (locale/fi/bluegriffon/parsingError.dtd) locale/fi/bluegriffon/insertFormInput.dtd (locale/fi/bluegriffon/insertFormInput.dtd) locale/fi/bluegriffon/insertFieldset.dtd (locale/fi/bluegriffon/insertFieldset.dtd) locale/fi/bluegriffon/insertLabel.dtd (locale/fi/bluegriffon/insertLabel.dtd) locale/fi/bluegriffon/insertButton.dtd (locale/fi/bluegriffon/insertButton.dtd) locale/fi/bluegriffon/insertSelect.dtd (locale/fi/bluegriffon/insertSelect.dtd) locale/fi/bluegriffon/insertTextarea.dtd (locale/fi/bluegriffon/insertTextarea.dtd) locale/fi/bluegriffon/insertKeygen.dtd (locale/fi/bluegriffon/insertKeygen.dtd) locale/fi/bluegriffon/insertOutput.dtd (locale/fi/bluegriffon/insertOutput.dtd) locale/fi/bluegriffon/insertProgress.dtd (locale/fi/bluegriffon/insertProgress.dtd) locale/fi/bluegriffon/insertMeter.dtd (locale/fi/bluegriffon/insertMeter.dtd) locale/fi/bluegriffon/insertStylesheet.dtd (locale/fi/bluegriffon/insertStylesheet.dtd) locale/fi/bluegriffon/editStylesheet.dtd (locale/fi/bluegriffon/editStylesheet.dtd) locale/fi/bluegriffon/media.dtd (locale/fi/bluegriffon/media.dtd) locale/fi/bluegriffon/media.properties (locale/fi/bluegriffon/media.properties) locale/fi/bluegriffon/insertChars.dtd (locale/fi/bluegriffon/insertChars.dtd) locale/fi/bluegriffon/convertToTable.dtd (locale/fi/bluegriffon/convertToTable.dtd) locale/fi/bluegriffon/pageProperties.dtd (locale/fi/bluegriffon/pageProperties.dtd) locale/fi/bluegriffon/spellCheck.dtd (locale/fi/bluegriffon/spellCheck.dtd) locale/fi/bluegriffon/spellCheck.properties (locale/fi/bluegriffon/spellCheck.properties) locale/fi/bluegriffon/dictionary.dtd (locale/fi/bluegriffon/dictionary.dtd) locale/fi/bluegriffon/html5.properties (locale/fi/bluegriffon/html5.properties) locale/fi/bluegriffon/listProperties.dtd (locale/fi/bluegriffon/listProperties.dtd) locale/fi/bluegriffon/insertTOC.dtd (locale/fi/bluegriffon/insertTOC.dtd) locale/fi/bluegriffon/svg-edit.properties (locale/fi/bluegriffon/svg-edit.properties) locale/fi/bluegriffon/panels.dtd (locale/fi/bluegriffon/panels.dtd) locale/fi/bluegriffon/rotator.dtd (locale/fi/bluegriffon/rotator.dtd) ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/aboutDialog.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/aria.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/bluegriffon.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/bluegriffon.properties ================================================ titleModifier=BlueGriffon # in the following string, %t represents the title of the page or its URL # and %b the titleModifier above titleFormat=%S - %S Unknown=[Tuntematon] NoClassAvailable=(ei luokkaa) NoIdAvailable=(ei ID:tä) DocumentTitle=Sivun otsiko NeedDocTitle=Kirjoita nykyiselle sivulle otsikko. DocTitleHelp=Tämä identifioi sivun ikkunan otsikossa ja kirjanmerkeissä. ExportToText=Vie tekstimuotoon SaveDocumentAs=Tallenna sivu nimellä XHTMLfiles=XHTML-tiedostot untitled=nimetön SaveDocument=Tallenna sivu SaveFileFailed=Tiedoston tallennus ei onnistunut! ExportToText=Vie tekstimuotoon FileNotSaved=Tiedostoa ei ole tallennettu! SaveFileBeforeClosing=Haluatko tallentaa tiedoston ennen välilehden sulkemista? YesSaveFile=Kyllä, tallenna se NoDiscardChanges=Ei, hylkää muutokset DontCloseTab=Älä sulje välilehteä! IdAlreadyTaken=Tämä ID on jo käytössä asiakirjassa RemoveIdFromElement=Haluatko poistaa ID:n elementistä, jossa se on käytössä, vai peruuttaa toiminnon? YesRemoveId=Poista ID NoCancel=Peruuta ReplaceAll=Korvaa kaikki... ReplacedPart1= ReplacedPart2=osumaa korvattu AFileWasChanged=Tiedosto on muuttunut levyllä ReloadFile=Tiedosto %S on muuttunut levyllä, BlueGriffonin täytyy ladata se uudelleen DontAskForFileChangesAgain=älä näytä tätä huomautusta uudelleen AbandonChanges=Haluatko varmasti hyl\u00E4t\u00E4 sivun "%title%" tallentamattomat muutokset ja ladata sivun uudelleen? RevertCaption=Palauta viimeksi tallennettuun HTMLCommentsInXHTMLTitle=HTML-kommentti

      Tavallinen teksti näyttää tällaiselta !

      Avatut linkit näyttävät tällaiselta !

      Aktiiviset linkit näyttävät tällaiselta !

      Tavallinen teksti näyttää tällaiselta !

      Avatut linkit näyttävät tällaiselta !

      Aktiiviset linkit näyttävät tällaiselta !

      ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/panels.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/parsingError.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/polyglot.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/prefs/advanced.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/prefs/connection.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/prefs/deactivateLicense.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/prefs/file.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/prefs/general.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/prefs/license.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/prefs/license.properties ================================================ activateWarning=BlueGriffon needs to restart to activate your license. Do you want to restart now? confirmRestart=Restart BlueGriffon? fullResetTitle=License activation reset fullResetErrorLabel=Impossible to perform the operation, a network error occurred. fullResetRequested=A reset link was sent to the owner of the license/transaction. BlueGriffon must now restart. fullResetInvalid=The transaction ID is invalid. ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/prefs/newPage.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/prefs/osx.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.properties ================================================ NoMainWindowAvaialble=Näppäimistöoikoteitä ei voitu muokata PleaseOpenOneMainWindow=Vähintään yhden BlueGriffon-pääikkunan täytyy olla auki, jotta näppäinoikoteiden muokkaaminen olisi mahdollista. ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/prefs/source.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/prefs/styles.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/prefs/update.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/prefs/update.properties ================================================ SoftwareUpdates=Ohjelmistopäivitykset UnableToCheck=Päivityksiä ei voitu tarkistaa UpToDate=BlueGriffon on ajan tasalla ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/prefs.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/propertiesDeck.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/rotator.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/spellCheck.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/spellCheck.properties ================================================ CorrectSpelling=(oikea kirjoitusasu) NoSuggestedWords=(ei ehdotuksia) NoMisspelledWord=Ei väärinkirjoitettuja sanoja CheckSpellingDone=Oikoluku valmis. CheckSpelling=Oikolue ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/structurebar.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/svg-edit.properties ================================================ SvgEdit=SVG-muokkain ConfirmClose=Tiedostossa on tallentamattomia muutoksia. Haluatko varmasti sulkea SVG-muokkaimen? ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/tabeditor.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/updateAvailable.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/base/locale/bluegriffon/updates.properties ================================================ update.checkInsideButton.label=Hae päivityksiä update.checkInsideButton.accesskey=H update.resumeButton.label=Jatka %Sin lataamista… update.resumeButton.accesskey=J update.openUpdateUI.applyButton.label=Asenna päivitys… update.openUpdateUI.applyButton.accesskey=A update.restart.applyButton.label=Asenna päivitys update.restart.applyButton.accesskey=A update.openUpdateUI.upgradeButton.label=Päivitä heti… update.openUpdateUI.upgradeButton.accesskey=P update.restart.upgradeButton.label=Päivitä heti update.restart.upgradeButton.accesskey=P ================================================ FILE: locales/fi/bluegriffon/base/locale/branding/brand.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/base/locale/branding/brand.properties ================================================ brandShortName=BlueGriffon brandFullName=BlueGriffon vendorShortName=Disruptive Innovations sidebarName=Sivupaneeli ================================================ FILE: locales/fi/bluegriffon/extensions/fs/addFont.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/extensions/fs/fs.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/extensions/fs/fs.properties ================================================ SelectDir=Valitse hakemisto, johon kirjasinlajipakkaus puretaan SelectFile=Valitse olemassaolevan kirjasinlajipakkauksen stylesheet.css Stylesheet=FontSquirrel-pakkauksen tyyliarkki MustBeSavedTitle=Asiakirjaa ei ole vielä tallennettu MustBeSavedMessage=Sinun tulee tallentaa tiedosto ennen kuin voit linkittää paikallisen kirjasinlajin käyttäen suhteellista URL:ää. Tallenna tiedosto ja avaa se uudelleen. ================================================ FILE: locales/fi/bluegriffon/extensions/fs/fsOverlay.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/extensions/gfd/addFont.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/extensions/gfd/gfd.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/extensions/gfd/gfdOverlay.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/extensions/markdown/markdown.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/extensions/markdown/markdownOverlay.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/extensions/op1/a11yFirstStep.properties ================================================ ConformingDTDSyntax=Käytä W3C:n määräysten mukaista dtd-syntaksia ennen html-elementtiä NoWrongSyntaxOrNonConformingHierarchy=Älä käytä väärää attribuuttisyntaksia tai määräysten vastaista elementtihierarkiaa html-elementin sisällä OneTitleInHead=Käytä title-elementtiä head-elementin lapsena NoEmptyTitle=Älä jätä title-elementtiä tyhjäksi, jos määrität sellaisen NoMetaRefresh=Älä käytä meta-elementtiä, jolla on http-equiv -attribuutti ja jonka arvo on 'refresh' HTMLElementHasLangAttribute=Käytä lang-attribuuttia html-elementissä HTMLElementHasValidLangAttribute=Käytä lang-attribuutissa sallittua kielikoodia NoInvalidDir=Älä käytä dir-attribuutin arvona muuta kuin tyhjä, 'ltr' tai 'rtl' TitleForFrames=Käytä title-attribuuttia jokaisessa frame-elementissä NoEmptyTitleForFrames=Älä jätä frame-elementin title-attribuuttia tyhjäksi, jos määrität sellaisen TitleForIFrames=Käytä title-attribuuttia jokaisessa iframe-elementissä NoEmptyTitleForIFrames=Älä jätä iframe-elementin title-attribuuttia tyhjäksi, jos määrität sellaisen AtLeastOneH1InBody=Body-elementin täytyy sisältää vähintään yksi h1-elementti (millä tahansa tasolla) NoEmptyH1=Älä jätä h1-elementtiä tyhjäksi, jos määrität sellaisen NoEmptyH2=Älä jätä h2-elementtiä tyhjäksi, jos määrität sellaisen NoEmptyH3=Älä jätä h3-elementtiä tyhjäksi, jos määrität sellaisen NoEmptyH4=Älä jätä h4-elementtiä tyhjäksi, jos määrität sellaisen NoEmptyH5=Älä jätä h5-elementtiä tyhjäksi, jos määrität sellaisen NoEmptyH6=Älä jätä h6-elementtiä tyhjäksi, jos määrität sellaisen H2Order=Käytä  h1-, h2-, h3-, h4-, h5- tai h6-elementtiä ensimmäisenä otsikkona ennen h2-elementtiä lähdekoodijärjestyksessä H3Order=Käytä h2-, h3-, h4-, h5- tai h6-elementtiä ensimmäisenä otsikkona ennen h3-elementtiä lähdekoodijärjestyksessä H4Order=Käytä h3-, h4-, h5- tai h6-elementtiä ensimmäisenä otsikkona ennen h4-elementtiä lähdekoodijärjestyksessä H5Order=Käytä h4-, h5- tai h6-elementtiä ensimmäisenä otsikkona ennen h5-elementtiä lähdekoodijärjestyksessä H6Order=Käytä h5- tai h6-elementtiä ensimmäisenä otsikkona ennen h6-elementtiä lähdekoodijärjestyksessä DTAsFirstChildOfDL=Käytä dt-elementtiä dl-elementin ensimmäisenä lapsena NoEmptyLI=Älä jätä li-elementtiä tyhjäksi, jos määrität sellaisen NoAlignAttribute=Älä käytä align-attribuuttia NoXmpElement=Älä käytä xmp-elementtiä NoEmptyP=Älä jätä p-elementtiä tyhjäksi, jos määrität sellaisen NoEmptyAExceptAnchors=Jos määrität a-elementin, älä jätä sitä tyhjäksi, paitsi jos käytät sitä ankkurina NoEmptyButton=Älä jätä button-elementtiä tyhjäksi, jos määrität sellaisen NoVlinkAttribute=Älä käytä vlink-attribuuttia NoTextAttribute=Älä käytä text-attribuuttia NoLinkAttribute=Älä käytä link-attribuuttia noImgWithoutAlt=Määritä jokaiselle img-elementille alt-attribuutti noAreaWithoutAlt=Määritä jokaiselle area-elementille alt-attribuutti noAppletWithoutAlt=Määritä jokaiselle applet-elementille alt-attribuutti noImageInputWithoutAlt=Määritä jokaiselle input type=image -elementille alt-attribuutti noEmptyAltForImageLoneChildOfAnchorOrButton=Jos img-elementti on button- tai a-elementin ainoa lapsi, älä jätä sen alt-attribuuttia tyhjäksi noEmptyAltForInputImage=Älä jätä input type=image -elementin alt-attribuuttia tyhjäksi, jos määrität sellaisen noEmptyAltForAreaWithHref=Jos määrität alt-attribuutin sellaista area-elementtiä varten, jolla on href-attribuutti, älä jätä sitä tyhjäksi noAltSimilarToTextContent=Jos img-elementti on sellaisen a-elementin lapsi, jossa on tekstiä, älä käytä sen alt-attribuutissa samaa tekstiä kuin a-elementin sisällä noBorderAttribute=Älä käytä border-attribuuttia noSimilarAltForAreasWithDifferentHref=Älä käytä samaa arvoa alt-attribuuteissa, jotka on määritetty sellaisia area-elementtejä varten, joilla on eri href-arvot LongdescIsURI=Käytä URI:a longdesc-attribuutin arvona noBackgroundAttribute=Älä käytä background-attribuuttia noBgsoundElement=Älä käytä bgsound-elementtiä TablesWithAtLeastOneTHHaveACaption=Käytä caption-elementtiä vähintään yhden th-elementin sisältävän table-elementin ensimmäisenä lapsena CaptionIsDifferentFromSummaryAttribute=Älä käytä samaa sisältöä caption-elementissä ja summary-attribuutissa noEmptyCaption=Älä jätä caption-elementtiä tyhjäksi, jos määrität sellaisen noCaptionInATableWithOnlyTDs=Älä käytä caption-elementtiä table-elementissä, joka sisältää vain td-elementtejä noAlinkAttribute=Älä käytä alink-attribuuttia noSummaryAttributeSimilarToCaption=Älä käytä samaa sisältöä summary-attribuutissa ja caption-elementissä noEmptySummaryIfTableHasTHOrCaption=Jos määrität summary-attribuutin table-elementille, joka sisältää th- tai caption-elementin, älä jätä sitä tyhjäksi noSummaryAttributeIfOnlyTDs=Älä määritä summary-attribuuttia table-elementille, joka sisältää vain td-elementtejä noStrikeElement=Älä käytä strike-elementtiä noListingElement=Älä käytä listing-elementtiä AtLeastOneTHIfCaptionOrSummary=Määritä vähintään yksi th-elementti sellaisen table-elementin sisälle, jolla on caption-elementti tai ei-tyhjä summary-attribuutti AllNonEmptyTHHaveScopeOrId=Määritä scope- tai id-attribuutti jokaiselle ei-tyhjälle th-elementille ScopeAttributeIsRowOrCol=Älä anna scope-attribuutille muuta arvoa kuin 'row' tai 'col' noBgcolorAttribute=Älä käytä bgcolor-attribuuttia noTTElement=Älä käytä tt-elementtiä TDHaveHeadersAttributeIfTHHasId=Määritä headers-attribuutti kaikille td-elementeille, joita vastaavalla th-elementillä on id-attribuutti noPlaintextElement=Älä käytä plaintext-elementtiä noHeadersAttributeThatIsNotATHId=Älä anna headers-attribuutille arvoa, joka on sama kuin table-elementin jonkin td-elementin id-attribuutti AllFormsHaveAButton=Määritä form-elementin sisälle button tai input, jonka tyyppi on submit, image tai button SubmitButtonsHaveNonEmptyValue=Älä jätä input type=submit -elementin value-attribuuttia tyhjäksi, jos määrität sellaisen noMarqueeElement=Älä käytä marquee-elementtiä FieldsetHasALegend=Käytä legend-elementtiä jokaisen fieldset-elementin lapsena FieldsetsAreInForms=Älä käytä fieldset-elementtiä ilman form-elementtiä noEmptyLegendElement=Älä jätä legend-elementtiä tyhjäksi, jos määrität sellaisen LabelElementHasForAttribute=Määritä jokaiselle label-elementille for-attribuutti noEmptyForAttributeOnLabel=Jos määrität label-elementille for-attribuutin, älä jätä sitä tyhjäksi ForAttributeMatchesAnIdInSameForm=For-attribuutin arvon tulee olla sama kuin jokin form-elementin sisällä oleva id-attribuutti OptgroupElementHasALabel=Määritä jokaiselle optgroup-elementille label-attribuutti NoSimilarLabelInOptgroupsOfSameSelect=Älä käytä samaa label-attribuuttia saman select-elementin eri optgroup-elementeille noEmptyLabelAttributeOnOptgroup=Jos määrität optgroup-elementille label-attribuutin, älä jätä sitä tyhjäksi noBasefontElement=Älä käytä basefont-elementtiä noBlinkElement=Älä käytä blink-elementtiä noCenterElement=Älä käytä center-elementtiä noFontElement=Älä käytä font-elementtiä ================================================ FILE: locales/fi/bluegriffon/extensions/op1/op1.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/extensions/op1/op1Overlay.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/extensions/tipoftheday/tipoftheday.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/extensions/tipoftheday/tipoftheday.rdf ================================================ %brandDTD; ]> &brandShortName; tips http://bluegriffon.org/ &brandShortName; tip of the day Archive en-us …&brandShortName; is cross platform? …&brandShortName; exists on a wide variety of operating systems including Windows, Mac OS X, and many flavors of Linux, OS/2 … …&brandShortName; shows the title of any unsaved page with a red shadow? You can now save files from any viewing mode. …you have direct access to the &brandShortName; community? Just select “Help > User’s Community”. …you can insert HTML5 elements easily? Just select “Insert > HTML5 Element”. …you can close the current tab with one key? Control+w (Command +w on Mac OS X) will close the current tab. …you can create a new tab with a key combination? Control+n (Command +n on Mac OS X) will create a new blank tab using the same doctype as the last page created. …you can revert to a previously saved version of the currently edited document? Righ-click (context-click on Mac OS X) on the document's tab and select the Revert menu. …you can publish pages directly from &brandShortName; First install the free FireFTP add-on and set it up. It will then be available on the Tools menu. …&brandShortName; can insert any character easily? Use “Insert characters and symbols”. You can then search for any Unicode character by name or open a block for inspection. …&brandShortName; runs spellcheck by default? Right click a word to find suggestions. Switch checking on or off using “Tools > Preferences > General” . …&brandShortName; can reliably select an element? Simply click its name in the structure bar. …you can move an element in your document using the mouse? First select as in previous tip then just drag it to where needed. …you can quickly open existing pages? The paid for Project manager add-on permits instant access to pages and images which are organised as a project. …you can choose your default browser? Use “Tools > Preferences > Advanced > Reset external browser settings”. Next time you browse you can choose a browser. …&brandShortName; allows you to use external stylesheets? To create one ready for use click “Panels > Stylesheets”. Click the plus sign and select “Linked to the document”. …&brandShortName; can manage stylesheets and complex selectors? Using the CSS Pro Editor (a paid for add-on) you change the order of and add titles and rel attribute to stylesheets and develop complex CSS 2 and 3 selectors with advanced help. …panels can be resized? Drag the grab handle at the bottom right corner to the size needed. …attributes can be added to any element? Open “Panels > DOM Explorer”. In wysiwyg view click in the element, select use the Attributes tab and click the plus sign. …&brandShortName; can handle CSS3 properties? Vendor prefixes will be added for browsers that need them. …you can personalize keyboard shortcuts? Any menu item can be allocated to your preferred key. Open “Tools > Preferences > Keyboard Shortcuts”. Find and double-click the command wanted. In the new window key a shortcut. …you can remove a class from an element? Just select the element and in the Class drop down box re-apply the class. ================================================ FILE: locales/fi/bluegriffon/extensions/tipoftheday/tipofthedayOverlay.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/sidebars/aria/aria.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/sidebars/aria/aria.properties ================================================ mustBeContainedIn=must be contained in or= or ok=OK mustContain=must contain and= and deprecated=deprecated missingTextbox=missing textbox missingListboxTreeGridDialog=missing listbox, tree, grid or dialog ================================================ FILE: locales/fi/bluegriffon/sidebars/aria/ariaOverlay.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/sidebars/cssproperties/backgrounditem.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/sidebars/cssproperties/backgrounditem.properties ================================================ backgroundColorTitle=Väri backgroundImageTitle=Kuva backgroundLinearGradientTitle=Lineaarinen liukuväri backgroundRadialGradientTitle=Radiaalinen liukuväri ================================================ FILE: locales/fi/bluegriffon/sidebars/cssproperties/colorstopitem.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/sidebars/cssproperties/cssproperties.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/sidebars/cssproperties/cssproperties.properties ================================================ EnterAnId=Kirjoita ID EnterUniqueId=Sinun tulee antaa elementille yksilöivä ID: NoClasSelected=Sinun tulee valita luokkanimi PleaseSelectAClass=Luokka täytyy valita pyydettyjen muutosten toteuttamiseksi ================================================ FILE: locales/fi/bluegriffon/sidebars/cssproperties/csspropertiesOverlay.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/sidebars/cssproperties/editGridTemplate.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/sidebars/cssproperties/fontFeatures.properties ================================================ FFaalt=Access all alternates FFcalt=Contextual alternates FFsalt=Stylistic alternates FFliga=Standard ligatures FFclig=Contextual ligatures FFdlig=Discretionary ligatures FFhist=Historical forms FFhlig=Historical ligatures FFunic=Unicase FFsmcp=Small capitals FFc2sc=Small capitals from capitals FFc2pc=Petite capitals from capitals FFpcap=Petite capitals FFcase=Case sensitive forms FFcpsp=Capital spacing FFtitl=Titling FFswsh=Swash FFcswh=Contextual swash FFfrac=Fractions FFafrc=Alternative fractions FFordn=Ordinals FFnumr=Numerators FFdnom=Denominators FFsinf=Scientific inferiors FFsups=Superscript FFsubs=Subscript FFonum=Oldstyle figures FFlnum=Lining Figures FFpnum=Proportional figures FFtnum=Tabular figures FFzero=Slashed zero FFmgrk=Mathematical greek FFnalt=Alternate annotation forms FFornm=Ornaments FFlocl=Localized forms FFsize=Optical size FFisol=Isolated forms FFinit=Initial forms FFmedi=Medial forms FFfinal=Final forms FFrlig=Requird ligatures FFccmp=Glyph composition/decomposition FFmark=Mark to base positioning FFmkmj=Mark to mark positioning FFhwid=Half widths ================================================ FILE: locales/fi/bluegriffon/sidebars/cssproperties/griditemposition.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/sidebars/cssproperties/textshadowitem.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/sidebars/cssproperties/transformationitem.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/sidebars/cssproperties/transitionitem.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/sidebars/domexplorer/domexplorer.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/sidebars/domexplorer/domexplorerOverlay.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/sidebars/its20/its20.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/sidebars/its20/its20.properties ================================================ LoadError=Load Error InlineParseError=Inline resource is not an ITS 2.0 document CannotFetch=Cannot fetch URL NotITS=Resource is not an ITS 2.0 document TranslatableByGlobalRule=Translatable by global rule NotTranslatableByGlobalRule=Not translatable by global rule InlineRules=Inline rules translateRule=Translate locNoteRule=Localization Note termRule=Terminology dirRule=Directionality langRule=Language Information withinTextRule=Elements Within Text domainRule=Domain textAnalysisRule=Text Analysis localeFilterRule=Locale Filter provRule=Provenance externalResourceRefRule=External Resource targetPointerRule=Target Pointer idValueRule=Id Value preserveSpaceRule=Preserve Space locQualityIssueRule=Localization Quality Issue mtConfidenceRule=Machine-Translation Confidence allowedCharactersRule=Allowed Characters storageSizeRule=Storage Size DontWarnAgainForUrl=Don't warn me again about this URL DontWarnAgainForInline=Don't warn me again about inline global rules NewITSFile=New ITS 2.0 File CannotResolveXPath=Cannot resolve the following XPath selector (undeclared HTML namespace?): XPathParsingError=XPath Parsing Error DontWarnAgainForSelector=Don't warn me again about this selector CSSParsingError=CSS Parsing Error CannotResolveCSS=Cannot resolve the following CSS selector: ================================================ FILE: locales/fi/bluegriffon/sidebars/its20/its20Overlay.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/sidebars/its20/locNoteRule.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/sidebars/its20/selector.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/sidebars/its20/termRule.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/sidebars/its20/translateRule.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/sidebars/scripteditor/editor.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/sidebars/scripteditor/scripteditor.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/sidebars/scripteditor/scripteditor.properties ================================================ ConfirmDeletionTitle=Delete a script ConfirmDeletion=Are you sure you want to delete this script? AddExternalScriptTitle=Add an external script PromptScriptURL=URL of the script? ================================================ FILE: locales/fi/bluegriffon/sidebars/scripteditor/scripteditorOverlay.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/sidebars/stylesheets/editor.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/sidebars/stylesheets/stylesheets.dtd ================================================ ================================================ FILE: locales/fi/bluegriffon/sidebars/stylesheets/stylesheetsOverlay.dtd ================================================ ================================================ FILE: locales/fi/cssproperties.mn ================================================ bluegriffon-fi.jar: % locale cssproperties fi %locale/fi/cssproperties/ locale/fi/cssproperties/csspropertiesOverlay.dtd (locale/fi/csspropertiesOverlay.dtd) locale/fi/cssproperties/cssproperties.dtd (locale/fi/cssproperties.dtd) locale/fi/cssproperties/editGridTemplate.dtd (locale/fi/editGridTemplate.dtd) locale/fi/cssproperties/backgrounditem.dtd (locale/fi/backgrounditem.dtd) locale/fi/cssproperties/griditemposition.dtd (locale/fi/griditemposition.dtd) locale/fi/cssproperties/transformationitem.dtd (locale/fi/transformationitem.dtd) locale/fi/cssproperties/transitionitem.dtd (locale/fi/transitionitem.dtd) locale/fi/cssproperties/textshadowitem.dtd (locale/fi/textshadowitem.dtd) locale/fi/cssproperties/colorstopitem.dtd (locale/fi/colorstopitem.dtd) locale/fi/cssproperties/backgrounditem.properties (locale/fi/backgrounditem.properties) locale/fi/cssproperties/cssproperties.properties (locale/fi/cssproperties.properties) locale/fi/cssproperties/fontFeatures.properties (locale/fi/fontFeatures.properties) ================================================ FILE: locales/fi/domexplorer.mn ================================================ bluegriffon-fi.jar: % locale domexplorer fi %locale/fi/domexplorer/ locale/fi/domexplorer/domexplorerOverlay.dtd (locale/fi/domexplorerOverlay.dtd) locale/fi/domexplorer/domexplorer.dtd (locale/fi/domexplorer.dtd) ================================================ FILE: locales/fi/fs.mn ================================================ fs-fi.jar: % locale fs fi %locale/fi/fs/ locale/fi/fs/fsOverlay.dtd (locale/fi/fsOverlay.dtd) locale/fi/fs/fs.dtd (locale/fi/fs.dtd) locale/fi/fs/fs.properties (locale/fi/fs.properties) locale/fi/fs/addFont.dtd (locale/fi/addFont.dtd) ================================================ FILE: locales/fi/gfd.mn ================================================ gfd-fi.jar: % locale gfd fi %locale/fi/gfd/ locale/fi/gfd/gfdOverlay.dtd (locale/fi/gfdOverlay.dtd) locale/fi/gfd/gfd.dtd (locale/fi/gfd.dtd) locale/fi/gfd/addFont.dtd (locale/fi/addFont.dtd) ================================================ FILE: locales/fi/its20.mn ================================================ bluegriffon-fi.jar: % locale its20 fi %locale/fi/its20/ locale/fi/its20/its20Overlay.dtd (locale/fi/its20Overlay.dtd) locale/fi/its20/its20.properties (locale/fi/its20.properties) locale/fi/its20/its20.dtd (locale/fi/its20.dtd) locale/fi/its20/translateRule.dtd (locale/fi/translateRule.dtd) locale/fi/its20/locNoteRule.dtd (locale/fi/locNoteRule.dtd) locale/fi/its20/termRule.dtd (locale/fi/termRule.dtd) locale/fi/its20/selector.dtd (locale/fi/selector.dtd) ================================================ FILE: locales/fi/markdown.mn ================================================ markdown-fi.jar: % locale markdown fi %locale/fi/markdown/ locale/fi/markdown/markdownOverlay.dtd (locale/fi/markdownOverlay.dtd) locale/fi/markdown/markdown.dtd (locale/fi/markdown.dtd) ================================================ FILE: locales/fi/op1.mn ================================================ op1-fi.jar: % locale op1 fi %locale/fi/op1/ locale/fi/op1/op1Overlay.dtd (locale/fi/op1Overlay.dtd) locale/fi/op1/op1.dtd (locale/fi/op1.dtd) locale/fi/op1/a11yFirstStep.properties (locale/fi/a11yFirstStep.properties) ================================================ FILE: locales/fi/scripteditor.mn ================================================ bluegriffon-fi.jar: % locale scripteditor fi %locale/fi/scripteditor/ locale/fi/scripteditor/scripteditorOverlay.dtd (locale/fi/scripteditorOverlay.dtd) locale/fi/scripteditor/scripteditor.dtd (locale/fi/scripteditor.dtd) locale/fi/scripteditor/scripteditor.properties (locale/fi/scripteditor.properties) locale/fi/scripteditor/editor.dtd (locale/fi/editor.dtd) ================================================ FILE: locales/fi/stylesheets.mn ================================================ bluegriffon-fi.jar: % locale stylesheets fi %locale/fi/stylesheets/ locale/fi/stylesheets/stylesheetsOverlay.dtd (locale/fi/stylesheetsOverlay.dtd) locale/fi/stylesheets/stylesheets.dtd (locale/fi/stylesheets.dtd) locale/fi/stylesheets/editor.dtd (locale/fi/editor.dtd) ================================================ FILE: locales/fi/tipoftheday.mn ================================================ tipoftheday-fi.jar: % locale tipoftheday fi %locale/fi/tipoftheday/ locale/fi/tipoftheday/tipoftheday.dtd (locale/fi/tipoftheday.dtd) locale/fi/tipoftheday/tipofthedayOverlay.dtd (locale/fi/tipofthedayOverlay.dtd) locale/fi/tipoftheday/tipoftheday.rdf (locale/fi/tipoftheday.rdf) ================================================ FILE: locales/fr/aria.mn ================================================ bluegriffon-fr.jar: % locale aria fr %locale/fr/aria/ locale/fr/aria/ariaOverlay.dtd (locale/fr/ariaOverlay.dtd) locale/fr/aria/aria.dtd (locale/fr/aria.dtd) locale/fr/aria/aria.properties (locale/fr/aria.properties) ================================================ FILE: locales/fr/base.mn ================================================ bluegriffon-fr.jar: % locale bluegriffon fr %locale/fr/bluegriffon/ % locale branding fr %locale/fr/branding/ locale/fr/bluegriffon/aboutDialog.dtd (locale/fr/bluegriffon/aboutDialog.dtd) locale/fr/bluegriffon/bluegriffon.dtd (locale/fr/bluegriffon/bluegriffon.dtd) locale/fr/bluegriffon/polyglot.dtd (locale/fr/bluegriffon/polyglot.dtd) locale/fr/bluegriffon/findbar.dtd (locale/fr/bluegriffon/findbar.dtd) locale/fr/bluegriffon/bluegriffon.properties (locale/fr/bluegriffon/bluegriffon.properties) locale/fr/bluegriffon/colourPicker.dtd (locale/fr/bluegriffon/colourPicker.dtd) locale/fr/bluegriffon/credits.dtd (locale/fr/bluegriffon/credits.dtd) locale/fr/bluegriffon/filepickerbutton.dtd (locale/fr/bluegriffon/filepickerbutton.dtd) locale/fr/bluegriffon/filePicking.dtd (locale/fr/bluegriffon/filePicking.dtd) locale/fr/bluegriffon/insertTable.dtd (locale/fr/bluegriffon/insertTable.dtd) locale/fr/bluegriffon/insertTable.properties (locale/fr/bluegriffon/insertTable.properties) locale/fr/bluegriffon/language.properties (locale/fr/bluegriffon/language.properties) locale/fr/bluegriffon/languages.dtd (locale/fr/bluegriffon/languages.dtd) locale/fr/bluegriffon/markupCleaner.dtd (locale/fr/bluegriffon/markupCleaner.dtd) locale/fr/bluegriffon/openLocation.dtd (locale/fr/bluegriffon/openLocation.dtd) locale/fr/bluegriffon/openLocation.properties (locale/fr/bluegriffon/openLocation.properties) locale/fr/bluegriffon/newPageWizard.dtd (locale/fr/bluegriffon/newPageWizard.dtd) locale/fr/bluegriffon/newPageWizard.properties (locale/fr/bluegriffon/newPageWizard.properties) locale/fr/bluegriffon/propertiesDeck.dtd (locale/fr/bluegriffon/propertiesDeck.dtd) locale/fr/bluegriffon/aria.dtd (locale/fr/bluegriffon/aria.dtd) locale/fr/bluegriffon/structurebar.dtd (locale/fr/bluegriffon/structurebar.dtd) locale/fr/bluegriffon/tabeditor.dtd (locale/fr/bluegriffon/tabeditor.dtd) locale/fr/bluegriffon/masterPasswordQuery.properties (locale/fr/bluegriffon/masterPasswordQuery.properties) locale/fr/bluegriffon/newDocument.dtd (locale/fr/bluegriffon/newDocument.dtd) locale/fr/bluegriffon/prefs/file.dtd (locale/fr/bluegriffon/prefs/file.dtd) locale/fr/bluegriffon/prefs/source.dtd (locale/fr/bluegriffon/prefs/source.dtd) locale/fr/bluegriffon/prefs/general.dtd (locale/fr/bluegriffon/prefs/general.dtd) locale/fr/bluegriffon/prefs/newPage.dtd (locale/fr/bluegriffon/prefs/newPage.dtd) locale/fr/bluegriffon/prefs/update.dtd (locale/fr/bluegriffon/prefs/update.dtd) locale/fr/bluegriffon/prefs/styles.dtd (locale/fr/bluegriffon/prefs/styles.dtd) locale/fr/bluegriffon/prefs/advanced.dtd (locale/fr/bluegriffon/prefs/advanced.dtd) locale/fr/bluegriffon/prefs/connection.dtd (locale/fr/bluegriffon/prefs/connection.dtd) locale/fr/bluegriffon/prefs/osx.dtd (locale/fr/bluegriffon/prefs/osx.dtd) locale/fr/bluegriffon/prefs/shortcuts.dtd (locale/fr/bluegriffon/prefs/shortcuts.dtd) locale/fr/bluegriffon/prefs/update.properties (locale/fr/bluegriffon/prefs/update.properties) locale/fr/bluegriffon/prefs/license.dtd (locale/fr/bluegriffon/prefs/license.dtd) locale/fr/bluegriffon/prefs/license.properties (locale/fr/bluegriffon/prefs/license.properties) locale/fr/bluegriffon/prefs/deactivateLicense.dtd (locale/fr/bluegriffon/prefs/deactivateLicense.dtd) locale/fr/bluegriffon/prefs.dtd (locale/fr/bluegriffon/prefs.dtd) locale/fr/bluegriffon/updateAvailable.dtd (locale/fr/bluegriffon/updateAvailable.dtd) locale/fr/bluegriffon/updates.properties (locale/fr/bluegriffon/updates.properties) locale/fr/branding/brand.dtd (locale/fr/branding/brand.dtd) locale/fr/branding/brand.properties (locale/fr/branding/brand.properties) locale/fr/bluegriffon/insertImage.dtd (locale/fr/bluegriffon/insertImage.dtd) locale/fr/bluegriffon/insertAnchor.dtd (locale/fr/bluegriffon/insertAnchor.dtd) locale/fr/bluegriffon/insertCommentOrPI.dtd (locale/fr/bluegriffon/insertCommentOrPI.dtd) locale/fr/bluegriffon/insertLink.dtd (locale/fr/bluegriffon/insertLink.dtd) locale/fr/bluegriffon/insertLink.properties (locale/fr/bluegriffon/insertLink.properties) locale/fr/bluegriffon/cssClassPicker.dtd (locale/fr/bluegriffon/cssClassPicker.dtd) locale/fr/bluegriffon/insertVideo.dtd (locale/fr/bluegriffon/insertVideo.dtd) locale/fr/bluegriffon/insertAudio.dtd (locale/fr/bluegriffon/insertAudio.dtd) locale/fr/bluegriffon/insertVideo.properties (locale/fr/bluegriffon/insertVideo.properties) locale/fr/bluegriffon/insertHTML.dtd (locale/fr/bluegriffon/insertHTML.dtd) locale/fr/bluegriffon/insertHR.dtd (locale/fr/bluegriffon/insertHR.dtd) locale/fr/bluegriffon/insertForm.dtd (locale/fr/bluegriffon/insertForm.dtd) locale/fr/bluegriffon/parsingError.dtd (locale/fr/bluegriffon/parsingError.dtd) locale/fr/bluegriffon/insertFormInput.dtd (locale/fr/bluegriffon/insertFormInput.dtd) locale/fr/bluegriffon/insertFieldset.dtd (locale/fr/bluegriffon/insertFieldset.dtd) locale/fr/bluegriffon/insertLabel.dtd (locale/fr/bluegriffon/insertLabel.dtd) locale/fr/bluegriffon/insertButton.dtd (locale/fr/bluegriffon/insertButton.dtd) locale/fr/bluegriffon/insertSelect.dtd (locale/fr/bluegriffon/insertSelect.dtd) locale/fr/bluegriffon/insertTextarea.dtd (locale/fr/bluegriffon/insertTextarea.dtd) locale/fr/bluegriffon/insertKeygen.dtd (locale/fr/bluegriffon/insertKeygen.dtd) locale/fr/bluegriffon/insertOutput.dtd (locale/fr/bluegriffon/insertOutput.dtd) locale/fr/bluegriffon/insertProgress.dtd (locale/fr/bluegriffon/insertProgress.dtd) locale/fr/bluegriffon/insertMeter.dtd (locale/fr/bluegriffon/insertMeter.dtd) locale/fr/bluegriffon/insertStylesheet.dtd (locale/fr/bluegriffon/insertStylesheet.dtd) locale/fr/bluegriffon/editStylesheet.dtd (locale/fr/bluegriffon/editStylesheet.dtd) locale/fr/bluegriffon/media.dtd (locale/fr/bluegriffon/media.dtd) locale/fr/bluegriffon/media.properties (locale/fr/bluegriffon/media.properties) locale/fr/bluegriffon/insertChars.dtd (locale/fr/bluegriffon/insertChars.dtd) locale/fr/bluegriffon/convertToTable.dtd (locale/fr/bluegriffon/convertToTable.dtd) locale/fr/bluegriffon/pageProperties.dtd (locale/fr/bluegriffon/pageProperties.dtd) locale/fr/bluegriffon/spellCheck.dtd (locale/fr/bluegriffon/spellCheck.dtd) locale/fr/bluegriffon/spellCheck.properties (locale/fr/bluegriffon/spellCheck.properties) locale/fr/bluegriffon/dictionary.dtd (locale/fr/bluegriffon/dictionary.dtd) locale/fr/bluegriffon/html5.properties (locale/fr/bluegriffon/html5.properties) locale/fr/bluegriffon/listProperties.dtd (locale/fr/bluegriffon/listProperties.dtd) locale/fr/bluegriffon/insertTOC.dtd (locale/fr/bluegriffon/insertTOC.dtd) locale/fr/bluegriffon/svg-edit.properties (locale/fr/bluegriffon/svg-edit.properties) locale/fr/bluegriffon/panels.dtd (locale/fr/bluegriffon/panels.dtd) locale/fr/bluegriffon/rotator.dtd (locale/fr/bluegriffon/rotator.dtd) ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/aboutDialog.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/aria.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/bluegriffon.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/bluegriffon.properties ================================================ titleModifier=BlueGriffon # in the following string, %t represents the title of the page or its URL # and %b the titleModifier above titleFormat=%S - %S Unknown=[Inconnu] NoClassAvailable=(pas de classe) NoIdAvailable=(pas d'ID) DocumentTitle=Titre du document NeedDocTitle=Veuillez donner un titre au document DocTitleHelp=Ce titre sera utilisé pour le titre de la fenêtre et les signets. ExportToText=Exporter en texte SaveDocumentAs=Enregistrer le document sous… XHTMLfiles=fichiers XHTML untitled=sans titre SaveDocument=Enregistrer le document SaveFileFailed=La sauvegarde du document a échoué ! ExportToText=Exporter en texte FileNotSaved=Le document n'est pas enregistré ! SaveFileBeforeClosing=Voulez-vous l'enregistrer avant de fermer cet onglet ? YesSaveFile=Oui, enregistrer le document NoDiscardChanges=Non, ignorer les modifications DontCloseTab=Ne pas fermer l'onglet ! IdAlreadyTaken=Cet ID est déjà utilisé dans le document RemoveIdFromElement=Voulez-vous supprimer l'ID de l'élément le portant déjà ou annuler l'action ? YesRemoveId=Supprimer l'ID NoCancel=Annuler ReplaceAll=Tout Remplacer… ReplacedPart1= ReplacedPart2= occurrences remplacées AFileWasChanged=Un fichier a été modifié ReloadFile=Le fichier %S a été modifié et BlueGriffon doit le recharger DontAskForFileChangesAgain=ne plus m'avertir AbandonChanges=Abandonner les changements effectués dans "%title%" depuis la dernière sauvegarde et revenir à cette version ? RevertCaption=Revenir à la dernière sauvegarde HTMLCommentsInXHTMLTitle=Commentaire HTML dans un élément

      Texte normal !

      Liens activs !

      Liens visits !

      ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/panels.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/parsingError.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/polyglot.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/prefs/advanced.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/prefs/connection.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/prefs/deactivateLicense.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/prefs/file.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/prefs/general.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/prefs/license.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/prefs/license.properties ================================================ activateWarning=BlueGriffon doit redémarrer pour activer votre licence. Voulez-vous redémarrer maintenant. confirmRestart=Redémarrer BlueGriffon ? fullResetTitle=Remise à zéro des activations d'une licence fullResetErrorLabel=Impossible de réaliser l'opération à cause d'une erreur réseau. fullResetRequested=Un lien de remise à zéro a été envoyé au détenteur de la licence/transaction. BlueGriffon doit à présent redémarrer. fullResetInvalid=Le n° de Transaction est invalide. ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/prefs/newPage.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/prefs/osx.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.properties ================================================ NoMainWindowAvaialble=Impossible d'éditer les raccourcis clavier PleaseOpenOneMainWindow=Au moins une fenêtre principale de BlueGriffon doit être ouverte pour permettre l'édition des raccourcis clavier. ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/prefs/source.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/prefs/styles.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/prefs/update.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/prefs/update.properties ================================================ SoftwareUpdates=Mises à jour UnableToCheck=Impossible de vérifier la disponibilité de mises à jour UpToDate=BlueGriffon est à jour ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/prefs.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/propertiesDeck.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/rotator.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/spellCheck.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/spellCheck.properties ================================================ CorrectSpelling=(orthographe correcte) NoSuggestedWords=(pas de suggestion) NoMisspelledWord=Aucun mot mal orthographié CheckSpellingDone=Vérification orthographique terminée CheckSpelling=Vérification orthographique ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/structurebar.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/svg-edit.properties ================================================ SvgEdit=SVG Edit ConfirmClose=Le document a t modifi, tes-vous sr de vouloir fermer SVG Edit? ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/tabeditor.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/updateAvailable.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/base/locale/bluegriffon/updates.properties ================================================ update.checkInsideButton.label=Rechercher des mises à jour update.checkInsideButton.accesskey=c update.resumeButton.label=Reprendre le téléchargement de %S… update.resumeButton.accesskey=d update.openUpdateUI.applyButton.label=Appliquer la mise à jour… update.openUpdateUI.applyButton.accesskey=A update.restart.applyButton.label=Appliquer la mise à jour update.restart.applyButton.accesskey=A update.openUpdateUI.upgradeButton.label=Mettre à jour maintenant… update.openUpdateUI.upgradeButton.accesskey=u update.restart.upgradeButton.label=Mettre à jour maintenant update.restart.upgradeButton.accesskey=u ================================================ FILE: locales/fr/bluegriffon/base/locale/branding/brand.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/base/locale/branding/brand.properties ================================================ brandShortName=BlueGriffon brandFullName=BlueGriffon vendorShortName=Disruptive Innovations sidebarName=Sidebar ================================================ FILE: locales/fr/bluegriffon/extensions/fs/addFont.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/extensions/fs/fs.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/extensions/fs/fs.properties ================================================ SelectDir=Sélectionner un repertoire où sauver le paquer téléchargé SelectFile=Sélectionner le fichier stylesheet.css d'un paquet déjà téléchargé Stylesheet=Le fichier stylesheet.css d'un paquet FontSquirrel MustBeSavedTitle=Le document n'a jamais été sauvé MustBeSavedMessage=Vous devez sauver au moins une fois le document pour le lier à des polices présentes sur votre disque via des URLs relatifs. Veuillez fermer le document et le rouvrir après sauvegarde. ================================================ FILE: locales/fr/bluegriffon/extensions/fs/fsOverlay.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/extensions/gfd/addFont.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/extensions/gfd/gfd.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/extensions/gfd/gfdOverlay.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/extensions/markdown/markdown.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/extensions/markdown/markdownOverlay.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/extensions/op1/a11yFirstStep.properties ================================================ ConformingDTDSyntax=Utiliser une dtd conforme aux recommandations du W3C avant l'élément html NoWrongSyntaxOrNonConformingHierarchy=Ne pas utiliser de syntaxes d'attribut erronées ni d'imbrications d'éléments non conformes dans l'élément html OneTitleInHead=Utiliser un élément title enfant de l'élément head NoEmptyTitle=Ne pas utiliser d'élément title vide NoMetaRefresh=Ne pas utiliser l'élément meta avec un attribut http-equiv ayant la valeur refresh HTMLElementHasLangAttribute=Utiliser un attribut lang pour l'élément html HTMLElementHasValidLangAttribute=Utiliser un code de langue conforme dans l'attribut lang NoInvalidDir=Ne pas utiliser une valeur d'attribut dir autre que ltr, rtl ou vide TitleForFrames=Utiliser un attribut title pour chaque élément frame NoEmptyTitleForFrames=Ne pas utiliser un attribut title vide pour l'élément frame TitleForIFrames=Utiliser un attribut title pour l'élément iframe NoEmptyTitleForIFrames=Ne pas utiliser un attribut title vide sur l'élément iframe AtLeastOneH1InBody=Utiliser au moins un élément h1 descendant de l'élément body NoEmptyH1=Ne pas utiliser d'élément h1 vide NoEmptyH2=Ne pas utiliser d'élément h2 vide NoEmptyH3=Ne pas utiliser d'élément h3 vide NoEmptyH4=Ne pas utiliser d'élément h4 vide NoEmptyH5=Ne pas utiliser d'élément h5 vide NoEmptyH6=Ne pas utiliser d'élément h6 vide H2Order=Utiliser un élément h1, h2, h3, h4, h5 ou h6 comme premier élément de titrage précédant l'élément h2 dans l'ordre du code source H3Order=Utiliser un élément h2, h3, h4, h5 ou h6 comme premier élément de titrage précédant l'élément h3 dans l'ordre du code source H4Order=Utiliser un élément h3, h4, h5 ou h6 comme premier élément de titrage précédant l'élément h4 dans l'ordre du code source H5Order=Utiliser un élément h4, h5 ou h6 comme premier élément de titrage précédant l'élément h5 dans l'ordre du code source H6Order=Utiliser un élément h5 ou h6 comme premier élément de titrage précédant l'élément h6 dans l'ordre du code source DTAsFirstChildOfDL=Utiliser un élément dt comme premier enfant de l'élément dl NoEmptyLI=Ne pas utiliser d'élément li vide NoAlignAttribute=Ne pas utiliser l'attribut align NoXmpElement=Ne pas utiliser l'élément xmp NoEmptyP=Ne pas utiliser d'élément p vide NoEmptyAExceptAnchors=Ne pas utiliser d'élément a vide à l'exception des ancres NoEmptyButton=Ne pas utiliser d'élément button vide NoVlinkAttribute=Ne pas utiliser l'attribut vlink NoTextAttribute=Ne pas utiliser l'attribut text NoLinkAttribute=Ne pas utiliser l'attribut link noImgWithoutAlt=Utiliser un attribut alt pour l'élément img noAreaWithoutAlt=Utiliser un attribut alt pour l'élément area noAppletWithoutAlt=Utiliser un attribut alt pour l'élément applet noImageInputWithoutAlt=Utiliser un attribut alt pour chaque élément input de type image noEmptyAltForImageLoneChildOfAnchorOrButton=Ne pas utiliser d'attribut alt vide si l'élément img est le seul enfant d'un élément a ou button noEmptyAltForInputImage=Ne pas utiliser d'attribut alt vide pour un élément input de type image noEmptyAltForAreaWithHref=Ne pas utiliser d'attribut alt vide sur un élément area doté d'un attribut href noAltSimilarToTextContent=Ne pas utiliser un contenu d'attribut alt identique au texte présent dans un lien si l'élément img est un descendant d'élément a contenant également du texte noBorderAttribute=Ne pas utiliser l'attribut border noSimilarAltForAreasWithDifferentHref=Ne pas utiliser un contenu d'attribut alt identique pour plusieurs éléments area ayant un attribut href différent LongdescIsURI=Utiliser une URI comme valeur de l'attribut longdesc noBackgroundAttribute=Ne pas utiliser l'attribut background noBgsoundElement=Ne pas utiliser l'élément bgsound TablesWithAtLeastOneTHHaveACaption=Utiliser un élément caption comme premier enfant de l'élément table si le tableau contient au moins un élément th CaptionIsDifferentFromSummaryAttribute=Ne pas utiliser un contenu d'élément caption identique au contenu de l'attribut summary noEmptyCaption=Ne pas utiliser d'élément caption vide noCaptionInATableWithOnlyTDs=Ne pas utiliser d'élément caption dans un élément table contenant uniquement des cellules td noAlinkAttribute=Ne pas utiliser l'attribut alink noSummaryAttributeSimilarToCaption=Ne pas utiliser un contenu d'attribut summary identique au contenu de l'élément caption noEmptySummaryIfTableHasTHOrCaption=Ne pas utiliser d'attribut summary vide sur l'élément table si le tableau contient un élément th ou caption noSummaryAttributeIfOnlyTDs=Ne pas utiliser d'attribut summary sur un élément table contenant uniquement des cellules td noStrikeElement=Ne pas utiliser l'élément strike noListingElement=Ne pas utiliser l'élément listing AtLeastOneTHIfCaptionOrSummary=Utiliser au moins un élément th dans l'élément table contenant un élément caption ou ayant un attribut summary non vide AllNonEmptyTHHaveScopeOrId=Utiliser un attribut scope ou id pour chaque élément th non vide ScopeAttributeIsRowOrCol=Ne pas utiliser une valeur d'attribut scope autre que row ou col noBgcolorAttribute=Ne pas utiliser l'attribut bgcolor noTTElement=Ne pas utiliser l'élément tt TDHaveHeadersAttributeIfTHHasId=Utiliser l'attribut headers sur l'élément td s'il se rapporte à un élément th ayant un attribut id noPlaintextElement=Ne pas utiliser l'élément plaintext noHeadersAttributeThatIsNotATHId=Ne pas utiliser un contenu d'attribut headers qui ne correspond à aucune valeur d'attribut id présent dans le même tableau AllFormsHaveAButton=Utiliser un élément button ou un élément input de type submit, image ou button dans chaque élément form SubmitButtonsHaveNonEmptyValue=Ne pas utiliser d'attribut value vide pour un élément input de type submit noMarqueeElement=Ne pas utiliser l'élément marquee FieldsetHasALegend=Utiliser un élément legend enfant de l'élément fieldset FieldsetsAreInForms=Ne pas utiliser l'élément fieldset en dehors d'un élément form noEmptyLegendElement=Ne pas utiliser d'élément legend vide LabelElementHasForAttribute=Utiliser l'attribut for pour l'élément label noEmptyForAttributeOnLabel=Ne pas utiliser d'attribut for vide pour l'élément label ForAttributeMatchesAnIdInSameForm=Ne pas utiliser un contenu d'attribut for qui ne correspond à aucune valeur d'attribut id existant dans le même élément form OptgroupElementHasALabel=Utiliser un attribut label pour chaque élément optgroup NoSimilarLabelInOptgroupsOfSameSelect=Ne pas utiliser un contenu d'attribut label identique pour plusieurs élément optgroup d'un même élément select noEmptyLabelAttributeOnOptgroup=Ne pas utiliser d'attribut label vide sur l'élément optgroup noBasefontElement=Ne pas utiliser l'élément basefont noBlinkElement=Ne pas utiliser l'élément blink noCenterElement=Ne pas utiliser l'élément center noFontElement=Ne pas utiliser l'élément font ================================================ FILE: locales/fr/bluegriffon/extensions/op1/op1.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/extensions/op1/op1Overlay.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/extensions/tipoftheday/tipoftheday.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/extensions/tipoftheday/tipoftheday.rdf ================================================ %brandDTD; ]> &brandShortName; - Astuce du jour http://bluegriffon.org/ &brandShortName; tip of the day Archive fr …&brandShortName; est multi-platformes? …&brandShortName; existe pour une grande variété de systèmes dont Windows, Mac OS X, divers types de Linux, OS/2 … …&brandShortName; affiche les onglets non sauvés avec un texte ombré de rouge? Vous pouvez désormais sauver vos documents depuis la vue Wysiwyg et la vue Source. …vous avez un accès direct à la communauté &brandShortName; ? utilisez simplement le menu “Aide > Forums”. …vous pouvez facilement insérer n'importe quel élément HTML5? Sélectionnez “Insertion > Élément HTML5”. …vous pouvez fermer un onglet à l'aide du clavier? Control+w (Command +w sous Mac OS X) fermera l'onglet courant. …vous pouvez créer un nouvel onglet à l'aide du clavier? Control+n (Command+n sous Mac OS X) créera un nouvel onglet vierge du même type html que la dernière page précédemment créée.. …vous pouvez revenir à la version sauvegardée du document en cours d'édition ? Effectuez un clic droit (clic contextuel sous Mac OS X) sur l'onglet du document et sélectionnez le menu Restaurer. …vous pouvez publier des pages Web directement depuis &brandShortName; Installer tout d'abord l'extension gratuite FireFTP add-on et configurez-la. Elle sera disponible dans le menu Outils. …&brandShortName; peut aisément insérer n'importe quel caractère Unicode ? Utilisez “Insertion > Caractères Spéciaux”. Vous pouvez rechercher un caractère Unicode par son nom ou naviguer dans la liste complète des caractères. …&brandShortName; vérifie votre orthographe par défaut ? Cliquez avec le bouton de droite sur un mot souligné en rouge pour voir des suggestions orthographiques. Vous pouvez supprimer la vérification orthographique automatique en utilisant “Outils > Préférences > Général” . …&brandShortName; vous permet de très simplement sélectionner un élément ? Il suffit de cliquer sur son nom dans la barre de structure. …vous pouvez déplacer un élément à la souris ? Sélectionner le dans la barre de structure, puis déplacer le dans la fenêtre principale ! …vous pouvez facilement gérer vos projects Web? L'extension payante Project Manager vous permet de gérer vos projets Web et accéder à tous vos documents distants en un clic. …vous pouvez sélectionner votre navigateur Web préféré? Utilisez “Outils > Préférences > Avancé > Suppression des choix de navigateur”. Bluegriffon vous proposera de choisir votre navigateur à la prochaîne demande de visualisation d'un document. …&brandShortName; vous permet d'utiliser des Feuilles de Styles externes au document ? Choisissez “Panneaux > Feuilles de Style” pour en créer une prête à l'emploi. Cliquez sur le signe plus et sélectionnez “Référencée depuis le document”. …&brandShortName; sait gérer des Feuilles de Styles et des Sélecteurs CSS complexes ? En utlisant l'extension payante CSS Pro Editor, vous pouvez manipuler des Feuilles de Styles complexes et des Sélecteurs CSS 2 et CSS 3 via une interface graphique avancée. …vous pouvez changer la taille des panneaux? Il vous suffit d'étendre cette taille via le coin inférieur droit du panneau. …vous pouvez ajouter n'importe quel attribut à n'importe quel élément ? Ouvrez “Panneaux > DOM Explorer” puis sélectionnez un élément et ajoutez les attributs en cliquant sur le bouton plus. …&brandShortName; sait très bien gérer les CSS 3 ? Les préfixes propriétaires seront automatiquement ajoutés pour chaque navigateur en ayant besoin. …vous pouvez modifier les raccourcis clavier ? Ouvrez les Préférences et visualiser l'onglet “Raccourcis clavier”. Trouvez le bouton ou la commande que vous désirez modifier et double-cliquez dessus. …il est facile de supprimer une classe d'un élément qui la porte déjà? Placez le curseur dans cet élément et utilisez le dropdown menu des classes. Choisissez la classe à enlever. ================================================ FILE: locales/fr/bluegriffon/extensions/tipoftheday/tipofthedayOverlay.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/sidebars/aria/aria.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/sidebars/aria/aria.properties ================================================ mustBeContainedIn=doit être contenu dans un or= ou ok=OK mustContain=doit contenir un and= et deprecated=déprécié missingTextbox=textbox manquante missingListboxTreeGridDialog=listbox, tree, grid ou dialog manquant ================================================ FILE: locales/fr/bluegriffon/sidebars/aria/ariaOverlay.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/sidebars/cssproperties/backgrounditem.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/sidebars/cssproperties/backgrounditem.properties ================================================ backgroundColorTitle=Couleur backgroundImageTitle=Image backgroundLinearGradientTitle=Dégradé linéaire backgroundRadialGradientTitle=Dégradé radial ================================================ FILE: locales/fr/bluegriffon/sidebars/cssproperties/colorstopitem.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/sidebars/cssproperties/cssproperties.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/sidebars/cssproperties/cssproperties.properties ================================================ EnterAnId=Veuillez entrer un ID EnterUniqueId=Vous devez donner un ID unique à l'élément: NoClasSelected=Vous devez sélectionner une classe PleaseSelectAClass=Une classe doit être sélectionnée pour appliquer les changement demandés ================================================ FILE: locales/fr/bluegriffon/sidebars/cssproperties/csspropertiesOverlay.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/sidebars/cssproperties/editGridTemplate.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/sidebars/cssproperties/fontFeatures.properties ================================================ FFaalt=Accès à toutes les variantes FFcalt=Variantes contextuelles FFsalt=Variantes stylistiques FFliga=Ligatures standard FFclig=Ligatures contextuelles FFdlig=Ligatures discrétionnaires FFhist=Formes historiques FFhlig=Ligatures historiques FFunic=Unicase FFsmcp=Petites capitales FFc2sc=Petites capitales adaptées des capitales FFc2pc=Capitales menues adaptées des capitales FFpcap=Capiatales menues FFcase=Formes sensibles à la casse FFcpsp=Espacement de capitales FFtitl=Titrage FFswsh=Clapotis FFcswh=Clapotis contextuel FFfrac=Fractions FFafrc=Autre fractions FFordn=Ordinaux FFnumr=Numerateurs FFdnom=Dénominateurs FFsinf=Indices scientifiques FFsups=Superscript FFsubs=Subscript FFonum=Chiffres style ancien FFlnum=Alignement des chiffres FFpnum=Chiffres proportionnels FFtnum=Chiffres tabulés FFzero=Zéro barré FFmgrk=Grec mathématique FFnalt=Autres formes d'annotations FFornm=Ornements FFlocl=Formes localisées FFsize=Taille optique FFisol=Formes isolées FFinit=Formes initiales FFmedi=Formes médianes FFfinal=Formes finales FFrlig=Ligatures requises FFccmp=Composition/décomposition de glyphe FFmark=Positionnement de marque à base FFmkmj=Positionnement de marque à marque FFhwid=Demi-taille ================================================ FILE: locales/fr/bluegriffon/sidebars/cssproperties/griditemposition.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/sidebars/cssproperties/textshadowitem.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/sidebars/cssproperties/transformationitem.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/sidebars/cssproperties/transitionitem.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/sidebars/domexplorer/domexplorer.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/sidebars/domexplorer/domexplorerOverlay.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/sidebars/its20/its20.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/sidebars/its20/its20.properties ================================================ LoadError=Erreur de chargement InlineParseError=La ressource interne au document n'est pas un jeu de règles ITS 2.0 CannotFetch=Accès à l'URL impossible NotITS=La ressource n'est pas un jeu de règles ITS 2.0 TranslatableByGlobalRule=Traduisible par règle globale NotTranslatableByGlobalRule=Non traduisible par règle globale InlineRules= translateRule=Traduire locNoteRule=Note de localisation termRule=Terminologie dirRule=Directionalité langRule=Information de langue withinTextRule=Éléments inclus dans du texte domainRule=Domaine textAnalysisRule=Analyse de text localeFilterRule=Filtre de localisation provRule=Provenance externalResourceRefRule=Ressource externe targetPointerRule=Pointeur cible idValueRule=Valeur d'ID preserveSpaceRule=Préservation des espaces locQualityIssueRule=Problème de qualité de localisation mtConfidenceRule=Taux de confiance d'une traduction automatique allowedCharactersRule=Caractères autorisés storageSizeRule=Taille maximale DontWarnAgainForUrl=Ne plus m'alerter à propos de cet URL DontWarnAgainForInline=Ne plus m'alerter à propos des règles locales NewITSFile=Nouveau fichier de règles ITS 2.0 CannotResolveXPath=Impossible de résoudre le sélecteur XPath suivant (absence de déclaration de l'espace de noms HTML ?) : XPathParsingError=Erreur de parsing XPath DontWarnAgainForSelector=Ne plus m'alerter à propos de ce sélecteur CSSParsingError=Erreur de parsing CSS CannotResolveCSS=Impossible de résoudre le sélecteur CSS suivant : ================================================ FILE: locales/fr/bluegriffon/sidebars/its20/its20Overlay.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/sidebars/its20/locNoteRule.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/sidebars/its20/selector.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/sidebars/its20/termRule.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/sidebars/its20/translateRule.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/sidebars/scripteditor/editor.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/sidebars/scripteditor/scripteditor.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/sidebars/scripteditor/scripteditor.properties ================================================ ConfirmDeletionTitle=Supprimer le script ConfirmDeletion=Êtes-vous sûr de vouloir supprimer ce script ? AddExternalScriptTitle=Ajouter un script externe PromptScriptURL=URL du script à ajouter ================================================ FILE: locales/fr/bluegriffon/sidebars/scripteditor/scripteditorOverlay.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/sidebars/stylesheets/editor.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/sidebars/stylesheets/stylesheets.dtd ================================================ ================================================ FILE: locales/fr/bluegriffon/sidebars/stylesheets/stylesheetsOverlay.dtd ================================================ ================================================ FILE: locales/fr/cssproperties.mn ================================================ bluegriffon-fr.jar: % locale cssproperties fr %locale/fr/cssproperties/ locale/fr/cssproperties/csspropertiesOverlay.dtd (locale/fr/csspropertiesOverlay.dtd) locale/fr/cssproperties/cssproperties.dtd (locale/fr/cssproperties.dtd) locale/fr/cssproperties/editGridTemplate.dtd (locale/fr/editGridTemplate.dtd) locale/fr/cssproperties/backgrounditem.dtd (locale/fr/backgrounditem.dtd) locale/fr/cssproperties/griditemposition.dtd (locale/fr/griditemposition.dtd) locale/fr/cssproperties/transformationitem.dtd (locale/fr/transformationitem.dtd) locale/fr/cssproperties/transitionitem.dtd (locale/fr/transitionitem.dtd) locale/fr/cssproperties/textshadowitem.dtd (locale/fr/textshadowitem.dtd) locale/fr/cssproperties/colorstopitem.dtd (locale/fr/colorstopitem.dtd) locale/fr/cssproperties/backgrounditem.properties (locale/fr/backgrounditem.properties) locale/fr/cssproperties/cssproperties.properties (locale/fr/cssproperties.properties) locale/fr/cssproperties/fontFeatures.properties (locale/fr/fontFeatures.properties) ================================================ FILE: locales/fr/domexplorer.mn ================================================ bluegriffon-fr.jar: % locale domexplorer fr %locale/fr/domexplorer/ locale/fr/domexplorer/domexplorerOverlay.dtd (locale/fr/domexplorerOverlay.dtd) locale/fr/domexplorer/domexplorer.dtd (locale/fr/domexplorer.dtd) ================================================ FILE: locales/fr/fs.mn ================================================ fs-fr.jar: % locale fs fr %locale/fr/fs/ locale/fr/fs/fsOverlay.dtd (locale/fr/fsOverlay.dtd) locale/fr/fs/fs.dtd (locale/fr/fs.dtd) locale/fr/fs/fs.properties (locale/fr/fs.properties) locale/fr/fs/addFont.dtd (locale/fr/addFont.dtd) ================================================ FILE: locales/fr/gfd.mn ================================================ gfd-fr.jar: % locale gfd fr %locale/fr/gfd/ locale/fr/gfd/gfdOverlay.dtd (locale/fr/gfdOverlay.dtd) locale/fr/gfd/gfd.dtd (locale/fr/gfd.dtd) locale/fr/gfd/addFont.dtd (locale/fr/addFont.dtd) ================================================ FILE: locales/fr/its20.mn ================================================ bluegriffon-fr.jar: % locale its20 fr %locale/fr/its20/ locale/fr/its20/its20Overlay.dtd (locale/fr/its20Overlay.dtd) locale/fr/its20/its20.properties (locale/fr/its20.properties) locale/fr/its20/its20.dtd (locale/fr/its20.dtd) locale/fr/its20/translateRule.dtd (locale/fr/translateRule.dtd) locale/fr/its20/locNoteRule.dtd (locale/fr/locNoteRule.dtd) locale/fr/its20/termRule.dtd (locale/fr/termRule.dtd) locale/fr/its20/selector.dtd (locale/fr/selector.dtd) ================================================ FILE: locales/fr/markdown.mn ================================================ markdown-fr.jar: % locale markdown fr %locale/fr/markdown/ locale/fr/markdown/markdownOverlay.dtd (locale/fr/markdownOverlay.dtd) locale/fr/markdown/markdown.dtd (locale/fr/markdown.dtd) ================================================ FILE: locales/fr/op1.mn ================================================ op1-fr.jar: % locale op1 fr %locale/fr/op1/ locale/fr/op1/op1Overlay.dtd (locale/fr/op1Overlay.dtd) locale/fr/op1/op1.dtd (locale/fr/op1.dtd) locale/fr/op1/a11yFirstStep.properties (locale/fr/a11yFirstStep.properties) ================================================ FILE: locales/fr/scripteditor.mn ================================================ bluegriffon-fr.jar: % locale scripteditor fr %locale/fr/scripteditor/ locale/fr/scripteditor/scripteditorOverlay.dtd (locale/fr/scripteditorOverlay.dtd) locale/fr/scripteditor/scripteditor.dtd (locale/fr/scripteditor.dtd) locale/fr/scripteditor/scripteditor.properties (locale/fr/scripteditor.properties) locale/fr/scripteditor/editor.dtd (locale/fr/editor.dtd) ================================================ FILE: locales/fr/stylesheets.mn ================================================ bluegriffon-fr.jar: % locale stylesheets fr %locale/fr/stylesheets/ locale/fr/stylesheets/stylesheetsOverlay.dtd (locale/fr/stylesheetsOverlay.dtd) locale/fr/stylesheets/stylesheets.dtd (locale/fr/stylesheets.dtd) locale/fr/stylesheets/editor.dtd (locale/fr/editor.dtd) ================================================ FILE: locales/fr/tipoftheday.mn ================================================ tipoftheday-fr.jar: % locale tipoftheday fr %locale/fr/tipoftheday/ locale/fr/tipoftheday/tipoftheday.dtd (locale/fr/tipoftheday.dtd) locale/fr/tipoftheday/tipofthedayOverlay.dtd (locale/fr/tipofthedayOverlay.dtd) locale/fr/tipoftheday/tipoftheday.rdf (locale/fr/tipoftheday.rdf) ================================================ FILE: locales/gl/aria.mn ================================================ bluegriffon-gl.jar: % locale aria gl %locale/gl/aria/ locale/gl/aria/ariaOverlay.dtd (locale/gl/ariaOverlay.dtd) locale/gl/aria/aria.dtd (locale/gl/aria.dtd) locale/gl/aria/aria.properties (locale/gl/aria.properties) ================================================ FILE: locales/gl/base.mn ================================================ bluegriffon-gl.jar: % locale bluegriffon gl %locale/gl/bluegriffon/ % locale branding gl %locale/gl/branding/ locale/gl/bluegriffon/aboutDialog.dtd (locale/gl/bluegriffon/aboutDialog.dtd) locale/gl/bluegriffon/bluegriffon.dtd (locale/gl/bluegriffon/bluegriffon.dtd) locale/gl/bluegriffon/polyglot.dtd (locale/gl/bluegriffon/polyglot.dtd) locale/gl/bluegriffon/findbar.dtd (locale/gl/bluegriffon/findbar.dtd) locale/gl/bluegriffon/bluegriffon.properties (locale/gl/bluegriffon/bluegriffon.properties) locale/gl/bluegriffon/colourPicker.dtd (locale/gl/bluegriffon/colourPicker.dtd) locale/gl/bluegriffon/credits.dtd (locale/gl/bluegriffon/credits.dtd) locale/gl/bluegriffon/filepickerbutton.dtd (locale/gl/bluegriffon/filepickerbutton.dtd) locale/gl/bluegriffon/filePicking.dtd (locale/gl/bluegriffon/filePicking.dtd) locale/gl/bluegriffon/insertTable.dtd (locale/gl/bluegriffon/insertTable.dtd) locale/gl/bluegriffon/insertTable.properties (locale/gl/bluegriffon/insertTable.properties) locale/gl/bluegriffon/language.properties (locale/gl/bluegriffon/language.properties) locale/gl/bluegriffon/languages.dtd (locale/gl/bluegriffon/languages.dtd) locale/gl/bluegriffon/markupCleaner.dtd (locale/gl/bluegriffon/markupCleaner.dtd) locale/gl/bluegriffon/openLocation.dtd (locale/gl/bluegriffon/openLocation.dtd) locale/gl/bluegriffon/openLocation.properties (locale/gl/bluegriffon/openLocation.properties) locale/gl/bluegriffon/newPageWizard.dtd (locale/gl/bluegriffon/newPageWizard.dtd) locale/gl/bluegriffon/newPageWizard.properties (locale/gl/bluegriffon/newPageWizard.properties) locale/gl/bluegriffon/propertiesDeck.dtd (locale/gl/bluegriffon/propertiesDeck.dtd) locale/gl/bluegriffon/aria.dtd (locale/gl/bluegriffon/aria.dtd) locale/gl/bluegriffon/structurebar.dtd (locale/gl/bluegriffon/structurebar.dtd) locale/gl/bluegriffon/tabeditor.dtd (locale/gl/bluegriffon/tabeditor.dtd) locale/gl/bluegriffon/masterPasswordQuery.properties (locale/gl/bluegriffon/masterPasswordQuery.properties) locale/gl/bluegriffon/newDocument.dtd (locale/gl/bluegriffon/newDocument.dtd) locale/gl/bluegriffon/prefs/file.dtd (locale/gl/bluegriffon/prefs/file.dtd) locale/gl/bluegriffon/prefs/source.dtd (locale/gl/bluegriffon/prefs/source.dtd) locale/gl/bluegriffon/prefs/general.dtd (locale/gl/bluegriffon/prefs/general.dtd) locale/gl/bluegriffon/prefs/newPage.dtd (locale/gl/bluegriffon/prefs/newPage.dtd) locale/gl/bluegriffon/prefs/update.dtd (locale/gl/bluegriffon/prefs/update.dtd) locale/gl/bluegriffon/prefs/styles.dtd (locale/gl/bluegriffon/prefs/styles.dtd) locale/gl/bluegriffon/prefs/advanced.dtd (locale/gl/bluegriffon/prefs/advanced.dtd) locale/gl/bluegriffon/prefs/connection.dtd (locale/gl/bluegriffon/prefs/connection.dtd) locale/gl/bluegriffon/prefs/osx.dtd (locale/gl/bluegriffon/prefs/osx.dtd) locale/gl/bluegriffon/prefs/shortcuts.dtd (locale/gl/bluegriffon/prefs/shortcuts.dtd) locale/gl/bluegriffon/prefs/update.properties (locale/gl/bluegriffon/prefs/update.properties) locale/gl/bluegriffon/prefs/license.dtd (locale/gl/bluegriffon/prefs/license.dtd) locale/gl/bluegriffon/prefs/license.properties (locale/gl/bluegriffon/prefs/license.properties) locale/gl/bluegriffon/prefs/deactivateLicense.dtd (locale/gl/bluegriffon/prefs/deactivateLicense.dtd) locale/gl/bluegriffon/prefs.dtd (locale/gl/bluegriffon/prefs.dtd) locale/gl/bluegriffon/updateAvailable.dtd (locale/gl/bluegriffon/updateAvailable.dtd) locale/gl/bluegriffon/updates.properties (locale/gl/bluegriffon/updates.properties) locale/gl/branding/brand.dtd (locale/gl/branding/brand.dtd) locale/gl/branding/brand.properties (locale/gl/branding/brand.properties) locale/gl/bluegriffon/insertImage.dtd (locale/gl/bluegriffon/insertImage.dtd) locale/gl/bluegriffon/insertAnchor.dtd (locale/gl/bluegriffon/insertAnchor.dtd) locale/gl/bluegriffon/insertCommentOrPI.dtd (locale/gl/bluegriffon/insertCommentOrPI.dtd) locale/gl/bluegriffon/insertLink.dtd (locale/gl/bluegriffon/insertLink.dtd) locale/gl/bluegriffon/insertLink.properties (locale/gl/bluegriffon/insertLink.properties) locale/gl/bluegriffon/cssClassPicker.dtd (locale/gl/bluegriffon/cssClassPicker.dtd) locale/gl/bluegriffon/insertVideo.dtd (locale/gl/bluegriffon/insertVideo.dtd) locale/gl/bluegriffon/insertAudio.dtd (locale/gl/bluegriffon/insertAudio.dtd) locale/gl/bluegriffon/insertVideo.properties (locale/gl/bluegriffon/insertVideo.properties) locale/gl/bluegriffon/insertHTML.dtd (locale/gl/bluegriffon/insertHTML.dtd) locale/gl/bluegriffon/insertHR.dtd (locale/gl/bluegriffon/insertHR.dtd) locale/gl/bluegriffon/insertForm.dtd (locale/gl/bluegriffon/insertForm.dtd) locale/gl/bluegriffon/parsingError.dtd (locale/gl/bluegriffon/parsingError.dtd) locale/gl/bluegriffon/insertFormInput.dtd (locale/gl/bluegriffon/insertFormInput.dtd) locale/gl/bluegriffon/insertFieldset.dtd (locale/gl/bluegriffon/insertFieldset.dtd) locale/gl/bluegriffon/insertLabel.dtd (locale/gl/bluegriffon/insertLabel.dtd) locale/gl/bluegriffon/insertButton.dtd (locale/gl/bluegriffon/insertButton.dtd) locale/gl/bluegriffon/insertSelect.dtd (locale/gl/bluegriffon/insertSelect.dtd) locale/gl/bluegriffon/insertTextarea.dtd (locale/gl/bluegriffon/insertTextarea.dtd) locale/gl/bluegriffon/insertKeygen.dtd (locale/gl/bluegriffon/insertKeygen.dtd) locale/gl/bluegriffon/insertOutput.dtd (locale/gl/bluegriffon/insertOutput.dtd) locale/gl/bluegriffon/insertProgress.dtd (locale/gl/bluegriffon/insertProgress.dtd) locale/gl/bluegriffon/insertMeter.dtd (locale/gl/bluegriffon/insertMeter.dtd) locale/gl/bluegriffon/insertStylesheet.dtd (locale/gl/bluegriffon/insertStylesheet.dtd) locale/gl/bluegriffon/editStylesheet.dtd (locale/gl/bluegriffon/editStylesheet.dtd) locale/gl/bluegriffon/media.dtd (locale/gl/bluegriffon/media.dtd) locale/gl/bluegriffon/media.properties (locale/gl/bluegriffon/media.properties) locale/gl/bluegriffon/insertChars.dtd (locale/gl/bluegriffon/insertChars.dtd) locale/gl/bluegriffon/convertToTable.dtd (locale/gl/bluegriffon/convertToTable.dtd) locale/gl/bluegriffon/pageProperties.dtd (locale/gl/bluegriffon/pageProperties.dtd) locale/gl/bluegriffon/spellCheck.dtd (locale/gl/bluegriffon/spellCheck.dtd) locale/gl/bluegriffon/spellCheck.properties (locale/gl/bluegriffon/spellCheck.properties) locale/gl/bluegriffon/dictionary.dtd (locale/gl/bluegriffon/dictionary.dtd) locale/gl/bluegriffon/html5.properties (locale/gl/bluegriffon/html5.properties) locale/gl/bluegriffon/listProperties.dtd (locale/gl/bluegriffon/listProperties.dtd) locale/gl/bluegriffon/insertTOC.dtd (locale/gl/bluegriffon/insertTOC.dtd) locale/gl/bluegriffon/svg-edit.properties (locale/gl/bluegriffon/svg-edit.properties) locale/gl/bluegriffon/panels.dtd (locale/gl/bluegriffon/panels.dtd) locale/gl/bluegriffon/rotator.dtd (locale/gl/bluegriffon/rotator.dtd) ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/aboutDialog.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/aria.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/bluegriffon.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/bluegriffon.properties ================================================ titleModifier=BlueGriffon # in the following string, %t represents the title of the page or its URL # and %b the titleModifier above titleFormat=%S - %S Unknown=[Descoñecido] NoClassAvailable=(sen clase) NoIdAvailable=(sen ID) DocumentTitle=Título da páxina NeedDocTitle=Introduza o título da páxina actual. DocTitleHelp=Así identifícase a páxina no título da xanela e nos marcadores. ExportToText=Exportar a texto SaveDocumentAs=Gardar páxina como XHTMLfiles=Ficheiros XHTML untitled=sen título SaveDocument=Gardar páxina SaveFileFailed=Produciuse un fallo ao gardar o ficheiro! ExportToText=Exportar a texto FileNotSaved=Non se gardou o ficheiro! SaveFileBeforeClosing=Quere gardar o ficheiro antes de pechar esta lapela? YesSaveFile=Si, gardalo NoDiscardChanges=Non, rexeitar as modificacións DontCloseTab=Non pechar a lapela! IdAlreadyTaken=Ese ID xa está en uso no documento RemoveIdFromElement=Quere retirar o ID do elemento movéndoo ou cancelar a acción? YesRemoveId=Retirar o ID NoCancel=Cancelar ReplaceAll=Substituír todo... ReplacedPart1=Substituído ReplacedPart2=ocorrencia AFileWasChanged=Cambiouse un ficheiro no disco ReloadFile=Cambiouse o ficheiro %S no disco, debe recargar o BlueGriffon. DontAskForFileChangesAgain=non amosar este aviso outra vez AbandonChanges=Abandonar as modificacións de "%title%" non gardadas e cargar de novo a páxina? RevertCaption=Volver aos últimos gardados HTMLCommentsInXHTMLTitle=HTML comment inside a

      O texto normal terá esta aparencia!

      As ligazóns visitadas terán esta aparencia!

      As ligazóns activas terán esta aparencia!

      ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/panels.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/parsingError.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/polyglot.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/prefs/advanced.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/prefs/connection.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/prefs/deactivateLicense.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/prefs/file.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/prefs/general.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/prefs/license.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/prefs/license.properties ================================================ activateWarning=BlueGriffon needs to restart to activate your license. Do you want to restart now? confirmRestart=Restart BlueGriffon? fullResetTitle=License activation reset fullResetErrorLabel=Impossible to perform the operation, a network error occurred. fullResetRequested=A reset link was sent to the owner of the license/transaction. BlueGriffon must now restart. fullResetInvalid=The transaction ID is invalid. ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/prefs/newPage.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/prefs/osx.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.properties ================================================ NoMainWindowAvaialble=Non é posíbel editar os atallos de teclado PleaseOpenOneMainWindow=Polo menos unha xanela principal do BlueGriffon debe estar aberta para modificar os atallos de teclado. ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/prefs/source.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/prefs/styles.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/prefs/update.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/prefs/update.properties ================================================ SoftwareUpdates=Actualizacións de software UnableToCheck=Foi imposíbel comprobar a dispoñibilidade UpToDate=BlueGriffon está actualizado ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/prefs.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/propertiesDeck.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/rotator.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/spellCheck.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/spellCheck.properties ================================================ CorrectSpelling=(ortografía correcta) NoSuggestedWords=(sen palabras suxeridas) NoMisspelledWord=Ningunha palabra mal ortografada CheckSpellingDone=Rematou a revisión ortográfica. CheckSpelling=Corrección ortográfica ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/structurebar.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/svg-edit.properties ================================================ SvgEdit=Editor SVG ConfirmClose=Hai cambios sen gardar, realmente quere pechar o editor SVG? ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/tabeditor.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/updateAvailable.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/base/locale/bluegriffon/updates.properties ================================================ update.checkInsideButton.label=Buscar actualizacións update.checkInsideButton.accesskey=C update.resumeButton.label=Continuar descargando %S… update.resumeButton.accesskey=D update.openUpdateUI.applyButton.label=Aplicar actualización… update.openUpdateUI.applyButton.accesskey=A update.restart.applyButton.label=Aplicar actualización update.restart.applyButton.accesskey=A update.openUpdateUI.upgradeButton.label=Anovar agora… update.openUpdateUI.upgradeButton.accesskey=v update.restart.upgradeButton.label=Anovar agora update.restart.upgradeButton.accesskey=v ================================================ FILE: locales/gl/bluegriffon/base/locale/branding/brand.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/base/locale/branding/brand.properties ================================================ brandShortName=BlueGriffon brandFullName=BlueGriffon vendorShortName=Disruptive Innovations sidebarName=Barra lateral ================================================ FILE: locales/gl/bluegriffon/extensions/fs/addFont.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/extensions/fs/fs.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/extensions/fs/fs.properties ================================================ SelectDir=Seleccione un cartafol para descomprimir o paquete de tipos de letra SelectFile=Seleccione unha folla de estilo .css para un paquete existente de tipos de letra Stylesheet=Folla de estilo dun paquete de FontSquirrel MustBeSavedTitle=Nunca se gardou o documento MustBeSavedMessage=Debe gardar o ficheiro polo menos unha vez antes de tentar ligar un tipo de letra local usando un URL relativo. Peche o documento e volve abrilo despois de gardalo. ================================================ FILE: locales/gl/bluegriffon/extensions/fs/fsOverlay.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/extensions/gfd/addFont.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/extensions/gfd/gfd.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/extensions/gfd/gfdOverlay.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/extensions/markdown/markdown.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/extensions/markdown/markdownOverlay.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/extensions/op1/a11yFirstStep.properties ================================================ ConformingDTDSyntax=Use a W3C-conforming DTD syntax before the html element NoWrongSyntaxOrNonConformingHierarchy=Don't use wrong attribute syntax or non-conforming element hierarchy inside the html element OneTitleInHead=Use a title element as a child of the head element NoEmptyTitle=When you provide a title element, do not leave it empty NoMetaRefresh=Don't use a meta element with an http-equiv attribute and a value equal to refresh HTMLElementHasLangAttribute=Use the lang attribute for the html element HTMLElementHasValidLangAttribute=Use a valid language code for the lang attribute NoInvalidDir=Don't use a value other than ltr, rtl or empty for the dir attribute TitleForFrames=Use the title attribute for every frame element NoEmptyTitleForFrames=When you provide a title attribute for a frame element, do not leave it empty TitleForIFrames=Use the title attribute for every iframe element NoEmptyTitleForIFrames=When you provide a title attribute for an iframe element, do not leave it empty AtLeastOneH1InBody=There must be at least one h1 element inside (at any level) the body element NoEmptyH1=When you provide a h1 element, do not leave it empty NoEmptyH2=When you provide a h2 element, do not leave it empty NoEmptyH3=When you provide a h3 element, do not leave it empty NoEmptyH4=When you provide a h4 element, do not leave it empty NoEmptyH5=When you provide a h5 element, do not leave it empty NoEmptyH6=When you provide a h6 element, do not leave it empty H2Order=Use  a h1, h2, h3, h4, h5 or h6 element as a first heading before a h2 element in the source order H3Order=Use a h2, h3, h4, h5 or h6 element as a first heading before a h3 element in the source order H4Order=Use a h3, h4, h5 or h6 element as a first heading before a h4 element in the source order H5Order=Use a h4, h5 or h6 element as a first heading before a h5 element in the source order H6Order=Use a h5 or h6 element as a first heading before a h6 element in the source order DTAsFirstChildOfDL=Use a dt element as the first child of a dl element NoEmptyLI=When you provide a li element, do not leave it empty NoAlignAttribute=Don't use the align attribute NoXmpElement=Don't use the xmp element NoEmptyP=When you provide a p element, do not leave it empty NoEmptyAExceptAnchors=When you provide an a element, do not leave it empty except if it is used as an anchor NoEmptyButton=When you provide a button element, do not leave it empty NoVlinkAttribute=Don't use the vlink attribute NoTextAttribute=Don't use the text attribute NoLinkAttribute=Don't use the link attribute noImgWithoutAlt=Use the alt attribute for every img element noAreaWithoutAlt=Use the alt attribute for every area element noAppletWithoutAlt=Use the alt attribute for every applet element noImageInputWithoutAlt=Use the alt attribute for every input type=image element noEmptyAltForImageLoneChildOfAnchorOrButton=If the img element is the only child of a button or an a element, do not leave its alt attribute empty noEmptyAltForInputImage=When you provide an alt attribute for an input type=image element, do not leave it empty noEmptyAltForAreaWithHref=When you provide an alt attribute for an area element holding an href attribute, do not leave it empty noAltSimilarToTextContent=If an img element is a child of an a element with text, do not use the same text for its alt attribute as the text inside the a element noBorderAttribute=Don't use the border attribute noSimilarAltForAreasWithDifferentHref=Don't use the same value for alt attributes for multiple area elements with different href values LongdescIsURI=Use a URI as the value for a longdesc attribute noBackgroundAttribute=Don't use the background attribute noBgsoundElement=Don't use the bgsound element TablesWithAtLeastOneTHHaveACaption=Use a caption element as the first child of a table element containing at least one th element CaptionIsDifferentFromSummaryAttribute=Don't use the same content for a caption element and a summary attribute noEmptyCaption=When you provide a caption element, do not leave it empty noCaptionInATableWithOnlyTDs=Don't use a caption element in a table element containing only td elements noAlinkAttribute=Don't use an alink attribute noSummaryAttributeSimilarToCaption=Don't use the same content for a summary attribute and a caption element noEmptySummaryIfTableHasTHOrCaption=When you provide a summary attribute for a table element containing a th or a caption element, do not leave it empty noSummaryAttributeIfOnlyTDs=Don't use a summary attribute on a table element containg only td elements noStrikeElement=Don't use the strike element noListingElement=Don't use the listing element AtLeastOneTHIfCaptionOrSummary=Use at least one th element inside a table element with a caption element or a non-empty summary attribute AllNonEmptyTHHaveScopeOrId=Use a scope or id attribute for every non-empty th element ScopeAttributeIsRowOrCol=Don't use a value other than row or col for the scope attribute noBgcolorAttribute=Don't use the bgcolor attribute noTTElement=Don't use the tt element TDHaveHeadersAttributeIfTHHasId=Use a headers attribute on every td element if the corresponding th element has an id attribute noPlaintextElement=Don't use the plaintext element noHeadersAttributeThatIsNotATHId=Don't use for a headers attribute a value which matches an id attribute used for a td of the table element AllFormsHaveAButton=Use a button, or an input of type submit, image or button inside a form element SubmitButtonsHaveNonEmptyValue=When you provide an input type=submit, do not leave its value attribute empty noMarqueeElement=Don't use the marquee element FieldsetHasALegend=Use a legend element as a child of every fieldset element FieldsetsAreInForms=Don't use a fieldset element without a form element noEmptyLegendElement=When you provide a legend element, do not leave it empty LabelElementHasForAttribute=Use the for attribute for every label element noEmptyForAttributeOnLabel=When you provide a for attribute for a label element, do not leave it empty ForAttributeMatchesAnIdInSameForm=A for attribute must have a value that matches an id attribute inside the form element OptgroupElementHasALabel=Use the label attribute for every optgroup element NoSimilarLabelInOptgroupsOfSameSelect=Don't use the same label attribute for different optgroup elements of the same select element noEmptyLabelAttributeOnOptgroup=When you provide a label attribute for an optgroup element, do not leave it empty noBasefontElement=Don't use the basefont element noBlinkElement=Don't use the blink element noCenterElement=Don't use the center element noFontElement=Don't use the font element ================================================ FILE: locales/gl/bluegriffon/extensions/op1/op1.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/extensions/op1/op1Overlay.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/extensions/tipoftheday/tipoftheday.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/extensions/tipoftheday/tipoftheday.rdf ================================================ %brandDTD; ]> Consellos do &brandShortName; http://bluegriffon.org/ Arquivo de consellos do día do &brandShortName; gl …&brandShortName; é mulitplataforma? …&brandShortName; existe para unha ampla variedade de sistemas operativos incluíndo Windows, Mac OS X e moitas versións de Linux, OS/2 … …&brandShortName; amosa o título das páxinas sen gardar co texto sombreado en vermello? Agora pode gardar os ficheiros en calquera modo de visualización. …pode acceder directamente á comunidade do &brandShortName;? So ten que seleccionar "Axuda > Comunidade de usuarios". …pode inserir elementos HTML5 facilmente? Seleccione "Inserir > Elemento HTML5". …pode pechar a lapela actual cunha combinación de teclas? A combinación Control+w (Comando+w en Mac OS X) pechará a lapela actual. …pode crear unha nova lapela coa combinación de teclas? A combinación Control+n (Comando+n en Mac OS X) creará unha nova lapela en branco usando o mesmo tipo de documento ca última páxina creada. …you can revert to a previously saved version of the currently edited document? Righ-click (context-click on Mac OS X) on the document's tab and select the Revert menu. …pode publicar páxinas directamente desde o &brandShortName; Primeiro instale o complemento libre FireFTP e configúreo. Logo estará dispoñíbel no menú Ferramentas. …&brandShortName; pode inserir calquera carácter facilmente? Use "Inserir caracteres e símbolos". Logo busque calquera carácter Unicode polo nome ou abra un bloque para a inspección. …&brandShortName; executa o corrector ortográfico automaticamente? Prema co botón dereito nunha palabra para atopar suxestións. Active ou desactive o corrector ortográfico en "Ferramentas > Preferencias > Xeral". …&brandShortName; permítelle seleccionar facilmente un elemento? Prema no seu nome na barra de estrutura. …pode mover un elemento no documento usando o rato? Primeiro seleccióneo na barra de estrutura e logo arrástreo a onde o necesite. …pode abrir páxinas existentes rapidamente? O complemento de pago Xestor do proxecto permítelle acceso instantáneo ás páxinas e ás imaxes que se organizan como un proxecto. …pode escoller o navegador predeterminado? Use "Ferramentas > Preferencias > Avanzadas > Restabelecer a configuración do navegador externo". A próxima vez que navegue pode escoller un navegador. …&brandShortName; permítelle usar follas de estilo externas? Prema en "Paneis > Follas de estilo" para crear unha preparada para usar. Prema no símbolo máis e seleccione "Ligada ao documento". …&brandShortName; pode xestionar follas de estilo e selectores complexos? Ao usar o complemento Editor Pro CSS (un complemento comercial), pode manipular follas de estilo complexas e os selectores CSS 2 e CSS 3 mediante unha interface gráfica avanzada. …pode cambiar o tamaño dos paneis? Arrastre o deslizador na esquina inferior dereita ata o tamaño necesario. …os atributos poden engadirse a calquera elemento? Abrir "Paneis > Explorador DOM". Na vista visual prema no elemento, seleccione usar a lapela dos atributos e prema no símbolo máis. …&brandShortName; pode xestionar as propiedades CSS3? Engadíranse os prefixos dos provedores para os navegadores que os precisen. …pode personalizar os atallos de teclado? Pode asignarlle unha tecla específica a calquera elemento do menú. Abrir "Ferramentas > Preferencias > Atallos de teclado". Atope o botón ou a orde que desexe modificar e faga dobre clic sobre ela. Na nova xanela prema a tecla para ese atallo. …pode retirar unha clase dun elemento? Sitúe o cursor sobre este elemento para seleccionalo e use o menú da caixa de combinación de clases para quitar a clase. ================================================ FILE: locales/gl/bluegriffon/extensions/tipoftheday/tipofthedayOverlay.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/sidebars/aria/aria.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/sidebars/aria/aria.properties ================================================ mustBeContainedIn=must be contained in or= or ok=OK mustContain=must contain and= and deprecated=deprecated missingTextbox=missing textbox missingListboxTreeGridDialog=missing listbox, tree, grid or dialog ================================================ FILE: locales/gl/bluegriffon/sidebars/aria/ariaOverlay.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/sidebars/cssproperties/backgrounditem.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/sidebars/cssproperties/backgrounditem.properties ================================================ backgroundColorTitle=Cor backgroundImageTitle=Imaxe backgroundLinearGradientTitle=Degradado lineal backgroundRadialGradientTitle=Degradado radial ================================================ FILE: locales/gl/bluegriffon/sidebars/cssproperties/colorstopitem.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/sidebars/cssproperties/cssproperties.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/sidebars/cssproperties/cssproperties.properties ================================================ EnterAnId=Introduza un ID EnterUniqueId=Debe asignar un ID único ao elemento NoClasSelected=Debe seleccionar un nome de clase PleaseSelectAClass=Cómpre seleccionar unha clase para aplicar os cambios solicitados ================================================ FILE: locales/gl/bluegriffon/sidebars/cssproperties/csspropertiesOverlay.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/sidebars/cssproperties/editGridTemplate.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/sidebars/cssproperties/fontFeatures.properties ================================================ FFaalt=Access all alternates FFcalt=Contextual alternates FFsalt=Stylistic alternates FFliga=Standard ligatures FFclig=Contextual ligatures FFdlig=Discretionary ligatures FFhist=Historical forms FFhlig=Historical ligatures FFunic=Unicase FFsmcp=Small capitals FFc2sc=Small capitals from capitals FFc2pc=Petite capitals from capitals FFpcap=Petite capitals FFcase=Case sensitive forms FFcpsp=Capital spacing FFtitl=Titling FFswsh=Swash FFcswh=Contextual swash FFfrac=Fractions FFafrc=Alternative fractions FFordn=Ordinals FFnumr=Numerators FFdnom=Denominators FFsinf=Scientific inferiors FFsups=Superscript FFsubs=Subscript FFonum=Oldstyle figures FFlnum=Lining Figures FFpnum=Proportional figures FFtnum=Tabular figures FFzero=Slashed zero FFmgrk=Mathematical greek FFnalt=Alternate annotation forms FFornm=Ornaments FFlocl=Localized forms FFsize=Optical size FFisol=Isolated forms FFinit=Initial forms FFmedi=Medial forms FFfinal=Final forms FFrlig=Requird ligatures FFccmp=Glyph composition/decomposition FFmark=Mark to base positioning FFmkmj=Mark to mark positioning FFhwid=Half widths ================================================ FILE: locales/gl/bluegriffon/sidebars/cssproperties/griditemposition.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/sidebars/cssproperties/textshadowitem.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/sidebars/cssproperties/transformationitem.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/sidebars/cssproperties/transitionitem.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/sidebars/domexplorer/domexplorer.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/sidebars/domexplorer/domexplorerOverlay.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/sidebars/its20/its20.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/sidebars/its20/its20.properties ================================================ LoadError=Load Error InlineParseError=Inline resource is not an ITS 2.0 document CannotFetch=Cannot fetch URL NotITS=Resource is not an ITS 2.0 document TranslatableByGlobalRule=Translatable by global rule NotTranslatableByGlobalRule=Not translatable by global rule InlineRules=Inline rules translateRule=Translate locNoteRule=Localization Note termRule=Terminology dirRule=Directionality langRule=Language Information withinTextRule=Elements Within Text domainRule=Domain textAnalysisRule=Text Analysis localeFilterRule=Locale Filter provRule=Provenance externalResourceRefRule=External Resource targetPointerRule=Target Pointer idValueRule=Id Value preserveSpaceRule=Preserve Space locQualityIssueRule=Localization Quality Issue mtConfidenceRule=Machine-Translation Confidence allowedCharactersRule=Allowed Characters storageSizeRule=Storage Size DontWarnAgainForUrl=Don't warn me again about this URL DontWarnAgainForInline=Don't warn me again about inline global rules NewITSFile=New ITS 2.0 File CannotResolveXPath=Cannot resolve the following XPath selector (undeclared HTML namespace?): XPathParsingError=XPath Parsing Error DontWarnAgainForSelector=Don't warn me again about this selector CSSParsingError=CSS Parsing Error CannotResolveCSS=Cannot resolve the following CSS selector: ================================================ FILE: locales/gl/bluegriffon/sidebars/its20/its20Overlay.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/sidebars/its20/locNoteRule.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/sidebars/its20/selector.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/sidebars/its20/termRule.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/sidebars/its20/translateRule.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/sidebars/scripteditor/editor.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/sidebars/scripteditor/scripteditor.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/sidebars/scripteditor/scripteditor.properties ================================================ ConfirmDeletionTitle=Eliminar un script ConfirmDeletion=Está seguro de que quere eliminar este script? AddExternalScriptTitle=Engadir un script externo PromptScriptURL=Cal é o URL do script? ================================================ FILE: locales/gl/bluegriffon/sidebars/scripteditor/scripteditorOverlay.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/sidebars/stylesheets/editor.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/sidebars/stylesheets/stylesheets.dtd ================================================ ================================================ FILE: locales/gl/bluegriffon/sidebars/stylesheets/stylesheetsOverlay.dtd ================================================ ================================================ FILE: locales/gl/cssproperties.mn ================================================ bluegriffon-gl.jar: % locale cssproperties gl %locale/gl/cssproperties/ locale/gl/cssproperties/csspropertiesOverlay.dtd (locale/gl/csspropertiesOverlay.dtd) locale/gl/cssproperties/cssproperties.dtd (locale/gl/cssproperties.dtd) locale/gl/cssproperties/editGridTemplate.dtd (locale/gl/editGridTemplate.dtd) locale/gl/cssproperties/backgrounditem.dtd (locale/gl/backgrounditem.dtd) locale/gl/cssproperties/griditemposition.dtd (locale/gl/griditemposition.dtd) locale/gl/cssproperties/transformationitem.dtd (locale/gl/transformationitem.dtd) locale/gl/cssproperties/transitionitem.dtd (locale/gl/transitionitem.dtd) locale/gl/cssproperties/textshadowitem.dtd (locale/gl/textshadowitem.dtd) locale/gl/cssproperties/colorstopitem.dtd (locale/gl/colorstopitem.dtd) locale/gl/cssproperties/backgrounditem.properties (locale/gl/backgrounditem.properties) locale/gl/cssproperties/cssproperties.properties (locale/gl/cssproperties.properties) locale/gl/cssproperties/fontFeatures.properties (locale/gl/fontFeatures.properties) ================================================ FILE: locales/gl/domexplorer.mn ================================================ bluegriffon-gl.jar: % locale domexplorer gl %locale/gl/domexplorer/ locale/gl/domexplorer/domexplorerOverlay.dtd (locale/gl/domexplorerOverlay.dtd) locale/gl/domexplorer/domexplorer.dtd (locale/gl/domexplorer.dtd) ================================================ FILE: locales/gl/fs.mn ================================================ fs-gl.jar: % locale fs gl %locale/gl/fs/ locale/gl/fs/fsOverlay.dtd (locale/gl/fsOverlay.dtd) locale/gl/fs/fs.dtd (locale/gl/fs.dtd) locale/gl/fs/fs.properties (locale/gl/fs.properties) locale/gl/fs/addFont.dtd (locale/gl/addFont.dtd) ================================================ FILE: locales/gl/gfd.mn ================================================ gfd-gl.jar: % locale gfd gl %locale/gl/gfd/ locale/gl/gfd/gfdOverlay.dtd (locale/gl/gfdOverlay.dtd) locale/gl/gfd/gfd.dtd (locale/gl/gfd.dtd) locale/gl/gfd/addFont.dtd (locale/gl/addFont.dtd) ================================================ FILE: locales/gl/its20.mn ================================================ bluegriffon-gl.jar: % locale its20 gl %locale/gl/its20/ locale/gl/its20/its20Overlay.dtd (locale/gl/its20Overlay.dtd) locale/gl/its20/its20.properties (locale/gl/its20.properties) locale/gl/its20/its20.dtd (locale/gl/its20.dtd) locale/gl/its20/translateRule.dtd (locale/gl/translateRule.dtd) locale/gl/its20/locNoteRule.dtd (locale/gl/locNoteRule.dtd) locale/gl/its20/termRule.dtd (locale/gl/termRule.dtd) locale/gl/its20/selector.dtd (locale/gl/selector.dtd) ================================================ FILE: locales/gl/markdown.mn ================================================ markdown-gl.jar: % locale markdown gl %locale/gl/markdown/ locale/gl/markdown/markdownOverlay.dtd (locale/gl/markdownOverlay.dtd) locale/gl/markdown/markdown.dtd (locale/gl/markdown.dtd) ================================================ FILE: locales/gl/op1.mn ================================================ op1-gl.jar: % locale op1 gl %locale/gl/op1/ locale/gl/op1/op1Overlay.dtd (locale/gl/op1Overlay.dtd) locale/gl/op1/op1.dtd (locale/gl/op1.dtd) locale/gl/op1/a11yFirstStep.properties (locale/gl/a11yFirstStep.properties) ================================================ FILE: locales/gl/scripteditor.mn ================================================ bluegriffon-gl.jar: % locale scripteditor gl %locale/gl/scripteditor/ locale/gl/scripteditor/scripteditorOverlay.dtd (locale/gl/scripteditorOverlay.dtd) locale/gl/scripteditor/scripteditor.dtd (locale/gl/scripteditor.dtd) locale/gl/scripteditor/scripteditor.properties (locale/gl/scripteditor.properties) locale/gl/scripteditor/editor.dtd (locale/gl/editor.dtd) ================================================ FILE: locales/gl/stylesheets.mn ================================================ bluegriffon-gl.jar: % locale stylesheets gl %locale/gl/stylesheets/ locale/gl/stylesheets/stylesheetsOverlay.dtd (locale/gl/stylesheetsOverlay.dtd) locale/gl/stylesheets/stylesheets.dtd (locale/gl/stylesheets.dtd) locale/gl/stylesheets/editor.dtd (locale/gl/editor.dtd) ================================================ FILE: locales/gl/tipoftheday.mn ================================================ tipoftheday-gl.jar: % locale tipoftheday gl %locale/gl/tipoftheday/ locale/gl/tipoftheday/tipoftheday.dtd (locale/gl/tipoftheday.dtd) locale/gl/tipoftheday/tipofthedayOverlay.dtd (locale/gl/tipofthedayOverlay.dtd) locale/gl/tipoftheday/tipoftheday.rdf (locale/gl/tipoftheday.rdf) ================================================ FILE: locales/he/aria.mn ================================================ bluegriffon-he.jar: % locale aria he %locale/he/aria/ locale/he/aria/ariaOverlay.dtd (locale/he/ariaOverlay.dtd) locale/he/aria/aria.dtd (locale/he/aria.dtd) locale/he/aria/aria.properties (locale/he/aria.properties) ================================================ FILE: locales/he/base.mn ================================================ bluegriffon-he.jar: % locale bluegriffon he %locale/he/bluegriffon/ % locale branding he %locale/he/branding/ locale/he/bluegriffon/aboutDialog.dtd (locale/he/bluegriffon/aboutDialog.dtd) locale/he/bluegriffon/bluegriffon.dtd (locale/he/bluegriffon/bluegriffon.dtd) locale/he/bluegriffon/polyglot.dtd (locale/he/bluegriffon/polyglot.dtd) locale/he/bluegriffon/findbar.dtd (locale/he/bluegriffon/findbar.dtd) locale/he/bluegriffon/bluegriffon.properties (locale/he/bluegriffon/bluegriffon.properties) locale/he/bluegriffon/colourPicker.dtd (locale/he/bluegriffon/colourPicker.dtd) locale/he/bluegriffon/credits.dtd (locale/he/bluegriffon/credits.dtd) locale/he/bluegriffon/filepickerbutton.dtd (locale/he/bluegriffon/filepickerbutton.dtd) locale/he/bluegriffon/filePicking.dtd (locale/he/bluegriffon/filePicking.dtd) locale/he/bluegriffon/insertTable.dtd (locale/he/bluegriffon/insertTable.dtd) locale/he/bluegriffon/insertTable.properties (locale/he/bluegriffon/insertTable.properties) locale/he/bluegriffon/language.properties (locale/he/bluegriffon/language.properties) locale/he/bluegriffon/languages.dtd (locale/he/bluegriffon/languages.dtd) locale/he/bluegriffon/markupCleaner.dtd (locale/he/bluegriffon/markupCleaner.dtd) locale/he/bluegriffon/openLocation.dtd (locale/he/bluegriffon/openLocation.dtd) locale/he/bluegriffon/openLocation.properties (locale/he/bluegriffon/openLocation.properties) locale/he/bluegriffon/newPageWizard.dtd (locale/he/bluegriffon/newPageWizard.dtd) locale/he/bluegriffon/newPageWizard.properties (locale/he/bluegriffon/newPageWizard.properties) locale/he/bluegriffon/propertiesDeck.dtd (locale/he/bluegriffon/propertiesDeck.dtd) locale/he/bluegriffon/aria.dtd (locale/he/bluegriffon/aria.dtd) locale/he/bluegriffon/structurebar.dtd (locale/he/bluegriffon/structurebar.dtd) locale/he/bluegriffon/tabeditor.dtd (locale/he/bluegriffon/tabeditor.dtd) locale/he/bluegriffon/masterPasswordQuery.properties (locale/he/bluegriffon/masterPasswordQuery.properties) locale/he/bluegriffon/newDocument.dtd (locale/he/bluegriffon/newDocument.dtd) locale/he/bluegriffon/prefs/file.dtd (locale/he/bluegriffon/prefs/file.dtd) locale/he/bluegriffon/prefs/source.dtd (locale/he/bluegriffon/prefs/source.dtd) locale/he/bluegriffon/prefs/general.dtd (locale/he/bluegriffon/prefs/general.dtd) locale/he/bluegriffon/prefs/newPage.dtd (locale/he/bluegriffon/prefs/newPage.dtd) locale/he/bluegriffon/prefs/update.dtd (locale/he/bluegriffon/prefs/update.dtd) locale/he/bluegriffon/prefs/styles.dtd (locale/he/bluegriffon/prefs/styles.dtd) locale/he/bluegriffon/prefs/advanced.dtd (locale/he/bluegriffon/prefs/advanced.dtd) locale/he/bluegriffon/prefs/connection.dtd (locale/he/bluegriffon/prefs/connection.dtd) locale/he/bluegriffon/prefs/osx.dtd (locale/he/bluegriffon/prefs/osx.dtd) locale/he/bluegriffon/prefs/shortcuts.dtd (locale/he/bluegriffon/prefs/shortcuts.dtd) locale/he/bluegriffon/prefs/update.properties (locale/he/bluegriffon/prefs/update.properties) locale/he/bluegriffon/prefs/license.dtd (locale/he/bluegriffon/prefs/license.dtd) locale/he/bluegriffon/prefs/license.properties (locale/he/bluegriffon/prefs/license.properties) locale/he/bluegriffon/prefs/deactivateLicense.dtd (locale/he/bluegriffon/prefs/deactivateLicense.dtd) locale/he/bluegriffon/prefs.dtd (locale/he/bluegriffon/prefs.dtd) locale/he/bluegriffon/updateAvailable.dtd (locale/he/bluegriffon/updateAvailable.dtd) locale/he/bluegriffon/updates.properties (locale/he/bluegriffon/updates.properties) locale/he/branding/brand.dtd (locale/he/branding/brand.dtd) locale/he/branding/brand.properties (locale/he/branding/brand.properties) locale/he/bluegriffon/insertImage.dtd (locale/he/bluegriffon/insertImage.dtd) locale/he/bluegriffon/insertAnchor.dtd (locale/he/bluegriffon/insertAnchor.dtd) locale/he/bluegriffon/insertCommentOrPI.dtd (locale/he/bluegriffon/insertCommentOrPI.dtd) locale/he/bluegriffon/insertLink.dtd (locale/he/bluegriffon/insertLink.dtd) locale/he/bluegriffon/insertLink.properties (locale/he/bluegriffon/insertLink.properties) locale/he/bluegriffon/cssClassPicker.dtd (locale/he/bluegriffon/cssClassPicker.dtd) locale/he/bluegriffon/insertVideo.dtd (locale/he/bluegriffon/insertVideo.dtd) locale/he/bluegriffon/insertAudio.dtd (locale/he/bluegriffon/insertAudio.dtd) locale/he/bluegriffon/insertVideo.properties (locale/he/bluegriffon/insertVideo.properties) locale/he/bluegriffon/insertHTML.dtd (locale/he/bluegriffon/insertHTML.dtd) locale/he/bluegriffon/insertHR.dtd (locale/he/bluegriffon/insertHR.dtd) locale/he/bluegriffon/insertForm.dtd (locale/he/bluegriffon/insertForm.dtd) locale/he/bluegriffon/parsingError.dtd (locale/he/bluegriffon/parsingError.dtd) locale/he/bluegriffon/insertFormInput.dtd (locale/he/bluegriffon/insertFormInput.dtd) locale/he/bluegriffon/insertFieldset.dtd (locale/he/bluegriffon/insertFieldset.dtd) locale/he/bluegriffon/insertLabel.dtd (locale/he/bluegriffon/insertLabel.dtd) locale/he/bluegriffon/insertButton.dtd (locale/he/bluegriffon/insertButton.dtd) locale/he/bluegriffon/insertSelect.dtd (locale/he/bluegriffon/insertSelect.dtd) locale/he/bluegriffon/insertTextarea.dtd (locale/he/bluegriffon/insertTextarea.dtd) locale/he/bluegriffon/insertKeygen.dtd (locale/he/bluegriffon/insertKeygen.dtd) locale/he/bluegriffon/insertOutput.dtd (locale/he/bluegriffon/insertOutput.dtd) locale/he/bluegriffon/insertProgress.dtd (locale/he/bluegriffon/insertProgress.dtd) locale/he/bluegriffon/insertMeter.dtd (locale/he/bluegriffon/insertMeter.dtd) locale/he/bluegriffon/insertStylesheet.dtd (locale/he/bluegriffon/insertStylesheet.dtd) locale/he/bluegriffon/editStylesheet.dtd (locale/he/bluegriffon/editStylesheet.dtd) locale/he/bluegriffon/media.dtd (locale/he/bluegriffon/media.dtd) locale/he/bluegriffon/media.properties (locale/he/bluegriffon/media.properties) locale/he/bluegriffon/insertChars.dtd (locale/he/bluegriffon/insertChars.dtd) locale/he/bluegriffon/convertToTable.dtd (locale/he/bluegriffon/convertToTable.dtd) locale/he/bluegriffon/pageProperties.dtd (locale/he/bluegriffon/pageProperties.dtd) locale/he/bluegriffon/spellCheck.dtd (locale/he/bluegriffon/spellCheck.dtd) locale/he/bluegriffon/spellCheck.properties (locale/he/bluegriffon/spellCheck.properties) locale/he/bluegriffon/dictionary.dtd (locale/he/bluegriffon/dictionary.dtd) locale/he/bluegriffon/html5.properties (locale/he/bluegriffon/html5.properties) locale/he/bluegriffon/listProperties.dtd (locale/he/bluegriffon/listProperties.dtd) locale/he/bluegriffon/insertTOC.dtd (locale/he/bluegriffon/insertTOC.dtd) locale/he/bluegriffon/svg-edit.properties (locale/he/bluegriffon/svg-edit.properties) locale/he/bluegriffon/panels.dtd (locale/he/bluegriffon/panels.dtd) locale/he/bluegriffon/rotator.dtd (locale/he/bluegriffon/rotator.dtd) ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/aboutDialog.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/aria.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/bluegriffon.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/bluegriffon.properties ================================================ titleModifier=BlueGriffon # in the following string, %t represents the title of the page or its URL # and %b the titleModifier above titleFormat=%S - %S Unknown=[לא ידוע] NoClassAvailable=(ללא class) NoIdAvailable=(ללא ID) DocumentTitle=כותרת דף NeedDocTitle=נא להכניס כותרת לדף הנוכחי. DocTitleHelp=היא מזהה את הדף בכותרת החלון ובסימניות. ExportToText=ייצוא לטקסט SaveDocumentAs=שמירה בתור XHTMLfiles=קבצי XHTML untitled=ללא כותרת SaveDocument=שמירת דף SaveFileFailed=שמירת הקובץ נכשלה! ExportToText=ייצוא לטקסט FileNotSaved=הקובץ לא שמור! SaveFileBeforeClosing=האם לשמור הקובץ לפני סגירת הלשונית? YesSaveFile=כן, לשמור NoDiscardChanges=לא, לנטוש שינויים DontCloseTab=לא לסגור לשונית! IdAlreadyTaken=ה-ID הזה כבר בשימוש במסמך RemoveIdFromElement=האם להסיר את ה-ID מהפריט שכבר נושא אותו או לבטל הפעולה? YesRemoveId=הסרת ה-ID NoCancel=ביטול ReplaceAll=החלפת כולם... ReplacedPart1=הוחלפו ReplacedPart2=מופעים AFileWasChanged=A file was changed on disk ReloadFile=File %S changed on disk, BlueGriffon must reload it DontAskForFileChangesAgain=don't show this alert again AbandonChanges=Abandon unsaved changes to "%title%" and reload page? RevertCaption=Revert To Last Saved HTMLCommentsInXHTMLTitle=HTML comment inside a

      טקסט רגיל ייראה כך !

      קישורים בהם ביקרו ייראו כך !

      קישורים פעילים ייראו כך !

      ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/panels.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/parsingError.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/polyglot.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/prefs/advanced.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/prefs/connection.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/prefs/deactivateLicense.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/prefs/file.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/prefs/general.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/prefs/license.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/prefs/license.properties ================================================ activateWarning=BlueGriffon needs to restart to activate your license. Do you want to restart now? confirmRestart=Restart BlueGriffon? fullResetTitle=License activation reset fullResetErrorLabel=Impossible to perform the operation, a network error occurred. fullResetRequested=A reset link was sent to the owner of the license/transaction. BlueGriffon must now restart. fullResetInvalid=The transaction ID is invalid. ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/prefs/newPage.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/prefs/osx.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.properties ================================================ NoMainWindowAvaialble=Cannot edit keyboard shortcuts PleaseOpenOneMainWindow=At least one main BlueGriffon window must be opened to edit keyboard shortcuts. ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/prefs/source.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/prefs/styles.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/prefs/update.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/prefs/update.properties ================================================ SoftwareUpdates=עדכוני תוכנה UnableToCheck=כשלון בבדיקת זמינות UpToDate=BlueGriffon מעודכן ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/prefs.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/propertiesDeck.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/rotator.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/spellCheck.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/spellCheck.properties ================================================ CorrectSpelling=(איות נכון) NoSuggestedWords=(אין מילים מוצעות) NoMisspelledWord=אין מילים שגויות CheckSpellingDone=בדיקת איות הושלמה CheckSpelling=בדיקת איות ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/structurebar.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/svg-edit.properties ================================================ SvgEdit=עורך SVG ConfirmClose=יש שינויים שטרם נשמרו. האם באמת רצונך לסגור את עורך ה-SVG? ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/tabeditor.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/updateAvailable.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/base/locale/bluegriffon/updates.properties ================================================ update.checkInsideButton.label=בדוק עדכונים update.checkInsideButton.accesskey=ב update.resumeButton.label=המשך בהורדת %S… update.resumeButton.accesskey=ה update.openUpdateUI.applyButton.label=החל עדכון update.openUpdateUI.applyButton.accesskey=ה update.restart.applyButton.label=החל עדכון update.restart.applyButton.accesskey=ה update.openUpdateUI.upgradeButton.label=עדכן עכשיו… update.openUpdateUI.upgradeButton.accesskey=ע update.restart.upgradeButton.label=שדרג עכשיו update.restart.upgradeButton.accesskey=ש ================================================ FILE: locales/he/bluegriffon/base/locale/branding/brand.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/base/locale/branding/brand.properties ================================================ brandShortName=BlueGriffon brandFullName=BlueGriffon vendorShortName=Disruptive Innovations sidebarName=סרגל צד ================================================ FILE: locales/he/bluegriffon/extensions/fs/addFont.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/extensions/fs/fs.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/extensions/fs/fs.properties ================================================ SelectDir=בחירת ספריה לפתוח בה את חבילת הגופנים SelectFile=בחירת ה- stylesheet.css של חבילת גופנים Stylesheet=ה- stylesheet של חבילת FontSquirrel MustBeSavedTitle=המסמך עוד לא נשמר מעולם MustBeSavedMessage=עליך לשמור את הקובץ פעם אחת לפחות לפני שתוכל לשייך לו גופן מקומי תוך שימוש בכתובת URL יחסית. נא לסגור את המסמך ולפתוח אותו מחדש אחרי שמירתו. ================================================ FILE: locales/he/bluegriffon/extensions/fs/fsOverlay.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/extensions/gfd/addFont.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/extensions/gfd/gfd.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/extensions/gfd/gfdOverlay.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/extensions/markdown/markdown.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/extensions/markdown/markdownOverlay.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/extensions/op1/a11yFirstStep.properties ================================================ ConformingDTDSyntax=Use a W3C-conforming DTD syntax before the html element NoWrongSyntaxOrNonConformingHierarchy=Don't use wrong attribute syntax or non-conforming element hierarchy inside the html element OneTitleInHead=Use a title element as a child of the head element NoEmptyTitle=When you provide a title element, do not leave it empty NoMetaRefresh=Don't use a meta element with an http-equiv attribute and a value equal to refresh HTMLElementHasLangAttribute=Use the lang attribute for the html element HTMLElementHasValidLangAttribute=Use a valid language code for the lang attribute NoInvalidDir=Don't use a value other than ltr, rtl or empty for the dir attribute TitleForFrames=Use the title attribute for every frame element NoEmptyTitleForFrames=When you provide a title attribute for a frame element, do not leave it empty TitleForIFrames=Use the title attribute for every iframe element NoEmptyTitleForIFrames=When you provide a title attribute for an iframe element, do not leave it empty AtLeastOneH1InBody=There must be at least one h1 element inside (at any level) the body element NoEmptyH1=When you provide a h1 element, do not leave it empty NoEmptyH2=When you provide a h2 element, do not leave it empty NoEmptyH3=When you provide a h3 element, do not leave it empty NoEmptyH4=When you provide a h4 element, do not leave it empty NoEmptyH5=When you provide a h5 element, do not leave it empty NoEmptyH6=When you provide a h6 element, do not leave it empty H2Order=Use  a h1, h2, h3, h4, h5 or h6 element as a first heading before a h2 element in the source order H3Order=Use a h2, h3, h4, h5 or h6 element as a first heading before a h3 element in the source order H4Order=Use a h3, h4, h5 or h6 element as a first heading before a h4 element in the source order H5Order=Use a h4, h5 or h6 element as a first heading before a h5 element in the source order H6Order=Use a h5 or h6 element as a first heading before a h6 element in the source order DTAsFirstChildOfDL=Use a dt element as the first child of a dl element NoEmptyLI=When you provide a li element, do not leave it empty NoAlignAttribute=Don't use the align attribute NoXmpElement=Don't use the xmp element NoEmptyP=When you provide a p element, do not leave it empty NoEmptyAExceptAnchors=When you provide an a element, do not leave it empty except if it is used as an anchor NoEmptyButton=When you provide a button element, do not leave it empty NoVlinkAttribute=Don't use the vlink attribute NoTextAttribute=Don't use the text attribute NoLinkAttribute=Don't use the link attribute noImgWithoutAlt=Use the alt attribute for every img element noAreaWithoutAlt=Use the alt attribute for every area element noAppletWithoutAlt=Use the alt attribute for every applet element noImageInputWithoutAlt=Use the alt attribute for every input type=image element noEmptyAltForImageLoneChildOfAnchorOrButton=If the img element is the only child of a button or an a element, do not leave its alt attribute empty noEmptyAltForInputImage=When you provide an alt attribute for an input type=image element, do not leave it empty noEmptyAltForAreaWithHref=When you provide an alt attribute for an area element holding an href attribute, do not leave it empty noAltSimilarToTextContent=If an img element is a child of an a element with text, do not use the same text for its alt attribute as the text inside the a element noBorderAttribute=Don't use the border attribute noSimilarAltForAreasWithDifferentHref=Don't use the same value for alt attributes for multiple area elements with different href values LongdescIsURI=Use a URI as the value for a longdesc attribute noBackgroundAttribute=Don't use the background attribute noBgsoundElement=Don't use the bgsound element TablesWithAtLeastOneTHHaveACaption=Use a caption element as the first child of a table element containing at least one th element CaptionIsDifferentFromSummaryAttribute=Don't use the same content for a caption element and a summary attribute noEmptyCaption=When you provide a caption element, do not leave it empty noCaptionInATableWithOnlyTDs=Don't use a caption element in a table element containing only td elements noAlinkAttribute=Don't use an alink attribute noSummaryAttributeSimilarToCaption=Don't use the same content for a summary attribute and a caption element noEmptySummaryIfTableHasTHOrCaption=When you provide a summary attribute for a table element containing a th or a caption element, do not leave it empty noSummaryAttributeIfOnlyTDs=Don't use a summary attribute on a table element containg only td elements noStrikeElement=Don't use the strike element noListingElement=Don't use the listing element AtLeastOneTHIfCaptionOrSummary=Use at least one th element inside a table element with a caption element or a non-empty summary attribute AllNonEmptyTHHaveScopeOrId=Use a scope or id attribute for every non-empty th element ScopeAttributeIsRowOrCol=Don't use a value other than row or col for the scope attribute noBgcolorAttribute=Don't use the bgcolor attribute noTTElement=Don't use the tt element TDHaveHeadersAttributeIfTHHasId=Use a headers attribute on every td element if the corresponding th element has an id attribute noPlaintextElement=Don't use the plaintext element noHeadersAttributeThatIsNotATHId=Don't use for a headers attribute a value which matches an id attribute used for a td of the table element AllFormsHaveAButton=Use a button, or an input of type submit, image or button inside a form element SubmitButtonsHaveNonEmptyValue=When you provide an input type=submit, do not leave its value attribute empty noMarqueeElement=Don't use the marquee element FieldsetHasALegend=Use a legend element as a child of every fieldset element FieldsetsAreInForms=Don't use a fieldset element without a form element noEmptyLegendElement=When you provide a legend element, do not leave it empty LabelElementHasForAttribute=Use the for attribute for every label element noEmptyForAttributeOnLabel=When you provide a for attribute for a label element, do not leave it empty ForAttributeMatchesAnIdInSameForm=A for attribute must have a value that matches an id attribute inside the form element OptgroupElementHasALabel=Use the label attribute for every optgroup element NoSimilarLabelInOptgroupsOfSameSelect=Don't use the same label attribute for different optgroup elements of the same select element noEmptyLabelAttributeOnOptgroup=When you provide a label attribute for an optgroup element, do not leave it empty noBasefontElement=Don't use the basefont element noBlinkElement=Don't use the blink element noCenterElement=Don't use the center element noFontElement=Don't use the font element ================================================ FILE: locales/he/bluegriffon/extensions/op1/op1.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/extensions/op1/op1Overlay.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/extensions/tipoftheday/tipoftheday.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/extensions/tipoftheday/tipoftheday.rdf ================================================ %brandDTD; ]> &brandShortName; tips http://bluegriffon.org/ &brandShortName; tip of the day Archive en-us …&brandShortName; is cross platform? …&brandShortName; exists on a wide variety of operating systems including Windows, Mac OS X, and many flavors of Linux, OS/2 … …&brandShortName; shows the title of any unsaved page with a red shadow? You can now save files from any viewing mode. …you have direct access to the &brandShortName; community? Just select “Help > User’s Community”. …you can insert HTML5 elements easily? Just select “Insert > HTML5 Element”. …you can close the current tab with one key? Control+w (Command +w on Mac OS X) will close the current tab. …you can create a new tab with a key combination? Control+n (Command +n on Mac OS X) will create a new blank tab using the same doctype as the last page created. …you can revert to a previously saved version of the currently edited document? Righ-click (context-click on Mac OS X) on the document's tab and select the Revert menu. …you can publish pages directly from &brandShortName; First install the free FireFTP add-on and set it up. It will then be available on the Tools menu. …&brandShortName; can insert any character easily? Use “Insert characters and symbols”. You can then search for any Unicode character by name or open a block for inspection. …&brandShortName; runs spellcheck by default? Right click a word to find suggestions. Switch checking on or off using “Tools > Preferences > General” . …&brandShortName; can reliably select an element? Simply click its name in the structure bar. …you can move an element in your document using the mouse? First select as in previous tip then just drag it to where needed. …you can quickly open existing pages? The paid for Project manager add-on permits instant access to pages and images which are organised as a project. …you can choose your default browser? Use “Tools > Preferences > Advanced > Reset external browser settings”. Next time you browse you can choose a browser. …&brandShortName; allows you to use external stylesheets? To create one ready for use click “Panels > Stylesheets”. Click the plus sign and select “Linked to the document”. …&brandShortName; can manage stylesheets and complex selectors? Using the CSS Pro Editor (a paid for add-on) you change the order of and add titles and rel attribute to stylesheets and develop complex CSS 2 and 3 selectors with advanced help. …panels can be resized? Drag the grab handle at the bottom right corner to the size needed. …attributes can be added to any element? Open “Panels > DOM Explorer”. In wysiwyg view click in the element, select use the Attributes tab and click the plus sign. …&brandShortName; can handle CSS3 properties? Vendor prefixes will be added for browsers that need them. …you can personalize keyboard shortcuts? Any menu item can be allocated to your preferred key. Open “Tools > Preferences > Keyboard Shortcuts”. Find and double-click the command wanted. In the new window key a shortcut. …you can remove a class from an element? Just select the element and in the Class drop down box re-apply the class. ================================================ FILE: locales/he/bluegriffon/extensions/tipoftheday/tipofthedayOverlay.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/sidebars/aria/aria.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/sidebars/aria/aria.properties ================================================ mustBeContainedIn=must be contained in or= or ok=OK mustContain=must contain and= and deprecated=deprecated missingTextbox=missing textbox missingListboxTreeGridDialog=missing listbox, tree, grid or dialog ================================================ FILE: locales/he/bluegriffon/sidebars/aria/ariaOverlay.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/sidebars/cssproperties/backgrounditem.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/sidebars/cssproperties/backgrounditem.properties ================================================ backgroundColorTitle=צבע backgroundImageTitle=תמונה backgroundLinearGradientTitle=הדרגה ליניארית backgroundRadialGradientTitle=הדרגה רדיאלית ================================================ FILE: locales/he/bluegriffon/sidebars/cssproperties/colorstopitem.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/sidebars/cssproperties/cssproperties.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/sidebars/cssproperties/cssproperties.properties ================================================ EnterAnId=נא להכניס ID EnterUniqueId=יש לקבוע ID חד-חד ערכי ל-element: NoClasSelected=יש לבחור שם class PleaseSelectAClass=יש לבחור class לישום השינויים המבוקשים ================================================ FILE: locales/he/bluegriffon/sidebars/cssproperties/csspropertiesOverlay.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/sidebars/cssproperties/editGridTemplate.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/sidebars/cssproperties/fontFeatures.properties ================================================ FFaalt=Access all alternates FFcalt=Contextual alternates FFsalt=Stylistic alternates FFliga=Standard ligatures FFclig=Contextual ligatures FFdlig=Discretionary ligatures FFhist=Historical forms FFhlig=Historical ligatures FFunic=Unicase FFsmcp=Small capitals FFc2sc=Small capitals from capitals FFc2pc=Petite capitals from capitals FFpcap=Petite capitals FFcase=Case sensitive forms FFcpsp=Capital spacing FFtitl=Titling FFswsh=Swash FFcswh=Contextual swash FFfrac=Fractions FFafrc=Alternative fractions FFordn=Ordinals FFnumr=Numerators FFdnom=Denominators FFsinf=Scientific inferiors FFsups=Superscript FFsubs=Subscript FFonum=Oldstyle figures FFlnum=Lining Figures FFpnum=Proportional figures FFtnum=Tabular figures FFzero=Slashed zero FFmgrk=Mathematical greek FFnalt=Alternate annotation forms FFornm=Ornaments FFlocl=Localized forms FFsize=Optical size FFisol=Isolated forms FFinit=Initial forms FFmedi=Medial forms FFfinal=Final forms FFrlig=Requird ligatures FFccmp=Glyph composition/decomposition FFmark=Mark to base positioning FFmkmj=Mark to mark positioning FFhwid=Half widths ================================================ FILE: locales/he/bluegriffon/sidebars/cssproperties/griditemposition.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/sidebars/cssproperties/textshadowitem.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/sidebars/cssproperties/transformationitem.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/sidebars/cssproperties/transitionitem.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/sidebars/domexplorer/domexplorer.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/sidebars/domexplorer/domexplorerOverlay.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/sidebars/its20/its20.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/sidebars/its20/its20.properties ================================================ LoadError=Load Error InlineParseError=Inline resource is not an ITS 2.0 document CannotFetch=Cannot fetch URL NotITS=Resource is not an ITS 2.0 document TranslatableByGlobalRule=Translatable by global rule NotTranslatableByGlobalRule=Not translatable by global rule InlineRules=Inline rules translateRule=Translate locNoteRule=Localization Note termRule=Terminology dirRule=Directionality langRule=Language Information withinTextRule=Elements Within Text domainRule=Domain textAnalysisRule=Text Analysis localeFilterRule=Locale Filter provRule=Provenance externalResourceRefRule=External Resource targetPointerRule=Target Pointer idValueRule=Id Value preserveSpaceRule=Preserve Space locQualityIssueRule=Localization Quality Issue mtConfidenceRule=Machine-Translation Confidence allowedCharactersRule=Allowed Characters storageSizeRule=Storage Size DontWarnAgainForUrl=Don't warn me again about this URL DontWarnAgainForInline=Don't warn me again about inline global rules NewITSFile=New ITS 2.0 File CannotResolveXPath=Cannot resolve the following XPath selector (undeclared HTML namespace?): XPathParsingError=XPath Parsing Error DontWarnAgainForSelector=Don't warn me again about this selector CSSParsingError=CSS Parsing Error CannotResolveCSS=Cannot resolve the following CSS selector: ================================================ FILE: locales/he/bluegriffon/sidebars/its20/its20Overlay.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/sidebars/its20/locNoteRule.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/sidebars/its20/selector.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/sidebars/its20/termRule.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/sidebars/its20/translateRule.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/sidebars/scripteditor/editor.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/sidebars/scripteditor/scripteditor.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/sidebars/scripteditor/scripteditor.properties ================================================ ConfirmDeletionTitle=Delete a script ConfirmDeletion=Are you sure you want to delete this script? AddExternalScriptTitle=Add an external script PromptScriptURL=URL of the script? ================================================ FILE: locales/he/bluegriffon/sidebars/scripteditor/scripteditorOverlay.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/sidebars/stylesheets/editor.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/sidebars/stylesheets/stylesheets.dtd ================================================ ================================================ FILE: locales/he/bluegriffon/sidebars/stylesheets/stylesheetsOverlay.dtd ================================================ ================================================ FILE: locales/he/cssproperties.mn ================================================ bluegriffon-he.jar: % locale cssproperties he %locale/he/cssproperties/ locale/he/cssproperties/csspropertiesOverlay.dtd (locale/he/csspropertiesOverlay.dtd) locale/he/cssproperties/cssproperties.dtd (locale/he/cssproperties.dtd) locale/he/cssproperties/editGridTemplate.dtd (locale/he/editGridTemplate.dtd) locale/he/cssproperties/backgrounditem.dtd (locale/he/backgrounditem.dtd) locale/he/cssproperties/griditemposition.dtd (locale/he/griditemposition.dtd) locale/he/cssproperties/transformationitem.dtd (locale/he/transformationitem.dtd) locale/he/cssproperties/transitionitem.dtd (locale/he/transitionitem.dtd) locale/he/cssproperties/textshadowitem.dtd (locale/he/textshadowitem.dtd) locale/he/cssproperties/colorstopitem.dtd (locale/he/colorstopitem.dtd) locale/he/cssproperties/backgrounditem.properties (locale/he/backgrounditem.properties) locale/he/cssproperties/cssproperties.properties (locale/he/cssproperties.properties) locale/he/cssproperties/fontFeatures.properties (locale/he/fontFeatures.properties) ================================================ FILE: locales/he/domexplorer.mn ================================================ bluegriffon-he.jar: % locale domexplorer he %locale/he/domexplorer/ locale/he/domexplorer/domexplorerOverlay.dtd (locale/he/domexplorerOverlay.dtd) locale/he/domexplorer/domexplorer.dtd (locale/he/domexplorer.dtd) ================================================ FILE: locales/he/fs.mn ================================================ fs-he.jar: % locale fs he %locale/he/fs/ locale/he/fs/fsOverlay.dtd (locale/he/fsOverlay.dtd) locale/he/fs/fs.dtd (locale/he/fs.dtd) locale/he/fs/fs.properties (locale/he/fs.properties) locale/he/fs/addFont.dtd (locale/he/addFont.dtd) ================================================ FILE: locales/he/gfd.mn ================================================ gfd-he.jar: % locale gfd he %locale/he/gfd/ locale/he/gfd/gfdOverlay.dtd (locale/he/gfdOverlay.dtd) locale/he/gfd/gfd.dtd (locale/he/gfd.dtd) locale/he/gfd/addFont.dtd (locale/he/addFont.dtd) ================================================ FILE: locales/he/its20.mn ================================================ bluegriffon-he.jar: % locale its20 he %locale/he/its20/ locale/he/its20/its20Overlay.dtd (locale/he/its20Overlay.dtd) locale/he/its20/its20.properties (locale/he/its20.properties) locale/he/its20/its20.dtd (locale/he/its20.dtd) locale/he/its20/translateRule.dtd (locale/he/translateRule.dtd) locale/he/its20/locNoteRule.dtd (locale/he/locNoteRule.dtd) locale/he/its20/termRule.dtd (locale/he/termRule.dtd) locale/he/its20/selector.dtd (locale/he/selector.dtd) ================================================ FILE: locales/he/markdown.mn ================================================ markdown-he.jar: % locale markdown he %locale/he/markdown/ locale/he/markdown/markdownOverlay.dtd (locale/he/markdownOverlay.dtd) locale/he/markdown/markdown.dtd (locale/he/markdown.dtd) ================================================ FILE: locales/he/op1.mn ================================================ op1-he.jar: % locale op1 he %locale/he/op1/ locale/he/op1/op1Overlay.dtd (locale/he/op1Overlay.dtd) locale/he/op1/op1.dtd (locale/he/op1.dtd) locale/he/op1/a11yFirstStep.properties (locale/he/a11yFirstStep.properties) ================================================ FILE: locales/he/scripteditor.mn ================================================ bluegriffon-he.jar: % locale scripteditor he %locale/he/scripteditor/ locale/he/scripteditor/scripteditorOverlay.dtd (locale/he/scripteditorOverlay.dtd) locale/he/scripteditor/scripteditor.dtd (locale/he/scripteditor.dtd) locale/he/scripteditor/scripteditor.properties (locale/he/scripteditor.properties) locale/he/scripteditor/editor.dtd (locale/he/editor.dtd) ================================================ FILE: locales/he/stylesheets.mn ================================================ bluegriffon-he.jar: % locale stylesheets he %locale/he/stylesheets/ locale/he/stylesheets/stylesheetsOverlay.dtd (locale/he/stylesheetsOverlay.dtd) locale/he/stylesheets/stylesheets.dtd (locale/he/stylesheets.dtd) locale/he/stylesheets/editor.dtd (locale/he/editor.dtd) ================================================ FILE: locales/he/tipoftheday.mn ================================================ tipoftheday-he.jar: % locale tipoftheday he %locale/he/tipoftheday/ locale/he/tipoftheday/tipoftheday.dtd (locale/he/tipoftheday.dtd) locale/he/tipoftheday/tipofthedayOverlay.dtd (locale/he/tipofthedayOverlay.dtd) locale/he/tipoftheday/tipoftheday.rdf (locale/he/tipoftheday.rdf) ================================================ FILE: locales/hu/aria.mn ================================================ bluegriffon-hu.jar: % locale aria hu %locale/hu/aria/ locale/hu/aria/ariaOverlay.dtd (locale/hu/ariaOverlay.dtd) locale/hu/aria/aria.dtd (locale/hu/aria.dtd) locale/hu/aria/aria.properties (locale/hu/aria.properties) ================================================ FILE: locales/hu/base.mn ================================================ bluegriffon-hu.jar: % locale bluegriffon hu %locale/hu/bluegriffon/ % locale branding hu %locale/hu/branding/ locale/hu/bluegriffon/aboutDialog.dtd (locale/hu/bluegriffon/aboutDialog.dtd) locale/hu/bluegriffon/bluegriffon.dtd (locale/hu/bluegriffon/bluegriffon.dtd) locale/hu/bluegriffon/polyglot.dtd (locale/hu/bluegriffon/polyglot.dtd) locale/hu/bluegriffon/findbar.dtd (locale/hu/bluegriffon/findbar.dtd) locale/hu/bluegriffon/bluegriffon.properties (locale/hu/bluegriffon/bluegriffon.properties) locale/hu/bluegriffon/colourPicker.dtd (locale/hu/bluegriffon/colourPicker.dtd) locale/hu/bluegriffon/credits.dtd (locale/hu/bluegriffon/credits.dtd) locale/hu/bluegriffon/filepickerbutton.dtd (locale/hu/bluegriffon/filepickerbutton.dtd) locale/hu/bluegriffon/filePicking.dtd (locale/hu/bluegriffon/filePicking.dtd) locale/hu/bluegriffon/insertTable.dtd (locale/hu/bluegriffon/insertTable.dtd) locale/hu/bluegriffon/insertTable.properties (locale/hu/bluegriffon/insertTable.properties) locale/hu/bluegriffon/language.properties (locale/hu/bluegriffon/language.properties) locale/hu/bluegriffon/languages.dtd (locale/hu/bluegriffon/languages.dtd) locale/hu/bluegriffon/markupCleaner.dtd (locale/hu/bluegriffon/markupCleaner.dtd) locale/hu/bluegriffon/openLocation.dtd (locale/hu/bluegriffon/openLocation.dtd) locale/hu/bluegriffon/openLocation.properties (locale/hu/bluegriffon/openLocation.properties) locale/hu/bluegriffon/newPageWizard.dtd (locale/hu/bluegriffon/newPageWizard.dtd) locale/hu/bluegriffon/newPageWizard.properties (locale/hu/bluegriffon/newPageWizard.properties) locale/hu/bluegriffon/propertiesDeck.dtd (locale/hu/bluegriffon/propertiesDeck.dtd) locale/hu/bluegriffon/aria.dtd (locale/hu/bluegriffon/aria.dtd) locale/hu/bluegriffon/structurebar.dtd (locale/hu/bluegriffon/structurebar.dtd) locale/hu/bluegriffon/tabeditor.dtd (locale/hu/bluegriffon/tabeditor.dtd) locale/hu/bluegriffon/masterPasswordQuery.properties (locale/hu/bluegriffon/masterPasswordQuery.properties) locale/hu/bluegriffon/newDocument.dtd (locale/hu/bluegriffon/newDocument.dtd) locale/hu/bluegriffon/prefs/file.dtd (locale/hu/bluegriffon/prefs/file.dtd) locale/hu/bluegriffon/prefs/source.dtd (locale/hu/bluegriffon/prefs/source.dtd) locale/hu/bluegriffon/prefs/general.dtd (locale/hu/bluegriffon/prefs/general.dtd) locale/hu/bluegriffon/prefs/newPage.dtd (locale/hu/bluegriffon/prefs/newPage.dtd) locale/hu/bluegriffon/prefs/update.dtd (locale/hu/bluegriffon/prefs/update.dtd) locale/hu/bluegriffon/prefs/styles.dtd (locale/hu/bluegriffon/prefs/styles.dtd) locale/hu/bluegriffon/prefs/advanced.dtd (locale/hu/bluegriffon/prefs/advanced.dtd) locale/hu/bluegriffon/prefs/connection.dtd (locale/hu/bluegriffon/prefs/connection.dtd) locale/hu/bluegriffon/prefs/osx.dtd (locale/hu/bluegriffon/prefs/osx.dtd) locale/hu/bluegriffon/prefs/shortcuts.dtd (locale/hu/bluegriffon/prefs/shortcuts.dtd) locale/hu/bluegriffon/prefs/update.properties (locale/hu/bluegriffon/prefs/update.properties) locale/hu/bluegriffon/prefs.dtd (locale/hu/bluegriffon/prefs.dtd) locale/hu/bluegriffon/updateAvailable.dtd (locale/hu/bluegriffon/updateAvailable.dtd) locale/hu/bluegriffon/updates.properties (locale/hu/bluegriffon/updates.properties) locale/hu/branding/brand.dtd (locale/hu/branding/brand.dtd) locale/hu/branding/brand.properties (locale/hu/branding/brand.properties) locale/hu/bluegriffon/insertImage.dtd (locale/hu/bluegriffon/insertImage.dtd) locale/hu/bluegriffon/insertAnchor.dtd (locale/hu/bluegriffon/insertAnchor.dtd) locale/hu/bluegriffon/insertCommentOrPI.dtd (locale/hu/bluegriffon/insertCommentOrPI.dtd) locale/hu/bluegriffon/insertLink.dtd (locale/hu/bluegriffon/insertLink.dtd) locale/hu/bluegriffon/insertLink.properties (locale/hu/bluegriffon/insertLink.properties) locale/hu/bluegriffon/cssClassPicker.dtd (locale/hu/bluegriffon/cssClassPicker.dtd) locale/hu/bluegriffon/insertVideo.dtd (locale/hu/bluegriffon/insertVideo.dtd) locale/hu/bluegriffon/insertAudio.dtd (locale/hu/bluegriffon/insertAudio.dtd) locale/hu/bluegriffon/insertVideo.properties (locale/hu/bluegriffon/insertVideo.properties) locale/hu/bluegriffon/insertHTML.dtd (locale/hu/bluegriffon/insertHTML.dtd) locale/hu/bluegriffon/insertHR.dtd (locale/hu/bluegriffon/insertHR.dtd) locale/hu/bluegriffon/insertForm.dtd (locale/hu/bluegriffon/insertForm.dtd) locale/hu/bluegriffon/parsingError.dtd (locale/hu/bluegriffon/parsingError.dtd) locale/hu/bluegriffon/insertFormInput.dtd (locale/hu/bluegriffon/insertFormInput.dtd) locale/hu/bluegriffon/insertFieldset.dtd (locale/hu/bluegriffon/insertFieldset.dtd) locale/hu/bluegriffon/insertLabel.dtd (locale/hu/bluegriffon/insertLabel.dtd) locale/hu/bluegriffon/insertButton.dtd (locale/hu/bluegriffon/insertButton.dtd) locale/hu/bluegriffon/insertSelect.dtd (locale/hu/bluegriffon/insertSelect.dtd) locale/hu/bluegriffon/insertTextarea.dtd (locale/hu/bluegriffon/insertTextarea.dtd) locale/hu/bluegriffon/insertKeygen.dtd (locale/hu/bluegriffon/insertKeygen.dtd) locale/hu/bluegriffon/insertOutput.dtd (locale/hu/bluegriffon/insertOutput.dtd) locale/hu/bluegriffon/insertProgress.dtd (locale/hu/bluegriffon/insertProgress.dtd) locale/hu/bluegriffon/insertMeter.dtd (locale/hu/bluegriffon/insertMeter.dtd) locale/hu/bluegriffon/insertStylesheet.dtd (locale/hu/bluegriffon/insertStylesheet.dtd) locale/hu/bluegriffon/editStylesheet.dtd (locale/hu/bluegriffon/editStylesheet.dtd) locale/hu/bluegriffon/media.dtd (locale/hu/bluegriffon/media.dtd) locale/hu/bluegriffon/media.properties (locale/hu/bluegriffon/media.properties) locale/hu/bluegriffon/insertChars.dtd (locale/hu/bluegriffon/insertChars.dtd) locale/hu/bluegriffon/convertToTable.dtd (locale/hu/bluegriffon/convertToTable.dtd) locale/hu/bluegriffon/pageProperties.dtd (locale/hu/bluegriffon/pageProperties.dtd) locale/hu/bluegriffon/spellCheck.dtd (locale/hu/bluegriffon/spellCheck.dtd) locale/hu/bluegriffon/spellCheck.properties (locale/hu/bluegriffon/spellCheck.properties) locale/hu/bluegriffon/dictionary.dtd (locale/hu/bluegriffon/dictionary.dtd) locale/hu/bluegriffon/html5.properties (locale/hu/bluegriffon/html5.properties) locale/hu/bluegriffon/listProperties.dtd (locale/hu/bluegriffon/listProperties.dtd) locale/hu/bluegriffon/insertTOC.dtd (locale/hu/bluegriffon/insertTOC.dtd) locale/hu/bluegriffon/svg-edit.properties (locale/hu/bluegriffon/svg-edit.properties) locale/hu/bluegriffon/panels.dtd (locale/hu/bluegriffon/panels.dtd) locale/hu/bluegriffon/rotator.dtd (locale/hu/bluegriffon/rotator.dtd) ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/aboutDialog.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/aria.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/bluegriffon.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/bluegriffon.properties ================================================ # NLS_MESSAGEFORMAT_VAR titleModifier=BlueGriffon # in the following string, %t represents the title of the page or its URL # and %b the titleModifier above titleFormat=%S – %S Unknown=[Ismeretlen] NoClassAvailable=(nincs osztály) NoIdAvailable=(nincs azonosító) DocumentTitle=Oldal címe NeedDocTitle=Írja be az aktuális oldal címét! DocTitleHelp=Ezzel azonosítható az oldal a böngészőben vagy a könyvjelzőben. ExportToText=Exportálás szövegként SaveDocumentAs=Oldal mentése mint XHTMLfiles=XHTML-fájlok untitled=névtelen SaveDocument=Oldal mentése SaveFileFailed=Fájl mentése sikertelen! ExportToText=Exportálás szövegként FileNotSaved=A fájl nincs mentve! SaveFileBeforeClosing=Szeretné menteni a fájlt a lap bezárása előtt? YesSaveFile=Mentés NoDiscardChanges=Módosítások eldobása DontCloseTab=Ne zárja be a lapot! IdAlreadyTaken=Ez az azonosító már használatban van a dokumentumban RemoveIdFromElement=El szeretné távolítani az azonosítót a másik elemről, vagy megszakítja a műveletet? YesRemoveId=Azonosító eltávolítása NoCancel=Mégse ReplaceAll=Összes cseréje… ReplacedPart1=Helyettesítve ReplacedPart2=előfordulás AFileWasChanged=Egy fájl megváltozott a lemezen ReloadFile=A(z) %S fájl megváltozott a lemezen, a BlueGriffonnak újra kell töltenie DontAskForFileChangesAgain=Ne jelenjen meg többé ez a figyelmeztetés AbandonChanges=Eldobja a mentetlen módosításokat ebben: „%title%”, és újratölti az oldalt? RevertCaption=Visszatérés az utoljára mentett állapothoz HTMLCommentsInXHTMLTitle=HTML megjegyzés

      A normális szöveg így fog kinézni!

      A látogatott hivatkozások így fognak kinézni!

      Az aktív hivatkozások így fognak kinézni!

      ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/panels.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/parsingError.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/polyglot.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/prefs/advanced.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/prefs/connection.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/prefs/deactivateLicense.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/prefs/file.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/prefs/general.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/prefs/license.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/prefs/license.properties ================================================ activateWarning=BlueGriffon needs to restart to activate your license. Do you want to restart now? confirmRestart=Restart BlueGriffon? fullResetTitle=License activation reset fullResetErrorLabel=Impossible to perform the operation, a network error occurred. fullResetRequested=A reset link was sent to the owner of the license/transaction. BlueGriffon must now restart. fullResetInvalid=The transaction ID is invalid. ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/prefs/newPage.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/prefs/osx.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.properties ================================================ # NLS_MESSAGEFORMAT_VAR NoMainWindowAvaialble=A gyorsbillentyűk nem szerkeszthetők PleaseOpenOneMainWindow=A gyorsbillentyűk szerkesztéséhez legalább egy BlueGriffon főablaknak nyitva kell lennie. ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/prefs/source.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/prefs/styles.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/prefs/update.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/prefs/update.properties ================================================ # NLS_MESSAGEFORMAT_VAR SoftwareUpdates=Szoftverfrissítések UnableToCheck=Az elérhetőség nem ellenőrizhető UpToDate=A BlueGriffon naprakész ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/prefs.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/propertiesDeck.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/rotator.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/spellCheck.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/spellCheck.properties ================================================ # NLS_MESSAGEFORMAT_VAR CorrectSpelling=(helyesen írva) NoSuggestedWords=(nincs javaslat) NoMisspelledWord=Nincs rosszul leírt szó CheckSpellingDone=Helyesírás-ellenőrzés befejeződött. CheckSpelling=Helyesírás-ellenőrzés ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/structurebar.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/svg-edit.properties ================================================ # NLS_MESSAGEFORMAT_VAR SvgEdit=SVG-szerkesztő ConfirmClose=Mentetlen módosítások vannak, valóban bezárja az SVG-szerkesztőt? ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/tabeditor.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/updateAvailable.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/base/locale/bluegriffon/updates.properties ================================================ # NLS_MESSAGEFORMAT_VAR update.checkInsideButton.label=Frissítések keresése update.checkInsideButton.accesskey=F update.resumeButton.label=%S letöltésének folytatása… update.resumeButton.accesskey=l update.openUpdateUI.applyButton.label=Frissítés alkalmazása… update.openUpdateUI.applyButton.accesskey=A update.restart.applyButton.label=Frissítés alkalmazása update.restart.applyButton.accesskey=A update.openUpdateUI.upgradeButton.label=Frissítés most… update.openUpdateUI.upgradeButton.accesskey=m update.restart.upgradeButton.label=Frissítés most update.restart.upgradeButton.accesskey=m ================================================ FILE: locales/hu/bluegriffon/base/locale/branding/brand.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/base/locale/branding/brand.properties ================================================ # NLS_MESSAGEFORMAT_VAR brandShortName=BlueGriffon brandFullName=BlueGriffon vendorShortName=Disruptive Innovations sidebarName=Oldalsáv ================================================ FILE: locales/hu/bluegriffon/extensions/fs/addFont.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/extensions/fs/fs.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/extensions/fs/fs.properties ================================================ # NLS_MESSAGEFORMAT_VAR SelectDir=Válassza ki a betűkészlet-csomag kibontásához használandó könyvtárat SelectFile=Válassza ki egy meglévő betűkészletcsomag stylesheet.css fájlját Stylesheet=Egy FontSquirrel csomag stíluslapja MustBeSavedTitle=A dokumentum még nincs mentve MustBeSavedMessage=A fájlt legalább egyszer mentenie kell, mielőtt egy helyi betűkészletet relatív URL használatával próbál hozzá csatolni. Zárja be a dokumentumot, és a mentése után nyissa meg újra. ================================================ FILE: locales/hu/bluegriffon/extensions/fs/fsOverlay.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/extensions/gfd/addFont.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/extensions/gfd/gfd.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/extensions/gfd/gfdOverlay.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/extensions/markdown/markdown.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/extensions/markdown/markdownOverlay.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/extensions/op1/a11yFirstStep.properties ================================================ # NLS_MESSAGEFORMAT_VAR ConformingDTDSyntax=Használjon W3C-megfelelő DTD szintaxist a HTML elem előtt NoWrongSyntaxOrNonConformingHierarchy=Ne használjon rossz attribútumszintaxist vagy nem megfelelő elemhierarchiát a HTML elemen belül OneTitleInHead=Használjon title elemet a head elem gyermekeként NoEmptyTitle=A title elemet ne hagyja üresen NoMetaRefresh=Ne használjon meta elemet refresh értékű http-equiv attribútummal HTMLElementHasLangAttribute=Használja a lang attribútumot a html elemhez HTMLElementHasValidLangAttribute=Érvényes nyelvkódot használjon a lang attribútumhoz NoInvalidDir=A dir attribútumhoz ne használjon az ltr, rtl vagy üres értéken kívül mást TitleForFrames=A title attribútumot használja minden frame elemhez NoEmptyTitleForFrames=A frame elem title attribútumát ne hagyja üresen TitleForIFrames=A title attribútumot használja minden iframe elemhez NoEmptyTitleForIFrames=Az iframe elem title attribútumát ne hagyja üresen AtLeastOneH1InBody=A body elemben legalább egy h1 elemnek kell lennie (bármely szinten) NoEmptyH1=A h1 elemet ne hagyja üresen NoEmptyH2=A h2 elemet ne hagyja üresen NoEmptyH3=A h3 elemet ne hagyja üresen NoEmptyH4=A h4 elemet ne hagyja üresen NoEmptyH5=A h5 elemet ne hagyja üresen NoEmptyH6=A h6 elemet ne hagyja üresen H2Order=Használjon egy h1, h2, h3, h4, h5 vagy h6 elemet első fejlécként a h2 elem előtt a forrássorrendben H3Order=Használjon egy h2, h3, h4, h5 vagy h6 elemet első fejlécként a h3 elem előtt a forrássorrendben H4Order=Használjon egy h3, h4, h5 vagy h6 elemet első fejlécként a h4 elem előtt a forrássorrendben H5Order=Használjon egy h4, h5 vagy h6 elemet első fejlécként a h5 elem előtt a forrássorrendben H6Order=Használjon egy h5 vagy h6 elemet első fejlécként a h6 elem előtt a forrássorrendben DTAsFirstChildOfDL=Használjon dt elemet a dl elem első gyermekeként NoEmptyLI=A li elemet ne hagyja üresen NoAlignAttribute=Ne használja az align attribútumot NoXmpElement=Ne használja az xmp elemet NoEmptyP=A p elemet ne hagyja üresen NoEmptyAExceptAnchors=Az a elemet ne hagyja üresen, kivéve ha horgonyként használja NoEmptyButton=A button elemet ne hagyja üresen NoVlinkAttribute=Ne használja a vlink attribútumot NoTextAttribute=Ne használja a text attribútumot NoLinkAttribute=Ne használja a link attribútumot noImgWithoutAlt=Az alt attribútumot használja minden img elemhez noAreaWithoutAlt=Az alt attribútumot használja minden area elemhez noAppletWithoutAlt=Az alt attribútumot használja minden applet elemhez noImageInputWithoutAlt=Az alt attribútumot használja minden input type=image elemhez noEmptyAltForImageLoneChildOfAnchorOrButton=Ha az img elem egy gomb vagy egy a elem egyetlen gyermeke, akkor ne hagyja az alt attribútumát üresen noEmptyAltForInputImage=Az input type=image elem alt attribútumát ne hagyja üresen noEmptyAltForAreaWithHref=A href attribútumot tartalmazó area elem alt attribútumát ne hagyja üresen noAltSimilarToTextContent=Ha egy img elem egy szöveget tartalmazó a elem gyermeke, akkor ne használja az a elemen belüli szöveget az alt attribútumhoz is noBorderAttribute=Ne használja a border attribútumot noSimilarAltForAreasWithDifferentHref=Ne használja ugyanazt az értéket több, eltérő href értékekkel rendelkező area elem alt attribútumához LongdescIsURI=Használjon egy URI-címet a longdesc attribútum értékeként noBackgroundAttribute=Ne használja a background attribútumot noBgsoundElement=Ne használja a bgsound elemet TablesWithAtLeastOneTHHaveACaption=Használjon caption elemet egy legalább egy th elemet tartalmazó table elem első gyermekeként CaptionIsDifferentFromSummaryAttribute=Ne használja ugyanazt a tartalmat egy caption elemhez és summary attribútumhoz noEmptyCaption=A caption elemet ne hagyja üresen noCaptionInATableWithOnlyTDs=Ne használjon caption elemet csak td elemeket tartalmazó table elemben noAlinkAttribute=Ne használja az alink attribútumot noSummaryAttributeSimilarToCaption=Ne használja ugyanazt a tartalmat summary attribútumhoz és egy caption elemhez noEmptySummaryIfTableHasTHOrCaption=A th vagy caption elemet tartalmazó table elem summary attribútumát ne hagyja üresen noSummaryAttributeIfOnlyTDs=Ne használjon summary attribútumot egy csak td elemeket tartalmazó table elemhez noStrikeElement=Ne használja a strike elemet noListingElement=Ne használja a listing elemet AtLeastOneTHIfCaptionOrSummary=Legalább egy th elemet használjon a caption elemet vagy nem üres summary attribútumot tartalmazó table elemben AllNonEmptyTHHaveScopeOrId=Használjon scope vagy id attribútumot minden nem üres th elemhez ScopeAttributeIsRowOrCol=Ne használjon a row vagy col értéken kívül mást a scope attribútumhoz noBgcolorAttribute=Ne használja a bgcolor attribútumot noTTElement=Ne használja a tt elemet TDHaveHeadersAttributeIfTHHasId=Használjon headers attribútumot minden td elemen, ha a megfelelő th elemnek van id attribútuma noPlaintextElement=Ne használja a plaintext elemet noHeadersAttributeThatIsNotATHId=Ne használjon fejléc attribútum értékeként egy table elemben lévő td elem id attribútumával egyező értéket AllFormsHaveAButton=A form elemen belül használjon gombot, vagy submit, image vagy button típusú beviteli elemet SubmitButtonsHaveNonEmptyValue=Az input type=submit használatakor ne hagyja a value attribútumát üresen noMarqueeElement=Ne használja a marquee elemet FieldsetHasALegend=Használjon legend elemet minden fieldset elem gyermekeként FieldsetsAreInForms=Ne használjon fieldset elemet form elem nélkül noEmptyLegendElement=A legend elemet ne hagyja üresen LabelElementHasForAttribute=A for attribútumot használja minden label elemhez noEmptyForAttributeOnLabel=A label elem for attribútumát ne hagyja üresen ForAttributeMatchesAnIdInSameForm=A for attribútum értékének a form elemen belüli egyik id attribútuméval kell egyeznie OptgroupElementHasALabel=A label attribútumot használja minden optgroup elemhez NoSimilarLabelInOptgroupsOfSameSelect=Ne használja ugyanazt a label attribútumot különböző optgroup elemekhez ugyanazon select elemen belül noEmptyLabelAttributeOnOptgroup=Az optgroup elem label attribútumát ne hagyja üresen noBasefontElement=Ne használja a basefont elemet noBlinkElement=Ne használja a blink elemet noCenterElement=Ne használja a center elemet noFontElement=Ne használja a font elemet ================================================ FILE: locales/hu/bluegriffon/extensions/op1/op1.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/extensions/op1/op1Overlay.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/extensions/tipoftheday/tipoftheday.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/extensions/tipoftheday/tipoftheday.rdf ================================================ %brandDTD; ]> &brandShortName; tippek http://bluegriffon.org/ &brandShortName; napi tippek archívuma hu-HU …a &brandShortName; keresztplatformos? A &brandShortName; operációs rendszerek széles körén fut, beleértve a Windowst, Mac OS X-et és sok Linux változatot. a &brandShortName; minden mentetlen oldal címét vörös árnyékkal emeli ki? A fájlokat bármely megjelenítési módból megjelenítheti. …közvetlenül elérheti a &brandShortName;-közösséget? Válassza a „Súgó > Felhasználói közösség” menüpontot. …egyszerűen beszúrhat HTML5 elemeket? Válassza a „Beszúrás > HTML5 elem” menüpontot. …az aktuális szerkesztőlapot egy billentyűparanccsal bezárhatja? A Ctrl+w (Command +w Mac OS X alatt) bezárja az aktuális lapot. …létrehozhat új szerkesztőlapot egy billentyűkombinációval? A Ctrl+T (Cmd+T Mac OS X alatt) létrehoz egy új, üres szerkesztőlapot az utoljára létrehozott lap dokumentumtípusával. …you can revert to a previously saved version of the currently edited document? Righ-click (context-click on Mac OS X) on the document's tab and select the Revert menu. …az oldalakat közvetlenül a &brandShortName;ból is közzéteheti? Első lépésként telepítse az ingyenes FireFTP kiegészítőt, és állítsa be. Ezután az Eszközök menüből érheti el. …a &brandShortName;nal bármely karaktert egyszerűen beszúrhatja? Válassza a „Beszúrás > Karakterek és szimbólumok” menüpontot. Ezután tetszőleges Unicode karaktert megkereshet név szerint, vagy megnyithat egy blokkot átnézésre. …a &brandShortName; alapértelmezésben futtat helyesírás-ellenőrzést? Kattintson a jobb egérgombbal egy szóra a javaslatok megjelenítéséhez. Az ellenőrzést az „Eszközök > Beállítások > Általános” alatt kapcsolhatja ki. …a &brandShortName; megbízhatóan választja ki az elemeket? Csak kattintson a névre a szerkezetsávban. …az elemeket a dokumentumaiban az egérrel is mozgathatja? Válassza ki az elemet az előző tippnek megfelelően, majd húzza az új helyére. …gyorsan megnyithatja a meglévő oldalakat? A fizetős Project manager kiegészítő lehetővé teszi a projektté szervezett oldalak és képek azonnali elérését. …kiválaszthatja az alapértelmezett böngészőt? Használja az „Eszközök > Beállítások > Speciális > Külső böngésző beállításainak visszaállítása” gombot. A következő böngészőindításkor kiválaszthatja a kívánt böngészőt. …a &brandShortName; lehetővé teszi külső stíluslapok használatát? Egy használatra kész stíluslap létrehozásáhozásához válassza a „Panelek > Stíluslapok” menüpontot. Kattintson a plusz jelre, és válassza a „Dokumentumhoz csatolva” lehetőséget. …a &brandShortName; képes stíluslapok és összetett választóelemek kezelésére? A CSS Pro Editor (egy fizetős kiegészítő) használatával megváltoztathatja a sorrendet, címeket és rel attribútumokat adhat stíluslapokhoz, és jelentős segítséggel fejleszthet összetett CSS 2 és 3 választóelemeket. …a panelek átméretezhetők? Fogja meg és húzza a jobb alsó sarokban lévő fogantyút a kívánt méret eléréséig. …az attribútumok bármely elemhez hozzáadhatók? Nyissa meg a „Panelek > DOM felfedezőt”. A wysiwyg nézetben kattintson az elemre, válassza az Attribútumok lapot, és kattintson a plusz jelre. …a &brandShortName; képes CSS3 tulajdonságok kezelésére? Szállítói előtagok lesznek felvéve az ezeket igénylő böngészők esetén. …személyre szabhatja a gyorsbillentyűket? Bármely menüelemhez hozzárendelheti kedvenc billentyűjét. Nyissa meg az „Eszközök > Beállítások > Gyorsbillentyűk” menüpontot. Keresse meg, és kattintson duplán a kívánt parancsra. A megjelenő ablakban nyomja le az új gyorsbillentyűt. …eltávolíthatja egy elem osztályát? Válassza ki az elemet, és az Osztály legördülő menüben válassza ki újra az osztályt. ================================================ FILE: locales/hu/bluegriffon/extensions/tipoftheday/tipofthedayOverlay.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/sidebars/aria/aria.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/sidebars/aria/aria.properties ================================================ mustBeContainedIn=must be contained in or= or ok=OK mustContain=must contain and= and deprecated=deprecated missingTextbox=missing textbox missingListboxTreeGridDialog=missing listbox, tree, grid or dialog ================================================ FILE: locales/hu/bluegriffon/sidebars/aria/ariaOverlay.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/sidebars/cssproperties/backgrounditem.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/sidebars/cssproperties/backgrounditem.properties ================================================ # NLS_MESSAGEFORMAT_VAR backgroundColorTitle=Szín backgroundImageTitle=Kép backgroundLinearGradientTitle=Lineáris színátmenet backgroundRadialGradientTitle=Sugárirányú színátmenet ================================================ FILE: locales/hu/bluegriffon/sidebars/cssproperties/colorstopitem.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/sidebars/cssproperties/cssproperties.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/sidebars/cssproperties/cssproperties.properties ================================================ # NLS_MESSAGEFORMAT_VAR EnterAnId=Adjon meg egy azonosítót EnterUniqueId=Egyedi azonosítót kell adnia ennek az elemnek: NoClasSelected=Ki kell választania egy osztálynevet PleaseSelectAClass=Ki kell választani egy osztályt, amelyre a kért módosítások alkalmazva lesznek ================================================ FILE: locales/hu/bluegriffon/sidebars/cssproperties/csspropertiesOverlay.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/sidebars/cssproperties/editGridTemplate.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/sidebars/cssproperties/fontFeatures.properties ================================================ FFaalt=Access all alternates FFcalt=Contextual alternates FFsalt=Stylistic alternates FFliga=Standard ligatures FFclig=Contextual ligatures FFdlig=Discretionary ligatures FFhist=Historical forms FFhlig=Historical ligatures FFunic=Unicase FFsmcp=Small capitals FFc2sc=Small capitals from capitals FFc2pc=Petite capitals from capitals FFpcap=Petite capitals FFcase=Case sensitive forms FFcpsp=Capital spacing FFtitl=Titling FFswsh=Swash FFcswh=Contextual swash FFfrac=Fractions FFafrc=Alternative fractions FFordn=Ordinals FFnumr=Numerators FFdnom=Denominators FFsinf=Scientific inferiors FFsups=Superscript FFsubs=Subscript FFonum=Oldstyle figures FFlnum=Lining Figures FFpnum=Proportional figures FFtnum=Tabular figures FFzero=Slashed zero FFmgrk=Mathematical greek FFnalt=Alternate annotation forms FFornm=Ornaments FFlocl=Localized forms FFsize=Optical size FFisol=Isolated forms FFinit=Initial forms FFmedi=Medial forms FFfinal=Final forms FFrlig=Requird ligatures FFccmp=Glyph composition/decomposition FFmark=Mark to base positioning FFmkmj=Mark to mark positioning FFhwid=Half widths ================================================ FILE: locales/hu/bluegriffon/sidebars/cssproperties/griditemposition.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/sidebars/cssproperties/textshadowitem.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/sidebars/cssproperties/transformationitem.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/sidebars/cssproperties/transitionitem.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/sidebars/domexplorer/domexplorer.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/sidebars/domexplorer/domexplorerOverlay.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/sidebars/its20/its20.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/sidebars/its20/its20.properties ================================================ LoadError=Load Error InlineParseError=Inline resource is not an ITS 2.0 document CannotFetch=Cannot fetch URL NotITS=Resource is not an ITS 2.0 document TranslatableByGlobalRule=Translatable by global rule NotTranslatableByGlobalRule=Not translatable by global rule InlineRules=Inline rules translateRule=Translate locNoteRule=Localization Note termRule=Terminology dirRule=Directionality langRule=Language Information withinTextRule=Elements Within Text domainRule=Domain textAnalysisRule=Text Analysis localeFilterRule=Locale Filter provRule=Provenance externalResourceRefRule=External Resource targetPointerRule=Target Pointer idValueRule=Id Value preserveSpaceRule=Preserve Space locQualityIssueRule=Localization Quality Issue mtConfidenceRule=Machine-Translation Confidence allowedCharactersRule=Allowed Characters storageSizeRule=Storage Size DontWarnAgainForUrl=Don't warn me again about this URL DontWarnAgainForInline=Don't warn me again about inline global rules NewITSFile=New ITS 2.0 File CannotResolveXPath=Cannot resolve the following XPath selector (undeclared HTML namespace?): XPathParsingError=XPath Parsing Error DontWarnAgainForSelector=Don't warn me again about this selector CSSParsingError=CSS Parsing Error CannotResolveCSS=Cannot resolve the following CSS selector: ================================================ FILE: locales/hu/bluegriffon/sidebars/its20/its20Overlay.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/sidebars/its20/locNoteRule.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/sidebars/its20/selector.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/sidebars/its20/termRule.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/sidebars/its20/translateRule.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/sidebars/scripteditor/editor.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/sidebars/scripteditor/scripteditor.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/sidebars/scripteditor/scripteditor.properties ================================================ # NLS_MESSAGEFORMAT_VAR ConfirmDeletionTitle=Parancsfájl törlése ConfirmDeletion=Biztosan törölni kívánja ezt a parancsfájlt? AddExternalScriptTitle=Külső parancsfájl hozzáadása PromptScriptURL=A parancsfájl URL címe? ================================================ FILE: locales/hu/bluegriffon/sidebars/scripteditor/scripteditorOverlay.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/sidebars/stylesheets/editor.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/sidebars/stylesheets/stylesheets.dtd ================================================ ================================================ FILE: locales/hu/bluegriffon/sidebars/stylesheets/stylesheetsOverlay.dtd ================================================ ================================================ FILE: locales/hu/cssproperties.mn ================================================ bluegriffon-hu.jar: % locale cssproperties hu %locale/hu/cssproperties/ locale/hu/cssproperties/csspropertiesOverlay.dtd (locale/hu/csspropertiesOverlay.dtd) locale/hu/cssproperties/cssproperties.dtd (locale/hu/cssproperties.dtd) locale/hu/cssproperties/editGridTemplate.dtd (locale/hu/editGridTemplate.dtd) locale/hu/cssproperties/backgrounditem.dtd (locale/hu/backgrounditem.dtd) locale/hu/cssproperties/griditemposition.dtd (locale/hu/griditemposition.dtd) locale/hu/cssproperties/transformationitem.dtd (locale/hu/transformationitem.dtd) locale/hu/cssproperties/transitionitem.dtd (locale/hu/transitionitem.dtd) locale/hu/cssproperties/textshadowitem.dtd (locale/hu/textshadowitem.dtd) locale/hu/cssproperties/colorstopitem.dtd (locale/hu/colorstopitem.dtd) locale/hu/cssproperties/backgrounditem.properties (locale/hu/backgrounditem.properties) locale/hu/cssproperties/cssproperties.properties (locale/hu/cssproperties.properties) locale/hu/cssproperties/fontFeatures.properties (locale/hu/fontFeatures.properties) ================================================ FILE: locales/hu/domexplorer.mn ================================================ bluegriffon-hu.jar: % locale domexplorer hu %locale/hu/domexplorer/ locale/hu/domexplorer/domexplorerOverlay.dtd (locale/hu/domexplorerOverlay.dtd) locale/hu/domexplorer/domexplorer.dtd (locale/hu/domexplorer.dtd) ================================================ FILE: locales/hu/fs.mn ================================================ fs-hu.jar: % locale fs hu %locale/hu/fs/ locale/hu/fs/fsOverlay.dtd (locale/hu/fsOverlay.dtd) locale/hu/fs/fs.dtd (locale/hu/fs.dtd) locale/hu/fs/fs.properties (locale/hu/fs.properties) locale/hu/fs/addFont.dtd (locale/hu/addFont.dtd) ================================================ FILE: locales/hu/gfd.mn ================================================ gfd-hu.jar: % locale gfd hu %locale/hu/gfd/ locale/hu/gfd/gfdOverlay.dtd (locale/hu/gfdOverlay.dtd) locale/hu/gfd/gfd.dtd (locale/hu/gfd.dtd) locale/hu/gfd/addFont.dtd (locale/hu/addFont.dtd) ================================================ FILE: locales/hu/its20.mn ================================================ bluegriffon-hu.jar: % locale its20 hu %locale/hu/its20/ locale/hu/its20/its20Overlay.dtd (locale/hu/its20Overlay.dtd) locale/hu/its20/its20.properties (locale/hu/its20.properties) locale/hu/its20/its20.dtd (locale/hu/its20.dtd) locale/hu/its20/translateRule.dtd (locale/hu/translateRule.dtd) locale/hu/its20/locNoteRule.dtd (locale/hu/locNoteRule.dtd) locale/hu/its20/termRule.dtd (locale/hu/termRule.dtd) locale/hu/its20/selector.dtd (locale/hu/selector.dtd) ================================================ FILE: locales/hu/markdown.mn ================================================ markdown-hu.jar: % locale markdown hu %locale/hu/markdown/ locale/hu/markdown/markdownOverlay.dtd (locale/hu/markdownOverlay.dtd) locale/hu/markdown/markdown.dtd (locale/hu/markdown.dtd) ================================================ FILE: locales/hu/op1.mn ================================================ op1-hu.jar: % locale op1 hu %locale/hu/op1/ locale/hu/op1/op1Overlay.dtd (locale/hu/op1Overlay.dtd) locale/hu/op1/op1.dtd (locale/hu/op1.dtd) locale/hu/op1/a11yFirstStep.properties (locale/hu/a11yFirstStep.properties) ================================================ FILE: locales/hu/scripteditor.mn ================================================ bluegriffon-hu.jar: % locale scripteditor hu %locale/hu/scripteditor/ locale/hu/scripteditor/scripteditorOverlay.dtd (locale/hu/scripteditorOverlay.dtd) locale/hu/scripteditor/scripteditor.dtd (locale/hu/scripteditor.dtd) locale/hu/scripteditor/scripteditor.properties (locale/hu/scripteditor.properties) locale/hu/scripteditor/editor.dtd (locale/hu/editor.dtd) ================================================ FILE: locales/hu/stylesheets.mn ================================================ bluegriffon-hu.jar: % locale stylesheets hu %locale/hu/stylesheets/ locale/hu/stylesheets/stylesheetsOverlay.dtd (locale/hu/stylesheetsOverlay.dtd) locale/hu/stylesheets/stylesheets.dtd (locale/hu/stylesheets.dtd) locale/hu/stylesheets/editor.dtd (locale/hu/editor.dtd) ================================================ FILE: locales/hu/tipoftheday.mn ================================================ tipoftheday-hu.jar: % locale tipoftheday hu %locale/hu/tipoftheday/ locale/hu/tipoftheday/tipoftheday.dtd (locale/hu/tipoftheday.dtd) locale/hu/tipoftheday/tipofthedayOverlay.dtd (locale/hu/tipofthedayOverlay.dtd) locale/hu/tipoftheday/tipoftheday.rdf (locale/hu/tipoftheday.rdf) ================================================ FILE: locales/it/aria.mn ================================================ bluegriffon-it.jar: % locale aria it %locale/it/aria/ locale/it/aria/ariaOverlay.dtd (locale/it/ariaOverlay.dtd) locale/it/aria/aria.dtd (locale/it/aria.dtd) locale/it/aria/aria.properties (locale/it/aria.properties) ================================================ FILE: locales/it/base.mn ================================================ bluegriffon-it.jar: % locale bluegriffon it %locale/it/bluegriffon/ % locale branding it %locale/it/branding/ locale/it/bluegriffon/aboutDialog.dtd (locale/it/bluegriffon/aboutDialog.dtd) locale/it/bluegriffon/bluegriffon.dtd (locale/it/bluegriffon/bluegriffon.dtd) locale/it/bluegriffon/polyglot.dtd (locale/it/bluegriffon/polyglot.dtd) locale/it/bluegriffon/findbar.dtd (locale/it/bluegriffon/findbar.dtd) locale/it/bluegriffon/bluegriffon.properties (locale/it/bluegriffon/bluegriffon.properties) locale/it/bluegriffon/colourPicker.dtd (locale/it/bluegriffon/colourPicker.dtd) locale/it/bluegriffon/credits.dtd (locale/it/bluegriffon/credits.dtd) locale/it/bluegriffon/filepickerbutton.dtd (locale/it/bluegriffon/filepickerbutton.dtd) locale/it/bluegriffon/filePicking.dtd (locale/it/bluegriffon/filePicking.dtd) locale/it/bluegriffon/insertTable.dtd (locale/it/bluegriffon/insertTable.dtd) locale/it/bluegriffon/insertTable.properties (locale/it/bluegriffon/insertTable.properties) locale/it/bluegriffon/language.properties (locale/it/bluegriffon/language.properties) locale/it/bluegriffon/languages.dtd (locale/it/bluegriffon/languages.dtd) locale/it/bluegriffon/markupCleaner.dtd (locale/it/bluegriffon/markupCleaner.dtd) locale/it/bluegriffon/openLocation.dtd (locale/it/bluegriffon/openLocation.dtd) locale/it/bluegriffon/openLocation.properties (locale/it/bluegriffon/openLocation.properties) locale/it/bluegriffon/newPageWizard.dtd (locale/it/bluegriffon/newPageWizard.dtd) locale/it/bluegriffon/newPageWizard.properties (locale/it/bluegriffon/newPageWizard.properties) locale/it/bluegriffon/propertiesDeck.dtd (locale/it/bluegriffon/propertiesDeck.dtd) locale/it/bluegriffon/aria.dtd (locale/it/bluegriffon/aria.dtd) locale/it/bluegriffon/structurebar.dtd (locale/it/bluegriffon/structurebar.dtd) locale/it/bluegriffon/tabeditor.dtd (locale/it/bluegriffon/tabeditor.dtd) locale/it/bluegriffon/masterPasswordQuery.properties (locale/it/bluegriffon/masterPasswordQuery.properties) locale/it/bluegriffon/newDocument.dtd (locale/it/bluegriffon/newDocument.dtd) locale/it/bluegriffon/prefs/file.dtd (locale/it/bluegriffon/prefs/file.dtd) locale/it/bluegriffon/prefs/source.dtd (locale/it/bluegriffon/prefs/source.dtd) locale/it/bluegriffon/prefs/general.dtd (locale/it/bluegriffon/prefs/general.dtd) locale/it/bluegriffon/prefs/newPage.dtd (locale/it/bluegriffon/prefs/newPage.dtd) locale/it/bluegriffon/prefs/update.dtd (locale/it/bluegriffon/prefs/update.dtd) locale/it/bluegriffon/prefs/styles.dtd (locale/it/bluegriffon/prefs/styles.dtd) locale/it/bluegriffon/prefs/advanced.dtd (locale/it/bluegriffon/prefs/advanced.dtd) locale/it/bluegriffon/prefs/connection.dtd (locale/it/bluegriffon/prefs/connection.dtd) locale/it/bluegriffon/prefs/osx.dtd (locale/it/bluegriffon/prefs/osx.dtd) locale/it/bluegriffon/prefs/shortcuts.dtd (locale/it/bluegriffon/prefs/shortcuts.dtd) locale/it/bluegriffon/prefs/update.properties (locale/it/bluegriffon/prefs/update.properties) locale/it/bluegriffon/prefs/license.dtd (locale/it/bluegriffon/prefs/license.dtd) locale/it/bluegriffon/prefs/license.properties (locale/it/bluegriffon/prefs/license.properties) locale/it/bluegriffon/prefs/deactivateLicense.dtd (locale/it/bluegriffon/prefs/deactivateLicense.dtd) locale/it/bluegriffon/prefs.dtd (locale/it/bluegriffon/prefs.dtd) locale/it/bluegriffon/updateAvailable.dtd (locale/it/bluegriffon/updateAvailable.dtd) locale/it/bluegriffon/updates.properties (locale/it/bluegriffon/updates.properties) locale/it/branding/brand.dtd (locale/it/branding/brand.dtd) locale/it/branding/brand.properties (locale/it/branding/brand.properties) locale/it/bluegriffon/insertImage.dtd (locale/it/bluegriffon/insertImage.dtd) locale/it/bluegriffon/insertAnchor.dtd (locale/it/bluegriffon/insertAnchor.dtd) locale/it/bluegriffon/insertCommentOrPI.dtd (locale/it/bluegriffon/insertCommentOrPI.dtd) locale/it/bluegriffon/insertLink.dtd (locale/it/bluegriffon/insertLink.dtd) locale/it/bluegriffon/insertLink.properties (locale/it/bluegriffon/insertLink.properties) locale/it/bluegriffon/cssClassPicker.dtd (locale/it/bluegriffon/cssClassPicker.dtd) locale/it/bluegriffon/insertVideo.dtd (locale/it/bluegriffon/insertVideo.dtd) locale/it/bluegriffon/insertAudio.dtd (locale/it/bluegriffon/insertAudio.dtd) locale/it/bluegriffon/insertVideo.properties (locale/it/bluegriffon/insertVideo.properties) locale/it/bluegriffon/insertHTML.dtd (locale/it/bluegriffon/insertHTML.dtd) locale/it/bluegriffon/insertHR.dtd (locale/it/bluegriffon/insertHR.dtd) locale/it/bluegriffon/insertForm.dtd (locale/it/bluegriffon/insertForm.dtd) locale/it/bluegriffon/parsingError.dtd (locale/it/bluegriffon/parsingError.dtd) locale/it/bluegriffon/insertFormInput.dtd (locale/it/bluegriffon/insertFormInput.dtd) locale/it/bluegriffon/insertFieldset.dtd (locale/it/bluegriffon/insertFieldset.dtd) locale/it/bluegriffon/insertLabel.dtd (locale/it/bluegriffon/insertLabel.dtd) locale/it/bluegriffon/insertButton.dtd (locale/it/bluegriffon/insertButton.dtd) locale/it/bluegriffon/insertSelect.dtd (locale/it/bluegriffon/insertSelect.dtd) locale/it/bluegriffon/insertTextarea.dtd (locale/it/bluegriffon/insertTextarea.dtd) locale/it/bluegriffon/insertKeygen.dtd (locale/it/bluegriffon/insertKeygen.dtd) locale/it/bluegriffon/insertOutput.dtd (locale/it/bluegriffon/insertOutput.dtd) locale/it/bluegriffon/insertProgress.dtd (locale/it/bluegriffon/insertProgress.dtd) locale/it/bluegriffon/insertMeter.dtd (locale/it/bluegriffon/insertMeter.dtd) locale/it/bluegriffon/insertStylesheet.dtd (locale/it/bluegriffon/insertStylesheet.dtd) locale/it/bluegriffon/editStylesheet.dtd (locale/it/bluegriffon/editStylesheet.dtd) locale/it/bluegriffon/media.dtd (locale/it/bluegriffon/media.dtd) locale/it/bluegriffon/media.properties (locale/it/bluegriffon/media.properties) locale/it/bluegriffon/insertChars.dtd (locale/it/bluegriffon/insertChars.dtd) locale/it/bluegriffon/convertToTable.dtd (locale/it/bluegriffon/convertToTable.dtd) locale/it/bluegriffon/pageProperties.dtd (locale/it/bluegriffon/pageProperties.dtd) locale/it/bluegriffon/spellCheck.dtd (locale/it/bluegriffon/spellCheck.dtd) locale/it/bluegriffon/spellCheck.properties (locale/it/bluegriffon/spellCheck.properties) locale/it/bluegriffon/dictionary.dtd (locale/it/bluegriffon/dictionary.dtd) locale/it/bluegriffon/html5.properties (locale/it/bluegriffon/html5.properties) locale/it/bluegriffon/listProperties.dtd (locale/it/bluegriffon/listProperties.dtd) locale/it/bluegriffon/insertTOC.dtd (locale/it/bluegriffon/insertTOC.dtd) locale/it/bluegriffon/svg-edit.properties (locale/it/bluegriffon/svg-edit.properties) locale/it/bluegriffon/panels.dtd (locale/it/bluegriffon/panels.dtd) locale/it/bluegriffon/rotator.dtd (locale/it/bluegriffon/rotator.dtd) ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/aboutDialog.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/aria.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/bluegriffon.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/bluegriffon.properties ================================================ titleModifier=BlueGriffon # in the following string, %t represents the title of the page or its URL # and %b the titleModifier above titleFormat=%S - %S Unknown=[Sconosciuto] NoClassAvailable=(nessuna classe) NoIdAvailable=(nessun ID) DocumentTitle=Titolo Pagina NeedDocTitle=Inserire un titolo per la pagina corrente. DocTitleHelp=Questo identifica la pagina nel titolo finestra e nei Preferiti. ExportToText=Esporta a Testo SaveDocumentAs=Salva Pagina con nome XHTMLfiles=File XHTML untitled=senza titolo SaveDocument=Salva Pagina SaveFileFailed=Salvataggio pagina non riuscito! ExportToText=Esporta a Testo FileNotSaved=File non salvato! SaveFileBeforeClosing=Desideri salvare il file prima di chiudere questa scheda? YesSaveFile=Si, salvalo NoDiscardChanges=No, ignora le modifiche DontCloseTab=Non chiudere la scheda! IdAlreadyTaken=Questo ID è già utilizzato nel documento RemoveIdFromElement=Desideri rimuovere il ID dal elemento o annullare l'azione? YesRemoveId=Rimuovi il ID NoCancel=Annulla ReplaceAll=Sostituisci tutto... ReplacedPart1=Sostituito ReplacedPart2=occorrenze AFileWasChanged=Un file è stato modificato sul disco ReloadFile=Il file %S è stato modificato su disco, BlueGriffon deve ricaricarlo DontAskForFileChangesAgain=non mostrare più questo avviso AbandonChanges=Abbandonare le modifiche apportate a "%title%" e ricaricare la pagina? RevertCaption=Torna all'ultimo salvataggio HTMLCommentsInXHTMLTitle=Commenti HTML dentro un elemento

      Testo normale apparirà così !

      Visitati appariranno così !

      Collegamenti attivi Links appariranno così !

      ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/panels.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/parsingError.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/polyglot.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/prefs/advanced.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/prefs/connection.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/prefs/deactivateLicense.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/prefs/file.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/prefs/general.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/prefs/license.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/prefs/license.properties ================================================ activateWarning=BlueGriffon needs to restart to activate your license. Do you want to restart now? confirmRestart=Restart BlueGriffon? fullResetTitle=License activation reset fullResetErrorLabel=Impossible to perform the operation, a network error occurred. fullResetRequested=A reset link was sent to the owner of the license/transaction. BlueGriffon must now restart. fullResetInvalid=The transaction ID is invalid. ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/prefs/newPage.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/prefs/osx.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.properties ================================================ NoMainWindowAvaialble=Impossibile modificare le scorciatoie da tastiera PleaseOpenOneMainWindow=Per modificare le scorciatoie da tastiera deve essere aperta almeno una finestra di BlueGriffon ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/prefs/source.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/prefs/styles.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/prefs/update.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/prefs/update.properties ================================================ SoftwareUpdates=Aggiornamenti Software UnableToCheck=Non in grado di verificare disponibilità UpToDate=BlueGriffon è aggiornato ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/prefs.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/propertiesDeck.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/rotator.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/spellCheck.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/spellCheck.properties ================================================ CorrectSpelling=(ortografia corretta) NoSuggestedWords=(nessuna parola suggerita) NoMisspelledWord=Nessuna parola errata CheckSpellingDone=Controllo ortografia completata. CheckSpelling=Controllo Ortografia ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/structurebar.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/svg-edit.properties ================================================ SvgEdit=Modifica SVG ConfirmClose=Ci sono modifiche non salvate, desideri veramente chiudere l'Editor SVG? ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/tabeditor.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/updateAvailable.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/base/locale/bluegriffon/updates.properties ================================================ update.checkInsideButton.label = Controlla aggiornamenti update.checkInsideButton.accesskey = C update.resumeButton.label = Ripristino del download di %S… update.resumeButton.accesskey = R update.openUpdateUI.applyButton.label = Installa aggiornamento… update.openUpdateUI.applyButton.accesskey = I update.restart.applyButton.label = Installa aggiornamento update.restart.applyButton.accesskey = I update.openUpdateUI.upgradeButton.label = Aggiorna adesso… update.openUpdateUI.upgradeButton.accesskey = A update.restart.upgradeButton.label = Aggiorna adesso update.restart.upgradeButton.accesskey = A ================================================ FILE: locales/it/bluegriffon/base/locale/branding/brand.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/base/locale/branding/brand.properties ================================================ brandShortName=BlueGriffon brandFullName=BlueGriffon vendorShortName=Disruptive Innovations sidebarName=Sidebar ================================================ FILE: locales/it/bluegriffon/extensions/fs/addFont.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/extensions/fs/fs.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/extensions/fs/fs.properties ================================================ SelectDir=Seleziona una cartella dove decomprimere il pacchetto caratteri SelectFile=Seleziona un pacchetto caratteri stylesheet.css esistente Stylesheet=Un FontSquirrel pacchetto caratteri foglio di stile MustBeSavedTitle=Documento mai stato salvato MustBeSavedMessage=Dovete salvare il file almeno uan volta prima di provare a collegare un carattere locale usando un URL relativo. Chiudete il documento e riapritelo dopo averlo salvato. ================================================ FILE: locales/it/bluegriffon/extensions/fs/fsOverlay.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/extensions/gfd/addFont.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/extensions/gfd/gfd.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/extensions/gfd/gfdOverlay.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/extensions/markdown/markdown.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/extensions/markdown/markdownOverlay.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/extensions/op1/a11yFirstStep.properties ================================================ ConformingDTDSyntax=Use a W3C-conforming DTD syntax before the html element NoWrongSyntaxOrNonConformingHierarchy=Don't use wrong attribute syntax or non-conforming element hierarchy inside the html element OneTitleInHead=Use a title element as a child of the head element NoEmptyTitle=When you provide a title element, do not leave it empty NoMetaRefresh=Don't use a meta element with an http-equiv attribute and a value equal to refresh HTMLElementHasLangAttribute=Use the lang attribute for the html element HTMLElementHasValidLangAttribute=Use a valid language code for the lang attribute NoInvalidDir=Don't use a value other than ltr, rtl or empty for the dir attribute TitleForFrames=Use the title attribute for every frame element NoEmptyTitleForFrames=When you provide a title attribute for a frame element, do not leave it empty TitleForIFrames=Use the title attribute for every iframe element NoEmptyTitleForIFrames=When you provide a title attribute for an iframe element, do not leave it empty AtLeastOneH1InBody=There must be at least one h1 element inside (at any level) the body element NoEmptyH1=When you provide a h1 element, do not leave it empty NoEmptyH2=When you provide a h2 element, do not leave it empty NoEmptyH3=When you provide a h3 element, do not leave it empty NoEmptyH4=When you provide a h4 element, do not leave it empty NoEmptyH5=When you provide a h5 element, do not leave it empty NoEmptyH6=When you provide a h6 element, do not leave it empty H2Order=Use  a h1, h2, h3, h4, h5 or h6 element as a first heading before a h2 element in the source order H3Order=Use a h2, h3, h4, h5 or h6 element as a first heading before a h3 element in the source order H4Order=Use a h3, h4, h5 or h6 element as a first heading before a h4 element in the source order H5Order=Use a h4, h5 or h6 element as a first heading before a h5 element in the source order H6Order=Use a h5 or h6 element as a first heading before a h6 element in the source order DTAsFirstChildOfDL=Use a dt element as the first child of a dl element NoEmptyLI=When you provide a li element, do not leave it empty NoAlignAttribute=Don't use the align attribute NoXmpElement=Don't use the xmp element NoEmptyP=When you provide a p element, do not leave it empty NoEmptyAExceptAnchors=When you provide an a element, do not leave it empty except if it is used as an anchor NoEmptyButton=When you provide a button element, do not leave it empty NoVlinkAttribute=Don't use the vlink attribute NoTextAttribute=Don't use the text attribute NoLinkAttribute=Don't use the link attribute noImgWithoutAlt=Use the alt attribute for every img element noAreaWithoutAlt=Use the alt attribute for every area element noAppletWithoutAlt=Use the alt attribute for every applet element noImageInputWithoutAlt=Use the alt attribute for every input type=image element noEmptyAltForImageLoneChildOfAnchorOrButton=If the img element is the only child of a button or an a element, do not leave its alt attribute empty noEmptyAltForInputImage=When you provide an alt attribute for an input type=image element, do not leave it empty noEmptyAltForAreaWithHref=When you provide an alt attribute for an area element holding an href attribute, do not leave it empty noAltSimilarToTextContent=If an img element is a child of an a element with text, do not use the same text for its alt attribute as the text inside the a element noBorderAttribute=Don't use the border attribute noSimilarAltForAreasWithDifferentHref=Don't use the same value for alt attributes for multiple area elements with different href values LongdescIsURI=Use a URI as the value for a longdesc attribute noBackgroundAttribute=Don't use the background attribute noBgsoundElement=Don't use the bgsound element TablesWithAtLeastOneTHHaveACaption=Use a caption element as the first child of a table element containing at least one th element CaptionIsDifferentFromSummaryAttribute=Don't use the same content for a caption element and a summary attribute noEmptyCaption=When you provide a caption element, do not leave it empty noCaptionInATableWithOnlyTDs=Don't use a caption element in a table element containing only td elements noAlinkAttribute=Don't use an alink attribute noSummaryAttributeSimilarToCaption=Don't use the same content for a summary attribute and a caption element noEmptySummaryIfTableHasTHOrCaption=When you provide a summary attribute for a table element containing a th or a caption element, do not leave it empty noSummaryAttributeIfOnlyTDs=Don't use a summary attribute on a table element containg only td elements noStrikeElement=Don't use the strike element noListingElement=Don't use the listing element AtLeastOneTHIfCaptionOrSummary=Use at least one th element inside a table element with a caption element or a non-empty summary attribute AllNonEmptyTHHaveScopeOrId=Use a scope or id attribute for every non-empty th element ScopeAttributeIsRowOrCol=Don't use a value other than row or col for the scope attribute noBgcolorAttribute=Don't use the bgcolor attribute noTTElement=Don't use the tt element TDHaveHeadersAttributeIfTHHasId=Use a headers attribute on every td element if the corresponding th element has an id attribute noPlaintextElement=Don't use the plaintext element noHeadersAttributeThatIsNotATHId=Don't use for a headers attribute a value which matches an id attribute used for a td of the table element AllFormsHaveAButton=Use a button, or an input of type submit, image or button inside a form element SubmitButtonsHaveNonEmptyValue=When you provide an input type=submit, do not leave its value attribute empty noMarqueeElement=Don't use the marquee element FieldsetHasALegend=Use a legend element as a child of every fieldset element FieldsetsAreInForms=Don't use a fieldset element without a form element noEmptyLegendElement=When you provide a legend element, do not leave it empty LabelElementHasForAttribute=Use the for attribute for every label element noEmptyForAttributeOnLabel=When you provide a for attribute for a label element, do not leave it empty ForAttributeMatchesAnIdInSameForm=A for attribute must have a value that matches an id attribute inside the form element OptgroupElementHasALabel=Use the label attribute for every optgroup element NoSimilarLabelInOptgroupsOfSameSelect=Don't use the same label attribute for different optgroup elements of the same select element noEmptyLabelAttributeOnOptgroup=When you provide a label attribute for an optgroup element, do not leave it empty noBasefontElement=Don't use the basefont element noBlinkElement=Don't use the blink element noCenterElement=Don't use the center element noFontElement=Don't use the font element ================================================ FILE: locales/it/bluegriffon/extensions/op1/op1.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/extensions/op1/op1Overlay.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/extensions/tipoftheday/tipoftheday.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/extensions/tipoftheday/tipoftheday.rdf ================================================ %brandDTD; ]> &brandShortName; tips http://bluegriffon.org/ &brandShortName; tip of the day Archive en-us …&brandShortName; is cross platform? …&brandShortName; exists on a wide variety of operating systems including Windows, Mac OS X, and many flavors of Linux, OS/2 … …&brandShortName; shows the title of any unsaved page with a red shadow? You can now save files from any viewing mode. …you have direct access to the &brandShortName; community? Just select “Help > User’s Community”. …you can insert HTML5 elements easily? Just select “Insert > HTML5 Element”. …you can close the current tab with one key? Control+w (Command +w on Mac OS X) will close the current tab. …you can create a new tab with a key combination? Control+n (Command +n on Mac OS X) will create a new blank tab using the same doctype as the last page created. …you can revert to a previously saved version of the currently edited document? Righ-click (context-click on Mac OS X) on the document's tab and select the Revert menu. …you can publish pages directly from &brandShortName; First install the free FireFTP add-on and set it up. It will then be available on the Tools menu. …&brandShortName; can insert any character easily? Use “Insert characters and symbols”. You can then search for any Unicode character by name or open a block for inspection. …&brandShortName; runs spellcheck by default? Right click a word to find suggestions. Switch checking on or off using “Tools > Preferences > General” . …&brandShortName; can reliably select an element? Simply click its name in the structure bar. …you can move an element in your document using the mouse? First select as in previous tip then just drag it to where needed. …you can quickly open existing pages? The paid for Project manager add-on permits instant access to pages and images which are organised as a project. …you can choose your default browser? Use “Tools > Preferences > Advanced > Reset external browser settings”. Next time you browse you can choose a browser. …&brandShortName; allows you to use external stylesheets? To create one ready for use click “Panels > Stylesheets”. Click the plus sign and select “Linked to the document”. …&brandShortName; can manage stylesheets and complex selectors? Using the CSS Pro Editor (a paid for add-on) you change the order of and add titles and rel attribute to stylesheets and develop complex CSS 2 and 3 selectors with advanced help. …panels can be resized? Drag the grab handle at the bottom right corner to the size needed. …attributes can be added to any element? Open “Panels > DOM Explorer”. In wysiwyg view click in the element, select use the Attributes tab and click the plus sign. …&brandShortName; can handle CSS3 properties? Vendor prefixes will be added for browsers that need them. …you can personalize keyboard shortcuts? Any menu item can be allocated to your preferred key. Open “Tools > Preferences > Keyboard Shortcuts”. Find and double-click the command wanted. In the new window key a shortcut. …you can remove a class from an element? Just select the element and in the Class drop down box re-apply the class. ================================================ FILE: locales/it/bluegriffon/extensions/tipoftheday/tipofthedayOverlay.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/sidebars/aria/aria.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/sidebars/aria/aria.properties ================================================ mustBeContainedIn=must be contained in or= or ok=OK mustContain=must contain and= and deprecated=deprecated missingTextbox=missing textbox missingListboxTreeGridDialog=missing listbox, tree, grid or dialog ================================================ FILE: locales/it/bluegriffon/sidebars/aria/ariaOverlay.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/sidebars/cssproperties/backgrounditem.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/sidebars/cssproperties/backgrounditem.properties ================================================ backgroundColorTitle=Colore backgroundImageTitle=immagine backgroundLinearGradientTitle=Gradiente lineare backgroundRadialGradientTitle=Gradiente radiale ================================================ FILE: locales/it/bluegriffon/sidebars/cssproperties/colorstopitem.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/sidebars/cssproperties/cssproperties.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/sidebars/cssproperties/cssproperties.properties ================================================ EnterAnId=Inserire un ID EnterUniqueId=Dovete fornire un ID univoco per l'elemento: NoClasSelected=Dovete selezionare un nome classe PleaseSelectAClass=Una classe deve essere selezionata per applicare le modifiche richieste ================================================ FILE: locales/it/bluegriffon/sidebars/cssproperties/csspropertiesOverlay.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/sidebars/cssproperties/editGridTemplate.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/sidebars/cssproperties/fontFeatures.properties ================================================ FFaalt=Access all alternates FFcalt=Contextual alternates FFsalt=Stylistic alternates FFliga=Standard ligatures FFclig=Contextual ligatures FFdlig=Discretionary ligatures FFhist=Historical forms FFhlig=Historical ligatures FFunic=Unicase FFsmcp=Small capitals FFc2sc=Small capitals from capitals FFc2pc=Petite capitals from capitals FFpcap=Petite capitals FFcase=Case sensitive forms FFcpsp=Capital spacing FFtitl=Titling FFswsh=Swash FFcswh=Contextual swash FFfrac=Fractions FFafrc=Alternative fractions FFordn=Ordinals FFnumr=Numerators FFdnom=Denominators FFsinf=Scientific inferiors FFsups=Superscript FFsubs=Subscript FFonum=Oldstyle figures FFlnum=Lining Figures FFpnum=Proportional figures FFtnum=Tabular figures FFzero=Slashed zero FFmgrk=Mathematical greek FFnalt=Alternate annotation forms FFornm=Ornaments FFlocl=Localized forms FFsize=Optical size FFisol=Isolated forms FFinit=Initial forms FFmedi=Medial forms FFfinal=Final forms FFrlig=Requird ligatures FFccmp=Glyph composition/decomposition FFmark=Mark to base positioning FFmkmj=Mark to mark positioning FFhwid=Half widths ================================================ FILE: locales/it/bluegriffon/sidebars/cssproperties/griditemposition.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/sidebars/cssproperties/textshadowitem.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/sidebars/cssproperties/transformationitem.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/sidebars/cssproperties/transitionitem.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/sidebars/domexplorer/domexplorer.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/sidebars/domexplorer/domexplorerOverlay.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/sidebars/its20/its20.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/sidebars/its20/its20.properties ================================================ LoadError=Load Error InlineParseError=Inline resource is not an ITS 2.0 document CannotFetch=Cannot fetch URL NotITS=Resource is not an ITS 2.0 document TranslatableByGlobalRule=Translatable by global rule NotTranslatableByGlobalRule=Not translatable by global rule InlineRules=Inline rules translateRule=Translate locNoteRule=Localization Note termRule=Terminology dirRule=Directionality langRule=Language Information withinTextRule=Elements Within Text domainRule=Domain textAnalysisRule=Text Analysis localeFilterRule=Locale Filter provRule=Provenance externalResourceRefRule=External Resource targetPointerRule=Target Pointer idValueRule=Id Value preserveSpaceRule=Preserve Space locQualityIssueRule=Localization Quality Issue mtConfidenceRule=Machine-Translation Confidence allowedCharactersRule=Allowed Characters storageSizeRule=Storage Size DontWarnAgainForUrl=Don't warn me again about this URL DontWarnAgainForInline=Don't warn me again about inline global rules NewITSFile=New ITS 2.0 File CannotResolveXPath=Cannot resolve the following XPath selector (undeclared HTML namespace?): XPathParsingError=XPath Parsing Error DontWarnAgainForSelector=Don't warn me again about this selector CSSParsingError=CSS Parsing Error CannotResolveCSS=Cannot resolve the following CSS selector: ================================================ FILE: locales/it/bluegriffon/sidebars/its20/its20Overlay.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/sidebars/its20/locNoteRule.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/sidebars/its20/selector.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/sidebars/its20/termRule.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/sidebars/its20/translateRule.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/sidebars/scripteditor/editor.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/sidebars/scripteditor/scripteditor.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/sidebars/scripteditor/scripteditor.properties ================================================ ConfirmDeletionTitle=Elimina uno script ConfirmDeletion=Siete sicuri di volere eliminare questo script? AddExternalScriptTitle=Aggiungi uno script esterno PromptScriptURL=URL dello script? ================================================ FILE: locales/it/bluegriffon/sidebars/scripteditor/scripteditorOverlay.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/sidebars/stylesheets/editor.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/sidebars/stylesheets/stylesheets.dtd ================================================ ================================================ FILE: locales/it/bluegriffon/sidebars/stylesheets/stylesheetsOverlay.dtd ================================================ ================================================ FILE: locales/it/cssproperties.mn ================================================ bluegriffon-it.jar: % locale cssproperties it %locale/it/cssproperties/ locale/it/cssproperties/csspropertiesOverlay.dtd (locale/it/csspropertiesOverlay.dtd) locale/it/cssproperties/cssproperties.dtd (locale/it/cssproperties.dtd) locale/it/cssproperties/editGridTemplate.dtd (locale/it/editGridTemplate.dtd) locale/it/cssproperties/backgrounditem.dtd (locale/it/backgrounditem.dtd) locale/it/cssproperties/griditemposition.dtd (locale/it/griditemposition.dtd) locale/it/cssproperties/transformationitem.dtd (locale/it/transformationitem.dtd) locale/it/cssproperties/transitionitem.dtd (locale/it/transitionitem.dtd) locale/it/cssproperties/textshadowitem.dtd (locale/it/textshadowitem.dtd) locale/it/cssproperties/colorstopitem.dtd (locale/it/colorstopitem.dtd) locale/it/cssproperties/backgrounditem.properties (locale/it/backgrounditem.properties) locale/it/cssproperties/cssproperties.properties (locale/it/cssproperties.properties) locale/it/cssproperties/fontFeatures.properties (locale/it/fontFeatures.properties) ================================================ FILE: locales/it/domexplorer.mn ================================================ bluegriffon-it.jar: % locale domexplorer it %locale/it/domexplorer/ locale/it/domexplorer/domexplorerOverlay.dtd (locale/it/domexplorerOverlay.dtd) locale/it/domexplorer/domexplorer.dtd (locale/it/domexplorer.dtd) ================================================ FILE: locales/it/fs.mn ================================================ fs-it.jar: % locale fs it %locale/it/fs/ locale/it/fs/fsOverlay.dtd (locale/it/fsOverlay.dtd) locale/it/fs/fs.dtd (locale/it/fs.dtd) locale/it/fs/fs.properties (locale/it/fs.properties) locale/it/fs/addFont.dtd (locale/it/addFont.dtd) ================================================ FILE: locales/it/gfd.mn ================================================ gfd-it.jar: % locale gfd it %locale/it/gfd/ locale/it/gfd/gfdOverlay.dtd (locale/it/gfdOverlay.dtd) locale/it/gfd/gfd.dtd (locale/it/gfd.dtd) locale/it/gfd/addFont.dtd (locale/it/addFont.dtd) ================================================ FILE: locales/it/its20.mn ================================================ bluegriffon-it.jar: % locale its20 it %locale/it/its20/ locale/it/its20/its20Overlay.dtd (locale/it/its20Overlay.dtd) locale/it/its20/its20.properties (locale/it/its20.properties) locale/it/its20/its20.dtd (locale/it/its20.dtd) locale/it/its20/translateRule.dtd (locale/it/translateRule.dtd) locale/it/its20/locNoteRule.dtd (locale/it/locNoteRule.dtd) locale/it/its20/termRule.dtd (locale/it/termRule.dtd) locale/it/its20/selector.dtd (locale/it/selector.dtd) ================================================ FILE: locales/it/markdown.mn ================================================ markdown-it.jar: % locale markdown it %locale/it/markdown/ locale/it/markdown/markdownOverlay.dtd (locale/it/markdownOverlay.dtd) locale/it/markdown/markdown.dtd (locale/it/markdown.dtd) ================================================ FILE: locales/it/op1.mn ================================================ op1-it.jar: % locale op1 it %locale/it/op1/ locale/it/op1/op1Overlay.dtd (locale/it/op1Overlay.dtd) locale/it/op1/op1.dtd (locale/it/op1.dtd) locale/it/op1/a11yFirstStep.properties (locale/it/a11yFirstStep.properties) ================================================ FILE: locales/it/scripteditor.mn ================================================ bluegriffon-it.jar: % locale scripteditor it %locale/it/scripteditor/ locale/it/scripteditor/scripteditorOverlay.dtd (locale/it/scripteditorOverlay.dtd) locale/it/scripteditor/scripteditor.dtd (locale/it/scripteditor.dtd) locale/it/scripteditor/scripteditor.properties (locale/it/scripteditor.properties) locale/it/scripteditor/editor.dtd (locale/it/editor.dtd) ================================================ FILE: locales/it/stylesheets.mn ================================================ bluegriffon-it.jar: % locale stylesheets it %locale/it/stylesheets/ locale/it/stylesheets/stylesheetsOverlay.dtd (locale/it/stylesheetsOverlay.dtd) locale/it/stylesheets/stylesheets.dtd (locale/it/stylesheets.dtd) locale/it/stylesheets/editor.dtd (locale/it/editor.dtd) ================================================ FILE: locales/it/tipoftheday.mn ================================================ tipoftheday-it.jar: % locale tipoftheday it %locale/it/tipoftheday/ locale/it/tipoftheday/tipoftheday.dtd (locale/it/tipoftheday.dtd) locale/it/tipoftheday/tipofthedayOverlay.dtd (locale/it/tipofthedayOverlay.dtd) locale/it/tipoftheday/tipoftheday.rdf (locale/it/tipoftheday.rdf) ================================================ FILE: locales/ja/aria.mn ================================================ bluegriffon-ja.jar: % locale aria ja %locale/ja/aria/ locale/ja/aria/ariaOverlay.dtd (locale/ja/ariaOverlay.dtd) locale/ja/aria/aria.dtd (locale/ja/aria.dtd) locale/ja/aria/aria.properties (locale/ja/aria.properties) ================================================ FILE: locales/ja/base.mn ================================================ bluegriffon-ja.jar: % locale bluegriffon ja %locale/ja/bluegriffon/ % locale branding ja %locale/ja/branding/ locale/ja/bluegriffon/aboutDialog.dtd (locale/ja/bluegriffon/aboutDialog.dtd) locale/ja/bluegriffon/bluegriffon.dtd (locale/ja/bluegriffon/bluegriffon.dtd) locale/ja/bluegriffon/polyglot.dtd (locale/ja/bluegriffon/polyglot.dtd) locale/ja/bluegriffon/findbar.dtd (locale/ja/bluegriffon/findbar.dtd) locale/ja/bluegriffon/bluegriffon.properties (locale/ja/bluegriffon/bluegriffon.properties) locale/ja/bluegriffon/colourPicker.dtd (locale/ja/bluegriffon/colourPicker.dtd) locale/ja/bluegriffon/credits.dtd (locale/ja/bluegriffon/credits.dtd) locale/ja/bluegriffon/filepickerbutton.dtd (locale/ja/bluegriffon/filepickerbutton.dtd) locale/ja/bluegriffon/filePicking.dtd (locale/ja/bluegriffon/filePicking.dtd) locale/ja/bluegriffon/insertTable.dtd (locale/ja/bluegriffon/insertTable.dtd) locale/ja/bluegriffon/insertTable.properties (locale/ja/bluegriffon/insertTable.properties) locale/ja/bluegriffon/language.properties (locale/ja/bluegriffon/language.properties) locale/ja/bluegriffon/languages.dtd (locale/ja/bluegriffon/languages.dtd) locale/ja/bluegriffon/markupCleaner.dtd (locale/ja/bluegriffon/markupCleaner.dtd) locale/ja/bluegriffon/openLocation.dtd (locale/ja/bluegriffon/openLocation.dtd) locale/ja/bluegriffon/openLocation.properties (locale/ja/bluegriffon/openLocation.properties) locale/ja/bluegriffon/newPageWizard.dtd (locale/ja/bluegriffon/newPageWizard.dtd) locale/ja/bluegriffon/newPageWizard.properties (locale/ja/bluegriffon/newPageWizard.properties) locale/ja/bluegriffon/propertiesDeck.dtd (locale/ja/bluegriffon/propertiesDeck.dtd) locale/ja/bluegriffon/aria.dtd (locale/ja/bluegriffon/aria.dtd) locale/ja/bluegriffon/structurebar.dtd (locale/ja/bluegriffon/structurebar.dtd) locale/ja/bluegriffon/tabeditor.dtd (locale/ja/bluegriffon/tabeditor.dtd) locale/ja/bluegriffon/masterPasswordQuery.properties (locale/ja/bluegriffon/masterPasswordQuery.properties) locale/ja/bluegriffon/newDocument.dtd (locale/ja/bluegriffon/newDocument.dtd) locale/ja/bluegriffon/prefs/file.dtd (locale/ja/bluegriffon/prefs/file.dtd) locale/ja/bluegriffon/prefs/source.dtd (locale/ja/bluegriffon/prefs/source.dtd) locale/ja/bluegriffon/prefs/general.dtd (locale/ja/bluegriffon/prefs/general.dtd) locale/ja/bluegriffon/prefs/newPage.dtd (locale/ja/bluegriffon/prefs/newPage.dtd) locale/ja/bluegriffon/prefs/update.dtd (locale/ja/bluegriffon/prefs/update.dtd) locale/ja/bluegriffon/prefs/styles.dtd (locale/ja/bluegriffon/prefs/styles.dtd) locale/ja/bluegriffon/prefs/advanced.dtd (locale/ja/bluegriffon/prefs/advanced.dtd) locale/ja/bluegriffon/prefs/connection.dtd (locale/ja/bluegriffon/prefs/connection.dtd) locale/ja/bluegriffon/prefs/osx.dtd (locale/ja/bluegriffon/prefs/osx.dtd) locale/ja/bluegriffon/prefs/shortcuts.dtd (locale/ja/bluegriffon/prefs/shortcuts.dtd) locale/ja/bluegriffon/prefs/update.properties (locale/ja/bluegriffon/prefs/update.properties) locale/ja/bluegriffon/prefs/license.dtd (locale/ja/bluegriffon/prefs/license.dtd) locale/ja/bluegriffon/prefs/license.properties (locale/ja/bluegriffon/prefs/license.properties) locale/ja/bluegriffon/prefs/deactivateLicense.dtd (locale/ja/bluegriffon/prefs/deactivateLicense.dtd) locale/ja/bluegriffon/prefs.dtd (locale/ja/bluegriffon/prefs.dtd) locale/ja/bluegriffon/updateAvailable.dtd (locale/ja/bluegriffon/updateAvailable.dtd) locale/ja/bluegriffon/updates.properties (locale/ja/bluegriffon/updates.properties) locale/ja/branding/brand.dtd (locale/ja/branding/brand.dtd) locale/ja/branding/brand.properties (locale/ja/branding/brand.properties) locale/ja/bluegriffon/insertImage.dtd (locale/ja/bluegriffon/insertImage.dtd) locale/ja/bluegriffon/insertAnchor.dtd (locale/ja/bluegriffon/insertAnchor.dtd) locale/ja/bluegriffon/insertCommentOrPI.dtd (locale/ja/bluegriffon/insertCommentOrPI.dtd) locale/ja/bluegriffon/insertLink.dtd (locale/ja/bluegriffon/insertLink.dtd) locale/ja/bluegriffon/insertLink.properties (locale/ja/bluegriffon/insertLink.properties) locale/ja/bluegriffon/cssClassPicker.dtd (locale/ja/bluegriffon/cssClassPicker.dtd) locale/ja/bluegriffon/insertVideo.dtd (locale/ja/bluegriffon/insertVideo.dtd) locale/ja/bluegriffon/insertAudio.dtd (locale/ja/bluegriffon/insertAudio.dtd) locale/ja/bluegriffon/insertVideo.properties (locale/ja/bluegriffon/insertVideo.properties) locale/ja/bluegriffon/insertHTML.dtd (locale/ja/bluegriffon/insertHTML.dtd) locale/ja/bluegriffon/insertHR.dtd (locale/ja/bluegriffon/insertHR.dtd) locale/ja/bluegriffon/insertForm.dtd (locale/ja/bluegriffon/insertForm.dtd) locale/ja/bluegriffon/parsingError.dtd (locale/ja/bluegriffon/parsingError.dtd) locale/ja/bluegriffon/insertFormInput.dtd (locale/ja/bluegriffon/insertFormInput.dtd) locale/ja/bluegriffon/insertFieldset.dtd (locale/ja/bluegriffon/insertFieldset.dtd) locale/ja/bluegriffon/insertLabel.dtd (locale/ja/bluegriffon/insertLabel.dtd) locale/ja/bluegriffon/insertButton.dtd (locale/ja/bluegriffon/insertButton.dtd) locale/ja/bluegriffon/insertSelect.dtd (locale/ja/bluegriffon/insertSelect.dtd) locale/ja/bluegriffon/insertTextarea.dtd (locale/ja/bluegriffon/insertTextarea.dtd) locale/ja/bluegriffon/insertKeygen.dtd (locale/ja/bluegriffon/insertKeygen.dtd) locale/ja/bluegriffon/insertOutput.dtd (locale/ja/bluegriffon/insertOutput.dtd) locale/ja/bluegriffon/insertProgress.dtd (locale/ja/bluegriffon/insertProgress.dtd) locale/ja/bluegriffon/insertMeter.dtd (locale/ja/bluegriffon/insertMeter.dtd) locale/ja/bluegriffon/insertStylesheet.dtd (locale/ja/bluegriffon/insertStylesheet.dtd) locale/ja/bluegriffon/editStylesheet.dtd (locale/ja/bluegriffon/editStylesheet.dtd) locale/ja/bluegriffon/media.dtd (locale/ja/bluegriffon/media.dtd) locale/ja/bluegriffon/media.properties (locale/ja/bluegriffon/media.properties) locale/ja/bluegriffon/insertChars.dtd (locale/ja/bluegriffon/insertChars.dtd) locale/ja/bluegriffon/convertToTable.dtd (locale/ja/bluegriffon/convertToTable.dtd) locale/ja/bluegriffon/pageProperties.dtd (locale/ja/bluegriffon/pageProperties.dtd) locale/ja/bluegriffon/spellCheck.dtd (locale/ja/bluegriffon/spellCheck.dtd) locale/ja/bluegriffon/spellCheck.properties (locale/ja/bluegriffon/spellCheck.properties) locale/ja/bluegriffon/dictionary.dtd (locale/ja/bluegriffon/dictionary.dtd) locale/ja/bluegriffon/html5.properties (locale/ja/bluegriffon/html5.properties) locale/ja/bluegriffon/listProperties.dtd (locale/ja/bluegriffon/listProperties.dtd) locale/ja/bluegriffon/insertTOC.dtd (locale/ja/bluegriffon/insertTOC.dtd) locale/ja/bluegriffon/svg-edit.properties (locale/ja/bluegriffon/svg-edit.properties) locale/ja/bluegriffon/panels.dtd (locale/ja/bluegriffon/panels.dtd) locale/ja/bluegriffon/rotator.dtd (locale/ja/bluegriffon/rotator.dtd) ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/aboutDialog.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/aria.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/bluegriffon.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/bluegriffon.properties ================================================ titleModifier=BlueGriffon # in the following string, %t represents the title of the page or its URL # and %b the titleModifier above titleFormat=%S - %S Unknown=[名称未設定] NoClassAvailable=(クラスなし) NoIdAvailable=(ID なし) DocumentTitle=表題 NeedDocTitle=ページの表題を入力してください。 DocTitleHelp=これはウィンドウのタイトル バーやお気に入りに表示されます。 ExportToText=テキスト ファイルとして保存 SaveDocumentAs=名前を付けて保存 XHTMLfiles=XHTML ファイル untitled=名称未設定 SaveDocument=保存 SaveFileFailed=保存できませんでした! ExportToText=テキスト ファイルとして保存 FileNotSaved=保存されていません! SaveFileBeforeClosing=タブを閉じる前に、保存しますか? YesSaveFile=はい、保存します NoDiscardChanges=いいえ、破棄します DontCloseTab=タブを閉じないでください! IdAlreadyTaken=この ID は文書中で既に使用されています RemoveIdFromElement=使用中の ID を削除しますか? YesRemoveId=使用中の ID を削除する NoCancel=キャンセル ReplaceAll=すべて置換... ReplacedPart1=置換しました ReplacedPart2=個の項目を AFileWasChanged=ディスク上のファイルが変更されました ReloadFile=ディスク上のファイル %S が変更されたため、BlueGriffon はそれをリロードする必要があります DontAskForFileChangesAgain=、次回からこの注意を表示しない AbandonChanges="%title%"の編集内容を破棄して、ページを再読み込みしますか? RevertCaption=変更を破棄 HTMLCommentsInXHTMLTitle=HTML コメントが XHTML 文書中の

      通常の文章はこのように表示されます!

      表示済みリンクはこのように表示されます!

      アクティブなリンクはこのように表示されます!

      ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/panels.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/parsingError.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/polyglot.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/prefs/advanced.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/prefs/connection.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/prefs/deactivateLicense.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/prefs/file.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/prefs/general.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/prefs/license.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/prefs/license.properties ================================================ activateWarning=BlueGriffon needs to restart to activate your license. Do you want to restart now? confirmRestart=Restart BlueGriffon? fullResetTitle=License activation reset fullResetErrorLabel=Impossible to perform the operation, a network error occurred. fullResetRequested=A reset link was sent to the owner of the license/transaction. BlueGriffon must now restart. fullResetInvalid=The transaction ID is invalid. ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/prefs/newPage.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/prefs/osx.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.properties ================================================ NoMainWindowAvaialble=キーボード ショートカットを編集することができません。 PleaseOpenOneMainWindow=キーボード ショートカットを編集するには、少なくとも BlueGriffon ウィンドウを一つ開いている必要があります。 ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/prefs/source.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/prefs/styles.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/prefs/update.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/prefs/update.properties ================================================ SoftwareUpdates=ソフトウェアの更新 UnableToCheck=更新チェックすることができません UpToDate=BlueGriffonは最新です。 ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/prefs.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/propertiesDeck.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/rotator.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/spellCheck.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/spellCheck.properties ================================================ CorrectSpelling=(修正する) NoSuggestedWords=(修正候補がありません) NoMisspelledWord=修正対象が見つかりません CheckSpellingDone=スペル チェックを完了しました。 CheckSpelling=スペル チェック ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/structurebar.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/svg-edit.properties ================================================ SvgEdit=SVG Edit ConfirmClose=保存されていない変更がありますが、本当にSVG Editを終了しますか? ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/tabeditor.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/updateAvailable.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/base/locale/bluegriffon/updates.properties ================================================ update.checkInsideButton.label = ソフトウェアの更新を確認 update.checkInsideButton.accesskey = C update.resumeButton.label = ダウンロードを再開: %S... update.resumeButton.accesskey = D update.openUpdateUI.applyButton.label = ダウンロードした更新を適用... update.openUpdateUI.applyButton.accesskey = A update.restart.applyButton.label = ダウンロードした更新を適用... update.restart.applyButton.accesskey = A update.openUpdateUI.upgradeButton.label = ダウンロードした更新を今すぐ適用... update.openUpdateUI.upgradeButton.accesskey = U update.restart.upgradeButton.label = ダウンロードした更新を今すぐ適用 update.restart.upgradeButton.accesskey = U ================================================ FILE: locales/ja/bluegriffon/base/locale/branding/brand.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/base/locale/branding/brand.properties ================================================ brandShortName=BlueGriffon brandFullName=BlueGriffon vendorShortName=Disruptive Innovations sidebarName=サイド バー ================================================ FILE: locales/ja/bluegriffon/extensions/fs/addFont.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/extensions/fs/fs.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/extensions/fs/fs.properties ================================================ SelectDir=フォント パッケージを解凍するディレクトリを選択してください SelectFile=フォント パッケージの stylesheet.css を選択してください Stylesheet=FontSquirrel パッケージのスタイルシート MustBeSavedTitle=この文書はまだ保存されていません MustBeSavedMessage=相対 URL を使ってフォントを使用するには、最初にファイルを保存する必要があります。保存後、文書を閉じてから、再度開いてください。 ================================================ FILE: locales/ja/bluegriffon/extensions/fs/fsOverlay.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/extensions/gfd/addFont.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/extensions/gfd/gfd.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/extensions/gfd/gfdOverlay.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/extensions/markdown/markdown.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/extensions/markdown/markdownOverlay.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/extensions/op1/a11yFirstStep.properties ================================================ ConformingDTDSyntax=html 要素の前に W3C 準拠の DTD 宣言を記述する NoWrongSyntaxOrNonConformingHierarchy=インライン要素の中にブロック要素を含めない OneTitleInHead=head 要素には一個の title 要素を含める NoEmptyTitle=title 要素を空にしない NoMetaRefresh= http-equiv 属性の値に refresh を指定した meta 要素を使わない HTMLElementHasLangAttribute=html 要素には lang 属性をつける HTMLElementHasValidLangAttribute=lang 属性には有効な言語コードを使う NoInvalidDir=dir 属性には ltr と rtl、空以外の値を使わない TitleForFrames=すべての frame 要素に title 属性をつける NoEmptyTitleForFrames=frame 要素の title 属性を空にしない TitleForIFrames=すべての iframe 要素に title 属性をつける NoEmptyTitleForIFrames=iframe 要素の title 属性を空にしない AtLeastOneH1InBody=body 要素の子孫に h1 要素を少なくとも一つは使用する NoEmptyH1=h1 要素を空にしない NoEmptyH2=h2 要素を空にしない NoEmptyH3=h3 要素を空にしない NoEmptyH4=h4 要素を空にしない NoEmptyH5=h5 要素を空にしない NoEmptyH6=h6 要素を空にしない H2Order=ソース上で h2 要素の直前の見出しには、h1 か h2、h3、h4、h5、h6 要素を使う H3Order=ソース上で h3 要素の直前の見出しには、h2 か h3、h4、h5、h6 要素を使う H4Order=ソース上で h4 要素の直前の見出しには、h3 か h4、h5、h6 要素を使う H5Order=ソース上で h5 要素の直前の見出しには、h4 か h5、h6 要素を使う H6Order=ソース上で h6 要素の直前の見出しには、h5 か h6 要素を使う DTAsFirstChildOfDL=dt 要素は、dl 要素の最初の子要素として使う NoEmptyLI=li 要素を空にしない NoAlignAttribute=align 属性を使わない NoXmpElement=xmp 要素を使わない NoEmptyP=p 要素を空にしない NoEmptyAExceptAnchors=アンカーとして使うのでない限り、a 要素を空にしない NoEmptyButton=button 要素を空にしない NoVlinkAttribute=vlink 属性を使わない NoTextAttribute=text 属性を使わない NoLinkAttribute=link 属性を使わない noImgWithoutAlt=すべての img 要素に alt 属性をつける noAreaWithoutAlt=すべての area 要素に alt 属性をつける noAppletWithoutAlt=すべての applet 要素に alt 属性をつける noImageInputWithoutAlt=すべての input 要素(type=image)に alt 属性をつける noEmptyAltForImageLoneChildOfAnchorOrButton=img 要素が button 要素または a 要素の唯一の子要素である場合、その alt 属性を空にしない noEmptyAltForInputImage=input 要素(type=image)の alt 属性を空にしない noEmptyAltForAreaWithHref=href 属性を伴う area 要素に alt 属性をつける場合は、空にしない noAltSimilarToTextContent=img 要素がテキストを伴う a 要素の子要素である場合、その alt 属性を a 要素内のテキストと同じにしない noBorderAttribute=border 属性を使わない noSimilarAltForAreasWithDifferentHref=href の値が異なる複数の area 要素に対して、同じ値の alt 属性を用いない LongdescIsURI=longdesc 属性の値は URI にする noBackgroundAttribute=background 属性を使わない noBgsoundElement=bgsound 要素を使わない TablesWithAtLeastOneTHHaveACaption=少なくとも一つの th 要素を含む table 要素は、最初の子要素を caption 要素にする CaptionIsDifferentFromSummaryAttribute=caption 要素と summary 属性には、同じ内容を使わない noEmptyCaption=caption 要素は、空にしない noCaptionInATableWithOnlyTDs=td 要素だけを含む table 要素には、caption 要素を持たせない noAlinkAttribute=alink 属性を使わない noSummaryAttributeSimilarToCaption=summary 属性と caption 要素には、同じ内容を使わない noEmptySummaryIfTableHasTHOrCaption=th 要素または caption 要素を含む table 要素に summary 属性をつける場合は、空にしない noSummaryAttributeIfOnlyTDs=td 要素だけを含む table 要素には、summary 属性をつけない noStrikeElement=strike 要素を使わない noListingElement=listing 要素を使わない AtLeastOneTHIfCaptionOrSummary=caption 要素か空ではない summary 属性を持つ table 要素には、少なくとも一つの th 要素を持たせる AllNonEmptyTHHaveScopeOrId=空ではない th 要素には、必ず scope 属性または id 属性をつける ScopeAttributeIsRowOrCol=scope 属性には row と col 以外の値を使わない noBgcolorAttribute=bgcolor 属性を使わない noTTElement=tt 要素を使わない TDHaveHeadersAttributeIfTHHasId=対応する th 要素が id 属性を持つ場合、すべての td 要素に headers 属性をつける noPlaintextElement=plaintext 要素を使わない noHeadersAttributeThatIsNotATHId=headers 属性の値は、その table 要素内の th 要素が使用している id 属性のどれかと一致させる AllFormsHaveAButton=form 要素の中には必ず、button 要素か、あるいは type 属性が submit、image または button の input 要素を置く SubmitButtonsHaveNonEmptyValue=input 要素(type=submit)の value 属性を空にしない noMarqueeElement=marquee 要素を使わない FieldsetHasALegend=fieldset 要素の直接の子要素を常に legend 要素にする FieldsetsAreInForms=fieldset 要素は必ず form 要素内に置く noEmptyLegendElement=legend 要素を空にしない LabelElementHasForAttribute=すべての label 要素に for 属性をつける noEmptyForAttributeOnLabel=label 要素の for 属性を空にしない ForAttributeMatchesAnIdInSameForm=for 属性の値は、その form 要素内の id 属性のどれかと一致させる OptgroupElementHasALabel=すべての optgroup 要素に label 属性をつける NoSimilarLabelInOptgroupsOfSameSelect=同じ select 要素内の異なる optgroup 要素間には、同じ label 属性をつけない noEmptyLabelAttributeOnOptgroup=optgroup 要素の label 属性を空にしない noBasefontElement=basefont 要素を使わない noBlinkElement=blink 要素を使わない noCenterElement=center 要素を使わない noFontElement=font 要素を使わない ================================================ FILE: locales/ja/bluegriffon/extensions/op1/op1.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/extensions/op1/op1Overlay.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/extensions/tipoftheday/tipoftheday.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/extensions/tipoftheday/tipoftheday.rdf ================================================ %brandDTD; ]> &brandShortName; tips http://bluegriffon.org/ &brandShortName; tip of the day Archive en-us …&brandShortName; is cross platform? …&brandShortName; exists on a wide variety of operating systems including Windows, Mac OS X, and many flavors of Linux, OS/2 … …&brandShortName; shows the title of any unsaved page with a red shadow? You can now save files from any viewing mode. …you have direct access to the &brandShortName; community? Just select “Help > User’s Community”. …you can insert HTML5 elements easily? Just select “Insert > HTML5 Element”. …you can close the current tab with one key? Control+w (Command +w on Mac OS X) will close the current tab. …you can create a new tab with a key combination? Control+n (Command +n on Mac OS X) will create a new blank tab using the same doctype as the last page created. …you can revert to a previously saved version of the currently edited document? Righ-click (context-click on Mac OS X) on the document's tab and select the Revert menu. …you can publish pages directly from &brandShortName; First install the free FireFTP add-on and set it up. It will then be available on the Tools menu. …&brandShortName; can insert any character easily? Use “Insert characters and symbols”. You can then search for any Unicode character by name or open a block for inspection. …&brandShortName; runs spellcheck by default? Right click a word to find suggestions. Switch checking on or off using “Tools > Preferences > General” . …&brandShortName; can reliably select an element? Simply click its name in the structure bar. …you can move an element in your document using the mouse? First select as in previous tip then just drag it to where needed. …you can quickly open existing pages? The paid for Project manager add-on permits instant access to pages and images which are organised as a project. …you can choose your default browser? Use “Tools > Preferences > Advanced > Reset external browser settings”. Next time you browse you can choose a browser. …&brandShortName; allows you to use external stylesheets? To create one ready for use click “Panels > Stylesheets”. Click the plus sign and select “Linked to the document”. …&brandShortName; can manage stylesheets and complex selectors? Using the CSS Pro Editor (a paid for add-on) you change the order of and add titles and rel attribute to stylesheets and develop complex CSS 2 and 3 selectors with advanced help. …panels can be resized? Drag the grab handle at the bottom right corner to the size needed. …attributes can be added to any element? Open “Panels > DOM Explorer”. In wysiwyg view click in the element, select use the Attributes tab and click the plus sign. …&brandShortName; can handle CSS3 properties? Vendor prefixes will be added for browsers that need them. …you can personalize keyboard shortcuts? Any menu item can be allocated to your preferred key. Open “Tools > Preferences > Keyboard Shortcuts”. Find and double-click the command wanted. In the new window key a shortcut. …you can remove a class from an element? Just select the element and in the Class drop down box re-apply the class. ================================================ FILE: locales/ja/bluegriffon/extensions/tipoftheday/tipofthedayOverlay.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/sidebars/aria/aria.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/sidebars/aria/aria.properties ================================================ mustBeContainedIn=must be contained in or= or ok=OK mustContain=must contain and= and deprecated=deprecated missingTextbox=missing textbox missingListboxTreeGridDialog=missing listbox, tree, grid or dialog ================================================ FILE: locales/ja/bluegriffon/sidebars/aria/ariaOverlay.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/sidebars/cssproperties/backgrounditem.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/sidebars/cssproperties/backgrounditem.properties ================================================ backgroundColorTitle=色 backgroundImageTitle=画像 backgroundLinearGradientTitle=線状グラデーション backgroundRadialGradientTitle=放射状グラデーション ================================================ FILE: locales/ja/bluegriffon/sidebars/cssproperties/colorstopitem.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/sidebars/cssproperties/cssproperties.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/sidebars/cssproperties/cssproperties.properties ================================================ EnterAnId=ID を入力してください EnterUniqueId=同じ ID が存在します NoClasSelected=クラス名を選択してください PleaseSelectAClass=クラスを選択してから、実行してください ================================================ FILE: locales/ja/bluegriffon/sidebars/cssproperties/csspropertiesOverlay.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/sidebars/cssproperties/editGridTemplate.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/sidebars/cssproperties/fontFeatures.properties ================================================ FFaalt=Access all alternates FFcalt=Contextual alternates FFsalt=Stylistic alternates FFliga=Standard ligatures FFclig=Contextual ligatures FFdlig=Discretionary ligatures FFhist=Historical forms FFhlig=Historical ligatures FFunic=Unicase FFsmcp=Small capitals FFc2sc=Small capitals from capitals FFc2pc=Petite capitals from capitals FFpcap=Petite capitals FFcase=Case sensitive forms FFcpsp=Capital spacing FFtitl=Titling FFswsh=Swash FFcswh=Contextual swash FFfrac=Fractions FFafrc=Alternative fractions FFordn=Ordinals FFnumr=Numerators FFdnom=Denominators FFsinf=Scientific inferiors FFsups=Superscript FFsubs=Subscript FFonum=Oldstyle figures FFlnum=Lining Figures FFpnum=Proportional figures FFtnum=Tabular figures FFzero=Slashed zero FFmgrk=Mathematical greek FFnalt=Alternate annotation forms FFornm=Ornaments FFlocl=Localized forms FFsize=Optical size FFisol=Isolated forms FFinit=Initial forms FFmedi=Medial forms FFfinal=Final forms FFrlig=Requird ligatures FFccmp=Glyph composition/decomposition FFmark=Mark to base positioning FFmkmj=Mark to mark positioning FFhwid=Half widths ================================================ FILE: locales/ja/bluegriffon/sidebars/cssproperties/griditemposition.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/sidebars/cssproperties/textshadowitem.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/sidebars/cssproperties/transformationitem.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/sidebars/cssproperties/transitionitem.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/sidebars/domexplorer/domexplorer.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/sidebars/domexplorer/domexplorerOverlay.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/sidebars/its20/its20.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/sidebars/its20/its20.properties ================================================ LoadError=Load Error InlineParseError=Inline resource is not an ITS 2.0 document CannotFetch=Cannot fetch URL NotITS=Resource is not an ITS 2.0 document TranslatableByGlobalRule=Translatable by global rule NotTranslatableByGlobalRule=Not translatable by global rule InlineRules=Inline rules translateRule=Translate locNoteRule=Localization Note termRule=Terminology dirRule=Directionality langRule=Language Information withinTextRule=Elements Within Text domainRule=Domain textAnalysisRule=Text Analysis localeFilterRule=Locale Filter provRule=Provenance externalResourceRefRule=External Resource targetPointerRule=Target Pointer idValueRule=Id Value preserveSpaceRule=Preserve Space locQualityIssueRule=Localization Quality Issue mtConfidenceRule=Machine-Translation Confidence allowedCharactersRule=Allowed Characters storageSizeRule=Storage Size DontWarnAgainForUrl=Don't warn me again about this URL DontWarnAgainForInline=Don't warn me again about inline global rules NewITSFile=New ITS 2.0 File CannotResolveXPath=Cannot resolve the following XPath selector (undeclared HTML namespace?): XPathParsingError=XPath Parsing Error DontWarnAgainForSelector=Don't warn me again about this selector CSSParsingError=CSS Parsing Error CannotResolveCSS=Cannot resolve the following CSS selector: ================================================ FILE: locales/ja/bluegriffon/sidebars/its20/its20Overlay.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/sidebars/its20/locNoteRule.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/sidebars/its20/selector.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/sidebars/its20/termRule.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/sidebars/its20/translateRule.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/sidebars/scripteditor/editor.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/sidebars/scripteditor/scripteditor.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/sidebars/scripteditor/scripteditor.properties ================================================ ConfirmDeletionTitle=スクリプトの削除 ConfirmDeletion=このスクリプトを削除してよろしいですか? AddExternalScriptTitle=外部スクリプトの追加 PromptScriptURL=スクリプトの URL は? ================================================ FILE: locales/ja/bluegriffon/sidebars/scripteditor/scripteditorOverlay.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/sidebars/stylesheets/editor.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/sidebars/stylesheets/stylesheets.dtd ================================================ ================================================ FILE: locales/ja/bluegriffon/sidebars/stylesheets/stylesheetsOverlay.dtd ================================================ ================================================ FILE: locales/ja/cssproperties.mn ================================================ bluegriffon-ja.jar: % locale cssproperties ja %locale/ja/cssproperties/ locale/ja/cssproperties/csspropertiesOverlay.dtd (locale/ja/csspropertiesOverlay.dtd) locale/ja/cssproperties/cssproperties.dtd (locale/ja/cssproperties.dtd) locale/ja/cssproperties/editGridTemplate.dtd (locale/ja/editGridTemplate.dtd) locale/ja/cssproperties/backgrounditem.dtd (locale/ja/backgrounditem.dtd) locale/ja/cssproperties/griditemposition.dtd (locale/ja/griditemposition.dtd) locale/ja/cssproperties/transformationitem.dtd (locale/ja/transformationitem.dtd) locale/ja/cssproperties/transitionitem.dtd (locale/ja/transitionitem.dtd) locale/ja/cssproperties/textshadowitem.dtd (locale/ja/textshadowitem.dtd) locale/ja/cssproperties/colorstopitem.dtd (locale/ja/colorstopitem.dtd) locale/ja/cssproperties/backgrounditem.properties (locale/ja/backgrounditem.properties) locale/ja/cssproperties/cssproperties.properties (locale/ja/cssproperties.properties) locale/ja/cssproperties/fontFeatures.properties (locale/ja/fontFeatures.properties) ================================================ FILE: locales/ja/domexplorer.mn ================================================ bluegriffon-ja.jar: % locale domexplorer ja %locale/ja/domexplorer/ locale/ja/domexplorer/domexplorerOverlay.dtd (locale/ja/domexplorerOverlay.dtd) locale/ja/domexplorer/domexplorer.dtd (locale/ja/domexplorer.dtd) ================================================ FILE: locales/ja/fs.mn ================================================ fs-ja.jar: % locale fs ja %locale/ja/fs/ locale/ja/fs/fsOverlay.dtd (locale/ja/fsOverlay.dtd) locale/ja/fs/fs.dtd (locale/ja/fs.dtd) locale/ja/fs/fs.properties (locale/ja/fs.properties) locale/ja/fs/addFont.dtd (locale/ja/addFont.dtd) ================================================ FILE: locales/ja/gfd.mn ================================================ gfd-ja.jar: % locale gfd ja %locale/ja/gfd/ locale/ja/gfd/gfdOverlay.dtd (locale/ja/gfdOverlay.dtd) locale/ja/gfd/gfd.dtd (locale/ja/gfd.dtd) locale/ja/gfd/addFont.dtd (locale/ja/addFont.dtd) ================================================ FILE: locales/ja/its20.mn ================================================ bluegriffon-ja.jar: % locale its20 ja %locale/ja/its20/ locale/ja/its20/its20Overlay.dtd (locale/ja/its20Overlay.dtd) locale/ja/its20/its20.properties (locale/ja/its20.properties) locale/ja/its20/its20.dtd (locale/ja/its20.dtd) locale/ja/its20/translateRule.dtd (locale/ja/translateRule.dtd) locale/ja/its20/locNoteRule.dtd (locale/ja/locNoteRule.dtd) locale/ja/its20/termRule.dtd (locale/ja/termRule.dtd) locale/ja/its20/selector.dtd (locale/ja/selector.dtd) ================================================ FILE: locales/ja/markdown.mn ================================================ markdown-ja.jar: % locale markdown ja %locale/ja/markdown/ locale/ja/markdown/markdownOverlay.dtd (locale/ja/markdownOverlay.dtd) locale/ja/markdown/markdown.dtd (locale/ja/markdown.dtd) ================================================ FILE: locales/ja/op1.mn ================================================ op1-ja.jar: % locale op1 ja %locale/ja/op1/ locale/ja/op1/op1Overlay.dtd (locale/ja/op1Overlay.dtd) locale/ja/op1/op1.dtd (locale/ja/op1.dtd) locale/ja/op1/a11yFirstStep.properties (locale/ja/a11yFirstStep.properties) ================================================ FILE: locales/ja/scripteditor.mn ================================================ bluegriffon-ja.jar: % locale scripteditor ja %locale/ja/scripteditor/ locale/ja/scripteditor/scripteditorOverlay.dtd (locale/ja/scripteditorOverlay.dtd) locale/ja/scripteditor/scripteditor.dtd (locale/ja/scripteditor.dtd) locale/ja/scripteditor/scripteditor.properties (locale/ja/scripteditor.properties) locale/ja/scripteditor/editor.dtd (locale/ja/editor.dtd) ================================================ FILE: locales/ja/stylesheets.mn ================================================ bluegriffon-ja.jar: % locale stylesheets ja %locale/ja/stylesheets/ locale/ja/stylesheets/stylesheetsOverlay.dtd (locale/ja/stylesheetsOverlay.dtd) locale/ja/stylesheets/stylesheets.dtd (locale/ja/stylesheets.dtd) locale/ja/stylesheets/editor.dtd (locale/ja/editor.dtd) ================================================ FILE: locales/ja/tipoftheday.mn ================================================ tipoftheday-ja.jar: % locale tipoftheday ja %locale/ja/tipoftheday/ locale/ja/tipoftheday/tipoftheday.dtd (locale/ja/tipoftheday.dtd) locale/ja/tipoftheday/tipofthedayOverlay.dtd (locale/ja/tipofthedayOverlay.dtd) locale/ja/tipoftheday/tipoftheday.rdf (locale/ja/tipoftheday.rdf) ================================================ FILE: locales/ko/aria.mn ================================================ bluegriffon-ko.jar: % locale aria ko %locale/ko/aria/ locale/ko/aria/ariaOverlay.dtd (locale/ko/ariaOverlay.dtd) locale/ko/aria/aria.dtd (locale/ko/aria.dtd) locale/ko/aria/aria.properties (locale/ko/aria.properties) ================================================ FILE: locales/ko/base.mn ================================================ bluegriffon-ko.jar: % locale bluegriffon ko %locale/ko/bluegriffon/ % locale branding ko %locale/ko/branding/ locale/ko/bluegriffon/aboutDialog.dtd (locale/ko/bluegriffon/aboutDialog.dtd) locale/ko/bluegriffon/bluegriffon.dtd (locale/ko/bluegriffon/bluegriffon.dtd) locale/ko/bluegriffon/polyglot.dtd (locale/ko/bluegriffon/polyglot.dtd) locale/ko/bluegriffon/findbar.dtd (locale/ko/bluegriffon/findbar.dtd) locale/ko/bluegriffon/bluegriffon.properties (locale/ko/bluegriffon/bluegriffon.properties) locale/ko/bluegriffon/colourPicker.dtd (locale/ko/bluegriffon/colourPicker.dtd) locale/ko/bluegriffon/credits.dtd (locale/ko/bluegriffon/credits.dtd) locale/ko/bluegriffon/filepickerbutton.dtd (locale/ko/bluegriffon/filepickerbutton.dtd) locale/ko/bluegriffon/filePicking.dtd (locale/ko/bluegriffon/filePicking.dtd) locale/ko/bluegriffon/insertTable.dtd (locale/ko/bluegriffon/insertTable.dtd) locale/ko/bluegriffon/insertTable.properties (locale/ko/bluegriffon/insertTable.properties) locale/ko/bluegriffon/language.properties (locale/ko/bluegriffon/language.properties) locale/ko/bluegriffon/languages.dtd (locale/ko/bluegriffon/languages.dtd) locale/ko/bluegriffon/markupCleaner.dtd (locale/ko/bluegriffon/markupCleaner.dtd) locale/ko/bluegriffon/openLocation.dtd (locale/ko/bluegriffon/openLocation.dtd) locale/ko/bluegriffon/openLocation.properties (locale/ko/bluegriffon/openLocation.properties) locale/ko/bluegriffon/newPageWizard.dtd (locale/ko/bluegriffon/newPageWizard.dtd) locale/ko/bluegriffon/newPageWizard.properties (locale/ko/bluegriffon/newPageWizard.properties) locale/ko/bluegriffon/propertiesDeck.dtd (locale/ko/bluegriffon/propertiesDeck.dtd) locale/ko/bluegriffon/aria.dtd (locale/ko/bluegriffon/aria.dtd) locale/ko/bluegriffon/structurebar.dtd (locale/ko/bluegriffon/structurebar.dtd) locale/ko/bluegriffon/tabeditor.dtd (locale/ko/bluegriffon/tabeditor.dtd) locale/ko/bluegriffon/masterPasswordQuery.properties (locale/ko/bluegriffon/masterPasswordQuery.properties) locale/ko/bluegriffon/newDocument.dtd (locale/ko/bluegriffon/newDocument.dtd) locale/ko/bluegriffon/prefs/file.dtd (locale/ko/bluegriffon/prefs/file.dtd) locale/ko/bluegriffon/prefs/source.dtd (locale/ko/bluegriffon/prefs/source.dtd) locale/ko/bluegriffon/prefs/general.dtd (locale/ko/bluegriffon/prefs/general.dtd) locale/ko/bluegriffon/prefs/newPage.dtd (locale/ko/bluegriffon/prefs/newPage.dtd) locale/ko/bluegriffon/prefs/update.dtd (locale/ko/bluegriffon/prefs/update.dtd) locale/ko/bluegriffon/prefs/styles.dtd (locale/ko/bluegriffon/prefs/styles.dtd) locale/ko/bluegriffon/prefs/advanced.dtd (locale/ko/bluegriffon/prefs/advanced.dtd) locale/ko/bluegriffon/prefs/connection.dtd (locale/ko/bluegriffon/prefs/connection.dtd) locale/ko/bluegriffon/prefs/osx.dtd (locale/ko/bluegriffon/prefs/osx.dtd) locale/ko/bluegriffon/prefs/shortcuts.dtd (locale/ko/bluegriffon/prefs/shortcuts.dtd) locale/ko/bluegriffon/prefs/update.properties (locale/ko/bluegriffon/prefs/update.properties) locale/ko/bluegriffon/prefs/license.dtd (locale/ko/bluegriffon/prefs/license.dtd) locale/ko/bluegriffon/prefs/license.properties (locale/ko/bluegriffon/prefs/license.properties) locale/ko/bluegriffon/prefs/deactivateLicense.dtd (locale/ko/bluegriffon/prefs/deactivateLicense.dtd) locale/ko/bluegriffon/prefs.dtd (locale/ko/bluegriffon/prefs.dtd) locale/ko/bluegriffon/updateAvailable.dtd (locale/ko/bluegriffon/updateAvailable.dtd) locale/ko/bluegriffon/updates.properties (locale/ko/bluegriffon/updates.properties) locale/ko/branding/brand.dtd (locale/ko/branding/brand.dtd) locale/ko/branding/brand.properties (locale/ko/branding/brand.properties) locale/ko/bluegriffon/insertImage.dtd (locale/ko/bluegriffon/insertImage.dtd) locale/ko/bluegriffon/insertAnchor.dtd (locale/ko/bluegriffon/insertAnchor.dtd) locale/ko/bluegriffon/insertCommentOrPI.dtd (locale/ko/bluegriffon/insertCommentOrPI.dtd) locale/ko/bluegriffon/insertLink.dtd (locale/ko/bluegriffon/insertLink.dtd) locale/ko/bluegriffon/insertLink.properties (locale/ko/bluegriffon/insertLink.properties) locale/ko/bluegriffon/cssClassPicker.dtd (locale/ko/bluegriffon/cssClassPicker.dtd) locale/ko/bluegriffon/insertVideo.dtd (locale/ko/bluegriffon/insertVideo.dtd) locale/ko/bluegriffon/insertAudio.dtd (locale/ko/bluegriffon/insertAudio.dtd) locale/ko/bluegriffon/insertVideo.properties (locale/ko/bluegriffon/insertVideo.properties) locale/ko/bluegriffon/insertHTML.dtd (locale/ko/bluegriffon/insertHTML.dtd) locale/ko/bluegriffon/insertHR.dtd (locale/ko/bluegriffon/insertHR.dtd) locale/ko/bluegriffon/insertForm.dtd (locale/ko/bluegriffon/insertForm.dtd) locale/ko/bluegriffon/parsingError.dtd (locale/ko/bluegriffon/parsingError.dtd) locale/ko/bluegriffon/insertFormInput.dtd (locale/ko/bluegriffon/insertFormInput.dtd) locale/ko/bluegriffon/insertFieldset.dtd (locale/ko/bluegriffon/insertFieldset.dtd) locale/ko/bluegriffon/insertLabel.dtd (locale/ko/bluegriffon/insertLabel.dtd) locale/ko/bluegriffon/insertButton.dtd (locale/ko/bluegriffon/insertButton.dtd) locale/ko/bluegriffon/insertSelect.dtd (locale/ko/bluegriffon/insertSelect.dtd) locale/ko/bluegriffon/insertTextarea.dtd (locale/ko/bluegriffon/insertTextarea.dtd) locale/ko/bluegriffon/insertKeygen.dtd (locale/ko/bluegriffon/insertKeygen.dtd) locale/ko/bluegriffon/insertOutput.dtd (locale/ko/bluegriffon/insertOutput.dtd) locale/ko/bluegriffon/insertProgress.dtd (locale/ko/bluegriffon/insertProgress.dtd) locale/ko/bluegriffon/insertMeter.dtd (locale/ko/bluegriffon/insertMeter.dtd) locale/ko/bluegriffon/insertStylesheet.dtd (locale/ko/bluegriffon/insertStylesheet.dtd) locale/ko/bluegriffon/editStylesheet.dtd (locale/ko/bluegriffon/editStylesheet.dtd) locale/ko/bluegriffon/media.dtd (locale/ko/bluegriffon/media.dtd) locale/ko/bluegriffon/media.properties (locale/ko/bluegriffon/media.properties) locale/ko/bluegriffon/insertChars.dtd (locale/ko/bluegriffon/insertChars.dtd) locale/ko/bluegriffon/convertToTable.dtd (locale/ko/bluegriffon/convertToTable.dtd) locale/ko/bluegriffon/pageProperties.dtd (locale/ko/bluegriffon/pageProperties.dtd) locale/ko/bluegriffon/spellCheck.dtd (locale/ko/bluegriffon/spellCheck.dtd) locale/ko/bluegriffon/spellCheck.properties (locale/ko/bluegriffon/spellCheck.properties) locale/ko/bluegriffon/dictionary.dtd (locale/ko/bluegriffon/dictionary.dtd) locale/ko/bluegriffon/html5.properties (locale/ko/bluegriffon/html5.properties) locale/ko/bluegriffon/listProperties.dtd (locale/ko/bluegriffon/listProperties.dtd) locale/ko/bluegriffon/insertTOC.dtd (locale/ko/bluegriffon/insertTOC.dtd) locale/ko/bluegriffon/svg-edit.properties (locale/ko/bluegriffon/svg-edit.properties) locale/ko/bluegriffon/panels.dtd (locale/ko/bluegriffon/panels.dtd) locale/ko/bluegriffon/rotator.dtd (locale/ko/bluegriffon/rotator.dtd) ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/aboutDialog.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/aria.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/bluegriffon.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/bluegriffon.properties ================================================ titleModifier=BlueGriffon # in the following string, %t represents the title of the page or its URL # and %b the titleModifier above titleFormat=%S - %S Unknown=[무제] NoClassAvailable=(클래스 없음) NoIdAvailable=(ID 없음) DocumentTitle=제목 NeedDocTitle=페이지 제목을 입력하세요. DocTitleHelp=창의 제목이나 즐겨찾기에 나타납니다. ExportToText=텍스트 파일로 내보내기 SaveDocumentAs=다른 이름으로 저장 XHTMLfiles=XHTML 파일 untitled=무제 SaveDocument=페이지 저장 SaveFileFailed=저장 실패! ExportToText=텍스트 파일로 내보내기 FileNotSaved=파일이 저장되어 있지 않습니다! SaveFileBeforeClosing=탭 닫기 전에 저장합니까? YesSaveFile=예, 저장합니다 NoDiscardChanges=아니오, 삭제합니다 DontCloseTab=탭을 닫지 마십시오! IdAlreadyTaken=이 ID는 문서에서 이미 사용되고 있습니다 RemoveIdFromElement=사용중인 ID를 삭제 하시겠습니까? YesRemoveId=ID 삭제 NoCancel=취소 ReplaceAll=모두 바꾸기... ReplacedPart1=대체했습니다 ReplacedPart2=개 항목 AFileWasChanged=A file was changed on disk ReloadFile=File %S changed on disk, BlueGriffon must reload it DontAskForFileChangesAgain=don't show this alert again AbandonChanges=%title%(으)로 저장하지 않고 다시 읽으시겠습니까? RevertCaption=마지막 저장 문서로 바꾸기 HTMLCommentsInXHTMLTitle=HTML comment inside a

      Normal text will look like this !

      Visited will look like this !

      Active Links will look like this !

      ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/panels.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/parsingError.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/polyglot.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/prefs/advanced.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/prefs/connection.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/prefs/deactivateLicense.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/prefs/file.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/prefs/general.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/prefs/license.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/prefs/license.properties ================================================ activateWarning=BlueGriffon needs to restart to activate your license. Do you want to restart now? confirmRestart=Restart BlueGriffon? fullResetTitle=License activation reset fullResetErrorLabel=Impossible to perform the operation, a network error occurred. fullResetRequested=A reset link was sent to the owner of the license/transaction. BlueGriffon must now restart. fullResetInvalid=The transaction ID is invalid. ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/prefs/newPage.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/prefs/osx.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.properties ================================================ NoMainWindowAvaialble=Cannot edit keyboard shortcuts PleaseOpenOneMainWindow=At least one main BlueGriffon window must be opened to edit keyboard shortcuts. ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/prefs/source.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/prefs/styles.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/prefs/update.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/prefs/update.properties ================================================ SoftwareUpdates=Software Updates UnableToCheck=Unable to check availability UpToDate=BlueGriffon is up to date ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/prefs.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/propertiesDeck.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/rotator.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/spellCheck.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/spellCheck.properties ================================================ CorrectSpelling = (수정) NoSuggestedWords = (단어가 없습니다) NoMisspelledWord = 철자가 틀린 단어 없음 CheckSpellingDone = 맞춤법 검사를 완료했습니다. CheckSpelling = 맞춤법 ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/structurebar.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/svg-edit.properties ================================================ SvgEdit=SVG Edit ConfirmClose=There are unsaved changes, do you really want to close SVG Edit? ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/tabeditor.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/updateAvailable.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/base/locale/bluegriffon/updates.properties ================================================ update.checkInsideButton.label=업데이트 확인… update.checkInsideButton.accesskey=C update.resumeButton.label=%S 다운로드 다시 시작… update.resumeButton.accesskey=D update.openUpdateUI.applyButton.label=업데이트 적용… update.openUpdateUI.applyButton.accesskey=A update.restart.applyButton.label=업데이트 적용 update.restart.applyButton.accesskey=A update.openUpdateUI.upgradeButton.label=지금 업그레이드… update.openUpdateUI.upgradeButton.accesskey=U update.restart.upgradeButton.label=지금 업그레이드 update.restart.upgradeButton.accesskey=U ================================================ FILE: locales/ko/bluegriffon/base/locale/branding/brand.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/base/locale/branding/brand.properties ================================================ brandShortName=BlueGriffon brandFullName=BlueGriffon vendorShortName=Disruptive Innovations sidebarName=사이드바 ================================================ FILE: locales/ko/bluegriffon/extensions/fs/addFont.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/extensions/fs/fs.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/extensions/fs/fs.properties ================================================ SelectDir=글꼴 패키지의 압축을 풀 디렉토리를 선택하십시오. SelectFile=글꼴 패키지 stylesheet.css를 선택하십시오 Stylesheet=FontSquirrel 패키지 스타일시트 MustBeSavedTitle=이 문서는 아직 저장되지 않았습니다 MustBeSavedMessage=상대 URL을 사용하여 글꼴을 사용하려면 먼저 파일을 저장해야합니다. 저장한 후 문서를 닫고 다시 여십시오. ================================================ FILE: locales/ko/bluegriffon/extensions/fs/fsOverlay.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/extensions/gfd/addFont.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/extensions/gfd/gfd.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/extensions/gfd/gfdOverlay.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/extensions/markdown/markdown.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/extensions/markdown/markdownOverlay.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/extensions/op1/a11yFirstStep.properties ================================================ ConformingDTDSyntax=Use a W3C-conforming DTD syntax before the html element NoWrongSyntaxOrNonConformingHierarchy=Don't use wrong attribute syntax or non-conforming element hierarchy inside the html element OneTitleInHead=Use a title element as a child of the head element NoEmptyTitle=When you provide a title element, do not leave it empty NoMetaRefresh=Don't use a meta element with an http-equiv attribute and a value equal to refresh HTMLElementHasLangAttribute=Use the lang attribute for the html element HTMLElementHasValidLangAttribute=Use a valid language code for the lang attribute NoInvalidDir=Don't use a value other than ltr, rtl or empty for the dir attribute TitleForFrames=Use the title attribute for every frame element NoEmptyTitleForFrames=When you provide a title attribute for a frame element, do not leave it empty TitleForIFrames=Use the title attribute for every iframe element NoEmptyTitleForIFrames=When you provide a title attribute for an iframe element, do not leave it empty AtLeastOneH1InBody=There must be at least one h1 element inside (at any level) the body element NoEmptyH1=When you provide a h1 element, do not leave it empty NoEmptyH2=When you provide a h2 element, do not leave it empty NoEmptyH3=When you provide a h3 element, do not leave it empty NoEmptyH4=When you provide a h4 element, do not leave it empty NoEmptyH5=When you provide a h5 element, do not leave it empty NoEmptyH6=When you provide a h6 element, do not leave it empty H2Order=Use  a h1, h2, h3, h4, h5 or h6 element as a first heading before a h2 element in the source order H3Order=Use a h2, h3, h4, h5 or h6 element as a first heading before a h3 element in the source order H4Order=Use a h3, h4, h5 or h6 element as a first heading before a h4 element in the source order H5Order=Use a h4, h5 or h6 element as a first heading before a h5 element in the source order H6Order=Use a h5 or h6 element as a first heading before a h6 element in the source order DTAsFirstChildOfDL=Use a dt element as the first child of a dl element NoEmptyLI=When you provide a li element, do not leave it empty NoAlignAttribute=Don't use the align attribute NoXmpElement=Don't use the xmp element NoEmptyP=When you provide a p element, do not leave it empty NoEmptyAExceptAnchors=When you provide an a element, do not leave it empty except if it is used as an anchor NoEmptyButton=When you provide a button element, do not leave it empty NoVlinkAttribute=Don't use the vlink attribute NoTextAttribute=Don't use the text attribute NoLinkAttribute=Don't use the link attribute noImgWithoutAlt=Use the alt attribute for every img element noAreaWithoutAlt=Use the alt attribute for every area element noAppletWithoutAlt=Use the alt attribute for every applet element noImageInputWithoutAlt=Use the alt attribute for every input type=image element noEmptyAltForImageLoneChildOfAnchorOrButton=If the img element is the only child of a button or an a element, do not leave its alt attribute empty noEmptyAltForInputImage=When you provide an alt attribute for an input type=image element, do not leave it empty noEmptyAltForAreaWithHref=When you provide an alt attribute for an area element holding an href attribute, do not leave it empty noAltSimilarToTextContent=If an img element is a child of an a element with text, do not use the same text for its alt attribute as the text inside the a element noBorderAttribute=Don't use the border attribute noSimilarAltForAreasWithDifferentHref=Don't use the same value for alt attributes for multiple area elements with different href values LongdescIsURI=Use a URI as the value for a longdesc attribute noBackgroundAttribute=Don't use the background attribute noBgsoundElement=Don't use the bgsound element TablesWithAtLeastOneTHHaveACaption=Use a caption element as the first child of a table element containing at least one th element CaptionIsDifferentFromSummaryAttribute=Don't use the same content for a caption element and a summary attribute noEmptyCaption=When you provide a caption element, do not leave it empty noCaptionInATableWithOnlyTDs=Don't use a caption element in a table element containing only td elements noAlinkAttribute=Don't use an alink attribute noSummaryAttributeSimilarToCaption=Don't use the same content for a summary attribute and a caption element noEmptySummaryIfTableHasTHOrCaption=When you provide a summary attribute for a table element containing a th or a caption element, do not leave it empty noSummaryAttributeIfOnlyTDs=Don't use a summary attribute on a table element containg only td elements noStrikeElement=Don't use the strike element noListingElement=Don't use the listing element AtLeastOneTHIfCaptionOrSummary=Use at least one th element inside a table element with a caption element or a non-empty summary attribute AllNonEmptyTHHaveScopeOrId=Use a scope or id attribute for every non-empty th element ScopeAttributeIsRowOrCol=Don't use a value other than row or col for the scope attribute noBgcolorAttribute=Don't use the bgcolor attribute noTTElement=Don't use the tt element TDHaveHeadersAttributeIfTHHasId=Use a headers attribute on every td element if the corresponding th element has an id attribute noPlaintextElement=Don't use the plaintext element noHeadersAttributeThatIsNotATHId=Don't use for a headers attribute a value which matches an id attribute used for a td of the table element AllFormsHaveAButton=Use a button, or an input of type submit, image or button inside a form element SubmitButtonsHaveNonEmptyValue=When you provide an input type=submit, do not leave its value attribute empty noMarqueeElement=Don't use the marquee element FieldsetHasALegend=Use a legend element as a child of every fieldset element FieldsetsAreInForms=Don't use a fieldset element without a form element noEmptyLegendElement=When you provide a legend element, do not leave it empty LabelElementHasForAttribute=Use the for attribute for every label element noEmptyForAttributeOnLabel=When you provide a for attribute for a label element, do not leave it empty ForAttributeMatchesAnIdInSameForm=A for attribute must have a value that matches an id attribute inside the form element OptgroupElementHasALabel=Use the label attribute for every optgroup element NoSimilarLabelInOptgroupsOfSameSelect=Don't use the same label attribute for different optgroup elements of the same select element noEmptyLabelAttributeOnOptgroup=When you provide a label attribute for an optgroup element, do not leave it empty noBasefontElement=Don't use the basefont element noBlinkElement=Don't use the blink element noCenterElement=Don't use the center element noFontElement=Don't use the font element ================================================ FILE: locales/ko/bluegriffon/extensions/op1/op1.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/extensions/op1/op1Overlay.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/extensions/tipoftheday/tipoftheday.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/extensions/tipoftheday/tipoftheday.rdf ================================================ %brandDTD; ]> &brandShortName; tips http://bluegriffon.org/ &brandShortName; tip of the day Archive en-us …&brandShortName; is cross platform? …&brandShortName; exists on a wide variety of operating systems including Windows, Mac OS X, and many flavors of Linux, OS/2 … …&brandShortName; shows the title of any unsaved page with a red shadow? You can now save files from any viewing mode. …you have direct access to the &brandShortName; community? Just select “Help > User’s Community”. …you can insert HTML5 elements easily? Just select “Insert > HTML5 Element”. …you can close the current tab with one key? Control+w (Command +w on Mac OS X) will close the current tab. …you can create a new tab with a key combination? Control+n (Command +n on Mac OS X) will create a new blank tab using the same doctype as the last page created. …you can revert to a previously saved version of the currently edited document? Righ-click (context-click on Mac OS X) on the document's tab and select the Revert menu. …you can publish pages directly from &brandShortName; First install the free FireFTP add-on and set it up. It will then be available on the Tools menu. …&brandShortName; can insert any character easily? Use “Insert characters and symbols”. You can then search for any Unicode character by name or open a block for inspection. …&brandShortName; runs spellcheck by default? Right click a word to find suggestions. Switch checking on or off using “Tools > Preferences > General” . …&brandShortName; can reliably select an element? Simply click its name in the structure bar. …you can move an element in your document using the mouse? First select as in previous tip then just drag it to where needed. …you can quickly open existing pages? The paid for Project manager add-on permits instant access to pages and images which are organised as a project. …you can choose your default browser? Use “Tools > Preferences > Advanced > Reset external browser settings”. Next time you browse you can choose a browser. …&brandShortName; allows you to use external stylesheets? To create one ready for use click “Panels > Stylesheets”. Click the plus sign and select “Linked to the document”. …&brandShortName; can manage stylesheets and complex selectors? Using the CSS Pro Editor (a paid for add-on) you change the order of and add titles and rel attribute to stylesheets and develop complex CSS 2 and 3 selectors with advanced help. …panels can be resized? Drag the grab handle at the bottom right corner to the size needed. …attributes can be added to any element? Open “Panels > DOM Explorer”. In wysiwyg view click in the element, select use the Attributes tab and click the plus sign. …&brandShortName; can handle CSS3 properties? Vendor prefixes will be added for browsers that need them. …you can personalize keyboard shortcuts? Any menu item can be allocated to your preferred key. Open “Tools > Preferences > Keyboard Shortcuts”. Find and double-click the command wanted. In the new window key a shortcut. …you can remove a class from an element? Just select the element and in the Class drop down box re-apply the class. ================================================ FILE: locales/ko/bluegriffon/extensions/tipoftheday/tipofthedayOverlay.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/sidebars/aria/aria.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/sidebars/aria/aria.properties ================================================ mustBeContainedIn=must be contained in or= or ok=OK mustContain=must contain and= and deprecated=deprecated missingTextbox=missing textbox missingListboxTreeGridDialog=missing listbox, tree, grid or dialog ================================================ FILE: locales/ko/bluegriffon/sidebars/aria/ariaOverlay.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/sidebars/cssproperties/backgrounditem.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/sidebars/cssproperties/backgrounditem.properties ================================================ backgroundColorTitle=색 backgroundImageTitle=사진/그림 backgroundLinearGradientTitle=선형 그라데이션 backgroundRadialGradientTitle=방사형 그라데이션 ================================================ FILE: locales/ko/bluegriffon/sidebars/cssproperties/colorstopitem.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/sidebars/cssproperties/cssproperties.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/sidebars/cssproperties/cssproperties.properties ================================================ EnterAnId=ID를 입력하세요. EnterUniqueId=동일한 ID가 존재합니다: NoClasSelected=클래스 이름을 선택하십시오. PleaseSelectAClass=클래스를 선택하고 실행하십시오 ================================================ FILE: locales/ko/bluegriffon/sidebars/cssproperties/csspropertiesOverlay.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/sidebars/cssproperties/editGridTemplate.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/sidebars/cssproperties/fontFeatures.properties ================================================ FFaalt=Access all alternates FFcalt=Contextual alternates FFsalt=Stylistic alternates FFliga=Standard ligatures FFclig=Contextual ligatures FFdlig=Discretionary ligatures FFhist=Historical forms FFhlig=Historical ligatures FFunic=Unicase FFsmcp=Small capitals FFc2sc=Small capitals from capitals FFc2pc=Petite capitals from capitals FFpcap=Petite capitals FFcase=Case sensitive forms FFcpsp=Capital spacing FFtitl=Titling FFswsh=Swash FFcswh=Contextual swash FFfrac=Fractions FFafrc=Alternative fractions FFordn=Ordinals FFnumr=Numerators FFdnom=Denominators FFsinf=Scientific inferiors FFsups=Superscript FFsubs=Subscript FFonum=Oldstyle figures FFlnum=Lining Figures FFpnum=Proportional figures FFtnum=Tabular figures FFzero=Slashed zero FFmgrk=Mathematical greek FFnalt=Alternate annotation forms FFornm=Ornaments FFlocl=Localized forms FFsize=Optical size FFisol=Isolated forms FFinit=Initial forms FFmedi=Medial forms FFfinal=Final forms FFrlig=Requird ligatures FFccmp=Glyph composition/decomposition FFmark=Mark to base positioning FFmkmj=Mark to mark positioning FFhwid=Half widths ================================================ FILE: locales/ko/bluegriffon/sidebars/cssproperties/griditemposition.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/sidebars/cssproperties/textshadowitem.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/sidebars/cssproperties/transformationitem.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/sidebars/cssproperties/transitionitem.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/sidebars/domexplorer/domexplorer.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/sidebars/domexplorer/domexplorerOverlay.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/sidebars/its20/its20.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/sidebars/its20/its20.properties ================================================ LoadError=Load Error InlineParseError=Inline resource is not an ITS 2.0 document CannotFetch=Cannot fetch URL NotITS=Resource is not an ITS 2.0 document TranslatableByGlobalRule=Translatable by global rule NotTranslatableByGlobalRule=Not translatable by global rule InlineRules=Inline rules translateRule=Translate locNoteRule=Localization Note termRule=Terminology dirRule=Directionality langRule=Language Information withinTextRule=Elements Within Text domainRule=Domain textAnalysisRule=Text Analysis localeFilterRule=Locale Filter provRule=Provenance externalResourceRefRule=External Resource targetPointerRule=Target Pointer idValueRule=Id Value preserveSpaceRule=Preserve Space locQualityIssueRule=Localization Quality Issue mtConfidenceRule=Machine-Translation Confidence allowedCharactersRule=Allowed Characters storageSizeRule=Storage Size DontWarnAgainForUrl=Don't warn me again about this URL DontWarnAgainForInline=Don't warn me again about inline global rules NewITSFile=New ITS 2.0 File CannotResolveXPath=Cannot resolve the following XPath selector (undeclared HTML namespace?): XPathParsingError=XPath Parsing Error DontWarnAgainForSelector=Don't warn me again about this selector CSSParsingError=CSS Parsing Error CannotResolveCSS=Cannot resolve the following CSS selector: ================================================ FILE: locales/ko/bluegriffon/sidebars/its20/its20Overlay.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/sidebars/its20/locNoteRule.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/sidebars/its20/selector.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/sidebars/its20/termRule.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/sidebars/its20/translateRule.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/sidebars/scripteditor/editor.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/sidebars/scripteditor/scripteditor.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/sidebars/scripteditor/scripteditor.properties ================================================ ConfirmDeletionTitle=Delete a script ConfirmDeletion=Are you sure you want to delete this script? AddExternalScriptTitle=Add an external script PromptScriptURL=URL of the script? ================================================ FILE: locales/ko/bluegriffon/sidebars/scripteditor/scripteditorOverlay.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/sidebars/stylesheets/editor.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/sidebars/stylesheets/stylesheets.dtd ================================================ ================================================ FILE: locales/ko/bluegriffon/sidebars/stylesheets/stylesheetsOverlay.dtd ================================================ ================================================ FILE: locales/ko/cssproperties.mn ================================================ bluegriffon-ko.jar: % locale cssproperties ko %locale/ko/cssproperties/ locale/ko/cssproperties/csspropertiesOverlay.dtd (locale/ko/csspropertiesOverlay.dtd) locale/ko/cssproperties/cssproperties.dtd (locale/ko/cssproperties.dtd) locale/ko/cssproperties/editGridTemplate.dtd (locale/ko/editGridTemplate.dtd) locale/ko/cssproperties/backgrounditem.dtd (locale/ko/backgrounditem.dtd) locale/ko/cssproperties/griditemposition.dtd (locale/ko/griditemposition.dtd) locale/ko/cssproperties/transformationitem.dtd (locale/ko/transformationitem.dtd) locale/ko/cssproperties/transitionitem.dtd (locale/ko/transitionitem.dtd) locale/ko/cssproperties/textshadowitem.dtd (locale/ko/textshadowitem.dtd) locale/ko/cssproperties/colorstopitem.dtd (locale/ko/colorstopitem.dtd) locale/ko/cssproperties/backgrounditem.properties (locale/ko/backgrounditem.properties) locale/ko/cssproperties/cssproperties.properties (locale/ko/cssproperties.properties) locale/ko/cssproperties/fontFeatures.properties (locale/ko/fontFeatures.properties) ================================================ FILE: locales/ko/domexplorer.mn ================================================ bluegriffon-ko.jar: % locale domexplorer ko %locale/ko/domexplorer/ locale/ko/domexplorer/domexplorerOverlay.dtd (locale/ko/domexplorerOverlay.dtd) locale/ko/domexplorer/domexplorer.dtd (locale/ko/domexplorer.dtd) ================================================ FILE: locales/ko/fs.mn ================================================ fs-ko.jar: % locale fs ko %locale/ko/fs/ locale/ko/fs/fsOverlay.dtd (locale/ko/fsOverlay.dtd) locale/ko/fs/fs.dtd (locale/ko/fs.dtd) locale/ko/fs/fs.properties (locale/ko/fs.properties) locale/ko/fs/addFont.dtd (locale/ko/addFont.dtd) ================================================ FILE: locales/ko/gfd.mn ================================================ gfd-ko.jar: % locale gfd ko %locale/ko/gfd/ locale/ko/gfd/gfdOverlay.dtd (locale/ko/gfdOverlay.dtd) locale/ko/gfd/gfd.dtd (locale/ko/gfd.dtd) locale/ko/gfd/addFont.dtd (locale/ko/addFont.dtd) ================================================ FILE: locales/ko/its20.mn ================================================ bluegriffon-ko.jar: % locale its20 ko %locale/ko/its20/ locale/ko/its20/its20Overlay.dtd (locale/ko/its20Overlay.dtd) locale/ko/its20/its20.properties (locale/ko/its20.properties) locale/ko/its20/its20.dtd (locale/ko/its20.dtd) locale/ko/its20/translateRule.dtd (locale/ko/translateRule.dtd) locale/ko/its20/locNoteRule.dtd (locale/ko/locNoteRule.dtd) locale/ko/its20/termRule.dtd (locale/ko/termRule.dtd) locale/ko/its20/selector.dtd (locale/ko/selector.dtd) ================================================ FILE: locales/ko/markdown.mn ================================================ markdown-ko.jar: % locale markdown ko %locale/ko/markdown/ locale/ko/markdown/markdownOverlay.dtd (locale/ko/markdownOverlay.dtd) locale/ko/markdown/markdown.dtd (locale/ko/markdown.dtd) ================================================ FILE: locales/ko/op1.mn ================================================ op1-ko.jar: % locale op1 ko %locale/ko/op1/ locale/ko/op1/op1Overlay.dtd (locale/ko/op1Overlay.dtd) locale/ko/op1/op1.dtd (locale/ko/op1.dtd) locale/ko/op1/a11yFirstStep.properties (locale/ko/a11yFirstStep.properties) ================================================ FILE: locales/ko/scripteditor.mn ================================================ bluegriffon-ko.jar: % locale scripteditor ko %locale/ko/scripteditor/ locale/ko/scripteditor/scripteditorOverlay.dtd (locale/ko/scripteditorOverlay.dtd) locale/ko/scripteditor/scripteditor.dtd (locale/ko/scripteditor.dtd) locale/ko/scripteditor/scripteditor.properties (locale/ko/scripteditor.properties) locale/ko/scripteditor/editor.dtd (locale/ko/editor.dtd) ================================================ FILE: locales/ko/stylesheets.mn ================================================ bluegriffon-ko.jar: % locale stylesheets ko %locale/ko/stylesheets/ locale/ko/stylesheets/stylesheetsOverlay.dtd (locale/ko/stylesheetsOverlay.dtd) locale/ko/stylesheets/stylesheets.dtd (locale/ko/stylesheets.dtd) locale/ko/stylesheets/editor.dtd (locale/ko/editor.dtd) ================================================ FILE: locales/ko/tipoftheday.mn ================================================ tipoftheday-ko.jar: % locale tipoftheday ko %locale/ko/tipoftheday/ locale/ko/tipoftheday/tipoftheday.dtd (locale/ko/tipoftheday.dtd) locale/ko/tipoftheday/tipofthedayOverlay.dtd (locale/ko/tipofthedayOverlay.dtd) locale/ko/tipoftheday/tipoftheday.rdf (locale/ko/tipoftheday.rdf) ================================================ FILE: locales/moz.build ================================================ ================================================ FILE: locales/nl/aria.mn ================================================ bluegriffon-nl.jar: % locale aria nl %locale/nl/aria/ locale/nl/aria/ariaOverlay.dtd (locale/nl/ariaOverlay.dtd) locale/nl/aria/aria.dtd (locale/nl/aria.dtd) locale/nl/aria/aria.properties (locale/nl/aria.properties) ================================================ FILE: locales/nl/base.mn ================================================ bluegriffon-nl.jar: % locale bluegriffon nl %locale/nl/bluegriffon/ % locale branding nl %locale/nl/branding/ locale/nl/bluegriffon/aboutDialog.dtd (locale/nl/bluegriffon/aboutDialog.dtd) locale/nl/bluegriffon/bluegriffon.dtd (locale/nl/bluegriffon/bluegriffon.dtd) locale/nl/bluegriffon/polyglot.dtd (locale/nl/bluegriffon/polyglot.dtd) locale/nl/bluegriffon/findbar.dtd (locale/nl/bluegriffon/findbar.dtd) locale/nl/bluegriffon/bluegriffon.properties (locale/nl/bluegriffon/bluegriffon.properties) locale/nl/bluegriffon/colourPicker.dtd (locale/nl/bluegriffon/colourPicker.dtd) locale/nl/bluegriffon/credits.dtd (locale/nl/bluegriffon/credits.dtd) locale/nl/bluegriffon/filepickerbutton.dtd (locale/nl/bluegriffon/filepickerbutton.dtd) locale/nl/bluegriffon/filePicking.dtd (locale/nl/bluegriffon/filePicking.dtd) locale/nl/bluegriffon/insertTable.dtd (locale/nl/bluegriffon/insertTable.dtd) locale/nl/bluegriffon/insertTable.properties (locale/nl/bluegriffon/insertTable.properties) locale/nl/bluegriffon/language.properties (locale/nl/bluegriffon/language.properties) locale/nl/bluegriffon/languages.dtd (locale/nl/bluegriffon/languages.dtd) locale/nl/bluegriffon/markupCleaner.dtd (locale/nl/bluegriffon/markupCleaner.dtd) locale/nl/bluegriffon/openLocation.dtd (locale/nl/bluegriffon/openLocation.dtd) locale/nl/bluegriffon/openLocation.properties (locale/nl/bluegriffon/openLocation.properties) locale/nl/bluegriffon/newPageWizard.dtd (locale/nl/bluegriffon/newPageWizard.dtd) locale/nl/bluegriffon/newPageWizard.properties (locale/nl/bluegriffon/newPageWizard.properties) locale/nl/bluegriffon/propertiesDeck.dtd (locale/nl/bluegriffon/propertiesDeck.dtd) locale/nl/bluegriffon/aria.dtd (locale/nl/bluegriffon/aria.dtd) locale/nl/bluegriffon/structurebar.dtd (locale/nl/bluegriffon/structurebar.dtd) locale/nl/bluegriffon/tabeditor.dtd (locale/nl/bluegriffon/tabeditor.dtd) locale/nl/bluegriffon/masterPasswordQuery.properties (locale/nl/bluegriffon/masterPasswordQuery.properties) locale/nl/bluegriffon/newDocument.dtd (locale/nl/bluegriffon/newDocument.dtd) locale/nl/bluegriffon/prefs/file.dtd (locale/nl/bluegriffon/prefs/file.dtd) locale/nl/bluegriffon/prefs/source.dtd (locale/nl/bluegriffon/prefs/source.dtd) locale/nl/bluegriffon/prefs/general.dtd (locale/nl/bluegriffon/prefs/general.dtd) locale/nl/bluegriffon/prefs/newPage.dtd (locale/nl/bluegriffon/prefs/newPage.dtd) locale/nl/bluegriffon/prefs/update.dtd (locale/nl/bluegriffon/prefs/update.dtd) locale/nl/bluegriffon/prefs/styles.dtd (locale/nl/bluegriffon/prefs/styles.dtd) locale/nl/bluegriffon/prefs/advanced.dtd (locale/nl/bluegriffon/prefs/advanced.dtd) locale/nl/bluegriffon/prefs/connection.dtd (locale/nl/bluegriffon/prefs/connection.dtd) locale/nl/bluegriffon/prefs/osx.dtd (locale/nl/bluegriffon/prefs/osx.dtd) locale/nl/bluegriffon/prefs/shortcuts.dtd (locale/nl/bluegriffon/prefs/shortcuts.dtd) locale/nl/bluegriffon/prefs/update.properties (locale/nl/bluegriffon/prefs/update.properties) locale/nl/bluegriffon/prefs/license.dtd (locale/nl/bluegriffon/prefs/license.dtd) locale/nl/bluegriffon/prefs/license.properties (locale/nl/bluegriffon/prefs/license.properties) locale/nl/bluegriffon/prefs/deactivateLicense.dtd (locale/nl/bluegriffon/prefs/deactivateLicense.dtd) locale/nl/bluegriffon/prefs.dtd (locale/nl/bluegriffon/prefs.dtd) locale/nl/bluegriffon/updateAvailable.dtd (locale/nl/bluegriffon/updateAvailable.dtd) locale/nl/bluegriffon/updates.properties (locale/nl/bluegriffon/updates.properties) locale/nl/branding/brand.dtd (locale/nl/branding/brand.dtd) locale/nl/branding/brand.properties (locale/nl/branding/brand.properties) locale/nl/bluegriffon/insertImage.dtd (locale/nl/bluegriffon/insertImage.dtd) locale/nl/bluegriffon/insertAnchor.dtd (locale/nl/bluegriffon/insertAnchor.dtd) locale/nl/bluegriffon/insertCommentOrPI.dtd (locale/nl/bluegriffon/insertCommentOrPI.dtd) locale/nl/bluegriffon/insertLink.dtd (locale/nl/bluegriffon/insertLink.dtd) locale/nl/bluegriffon/insertLink.properties (locale/nl/bluegriffon/insertLink.properties) locale/nl/bluegriffon/cssClassPicker.dtd (locale/nl/bluegriffon/cssClassPicker.dtd) locale/nl/bluegriffon/insertVideo.dtd (locale/nl/bluegriffon/insertVideo.dtd) locale/nl/bluegriffon/insertAudio.dtd (locale/nl/bluegriffon/insertAudio.dtd) locale/nl/bluegriffon/insertVideo.properties (locale/nl/bluegriffon/insertVideo.properties) locale/nl/bluegriffon/insertHTML.dtd (locale/nl/bluegriffon/insertHTML.dtd) locale/nl/bluegriffon/insertHR.dtd (locale/nl/bluegriffon/insertHR.dtd) locale/nl/bluegriffon/insertForm.dtd (locale/nl/bluegriffon/insertForm.dtd) locale/nl/bluegriffon/parsingError.dtd (locale/nl/bluegriffon/parsingError.dtd) locale/nl/bluegriffon/insertFormInput.dtd (locale/nl/bluegriffon/insertFormInput.dtd) locale/nl/bluegriffon/insertFieldset.dtd (locale/nl/bluegriffon/insertFieldset.dtd) locale/nl/bluegriffon/insertLabel.dtd (locale/nl/bluegriffon/insertLabel.dtd) locale/nl/bluegriffon/insertButton.dtd (locale/nl/bluegriffon/insertButton.dtd) locale/nl/bluegriffon/insertSelect.dtd (locale/nl/bluegriffon/insertSelect.dtd) locale/nl/bluegriffon/insertTextarea.dtd (locale/nl/bluegriffon/insertTextarea.dtd) locale/nl/bluegriffon/insertKeygen.dtd (locale/nl/bluegriffon/insertKeygen.dtd) locale/nl/bluegriffon/insertOutput.dtd (locale/nl/bluegriffon/insertOutput.dtd) locale/nl/bluegriffon/insertProgress.dtd (locale/nl/bluegriffon/insertProgress.dtd) locale/nl/bluegriffon/insertMeter.dtd (locale/nl/bluegriffon/insertMeter.dtd) locale/nl/bluegriffon/insertStylesheet.dtd (locale/nl/bluegriffon/insertStylesheet.dtd) locale/nl/bluegriffon/editStylesheet.dtd (locale/nl/bluegriffon/editStylesheet.dtd) locale/nl/bluegriffon/media.dtd (locale/nl/bluegriffon/media.dtd) locale/nl/bluegriffon/media.properties (locale/nl/bluegriffon/media.properties) locale/nl/bluegriffon/insertChars.dtd (locale/nl/bluegriffon/insertChars.dtd) locale/nl/bluegriffon/convertToTable.dtd (locale/nl/bluegriffon/convertToTable.dtd) locale/nl/bluegriffon/pageProperties.dtd (locale/nl/bluegriffon/pageProperties.dtd) locale/nl/bluegriffon/spellCheck.dtd (locale/nl/bluegriffon/spellCheck.dtd) locale/nl/bluegriffon/spellCheck.properties (locale/nl/bluegriffon/spellCheck.properties) locale/nl/bluegriffon/dictionary.dtd (locale/nl/bluegriffon/dictionary.dtd) locale/nl/bluegriffon/html5.properties (locale/nl/bluegriffon/html5.properties) locale/nl/bluegriffon/listProperties.dtd (locale/nl/bluegriffon/listProperties.dtd) locale/nl/bluegriffon/insertTOC.dtd (locale/nl/bluegriffon/insertTOC.dtd) locale/nl/bluegriffon/svg-edit.properties (locale/nl/bluegriffon/svg-edit.properties) locale/nl/bluegriffon/panels.dtd (locale/nl/bluegriffon/panels.dtd) locale/nl/bluegriffon/rotator.dtd (locale/nl/bluegriffon/rotator.dtd) ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/aboutDialog.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/aria.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/bluegriffon.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/bluegriffon.properties ================================================ titleModifier = BlueGriffon titleFormat = %S - %S Unknown = [Onbekend] NoClassAvailable = (geen klasse) NoIdAvailable = (geen ID) DocumentTitle = Paginatitel NeedDocTitle = Voer hier een titel in voor de huidige pagina. DocTitleHelp = Dit identificeert de pagina in de titel van het venster en de bladwijzers. ExportToText = Naar tekst exporteren SaveDocumentAs = Pagina opslaan als XHTMLfiles = XHTML-bestanden untitled = geen titel SaveDocument = Pagina opslaan als SaveFileFailed = Opslaan van bestand is mislukt! FileNotSaved = Bestand is niet opgeslagen! SaveFileBeforeClosing = Wilt u het bestand opslaan voordat dit tabblad gesloten wordt? YesSaveFile = Ja, opslaan NoDiscardChanges = Nee, wijzigingen verwerpen DontCloseTab = Tabblad niet sluiten! IdAlreadyTaken = Dit ID wordt al in het document gebruikt RemoveIdFromElement = Wilt u het ID verwijderen van het element dat het nu gebruikt of deze actie annuleren? YesRemoveId = Het ID verwijderen NoCancel = Annuleren ReplaceAll = Alles vervangen... ReplacedPart1 = Vervangen ReplacedPart2 = keer AFileWasChanged=A file was changed on disk ReloadFile=File %S changed on disk, BlueGriffon must reload it DontAskForFileChangesAgain=don't show this alert again AbandonChanges=Niet-opgeslagen wijzigingen in “%title%” verwerpen en de pagina opnieuw laden? RevertCaption=Alle wijzigingen ongedaan maken HTMLCommentsInXHTMLTitle=HTML comment inside a

      Normale tekst ziet er zo uit !

      Bezochte koppelingen zien er zo uit !

      Actieve koppelingen zien er zo uit !

      Normale tekst ziet er zo uit !

      Bezochte koppelingen zien er zo uit !

      Actieve koppelingen zien er zo uit !

      Normale tekst ziet er zo uit !

      Bezochte koppelingen zien er zo uit !

      Actieve koppelingen zien er zo uit !

      ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/panels.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/parsingError.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/polyglot.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/prefs/advanced.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/prefs/connection.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/prefs/deactivateLicense.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/prefs/file.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/prefs/general.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/prefs/license.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/prefs/license.properties ================================================ activateWarning=BlueGriffon needs to restart to activate your license. Do you want to restart now? confirmRestart=Restart BlueGriffon? fullResetTitle=License activation reset fullResetErrorLabel=Impossible to perform the operation, a network error occurred. fullResetRequested=A reset link was sent to the owner of the license/transaction. BlueGriffon must now restart. fullResetInvalid=The transaction ID is invalid. ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/prefs/newPage.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/prefs/osx.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.properties ================================================ NoMainWindowAvaialble=Sneltoetscombinaties kunnen niet worden bewerkt PleaseOpenOneMainWindow=Er moet op z'n minst een BlueGriffon venster open staan om de sneltoetsen te bewerken. ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/prefs/source.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/prefs/styles.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/prefs/update.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/prefs/update.properties ================================================ SoftwareUpdates=Software-updates UnableToCheck=Niet in staat om op updates te controleren UpToDate=Meest recente versie van BlueGriffon ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/prefs.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/propertiesDeck.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/rotator.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/spellCheck.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/spellCheck.properties ================================================ CorrectSpelling = (spelling corrigeren) NoSuggestedWords = (geen suggesties) NoMisspelledWord = Geen verkeerd gespelde woorden CheckSpellingDone = Spellingscontrole afgerond. CheckSpelling = Spelling controleren ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/structurebar.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/svg-edit.properties ================================================ SvgEdit=SVG Edit ConfirmClose=Er zijn wijzigingen aangebracht die nog niet zijn opgeslagen, wilt u SVG Edit toch afsluiten? ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/tabeditor.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/updateAvailable.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/base/locale/bluegriffon/updates.properties ================================================ update.checkInsideButton.label=Controleren op updates update.checkInsideButton.accesskey=C update.resumeButton.label=Downloaden van %S hervatten… update.resumeButton.accesskey=D update.openUpdateUI.applyButton.label=Update toepassen… update.openUpdateUI.applyButton.accesskey=U update.restart.applyButton.label=Update toepassen update.restart.applyButton.accesskey=U update.openUpdateUI.upgradeButton.label=Nu upgraden… update.openUpdateUI.upgradeButton.accesskey=N update.restart.upgradeButton.label=Nu upgraden update.restart.upgradeButton.accesskey=N ================================================ FILE: locales/nl/bluegriffon/base/locale/branding/brand.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/base/locale/branding/brand.properties ================================================ brandShortName = BlueGriffon brandFullName = BlueGriffon vendorShortName = Disruptive Innovations sidebarName = Zijbalk ================================================ FILE: locales/nl/bluegriffon/extensions/fs/addFont.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/extensions/fs/fs.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/extensions/fs/fs.properties ================================================ SelectDir = Kies een map om het lettertype in uit te pakken SelectFile = Kies een stijlblad.css van een bestaand lettertype Stylesheet = Stijlblad van een FontSquirrel pakket MustBeSavedTitle = Het document is nog nooit opgeslagen MustBeSavedMessage = U moet de pagina eerst opslaan voordat u er een lokaal lettertype aan kunt koppelen met een relatieve verwijzing. Sluit het document en open het daarna opnieuw. ================================================ FILE: locales/nl/bluegriffon/extensions/fs/fsOverlay.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/extensions/gfd/addFont.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/extensions/gfd/gfd.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/extensions/gfd/gfdOverlay.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/extensions/markdown/markdown.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/extensions/markdown/markdownOverlay.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/extensions/op1/a11yFirstStep.properties ================================================ ConformingDTDSyntax=Use a W3C-conforming DTD syntax before the html element NoWrongSyntaxOrNonConformingHierarchy=Don't use wrong attribute syntax or non-conforming element hierarchy inside the html element OneTitleInHead=Use a title element as a child of the head element NoEmptyTitle=When you provide a title element, do not leave it empty NoMetaRefresh=Don't use a meta element with an http-equiv attribute and a value equal to refresh HTMLElementHasLangAttribute=Use the lang attribute for the html element HTMLElementHasValidLangAttribute=Use a valid language code for the lang attribute NoInvalidDir=Don't use a value other than ltr, rtl or empty for the dir attribute TitleForFrames=Use the title attribute for every frame element NoEmptyTitleForFrames=When you provide a title attribute for a frame element, do not leave it empty TitleForIFrames=Use the title attribute for every iframe element NoEmptyTitleForIFrames=When you provide a title attribute for an iframe element, do not leave it empty AtLeastOneH1InBody=There must be at least one h1 element inside (at any level) the body element NoEmptyH1=When you provide a h1 element, do not leave it empty NoEmptyH2=When you provide a h2 element, do not leave it empty NoEmptyH3=When you provide a h3 element, do not leave it empty NoEmptyH4=When you provide a h4 element, do not leave it empty NoEmptyH5=When you provide a h5 element, do not leave it empty NoEmptyH6=When you provide a h6 element, do not leave it empty H2Order=Use  a h1, h2, h3, h4, h5 or h6 element as a first heading before a h2 element in the source order H3Order=Use a h2, h3, h4, h5 or h6 element as a first heading before a h3 element in the source order H4Order=Use a h3, h4, h5 or h6 element as a first heading before a h4 element in the source order H5Order=Use a h4, h5 or h6 element as a first heading before a h5 element in the source order H6Order=Use a h5 or h6 element as a first heading before a h6 element in the source order DTAsFirstChildOfDL=Use a dt element as the first child of a dl element NoEmptyLI=When you provide a li element, do not leave it empty NoAlignAttribute=Don't use the align attribute NoXmpElement=Don't use the xmp element NoEmptyP=When you provide a p element, do not leave it empty NoEmptyAExceptAnchors=When you provide an a element, do not leave it empty except if it is used as an anchor NoEmptyButton=When you provide a button element, do not leave it empty NoVlinkAttribute=Don't use the vlink attribute NoTextAttribute=Don't use the text attribute NoLinkAttribute=Don't use the link attribute noImgWithoutAlt=Use the alt attribute for every img element noAreaWithoutAlt=Use the alt attribute for every area element noAppletWithoutAlt=Use the alt attribute for every applet element noImageInputWithoutAlt=Use the alt attribute for every input type=image element noEmptyAltForImageLoneChildOfAnchorOrButton=If the img element is the only child of a button or an a element, do not leave its alt attribute empty noEmptyAltForInputImage=When you provide an alt attribute for an input type=image element, do not leave it empty noEmptyAltForAreaWithHref=When you provide an alt attribute for an area element holding an href attribute, do not leave it empty noAltSimilarToTextContent=If an img element is a child of an a element with text, do not use the same text for its alt attribute as the text inside the a element noBorderAttribute=Don't use the border attribute noSimilarAltForAreasWithDifferentHref=Don't use the same value for alt attributes for multiple area elements with different href values LongdescIsURI=Use a URI as the value for a longdesc attribute noBackgroundAttribute=Don't use the background attribute noBgsoundElement=Don't use the bgsound element TablesWithAtLeastOneTHHaveACaption=Use a caption element as the first child of a table element containing at least one th element CaptionIsDifferentFromSummaryAttribute=Don't use the same content for a caption element and a summary attribute noEmptyCaption=When you provide a caption element, do not leave it empty noCaptionInATableWithOnlyTDs=Don't use a caption element in a table element containing only td elements noAlinkAttribute=Don't use an alink attribute noSummaryAttributeSimilarToCaption=Don't use the same content for a summary attribute and a caption element noEmptySummaryIfTableHasTHOrCaption=When you provide a summary attribute for a table element containing a th or a caption element, do not leave it empty noSummaryAttributeIfOnlyTDs=Don't use a summary attribute on a table element containg only td elements noStrikeElement=Don't use the strike element noListingElement=Don't use the listing element AtLeastOneTHIfCaptionOrSummary=Use at least one th element inside a table element with a caption element or a non-empty summary attribute AllNonEmptyTHHaveScopeOrId=Use a scope or id attribute for every non-empty th element ScopeAttributeIsRowOrCol=Don't use a value other than row or col for the scope attribute noBgcolorAttribute=Don't use the bgcolor attribute noTTElement=Don't use the tt element TDHaveHeadersAttributeIfTHHasId=Use a headers attribute on every td element if the corresponding th element has an id attribute noPlaintextElement=Don't use the plaintext element noHeadersAttributeThatIsNotATHId=Don't use for a headers attribute a value which matches an id attribute used for a td of the table element AllFormsHaveAButton=Use a button, or an input of type submit, image or button inside a form element SubmitButtonsHaveNonEmptyValue=When you provide an input type=submit, do not leave its value attribute empty noMarqueeElement=Don't use the marquee element FieldsetHasALegend=Use a legend element as a child of every fieldset element FieldsetsAreInForms=Don't use a fieldset element without a form element noEmptyLegendElement=When you provide a legend element, do not leave it empty LabelElementHasForAttribute=Use the for attribute for every label element noEmptyForAttributeOnLabel=When you provide a for attribute for a label element, do not leave it empty ForAttributeMatchesAnIdInSameForm=A for attribute must have a value that matches an id attribute inside the form element OptgroupElementHasALabel=Use the label attribute for every optgroup element NoSimilarLabelInOptgroupsOfSameSelect=Don't use the same label attribute for different optgroup elements of the same select element noEmptyLabelAttributeOnOptgroup=When you provide a label attribute for an optgroup element, do not leave it empty noBasefontElement=Don't use the basefont element noBlinkElement=Don't use the blink element noCenterElement=Don't use the center element noFontElement=Don't use the font element ================================================ FILE: locales/nl/bluegriffon/extensions/op1/op1.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/extensions/op1/op1Overlay.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/extensions/tipoftheday/tipoftheday.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/extensions/tipoftheday/tipoftheday.rdf ================================================ %brandDTD; ]> &brandShortName; tips http://bluegriffon.org/ &brandShortName; tip of the day Archive en-us …&brandShortName; is cross platform? …&brandShortName; exists on a wide variety of operating systems including Windows, Mac OS X, and many flavors of Linux, OS/2 … …&brandShortName; shows the title of any unsaved page with a red shadow? You can now save files from any viewing mode. …you have direct access to the &brandShortName; community? Just select “Help > User’s Community”. …you can insert HTML5 elements easily? Just select “Insert > HTML5 Element”. …you can close the current tab with one key? Control+w (Command +w on Mac OS X) will close the current tab. …you can create a new tab with a key combination? Control+n (Command +n on Mac OS X) will create a new blank tab using the same doctype as the last page created. …you can revert to a previously saved version of the currently edited document? Righ-click (context-click on Mac OS X) on the document's tab and select the Revert menu. …you can publish pages directly from &brandShortName; First install the free FireFTP add-on and set it up. It will then be available on the Tools menu. …&brandShortName; can insert any character easily? Use “Insert characters and symbols”. You can then search for any Unicode character by name or open a block for inspection. …&brandShortName; runs spellcheck by default? Right click a word to find suggestions. Switch checking on or off using “Tools > Preferences > General” . …&brandShortName; can reliably select an element? Simply click its name in the structure bar. …you can move an element in your document using the mouse? First select as in previous tip then just drag it to where needed. …you can quickly open existing pages? The paid for Project manager add-on permits instant access to pages and images which are organised as a project. …you can choose your default browser? Use “Tools > Preferences > Advanced > Reset external browser settings”. Next time you browse you can choose a browser. …&brandShortName; allows you to use external stylesheets? To create one ready for use click “Panels > Stylesheets”. Click the plus sign and select “Linked to the document”. …&brandShortName; can manage stylesheets and complex selectors? Using the CSS Pro Editor (a paid for add-on) you change the order of and add titles and rel attribute to stylesheets and develop complex CSS 2 and 3 selectors with advanced help. …panels can be resized? Drag the grab handle at the bottom right corner to the size needed. …attributes can be added to any element? Open “Panels > DOM Explorer”. In wysiwyg view click in the element, select use the Attributes tab and click the plus sign. …&brandShortName; can handle CSS3 properties? Vendor prefixes will be added for browsers that need them. …you can personalize keyboard shortcuts? Any menu item can be allocated to your preferred key. Open “Tools > Preferences > Keyboard Shortcuts”. Find and double-click the command wanted. In the new window key a shortcut. …you can remove a class from an element? Just select the element and in the Class drop down box re-apply the class. ================================================ FILE: locales/nl/bluegriffon/extensions/tipoftheday/tipofthedayOverlay.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/sidebars/aria/aria.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/sidebars/aria/aria.properties ================================================ mustBeContainedIn=must be contained in or= or ok=OK mustContain=must contain and= and deprecated=deprecated missingTextbox=missing textbox missingListboxTreeGridDialog=missing listbox, tree, grid or dialog ================================================ FILE: locales/nl/bluegriffon/sidebars/aria/ariaOverlay.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/sidebars/cssproperties/backgrounditem.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/sidebars/cssproperties/backgrounditem.properties ================================================ backgroundColorTitle = Color backgroundImageTitle = Afbeelding backgroundLinearGradientTitle = Linear gradient backgroundRadialGradientTitle = Radial gradient ================================================ FILE: locales/nl/bluegriffon/sidebars/cssproperties/colorstopitem.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/sidebars/cssproperties/cssproperties.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/sidebars/cssproperties/cssproperties.properties ================================================ EnterAnId = Please enter an ID EnterUniqueId = You must give a unique ID to the element: NoClasSelected = You must select a class name PleaseSelectAClass = A class must be selected to apply the requested changes ================================================ FILE: locales/nl/bluegriffon/sidebars/cssproperties/csspropertiesOverlay.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/sidebars/cssproperties/editGridTemplate.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/sidebars/cssproperties/fontFeatures.properties ================================================ FFaalt=Access all alternates FFcalt=Contextual alternates FFsalt=Stylistic alternates FFliga=Standard ligatures FFclig=Contextual ligatures FFdlig=Discretionary ligatures FFhist=Historical forms FFhlig=Historical ligatures FFunic=Unicase FFsmcp=Small capitals FFc2sc=Small capitals from capitals FFc2pc=Petite capitals from capitals FFpcap=Petite capitals FFcase=Case sensitive forms FFcpsp=Capital spacing FFtitl=Titling FFswsh=Swash FFcswh=Contextual swash FFfrac=Fractions FFafrc=Alternative fractions FFordn=Ordinals FFnumr=Numerators FFdnom=Denominators FFsinf=Scientific inferiors FFsups=Superscript FFsubs=Subscript FFonum=Oldstyle figures FFlnum=Lining Figures FFpnum=Proportional figures FFtnum=Tabular figures FFzero=Slashed zero FFmgrk=Mathematical greek FFnalt=Alternate annotation forms FFornm=Ornaments FFlocl=Localized forms FFsize=Optical size FFisol=Isolated forms FFinit=Initial forms FFmedi=Medial forms FFfinal=Final forms FFrlig=Requird ligatures FFccmp=Glyph composition/decomposition FFmark=Mark to base positioning FFmkmj=Mark to mark positioning FFhwid=Half widths ================================================ FILE: locales/nl/bluegriffon/sidebars/cssproperties/griditemposition.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/sidebars/cssproperties/textshadowitem.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/sidebars/cssproperties/transformationitem.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/sidebars/cssproperties/transitionitem.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/sidebars/domexplorer/domexplorer.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/sidebars/domexplorer/domexplorerOverlay.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/sidebars/its20/its20.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/sidebars/its20/its20.properties ================================================ LoadError=Load Error InlineParseError=Inline resource is not an ITS 2.0 document CannotFetch=Cannot fetch URL NotITS=Resource is not an ITS 2.0 document TranslatableByGlobalRule=Translatable by global rule NotTranslatableByGlobalRule=Not translatable by global rule InlineRules=Inline rules translateRule=Translate locNoteRule=Localization Note termRule=Terminology dirRule=Directionality langRule=Language Information withinTextRule=Elements Within Text domainRule=Domain textAnalysisRule=Text Analysis localeFilterRule=Locale Filter provRule=Provenance externalResourceRefRule=External Resource targetPointerRule=Target Pointer idValueRule=Id Value preserveSpaceRule=Preserve Space locQualityIssueRule=Localization Quality Issue mtConfidenceRule=Machine-Translation Confidence allowedCharactersRule=Allowed Characters storageSizeRule=Storage Size DontWarnAgainForUrl=Don't warn me again about this URL DontWarnAgainForInline=Don't warn me again about inline global rules NewITSFile=New ITS 2.0 File CannotResolveXPath=Cannot resolve the following XPath selector (undeclared HTML namespace?): XPathParsingError=XPath Parsing Error DontWarnAgainForSelector=Don't warn me again about this selector CSSParsingError=CSS Parsing Error CannotResolveCSS=Cannot resolve the following CSS selector: ================================================ FILE: locales/nl/bluegriffon/sidebars/its20/its20Overlay.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/sidebars/its20/locNoteRule.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/sidebars/its20/selector.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/sidebars/its20/termRule.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/sidebars/its20/translateRule.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/sidebars/scripteditor/editor.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/sidebars/scripteditor/scripteditor.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/sidebars/scripteditor/scripteditor.properties ================================================ ConfirmDeletionTitle=Delete a script ConfirmDeletion=Are you sure you want to delete this script? AddExternalScriptTitle=Add an external script PromptScriptURL=URL of the script? ================================================ FILE: locales/nl/bluegriffon/sidebars/scripteditor/scripteditorOverlay.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/sidebars/stylesheets/editor.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/sidebars/stylesheets/stylesheets.dtd ================================================ ================================================ FILE: locales/nl/bluegriffon/sidebars/stylesheets/stylesheetsOverlay.dtd ================================================ ================================================ FILE: locales/nl/cssproperties.mn ================================================ bluegriffon-nl.jar: % locale cssproperties nl %locale/nl/cssproperties/ locale/nl/cssproperties/csspropertiesOverlay.dtd (locale/nl/csspropertiesOverlay.dtd) locale/nl/cssproperties/cssproperties.dtd (locale/nl/cssproperties.dtd) locale/nl/cssproperties/editGridTemplate.dtd (locale/nl/editGridTemplate.dtd) locale/nl/cssproperties/backgrounditem.dtd (locale/nl/backgrounditem.dtd) locale/nl/cssproperties/griditemposition.dtd (locale/nl/griditemposition.dtd) locale/nl/cssproperties/transformationitem.dtd (locale/nl/transformationitem.dtd) locale/nl/cssproperties/transitionitem.dtd (locale/nl/transitionitem.dtd) locale/nl/cssproperties/textshadowitem.dtd (locale/nl/textshadowitem.dtd) locale/nl/cssproperties/colorstopitem.dtd (locale/nl/colorstopitem.dtd) locale/nl/cssproperties/backgrounditem.properties (locale/nl/backgrounditem.properties) locale/nl/cssproperties/cssproperties.properties (locale/nl/cssproperties.properties) locale/nl/cssproperties/fontFeatures.properties (locale/nl/fontFeatures.properties) ================================================ FILE: locales/nl/domexplorer.mn ================================================ bluegriffon-nl.jar: % locale domexplorer nl %locale/nl/domexplorer/ locale/nl/domexplorer/domexplorerOverlay.dtd (locale/nl/domexplorerOverlay.dtd) locale/nl/domexplorer/domexplorer.dtd (locale/nl/domexplorer.dtd) ================================================ FILE: locales/nl/fs.mn ================================================ fs-nl.jar: % locale fs nl %locale/nl/fs/ locale/nl/fs/fsOverlay.dtd (locale/nl/fsOverlay.dtd) locale/nl/fs/fs.dtd (locale/nl/fs.dtd) locale/nl/fs/fs.properties (locale/nl/fs.properties) locale/nl/fs/addFont.dtd (locale/nl/addFont.dtd) ================================================ FILE: locales/nl/gfd.mn ================================================ gfd-nl.jar: % locale gfd nl %locale/nl/gfd/ locale/nl/gfd/gfdOverlay.dtd (locale/nl/gfdOverlay.dtd) locale/nl/gfd/gfd.dtd (locale/nl/gfd.dtd) locale/nl/gfd/addFont.dtd (locale/nl/addFont.dtd) ================================================ FILE: locales/nl/its20.mn ================================================ bluegriffon-nl.jar: % locale its20 nl %locale/nl/its20/ locale/nl/its20/its20Overlay.dtd (locale/nl/its20Overlay.dtd) locale/nl/its20/its20.properties (locale/nl/its20.properties) locale/nl/its20/its20.dtd (locale/nl/its20.dtd) locale/nl/its20/translateRule.dtd (locale/nl/translateRule.dtd) locale/nl/its20/locNoteRule.dtd (locale/nl/locNoteRule.dtd) locale/nl/its20/termRule.dtd (locale/nl/termRule.dtd) locale/nl/its20/selector.dtd (locale/nl/selector.dtd) ================================================ FILE: locales/nl/markdown.mn ================================================ markdown-nl.jar: % locale markdown nl %locale/nl/markdown/ locale/nl/markdown/markdownOverlay.dtd (locale/nl/markdownOverlay.dtd) locale/nl/markdown/markdown.dtd (locale/nl/markdown.dtd) ================================================ FILE: locales/nl/op1.mn ================================================ op1-nl.jar: % locale op1 nl %locale/nl/op1/ locale/nl/op1/op1Overlay.dtd (locale/nl/op1Overlay.dtd) locale/nl/op1/op1.dtd (locale/nl/op1.dtd) locale/nl/op1/a11yFirstStep.properties (locale/nl/a11yFirstStep.properties) ================================================ FILE: locales/nl/scripteditor.mn ================================================ bluegriffon-nl.jar: % locale scripteditor nl %locale/nl/scripteditor/ locale/nl/scripteditor/scripteditorOverlay.dtd (locale/nl/scripteditorOverlay.dtd) locale/nl/scripteditor/scripteditor.dtd (locale/nl/scripteditor.dtd) locale/nl/scripteditor/scripteditor.properties (locale/nl/scripteditor.properties) locale/nl/scripteditor/editor.dtd (locale/nl/editor.dtd) ================================================ FILE: locales/nl/stylesheets.mn ================================================ bluegriffon-nl.jar: % locale stylesheets nl %locale/nl/stylesheets/ locale/nl/stylesheets/stylesheetsOverlay.dtd (locale/nl/stylesheetsOverlay.dtd) locale/nl/stylesheets/stylesheets.dtd (locale/nl/stylesheets.dtd) locale/nl/stylesheets/editor.dtd (locale/nl/editor.dtd) ================================================ FILE: locales/nl/tipoftheday.mn ================================================ tipoftheday-nl.jar: % locale tipoftheday nl %locale/nl/tipoftheday/ locale/nl/tipoftheday/tipoftheday.dtd (locale/nl/tipoftheday.dtd) locale/nl/tipoftheday/tipofthedayOverlay.dtd (locale/nl/tipofthedayOverlay.dtd) locale/nl/tipoftheday/tipoftheday.rdf (locale/nl/tipoftheday.rdf) ================================================ FILE: locales/pl/aria.mn ================================================ bluegriffon-pl.jar: % locale aria pl %locale/pl/aria/ locale/pl/aria/ariaOverlay.dtd (locale/pl/ariaOverlay.dtd) locale/pl/aria/aria.dtd (locale/pl/aria.dtd) locale/pl/aria/aria.properties (locale/pl/aria.properties) ================================================ FILE: locales/pl/base.mn ================================================ bluegriffon-pl.jar: % locale bluegriffon pl %locale/pl/bluegriffon/ % locale branding pl %locale/pl/branding/ locale/pl/bluegriffon/aboutDialog.dtd (locale/pl/bluegriffon/aboutDialog.dtd) locale/pl/bluegriffon/bluegriffon.dtd (locale/pl/bluegriffon/bluegriffon.dtd) locale/pl/bluegriffon/polyglot.dtd (locale/pl/bluegriffon/polyglot.dtd) locale/pl/bluegriffon/findbar.dtd (locale/pl/bluegriffon/findbar.dtd) locale/pl/bluegriffon/bluegriffon.properties (locale/pl/bluegriffon/bluegriffon.properties) locale/pl/bluegriffon/colourPicker.dtd (locale/pl/bluegriffon/colourPicker.dtd) locale/pl/bluegriffon/credits.dtd (locale/pl/bluegriffon/credits.dtd) locale/pl/bluegriffon/filepickerbutton.dtd (locale/pl/bluegriffon/filepickerbutton.dtd) locale/pl/bluegriffon/filePicking.dtd (locale/pl/bluegriffon/filePicking.dtd) locale/pl/bluegriffon/insertTable.dtd (locale/pl/bluegriffon/insertTable.dtd) locale/pl/bluegriffon/insertTable.properties (locale/pl/bluegriffon/insertTable.properties) locale/pl/bluegriffon/language.properties (locale/pl/bluegriffon/language.properties) locale/pl/bluegriffon/languages.dtd (locale/pl/bluegriffon/languages.dtd) locale/pl/bluegriffon/markupCleaner.dtd (locale/pl/bluegriffon/markupCleaner.dtd) locale/pl/bluegriffon/openLocation.dtd (locale/pl/bluegriffon/openLocation.dtd) locale/pl/bluegriffon/openLocation.properties (locale/pl/bluegriffon/openLocation.properties) locale/pl/bluegriffon/newPageWizard.dtd (locale/pl/bluegriffon/newPageWizard.dtd) locale/pl/bluegriffon/newPageWizard.properties (locale/pl/bluegriffon/newPageWizard.properties) locale/pl/bluegriffon/propertiesDeck.dtd (locale/pl/bluegriffon/propertiesDeck.dtd) locale/pl/bluegriffon/aria.dtd (locale/pl/bluegriffon/aria.dtd) locale/pl/bluegriffon/structurebar.dtd (locale/pl/bluegriffon/structurebar.dtd) locale/pl/bluegriffon/tabeditor.dtd (locale/pl/bluegriffon/tabeditor.dtd) locale/pl/bluegriffon/masterPasswordQuery.properties (locale/pl/bluegriffon/masterPasswordQuery.properties) locale/pl/bluegriffon/newDocument.dtd (locale/pl/bluegriffon/newDocument.dtd) locale/pl/bluegriffon/prefs/file.dtd (locale/pl/bluegriffon/prefs/file.dtd) locale/pl/bluegriffon/prefs/source.dtd (locale/pl/bluegriffon/prefs/source.dtd) locale/pl/bluegriffon/prefs/general.dtd (locale/pl/bluegriffon/prefs/general.dtd) locale/pl/bluegriffon/prefs/newPage.dtd (locale/pl/bluegriffon/prefs/newPage.dtd) locale/pl/bluegriffon/prefs/update.dtd (locale/pl/bluegriffon/prefs/update.dtd) locale/pl/bluegriffon/prefs/styles.dtd (locale/pl/bluegriffon/prefs/styles.dtd) locale/pl/bluegriffon/prefs/advanced.dtd (locale/pl/bluegriffon/prefs/advanced.dtd) locale/pl/bluegriffon/prefs/connection.dtd (locale/pl/bluegriffon/prefs/connection.dtd) locale/pl/bluegriffon/prefs/osx.dtd (locale/pl/bluegriffon/prefs/osx.dtd) locale/pl/bluegriffon/prefs/shortcuts.dtd (locale/pl/bluegriffon/prefs/shortcuts.dtd) locale/pl/bluegriffon/prefs/update.properties (locale/pl/bluegriffon/prefs/update.properties) locale/pl/bluegriffon/prefs/license.dtd (locale/pl/bluegriffon/prefs/license.dtd) locale/pl/bluegriffon/prefs/license.properties (locale/pl/bluegriffon/prefs/license.properties) locale/pl/bluegriffon/prefs/deactivateLicense.dtd (locale/pl/bluegriffon/prefs/deactivateLicense.dtd) locale/pl/bluegriffon/prefs.dtd (locale/pl/bluegriffon/prefs.dtd) locale/pl/bluegriffon/updateAvailable.dtd (locale/pl/bluegriffon/updateAvailable.dtd) locale/pl/bluegriffon/updates.properties (locale/pl/bluegriffon/updates.properties) locale/pl/branding/brand.dtd (locale/pl/branding/brand.dtd) locale/pl/branding/brand.properties (locale/pl/branding/brand.properties) locale/pl/bluegriffon/insertImage.dtd (locale/pl/bluegriffon/insertImage.dtd) locale/pl/bluegriffon/insertAnchor.dtd (locale/pl/bluegriffon/insertAnchor.dtd) locale/pl/bluegriffon/insertCommentOrPI.dtd (locale/pl/bluegriffon/insertCommentOrPI.dtd) locale/pl/bluegriffon/insertLink.dtd (locale/pl/bluegriffon/insertLink.dtd) locale/pl/bluegriffon/insertLink.properties (locale/pl/bluegriffon/insertLink.properties) locale/pl/bluegriffon/cssClassPicker.dtd (locale/pl/bluegriffon/cssClassPicker.dtd) locale/pl/bluegriffon/insertVideo.dtd (locale/pl/bluegriffon/insertVideo.dtd) locale/pl/bluegriffon/insertAudio.dtd (locale/pl/bluegriffon/insertAudio.dtd) locale/pl/bluegriffon/insertVideo.properties (locale/pl/bluegriffon/insertVideo.properties) locale/pl/bluegriffon/insertHTML.dtd (locale/pl/bluegriffon/insertHTML.dtd) locale/pl/bluegriffon/insertHR.dtd (locale/pl/bluegriffon/insertHR.dtd) locale/pl/bluegriffon/insertForm.dtd (locale/pl/bluegriffon/insertForm.dtd) locale/pl/bluegriffon/parsingError.dtd (locale/pl/bluegriffon/parsingError.dtd) locale/pl/bluegriffon/insertFormInput.dtd (locale/pl/bluegriffon/insertFormInput.dtd) locale/pl/bluegriffon/insertFieldset.dtd (locale/pl/bluegriffon/insertFieldset.dtd) locale/pl/bluegriffon/insertLabel.dtd (locale/pl/bluegriffon/insertLabel.dtd) locale/pl/bluegriffon/insertButton.dtd (locale/pl/bluegriffon/insertButton.dtd) locale/pl/bluegriffon/insertSelect.dtd (locale/pl/bluegriffon/insertSelect.dtd) locale/pl/bluegriffon/insertTextarea.dtd (locale/pl/bluegriffon/insertTextarea.dtd) locale/pl/bluegriffon/insertKeygen.dtd (locale/pl/bluegriffon/insertKeygen.dtd) locale/pl/bluegriffon/insertOutput.dtd (locale/pl/bluegriffon/insertOutput.dtd) locale/pl/bluegriffon/insertProgress.dtd (locale/pl/bluegriffon/insertProgress.dtd) locale/pl/bluegriffon/insertMeter.dtd (locale/pl/bluegriffon/insertMeter.dtd) locale/pl/bluegriffon/insertStylesheet.dtd (locale/pl/bluegriffon/insertStylesheet.dtd) locale/pl/bluegriffon/editStylesheet.dtd (locale/pl/bluegriffon/editStylesheet.dtd) locale/pl/bluegriffon/media.dtd (locale/pl/bluegriffon/media.dtd) locale/pl/bluegriffon/media.properties (locale/pl/bluegriffon/media.properties) locale/pl/bluegriffon/insertChars.dtd (locale/pl/bluegriffon/insertChars.dtd) locale/pl/bluegriffon/convertToTable.dtd (locale/pl/bluegriffon/convertToTable.dtd) locale/pl/bluegriffon/pageProperties.dtd (locale/pl/bluegriffon/pageProperties.dtd) locale/pl/bluegriffon/spellCheck.dtd (locale/pl/bluegriffon/spellCheck.dtd) locale/pl/bluegriffon/spellCheck.properties (locale/pl/bluegriffon/spellCheck.properties) locale/pl/bluegriffon/dictionary.dtd (locale/pl/bluegriffon/dictionary.dtd) locale/pl/bluegriffon/html5.properties (locale/pl/bluegriffon/html5.properties) locale/pl/bluegriffon/listProperties.dtd (locale/pl/bluegriffon/listProperties.dtd) locale/pl/bluegriffon/insertTOC.dtd (locale/pl/bluegriffon/insertTOC.dtd) locale/pl/bluegriffon/svg-edit.properties (locale/pl/bluegriffon/svg-edit.properties) locale/pl/bluegriffon/panels.dtd (locale/pl/bluegriffon/panels.dtd) locale/pl/bluegriffon/rotator.dtd (locale/pl/bluegriffon/rotator.dtd) ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/aboutDialog.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/aria.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/bluegriffon.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/bluegriffon.properties ================================================ titleModifier = BlueGriffon # in the following string, %t represents the title of the page or its URL # and %b the titleModifier above titleFormat = %S - %S Unknown = [nieznany] NoClassAvailable = (brak klasy) NoIdAvailable = (brak ID) DocumentTitle = Tytuł strony NeedDocTitle = Proszę podać tytuł dla bieżącej strony. DocTitleHelp = Tytuł identyfikuje stronę i jest wyświetlany jako tytuł okna oraz w zakładkach. ExportToText = Eksport do tekstu SaveDocumentAs = Zapisz stronę jako XHTMLfiles = Pliki XHTML untitled = bez tytułu SaveDocument = Zapisz stronę SaveFileFailed = Zapisywanie strony się nie powiodło! FileNotSaved = Niezapisany plik! SaveFileBeforeClosing = Czy chcesz zapisać plik przed zamknięciem karty? YesSaveFile = Tak, zapisz NoDiscardChanges = Nie, porzuć zmiany DontCloseTab = Nie zamykaj karty! IdAlreadyTaken = Ten ID jest już wykorzystywany w tym dokumencie RemoveIdFromElement = Czy chcesz usunąć ID elementu obecnie nim wyróżnionego, czy anulować czynność? YesRemoveId = Usuń ID NoCancel = Anuluj ReplaceAll = Zastąp wszystko… ReplacedPart1 = Zastąpiono ReplacedPart2 = wystąpień AFileWasChanged = Plik został zmieniony na dysku ReloadFile = Plik %S został zmieniony na dysku, BlueGriffon musi go wczytać ponownie DontAskForFileChangesAgain = Nie wyświetlaj tego powiadomienia ponownie AbandonChanges = Porzucić zmiany dokonane w „%title%” i odświeżyć stronę? RevertCaption = Przywróć poprzednią wersję dokumentu HTMLCommentsInXHTMLTitle=HTML comment inside a

      Normalny tekst będzie wyglądał w ten sposób!

      Odwiedzone będą wyglądały w ten sposób!

      Aktywne odnośniki będą wyglądały w ten sposób!

      ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/panels.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/parsingError.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/polyglot.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/prefs/advanced.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/prefs/connection.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/prefs/deactivateLicense.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/prefs/file.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/prefs/general.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/prefs/license.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/prefs/license.properties ================================================ activateWarning=BlueGriffon needs to restart to activate your license. Do you want to restart now? confirmRestart=Restart BlueGriffon? fullResetTitle=License activation reset fullResetErrorLabel=Impossible to perform the operation, a network error occurred. fullResetRequested=A reset link was sent to the owner of the license/transaction. BlueGriffon must now restart. fullResetInvalid=The transaction ID is invalid. ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/prefs/newPage.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/prefs/osx.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.properties ================================================ NoMainWindowAvaialble=Nie można edytować skrótów klawiszowych PleaseOpenOneMainWindow=Aby edytować skróty klawiszowe musi być otwarte przynajmniej jedno okno BlueGriffona. ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/prefs/source.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/prefs/styles.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/prefs/update.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/prefs/update.properties ================================================ SoftwareUpdates = Aktualizacja oprogramowania UnableToCheck = Nie udało się sprawdzić dostępności aktualizacji UpToDate = Program BlueGriffon jest aktualny ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/prefs.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/propertiesDeck.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/rotator.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/spellCheck.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/spellCheck.properties ================================================ CorrectSpelling = (poprawna pisownia) NoSuggestedWords = (brak sugestii) NoMisspelledWord = Brak błędnych słów CheckSpellingDone = Zakończono sprawdzanie pisowni. CheckSpelling = Sprawdź pisownię ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/structurebar.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/svg-edit.properties ================================================ SvgEdit = Edytor SVG ConfirmClose = Nie wszystkie zmiany zostały zapisane. Czy chcesz zamknąć edytor SVG? ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/tabeditor.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/updateAvailable.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/base/locale/bluegriffon/updates.properties ================================================ update.checkInsideButton.label=Znajdź aktualizacje… update.checkInsideButton.accesskey=Z update.resumeButton.label=Wznów pobieranie %S… update.resumeButton.accesskey=W update.openUpdateUI.applyButton.label=Zastosuj aktualizację… update.openUpdateUI.applyButton.accesskey=Z update.restart.applyButton.label=Zastosuj aktualizację update.restart.applyButton.accesskey=Z update.openUpdateUI.upgradeButton.label=Aktualizuj teraz… update.openUpdateUI.upgradeButton.accesskey=A update.restart.upgradeButton.label=Aktualizuj teraz update.restart.upgradeButton.accesskey=A ================================================ FILE: locales/pl/bluegriffon/base/locale/branding/brand.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/base/locale/branding/brand.properties ================================================ brandShortName = BlueGriffon brandFullName = BlueGriffon vendorShortName = Disruptive Innovations sidebarName = Panel boczny ================================================ FILE: locales/pl/bluegriffon/extensions/fs/addFont.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/extensions/fs/fs.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/extensions/fs/fs.properties ================================================ SelectDir = Wybierz katalog do rozpakowania pakietu czcionki SelectFile = Wybierz istniejący arkusz stylów CSS pakietu Stylesheet = Arkusz stylów pakietu FontSquirrel MustBeSavedTitle = Dokument nigdy nie został zapisany MustBeSavedMessage = Przed osadzeniem lokalnych czcionek przy użyciu relatywnego adresu URL, musisz zapisać dokument przynajmniej raz. Po zapisaniu dokumentu, należy go zamknąć i ponownie otworzyć. ================================================ FILE: locales/pl/bluegriffon/extensions/fs/fsOverlay.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/extensions/gfd/addFont.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/extensions/gfd/gfd.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/extensions/gfd/gfdOverlay.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/extensions/markdown/markdown.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/extensions/markdown/markdownOverlay.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/extensions/op1/a11yFirstStep.properties ================================================ ConformingDTDSyntax=Use a W3C-conforming DTD syntax before the html element NoWrongSyntaxOrNonConformingHierarchy=Don't use wrong attribute syntax or non-conforming element hierarchy inside the html element OneTitleInHead=Use a title element as a child of the head element NoEmptyTitle=When you provide a title element, do not leave it empty NoMetaRefresh=Don't use a meta element with an http-equiv attribute and a value equal to refresh HTMLElementHasLangAttribute=Use the lang attribute for the html element HTMLElementHasValidLangAttribute=Use a valid language code for the lang attribute NoInvalidDir=Don't use a value other than ltr, rtl or empty for the dir attribute TitleForFrames=Use the title attribute for every frame element NoEmptyTitleForFrames=When you provide a title attribute for a frame element, do not leave it empty TitleForIFrames=Use the title attribute for every iframe element NoEmptyTitleForIFrames=When you provide a title attribute for an iframe element, do not leave it empty AtLeastOneH1InBody=There must be at least one h1 element inside (at any level) the body element NoEmptyH1=When you provide a h1 element, do not leave it empty NoEmptyH2=When you provide a h2 element, do not leave it empty NoEmptyH3=When you provide a h3 element, do not leave it empty NoEmptyH4=When you provide a h4 element, do not leave it empty NoEmptyH5=When you provide a h5 element, do not leave it empty NoEmptyH6=When you provide a h6 element, do not leave it empty H2Order=Use  a h1, h2, h3, h4, h5 or h6 element as a first heading before a h2 element in the source order H3Order=Use a h2, h3, h4, h5 or h6 element as a first heading before a h3 element in the source order H4Order=Use a h3, h4, h5 or h6 element as a first heading before a h4 element in the source order H5Order=Use a h4, h5 or h6 element as a first heading before a h5 element in the source order H6Order=Use a h5 or h6 element as a first heading before a h6 element in the source order DTAsFirstChildOfDL=Use a dt element as the first child of a dl element NoEmptyLI=When you provide a li element, do not leave it empty NoAlignAttribute=Don't use the align attribute NoXmpElement=Don't use the xmp element NoEmptyP=When you provide a p element, do not leave it empty NoEmptyAExceptAnchors=When you provide an a element, do not leave it empty except if it is used as an anchor NoEmptyButton=When you provide a button element, do not leave it empty NoVlinkAttribute=Don't use the vlink attribute NoTextAttribute=Don't use the text attribute NoLinkAttribute=Don't use the link attribute noImgWithoutAlt=Use the alt attribute for every img element noAreaWithoutAlt=Use the alt attribute for every area element noAppletWithoutAlt=Use the alt attribute for every applet element noImageInputWithoutAlt=Use the alt attribute for every input type=image element noEmptyAltForImageLoneChildOfAnchorOrButton=If the img element is the only child of a button or an a element, do not leave its alt attribute empty noEmptyAltForInputImage=When you provide an alt attribute for an input type=image element, do not leave it empty noEmptyAltForAreaWithHref=When you provide an alt attribute for an area element holding an href attribute, do not leave it empty noAltSimilarToTextContent=If an img element is a child of an a element with text, do not use the same text for its alt attribute as the text inside the a element noBorderAttribute=Don't use the border attribute noSimilarAltForAreasWithDifferentHref=Don't use the same value for alt attributes for multiple area elements with different href values LongdescIsURI=Use a URI as the value for a longdesc attribute noBackgroundAttribute=Don't use the background attribute noBgsoundElement=Don't use the bgsound element TablesWithAtLeastOneTHHaveACaption=Use a caption element as the first child of a table element containing at least one th element CaptionIsDifferentFromSummaryAttribute=Don't use the same content for a caption element and a summary attribute noEmptyCaption=When you provide a caption element, do not leave it empty noCaptionInATableWithOnlyTDs=Don't use a caption element in a table element containing only td elements noAlinkAttribute=Don't use an alink attribute noSummaryAttributeSimilarToCaption=Don't use the same content for a summary attribute and a caption element noEmptySummaryIfTableHasTHOrCaption=When you provide a summary attribute for a table element containing a th or a caption element, do not leave it empty noSummaryAttributeIfOnlyTDs=Don't use a summary attribute on a table element containg only td elements noStrikeElement=Don't use the strike element noListingElement=Don't use the listing element AtLeastOneTHIfCaptionOrSummary=Use at least one th element inside a table element with a caption element or a non-empty summary attribute AllNonEmptyTHHaveScopeOrId=Use a scope or id attribute for every non-empty th element ScopeAttributeIsRowOrCol=Don't use a value other than row or col for the scope attribute noBgcolorAttribute=Don't use the bgcolor attribute noTTElement=Don't use the tt element TDHaveHeadersAttributeIfTHHasId=Use a headers attribute on every td element if the corresponding th element has an id attribute noPlaintextElement=Don't use the plaintext element noHeadersAttributeThatIsNotATHId=Don't use for a headers attribute a value which matches an id attribute used for a td of the table element AllFormsHaveAButton=Use a button, or an input of type submit, image or button inside a form element SubmitButtonsHaveNonEmptyValue=When you provide an input type=submit, do not leave its value attribute empty noMarqueeElement=Don't use the marquee element FieldsetHasALegend=Use a legend element as a child of every fieldset element FieldsetsAreInForms=Don't use a fieldset element without a form element noEmptyLegendElement=When you provide a legend element, do not leave it empty LabelElementHasForAttribute=Use the for attribute for every label element noEmptyForAttributeOnLabel=When you provide a for attribute for a label element, do not leave it empty ForAttributeMatchesAnIdInSameForm=A for attribute must have a value that matches an id attribute inside the form element OptgroupElementHasALabel=Use the label attribute for every optgroup element NoSimilarLabelInOptgroupsOfSameSelect=Don't use the same label attribute for different optgroup elements of the same select element noEmptyLabelAttributeOnOptgroup=When you provide a label attribute for an optgroup element, do not leave it empty noBasefontElement=Don't use the basefont element noBlinkElement=Don't use the blink element noCenterElement=Don't use the center element noFontElement=Don't use the font element ================================================ FILE: locales/pl/bluegriffon/extensions/op1/op1.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/extensions/op1/op1Overlay.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/extensions/tipoftheday/tipoftheday.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/extensions/tipoftheday/tipoftheday.rdf ================================================ %brandDTD; ]> &brandShortName; – podpowiedzi http://bluegriffon.org/ &brandShortName; – archiwum podpowiedzi dnia pl …&brandShortName; działa na różnych platformach? &brandShortName; działa na różnych systemach operacyjnych, takich jak Windows, Mac OS X i wielu dystrybucjach Linuksa, OS/2… …&brandShortName; wyświetla tytuł niezapisanej strony z czerwonym cieniem? Możesz zapisywać pliki z różnych trybów wyświetlania. …masz bezpośredni dostęp do społeczności programu &brandShortName;? Wybierz menu Pomoc » Społeczność użytkowników. …wstawianie elementów HTML5 jest łatwe? Wybierz menu Wstaw » Element HTML5. …możesz zamknąć aktywną kartę za pomocą skrótu klawiszowego? Użycie skrótu Ctrl+w (Command +w w systemie Mac OS X) spowoduje zamknięcie aktywnej karty. …możesz utworzyć nową kartę za pomocą skrótu klawiszowego? Użycie skrótu Ctrl+n (Command +n w systemie Mac OS X) spowoduje utworzenie nowej pustej karty z takim samym atrybutem doctype, jak ostatnio utworzona strona. …you can revert to a previously saved version of the currently edited document? Righ-click (context-click on Mac OS X) on the document's tab and select the Revert menu. …możesz publikować strony bezpośrednio z programu &brandShortName; Trzeba najpierw zainstalować i ustawić dodatek FireFTP. Dostęp do niego będzie możliwy z poziomu menu Narzędzia. …za pomocą programu &brandShortName; można łatwo wstawiać dowolne znaki? Użyj funkcji Znaki i symbole z menu Wstaw. Możesz poszukać znaku Unicode wg jego nazwy lub otworzyć cały blok, by go odnaleźć. …&brandShortName; uruchamia sprawdzanie pisowni domyślnie? Kliknij prawym przyciskiem myszy słowo i poszukaj sugestii. Można zmieniać lub wyłączyć tę funkcję z poziomu Narzędzia » Ustawienia » Ogólne. …&brandShortName; może wiarygodnie zaznaczyć element? Kliknij nazwę elementu na pasku struktury. …możesz zmienić położenie elementu w dokumencie za pomocą myszy? Najpierw trzeba zaznaczyć element, jak opisano w poprzedniej podpowiedzi i następnie przeciągnąć go w żądane miejsce. …możesz szybko otwierać istniejące strony? Płatny dodatek Project manager umożliwia natychmiastowy dostęp do stron i obrazków znajdujących się w projekcie. …możesz wybrać domyślną przeglądarkę? Można to zrobić z poziomu menu Narzędzia » Ustawienia » Zaawansowane » Resetuj ustawienia zewnętrznej przeglądarki. Podczas następnego przeglądania można wybrać nową domyślną przeglądarkę. …&brandShortName; umożliwia używanie zewnętrznych arkuszy stylów? Aby utworzyć gotowy do użycia arkusz, kliknij Panele » Arkusze stylów”. Kliknij znak plusa i wybierz Powiązany z dokumentem. …&brandShortName; może zarządzać arkuszami stylów i złożonymi selektorami? Używając płatnego dodatku CSS Pro Editor można zmieniać kolejność i dodawać tytuły i atrybut rel do arkuszy stylów i tworzyć skomplikowane selektory CSS 2, CSS 3. …możesz zmieniać rozmiar paneli? Złap uchwyt znajdujący się w prawym dolnym narożniku i przeciągając go zmień rozmiar panelu. …możesz dodawać atrybuty do dowolnego elementu? Otwórz Panele » Eksplorator DOM. W widoku trybu graficznego kliknij element. W panelu eksploratora DOM wybierz kartę Atrybuty i na dole panelu kliknij znak plusa. …&brandShortName; może obsługiwać właściwości CSS3? Prefiksy dostawców zostaną dodane do przeglądarek, które ich potrzebują. …możesz dostosować skróty klawiszowe? Każdy element menu można przypisać do preferowanego skrótu. Otwórz Narzędzia » Ustawienia » Skróty klawiszowe. Odszukaj i dwukrotnie kliknij żądane polecenie. W nowym oknie zmień skrót. …możesz usunąć klasę z elementu? Wybierz element i w menu rozwijanym Klasy ponownie zastosuj klasę. ================================================ FILE: locales/pl/bluegriffon/extensions/tipoftheday/tipofthedayOverlay.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/sidebars/aria/aria.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/sidebars/aria/aria.properties ================================================ mustBeContainedIn=must be contained in or= or ok=OK mustContain=must contain and= and deprecated=deprecated missingTextbox=missing textbox missingListboxTreeGridDialog=missing listbox, tree, grid or dialog ================================================ FILE: locales/pl/bluegriffon/sidebars/aria/ariaOverlay.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/sidebars/cssproperties/backgrounditem.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/sidebars/cssproperties/backgrounditem.properties ================================================ backgroundColorTitle = Kolor backgroundImageTitle = Obrazek backgroundLinearGradientTitle = Gradient liniowy backgroundRadialGradientTitle = Gradient radialny ================================================ FILE: locales/pl/bluegriffon/sidebars/cssproperties/colorstopitem.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/sidebars/cssproperties/cssproperties.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/sidebars/cssproperties/cssproperties.properties ================================================ EnterAnId = Podaj ID EnterUniqueId = Podaj unikalny identyfikator dla elementu: NoClasSelected = Wybierz klasę PleaseSelectAClass = Klasa CSS musi zostać wybrana, aby było możliwe zastosowanie zmian ================================================ FILE: locales/pl/bluegriffon/sidebars/cssproperties/csspropertiesOverlay.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/sidebars/cssproperties/editGridTemplate.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/sidebars/cssproperties/fontFeatures.properties ================================================ FFaalt=Access all alternates FFcalt=Contextual alternates FFsalt=Stylistic alternates FFliga=Standard ligatures FFclig=Contextual ligatures FFdlig=Discretionary ligatures FFhist=Historical forms FFhlig=Historical ligatures FFunic=Unicase FFsmcp=Small capitals FFc2sc=Small capitals from capitals FFc2pc=Petite capitals from capitals FFpcap=Petite capitals FFcase=Case sensitive forms FFcpsp=Capital spacing FFtitl=Titling FFswsh=Swash FFcswh=Contextual swash FFfrac=Fractions FFafrc=Alternative fractions FFordn=Ordinals FFnumr=Numerators FFdnom=Denominators FFsinf=Scientific inferiors FFsups=Superscript FFsubs=Subscript FFonum=Oldstyle figures FFlnum=Lining Figures FFpnum=Proportional figures FFtnum=Tabular figures FFzero=Slashed zero FFmgrk=Mathematical greek FFnalt=Alternate annotation forms FFornm=Ornaments FFlocl=Localized forms FFsize=Optical size FFisol=Isolated forms FFinit=Initial forms FFmedi=Medial forms FFfinal=Final forms FFrlig=Requird ligatures FFccmp=Glyph composition/decomposition FFmark=Mark to base positioning FFmkmj=Mark to mark positioning FFhwid=Half widths ================================================ FILE: locales/pl/bluegriffon/sidebars/cssproperties/griditemposition.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/sidebars/cssproperties/textshadowitem.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/sidebars/cssproperties/transformationitem.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/sidebars/cssproperties/transitionitem.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/sidebars/domexplorer/domexplorer.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/sidebars/domexplorer/domexplorerOverlay.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/sidebars/its20/its20.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/sidebars/its20/its20.properties ================================================ LoadError=Load Error InlineParseError=Inline resource is not an ITS 2.0 document CannotFetch=Cannot fetch URL NotITS=Resource is not an ITS 2.0 document TranslatableByGlobalRule=Translatable by global rule NotTranslatableByGlobalRule=Not translatable by global rule InlineRules=Inline rules translateRule=Translate locNoteRule=Localization Note termRule=Terminology dirRule=Directionality langRule=Language Information withinTextRule=Elements Within Text domainRule=Domain textAnalysisRule=Text Analysis localeFilterRule=Locale Filter provRule=Provenance externalResourceRefRule=External Resource targetPointerRule=Target Pointer idValueRule=Id Value preserveSpaceRule=Preserve Space locQualityIssueRule=Localization Quality Issue mtConfidenceRule=Machine-Translation Confidence allowedCharactersRule=Allowed Characters storageSizeRule=Storage Size DontWarnAgainForUrl=Don't warn me again about this URL DontWarnAgainForInline=Don't warn me again about inline global rules NewITSFile=New ITS 2.0 File CannotResolveXPath=Cannot resolve the following XPath selector (undeclared HTML namespace?): XPathParsingError=XPath Parsing Error DontWarnAgainForSelector=Don't warn me again about this selector CSSParsingError=CSS Parsing Error CannotResolveCSS=Cannot resolve the following CSS selector: ================================================ FILE: locales/pl/bluegriffon/sidebars/its20/its20Overlay.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/sidebars/its20/locNoteRule.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/sidebars/its20/selector.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/sidebars/its20/termRule.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/sidebars/its20/translateRule.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/sidebars/scripteditor/editor.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/sidebars/scripteditor/scripteditor.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/sidebars/scripteditor/scripteditor.properties ================================================ ConfirmDeletionTitle=Usuń skrypt ConfirmDeletion=Czy na pewno chcesz usunąć ten skrypt? AddExternalScriptTitle=Dodaj zewnętrzny skrypt PromptScriptURL=Adres URL skryptu? ================================================ FILE: locales/pl/bluegriffon/sidebars/scripteditor/scripteditorOverlay.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/sidebars/stylesheets/editor.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/sidebars/stylesheets/stylesheets.dtd ================================================ ================================================ FILE: locales/pl/bluegriffon/sidebars/stylesheets/stylesheetsOverlay.dtd ================================================ ================================================ FILE: locales/pl/cssproperties.mn ================================================ bluegriffon-pl.jar: % locale cssproperties pl %locale/pl/cssproperties/ locale/pl/cssproperties/csspropertiesOverlay.dtd (locale/pl/csspropertiesOverlay.dtd) locale/pl/cssproperties/cssproperties.dtd (locale/pl/cssproperties.dtd) locale/pl/cssproperties/editGridTemplate.dtd (locale/pl/editGridTemplate.dtd) locale/pl/cssproperties/backgrounditem.dtd (locale/pl/backgrounditem.dtd) locale/pl/cssproperties/griditemposition.dtd (locale/pl/griditemposition.dtd) locale/pl/cssproperties/transformationitem.dtd (locale/pl/transformationitem.dtd) locale/pl/cssproperties/transitionitem.dtd (locale/pl/transitionitem.dtd) locale/pl/cssproperties/textshadowitem.dtd (locale/pl/textshadowitem.dtd) locale/pl/cssproperties/colorstopitem.dtd (locale/pl/colorstopitem.dtd) locale/pl/cssproperties/backgrounditem.properties (locale/pl/backgrounditem.properties) locale/pl/cssproperties/cssproperties.properties (locale/pl/cssproperties.properties) locale/pl/cssproperties/fontFeatures.properties (locale/pl/fontFeatures.properties) ================================================ FILE: locales/pl/domexplorer.mn ================================================ bluegriffon-pl.jar: % locale domexplorer pl %locale/pl/domexplorer/ locale/pl/domexplorer/domexplorerOverlay.dtd (locale/pl/domexplorerOverlay.dtd) locale/pl/domexplorer/domexplorer.dtd (locale/pl/domexplorer.dtd) ================================================ FILE: locales/pl/fs.mn ================================================ fs-pl.jar: % locale fs pl %locale/pl/fs/ locale/pl/fs/fsOverlay.dtd (locale/pl/fsOverlay.dtd) locale/pl/fs/fs.dtd (locale/pl/fs.dtd) locale/pl/fs/fs.properties (locale/pl/fs.properties) locale/pl/fs/addFont.dtd (locale/pl/addFont.dtd) ================================================ FILE: locales/pl/gfd.mn ================================================ gfd-pl.jar: % locale gfd pl %locale/pl/gfd/ locale/pl/gfd/gfdOverlay.dtd (locale/pl/gfdOverlay.dtd) locale/pl/gfd/gfd.dtd (locale/pl/gfd.dtd) locale/pl/gfd/addFont.dtd (locale/pl/addFont.dtd) ================================================ FILE: locales/pl/its20.mn ================================================ bluegriffon-pl.jar: % locale its20 pl %locale/pl/its20/ locale/pl/its20/its20Overlay.dtd (locale/pl/its20Overlay.dtd) locale/pl/its20/its20.properties (locale/pl/its20.properties) locale/pl/its20/its20.dtd (locale/pl/its20.dtd) locale/pl/its20/translateRule.dtd (locale/pl/translateRule.dtd) locale/pl/its20/locNoteRule.dtd (locale/pl/locNoteRule.dtd) locale/pl/its20/termRule.dtd (locale/pl/termRule.dtd) locale/pl/its20/selector.dtd (locale/pl/selector.dtd) ================================================ FILE: locales/pl/markdown.mn ================================================ markdown-pl.jar: % locale markdown pl %locale/pl/markdown/ locale/pl/markdown/markdownOverlay.dtd (locale/pl/markdownOverlay.dtd) locale/pl/markdown/markdown.dtd (locale/pl/markdown.dtd) ================================================ FILE: locales/pl/op1.mn ================================================ op1-pl.jar: % locale op1 pl %locale/pl/op1/ locale/pl/op1/op1Overlay.dtd (locale/pl/op1Overlay.dtd) locale/pl/op1/op1.dtd (locale/pl/op1.dtd) locale/pl/op1/a11yFirstStep.properties (locale/pl/a11yFirstStep.properties) ================================================ FILE: locales/pl/scripteditor.mn ================================================ bluegriffon-pl.jar: % locale scripteditor pl %locale/pl/scripteditor/ locale/pl/scripteditor/scripteditorOverlay.dtd (locale/pl/scripteditorOverlay.dtd) locale/pl/scripteditor/scripteditor.dtd (locale/pl/scripteditor.dtd) locale/pl/scripteditor/scripteditor.properties (locale/pl/scripteditor.properties) locale/pl/scripteditor/editor.dtd (locale/pl/editor.dtd) ================================================ FILE: locales/pl/stylesheets.mn ================================================ bluegriffon-pl.jar: % locale stylesheets pl %locale/pl/stylesheets/ locale/pl/stylesheets/stylesheetsOverlay.dtd (locale/pl/stylesheetsOverlay.dtd) locale/pl/stylesheets/stylesheets.dtd (locale/pl/stylesheets.dtd) locale/pl/stylesheets/editor.dtd (locale/pl/editor.dtd) ================================================ FILE: locales/pl/tipoftheday.mn ================================================ tipoftheday-pl.jar: % locale tipoftheday pl %locale/pl/tipoftheday/ locale/pl/tipoftheday/tipoftheday.dtd (locale/pl/tipoftheday.dtd) locale/pl/tipoftheday/tipofthedayOverlay.dtd (locale/pl/tipofthedayOverlay.dtd) locale/pl/tipoftheday/tipoftheday.rdf (locale/pl/tipoftheday.rdf) ================================================ FILE: locales/pt-PT/aria.mn ================================================ bluegriffon-pt-PT.jar: % locale aria pt-PT %locale/pt-PT/aria/ locale/pt-PT/aria/ariaOverlay.dtd (locale/pt-PT/ariaOverlay.dtd) locale/pt-PT/aria/aria.dtd (locale/pt-PT/aria.dtd) locale/pt-PT/aria/aria.properties (locale/pt-PT/aria.properties) ================================================ FILE: locales/pt-PT/base/locale/bluegriffon/aboutDialog.dtd ================================================ ================================================ FILE: locales/pt-PT/base/locale/bluegriffon/aria.dtd ================================================ ================================================ FILE: locales/pt-PT/base/locale/bluegriffon/bluegriffon.dtd ================================================ ================================================ FILE: locales/pt-PT/base/locale/bluegriffon/bluegriffon.properties ================================================ titleModifier=BlueGriffon # in the following string, %t represents the title of the page or its URL # and %b the titleModifier above titleFormat=%S - %S Unknown=[Desconhecido] NoClassAvailable=(sem classe) NoIdAvailable=(sem ID) DocumentTitle=Título da Página NeedDocTitle=Por favor, introduza um título para a página actual. DocTitleHelp=Isto identifica a página no título da janela e nos marcadores. ExportToText=Exportar para Texto SaveDocumentAs=Guardar Página Como XHTMLfiles=Ficheiros XHTML untitled=sem título SaveDocument=Guardar Página SaveFileFailed=Guarda ficheiro falhou! ExportToText=Exportar para Texto FileNotSaved=O ficheiro não está guardado! SaveFileBeforeClosing=Deseja guardar o ficheiro antes de fechar este separador? YesSaveFile=Sim, guardar NoDiscardChanges=Não, rejeitar as alterações DontCloseTab=Não fechar este separador! IdAlreadyTaken=Este ID já está em uso no documento RemoveIdFromElement=Deseja remover o ID do elemento que já o tem ou cancelar a acção? YesRemoveId=Remover o ID NoCancel=Cancelar ReplaceAll=Subtituir Todos... ReplacedPart1=Foram substituídas ReplacedPart2=ocorrências AFileWasChanged=A file was changed on disk ReloadFile=File %S changed on disk, BlueGriffon must reload it DontAskForFileChangesAgain=don't show this alert again HTMLCommentsInXHTMLTitle=HTML comment inside a

      Texto normal será semelhante a este !

      Ligações Visitadas serão semelhantes a esta !

      Ligações Activas serão semelhantes a esta !

      ================================================ FILE: locales/pt-PT/base/locale/bluegriffon/parsingError.dtd ================================================ ================================================ FILE: locales/pt-PT/base/locale/bluegriffon/prefs/advanced.dtd ================================================ ================================================ FILE: locales/pt-PT/base/locale/bluegriffon/prefs/connection.dtd ================================================ ================================================ FILE: locales/pt-PT/base/locale/bluegriffon/prefs/general.dtd ================================================ ================================================ FILE: locales/pt-PT/base/locale/bluegriffon/prefs/newPage.dtd ================================================ ================================================ FILE: locales/pt-PT/base/locale/bluegriffon/prefs/shortcuts.dtd ================================================ ================================================ FILE: locales/pt-PT/base/locale/bluegriffon/prefs/shortcuts.properties ================================================ NoMainWindowAvaialble=Cannot edit keyboard shortcuts PleaseOpenOneMainWindow=At least one main BlueGriffon window must be opened to edit keyboard shortcuts. ================================================ FILE: locales/pt-PT/base/locale/bluegriffon/prefs/styles.dtd ================================================ ================================================ FILE: locales/pt-PT/base/locale/bluegriffon/prefs/update.dtd ================================================ ================================================ FILE: locales/pt-PT/base/locale/bluegriffon/prefs.dtd ================================================ ================================================ FILE: locales/pt-PT/base/locale/bluegriffon/propertiesDeck.dtd ================================================ ================================================ FILE: locales/pt-PT/base/locale/bluegriffon/rotator.dtd ================================================ ================================================ FILE: locales/pt-PT/base/locale/bluegriffon/spellCheck.dtd ================================================ ================================================ FILE: locales/pt-PT/base/locale/bluegriffon/spellCheck.properties ================================================ CorrectSpelling=(ortografia correcta) NoSuggestedWords=(nenhuma palavra sugerida) NoMisspelledWord=Nenhuma palavra com erros ortográficos CheckSpellingDone=Concluída a verificação ortográfica. CheckSpelling=Verificar Ortografia ================================================ FILE: locales/pt-PT/base/locale/bluegriffon/structurebar.dtd ================================================ ================================================ FILE: locales/pt-PT/base/locale/bluegriffon/tabeditor.dtd ================================================ ================================================ FILE: locales/pt-PT/base/locale/bluegriffon/updateAvailable.dtd ================================================ "> ================================================ FILE: locales/pt-PT/base/locale/branding/brand.dtd ================================================ #expand ================================================ FILE: locales/pt-PT/base/locale/branding/brand.properties ================================================ brandShortName=BlueGriffon brandFullName=BlueGriffon vendorShortName=Disruptive Innovations sidebarName=Barra Lateral ================================================ FILE: locales/pt-PT/base.mn ================================================ bluegriffon-pt-PT.jar: % locale bluegriffon pt-PT %locale/pt-PT/bluegriffon/ % locale branding pt-PT %locale/pt-PT/branding/ locale/pt-PT/bluegriffon/aboutDialog.dtd (locale/pt-PT/bluegriffon/aboutDialog.dtd) locale/pt-PT/bluegriffon/bluegriffon.dtd (locale/pt-PT/bluegriffon/bluegriffon.dtd) locale/pt-PT/bluegriffon/bluegriffon.properties (locale/pt-PT/bluegriffon/bluegriffon.properties) locale/pt-PT/bluegriffon/colourPicker.dtd (locale/pt-PT/bluegriffon/colourPicker.dtd) locale/pt-PT/bluegriffon/credits.dtd (locale/pt-PT/bluegriffon/credits.dtd) locale/pt-PT/bluegriffon/filepickerbutton.dtd (locale/pt-PT/bluegriffon/filepickerbutton.dtd) locale/pt-PT/bluegriffon/filePicking.dtd (locale/pt-PT/bluegriffon/filePicking.dtd) locale/pt-PT/bluegriffon/insertTable.dtd (locale/pt-PT/bluegriffon/insertTable.dtd) locale/pt-PT/bluegriffon/insertTable.properties (locale/pt-PT/bluegriffon/insertTable.properties) locale/pt-PT/bluegriffon/language.properties (locale/pt-PT/bluegriffon/language.properties) locale/pt-PT/bluegriffon/languages.dtd (locale/pt-PT/bluegriffon/languages.dtd) locale/pt-PT/bluegriffon/markupCleaner.dtd (locale/pt-PT/bluegriffon/markupCleaner.dtd) locale/pt-PT/bluegriffon/openLocation.dtd (locale/pt-PT/bluegriffon/openLocation.dtd) locale/pt-PT/bluegriffon/openLocation.properties (locale/pt-PT/bluegriffon/openLocation.properties) locale/pt-PT/bluegriffon/newPageWizard.dtd (locale/pt-PT/bluegriffon/newPageWizard.dtd) locale/pt-PT/bluegriffon/newPageWizard.properties (locale/pt-PT/bluegriffon/newPageWizard.properties) locale/pt-PT/bluegriffon/propertiesDeck.dtd (locale/pt-PT/bluegriffon/propertiesDeck.dtd) locale/pt-PT/bluegriffon/aria.dtd (locale/pt-PT/bluegriffon/aria.dtd) locale/pt-PT/bluegriffon/structurebar.dtd (locale/pt-PT/bluegriffon/structurebar.dtd) locale/pt-PT/bluegriffon/tabeditor.dtd (locale/pt-PT/bluegriffon/tabeditor.dtd) locale/pt-PT/bluegriffon/masterPasswordQuery.properties (locale/pt-PT/bluegriffon/masterPasswordQuery.properties) locale/pt-PT/bluegriffon/newDocument.dtd (locale/pt-PT/bluegriffon/newDocument.dtd) locale/pt-PT/bluegriffon/prefs/general.dtd (locale/pt-PT/bluegriffon/prefs/general.dtd) locale/pt-PT/bluegriffon/prefs/newPage.dtd (locale/pt-PT/bluegriffon/prefs/newPage.dtd) locale/pt-PT/bluegriffon/prefs/update.dtd (locale/pt-PT/bluegriffon/prefs/update.dtd) locale/pt-PT/bluegriffon/prefs/styles.dtd (locale/pt-PT/bluegriffon/prefs/styles.dtd) locale/pt-PT/bluegriffon/prefs/advanced.dtd (locale/pt-PT/bluegriffon/prefs/advanced.dtd) locale/pt-PT/bluegriffon/prefs/connection.dtd (locale/pt-PT/bluegriffon/prefs/connection.dtd) locale/pt-PT/bluegriffon/prefs.dtd (locale/pt-PT/bluegriffon/prefs.dtd) locale/pt-PT/bluegriffon/updateAvailable.dtd (locale/pt-PT/bluegriffon/updateAvailable.dtd) locale/pt-PT/branding/brand.dtd (locale/pt-PT/branding/brand.dtd) locale/pt-PT/branding/brand.properties (locale/pt-PT/branding/brand.properties) locale/pt-PT/bluegriffon/insertImage.dtd (locale/pt-PT/bluegriffon/insertImage.dtd) locale/pt-PT/bluegriffon/insertAnchor.dtd (locale/pt-PT/bluegriffon/insertAnchor.dtd) locale/pt-PT/bluegriffon/insertLink.dtd (locale/pt-PT/bluegriffon/insertLink.dtd) locale/pt-PT/bluegriffon/insertLink.properties (locale/pt-PT/bluegriffon/insertLink.properties) locale/pt-PT/bluegriffon/cssClassPicker.dtd (locale/pt-PT/bluegriffon/cssClassPicker.dtd) locale/pt-PT/bluegriffon/insertVideo.dtd (locale/pt-PT/bluegriffon/insertVideo.dtd) locale/pt-PT/bluegriffon/insertAudio.dtd (locale/pt-PT/bluegriffon/insertAudio.dtd) locale/pt-PT/bluegriffon/insertVideo.properties (locale/pt-PT/bluegriffon/insertVideo.properties) locale/pt-PT/bluegriffon/insertHTML.dtd (locale/pt-PT/bluegriffon/insertHTML.dtd) locale/pt-PT/bluegriffon/insertHR.dtd (locale/pt-PT/bluegriffon/insertHR.dtd) locale/pt-PT/bluegriffon/insertForm.dtd (locale/pt-PT/bluegriffon/insertForm.dtd) locale/pt-PT/bluegriffon/parsingError.dtd (locale/pt-PT/bluegriffon/parsingError.dtd) locale/pt-PT/bluegriffon/insertFormInput.dtd (locale/pt-PT/bluegriffon/insertFormInput.dtd) locale/pt-PT/bluegriffon/insertFieldset.dtd (locale/pt-PT/bluegriffon/insertFieldset.dtd) locale/pt-PT/bluegriffon/insertLabel.dtd (locale/pt-PT/bluegriffon/insertLabel.dtd) locale/pt-PT/bluegriffon/insertButton.dtd (locale/pt-PT/bluegriffon/insertButton.dtd) locale/pt-PT/bluegriffon/insertSelect.dtd (locale/pt-PT/bluegriffon/insertSelect.dtd) locale/pt-PT/bluegriffon/insertTextarea.dtd (locale/pt-PT/bluegriffon/insertTextarea.dtd) locale/pt-PT/bluegriffon/insertKeygen.dtd (locale/pt-PT/bluegriffon/insertKeygen.dtd) locale/pt-PT/bluegriffon/insertOutput.dtd (locale/pt-PT/bluegriffon/insertOutput.dtd) locale/pt-PT/bluegriffon/insertProgress.dtd (locale/pt-PT/bluegriffon/insertProgress.dtd) locale/pt-PT/bluegriffon/insertMeter.dtd (locale/pt-PT/bluegriffon/insertMeter.dtd) locale/pt-PT/bluegriffon/insertStylesheet.dtd (locale/pt-PT/bluegriffon/insertStylesheet.dtd) locale/pt-PT/bluegriffon/editStylesheet.dtd (locale/pt-PT/bluegriffon/editStylesheet.dtd) locale/pt-PT/bluegriffon/media.dtd (locale/pt-PT/bluegriffon/media.dtd) locale/pt-PT/bluegriffon/media.properties (locale/pt-PT/bluegriffon/media.properties) locale/pt-PT/bluegriffon/insertChars.dtd (locale/pt-PT/bluegriffon/insertChars.dtd) locale/pt-PT/bluegriffon/convertToTable.dtd (locale/pt-PT/bluegriffon/convertToTable.dtd) locale/pt-PT/bluegriffon/pageProperties.dtd (locale/pt-PT/bluegriffon/pageProperties.dtd) locale/pt-PT/bluegriffon/spellCheck.dtd (locale/pt-PT/bluegriffon/spellCheck.dtd) locale/pt-PT/bluegriffon/spellCheck.properties (locale/pt-PT/bluegriffon/spellCheck.properties) locale/pt-PT/bluegriffon/dictionary.dtd (locale/pt-PT/bluegriffon/dictionary.dtd) locale/pt-PT/bluegriffon/html5.properties (locale/pt-PT/bluegriffon/html5.properties) ================================================ FILE: locales/pt-PT/bluegriffon/sidebars/aria/aria.dtd ================================================ ================================================ FILE: locales/pt-PT/bluegriffon/sidebars/aria/aria.properties ================================================ mustBeContainedIn=must be contained in or= or ok=OK mustContain=must contain and= and deprecated=deprecated missingTextbox=missing textbox missingListboxTreeGridDialog=missing listbox, tree, grid or dialog ================================================ FILE: locales/pt-PT/bluegriffon/sidebars/aria/ariaOverlay.dtd ================================================ ================================================ FILE: locales/pt-PT/cssproperties.mn ================================================ bluegriffon-pt-PT.jar: % locale cssproperties pt-PT %locale/pt-PT/cssproperties/ locale/pt-PT/cssproperties/csspropertiesOverlay.dtd (locale/pt-PT/csspropertiesOverlay.dtd) locale/pt-PT/cssproperties/cssproperties.dtd (locale/pt-PT/cssproperties.dtd) locale/pt-PT/cssproperties/editGridTemplate.dtd (locale/pt-PT/editGridTemplate.dtd) locale/pt-PT/cssproperties/backgrounditem.dtd (locale/pt-PT/backgrounditem.dtd) locale/pt-PT/cssproperties/griditemposition.dtd (locale/pt-PT/griditemposition.dtd) locale/pt-PT/cssproperties/transformationitem.dtd (locale/pt-PT/transformationitem.dtd) locale/pt-PT/cssproperties/transitionitem.dtd (locale/pt-PT/transitionitem.dtd) locale/pt-PT/cssproperties/textshadowitem.dtd (locale/pt-PT/textshadowitem.dtd) locale/pt-PT/cssproperties/colorstopitem.dtd (locale/pt-PT/colorstopitem.dtd) locale/pt-PT/cssproperties/backgrounditem.properties (locale/pt-PT/backgrounditem.properties) locale/pt-PT/cssproperties/cssproperties.properties (locale/pt-PT/cssproperties.properties) locale/pt-PT/cssproperties/fontFeatures.properties (locale/pt-PT/fontFeatures.properties) ================================================ FILE: locales/pt-PT/domexplorer.mn ================================================ bluegriffon-pt-PT.jar: % locale domexplorer pt-PT %locale/pt-PT/domexplorer/ locale/pt-PT/domexplorer/domexplorerOverlay.dtd (locale/pt-PT/domexplorerOverlay.dtd) locale/pt-PT/domexplorer/domexplorer.dtd (locale/pt-PT/domexplorer.dtd) ================================================ FILE: locales/pt-PT/extensions/fs/addFont.dtd ================================================ ================================================ FILE: locales/pt-PT/extensions/fs/fs.dtd ================================================ ================================================ FILE: locales/pt-PT/extensions/fs/fs.properties ================================================ SelectDir=Selecione uma pasta onde extrair o pacote do tipo de letra SelectFile=Seleccione um pacote stylesheet.css de tipo de letra existente Stylesheet=Um pacote stylesheet de FontSquirrel MustBeSavedTitle=O documento nunca foi guardado MustBeSavedMessage=Deve guardar o ficheiro pelo menos uma vez antes de tentar ligar a um tipo de letra local, utilizando um URL relativo. Por favor, feche o documento e reabra-o depois o guardar.. ================================================ FILE: locales/pt-PT/extensions/fs/fsOverlay.dtd ================================================ ================================================ FILE: locales/pt-PT/extensions/gfd/addFont.dtd ================================================ ================================================ FILE: locales/pt-PT/extensions/gfd/gfd.dtd ================================================ ================================================ FILE: locales/pt-PT/extensions/gfd/gfdOverlay.dtd ================================================ ================================================ FILE: locales/pt-PT/extensions/op1/a11yFirstStep.properties ================================================ ConformingDTDSyntax=Use a W3C-conforming DTD syntax before the html element NoWrongSyntaxOrNonConformingHierarchy=Don't use wrong attribute syntax or non-conforming element hierarchy inside the html element OneTitleInHead=Use a title element as a child of the head element NoEmptyTitle=When you provide a title element, do not leave it empty NoMetaRefresh=Don't use a meta element with an http-equiv attribute and a value equal to refresh HTMLElementHasLangAttribute=Use the lang attribute for the html element HTMLElementHasValidLangAttribute=Use a valid language code for the lang attribute NoInvalidDir=Don't use a value other than ltr, rtl or empty for the dir attribute TitleForFrames=Use the title attribute for every frame element NoEmptyTitleForFrames=When you provide a title attribute for a frame element, do not leave it empty TitleForIFrames=Use the title attribute for every iframe element NoEmptyTitleForIFrames=When you provide a title attribute for an iframe element, do not leave it empty AtLeastOneH1InBody=When you provide a h1 element, do not leave it empty NoEmptyH1=When you provide a h1 element, do not leave it empty NoEmptyH2=When you provide a h2 element, do not leave it empty NoEmptyH3=When you provide a h3 element, do not leave it empty NoEmptyH4=When you provide a h4 element, do not leave it empty NoEmptyH5=When you provide a h5 element, do not leave it empty NoEmptyH6=When you provide a h6 element, do not leave it empty H2Order=Use  a h1, h2, h3, h4, h5 or h6 element as a first heading before a h2 element in the source order H3Order=Use a h2, h3, h4, h5 or h6 element as a first heading before a h3 element in the source order H4Order=Use a h3, h4, h5 or h6 element as a first heading before a h4 element in the source order H5Order=Use a h4, h5 or h6 element as a first heading before a h5 element in the source order H6Order=Use a h5 or h6 element as a first heading before a h6 element in the source order DTAsFirstChildOfDL=Use a dt element as the first child of a dl element
      NoEmptyLI=When you provide a li element, do not leave it empty NoAlignAttribute=Don't use the align attribute NoXmpElement=Don't use the xmp element NoEmptyP=When you provide a p element, do not leave it empty NoEmptyAExceptAnchors=When you provide an a element, do not leave it empty except if it is used as an anchor NoEmptyButton=When you provide a button element, do not leave it empty NoVlinkAttribute=Don't use the vlink attribute NoTextAttribute=Don't use the text attribute NoLinkAttribute=Don't use the link attribute noImgWithoutAlt=Use the alt attribute for every img element noAreaWithoutAlt=Use the alt attribute for every area element noAppletWithoutAlt=Use the alt attribute for every applet element noImageInputWithoutAlt=Use the alt attribute for every input type=image element noEmptyAltForImageLoneChildOfAnchorOrButton=If the img element is the only child of a button or an a element, do not leave its alt attribute empty noEmptyAltForInputImage=When you provide an alt attribute for an input type=image element, do not leave it empty noEmptyAltForAreaWithHref=When you provide an alt attribute for an area element, do not leave it empty noAltSimilarToTextContent=If an img element is a child of an a element with text, do not use the same text for its alt attribute as the text inside the a element noBorderAttribute=Don't use the border attribute noSimilarAltForAreasWithDifferentHref=Don't use the same value for alt attributes for multiple area elements with different href values LongdescIsURI=Use a URI as the value for a longdesc attribute noBackgroundAttribute=Don't use the background attribute noBgsoundElement=Don't use the bgsound element TablesWithAtLeastOneTHHaveACaption=Use a caption element as the first child of a table element containing at least one th element CaptionIsDifferentFromSummaryAttribute=Don't use the same content for a caption element and a summary attribute noEmptyCaption=When you provide a caption element, do not leave it empty noCaptionInATableWithOnlyTDs=Don't use a caption element in a table element containing only td elements noAlinkAttribute=Don't use an alink attribute noSummaryAttributeSimilarToCaption=Don't use the same content for a summary attribute and a caption element noEmptySummaryIfTableHasTHOrCaption=When you provide a summary attribute for a table element containing a th or a caption element, do not leave it empty noSummaryAttributeIfOnlyTDs=Don't use a summary attribute on a table element containg only td elements noStrikeElement=Don't use the strike element noListingElement=Don't use the listing element AtLeastOneTHIfCaptionOrSummary=Use at least one th element inside a table element with a caption element or a non-empty summary attribute AllNonEmptyTHHaveScopeOrId=Use a scope or id attribute for every non-empty th element ScopeAttributeIsRowOrCol=Don't use a value other than row or col for the scope attribute noBgcolorAttribute=Don't use the bgcolor attribute noTTElement=Don't use the tt element TDHaveHeadersAttributeIfTHHasId=Use a headers attribute on every td element if the corresponding th element has an id attribute noPlaintextElement=Don't use the plaintext element noHeadersAttributeThatIsNotATHId=Don't use for a headers attribute a value which matches an id attribute used for a td of the table element AllFormsHaveAButton=Use a button, or an input of type submit, image or button inside a form element SubmitButtonsHaveNonEmptyValue=When you provide an input type=submit, do not leave its value attribute empty noMarqueeElement=Don't use the marquee element FieldsetHasALegend=Use a legend element as a child of every fieldset element FieldsetsAreInForms=Don't use a fieldset element without a form element noEmptyLegendElement=When you provide a legend element, do not leave it empty LabelElementHasForAttribute=Use the for attribute for every label element noEmptyForAttributeOnLabel=When you provide a for attribute for a label element, do not leave it empty ForAttributeMatchesAnIdInSameForm=A for attribute must have a value that matches an id attribute inside the form element OptgroupElementHasALabel=Use the label attribute for every optgroup element NoSimilarLabelInOptgroupsOfSameSelect=Don't use the same label attribute for different optgroup elements of the same select element noEmptyLabelAttributeOnOptgroup=When you provide a label attribute for an optgroup element, do not leave it empty noBasefontElement=Don't use the basefont element noBlinkElement=Don't use the blink element noCenterElement=Don't use the center element noFontElement=Don't use the font element ================================================ FILE: locales/pt-PT/extensions/op1/op1.dtd ================================================ ================================================ FILE: locales/pt-PT/extensions/op1/op1Overlay.dtd ================================================ ================================================ FILE: locales/pt-PT/extensions/tipoftheday/tipoftheday.dtd ================================================ ================================================ FILE: locales/pt-PT/extensions/tipoftheday/tipoftheday.rdf ================================================ %brandDTD; ]> &brandShortName; tips http://bluegriffon.org/ &brandShortName; tip of the day Archive en-us …you can resize table with the mouse? Just show the rulers using View > Show/Hide > Rulers and place the caret inside a table cell to see resizers appear. …you can very easily customize a toolbar? Just right-click on it… …you have direct access to the &brandShortName; community? Just select the Help menu. …&brandShortName; is cross-platform? &brandShortName; exists on a wide variety of operating systems, including Windows, Mac OS X, many flavors of Linux, OS/2, … …you can create a new tab with a key combination? Control+n (Command+n on Mac OS X) will create a new blank tab …you can close the current tab with one key? Control-w (Command-w on Mac OS X) will close the current tab. ================================================ FILE: locales/pt-PT/extensions/tipoftheday/tipofthedayOverlay.dtd ================================================ ================================================ FILE: locales/pt-PT/fs.mn ================================================ fs-pt-PT.jar: % locale fs pt-PT %locale/pt-PT/fs/ locale/pt-PT/fs/fsOverlay.dtd (locale/pt-PT/fsOverlay.dtd) locale/pt-PT/fs/fs.dtd (locale/pt-PT/fs.dtd) locale/pt-PT/fs/fs.properties (locale/pt-PT/fs.properties) locale/pt-PT/fs/addFont.dtd (locale/pt-PT/addFont.dtd) ================================================ FILE: locales/pt-PT/gfd.mn ================================================ gfd-pt-PT.jar: % locale gfd pt-PT %locale/pt-PT/gfd/ locale/pt-PT/gfd/gfdOverlay.dtd (locale/pt-PT/gfdOverlay.dtd) locale/pt-PT/gfd/gfd.dtd (locale/pt-PT/gfd.dtd) locale/pt-PT/gfd/addFont.dtd (locale/pt-PT/addFont.dtd) ================================================ FILE: locales/pt-PT/sidebars/cssproperties/backgrounditem.dtd ================================================ ================================================ FILE: locales/pt-PT/sidebars/cssproperties/backgrounditem.properties ================================================ backgroundColorTitle=Cor backgroundImageTitle=Imagem backgroundLinearGradientTitle=Gradiente linear backgroundRadialGradientTitle=Gradiente radial ================================================ FILE: locales/pt-PT/sidebars/cssproperties/colorstopitem.dtd ================================================ ================================================ FILE: locales/pt-PT/sidebars/cssproperties/cssproperties.dtd ================================================ ================================================ FILE: locales/pt-PT/sidebars/cssproperties/cssproperties.properties ================================================ EnterAnId=Por favor, introduza um ID EnterUniqueId=Tem que atribuir um ID único ao elemento: NoClasSelected=Tem que seleccionar um nome de classe PleaseSelectAClass=Uma classe tem que ser seleccionada para aplicar as mudanças solocitadas ================================================ FILE: locales/pt-PT/sidebars/cssproperties/csspropertiesOverlay.dtd ================================================ ================================================ FILE: locales/pt-PT/sidebars/cssproperties/griditemposition.dtd ================================================ ================================================ FILE: locales/pt-PT/sidebars/cssproperties/textshadowitem.dtd ================================================ ================================================ FILE: locales/pt-PT/sidebars/cssproperties/transformationitem.dtd ================================================ ================================================ FILE: locales/pt-PT/sidebars/cssproperties/transitionitem.dtd ================================================ ================================================ FILE: locales/pt-PT/sidebars/domexplorer/domexplorer.dtd ================================================ ================================================ FILE: locales/pt-PT/sidebars/domexplorer/domexplorerOverlay.dtd ================================================ ================================================ FILE: locales/pt-PT/sidebars/stylesheets/stylesheets.dtd ================================================ ================================================ FILE: locales/pt-PT/sidebars/stylesheets/stylesheetsOverlay.dtd ================================================ ================================================ FILE: locales/ru/aria.mn ================================================ bluegriffon-ru.jar: % locale aria ru %locale/ru/aria/ locale/ru/aria/ariaOverlay.dtd (locale/ru/ariaOverlay.dtd) locale/ru/aria/aria.dtd (locale/ru/aria.dtd) locale/ru/aria/aria.properties (locale/ru/aria.properties) ================================================ FILE: locales/ru/base.mn ================================================ bluegriffon-ru.jar: % locale bluegriffon ru %locale/ru/bluegriffon/ % locale branding ru %locale/ru/branding/ locale/ru/bluegriffon/aboutDialog.dtd (locale/ru/bluegriffon/aboutDialog.dtd) locale/ru/bluegriffon/bluegriffon.dtd (locale/ru/bluegriffon/bluegriffon.dtd) locale/ru/bluegriffon/polyglot.dtd (locale/ru/bluegriffon/polyglot.dtd) locale/ru/bluegriffon/findbar.dtd (locale/ru/bluegriffon/findbar.dtd) locale/ru/bluegriffon/bluegriffon.properties (locale/ru/bluegriffon/bluegriffon.properties) locale/ru/bluegriffon/colourPicker.dtd (locale/ru/bluegriffon/colourPicker.dtd) locale/ru/bluegriffon/credits.dtd (locale/ru/bluegriffon/credits.dtd) locale/ru/bluegriffon/filepickerbutton.dtd (locale/ru/bluegriffon/filepickerbutton.dtd) locale/ru/bluegriffon/filePicking.dtd (locale/ru/bluegriffon/filePicking.dtd) locale/ru/bluegriffon/insertTable.dtd (locale/ru/bluegriffon/insertTable.dtd) locale/ru/bluegriffon/insertTable.properties (locale/ru/bluegriffon/insertTable.properties) locale/ru/bluegriffon/language.properties (locale/ru/bluegriffon/language.properties) locale/ru/bluegriffon/languages.dtd (locale/ru/bluegriffon/languages.dtd) locale/ru/bluegriffon/markupCleaner.dtd (locale/ru/bluegriffon/markupCleaner.dtd) locale/ru/bluegriffon/openLocation.dtd (locale/ru/bluegriffon/openLocation.dtd) locale/ru/bluegriffon/openLocation.properties (locale/ru/bluegriffon/openLocation.properties) locale/ru/bluegriffon/newPageWizard.dtd (locale/ru/bluegriffon/newPageWizard.dtd) locale/ru/bluegriffon/newPageWizard.properties (locale/ru/bluegriffon/newPageWizard.properties) locale/ru/bluegriffon/propertiesDeck.dtd (locale/ru/bluegriffon/propertiesDeck.dtd) locale/ru/bluegriffon/aria.dtd (locale/ru/bluegriffon/aria.dtd) locale/ru/bluegriffon/structurebar.dtd (locale/ru/bluegriffon/structurebar.dtd) locale/ru/bluegriffon/tabeditor.dtd (locale/ru/bluegriffon/tabeditor.dtd) locale/ru/bluegriffon/masterPasswordQuery.properties (locale/ru/bluegriffon/masterPasswordQuery.properties) locale/ru/bluegriffon/newDocument.dtd (locale/ru/bluegriffon/newDocument.dtd) locale/ru/bluegriffon/prefs/file.dtd (locale/ru/bluegriffon/prefs/file.dtd) locale/ru/bluegriffon/prefs/source.dtd (locale/ru/bluegriffon/prefs/source.dtd) locale/ru/bluegriffon/prefs/general.dtd (locale/ru/bluegriffon/prefs/general.dtd) locale/ru/bluegriffon/prefs/newPage.dtd (locale/ru/bluegriffon/prefs/newPage.dtd) locale/ru/bluegriffon/prefs/update.dtd (locale/ru/bluegriffon/prefs/update.dtd) locale/ru/bluegriffon/prefs/styles.dtd (locale/ru/bluegriffon/prefs/styles.dtd) locale/ru/bluegriffon/prefs/advanced.dtd (locale/ru/bluegriffon/prefs/advanced.dtd) locale/ru/bluegriffon/prefs/connection.dtd (locale/ru/bluegriffon/prefs/connection.dtd) locale/ru/bluegriffon/prefs/osx.dtd (locale/ru/bluegriffon/prefs/osx.dtd) locale/ru/bluegriffon/prefs/shortcuts.dtd (locale/ru/bluegriffon/prefs/shortcuts.dtd) locale/ru/bluegriffon/prefs/update.properties (locale/ru/bluegriffon/prefs/update.properties) locale/ru/bluegriffon/prefs/license.dtd (locale/ru/bluegriffon/prefs/license.dtd) locale/ru/bluegriffon/prefs/license.properties (locale/ru/bluegriffon/prefs/license.properties) locale/ru/bluegriffon/prefs/deactivateLicense.dtd (locale/ru/bluegriffon/prefs/deactivateLicense.dtd) locale/ru/bluegriffon/prefs.dtd (locale/ru/bluegriffon/prefs.dtd) locale/ru/bluegriffon/updateAvailable.dtd (locale/ru/bluegriffon/updateAvailable.dtd) locale/ru/bluegriffon/updates.properties (locale/ru/bluegriffon/updates.properties) locale/ru/branding/brand.dtd (locale/ru/branding/brand.dtd) locale/ru/branding/brand.properties (locale/ru/branding/brand.properties) locale/ru/bluegriffon/insertImage.dtd (locale/ru/bluegriffon/insertImage.dtd) locale/ru/bluegriffon/insertAnchor.dtd (locale/ru/bluegriffon/insertAnchor.dtd) locale/ru/bluegriffon/insertCommentOrPI.dtd (locale/ru/bluegriffon/insertCommentOrPI.dtd) locale/ru/bluegriffon/insertLink.dtd (locale/ru/bluegriffon/insertLink.dtd) locale/ru/bluegriffon/insertLink.properties (locale/ru/bluegriffon/insertLink.properties) locale/ru/bluegriffon/cssClassPicker.dtd (locale/ru/bluegriffon/cssClassPicker.dtd) locale/ru/bluegriffon/insertVideo.dtd (locale/ru/bluegriffon/insertVideo.dtd) locale/ru/bluegriffon/insertAudio.dtd (locale/ru/bluegriffon/insertAudio.dtd) locale/ru/bluegriffon/insertVideo.properties (locale/ru/bluegriffon/insertVideo.properties) locale/ru/bluegriffon/insertHTML.dtd (locale/ru/bluegriffon/insertHTML.dtd) locale/ru/bluegriffon/insertHR.dtd (locale/ru/bluegriffon/insertHR.dtd) locale/ru/bluegriffon/insertForm.dtd (locale/ru/bluegriffon/insertForm.dtd) locale/ru/bluegriffon/parsingError.dtd (locale/ru/bluegriffon/parsingError.dtd) locale/ru/bluegriffon/insertFormInput.dtd (locale/ru/bluegriffon/insertFormInput.dtd) locale/ru/bluegriffon/insertFieldset.dtd (locale/ru/bluegriffon/insertFieldset.dtd) locale/ru/bluegriffon/insertLabel.dtd (locale/ru/bluegriffon/insertLabel.dtd) locale/ru/bluegriffon/insertButton.dtd (locale/ru/bluegriffon/insertButton.dtd) locale/ru/bluegriffon/insertSelect.dtd (locale/ru/bluegriffon/insertSelect.dtd) locale/ru/bluegriffon/insertTextarea.dtd (locale/ru/bluegriffon/insertTextarea.dtd) locale/ru/bluegriffon/insertKeygen.dtd (locale/ru/bluegriffon/insertKeygen.dtd) locale/ru/bluegriffon/insertOutput.dtd (locale/ru/bluegriffon/insertOutput.dtd) locale/ru/bluegriffon/insertProgress.dtd (locale/ru/bluegriffon/insertProgress.dtd) locale/ru/bluegriffon/insertMeter.dtd (locale/ru/bluegriffon/insertMeter.dtd) locale/ru/bluegriffon/insertStylesheet.dtd (locale/ru/bluegriffon/insertStylesheet.dtd) locale/ru/bluegriffon/editStylesheet.dtd (locale/ru/bluegriffon/editStylesheet.dtd) locale/ru/bluegriffon/media.dtd (locale/ru/bluegriffon/media.dtd) locale/ru/bluegriffon/media.properties (locale/ru/bluegriffon/media.properties) locale/ru/bluegriffon/insertChars.dtd (locale/ru/bluegriffon/insertChars.dtd) locale/ru/bluegriffon/convertToTable.dtd (locale/ru/bluegriffon/convertToTable.dtd) locale/ru/bluegriffon/pageProperties.dtd (locale/ru/bluegriffon/pageProperties.dtd) locale/ru/bluegriffon/spellCheck.dtd (locale/ru/bluegriffon/spellCheck.dtd) locale/ru/bluegriffon/spellCheck.properties (locale/ru/bluegriffon/spellCheck.properties) locale/ru/bluegriffon/dictionary.dtd (locale/ru/bluegriffon/dictionary.dtd) locale/ru/bluegriffon/html5.properties (locale/ru/bluegriffon/html5.properties) locale/ru/bluegriffon/listProperties.dtd (locale/ru/bluegriffon/listProperties.dtd) locale/ru/bluegriffon/insertTOC.dtd (locale/ru/bluegriffon/insertTOC.dtd) locale/ru/bluegriffon/svg-edit.properties (locale/ru/bluegriffon/svg-edit.properties) locale/ru/bluegriffon/panels.dtd (locale/ru/bluegriffon/panels.dtd) locale/ru/bluegriffon/rotator.dtd (locale/ru/bluegriffon/rotator.dtd) ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/aboutDialog.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/aria.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/bluegriffon.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/bluegriffon.properties ================================================ titleModifier=BlueGriffon # в следующей строке, %t представляет название страницы или ее URL # и %b выше редактор названия titleFormat=%S - %S Unknown=[Неизвестно] NoClassAvailable=(без класса) NoIdAvailable=(без ID) DocumentTitle=Название страницы NeedDocTitle=Пожалуйста, введите название для текущей страницы. DocTitleHelp=Это определяет название страницы в окне и закладках. ExportToText=Экспорт в текст SaveDocumentAs=Сохранить страницу как XHTMLfiles=Файлы XHTML untitled=без названия SaveDocument=Сохранить страницу SaveFileFailed=Сохранение файла не удалось! ExportToText=Экспорт в текст FileNotSaved=Файлы не сохранены! SaveFileBeforeClosing=Вы хотите сохранить файл перед закрытием этой вкладки? YesSaveFile=Да, сохранить его NoDiscardChanges=Нет, отменить изменения DontCloseTab=Не закрывать вкладку! IdAlreadyTaken=Этот идентификатор уже используется в документе RemoveIdFromElement=Вы хотите удалить идентификатор присвоенный элементу или отменить действие? YesRemoveId=Удалить идентификатор NoCancel=Отмена ReplaceAll=Заменить все... ReplacedPart1=Заменено ReplacedPart2=вхождений AFileWasChanged=Файл был изменен на диске ReloadFile=Файл %S изменён на диске, BlueGriffon должен перезагрузить его DontAskForFileChangesAgain=не показывать это предупреждение снова AbandonChanges=Отказаться от несохранённых изменений "%title%" и перегрузить страницу? RevertCaption=Вернуться к последней сохранённой HTMLCommentsInXHTMLTitle=HTML комментарий внутри

      Обычный текст будет выглядеть так !

      Посещённые будет выглядеть следующим образом !

      Активные ссылки будет выглядеть следующим образом !

      ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/panels.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/parsingError.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/polyglot.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/prefs/advanced.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/prefs/connection.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/prefs/deactivateLicense.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/prefs/file.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/prefs/general.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/prefs/license.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/prefs/license.properties ================================================ activateWarning=BlueGriffon необходимо перезапустить, чтобы активировать вашу лицензию. Вы хотите перезапустить его сейчас? confirmRestart=Перезапустить BlueGriffon? fullResetTitle=Сброс активации лицензии fullResetErrorLabel=Невозможно выполнить операцию, произошла ошибка сети. fullResetRequested=Ссылка на сброс была отправлена владельцу лицензии/транзакции. BlueGriffon теперь должен перезапуститься. fullResetInvalid=Идентификатор транзакции недействителен. ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/prefs/newPage.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/prefs/osx.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/prefs/prefs.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.properties ================================================ NoMainWindowAvaialble=Невозможно изменить сочетания клавиш PleaseOpenOneMainWindow=По крайней мере одно главное окно BlueGriffon должно быть открыто для редактирования сочетания клавиш. ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/prefs/source.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/prefs/styles.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/prefs/update.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/prefs/update.properties ================================================ SoftwareUpdates=Обновление программного обеспечения UnableToCheck=Невозможно проверить UpToDate=BlueGriffon актуален ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/prefs.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/propertiesDeck.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/rotator.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/spellCheck.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/spellCheck.properties ================================================ CorrectSpelling=(правильное написание) NoSuggestedWords=(нет предлагаемых слов) NoMisspelledWord=Нет предлагаемых слов CheckSpellingDone=Проверка орфографии завершена. CheckSpelling=Проверка орфографии ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/structurebar.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/svg-edit.properties ================================================ SvgEdit=Редактировать SVG ConfirmClose=Есть несохранённые изменения, вы действительно хотите закрыть редактор SVG? ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/tabeditor.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/updateAvailable.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/bluegriffon/updates.properties ================================================ update.checkInsideButton.label=Проверить обновления update.checkInsideButton.accesskey=C update.resumeButton.label=Возобновить загрузку %S… update.resumeButton.accesskey=D update.openUpdateUI.applyButton.label=Применить обновления… update.openUpdateUI.applyButton.accesskey=A update.restart.applyButton.label=Применить обновления update.restart.applyButton.accesskey=A update.openUpdateUI.upgradeButton.label=Обновите сейчас… update.openUpdateUI.upgradeButton.accesskey=U update.restart.upgradeButton.label=Обновите сейчас update.restart.upgradeButton.accesskey=U ================================================ FILE: locales/ru/bluegriffon/base/locale/branding/brand.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/base/locale/branding/brand.properties ================================================ brandShortName=BlueGriffon brandFullName=BlueGriffon vendorShortName=Disruptive Innovations sidebarName=Боковая панель ================================================ FILE: locales/ru/bluegriffon/extensions/fs/addFont.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/extensions/fs/fs.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/extensions/fs/fs.properties ================================================ SelectDir=Выбрать каталог для распаковки пакета шрифтов SelectFile=Выбрать существующий пакет шрифтов stylesheet.css Stylesheet=Пакета шрифта таблицы стилей FontSquirrel MustBeSavedTitle=Документ ещё не был сохранён MustBeSavedMessage=Вы должны сохранить файл хотя бы один раз, прежде чем пытаться связать локальный шрифт используя относительный URL. Пожалуйста, закройте документ и откройте его после сохранения. ================================================ FILE: locales/ru/bluegriffon/extensions/fs/fsOverlay.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/extensions/gfd/addFont.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/extensions/gfd/gfd.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/extensions/gfd/gfdOverlay.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/extensions/markdown/markdown.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/extensions/markdown/markdownOverlay.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/extensions/op1/a11yFirstStep.properties ================================================ ConformingDTDSyntax=Используйте соответствующие требованиям W3C синтаксис DTD перед элементом HTML NoWrongSyntaxOrNonConformingHierarchy=Не используйте неправильный синтаксис атрибута или несоответствующую иерархию элементов в элементе HTML OneTitleInHead=Используйте названия элемента в качестве заглавия дочернего элемента NoEmptyTitle=Когда вы предоставляете название элементу, не оставляйте его пустым NoMetaRefresh=Не используйте мета элемент с http-equiv атрибутом и значением равным обновленому HTMLElementHasLangAttribute=Используйте атрибут языка для элемента HTML HTMLElementHasValidLangAttribute=Используйте действительный код языка для атрибута Lang NoInvalidDir=Не используйте значение, отличное от ltr, rtl или пустой атрибут каталога TitleForFrames=Используйте атрибут заголовка для каждого элемента фрейма NoEmptyTitleForFrames=Когда предоставляете атрибут заголовка для элемента фрейма, не оставляйте его пустым TitleForIFrames=Используйте атрибут заголовка для каждого iframe элемента NoEmptyTitleForIFrames=Когда предоставляете атрибут заголовка для iframe элемента, не оставляйте его пустым AtLeastOneH1InBody=Должен быть по крайней мере один элемент h1 внутри элемента тела (на любом уровне) NoEmptyH1=Когда вы предоставляете элемент h1, не оставляйте его пустым NoEmptyH2=Когда вы предоставляете элемент h2, не оставляйте его пустым NoEmptyH3=Когда вы предоставляете элемент h3, не оставляйте его пустым NoEmptyH4=Когда вы предоставляете элемент h4, не оставляйте его пустым NoEmptyH5=Когда вы предоставляете элемент h5, не оставляйте его пустым NoEmptyH6=Когда вы предоставляете элемент h6, не оставляйте его пустым H2Order=Используйте элементы   h1, h2, h3, h4, h5 или h6 как первый заголовок перед элементом h2 в исходном порядке H3Order=Используйте элементы h2, h3, h4, h5 или h6 как первый заголовок перед элементом h3 в исходном порядке H4Order=Используйте элементы h3, h4, h5 или h6 как первый заголовок перед элементом h4 в исходном порядке H5Order=Используйте элементы h4, h5 или h6 как первый заголовок перед элементом h5 в исходном порядке H6Order=Используйте элемент h5 или h6 как первый заголовок перед элементом h6 в исходном порядке DTAsFirstChildOfDL=Используйте dt элемент в качестве первого дочернего от dl элемента NoEmptyLI=Когда вы предоставляете элемент li, не оставляйте его пустым NoAlignAttribute=Не используйте атрибут выравнивания NoXmpElement=Не используйте xmp элемент NoEmptyP=Когда предоставляете p элемент, не оставляйте его пустым NoEmptyAExceptAnchors=Когда вы предоставляете элемент, не оставляйте его пустым кроме случаев, если он используется в качестве якоря NoEmptyButton=Когда вы предоставляете элемент кнопки, не оставляйте его пустым NoVlinkAttribute=Не используйте атрибут vlink NoTextAttribute=Не используйте атрибут text NoLinkAttribute=Не используйте атрибут link noImgWithoutAlt=Используйте атрибут alt для каждого элемента img noAreaWithoutAlt=Используйте атрибут alt для каждого элемента area noAppletWithoutAlt=Используйте атрибут alt для каждого элемента applet noImageInputWithoutAlt=Используйте атрибут alt для каждого ввода элемента type=image noEmptyAltForImageLoneChildOfAnchorOrButton=Если img элемент - единственный дочерний элемент кнопки или элемент, не оставляйте его alt атрибут пустым noEmptyAltForInputImage=Когда вы предоставляете alt атрибут для ввода элемента type=image, не оставляйте его пустым noEmptyAltForAreaWithHref=Когда вы предоставляете alt атрибут для элемента area содержашего атрибут href, не оставляйте его пустым noAltSimilarToTextContent=Если img элемент - дочерний элемент от элемента с текстом, не используйте тот же текст для его атрибута alt как текст внутри элемента noBorderAttribute=Не используйте атрибут border noSimilarAltForAreasWithDifferentHref=Не используйте одинаковые значения alt атрибутов для нескольких элементов area с различными значениями href LongdescIsURI=Используйте URI в качестве значения для атрибута longdesc noBackgroundAttribute=Не используйте атрибут background noBgsoundElement=Не используйте элемент bgsound TablesWithAtLeastOneTHHaveACaption=Используйте элемент заголовка в качестве первого дочернего элемента от элемента таблици, содержащей по крайней мере один th элемент CaptionIsDifferentFromSummaryAttribute=Не используйте тот же контент для элемента заголовка и сводного атрибута summary noEmptyCaption=Когда предоставляете элемент заголовка, не оставляйте его пустым noCaptionInATableWithOnlyTDs=Не используйте элемент заголовка в элементе таблицы, содержащей только td элементы noAlinkAttribute=Не используйте атрибут alink noSummaryAttributeSimilarToCaption=Не используйте тот же контент для атрибута summary и элемента заголовка noEmptySummaryIfTableHasTHOrCaption=Когда предоставляете атрибут summary для элемента таблицы, содержащей th или caption элемент, не оставляйте его пустым noSummaryAttributeIfOnlyTDs=Не используйте атрибут summary в элементе таблицы с указанием только элеменов td noStrikeElement=Не используйте элемент strike noListingElement=Не используйте элемент listing AtLeastOneTHIfCaptionOrSummary=Используйте по крайней мере один элемент th внутри элемента таблицы с элементом caption или непустой атрибут summary AllNonEmptyTHHaveScopeOrId=Используйте scope or id атрибут для каждого непустого th элемента ScopeAttributeIsRowOrCol=Не используйте значение кроме row or col для атрибута scope noBgcolorAttribute=Не используйте атрибут bgcolor noTTElement=Не используйте элемент tt TDHaveHeadersAttributeIfTHHasId=Используйте атрибут headers на каждом элементе td если у соответствующего элемента есть атрибут id noPlaintextElement=Не используйте элемент plaintext noHeadersAttributeThatIsNotATHId=Не используйте для атрибута headers значение, которое соответствует атрибуту id используемому для td элемента таблицы AllFormsHaveAButton=Используйте button или ввод типа submit, image или button внутри элемента формы SubmitButtonsHaveNonEmptyValue=Когда вы предоставляете на входе type=submit, не оставляйте значение его атрибута пустым noMarqueeElement=Не используйте элемент marquee FieldsetHasALegend=Используйте элемент legend в качестве дочернего элемента каждого элемента fieldset FieldsetsAreInForms=Не используйте fieldset элемента без элементов формы noEmptyLegendElement=Когда вы предоставляете элемент legend, не оставляйте его пустым LabelElementHasForAttribute=Используйте для атрибутов для каждого элемента label noEmptyForAttributeOnLabel=Когда вы предоставляете атрибут для элемента label, не оставляйте его пустым ForAttributeMatchesAnIdInSameForm=Для атрибута должно быть значение, которое соответствует id атрибуту в элементе формы OptgroupElementHasALabel=Используйте атрибут label для каждого элемента optgroup NoSimilarLabelInOptgroupsOfSameSelect=Не используйте тот же элемент label атрибутов для различных optgroup элементов одного и того же выбранного элемента noEmptyLabelAttributeOnOptgroup=Когда вы предоставляете атрибут label для элемента optgroup, не оставляйте его пустым noBasefontElement=Не используйте элемент basefont noBlinkElement=Не используйте элемент blink noCenterElement=Не используйте элемент center noFontElement=Не используйте элемент font ================================================ FILE: locales/ru/bluegriffon/extensions/op1/op1.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/extensions/op1/op1Overlay.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/extensions/tipoftheday/tipoftheday.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/extensions/tipoftheday/tipoftheday.rdf ================================================ %brandDTD; ]> &brandShortName; - Astuce du jour http://bluegriffon.org/ &brandShortName; tip of the day Archive ru-RU …&brandShortName; является мультиплатформенным? …&brandShortName; существует для широкого спектра ОС включая Windows, Mac OS X, различные дистрибутивы Linux, OS/2 … …&brandShortName; показывет не сохранённые вкладки выделяя их текст красным цветом? Теперь Вы можете сохранять свои докуметны как из режима визуального отображения, так и из режима исходного кода. …Вы можете напрямую обратиться к сообществу пользователей &brandShortName; ? просто воспользуйтесь меню “Справка > Форумы”. …Вы можете легко вставить любой элемент HTML5? Выберите “Вставка > Элемент HTML5”. …ВЫ можете закрыть вкладку с помощью клавиатуры? Control+w (Command +w sous Mac OS X) закроет текущую вкладку. …Вы можете открыть новую вкладку с помощью клавиатуры? Control+n (Command+n sous Mac OS X) создаст новую пустую вкладку того же типа html, что и предыдущая созданная страница... …Вы можете публиковать вэб-стрницы напрямую из &brandShortName; Для этого установите бесплатное расширение FireFTP add-on и настройте его. Расширение будет доступно в меню Инструменты. …&brandShortName; может просто вставлять любой знак Юникода? Воспользуйтесь “Вставка > Специальные символы”. Можно выбрать знак Юникода по его имени или найти в полном перечне. …&brandShortName; проверяет Вашу орфографию автоматически? Щёлкните правой кнопкой мыши по слову, которое подчёркнуто красным цветом, и увидите подсказки, как исправить ошибку. Вы можете отключить автоматическую проверку орфографии в меню “Инструменты > Настройки > Общее” . …&brandShortName; позволяет Вам выделять элементы простым образом? Достаточно щёлкнуть на имени элемента в панели структуры. …ВЫ можете перемещать элементы при помощи мыши? Выделите элемент в панели структуры и перемещайте его в главном окне! …ВЫ можете просто управлять Вашими вэб-проектами? Платное расширение Project Manager позволяет управлять вэб-проектами и в один щелчок мыши работать со всеми документами на удалённом ресурсе. …Вы можете выбрать предпочитаемый Вами вэб-браузер? Воспользуйтесь “Инструменты > Настройки > Дополнительно > Отмена выбора вэб-брузера”. Bluegriffon предложит Вам выбрать предпочитаемый вэб-браузер при следующем просмотре вэб-документа. …&brandShortName; может работать с внешними таблицами стилей? Выберите “Панели > Таблица CSS” и создайте таблицу, готовую для использования. Щёлкните по знаку плюс и выберите “Ссылка на документ”. …&brandShortName; может работать со сложными CSS таблицами и селекторами? Используя платное расширение CSS Pro Editor, Вы сможете управлять сложными таблицами и селекторами CSS-2 и CSS-3 через развитый графический интерфейс. …ВЫ можете менять размер панелей? Для этого достаточно потянуть за правый нижний угол панели. …ВЫ можете добавлять любой атрибут любому элементу? Откройте “Панели > Обозреватель DOM”, выберите элемент и добавьте ему атрибуты, щёлкнув по кнопке плюс. …&brandShortName; умеет хорошо работать с CSS-3 ? Проприетарные префиксы будут автоматически добавалены для каждого браузера, которому они требуются. …Вы можете изменять сочетания клавиш? Откройте Настройки и зайдите в раздел Сочетания клавиш. Найдите кнопку или сочетание, которое хотите изменить и щёлкните по ним. …можно просто отменить класс, который назначен элементу? Поместите курсор на элемент и воспользуйтесь выпадающим меню классов. Выберите класс, который нужно отменить. ================================================ FILE: locales/ru/bluegriffon/extensions/tipoftheday/tipofthedayOverlay.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/sidebars/aria/aria.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/sidebars/aria/aria.properties ================================================ mustBeContainedIn=должно содержаться в or= или ok=OK mustContain=должно содержать and= и deprecated=устаревший missingTextbox=отсутствует textbox missingListboxTreeGridDialog=отсутствует listbox, tree, grid или dialog ================================================ FILE: locales/ru/bluegriffon/sidebars/aria/ariaOverlay.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/sidebars/cssproperties/backgrounditem.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/sidebars/cssproperties/backgrounditem.properties ================================================ backgroundColorTitle=Цвет backgroundImageTitle=Изображение backgroundLinearGradientTitle=Линейный градиент backgroundRadialGradientTitle=Радиальный градиент ================================================ FILE: locales/ru/bluegriffon/sidebars/cssproperties/colorstopitem.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/sidebars/cssproperties/cssproperties.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/sidebars/cssproperties/cssproperties.properties ================================================ EnterAnId=Пожалуйста, введите идентификатор EnterUniqueId=Вы должны дать идентификатор элемента: NoClasSelected=Вы должны выбрать имя класса PleaseSelectAClass=Класс должен быть выбран, чтобы применить запрошенные изменения ================================================ FILE: locales/ru/bluegriffon/sidebars/cssproperties/csspropertiesOverlay.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/sidebars/cssproperties/editGridTemplate.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/sidebars/cssproperties/fontFeatures.properties ================================================ FFaalt=Доступ ко всем альтернативам FFcalt=Контекстные альтернативы FFsalt=Стилистические альтернативы FFliga=Стандартные лигатуры FFclig=Контекстные лигатуры FFdlig=Дискреционные лигатуры FFhist=Исторические формы FFhlig=Исторические лигатуры FFunic=Универсальный случай FFsmcp=Маленькие прописные FFc2sc=Маленькие прописные из прописных FFc2pc=Изящные прописные из прописных FFpcap=Изящные прописные FFcase=Чувствительные к регистру формы FFcpsp=Интервал между прописными FFtitl=Озаглавливание FFswsh=Swash FFcswh=Контекстный Swash FFfrac=Дроби FFafrc=Альтернативные дроби FFordn=Порядковые числительные FFnumr=Числители FFdnom=Знаменатели FFsinf=Научные нижние FFsups=Суперскрипт FFsubs=Подскрипт FFonum=Старинные цифры FFlnum=Линейные цифры FFpnum=Пропорциональные цифры FFtnum=Табличные цифры FFzero=Перечёркнутый ноль FFmgrk=Математический греческий FFnalt=Альтернативные формы аннотаций FFornm=Орнаменты FFlocl=Локализованные формы FFsize=Оптический размер FFisol=Изолированные формы FFinit=Начальные формы FFmedi=Срединные формы FFfinal=Конечные формы FFrlig=Лигатуры Requird FFccmp=Композиция/декомпозиция глифа FFmark=Отметить базовое позиционирование FFmkmj=Отметить отмеченное позиционирование FFhwid=Полуширина ================================================ FILE: locales/ru/bluegriffon/sidebars/cssproperties/griditemposition.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/sidebars/cssproperties/textshadowitem.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/sidebars/cssproperties/transformationitem.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/sidebars/cssproperties/transitionitem.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/sidebars/domexplorer/domexplorer.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/sidebars/domexplorer/domexplorerOverlay.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/sidebars/its20/its20.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/sidebars/its20/its20.properties ================================================ LoadError=Ошибка загрузки InlineParseError=Встроенный ресурс не является документом ITS 2.0 CannotFetch=Невозможно получить URL NotITS=Ресурс не является документом ITS 2.0 TranslatableByGlobalRule=Переводимый по глобальному правилу NotTranslatableByGlobalRule=Непереводимый по глобальному правилу InlineRules=<встроенный> translateRule=Перевод locNoteRule=Примечание по локализации termRule=Терминология dirRule=Направленность langRule=Информация о языках withinTextRule=Элементы в тексте domainRule=Домен textAnalysisRule=Анализ текста localeFilterRule=Фильтр локали provRule=Происхождение externalResourceRefRule=Внешний ресурс targetPointerRule=Целевой указатель idValueRule=Значение идентификатора preserveSpaceRule=Сохранять пробел locQualityIssueRule=Проблема качества локализации mtConfidenceRule=Уверенность машинного перевода allowedCharactersRule=Допустимые символы storageSizeRule=Размер хранилища DontWarnAgainForUrl=Не предупреждать меня снова об этом URL DontWarnAgainForInline=Не предупреждать меня снова о встроенных глобальных правилах NewITSFile=Новый файл ITS 2.0 CannotResolveXPath=Не удаётся разрешить следующий селектор XPath (необъявленное пространство имен HTML?): XPathParsingError=Ошибка синтаксического анализа XPath DontWarnAgainForSelector=Не предупреждать меня снова об этом селекторе CSSParsingError=Ошибка синтаксического анализа CSS CannotResolveCSS=Не удаётся разрешить следующий селектор CSS: ================================================ FILE: locales/ru/bluegriffon/sidebars/its20/its20Overlay.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/sidebars/its20/locNoteRule.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/sidebars/its20/selector.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/sidebars/its20/termRule.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/sidebars/its20/translateRule.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/sidebars/scripteditor/editor.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/sidebars/scripteditor/scripteditor.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/sidebars/scripteditor/scripteditor.properties ================================================ ConfirmDeletionTitle=Удалить сценарий ConfirmDeletion=Вы уверены, что хотите удалить этот сценарий? AddExternalScriptTitle=Добавить внешний сценарий PromptScriptURL=URL сценария? ================================================ FILE: locales/ru/bluegriffon/sidebars/scripteditor/scripteditorOverlay.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/sidebars/stylesheets/editor.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/sidebars/stylesheets/stylesheets.dtd ================================================ ================================================ FILE: locales/ru/bluegriffon/sidebars/stylesheets/stylesheetsOverlay.dtd ================================================ ================================================ FILE: locales/ru/cssproperties.mn ================================================ bluegriffon-ru.jar: % locale cssproperties ru %locale/ru/cssproperties/ locale/ru/cssproperties/csspropertiesOverlay.dtd (locale/ru/csspropertiesOverlay.dtd) locale/ru/cssproperties/cssproperties.dtd (locale/ru/cssproperties.dtd) locale/ru/cssproperties/editGridTemplate.dtd (locale/ru/editGridTemplate.dtd) locale/ru/cssproperties/backgrounditem.dtd (locale/ru/backgrounditem.dtd) locale/ru/cssproperties/griditemposition.dtd (locale/ru/griditemposition.dtd) locale/ru/cssproperties/transformationitem.dtd (locale/ru/transformationitem.dtd) locale/ru/cssproperties/transitionitem.dtd (locale/ru/transitionitem.dtd) locale/ru/cssproperties/textshadowitem.dtd (locale/ru/textshadowitem.dtd) locale/ru/cssproperties/colorstopitem.dtd (locale/ru/colorstopitem.dtd) locale/ru/cssproperties/backgrounditem.properties (locale/ru/backgrounditem.properties) locale/ru/cssproperties/cssproperties.properties (locale/ru/cssproperties.properties) locale/ru/cssproperties/fontFeatures.properties (locale/ru/fontFeatures.properties) ================================================ FILE: locales/ru/domexplorer.mn ================================================ bluegriffon-ru.jar: % locale domexplorer ru %locale/ru/domexplorer/ locale/ru/domexplorer/domexplorerOverlay.dtd (locale/ru/domexplorerOverlay.dtd) locale/ru/domexplorer/domexplorer.dtd (locale/ru/domexplorer.dtd) ================================================ FILE: locales/ru/fs.mn ================================================ fs-ru.jar: % locale fs ru %locale/ru/fs/ locale/ru/fs/fsOverlay.dtd (locale/ru/fsOverlay.dtd) locale/ru/fs/fs.dtd (locale/ru/fs.dtd) locale/ru/fs/fs.properties (locale/ru/fs.properties) locale/ru/fs/addFont.dtd (locale/ru/addFont.dtd) ================================================ FILE: locales/ru/gfd.mn ================================================ gfd-ru.jar: % locale gfd ru %locale/ru/gfd/ locale/ru/gfd/gfdOverlay.dtd (locale/ru/gfdOverlay.dtd) locale/ru/gfd/gfd.dtd (locale/ru/gfd.dtd) locale/ru/gfd/addFont.dtd (locale/ru/addFont.dtd) ================================================ FILE: locales/ru/its20.mn ================================================ bluegriffon-ru.jar: % locale its20 ru %locale/ru/its20/ locale/ru/its20/its20Overlay.dtd (locale/ru/its20Overlay.dtd) locale/ru/its20/its20.properties (locale/ru/its20.properties) locale/ru/its20/its20.dtd (locale/ru/its20.dtd) locale/ru/its20/translateRule.dtd (locale/ru/translateRule.dtd) locale/ru/its20/locNoteRule.dtd (locale/ru/locNoteRule.dtd) locale/ru/its20/termRule.dtd (locale/ru/termRule.dtd) locale/ru/its20/selector.dtd (locale/ru/selector.dtd) ================================================ FILE: locales/ru/markdown.mn ================================================ markdown-ru.jar: % locale markdown ru %locale/ru/markdown/ locale/ru/markdown/markdownOverlay.dtd (locale/ru/markdownOverlay.dtd) locale/ru/markdown/markdown.dtd (locale/ru/markdown.dtd) ================================================ FILE: locales/ru/op1.mn ================================================ op1-ru.jar: % locale op1 ru %locale/ru/op1/ locale/ru/op1/op1Overlay.dtd (locale/ru/op1Overlay.dtd) locale/ru/op1/op1.dtd (locale/ru/op1.dtd) locale/ru/op1/a11yFirstStep.properties (locale/ru/a11yFirstStep.properties) ================================================ FILE: locales/ru/scripteditor.mn ================================================ bluegriffon-ru.jar: % locale scripteditor ru %locale/ru/scripteditor/ locale/ru/scripteditor/scripteditorOverlay.dtd (locale/ru/scripteditorOverlay.dtd) locale/ru/scripteditor/scripteditor.dtd (locale/ru/scripteditor.dtd) locale/ru/scripteditor/scripteditor.properties (locale/ru/scripteditor.properties) locale/ru/scripteditor/editor.dtd (locale/ru/editor.dtd) ================================================ FILE: locales/ru/stylesheets.mn ================================================ bluegriffon-ru.jar: % locale stylesheets ru %locale/ru/stylesheets/ locale/ru/stylesheets/stylesheetsOverlay.dtd (locale/ru/stylesheetsOverlay.dtd) locale/ru/stylesheets/stylesheets.dtd (locale/ru/stylesheets.dtd) locale/ru/stylesheets/editor.dtd (locale/ru/editor.dtd) ================================================ FILE: locales/ru/tipoftheday.mn ================================================ tipoftheday-ru.jar: % locale tipoftheday ru %locale/ru/tipoftheday/ locale/ru/tipoftheday/tipoftheday.dtd (locale/ru/tipoftheday.dtd) locale/ru/tipoftheday/tipofthedayOverlay.dtd (locale/ru/tipofthedayOverlay.dtd) locale/ru/tipoftheday/tipoftheday.rdf (locale/ru/tipoftheday.rdf) ================================================ FILE: locales/sl/aria.mn ================================================ bluegriffon-sl.jar: % locale aria sl %locale/sl/aria/ locale/sl/aria/ariaOverlay.dtd (locale/sl/ariaOverlay.dtd) locale/sl/aria/aria.dtd (locale/sl/aria.dtd) locale/sl/aria/aria.properties (locale/sl/aria.properties) ================================================ FILE: locales/sl/base.mn ================================================ bluegriffon-sl.jar: % locale bluegriffon sl %locale/sl/bluegriffon/ % locale branding sl %locale/sl/branding/ locale/sl/bluegriffon/aboutDialog.dtd (locale/sl/bluegriffon/aboutDialog.dtd) locale/sl/bluegriffon/bluegriffon.dtd (locale/sl/bluegriffon/bluegriffon.dtd) locale/sl/bluegriffon/polyglot.dtd (locale/sl/bluegriffon/polyglot.dtd) locale/sl/bluegriffon/findbar.dtd (locale/sl/bluegriffon/findbar.dtd) locale/sl/bluegriffon/bluegriffon.properties (locale/sl/bluegriffon/bluegriffon.properties) locale/sl/bluegriffon/colourPicker.dtd (locale/sl/bluegriffon/colourPicker.dtd) locale/sl/bluegriffon/credits.dtd (locale/sl/bluegriffon/credits.dtd) locale/sl/bluegriffon/filepickerbutton.dtd (locale/sl/bluegriffon/filepickerbutton.dtd) locale/sl/bluegriffon/filePicking.dtd (locale/sl/bluegriffon/filePicking.dtd) locale/sl/bluegriffon/insertTable.dtd (locale/sl/bluegriffon/insertTable.dtd) locale/sl/bluegriffon/insertTable.properties (locale/sl/bluegriffon/insertTable.properties) locale/sl/bluegriffon/language.properties (locale/sl/bluegriffon/language.properties) locale/sl/bluegriffon/languages.dtd (locale/sl/bluegriffon/languages.dtd) locale/sl/bluegriffon/markupCleaner.dtd (locale/sl/bluegriffon/markupCleaner.dtd) locale/sl/bluegriffon/openLocation.dtd (locale/sl/bluegriffon/openLocation.dtd) locale/sl/bluegriffon/openLocation.properties (locale/sl/bluegriffon/openLocation.properties) locale/sl/bluegriffon/newPageWizard.dtd (locale/sl/bluegriffon/newPageWizard.dtd) locale/sl/bluegriffon/newPageWizard.properties (locale/sl/bluegriffon/newPageWizard.properties) locale/sl/bluegriffon/propertiesDeck.dtd (locale/sl/bluegriffon/propertiesDeck.dtd) locale/sl/bluegriffon/aria.dtd (locale/sl/bluegriffon/aria.dtd) locale/sl/bluegriffon/structurebar.dtd (locale/sl/bluegriffon/structurebar.dtd) locale/sl/bluegriffon/tabeditor.dtd (locale/sl/bluegriffon/tabeditor.dtd) locale/sl/bluegriffon/masterPasswordQuery.properties (locale/sl/bluegriffon/masterPasswordQuery.properties) locale/sl/bluegriffon/newDocument.dtd (locale/sl/bluegriffon/newDocument.dtd) locale/sl/bluegriffon/prefs/file.dtd (locale/sl/bluegriffon/prefs/file.dtd) locale/sl/bluegriffon/prefs/source.dtd (locale/sl/bluegriffon/prefs/source.dtd) locale/sl/bluegriffon/prefs/general.dtd (locale/sl/bluegriffon/prefs/general.dtd) locale/sl/bluegriffon/prefs/newPage.dtd (locale/sl/bluegriffon/prefs/newPage.dtd) locale/sl/bluegriffon/prefs/update.dtd (locale/sl/bluegriffon/prefs/update.dtd) locale/sl/bluegriffon/prefs/styles.dtd (locale/sl/bluegriffon/prefs/styles.dtd) locale/sl/bluegriffon/prefs/advanced.dtd (locale/sl/bluegriffon/prefs/advanced.dtd) locale/sl/bluegriffon/prefs/connection.dtd (locale/sl/bluegriffon/prefs/connection.dtd) locale/sl/bluegriffon/prefs/osx.dtd (locale/sl/bluegriffon/prefs/osx.dtd) locale/sl/bluegriffon/prefs/shortcuts.dtd (locale/sl/bluegriffon/prefs/shortcuts.dtd) locale/sl/bluegriffon/prefs/update.properties (locale/sl/bluegriffon/prefs/update.properties) locale/sl/bluegriffon/prefs/license.dtd (locale/sl/bluegriffon/prefs/license.dtd) locale/sl/bluegriffon/prefs/license.properties (locale/sl/bluegriffon/prefs/license.properties) locale/sl/bluegriffon/prefs/deactivateLicense.dtd (locale/sl/bluegriffon/prefs/deactivateLicense.dtd) locale/sl/bluegriffon/prefs.dtd (locale/sl/bluegriffon/prefs.dtd) locale/sl/bluegriffon/updateAvailable.dtd (locale/sl/bluegriffon/updateAvailable.dtd) locale/sl/bluegriffon/updates.properties (locale/sl/bluegriffon/updates.properties) locale/sl/branding/brand.dtd (locale/sl/branding/brand.dtd) locale/sl/branding/brand.properties (locale/sl/branding/brand.properties) locale/sl/bluegriffon/insertImage.dtd (locale/sl/bluegriffon/insertImage.dtd) locale/sl/bluegriffon/insertAnchor.dtd (locale/sl/bluegriffon/insertAnchor.dtd) locale/sl/bluegriffon/insertCommentOrPI.dtd (locale/sl/bluegriffon/insertCommentOrPI.dtd) locale/sl/bluegriffon/insertLink.dtd (locale/sl/bluegriffon/insertLink.dtd) locale/sl/bluegriffon/insertLink.properties (locale/sl/bluegriffon/insertLink.properties) locale/sl/bluegriffon/cssClassPicker.dtd (locale/sl/bluegriffon/cssClassPicker.dtd) locale/sl/bluegriffon/insertVideo.dtd (locale/sl/bluegriffon/insertVideo.dtd) locale/sl/bluegriffon/insertAudio.dtd (locale/sl/bluegriffon/insertAudio.dtd) locale/sl/bluegriffon/insertVideo.properties (locale/sl/bluegriffon/insertVideo.properties) locale/sl/bluegriffon/insertHTML.dtd (locale/sl/bluegriffon/insertHTML.dtd) locale/sl/bluegriffon/insertHR.dtd (locale/sl/bluegriffon/insertHR.dtd) locale/sl/bluegriffon/insertForm.dtd (locale/sl/bluegriffon/insertForm.dtd) locale/sl/bluegriffon/parsingError.dtd (locale/sl/bluegriffon/parsingError.dtd) locale/sl/bluegriffon/insertFormInput.dtd (locale/sl/bluegriffon/insertFormInput.dtd) locale/sl/bluegriffon/insertFieldset.dtd (locale/sl/bluegriffon/insertFieldset.dtd) locale/sl/bluegriffon/insertLabel.dtd (locale/sl/bluegriffon/insertLabel.dtd) locale/sl/bluegriffon/insertButton.dtd (locale/sl/bluegriffon/insertButton.dtd) locale/sl/bluegriffon/insertSelect.dtd (locale/sl/bluegriffon/insertSelect.dtd) locale/sl/bluegriffon/insertTextarea.dtd (locale/sl/bluegriffon/insertTextarea.dtd) locale/sl/bluegriffon/insertKeygen.dtd (locale/sl/bluegriffon/insertKeygen.dtd) locale/sl/bluegriffon/insertOutput.dtd (locale/sl/bluegriffon/insertOutput.dtd) locale/sl/bluegriffon/insertProgress.dtd (locale/sl/bluegriffon/insertProgress.dtd) locale/sl/bluegriffon/insertMeter.dtd (locale/sl/bluegriffon/insertMeter.dtd) locale/sl/bluegriffon/insertStylesheet.dtd (locale/sl/bluegriffon/insertStylesheet.dtd) locale/sl/bluegriffon/editStylesheet.dtd (locale/sl/bluegriffon/editStylesheet.dtd) locale/sl/bluegriffon/media.dtd (locale/sl/bluegriffon/media.dtd) locale/sl/bluegriffon/media.properties (locale/sl/bluegriffon/media.properties) locale/sl/bluegriffon/insertChars.dtd (locale/sl/bluegriffon/insertChars.dtd) locale/sl/bluegriffon/convertToTable.dtd (locale/sl/bluegriffon/convertToTable.dtd) locale/sl/bluegriffon/pageProperties.dtd (locale/sl/bluegriffon/pageProperties.dtd) locale/sl/bluegriffon/spellCheck.dtd (locale/sl/bluegriffon/spellCheck.dtd) locale/sl/bluegriffon/spellCheck.properties (locale/sl/bluegriffon/spellCheck.properties) locale/sl/bluegriffon/dictionary.dtd (locale/sl/bluegriffon/dictionary.dtd) locale/sl/bluegriffon/html5.properties (locale/sl/bluegriffon/html5.properties) locale/sl/bluegriffon/listProperties.dtd (locale/sl/bluegriffon/listProperties.dtd) locale/sl/bluegriffon/insertTOC.dtd (locale/sl/bluegriffon/insertTOC.dtd) locale/sl/bluegriffon/svg-edit.properties (locale/sl/bluegriffon/svg-edit.properties) locale/sl/bluegriffon/panels.dtd (locale/sl/bluegriffon/panels.dtd) locale/sl/bluegriffon/rotator.dtd (locale/sl/bluegriffon/rotator.dtd) ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/aboutDialog.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/aria.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/bluegriffon.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/bluegriffon.properties ================================================ titleModifier=BlueGriffon # in the following string, %t represents the title of the page or its URL # and %b the titleModifier above titleFormat=%S - %S Unknown=[˙neznano] NoClassAvailable=(brez razreda) NoIdAvailable=(brez ID) DocumentTitle=Naslov strani NeedDocTitle=Vnesite naslov te strani. DocTitleHelp=To identificira stran v imenu okna in v zaznamkih. ExportToText=Izvozi v besedilo SaveDocumentAs=Shrani stran kot XHTMLfiles=Datoteke XHTML untitled=brez naslova SaveDocument=Shrani stran SaveFileFailed=Datoteke ni uspelo shraniti! ExportToText=Izvozi v besedilo FileNotSaved=Datoteka ni shranjena! SaveFileBeforeClosing=Ali želite, preden zaprete ta zavihek, datoteko shraniti? YesSaveFile=Da, shrani jo NoDiscardChanges=Ne, zavrzi spremembe DontCloseTab=Ne zapri zavihka! IdAlreadyTaken=Ta ID se v dokumentu že uporablja RemoveIdFromElement=Ali želite odstraniti ID iz elementa, ki ga nosi že, ali pa dejanje preklicati ? YesRemoveId=Odstrani ID NoCancel=Prekliči ReplaceAll=Zamenjaj vse ... ReplacedPart1=Zamenjano ReplacedPart2=dogodki AFileWasChanged=A file was changed on disk ReloadFile=File %S changed on disk, BlueGriffon must reload it DontAskForFileChangesAgain=don't show this alert again AbandonChanges=Opusti neshranjene spremembe v "%title%" in ponovno naloži stran? RevertCaption=Povrni na zadnje shranjeno stanje HTMLCommentsInXHTMLTitle=HTML comment inside a

      Normal text will look like this !

      Visited will look like this !

      Active Links will look like this !

      ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/panels.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/parsingError.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/polyglot.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/prefs/advanced.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/prefs/connection.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/prefs/deactivateLicense.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/prefs/file.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/prefs/general.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/prefs/license.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/prefs/license.properties ================================================ activateWarning=BlueGriffon needs to restart to activate your license. Do you want to restart now? confirmRestart=Restart BlueGriffon? fullResetTitle=License activation reset fullResetErrorLabel=Impossible to perform the operation, a network error occurred. fullResetRequested=A reset link was sent to the owner of the license/transaction. BlueGriffon must now restart. fullResetInvalid=The transaction ID is invalid. ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/prefs/newPage.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/prefs/osx.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.properties ================================================ NoMainWindowAvaialble=Bližnjic za tipkovnico ni mogoče urejati PleaseOpenOneMainWindow=Odprto mora biti vsaj eno od oken v BlueGriffonu ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/prefs/source.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/prefs/styles.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/prefs/update.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/prefs/update.properties ================================================ SoftwareUpdates=Posodobitve programa UnableToCheck=Ni mogoče preveriti razpoložljivosti UpToDate=BlueGriffon je sodoben ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/prefs.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/propertiesDeck.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/rotator.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/spellCheck.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/spellCheck.properties ================================================ CorrectSpelling=(pravilno črkovano) NoSuggestedWords=(ni predlaganih besed) NoMisspelledWord=Vse besede so brez napak. CheckSpellingDone=Črkovanje je zaključeno. CheckSpelling=Preveri črkovanje ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/structurebar.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/svg-edit.properties ================================================ SvgEdit=SVG Edit ConfirmClose=Obstajajo neshranjene spremembe, ali res želite zapreti SVG Edit? ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/tabeditor.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/updateAvailable.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/base/locale/bluegriffon/updates.properties ================================================ update.checkInsideButton.label=Poišči posodobitve update.checkInsideButton.accesskey=P update.resumeButton.label=Nadaljuj prenos %S … update.resumeButton.accesskey=d update.openUpdateUI.applyButton.label=Namesti posodobitev … update.openUpdateUI.applyButton.accesskey=N update.restart.applyButton.label=Namesti posodobitev update.restart.applyButton.accesskey=N update.openUpdateUI.upgradeButton.label=Nadgradi zdaj … update.openUpdateUI.upgradeButton.accesskey=N update.restart.upgradeButton.label=Nadgradi zdaj update.restart.upgradeButton.accesskey=N ================================================ FILE: locales/sl/bluegriffon/base/locale/branding/brand.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/base/locale/branding/brand.properties ================================================ brandShortName=BlueGriffon brandFullName=BlueGriffon vendorShortName=Disruptive Innovations sidebarName=Stranska vrstica ================================================ FILE: locales/sl/bluegriffon/extensions/fs/addFont.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/extensions/fs/fs.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/extensions/fs/fs.properties ================================================ SelectDir=Izberite imenik, kamor naj se razzipa paket pisav SelectFile=Izberite stylesheet.css za obstoječi paket pisave Stylesheet=Paket s slogi FontSquirrel MustBeSavedTitle=Dokumenta se še ni shranilo MustBeSavedMessage=Datoteko morate shraniti vsaj enkrat, preden poskušate povezati lokalno pisavo s pomočjo relativnega naslova URL. Zaprite prosim dokument in ga ponovno odprite, potem ko ste ga shranili. ================================================ FILE: locales/sl/bluegriffon/extensions/fs/fsOverlay.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/extensions/gfd/addFont.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/extensions/gfd/gfd.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/extensions/gfd/gfdOverlay.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/extensions/markdown/markdown.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/extensions/markdown/markdownOverlay.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/extensions/op1/a11yFirstStep.properties ================================================ ConformingDTDSyntax=Use a W3C-conforming DTD syntax before the html element NoWrongSyntaxOrNonConformingHierarchy=Don't use wrong attribute syntax or non-conforming element hierarchy inside the html element OneTitleInHead=Use a title element as a child of the head element NoEmptyTitle=When you provide a title element, do not leave it empty NoMetaRefresh=Don't use a meta element with an http-equiv attribute and a value equal to refresh HTMLElementHasLangAttribute=Use the lang attribute for the html element HTMLElementHasValidLangAttribute=Use a valid language code for the lang attribute NoInvalidDir=Don't use a value other than ltr, rtl or empty for the dir attribute TitleForFrames=Use the title attribute for every frame element NoEmptyTitleForFrames=When you provide a title attribute for a frame element, do not leave it empty TitleForIFrames=Use the title attribute for every iframe element NoEmptyTitleForIFrames=When you provide a title attribute for an iframe element, do not leave it empty AtLeastOneH1InBody=There must be at least one h1 element inside (at any level) the body element NoEmptyH1=When you provide a h1 element, do not leave it empty NoEmptyH2=When you provide a h2 element, do not leave it empty NoEmptyH3=When you provide a h3 element, do not leave it empty NoEmptyH4=When you provide a h4 element, do not leave it empty NoEmptyH5=When you provide a h5 element, do not leave it empty NoEmptyH6=When you provide a h6 element, do not leave it empty H2Order=Use  a h1, h2, h3, h4, h5 or h6 element as a first heading before a h2 element in the source order H3Order=Use a h2, h3, h4, h5 or h6 element as a first heading before a h3 element in the source order H4Order=Use a h3, h4, h5 or h6 element as a first heading before a h4 element in the source order H5Order=Use a h4, h5 or h6 element as a first heading before a h5 element in the source order H6Order=Use a h5 or h6 element as a first heading before a h6 element in the source order DTAsFirstChildOfDL=Use a dt element as the first child of a dl element NoEmptyLI=When you provide a li element, do not leave it empty NoAlignAttribute=Don't use the align attribute NoXmpElement=Don't use the xmp element NoEmptyP=When you provide a p element, do not leave it empty NoEmptyAExceptAnchors=When you provide an a element, do not leave it empty except if it is used as an anchor NoEmptyButton=When you provide a button element, do not leave it empty NoVlinkAttribute=Don't use the vlink attribute NoTextAttribute=Don't use the text attribute NoLinkAttribute=Don't use the link attribute noImgWithoutAlt=Use the alt attribute for every img element noAreaWithoutAlt=Use the alt attribute for every area element noAppletWithoutAlt=Use the alt attribute for every applet element noImageInputWithoutAlt=Use the alt attribute for every input type=image element noEmptyAltForImageLoneChildOfAnchorOrButton=If the img element is the only child of a button or an a element, do not leave its alt attribute empty noEmptyAltForInputImage=When you provide an alt attribute for an input type=image element, do not leave it empty noEmptyAltForAreaWithHref=When you provide an alt attribute for an area element holding an href attribute, do not leave it empty noAltSimilarToTextContent=If an img element is a child of an a element with text, do not use the same text for its alt attribute as the text inside the a element noBorderAttribute=Don't use the border attribute noSimilarAltForAreasWithDifferentHref=Don't use the same value for alt attributes for multiple area elements with different href values LongdescIsURI=Use a URI as the value for a longdesc attribute noBackgroundAttribute=Don't use the background attribute noBgsoundElement=Don't use the bgsound element TablesWithAtLeastOneTHHaveACaption=Use a caption element as the first child of a table element containing at least one th element CaptionIsDifferentFromSummaryAttribute=Don't use the same content for a caption element and a summary attribute noEmptyCaption=When you provide a caption element, do not leave it empty noCaptionInATableWithOnlyTDs=Don't use a caption element in a table element containing only td elements noAlinkAttribute=Don't use an alink attribute noSummaryAttributeSimilarToCaption=Don't use the same content for a summary attribute and a caption element noEmptySummaryIfTableHasTHOrCaption=When you provide a summary attribute for a table element containing a th or a caption element, do not leave it empty noSummaryAttributeIfOnlyTDs=Don't use a summary attribute on a table element containg only td elements noStrikeElement=Don't use the strike element noListingElement=Don't use the listing element AtLeastOneTHIfCaptionOrSummary=Use at least one th element inside a table element with a caption element or a non-empty summary attribute AllNonEmptyTHHaveScopeOrId=Use a scope or id attribute for every non-empty th element ScopeAttributeIsRowOrCol=Don't use a value other than row or col for the scope attribute noBgcolorAttribute=Don't use the bgcolor attribute noTTElement=Don't use the tt element TDHaveHeadersAttributeIfTHHasId=Use a headers attribute on every td element if the corresponding th element has an id attribute noPlaintextElement=Don't use the plaintext element noHeadersAttributeThatIsNotATHId=Don't use for a headers attribute a value which matches an id attribute used for a td of the table element AllFormsHaveAButton=Use a button, or an input of type submit, image or button inside a form element SubmitButtonsHaveNonEmptyValue=When you provide an input type=submit, do not leave its value attribute empty noMarqueeElement=Don't use the marquee element FieldsetHasALegend=Use a legend element as a child of every fieldset element FieldsetsAreInForms=Don't use a fieldset element without a form element noEmptyLegendElement=When you provide a legend element, do not leave it empty LabelElementHasForAttribute=Use the for attribute for every label element noEmptyForAttributeOnLabel=When you provide a for attribute for a label element, do not leave it empty ForAttributeMatchesAnIdInSameForm=A for attribute must have a value that matches an id attribute inside the form element OptgroupElementHasALabel=Use the label attribute for every optgroup element NoSimilarLabelInOptgroupsOfSameSelect=Don't use the same label attribute for different optgroup elements of the same select element noEmptyLabelAttributeOnOptgroup=When you provide a label attribute for an optgroup element, do not leave it empty noBasefontElement=Don't use the basefont element noBlinkElement=Don't use the blink element noCenterElement=Don't use the center element noFontElement=Don't use the font element ================================================ FILE: locales/sl/bluegriffon/extensions/op1/op1.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/extensions/op1/op1Overlay.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/extensions/tipoftheday/tipoftheday.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/extensions/tipoftheday/tipoftheday.rdf ================================================ %brandDTD; ]> &brandShortName; tips http://bluegriffon.org/ &brandShortName; tip of the day Archive en-us …&brandShortName; is cross platform? …&brandShortName; exists on a wide variety of operating systems including Windows, Mac OS X, and many flavors of Linux, OS/2 … …&brandShortName; shows the title of any unsaved page with a red shadow? You can now save files from any viewing mode. …you have direct access to the &brandShortName; community? Just select “Help > User’s Community”. …you can insert HTML5 elements easily? Just select “Insert > HTML5 Element”. …you can close the current tab with one key? Control+w (Command +w on Mac OS X) will close the current tab. …you can create a new tab with a key combination? Control+n (Command +n on Mac OS X) will create a new blank tab using the same doctype as the last page created. …you can revert to a previously saved version of the currently edited document? Righ-click (context-click on Mac OS X) on the document's tab and select the Revert menu. …you can publish pages directly from &brandShortName; First install the free FireFTP add-on and set it up. It will then be available on the Tools menu. …&brandShortName; can insert any character easily? Use “Insert characters and symbols”. You can then search for any Unicode character by name or open a block for inspection. …&brandShortName; runs spellcheck by default? Right click a word to find suggestions. Switch checking on or off using “Tools > Preferences > General” . …&brandShortName; can reliably select an element? Simply click its name in the structure bar. …you can move an element in your document using the mouse? First select as in previous tip then just drag it to where needed. …you can quickly open existing pages? The paid for Project manager add-on permits instant access to pages and images which are organised as a project. …you can choose your default browser? Use “Tools > Preferences > Advanced > Reset external browser settings”. Next time you browse you can choose a browser. …&brandShortName; allows you to use external stylesheets? To create one ready for use click “Panels > Stylesheets”. Click the plus sign and select “Linked to the document”. …&brandShortName; can manage stylesheets and complex selectors? Using the CSS Pro Editor (a paid for add-on) you change the order of and add titles and rel attribute to stylesheets and develop complex CSS 2 and 3 selectors with advanced help. …panels can be resized? Drag the grab handle at the bottom right corner to the size needed. …attributes can be added to any element? Open “Panels > DOM Explorer”. In wysiwyg view click in the element, select use the Attributes tab and click the plus sign. …&brandShortName; can handle CSS3 properties? Vendor prefixes will be added for browsers that need them. …you can personalize keyboard shortcuts? Any menu item can be allocated to your preferred key. Open “Tools > Preferences > Keyboard Shortcuts”. Find and double-click the command wanted. In the new window key a shortcut. …you can remove a class from an element? Just select the element and in the Class drop down box re-apply the class. ================================================ FILE: locales/sl/bluegriffon/extensions/tipoftheday/tipofthedayOverlay.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/sidebars/aria/aria.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/sidebars/aria/aria.properties ================================================ mustBeContainedIn=must be contained in or= or ok=OK mustContain=must contain and= and deprecated=deprecated missingTextbox=missing textbox missingListboxTreeGridDialog=missing listbox, tree, grid or dialog ================================================ FILE: locales/sl/bluegriffon/sidebars/aria/ariaOverlay.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/sidebars/cssproperties/backgrounditem.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/sidebars/cssproperties/backgrounditem.properties ================================================ backgroundColorTitle=Barva backgroundImageTitle=Slika backgroundLinearGradientTitle=Linearni gradient backgroundRadialGradientTitle=Radialni gradient ================================================ FILE: locales/sl/bluegriffon/sidebars/cssproperties/colorstopitem.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/sidebars/cssproperties/cssproperties.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/sidebars/cssproperties/cssproperties.properties ================================================ EnterAnId=Prosim vnesite ID EnterUniqueId=Elementu morate dati enolični ID: NoClasSelected=Izbrati morate ime razreda PleaseSelectAClass=Treba je izbrati razred, da se zahtevane spremembe lahko izvede ================================================ FILE: locales/sl/bluegriffon/sidebars/cssproperties/csspropertiesOverlay.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/sidebars/cssproperties/editGridTemplate.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/sidebars/cssproperties/fontFeatures.properties ================================================ FFaalt=Access all alternates FFcalt=Contextual alternates FFsalt=Stylistic alternates FFliga=Standard ligatures FFclig=Contextual ligatures FFdlig=Discretionary ligatures FFhist=Historical forms FFhlig=Historical ligatures FFunic=Unicase FFsmcp=Small capitals FFc2sc=Small capitals from capitals FFc2pc=Petite capitals from capitals FFpcap=Petite capitals FFcase=Case sensitive forms FFcpsp=Capital spacing FFtitl=Titling FFswsh=Swash FFcswh=Contextual swash FFfrac=Fractions FFafrc=Alternative fractions FFordn=Ordinals FFnumr=Numerators FFdnom=Denominators FFsinf=Scientific inferiors FFsups=Superscript FFsubs=Subscript FFonum=Oldstyle figures FFlnum=Lining Figures FFpnum=Proportional figures FFtnum=Tabular figures FFzero=Slashed zero FFmgrk=Mathematical greek FFnalt=Alternate annotation forms FFornm=Ornaments FFlocl=Localized forms FFsize=Optical size FFisol=Isolated forms FFinit=Initial forms FFmedi=Medial forms FFfinal=Final forms FFrlig=Requird ligatures FFccmp=Glyph composition/decomposition FFmark=Mark to base positioning FFmkmj=Mark to mark positioning FFhwid=Half widths ================================================ FILE: locales/sl/bluegriffon/sidebars/cssproperties/griditemposition.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/sidebars/cssproperties/textshadowitem.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/sidebars/cssproperties/transformationitem.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/sidebars/cssproperties/transitionitem.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/sidebars/domexplorer/domexplorer.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/sidebars/domexplorer/domexplorerOverlay.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/sidebars/its20/its20.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/sidebars/its20/its20.properties ================================================ LoadError=Load Error InlineParseError=Inline resource is not an ITS 2.0 document CannotFetch=Cannot fetch URL NotITS=Resource is not an ITS 2.0 document TranslatableByGlobalRule=Translatable by global rule NotTranslatableByGlobalRule=Not translatable by global rule InlineRules=Inline rules translateRule=Translate locNoteRule=Localization Note termRule=Terminology dirRule=Directionality langRule=Language Information withinTextRule=Elements Within Text domainRule=Domain textAnalysisRule=Text Analysis localeFilterRule=Locale Filter provRule=Provenance externalResourceRefRule=External Resource targetPointerRule=Target Pointer idValueRule=Id Value preserveSpaceRule=Preserve Space locQualityIssueRule=Localization Quality Issue mtConfidenceRule=Machine-Translation Confidence allowedCharactersRule=Allowed Characters storageSizeRule=Storage Size DontWarnAgainForUrl=Don't warn me again about this URL DontWarnAgainForInline=Don't warn me again about inline global rules NewITSFile=New ITS 2.0 File CannotResolveXPath=Cannot resolve the following XPath selector (undeclared HTML namespace?): XPathParsingError=XPath Parsing Error DontWarnAgainForSelector=Don't warn me again about this selector CSSParsingError=CSS Parsing Error CannotResolveCSS=Cannot resolve the following CSS selector: ================================================ FILE: locales/sl/bluegriffon/sidebars/its20/its20Overlay.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/sidebars/its20/locNoteRule.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/sidebars/its20/selector.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/sidebars/its20/termRule.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/sidebars/its20/translateRule.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/sidebars/scripteditor/editor.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/sidebars/scripteditor/scripteditor.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/sidebars/scripteditor/scripteditor.properties ================================================ ConfirmDeletionTitle=Delete a script ConfirmDeletion=Are you sure you want to delete this script? AddExternalScriptTitle=Add an external script PromptScriptURL=URL of the script? ================================================ FILE: locales/sl/bluegriffon/sidebars/scripteditor/scripteditorOverlay.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/sidebars/stylesheets/editor.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/sidebars/stylesheets/stylesheets.dtd ================================================ ================================================ FILE: locales/sl/bluegriffon/sidebars/stylesheets/stylesheetsOverlay.dtd ================================================ ================================================ FILE: locales/sl/cssproperties.mn ================================================ bluegriffon-sl.jar: % locale cssproperties sl %locale/sl/cssproperties/ locale/sl/cssproperties/csspropertiesOverlay.dtd (locale/sl/csspropertiesOverlay.dtd) locale/sl/cssproperties/cssproperties.dtd (locale/sl/cssproperties.dtd) locale/sl/cssproperties/editGridTemplate.dtd (locale/sl/editGridTemplate.dtd) locale/sl/cssproperties/backgrounditem.dtd (locale/sl/backgrounditem.dtd) locale/sl/cssproperties/griditemposition.dtd (locale/sl/griditemposition.dtd) locale/sl/cssproperties/transformationitem.dtd (locale/sl/transformationitem.dtd) locale/sl/cssproperties/transitionitem.dtd (locale/sl/transitionitem.dtd) locale/sl/cssproperties/textshadowitem.dtd (locale/sl/textshadowitem.dtd) locale/sl/cssproperties/colorstopitem.dtd (locale/sl/colorstopitem.dtd) locale/sl/cssproperties/backgrounditem.properties (locale/sl/backgrounditem.properties) locale/sl/cssproperties/cssproperties.properties (locale/sl/cssproperties.properties) locale/sl/cssproperties/fontFeatures.properties (locale/sl/fontFeatures.properties) ================================================ FILE: locales/sl/domexplorer.mn ================================================ bluegriffon-sl.jar: % locale domexplorer sl %locale/sl/domexplorer/ locale/sl/domexplorer/domexplorerOverlay.dtd (locale/sl/domexplorerOverlay.dtd) locale/sl/domexplorer/domexplorer.dtd (locale/sl/domexplorer.dtd) ================================================ FILE: locales/sl/fs.mn ================================================ fs-sl.jar: % locale fs sl %locale/sl/fs/ locale/sl/fs/fsOverlay.dtd (locale/sl/fsOverlay.dtd) locale/sl/fs/fs.dtd (locale/sl/fs.dtd) locale/sl/fs/fs.properties (locale/sl/fs.properties) locale/sl/fs/addFont.dtd (locale/sl/addFont.dtd) ================================================ FILE: locales/sl/gfd.mn ================================================ gfd-sl.jar: % locale gfd sl %locale/sl/gfd/ locale/sl/gfd/gfdOverlay.dtd (locale/sl/gfdOverlay.dtd) locale/sl/gfd/gfd.dtd (locale/sl/gfd.dtd) locale/sl/gfd/addFont.dtd (locale/sl/addFont.dtd) ================================================ FILE: locales/sl/its20.mn ================================================ bluegriffon-sl.jar: % locale its20 sl %locale/sl/its20/ locale/sl/its20/its20Overlay.dtd (locale/sl/its20Overlay.dtd) locale/sl/its20/its20.properties (locale/sl/its20.properties) locale/sl/its20/its20.dtd (locale/sl/its20.dtd) locale/sl/its20/translateRule.dtd (locale/sl/translateRule.dtd) locale/sl/its20/locNoteRule.dtd (locale/sl/locNoteRule.dtd) locale/sl/its20/termRule.dtd (locale/sl/termRule.dtd) locale/sl/its20/selector.dtd (locale/sl/selector.dtd) ================================================ FILE: locales/sl/markdown.mn ================================================ markdown-sl.jar: % locale markdown sl %locale/sl/markdown/ locale/sl/markdown/markdownOverlay.dtd (locale/sl/markdownOverlay.dtd) locale/sl/markdown/markdown.dtd (locale/sl/markdown.dtd) ================================================ FILE: locales/sl/op1.mn ================================================ op1-sl.jar: % locale op1 sl %locale/sl/op1/ locale/sl/op1/op1Overlay.dtd (locale/sl/op1Overlay.dtd) locale/sl/op1/op1.dtd (locale/sl/op1.dtd) locale/sl/op1/a11yFirstStep.properties (locale/sl/a11yFirstStep.properties) ================================================ FILE: locales/sl/scripteditor.mn ================================================ bluegriffon-sl.jar: % locale scripteditor sl %locale/sl/scripteditor/ locale/sl/scripteditor/scripteditorOverlay.dtd (locale/sl/scripteditorOverlay.dtd) locale/sl/scripteditor/scripteditor.dtd (locale/sl/scripteditor.dtd) locale/sl/scripteditor/scripteditor.properties (locale/sl/scripteditor.properties) locale/sl/scripteditor/editor.dtd (locale/sl/editor.dtd) ================================================ FILE: locales/sl/stylesheets.mn ================================================ bluegriffon-sl.jar: % locale stylesheets sl %locale/sl/stylesheets/ locale/sl/stylesheets/stylesheetsOverlay.dtd (locale/sl/stylesheetsOverlay.dtd) locale/sl/stylesheets/stylesheets.dtd (locale/sl/stylesheets.dtd) locale/sl/stylesheets/editor.dtd (locale/sl/editor.dtd) ================================================ FILE: locales/sl/tipoftheday.mn ================================================ tipoftheday-sl.jar: % locale tipoftheday sl %locale/sl/tipoftheday/ locale/sl/tipoftheday/tipoftheday.dtd (locale/sl/tipoftheday.dtd) locale/sl/tipoftheday/tipofthedayOverlay.dtd (locale/sl/tipofthedayOverlay.dtd) locale/sl/tipoftheday/tipoftheday.rdf (locale/sl/tipoftheday.rdf) ================================================ FILE: locales/sr/aria.mn ================================================ bluegriffon-sr.jar: % locale aria sr %locale/sr/aria/ locale/sr/aria/ariaOverlay.dtd (locale/sr/ariaOverlay.dtd) locale/sr/aria/aria.dtd (locale/sr/aria.dtd) locale/sr/aria/aria.properties (locale/sr/aria.properties) ================================================ FILE: locales/sr/base.mn ================================================ bluegriffon-sr.jar: % locale bluegriffon sr %locale/sr/bluegriffon/ % locale branding sr %locale/sr/branding/ locale/sr/bluegriffon/aboutDialog.dtd (locale/sr/bluegriffon/aboutDialog.dtd) locale/sr/bluegriffon/bluegriffon.dtd (locale/sr/bluegriffon/bluegriffon.dtd) locale/sr/bluegriffon/polyglot.dtd (locale/sr/bluegriffon/polyglot.dtd) locale/sr/bluegriffon/findbar.dtd (locale/sr/bluegriffon/findbar.dtd) locale/sr/bluegriffon/bluegriffon.properties (locale/sr/bluegriffon/bluegriffon.properties) locale/sr/bluegriffon/colourPicker.dtd (locale/sr/bluegriffon/colourPicker.dtd) locale/sr/bluegriffon/credits.dtd (locale/sr/bluegriffon/credits.dtd) locale/sr/bluegriffon/filepickerbutton.dtd (locale/sr/bluegriffon/filepickerbutton.dtd) locale/sr/bluegriffon/filePicking.dtd (locale/sr/bluegriffon/filePicking.dtd) locale/sr/bluegriffon/insertTable.dtd (locale/sr/bluegriffon/insertTable.dtd) locale/sr/bluegriffon/insertTable.properties (locale/sr/bluegriffon/insertTable.properties) locale/sr/bluegriffon/language.properties (locale/sr/bluegriffon/language.properties) locale/sr/bluegriffon/languages.dtd (locale/sr/bluegriffon/languages.dtd) locale/sr/bluegriffon/markupCleaner.dtd (locale/sr/bluegriffon/markupCleaner.dtd) locale/sr/bluegriffon/openLocation.dtd (locale/sr/bluegriffon/openLocation.dtd) locale/sr/bluegriffon/openLocation.properties (locale/sr/bluegriffon/openLocation.properties) locale/sr/bluegriffon/newPageWizard.dtd (locale/sr/bluegriffon/newPageWizard.dtd) locale/sr/bluegriffon/newPageWizard.properties (locale/sr/bluegriffon/newPageWizard.properties) locale/sr/bluegriffon/propertiesDeck.dtd (locale/sr/bluegriffon/propertiesDeck.dtd) locale/sr/bluegriffon/aria.dtd (locale/sr/bluegriffon/aria.dtd) locale/sr/bluegriffon/structurebar.dtd (locale/sr/bluegriffon/structurebar.dtd) locale/sr/bluegriffon/tabeditor.dtd (locale/sr/bluegriffon/tabeditor.dtd) locale/sr/bluegriffon/masterPasswordQuery.properties (locale/sr/bluegriffon/masterPasswordQuery.properties) locale/sr/bluegriffon/newDocument.dtd (locale/sr/bluegriffon/newDocument.dtd) locale/sr/bluegriffon/prefs/file.dtd (locale/sr/bluegriffon/prefs/file.dtd) locale/sr/bluegriffon/prefs/source.dtd (locale/sr/bluegriffon/prefs/source.dtd) locale/sr/bluegriffon/prefs/general.dtd (locale/sr/bluegriffon/prefs/general.dtd) locale/sr/bluegriffon/prefs/newPage.dtd (locale/sr/bluegriffon/prefs/newPage.dtd) locale/sr/bluegriffon/prefs/update.dtd (locale/sr/bluegriffon/prefs/update.dtd) locale/sr/bluegriffon/prefs/styles.dtd (locale/sr/bluegriffon/prefs/styles.dtd) locale/sr/bluegriffon/prefs/advanced.dtd (locale/sr/bluegriffon/prefs/advanced.dtd) locale/sr/bluegriffon/prefs/connection.dtd (locale/sr/bluegriffon/prefs/connection.dtd) locale/sr/bluegriffon/prefs/osx.dtd (locale/sr/bluegriffon/prefs/osx.dtd) locale/sr/bluegriffon/prefs/shortcuts.dtd (locale/sr/bluegriffon/prefs/shortcuts.dtd) locale/sr/bluegriffon/prefs/update.properties (locale/sr/bluegriffon/prefs/update.properties) locale/sr/bluegriffon/prefs/license.dtd (locale/sr/bluegriffon/prefs/license.dtd) locale/sr/bluegriffon/prefs/license.properties (locale/sr/bluegriffon/prefs/license.properties) locale/sr/bluegriffon/prefs/deactivateLicense.dtd (locale/sr/bluegriffon/prefs/deactivateLicense.dtd) locale/sr/bluegriffon/prefs.dtd (locale/sr/bluegriffon/prefs.dtd) locale/sr/bluegriffon/updateAvailable.dtd (locale/sr/bluegriffon/updateAvailable.dtd) locale/sr/bluegriffon/updates.properties (locale/sr/bluegriffon/updates.properties) locale/sr/branding/brand.dtd (locale/sr/branding/brand.dtd) locale/sr/branding/brand.properties (locale/sr/branding/brand.properties) locale/sr/bluegriffon/insertImage.dtd (locale/sr/bluegriffon/insertImage.dtd) locale/sr/bluegriffon/insertAnchor.dtd (locale/sr/bluegriffon/insertAnchor.dtd) locale/sr/bluegriffon/insertCommentOrPI.dtd (locale/sr/bluegriffon/insertCommentOrPI.dtd) locale/sr/bluegriffon/insertLink.dtd (locale/sr/bluegriffon/insertLink.dtd) locale/sr/bluegriffon/insertLink.properties (locale/sr/bluegriffon/insertLink.properties) locale/sr/bluegriffon/cssClassPicker.dtd (locale/sr/bluegriffon/cssClassPicker.dtd) locale/sr/bluegriffon/insertVideo.dtd (locale/sr/bluegriffon/insertVideo.dtd) locale/sr/bluegriffon/insertAudio.dtd (locale/sr/bluegriffon/insertAudio.dtd) locale/sr/bluegriffon/insertVideo.properties (locale/sr/bluegriffon/insertVideo.properties) locale/sr/bluegriffon/insertHTML.dtd (locale/sr/bluegriffon/insertHTML.dtd) locale/sr/bluegriffon/insertHR.dtd (locale/sr/bluegriffon/insertHR.dtd) locale/sr/bluegriffon/insertForm.dtd (locale/sr/bluegriffon/insertForm.dtd) locale/sr/bluegriffon/parsingError.dtd (locale/sr/bluegriffon/parsingError.dtd) locale/sr/bluegriffon/insertFormInput.dtd (locale/sr/bluegriffon/insertFormInput.dtd) locale/sr/bluegriffon/insertFieldset.dtd (locale/sr/bluegriffon/insertFieldset.dtd) locale/sr/bluegriffon/insertLabel.dtd (locale/sr/bluegriffon/insertLabel.dtd) locale/sr/bluegriffon/insertButton.dtd (locale/sr/bluegriffon/insertButton.dtd) locale/sr/bluegriffon/insertSelect.dtd (locale/sr/bluegriffon/insertSelect.dtd) locale/sr/bluegriffon/insertTextarea.dtd (locale/sr/bluegriffon/insertTextarea.dtd) locale/sr/bluegriffon/insertKeygen.dtd (locale/sr/bluegriffon/insertKeygen.dtd) locale/sr/bluegriffon/insertOutput.dtd (locale/sr/bluegriffon/insertOutput.dtd) locale/sr/bluegriffon/insertProgress.dtd (locale/sr/bluegriffon/insertProgress.dtd) locale/sr/bluegriffon/insertMeter.dtd (locale/sr/bluegriffon/insertMeter.dtd) locale/sr/bluegriffon/insertStylesheet.dtd (locale/sr/bluegriffon/insertStylesheet.dtd) locale/sr/bluegriffon/editStylesheet.dtd (locale/sr/bluegriffon/editStylesheet.dtd) locale/sr/bluegriffon/media.dtd (locale/sr/bluegriffon/media.dtd) locale/sr/bluegriffon/media.properties (locale/sr/bluegriffon/media.properties) locale/sr/bluegriffon/insertChars.dtd (locale/sr/bluegriffon/insertChars.dtd) locale/sr/bluegriffon/convertToTable.dtd (locale/sr/bluegriffon/convertToTable.dtd) locale/sr/bluegriffon/pageProperties.dtd (locale/sr/bluegriffon/pageProperties.dtd) locale/sr/bluegriffon/spellCheck.dtd (locale/sr/bluegriffon/spellCheck.dtd) locale/sr/bluegriffon/spellCheck.properties (locale/sr/bluegriffon/spellCheck.properties) locale/sr/bluegriffon/dictionary.dtd (locale/sr/bluegriffon/dictionary.dtd) locale/sr/bluegriffon/html5.properties (locale/sr/bluegriffon/html5.properties) locale/sr/bluegriffon/listProperties.dtd (locale/sr/bluegriffon/listProperties.dtd) locale/sr/bluegriffon/insertTOC.dtd (locale/sr/bluegriffon/insertTOC.dtd) locale/sr/bluegriffon/svg-edit.properties (locale/sr/bluegriffon/svg-edit.properties) locale/sr/bluegriffon/panels.dtd (locale/sr/bluegriffon/panels.dtd) locale/sr/bluegriffon/rotator.dtd (locale/sr/bluegriffon/rotator.dtd) ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/aboutDialog.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/aria.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/bluegriffon.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/bluegriffon.properties ================================================ titleModifier=BlueGriffon # in the following string, %t represents the title of the page or its URL # and %b the titleModifier above titleFormat=%S - %S Unknown=[непознато] NoClassAvailable=(без класе) NoIdAvailable=(без ID) DocumentTitle=Назив странице NeedDocTitle=Унесите назив странице. DocTitleHelp=То идентификује страну у називу прозора и ознаке. ExportToText=Извези у текст SaveDocumentAs=Сачувај страну као XHTMLfiles=XHTML датотеке untitled=без назива SaveDocument=Сачувај страну SaveFileFailed=Неуспело чување датотеке! ExportToText=Извези у текст FileNotSaved=Датотека није сачувана! SaveFileBeforeClosing=Да ли желите да сачувате датотеку пре затварања ове картице? YesSaveFile=Да, сачувај је NoDiscardChanges=Не, откажи промене DontCloseTab=Не затварај картицу! IdAlreadyTaken=Овај ID се већ користи у документу RemoveIdFromElement=Да ли желите да уклоните ID из елемента који га носи, или да откажете акцију? YesRemoveId=Уклони ID NoCancel=Откажи ReplaceAll=Замени све... ReplacedPart1=Замењено ReplacedPart2=дешавања AFileWasChanged=Датотека је промењена на диску ReloadFile=Датотека %S је промењена на диску, BlueGriffon мора поново да је учита DontAskForFileChangesAgain=не приказуј поново ово упозорење AbandonChanges=Да ли желите да напустите несачуване промене у "%title%" и поново учитате страницу? RevertCaption=Повратак на последње сачувано HTMLCommentsInXHTMLTitle=HTML коментар унутар

      Normal text will look like this !

      Visited will look like this !

      Active Links will look like this !

      ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/panels.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/parsingError.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/polyglot.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/prefs/advanced.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/prefs/connection.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/prefs/deactivateLicense.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/prefs/file.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/prefs/general.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/prefs/license.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/prefs/license.properties ================================================ activateWarning=BlueGriffon needs to restart to activate your license. Do you want to restart now? confirmRestart=Restart BlueGriffon? fullResetTitle=License activation reset fullResetErrorLabel=Impossible to perform the operation, a network error occurred. fullResetRequested=A reset link was sent to the owner of the license/transaction. BlueGriffon must now restart. fullResetInvalid=The transaction ID is invalid. ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/prefs/newPage.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/prefs/osx.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.properties ================================================ NoMainWindowAvaialble=Није могуће уређивање пречица PleaseOpenOneMainWindow=Главни прозор BlueGriffon мора бити отворен за уређивање пречица. ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/prefs/source.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/prefs/styles.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/prefs/update.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/prefs/update.properties ================================================ SoftwareUpdates=Ажурирање софтвера UnableToCheck=Није могуће проверити доступност UpToDate=BlueGriffon је ажуриран ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/prefs.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/propertiesDeck.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/rotator.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/spellCheck.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/spellCheck.properties ================================================ CorrectSpelling=(исправан правопис) NoSuggestedWords=(нема предложених речи) NoMisspelledWord=Све речи су без грешке CheckSpellingDone=Завршена је провера правописа. CheckSpelling=Провера правописа ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/structurebar.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/svg-edit.properties ================================================ SvgEdit=SVG уређивање ConfirmClose=Постоје несачуване промене, да ли заиста желите да затворите SVG уређивање? ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/tabeditor.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/updateAvailable.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/base/locale/bluegriffon/updates.properties ================================================ update.checkInsideButton.label=Провери да ли постоје исправке update.checkInsideButton.accesskey=P update.resumeButton.label=Настави преузимање %S… update.resumeButton.accesskey=D update.openUpdateUI.applyButton.label=Ажурирај… update.openUpdateUI.applyButton.accesskey=A update.restart.applyButton.label=Ажурирај update.restart.applyButton.accesskey=A update.openUpdateUI.upgradeButton.label=Ажурирај сада… update.openUpdateUI.upgradeButton.accesskey=U update.restart.upgradeButton.label=Ажурирај сада update.restart.upgradeButton.accesskey=U ================================================ FILE: locales/sr/bluegriffon/base/locale/branding/brand.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/base/locale/branding/brand.properties ================================================ brandShortName=BlueGriffon brandFullName=BlueGriffon vendorShortName=Disruptive Innovations sidebarName=Бочни панел ================================================ FILE: locales/sr/bluegriffon/extensions/fs/addFont.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/extensions/fs/fs.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/extensions/fs/fs.properties ================================================ SelectDir=Изаберите директоријум где ћете отпаковати архиву слова SelectFile=Изаберите постојећи пакет слова stylesheet.css Stylesheet=A FontSquirrel пакет стилова MustBeSavedTitle=Документ никада није сачуван MustBeSavedMessage=Морате да сачувате датотеку бар једном пре него што покушате да повеже локална слова користећи релативну УРЛ. Затворите и поново отворите документ после меморисања. ================================================ FILE: locales/sr/bluegriffon/extensions/fs/fsOverlay.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/extensions/gfd/addFont.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/extensions/gfd/gfd.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/extensions/gfd/gfdOverlay.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/extensions/markdown/markdown.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/extensions/markdown/markdownOverlay.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/extensions/op1/a11yFirstStep.properties ================================================ ConformingDTDSyntax=Use a W3C-conforming DTD syntax before the html element NoWrongSyntaxOrNonConformingHierarchy=Don't use wrong attribute syntax or non-conforming element hierarchy inside the html element OneTitleInHead=Use a title element as a child of the head element NoEmptyTitle=When you provide a title element, do not leave it empty NoMetaRefresh=Don't use a meta element with an http-equiv attribute and a value equal to refresh HTMLElementHasLangAttribute=Use the lang attribute for the html element HTMLElementHasValidLangAttribute=Use a valid language code for the lang attribute NoInvalidDir=Don't use a value other than ltr, rtl or empty for the dir attribute TitleForFrames=Use the title attribute for every frame element NoEmptyTitleForFrames=When you provide a title attribute for a frame element, do not leave it empty TitleForIFrames=Use the title attribute for every iframe element NoEmptyTitleForIFrames=When you provide a title attribute for an iframe element, do not leave it empty AtLeastOneH1InBody=There must be at least one h1 element inside (at any level) the body element NoEmptyH1=When you provide a h1 element, do not leave it empty NoEmptyH2=When you provide a h2 element, do not leave it empty NoEmptyH3=When you provide a h3 element, do not leave it empty NoEmptyH4=When you provide a h4 element, do not leave it empty NoEmptyH5=When you provide a h5 element, do not leave it empty NoEmptyH6=When you provide a h6 element, do not leave it empty H2Order=Use  a h1, h2, h3, h4, h5 or h6 element as a first heading before a h2 element in the source order H3Order=Use a h2, h3, h4, h5 or h6 element as a first heading before a h3 element in the source order H4Order=Use a h3, h4, h5 or h6 element as a first heading before a h4 element in the source order H5Order=Use a h4, h5 or h6 element as a first heading before a h5 element in the source order H6Order=Use a h5 or h6 element as a first heading before a h6 element in the source order DTAsFirstChildOfDL=Use a dt element as the first child of a dl element NoEmptyLI=When you provide a li element, do not leave it empty NoAlignAttribute=Don't use the align attribute NoXmpElement=Don't use the xmp element NoEmptyP=When you provide a p element, do not leave it empty NoEmptyAExceptAnchors=When you provide an a element, do not leave it empty except if it is used as an anchor NoEmptyButton=When you provide a button element, do not leave it empty NoVlinkAttribute=Don't use the vlink attribute NoTextAttribute=Don't use the text attribute NoLinkAttribute=Don't use the link attribute noImgWithoutAlt=Use the alt attribute for every img element noAreaWithoutAlt=Use the alt attribute for every area element noAppletWithoutAlt=Use the alt attribute for every applet element noImageInputWithoutAlt=Use the alt attribute for every input type=image element noEmptyAltForImageLoneChildOfAnchorOrButton=If the img element is the only child of a button or an a element, do not leave its alt attribute empty noEmptyAltForInputImage=When you provide an alt attribute for an input type=image element, do not leave it empty noEmptyAltForAreaWithHref=When you provide an alt attribute for an area element holding an href attribute, do not leave it empty noAltSimilarToTextContent=If an img element is a child of an a element with text, do not use the same text for its alt attribute as the text inside the a element noBorderAttribute=Don't use the border attribute noSimilarAltForAreasWithDifferentHref=Don't use the same value for alt attributes for multiple area elements with different href values LongdescIsURI=Use a URI as the value for a longdesc attribute noBackgroundAttribute=Don't use the background attribute noBgsoundElement=Don't use the bgsound element TablesWithAtLeastOneTHHaveACaption=Use a caption element as the first child of a table element containing at least one th element CaptionIsDifferentFromSummaryAttribute=Don't use the same content for a caption element and a summary attribute noEmptyCaption=When you provide a caption element, do not leave it empty noCaptionInATableWithOnlyTDs=Don't use a caption element in a table element containing only td elements noAlinkAttribute=Don't use an alink attribute noSummaryAttributeSimilarToCaption=Don't use the same content for a summary attribute and a caption element noEmptySummaryIfTableHasTHOrCaption=When you provide a summary attribute for a table element containing a th or a caption element, do not leave it empty noSummaryAttributeIfOnlyTDs=Don't use a summary attribute on a table element containg only td elements noStrikeElement=Don't use the strike element noListingElement=Don't use the listing element AtLeastOneTHIfCaptionOrSummary=Use at least one th element inside a table element with a caption element or a non-empty summary attribute AllNonEmptyTHHaveScopeOrId=Use a scope or id attribute for every non-empty th element ScopeAttributeIsRowOrCol=Don't use a value other than row or col for the scope attribute noBgcolorAttribute=Don't use the bgcolor attribute noTTElement=Don't use the tt element TDHaveHeadersAttributeIfTHHasId=Use a headers attribute on every td element if the corresponding th element has an id attribute noPlaintextElement=Don't use the plaintext element noHeadersAttributeThatIsNotATHId=Don't use for a headers attribute a value which matches an id attribute used for a td of the table element AllFormsHaveAButton=Use a button, or an input of type submit, image or button inside a form element SubmitButtonsHaveNonEmptyValue=When you provide an input type=submit, do not leave its value attribute empty noMarqueeElement=Don't use the marquee element FieldsetHasALegend=Use a legend element as a child of every fieldset element FieldsetsAreInForms=Don't use a fieldset element without a form element noEmptyLegendElement=When you provide a legend element, do not leave it empty LabelElementHasForAttribute=Use the for attribute for every label element noEmptyForAttributeOnLabel=When you provide a for attribute for a label element, do not leave it empty ForAttributeMatchesAnIdInSameForm=A for attribute must have a value that matches an id attribute inside the form element OptgroupElementHasALabel=Use the label attribute for every optgroup element NoSimilarLabelInOptgroupsOfSameSelect=Don't use the same label attribute for different optgroup elements of the same select element noEmptyLabelAttributeOnOptgroup=When you provide a label attribute for an optgroup element, do not leave it empty noBasefontElement=Don't use the basefont element noBlinkElement=Don't use the blink element noCenterElement=Don't use the center element noFontElement=Don't use the font element ================================================ FILE: locales/sr/bluegriffon/extensions/op1/op1.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/extensions/op1/op1Overlay.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/extensions/tipoftheday/tipoftheday.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/extensions/tipoftheday/tipoftheday.rdf ================================================ %brandDTD; ]> &brandShortName; tips http://bluegriffon.org/ &brandShortName; tip of the day Archive en-us …&brandShortName; is cross platform? …&brandShortName; exists on a wide variety of operating systems including Windows, Mac OS X, and many flavors of Linux, OS/2 … …&brandShortName; shows the title of any unsaved page with a red shadow? You can now save files from any viewing mode. …you have direct access to the &brandShortName; community? Just select “Help > User’s Community”. …you can insert HTML5 elements easily? Just select “Insert > HTML5 Element”. …you can close the current tab with one key? Control+w (Command +w on Mac OS X) will close the current tab. …you can create a new tab with a key combination? Control+n (Command +n on Mac OS X) will create a new blank tab using the same doctype as the last page created. …you can revert to a previously saved version of the currently edited document? Righ-click (context-click on Mac OS X) on the document's tab and select the Revert menu. …you can publish pages directly from &brandShortName; First install the free FireFTP add-on and set it up. It will then be available on the Tools menu. …&brandShortName; can insert any character easily? Use “Insert characters and symbols”. You can then search for any Unicode character by name or open a block for inspection. …&brandShortName; runs spellcheck by default? Right click a word to find suggestions. Switch checking on or off using “Tools > Preferences > General” . …&brandShortName; can reliably select an element? Simply click its name in the structure bar. …you can move an element in your document using the mouse? First select as in previous tip then just drag it to where needed. …you can quickly open existing pages? The paid for Project manager add-on permits instant access to pages and images which are organised as a project. …you can choose your default browser? Use “Tools > Preferences > Advanced > Reset external browser settings”. Next time you browse you can choose a browser. …&brandShortName; allows you to use external stylesheets? To create one ready for use click “Panels > Stylesheets”. Click the plus sign and select “Linked to the document”. …&brandShortName; can manage stylesheets and complex selectors? Using the CSS Pro Editor (a paid for add-on) you change the order of and add titles and rel attribute to stylesheets and develop complex CSS 2 and 3 selectors with advanced help. …panels can be resized? Drag the grab handle at the bottom right corner to the size needed. …attributes can be added to any element? Open “Panels > DOM Explorer”. In wysiwyg view click in the element, select use the Attributes tab and click the plus sign. …&brandShortName; can handle CSS3 properties? Vendor prefixes will be added for browsers that need them. …you can personalize keyboard shortcuts? Any menu item can be allocated to your preferred key. Open “Tools > Preferences > Keyboard Shortcuts”. Find and double-click the command wanted. In the new window key a shortcut. …you can remove a class from an element? Just select the element and in the Class drop down box re-apply the class. ================================================ FILE: locales/sr/bluegriffon/extensions/tipoftheday/tipofthedayOverlay.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/sidebars/aria/aria.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/sidebars/aria/aria.properties ================================================ mustBeContainedIn=must be contained in or= or ok=OK mustContain=must contain and= and deprecated=deprecated missingTextbox=missing textbox missingListboxTreeGridDialog=missing listbox, tree, grid or dialog ================================================ FILE: locales/sr/bluegriffon/sidebars/aria/ariaOverlay.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/sidebars/cssproperties/backgrounditem.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/sidebars/cssproperties/backgrounditem.properties ================================================ backgroundColorTitle=Боја backgroundImageTitle=Слика backgroundLinearGradientTitle=Линеарни градијент backgroundRadialGradientTitle=Радијални градијент ================================================ FILE: locales/sr/bluegriffon/sidebars/cssproperties/colorstopitem.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/sidebars/cssproperties/cssproperties.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/sidebars/cssproperties/cssproperties.properties ================================================ EnterAnId=Please enter an ID EnterUniqueId=Морате дати јединствени ИД елементу: NoClasSelected=Морате да изаберете име класе PleaseSelectAClass=Класа мора бити изабрана да се примени тражене промене ================================================ FILE: locales/sr/bluegriffon/sidebars/cssproperties/csspropertiesOverlay.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/sidebars/cssproperties/editGridTemplate.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/sidebars/cssproperties/fontFeatures.properties ================================================ FFaalt=Access all alternates FFcalt=Contextual alternates FFsalt=Stylistic alternates FFliga=Standard ligatures FFclig=Contextual ligatures FFdlig=Discretionary ligatures FFhist=Historical forms FFhlig=Historical ligatures FFunic=Unicase FFsmcp=Small capitals FFc2sc=Small capitals from capitals FFc2pc=Petite capitals from capitals FFpcap=Petite capitals FFcase=Case sensitive forms FFcpsp=Capital spacing FFtitl=Titling FFswsh=Swash FFcswh=Contextual swash FFfrac=Fractions FFafrc=Alternative fractions FFordn=Ordinals FFnumr=Numerators FFdnom=Denominators FFsinf=Scientific inferiors FFsups=Superscript FFsubs=Subscript FFonum=Oldstyle figures FFlnum=Lining Figures FFpnum=Proportional figures FFtnum=Tabular figures FFzero=Slashed zero FFmgrk=Mathematical greek FFnalt=Alternate annotation forms FFornm=Ornaments FFlocl=Localized forms FFsize=Optical size FFisol=Isolated forms FFinit=Initial forms FFmedi=Medial forms FFfinal=Final forms FFrlig=Requird ligatures FFccmp=Glyph composition/decomposition FFmark=Mark to base positioning FFmkmj=Mark to mark positioning FFhwid=Half widths ================================================ FILE: locales/sr/bluegriffon/sidebars/cssproperties/foo ================================================ asasas ================================================ FILE: locales/sr/bluegriffon/sidebars/cssproperties/griditemposition.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/sidebars/cssproperties/textshadowitem.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/sidebars/cssproperties/transformationitem.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/sidebars/cssproperties/transitionitem.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/sidebars/domexplorer/domexplorer.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/sidebars/domexplorer/domexplorerOverlay.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/sidebars/its20/its20.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/sidebars/its20/its20.properties ================================================ LoadError=Load Error InlineParseError=Inline resource is not an ITS 2.0 document CannotFetch=Cannot fetch URL NotITS=Resource is not an ITS 2.0 document TranslatableByGlobalRule=Translatable by global rule NotTranslatableByGlobalRule=Not translatable by global rule InlineRules=Inline rules translateRule=Translate locNoteRule=Localization Note termRule=Terminology dirRule=Directionality langRule=Language Information withinTextRule=Elements Within Text domainRule=Domain textAnalysisRule=Text Analysis localeFilterRule=Locale Filter provRule=Provenance externalResourceRefRule=External Resource targetPointerRule=Target Pointer idValueRule=Id Value preserveSpaceRule=Preserve Space locQualityIssueRule=Localization Quality Issue mtConfidenceRule=Machine-Translation Confidence allowedCharactersRule=Allowed Characters storageSizeRule=Storage Size DontWarnAgainForUrl=Don't warn me again about this URL DontWarnAgainForInline=Don't warn me again about inline global rules NewITSFile=New ITS 2.0 File CannotResolveXPath=Cannot resolve the following XPath selector (undeclared HTML namespace?): XPathParsingError=XPath Parsing Error DontWarnAgainForSelector=Don't warn me again about this selector CSSParsingError=CSS Parsing Error CannotResolveCSS=Cannot resolve the following CSS selector: ================================================ FILE: locales/sr/bluegriffon/sidebars/its20/its20Overlay.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/sidebars/its20/locNoteRule.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/sidebars/its20/selector.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/sidebars/its20/termRule.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/sidebars/its20/translateRule.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/sidebars/scripteditor/editor.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/sidebars/scripteditor/scripteditor.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/sidebars/scripteditor/scripteditor.properties ================================================ ConfirmDeletionTitle=Обриши скрипту ConfirmDeletion=Да ли желите избрисати ову скрипту? AddExternalScriptTitle=Додај спољну скрипту PromptScriptURL=УРЛ скрипте? ================================================ FILE: locales/sr/bluegriffon/sidebars/scripteditor/scripteditorOverlay.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/sidebars/stylesheets/editor.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/sidebars/stylesheets/stylesheets.dtd ================================================ ================================================ FILE: locales/sr/bluegriffon/sidebars/stylesheets/stylesheetsOverlay.dtd ================================================ ================================================ FILE: locales/sr/cssproperties.mn ================================================ bluegriffon-sr.jar: % locale cssproperties sr %locale/sr/cssproperties/ locale/sr/cssproperties/csspropertiesOverlay.dtd (locale/sr/csspropertiesOverlay.dtd) locale/sr/cssproperties/cssproperties.dtd (locale/sr/cssproperties.dtd) locale/sr/cssproperties/editGridTemplate.dtd (locale/sr/editGridTemplate.dtd) locale/sr/cssproperties/backgrounditem.dtd (locale/sr/backgrounditem.dtd) locale/sr/cssproperties/griditemposition.dtd (locale/sr/griditemposition.dtd) locale/sr/cssproperties/transformationitem.dtd (locale/sr/transformationitem.dtd) locale/sr/cssproperties/transitionitem.dtd (locale/sr/transitionitem.dtd) locale/sr/cssproperties/textshadowitem.dtd (locale/sr/textshadowitem.dtd) locale/sr/cssproperties/colorstopitem.dtd (locale/sr/colorstopitem.dtd) locale/sr/cssproperties/backgrounditem.properties (locale/sr/backgrounditem.properties) locale/sr/cssproperties/cssproperties.properties (locale/sr/cssproperties.properties) locale/sr/cssproperties/fontFeatures.properties (locale/sr/fontFeatures.properties) ================================================ FILE: locales/sr/domexplorer.mn ================================================ bluegriffon-sr.jar: % locale domexplorer sr %locale/sr/domexplorer/ locale/sr/domexplorer/domexplorerOverlay.dtd (locale/sr/domexplorerOverlay.dtd) locale/sr/domexplorer/domexplorer.dtd (locale/sr/domexplorer.dtd) ================================================ FILE: locales/sr/fs.mn ================================================ fs-sr.jar: % locale fs sr %locale/sr/fs/ locale/sr/fs/fsOverlay.dtd (locale/sr/fsOverlay.dtd) locale/sr/fs/fs.dtd (locale/sr/fs.dtd) locale/sr/fs/fs.properties (locale/sr/fs.properties) locale/sr/fs/addFont.dtd (locale/sr/addFont.dtd) ================================================ FILE: locales/sr/gfd.mn ================================================ gfd-sr.jar: % locale gfd sr %locale/sr/gfd/ locale/sr/gfd/gfdOverlay.dtd (locale/sr/gfdOverlay.dtd) locale/sr/gfd/gfd.dtd (locale/sr/gfd.dtd) locale/sr/gfd/addFont.dtd (locale/sr/addFont.dtd) ================================================ FILE: locales/sr/its20.mn ================================================ bluegriffon-sr.jar: % locale its20 sr %locale/sr/its20/ locale/sr/its20/its20Overlay.dtd (locale/sr/its20Overlay.dtd) locale/sr/its20/its20.properties (locale/sr/its20.properties) locale/sr/its20/its20.dtd (locale/sr/its20.dtd) locale/sr/its20/translateRule.dtd (locale/sr/translateRule.dtd) locale/sr/its20/locNoteRule.dtd (locale/sr/locNoteRule.dtd) locale/sr/its20/termRule.dtd (locale/sr/termRule.dtd) locale/sr/its20/selector.dtd (locale/sr/selector.dtd) ================================================ FILE: locales/sr/markdown.mn ================================================ markdown-sr.jar: % locale markdown sr %locale/sr/markdown/ locale/sr/markdown/markdownOverlay.dtd (locale/sr/markdownOverlay.dtd) locale/sr/markdown/markdown.dtd (locale/sr/markdown.dtd) ================================================ FILE: locales/sr/op1.mn ================================================ op1-sr.jar: % locale op1 sr %locale/sr/op1/ locale/sr/op1/op1Overlay.dtd (locale/sr/op1Overlay.dtd) locale/sr/op1/op1.dtd (locale/sr/op1.dtd) locale/sr/op1/a11yFirstStep.properties (locale/sr/a11yFirstStep.properties) ================================================ FILE: locales/sr/scripteditor.mn ================================================ bluegriffon-sr.jar: % locale scripteditor sr %locale/sr/scripteditor/ locale/sr/scripteditor/scripteditorOverlay.dtd (locale/sr/scripteditorOverlay.dtd) locale/sr/scripteditor/scripteditor.dtd (locale/sr/scripteditor.dtd) locale/sr/scripteditor/scripteditor.properties (locale/sr/scripteditor.properties) locale/sr/scripteditor/editor.dtd (locale/sr/editor.dtd) ================================================ FILE: locales/sr/stylesheets.mn ================================================ bluegriffon-sr.jar: % locale stylesheets sr %locale/sr/stylesheets/ locale/sr/stylesheets/stylesheetsOverlay.dtd (locale/sr/stylesheetsOverlay.dtd) locale/sr/stylesheets/stylesheets.dtd (locale/sr/stylesheets.dtd) locale/sr/stylesheets/editor.dtd (locale/sr/editor.dtd) ================================================ FILE: locales/sr/tipoftheday.mn ================================================ tipoftheday-sr.jar: % locale tipoftheday sr %locale/sr/tipoftheday/ locale/sr/tipoftheday/tipoftheday.dtd (locale/sr/tipoftheday.dtd) locale/sr/tipoftheday/tipofthedayOverlay.dtd (locale/sr/tipofthedayOverlay.dtd) locale/sr/tipoftheday/tipoftheday.rdf (locale/sr/tipoftheday.rdf) ================================================ FILE: locales/sv-SE/aria.mn ================================================ bluegriffon-sv-SE.jar: % locale aria sv-SE %locale/sv-SE/aria/ locale/sv-SE/aria/ariaOverlay.dtd (locale/sv-SE/ariaOverlay.dtd) locale/sv-SE/aria/aria.dtd (locale/sv-SE/aria.dtd) locale/sv-SE/aria/aria.properties (locale/sv-SE/aria.properties) ================================================ FILE: locales/sv-SE/base.mn ================================================ bluegriffon-sv-SE.jar: % locale bluegriffon sv-SE %locale/sv-SE/bluegriffon/ % locale branding sv-SE %locale/sv-SE/branding/ locale/sv-SE/bluegriffon/aboutDialog.dtd (locale/sv-SE/bluegriffon/aboutDialog.dtd) locale/sv-SE/bluegriffon/bluegriffon.dtd (locale/sv-SE/bluegriffon/bluegriffon.dtd) locale/sv-SE/bluegriffon/polyglot.dtd (locale/sv-SE/bluegriffon/polyglot.dtd) locale/sv-SE/bluegriffon/findbar.dtd (locale/sv-SE/bluegriffon/findbar.dtd) locale/sv-SE/bluegriffon/bluegriffon.properties (locale/sv-SE/bluegriffon/bluegriffon.properties) locale/sv-SE/bluegriffon/colourPicker.dtd (locale/sv-SE/bluegriffon/colourPicker.dtd) locale/sv-SE/bluegriffon/credits.dtd (locale/sv-SE/bluegriffon/credits.dtd) locale/sv-SE/bluegriffon/filepickerbutton.dtd (locale/sv-SE/bluegriffon/filepickerbutton.dtd) locale/sv-SE/bluegriffon/filePicking.dtd (locale/sv-SE/bluegriffon/filePicking.dtd) locale/sv-SE/bluegriffon/insertTable.dtd (locale/sv-SE/bluegriffon/insertTable.dtd) locale/sv-SE/bluegriffon/insertTable.properties (locale/sv-SE/bluegriffon/insertTable.properties) locale/sv-SE/bluegriffon/language.properties (locale/sv-SE/bluegriffon/language.properties) locale/sv-SE/bluegriffon/languages.dtd (locale/sv-SE/bluegriffon/languages.dtd) locale/sv-SE/bluegriffon/markupCleaner.dtd (locale/sv-SE/bluegriffon/markupCleaner.dtd) locale/sv-SE/bluegriffon/openLocation.dtd (locale/sv-SE/bluegriffon/openLocation.dtd) locale/sv-SE/bluegriffon/openLocation.properties (locale/sv-SE/bluegriffon/openLocation.properties) locale/sv-SE/bluegriffon/newPageWizard.dtd (locale/sv-SE/bluegriffon/newPageWizard.dtd) locale/sv-SE/bluegriffon/newPageWizard.properties (locale/sv-SE/bluegriffon/newPageWizard.properties) locale/sv-SE/bluegriffon/propertiesDeck.dtd (locale/sv-SE/bluegriffon/propertiesDeck.dtd) locale/sv-SE/bluegriffon/aria.dtd (locale/sv-SE/bluegriffon/aria.dtd) locale/sv-SE/bluegriffon/structurebar.dtd (locale/sv-SE/bluegriffon/structurebar.dtd) locale/sv-SE/bluegriffon/tabeditor.dtd (locale/sv-SE/bluegriffon/tabeditor.dtd) locale/sv-SE/bluegriffon/masterPasswordQuery.properties (locale/sv-SE/bluegriffon/masterPasswordQuery.properties) locale/sv-SE/bluegriffon/newDocument.dtd (locale/sv-SE/bluegriffon/newDocument.dtd) locale/sv-SE/bluegriffon/prefs/file.dtd (locale/sv-SE/bluegriffon/prefs/file.dtd) locale/sv-SE/bluegriffon/prefs/source.dtd (locale/sv-SE/bluegriffon/prefs/source.dtd) locale/sv-SE/bluegriffon/prefs/general.dtd (locale/sv-SE/bluegriffon/prefs/general.dtd) locale/sv-SE/bluegriffon/prefs/newPage.dtd (locale/sv-SE/bluegriffon/prefs/newPage.dtd) locale/sv-SE/bluegriffon/prefs/update.dtd (locale/sv-SE/bluegriffon/prefs/update.dtd) locale/sv-SE/bluegriffon/prefs/styles.dtd (locale/sv-SE/bluegriffon/prefs/styles.dtd) locale/sv-SE/bluegriffon/prefs/advanced.dtd (locale/sv-SE/bluegriffon/prefs/advanced.dtd) locale/sv-SE/bluegriffon/prefs/connection.dtd (locale/sv-SE/bluegriffon/prefs/connection.dtd) locale/sv-SE/bluegriffon/prefs/osx.dtd (locale/sv-SE/bluegriffon/prefs/osx.dtd) locale/sv-SE/bluegriffon/prefs/shortcuts.dtd (locale/sv-SE/bluegriffon/prefs/shortcuts.dtd) locale/sv-SE/bluegriffon/prefs/update.properties (locale/sv-SE/bluegriffon/prefs/update.properties) locale/sv-SE/bluegriffon/prefs/license.dtd (locale/sv-SE/bluegriffon/prefs/license.dtd) locale/sv-SE/bluegriffon/prefs/license.properties (locale/sv-SE/bluegriffon/prefs/license.properties) locale/sv-SE/bluegriffon/prefs/deactivateLicense.dtd (locale/sv-SE/bluegriffon/prefs/deactivateLicense.dtd) locale/sv-SE/bluegriffon/prefs.dtd (locale/sv-SE/bluegriffon/prefs.dtd) locale/sv-SE/bluegriffon/updateAvailable.dtd (locale/sv-SE/bluegriffon/updateAvailable.dtd) locale/sv-SE/bluegriffon/updates.properties (locale/sv-SE/bluegriffon/updates.properties) locale/sv-SE/branding/brand.dtd (locale/sv-SE/branding/brand.dtd) locale/sv-SE/branding/brand.properties (locale/sv-SE/branding/brand.properties) locale/sv-SE/bluegriffon/insertImage.dtd (locale/sv-SE/bluegriffon/insertImage.dtd) locale/sv-SE/bluegriffon/insertAnchor.dtd (locale/sv-SE/bluegriffon/insertAnchor.dtd) locale/sv-SE/bluegriffon/insertCommentOrPI.dtd (locale/sv-SE/bluegriffon/insertCommentOrPI.dtd) locale/sv-SE/bluegriffon/insertLink.dtd (locale/sv-SE/bluegriffon/insertLink.dtd) locale/sv-SE/bluegriffon/insertLink.properties (locale/sv-SE/bluegriffon/insertLink.properties) locale/sv-SE/bluegriffon/cssClassPicker.dtd (locale/sv-SE/bluegriffon/cssClassPicker.dtd) locale/sv-SE/bluegriffon/insertVideo.dtd (locale/sv-SE/bluegriffon/insertVideo.dtd) locale/sv-SE/bluegriffon/insertAudio.dtd (locale/sv-SE/bluegriffon/insertAudio.dtd) locale/sv-SE/bluegriffon/insertVideo.properties (locale/sv-SE/bluegriffon/insertVideo.properties) locale/sv-SE/bluegriffon/insertHTML.dtd (locale/sv-SE/bluegriffon/insertHTML.dtd) locale/sv-SE/bluegriffon/insertHR.dtd (locale/sv-SE/bluegriffon/insertHR.dtd) locale/sv-SE/bluegriffon/insertForm.dtd (locale/sv-SE/bluegriffon/insertForm.dtd) locale/sv-SE/bluegriffon/parsingError.dtd (locale/sv-SE/bluegriffon/parsingError.dtd) locale/sv-SE/bluegriffon/insertFormInput.dtd (locale/sv-SE/bluegriffon/insertFormInput.dtd) locale/sv-SE/bluegriffon/insertFieldset.dtd (locale/sv-SE/bluegriffon/insertFieldset.dtd) locale/sv-SE/bluegriffon/insertLabel.dtd (locale/sv-SE/bluegriffon/insertLabel.dtd) locale/sv-SE/bluegriffon/insertButton.dtd (locale/sv-SE/bluegriffon/insertButton.dtd) locale/sv-SE/bluegriffon/insertSelect.dtd (locale/sv-SE/bluegriffon/insertSelect.dtd) locale/sv-SE/bluegriffon/insertTextarea.dtd (locale/sv-SE/bluegriffon/insertTextarea.dtd) locale/sv-SE/bluegriffon/insertKeygen.dtd (locale/sv-SE/bluegriffon/insertKeygen.dtd) locale/sv-SE/bluegriffon/insertOutput.dtd (locale/sv-SE/bluegriffon/insertOutput.dtd) locale/sv-SE/bluegriffon/insertProgress.dtd (locale/sv-SE/bluegriffon/insertProgress.dtd) locale/sv-SE/bluegriffon/insertMeter.dtd (locale/sv-SE/bluegriffon/insertMeter.dtd) locale/sv-SE/bluegriffon/insertStylesheet.dtd (locale/sv-SE/bluegriffon/insertStylesheet.dtd) locale/sv-SE/bluegriffon/editStylesheet.dtd (locale/sv-SE/bluegriffon/editStylesheet.dtd) locale/sv-SE/bluegriffon/media.dtd (locale/sv-SE/bluegriffon/media.dtd) locale/sv-SE/bluegriffon/media.properties (locale/sv-SE/bluegriffon/media.properties) locale/sv-SE/bluegriffon/insertChars.dtd (locale/sv-SE/bluegriffon/insertChars.dtd) locale/sv-SE/bluegriffon/convertToTable.dtd (locale/sv-SE/bluegriffon/convertToTable.dtd) locale/sv-SE/bluegriffon/pageProperties.dtd (locale/sv-SE/bluegriffon/pageProperties.dtd) locale/sv-SE/bluegriffon/spellCheck.dtd (locale/sv-SE/bluegriffon/spellCheck.dtd) locale/sv-SE/bluegriffon/spellCheck.properties (locale/sv-SE/bluegriffon/spellCheck.properties) locale/sv-SE/bluegriffon/dictionary.dtd (locale/sv-SE/bluegriffon/dictionary.dtd) locale/sv-SE/bluegriffon/html5.properties (locale/sv-SE/bluegriffon/html5.properties) locale/sv-SE/bluegriffon/listProperties.dtd (locale/sv-SE/bluegriffon/listProperties.dtd) locale/sv-SE/bluegriffon/insertTOC.dtd (locale/sv-SE/bluegriffon/insertTOC.dtd) locale/sv-SE/bluegriffon/svg-edit.properties (locale/sv-SE/bluegriffon/svg-edit.properties) locale/sv-SE/bluegriffon/panels.dtd (locale/sv-SE/bluegriffon/panels.dtd) locale/sv-SE/bluegriffon/rotator.dtd (locale/sv-SE/bluegriffon/rotator.dtd) ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/aboutDialog.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/aria.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/bluegriffon.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/bluegriffon.properties ================================================ titleModifier=BlueGriffon # in the following string, %t represents the title of the page or its URL # and %b the titleModifier above titleFormat=%S - %S Unknown=[Ok\u00e4nd] NoClassAvailable=(Ingen klass) NoIdAvailable=(Inget ID) DocumentTitle=Sidrubrik NeedDocTitle=Skriv in en rubrik f\u00f6r den aktuella sidan. DocTitleHelp=Detta identifierar sidan i f\u00f6nstrets titel och bokm\u00e4rken. ExportToText=Exportera till text SaveDocumentAs=Spara sida som XHTMLfiles=XHTML-filer untitled=namnl\u00f6s SaveDocument=Spara sida SaveFileFailed=Misslyckades med att spara filen! ExportToText=Exportera till text FileNotSaved=Filen \u00e4r inte sparad! SaveFileBeforeClosing=Vill du spara filen innan du st\u00e4nger denna flik? YesSaveFile=Ja, spara den NoDiscardChanges=Nej, ignorera \u00e4ndringar DontCloseTab=St\u00e4ng inte fliken! IdAlreadyTaken=Detta ID anv\u00e4nds redan i dokumentet RemoveIdFromElement=Vill du ta bort ID:t fr\u00e5n elementet som redan har det eller avbryta \u00e5tg\u00e4rden? YesRemoveId=Ta bort ID NoCancel=Avbryt ReplaceAll=Ers\u00e4tt alla ... ReplacedPart1=Ersatt ReplacedPart2=f\u00f6rekomster AFileWasChanged=En fil p\u00e5 disken har \u00e4ndrats ReloadFile=Filen %S \u00e4ndrades p\u00e5 disken, BlueGriffon m\u00e5ste ladda om den DontAskForFileChangesAgain=visa inte denna varning igen AbandonChanges=Ladda om %title% och f\u00f6rlora \u00e4ndringar? RevertCaption=\u00c5terg\u00e5 till senast sparade version HTMLCommentsInXHTMLTitle=HTML-kommentarer inuti ett

      Normal text kommer se ut så här!

      Besökta länkar kommer se ut så här!

      Aktiva länkar kommer se ut så här!

      ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/panels.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/parsingError.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/polyglot.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/prefs/advanced.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/prefs/connection.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/prefs/deactivateLicense.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/prefs/file.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/prefs/general.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/prefs/license.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/prefs/license.properties ================================================ activateWarning=BlueGriffon needs to restart to activate your license. Do you want to restart now? confirmRestart=Restart BlueGriffon? fullResetTitle=License activation reset fullResetErrorLabel=Impossible to perform the operation, a network error occurred. fullResetRequested=A reset link was sent to the owner of the license/transaction. BlueGriffon must now restart. fullResetInvalid=The transaction ID is invalid. ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/prefs/newPage.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/prefs/osx.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.properties ================================================ NoMainWindowAvaialble=Kan inte redigera tangentbordsgenvägar PleaseOpenOneMainWindow=Åtminstone ett BlueGriffon-huvudfönster måste vara öppnat för att redigera tangentbordsgenvägar. ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/prefs/source.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/prefs/styles.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/prefs/update.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/prefs/update.properties ================================================ SoftwareUpdates=Programuppdateringar UnableToCheck=Det g\u00e5r inte att kontrollera tillg\u00e4nglighet f\u00f6r uppdateringar UpToDate=BlueGriffon \u00e4r uppdaterat ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/prefs.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/propertiesDeck.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/rotator.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/spellCheck.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/spellCheck.properties ================================================ CorrectSpelling=(korrekt stavning) NoSuggestedWords=(inga f\u00f6reslagna ord) NoMisspelledWord=Inga felstavade ord CheckSpellingDone=Stavningskontrollen \u00e4r f\u00e4rdig. CheckSpelling=Kontrollera stavning ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/structurebar.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/svg-edit.properties ================================================ SvgEdit=SVG Edit ConfirmClose=Det finns osparade \u00e4ndringar, vill du verkligen st\u00e4nga SVG Edit? ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/tabeditor.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/updateAvailable.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/bluegriffon/updates.properties ================================================ update.checkInsideButton.label=Sök efter uppdateringar update.checkInsideButton.accesskey=S update.resumeButton.label=Återuppta hämtningen av %S… update.resumeButton.accesskey=Å update.openUpdateUI.applyButton.label=Installera uppdateringen… update.openUpdateUI.applyButton.accesskey=I update.restart.applyButton.label=Installera uppdateringen update.restart.applyButton.accesskey=I update.openUpdateUI.upgradeButton.label=Uppgradera nu… update.openUpdateUI.upgradeButton.accesskey=U update.restart.upgradeButton.label=Uppgradera nu update.restart.upgradeButton.accesskey=U ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/branding/brand.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/base/locale/branding/brand.properties ================================================ brandShortName=BlueGriffon brandFullName=BlueGriffon vendorShortName=Disruptive Innovations sidebarName=Sidebar ================================================ FILE: locales/sv-SE/bluegriffon/extensions/fs/addFont.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/extensions/fs/fs.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/extensions/fs/fs.properties ================================================ SelectDir=V\u00e4lj en katalog att packa upp teckensnittspaketet i SelectFile=V\u00e4lj ett befintlig teckensnittspakets stylesheet.css Stylesheet=Ett FontSquirrel-pakets stylesheet MustBeSavedTitle=Dokumentet har aldrig varit sparat MustBeSavedMessage=Du m\u00e5ste spara filen minst en g\u00e5ng innan du f\u00f6rs\u00f6ker koppla ihop ett lokalt typsnitt med hj\u00e4lp av en relativ URL. V\u00e4nligen st\u00e4ng dokumentet och \u00f6ppna det igen efter att du har sparat det. ================================================ FILE: locales/sv-SE/bluegriffon/extensions/fs/fsOverlay.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/extensions/gfd/addFont.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/extensions/gfd/gfd.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/extensions/gfd/gfdOverlay.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/extensions/markdown/markdown.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/extensions/markdown/markdownOverlay.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/extensions/op1/a11yFirstStep.properties ================================================ ConformingDTDSyntax=Anv\u00e4nd en W3C-anpassad DTD-syntax innan html-elementet NoWrongSyntaxOrNonConformingHierarchy=Anv\u00e4nd inte felaktigt attribut syntax eller icke-anpassad elementhierarki inuti html-elementet OneTitleInHead=Anv\u00e4nd ett title-element som barn till head-elementet NoEmptyTitle=N\u00e4r du tillhandah\u00e5llet ett title-element, l\u00e4mna det inte tomt NoMetaRefresh=Anv\u00e4nd inte ett meta-element med ett http-equiv-attribut och ett v\u00e4rde likamed uppdatering HTMLElementHasLangAttribute=Anv\u00e4nd lang-attribut till html-elementet HTMLElementHasValidLangAttribute=Anv\u00e4nd en godk\u00e4nd spr\u00e5kkod f\u00f6r lang-attributet NoInvalidDir=Anv\u00e4nd inte ett v\u00e4rde annat \u00e4n ltr, rtl eller tomt f\u00f6r dir-attributet TitleForFrames=Anv\u00e4nd title-attributet f\u00f6r varje frame-element NoEmptyTitleForFrames=N\u00e4r du tillhandah\u00e5ller ett title-attribut till frame-element, l\u00e4mna det inte tomt TitleForIFrames=Anv\u00e4nd title-attribut f\u00f6r varje iframe-element NoEmptyTitleForIFrames=N\u00e4r du tillhandah\u00e5ller ett title-attribut till iframe-element, l\u00e4mna det inte tomt AtLeastOneH1InBody=Det m\u00e5ste finnas \u00e5tminstone ett h1-element inuti (oavsett niv\u00e5) body-elementet NoEmptyH1=N\u00e4r du tillhandah\u00e5ller ett h1-element, l\u00e4mna det inte tomt NoEmptyH2=N\u00e4r du tillhandah\u00e5ller ett h2-element, l\u00e4mna det inte tomt NoEmptyH3=N\u00e4r du tillhandah\u00e5ller ett h3-element, l\u00e4mna det inte tomt NoEmptyH4=N\u00e4r du tillhandah\u00e5ller ett h4-element, l\u00e4mna det inte tomt NoEmptyH5=N\u00e4r du tillhandah\u00e5ller ett h5-element, l\u00e4mna det inte tomt NoEmptyH6=N\u00e4r du tillhandah\u00e5ller ett h6-element, l\u00e4mna det inte tomt H2Order=Anv\u00e4nd ett h1, h2, h3, h4, h5 eller h6-element som f\u00f6rsta rubrik innan ett h2-element i k\u00e4llordningen H3Order=Anv\u00e4nd ett h2, h3, h4, h5 eller h6-element som f\u00f6rsta rubrik innan ett h3-element i k\u00e4llordningen H4Order=Anv\u00e4nd ett h3, h4, h5 eller h6-element som f\u00f6rsta rubrik innan ett h4-element i k\u00e4llordningen H5Order=Anv\u00e4nd ett h4, h5 eller h6-element som f\u00f6rsta rubrik innan ett h5-element i k\u00e4llordningen H6Order=Anv\u00e4nd ett h5 eller h6-element som f\u00f6rsta rubrik innan ett h6-element i k\u00e4llordningen DTAsFirstChildOfDL=Anv\u00e4nd dt-element som f\u00f6rsta barn till ett dl-element NoEmptyLI=N\u00e4r du anv\u00e4nder ett li-element l\u00e4mna det inte tomt NoAlignAttribute=Anv\u00e4nd inte align-attributet NoXmpElement=Anv\u00e4nd inte xmp-elementen NoEmptyP=N\u00e4r du anv\u00e4nder ett p-element l\u00e4mna det inte tomt NoEmptyAExceptAnchors=N\u00e4r du anv\u00e4nder ett a-element l\u00e4mna det inte tomt, f\u00f6rutom om det anv\u00e4nds som ett ankare NoEmptyButton=N\u00e4r du tillhandah\u00e5ller ett button-element, l\u00e4mna det inte tomt NoVlinkAttribute=Anv\u00e4nd inte vlink-attributet NoTextAttribute=Anv\u00e4nd inte text-attributet NoLinkAttribute=Anv\u00e4nd inte link-attributet noImgWithoutAlt=Anv\u00e4nd alt-attributet f\u00f6r varje img-element noAreaWithoutAlt=Anv\u00e4nd alt-attributet f\u00f6r varje area-element noAppletWithoutAlt=Anv\u00e4nd alt-attributet f\u00f6r varje applet-element noImageInputWithoutAlt=Anv\u00e4nd alt-attributet f\u00f6r varje input type=image-element noEmptyAltForImageLoneChildOfAnchorOrButton=Om img-elementet \u00e4r det enda barnet till ett button- eller a-element, l\u00e4mna inte dess alt-attribut tomt noEmptyAltForInputImage=N\u00e4r du tillhandah\u00e5ller ett alt-attribut f\u00f6r ett input type=image-element, l\u00e4mna det inte tomt noEmptyAltForAreaWithHref=N\u00e4r du tillhandah\u00e5ller ett alt-attribut till ett area-element som h\u00e5ller ett href-attribut, l\u00e4mna det inte tomt noAltSimilarToTextContent=Om ett img-element \u00e4r barn till ett a-element med text, anv\u00e4nd inte samma text f\u00f6r dess alt-attribut som texten inuti a-elementet noBorderAttribute=Anv\u00e4nd inte border-attributet noSimilarAltForAreasWithDifferentHref=Anv\u00e4nd inte samma v\u00e4rde f\u00f6r alt-attribut f\u00f6r flera area-element som har olika href-v\u00e4rden LongdescIsURI=Anv\u00e4nd en URI som v\u00e4rde p\u00e5 longdesc- attribut noBackgroundAttribute=Anv\u00e4nd inite background-attribut noBgsoundElement=Anv\u00e4nd inte bgsound-element TablesWithAtLeastOneTHHaveACaption=Anv\u00e4nd ett caption-element som f\u00f6rsta barn till ett table-element som inneh\u00e5ller \u00e5tminstone ett th-element CaptionIsDifferentFromSummaryAttribute=Anv\u00e4nd inte samma inneh\u00e5ll f\u00f6r ett caption-element och ett summary-attribut noEmptyCaption=N\u00e4r du tillhandah\u00e5ller ett caption-element, l\u00e4mna det inte tomt noCaptionInATableWithOnlyTDs=Anv\u00e4nd inte ett caption-element i ett table-element som bara inneh\u00e5ller td-element noAlinkAttribute=Anv\u00e4nd inte alink-attribut noSummaryAttributeSimilarToCaption=Anv\u00e4nd inte samma inneh\u00e5ll f\u00f6r ett summary-attribut och ett caption-element noEmptySummaryIfTableHasTHOrCaption=N\u00e4r du anv\u00e4nder summary-attributet f\u00f6r ett table-element som inneh\u00e5ller ett th- eller ett caption-element, l\u00e4mna det inte tomt noSummaryAttributeIfOnlyTDs=Anv\u00e4nd inte summary-attribut i ett table-element som bara inneh\u00e5ller td-element noStrikeElement=Anv\u00e4nd inte strike-elementet noListingElement=Anv\u00e4nd inte listing-elementet AtLeastOneTHIfCaptionOrSummary=Anv\u00e4nd \u00e5tminstone ett th-element inuti varje table-element som har ett caption-element eller ett icke-tomt summary-attribut AllNonEmptyTHHaveScopeOrId=Anv\u00e4nd ett scope- eller id-attribut f\u00f6r varje icke-tomt th-element ScopeAttributeIsRowOrCol=Anv\u00e4nd inte ett v\u00e4rde annat \u00e4n row eller col f\u00f6r scope-attributet noBgcolorAttribute=Anv\u00e4nd inte bgcolor-attributet noTTElement=Anv\u00e4nd inte tt-elementet TDHaveHeadersAttributeIfTHHasId=Anv\u00e4nd ett headers-attribut f\u00f6r varje td-element om det tillh\u00f6rande th-element har ett id-attribut noPlaintextElement=Anv\u00e4nd inte plaintext-elementet noHeadersAttributeThatIsNotATHId=Anv\u00e4nd inte ett v\u00e4rde p\u00e5 ett headers-attribut sin matchar ett id-attribut som anv\u00e4nds f\u00f6r ett td i table-elementet AllFormsHaveAButton=Anv\u00e4nd en button, eller en inmatning av type submit, image eller button inuti ett form-element SubmitButtonsHaveNonEmptyValue=N\u00e4r du tillhandah\u00e5ller en input type=submit, l\u00e4mna inte dess value-attribut tomt noMarqueeElement=Anv\u00e4nd inte marquee-elementet FieldsetHasALegend=Anv\u00e4nd ett legend-element som barn till varje fieldset-element FieldsetsAreInForms=Anv\u00e4nd inte ett fieldset-element utan ett form-element noEmptyLegendElement=N\u00e4r du tillhandah\u00e5ller ett legend-element, l\u00e4mna det inte tomt LabelElementHasForAttribute=Anv\u00e4nd for-attributet f\u00f6r varje label-element noEmptyForAttributeOnLabel=N\u00e4r du tillhandah\u00e5ller ett for-attribut f\u00f6r ett label-element, l\u00e4mna det inte tomt ForAttributeMatchesAnIdInSameForm=Ett for-attribut m\u00e5ste ha ett v\u00e4rde som matchar ett id-attribut inuti form-elementet OptgroupElementHasALabel=Anv\u00e4nd label-attributet f\u00f6r varje optgroup-element NoSimilarLabelInOptgroupsOfSameSelect=Anv\u00e4nd inte samma label-attribut f\u00f6r olika optgroup-element i samma select-element noEmptyLabelAttributeOnOptgroup=N\u00e4r du tillhandah\u00e5ller ett label-attribut f\u00f6r ett optgroup-element, l\u00e4mna det inte tomt noBasefontElement=Anv\u00e4nd inte basefont-elementet noBlinkElement=Anv\u00e4nd inte blink-elementet noCenterElement=Anv\u00e4nd inte center-elementet noFontElement=Anv\u00e4nd inte font-elementet ================================================ FILE: locales/sv-SE/bluegriffon/extensions/op1/op1.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/extensions/op1/op1Overlay.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/extensions/tipoftheday/tipoftheday.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/extensions/tipoftheday/tipoftheday.rdf ================================================ %brandDTD; ]> &brandShortName;-tips http://bluegriffon.org/ &brandShortName;s arkiv med Dagens tips sv-se …&brandShortName; är "korsplattform"? …&brandShortName; finns på en rad olika operativsystem, inklusive Windows, Mac OS X, och många olika varianter av Linux, OS/2 … …&brandShortName; visar titeln på alla osparade sidor med röd skugga? Nu kan du spara filer från vilket visningsläge som helst. …du har direktåtkomst till &brandShortName;-gemenskapen? Välj bara “Hjälp > Användargrupp”. …du kan infoga HTML5-element enkelt? Välj bara “Infoga > HTML5-element”. …du kan stänga aktuell flik med en tangent? Ctrl+w (Kommando +w på Mac OS X) stänger den aktuella fliken. …du kan öppna en ny flik med en tangentkombination? Ctrl+n (Kommando +n på Mac OS X) skapar en ny tom flik med samma doctype som den senast skapade. …you can revert to a previously saved version of the currently edited document? Righ-click (context-click on Mac OS X) on the document's tab and select the Revert menu. …du kan publicera sidor direkt från &brandShortName; Installera först det fria tillägget FireFTP och ställ in det. Det kommer sedan finnas tillgängligt i Verktyg-menyn. …&brandShortName; lätt kan infoga vilket tecken som helst? Använd “Infoga > Tecken och symboler”. Du kan sedan söka efter vilket Unicode-tecken som helst, med namn eller så öppnar du ett block för att inspektera det. …&brandShortName; kör stavningskontroll som standard? Högerklicka på ett ord för att hitta förslag. Stäng av eller sätt på stavningskontroll med “Verktyg > Inställningar > Allmänt” . …&brandShortName; kan välja element tillförlitligt? Klicka helt enkelt på dess namn i strukturfältet. …du kan flytta ett element i ditt dokument med hjälp av musen? Välj det först så som beskrivet i föregående tips, och dra det sedan dit du vill ha det. …du kan snabbt öppna existerande sidor? Betaltillägget "Project manager" ger snabbåtkomst till sidor och bilder som organiserats som ett projekt. …du kan välja din standardwebbläsare? Använd “Verktyg > Inställningar > Avancerat > Återställ inställningar för extern webbläsare”. Nästa gång du öppnar den externa webbläsaren får du välja en ny. …&brandShortName; låter dig använda externa stilmallar? För att skapa en redo att användas, klicka på “Paneler > Stilmallar”. Klicka på plustecknet och välj “Länkad till dokumentet”. …&brandShortName; kan hantera stilmallar och komplexa selektorer? Genom att använda CSS Pro Editor (en betaltillägg) kan du ändra ordningen på och lägga till titlar och rel-attribut till stilmallar, och utveckla komplexa CSS 2 och 3-selektorer med avancerad hjälp. …paneler kan storleksändras? Dra i handtaget i nedre högra hörnet till önskad storlek. …attribut kan läggas till varje element? Öppna “Paneler > DOM-utforskare”. Klicka på elementet i wysiwyg-vyn, använd Attribut-fliken och klicka på plustecknet. …&brandShortName; kan hantera CSS3-egenskaper? Specifika prefix kommer läggas till för webbläsare som behöver det. …du kan ställa in tangentbordsgenvägar efter eget tycke? Varje menyalternativ kan tilldelas en tangent efter ditt tycke. Öppna “Verktyg > Inställningar > Tangentbordsgenvägar”. Leta reda och dubbelklicka på det önskade kommandot. I det nya fönstret trycker du in genvägen. …du kan ta bort en klass från ett element? Markera bara elementet och i Klass-listrutan väljer du klassen igen. ================================================ FILE: locales/sv-SE/bluegriffon/extensions/tipoftheday/tipofthedayOverlay.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/aria/aria.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/aria/aria.properties ================================================ mustBeContainedIn=must be contained in or= or ok=OK mustContain=must contain and= and deprecated=deprecated missingTextbox=missing textbox missingListboxTreeGridDialog=missing listbox, tree, grid or dialog ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/aria/ariaOverlay.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/cssproperties/backgrounditem.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/cssproperties/backgrounditem.properties ================================================ backgroundColorTitle=F\u00e4rg backgroundImageTitle=Bild backgroundLinearGradientTitle=Linj\u00e4r \u00f6vertoning backgroundRadialGradientTitle=Radiell \u00f6vertoning ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/cssproperties/colorstopitem.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/cssproperties/cssproperties.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/cssproperties/cssproperties.properties ================================================ EnterAnId=V\u00e4nligen skriv in ett ID EnterUniqueId=Du m\u00e5ste ange ett unikt ID f\u00f6r elementet: NoClasSelected=Du m\u00e5ste v\u00e4lja ett klassnamn PleaseSelectAClass=En klass m\u00e5ste v\u00e4ljas f\u00f6r att till\u00e4mpa den beg\u00e4rda \u00e4ndringen ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/cssproperties/csspropertiesOverlay.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/cssproperties/editGridTemplate.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/cssproperties/fontFeatures.properties ================================================ FFaalt=Tillgå alla alternativ FFcalt=Kontextuella alternativ FFsalt=Stilistiska alternativ FFliga=Standardligaturer FFclig=Kontextuella ligaturer FFdlig=Alternativa ligaturer FFhist=Historiska former FFhlig=Historiska ligaturer FFunic=Gemensam typografisk höjd FFsmcp=Kapitäler FFc2sc=Kapitäler från versaler FFc2pc=Petita kapitäler från versaler FFpcap=Petita kapitäler FFcase=Skiftlägeskänslig form FFcpsp=Versalavstånd FFtitl=Textning FFswsh=Slängar FFcswh=Kontextuella slängar FFfrac=Bråk FFafrc=Alternativa bråk FFordn=Ordningstal FFnumr=Täljare FFdnom=Nämnare FFsinf=Vetenskapliga underordnade FFsups=Upphöjda FFsubs=Nedsänkta FFonum=Gammeldags siffror FFlnum=Versala siffror FFpnum=Proportionerliga siffror FFtnum=Siffror i tabellform FFzero=Skuren nolla FFmgrk=Grekiska matematikbokstäver FFnalt=Alternativ noteringsform FFornm=Ornament FFlocl=Lokalanpassad form FFsize=Optisk storlek FFisol=Isolerad form FFinit=Initialform FFmedi=Mittenform FFfinal=Slutform FFrlig=Obligatorisk ligatur FFccmp=Sammansättning/sönderdelning av glyf FFmark=Tecken-till-bas-positionering FFmkmj=Tecken-till-tecken-positionering FFhwid=Halvbredd ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/cssproperties/griditemposition.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/cssproperties/textshadowitem.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/cssproperties/transformationitem.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/cssproperties/transitionitem.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/domexplorer/domexplorer.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/domexplorer/domexplorerOverlay.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/its20/its20.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/its20/its20.properties ================================================ LoadError=Inladdningsfel InlineParseError=Inline-resursen är inte ett ITS 2.0-dokument CannotFetch=Kan inte hämta URL NotITS=Resursen är inte ett ITS 2.0-dokument TranslatableByGlobalRule=Översättningsbar genom global regel NotTranslatableByGlobalRule=Ej översättningsbar genom global regel InlineRules=Inline-regler translateRule=Översätt locNoteRule=Översättningssanteckning termRule=Terminologi dirRule=Skrivriktningsregel langRule=Språkinformation withinTextRule=Element inuti text domainRule=Domän textAnalysisRule=Textanalys localeFilterRule=Språkregionsfilter provRule=Ursprung externalResourceRefRule=Extern resurs targetPointerRule=Målpekare idValueRule=Id-värde preserveSpaceRule=Behåll mellanrum locQualityIssueRule=Kvalitetsfråga på översättning mtConfidenceRule=Tillförsikt i maskinöversättning allowedCharactersRule=Tillåtna tecken storageSizeRule=Lagringsstorlek DontWarnAgainForUrl=Varna mig inte igen för denna URL DontWarnAgainForInline=Varna mig inte igen för globala inline-regler NewITSFile=Ny ITS 2.0-fil CannotResolveXPath=Kan inte lösa följande XPath-selector (odeklarerat HTML-namespace?): XPathParsingError=XPath-parsningsfel DontWarnAgainForSelector=Varna mig inte igen för denna selector CSSParsingError=CSS-parsningsfel CannotResolveCSS=Kan inte lösa följande CSS-selector: ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/its20/its20Overlay.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/its20/locNoteRule.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/its20/selector.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/its20/termRule.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/its20/translateRule.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/scripteditor/editor.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/scripteditor/scripteditor.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/scripteditor/scripteditor.properties ================================================ ConfirmDeletionTitle=Ta bort script ConfirmDeletion=\u00c4r du s\u00e4ker p\u00e5 att du vill ta bort detta script? AddExternalScriptTitle=L\u00e4gg till ett externt script PromptScriptURL=URL f\u00f6r detta script? ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/scripteditor/scripteditorOverlay.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/stylesheets/editor.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/stylesheets/stylesheets.dtd ================================================ ================================================ FILE: locales/sv-SE/bluegriffon/sidebars/stylesheets/stylesheetsOverlay.dtd ================================================ ================================================ FILE: locales/sv-SE/cssproperties.mn ================================================ bluegriffon-sv-SE.jar: % locale cssproperties sv-SE %locale/sv-SE/cssproperties/ locale/sv-SE/cssproperties/csspropertiesOverlay.dtd (locale/sv-SE/csspropertiesOverlay.dtd) locale/sv-SE/cssproperties/cssproperties.dtd (locale/sv-SE/cssproperties.dtd) locale/sv-SE/cssproperties/editGridTemplate.dtd (locale/sv-SE/editGridTemplate.dtd) locale/sv-SE/cssproperties/backgrounditem.dtd (locale/sv-SE/backgrounditem.dtd) locale/sv-SE/cssproperties/griditemposition.dtd (locale/sv-SE/griditemposition.dtd) locale/sv-SE/cssproperties/transformationitem.dtd (locale/sv-SE/transformationitem.dtd) locale/sv-SE/cssproperties/transitionitem.dtd (locale/sv-SE/transitionitem.dtd) locale/sv-SE/cssproperties/textshadowitem.dtd (locale/sv-SE/textshadowitem.dtd) locale/sv-SE/cssproperties/colorstopitem.dtd (locale/sv-SE/colorstopitem.dtd) locale/sv-SE/cssproperties/backgrounditem.properties (locale/sv-SE/backgrounditem.properties) locale/sv-SE/cssproperties/cssproperties.properties (locale/sv-SE/cssproperties.properties) locale/sv-SE/cssproperties/fontFeatures.properties (locale/sv-SE/fontFeatures.properties) ================================================ FILE: locales/sv-SE/domexplorer.mn ================================================ bluegriffon-sv-SE.jar: % locale domexplorer sv-SE %locale/sv-SE/domexplorer/ locale/sv-SE/domexplorer/domexplorerOverlay.dtd (locale/sv-SE/domexplorerOverlay.dtd) locale/sv-SE/domexplorer/domexplorer.dtd (locale/sv-SE/domexplorer.dtd) ================================================ FILE: locales/sv-SE/fs.mn ================================================ fs-sv-SE.jar: % locale fs sv-SE %locale/sv-SE/fs/ locale/sv-SE/fs/fsOverlay.dtd (locale/sv-SE/fsOverlay.dtd) locale/sv-SE/fs/fs.dtd (locale/sv-SE/fs.dtd) locale/sv-SE/fs/fs.properties (locale/sv-SE/fs.properties) locale/sv-SE/fs/addFont.dtd (locale/sv-SE/addFont.dtd) ================================================ FILE: locales/sv-SE/gfd.mn ================================================ gfd-sv-SE.jar: % locale gfd sv-SE %locale/sv-SE/gfd/ locale/sv-SE/gfd/gfdOverlay.dtd (locale/sv-SE/gfdOverlay.dtd) locale/sv-SE/gfd/gfd.dtd (locale/sv-SE/gfd.dtd) locale/sv-SE/gfd/addFont.dtd (locale/sv-SE/addFont.dtd) ================================================ FILE: locales/sv-SE/its20.mn ================================================ bluegriffon-sv-SE.jar: % locale its20 sv-SE %locale/sv-SE/its20/ locale/sv-SE/its20/its20Overlay.dtd (locale/sv-SE/its20Overlay.dtd) locale/sv-SE/its20/its20.properties (locale/sv-SE/its20.properties) locale/sv-SE/its20/its20.dtd (locale/sv-SE/its20.dtd) locale/sv-SE/its20/translateRule.dtd (locale/sv-SE/translateRule.dtd) locale/sv-SE/its20/locNoteRule.dtd (locale/sv-SE/locNoteRule.dtd) locale/sv-SE/its20/termRule.dtd (locale/sv-SE/termRule.dtd) locale/sv-SE/its20/selector.dtd (locale/sv-SE/selector.dtd) ================================================ FILE: locales/sv-SE/markdown.mn ================================================ markdown-sv-SE.jar: % locale markdown sv-SE %locale/sv-SE/markdown/ locale/sv-SE/markdown/markdownOverlay.dtd (locale/sv-SE/markdownOverlay.dtd) locale/sv-SE/markdown/markdown.dtd (locale/sv-SE/markdown.dtd) ================================================ FILE: locales/sv-SE/op1.mn ================================================ op1-sv-SE.jar: % locale op1 sv-SE %locale/sv-SE/op1/ locale/sv-SE/op1/op1Overlay.dtd (locale/sv-SE/op1Overlay.dtd) locale/sv-SE/op1/op1.dtd (locale/sv-SE/op1.dtd) locale/sv-SE/op1/a11yFirstStep.properties (locale/sv-SE/a11yFirstStep.properties) ================================================ FILE: locales/sv-SE/scripteditor.mn ================================================ bluegriffon-sv-SE.jar: % locale scripteditor sv-SE %locale/sv-SE/scripteditor/ locale/sv-SE/scripteditor/scripteditorOverlay.dtd (locale/sv-SE/scripteditorOverlay.dtd) locale/sv-SE/scripteditor/scripteditor.dtd (locale/sv-SE/scripteditor.dtd) locale/sv-SE/scripteditor/scripteditor.properties (locale/sv-SE/scripteditor.properties) locale/sv-SE/scripteditor/editor.dtd (locale/sv-SE/editor.dtd) ================================================ FILE: locales/sv-SE/stylesheets.mn ================================================ bluegriffon-sv-SE.jar: % locale stylesheets sv-SE %locale/sv-SE/stylesheets/ locale/sv-SE/stylesheets/stylesheetsOverlay.dtd (locale/sv-SE/stylesheetsOverlay.dtd) locale/sv-SE/stylesheets/stylesheets.dtd (locale/sv-SE/stylesheets.dtd) locale/sv-SE/stylesheets/editor.dtd (locale/sv-SE/editor.dtd) ================================================ FILE: locales/sv-SE/tipoftheday.mn ================================================ tipoftheday-sv-SE.jar: % locale tipoftheday sv-SE %locale/sv-SE/tipoftheday/ locale/sv-SE/tipoftheday/tipoftheday.dtd (locale/sv-SE/tipoftheday.dtd) locale/sv-SE/tipoftheday/tipofthedayOverlay.dtd (locale/sv-SE/tipofthedayOverlay.dtd) locale/sv-SE/tipoftheday/tipoftheday.rdf (locale/sv-SE/tipoftheday.rdf) ================================================ FILE: locales/zh-CN/aria.mn ================================================ bluegriffon-zh-CN.jar: % locale aria zh-CN %locale/zh-CN/aria/ locale/zh-CN/aria/ariaOverlay.dtd (locale/zh-CN/ariaOverlay.dtd) locale/zh-CN/aria/aria.dtd (locale/zh-CN/aria.dtd) locale/zh-CN/aria/aria.properties (locale/zh-CN/aria.properties) ================================================ FILE: locales/zh-CN/base.mn ================================================ bluegriffon-zh-CN.jar: % locale bluegriffon zh-CN %locale/zh-CN/bluegriffon/ % locale branding zh-CN %locale/zh-CN/branding/ locale/zh-CN/bluegriffon/aboutDialog.dtd (locale/zh-CN/bluegriffon/aboutDialog.dtd) locale/zh-CN/bluegriffon/bluegriffon.dtd (locale/zh-CN/bluegriffon/bluegriffon.dtd) locale/zh-CN/bluegriffon/polyglot.dtd (locale/zh-CN/bluegriffon/polyglot.dtd) locale/zh-CN/bluegriffon/findbar.dtd (locale/zh-CN/bluegriffon/findbar.dtd) locale/zh-CN/bluegriffon/bluegriffon.properties (locale/zh-CN/bluegriffon/bluegriffon.properties) locale/zh-CN/bluegriffon/colourPicker.dtd (locale/zh-CN/bluegriffon/colourPicker.dtd) locale/zh-CN/bluegriffon/credits.dtd (locale/zh-CN/bluegriffon/credits.dtd) locale/zh-CN/bluegriffon/filepickerbutton.dtd (locale/zh-CN/bluegriffon/filepickerbutton.dtd) locale/zh-CN/bluegriffon/filePicking.dtd (locale/zh-CN/bluegriffon/filePicking.dtd) locale/zh-CN/bluegriffon/insertTable.dtd (locale/zh-CN/bluegriffon/insertTable.dtd) locale/zh-CN/bluegriffon/insertTable.properties (locale/zh-CN/bluegriffon/insertTable.properties) locale/zh-CN/bluegriffon/language.properties (locale/zh-CN/bluegriffon/language.properties) locale/zh-CN/bluegriffon/languages.dtd (locale/zh-CN/bluegriffon/languages.dtd) locale/zh-CN/bluegriffon/markupCleaner.dtd (locale/zh-CN/bluegriffon/markupCleaner.dtd) locale/zh-CN/bluegriffon/openLocation.dtd (locale/zh-CN/bluegriffon/openLocation.dtd) locale/zh-CN/bluegriffon/openLocation.properties (locale/zh-CN/bluegriffon/openLocation.properties) locale/zh-CN/bluegriffon/newPageWizard.dtd (locale/zh-CN/bluegriffon/newPageWizard.dtd) locale/zh-CN/bluegriffon/newPageWizard.properties (locale/zh-CN/bluegriffon/newPageWizard.properties) locale/zh-CN/bluegriffon/propertiesDeck.dtd (locale/zh-CN/bluegriffon/propertiesDeck.dtd) locale/zh-CN/bluegriffon/aria.dtd (locale/zh-CN/bluegriffon/aria.dtd) locale/zh-CN/bluegriffon/structurebar.dtd (locale/zh-CN/bluegriffon/structurebar.dtd) locale/zh-CN/bluegriffon/tabeditor.dtd (locale/zh-CN/bluegriffon/tabeditor.dtd) locale/zh-CN/bluegriffon/masterPasswordQuery.properties (locale/zh-CN/bluegriffon/masterPasswordQuery.properties) locale/zh-CN/bluegriffon/newDocument.dtd (locale/zh-CN/bluegriffon/newDocument.dtd) locale/zh-CN/bluegriffon/prefs/file.dtd (locale/zh-CN/bluegriffon/prefs/file.dtd) locale/zh-CN/bluegriffon/prefs/source.dtd (locale/zh-CN/bluegriffon/prefs/source.dtd) locale/zh-CN/bluegriffon/prefs/general.dtd (locale/zh-CN/bluegriffon/prefs/general.dtd) locale/zh-CN/bluegriffon/prefs/newPage.dtd (locale/zh-CN/bluegriffon/prefs/newPage.dtd) locale/zh-CN/bluegriffon/prefs/update.dtd (locale/zh-CN/bluegriffon/prefs/update.dtd) locale/zh-CN/bluegriffon/prefs/styles.dtd (locale/zh-CN/bluegriffon/prefs/styles.dtd) locale/zh-CN/bluegriffon/prefs/advanced.dtd (locale/zh-CN/bluegriffon/prefs/advanced.dtd) locale/zh-CN/bluegriffon/prefs/connection.dtd (locale/zh-CN/bluegriffon/prefs/connection.dtd) locale/zh-CN/bluegriffon/prefs/osx.dtd (locale/zh-CN/bluegriffon/prefs/osx.dtd) locale/zh-CN/bluegriffon/prefs/shortcuts.dtd (locale/zh-CN/bluegriffon/prefs/shortcuts.dtd) locale/zh-CN/bluegriffon/prefs/update.properties (locale/zh-CN/bluegriffon/prefs/update.properties) locale/zh-CN/bluegriffon/prefs/license.dtd (locale/zh-CN/bluegriffon/prefs/license.dtd) locale/zh-CN/bluegriffon/prefs/license.properties (locale/zh-CN/bluegriffon/prefs/license.properties) locale/zh-CN/bluegriffon/prefs/deactivateLicense.dtd (locale/zh-CN/bluegriffon/prefs/deactivateLicense.dtd) locale/zh-CN/bluegriffon/prefs.dtd (locale/zh-CN/bluegriffon/prefs.dtd) locale/zh-CN/bluegriffon/updateAvailable.dtd (locale/zh-CN/bluegriffon/updateAvailable.dtd) locale/zh-CN/bluegriffon/updates.properties (locale/zh-CN/bluegriffon/updates.properties) locale/zh-CN/branding/brand.dtd (locale/zh-CN/branding/brand.dtd) locale/zh-CN/branding/brand.properties (locale/zh-CN/branding/brand.properties) locale/zh-CN/bluegriffon/insertImage.dtd (locale/zh-CN/bluegriffon/insertImage.dtd) locale/zh-CN/bluegriffon/insertAnchor.dtd (locale/zh-CN/bluegriffon/insertAnchor.dtd) locale/zh-CN/bluegriffon/insertCommentOrPI.dtd (locale/zh-CN/bluegriffon/insertCommentOrPI.dtd) locale/zh-CN/bluegriffon/insertLink.dtd (locale/zh-CN/bluegriffon/insertLink.dtd) locale/zh-CN/bluegriffon/insertLink.properties (locale/zh-CN/bluegriffon/insertLink.properties) locale/zh-CN/bluegriffon/cssClassPicker.dtd (locale/zh-CN/bluegriffon/cssClassPicker.dtd) locale/zh-CN/bluegriffon/insertVideo.dtd (locale/zh-CN/bluegriffon/insertVideo.dtd) locale/zh-CN/bluegriffon/insertAudio.dtd (locale/zh-CN/bluegriffon/insertAudio.dtd) locale/zh-CN/bluegriffon/insertVideo.properties (locale/zh-CN/bluegriffon/insertVideo.properties) locale/zh-CN/bluegriffon/insertHTML.dtd (locale/zh-CN/bluegriffon/insertHTML.dtd) locale/zh-CN/bluegriffon/insertHR.dtd (locale/zh-CN/bluegriffon/insertHR.dtd) locale/zh-CN/bluegriffon/insertForm.dtd (locale/zh-CN/bluegriffon/insertForm.dtd) locale/zh-CN/bluegriffon/parsingError.dtd (locale/zh-CN/bluegriffon/parsingError.dtd) locale/zh-CN/bluegriffon/insertFormInput.dtd (locale/zh-CN/bluegriffon/insertFormInput.dtd) locale/zh-CN/bluegriffon/insertFieldset.dtd (locale/zh-CN/bluegriffon/insertFieldset.dtd) locale/zh-CN/bluegriffon/insertLabel.dtd (locale/zh-CN/bluegriffon/insertLabel.dtd) locale/zh-CN/bluegriffon/insertButton.dtd (locale/zh-CN/bluegriffon/insertButton.dtd) locale/zh-CN/bluegriffon/insertSelect.dtd (locale/zh-CN/bluegriffon/insertSelect.dtd) locale/zh-CN/bluegriffon/insertTextarea.dtd (locale/zh-CN/bluegriffon/insertTextarea.dtd) locale/zh-CN/bluegriffon/insertKeygen.dtd (locale/zh-CN/bluegriffon/insertKeygen.dtd) locale/zh-CN/bluegriffon/insertOutput.dtd (locale/zh-CN/bluegriffon/insertOutput.dtd) locale/zh-CN/bluegriffon/insertProgress.dtd (locale/zh-CN/bluegriffon/insertProgress.dtd) locale/zh-CN/bluegriffon/insertMeter.dtd (locale/zh-CN/bluegriffon/insertMeter.dtd) locale/zh-CN/bluegriffon/insertStylesheet.dtd (locale/zh-CN/bluegriffon/insertStylesheet.dtd) locale/zh-CN/bluegriffon/editStylesheet.dtd (locale/zh-CN/bluegriffon/editStylesheet.dtd) locale/zh-CN/bluegriffon/media.dtd (locale/zh-CN/bluegriffon/media.dtd) locale/zh-CN/bluegriffon/media.properties (locale/zh-CN/bluegriffon/media.properties) locale/zh-CN/bluegriffon/insertChars.dtd (locale/zh-CN/bluegriffon/insertChars.dtd) locale/zh-CN/bluegriffon/convertToTable.dtd (locale/zh-CN/bluegriffon/convertToTable.dtd) locale/zh-CN/bluegriffon/pageProperties.dtd (locale/zh-CN/bluegriffon/pageProperties.dtd) locale/zh-CN/bluegriffon/spellCheck.dtd (locale/zh-CN/bluegriffon/spellCheck.dtd) locale/zh-CN/bluegriffon/spellCheck.properties (locale/zh-CN/bluegriffon/spellCheck.properties) locale/zh-CN/bluegriffon/dictionary.dtd (locale/zh-CN/bluegriffon/dictionary.dtd) locale/zh-CN/bluegriffon/html5.properties (locale/zh-CN/bluegriffon/html5.properties) locale/zh-CN/bluegriffon/listProperties.dtd (locale/zh-CN/bluegriffon/listProperties.dtd) locale/zh-CN/bluegriffon/insertTOC.dtd (locale/zh-CN/bluegriffon/insertTOC.dtd) locale/zh-CN/bluegriffon/svg-edit.properties (locale/zh-CN/bluegriffon/svg-edit.properties) locale/zh-CN/bluegriffon/panels.dtd (locale/zh-CN/bluegriffon/panels.dtd) locale/zh-CN/bluegriffon/rotator.dtd (locale/zh-CN/bluegriffon/rotator.dtd) ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/aboutDialog.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/aria.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/bluegriffon.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/bluegriffon.properties ================================================ titleModifier=BlueGriffon # in the following string, %t represents the title of the page or its URL # and %b the titleModifier above titleFormat=%S - %S Unknown=[未知] NoClassAvailable=(无类) NoIdAvailable=(无 ID) DocumentTitle=页面标题 NeedDocTitle=请为当前页面输入标题。 DocTitleHelp=用于在窗口标题与书签中区分页面。 ExportToText=导出为文本 SaveDocumentAs=页面另存为 XHTMLfiles=XHTML 文件 untitled=无标题 SaveDocument=保存页面 SaveFileFailed=保存文件失败! ExportToText=导出为文本 FileNotSaved=文件尚未保存! SaveFileBeforeClosing=您是否希望在关闭该标签之前保存文件? YesSaveFile=是,保存 NoDiscardChanges=否,抛弃更改 DontCloseTab=不要关闭标签! IdAlreadyTaken=该 ID 已在文档中使用 RemoveIdFromElement=您是希望将该 ID 从使用它的元素中移除,还是希望取消操作? YesRemoveId=移除 ID NoCancel=取消 ReplaceAll=全部替换... ReplacedPart1=已替换 ReplacedPart2=处 AFileWasChanged=磁盘上的文件有变化 ReloadFile=磁盘上的文件 %S 已发生变化,BlueGriffon 需要重新加载它 DontAskForFileChangesAgain=以后不再显示本警告 AbandonChanges=要放弃"%title%"的更改,重新载入页面吗? RevertCaption=恢复到最近一次保存 HTMLCommentsInXHTMLTitle=XHTML 文档

      常规文本看起来将像这样!

      已访问过的链接看起来将像这样!

      活动链接看起来将像这样!

      ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/panels.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/parsingError.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/polyglot.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/prefs/advanced.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/prefs/connection.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/prefs/deactivateLicense.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/prefs/file.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/prefs/general.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/prefs/license.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/prefs/license.properties ================================================ activateWarning=BlueGriffon needs to restart to activate your license. Do you want to restart now? confirmRestart=Restart BlueGriffon? fullResetTitle=License activation reset fullResetErrorLabel=Impossible to perform the operation, a network error occurred. fullResetRequested=A reset link was sent to the owner of the license/transaction. BlueGriffon must now restart. fullResetInvalid=The transaction ID is invalid. ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/prefs/newPage.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/prefs/osx.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.properties ================================================ NoMainWindowAvaialble=无法编辑快捷键 PleaseOpenOneMainWindow=要编辑快捷键,请至少打开一个 BlueGriffon 主窗口。 ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/prefs/source.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/prefs/styles.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/prefs/update.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/prefs/update.properties ================================================ SoftwareUpdates=软件更新 UnableToCheck=无法检查可用性 UpToDate=BlueGriffon 已经最新 ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/prefs.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/propertiesDeck.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/rotator.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/spellCheck.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/spellCheck.properties ================================================ CorrectSpelling=(正确拼写) NoSuggestedWords=(无单词建议) NoMisspelledWord=无错误拼写单词 CheckSpellingDone=拼写检查已完成。 CheckSpelling=检查拼写 ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/structurebar.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/svg-edit.properties ================================================ SvgEdit=SVG 编辑 ConfirmClose=有变更尚未保存,是否确实要关闭 SVG Edit? ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/tabeditor.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/updateAvailable.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/bluegriffon/updates.properties ================================================ update.checkInsideButton.label=检查更新 update.checkInsideButton.accesskey=C update.resumeButton.label=恢复下载 %S… update.resumeButton.accesskey=D update.openUpdateUI.applyButton.label=应用更新… update.openUpdateUI.applyButton.accesskey=A update.restart.applyButton.label=应用更新 update.restart.applyButton.accesskey=A update.openUpdateUI.upgradeButton.label=现在升级… update.openUpdateUI.upgradeButton.accesskey=U update.restart.upgradeButton.label=现在升级 update.restart.upgradeButton.accesskey=U ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/branding/brand.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/base/locale/branding/brand.properties ================================================ brandShortName=BlueGriffon brandFullName=BlueGriffon vendorShortName=Disruptive Innovations sidebarName=侧边栏 ================================================ FILE: locales/zh-CN/bluegriffon/extensions/fs/addFont.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/extensions/fs/fs.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/extensions/fs/fs.properties ================================================ SelectDir=选择用来解压字体包的目录 SelectFile=选择现有字体包的 styesheet.css Stylesheet=FontSquirrel 包的样式表 MustBeSavedTitle=文档从未保存 MustBeSavedMessage=您必须保存文件至少一次方可尝试使用相对 URL 链接到本地字体。请保存并关闭文档后重新打开它。 ================================================ FILE: locales/zh-CN/bluegriffon/extensions/fs/fsOverlay.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/extensions/gfd/addFont.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/extensions/gfd/gfd.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/extensions/gfd/gfdOverlay.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/extensions/markdown/markdown.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/extensions/markdown/markdownOverlay.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/extensions/op1/a11yFirstStep.properties ================================================ ConformingDTDSyntax=Use a W3C-conforming DTD syntax before the html element NoWrongSyntaxOrNonConformingHierarchy=Don't use wrong attribute syntax or non-conforming element hierarchy inside the html element OneTitleInHead=Use a title element as a child of the head element NoEmptyTitle=When you provide a title element, do not leave it empty NoMetaRefresh=Don't use a meta element with an http-equiv attribute and a value equal to refresh HTMLElementHasLangAttribute=Use the lang attribute for the html element HTMLElementHasValidLangAttribute=Use a valid language code for the lang attribute NoInvalidDir=Don't use a value other than ltr, rtl or empty for the dir attribute TitleForFrames=Use the title attribute for every frame element NoEmptyTitleForFrames=When you provide a title attribute for a frame element, do not leave it empty TitleForIFrames=Use the title attribute for every iframe element NoEmptyTitleForIFrames=When you provide a title attribute for an iframe element, do not leave it empty AtLeastOneH1InBody=There must be at least one h1 element inside (at any level) the body element NoEmptyH1=When you provide a h1 element, do not leave it empty NoEmptyH2=When you provide a h2 element, do not leave it empty NoEmptyH3=When you provide a h3 element, do not leave it empty NoEmptyH4=When you provide a h4 element, do not leave it empty NoEmptyH5=When you provide a h5 element, do not leave it empty NoEmptyH6=When you provide a h6 element, do not leave it empty H2Order=Use  a h1, h2, h3, h4, h5 or h6 element as a first heading before a h2 element in the source order H3Order=Use a h2, h3, h4, h5 or h6 element as a first heading before a h3 element in the source order H4Order=Use a h3, h4, h5 or h6 element as a first heading before a h4 element in the source order H5Order=Use a h4, h5 or h6 element as a first heading before a h5 element in the source order H6Order=Use a h5 or h6 element as a first heading before a h6 element in the source order DTAsFirstChildOfDL=Use a dt element as the first child of a dl element NoEmptyLI=When you provide a li element, do not leave it empty NoAlignAttribute=Don't use the align attribute NoXmpElement=Don't use the xmp element NoEmptyP=When you provide a p element, do not leave it empty NoEmptyAExceptAnchors=When you provide an a element, do not leave it empty except if it is used as an anchor NoEmptyButton=When you provide a button element, do not leave it empty NoVlinkAttribute=Don't use the vlink attribute NoTextAttribute=Don't use the text attribute NoLinkAttribute=Don't use the link attribute noImgWithoutAlt=Use the alt attribute for every img element noAreaWithoutAlt=Use the alt attribute for every area element noAppletWithoutAlt=Use the alt attribute for every applet element noImageInputWithoutAlt=Use the alt attribute for every input type=image element noEmptyAltForImageLoneChildOfAnchorOrButton=If the img element is the only child of a button or an a element, do not leave its alt attribute empty noEmptyAltForInputImage=When you provide an alt attribute for an input type=image element, do not leave it empty noEmptyAltForAreaWithHref=When you provide an alt attribute for an area element holding an href attribute, do not leave it empty noAltSimilarToTextContent=If an img element is a child of an a element with text, do not use the same text for its alt attribute as the text inside the a element noBorderAttribute=Don't use the border attribute noSimilarAltForAreasWithDifferentHref=Don't use the same value for alt attributes for multiple area elements with different href values LongdescIsURI=Use a URI as the value for a longdesc attribute noBackgroundAttribute=Don't use the background attribute noBgsoundElement=Don't use the bgsound element TablesWithAtLeastOneTHHaveACaption=Use a caption element as the first child of a table element containing at least one th element CaptionIsDifferentFromSummaryAttribute=Don't use the same content for a caption element and a summary attribute noEmptyCaption=When you provide a caption element, do not leave it empty noCaptionInATableWithOnlyTDs=Don't use a caption element in a table element containing only td elements noAlinkAttribute=Don't use an alink attribute noSummaryAttributeSimilarToCaption=Don't use the same content for a summary attribute and a caption element noEmptySummaryIfTableHasTHOrCaption=When you provide a summary attribute for a table element containing a th or a caption element, do not leave it empty noSummaryAttributeIfOnlyTDs=Don't use a summary attribute on a table element containg only td elements noStrikeElement=Don't use the strike element noListingElement=Don't use the listing element AtLeastOneTHIfCaptionOrSummary=Use at least one th element inside a table element with a caption element or a non-empty summary attribute AllNonEmptyTHHaveScopeOrId=Use a scope or id attribute for every non-empty th element ScopeAttributeIsRowOrCol=Don't use a value other than row or col for the scope attribute noBgcolorAttribute=Don't use the bgcolor attribute noTTElement=Don't use the tt element TDHaveHeadersAttributeIfTHHasId=Use a headers attribute on every td element if the corresponding th element has an id attribute noPlaintextElement=Don't use the plaintext element noHeadersAttributeThatIsNotATHId=Don't use for a headers attribute a value which matches an id attribute used for a td of the table element AllFormsHaveAButton=Use a button, or an input of type submit, image or button inside a form element SubmitButtonsHaveNonEmptyValue=When you provide an input type=submit, do not leave its value attribute empty noMarqueeElement=Don't use the marquee element FieldsetHasALegend=Use a legend element as a child of every fieldset element FieldsetsAreInForms=Don't use a fieldset element without a form element noEmptyLegendElement=When you provide a legend element, do not leave it empty LabelElementHasForAttribute=Use the for attribute for every label element noEmptyForAttributeOnLabel=When you provide a for attribute for a label element, do not leave it empty ForAttributeMatchesAnIdInSameForm=A for attribute must have a value that matches an id attribute inside the form element OptgroupElementHasALabel=Use the label attribute for every optgroup element NoSimilarLabelInOptgroupsOfSameSelect=Don't use the same label attribute for different optgroup elements of the same select element noEmptyLabelAttributeOnOptgroup=When you provide a label attribute for an optgroup element, do not leave it empty noBasefontElement=Don't use the basefont element noBlinkElement=Don't use the blink element noCenterElement=Don't use the center element noFontElement=Don't use the font element ================================================ FILE: locales/zh-CN/bluegriffon/extensions/op1/op1.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/extensions/op1/op1Overlay.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/extensions/tipoftheday/tipoftheday.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/extensions/tipoftheday/tipoftheday.rdf ================================================ %brandDTD; ]> &brandShortName; 小贴士 http://bluegriffon.org/ &brandShortName; 每日小贴士存档 zh-CN …&brandShortName; 是跨平台软件? …&brandShortName; 支持众多操作系统,包括 Windows、Mac OS X、Linux 各发行版 以及 OS/2 … …&brandShortName; 以红色阴影显示未保存页面的标题? 您可以在任意视图模式保存文件。 …您可以一键直达 &brandShortName; 社区? 只需选择“帮助 > 用户社区”。 …您可以轻松插入 HTML5 元素? 只需选择“插入 > HTML5 元素”。 …您可以一键关闭当前标签页? Ctrl+w (Mac OS X 上是 命令+w) 可关闭当前标签页。 …您可以通过组合键创建新标签页? Ctrl+n (Mac OS X 上是 命令+n) 可新建空白标签页, 其 doctype 与所创建的前一标签页相同。 …you can revert to a previously saved version of the currently edited document? Righ-click (context-click on Mac OS X) on the document's tab and select the Revert menu. …您可以直接在 &brandShortName; 中发布页面 首先安装并配置免费的 FireFTP 扩展。 然后可以在“工具”菜单找到。 …&brandShortName; 可以轻松插入任意字符? 请使用“插入字符与符号”。然后可以按名称搜索任意 Unicode 字符,或按区块打开查找。 …&brandShortName; 默认支持拼写检查? 右键点击单词可查看建议。 可通过“工具 > 偏好设置 > 常规”切换开启或关闭。 …&brandShortName; 能够可靠地选取元素? 只需在结构栏点击其名称。 …您可以使用鼠标移动文档中的元素? 首先在结构栏选择元素,然后拖动到所需位置。 …您可以快速打开现有页面? 付费扩展“项目管理器” 允许即时访问以项目形式组织的页面与图像。 …您可以选择默认浏览器? 使用“工具 > 偏好设置 > 高级 > 重置外部浏览器设置”。即可在下次浏览时选择浏览器。 …&brandShortName; 允许使用外部样式表? 点击“面板 > 样式表”可创建可供使用的样式表。 点击加号并选择“链接到文档”。 …&brandShortName; 可以管理样式表与复杂选择器? 使用 CSS Pro Editor(付费扩展)可以调整样式表顺序、 添加标题与 rel 属性,以及在高级功能的辅助之下开发复杂的 CSS 2 或 3 选择器。 …面板尺寸可以调节? 拖动右下角的手柄区即调整为所需尺寸。 …属性可以添加到任意元素? 打开“面板 > DOM 浏览器”。在所见即所得视图下点击元素, 使用“属性”标签页进行选择,并点击加号。 …&brandShortName; 可以处理 CSS3 属性? 将自动添加浏览器所需的专有前缀。 …您可以自定义键盘快捷键? 任意菜单项都可以通过喜欢的快捷键使用。 打开“工具 > 偏好设置 > 键盘快捷键”,找到并双击所需命令。 在新窗口按下所需的快捷键。 …您可以从元素移除类? 只需选择元素,并在“类”下拉菜单中重新应用类。 ================================================ FILE: locales/zh-CN/bluegriffon/extensions/tipoftheday/tipofthedayOverlay.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/aria/aria.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/aria/aria.properties ================================================ mustBeContainedIn=must be contained in or= or ok=OK mustContain=must contain and= and deprecated=deprecated missingTextbox=missing textbox missingListboxTreeGridDialog=missing listbox, tree, grid or dialog ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/aria/ariaOverlay.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/cssproperties/backgrounditem.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/cssproperties/backgrounditem.properties ================================================ backgroundColorTitle=颜色 backgroundImageTitle=图像 backgroundLinearGradientTitle=线性渐变 backgroundRadialGradientTitle=辐射渐变 ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/cssproperties/colorstopitem.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/cssproperties/cssproperties.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/cssproperties/cssproperties.properties ================================================ EnterAnId=请输入 ID EnterUniqueId=您必须指定元素的唯一 ID: NoClasSelected=您必须选择类名 PleaseSelectAClass=必须选择用于应用所请求变更的类 ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/cssproperties/csspropertiesOverlay.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/cssproperties/editGridTemplate.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/cssproperties/fontFeatures.properties ================================================ FFaalt=Access all alternates FFcalt=Contextual alternates FFsalt=Stylistic alternates FFliga=Standard ligatures FFclig=Contextual ligatures FFdlig=Discretionary ligatures FFhist=Historical forms FFhlig=Historical ligatures FFunic=Unicase FFsmcp=Small capitals FFc2sc=Small capitals from capitals FFc2pc=Petite capitals from capitals FFpcap=Petite capitals FFcase=Case sensitive forms FFcpsp=Capital spacing FFtitl=Titling FFswsh=Swash FFcswh=Contextual swash FFfrac=Fractions FFafrc=Alternative fractions FFordn=Ordinals FFnumr=Numerators FFdnom=Denominators FFsinf=Scientific inferiors FFsups=Superscript FFsubs=Subscript FFonum=Oldstyle figures FFlnum=Lining Figures FFpnum=Proportional figures FFtnum=Tabular figures FFzero=Slashed zero FFmgrk=Mathematical greek FFnalt=Alternate annotation forms FFornm=Ornaments FFlocl=Localized forms FFsize=Optical size FFisol=Isolated forms FFinit=Initial forms FFmedi=Medial forms FFfinal=Final forms FFrlig=Requird ligatures FFccmp=Glyph composition/decomposition FFmark=Mark to base positioning FFmkmj=Mark to mark positioning FFhwid=Half widths ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/cssproperties/griditemposition.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/cssproperties/textshadowitem.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/cssproperties/transformationitem.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/cssproperties/transitionitem.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/domexplorer/domexplorer.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/domexplorer/domexplorerOverlay.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/its20/its20.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/its20/its20.properties ================================================ LoadError=Load Error InlineParseError=Inline resource is not an ITS 2.0 document CannotFetch=Cannot fetch URL NotITS=Resource is not an ITS 2.0 document TranslatableByGlobalRule=Translatable by global rule NotTranslatableByGlobalRule=Not translatable by global rule InlineRules=Inline rules translateRule=Translate locNoteRule=Localization Note termRule=Terminology dirRule=Directionality langRule=Language Information withinTextRule=Elements Within Text domainRule=Domain textAnalysisRule=Text Analysis localeFilterRule=Locale Filter provRule=Provenance externalResourceRefRule=External Resource targetPointerRule=Target Pointer idValueRule=Id Value preserveSpaceRule=Preserve Space locQualityIssueRule=Localization Quality Issue mtConfidenceRule=Machine-Translation Confidence allowedCharactersRule=Allowed Characters storageSizeRule=Storage Size DontWarnAgainForUrl=Don't warn me again about this URL DontWarnAgainForInline=Don't warn me again about inline global rules NewITSFile=New ITS 2.0 File CannotResolveXPath=Cannot resolve the following XPath selector (undeclared HTML namespace?): XPathParsingError=XPath Parsing Error DontWarnAgainForSelector=Don't warn me again about this selector CSSParsingError=CSS Parsing Error CannotResolveCSS=Cannot resolve the following CSS selector: ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/its20/its20Overlay.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/its20/locNoteRule.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/its20/selector.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/its20/termRule.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/its20/translateRule.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/scripteditor/editor.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/scripteditor/scripteditor.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/scripteditor/scripteditor.properties ================================================ ConfirmDeletionTitle=删除脚本 ConfirmDeletion=是否确定要删除该段脚本? AddExternalScriptTitle=添加外部脚本 PromptScriptURL=请输入外部脚本的 URL ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/scripteditor/scripteditorOverlay.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/stylesheets/editor.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/stylesheets/stylesheets.dtd ================================================ ================================================ FILE: locales/zh-CN/bluegriffon/sidebars/stylesheets/stylesheetsOverlay.dtd ================================================ ================================================ FILE: locales/zh-CN/cssproperties.mn ================================================ bluegriffon-zh-CN.jar: % locale cssproperties zh-CN %locale/zh-CN/cssproperties/ locale/zh-CN/cssproperties/csspropertiesOverlay.dtd (locale/zh-CN/csspropertiesOverlay.dtd) locale/zh-CN/cssproperties/cssproperties.dtd (locale/zh-CN/cssproperties.dtd) locale/zh-CN/cssproperties/editGridTemplate.dtd (locale/zh-CN/editGridTemplate.dtd) locale/zh-CN/cssproperties/backgrounditem.dtd (locale/zh-CN/backgrounditem.dtd) locale/zh-CN/cssproperties/griditemposition.dtd (locale/zh-CN/griditemposition.dtd) locale/zh-CN/cssproperties/transformationitem.dtd (locale/zh-CN/transformationitem.dtd) locale/zh-CN/cssproperties/transitionitem.dtd (locale/zh-CN/transitionitem.dtd) locale/zh-CN/cssproperties/textshadowitem.dtd (locale/zh-CN/textshadowitem.dtd) locale/zh-CN/cssproperties/colorstopitem.dtd (locale/zh-CN/colorstopitem.dtd) locale/zh-CN/cssproperties/backgrounditem.properties (locale/zh-CN/backgrounditem.properties) locale/zh-CN/cssproperties/cssproperties.properties (locale/zh-CN/cssproperties.properties) locale/zh-CN/cssproperties/fontFeatures.properties (locale/zh-CN/fontFeatures.properties) ================================================ FILE: locales/zh-CN/domexplorer.mn ================================================ bluegriffon-zh-CN.jar: % locale domexplorer zh-CN %locale/zh-CN/domexplorer/ locale/zh-CN/domexplorer/domexplorerOverlay.dtd (locale/zh-CN/domexplorerOverlay.dtd) locale/zh-CN/domexplorer/domexplorer.dtd (locale/zh-CN/domexplorer.dtd) ================================================ FILE: locales/zh-CN/fs.mn ================================================ fs-zh-CN.jar: % locale fs zh-CN %locale/zh-CN/fs/ locale/zh-CN/fs/fsOverlay.dtd (locale/zh-CN/fsOverlay.dtd) locale/zh-CN/fs/fs.dtd (locale/zh-CN/fs.dtd) locale/zh-CN/fs/fs.properties (locale/zh-CN/fs.properties) locale/zh-CN/fs/addFont.dtd (locale/zh-CN/addFont.dtd) ================================================ FILE: locales/zh-CN/gfd.mn ================================================ gfd-zh-CN.jar: % locale gfd zh-CN %locale/zh-CN/gfd/ locale/zh-CN/gfd/gfdOverlay.dtd (locale/zh-CN/gfdOverlay.dtd) locale/zh-CN/gfd/gfd.dtd (locale/zh-CN/gfd.dtd) locale/zh-CN/gfd/addFont.dtd (locale/zh-CN/addFont.dtd) ================================================ FILE: locales/zh-CN/its20.mn ================================================ bluegriffon-zh-CN.jar: % locale its20 zh-CN %locale/zh-CN/its20/ locale/zh-CN/its20/its20Overlay.dtd (locale/zh-CN/its20Overlay.dtd) locale/zh-CN/its20/its20.properties (locale/zh-CN/its20.properties) locale/zh-CN/its20/its20.dtd (locale/zh-CN/its20.dtd) locale/zh-CN/its20/translateRule.dtd (locale/zh-CN/translateRule.dtd) locale/zh-CN/its20/locNoteRule.dtd (locale/zh-CN/locNoteRule.dtd) locale/zh-CN/its20/termRule.dtd (locale/zh-CN/termRule.dtd) locale/zh-CN/its20/selector.dtd (locale/zh-CN/selector.dtd) ================================================ FILE: locales/zh-CN/markdown.mn ================================================ markdown-zh-CN.jar: % locale markdown zh-CN %locale/zh-CN/markdown/ locale/zh-CN/markdown/markdownOverlay.dtd (locale/zh-CN/markdownOverlay.dtd) locale/zh-CN/markdown/markdown.dtd (locale/zh-CN/markdown.dtd) ================================================ FILE: locales/zh-CN/op1.mn ================================================ op1-zh-CN.jar: % locale op1 zh-CN %locale/zh-CN/op1/ locale/zh-CN/op1/op1Overlay.dtd (locale/zh-CN/op1Overlay.dtd) locale/zh-CN/op1/op1.dtd (locale/zh-CN/op1.dtd) locale/zh-CN/op1/a11yFirstStep.properties (locale/zh-CN/a11yFirstStep.properties) ================================================ FILE: locales/zh-CN/scripteditor.mn ================================================ bluegriffon-zh-CN.jar: % locale scripteditor zh-CN %locale/zh-CN/scripteditor/ locale/zh-CN/scripteditor/scripteditorOverlay.dtd (locale/zh-CN/scripteditorOverlay.dtd) locale/zh-CN/scripteditor/scripteditor.dtd (locale/zh-CN/scripteditor.dtd) locale/zh-CN/scripteditor/scripteditor.properties (locale/zh-CN/scripteditor.properties) locale/zh-CN/scripteditor/editor.dtd (locale/zh-CN/editor.dtd) ================================================ FILE: locales/zh-CN/stylesheets.mn ================================================ bluegriffon-zh-CN.jar: % locale stylesheets zh-CN %locale/zh-CN/stylesheets/ locale/zh-CN/stylesheets/stylesheetsOverlay.dtd (locale/zh-CN/stylesheetsOverlay.dtd) locale/zh-CN/stylesheets/stylesheets.dtd (locale/zh-CN/stylesheets.dtd) locale/zh-CN/stylesheets/editor.dtd (locale/zh-CN/editor.dtd) ================================================ FILE: locales/zh-CN/tipoftheday.mn ================================================ tipoftheday-zh-CN.jar: % locale tipoftheday zh-CN %locale/zh-CN/tipoftheday/ locale/zh-CN/tipoftheday/tipoftheday.dtd (locale/zh-CN/tipoftheday.dtd) locale/zh-CN/tipoftheday/tipofthedayOverlay.dtd (locale/zh-CN/tipofthedayOverlay.dtd) locale/zh-CN/tipoftheday/tipoftheday.rdf (locale/zh-CN/tipoftheday.rdf) ================================================ FILE: locales/zh-TW/aria.mn ================================================ bluegriffon-zh-TW.jar: % locale aria zh-TW %locale/zh-TW/aria/ locale/zh-TW/aria/ariaOverlay.dtd (locale/zh-TW/ariaOverlay.dtd) locale/zh-TW/aria/aria.dtd (locale/zh-TW/aria.dtd) locale/zh-TW/aria/aria.properties (locale/zh-TW/aria.properties) ================================================ FILE: locales/zh-TW/base.mn ================================================ bluegriffon-zh-TW.jar: % locale bluegriffon zh-TW %locale/zh-TW/bluegriffon/ % locale branding zh-TW %locale/zh-TW/branding/ locale/zh-TW/bluegriffon/aboutDialog.dtd (locale/zh-TW/bluegriffon/aboutDialog.dtd) locale/zh-TW/bluegriffon/bluegriffon.dtd (locale/zh-TW/bluegriffon/bluegriffon.dtd) locale/zh-TW/bluegriffon/polyglot.dtd (locale/zh-TW/bluegriffon/polyglot.dtd) locale/zh-TW/bluegriffon/findbar.dtd (locale/zh-TW/bluegriffon/findbar.dtd) locale/zh-TW/bluegriffon/bluegriffon.properties (locale/zh-TW/bluegriffon/bluegriffon.properties) locale/zh-TW/bluegriffon/colourPicker.dtd (locale/zh-TW/bluegriffon/colourPicker.dtd) locale/zh-TW/bluegriffon/credits.dtd (locale/zh-TW/bluegriffon/credits.dtd) locale/zh-TW/bluegriffon/filepickerbutton.dtd (locale/zh-TW/bluegriffon/filepickerbutton.dtd) locale/zh-TW/bluegriffon/filePicking.dtd (locale/zh-TW/bluegriffon/filePicking.dtd) locale/zh-TW/bluegriffon/insertTable.dtd (locale/zh-TW/bluegriffon/insertTable.dtd) locale/zh-TW/bluegriffon/insertTable.properties (locale/zh-TW/bluegriffon/insertTable.properties) locale/zh-TW/bluegriffon/language.properties (locale/zh-TW/bluegriffon/language.properties) locale/zh-TW/bluegriffon/languages.dtd (locale/zh-TW/bluegriffon/languages.dtd) locale/zh-TW/bluegriffon/markupCleaner.dtd (locale/zh-TW/bluegriffon/markupCleaner.dtd) locale/zh-TW/bluegriffon/openLocation.dtd (locale/zh-TW/bluegriffon/openLocation.dtd) locale/zh-TW/bluegriffon/openLocation.properties (locale/zh-TW/bluegriffon/openLocation.properties) locale/zh-TW/bluegriffon/newPageWizard.dtd (locale/zh-TW/bluegriffon/newPageWizard.dtd) locale/zh-TW/bluegriffon/newPageWizard.properties (locale/zh-TW/bluegriffon/newPageWizard.properties) locale/zh-TW/bluegriffon/propertiesDeck.dtd (locale/zh-TW/bluegriffon/propertiesDeck.dtd) locale/zh-TW/bluegriffon/aria.dtd (locale/zh-TW/bluegriffon/aria.dtd) locale/zh-TW/bluegriffon/structurebar.dtd (locale/zh-TW/bluegriffon/structurebar.dtd) locale/zh-TW/bluegriffon/tabeditor.dtd (locale/zh-TW/bluegriffon/tabeditor.dtd) locale/zh-TW/bluegriffon/masterPasswordQuery.properties (locale/zh-TW/bluegriffon/masterPasswordQuery.properties) locale/zh-TW/bluegriffon/newDocument.dtd (locale/zh-TW/bluegriffon/newDocument.dtd) locale/zh-TW/bluegriffon/prefs/file.dtd (locale/zh-TW/bluegriffon/prefs/file.dtd) locale/zh-TW/bluegriffon/prefs/source.dtd (locale/zh-TW/bluegriffon/prefs/source.dtd) locale/zh-TW/bluegriffon/prefs/general.dtd (locale/zh-TW/bluegriffon/prefs/general.dtd) locale/zh-TW/bluegriffon/prefs/newPage.dtd (locale/zh-TW/bluegriffon/prefs/newPage.dtd) locale/zh-TW/bluegriffon/prefs/update.dtd (locale/zh-TW/bluegriffon/prefs/update.dtd) locale/zh-TW/bluegriffon/prefs/styles.dtd (locale/zh-TW/bluegriffon/prefs/styles.dtd) locale/zh-TW/bluegriffon/prefs/advanced.dtd (locale/zh-TW/bluegriffon/prefs/advanced.dtd) locale/zh-TW/bluegriffon/prefs/connection.dtd (locale/zh-TW/bluegriffon/prefs/connection.dtd) locale/zh-TW/bluegriffon/prefs/osx.dtd (locale/zh-TW/bluegriffon/prefs/osx.dtd) locale/zh-TW/bluegriffon/prefs/shortcuts.dtd (locale/zh-TW/bluegriffon/prefs/shortcuts.dtd) locale/zh-TW/bluegriffon/prefs/update.properties (locale/zh-TW/bluegriffon/prefs/update.properties) locale/zh-TW/bluegriffon/prefs/license.dtd (locale/zh-TW/bluegriffon/prefs/license.dtd) locale/zh-TW/bluegriffon/prefs/license.properties (locale/zh-TW/bluegriffon/prefs/license.properties) locale/zh-TW/bluegriffon/prefs/deactivateLicense.dtd (locale/zh-TW/bluegriffon/prefs/deactivateLicense.dtd) locale/zh-TW/bluegriffon/prefs.dtd (locale/zh-TW/bluegriffon/prefs.dtd) locale/zh-TW/bluegriffon/updateAvailable.dtd (locale/zh-TW/bluegriffon/updateAvailable.dtd) locale/zh-TW/bluegriffon/updates.properties (locale/zh-TW/bluegriffon/updates.properties) locale/zh-TW/branding/brand.dtd (locale/zh-TW/branding/brand.dtd) locale/zh-TW/branding/brand.properties (locale/zh-TW/branding/brand.properties) locale/zh-TW/bluegriffon/insertImage.dtd (locale/zh-TW/bluegriffon/insertImage.dtd) locale/zh-TW/bluegriffon/insertAnchor.dtd (locale/zh-TW/bluegriffon/insertAnchor.dtd) locale/zh-TW/bluegriffon/insertCommentOrPI.dtd (locale/zh-TW/bluegriffon/insertCommentOrPI.dtd) locale/zh-TW/bluegriffon/insertLink.dtd (locale/zh-TW/bluegriffon/insertLink.dtd) locale/zh-TW/bluegriffon/insertLink.properties (locale/zh-TW/bluegriffon/insertLink.properties) locale/zh-TW/bluegriffon/cssClassPicker.dtd (locale/zh-TW/bluegriffon/cssClassPicker.dtd) locale/zh-TW/bluegriffon/insertVideo.dtd (locale/zh-TW/bluegriffon/insertVideo.dtd) locale/zh-TW/bluegriffon/insertAudio.dtd (locale/zh-TW/bluegriffon/insertAudio.dtd) locale/zh-TW/bluegriffon/insertVideo.properties (locale/zh-TW/bluegriffon/insertVideo.properties) locale/zh-TW/bluegriffon/insertHTML.dtd (locale/zh-TW/bluegriffon/insertHTML.dtd) locale/zh-TW/bluegriffon/insertHR.dtd (locale/zh-TW/bluegriffon/insertHR.dtd) locale/zh-TW/bluegriffon/insertForm.dtd (locale/zh-TW/bluegriffon/insertForm.dtd) locale/zh-TW/bluegriffon/parsingError.dtd (locale/zh-TW/bluegriffon/parsingError.dtd) locale/zh-TW/bluegriffon/insertFormInput.dtd (locale/zh-TW/bluegriffon/insertFormInput.dtd) locale/zh-TW/bluegriffon/insertFieldset.dtd (locale/zh-TW/bluegriffon/insertFieldset.dtd) locale/zh-TW/bluegriffon/insertLabel.dtd (locale/zh-TW/bluegriffon/insertLabel.dtd) locale/zh-TW/bluegriffon/insertButton.dtd (locale/zh-TW/bluegriffon/insertButton.dtd) locale/zh-TW/bluegriffon/insertSelect.dtd (locale/zh-TW/bluegriffon/insertSelect.dtd) locale/zh-TW/bluegriffon/insertTextarea.dtd (locale/zh-TW/bluegriffon/insertTextarea.dtd) locale/zh-TW/bluegriffon/insertKeygen.dtd (locale/zh-TW/bluegriffon/insertKeygen.dtd) locale/zh-TW/bluegriffon/insertOutput.dtd (locale/zh-TW/bluegriffon/insertOutput.dtd) locale/zh-TW/bluegriffon/insertProgress.dtd (locale/zh-TW/bluegriffon/insertProgress.dtd) locale/zh-TW/bluegriffon/insertMeter.dtd (locale/zh-TW/bluegriffon/insertMeter.dtd) locale/zh-TW/bluegriffon/insertStylesheet.dtd (locale/zh-TW/bluegriffon/insertStylesheet.dtd) locale/zh-TW/bluegriffon/editStylesheet.dtd (locale/zh-TW/bluegriffon/editStylesheet.dtd) locale/zh-TW/bluegriffon/media.dtd (locale/zh-TW/bluegriffon/media.dtd) locale/zh-TW/bluegriffon/media.properties (locale/zh-TW/bluegriffon/media.properties) locale/zh-TW/bluegriffon/insertChars.dtd (locale/zh-TW/bluegriffon/insertChars.dtd) locale/zh-TW/bluegriffon/convertToTable.dtd (locale/zh-TW/bluegriffon/convertToTable.dtd) locale/zh-TW/bluegriffon/pageProperties.dtd (locale/zh-TW/bluegriffon/pageProperties.dtd) locale/zh-TW/bluegriffon/spellCheck.dtd (locale/zh-TW/bluegriffon/spellCheck.dtd) locale/zh-TW/bluegriffon/spellCheck.properties (locale/zh-TW/bluegriffon/spellCheck.properties) locale/zh-TW/bluegriffon/dictionary.dtd (locale/zh-TW/bluegriffon/dictionary.dtd) locale/zh-TW/bluegriffon/html5.properties (locale/zh-TW/bluegriffon/html5.properties) locale/zh-TW/bluegriffon/listProperties.dtd (locale/zh-TW/bluegriffon/listProperties.dtd) locale/zh-TW/bluegriffon/insertTOC.dtd (locale/zh-TW/bluegriffon/insertTOC.dtd) locale/zh-TW/bluegriffon/svg-edit.properties (locale/zh-TW/bluegriffon/svg-edit.properties) locale/zh-TW/bluegriffon/panels.dtd (locale/zh-TW/bluegriffon/panels.dtd) locale/zh-TW/bluegriffon/rotator.dtd (locale/zh-TW/bluegriffon/rotator.dtd) ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/aboutDialog.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/aria.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/bluegriffon.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/bluegriffon.properties ================================================ titleModifier=BlueGriffon # in the following string, %t represents the title of the page or its URL # and %b the titleModifier above titleFormat=%S - %S Unknown=[未知] NoClassAvailable=(無類別) NoIdAvailable=(無 ID) DocumentTitle=頁面標題 NeedDocTitle=為目前的頁面輸入標題。 DocTitleHelp=在書籤和視窗標題中用來識別此頁面 ExportToText=匯出為文字檔 SaveDocumentAs=另存此頁面 XHTMLfiles=XHTML 檔案 untitled=無標題 SaveDocument=儲存此頁面 SaveFileFailed=儲存檔案發生錯誤! ExportToText=匯出為文字檔 FileNotSaved=檔案尚未儲存! SaveFileBeforeClosing=是否在關閉分頁前儲存檔案? YesSaveFile=是 NoDiscardChanges=否 DontCloseTab=取消 IdAlreadyTaken=此ID已被文件使用 RemoveIdFromElement=你是否要移除在此元素中已攜帶的ID,或是取消此步驟? YesRemoveId=移除 ID NoCancel=取消 ReplaceAll=全部取代... ReplacedPart1=已取代 ReplacedPart2=事件 AFileWasChanged=一個檔案已在磁碟中被更變 ReloadFile=檔案 %S 已在磁碟中被更變,BlueGriffon 必須重新開啟此檔案 DontAskForFileChangesAgain=不再顯示此警告 AbandonChanges=要放棄"%title%"的更改,重新載入頁面嗎? RevertCaption=回復到上次儲存 HTMLCommentsInXHTMLTitle=在XHTML文件內

      一般文字

      已連結文字

      觸發中文字

      ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/panels.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/parsingError.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/polyglot.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/prefs/advanced.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/prefs/connection.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/prefs/deactivateLicense.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/prefs/file.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/prefs/general.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/prefs/license.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/prefs/license.properties ================================================ activateWarning=BlueGriffon needs to restart to activate your license. Do you want to restart now? confirmRestart=Restart BlueGriffon? fullResetTitle=License activation reset fullResetErrorLabel=Impossible to perform the operation, a network error occurred. fullResetRequested=A reset link was sent to the owner of the license/transaction. BlueGriffon must now restart. fullResetInvalid=The transaction ID is invalid. ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/prefs/newPage.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/prefs/osx.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/prefs/shortcuts.properties ================================================ NoMainWindowAvaialble=無法編輯鍵盤快捷鍵 PleaseOpenOneMainWindow=至少需要開啟一個主要 BlueGriffon 視窗來編輯鍵盤快捷鍵。 ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/prefs/source.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/prefs/styles.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/prefs/update.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/prefs/update.properties ================================================ SoftwareUpdates=軟體更新 UnableToCheck=禁止檢查更新 UpToDate=BlueGriffon已是最新版 ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/prefs.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/propertiesDeck.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/rotator.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/spellCheck.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/spellCheck.properties ================================================ CorrectSpelling=(正確拼字) NoSuggestedWords=(無建議的單字) NoMisspelledWord=無錯誤單字 CheckSpellingDone=完成拼字檢查 CheckSpelling=拼字檢查 ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/structurebar.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/svg-edit.properties ================================================ SvgEdit=SVG編輯器 ConfirmClose=文件尚未儲存,您確定要離開SVG編輯器? ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/tabeditor.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/updateAvailable.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/bluegriffon/updates.properties ================================================ update.checkInsideButton.label=檢查更新 update.checkInsideButton.accesskey=C update.resumeButton.label=繼續下載 %S… update.resumeButton.accesskey=D update.openUpdateUI.applyButton.label=套用更新… update.openUpdateUI.applyButton.accesskey=A update.restart.applyButton.label=套用更新 update.restart.applyButton.accesskey=A update.openUpdateUI.upgradeButton.label=立刻升級… update.openUpdateUI.upgradeButton.accesskey=U update.restart.upgradeButton.label=立刻升級 update.restart.upgradeButton.accesskey=U ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/branding/brand.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/base/locale/branding/brand.properties ================================================ brandShortName=BlueGriffon brandFullName=BlueGriffon vendorShortName=Disruptive Innovations sidebarName=側欄 ================================================ FILE: locales/zh-TW/bluegriffon/extensions/fs/addFont.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/extensions/fs/fs.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/extensions/fs/fs.properties ================================================ SelectDir=選擇用來解壓縮字型包的資料夾 SelectFile=選擇現有字型包的 styesheet.css Stylesheet=FontSquirrel 包的樣式表 MustBeSavedTitle=文件從未存檔 MustBeSavedMessage=您必須儲存文件至少一次方可嘗試使用相對 URL 連接到本地字型。請儲存並關閉文件後重新打開它。 ================================================ FILE: locales/zh-TW/bluegriffon/extensions/fs/fsOverlay.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/extensions/gfd/addFont.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/extensions/gfd/gfd.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/extensions/gfd/gfdOverlay.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/extensions/markdown/markdown.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/extensions/markdown/markdownOverlay.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/extensions/op1/a11yFirstStep.properties ================================================ ConformingDTDSyntax=在HTML元素前使用W3C認證的DTD語法 NoWrongSyntaxOrNonConformingHierarchy=不要在HTML元素中使用錯誤的屬性語法或未認證的元素階層 OneTitleInHead=使用title元素做為head元素的子元素 NoEmptyTitle=當你提供標籤屬性給title元素時,勿留下空白 NoMetaRefresh=不可使用有http-equiv屬性而且等於重新整理數值的meta元素 HTMLElementHasLangAttribute=給html元素使用lang屬性 HTMLElementHasValidLangAttribute=使用有效的語言編碼給lang屬性 NoInvalidDir=不可使用ltr,rtl或empty以外的值給dir屬性 TitleForFrames=使用title屬性給每項frame元素 NoEmptyTitleForFrames=當你提供標籤屬性給frame元素時,勿留下空白 TitleForIFrames=使用title屬性給每項iframe元素 NoEmptyTitleForIFrames=當你提供標籤屬性給iframe元素時,勿留下空白 AtLeastOneH1InBody=至少必須要有一項h1元素在(在任何等級)body元素內 NoEmptyH1=當你提供標籤屬性給h1元素時,勿留下空白 NoEmptyH2=當你提供標籤屬性給h2元素時,勿留下空白 NoEmptyH3=當你提供標籤屬性給h3元素時,勿留下空白 NoEmptyH4=當你提供標籤屬性給h4元素時,勿留下空白 NoEmptyH5=當你提供標籤屬性給h5元素時,勿留下空白 NoEmptyH6=當你提供標籤屬性給h6元素時,勿留下空白 H2Order=在搜尋排序中,在h2元素之前使用 h1、h2、h3、h4、h5或h6元素作為第一項標題 H3Order=在搜尋排序中,在h3元素之前使用 h2、h3、h4、h5或h6元素作為第一項標題 H4Order=在搜尋排序中,在h4元素之前使用 h3、h4、h5或h6元素作為第一項標題 H5Order=在搜尋排序中,在h5元素之前使用 h4、h5或h6元素作為第一項標題 H6Order=在搜尋排序中,在h6元素之前使用 h5、h6元素作為第一項標題 DTAsFirstChildOfDL=使用dt元素作為dl元素中的第一個子元素 NoEmptyLI=當你提供li元素時,勿留下空白 NoAlignAttribute=不可使用align屬性 NoXmpElement=不可使用xmp元素 NoEmptyP=當你提供p元素時,勿留下空白 NoEmptyAExceptAnchors=當你提供a元素時,勿留下空白,除非是作為錨點使用 NoEmptyButton=當你提供button元素時,勿留下空白 NoVlinkAttribute=不可使用vlink屬性 NoTextAttribute=不可使用text屬性 NoLinkAttribute=不可使用link屬性 noImgWithoutAlt=分別給每項img元素使用alt屬性 noAreaWithoutAlt=分別給每項area元素使用alt屬性 noAppletWithoutAlt=分別給每項applet元素使用alt屬性 noImageInputWithoutAlt=分別給每項input type=img元素使用alt屬性 noEmptyAltForImageLoneChildOfAnchorOrButton=如果img元素是按鈕或a元素的子元素,勿讓alt屬性留下空白 noEmptyAltForInputImage=當你提供alt屬性給input type=image元素時,勿留下空白 noEmptyAltForAreaWithHref=當你提供alt屬性給持有herf屬性的area元素,勿留下空白 noAltSimilarToTextContent=如果img元素是含有文字的a元素的子元素,不可使用相同的文字給在a元素內的alt屬性 noBorderAttribute=不可使用border屬性 noSimilarAltForAreasWithDifferentHref=不可使用相同的值給alt屬性給多重且不同herf值的area元素 LongdescIsURI=使用URI作為值給longdesc屬性 noBackgroundAttribute=不可使用background屬性 noBgsoundElement=不可使用bgsound元素 TablesWithAtLeastOneTHHaveACaption=使用caption元素作為至少包含th元素的table元素中的第一項子元素 CaptionIsDifferentFromSummaryAttribute=不可給caption元素和summary屬性使用相同的內容 noEmptyCaption=當你提供caption元素時,勿留下空白 noCaptionInATableWithOnlyTDs=不可使用只有td元素的table元素內的caption元素 noAlinkAttribute=不可使用alink屬性 noSummaryAttributeSimilarToCaption=不可給summary屬性和caption元素使用相同的內容 noEmptySummaryIfTableHasTHOrCaption=當你提供summary屬性給包含th或caption元素的table元素,勿留下空白 noSummaryAttributeIfOnlyTDs=不可在只包含td元素的table屬性中使用summary屬性 noStrikeElement=不可使用strike元素 noListingElement=不可使用listing元素 AtLeastOneTHIfCaptionOrSummary=至少在包含caption元素或非空白的summary屬性的table元素使用一項th元素 AllNonEmptyTHHaveScopeOrId=使用scope或id屬性給每項非空白的th元素 ScopeAttributeIsRowOrCol=不可使用scope屬性行和列以外的值 noBgcolorAttribute=不可使用bgcolor屬性 noTTElement=不可使用tt元素 TDHaveHeadersAttributeIfTHHasId=如果對應的元素擁有id屬性,在每項td元素使用headers屬性 noPlaintextElement=不可使用plaintext元素 noHeadersAttributeThatIsNotATHId=不可使用吻合id屬性,且作為table元素的td當作headers屬性的值 AllFormsHaveAButton=在form元素內使用按鈕、送出類型的input元素、圖像 SubmitButtonsHaveNonEmptyValue=當你提供input type=submit元素時,勿讓value屬性留下空白 noMarqueeElement=不可使用marquee元素 FieldsetHasALegend=使用legend元素作為每項fieldset元素中的子元素 FieldsetsAreInForms=不可在缺少form元素時使用fieldset元素 noEmptyLegendElement=當你提供legend元素時,勿留下空白 LabelElementHasForAttribute=使用for屬性給每項label元素 noEmptyForAttributeOnLabel=當你提供for屬性給label元素時,勿留下空白 ForAttributeMatchesAnIdInSameForm=for屬性必須擁有在form元素內與id屬性吻合的值 OptgroupElementHasALabel=使用標籤屬性給每項Optgroup元素 NoSimilarLabelInOptgroupsOfSameSelect=不可使用相同的標籤元素給Optgroup元素中的相同選擇元素 noEmptyLabelAttributeOnOptgroup=當你提供標籤屬性給Optgroup元素時,勿留下空白 noBasefontElement=不可使用basefont元素 noBlinkElement=不可使用blink元素 noCenterElement=不可使用center元素 noFontElement=不可使用font元素 ================================================ FILE: locales/zh-TW/bluegriffon/extensions/op1/op1.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/extensions/op1/op1Overlay.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/extensions/tipoftheday/tipoftheday.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/extensions/tipoftheday/tipoftheday.rdf ================================================ %brandDTD; ]> y &brandShortName; 提示 http://bluegriffon.org/ &brandShortName; 每日提示儲存 zh-TW 使用滑鼠縮放表格 只要在 檢視 > 顯示/隱藏 > 尺規 顯示尺規,而且 將游標停留於儲存格內,即可看到修改尺寸的功能。 輕鬆的自訂工具列 只需按下右鍵即可 直接進入 &brandShortName; 使用者論壇 只需在說明選單內選擇 &brandShortName; 是跨平台的軟體 &brandShortName; 支援許多不同的作業系統,包含 Windows、Mac OS X、各種Linux發行版、OS/2 等等 可以藉由快速鍵新增新的分頁 Ctrl+n (在Mac OS X中為 指令+n) 將會產生新的空白分頁 可以藉由一個鍵關閉目前的分頁 Control-w (在Mac OS X中為 指令-w) 將會關閉目前的分頁 …you can revert to a previously saved version of the currently edited document? Righ-click (context-click on Mac OS X) on the document's tab and select the Revert menu. ================================================ FILE: locales/zh-TW/bluegriffon/extensions/tipoftheday/tipofthedayOverlay.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/aria/aria.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/aria/aria.properties ================================================ mustBeContainedIn=must be contained in or= or ok=OK mustContain=must contain and= and deprecated=deprecated missingTextbox=missing textbox missingListboxTreeGridDialog=missing listbox, tree, grid or dialog ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/aria/ariaOverlay.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/cssproperties/backgrounditem.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/cssproperties/backgrounditem.properties ================================================ backgroundColorTitle=顏色 backgroundImageTitle=影像 backgroundLinearGradientTitle=線性漸層 backgroundRadialGradientTitle=輻射漸層 ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/cssproperties/colorstopitem.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/cssproperties/cssproperties.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/cssproperties/cssproperties.properties ================================================ EnterAnId=請輸入 ID EnterUniqueId=您必須指定元素的唯一ID: NoClasSelected=你必須選擇類別名稱 PleaseSelectAClass=必須選擇套用於請求變更的類別 ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/cssproperties/csspropertiesOverlay.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/cssproperties/editGridTemplate.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/cssproperties/fontFeatures.properties ================================================ FFaalt=Access all alternates FFcalt=Contextual alternates FFsalt=Stylistic alternates FFliga=Standard ligatures FFclig=Contextual ligatures FFdlig=Discretionary ligatures FFhist=Historical forms FFhlig=Historical ligatures FFunic=Unicase FFsmcp=Small capitals FFc2sc=Small capitals from capitals FFc2pc=Petite capitals from capitals FFpcap=Petite capitals FFcase=Case sensitive forms FFcpsp=Capital spacing FFtitl=Titling FFswsh=Swash FFcswh=Contextual swash FFfrac=Fractions FFafrc=Alternative fractions FFordn=Ordinals FFnumr=Numerators FFdnom=Denominators FFsinf=Scientific inferiors FFsups=Superscript FFsubs=Subscript FFonum=Oldstyle figures FFlnum=Lining Figures FFpnum=Proportional figures FFtnum=Tabular figures FFzero=Slashed zero FFmgrk=Mathematical greek FFnalt=Alternate annotation forms FFornm=Ornaments FFlocl=Localized forms FFsize=Optical size FFisol=Isolated forms FFinit=Initial forms FFmedi=Medial forms FFfinal=Final forms FFrlig=Requird ligatures FFccmp=Glyph composition/decomposition FFmark=Mark to base positioning FFmkmj=Mark to mark positioning FFhwid=Half widths ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/cssproperties/griditemposition.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/cssproperties/textshadowitem.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/cssproperties/transformationitem.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/cssproperties/transitionitem.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/domexplorer/domexplorer.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/domexplorer/domexplorerOverlay.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/its20/its20.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/its20/its20.properties ================================================ LoadError=載入錯誤 InlineParseError=行內資源並非 ITS 2.0 文件 CannotFetch=無法從 URL 接收 NotITS=資源並非 ITS 2.0 文件 TranslatableByGlobalRule=全域規則下可譯 NotTranslatableByGlobalRule=全域規則下不可譯 InlineRules=行內規則 translateRule=翻譯 locNoteRule=本地化注記 termRule=術語 dirRule=定向性 langRule=語言資訊 withinTextRule=含文字的元素 domainRule=Domain textAnalysisRule=文字分析 localeFilterRule=本地過濾器 provRule=Provenance externalResourceRefRule=外部資源 targetPointerRule=目標指標 idValueRule=Id 的值 preserveSpaceRule=保存空間 locQualityIssueRule=本地化品質意見 mtConfidenceRule=Machine-本地化可信度 allowedCharactersRule=允許的字元 storageSizeRule=儲存大小 DontWarnAgainForUrl=不再對此URL進行警告 DontWarnAgainForInline=不再對此行內的全域規則進行警告 NewITSFile=新增 ITS 2.0 檔案 CannotResolveXPath=無法解決已下的 XPath 選擇器 (未宣告的 HTML 命名空間?): XPathParsingError=XPath 解析錯誤 DontWarnAgainForSelector=不再對此選擇器進行警告 CSSParsingError=CSS 解析錯誤 CannotResolveCSS=無法解決以下的 CSS 選擇器: ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/its20/its20Overlay.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/its20/locNoteRule.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/its20/selector.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/its20/termRule.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/its20/translateRule.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/scripteditor/editor.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/scripteditor/scripteditor.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/scripteditor/scripteditor.properties ================================================ ConfirmDeletionTitle=刪除腳本 ConfirmDeletion=您確定要刪除這項腳本? AddExternalScriptTitle=新增外部腳本 PromptScriptURL=腳本的超連結? ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/scripteditor/scripteditorOverlay.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/stylesheets/editor.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/stylesheets/stylesheets.dtd ================================================ ================================================ FILE: locales/zh-TW/bluegriffon/sidebars/stylesheets/stylesheetsOverlay.dtd ================================================ ================================================ FILE: locales/zh-TW/cssproperties.mn ================================================ bluegriffon-zh-TW.jar: % locale cssproperties zh-TW %locale/zh-TW/cssproperties/ locale/zh-TW/cssproperties/csspropertiesOverlay.dtd (locale/zh-TW/csspropertiesOverlay.dtd) locale/zh-TW/cssproperties/cssproperties.dtd (locale/zh-TW/cssproperties.dtd) locale/zh-TW/cssproperties/editGridTemplate.dtd (locale/zh-TW/editGridTemplate.dtd) locale/zh-TW/cssproperties/backgrounditem.dtd (locale/zh-TW/backgrounditem.dtd) locale/zh-TW/cssproperties/griditemposition.dtd (locale/zh-TW/griditemposition.dtd) locale/zh-TW/cssproperties/transformationitem.dtd (locale/zh-TW/transformationitem.dtd) locale/zh-TW/cssproperties/transitionitem.dtd (locale/zh-TW/transitionitem.dtd) locale/zh-TW/cssproperties/textshadowitem.dtd (locale/zh-TW/textshadowitem.dtd) locale/zh-TW/cssproperties/colorstopitem.dtd (locale/zh-TW/colorstopitem.dtd) locale/zh-TW/cssproperties/backgrounditem.properties (locale/zh-TW/backgrounditem.properties) locale/zh-TW/cssproperties/cssproperties.properties (locale/zh-TW/cssproperties.properties) locale/zh-TW/cssproperties/fontFeatures.properties (locale/zh-TW/fontFeatures.properties) ================================================ FILE: locales/zh-TW/domexplorer.mn ================================================ bluegriffon-zh-TW.jar: % locale domexplorer zh-TW %locale/zh-TW/domexplorer/ locale/zh-TW/domexplorer/domexplorerOverlay.dtd (locale/zh-TW/domexplorerOverlay.dtd) locale/zh-TW/domexplorer/domexplorer.dtd (locale/zh-TW/domexplorer.dtd) ================================================ FILE: locales/zh-TW/fs.mn ================================================ fs-zh-TW.jar: % locale fs zh-TW %locale/zh-TW/fs/ locale/zh-TW/fs/fsOverlay.dtd (locale/zh-TW/fsOverlay.dtd) locale/zh-TW/fs/fs.dtd (locale/zh-TW/fs.dtd) locale/zh-TW/fs/fs.properties (locale/zh-TW/fs.properties) locale/zh-TW/fs/addFont.dtd (locale/zh-TW/addFont.dtd) ================================================ FILE: locales/zh-TW/gfd.mn ================================================ gfd-zh-TW.jar: % locale gfd zh-TW %locale/zh-TW/gfd/ locale/zh-TW/gfd/gfdOverlay.dtd (locale/zh-TW/gfdOverlay.dtd) locale/zh-TW/gfd/gfd.dtd (locale/zh-TW/gfd.dtd) locale/zh-TW/gfd/addFont.dtd (locale/zh-TW/addFont.dtd) ================================================ FILE: locales/zh-TW/its20.mn ================================================ bluegriffon-zh-TW.jar: % locale its20 zh-TW %locale/zh-TW/its20/ locale/zh-TW/its20/its20Overlay.dtd (locale/zh-TW/its20Overlay.dtd) locale/zh-TW/its20/its20.properties (locale/zh-TW/its20.properties) locale/zh-TW/its20/its20.dtd (locale/zh-TW/its20.dtd) locale/zh-TW/its20/translateRule.dtd (locale/zh-TW/translateRule.dtd) locale/zh-TW/its20/locNoteRule.dtd (locale/zh-TW/locNoteRule.dtd) locale/zh-TW/its20/termRule.dtd (locale/zh-TW/termRule.dtd) locale/zh-TW/its20/selector.dtd (locale/zh-TW/selector.dtd) ================================================ FILE: locales/zh-TW/markdown.mn ================================================ markdown-zh-TW.jar: % locale markdown zh-TW %locale/zh-TW/markdown/ locale/zh-TW/markdown/markdownOverlay.dtd (locale/zh-TW/markdownOverlay.dtd) locale/zh-TW/markdown/markdown.dtd (locale/zh-TW/markdown.dtd) ================================================ FILE: locales/zh-TW/op1.mn ================================================ op1-zh-TW.jar: % locale op1 zh-TW %locale/zh-TW/op1/ locale/zh-TW/op1/op1Overlay.dtd (locale/zh-TW/op1Overlay.dtd) locale/zh-TW/op1/op1.dtd (locale/zh-TW/op1.dtd) locale/zh-TW/op1/a11yFirstStep.properties (locale/zh-TW/a11yFirstStep.properties) ================================================ FILE: locales/zh-TW/scripteditor.mn ================================================ bluegriffon-zh-TW.jar: % locale scripteditor zh-TW %locale/zh-TW/scripteditor/ locale/zh-TW/scripteditor/scripteditorOverlay.dtd (locale/zh-TW/scripteditorOverlay.dtd) locale/zh-TW/scripteditor/scripteditor.dtd (locale/zh-TW/scripteditor.dtd) locale/zh-TW/scripteditor/scripteditor.properties (locale/zh-TW/scripteditor.properties) locale/zh-TW/scripteditor/editor.dtd (locale/zh-TW/editor.dtd) ================================================ FILE: locales/zh-TW/stylesheets.mn ================================================ bluegriffon-zh-TW.jar: % locale stylesheets zh-TW %locale/zh-TW/stylesheets/ locale/zh-TW/stylesheets/stylesheetsOverlay.dtd (locale/zh-TW/stylesheetsOverlay.dtd) locale/zh-TW/stylesheets/stylesheets.dtd (locale/zh-TW/stylesheets.dtd) locale/zh-TW/stylesheets/editor.dtd (locale/zh-TW/editor.dtd) ================================================ FILE: locales/zh-TW/tipoftheday.mn ================================================ tipoftheday-zh-TW.jar: % locale tipoftheday zh-TW %locale/zh-TW/tipoftheday/ locale/zh-TW/tipoftheday/tipoftheday.dtd (locale/zh-TW/tipoftheday.dtd) locale/zh-TW/tipoftheday/tipofthedayOverlay.dtd (locale/zh-TW/tipofthedayOverlay.dtd) locale/zh-TW/tipoftheday/tipoftheday.rdf (locale/zh-TW/tipoftheday.rdf) ================================================ FILE: makefiles.sh ================================================ #! /bin/sh # ***** BEGIN LICENSE BLOCK ***** # Version: MPL 1.1/GPL 2.0/LGPL 2.1 # # The contents of this file are subject to the Mozilla Public License Version # 1.1 (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. # # The Original Code is the the Mozilla build system # # The Initial Developer of the Original Code is # Ben Turner # # Portions created by the Initial Developer are Copyright (C) 2007 # the Initial Developer. All Rights Reserved. # # Contributor(s): # # Alternatively, the contents of this file may be used under the terms of # either the GNU General Public License Version 2 or later (the "GPL"), or # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), # in which case the provisions of the GPL or the LGPL are applicable instead # of those above. If you wish to allow use of your version of this file only # under the terms of either the GPL or the LGPL, and not to allow others to # use your version of this file under the terms of the MPL, indicate your # decision by deleting the provisions above and replace them with the notice # and other provisions required by the GPL or the LGPL. If you do not delete # the provisions above, a recipient may use your version of this file under # the terms of any one of the MPL, the GPL or the LGPL. # # ***** END LICENSE BLOCK ***** add_makefiles " bluegriffon/Makefile bluegriffon/app/Makefile bluegriffon/base/Makefile bluegriffon/branding/Makefile bluegriffon/extensions/Makefile bluegriffon/installer/Makefile bluegriffon/installer/windows/Makefile bluegriffon/sidebars/Makefile bluegriffon/src/Makefile bluegriffon/src/dibgutils/Makefile bluegriffon/src/diOSIntegration.mac/Makefile bluegriffon/themes/Makefile bluegriffon/modules/Makefile bluegriffon/themes/win/Makefile bluegriffon/themes/mac/Makefile bluegriffon/extensions/svg-edit/Makefile bluegriffon/extensions/op1/Makefile bluegriffon/extensions/gfd/Makefile bluegriffon/extensions/fs/Makefile bluegriffon/sidebars/cssproperties/Makefile bluegriffon/sidebars/domexplorer/Makefile bluegriffon/sidebars/scripteditor/Makefile bluegriffon/sidebars/stylesheets/Makefile bluegriffon/langpacks/Makefile bluegriffon/locales/Makefile bluegriffon/components/Makefile " ================================================ FILE: modules/Makefile.in ================================================ # ***** BEGIN LICENSE BLOCK ***** # Version: MPL 1.1/GPL 2.0/LGPL 2.1 # # The contents of this file are subject to the Mozilla Public License Version # 1.1 (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. # # The Original Code is PR2 # # The Initial Developer of the Original Code is # Pages Jaunes. # Portions created by the Initial Developer are Copyright (C) 2009 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Daniel Glazman (daniel.glazman@disruptive-innovations.com) # # Alternatively, the contents of this file may be used under the terms of # either the GNU General Public License Version 2 or later (the "GPL"), or # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), # in which case the provisions of the GPL or the LGPL are applicable instead # of those above. If you wish to allow use of your version of this file only # under the terms of either the GPL or the LGPL, and not to allow others to # use your version of this file under the terms of the MPL, indicate your # decision by deleting the provisions above and replace them with the notice # and other provisions required by the GPL or the LGPL. If you do not delete # the provisions above, a recipient may use your version of this file under # the terms of any one of the MPL, the GPL or the LGPL. # # ***** END LICENSE BLOCK ***** DEPTH = ../.. topsrcdir = @top_srcdir@ srcdir = @srcdir@ VPATH = @srcdir@ include $(DEPTH)/config/autoconf.mk include $(topsrcdir)/config/rules.mk ================================================ FILE: modules/bgQuit.jsm ================================================ Components.utils.import("resource://gre/modules/Services.jsm"); Components.utils.import("resource://gre/modules/prompterHelper.jsm"); var EXPORTED_SYMBOLS = ["BlueGriffonQuitHelper"]; var BlueGriffonQuitHelper = { mReady: false, init: function() { if (this.mReady) return; this.mReady = true; Services.obs.addObserver(BlueGriffonQuitHelper, "quit-application-requested", false); }, observe: function(aSubject, topic, data) { switch (topic) { case "quit-application-requested": { var windowMediator = Services.wm; var e = windowMediator.getEnumerator("bluegriffon"); var windows = []; while (e.hasMoreElements()) { var w = e.getNext(); windows.push(w); } for (var i = 0; i < windows.length; i++) { var w = windows[i]; if ("doQuit" in w) { w.focus(); if (!w.doQuit()) { aSubject.QueryInterface(Components.interfaces.nsISupportsPRBool); aSubject.data = true; break; } } } break; } } } }; ================================================ FILE: modules/colourPickerHelper.jsm ================================================ Components.utils.import("resource://gre/modules/Services.jsm"); var EXPORTED_SYMBOLS = ["ColorPickerHelper"]; var ColorPickerHelper = { // MEMBERS mPersistentColorObjects: {}, mColorPickerPanelObject: {}, // CONSTANTS kCOLOUR_PICKER_URL: "chrome://bluegriffon/content/xul/colourPicker.xul", // PUBLIC newPersistentColorObject: function(aColorObjectId) { if (!aColorObjectId) return null; if (this.mPersistentColorObjects[aColorObjectId]) return this.mPersistentColorObjects[aColorObjectId]; var newColorObject = { currentColor: "", lastPickedColor: "", cancelled: false }; this.mPersistentColorObjects[aColorObjectId] = newColorObject; return newColorObject; }, cleanPersistentColorObject: function(aColorObjectId) { if (!aColorObjectId) return; if (this.mPersistentColorObjects[aColorObjectId]) delete this.mPersistentColorObjects[aColorObjectId]; }, getCurrentColor: function(aColorObjectId) { if (!aColorObjectId || !this.mPersistentColorObjects[aColorObjectId]) return null; return this.mPersistentColorObjects[aColorObjectId].currentColor; }, setLastPickedColor: function(aColorObjectId, aColor) { if (!aColorObjectId || !this.mPersistentColorObjects[aColorObjectId]) return null; this.mPersistentColorObjects[aColorObjectId].lastPickedColor = aColor; return aColor; }, isCancelled: function(aColorObjectId) { if (!aColorObjectId || !this.mPersistentColorObjects[aColorObjectId]) throw Components.results.NS_ERROR_NULL_POINTER; return this.mPersistentColorObjects[aColorObjectId].cancelled; }, openColorPicker: function(aWindow, aColorObjectId, aWindowTitle, aShowTransparency) { if (!aColorObjectId) return null; var colorObject = this.newPersistentColorObject(aColorObjectId); this._resetCancelledFlag(colorObject); aWindow.openDialog(this.kCOLOUR_PICKER_URL, "_blank", "chrome,close,titlebar,modal,dialog=no", colorObject, aWindowTitle, aShowTransparency); return colorObject; }, // PRIVATE _resetCancelledFlag: function(aColorObject) { aColorObject.cancelled = false; } }; ================================================ FILE: modules/cssHelper.jsm ================================================ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is BlueGriffon. * * The Initial Developer of the Original Code is * Disruptive Innovations SARL. * Portions created by the Initial Developer are Copyright (C) 2006 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Daniel Glazman , Original author * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ Components.utils.import("resource://gre/modules/editorHelper.jsm"); Components.utils.import("resource://gre/modules/cssInspector.jsm"); Components.utils.import("resource://gre/modules/Services.jsm"); var EXPORTED_SYMBOLS = ["CssUtils"]; var CssUtils = { kCSSRule: Components.interfaces.nsIDOMCSSRule, getStyleSheets: function(aDoc) { return aDoc.styleSheets; }, _enumerateStyleSheet: function(aSheet, aCallback) { if (aCallback(aSheet)) return; var rules = aSheet.cssRules; for (var j = 0; j < rules.length; j++) { var rule = rules.item(j); switch (rule.type) { case CssUtils.kCSSRule.IMPORT_RULE: this._enumerateStyleSheet(rule.styleSheet, aCallback); break; case CssUtils.kCSSRule.MEDIA_RULE: this._enumerateStyleSheet(rule, aCallback); break; default: break; } } }, enumerateStyleSheets: function(aDocument, aCallback) { var stylesheetsList = aDocument.styleSheets; for (var i = 0; i < stylesheetsList.length; i++) { var sheet = stylesheetsList.item(i); this._enumerateStyleSheet(sheet, aCallback); } }, getComputedStyle: function(aElt) { return aElt.ownerDocument.defaultView.getComputedStyle(aElt, ""); }, getComputedValue: function(aElt, aProperty) { return this.getComputedStyle(aElt).getPropertyValue(aProperty); }, findClassesInSelector: function(aSelector) { return aSelector.match( /\.-?([_a-z]|[\200-\377]|((\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?)|\\[^\r\n\f0-9a-f]))([_a-z0-9-]|[\200-\377]|((\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?)|\\[^\r\n\f0-9a-f]))*/gi ); }, findIdsInSelector: function(aSelector) { return aSelector.match( /#-?([_a-z]|[\200-\377]|((\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?)|\\[^\r\n\f0-9a-f]))([_a-z0-9-]|[\200-\377]|((\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?)|\\[^\r\n\f0-9a-f]))*/gi ); }, getCssHintsFromDocument: function(aDocument, aDetector) { var classList = []; function enumerateClass(aSheet) { var cssRules = aSheet.cssRules; for (var i = 0; i < cssRules.length; i++) { var rule = cssRules.item(i); if (rule.type == CssUtils.kCSSRule.STYLE_RULE) { var selectorText = rule.selectorText; var matches = aDetector(selectorText); if (matches) for (var j = 0; j < matches.length; j++) { var m = matches[j].substr(1); if (classList.indexOf(m) == -1) classList.push(m); } } } return false; } CssUtils.enumerateStyleSheets(aDocument, enumerateClass); return classList; }, getAllClassesForDocument: function(aDocument) { return this.getCssHintsFromDocument(aDocument, this.findClassesInSelector); }, getAllIdsForDocument: function(aDocument) { return this.getCssHintsFromDocument(aDocument, this.findIdsInSelector); }, getAllLocalRulesForSelector: function(aDocument, aSelector) { var ruleList = []; function enumerateRules(aSheet) { if (aSheet.ownerNode instanceof Components.interfaces.nsIDOMHTMLStyleElement) { var cssRules = aSheet.cssRules; for (var i = 0; i < cssRules.length; i++) { var rule = cssRules.item(i); if (rule.type == CssUtils.kCSSRule.STYLE_RULE) { var selectorText = rule.selectorText; if (selectorText == aSelector) ruleList.push({rule:rule, index:i}); } } return false; } return true; } CssUtils.enumerateStyleSheets(aDocument, enumerateRules); return ruleList; }, deleteAllLocalRulesForSelector: function(aEditor, aDocument, aSelector, aDeclarations) { var ruleList = this.getAllLocalRulesForSelector(aDocument, aSelector); var l = ruleList.length; if (l) { for (var i = 0; i < l; i++) { var rule = ruleList[i].rule; var parentRule = rule.parentRule; var parentStyleSheet = rule.parentStyleSheet; var modified = false; if (rule.type == CssUtils.kCSSRule.STYLE_RULE && !parentRule) { if (aDeclarations) { for (var j = 0; j < aDeclarations.length; j++) if (rule.style.getPropertyValue(aDeclarations[j].property)) { rule.style.removeProperty(aDeclarations[j].property); modified = true; } if (!rule.style.length) { parentStyleSheet.deleteRule(ruleList[i].index); modified = true; } } else { parentStyleSheet.deleteRule(ruleList[i].index); modified = true; } } if (modified) this.reserializeEmbeddedStylesheet(parentStyleSheet, aEditor, aDocument); } } }, getStyleSheetForScreen: function(aDocument, aEditor) { var styleElements = aDocument.getElementsByTagName("style"); var stylesheet = null; if (styleElements.length) { // try to find a stylesheet for the correct media for (var i = 0; !stylesheet && i < styleElements.length; i++) { var styleElement = styleElements[i]; if (styleElement.hasAttribute("media")) { var mediaAttr = styleElement.getAttribute("media"); if (mediaAttr.indexOf("screen") != -1|| mediaAttr.indexOf("all") != -1) stylesheet = styleElement.sheet; } else stylesheet = styleElement.sheet; } } if (!stylesheet) { var styleElement = aDocument.createElement("style"); styleElement.setAttribute("type", "text/css"); var textNode = aDocument.createTextNode("\n"); styleElement.appendChild(textNode); var head = aDocument.getElementsByTagName("head")[0]; if (aEditor) aEditor.insertNode(styleElement, head, head.childNodes.length); else head.appendChild(styleElement); stylesheet = styleElement.sheet; } return stylesheet; }, addRuleForSelector: function(aEditor, aDocument, aSelector, aDeclarations) { this.deleteAllLocalRulesForSelector(aEditor, aDocument, aSelector, aDeclarations); var ruleList = this.getAllLocalRulesForSelector(aDocument, aSelector); var stylesheet; if (!ruleList || !ruleList.length) { stylesheet = this.getStyleSheetForScreen(aDocument, aEditor); var str = aSelector + " {"; for (var j = 0; j < aDeclarations.length; j++) { var property = aDeclarations[j].property; var value = aDeclarations[j].value; if (value) { var priority = aDeclarations[j].priority; str += "\n " + property + ": " + value + (priority ? " !important;" : ";"); } } str += "\n}\n"; stylesheet.insertRule(str, stylesheet.cssRules.length) } else { var rule = ruleList[ruleList.length -1].rule; stylesheet = rule.parentStyleSheet; for (var j = 0; j < aDeclarations.length; j++) { var property = aDeclarations[j].property; var value = aDeclarations[j].value; if (value) { var priority = aDeclarations[j].priority ? " !important" : ""; rule.style.setProperty(property, value, priority); } } } this.reserializeEmbeddedStylesheet(stylesheet, aEditor, aDocument); }, _reserializeEmbeddedStylesheet: function(aSheet, aTabs) { var cssRules = aSheet.cssRules; var str = ""; for (var i = 0; i < cssRules.length; i++) { var rule = cssRules[i]; str += (i ? "\n" : "") + rule.cssText + "\n"; } return str; }, reserializeEmbeddedStylesheet: function(aSheet, editor, aDocument) { var str = this._reserializeEmbeddedStylesheet(aSheet, ""); var styleEltForSheet = aSheet.ownerNode; var child = styleEltForSheet.firstChild; while (child) { var tmp = child.nextSibling; if (editor) editor.deleteNode(child); else styleEltForSheet.removeChild(child); child = tmp; } var prefs = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch); var cssParser = new CSSParser(str, (prefs.getCharPref("bluegriffon.css.serialization") != "shorthands")); if (str) { var parsedSheet = cssParser.parse(str, false, false); str = parsedSheet.cssText(); } var textNode; textNode = styleEltForSheet.ownerDocument.createTextNode("\n" + str); if (editor) editor.insertNode(textNode, styleEltForSheet, 0); else styleEltForSheet.appendChild(textNode); }, getUseCSSPref: function() { try { var useCSS = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch) .getIntPref("bluegriffon.css.policy"); return useCSS; } catch(e) { } return 0; } }; ================================================ FILE: modules/cssInspector.jsm ================================================ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is mozilla.org code. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1998 * the Initial Developer. All Rights Reserved. * * Contributor(s): * emk * Daniel Glazman * L. David Baron * Boris Zbarsky * Mats Palmgren * Christian Biesinger * Jeff Walden * Jonathon Jongsma , Collabora Ltd. * Siraj Razick , Collabora Ltd. * Daniel Glazman * * Alternatively, the contents of this file may be used under the terms of * either of the GNU General Public License Version 2 or later (the "GPL"), * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ var EXPORTED_SYMBOLS = ["CssInspector", "CSSParser"]; Components.utils.import("resource://gre/modules/cssProperties.jsm"); Components.utils.import("resource://gre/modules/fileChanges.jsm"); Components.utils.import("resource://gre/modules/Services.jsm"); const kCHARSET_RULE_MISSING_SEMICOLON = "Missing semicolon at the end of @charset rule"; const kCHARSET_RULE_CHARSET_IS_STRING = "The charset in the @charset rule should be a string"; const kCHARSET_RULE_MISSING_WS = "Missing mandatory whitespace after @charset"; const kIMPORT_RULE_MISSING_URL = "Missing URL in @import rule"; const kURL_EOF = "Unexpected end of stylesheet"; const kURL_WS_INSIDE = "Multiple tokens inside a url() notation"; const kVARIABLES_RULE_POSITION = "@variables rule invalid at this position in the stylesheet"; const kIMPORT_RULE_POSITION = "@import rule invalid at this position in the stylesheet"; const kNAMESPACE_RULE_POSITION = "@namespace rule invalid at this position in the stylesheet"; const kCHARSET_RULE_CHARSET_SOF = "@charset rule invalid at this position in the stylesheet"; const kUNKNOWN_AT_RULE = "Unknow @-rule"; /* FROM http://peter.sh/data/vendor-prefixed-css.php?js=1 */ const kCSS_VENDOR_VALUES = { "-moz-box": {"webkit": "-webkit-box", "presto": "", "trident": "", "generic": "box" }, "-moz-inline-box": {"webkit": "-webkit-inline-box", "presto": "", "trident": "", "generic": "inline-box" }, "-moz-initial": {"webkit": "", "presto": "", "trident": "", "generic": "initial" }, "flex": {"webkit": "-webkit-flex", "presto": "", "trident": "", "generic": "" }, "inline-flex": {"webkit": "-webkit-inline-flex", "presto": "", "trident": "", "generic": "" }, "linear-gradient": {"webkit20110101":FilterLinearGradient, "webkit": FilterLinearGradient, "presto": FilterLinearGradient, "trident": FilterLinearGradient, "gecko1.9.2": FilterLinearGradient }, "repeating-linear-gradient": {"webkit20110101":FilterLinearGradient, "webkit": FilterLinearGradient, "presto": FilterLinearGradient, "trident": FilterLinearGradient, "gecko1.9.2": FilterLinearGradient }, "radial-gradient": {"webkit20110101":FilterRadialGradient, "webkit": FilterRadialGradient, "presto": FilterRadialGradient, "trident": FilterRadialGradient, "gecko1.9.2": FilterRadialGradient }, "repeating-radial-gradient": {"webkit20110101":FilterRadialGradient, "webkit": FilterRadialGradient, "presto": FilterRadialGradient, "trident": FilterRadialGradient, "gecko1.9.2": FilterRadialGradient } }; const kCSS_PREFIXED_VALUE = [ {"gecko": "-moz-box", "webkit": "-moz-box", "presto": "", "trident": "", "generic": "box"} ]; var CssInspector = { kINIDOMUTILS: Components.interfaces.inIDOMUtils, kINIDOMUTILS_CID: "@mozilla.org/inspector/dom-utils;1", mVENDOR_PREFIXES: null, cleanPrefixes: function() { this.mVENDOR_PREFIXES = null; }, prefixesForProperty: function(aProperty) { if (!this.mVENDOR_PREFIXES) { var useBlink = true; var useGecko = true; var useServo = true; var useVivliostyle = true; var useWeasyprint = true; var useWebkit = true; try { var prefs = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch); useBlink = prefs.getBoolPref("bluegriffon.css.support.blink"); useGecko = prefs.getBoolPref("bluegriffon.css.support.gecko"); useServo = prefs.getBoolPref("bluegriffon.css.support.servo"); useVivliostyle = prefs.getBoolPref("bluegriffon.css.support.vivliostyle"); useWeasyprint = prefs.getBoolPref("bluegriffon.css.support.weasyprint"); useWebkit = prefs.getBoolPref("bluegriffon.css.support.webkit"); } catch(e) {} this.mVENDOR_PREFIXES = {}; for (var i in kCSS_PROPERTIES.properties) { var p = kCSS_PROPERTIES.properties[i]; if (p.gecko || p.blink || p.servo || p.vivliostyle || p.weasyprint || p.webkit) { var o = {}; if (!p.gecko) p.gecko = i; o.generic = i; if (useGecko) o.gecko = p.gecko if (useBlink && p.blink) o.blink = p.blink if (useServo && p.servo) o.servo = p.servo if (useWebkit && p.webkit) o.webkit = p.webkit if (useVivliostyle && p.vivliostyle) o.vivliostyle = p.vivliostyle; if (useWeasyprint && p.weasyprint) o.weasyprint = p.weasyprint; this.mVENDOR_PREFIXES[p.gecko] = []; for (var j in o) if (this.mVENDOR_PREFIXES[p.gecko].indexOf(o[j]) == -1) this.mVENDOR_PREFIXES[p.gecko].push(o[j]); } } } if (aProperty in this.mVENDOR_PREFIXES) return this.mVENDOR_PREFIXES[aProperty].sort(); return null; }, serializeFileStyleSheet: function(aSheet, aHref) { var cssRules = aSheet.cssRules; var str = ""; for (var i = 0; i < cssRules.length; i++) { var rule = cssRules[i]; str += (i ? "\n" : "") + rule.cssText + "\n"; } var prefs = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch); var cssParser = new CSSParser(str, (prefs.getCharPref("bluegriffon.css.serialization") != "shorthands")); if (str) { var parsedSheet = cssParser.parse(str, false, false); str = parsedSheet.cssText(); } const classes = Components.classes; const interfaces = Components.interfaces; const nsILocalFile = interfaces.nsILocalFile; const nsIFileOutputStream = interfaces.nsIFileOutputStream; const FILEOUT_CTRID = '@mozilla.org/network/file-output-stream;1'; var ios = Components.classes["@mozilla.org/network/io-service;1"] .getService(Components.interfaces.nsIIOService) var handler = ios.getProtocolHandler("file"); var fileHandler = handler.QueryInterface(Components.interfaces.nsIFileProtocolHandler); var localFile = fileHandler.getFileFromURLSpec(aHref).QueryInterface(nsILocalFile); var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"]. createInstance(Components.interfaces.nsIFileOutputStream); // use 0x02 | 0x10 to open file for appending. foStream.init(localFile, 0x02 | 0x08 | 0x20, 0x1b6, 0); // write, create, truncate // In a c file operation, we have no need to set file mode with or operation, // directly using "r" or "w" usually. // if you are sure there will never ever be any non-ascii text in data you can // also call foStream.writeData directly var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"]. createInstance(Components.interfaces.nsIConverterOutputStream); var charset = "UTF-8"; if (aSheet && aSheet.cssRules && aSheet.cssRules.length && aSheet.cssRules.item(0).type == Components.interfaces.nsIDOMCSSRule.CHARSET_RULE) charset = aSheet.cssRules.item(0).encoding; try { converter.init(foStream, charset, 0, 0); converter.writeString(str); converter.close(); // this closes foStream FileChangeUtils.notifyFileModifiedByBlueGriffon(aHref); } catch (ex) {} }, getCSSStyleRules: function(aElement, aNoInlineStyles, aDynamicPseudoClass) { var inspector = Components.classes[this.kINIDOMUTILS_CID] .getService(this.kINIDOMUTILS); var rules = inspector.getCSSStyleRules(aElement); var ruleset = []; var order = 0; var parser = new CSSParser(); for (var i = 0; i < rules.Count(); i++) { var r = rules.GetElementAt(i); var sheet = r.parentStyleSheet; while (sheet.parentStyleSheet) sheet = sheet.parentStyleSheet; if (sheet.ownerNode) { parser._init(); parser.mPreserveWS = false; parser.mPreserveComments = false; parser.mPreservedTokens = []; parser.mScanner.init(r.selectorText); var token = parser.getToken(false, false); if (token.isNotNull()) { var selector = parser.parseSelector(token, true); if (aDynamicPseudoClass) { // find the last sequence of simple selectors var match = r.selectorText.match( /[^>~+\s]+/g ); var lastSequence = match ? match[match.length - 1] : r.selectorText; if (lastSequence.toLowerCase().indexOf(":" + aDynamicPseudoClass) == -1) { // throw away if it's not matching the dynamic pseudo-class selector = null; } } if (selector) { ruleset.push( { rule: r, specificity: selector.specificity, order: order++}); } } } } if (!aNoInlineStyles) // don't forget the style attribute ruleset.push( { rule: aElement, specificity: {a:1, b:0, c:0, d:0}, order: order }); return ruleset; }, findLastRuleInRulesetForSelector: function(aRuleset, aSelectorText, aResponsiveRulerHelper, aProperty) { for (var i = aRuleset.length - 1 ; i >= 0; i--) if (aRuleset[i].rule.selectorText == aSelectorText) { var isGenericScreenMQ = true; var hasProperty = false; var hasPriority = ""; if (aResponsiveRulerHelper) { var constraints = aResponsiveRulerHelper.getConstraintsForCSSRule(aRuleset[i].rule); if (constraints && constraints.length) { var lastConstraint = constraints[constraints.length - 1]; if (lastConstraint) isGenericScreenMQ = (lastConstraint.minWidth == undefined && lastConstraint.maxWidth == undefined); hasProperty = (aRuleset[i].rule.style.getPropertyValue(aProperty) != ""); hasPriority = aRuleset[i].rule.style.getPropertyPriority(aProperty); } } else { // Responsive Design not enabled, we deal only with rules that don't have a parent rule... if (aRuleset[i].rule.parentRule) { isGenericScreenMQ = false; hasProperty = (aRuleset[i].rule.style.getPropertyValue(aProperty) != ""); hasPriority = aRuleset[i].rule.style.getPropertyPriority(aProperty); } } if (isGenericScreenMQ) return aRuleset[i].rule; if (hasProperty || !aResponsiveRulerHelper || aResponsiveRulerHelper.hasSelectedMediaQuery()) { if (hasProperty) return { priority: hasPriority }; return null; } } return null; }, findRuleForProperty: function(aRuleSet, aProperty, aResponsiveRulerHelper) { function filterByProperty(element, index, array) { return (element.rule.style.getPropertyValue(aProperty) != ""); } var rulesetForProperty = aRuleSet.filter(filterByProperty); function CascadeRules(aRule1, aRule2) { var s1 = aRule1.specificity; var s2 = aRule2.specificity; var order1 = aRule1.order; var order2 = aRule2.order; var priority1 = aRule1.rule.style.getPropertyPriority(aProperty); var priority2 = aRule2.rule.style.getPropertyPriority(aProperty); if (priority1 < priority2) return -1; if (priority1 > priority2) return +1; // at this point, priorities are the same if (s1.a > s2.a || (s1.a == s2.a && s1.b > s2.b) || (s1.a == s2.a && s1.b == s2.b && s1.c > s2.c) || (s1.a == s2.a && s1.b == s2.b && s1.c == s2.c && s1.d > s2.d)) return +1; if (s2.a > s2.a || (s2.a == s1.a && s2.b > s1.b) || (s2.a == s1.a && s2.b == s1.b && s2.c > s1.c) || (s2.a == s1.a && s2.b == s1.b && s2.c == s1.c && s2.d > s1.d)) return -1; // at this point, same priority and same specificity if (order1 < order2) return -1; if (order1 > order2) return +1; return 0; // should never happen } if (rulesetForProperty.length) { rulesetForProperty.sort(CascadeRules); rulesetForProperty[rulesetForProperty.length - 1].priority = rulesetForProperty[rulesetForProperty.length - 1].rule.style.getPropertyPriority(aProperty); var rv = rulesetForProperty[rulesetForProperty.length - 1]; var isGenericScreenMQ = true; if (aResponsiveRulerHelper) { var constraints = aResponsiveRulerHelper.getConstraintsForCSSRule(rv.rule); if (constraints && constraints.length) { var lastConstraint = constraints[constraints.length - 1]; if (lastConstraint) isGenericScreenMQ = (lastConstraint.minWidth == undefined && lastConstraint.maxWidth == undefined); } } if (isGenericScreenMQ) return rv; } return null; }, findAllRulesForProperty: function(aRuleSet, aProperty) { function filterByProperty(element, index, array) { return (element.rule.style.getPropertyValue(aProperty) != ""); } var rulesetForProperty = aRuleSet; function CascadeRules(aRule1, aRule2) { var s1 = aRule1.specificity; var s2 = aRule2.specificity; var order1 = aRule1.order; var order2 = aRule2.order; var priority1 = aRule1.rule.style.getPropertyPriority(aProperty); var priority2 = aRule2.rule.style.getPropertyPriority(aProperty); if (priority1 < priority2) return -1; if (priority1 > priority2) return +1; // at this point, priorities are the same if (s1.a > s2.a || (s1.a == s2.a && s1.b > s2.b) || (s1.a == s2.a && s1.b == s2.b && s1.c > s2.c) || (s1.a == s2.a && s1.b == s2.b && s1.c == s2.c && s1.d > s2.d)) return +1; if (s2.a > s2.a || (s2.a == s1.a && s2.b > s1.b) || (s2.a == s1.a && s2.b == s1.b && s2.c > s1.c) || (s2.a == s1.a && s2.b == s1.b && s2.c == s1.c && s2.d > s1.d)) return -1; // at this point, same priority and same specificity if (order1 < order2) return -1; if (order1 > order2) return +1; return 0; // should never happen } if (rulesetForProperty.length) { rulesetForProperty.sort(CascadeRules); rulesetForProperty[rulesetForProperty.length - 1].priority = rulesetForProperty[rulesetForProperty.length - 1].rule.style.getPropertyPriority(aProperty); return rulesetForProperty; } return null; }, getCascadedValue: function(aRuleSet, aProperty) { var r = this.findRuleForProperty(aRuleSet, aProperty); if (r && r.rule) return r.rule.style.getPropertyValue(aProperty); return ""; }, parseColorStop: function(parser, token) { var color = parser.parseColor(token); var position = ""; if (!color) return null; token = parser.getToken(true, true); if (token.isLength()) { position = token.value; token = parser.getToken(true, true); } return { color: color, position: position } }, parseGradient: function (parser, token) { var kHPos = {"left": true, "right": true }; var kVPos = {"top": true, "bottom": true }; var kPos = {"left": true, "right": true, "top": true, "bottom": true, "center": true}; var isRadial = false; var gradient = { isRepeating: false }; if (token.isNotNull()) { if (token.isFunction("linear-gradient(") || token.isFunction("radial-gradient(") || token.isFunction("repeating-linear-gradient(") || token.isFunction("repeating-radial-gradient(")) { if (token.isFunction("radial-gradient(") || token.isFunction("repeating-radial-gradient(")) { gradient.isRadial = true; } if (token.isFunction("repeating-linear-gradient(") || token.isFunction("repeating-radial-gradient(")) { gradient.isRepeating = true; } token = parser.getToken(true, true); var foundPosition = false; var haveAngle = false; /********** LINEAR **********/ if (token.isAngle()) { gradient.angle = token.value; haveAngle = true; token = parser.getToken(true, true); if (!token.isSymbol(",")) return null; token = parser.getToken(true, true); } else if (token.isIdent("to")) { foundPosition = true; token = parser.getToken(true, true); if (token.isIdent("top") || token.isIdent("bottom") || token.isIdent("left") || token.isIdent("right")) { gradient.position = token.value; token = parser.getToken(true, true); if (((gradient.position == "top" || gradient.position == "bottom") && (token.isIdent("left") || token.isIdent("right"))) || ((gradient.position == "left" || gradient.position == "right") && (token.isIdent("top") || token.isIdent("bottom")))) { gradient.position += " " + token.value; token = parser.getToken(true, true); } } else return null; if (!token.isSymbol(",")) return null; token = parser.getToken(true, true); } /********** RADIAL **********/ else if (gradient.isRadial) { gradient.shape = ""; gradient.extent = ""; gradient.positions = []; gradient.at = ""; while (!token.isIdent("at") && !token.isSymbol(",")) { if (!gradient.shape && (token.isIdent("circle") || token.isIdent("ellipse"))) { gradient.shape = token.value; token = parser.getToken(true, true); } else if (!gradient.extent && (token.isIdent("closest-corner") || token.isIdent("closes-side") || token.isIdent("farthest-corner") || token.isIdent("farthest-corner"))) { gradient.extent = token.value; token = parser.getToken(true, true); } else if (gradient.positions.length < 2 && token.isLength()){ gradient.positions.push(token.value); token = parser.getToken(true, true); } else break; } // verify if the shape is null of well defined if ((gradient.positions.length == 1 && !gradient.extent && (gradient.shape == "circle" || !gradient.shape)) || (gradient.positions.length == 2 && !gradient.extent && (gradient.shape == "ellipse" || !gradient.shape)) || (!gradient.positions.length && gradient.extent) || (!gradient.positions.length && !gradient.extent)) { // shape ok } else { return null; } if (token.isIdent("at")) { token = parser.getToken(true, true); if (((token.isIdent() && token.value in kPos) || token.isDimension() || token.isNumber("0") || token.isPercentage())) { gradient.at = token.value; token = parser.getToken(true, true); if (token.isDimension() || token.isNumber("0") || token.isPercentage()) { gradient.at += " " + token.value; } else if (token.isIdent() && token.value in kPos) { if ((gradient.at in kHPos && token.value in kHPos) || (gradient.at in kVPos && token.value in kVPos)) return ""; gradient.at += " " + token.value; } else { parser.ungetToken(); gradient.at += " center"; } } else return null; token = parser.getToken(true, true); } if (gradient.shape || gradient.extent || gradient.positions.length || gradient.at) { if (!token.isSymbol(",")) return null; token = parser.getToken(true, true); } } // now color stops... var stop1 = this.parseColorStop(parser, token); if (!stop1) return null; token = parser.currentToken(); if (!token.isSymbol(",")) return null; token = parser.getToken(true, true); var stop2 = this.parseColorStop(parser, token); if (!stop2) return null; token = parser.currentToken(); if (token.isSymbol(",")) { token = parser.getToken(true, true); } // ok we have at least two color stops gradient.stops = [stop1, stop2]; while (!token.isSymbol(")")) { var colorstop = this.parseColorStop(parser, token); if (!colorstop) return null; token = parser.currentToken(); if (!token.isSymbol(")") && !token.isSymbol(",")) return null; if (token.isSymbol(",")) token = parser.getToken(true, true); gradient.stops.push(colorstop); } return gradient; } } return null; }, parseBoxShadows: function(aString) { var parser = new CSSParser(); parser._init(); parser.mPreserveWS = false; parser.mPreserveComments = false; parser.mPreservedTokens = []; parser.mScanner.init(aString); var shadows = []; var token = parser.getToken(true, true); var color = "", blurRadius = "0px", offsetX = "0px", offsetY = "0px", spreadRadius = "0px"; var inset = false; while (token.isNotNull()) { if (token.isIdent("none")) { shadows.push( { none: true } ); token = parser.getToken(true, true); } else { if (token.isIdent('inset')) { inset = true; token = parser.getToken(true, true); } if (token.isPercentage() || token.isDimensionOfUnit("cm") || token.isDimensionOfUnit("mm") || token.isDimensionOfUnit("in") || token.isDimensionOfUnit("pc") || token.isDimensionOfUnit("px") || token.isDimensionOfUnit("em") || token.isDimensionOfUnit("ex") || token.isDimensionOfUnit("pt")) { var offsetX = token.value; token = parser.getToken(true, true); } else return []; if (!inset && token.isIdent('inset')) { inset = true; token = parser.getToken(true, true); } if (token.isPercentage() || token.isDimensionOfUnit("cm") || token.isDimensionOfUnit("mm") || token.isDimensionOfUnit("in") || token.isDimensionOfUnit("pc") || token.isDimensionOfUnit("px") || token.isDimensionOfUnit("em") || token.isDimensionOfUnit("ex") || token.isDimensionOfUnit("pt")) { var offsetY = token.value; token = parser.getToken(true, true); } else return []; if (!inset && token.isIdent('inset')) { inset = true; token = parser.getToken(true, true); } if (token.isPercentage() || token.isDimensionOfUnit("cm") || token.isDimensionOfUnit("mm") || token.isDimensionOfUnit("in") || token.isDimensionOfUnit("pc") || token.isDimensionOfUnit("px") || token.isDimensionOfUnit("em") || token.isDimensionOfUnit("ex") || token.isDimensionOfUnit("pt")) { var blurRadius = token.value; token = parser.getToken(true, true); } if (!inset && token.isIdent('inset')) { inset = true; token = parser.getToken(true, true); } if (token.isPercentage() || token.isDimensionOfUnit("cm") || token.isDimensionOfUnit("mm") || token.isDimensionOfUnit("in") || token.isDimensionOfUnit("pc") || token.isDimensionOfUnit("px") || token.isDimensionOfUnit("em") || token.isDimensionOfUnit("ex") || token.isDimensionOfUnit("pt")) { var spreadRadius = token.value; token = parser.getToken(true, true); } if (!inset && token.isIdent('inset')) { inset = true; token = parser.getToken(true, true); } if (token.isFunction("rgb(") || token.isFunction("rgba(") || token.isFunction("hsl(") || token.isFunction("hsla(") || token.isSymbol("#") || token.isIdent()) { var color = parser.parseColor(token); token = parser.getToken(true, true); } if (!inset && token.isIdent('inset')) { inset = true; token = parser.getToken(true, true); } shadows.push( { none: false, color: color, offsetX: offsetX, offsetY: offsetY, blurRadius: blurRadius, spreadRadius: spreadRadius, inset: inset } ); if (token.isSymbol(",")) { inset = false; color = ""; blurRadius = "0px"; spreadRadius = "0px" offsetX = "0px"; offsetY = "0px"; token = parser.getToken(true, true); } else if (!token.isNotNull()) return shadows; else return []; } } return shadows; }, parseTextShadows: function(aString) { var parser = new CSSParser(); parser._init(); parser.mPreserveWS = false; parser.mPreserveComments = false; parser.mPreservedTokens = []; parser.mScanner.init(aString); var shadows = []; var token = parser.getToken(true, true); var color = "", blurRadius = "0px", offsetX = "0px", offsetY = "0px"; while (token.isNotNull()) { if (token.isIdent("none")) { shadows.push( { none: true } ); token = parser.getToken(true, true); } else { if (token.isFunction("rgb(") || token.isFunction("rgba(") || token.isFunction("hsl(") || token.isFunction("hsla(") || token.isSymbol("#") || token.isIdent()) { var color = parser.parseColor(token); token = parser.getToken(true, true); } if (token.isPercentage() || token.isDimensionOfUnit("cm") || token.isDimensionOfUnit("mm") || token.isDimensionOfUnit("in") || token.isDimensionOfUnit("pc") || token.isDimensionOfUnit("px") || token.isDimensionOfUnit("em") || token.isDimensionOfUnit("ex") || token.isDimensionOfUnit("pt")) { var offsetX = token.value; token = parser.getToken(true, true); } else return []; if (token.isPercentage() || token.isDimensionOfUnit("cm") || token.isDimensionOfUnit("mm") || token.isDimensionOfUnit("in") || token.isDimensionOfUnit("pc") || token.isDimensionOfUnit("px") || token.isDimensionOfUnit("em") || token.isDimensionOfUnit("ex") || token.isDimensionOfUnit("pt")) { var offsetY = token.value; token = parser.getToken(true, true); } else return []; if (token.isPercentage() || token.isDimensionOfUnit("cm") || token.isDimensionOfUnit("mm") || token.isDimensionOfUnit("in") || token.isDimensionOfUnit("pc") || token.isDimensionOfUnit("px") || token.isDimensionOfUnit("em") || token.isDimensionOfUnit("ex") || token.isDimensionOfUnit("pt")) { var blurRadius = token.value; token = parser.getToken(true, true); } if (!color && (token.isFunction("rgb(") || token.isFunction("rgba(") || token.isFunction("hsl(") || token.isFunction("hsla(") || token.isSymbol("#") || token.isIdent())) { var color = parser.parseColor(token); token = parser.getToken(true, true); } shadows.push( { none: false, color: color, offsetX: offsetX, offsetY: offsetY, blurRadius: blurRadius } ); if (token.isSymbol(",")) { color = ""; blurRadius = "0px"; offsetX = "0px"; offsetY = "0px"; token = parser.getToken(true, true); } else if (!token.isNotNull()) return shadows; else return []; } } return shadows; }, parseBackgroundImages: function(aString) { var parser = new CSSParser(); parser._init(); parser.mPreserveWS = false; parser.mPreserveComments = false; parser.mPreservedTokens = []; parser.mScanner.init(aString); var backgrounds = []; var token = parser.getToken(true, true); while (token.isNotNull()) { /*if (token.isFunction("rgb(") || token.isFunction("rgba(") || token.isFunction("hsl(") || token.isFunction("hsla(") || token.isSymbol("#") || token.isIdent()) { var color = parser.parseColor(token); backgrounds.push( { type: "color", value: color }); token = parser.getToken(true, true); } else */ if (token.isFunction("url(")) { token = parser.getToken(true, true); var urlContent = parser.parseURL(token); backgrounds.push( { type: "image", value: "url(" + urlContent }); token = parser.getToken(true, true); } else if (token.isFunction("linear-gradient(") || token.isFunction("radial-gradient(") || token.isFunction("repeating-linear-gradient(") || token.isFunction("repeating-radial-gradient(")) { var gradient = this.parseGradient(parser, token); backgrounds.push( { type: gradient.isRadial ? "radial-gradient" : "linear-gradient", value: gradient }); token = parser.getToken(true, true); } else if (token.isIdent("none") || token.isIdent("inherit") || token.isIdent("initial")) { backgrounds.push( { type: token.value }); token = parser.getToken(true, true); } else return null; if (token.isSymbol(",")) { token = parser.getToken(true, true); if (!token.isNotNull()) return null; } } return backgrounds; }, serializeGradient: function(gradient) { var s = gradient.isRadial ? (gradient.isRepeating ? "repeating-radial-gradient(" : "radial-gradient(" ) : (gradient.isRepeating ? "repeating-linear-gradient(" : "linear-gradient(" ); if (gradient.angle || gradient.position) s += (gradient.angle ? gradient.angle: "") + (gradient.position ? "to " + gradient.position : "") + ", "; if (gradient.isRadial) s += (gradient.shape ? gradient.shape + " " : "") + (gradient.extent ? gradient.extent + " " : "") + (gradient.positions.length ? gradient.positions.join(" ") + " " : "") + (gradient.at ? "at " + gradient.at + " " : "") + (gradient.shape || gradient.extent || gradient.positions.length || gradient.at ? ", " : ""); for (var i = 0; i < gradient.stops.length; i++) { var colorstop = gradient.stops[i]; s += colorstop.color + (colorstop.position ? " " + colorstop.position : ""); if (i != gradient.stops.length -1) s += ", "; } s += ")"; return s; }, parseBorderImage: function(aString) { var parser = new CSSParser(); parser._init(); parser.mPreserveWS = false; parser.mPreserveComments = false; parser.mPreservedTokens = []; parser.mScanner.init(aString); var borderImage = {url: "", offsets: [], widths: [], sizes: []}; var token = parser.getToken(true, true); if (token.isFunction("url(")) { token = parser.getToken(true, true); var urlContent = parser.parseURL(token); if (urlContent) { borderImage.url = urlContent.substr(0, urlContent.length - 1).trim(); if ((borderImage.url[0] == '"' && borderImage.url[borderImage.url.length - 1] == '"') || (borderImage.url[0] == "'" && borderImage.url[borderImage.url.length - 1] == "'")) borderImage.url = borderImage.url.substr(1, borderImage.url.length - 2); } else return null; } else return null; token = parser.getToken(true, true); if (token.isNumber() || token.isPercentage()) borderImage.offsets.push(token.value); else return null; var i; for (i= 0; i < 3; i++) { token = parser.getToken(true, true); if (token.isNumber() || token.isPercentage()) borderImage.offsets.push(token.value); else break; } if (i == 3) token = parser.getToken(true, true); if (token.isSymbol("/")) { token = parser.getToken(true, true); if (token.isDimension() || token.isNumber("0") || (token.isIdent() && token.value in parser.kBORDER_WIDTH_NAMES)) borderImage.widths.push(token.value); else return null; for (var i = 0; i < 3; i++) { token = parser.getToken(true, true); if (token.isDimension() || token.isNumber("0") || (token.isIdent() && token.value in parser.kBORDER_WIDTH_NAMES)) borderImage.widths.push(token.value); else break; } if (i == 3) token = parser.getToken(true, true); } for (var i = 0; i < 2; i++) { if (token.isIdent("stretch") || token.isIdent("repeat") || token.isIdent("round")) borderImage.sizes.push(token.value); else if (!token.isNotNull()) return borderImage; else return null; token = parser.getToken(true, true); } if (!token.isNotNull()) return borderImage; return null; }, getWebFonts: function(aDocument) { var ss = aDocument.styleSheets; var webFonts = {}; for (var i = 0; i < ss.length; i++) { var s = ss[i]; this.findWebFontsInStylesheet(s, webFonts); } return webFonts; }, findWebFontsInStylesheet: function (aSheet, aFonts) { var rules = aSheet.cssRules; for (var j = 0; j < rules.length; j++) { var rule = rules.item(j); switch (rule.type) { case Components.interfaces.nsIDOMCSSRule.IMPORT_RULE: this.findWebFontsInStylesheet(rule.styleSheet, aFonts); break; case Components.interfaces.nsIDOMCSSRule.FONT_FACE_RULE: { var fontFace = rule.style.getPropertyValue("font-family").trim(); if ((fontFace[0] == "'" && fontFace[fontFace.length - 1] == "'") || (fontFace[0] == '"' && fontFace[fontFace.length - 1] == '"')) fontFace = fontFace.substr(1, fontFace.length - 2); aFonts[fontFace] = true; } break; default: break; } } }, parseMediaQuery: function(aString) { const kCONSTRAINTS = { "width": true, "min-width": true, "max-width": true, "height": true, "min-height": true, "max-height": true, "device-width": true, "min-device-width": true, "max-device-width": true, "device-height": true, "min-device-height": true, "max-device-height": true, "orientation": true, "aspect-ratio": true, "min-aspect-ratio": true, "max-aspect-ratio": true, "device-aspect-ratio": true, "min-device-aspect-ratio": true, "max-device-aspect-ratio": true, "color": true, "min-color": true, "max-color": true, "color-index": true, "min-color-index": true, "max-color-index": true, "monochrome": true, "min-monochrome": true, "max-monochrome": true, "resolution": true, "min-resolution": true, "max-resolution": true, "scan": true, "grid": true }; var parser = new CSSParser(); parser._init(); parser.mPreserveWS = false; parser.mPreserveComments = false; parser.mPreservedTokens = []; parser.mScanner.init(aString); var m = {amplifier: "", medium: "", constraints: []}; var token = parser.getToken(true, true); if (token.isIdent("all") || token.isIdent("aural") || token.isIdent("braille") || token.isIdent("handheld") || token.isIdent("print") || token.isIdent("projection") || token.isIdent("screen") || token.isIdent("tty") || token.isIdent("tv")) { m.medium = token.value; token = parser.getToken(true, true); } else if (token.isIdent("not") || token.isIdent("only")) { m.amplifier = token.value; token = parser.getToken(true, true); if (token.isIdent("all") || token.isIdent("aural") || token.isIdent("braille") || token.isIdent("handheld") || token.isIdent("print") || token.isIdent("projection") || token.isIdent("screen") || token.isIdent("tty") || token.isIdent("tv")) { m.medium = token.value; token = parser.getToken(true, true); } else return null; } if (m.medium) { if (!token.isNotNull()) return m; if (token.isIdent("and")) { token = parser.getToken(true, true); } else return null; } while (token.isSymbol("(")) { token = parser.getToken(true, true); if (token.isIdent() && (token.value in kCONSTRAINTS)) { var constraint = token.value; token = parser.getToken(true, true); if (token.isSymbol(":")) { token = parser.getToken(true, true); var values = []; while (!token.isSymbol(")")) { values.push(token.value); token = parser.getToken(true, true); } if (token.isSymbol(")")) { m.constraints.push({constraint: constraint, value: values}); token = parser.getToken(true, true); if (token.isNotNull()) { if (token.isIdent("and")) { token = parser.getToken(true, true); } else return null; } else return m; } else return null; } else if (token.isSymbol(")")) { m.constraints.push({constraint: constraint, value: null}); token = parser.getToken(true, true); if (token.isNotNull()) { if (token.isIdent("and")) { token = parser.getToken(true, true); } else return null; } else return m; } else return null; } else return null; } return m; }, /************************** GRID-TEMPLATE-ROWS/COLUMNS **************************/ parseGridAutoRepeat: function(parser, token) { // repeat( [ auto-fill | auto-fit ] , [ ? ]+ ? ) if (!token.isNotNull()) return null; if (!token.isFunction("repeat(")) return ""; token = parser.getToken(true, true); if (!token.isNotNull()) return null; if (token.isIdent("auto-fill") || token.isIdent("auto-fit")) { rv = new gridAutoRepeat(token.value); token = parser.getToken(true, true); if (!token.isNotNull()) return null; if (!token.isSymbol(",")) return ""; token = parser.getToken(true, true); if (!token.isNotNull()) return null; var lineNames = null; while (token.isNotNull()) { parser.preserveState(); lineNames = this.parseGridLineNames(parser, token); if (lineNames) { parser.forgetState(); token = parser.getToken(true, true); if (!token.isNotNull()) return null; } else parser.restoreState(); var argument = this.parseGridFixedSize(parser, token); if (null == argument) { return null; } if (!argument) { break; } var track = new gridTrack(lineNames ? Array.from(lineNames) : null, argument); rv.fixedSizingFunctions.push(track); lineNames = null; token = parser.getToken(true, true); } if (rv.fixedSizingFunctions.length < 1) return ""; if (lineNames) { rv.endLineNames = Array.from(lineNames); if (!parser.currentToken().isNotNull()) return null; } if (!parser.currentToken().isSymbol(")")) return ""; return rv; } return ""; }, parseGridFixedRepeat: function(parser, token) { // repeat( [ ] , [ ? ]+ ? ) if (!token.isNotNull()) return null; if (!token.isFunction("repeat(")) return ""; token = parser.getToken(true, true); if (!token.isNotNull()) return null; if (token.isNumber()) { var positiveInteger = parseFloat(token.value); if (positiveInteger > 0 && positiveInteger == Math.floor(positiveInteger)) { rv = new gridFixedRepeat(positiveInteger); token = parser.getToken(true, true); if (!token.isNotNull()) return null; if (!token.isSymbol(",")) return ""; token = parser.getToken(true, true); if (!token.isNotNull()) return null; var lineNames = null; while (token.isNotNull()) { parser.preserveState(); lineNames = this.parseGridLineNames(parser, token); if (lineNames) { parser.forgetState(); token = parser.getToken(true, true); if (!token.isNotNull()) return null; } else parser.restoreState(); var argument = this.parseGridFixedSize(parser, token); if (null == argument) { return null; } if (!argument) { break; } parser.forgetState(); var track = new gridTrack(lineNames ? Array.from(lineNames) : null, argument); rv.fixedSizingFunctions.push(track); lineNames = null; token = parser.getToken(true, true); } if (rv.fixedSizingFunctions.length < 1) return ""; if (lineNames) { rv.endLineNames = Array.from(lineNames); if (!parser.currentToken().isNotNull()) return null; } if (!parser.currentToken().isSymbol(")")) return ""; return rv; } } return ""; }, parseGridTrackRepeat: function(parser, token) { // repeat( [ ] , [ ? ]+ ? ) if (!token.isNotNull()) return null; if (!token.isFunction("repeat(")) return ""; token = parser.getToken(true, true); if (!token.isNotNull()) return null; if (token.isNumber()) { var positiveInteger = parseFloat(token.value); if (positiveInteger > 0 && positiveInteger == Math.floor(positiveInteger)) { rv = new gridTrackRepeat(positiveInteger); token = parser.getToken(true, true); if (!token.isNotNull()) return null; if (!token.isSymbol(",")) return ""; token = parser.getToken(true, true); if (!token.isNotNull()) return null; var lineNames = null; while (token.isNotNull()) { parser.preserveState(); lineNames = this.parseGridLineNames(parser, token); if (lineNames) { parser.forgetState(); token = parser.getToken(true, true); if (!token.isNotNull()) return null; } else parser.restoreState(); var argument = this.parseGridTrackSize(parser, token); if (null == argument) { return null; } if (!argument) { break; } var track = new gridTrack(lineNames ? Array.from(lineNames) : null, argument); rv.trackSizingFunctions.push(track); lineNames = null; token = parser.getToken(true, true); } if (rv.trackSizingFunctions.length < 1) return ""; if (lineNames) { rv.endLineNames = Array.from(lineNames); if (!parser.currentToken().isNotNull()) return null; } if (!parser.currentToken().isSymbol(")")) return ""; return rv; } } return ""; }, parseGridAutoTrackList: function(parser, token) { // [ ? [ | ] ]* ? // [ ? [ | ] ]* ? if (!token.isNotNull()) return null; var rv = new gridAutoTrackList(); var lineNames = null; while (token.isNotNull()) { parser.preserveState(); lineNames = this.parseGridLineNames(parser, token); if (lineNames) { parser.forgetState(); token = parser.getToken(true, true); } else parser.restoreState(); parser.preserveState(); var argument = this.parseGridFixedSize(parser, token); if (null == argument) { parser.forgetState(); return null; } if (!argument) { argument = this.parseGridFixedRepeat(parser, token); if (null == argument) { parser.forgetState(); return null; } if (!argument) { parser.restoreState(); break; } } else parser.forgetState(); var track = new gridTrack(lineNames ? Array.from(lineNames) : null, argument); rv.startEntries.push(track); lineNames = null; token = parser.getToken(true, true); } if (lineNames) { rv.startLineNames = Array.from(lineNames); } var autoRepeat = this.parseGridAutoRepeat(parser, token); if (!autoRepeat) return autoRepeat; rv.autoRepeat = autoRepeat; token = parser.getToken(true, true); lineNames = null; while (token.isNotNull()) { parser.preserveState(); lineNames = this.parseGridLineNames(parser, token); if (lineNames) { parser.forgetState(); token = parser.getToken(true, true); } else parser.restoreState(); parser.preserveState(); var argument = this.parseGridFixedSize(parser, token); if (null == argument) { parser.forgetState(); return null; } if (!argument) { argument = this.parseGridFixedRepeat(parser, token); if (null == argument) { parser.forgetState(); return null; } if (!argument) { parser.restoreState(); break; } } else parser.forgetState(); var track = new gridTrack(lineNames ? Array.from(lineNames) : null, argument); rv.endEntries.push(track); lineNames = null; token = parser.getToken(true, true); } if (lineNames) { rv.endLineNames = Array.from(lineNames); } return rv; }, parseGridTrackList: function(parser, token) { // [ ? [ | ] ]+ ? if (!token.isNotNull()) return null; var rv = new gridTrackList(); var lineNames = null; while (token.isNotNull()) { parser.preserveState(); lineNames = this.parseGridLineNames(parser, token); if (lineNames) { parser.forgetState(); token = parser.getToken(true, true); if (!token.isNotNull()) break; } else parser.restoreState(); parser.preserveState(); var argument = this.parseGridTrackSize(parser, token); if (null == argument) { parser.forgetState(); return null; } if (!argument) { parser.restoreState(); parser.preserveState(); argument = this.parseGridTrackRepeat(parser, token); if (null == argument) { parser.forgetState(); return null; } if (!argument) { parser.restoreState(); break; } parser.forgetState(); } else parser.forgetState(); var track = new gridTrack(lineNames ? Array.from(lineNames) : null, argument); rv.entries.push(track); lineNames = null; token = parser.getToken(true, true); } if (rv.entries.length < 1 || token.isNotNull()) return ""; if (lineNames) { rv.lineNames = Array.from(lineNames); } return rv; }, parseGridTrackSize: function(parser, token) { // | minmax( , ) | fit-content( ) if (!token.isNotNull()) return null; var trackBreadth = this.parseGridTrackBreadth(parser, token); if (null == trackBreadth) return null; if ("" == trackBreadth) { if (token.isFunction("minmax(")) { token = parser.getToken(true, true); var firstArgument = this.parseGridInflexibleBreadth(parser, token); if (!firstArgument) return firstArgument; token = parser.getToken(true, true); if (!token.isSymbol(",")) return null; token = parser.getToken(true, true); if (!token.isNotNull()) return null; var secondArgument = this.parseGridTrackBreadth(parser, token); if (!secondArgument) return null; token = parser.getToken(true, true); if (!token.isSymbol(")")) return null; // make a struct and return it return new gridTrackSize("minmax", firstArgument, secondArgument); } else if (token.isFunction("fit-content(")) { token = parser.getToken(true, true); var firstArgument = this.parseGridFixedBreadth(parser, token); if (!firstArgument) return firstArgument; token = parser.getToken(true, true); if (!token.isSymbol(")")) return null; // make a struct and return it return new gridTrackSize("fit-content", firstArgument, secondArgument); } return ""; } return new gridTrackSize("track-breadth", trackBreadth); }, parseGridFixedSize: function(parser, token) { // | minmax( , ) | minmax( , ) if (!token.isNotNull()) return null; var fixedBreadth = this.parseGridFixedBreadth(parser, token); if (null == fixedBreadth) return null; if ("" == fixedBreadth) { if (!token.isFunction("minmax(")) return ""; token = parser.getToken(true, true); var firstArgument = this.parseGridFixedBreadth(parser, token); if (null == firstArgument) return null; if ("" == firstArgument) { firstArgument = this.parseGridInflexibleBreadth(parser, token); if (!firstArgument) return firstArgument; token = parser.getToken(true, true); if (!token.isSymbol(",")) return null; token = parser.getToken(true, true); var secondArgument = this.parseGridFixedBreadth(parser, token); if (!secondArgument) return null; token = parser.getToken(true, true); if (!token.isSymbol(")")) return null; // make a struct and return it return new gridFixedSize("minmax", firstArgument, secondArgument); } token = parser.getToken(true, true); if (!token.isSymbol(",")) return null; token = parser.getToken(true, true); var secondArgument = this.parseGridTrackBreadth(parser, token); if (!secondArgument) return null; token = parser.getToken(true, true); if (!token.isSymbol(")")) return null; // make a struct and return it return new gridFixedSize("minmax", firstArgument, secondArgument); } return new gridFixedSize("fixed-breadth", fixedBreadth); }, parseGridTrackBreadth: function(parser, token) { // A non-negative length or percentage, as defined by CSS3 Values. if (!token.isNotNull()) return null; if (!(token.isLength() && parseFloat(token.value) > 0) && !(token.isDimensionOfUnit("fr") && parseFloat(token.value) > 0) && !token.isIdent("min-content") && !token.isIdent("max-content") && !token.isIdent("auto")) return ""; return token; }, parseGridInflexibleBreadth: function(parser, token) { // A non-negative length or percentage, as defined by CSS3 Values. if (!token.isNotNull()) return null; if (!(token.isLength() && parseFloat(token.value) > 0) && !token.isIdent("min-content") && !token.isIdent("max-content") && !token.isIdent("auto")) return ""; return token; }, parseGridFixedBreadth: function(parser, token) { // A non-negative length or percentage, as defined by CSS3 Values. if (!token.isNotNull()) return null; if (!token.isLength()) return ""; if (parseFloat(token.value) < 0) return ""; return token; }, parseGridLineNames: function(parser, token) { if (!token.isNotNull()) return null; if (!token.isSymbol("[")) return ""; token = parser.getToken(true, true); var rv = []; while (token.isNotNull()) { if (token.isIdent() && !token.isIdent("span")) rv.push(token.value); else if (token.isSymbol("]")) return rv; else return ""; token = parser.getToken(true, true); } return null; }, parseGridTemplateRowsOrColumns: function(aString) { var parser = new CSSParser(); parser._init(); parser.mPreserveWS = false; parser.mPreserveComments = false; parser.mPreservedTokens = []; parser.mScanner.init(aString); var token = parser.getToken(true, true); if (!token.isNotNull()) return null; if (token.isIdent("none")) return new gridNone(); parser.preserveState(); var rv = this.parseGridTrackList(parser, token); if (rv) return rv; parser.restoreState(); rv = this.parseGridAutoTrackList(parser, token); return rv; }, parseGridTemplateAreas: function(aString) { var parser = new CSSParser(); parser._init(); parser.mPreserveWS = false; parser.mPreserveComments = false; parser.mPreservedTokens = []; parser.mScanner.init(aString); var token = parser.getToken(true, true); if (!token.isNotNull()) return null; var rv = []; if (token.isIdent("none")) { rv.push(token.value); return rv; } while (token.isNotNull()) { if (token.isString()) rv.push(token.value); else return null; token = parser.getToken(true, true); } if (token.isNotNull()) return null; return rv; }, parseGridAutoRowsOrColumns: function(aString) { var parser = new CSSParser(); parser._init(); parser.mPreserveWS = false; parser.mPreserveComments = false; parser.mPreservedTokens = []; parser.mScanner.init(aString); var token = parser.getToken(true, true); if (!token.isNotNull()) return null; var rv = []; while (token.isNotNull()) { var trackSize = this.parseGridTrackSize(parser, token); if (trackSize) rv.push(trackSize); else return null; token = parser.getToken(true, true); } return rv; } }; /************************************************************/ /************************** JSCSSP **************************/ /************************************************************/ var CSS_ESCAPE = '\\'; var IS_HEX_DIGIT = 1; var START_IDENT = 2; var IS_IDENT = 4; var IS_WHITESPACE = 8; var W = IS_WHITESPACE; var I = IS_IDENT; var S = START_IDENT; var SI = IS_IDENT|START_IDENT; var XI = IS_IDENT |IS_HEX_DIGIT; var XSI = IS_IDENT|START_IDENT|IS_HEX_DIGIT; function CSSScanner(aString) { this.init(aString); } CSSScanner.prototype = { kLexTable: [ // TAB LF FF CR 0, 0, 0, 0, 0, 0, 0, 0, 0, W, W, 0, W, W, 0, 0, // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // SPC ! " # $ % & ' ( ) * + , - . / W, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, I, 0, 0, // 0 1 2 3 4 5 6 7 8 9 : ; < = > ? XI, XI, XI, XI, XI, XI, XI, XI, XI, XI, 0, 0, 0, 0, 0, 0, // @ A B C D E F G H I J K L M N O 0, XSI,XSI,XSI,XSI,XSI,XSI,SI, SI, SI, SI, SI, SI, SI, SI, SI, // P Q R S T U V W X Y Z [ \ ] ^ _ SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, 0, S, 0, 0, SI, // ` a b c d e f g h i j k l m n o 0, XSI,XSI,XSI,XSI,XSI,XSI,SI, SI, SI, SI, SI, SI, SI, SI, SI, // p q r s t u v w x y z { | } ~ SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, 0, 0, 0, 0, 0, // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ 0, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, // ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, // À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, // Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, // à á â ã ä å æ ç è é ê ë ì í î ï SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, // ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI, SI ], kHexValues: { "0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9, "a": 10, "b": 11, "c": 12, "d": 13, "e": 14, "f": 15 }, mString : "", mPos : 0, mPreservedPos : [], init: function(aString) { this.mString = aString; this.mPos = 0; this.mPreservedPos = []; }, getCurrentPos: function() { return this.mPos; }, getAlreadyScanned: function() { return this.mString.substr(0, this.mPos); }, preserveState: function() { this.mPreservedPos.push(this.mPos); }, restoreState: function() { if (this.mPreservedPos.length) { this.mPos = this.mPreservedPos.pop(); } }, forgetState: function() { if (this.mPreservedPos.length) { this.mPreservedPos.pop(); } }, read: function() { if (this.mPos < this.mString.length) return this.mString.charAt(this.mPos++); return -1; }, peek: function() { if (this.mPos < this.mString.length) return this.mString.charAt(this.mPos); return -1; }, isHexDigit: function(c) { var code = c.charCodeAt(0); return (code < 256 && (this.kLexTable[code] & IS_HEX_DIGIT) != 0); }, isIdentStart: function(c) { var code = c.charCodeAt(0); return (code >= 256 || (this.kLexTable[code] & START_IDENT) != 0); }, startsWithIdent: function(aFirstChar, aSecondChar) { if (aFirstChar == "-" && aSecondChar == "-" && this.mPos+1 < this.mString.length && this.isIdentStart(this.mString.charAt(this.mPos+1))) return true; return this.isIdentStart(aFirstChar) || (aFirstChar == "-" && this.isIdentStart(aSecondChar)); }, isIdent: function(c) { var code = c.charCodeAt(0); return (code >= 256 || (this.kLexTable[code] & IS_IDENT) != 0); }, pushback: function() { this.mPos--; }, nextHexValue: function() { var c = this.read(); if (c == -1 || !this.isHexDigit(c)) return new jscsspToken(jscsspToken.NULL_TYPE, null); var s = c; c = this.read(); while (c != -1 && this.isHexDigit(c)) { s += c; c = this.read(); } if (c != -1) this.pushback(); return new jscsspToken(jscsspToken.HEX_TYPE, s); }, gatherEscape: function() { var c = this.peek(); if (c == -1) return ""; if (this.isHexDigit(c)) { var code = 0; for (var i = 0; i < 6; i++) { c = this.read(); if (this.isHexDigit(c)) code = code * 16 + this.kHexValues[c.toLowerCase()]; else if (!this.isHexDigit(c) && !this.isWhiteSpace(c)) { this.pushback(); break; } else break; } if (i == 6) { c = this.peek(); if (this.isWhiteSpace(c)) this.read(); } return String.fromCharCode(code); } c = this.read(); if (c != "\n") return c; return ""; }, gatherIdent: function(c) { var s = ""; if (c == CSS_ESCAPE) s += this.gatherEscape(); else s += c; c = this.read(); while (c != -1 && (this.isIdent(c) || c == CSS_ESCAPE)) { if (c == CSS_ESCAPE) s += this.gatherEscape(); else s += c; c = this.read(); } if (c != -1) this.pushback(); return s; }, parseIdent: function(c) { var value = this.gatherIdent(c); var nextChar = this.peek(); if (nextChar == "(") { value += this.read(); return new jscsspToken(jscsspToken.FUNCTION_TYPE, value); } return new jscsspToken(jscsspToken.IDENT_TYPE, value); }, isDigit: function(c) { return (c >= '0') && (c <= '9'); }, parseComment: function(c) { var s = c; while ((c = this.read()) != -1) { s += c; if (c == "*") { c = this.read(); if (c == -1) break; if (c == "/") { s += c; break; } this.pushback(); } } return new jscsspToken(jscsspToken.COMMENT_TYPE, s); }, parseNumber: function(c) { var s = c; var foundDot = false; while ((c = this.read()) != -1) { if (c == ".") { if (foundDot) break; else { s += c; foundDot = true; } } else if (this.isDigit(c)) s += c; else break; } if (c != -1 && this.startsWithIdent(c, this.peek())) { // DIMENSION var unit = this.gatherIdent(c); s += unit; return new jscsspToken(jscsspToken.DIMENSION_TYPE, s, unit); } else if (c == "%") { s += "%"; return new jscsspToken(jscsspToken.PERCENTAGE_TYPE, s); } else if (c != -1) this.pushback(); return new jscsspToken(jscsspToken.NUMBER_TYPE, s); }, parseString: function(aStop) { var s = aStop; var previousChar = aStop; var c; while ((c = this.read()) != -1) { if (c == aStop && previousChar != CSS_ESCAPE) { s += c; break; } else if (c == CSS_ESCAPE) { c = this.peek(); if (c == -1) break; else if (c == "\n" || c == "\r" || c == "\f") { d = c; c = this.read(); // special for Opera that preserves \r\n... if (d == "\r") { c = this.peek(); if (c == "\n") c = this.read(); } } else { s += this.gatherEscape(); c = this.peek(); } } else if (c == "\n" || c == "\r" || c == "\f") { break; } else s += c; previousChar = c; } if (c != aStop) return new jscsspToken(jscsspToken.INCOMPLETE_STRING_TYPE, null); return new jscsspToken(jscsspToken.STRING_TYPE, s); }, isWhiteSpace: function(c) { var code = c.charCodeAt(0); return code < 256 && (this.kLexTable[code] & IS_WHITESPACE) != 0; }, eatWhiteSpace: function(c) { var s = c; while ((c = this.read()) != -1) { if (!this.isWhiteSpace(c)) break; s += c; } if (c != -1) this.pushback(); return s; }, parseAtKeyword: function(c) { return new jscsspToken(jscsspToken.ATRULE_TYPE, this.gatherIdent(c)); }, nextToken: function() { var c = this.read(); if (c == -1) return new jscsspToken(jscsspToken.NULL_TYPE, null); if (this.startsWithIdent(c, this.peek())) return this.parseIdent(c); if (c == '@') { var nextChar = this.read(); if (nextChar != -1) { var followingChar = this.peek(); this.pushback(); if (this.startsWithIdent(nextChar, followingChar)) return this.parseAtKeyword(c); } } if (c == "." || c == "+" || c == "-") { var nextChar = this.peek(); if (this.isDigit(nextChar)) return this.parseNumber(c); else if (nextChar == "." && c != ".") { firstChar = this.read(); var secondChar = this.peek(); this.pushback(); if (this.isDigit(secondChar)) return this.parseNumber(c); } } if (this.isDigit(c)) { return this.parseNumber(c); } if (c == "'" || c == '"') return this.parseString(c); if (this.isWhiteSpace(c)) { var s = this.eatWhiteSpace(c); return new jscsspToken(jscsspToken.WHITESPACE_TYPE, s); } if (c == "|" || c == "~" || c == "^" || c == "$" || c == "*") { var nextChar = this.read(); if (nextChar == "=") { switch (c) { case "~" : return new jscsspToken(jscsspToken.INCLUDES_TYPE, "~="); case "|" : return new jscsspToken(jscsspToken.DASHMATCH_TYPE, "|="); case "^" : return new jscsspToken(jscsspToken.BEGINSMATCH_TYPE, "^="); case "$" : return new jscsspToken(jscsspToken.ENDSMATCH_TYPE, "$="); case "*" : return new jscsspToken(jscsspToken.CONTAINSMATCH_TYPE, "*="); default : break; } } else if (nextChar != -1) this.pushback(); } if (c == "/" && this.peek() == "*") return this.parseComment(c); return new jscsspToken(jscsspToken.SYMBOL_TYPE, c); } }; function CSSParser(aString, aExpandShorthands) { this.mToken = null; this.mLookAhead = null; this.mScanner = new CSSScanner(aString); this.expandShorthands = aExpandShorthands ? true : false; this.mPreserveWS = true; this.mPreserveComments = true; this.mPreservedTokens = []; this.mError = null; } CSSParser.prototype = { _init:function() { this.mToken = null; this.mLookAhead = null; }, kINHERIT: "inherit", kBORDER_WIDTH_NAMES: { "thin": true, "medium": true, "thick": true }, kBORDER_STYLE_NAMES: { "none": true, "hidden": true, "dotted": true, "dashed": true, "solid": true, "double": true, "groove": true, "ridge": true, "inset": true, "outset": true }, kCOLOR_NAMES: { "transparent": true, "black": true, "silver": true, "gray": true, "white": true, "maroon": true, "red": true, "purple": true, "fuchsia": true, "green": true, "lime": true, "olive": true, "yellow": true, "navy": true, "blue": true, "teal": true, "aqua": true, "aliceblue": true, "antiquewhite": true, "aqua": true, "aquamarine": true, "azure": true, "beige": true, "bisque": true, "black": true, "blanchedalmond": true, "blue": true, "blueviolet": true, "brown": true, "burlywood": true, "cadetblue": true, "chartreuse": true, "chocolate": true, "coral": true, "cornflowerblue": true, "cornsilk": true, "crimson": true, "cyan": true, "darkblue": true, "darkcyan": true, "darkgoldenrod": true, "darkgray": true, "darkgreen": true, "darkgrey": true, "darkkhaki": true, "darkmagenta": true, "darkolivegreen": true, "darkorange": true, "darkorchid": true, "darkred": true, "darksalmon": true, "darkseagreen": true, "darkslateblue": true, "darkslategray": true, "darkslategrey": true, "darkturquoise": true, "darkviolet": true, "deeppink": true, "deepskyblue": true, "dimgray": true, "dimgrey": true, "dodgerblue": true, "firebrick": true, "floralwhite": true, "forestgreen": true, "fuchsia": true, "gainsboro": true, "ghostwhite": true, "gold": true, "goldenrod": true, "gray": true, "green": true, "greenyellow": true, "grey": true, "honeydew": true, "hotpink": true, "indianred": true, "indigo": true, "ivory": true, "khaki": true, "lavender": true, "lavenderblush": true, "lawngreen": true, "lemonchiffon": true, "lightblue": true, "lightcoral": true, "lightcyan": true, "lightgoldenrodyellow": true, "lightgray": true, "lightgreen": true, "lightgrey": true, "lightpink": true, "lightsalmon": true, "lightseagreen": true, "lightskyblue": true, "lightslategray": true, "lightslategrey": true, "lightsteelblue": true, "lightyellow": true, "lime": true, "limegreen": true, "linen": true, "magenta": true, "maroon": true, "mediumaquamarine": true, "mediumblue": true, "mediumorchid": true, "mediumpurple": true, "mediumseagreen": true, "mediumslateblue": true, "mediumspringgreen": true, "mediumturquoise": true, "mediumvioletred": true, "midnightblue": true, "mintcream": true, "mistyrose": true, "moccasin": true, "navajowhite": true, "navy": true, "oldlace": true, "olive": true, "olivedrab": true, "orange": true, "orangered": true, "orchid": true, "palegoldenrod": true, "palegreen": true, "paleturquoise": true, "palevioletred": true, "papayawhip": true, "peachpuff": true, "peru": true, "pink": true, "plum": true, "powderblue": true, "purple": true, "red": true, "rosybrown": true, "royalblue": true, "saddlebrown": true, "salmon": true, "sandybrown": true, "seagreen": true, "seashell": true, "sienna": true, "silver": true, "skyblue": true, "slateblue": true, "slategray": true, "slategrey": true, "snow": true, "springgreen": true, "steelblue": true, "tan": true, "teal": true, "thistle": true, "tomato": true, "turquoise": true, "violet": true, "wheat": true, "white": true, "whitesmoke": true, "yellow": true, "yellowgreen": true, "activeborder": true, "activecaption": true, "appworkspace": true, "background": true, "buttonface": true, "buttonhighlight": true, "buttonshadow": true, "buttontext": true, "captiontext": true, "graytext": true, "highlight": true, "highlighttext": true, "inactiveborder": true, "inactivecaption": true, "inactivecaptiontext": true, "infobackground": true, "infotext": true, "menu": true, "menutext": true, "scrollbar": true, "threeddarkshadow": true, "threedface": true, "threedhighlight": true, "threedlightshadow": true, "threedshadow": true, "window": true, "windowframe": true, "windowtext": true }, kLIST_STYLE_TYPE_NAMES: { "decimal": true, "decimal-leading-zero": true, "lower-roman": true, "upper-roman": true, "georgian": true, "armenian": true, "lower-latin": true, "lower-alpha": true, "upper-latin": true, "upper-alpha": true, "lower-greek": true, "disc": true, "circle": true, "square": true, "none": true, /* CSS 3 */ "box": true, "check": true, "diamond": true, "hyphen": true, "lower-armenian": true, "cjk-ideographic": true, "ethiopic-numeric": true, "hebrew": true, "japanese-formal": true, "japanese-informal": true, "simp-chinese-formal": true, "simp-chinese-informal": true, "syriac": true, "tamil": true, "trad-chinese-formal": true, "trad-chinese-informal": true, "upper-armenian": true, "arabic-indic": true, "binary": true, "bengali": true, "cambodian": true, "khmer": true, "devanagari": true, "gujarati": true, "gurmukhi": true, "kannada": true, "lower-hexadecimal": true, "lao": true, "malayalam": true, "mongolian": true, "myanmar": true, "octal": true, "oriya": true, "persian": true, "urdu": true, "telugu": true, "tibetan": true, "upper-hexadecimal": true, "afar": true, "ethiopic-halehame-aa-et": true, "ethiopic-halehame-am-et": true, "amharic-abegede": true, "ehiopic-abegede-am-et": true, "cjk-earthly-branch": true, "cjk-heavenly-stem": true, "ethiopic": true, "ethiopic-abegede": true, "ethiopic-abegede-gez": true, "hangul-consonant": true, "hangul": true, "hiragana-iroha": true, "hiragana": true, "katakana-iroha": true, "katakana": true, "lower-norwegian": true, "oromo": true, "ethiopic-halehame-om-et": true, "sidama": true, "ethiopic-halehame-sid-et": true, "somali": true, "ethiopic-halehame-so-et": true, "tigre": true, "ethiopic-halehame-tig": true, "tigrinya-er-abegede": true, "ethiopic-abegede-ti-er": true, "tigrinya-et": true, "ethiopic-halehame-ti-et": true, "upper-greek": true, "asterisks": true, "footnotes": true, "circled-decimal": true, "circled-lower-latin": true, "circled-upper-latin": true, "dotted-decimal": true, "double-circled-decimal": true, "filled-circled-decimal": true, "parenthesised-decimal": true, "parenthesised-lower-latin": true }, reportError: function(aMsg) { this.mError = aMsg; }, consumeError: function() { var e = this.mError; this.mError = null; return e; }, currentToken: function() { return this.mToken; }, getHexValue: function() { this.mToken = this.mScanner.nextHexValue(); return this.mToken; }, getToken: function(aSkipWS, aSkipComment) { if (this.mLookAhead) { this.mToken = this.mLookAhead; this.mLookAhead = null; return this.mToken; } this.mToken = this.mScanner.nextToken(); while (this.mToken && ((aSkipWS && this.mToken.isWhiteSpace()) || (aSkipComment && this.mToken.isComment()))) this.mToken = this.mScanner.nextToken(); return this.mToken; }, lookAhead: function(aSkipWS, aSkipComment) { var preservedToken = this.mToken; this.mScanner.preserveState(); var token = this.getToken(aSkipWS, aSkipComment); this.mScanner.restoreState(); this.mToken = preservedToken; return token; }, ungetToken: function() { this.mLookAhead = this.mToken; }, addUnknownAtRule: function(aSheet, aString) { var currentLine = CountLF(this.mScanner.getAlreadyScanned()); var blocks = []; var token = this.getToken(false, false); while (token.isNotNull()) { aString += token.value; if (token.isSymbol(";") && !blocks.length) break; else if (token.isSymbol("{") || token.isSymbol("(") || token.isSymbol("[") || token.type == "function") { blocks.push(token.isFunction() ? "(" : token.value); } else if (token.isSymbol("}") || token.isSymbol(")") || token.isSymbol("]")) { if (blocks.length) { var ontop = blocks[blocks.length - 1]; if ((token.isSymbol("}") && ontop == "{") || (token.isSymbol(")") && ontop == "(") || (token.isSymbol("]") && ontop == "[")) { blocks.pop(); if (!blocks.length && token.isSymbol("}")) break; } } } token = this.getToken(false, false); } this.addUnknownRule(aSheet, aString, currentLine); }, addUnknownRule: function(aSheet, aString, aCurrentLine) { var errorMsg = this.consumeError(); var rule = new jscsspErrorRule(errorMsg); rule.currentLine = aCurrentLine; rule.parsedCssText = aString; rule.parentStyleSheet = aSheet; aSheet.cssRules.push(rule); }, addWhitespace: function(aSheet, aString) { var rule = new jscsspWhitespace(); rule.parsedCssText = aString; rule.parentStyleSheet = aSheet; aSheet.cssRules.push(rule); }, addComment: function(aSheet, aString) { var rule = new jscsspComment(); rule.parsedCssText = aString; rule.parentStyleSheet = aSheet; aSheet.cssRules.push(rule); }, parseCharsetRule: function(aToken, aSheet) { var s = aToken.value; var token = this.getToken(false, false); s += token.value; if (token.isWhiteSpace(" ")) { token = this.getToken(false, false); s += token.value; if (token.isString()) { var encoding = token.value; token = this.getToken(false, false); s += token.value; if (token.isSymbol(";")) { var rule = new jscsspCharsetRule(); rule.encoding = encoding; rule.parsedCssText = s; rule.parentStyleSheet = aSheet; aSheet.cssRules.push(rule); return true; } else this.reportError(kCHARSET_RULE_MISSING_SEMICOLON); } else this.reportError(kCHARSET_RULE_CHARSET_IS_STRING); } else this.reportError(kCHARSET_RULE_MISSING_WS); this.addUnknownAtRule(aSheet, s); return false; }, parseImportRule: function(aToken, aSheet) { var currentLine = CountLF(this.mScanner.getAlreadyScanned()); var s = aToken.value; this.preserveState(); var token = this.getToken(true, true); var media = []; var href = ""; if (token.isString()) { href = token.value; s += " " + href; } else if (token.isFunction("url(")) { token = this.getToken(true, true); var urlContent = this.parseURL(token); if (urlContent) { href = "url(" + urlContent; s += " " + href; } } else this.reportError(kIMPORT_RULE_MISSING_URL); if (href) { token = this.getToken(true, true); while (token.isIdent()) { s += " " + token.value; media.push(token.value); token = this.getToken(true, true); if (!token) break; if (token.isSymbol(",")) { s += ","; } else if (token.isSymbol(";")) { break; } else break; token = this.getToken(true, true); } if (!media.length) { media.push("all"); } if (token.isSymbol(";")) { s += ";" this.forgetState(); var rule = new jscsspImportRule(); rule.currentLine = currentLine; rule.parsedCssText = s; rule.href = href; rule.media = media; rule.parentStyleSheet = aSheet; aSheet.cssRules.push(rule); return true; } } this.restoreState(); this.addUnknownAtRule(aSheet, "@import"); return false; }, parseVariablesRule: function(token, aSheet) { var currentLine = CountLF(this.mScanner.getAlreadyScanned()); var s = token.value; var declarations = []; var valid = false; this.preserveState(); token = this.getToken(true, true); var media = []; var foundMedia = false; while (token.isNotNull()) { if (token.isIdent()) { foundMedia = true; s += " " + token.value; media.push(token.value); token = this.getToken(true, true); if (token.isSymbol(",")) { s += ","; } else { if (token.isSymbol("{")) this.ungetToken(); else { // error... token.type = jscsspToken.NULL_TYPE; break; } } } else if (token.isSymbol("{")) break; else if (foundMedia) { token.type = jscsspToken.NULL_TYPE; // not a media list break; } token = this.getToken(true, true); } if (token.isSymbol("{")) { s += " {"; token = this.getToken(true, true); while (true) { if (!token.isNotNull()) { valid = true; break; } if (token.isSymbol("}")) { s += "}"; valid = true; break; } else { var d = this.parseDeclaration(token, declarations, true, false, aSheet); s += ((d && declarations.length) ? " " : "") + d; } token = this.getToken(true, false); } } if (valid) { this.forgetState(); var rule = new jscsspVariablesRule(); rule.currentLine = currentLine; rule.parsedCssText = s; rule.declarations = declarations; rule.media = media; rule.parentStyleSheet = aSheet; aSheet.cssRules.push(rule) return true; } this.restoreState(); return false; }, parseNamespaceRule: function(aToken, aSheet) { var currentLine = CountLF(this.mScanner.getAlreadyScanned()); var s = aToken.value; var valid = false; this.preserveState(); var token = this.getToken(true, true); if (token.isNotNull()) { var prefix = ""; var url = ""; if (token.isIdent()) { prefix = token.value; s += " " + prefix; token = this.getToken(true, true); } if (token) { var foundURL = false; if (token.isString()) { foundURL = true; url = token.value; s += " " + url; } else if (token.isFunction("url(")) { // get a url here... token = this.getToken(true, true); var urlContent = this.parseURL(token); if (urlContent) { url += "url(" + urlContent; foundURL = true; s += " " + urlContent; } } } if (foundURL) { token = this.getToken(true, true); if (token.isSymbol(";")) { s += ";"; this.forgetState(); var rule = new jscsspNamespaceRule(); rule.currentLine = currentLine; rule.parsedCssText = s; rule.prefix = prefix; rule.url = url; rule.parentStyleSheet = aSheet; aSheet.cssRules.push(rule); return true; } } } this.restoreState(); this.addUnknownAtRule(aSheet, "@namespace"); return false; }, parseFontFaceRule: function(aToken, aSheet) { var currentLine = CountLF(this.mScanner.getAlreadyScanned()); var s = aToken.value; var valid = false; var descriptors = []; this.preserveState(); var token = this.getToken(true, true); if (token.isNotNull()) { // expecting block start if (token.isSymbol("{")) { s += " " + token.value; var token = this.getToken(true, false); while (true) { if (token.isSymbol("}")) { s += "}"; valid = true; break; } else { var d = this.parseDeclaration(token, descriptors, false, false, aSheet); s += ((d && descriptors.length) ? " " : "") + d; } token = this.getToken(true, false); } } } if (valid) { this.forgetState(); var rule = new jscsspFontFaceRule(); rule.currentLine = currentLine; rule.parsedCssText = s; rule.descriptors = descriptors; rule.parentStyleSheet = aSheet; aSheet.cssRules.push(rule) return true; } this.restoreState(); return false; }, parsePageRule: function(aToken, aSheet) { var currentLine = CountLF(this.mScanner.getAlreadyScanned()); var s = aToken.value; var valid = false; var declarations = []; this.preserveState(); var token = this.getToken(true, true); var pageSelector = ""; if (token.isSymbol(":") || token.isIdent()) { if (token.isSymbol(":")) { pageSelector = ":"; token = this.getToken(false, false); } if (token.isIdent()) { pageSelector += token.value; s += " " + pageSelector; token = this.getToken(true, true); } } if (token.isNotNull()) { // expecting block start if (token.isSymbol("{")) { s += " " + token.value; var token = this.getToken(true, false); while (true) { if (token.isSymbol("}")) { s += "}"; valid = true; break; } else { var d = this.parseDeclaration(token, declarations, true, this.expandShorthands, aSheet); s += ((d && declarations.length) ? " " : "") + d; } token = this.getToken(true, false); } } } if (valid) { this.forgetState(); var rule = new jscsspPageRule(); rule.currentLine = currentLine; rule.parsedCssText = s; rule.pageSelector = pageSelector; rule.declarations = declarations; rule.parentStyleSheet = aSheet; aSheet.cssRules.push(rule) return true; } this.restoreState(); return false; }, parseDefaultPropertyValue: function(token, aDecl, aAcceptPriority, descriptor, aSheet) { var valueText = ""; var blocks = []; var foundPriority = false; var values = []; while (token.isNotNull()) { if ((token.isSymbol(";") || token.isSymbol("}") || token.isSymbol("!")) && !blocks.length) { if (token.isSymbol("}")) this.ungetToken(); break; } if (token.isIdent(this.kINHERIT)) { if (values.length) { return ""; } else { valueText = this.kINHERIT; var value = new jscsspVariable(kJscsspINHERIT_VALUE, aSheet); values.push(value); token = this.getToken(true, true); break; } } else if (token.isSymbol("{") || token.isSymbol("(") || token.isSymbol("[")) { blocks.push(token.value); } else if (token.isSymbol("}") || token.isSymbol("]")) { if (blocks.length) { var ontop = blocks[blocks.length - 1]; if ((token.isSymbol("}") && ontop == "{") || (token.isSymbol(")") && ontop == "(") || (token.isSymbol("]") && ontop == "[")) { blocks.pop(); } } } // XXX must find a better way to store individual values // probably a |values: []| field holding dimensions, percentages // functions, idents, numbers and symbols, in that order. if (token.isFunction()) { if (token.isFunction("var(")) { token = this.getToken(true, true); if (token.isIdent()) { var name = token.value; token = this.getToken(true, true); if (token.isSymbol(")")) { var value = new jscsspVariable(kJscsspVARIABLE_VALUE, aSheet); valueText += "var(" + name + ")"; value.value = "var(" + name + ")"; value.name = name; values.push(value); } else return ""; } else return ""; } else { var fn = token.value; token = this.getToken(false, true); var arg = this.parseFunctionArgument(token); if (arg) { valueText += fn + arg; var value = new jscsspVariable(kJscsspPRIMITIVE_VALUE, aSheet); value.value = fn + arg; values.push(value); } else return ""; } } else if (token.isSymbol("#")) { var color = this.parseColor(token); if (color) { valueText += color; var value = new jscsspVariable(kJscsspPRIMITIVE_VALUE, aSheet); value.value = color; values.push(value); } else return ""; } else if (!token.isWhiteSpace() && !token.isSymbol(",")) { var value = new jscsspVariable(kJscsspPRIMITIVE_VALUE, aSheet); value.value = token.value; values.push(value); valueText += token.value; } else valueText += token.value; token = this.getToken(false, true); } if (values.length && valueText) { this.forgetState(); aDecl.push(this._createJscsspDeclarationFromValuesArray(descriptor, values, valueText)); return valueText; } return ""; }, parseMarginOrPaddingShorthand: function(token, aDecl, aAcceptPriority, aProperty) { var top = null; var bottom = null; var left = null; var right = null; var values = []; while (true) { if (!token.isNotNull()) break; if (token.isSymbol(";") || (aAcceptPriority && token.isSymbol("!")) || token.isSymbol("}")) { if (token.isSymbol("}")) this.ungetToken(); break; } else if (!values.length && token.isIdent(this.kINHERIT)) { values.push(token.value); token = this.getToken(true, true); break; } else if (token.isDimension() || token.isNumber("0") || token.isPercentage() || token.isIdent("auto")) { values.push(token.value); } else return ""; token = this.getToken(true, true); } var count = values.length; switch (count) { case 1: top = values[0]; bottom = top; left = top; right = top; break; case 2: top = values[0]; bottom = top; left = values[1]; right = left; break; case 3: top = values[0]; left = values[1]; right = left; bottom = values[2]; break; case 4: top = values[0]; right = values[1]; bottom = values[2]; left = values[3]; break; default: return ""; } this.forgetState(); aDecl.push(this._createJscsspDeclarationFromValue(aProperty + "-top", top)); aDecl.push(this._createJscsspDeclarationFromValue(aProperty + "-right", right)); aDecl.push(this._createJscsspDeclarationFromValue(aProperty + "-bottom", bottom)); aDecl.push(this._createJscsspDeclarationFromValue(aProperty + "-left", left)); return top + " " + right + " " + bottom + " " + left; }, parseBorderColorShorthand: function(token, aDecl, aAcceptPriority) { var top = null; var bottom = null; var left = null; var right = null; var values = []; while (true) { if (!token.isNotNull()) break; if (token.isSymbol(";") || (aAcceptPriority && token.isSymbol("!")) || token.isSymbol("}")) { if (token.isSymbol("}")) this.ungetToken(); break; } else if (!values.length && token.isIdent(this.kINHERIT)) { values.push(token.value); token = this.getToken(true, true); break; } else { var color = this.parseColor(token); if (color) values.push(color); else return ""; } token = this.getToken(true, true); } var count = values.length; switch (count) { case 1: top = values[0]; bottom = top; left = top; right = top; break; case 2: top = values[0]; bottom = top; left = values[1]; right = left; break; case 3: top = values[0]; left = values[1]; right = left; bottom = values[2]; break; case 4: top = values[0]; right = values[1]; bottom = values[2]; left = values[3]; break; default: return ""; } this.forgetState(); aDecl.push(this._createJscsspDeclarationFromValue("border-top-color", top)); aDecl.push(this._createJscsspDeclarationFromValue("border-right-color", right)); aDecl.push(this._createJscsspDeclarationFromValue("border-bottom-color", bottom)); aDecl.push(this._createJscsspDeclarationFromValue("border-left-color", left)); return top + " " + right + " " + bottom + " " + left; }, parseCueShorthand: function(token, declarations, aAcceptPriority) { var before = ""; var after = ""; var values = []; var values = []; while (true) { if (!token.isNotNull()) break; if (token.isSymbol(";") || (aAcceptPriority && token.isSymbol("!")) || token.isSymbol("}")) { if (token.isSymbol("}")) this.ungetToken(); break; } else if (!values.length && token.isIdent(this.kINHERIT)) { values.push(token.value); } else if (token.isIdent("none")) values.push(token.value); else if (token.isFunction("url(")) { token = this.getToken(true, true); var urlContent = this.parseURL(token); if (urlContent) values.push("url(" + urlContent); else return ""; } else return ""; token = this.getToken(true, true); } var count = values.length; switch (count) { case 1: before = values[0]; after = before; break; case 2: before = values[0]; after = values[1]; break; default: return ""; } this.forgetState(); aDecl.push(this._createJscsspDeclarationFromValue("cue-before", before)); aDecl.push(this._createJscsspDeclarationFromValue("cue-after", after)); return before + " " + after; }, parsePauseShorthand: function(token, declarations, aAcceptPriority) { var before = ""; var after = ""; var values = []; var values = []; while (true) { if (!token.isNotNull()) break; if (token.isSymbol(";") || (aAcceptPriority && token.isSymbol("!")) || token.isSymbol("}")) { if (token.isSymbol("}")) this.ungetToken(); break; } else if (!values.length && token.isIdent(this.kINHERIT)) { values.push(token.value); } else if (token.isDimensionOfUnit("ms") || token.isDimensionOfUnit("s") || token.isPercentage() || token.isNumber("0")) values.push(token.value); else return ""; token = this.getToken(true, true); } var count = values.length; switch (count) { case 1: before = values[0]; after = before; break; case 2: before = values[0]; after = values[1]; break; default: return ""; } this.forgetState(); aDecl.push(this._createJscsspDeclarationFromValue("pause-before", before)); aDecl.push(this._createJscsspDeclarationFromValue("pause-after", after)); return before + " " + after; }, parseBorderWidthShorthand: function(token, aDecl, aAcceptPriority) { var top = null; var bottom = null; var left = null; var right = null; var values = []; while (true) { if (!token.isNotNull()) break; if (token.isSymbol(";") || (aAcceptPriority && token.isSymbol("!")) || token.isSymbol("}")) { if (token.isSymbol("}")) this.ungetToken(); break; } else if (!values.length && token.isIdent(this.kINHERIT)) { values.push(token.value); } else if (token.isDimension() || token.isNumber("0") || (token.isIdent() && token.value in this.kBORDER_WIDTH_NAMES)) { values.push(token.value); } else return ""; token = this.getToken(true, true); } var count = values.length; switch (count) { case 1: top = values[0]; bottom = top; left = top; right = top; break; case 2: top = values[0]; bottom = top; left = values[1]; right = left; break; case 3: top = values[0]; left = values[1]; right = left; bottom = values[2]; break; case 4: top = values[0]; right = values[1]; bottom = values[2]; left = values[3]; break; default: return ""; } this.forgetState(); aDecl.push(this._createJscsspDeclarationFromValue("border-top-width", top)); aDecl.push(this._createJscsspDeclarationFromValue("border-right-width", right)); aDecl.push(this._createJscsspDeclarationFromValue("border-bottom-width", bottom)); aDecl.push(this._createJscsspDeclarationFromValue("border-left-width", left)); return top + " " + right + " " + bottom + " " + left; }, parseBorderStyleShorthand: function(token, aDecl, aAcceptPriority) { var top = null; var bottom = null; var left = null; var right = null; var values = []; while (true) { if (!token.isNotNull()) break; if (token.isSymbol(";") || (aAcceptPriority && token.isSymbol("!")) || token.isSymbol("}")) { if (token.isSymbol("}")) this.ungetToken(); break; } else if (!values.length && token.isIdent(this.kINHERIT)) { values.push(token.value); } else if (token.isIdent() && token.value in this.kBORDER_STYLE_NAMES) { values.push(token.value); } else return ""; token = this.getToken(true, true); } var count = values.length; switch (count) { case 1: top = values[0]; bottom = top; left = top; right = top; break; case 2: top = values[0]; bottom = top; left = values[1]; right = left; break; case 3: top = values[0]; left = values[1]; right = left; bottom = values[2]; break; case 4: top = values[0]; right = values[1]; bottom = values[2]; left = values[3]; break; default: return ""; } this.forgetState(); aDecl.push(this._createJscsspDeclarationFromValue("border-top-style", top)); aDecl.push(this._createJscsspDeclarationFromValue("border-right-style", right)); aDecl.push(this._createJscsspDeclarationFromValue("border-bottom-style", bottom)); aDecl.push(this._createJscsspDeclarationFromValue("border-left-style", left)); return top + " " + right + " " + bottom + " " + left; }, parseBorderEdgeOrOutlineShorthand: function(token, aDecl, aAcceptPriority, aProperty) { var bWidth = null; var bStyle = null; var bColor = null; while (true) { if (!token.isNotNull()) break; if (token.isSymbol(";") || (aAcceptPriority && token.isSymbol("!")) || token.isSymbol("}")) { if (token.isSymbol("}")) this.ungetToken(); break; } else if (!bWidth && !bStyle && !bColor && token.isIdent(this.kINHERIT)) { bWidth = this.kINHERIT; bStyle = this.kINHERIT; bColor = this.kINHERIT; } else if (!bWidth && (token.isDimension() || (token.isIdent() && token.value in this.kBORDER_WIDTH_NAMES) || token.isNumber("0"))) { bWidth = token.value; } else if (!bStyle && (token.isIdent() && token.value in this.kBORDER_STYLE_NAMES)) { bStyle = token.value; } else { var color = (aProperty == "outline" && token.isIdent("invert")) ? "invert" : this.parseColor(token); if (!bColor && color) bColor = color; else return ""; } token = this.getToken(true, true); } // create the declarations this.forgetState(); bWidth = bWidth ? bWidth : "medium"; bStyle = bStyle ? bStyle : "none"; bColor = bColor ? bColor : "-moz-initial"; function addPropertyToDecl(aSelf, aDecl, property, w, s, c) { aDecl.push(aSelf._createJscsspDeclarationFromValue(property + "-width", w)); aDecl.push(aSelf._createJscsspDeclarationFromValue(property + "-style", s)); aDecl.push(aSelf._createJscsspDeclarationFromValue(property + "-color", c)); } if (aProperty == "border") { addPropertyToDecl(this, aDecl, "border-top", bWidth, bStyle, bColor); addPropertyToDecl(this, aDecl, "border-right", bWidth, bStyle, bColor); addPropertyToDecl(this, aDecl, "border-bottom", bWidth, bStyle, bColor); addPropertyToDecl(this, aDecl, "border-left", bWidth, bStyle, bColor); } else addPropertyToDecl(this, aDecl, aProperty, bWidth, bStyle, bColor); return bWidth + " " + bStyle + " " + bColor; }, parseBackgroundShorthand: function(token, aDecl, aAcceptPriority) { var kHPos = {"left": true, "right": true }; var kVPos = {"top": true, "bottom": true }; var kPos = {"left": true, "right": true, "top": true, "bottom": true, "center": true}; var bgColor = null; var bgRepeat = null; var bgAttachment = null; var bgImage = null; var bgPosition = null; while (true) { if (!token.isNotNull()) break; if (token.isSymbol(";") || (aAcceptPriority && token.isSymbol("!")) || token.isSymbol("}")) { if (token.isSymbol("}")) this.ungetToken(); break; } else if (!bgColor && !bgRepeat && !bgAttachment && !bgImage && !bgPosition && token.isIdent(this.kINHERIT)) { bgColor = this.kINHERIT; bgRepeat = this.kINHERIT; bgAttachment = this.kINHERIT; bgImage = this.kINHERIT; bgPosition = this.kINHERIT; } else { if (!bgAttachment && (token.isIdent("scroll") || token.isIdent("fixed"))) { bgAttachment = token.value; } else if (!bgPosition && ((token.isIdent() && token.value in kPos) || token.isDimension() || token.isNumber("0") || token.isPercentage())) { bgPosition = token.value; token = this.getToken(true, true); if (token.isDimension() || token.isNumber("0") || token.isPercentage()) { bgPosition += " " + token.value; } else if (token.isIdent() && token.value in kPos) { if ((bgPosition in kHPos && token.value in kHPos) || (bgPosition in kVPos && token.value in kVPos)) return ""; bgPosition += " " + token.value; } else { this.ungetToken(); bgPosition += " center"; } } else if (!bgRepeat && (token.isIdent("repeat") || token.isIdent("repeat-x") || token.isIdent("repeat-y") || token.isIdent("no-repeat"))) { bgRepeat = token.value; } else if (!bgImage && (token.isFunction("url(") || token.isIdent("none"))) { bgImage = token.value; if (token.isFunction("url(")) { token = this.getToken(true, true); var url = this.parseURL(token); // TODO if (url) bgImage += url; else return ""; } } else if (!bgImage && (token.isFunction("linear-gradient(") || token.isFunction("radial-gradient(") || token.isFunction("repeating-linear-gradient(") || token.isFunction("repeating-radial-gradient("))) { var gradient = CssInspector.parseGradient(this, token); if (gradient) bgImage = CssInspector.serializeGradient(gradient); else return ""; } else { var color = this.parseColor(token); if (!bgColor && color) bgColor = color; else return ""; } } token = this.getToken(true, true); } // create the declarations this.forgetState(); bgColor = bgColor ? bgColor : "transparent"; bgImage = bgImage ? bgImage : "none"; bgRepeat = bgRepeat ? bgRepeat : "repeat"; bgAttachment = bgAttachment ? bgAttachment : "scroll"; bgPosition = bgPosition ? bgPosition : "top left"; aDecl.push(this._createJscsspDeclarationFromValue("background-color", bgColor)); aDecl.push(this._createJscsspDeclarationFromValue("background-image", bgImage)); aDecl.push(this._createJscsspDeclarationFromValue("background-repeat", bgRepeat)); aDecl.push(this._createJscsspDeclarationFromValue("background-attachment", bgAttachment)); aDecl.push(this._createJscsspDeclarationFromValue("background-position", bgPosition)); return bgColor + " " + bgImage + " " + bgRepeat + " " + bgAttachment + " " + bgPosition; }, parseListStyleShorthand: function(token, aDecl, aAcceptPriority) { var kPosition = { "inside": true, "outside": true }; var lType = null; var lPosition = null; var lImage = null; while (true) { if (!token.isNotNull()) break; if (token.isSymbol(";") || (aAcceptPriority && token.isSymbol("!")) || token.isSymbol("}")) { if (token.isSymbol("}")) this.ungetToken(); break; } else if (!lType && !lPosition && ! lImage && token.isIdent(this.kINHERIT)) { lType = this.kINHERIT; lPosition = this.kINHERIT; lImage = this.kINHERIT; } else if (!lType && (token.isIdent() && token.value in this.kLIST_STYLE_TYPE_NAMES)) { lType = token.value; } else if (!lPosition && (token.isIdent() && token.value in kPosition)) { lPosition = token.value; } else if (!lImage && token.isFunction("url")) { token = this.getToken(true, true); var urlContent = this.parseURL(token); if (urlContent) { lImage = "url(" + urlContent; } else return ""; } else if (!token.isIdent("none")) return ""; token = this.getToken(true, true); } // create the declarations this.forgetState(); lType = lType ? lType : "none"; lImage = lImage ? lImage : "none"; lPosition = lPosition ? lPosition : "outside"; aDecl.push(this._createJscsspDeclarationFromValue("list-style-type", lType)); aDecl.push(this._createJscsspDeclarationFromValue("list-style-position", lPosition)); aDecl.push(this._createJscsspDeclarationFromValue("list-style-image", lImage)); return lType + " " + lPosition + " " + lImage; }, parseFontShorthand: function(token, aDecl, aAcceptPriority) { var kStyle = {"italic": true, "oblique": true }; var kVariant = {"small-caps": true }; var kWeight = { "bold": true, "bolder": true, "lighter": true, "100": true, "200": true, "300": true, "400": true, "500": true, "600": true, "700": true, "800": true, "900": true }; var kSize = { "xx-small": true, "x-small": true, "small": true, "medium": true, "large": true, "x-large": true, "xx-large": true, "larger": true, "smaller": true }; var kValues = { "caption": true, "icon": true, "menu": true, "message-box": true, "small-caption": true, "status-bar": true }; var kFamily = { "serif": true, "sans-serif": true, "cursive": true, "fantasy": true, "monospace": true }; var fStyle = null; var fVariant = null; var fWeight = null; var fSize = null; var fLineHeight = null; var fFamily = ""; var fSystem = null; var fFamilyValues = []; var normalCount = 0; while (true) { if (!token.isNotNull()) break; if (token.isSymbol(";") || (aAcceptPriority && token.isSymbol("!")) || token.isSymbol("}")) { if (token.isSymbol("}")) this.ungetToken(); break; } else if (!fStyle && !fVariant && !fWeight && !fSize && !fLineHeight && !fFamily && !fSystem && token.isIdent(this.kINHERIT)) { fStyle = this.kINHERIT; fVariant = this.kINHERIT; fWeight = this.kINHERIT; fSize = this.kINHERIT; fLineHeight = this.kINHERIT; fFamily = this.kINHERIT; fSystem = this.kINHERIT; } else { if (!fSystem && (token.isIdent() && token.value in kValues)) { fSystem = token.value; break; } else { if (!fStyle && token.isIdent() && (token.value in kStyle)) { fStyle = token.value; } else if (!fVariant && token.isIdent() && (token.value in kVariant)) { fVariant = token.value; } else if (!fWeight && (token.isIdent() || token.isNumber()) && (token.value in kWeight)) { fWeight = token.value; } else if (!fSize && ((token.isIdent() && (token.value in kSize)) || token.isDimension() || token.isPercentage())) { fSize = token.value; token = this.getToken(false, false); if (token.isSymbol("/")) { token = this.getToken(false, false); if (!fLineHeight && (token.isDimension() || token.isNumber() || token.isPercentage())) { fLineHeight = token.value; } else return ""; } else this.ungetToken(); } else if (token.isIdent("normal")) { normalCount++; if (normalCount > 3) return ""; } else if (!fFamily && // *MUST* be last to be tested here (token.isString() || token.isIdent())) { var lastWasComma = false; while (true) { if (!token.isNotNull()) break; else if (token.isSymbol(";") || (aAcceptPriority && token.isSymbol("!")) || token.isSymbol("}")) { this.ungetToken(); break; } else if (token.isIdent() && token.value in kFamily) { var value = new jscsspVariable(kJscsspPRIMITIVE_VALUE, null); value.value = token.value; fFamilyValues.push(value); fFamily += token.value; break; } else if (token.isString() || token.isIdent()) { var value = new jscsspVariable(kJscsspPRIMITIVE_VALUE, null); value.value = token.value; fFamilyValues.push(value); fFamily += token.value; lastWasComma = false; } else if (!lastWasComma && token.isSymbol(",")) { fFamily += ", "; lastWasComma = true; } else return ""; token = this.getToken(true, true); } } else { return ""; } } } token = this.getToken(true, true); } // create the declarations this.forgetState(); if (fSystem) { aDecl.push(this._createJscsspDeclarationFromValue("font", fSystem)); return fSystem; } fStyle = fStyle ? fStyle : "normal"; fVariant = fVariant ? fVariant : "normal"; fWeight = fWeight ? fWeight : "normal"; fSize = fSize ? fSize : "medium"; fLineHeight = fLineHeight ? fLineHeight : "normal"; fFamily = fFamily ? fFamily : "-moz-initial"; aDecl.push(this._createJscsspDeclarationFromValue("font-style", fStyle)); aDecl.push(this._createJscsspDeclarationFromValue("font-variant", fVariant)); aDecl.push(this._createJscsspDeclarationFromValue("font-weight", fWeight)); aDecl.push(this._createJscsspDeclarationFromValue("font-size", fSize)); aDecl.push(this._createJscsspDeclarationFromValue("line-height", fLineHeight)); aDecl.push(this._createJscsspDeclarationFromValuesArray("font-family", fFamilyValues, fFamily)); return fStyle + " " + fVariant + " " + fWeight + " " + fSize + "/" + fLineHeight + " " + fFamily; }, _createJscsspDeclaration: function(property, value) { var decl = new jscsspDeclaration(); decl.property = property; decl.value = this.trim11(value); decl.parsedCssText = property + ": " + value + ";"; return decl; }, _createJscsspDeclarationFromValue: function(property, valueText) { var decl = new jscsspDeclaration(); decl.property = property; var value = new jscsspVariable(kJscsspPRIMITIVE_VALUE, null); value.value = valueText; decl.values = [value]; decl.valueText = valueText; decl.parsedCssText = property + ": " + valueText + ";"; return decl; }, _createJscsspDeclarationFromValuesArray: function(property, values, valueText) { var decl = new jscsspDeclaration(); decl.property = property; decl.values = values; decl.valueText = valueText; decl.parsedCssText = property + ": " + valueText + ";"; return decl; }, parseURL: function(token) { var value = ""; if (token.isString()) { value += token.value; token = this.getToken(true, true); } else while (true) { if (!token.isNotNull()) { this.reportError(kURL_EOF); return ""; } if (token.isWhiteSpace()) { nextToken = this.lookAhead(true, true); // if next token is not a closing parenthesis, that's an error if (!nextToken.isSymbol(")")) { this.reportError(kURL_WS_INSIDE); token = this.currentToken(); break; } } if (token.isSymbol(")")) { break; } value += token.value; token = this.getToken(false, false); } if (token.isSymbol(")")) { return value + ")"; } return ""; }, parseFunctionArgument: function(token) { var value = ""; if (token.isString()) { value += token.value; token = this.getToken(true, true); } else { var parenthesis = 1; while (true) { if (!token.isNotNull()) return ""; if (token.isFunction() || token.isSymbol("(")) parenthesis++; if (token.isSymbol(")")) { parenthesis--; if (!parenthesis) break; } value += token.value; token = this.getToken(false, false); } } if (token.isSymbol(")")) return value + ")"; return ""; }, parseColor: function(token) { var color = ""; if (token.isFunction("rgb(") || token.isFunction("rgba(")) { color = token.value; var isRgba = token.isFunction("rgba(") token = this.getToken(true, true); if (!token.isNumber() && !token.isPercentage()) return ""; color += token.value; token = this.getToken(true, true); if (!token.isSymbol(",")) return ""; color += ", "; token = this.getToken(true, true); if (!token.isNumber() && !token.isPercentage()) return ""; color += token.value; token = this.getToken(true, true); if (!token.isSymbol(",")) return ""; color += ", "; token = this.getToken(true, true); if (!token.isNumber() && !token.isPercentage()) return ""; color += token.value; if (isRgba) { token = this.getToken(true, true); if (!token.isSymbol(",")) return ""; color += ", "; token = this.getToken(true, true); if (!token.isNumber()) return ""; color += token.value; } token = this.getToken(true, true); if (!token.isSymbol(")")) return ""; color += token.value; } else if (token.isFunction("hsl(") || token.isFunction("hsla(")) { color = token.value; var isHsla = token.isFunction("hsla(") token = this.getToken(true, true); if (!token.isNumber()) return ""; color += token.value; token = this.getToken(true, true); if (!token.isSymbol(",")) return ""; color += ", "; token = this.getToken(true, true); if (!token.isPercentage()) return ""; color += token.value; token = this.getToken(true, true); if (!token.isSymbol(",")) return ""; color += ", "; token = this.getToken(true, true); if (!token.isPercentage()) return ""; color += token.value; if (isHsla) { token = this.getToken(true, true); if (!token.isSymbol(",")) return ""; color += ", "; token = this.getToken(true, true); if (!token.isNumber()) return ""; color += token.value; } token = this.getToken(true, true); if (!token.isSymbol(")")) return ""; color += token.value; } else if (token.isIdent() && (token.value in this.kCOLOR_NAMES)) color = token.value; else if (token.isSymbol("#")) { token = this.getHexValue(); if (!token.isHex()) return ""; var length = token.value.length; if (length != 3 && length != 6) return ""; if (token.value.match( /[a-fA-F0-9]/g ).length != length) return ""; color = "#" + token.value; } return color; }, parseDeclaration: function(aToken, aDecl, aAcceptPriority, aExpandShorthands, aSheet) { this.preserveState(); var blocks = []; if (aToken.isIdent()) { var descriptor = aToken.value.toLowerCase(); var token = this.getToken(true, true); if (token.isSymbol(":")) { var token = this.getToken(true, true); var value = ""; var declarations = []; if (aExpandShorthands) switch (descriptor) { case "background": value = this.parseBackgroundShorthand(token, declarations, aAcceptPriority); break; case "margin": case "padding": value = this.parseMarginOrPaddingShorthand(token, declarations, aAcceptPriority, descriptor); break; case "border-color": value = this.parseBorderColorShorthand(token, declarations, aAcceptPriority); break; case "border-style": value = this.parseBorderStyleShorthand(token, declarations, aAcceptPriority); break; case "border-width": value = this.parseBorderWidthShorthand(token, declarations, aAcceptPriority); break; case "border-top": case "border-right": case "border-bottom": case "border-left": case "border": case "outline": value = this.parseBorderEdgeOrOutlineShorthand(token, declarations, aAcceptPriority, descriptor); break; case "cue": value = this.parseCueShorthand(token, declarations, aAcceptPriority); break; case "pause": value = this.parsePauseShorthand(token, declarations, aAcceptPriority); break; case "font": value = this.parseFontShorthand(token, declarations, aAcceptPriority); break; case "list-style": value = this.parseListStyleShorthand(token, declarations, aAcceptPriority); break; default: value = this.parseDefaultPropertyValue(token, declarations, aAcceptPriority, descriptor, aSheet); break; } else value = this.parseDefaultPropertyValue(token, declarations, aAcceptPriority, descriptor, aSheet); token = this.currentToken(); if (value) // no error above { var priority = false; if (token.isSymbol("!")) { token = this.getToken(true, true); if (token.isIdent("important")) { priority = true; token = this.getToken(true, true); if (token.isSymbol(";") || token.isSymbol("}")) { if (token.isSymbol("}")) this.ungetToken(); } else return ""; } else return ""; } else if (token.isNotNull() && !token.isSymbol(";") && !token.isSymbol("}")) return ""; for (var i = 0; i < declarations.length; i++) { declarations[i].priority = priority; aDecl.push(declarations[i]); } return descriptor + ": " + value + ";"; } } } else if (aToken.isComment()) { if (this.mPreserveComments) { this.forgetState(); var comment = new jscsspComment(); comment.parsedCssText = aToken.value; aDecl.push(comment); } return aToken.value; } // we have an error here, let's skip it this.restoreState(); var s = aToken.value; blocks = []; var token = this.getToken(false, false); while (token.isNotNull()) { s += token.value; if ((token.isSymbol(";") || token.isSymbol("}")) && !blocks.length) { if (token.isSymbol("}")) this.ungetToken(); break; } else if (token.isSymbol("{") || token.isSymbol("(") || token.isSymbol("[") || token.isFunction()) { blocks.push(token.isFunction() ? "(" : token.value); } else if (token.isSymbol("}") || token.isSymbol(")") || token.isSymbol("]")) { if (blocks.length) { var ontop = blocks[blocks.length - 1]; if ((token.isSymbol("}") && ontop == "{") || (token.isSymbol(")") && ontop == "(") || (token.isSymbol("]") && ontop == "[")) { blocks.pop(); } } } token = this.getToken(false, false); } return ""; }, parseKeyframesRule: function(aToken, aSheet) { var currentLine = CountLF(this.mScanner.getAlreadyScanned()); var s = aToken.value; var valid = false; var keyframesRule = new jscsspKeyframesRule(); keyframesRule.currentLine = currentLine; this.preserveState(); var token = this.getToken(true, true); var foundName = false; while (token.isNotNull()) { if (token.isIdent()) { // should be the keyframes' name foundName = true; s += " " + token.value; keyframesRule.name = token.value; token = this.getToken(true, true); if (token.isSymbol("{")) this.ungetToken(); else { // error... token.type = jscsspToken.NULL_TYPE; break; } } else if (token.isSymbol("{")) { if (!foundName) { token.type = jscsspToken.NULL_TYPE; // not a valid keyframes at-rule } break; } else { token.type = jscsspToken.NULL_TYPE; // not a valid keyframes at-rule break; } token = this.getToken(true, true); } if (token.isSymbol("{") && keyframesRule.name) { // ok let's parse keyframe rules now... s += " { "; token = this.getToken(true, false); while (token.isNotNull()) { if (token.isComment() && this.mPreserveComments) { s += " " + token.value; var comment = new jscsspComment(); comment.parsedCssText = token.value; keyframesRule.cssRules.push(comment); } else if (token.isSymbol("}")) { valid = true; break; } else { var r = this.parseKeyframeRule(token, keyframesRule, true); if (r) s += r; } token = this.getToken(true, false); } } if (valid) { this.forgetState(); keyframesRule.currentLine = currentLine; keyframesRule.parsedCssText = s; aSheet.cssRules.push(keyframesRule); return true; } this.restoreState(); return false; }, parseKeyframeRule: function(aToken, aOwner) { var currentLine = CountLF(this.mScanner.getAlreadyScanned()); this.preserveState(); var token = aToken; // find the keyframe keys var key = ""; while (token.isNotNull()) { if (token.isIdent() || token.isPercentage()) { if (token.isIdent() && !token.isIdent("from") && !token.isIdent("to")) { key = ""; break; } key += token.value; token = this.getToken(true, true); if (token.isSymbol("{")) { this.ungetToken(); break; } else if (token.isSymbol(",")) { key += ", "; } else { key = ""; break; } } else { key = ""; break; } token = this.getToken(true, true); } var valid = false; var declarations = []; if (key) { var s = key; token = this.getToken(true, true); if (token.isSymbol("{")) { s += " { "; token = this.getToken(true, false); while (true) { if (!token.isNotNull()) { valid = true; break; } if (token.isSymbol("}")) { s += "}"; valid = true; break; } else { var d = this.parseDeclaration(token, declarations, true, this.expandShorthands, aOwner); s += ((d && declarations.length) ? " " : "") + d; } token = this.getToken(true, false); } } } else { // key is invalid so the whole rule is invalid with it } if (valid) { var rule = new jscsspKeyframeRule(); rule.currentLine = currentLine; rule.parsedCssText = s; rule.declarations = declarations; rule.keyText = key; rule.parentRule = aOwner; aOwner.cssRules.push(rule); return s; } this.restoreState(); s = this.currentToken().value; this.addUnknownAtRule(aOwner, s); return ""; }, parseMediaRule: function(aToken, aSheet) { var currentLine = CountLF(this.mScanner.getAlreadyScanned()); var s = aToken.value; var valid = false; var mediaRule = new jscsspMediaRule(); mediaRule.currentLine = currentLine; this.preserveState(); var token = this.getToken(true, true); // parse media list var mediaText = ""; while (token.isNotNull()) { s += " " + token.value; mediaText += (mediaText ? " " : "") + token.value; token = this.getToken(true, true); if (token.isSymbol(",")) { mediaRule.media.push(mediaText); mediaText = ""; s += ","; } else if (token.isSymbol("{")) { mediaRule.media.push(mediaText); break; } } if (token.isSymbol("{") && mediaRule.media.length) { // ok let's parse style rules now... s += " { "; token = this.getToken(true, false); while (token.isNotNull()) { if (token.isComment()) { if (this.mPreserveComments) { s += " " + token.value; var comment = new jscsspComment(); comment.parsedCssText = token.value; mediaRule.cssRules.push(comment); } } else if (token.isSymbol("}")) { valid = true; break; } else { var r = this.parseStyleRule(token, mediaRule, true); if (r) s += r; } token = this.getToken(true, false); } } if (valid) { this.forgetState(); mediaRule.parsedCssText = s; aSheet.cssRules.push(mediaRule); return true; } this.restoreState(); return false; }, trim11: function(str) { str = str.replace(/^\s+/, ''); for (var i = str.length - 1; i >= 0; i--) { if (/\S/.test( str.charAt(i) )) { // XXX charat str = str.substring(0, i + 1); break; } } return str; }, parseStyleRule: function(aToken, aOwner, aIsInsideMediaRule) { var currentLine = CountLF(this.mScanner.getAlreadyScanned()); this.preserveState(); // first let's see if we have a selector here... var selector = this.parseSelector(aToken, false); var valid = false; var declarations = []; if (selector) { selector = this.trim11(selector.selector); var s = selector; var token = this.getToken(true, true); if (token.isSymbol("{")) { s += " { "; var token = this.getToken(true, false); while (true) { if (!token.isNotNull()) { valid = true; break; } if (token.isSymbol("}")) { s += "}"; valid = true; break; } else { var d = this.parseDeclaration(token, declarations, true, this.expandShorthands, aOwner); s += ((d && declarations.length) ? " " : "") + d; } token = this.getToken(true, false); } } } else { // selector is invalid so the whole rule is invalid with it } if (valid) { var rule = new jscsspStyleRule(); rule.currentLine = currentLine; rule.parsedCssText = s; rule.declarations = declarations; rule.mSelectorText = selector; if (aIsInsideMediaRule) rule.parentRule = aOwner; else rule.parentStyleSheet = aOwner; aOwner.cssRules.push(rule); return s; } this.restoreState(); s = this.currentToken().value; this.addUnknownAtRule(aOwner, s); return ""; }, parseSelector: function(aToken, aParseSelectorOnly) { var s = ""; var specificity = {a: 0, b: 0, c: 0, d: 0}; // CSS 2.1 section 6.4.3 var isFirstInChain = true; var token = aToken; var valid = false; var combinatorFound = false; while (true) { if (!token.isNotNull()) { if (aParseSelectorOnly) return {selector: s, specificity: specificity }; return ""; } if (!aParseSelectorOnly && token.isSymbol("{")) { // end of selector valid = !combinatorFound; // don't unget if invalid since addUnknownRule is going to restore state anyway if (valid) this.ungetToken(); break; } if (token.isSymbol(",")) { // group of selectors s += token.value; isFirstInChain = true; combinatorFound = false; token = this.getToken(false, true); continue; } // now combinators and grouping... else if (!combinatorFound && (token.isWhiteSpace() || token.isSymbol(">") || token.isSymbol("+") || token.isSymbol("~"))) { if (token.isWhiteSpace()) { s += " "; var nextToken = this.lookAhead(true, true); if (!nextToken.isNotNull()) { if (aParseSelectorOnly) return {selector: s, specificity: specificity }; return ""; } if (nextToken.isSymbol(">") || nextToken.isSymbol("+") || nextToken.isSymbol("~")) { token = this.getToken(true, true); s += token.value + " "; combinatorFound = true; } } else { s += token.value; combinatorFound = true; } isFirstInChain = true; token = this.getToken(true, true); continue; } else { var simpleSelector = this.parseSimpleSelector(token, isFirstInChain, true); if (!simpleSelector) break; // error s += simpleSelector.selector; specificity.b += simpleSelector.specificity.b; specificity.c += simpleSelector.specificity.c; specificity.d += simpleSelector.specificity.d; isFirstInChain = false; combinatorFound = false; } token = this.getToken(false, true); } if (valid) { return {selector: s, specificity: specificity }; } return ""; }, isPseudoElement: function(aIdent) { switch (aIdent) { case "first-letter": case "first-line": case "before": case "after": case "marker": return true; break; default: return false; break; } }, parseSimpleSelector: function(token, isFirstInChain, canNegate) { var s = ""; var specificity = {a: 0, b: 0, c: 0, d: 0}; // CSS 2.1 section 6.4.3 if (isFirstInChain && (token.isSymbol("*") || token.isSymbol("|") || token.isIdent())) { // type or universal selector if (token.isSymbol("*") || token.isIdent()) { // we don't know yet if it's a prefix or a universal // selector s += token.value; var isIdent = token.isIdent(); token = this.getToken(false, true); if (token.isSymbol("|")) { // it's a prefix s += token.value; token = this.getToken(false, true); if (token.isIdent() || token.isSymbol("*")) { // ok we now have a type element or universal // selector s += token.value; if (token.isIdent()) specificity.d++; } else // oops that's an error... return null; } else { this.ungetToken(); if (isIdent) specificity.d++; } } else if (token.isSymbol("|")) { s += token.value; token = this.getToken(false, true); if (token.isIdent() || token.isSymbol("*")) { s += token.value; if (token.isIdent()) specificity.d++; } else // oops that's an error return null; } } else if (token.isSymbol(".") || token.isSymbol("#")) { var isClass = token.isSymbol("."); s += token.value; token = this.getToken(false, true); if (token.isIdent()) { s += token.value; if (isClass) specificity.c++; else specificity.b++; } else return null; } else if (token.isSymbol(":")) { s += token.value; token = this.getToken(false, true); if (token.isSymbol(":")) { s += token.value; token = this.getToken(false, true); } if (token.isIdent()) { s += token.value; if (this.isPseudoElement(token.value)) specificity.d++; else specificity.c++; } else if (token.isFunction()) { s += token.value; if (token.isFunction(":not(")) { if (!canNegate) return null; token = this.getToken(true, true); var simpleSelector = this.parseSimpleSelector(token, isFirstInChain, false); if (!simpleSelector) return null; else { s += simpleSelector.selector; token = this.getToken(true, true); if (token.isSymbol(")")) s += ")"; else return null; } specificity.c++; } else { while (true) { token = this.getToken(false, true); if (token.isSymbol(")")) { s += ")"; break; } else s += token.value; } specificity.c++; } } else return null; } else if (token.isSymbol("[")) { s += "["; token = this.getToken(true, true); if (token.isIdent() || token.isSymbol("*")) { s += token.value; var nextToken = this.getToken(true, true); if (nextToken.isSymbol("|")) { s += "|"; token = this.getToken(true, true); if (token.isIdent()) s += token.value; else return null; } else this.ungetToken(); } else if (token.isSymbol("|")) { s += "|"; token = this.getToken(true, true); if (token.isIdent()) s += token.value; else return null; } else return null; // nothing, =, *=, $=, ^=, |= token = this.getToken(true, true); if (token.isIncludes() || token.isDashmatch() || token.isBeginsmatch() || token.isEndsmatch() || token.isContainsmatch() || token.isSymbol("=")) { s += token.value; token = this.getToken(true, true); if (token.isString() || token.isIdent()) { s += token.value; token = this.getToken(true, true); } else return null; if (token.isSymbol("]")) { s += token.value; specificity.c++; } else return null; } else if (token.isSymbol("]")) { s += token.value; specificity.c++; } else return null; } else if (token.isWhiteSpace()) { var t = this.lookAhead(true, true); if (t.isSymbol('{')) return "" } if (s) return {selector: s, specificity: specificity }; return null; }, preserveState: function() { this.mPreservedTokens.push(this.currentToken()); this.mScanner.preserveState(); }, restoreState: function() { if (this.mPreservedTokens.length) { this.mScanner.restoreState(); this.mToken = this.mPreservedTokens.pop(); } }, forgetState: function() { if (this.mPreservedTokens.length) { this.mScanner.forgetState(); this.mPreservedTokens.pop(); } }, parse: function(aString, aTryToPreserveWhitespaces, aTryToPreserveComments) { if (!aString) return null; // early way out if we can this.mPreserveWS = aTryToPreserveWhitespaces; this.mPreserveComments = aTryToPreserveComments; this.mPreservedTokens = []; this.mScanner.init(aString); var sheet = new jscsspStylesheet(); // @charset can only appear at first char of the stylesheet var token = this.getToken(false, false); if (!token.isNotNull()) return; if (token.isAtRule("@charset")) { this.parseCharsetRule(token, sheet); token = this.getToken(false, false); } var foundStyleRules = false; var foundImportRules = false; var foundNameSpaceRules = false; while (true) { if (!token.isNotNull()) break; if (token.isWhiteSpace()) { if (aTryToPreserveWhitespaces) this.addWhitespace(sheet, token.value); } else if (token.isComment()) { if (this.mPreserveComments) this.addComment(sheet, token.value); } else if (token.isAtRule()) { if (token.isAtRule("@variables")) { if (!foundImportRules && !foundStyleRules) this.parseVariablesRule(token, sheet); else { this.reportError(kVARIABLES_RULE_POSITION); this.addUnknownAtRule(sheet, token.value); } } else if (token.isAtRule("@import")) { // @import rules MUST occur before all style and namespace // rules if (!foundStyleRules && !foundNameSpaceRules) foundImportRules = this.parseImportRule(token, sheet); else { this.reportError(kIMPORT_RULE_POSITION); this.addUnknownAtRule(sheet, token.value); } } else if (token.isAtRule("@namespace")) { // @namespace rules MUST occur before all style rule and // after all @import rules if (!foundStyleRules) foundNameSpaceRules = this.parseNamespaceRule(token, sheet); else { this.reportError(kNAMESPACE_RULE_POSITION); this.addUnknownAtRule(sheet, token.value); } } else if (token.isAtRule("@font-face")) { if (this.parseFontFaceRule(token, sheet)) foundStyleRules = true; else this.addUnknownAtRule(sheet, token.value); } else if (token.isAtRule("@page")) { if (this.parsePageRule(token, sheet)) foundStyleRules = true; else this.addUnknownAtRule(sheet, token.value); } else if (token.isAtRule("@media")) { if (this.parseMediaRule(token, sheet)) foundStyleRules = true; else this.addUnknownAtRule(sheet, token.value); } else if (token.isAtRule("@-moz-keyframes")) { if (!this.parseKeyframesRule(token, sheet)) this.addUnknownAtRule(sheet, token.value); } else if (token.isAtRule("@charset")) { this.reportError(kCHARSET_RULE_CHARSET_SOF); this.addUnknownAtRule(sheet, token.value); } else { this.reportError(kUNKNOWN_AT_RULE); this.addUnknownAtRule(sheet, token.value); } } else // plain style rules { var ruleText = this.parseStyleRule(token, sheet, false); if (ruleText) foundStyleRules = true; } token = this.getToken(false); } return sheet; } }; function jscsspToken(aType, aValue, aUnit) { this.type = aType; this.value = aValue; this.unit = aUnit; } jscsspToken.NULL_TYPE = 0; jscsspToken.WHITESPACE_TYPE = 1; jscsspToken.STRING_TYPE = 2; jscsspToken.COMMENT_TYPE = 3; jscsspToken.NUMBER_TYPE = 4; jscsspToken.IDENT_TYPE = 5; jscsspToken.FUNCTION_TYPE = 6; jscsspToken.ATRULE_TYPE = 7; jscsspToken.INCLUDES_TYPE = 8; jscsspToken.DASHMATCH_TYPE = 9; jscsspToken.BEGINSMATCH_TYPE = 10; jscsspToken.ENDSMATCH_TYPE = 11; jscsspToken.CONTAINSMATCH_TYPE = 12; jscsspToken.SYMBOL_TYPE = 13; jscsspToken.DIMENSION_TYPE = 14; jscsspToken.PERCENTAGE_TYPE = 15; jscsspToken.HEX_TYPE = 16; jscsspToken.INCOMPLETE_STRING_TYPE = 17; jscsspToken.prototype = { isNotNull: function () { return this.type; }, _isOfType: function (aType, aValue) { return (this.type == aType && (!aValue || this.value.toLowerCase() == aValue)); }, isWhiteSpace: function(w) { return this._isOfType(jscsspToken.WHITESPACE_TYPE, w); }, isString: function() { return this._isOfType(jscsspToken.STRING_TYPE); }, isComment: function() { return this._isOfType(jscsspToken.COMMENT_TYPE); }, isNumber: function(n) { return this._isOfType(jscsspToken.NUMBER_TYPE, n); }, isSymbol: function(c) { return this._isOfType(jscsspToken.SYMBOL_TYPE, c); }, isIdent: function(i) { return this._isOfType(jscsspToken.IDENT_TYPE, i); }, isFunction: function(f) { return this._isOfType(jscsspToken.FUNCTION_TYPE, f); }, isAtRule: function(a) { return this._isOfType(jscsspToken.ATRULE_TYPE, a); }, isIncludes: function() { return this._isOfType(jscsspToken.INCLUDES_TYPE); }, isDashmatch: function() { return this._isOfType(jscsspToken.DASHMATCH_TYPE); }, isBeginsmatch: function() { return this._isOfType(jscsspToken.BEGINSMATCH_TYPE); }, isEndsmatch: function() { return this._isOfType(jscsspToken.ENDSMATCH_TYPE); }, isContainsmatch: function() { return this._isOfType(jscsspToken.CONTAINSMATCH_TYPE); }, isSymbol: function(c) { return this._isOfType(jscsspToken.SYMBOL_TYPE, c); }, isDimension: function() { return this._isOfType(jscsspToken.DIMENSION_TYPE); }, isPercentage: function() { return this._isOfType(jscsspToken.PERCENTAGE_TYPE); }, isHex: function() { return this._isOfType(jscsspToken.HEX_TYPE); }, isDimensionOfUnit: function(aUnit) { return (this.isDimension() && this.unit == aUnit); }, isLength: function() { return (this.isPercentage() || this.isDimensionOfUnit("em") || this.isDimensionOfUnit("ex") || this.isDimensionOfUnit("ch") || this.isDimensionOfUnit("px") || this.isDimensionOfUnit("vh") || this.isDimensionOfUnit("vw") || this.isDimensionOfUnit("vmin") || this.isDimensionOfUnit("vmax") || this.isDimensionOfUnit("rem") || this.isDimensionOfUnit("cm") || this.isDimensionOfUnit("mm") || this.isDimensionOfUnit("in") || this.isDimensionOfUnit("pc") || this.isDimensionOfUnit("pt")); }, isAngle: function() { return (this.isDimensionOfUnit("deg") || this.isDimensionOfUnit("rad") || this.isDimensionOfUnit("grad")); } } var kJscsspUNKNOWN_RULE = 0; var kJscsspSTYLE_RULE = 1 var kJscsspCHARSET_RULE = 2; var kJscsspIMPORT_RULE = 3; var kJscsspMEDIA_RULE = 4; var kJscsspFONT_FACE_RULE = 5; var kJscsspPAGE_RULE = 6; var kJscsspKEYFRAMES_RULE = 7; var kJscsspKEYFRAME_RULE = 8; var kJscsspNAMESPACE_RULE = 100; var kJscsspCOMMENT = 101; var kJscsspWHITE_SPACE = 102; var kJscsspVARIABLES_RULE = 200; var kJscsspSTYLE_DECLARATION = 1000; var gTABS = ""; function jscsspStylesheet() { this.cssRules = []; this.variables = {}; } jscsspStylesheet.prototype = { insertRule: function(aRule, aIndex) { try { this.cssRules.splice(aIndex, 1, aRule); } catch(e) { } }, deleteRule: function(aIndex) { try { this.cssRules.splice(aIndex); } catch(e) { } }, cssText: function() { var rv = ""; for (var i = 0; i < this.cssRules.length; i++) rv += this.cssRules[i].cssText() + "\n\n"; return rv; }, resolveVariables: function(aMedium) { function ItemFoundInArray(aArray, aItem) { for (var i = 0; i < aArray.length; i++) if (aItem == aArray[i]) return true; return false; } for (var i = 0; i < this.cssRules.length; i++) { var rule = this.cssRules[i]; if (rule.type == kJscsspSTYLE_RULE || rule.type == kJscsspIMPORT_RULE) break; else if (rule.type == kJscsspVARIABLES_RULE && (!rule.media.length || ItemFoundInArray(rule.media, aMedium))) { for (var j = 0; j < rule.declarations.length; j++) { var valueText = ""; for (var k = 0; k < rule.declarations[j].values.length; k++) valueText += (k ? " " : "") + rule.declarations[j].values[k].value; this.variables[rule.declarations[j].property] = valueText; } } } } }; /* kJscsspCHARSET_RULE */ function jscsspCharsetRule() { this.type = kJscsspCHARSET_RULE; this.encoding = null; this.parsedCssText = null; this.parentStyleSheet = null; this.parentRule = null; } jscsspCharsetRule.prototype = { cssText: function() { return "@charset " + this.encoding + ";"; }, setCssText: function(val) { var sheet = {cssRules: []}; var parser = new CSSParser(val); var token = parser.getToken(false, false); if (token.isAtRule("@charset")) { if (parser.parseCharsetRule(token, sheet)) { var newRule = sheet.cssRules[0]; this.encoding = newRule.encoding; this.parsedCssText = newRule.parsedCssText; return; } } throw DOMException.SYNTAX_ERR; } }; /* kJscsspUNKNOWN_RULE */ function jscsspErrorRule(aErrorMsg) { this.error = aErrorMsg ? aErrorMsg : "INVALID"; this.type = kJscsspUNKNOWN_RULE; this.parsedCssText = null; this.parentStyleSheet = null; this.parentRule = null; } jscsspErrorRule.prototype = { cssText: function() { return this.parsedCssText; } }; /* kJscsspCOMMENT */ function jscsspComment() { this.type = kJscsspCOMMENT; this.parsedCssText = null; this.parentStyleSheet = null; this.parentRule = null; } jscsspComment.prototype = { cssText: function() { return this.parsedCssText; }, setCssText: function(val) { var parser = new CSSParser(val); var token = parser.getToken(true, false); if (token.isComment()) this.parsedCssText = token.value; else throw DOMException.SYNTAX_ERR; } }; /* kJscsspWHITE_SPACE */ function jscsspWhitespace() { this.type = kJscsspWHITE_SPACE; this.parsedCssText = null; this.parentStyleSheet = null; this.parentRule = null; } jscsspWhitespace.prototype = { cssText: function() { return this.parsedCssText; } }; /* kJscsspIMPORT_RULE */ function jscsspImportRule() { this.type = kJscsspIMPORT_RULE; this.parsedCssText = null; this.href = null; this.media = []; this.parentStyleSheet = null; this.parentRule = null; } jscsspImportRule.prototype = { cssText: function() { var mediaString = this.media.join(", "); return "@import " + this.href + ((mediaString && mediaString != "all") ? mediaString + " " : "") + ";"; }, setCssText: function(val) { var sheet = {cssRules: []}; var parser = new CSSParser(val); var token = parser.getToken(true, true); if (token.isAtRule("@import")) { if (parser.parseImportRule(token, sheet)) { var newRule = sheet.cssRules[0]; this.href = newRule.href; this.media = newRule.media; this.parsedCssText = newRule.parsedCssText; return; } } throw DOMException.SYNTAX_ERR; } }; /* kJscsspNAMESPACE_RULE */ function jscsspNamespaceRule() { this.type = kJscsspNAMESPACE_RULE; this.parsedCssText = null; this.prefix = null; this.url = null; this.parentStyleSheet = null; this.parentRule = null; } jscsspNamespaceRule.prototype = { cssText: function() { return "@namespace " + (this.prefix ? this.prefix + " ": "") + this.url + ";"; }, setCssText: function(val) { var sheet = {cssRules: []}; var parser = new CSSParser(val); var token = parser.getToken(true, true); if (token.isAtRule("@namespace")) { if (parser.parseNamespaceRule(token, sheet)) { var newRule = sheet.cssRules[0]; this.url = newRule.url; this.prefix = newRule.prefix; this.parsedCssText = newRule.parsedCssText; return; } } throw DOMException.SYNTAX_ERR; } }; /* kJscsspSTYLE_DECLARATION */ function jscsspDeclaration() { this.type = kJscsspSTYLE_DECLARATION; this.property = null; this.values = []; this.valueText = null; this.priority = null; this.parsedCssText = null; this.parentStyleSheet = null; this.parentRule = null; } jscsspDeclaration.prototype = { kCOMMA_SEPARATED: { "cursor": true, "font-family": true, "voice-family": true, "background-image": true }, kUNMODIFIED_COMMA_SEPARATED_PROPERTIES: { "text-shadow": true, "box-shadow": true, "transition": true, "transition-property": true, "transition-duration": true, "transition-timing-function": true, "transition-delay": true, "src": true, "-moz-font-feature-settings": true }, cssText: function() { var prefixes = this.property.startsWith("--") ? [ this.property ] : CssInspector.prefixesForProperty(this.property); var rv = ""; if (this.property in this.kUNMODIFIED_COMMA_SEPARATED_PROPERTIES) { if (prefixes) { rv = "\n"; for (var propertyIndex = 0; propertyIndex < prefixes.length; propertyIndex++) { var property = prefixes[propertyIndex]; rv += (propertyIndex ? gTABS : "") + property + ": "; rv += this.valueText + (this.priority ? " !important" : "") + ";"; rv += ((prefixes.length > 1 && propertyIndex != prefixes.length -1) ? "\n" : ""); } return rv; } return this.property + ": " + this.valueText + (this.priority ? " !important" : "") + ";" } if (prefixes) { rv = "\n"; for (var propertyIndex = 0; propertyIndex < prefixes.length; propertyIndex++) { var property = prefixes[propertyIndex]; rv += gTABS + property + ": "; var separator = (property in this.kCOMMA_SEPARATED) ? ", " : " "; for (var i = 0; i < this.values.length; i++) if (this.values[i].cssText() != null) rv += (i ? separator : "") + this.values[i].cssText(); else return null; rv += (this.priority ? " !important" : "") + ";" + ((prefixes.length > 1 && propertyIndex != prefixes.length -1) ? "\n" : ""); } return rv; } var separator = (this.property in this.kCOMMA_SEPARATED) ? ", " : " "; var extras = {"webkit": false, "presto": false, "trident": false, "gecko1.9.2": false, "generic": false } for (var i = 0; i < this.values.length; i++) { var v = this.values[i].cssText(); if (v != null) { var paren = v.indexOf("("); var kwd = v; if (paren != -1) kwd = v.substr(0, paren); if (kwd in kCSS_VENDOR_VALUES) { for (var j in kCSS_VENDOR_VALUES[kwd]) { extras[j] = extras[j] || (kCSS_VENDOR_VALUES[kwd][j] != ""); } } } else return null; } for (var j in extras) { if (extras[j]) { var str = "\n" + gTABS + this.property + ": "; for (var i = 0; i < this.values.length; i++) { var v = this.values[i].cssText(); if (v != null) { var paren = v.indexOf("("); var kwd = v; if (paren != -1) kwd = v.substr(0, paren); if (kwd in kCSS_VENDOR_VALUES) { var functor = kCSS_VENDOR_VALUES[kwd][j]; if (functor) { v = (typeof functor == "string") ? functor : functor(v, j); if (!v) { str = null; break; } } } str += (i ? separator : "") + v; } else return null; } if (str) rv += str + ";" else rv += "\n" + gTABS + "/* Impossible to translate property " + this.property + " for " + j + " */"; } } rv += "\n" + gTABS + this.property + ": "; for (var i = 0; i < this.values.length; i++) { var v = this.values[i].cssText(); if (v != null) { rv += (i ? separator : "") + v; } } rv += (this.priority ? " !important" : "") + ";"; return rv; }, setCssText: function(val) { var declarations = []; var parser = new CSSParser(val); var token = parser.getToken(true, true); if (parser.parseDeclaration(token, declarations, true, true, null) && declarations.length && declarations[0].type == kJscsspSTYLE_DECLARATION) { var newDecl = declarations.cssRules[0]; this.property = newDecl.property; this.value = newDecl.value; this.priority = newDecl.priority; this.parsedCssText = newRule.parsedCssText; return; } throw DOMException.SYNTAX_ERR; } }; /* kJscsspFONT_FACE_RULE */ function jscsspFontFaceRule() { this.type = kJscsspFONT_FACE_RULE; this.parsedCssText = null; this.descriptors = []; this.parentStyleSheet = null; this.parentRule = null; } jscsspFontFaceRule.prototype = { cssText: function() { var rv = gTABS + "@font-face {\n"; var preservedGTABS = gTABS; gTABS += " "; for (var i = 0; i < this.descriptors.length; i++) rv += gTABS + this.descriptors[i].cssText() + "\n"; gTABS = preservedGTABS; return rv + gTABS + "}"; }, setCssText: function(val) { var sheet = {cssRules: []}; var parser = new CSSParser(val); var token = parser.getToken(true, true); if (token.isAtRule("@font-face")) { if (parser.parseFontFaceRule(token, sheet)) { var newRule = sheet.cssRules[0]; this.descriptors = newRule.descriptors; this.parsedCssText = newRule.parsedCssText; return; } } throw DOMException.SYNTAX_ERR; } }; /* kJscsspKEYFRAMES_RULE */ function jscsspKeyframesRule() { this.type = kJscsspKEYFRAMES_RULE; this.parsedCssText = null; this.cssRules = []; this.name = null; this.parentStyleSheet = null; this.parentRule = null; } jscsspKeyframesRule.prototype = { cssText: function() { var rv = ""; var prefixes = ["moz", "webkit", "ms", "o"]; var useGecko = true; var useWebkit = true; var usePresto = true; var useTrident = true; try { var prefs = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch); useGecko = prefs.getBoolPref("bluegriffon.css.support.gecko"); useWebkit = prefs.getBoolPref("bluegriffon.css.support.webkit"); usePresto = prefs.getBoolPref("bluegriffon.css.support.presto"); useTrident = prefs.getBoolPref("bluegriffon.css.support.trident"); } catch(e) {} var usePrefixes = [useGecko, useWebkit, usePresto, useTrident]; for (var p = 0; p < prefixes.length; p++) { if (usePrefixes[p]) { rv += gTABS + "@-" + prefixes[p] + "-keyframes " + this.name + " {\n"; var preservedGTABS = gTABS; gTABS += " "; for (var i = 0; i < this.cssRules.length; i++) rv += gTABS + this.cssRules[i].cssText() + "\n"; gTABS = preservedGTABS; rv += gTABS + "}\n\n"; } } return rv; }, setCssText: function(val) { var sheet = {cssRules: []}; var parser = new CSSParser(val); var token = parser.getToken(true, true); if (token.isAtRule("@-mozkeyframes")) { if (parser.parseKeyframesRule(token, sheet)) { var newRule = sheet.cssRules[0]; this.cssRules = newRule.cssRules; this.name = newRule.name; this.parsedCssText = newRule.parsedCssText; return; } } throw DOMException.SYNTAX_ERR; } }; /* kJscsspKEYFRAME_RULE */ function jscsspKeyframeRule() { this.type = kJscsspKEYFRAME_RULE; this.parsedCssText = null; this.declarations = [] this.keyText = null; this.parentStyleSheet = null; this.parentRule = null; } jscsspKeyframeRule.prototype = { cssText: function() { var rv = this.keyText + " {\n"; var preservedGTABS = gTABS; gTABS += " "; for (var i = 0; i < this.declarations.length; i++) { var declText = this.declarations[i].cssText(); if (declText) rv += gTABS + this.declarations[i].cssText() + "\n"; } gTABS = preservedGTABS; return rv + gTABS + "}"; }, setCssText: function(val) { var sheet = {cssRules: []}; var parser = new CSSParser(val); var token = parser.getToken(true, true); if (!token.isNotNull()) { if (parser.parseKeyframeRule(token, sheet, false)) { var newRule = sheet.cssRules[0]; this.keyText = newRule.keyText; this.declarations = newRule.declarations; this.parsedCssText = newRule.parsedCssText; return; } } throw DOMException.SYNTAX_ERR; } }; /* kJscsspMEDIA_RULE */ function jscsspMediaRule() { this.type = kJscsspMEDIA_RULE; this.parsedCssText = null; this.cssRules = []; this.media = []; this.parentStyleSheet = null; this.parentRule = null; } jscsspMediaRule.prototype = { cssText: function() { var rv = gTABS + "@media " + this.media.join(", ") + " {\n"; var preservedGTABS = gTABS; gTABS += " "; for (var i = 0; i < this.cssRules.length; i++) rv += gTABS + this.cssRules[i].cssText() + "\n"; gTABS = preservedGTABS; return rv + gTABS + "}"; }, setCssText: function(val) { var sheet = {cssRules: []}; var parser = new CSSParser(val); var token = parser.getToken(true, true); if (token.isAtRule("@media")) { if (parser.parseMediaRule(token, sheet)) { var newRule = sheet.cssRules[0]; this.cssRules = newRule.cssRules; this.media = newRule.media; this.parsedCssText = newRule.parsedCssText; return; } } throw DOMException.SYNTAX_ERR; } }; /* kJscsspSTYLE_RULE */ function jscsspStyleRule() { this.type = kJscsspSTYLE_RULE; this.parsedCssText = null; this.declarations = [] this.mSelectorText = null; this.parentStyleSheet = null; this.parentRule = null; } jscsspStyleRule.prototype = { cssText: function() { var rv = this.mSelectorText + " {"; var preservedGTABS = gTABS; gTABS += " "; for (var i = 0; i < this.declarations.length; i++) { var declText = this.declarations[i].cssText(); if (declText) rv += declText; } gTABS = preservedGTABS; return rv + "\n" + gTABS + "}"; }, setCssText: function(val) { var sheet = {cssRules: []}; var parser = new CSSParser(val); var token = parser.getToken(true, true); if (!token.isNotNull()) { if (parser.parseStyleRule(token, sheet, false)) { var newRule = sheet.cssRules[0]; this.mSelectorText = newRule.mSelectorText; this.declarations = newRule.declarations; this.parsedCssText = newRule.parsedCssText; return; } } throw DOMException.SYNTAX_ERR; }, selectorText: function() { return this.mSelectorText; }, setSelectorText: function(val) { var parser = new CSSParser(val); var token = parser.getToken(true, true); if (!token.isNotNull()) { var s = parser.parseSelector(token, true); if (s) { this.mSelectorText = s.selector; return; } } throw DOMException.SYNTAX_ERR; } }; /* kJscsspPAGE_RULE */ function jscsspPageRule() { this.type = kJscsspPAGE_RULE; this.parsedCssText = null; this.pageSelector = null; this.declarations = []; this.parentStyleSheet = null; this.parentRule = null; } jscsspPageRule.prototype = { cssText: function() { var rv = gTABS + "@page " + (this.pageSelector ? this.pageSelector + " ": "") + "{\n"; var preservedGTABS = gTABS; gTABS += " "; for (var i = 0; i < this.declarations.length; i++) rv += gTABS + this.declarations[i].cssText() + "\n"; gTABS = preservedGTABS; return rv + gTABS + "}"; }, setCssText: function(val) { var sheet = {cssRules: []}; var parser = new CSSParser(val); var token = parser.getToken(true, true); if (token.isAtRule("@page")) { if (parser.parsePageRule(token, sheet)) { var newRule = sheet.cssRules[0]; this.pageSelector = newRule.pageSelector; this.declarations = newRule.declarations; this.parsedCssText = newRule.parsedCssText; return; } } throw DOMException.SYNTAX_ERR; } }; /* kJscsspVARIABLES_RULE */ function jscsspVariablesRule() { this.type = kJscsspVARIABLES_RULE; this.parsedCssText = null; this.declarations = []; this.parentStyleSheet = null; this.parentRule = null; this.media = null; } jscsspVariablesRule.prototype = { cssText: function() { var rv = gTABS + "@variables " + (this.media.length ? this.media.join(", ") + " " : "") + "{\n"; var preservedGTABS = gTABS; gTABS += " "; for (var i = 0; i < this.declarations.length; i++) rv += gTABS + this.declarations[i].cssText() + "\n"; gTABS = preservedGTABS; return rv + gTABS + "}"; }, setCssText: function(val) { var sheet = {cssRules: []}; var parser = new CSSParser(val); var token = parser.getToken(true, true); if (token.isAtRule("@variables")) { if (parser.parseVariablesRule(token, sheet)) { var newRule = sheet.cssRules[0]; this.declarations = newRule.declarations; this.parsedCssText = newRule.parsedCssText; return; } } throw DOMException.SYNTAX_ERR; } }; var kJscsspINHERIT_VALUE = 0; var kJscsspPRIMITIVE_VALUE = 1; var kJscsspVARIABLE_VALUE = 4; function jscsspVariable(aType, aSheet) { this.value = ""; this.type = aType; this.name = null; this.parentRule = null; this.parentStyleSheet = aSheet; } jscsspVariable.prototype = { cssText: function() { return this.value; }, setCssText: function(val) { if (this.type == kJscsspVARIABLE_VALUE) throw DOMException.SYNTAX_ERR; else this.value = val; }, resolveVariable: function(aName, aRule, aSheet) { if (aName.toLowerCase() in aSheet.variables) return aSheet.variables[aName.toLowerCase()]; return null; } }; function ParseURL(buffer) { var result = { }; result.protocol = ""; result.user = ""; result.password = ""; result.host = ""; result.port = ""; result.path = ""; result.query = ""; var section = "PROTOCOL"; var start = 0; var wasSlash = false; while(start < buffer.length) { if(section == "PROTOCOL") { if(buffer.charAt(start) == ':') { section = "AFTER_PROTOCOL"; start++; } else if(buffer.charAt(start) == '/' && result.protocol.length() == 0) { section = PATH; } else { result.protocol += buffer.charAt(start++); } } else if(section == "AFTER_PROTOCOL") { if(buffer.charAt(start) == '/') { if(!wasSlash) { wasSlash = true; } else { wasSlash = false; section = "USER"; } start ++; } else { throw new ParseException("Protocol shell be separated with 2 slashes"); } } else if(section == "USER") { if(buffer.charAt(start) == '/') { result.host = result.user; result.user = ""; section = "PATH"; } else if(buffer.charAt(start) == '?') { result.host = result.user; result.user = ""; section = "QUERY"; start++; } else if(buffer.charAt(start) == ':') { section = "PASSWORD"; start++; } else if(buffer.charAt(start) == '@') { section = "HOST"; start++; } else { result.user += buffer.charAt(start++); } } else if(section == "PASSWORD") { if(buffer.charAt(start) == '/') { result.host = result.user; result.port = result.password; result.user = ""; result.password = ""; section = "PATH"; } else if(buffer.charAt(start) == '?') { result.host = result.user; result.port = result.password; result.user = ""; result.password = ""; section = "QUERY"; start ++; } else if(buffer.charAt(start) == '@') { section = "HOST"; start++; } else { result.password += buffer.charAt(start++); } } else if(section == "HOST") { if(buffer.charAt(start) == '/') { section = "PATH"; } else if(buffer.charAt(start) == ':') { section = "PORT"; start++; } else if(buffer.charAt(start) == '?') { section = "QUERY"; start++; } else { result.host += buffer.charAt(start++); } } else if(section == "PORT") { if(buffer.charAt(start) == '/') { section = "PATH"; } else if(buffer.charAt(start) == '?') { section = "QUERY"; start++; } else { result.port += buffer.charAt(start++); } } else if(section == "PATH") { if(buffer.charAt(start) == '?') { section = "QUERY"; start ++; } else { result.path += buffer.charAt(start++); } } else if(section == "QUERY") { result.query += buffer.charAt(start++); } } if(section == "PROTOCOL") { result.host = result.protocol; result.protocol = "http"; } else if(section == "AFTER_PROTOCOL") { throw new ParseException("Invalid url"); } else if(section == "USER") { result.host = result.user; result.user = ""; } else if(section == "PASSWORD") { result.host = result.user; result.port = result.password; result.user = ""; result.password = ""; } return result; } function ParseException(description) { this.description = description; } function CountLF(s) { var nCR = s.match( /\n/g ); return nCR ? nCR.length + 1 : 1; } function FilterLinearGradient(aValue, aEngine) { var g = CssInspector.parseBackgroundImages(aValue)[0]; if (!g.value) return null; var str = ""; var position = ("position" in g.value) ? g.value.position.toLowerCase() : ""; var angle = ("angle" in g.value) ? g.value.angle.toLowerCase() : ""; if ("webkit20110101" == aEngine) { var cancelled = false; str = "-webkit-gradient(linear, "; // normalize angle if (angle) { var match = angle.match(/^([0-9\-\.\\+]+)([a-z]*)/); var angle = parseFloat(match[1]); var unit = match[2]; switch (unit) { case "grad": angle = angle * 90 / 100; break; case "rad": angle = angle * 180 / Math.PI; break; default: break; } while (angle < 0) angle += 360; while (angle >= 360) angle -= 360; } // get startpoint w/o keywords var startpoint = []; var endpoint = []; if (position != "") { if (position == "center") position = "center center"; startpoint = position.split(" "); if (angle == "" && angle != 0) { // no angle, then we just turn the point 180 degrees around center switch (startpoint[0]) { case "left": endpoint.push("right"); break; case "center": endpoint.push("center"); break; case "right": endpoint.push("left"); break; default: { var match = startpoint[0].match(/^([0-9\-\.\\+]+)([a-z]*)/); var v = parseFloat(match[0]); var unit = match[1]; if (unit == "%") { endpoint.push((100-v) + "%"); } else cancelled = true; } break; } if (!cancelled) switch (startpoint[1]) { case "top": endpoint.push("bottom"); break; case "center": endpoint.push("center"); break; case "bottom": endpoint.push("top"); break; default: { var match = startpoint[1].match(/^([0-9\-\.\\+]+)([a-z]*)/); var v = parseFloat(match[0]); var unit = match[1]; if (unit == "%") { endpoint.push((100-v) + "%"); } else cancelled = true; } break; } } else { switch (angle) { case 0: endpoint.push("right"); endpoint.push(startpoint[1]); break; case 90: endpoint.push(startpoint[0]); endpoint.push("top"); break; case 180: endpoint.push("left"); endpoint.push(startpoint[1]); break; case 270: endpoint.push(startpoint[0]); endpoint.push("bottom"); break; default: cancelled = true; break; } } } else { // no position defined, we accept only vertical and horizontal if (angle == "") angle = 270; switch (angle) { case 0: startpoint= ["left", "center"]; endpoint = ["right", "center"]; break; case 90: startpoint= ["center", "bottom"]; endpoint = ["center", "top"]; break; case 180: startpoint= ["right", "center"]; endpoint = ["left", "center"]; break; case 270: startpoint= ["center", "top"]; endpoint = ["center", "bottom"]; break; default: cancelled = true; break; } } if (cancelled) return ""; str += startpoint.join(" ") + ", " + endpoint.join(" "); if (!g.value.stops[0].position) g.value.stops[0].position = "0%"; if (!g.value.stops[g.value.stops.length-1].position) g.value.stops[g.value.stops.length-1].position = "100%"; var current = 0; for (var i = 0; i < g.value.stops.length && !cancelled; i++) { var s = g.value.stops[i]; if (s.position) { if (s.position.indexOf("%") == -1) { cancelled = true; break; } } else { var j = i + 1; while (j < g.value.stops.length && !g.value.stops[j].position) j++; var inc = parseFloat(g.value.stops[j].position) - current; for (var k = i; k < j; k++) { g.value.stops[k].position = (current + inc * (k - i + 1) / (j - i + 1)) + "%"; } } current = parseFloat(s.position); str += ", color-stop(" + (parseFloat(current) / 100) + ", " + s.color + ")"; } if (cancelled) return ""; } else { str = (g.value.isRepeating ? "repeating-" : "") + "linear-gradient("; if (angle || position) str += (angle ? angle : position) + ", "; for (var i = 0; i < g.value.stops.length; i++) { var s = g.value.stops[i]; str += s.color + (s.position ? " " + s.position : "") + ((i != g.value.stops.length -1) ? ", " : ""); } } str += ")"; switch (aEngine) { case "webkit": str = "-webkit-" + str; break; case "gecko1.9.2": str = "-moz-" + str; break; case "presto": str = "-o-" + str; break; case "trident": str = "-ms-" + str; break; default: break; } return str; } function FilterRadialGradient(aValue, aEngine) { var g = CssInspector.parseBackgroundImages(aValue)[0]; if (!g.value) return null; // oh come on, this is now so painful to deal with ; no way I'm going to implement this if ("webkit20110101" == aEngine) return null; var str = (g.value.isRepeating ? "repeating-" : "") + "radial-gradient("; var shape = ("shape" in g.value) ? g.value.shape : ""; var extent = ("extent" in g.value) ? g.value.extent : ""; var lengths = ""; switch (g.value.positions.length) { case 1: lengths = g.value.positions[0] + " " + g.value.positions[0]; break; case 2: lengths = g.value.positions[0] + " " + g.value.positions[1]; break; default: break; } var at = g.value.at; str += (at ? at + ", " : "") + ((shape || extent || at) ? (shape ? shape + " " : "") + (extent ? extent + " " : "") + (lengths ? lengths + " " : "") + ", " : ""); for (var i = 0; i < g.value.stops.length; i++) { var s = g.value.stops[i]; str += s.color + (s.position ? " " + s.position : "") + ((i != g.value.stops.length -1) ? ", " : ""); } str += ")"; switch (aEngine) { case "webkit": str = "-webkit-" + str; break; case "gecko1.9.2": str = "-moz-" + str; break; case "presto": str = "-o-" + str; break; case "trident": str = "-ms-" + str; break; default: break; } return str; } /************************** GRID-TEMPLATE-ROWS/COLUMNS **************************/ function gridAddToTreechildren(aElt, aLabel, aValue, aIsContainer) { var doc = aElt.ownerDocument; var item = doc.createElement("treeitem"); var row = doc.createElement("treerow"); var cell = doc.createElement("treecell"); cell.setAttribute("label", aLabel); row.appendChild(cell); item.appendChild(row); item.setAttribute("value", aValue); aElt.appendChild(item); if (aIsContainer) { item.setAttribute("container", "true"); item.setAttribute("open", "true"); var children = doc.createElement("treechildren"); item.appendChild(children); return children; } return aElt; } function gridAutoRepeat(aCount) { this.count = aCount; this.fixedSizingFunctions = []; this.endLineNames = null; } gridAutoRepeat.prototype = { type: "auto-repeat", count: 0, fixedSizingFunctions: [], endLineNames: null, display: function(aElt, aClass) { var v = "repeat(" + this.count + ")"; var item = gridAddToTreechildren(aElt, v, this.count, true); for (var i = 0; i < this.fixedSizingFunctions.length; i++) { this.fixedSizingFunctions[i].display(item); } if (this.endLineNames && this.endLineNames.length) { var v = "[" + this.endLineNames.join(" ") + "]"; gridAddToTreechildren(item, v, v); } }, toString: function() { var rv = "repeat(" + this.count + ","; for (var i = 0; i < this.fixedSizingFunctions.length; i++) { rv += " " + this.fixedSizingFunctions[i].toString(); } if (this.endLineNames && this.endLineNames.length) rv += " [" + this.endLineNames.join(" ") + "]"; rv += ")"; return rv; } } function gridFixedRepeat(aCount) { this.count = aCount; this.fixedSizingFunctions = []; this.endLineNames = null; } gridFixedRepeat.prototype = { type: "fixed-repeat", count: 0, fixedSizingFunctions: [], endLineNames: null, display: function(aElt) { var v = "repeat(" + this.count + ")"; var item = gridAddToTreechildren(aElt, v, this.count, true); for (var i = 0; i < this.fixedSizingFunctions.length; i++) { this.fixedSizingFunctions[i].display(item); } if (this.endLineNames && this.endLineNames.length) { var v = "[" + this.endLineNames.join(" ") + "]"; gridAddToTreechildren(item, v, v); } }, toString: function() { var rv = "repeat(" + this.count + ","; for (var i = 0; i < this.fixedSizingFunctions.length; i++) { rv += " " + this.fixedSizingFunctions[i].toString(); } if (this.endLineNames && this.endLineNames.length) rv += " [" + this.endLineNames.join(" ") + "]"; rv += ")"; return rv; } } function gridTrackRepeat(aCount) { this.count = aCount; this.trackSizingFunctions = []; this.endLineNames = null; } gridTrackRepeat.prototype = { type: "track-repeat", count: 0, trackSizingFunctions: [], endLineNames: null, display: function(aElt) { var v = "repeat(" + this.count + ")"; var item = gridAddToTreechildren(aElt, v, this.count, true); for (var i = 0; i < this.trackSizingFunctions.length; i++) { this.trackSizingFunctions[i].display(item); } if (this.endLineNames && this.endLineNames.length) { var v = "[" + this.endLineNames.join(" ") + "]"; gridAddToTreechildren(item, v, v); } }, toString: function() { var rv = "repeat(" + this.count + ","; for (var i = 0; i < this.trackSizingFunctions.length; i++) { rv += " " + this.trackSizingFunctions[i].toString(); } if (this.endLineNames && this.endLineNames.length) rv += " [" + this.endLineNames.join(" ") + "]"; rv += ")"; return rv; } } function gridAutoTrackList() { this.startEntries = []; this.startLineNames = null; this.autoRepeat = null; this.endEntries = []; this.endLineNames = null; } gridAutoTrackList.prototype = { type: "auto-track-list", startEntries: [], startLineNames: null, autoRepeat: null, endEntries: [], endLineNames: null, display: function(aElt) { for (var i = 0; i < this.startEntries.length; i++) { this.startEntries.display(aElt); } if (this.startLineNames && this.startLineNames.length) { var v = "[" + this.startLineNames.join(" ") + "]"; gridAddToTreechildren(aElt, v, v); } this.autoRepeat.display(aElt); for (var i = 0; i < this.endEntries.length; i++) { this.endEntries.display(aEl); } if (this.endLineNames && this.endLineNames.length) { var v = "[" + this.endLineNames.join(" ") + "]"; gridAddToTreechildren(aElt, v, v); } }, toString: function() { var rv = ""; for (var i = 0; i < this.startEntries.length; i++) { if (i) rv += " "; rv += this.startEntries.toString(); } if (this.startLineNames && this.startLineNames.length) { rv += " "; rv += " [" + this.startLineNames.join(" ") + "]"; } rv += " " + this.autoRepeat.toString(); for (var i = 0; i < this.endEntries.length; i++) { rv += " " + this.endEntries.toString(); } if (this.endLineNames && this.endLineNames.length) { rv += " "; rv += " [" + this.endLineNames.join(" ") + "]"; } return rv; } } function gridTrackList() { this.entries = []; this.lineNames = null; } gridTrackList.prototype = { type: "track-list", entries: [], lineNames: null, display: function(aElt) { for (var i = 0; i < this.entries.length; i++) { this.entries[i].display(aElt); } if (this.lineNames && this.lineNames.length) { var v = "[" + this.lineNames.join(" ") + "]"; gridAddToTreechildren(aElt, v, v); } }, toString: function() { var rv = ""; for (var i = 0; i < this.entries.length; i++) { if (i) rv += " "; rv += this.entries[i].toString(); } if (this.lineNames && this.lineNames.length) rv += " [" + this.lineNames.join(" ") + "]"; rv += ")"; return rv; } } function gridTrackSize(aType, aFirstArgument, aSecondArgument) { this.valueType = aType; if (aSecondArgument) this.value = [aFirstArgument, aSecondArgument]; else this.value = aFirstArgument; } gridTrackSize.prototype = { type: "track-size", valueType: "", value: null, display: function(aElt) { var v = this.toString(); gridAddToTreechildren(aElt, v, v); }, toString: function() { switch (this.valueType) { case "track-breadth": return this.value.value; default: return this.valueType + "(" + this.value[0].value + ", " + this.value[1].value + ")"; } } } function gridNone() {} gridNone.prototype = { type: "none", display: function(aElt) { gridAddToTreechildren(aElt, "none", "none"); }, toString: function() { return "none"; } } function gridFixedSize(aType, aFirstArgument, aSecondArgument) { this.valueType = aType; if (aSecondArgument) this.value = [aFirstArgument, aSecondArgument]; else this.value = aFirstArgument; } gridFixedSize.prototype = { type: "fixed-size", valueType: "", value: null, display: function(aElt) { var v = this.toString(); gridAddToTreechildren(aElt, v, v); }, toString: function() { switch (this.valueType) { case "fixed-breadth": return this.value.value; default: return this.valueType + "(" + this.value[0].value + ", " + this.value[1].value + ")"; } } } function gridTrack(aLineNames, aSize) { this.lineNames = aLineNames; this.size = aSize; } gridTrack.prototype = { type: "track", lineNames: null, size: null, display: function(aElt) { if (this.lineNames && this.lineNames.length) { var v = "[" + this.lineNames.join(" ") + "]"; gridAddToTreechildren(aElt, v, v); } this.size.display(aElt); }, toString: function() { var rv = ""; if (this.lineNames && this.lineNames.length) rv += "[" + this.lineNames.join(" ") + "] "; rv += this.size.toString(); return rv; } } ================================================ FILE: modules/cssProperties.jsm ================================================ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is BlueGriffon. * * The Initial Developer of the Original Code is * Disruptive Innovations SARL. * Portions created by the Initial Developer are Copyright (C) 2016 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Daniel Glazman , Original author * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ var EXPORTED_SYMBOLS = ["kCSS_PROPERTIES"]; var kCSS_PROPERTIES = { "lastUpdate": "20160501", "source": "http://disruptive-innovations.com/zoo/cssproperties", "engines": ["blink", "gecko", "servo", "vivliostyle", "weasyprint", "webkit"], "properties": { "color": { "blink": "color", "gecko": "color", "servo": "color", "vivliostyle": "color", "weasyprint": "color", "webkit": "color" }, "direction": { "blink": "direction", "gecko": "direction", "servo": "direction", "vivliostyle": "direction", "weasyprint": "direction", "webkit": "direction" }, "font-family": { "blink": "font-family", "gecko": "font-family", "servo": "font-family", "vivliostyle": "font-family", "weasyprint": "font-family", "webkit": "font-family" }, "font-kerning": { "blink": "font-kerning", "gecko": "font-kerning", "vivliostyle": "font-kerning", "webkit": "font-kerning" }, "font-size": { "blink": "font-size", "gecko": "font-size", "servo": "font-size", "vivliostyle": "font-size", "weasyprint": "font-size", "webkit": "font-size" }, "font-size-adjust": { "blink": "font-size-adjust", "gecko": "font-size-adjust" }, "font-stretch": { "blink": "font-stretch", "gecko": "font-stretch", "servo": "font-stretch", "weasyprint": "font-stretch", "webkit": "font-stretch" }, "font-style": { "blink": "font-style", "gecko": "font-style", "servo": "font-style", "vivliostyle": "font-style", "weasyprint": "font-style", "webkit": "font-style" }, "font-variant": { "blink": "font-variant", "gecko": "font-variant", "servo": "font-variant", "vivliostyle": "font-variant", "weasyprint": "font-variant", "webkit": "font-variant" }, "font-variant-ligatures": { "blink": "font-variant-ligatures", "gecko": "font-variant-ligatures", "webkit": "font-variant-ligatures" }, "font-weight": { "blink": "font-weight", "gecko": "font-weight", "servo": "font-weight", "vivliostyle": "font-weight", "weasyprint": "font-weight", "webkit": "font-weight" }, "font-feature-settings": { "blink": "-webkit-font-feature-settings", "gecko": "font-feature-settings", "vivliostyle": "font-feature-settings", "webkit": "font-feature-settings" }, "font-smoothing": { "blink": "-webkit-font-smoothing", "webkit": "-webkit-font-smoothing" }, "locale": { "blink": "-webkit-locale", "webkit": "-webkit-locale" }, "text-orientation": { "blink": "-epub-text-orientation", "gecko": "text-orientation", "servo": "text-orientation", "vivliostyle": "text-orientation", "webkit": "-epub-text-orientation" }, "writing-mode": { "blink": "writing-mode", "gecko": "writing-mode", "servo": "writing-mode", "vivliostyle": "writing-mode", "webkit": "writing-mode" }, "text-rendering": { "blink": "text-rendering", "gecko": "text-rendering", "servo": "text-rendering", "webkit": "text-rendering" }, "zoom": { "blink": "zoom", "webkit": "zoom" }, "align-content": { "blink": "align-content", "gecko": "align-content", "vivliostyle": "align-content", "webkit": "align-content" }, "align-items": { "blink": "align-items", "gecko": "align-items", "vivliostyle": "align-items", "webkit": "align-items" }, "alignment-baseline": { "blink": "alignment-baseline", "webkit": "alignment-baseline" }, "align-self": { "blink": "align-self", "gecko": "align-self", "vivliostyle": "align-self", "webkit": "align-self" }, "animation-delay": { "blink": "animation-delay", "gecko": "animation-delay", "webkit": "animation-delay" }, "animation-direction": { "blink": "animation-direction", "gecko": "animation-direction", "webkit": "animation-direction" }, "animation-duration": { "blink": "animation-duration", "gecko": "animation-duration", "webkit": "animation-duration" }, "animation-fill-mode": { "blink": "animation-fill-mode", "gecko": "animation-fill-mode", "webkit": "animation-fill-mode" }, "animation-iteration-count": { "blink": "animation-iteration-count", "gecko": "animation-iteration-count", "webkit": "animation-iteration-count" }, "animation-name": { "blink": "animation-name", "gecko": "animation-name", "webkit": "animation-name" }, "animation-play-state": { "blink": "animation-play-state", "gecko": "animation-play-state", "webkit": "animation-play-state" }, "animation-timing-function": { "blink": "animation-timing-function", "gecko": "animation-timing-function", "webkit": "animation-timing-function" }, "backdrop-filter": { "blink": "backdrop-filter", "webkit": "-webkit-backdrop-filter" }, "backface-visibility": { "blink": "backface-visibility", "gecko": "backface-visibility", "servo": "backface-visibility", "vivliostyle": "backface-visibility", "webkit": "-webkit-backface-visibility" }, "background-attachment": { "blink": "background-attachment", "gecko": "background-attachment", "servo": "background-attachment", "vivliostyle": "background-attachment", "weasyprint": "background-attachment", "webkit": "background-attachment" }, "background-blend-mode": { "blink": "background-blend-mode", "gecko": "background-blend-mode", "webkit": "background-blend-mode" }, "background-clip": { "blink": "background-clip", "gecko": "background-clip", "servo": "background-clip", "vivliostyle": "background-clip", "weasyprint": "background-clip", "webkit": "background-clip" }, "background-color": { "blink": "background-color", "gecko": "background-color", "servo": "background-color", "vivliostyle": "background-color", "weasyprint": "background-color", "webkit": "background-color" }, "background-image": { "blink": "background-image", "gecko": "background-image", "servo": "background-image", "vivliostyle": "background-image", "weasyprint": "background-image", "webkit": "background-image" }, "background-origin": { "blink": "background-origin", "gecko": "background-origin", "servo": "background-origin", "vivliostyle": "background-origin", "weasyprint": "background-origin", "webkit": "background-origin" }, "background-position-x": { "blink": "background-position-x", "webkit": "background-position-x" }, "background-position-y": { "blink": "background-position-y", "webkit": "background-position-y" }, "background-repeat-x": { "blink": "background-repeat-x", "webkit": "background-repeat-x" }, "background-repeat-y": { "blink": "background-repeat-y", "webkit": "background-repeat-y" }, "background-size": { "blink": "background-size", "gecko": "background-size", "servo": "background-size", "vivliostyle": "background-size", "weasyprint": "background-size", "webkit": "background-size" }, "baseline-shift": { "blink": "baseline-shift", "webkit": "baseline-shift" }, "border-bottom-color": { "blink": "border-bottom-color", "gecko": "border-bottom-color", "servo": "border-bottom-color", "vivliostyle": "border-bottom-color", "weasyprint": "border-bottom-color", "webkit": "border-bottom-color" }, "border-bottom-left-radius": { "blink": "border-bottom-left-radius", "gecko": "border-bottom-left-radius", "servo": "border-bottom-left-radius", "vivliostyle": "border-bottom-left-radius", "weasyprint": "border-bottom-left-radius", "webkit": "border-bottom-left-radius" }, "border-bottom-right-radius": { "blink": "border-bottom-right-radius", "gecko": "border-bottom-right-radius", "servo": "border-bottom-right-radius", "vivliostyle": "border-bottom-right-radius", "weasyprint": "border-bottom-right-radius", "webkit": "border-bottom-right-radius" }, "border-bottom-style": { "blink": "border-bottom-style", "gecko": "border-bottom-style", "servo": "border-bottom-style", "vivliostyle": "border-bottom-style", "weasyprint": "border-bottom-style", "webkit": "border-bottom-style" }, "border-bottom-width": { "blink": "border-bottom-width", "gecko": "border-bottom-width", "servo": "border-bottom-width", "vivliostyle": "border-bottom-width", "weasyprint": "border-bottom-width", "webkit": "border-bottom-width" }, "border-collapse": { "blink": "border-collapse", "gecko": "border-collapse", "servo": "border-collapse", "vivliostyle": "border-collapse", "weasyprint": "border-collapse", "webkit": "border-collapse" }, "border-image-outset": { "blink": "border-image-outset", "gecko": "border-image-outset", "vivliostyle": "border-image-outset", "webkit": "border-image-outset" }, "border-image-repeat": { "blink": "border-image-repeat", "gecko": "border-image-repeat", "vivliostyle": "border-image-repeat", "webkit": "border-image-repeat" }, "border-image-slice": { "blink": "border-image-slice", "gecko": "border-image-slice", "vivliostyle": "border-image-slice", "webkit": "border-image-slice" }, "border-image-source": { "blink": "border-image-source", "gecko": "border-image-source", "vivliostyle": "border-image-source", "webkit": "border-image-source" }, "border-image-width": { "blink": "border-image-width", "gecko": "border-image-width", "vivliostyle": "border-image-width", "webkit": "border-image-width" }, "border-left-color": { "blink": "border-left-color", "gecko": "border-left-color", "servo": "border-left-color", "vivliostyle": "border-left-color", "weasyprint": "border-left-color", "webkit": "border-left-color" }, "border-left-style": { "blink": "border-left-style", "gecko": "border-left-style", "servo": "border-left-style", "vivliostyle": "border-left-style", "weasyprint": "border-left-style", "webkit": "border-left-style" }, "border-left-width": { "blink": "border-left-width", "gecko": "border-left-width", "servo": "border-left-width", "vivliostyle": "border-left-width", "weasyprint": "border-left-width", "webkit": "border-left-width" }, "border-right-color": { "blink": "border-right-color", "gecko": "border-right-color", "servo": "border-right-color", "vivliostyle": "border-right-color", "weasyprint": "border-right-color", "webkit": "border-right-color" }, "border-right-style": { "blink": "border-right-style", "gecko": "border-right-style", "servo": "border-right-style", "vivliostyle": "border-right-style", "weasyprint": "border-right-style", "webkit": "border-right-style" }, "border-right-width": { "blink": "border-right-width", "gecko": "border-right-width", "servo": "border-right-width", "vivliostyle": "border-right-width", "weasyprint": "border-right-width", "webkit": "border-right-width" }, "border-top-color": { "blink": "border-top-color", "gecko": "border-top-color", "servo": "border-top-color", "vivliostyle": "border-top-color", "weasyprint": "border-top-color", "webkit": "border-top-color" }, "border-top-left-radius": { "blink": "border-top-left-radius", "gecko": "border-top-left-radius", "servo": "border-top-left-radius", "vivliostyle": "border-top-left-radius", "weasyprint": "border-top-left-radius", "webkit": "border-top-left-radius" }, "border-top-right-radius": { "blink": "border-top-right-radius", "gecko": "border-top-right-radius", "servo": "border-top-right-radius", "vivliostyle": "border-top-right-radius", "weasyprint": "border-top-right-radius", "webkit": "border-top-right-radius" }, "border-top-style": { "blink": "border-top-style", "gecko": "border-top-style", "servo": "border-top-style", "vivliostyle": "border-top-style", "weasyprint": "border-top-style", "webkit": "border-top-style" }, "border-top-width": { "blink": "border-top-width", "gecko": "border-top-width", "servo": "border-top-width", "vivliostyle": "border-top-width", "weasyprint": "border-top-width", "webkit": "border-top-width" }, "bottom": { "blink": "bottom", "gecko": "bottom", "servo": "bottom", "vivliostyle": "bottom", "weasyprint": "bottom", "webkit": "bottom" }, "box-shadow": { "blink": "box-shadow", "gecko": "box-shadow", "servo": "box-shadow", "vivliostyle": "box-shadow", "webkit": "box-shadow" }, "box-sizing": { "blink": "box-sizing", "gecko": "box-sizing", "servo": "box-sizing", "vivliostyle": "box-sizing", "weasyprint": "box-sizing", "webkit": "box-sizing" }, "buffered-rendering": { "blink": "buffered-rendering", "webkit": "buffered-rendering" }, "caption-side": { "blink": "caption-side", "gecko": "caption-side", "servo": "caption-side", "vivliostyle": "caption-side", "weasyprint": "caption-side", "webkit": "caption-side" }, "clear": { "blink": "clear", "gecko": "clear", "servo": "clear", "vivliostyle": "clear", "weasyprint": "clear", "webkit": "clear" }, "clip": { "blink": "clip", "gecko": "clip", "servo": "clip", "vivliostyle": "clip", "weasyprint": "clip", "webkit": "clip" }, "clip-path": { "blink": "clip-path", "gecko": "clip-path", "webkit": "clip-path" }, "clip-rule": { "blink": "clip-rule", "gecko": "clip-rule", "webkit": "clip-rule" }, "color-interpolation": { "blink": "color-interpolation", "gecko": "color-interpolation", "webkit": "color-interpolation" }, "color-interpolation-filters": { "blink": "color-interpolation-filters", "gecko": "color-interpolation-filters", "webkit": "color-interpolation-filters" }, "color-rendering": { "blink": "color-rendering", "webkit": "color-rendering" }, "column-fill": { "blink": "column-fill", "gecko": "-moz-column-fill", "vivliostyle": "column-fill", "webkit": "column-fill" }, "content": { "blink": "content", "gecko": "content", "servo": "content", "vivliostyle": "content", "weasyprint": "content", "webkit": "content" }, "counter-increment": { "blink": "counter-increment", "gecko": "counter-increment", "servo": "counter-increment", "vivliostyle": "counter-increment", "weasyprint": "counter-increment", "webkit": "counter-increment" }, "counter-reset": { "blink": "counter-reset", "gecko": "counter-reset", "servo": "counter-reset", "vivliostyle": "counter-reset", "weasyprint": "counter-reset", "webkit": "counter-reset" }, "cursor": { "blink": "cursor", "gecko": "cursor", "servo": "cursor", "vivliostyle": "cursor", "webkit": "cursor" }, "cx": { "blink": "cx", "webkit": "cx" }, "cy": { "blink": "cy", "webkit": "cy" }, "display": { "blink": "display", "gecko": "display", "servo": "display", "vivliostyle": "display", "weasyprint": "display", "webkit": "display" }, "dominant-baseline": { "blink": "dominant-baseline", "gecko": "dominant-baseline", "webkit": "dominant-baseline" }, "empty-cells": { "blink": "empty-cells", "gecko": "empty-cells", "servo": "empty-cells", "vivliostyle": "empty-cells", "weasyprint": "empty-cells", "webkit": "empty-cells" }, "fill": { "blink": "fill", "gecko": "fill", "webkit": "fill" }, "fill-opacity": { "blink": "fill-opacity", "gecko": "fill-opacity", "webkit": "fill-opacity" }, "fill-rule": { "blink": "fill-rule", "gecko": "fill-rule", "webkit": "fill-rule" }, "filter": { "blink": "filter", "gecko": "filter", "servo": "filter", "vivliostyle": "filter", "webkit": "filter" }, "flex-basis": { "blink": "flex-basis", "gecko": "flex-basis", "vivliostyle": "flex-basis", "webkit": "flex-basis" }, "flex-direction": { "blink": "flex-direction", "gecko": "flex-direction", "servo": "flex-direction", "vivliostyle": "flex-direction", "webkit": "flex-direction" }, "flex-grow": { "blink": "flex-grow", "gecko": "flex-grow", "vivliostyle": "flex-grow", "webkit": "flex-grow" }, "flex-shrink": { "blink": "flex-shrink", "gecko": "flex-shrink", "vivliostyle": "flex-shrink", "webkit": "flex-shrink" }, "flex-wrap": { "blink": "flex-wrap", "gecko": "flex-wrap", "vivliostyle": "flex-wrap", "webkit": "flex-wrap" }, "float": { "blink": "float", "gecko": "float", "servo": "float", "vivliostyle": "float", "weasyprint": "float", "webkit": "float" }, "flood-color": { "blink": "flood-color", "gecko": "flood-color", "webkit": "flood-color" }, "flood-opacity": { "blink": "flood-opacity", "gecko": "flood-opacity", "webkit": "flood-opacity" }, "glyph-orientation-horizontal": { "blink": "glyph-orientation-horizontal", "webkit": "glyph-orientation-horizontal" }, "glyph-orientation-vertical": { "blink": "glyph-orientation-vertical", "webkit": "glyph-orientation-vertical" }, "grid-auto-columns": { "blink": "grid-auto-columns", "gecko": "grid-auto-columns", "webkit": "-webkit-grid-auto-columns" }, "grid-auto-flow": { "blink": "grid-auto-flow", "gecko": "grid-auto-flow", "webkit": "-webkit-grid-auto-flow" }, "grid-auto-rows": { "blink": "grid-auto-rows", "gecko": "grid-auto-rows", "webkit": "-webkit-grid-auto-rows" }, "grid-column-end": { "blink": "grid-column-end", "gecko": "grid-column-end", "webkit": "-webkit-grid-column-end" }, "grid-column-start": { "blink": "grid-column-start", "gecko": "grid-column-start", "webkit": "-webkit-grid-column-start" }, "grid-row-end": { "blink": "grid-row-end", "gecko": "grid-row-end", "webkit": "-webkit-grid-row-end" }, "grid-row-start": { "blink": "grid-row-start", "gecko": "grid-row-start", "webkit": "-webkit-grid-row-start" }, "grid-template-areas": { "blink": "grid-template-areas", "gecko": "grid-template-areas", "webkit": "-webkit-grid-template-areas" }, "grid-template-columns": { "blink": "grid-template-columns", "gecko": "grid-template-columns", "webkit": "-webkit-grid-template-columns" }, "grid-template-rows": { "blink": "grid-template-rows", "gecko": "grid-template-rows", "webkit": "-webkit-grid-template-rows" }, "height": { "blink": "height", "gecko": "height", "servo": "height", "vivliostyle": "height", "weasyprint": "height", "webkit": "height" }, "image-rendering": { "blink": "image-rendering", "gecko": "image-rendering", "servo": "image-rendering", "weasyprint": "image-rendering", "webkit": "image-rendering" }, "image-orientation": { "blink": "image-orientation", "gecko": "image-orientation", "webkit": "image-orientation" }, "isolation": { "blink": "isolation", "gecko": "isolation", "webkit": "isolation" }, "justify-content": { "blink": "justify-content", "gecko": "justify-content", "vivliostyle": "justify-content", "webkit": "justify-content" }, "justify-items": { "blink": "justify-items", "gecko": "justify-items", "webkit": "justify-items" }, "justify-self": { "blink": "justify-self", "gecko": "justify-self", "webkit": "justify-self" }, "left": { "blink": "left", "gecko": "left", "servo": "left", "vivliostyle": "left", "weasyprint": "left", "webkit": "left" }, "letter-spacing": { "blink": "letter-spacing", "gecko": "letter-spacing", "servo": "letter-spacing", "vivliostyle": "letter-spacing", "weasyprint": "letter-spacing", "webkit": "letter-spacing" }, "lighting-color": { "blink": "lighting-color", "gecko": "lighting-color", "webkit": "lighting-color" }, "line-height": { "blink": "line-height", "gecko": "line-height", "servo": "line-height", "vivliostyle": "line-height", "weasyprint": "line-height", "webkit": "line-height" }, "list-style-image": { "blink": "list-style-image", "gecko": "list-style-image", "servo": "list-style-image", "vivliostyle": "list-style-image", "weasyprint": "list-style-image", "webkit": "list-style-image" }, "list-style-position": { "blink": "list-style-position", "gecko": "list-style-position", "servo": "list-style-position", "vivliostyle": "list-style-position", "weasyprint": "list-style-position", "webkit": "list-style-position" }, "list-style-type": { "blink": "list-style-type", "gecko": "list-style-type", "servo": "list-style-type", "vivliostyle": "list-style-type", "weasyprint": "list-style-type", "webkit": "list-style-type" }, "margin-bottom": { "blink": "margin-bottom", "gecko": "margin-bottom", "servo": "margin-bottom", "vivliostyle": "margin-bottom", "weasyprint": "margin-bottom", "webkit": "margin-bottom" }, "margin-left": { "blink": "margin-left", "gecko": "margin-left", "servo": "margin-left", "vivliostyle": "margin-left", "weasyprint": "margin-left", "webkit": "margin-left" }, "margin-right": { "blink": "margin-right", "gecko": "margin-right", "servo": "margin-right", "vivliostyle": "margin-right", "weasyprint": "margin-right", "webkit": "margin-right" }, "margin-top": { "blink": "margin-top", "gecko": "margin-top", "servo": "margin-top", "vivliostyle": "margin-top", "weasyprint": "margin-top", "webkit": "margin-top" }, "marker-end": { "blink": "marker-end", "gecko": "marker-end", "webkit": "marker-end" }, "marker-mid": { "blink": "marker-mid", "gecko": "marker-mid", "webkit": "marker-mid" }, "marker-start": { "blink": "marker-start", "gecko": "marker-start", "webkit": "marker-start" }, "mask": { "blink": "mask", "gecko": "mask", "webkit": "mask" }, "mask-source-type": { "blink": "mask-source-type", "webkit": "-webkit-mask-source-type" }, "mask-type": { "blink": "mask-type", "gecko": "mask-type", "webkit": "mask-type" }, "max-height": { "blink": "max-height", "gecko": "max-height", "servo": "max-height", "vivliostyle": "max-height", "weasyprint": "max-height", "webkit": "max-height" }, "max-width": { "blink": "max-width", "gecko": "max-width", "servo": "max-width", "vivliostyle": "max-width", "weasyprint": "max-width", "webkit": "max-width" }, "min-height": { "blink": "min-height", "gecko": "min-height", "servo": "min-height", "vivliostyle": "min-height", "weasyprint": "min-height", "webkit": "min-height" }, "min-width": { "blink": "min-width", "gecko": "min-width", "servo": "min-width", "vivliostyle": "min-width", "weasyprint": "min-width", "webkit": "min-width" }, "mix-blend-mode": { "blink": "mix-blend-mode", "gecko": "mix-blend-mode", "servo": "mix-blend-mode", "webkit": "mix-blend-mode" }, "motion-offset": { "blink": "motion-offset" }, "motion-path": { "blink": "motion-path" }, "motion-rotation": { "blink": "motion-rotation" }, "object-fit": { "blink": "object-fit", "gecko": "object-fit", "vivliostyle": "object-fit", "webkit": "object-fit" }, "object-position": { "blink": "object-position", "gecko": "object-position", "vivliostyle": "object-position", "webkit": "object-position" }, "opacity": { "blink": "opacity", "gecko": "opacity", "servo": "opacity", "vivliostyle": "opacity", "weasyprint": "opacity", "webkit": "opacity" }, "order": { "blink": "order", "gecko": "order", "vivliostyle": "order", "webkit": "order" }, "orphans": { "blink": "orphans", "vivliostyle": "orphans", "weasyprint": "orphans", "webkit": "orphans" }, "outline-color": { "blink": "outline-color", "gecko": "outline-color", "servo": "outline-color", "vivliostyle": "outline-color", "weasyprint": "outline-color", "webkit": "outline-color" }, "outline-offset": { "blink": "outline-offset", "gecko": "outline-offset", "servo": "outline-offset", "vivliostyle": "outline-offset", "webkit": "outline-offset" }, "outline-style": { "blink": "outline-style", "gecko": "outline-style", "servo": "outline-style", "vivliostyle": "outline-style", "weasyprint": "outline-style", "webkit": "outline-style" }, "outline-width": { "blink": "outline-width", "gecko": "outline-width", "servo": "outline-width", "vivliostyle": "outline-width", "weasyprint": "outline-width", "webkit": "outline-width" }, "overflow-wrap": { "blink": "overflow-wrap", "servo": "overflow-wrap", "vivliostyle": "overflow-wrap", "weasyprint": "overflow-wrap", "webkit": "overflow-wrap" }, "overflow-x": { "blink": "overflow-x", "gecko": "overflow-x", "servo": "overflow-x", "webkit": "overflow-x" }, "overflow-y": { "blink": "overflow-y", "gecko": "overflow-y", "servo": "overflow-y", "webkit": "overflow-y" }, "padding-bottom": { "blink": "padding-bottom", "gecko": "padding-bottom", "servo": "padding-bottom", "vivliostyle": "padding-bottom", "weasyprint": "padding-bottom", "webkit": "padding-bottom" }, "padding-left": { "blink": "padding-left", "gecko": "padding-left", "servo": "padding-left", "vivliostyle": "padding-left", "weasyprint": "padding-left", "webkit": "padding-left" }, "padding-right": { "blink": "padding-right", "gecko": "padding-right", "servo": "padding-right", "vivliostyle": "padding-right", "weasyprint": "padding-right", "webkit": "padding-right" }, "padding-top": { "blink": "padding-top", "gecko": "padding-top", "servo": "padding-top", "vivliostyle": "padding-top", "weasyprint": "padding-top", "webkit": "padding-top" }, "page-break-after": { "blink": "page-break-after", "gecko": "page-break-after", "vivliostyle": "page-break-after", "weasyprint": "page-break-after", "webkit": "page-break-after" }, "page-break-before": { "blink": "page-break-before", "gecko": "page-break-before", "vivliostyle": "page-break-before", "weasyprint": "page-break-before", "webkit": "page-break-before" }, "page-break-inside": { "blink": "page-break-inside", "gecko": "page-break-inside", "vivliostyle": "page-break-inside", "weasyprint": "page-break-inside", "webkit": "page-break-inside" }, "paint-order": { "blink": "paint-order", "gecko": "paint-order", "webkit": "paint-order" }, "perspective": { "blink": "perspective", "gecko": "perspective", "servo": "perspective", "webkit": "perspective" }, "perspective-origin": { "blink": "perspective-origin", "gecko": "perspective-origin", "servo": "perspective-origin", "webkit": "perspective-origin" }, "pointer-events": { "blink": "pointer-events", "gecko": "pointer-events", "servo": "pointer-events", "webkit": "pointer-events" }, "position": { "blink": "position", "gecko": "position", "servo": "position", "vivliostyle": "position", "weasyprint": "position", "webkit": "position" }, "quotes": { "blink": "quotes", "gecko": "quotes", "servo": "quotes", "vivliostyle": "quotes", "weasyprint": "quotes", "webkit": "quotes" }, "resize": { "blink": "resize", "gecko": "resize", "webkit": "resize" }, "right": { "blink": "right", "gecko": "right", "servo": "right", "vivliostyle": "right", "weasyprint": "right", "webkit": "right" }, "r": { "blink": "r", "webkit": "r" }, "rx": { "blink": "rx", "webkit": "rx" }, "ry": { "blink": "ry", "webkit": "ry" }, "scroll-behavior": { "blink": "scroll-behavior", "gecko": "scroll-behavior" }, "scroll-snap-type": { "blink": "scroll-snap-type", "gecko": "scroll-snap-type", "webkit": "-webkit-scroll-snap-type" }, "scroll-snap-points-x": { "blink": "scroll-snap-points-x", "gecko": "scroll-snap-points-x", "webkit": "-webkit-scroll-snap-points-x" }, "scroll-snap-points-y": { "blink": "scroll-snap-points-y", "gecko": "scroll-snap-points-y", "webkit": "-webkit-scroll-snap-points-y" }, "scroll-snap-destination": { "blink": "scroll-snap-destination", "gecko": "scroll-snap-destination", "webkit": "-webkit-scroll-snap-destination" }, "scroll-snap-coordinate": { "blink": "scroll-snap-coordinate", "gecko": "scroll-snap-coordinate", "webkit": "-webkit-scroll-snap-coordinate" }, "shape-image-threshold": { "blink": "shape-image-threshold", "webkit": "-webkit-shape-image-threshold" }, "shape-margin": { "blink": "shape-margin", "webkit": "-webkit-shape-margin" }, "shape-outside": { "blink": "shape-outside", "vivliostyle": "shape-outside", "webkit": "-webkit-shape-outside" }, "shape-rendering": { "blink": "shape-rendering", "gecko": "shape-rendering", "webkit": "shape-rendering" }, "size": { "blink": "size", "vivliostyle": "size", "weasyprint": "size", "webkit": "size" }, "speak": { "blink": "speak", "webkit": "speak" }, "stop-color": { "blink": "stop-color", "gecko": "stop-color", "webkit": "stop-color" }, "stop-opacity": { "blink": "stop-opacity", "gecko": "stop-opacity", "webkit": "stop-opacity" }, "stroke": { "blink": "stroke", "gecko": "stroke", "webkit": "stroke" }, "stroke-dasharray": { "blink": "stroke-dasharray", "gecko": "stroke-dasharray", "webkit": "stroke-dasharray" }, "stroke-dashoffset": { "blink": "stroke-dashoffset", "gecko": "stroke-dashoffset", "webkit": "stroke-dashoffset" }, "stroke-linecap": { "blink": "stroke-linecap", "gecko": "stroke-linecap", "webkit": "stroke-linecap" }, "stroke-linejoin": { "blink": "stroke-linejoin", "gecko": "stroke-linejoin", "webkit": "stroke-linejoin" }, "stroke-miterlimit": { "blink": "stroke-miterlimit", "gecko": "stroke-miterlimit", "webkit": "stroke-miterlimit" }, "stroke-opacity": { "blink": "stroke-opacity", "gecko": "stroke-opacity", "webkit": "stroke-opacity" }, "stroke-width": { "blink": "stroke-width", "gecko": "stroke-width", "webkit": "stroke-width" }, "table-layout": { "blink": "table-layout", "gecko": "table-layout", "servo": "table-layout", "vivliostyle": "table-layout", "weasyprint": "table-layout", "webkit": "table-layout" }, "tab-size": { "blink": "tab-size", "gecko": "-moz-tab-size", "vivliostyle": "tab-size", "webkit": "tab-size" }, "text-align": { "blink": "text-align", "gecko": "text-align", "servo": "text-align", "vivliostyle": "text-align", "weasyprint": "text-align", "webkit": "text-align" }, "text-align-last": { "blink": "text-align-last", "gecko": "-moz-text-align-last", "vivliostyle": "text-align-last", "webkit": "-webkit-text-align-last" }, "text-anchor": { "blink": "text-anchor", "gecko": "text-anchor", "webkit": "text-anchor" }, "text-decoration": { "blink": "text-decoration", "gecko": "text-decoration", "servo": "text-decoration", "vivliostyle": "text-decoration", "weasyprint": "text-decoration", "webkit": "text-decoration" }, "text-decoration-color": { "blink": "text-decoration-color", "gecko": "text-decoration-color", "vivliostyle": "text-decoration-color", "webkit": "-webkit-text-decoration-color" }, "text-decoration-line": { "blink": "text-decoration-line", "gecko": "text-decoration-line", "vivliostyle": "text-decoration-line", "webkit": "-webkit-text-decoration-line" }, "text-decoration-style": { "blink": "text-decoration-style", "gecko": "text-decoration-style", "vivliostyle": "text-decoration-style", "webkit": "-webkit-text-decoration-style" }, "text-indent": { "blink": "text-indent", "gecko": "text-indent", "servo": "text-indent", "vivliostyle": "text-indent", "weasyprint": "text-indent", "webkit": "text-indent" }, "text-justify": { "blink": "text-justify", "servo": "text-justify", "vivliostyle": "text-justify", "webkit": "-webkit-text-justify" }, "text-overflow": { "blink": "text-overflow", "gecko": "text-overflow", "servo": "text-overflow", "vivliostyle": "text-overflow", "webkit": "text-overflow" }, "text-shadow": { "blink": "text-shadow", "gecko": "text-shadow", "servo": "text-shadow", "vivliostyle": "text-shadow", "webkit": "text-shadow" }, "text-transform": { "blink": "text-transform", "gecko": "text-transform", "servo": "text-transform", "vivliostyle": "text-transform", "weasyprint": "text-transform", "webkit": "text-transform" }, "text-underline-position": { "blink": "text-underline-position", "vivliostyle": "text-underline-position", "webkit": "-webkit-text-underline-position" }, "top": { "blink": "top", "gecko": "top", "servo": "top", "vivliostyle": "top", "weasyprint": "top", "webkit": "top" }, "touch-action": { "blink": "touch-action", "gecko": "touch-action", "vivliostyle": "touch-action", "webkit": "touch-action" }, "transform": { "blink": "transform", "gecko": "transform", "servo": "transform", "vivliostyle": "transform", "weasyprint": "transform", "webkit": "transform" }, "transform-origin": { "blink": "transform-origin", "gecko": "transform-origin", "servo": "transform-origin", "vivliostyle": "transform-origin", "weasyprint": "transform-origin", "webkit": "transform-origin" }, "transform-style": { "blink": "transform-style", "gecko": "transform-style", "servo": "transform-style", "webkit": "transform-style" }, "translate": { "blink": "translate" }, "rotate": { "blink": "rotate" }, "scale": { "blink": "scale" }, "transition-delay": { "blink": "transition-delay", "gecko": "transition-delay", "servo": "transition-delay", "webkit": "transition-delay" }, "transition-duration": { "blink": "transition-duration", "gecko": "transition-duration", "servo": "transition-duration", "webkit": "transition-duration" }, "transition-property": { "blink": "transition-property", "gecko": "transition-property", "servo": "transition-property", "webkit": "transition-property" }, "transition-timing-function": { "blink": "transition-timing-function", "gecko": "transition-timing-function", "servo": "transition-timing-function", "webkit": "transition-timing-function" }, "unicode-bidi": { "blink": "unicode-bidi", "gecko": "unicode-bidi", "servo": "unicode-bidi", "vivliostyle": "unicode-bidi", "weasyprint": "unicode-bidi", "webkit": "unicode-bidi" }, "vector-effect": { "blink": "vector-effect", "gecko": "vector-effect", "webkit": "vector-effect" }, "vertical-align": { "blink": "vertical-align", "gecko": "vertical-align", "servo": "vertical-align", "vivliostyle": "vertical-align", "weasyprint": "vertical-align", "webkit": "vertical-align" }, "visibility": { "blink": "visibility", "gecko": "visibility", "servo": "visibility", "vivliostyle": "visibility", "weasyprint": "visibility", "webkit": "visibility" }, "x": { "blink": "x", "webkit": "x" }, "y": { "blink": "y", "webkit": "y" }, "appearance": { "blink": "-webkit-appearance", "gecko": "-moz-appearance", "webkit": "-webkit-appearance" }, "app-region": { "blink": "-webkit-app-region" }, "background-composite": { "blink": "-webkit-background-composite", "webkit": "-webkit-background-composite" }, "border-horizontal-spacing": { "blink": "-webkit-border-horizontal-spacing", "webkit": "-webkit-border-horizontal-spacing" }, "border-image": { "blink": "border-image", "gecko": "border-image", "vivliostyle": "border-image", "webkit": "border-image" }, "border-vertical-spacing": { "blink": "-webkit-border-vertical-spacing", "webkit": "-webkit-border-vertical-spacing" }, "box-align": { "blink": "-webkit-box-align", "gecko": "-moz-box-align", "webkit": "-webkit-box-align" }, "box-decoration-break": { "blink": "-webkit-box-decoration-break", "gecko": "box-decoration-break", "vivliostyle": "box-decoration-break", "webkit": "-webkit-box-decoration-break" }, "box-direction": { "blink": "-webkit-box-direction", "gecko": "-moz-box-direction", "webkit": "-webkit-box-direction" }, "box-flex": { "blink": "-webkit-box-flex", "gecko": "-moz-box-flex", "webkit": "-webkit-box-flex" }, "box-flex-group": { "blink": "-webkit-box-flex-group", "webkit": "-webkit-box-flex-group" }, "box-lines": { "blink": "-webkit-box-lines", "webkit": "-webkit-box-lines" }, "box-ordinal-group": { "blink": "-webkit-box-ordinal-group", "gecko": "-moz-box-ordinal-group", "webkit": "-webkit-box-ordinal-group" }, "box-orient": { "blink": "-webkit-box-orient", "gecko": "-moz-box-orient", "webkit": "-webkit-box-orient" }, "box-pack": { "blink": "-webkit-box-pack", "gecko": "-moz-box-pack", "webkit": "-webkit-box-pack" }, "box-reflect": { "blink": "-webkit-box-reflect", "webkit": "-webkit-box-reflect" }, "column-break-after": { "blink": "-webkit-column-break-after", "webkit": "-webkit-column-break-after" }, "column-break-before": { "blink": "-webkit-column-break-before", "webkit": "-webkit-column-break-before" }, "column-break-inside": { "blink": "-webkit-column-break-inside", "webkit": "-webkit-column-break-inside" }, "column-count": { "blink": "-webkit-column-count", "gecko": "-moz-column-count", "servo": "column-count", "vivliostyle": "column-count", "webkit": "column-count" }, "column-gap": { "blink": "-webkit-column-gap", "gecko": "-moz-column-gap", "servo": "column-gap", "vivliostyle": "column-gap", "webkit": "column-gap" }, "column-rule-color": { "blink": "-webkit-column-rule-color", "gecko": "-moz-column-rule-color", "vivliostyle": "column-rule-color", "webkit": "column-rule-color" }, "column-rule-style": { "blink": "-webkit-column-rule-style", "gecko": "-moz-column-rule-style", "vivliostyle": "column-rule-style", "webkit": "column-rule-style" }, "column-rule-width": { "blink": "-webkit-column-rule-width", "gecko": "-moz-column-rule-width", "vivliostyle": "column-rule-width", "webkit": "column-rule-width" }, "column-span": { "blink": "-webkit-column-span", "vivliostyle": "column-span", "webkit": "column-span" }, "column-width": { "blink": "-webkit-column-width", "gecko": "-moz-column-width", "servo": "column-width", "vivliostyle": "column-width", "webkit": "column-width" }, "highlight": { "blink": "-webkit-highlight" }, "hyphenate-character": { "blink": "-webkit-hyphenate-character", "weasyprint": "hyphenate-character", "webkit": "-webkit-hyphenate-character" }, "line-break": { "blink": "-webkit-line-break", "vivliostyle": "line-break", "webkit": "-webkit-line-break" }, "line-clamp": { "blink": "-webkit-line-clamp", "webkit": "-webkit-line-clamp" }, "margin-after-collapse": { "blink": "-webkit-margin-after-collapse", "webkit": "-webkit-margin-after-collapse" }, "margin-before-collapse": { "blink": "-webkit-margin-before-collapse", "webkit": "-webkit-margin-before-collapse" }, "margin-bottom-collapse": { "blink": "-webkit-margin-bottom-collapse", "webkit": "-webkit-margin-bottom-collapse" }, "margin-top-collapse": { "blink": "-webkit-margin-top-collapse", "webkit": "-webkit-margin-top-collapse" }, "mask-box-image-outset": { "blink": "-webkit-mask-box-image-outset", "webkit": "-webkit-mask-box-image-outset" }, "mask-box-image-repeat": { "blink": "-webkit-mask-box-image-repeat", "webkit": "-webkit-mask-box-image-repeat" }, "mask-box-image-slice": { "blink": "-webkit-mask-box-image-slice", "webkit": "-webkit-mask-box-image-slice" }, "mask-box-image-source": { "blink": "-webkit-mask-box-image-source", "webkit": "-webkit-mask-box-image-source" }, "mask-box-image-width": { "blink": "-webkit-mask-box-image-width", "webkit": "-webkit-mask-box-image-width" }, "mask-clip": { "blink": "-webkit-mask-clip", "gecko": "mask-clip", "webkit": "-webkit-mask-clip" }, "mask-composite": { "blink": "-webkit-mask-composite", "gecko": "mask-composite", "webkit": "-webkit-mask-composite" }, "mask-image": { "blink": "-webkit-mask-image", "gecko": "mask-image", "webkit": "-webkit-mask-image" }, "mask-origin": { "blink": "-webkit-mask-origin", "gecko": "mask-origin", "webkit": "-webkit-mask-origin" }, "mask-position-x": { "blink": "-webkit-mask-position-x", "webkit": "-webkit-mask-position-x" }, "mask-position-y": { "blink": "-webkit-mask-position-y", "webkit": "-webkit-mask-position-y" }, "mask-repeat-x": { "blink": "-webkit-mask-repeat-x", "webkit": "-webkit-mask-repeat-x" }, "mask-repeat-y": { "blink": "-webkit-mask-repeat-y", "webkit": "-webkit-mask-repeat-y" }, "mask-size": { "blink": "-webkit-mask-size", "gecko": "mask-size", "webkit": "-webkit-mask-size" }, "perspective-origin-x": { "blink": "-webkit-perspective-origin-x", "webkit": "perspective-origin-x" }, "perspective-origin-y": { "blink": "-webkit-perspective-origin-y", "webkit": "perspective-origin-y" }, "print-color-adjust": { "blink": "-webkit-print-color-adjust", "webkit": "-webkit-print-color-adjust" }, "rtl-ordering": { "blink": "-webkit-rtl-ordering", "webkit": "-webkit-rtl-ordering" }, "ruby-position": { "blink": "-webkit-ruby-position", "gecko": "ruby-position", "vivliostyle": "ruby-position", "webkit": "-webkit-ruby-position" }, "tap-highlight-color": { "blink": "-webkit-tap-highlight-color", "webkit": "-webkit-tap-highlight-color" }, "text-combine": { "blink": "-epub-text-combine", "vivliostyle": "text-combine", "webkit": "-epub-text-combine" }, "text-emphasis-color": { "blink": "-epub-text-emphasis-color", "gecko": "text-emphasis-color", "vivliostyle": "text-emphasis-color", "webkit": "text-emphasis-color" }, "text-emphasis-position": { "blink": "-webkit-text-emphasis-position", "gecko": "text-emphasis-position", "vivliostyle": "text-emphasis-position", "webkit": "text-emphasis-position" }, "text-emphasis-style": { "blink": "-epub-text-emphasis-style", "gecko": "text-emphasis-style", "vivliostyle": "text-emphasis-style", "webkit": "text-emphasis-style" }, "text-fill-color": { "blink": "-webkit-text-fill-color", "gecko": "-webkit-text-fill-color", "webkit": "-webkit-text-fill-color" }, "text-security": { "blink": "-webkit-text-security", "webkit": "-webkit-text-security" }, "text-stroke-color": { "blink": "-webkit-text-stroke-color", "gecko": "-webkit-text-stroke-color", "webkit": "-webkit-text-stroke-color" }, "text-stroke-width": { "blink": "-webkit-text-stroke-width", "gecko": "-webkit-text-stroke-width", "webkit": "-webkit-text-stroke-width" }, "transform-origin-x": { "blink": "-webkit-transform-origin-x", "webkit": "transform-origin-x" }, "transform-origin-y": { "blink": "-webkit-transform-origin-y", "webkit": "transform-origin-y" }, "transform-origin-z": { "blink": "-webkit-transform-origin-z", "webkit": "transform-origin-z" }, "user-drag": { "blink": "-webkit-user-drag", "webkit": "-webkit-user-drag" }, "user-modify": { "blink": "-webkit-user-modify", "gecko": "-moz-user-modify", "webkit": "-webkit-user-modify" }, "user-select": { "blink": "-webkit-user-select", "gecko": "-moz-user-select", "webkit": "-webkit-user-select" }, "white-space": { "blink": "white-space", "gecko": "white-space", "servo": "white-space", "vivliostyle": "white-space", "weasyprint": "white-space", "webkit": "white-space" }, "widows": { "blink": "widows", "vivliostyle": "widows", "weasyprint": "widows", "webkit": "widows" }, "width": { "blink": "width", "gecko": "width", "servo": "width", "vivliostyle": "width", "weasyprint": "width", "webkit": "width" }, "will-change": { "blink": "will-change", "gecko": "will-change", "webkit": "will-change" }, "word-break": { "blink": "word-break", "gecko": "word-break", "servo": "word-break", "vivliostyle": "word-break", "webkit": "word-break" }, "word-spacing": { "blink": "word-spacing", "gecko": "word-spacing", "servo": "word-spacing", "vivliostyle": "word-spacing", "weasyprint": "word-spacing", "webkit": "word-spacing" }, "word-wrap": { "blink": "word-wrap", "gecko": "word-wrap", "servo": "word-wrap", "vivliostyle": "word-wrap", "webkit": "word-wrap" }, "z-index": { "blink": "z-index", "gecko": "z-index", "servo": "z-index", "vivliostyle": "z-index", "weasyprint": "z-index", "webkit": "z-index" }, "border-end-color": { "blink": "-webkit-border-end-color", "gecko": "-moz-border-end-color", "vivliostyle": "border-end-color", "webkit": "-webkit-border-end-color" }, "border-end-style": { "blink": "-webkit-border-end-style", "gecko": "-moz-border-end-style", "vivliostyle": "border-end-style", "webkit": "-webkit-border-end-style" }, "border-end-width": { "blink": "-webkit-border-end-width", "gecko": "-moz-border-end-width", "vivliostyle": "border-end-width", "webkit": "-webkit-border-end-width" }, "border-start-color": { "blink": "-webkit-border-start-color", "gecko": "-moz-border-start-color", "vivliostyle": "border-start-color", "webkit": "-webkit-border-start-color" }, "border-start-style": { "blink": "-webkit-border-start-style", "gecko": "-moz-border-start-style", "vivliostyle": "border-start-style", "webkit": "-webkit-border-start-style" }, "border-start-width": { "blink": "-webkit-border-start-width", "gecko": "-moz-border-start-width", "vivliostyle": "border-start-width", "webkit": "-webkit-border-start-width" }, "border-before-color": { "blink": "-webkit-border-before-color", "vivliostyle": "border-before-color", "webkit": "-webkit-border-before-color" }, "border-before-style": { "blink": "-webkit-border-before-style", "vivliostyle": "border-before-style", "webkit": "-webkit-border-before-style" }, "border-before-width": { "blink": "-webkit-border-before-width", "vivliostyle": "border-before-width", "webkit": "-webkit-border-before-width" }, "border-after-color": { "blink": "-webkit-border-after-color", "vivliostyle": "border-after-color", "webkit": "-webkit-border-after-color" }, "border-after-style": { "blink": "-webkit-border-after-style", "vivliostyle": "border-after-style", "webkit": "-webkit-border-after-style" }, "border-after-width": { "blink": "-webkit-border-after-width", "vivliostyle": "border-after-width", "webkit": "-webkit-border-after-width" }, "margin-end": { "blink": "-webkit-margin-end", "gecko": "-moz-margin-end", "vivliostyle": "margin-end", "webkit": "-webkit-margin-end" }, "margin-start": { "blink": "-webkit-margin-start", "gecko": "-moz-margin-start", "vivliostyle": "margin-start", "webkit": "-webkit-margin-start" }, "margin-before": { "blink": "-webkit-margin-before", "vivliostyle": "margin-before", "webkit": "-webkit-margin-before" }, "margin-after": { "blink": "-webkit-margin-after", "vivliostyle": "margin-after", "webkit": "-webkit-margin-after" }, "padding-end": { "blink": "-webkit-padding-end", "gecko": "-moz-padding-end", "webkit": "-webkit-padding-end" }, "padding-start": { "blink": "-webkit-padding-start", "gecko": "-moz-padding-start", "webkit": "-webkit-padding-start" }, "padding-before": { "blink": "-webkit-padding-before", "webkit": "-webkit-padding-before" }, "padding-after": { "blink": "-webkit-padding-after", "webkit": "-webkit-padding-after" }, "logical-width": { "blink": "-webkit-logical-width", "webkit": "-webkit-logical-width" }, "logical-height": { "blink": "-webkit-logical-height", "webkit": "-webkit-logical-height" }, "min-logical-width": { "blink": "-webkit-min-logical-width", "webkit": "-webkit-min-logical-width" }, "min-logical-height": { "blink": "-webkit-min-logical-height", "webkit": "-webkit-min-logical-height" }, "max-logical-width": { "blink": "-webkit-max-logical-width", "webkit": "-webkit-max-logical-width" }, "max-logical-height": { "blink": "-webkit-max-logical-height", "webkit": "-webkit-max-logical-height" }, "all": { "blink": "all", "gecko": "all", "webkit": "all" }, "max-zoom": { "blink": "max-zoom", "webkit": "max-zoom" }, "min-zoom": { "blink": "min-zoom", "webkit": "min-zoom" }, "orientation": { "blink": "orientation", "webkit": "orientation" }, "page": { "blink": "page", "vivliostyle": "page", "webkit": "page" }, "src": { "blink": "src", "gecko": "src", "vivliostyle": "src", "webkit": "src" }, "unicode-range": { "blink": "unicode-range", "gecko": "unicode-range", "webkit": "unicode-range" }, "user-zoom": { "blink": "user-zoom", "webkit": "user-zoom" }, "font-size-delta": { "blink": "-webkit-font-size-delta", "webkit": "-webkit-font-size-delta" }, "text-decorations-in-effect": { "blink": "-webkit-text-decorations-in-effect", "servo": "-servo-text-decorations-in-effect", "webkit": "-webkit-text-decorations-in-effect" }, "animation": { "blink": "animation", "gecko": "animation", "webkit": "animation" }, "background": { "blink": "background", "gecko": "background", "servo": "background", "vivliostyle": "background", "webkit": "background" }, "background-position": { "blink": "background-position", "gecko": "background-position", "servo": "background-position", "vivliostyle": "background-position", "weasyprint": "background-position", "webkit": "background-position" }, "background-repeat": { "blink": "background-repeat", "gecko": "background-repeat", "servo": "background-repeat", "vivliostyle": "background-repeat", "weasyprint": "background-repeat", "webkit": "background-repeat" }, "border": { "blink": "border", "gecko": "border", "servo": "border", "vivliostyle": "border", "webkit": "border" }, "border-bottom": { "blink": "border-bottom", "gecko": "border-bottom", "servo": "border-bottom", "vivliostyle": "border-bottom", "webkit": "border-bottom" }, "border-color": { "blink": "border-color", "gecko": "border-color", "servo": "border-color", "vivliostyle": "border-color", "webkit": "border-color" }, "border-left": { "blink": "border-left", "gecko": "border-left", "servo": "border-left", "vivliostyle": "border-left", "webkit": "border-left" }, "border-radius": { "blink": "border-radius", "gecko": "border-radius", "servo": "border-radius", "vivliostyle": "border-radius", "webkit": "border-radius" }, "border-right": { "blink": "border-right", "gecko": "border-right", "servo": "border-right", "vivliostyle": "border-right", "webkit": "border-right" }, "border-spacing": { "blink": "border-spacing", "gecko": "border-spacing", "servo": "border-spacing", "vivliostyle": "border-spacing", "weasyprint": "border-spacing", "webkit": "border-spacing" }, "border-style": { "blink": "border-style", "gecko": "border-style", "servo": "border-style", "vivliostyle": "border-style", "webkit": "border-style" }, "border-top": { "blink": "border-top", "gecko": "border-top", "servo": "border-top", "vivliostyle": "border-top", "webkit": "border-top" }, "border-width": { "blink": "border-width", "gecko": "border-width", "servo": "border-width", "vivliostyle": "border-width", "webkit": "border-width" }, "flex": { "blink": "flex", "gecko": "flex", "vivliostyle": "flex", "webkit": "flex" }, "flex-flow": { "blink": "flex-flow", "gecko": "flex-flow", "vivliostyle": "flex-flow", "webkit": "flex-flow" }, "font": { "blink": "font", "gecko": "font", "servo": "font", "vivliostyle": "font", "webkit": "font" }, "grid": { "blink": "grid", "gecko": "grid", "webkit": "-webkit-grid" }, "grid-area": { "blink": "grid-area", "gecko": "grid-area", "webkit": "-webkit-grid-area" }, "grid-column": { "blink": "grid-column", "gecko": "grid-column", "webkit": "-webkit-grid-column" }, "grid-row": { "blink": "grid-row", "gecko": "grid-row", "webkit": "-webkit-grid-row" }, "grid-template": { "blink": "grid-template", "gecko": "grid-template", "webkit": "-webkit-grid-template" }, "list-style": { "blink": "list-style", "gecko": "list-style", "servo": "list-style", "vivliostyle": "list-style", "webkit": "list-style" }, "margin": { "blink": "margin", "gecko": "margin", "servo": "margin", "vivliostyle": "margin", "webkit": "margin" }, "marker": { "blink": "marker", "gecko": "marker", "webkit": "marker" }, "motion": { "blink": "motion" }, "outline": { "blink": "outline", "gecko": "outline", "servo": "outline", "vivliostyle": "outline", "webkit": "outline" }, "overflow": { "blink": "overflow", "gecko": "overflow", "servo": "overflow", "vivliostyle": "overflow", "weasyprint": "overflow", "webkit": "overflow" }, "padding": { "blink": "padding", "gecko": "padding", "servo": "padding", "vivliostyle": "padding", "webkit": "padding" }, "transition": { "blink": "transition", "gecko": "transition", "servo": "transition", "webkit": "transition" }, "border-after": { "blink": "-webkit-border-after", "webkit": "-webkit-border-after" }, "border-before": { "blink": "-webkit-border-before", "webkit": "-webkit-border-before" }, "border-end": { "blink": "-webkit-border-end", "gecko": "-moz-border-end", "webkit": "-webkit-border-end" }, "border-start": { "blink": "-webkit-border-start", "gecko": "-moz-border-start", "webkit": "-webkit-border-start" }, "column-rule": { "blink": "-webkit-column-rule", "gecko": "-moz-column-rule", "vivliostyle": "column-rule", "webkit": "column-rule" }, "columns": { "blink": "-webkit-columns", "gecko": "-moz-columns", "servo": "columns", "vivliostyle": "columns", "webkit": "columns" }, "margin-collapse": { "blink": "-webkit-margin-collapse", "webkit": "-webkit-margin-collapse" }, "mask-box-image": { "blink": "-webkit-mask-box-image", "webkit": "-webkit-mask-box-image" }, "mask-position": { "blink": "-webkit-mask-position", "gecko": "mask-position", "webkit": "-webkit-mask-position" }, "mask-repeat": { "blink": "-webkit-mask-repeat", "gecko": "mask-repeat", "webkit": "-webkit-mask-repeat" }, "text-emphasis": { "blink": "-epub-text-emphasis", "gecko": "text-emphasis", "vivliostyle": "text-emphasis", "webkit": "text-emphasis" }, "text-stroke": { "blink": "-webkit-text-stroke", "gecko": "-webkit-text-stroke", "webkit": "-webkit-text-stroke" }, "binding": { "gecko": "-moz-binding" }, "block-size": { "gecko": "block-size" }, "border-block-end": { "gecko": "border-block-end" }, "border-block-end-color": { "gecko": "border-block-end-color" }, "border-block-end-style": { "gecko": "border-block-end-style" }, "border-block-end-width": { "gecko": "border-block-end-width" }, "border-block-start": { "gecko": "border-block-start" }, "border-block-start-color": { "gecko": "border-block-start-color" }, "border-block-start-style": { "gecko": "border-block-start-style" }, "border-block-start-width": { "gecko": "border-block-start-width" }, "border-bottom-colors": { "gecko": "-moz-border-bottom-colors" }, "border-inline-end": { "gecko": "border-inline-end" }, "border-inline-end-color": { "gecko": "border-inline-end-color" }, "border-inline-end-style": { "gecko": "border-inline-end-style" }, "border-inline-end-width": { "gecko": "border-inline-end-width" }, "border-inline-start": { "gecko": "border-inline-start" }, "border-inline-start-color": { "gecko": "border-inline-start-color" }, "border-inline-start-style": { "gecko": "border-inline-start-style" }, "border-inline-start-width": { "gecko": "border-inline-start-width" }, "border-left-colors": { "gecko": "-moz-border-left-colors" }, "border-right-colors": { "gecko": "-moz-border-right-colors" }, "border-top-colors": { "gecko": "-moz-border-top-colors" }, "color-adjust": { "gecko": "color-adjust" }, "contain": { "gecko": "contain" }, "control-character-visibility": { "gecko": "-moz-control-character-visibility" }, "float-edge": { "gecko": "-moz-float-edge" }, "font-language-override": { "gecko": "font-language-override" }, "font-synthesis": { "gecko": "font-synthesis", "webkit": "font-synthesis" }, "font-variant-alternates": { "gecko": "font-variant-alternates", "webkit": "font-variant-alternates" }, "font-variant-caps": { "gecko": "font-variant-caps", "webkit": "font-variant-caps" }, "font-variant-east-asian": { "gecko": "font-variant-east-asian", "vivliostyle": "font-variant-east-asian", "webkit": "font-variant-east-asian" }, "font-variant-numeric": { "gecko": "font-variant-numeric", "webkit": "font-variant-numeric" }, "font-variant-position": { "gecko": "font-variant-position", "webkit": "font-variant-position" }, "force-broken-image-icon": { "gecko": "-moz-force-broken-image-icon" }, "grid-column-gap": { "gecko": "grid-column-gap", "webkit": "-webkit-grid-column-gap" }, "grid-gap": { "gecko": "grid-gap", "webkit": "-webkit-grid-gap" }, "grid-row-gap": { "gecko": "grid-row-gap", "webkit": "-webkit-grid-row-gap" }, "hyphens": { "gecko": "hyphens", "vivliostyle": "hyphens", "weasyprint": "hyphens", "webkit": "-epub-hyphens" }, "image-region": { "gecko": "-moz-image-region" }, "ime-mode": { "gecko": "ime-mode" }, "inline-size": { "gecko": "inline-size" }, "lang": { "gecko": "-x-lang", "weasyprint": "lang" }, "margin-block-end": { "gecko": "margin-block-end" }, "margin-block-start": { "gecko": "margin-block-start" }, "margin-inline-end": { "gecko": "margin-inline-end" }, "margin-inline-start": { "gecko": "margin-inline-start" }, "marker-offset": { "gecko": "marker-offset" }, "mask-mode": { "gecko": "mask-mode" }, "math-display": { "gecko": "-moz-math-display" }, "math-variant": { "gecko": "-moz-math-variant" }, "max-block-size": { "gecko": "max-block-size" }, "max-inline-size": { "gecko": "max-inline-size" }, "min-block-size": { "gecko": "min-block-size" }, "min-font-size-ratio": { "gecko": "-moz-min-font-size-ratio" }, "min-inline-size": { "gecko": "min-inline-size" }, "offset-block-end": { "gecko": "offset-block-end" }, "offset-block-start": { "gecko": "offset-block-start" }, "offset-inline-end": { "gecko": "offset-inline-end" }, "offset-inline-start": { "gecko": "offset-inline-start" }, "orient": { "gecko": "-moz-orient" }, "osx-font-smoothing": { "gecko": "-moz-osx-font-smoothing" }, "outline-radius": { "gecko": "-moz-outline-radius" }, "outline-radius-bottomleft": { "gecko": "-moz-outline-radius-bottomleft" }, "outline-radius-bottomright": { "gecko": "-moz-outline-radius-bottomright" }, "outline-radius-topleft": { "gecko": "-moz-outline-radius-topleft" }, "outline-radius-topright": { "gecko": "-moz-outline-radius-topright" }, "overflow-clip-box": { "gecko": "overflow-clip-box" }, "padding-block-end": { "gecko": "padding-block-end" }, "padding-block-start": { "gecko": "padding-block-start" }, "padding-inline-end": { "gecko": "padding-inline-end" }, "padding-inline-start": { "gecko": "padding-inline-start" }, "ruby-align": { "gecko": "ruby-align", "vivliostyle": "ruby-align" }, "script-level": { "gecko": "-moz-script-level" }, "script-min-size": { "gecko": "-moz-script-min-size" }, "script-size-multiplier": { "gecko": "-moz-script-size-multiplier" }, "scroll-snap-type-x": { "gecko": "scroll-snap-type-x" }, "scroll-snap-type-y": { "gecko": "scroll-snap-type-y" }, "span": { "gecko": "-x-span" }, "stack-sizing": { "gecko": "-moz-stack-sizing" }, "system-font": { "gecko": "-x-system-font" }, "text-combine-upright": { "gecko": "text-combine-upright", "vivliostyle": "text-combine-upright" }, "text-size-adjust": { "gecko": "-moz-text-size-adjust", "vivliostyle": "text-size-adjust", "webkit": "-webkit-text-size-adjust" }, "text-zoom": { "gecko": "-x-text-zoom", "vivliostyle": "text-zoom", "webkit": "-webkit-text-zoom" }, "top-layer": { "gecko": "-moz-top-layer" }, "transform-box": { "gecko": "transform-box" }, "user-focus": { "gecko": "-moz-user-focus" }, "user-input": { "gecko": "-moz-user-input" }, "window-dragging": { "gecko": "-moz-window-dragging" }, "window-shadow": { "gecko": "-moz-window-shadow" }, "font-display": { "gecko": "font-display" }, "display-for-hypothetical-box": { "servo": "-servo-display-for-hypothetical-box" }, "azimuth": { "vivliostyle": "azimuth" }, "cue-after": { "vivliostyle": "cue-after" }, "cue-before": { "vivliostyle": "cue-before" }, "elevation": { "vivliostyle": "elevation" }, "pause-after": { "vivliostyle": "pause-after" }, "pause-before": { "vivliostyle": "pause-before" }, "pitch-range": { "vivliostyle": "pitch-range" }, "pitch": { "vivliostyle": "pitch" }, "play-during": { "vivliostyle": "play-during" }, "richness": { "vivliostyle": "richness" }, "speak-header": { "vivliostyle": "speak-header" }, "speak-numeral": { "vivliostyle": "speak-numeral" }, "speak-punctuation": { "vivliostyle": "speak-punctuation" }, "speech-rate": { "vivliostyle": "speech-rate" }, "stress": { "vivliostyle": "stress" }, "voice-family": { "vivliostyle": "voice-family" }, "volume": { "vivliostyle": "volume" }, "before": { "vivliostyle": "before" }, "after": { "vivliostyle": "after" }, "start": { "vivliostyle": "start" }, "end": { "vivliostyle": "end" }, "shape-inside": { "vivliostyle": "shape-inside" }, "wrap-flow": { "vivliostyle": "wrap-flow" }, "break-before": { "vivliostyle": "break-before", "webkit": "break-before" }, "break-after": { "vivliostyle": "break-after", "webkit": "break-after" }, "break-inside": { "vivliostyle": "break-inside", "webkit": "break-inside" }, "flow-from": { "vivliostyle": "flow-from", "webkit": "-webkit-flow-from" }, "flow-into": { "vivliostyle": "flow-into", "webkit": "-webkit-flow-into" }, "flow-linger": { "vivliostyle": "flow-linger" }, "flow-priority": { "vivliostyle": "flow-priority" }, "flow-options": { "vivliostyle": "flow-options" }, "min-page-width": { "vivliostyle": "min-page-width" }, "min-page-height": { "vivliostyle": "min-page-height" }, "required": { "vivliostyle": "required" }, "enabled": { "vivliostyle": "enabled" }, "conflicting-partitions": { "vivliostyle": "conflicting-partitions" }, "required-partitions": { "vivliostyle": "required-partitions" }, "snap-height": { "vivliostyle": "snap-height" }, "snap-width": { "vivliostyle": "snap-width" }, "flow-consume": { "vivliostyle": "flow-consume" }, "utilization": { "vivliostyle": "utilization" }, "template": { "vivliostyle": "template" }, "behavior": { "vivliostyle": "behavior" }, "bleed": { "vivliostyle": "bleed" }, "marks": { "vivliostyle": "marks" }, "float-reference": { "vivliostyle": "float-reference" }, "text-decoration-skip": { "vivliostyle": "text-decoration-skip", "webkit": "-webkit-text-decoration-skip" }, "text-combine-horizontal": { "vivliostyle": "text-combine-horizontal" }, "oeb-column-number": { "vivliostyle": "oeb-column-number" }, "pause": { "vivliostyle": "pause" }, "string-set": { "weasyprint": "string-set" }, "image-resolution": { "weasyprint": "image-resolution", "webkit": "image-resolution" }, "anchor": { "weasyprint": "anchor" }, "link": { "weasyprint": "link" }, "bookmark-label": { "weasyprint": "bookmark-label" }, "bookmark-level": { "weasyprint": "bookmark-level" }, "hyphenate-limit-chars": { "weasyprint": "hyphenate-limit-chars" }, "hyphenate-limit-zone": { "weasyprint": "hyphenate-limit-zone" }, "specified-display": { "weasyprint": "-weasy-specified-display" }, "color-profile": { "webkit": "color-profile" }, "cursor-visibility": { "webkit": "-webkit-cursor-visibility" }, "enable-background": { "webkit": "enable-background" }, "hanging-punctuation": { "webkit": "hanging-punctuation" }, "kerning": { "webkit": "kerning" }, "text-line-through": { "webkit": "text-line-through" }, "text-line-through-color": { "webkit": "text-line-through-color" }, "text-line-through-mode": { "webkit": "text-line-through-mode" }, "text-line-through-style": { "webkit": "text-line-through-style" }, "text-line-through-width": { "webkit": "text-line-through-width" }, "text-overline": { "webkit": "text-overline" }, "text-overline-color": { "webkit": "text-overline-color" }, "text-overline-mode": { "webkit": "text-overline-mode" }, "text-overline-style": { "webkit": "text-overline-style" }, "text-overline-width": { "webkit": "text-overline-width" }, "text-underline": { "webkit": "text-underline" }, "text-underline-color": { "webkit": "text-underline-color" }, "text-underline-mode": { "webkit": "text-underline-mode" }, "text-underline-style": { "webkit": "text-underline-style" }, "text-underline-width": { "webkit": "text-underline-width" }, "alt": { "webkit": "alt" }, "animation-trigger": { "webkit": "-webkit-animation-trigger" }, "aspect-ratio": { "webkit": "-webkit-aspect-ratio" }, "border-fit": { "webkit": "-webkit-border-fit" }, "column-axis": { "webkit": "-webkit-column-axis" }, "column-progression": { "webkit": "column-progression" }, "hyphenate-limit-after": { "webkit": "-webkit-hyphenate-limit-after" }, "hyphenate-limit-before": { "webkit": "-webkit-hyphenate-limit-before" }, "hyphenate-limit-lines": { "webkit": "-webkit-hyphenate-limit-lines" }, "initial-letter": { "webkit": "-webkit-initial-letter" }, "line-box-contain": { "webkit": "-webkit-line-box-contain" }, "line-align": { "webkit": "-webkit-line-align" }, "line-grid": { "webkit": "-webkit-line-grid" }, "line-snap": { "webkit": "-webkit-line-snap" }, "marquee": { "webkit": "-webkit-marquee" }, "marquee-direction": { "webkit": "-webkit-marquee-direction" }, "marquee-increment": { "webkit": "-webkit-marquee-increment" }, "marquee-repetition": { "webkit": "-webkit-marquee-repetition" }, "marquee-speed": { "webkit": "-webkit-marquee-speed" }, "marquee-style": { "webkit": "-webkit-marquee-style" }, "nbsp-mode": { "webkit": "-webkit-nbsp-mode" }, "svg-shadow": { "webkit": "-webkit-svg-shadow" }, "region-fragment": { "webkit": "-webkit-region-fragment" }, "region-break-after": { "webkit": "-webkit-region-break-after" }, "region-break-before": { "webkit": "-webkit-region-break-before" }, "region-break-inside": { "webkit": "-webkit-region-break-inside" }, "dashboard-region": { "webkit": "-webkit-dashboard-region" }, "overflow-scrolling": { "webkit": "-webkit-overflow-scrolling" }, "touch-callout": { "webkit": "-webkit-touch-callout" }, "trailing-word": { "webkit": "-apple-trailing-word" } } }; ================================================ FILE: modules/editorHelper.jsm ================================================ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is BlueGriffon. * * The Initial Developer of the Original Code is * Disruptive Innovations SARL. * Portions created by the Initial Developer are Copyright (C) 2006 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Daniel Glazman , Original author * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ var EXPORTED_SYMBOLS = ["EditorUtils"]; Components.utils.import("resource://gre/modules/Services.jsm"); Components.utils.import("resource://gre/modules/urlHelper.jsm"); //Components.utils.import("resource://gre/modules/cssHelper.jsm"); var EditorUtils = { nsIDOMNode: Components.interfaces.nsIDOMNode, mActiveViewActive: false, mAtomService: null, /********** PUBLIC **********/ getCurrentEditorWindow: function getCurrentEditorWindow() { try { var windowManager = Services.wm; return windowManager.getMostRecentWindow("bluegriffon") || windowManager.getMostRecentWindow("BlueGriffon:MacCmdLineFwd"); } catch(e){} return null; }, getCurrentTabEditor: function getCurrentTabEditor() { try { var tmpWindow = this.getCurrentEditorWindow(); if (tmpWindow) { var tabeditor = tmpWindow.document.getElementById("tabeditor"); if (tabeditor) return tabeditor; } } catch(e) { } return null; }, getCurrentEditorElement: function getCurrentEditorElement() { var tabeditor = this.getCurrentTabEditor(); if (tabeditor) return tabeditor.getCurrentEditorElement() ; return null; }, getCurrentViewMode: function getCurrentViewMode() { return this.getCurrentEditorElement().parentNode.getAttribute("currentmode") || "wysiwyg"; }, getLiveViewMode: function() { return this.getCurrentEditorElement().parentNode.getAttribute("liveviewmode") || "wysiwyg"; }, setLiveViewMode: function(mode) { return this.getCurrentEditorElement().parentNode.setAttribute("liveviewmode", mode); }, isWysiwygMode: function() { var mode = this.getCurrentViewMode(); return (mode == "wysiwyg") || (mode == "liveview" && this.getLiveViewMode() == "wysiwyg"); }, getCurrentSourceEditorElement: function() { var editorElement = this.getCurrentEditorElement(); if (editorElement) { return editorElement.parentNode.lastElementChild; } return null; }, getCurrentSourceWindow: function() { var editorElement = this.getCurrentEditorElement(); if (editorElement) { var bespinIframe = editorElement.parentNode.lastElementChild; var bespinWindow = bespinIframe.contentWindow.wrappedJSObject; return bespinWindow; } return null; }, getCurrentSourceEditor: function() { var editorElement = this.getCurrentEditorElement(); if (editorElement) { var bespinIframe = editorElement.parentNode.lastElementChild; var bespinEditor = bespinIframe.contentWindow.wrappedJSObject.gEditor; return bespinEditor; } return null; }, getCurrentEditor: function getCurrentEditor() { // Get the active editor from the tag var editor = null; try { var editorElement = this.getCurrentEditorElement(); if (editorElement) { editor = editorElement.getEditor(editorElement.contentWindow); // Do QIs now so editor users won't have to figure out which interface to use // Using "instanceof" does the QI for us. editor instanceof Components.interfaces.nsIEditor; editor instanceof Components.interfaces.nsIPlaintextEditor; editor instanceof Components.interfaces.nsIHTMLEditor; } } catch (e) { } return editor; }, getCurrentDocument: function getCurrentDocument() { // Get the active editor from the tag var editor = this.getCurrentEditor(); if (editor) return editor.document; return null; }, getCurrentCommandManager: function getCurrentCommandManager() { try { return this.getCurrentEditorElement().commandManager; } catch (e) { } return null; }, newCommandParams: function newCommandParams() { try { const contractId = "@mozilla.org/embedcomp/command-params;1"; const nsICommandParams = Components.interfaces.nsICommandParams; return Components.classes[contractId].createInstance(Components.interfaces.nsICommandParams); } catch(e) { } return null; }, getCurrentEditingSession: function getCurrentEditingSession() { try { return this.getCurrentEditorElement().editingSession; } catch (e) { } return null; }, getCurrentEditorType: function getCurrentEditorType() { try { return this.getCurrentEditorElement().editortype; } catch (e) { } return ""; }, isAlreadyEdited: function isAlreadyEdited(aURL) { Components.utils.import("resource://gre/modules/urlHelper.jsm"); // blank documents are never "already edited"... if (UrlUtils.isUrlOfBlankDocument(aURL)) return null; var url = UrlUtils.newURI(aURL).spec; var enumerator = Services.wm.getEnumerator( "bluegriffon" ); while ( enumerator.hasMoreElements() ) { var win = enumerator.getNext().QueryInterface(Components.interfaces.nsIDOMWindow); try { var mixed = win.gDialog.tabeditor.isAlreadyEdited(url); if (mixed) return {window: win, editor: mixed.editor, index: mixed.index}; } catch(e) {} } return null; }, isDocumentEditable: function isDocumentEditable() { try { return this.getCurrentEditor().isDocumentEditable; } catch (e) { } return false; }, isDocumentModified: function isDocumentModified() { try { if (this.isWysiwygMode()) { return this.getCurrentEditor().documentModified; } else if (this.getCurrentSourceWindow().GetModificationCount()) return true; } catch (e) { } return false; }, isDocumentEmpty: function isDocumentEmpty() { try { return this.getCurrentEditor().documentIsEmpty; } catch (e) { } return false; }, getDocumentTitle: function getDocumentTitle() { try { return this.getCurrentDocument().title; } catch (e) { } return ""; }, isHTMLEditor: function isHTMLEditor() { // We don't have an editorElement, just return false if (!this.getCurrentEditorElement()) return false; var editortype = this.getCurrentEditorType(); switch (editortype) { case "html": case "htmlmail": return true; case "text": case "textmail": return false default: break; } return false; }, isEditingRenderedHTML: function isEditingRenderedHTML() { return this.isHTMLEditor(); // && !this.isInHTMLSourceMode(); }, setDocumentTitle: function setDocumentTitle(title) { try { var doc = this.getCurrentDocument(); if (doc.title == title) // early way out if we can return; var titleNode = doc.querySelector("head > title"); var editor = this.getCurrentEditor(); var t = doc.createTextNode(title); if (titleNode) { var child = titleNode.firstChild; editor.insertNode(t, titleNode, 0); if (child) editor.deleteNode(child); } else { titleNode = doc.createElement("title"); titleNode.appendChild(t); editor.insertNode(titleNode, doc.querySelector("head"), 0); } var w = this.getCurrentEditorWindow(); // Update window title (doesn't work if called from a dialog) if ("UpdateWindowTitle" in w) w.UpdateWindowTitle(); else if ("UpdateWindowTitle" in w.opener) w.opener.UpdateWindowTitle(); } catch (e) { Services.prompt.alert(null, "EditorUtils.setDocumentTitle", e); } }, getSelectionContainer: function getSelectionContainer() { var editor = this.getCurrentEditor(); if (!editor) return null; var selection = null; try { selection = editor.selection; if (!selection) return null; } catch (e) { return null; } var result = { oneElementSelected:false }; if (selection.isCollapsed) { if (!selection.rangeCount) // weirdness... return null; result.node = selection.getRangeAt(0).startContainer; } else { var rangeCount = selection.rangeCount; if (rangeCount == 1) { result.node = editor.getSelectedElement(""); var range = selection.getRangeAt(0); // check for a weird case : when we select a piece of text inside // a text node and apply an inline style to it, the selection starts // at the end of the text node preceding the style and ends after the // last char of the style. Assume the style element is selected for // user's pleasure if (!result.node && range.startContainer.nodeType == this.nsIDOMNode.TEXT_NODE && range.startOffset == range.startContainer.length && range.endContainer.nodeType == this.nsIDOMNode.TEXT_NODE && range.endOffset == range.endContainer.length && range.endContainer.nextSibling == null && range.startContainer.nextSibling == range.endContainer.parentNode) result.node = range.endContainer.parentNode; if (!result.node) { // let's rely on the common ancestor of the selection result.node = range.commonAncestorContainer; } else { result.oneElementSelected = true; } } else { // assume table cells ! var i, container = null; for (i = 0; i < rangeCount; i++) { range = selection.getRangeAt(i); if (!container) { container = range.startContainer; } else if (container != range.startContainer) { // all table cells don't belong to same row so let's // select the parent of all rows result.node = container.parentNode; break; } result.node = container; } } } // make sure we have an element here while (result.node && result.node.parentNode && result.node.nodeType != this.nsIDOMNode.ELEMENT_NODE) result.node = result.node.parentNode; // and make sure the element is not a special editor node like // the
      we insert in blank lines // and don't select anonymous content !!! (fix for bug 190279) editor instanceof Components.interfaces.nsIHTMLEditor; while (result.node.hasAttribute("_moz_editor_bogus_node") || editor.isAnonymousElement(result.node)) result.node = result.node.parentNode; return result; }, getMetaElement: function getMetaElement(aName) { if (aName) { var name = aName.toLowerCase(); try { var metanodes = this.getCurrentDocument() .getElementsByTagName("meta"); for (var i = 0; i < metanodes.length; i++) { var metanode = metanodes.item(i); if (metanode && metanode.getAttribute("name") == name) return metanode; } } catch(e) {} } return null; }, createMetaElement: function createMetaElement(aName) { var editor = this.getCurrentEditor(); try { var metanode = editor.createElementWithDefaults("meta"); metanode.setAttribute("name", aName); return metanode; } catch(e) {} return null; }, insertMetaElement: function insertMetaElement(aElt, aContent, aInsertNew, aPrepend) { if (aElt) { var editor = this.getCurrentEditor(); try { if (!aContent) { if (!insertNew) editor.deleteNode(aElt); } else { if (aInsertNew) { aElt.setAttribute("content", aContent); if (aPrepend) this.prependHeadElement(aElt); else this.appendHeadElement(aElt); } else { editor.setAttribute(aElt, "content", aContent); } } } catch(e) {} } }, getHeadElement: function getHeadElement() { try { var doc = EditorUtils.getCurrentDocument(); var heads = doc.getElementsByTagName("head"); return heads.item(0); } catch(e) {} return null; }, prependHeadElement: function prependHeadElement(aElt) { var head = this.getHeadElement(); if (head) try { var editor = EditorUtils.getCurrentEditor(); editor.insertNode(aElt, head, 0, true); } catch(e) {} }, appendHeadElement: function appendHeadElement(aElt) { var head = this.getHeadElement(); if (head) { var pos = 0; if (head.hasChildNodes()) pos = head.childNodes.length; try { var editor = EditorUtils.getCurrentEditor(); editor.insertNode(aElt, head, pos, true); } catch(e) {} } }, getAtomService: function() { if (!this.mAtomService) this.mAtomService = Components.classes["@mozilla.org/atom-service;1"] .getService(Components.interfaces.nsIAtomService); return this.mAtomService; }, setTextProperty: function(property, attribute, value) { try { var propAtom = this.getAtomService().getAtom(property); this.getCurrentEditor().setInlineProperty(propAtom, attribute, value); } catch(e) {} }, getTextProperty: function(property, attribute, value, firstHas, anyHas, allHas) { try { var propAtom = this.getAtomService().getAtom(property); this.getCurrentEditor().getInlineProperty(propAtom, attribute, value, firstHas, anyHas, allHas); } catch(e) {} }, getBlockContainer: function(aElt) { var e = aElt; var display = e.ownerDocument.defaultView.getComputedStyle(e, "").getPropertyValue("display"); while (e && display == "inline" && e.className == "") { e = e.parentNode; display = e.ownerDocument.defaultView.getComputedStyle(e, "").getPropertyValue("display"); } return e; }, getCurrentTableEditor: function() { var editor = this.getCurrentEditor(); return (editor && (editor instanceof Components.interfaces.nsITableEditor)) ? editor : null; }, isStrictDTD: function() { var doctype = this.getCurrentEditor().document.doctype; return (doctype && doctype.publicId.lastIndexOf("Strict") != -1); }, isCSSDisabledAndStrictDTD: function() { var prefs = GetPrefs(); var IsCSSPrefChecked = prefs.getBoolPref("editor.use_css"); return !IsCSSPrefChecked && this.isStrictDTD(); }, getDocumentUrl: function() { try { var aDOMHTMLDoc = this.getCurrentEditor().document.QueryInterface(Components.interfaces.nsIDOMHTMLDocument); return aDOMHTMLDoc.location.toString(); } catch (e) {} return ""; }, isXHTMLDocument: function() { var mimetype = this.getCurrentDocumentMimeType(); return (mimetype == "application/xhtml+xml"); }, isPolyglotHtml5: function() { var doc = this.getCurrentDocument(); var doctype = doc.doctype; var systemId = doctype ? doc.doctype.systemId : null; var isXML = (doc.documentElement.getAttribute("xmlns") == "http://www.w3.org/1999/xhtml"); return (systemId == "" && isXML && !this.getCurrentDocument().hasXMLDeclaration); }, getCurrentDocumentMimeType: function() { var doc = this.getCurrentDocument(); var doctype = doc.doctype; var systemId = doctype ? doc.doctype.systemId : null; var isXML = false; switch (systemId) { case "http://www.w3.org/TR/html4/strict.dtd": // HTML 4 case "http://www.w3.org/TR/html4/loose.dtd": case "http://www.w3.org/TR/REC-html40/strict.dtd": case "http://www.w3.org/TR/REC-html40/loose.dtd": isXML = false; break; case "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd": // XHTML 1 case "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd": case "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd": isXML = true; break; case "": case "about:legacy-compat": isXML = (doc.documentElement.getAttribute("xmlns") == "http://www.w3.org/1999/xhtml"); break; case null: isXML = (doc.compatMode == "CSS1Compat"); break; default: break; // should never happen... } return (isXML ? "application/xhtml+xml" : "text/html"); }, getWrapColumn: function() { try { return this.getCurrentEditor().wrapWidth; } catch (e) {} return 0; }, setDocumentURI: function(uri) { try { // XXX WE'LL NEED TO GET "CURRENT" CONTENT FRAME ONCE MULTIPLE EDITORS ARE ALLOWED this.getCurrentEditorElement().docShell.setCurrentURI(uri); } catch (e) { } }, documentReloadListener: { NotifyDocumentCreated: function() {}, NotifyDocumentWillBeDestroyed: function() {}, NotifyDocumentStateChanged:function( isNowDirty ) { var editor = EditorUtils.getCurrentEditor(); try { // unregister the listener to prevent multiple callbacks editor.removeDocumentStateListener( EditorUtils.documentReloadListener ); var charset = editor.documentCharacterSet; // update the META charset with the current presentation charset editor.documentCharacterSet = charset; } catch (e) {} } }, setDocumentCharacterSet: function(aCharset) { try { var editor = this.getCurrentEditor(); var editorElement = this.getCurrentEditorElement(); editor.documentCharacterSet = aCharset; var docUrl = this.getDocumentUrl(); if( !UrlUtils.isUrlOfBlankDocument(docUrl)) { // reloading the document will reverse any changes to the META charset, // we need to put them back in, which is achieved by a dedicated listener editor.addDocumentStateListener( this.documentReloadListener ); EditorLoadUrl(editorElement, docUrl); } } catch (e) {} }, createAnonymousElement: function(tag, parentNode, anonClass, isCreatedHidden) { var a = EditorUtils.getCurrentEditor().createAnonymousElement(tag, parentNode ? parentNode : EditorUtils.getCurrentDocument().body, anonClass, isCreatedHidden); return a; }, deleteAnonymousElement: function(node, parent) { //var ps = EditorUtils. }, getObjectForProperties: function(aNodeNames, aRequiredAttribute) { var editor = this.getCurrentEditor(); if (!editor) return null; // Find nearest parent of selection anchor node // that is a link, list, table cell, or table var anchorNode var node; try { anchorNode = editor.selection.anchorNode; if (anchorNode.firstChild) { // Start at actual selected node var offset = editor.selection.anchorOffset; // Note: If collapsed, offset points to element AFTER caret, // thus node may be null node = anchorNode.childNodes.item(offset); } if (!node) node = anchorNode; } catch (e) {} while (node) { if (node.nodeName) { var nodeName = node.nodeName.toLowerCase(); // Done when we hit the body if (nodeName == "body") break; if (aNodeNames.indexOf(nodeName) != -1 && (!aRequiredAttribute || node.getAttribute(aRequiredAttribute))) return node; } node = node.parentNode; } return null; }, insertElementAroundSelection: function(element) { function nodeIsBreak(editor, node) { //return !node || node.localName == 'BR' || editor.nodeIsBlock(node); return true; } var editor = this.getCurrentEditor(); try { // First get the selection as a single range var range, start, end, offset; var count = editor.selection.rangeCount; if (count == 1) range = editor.selection.getRangeAt(0).cloneRange(); else { range = editor.document.createRange(); start = editor.selection.getRangeAt(0) range.setStart(start.startContainer, start.startOffset); end = editor.selection.getRangeAt(--count); range.setEnd(end.endContainer, end.endOffset); } // Flatten the selection to child nodes of the common ancestor while (range.startContainer != range.commonAncestorContainer) range.setStartBefore(range.startContainer); while (range.endContainer != range.commonAncestorContainer) range.setEndAfter(range.endContainer); if (editor.nodeIsBlock(element)) // Block element parent must be a valid block while (!(range.commonAncestorContainer.localName in IsBlockParent)) range.selectNode(range.commonAncestorContainer); else { // Fail if we're not inserting a block (use setInlineProperty instead) if (!nodeIsBreak(editor, range.commonAncestorContainer)) return false; else if (range.commonAncestorContainer.localName in NotAnInlineParent) // Inline element parent must not be an invalid block do range.selectNode(range.commonAncestorContainer); while (range.commonAncestorContainer.localName in NotAnInlineParent); else // Further insert block check for (var i = range.startOffset; ; i++) if (i == range.endOffset) return false; else if (nodeIsBreak(editor, range.commonAncestorContainer.childNodes[i])) break; } // The range may be contained by body text, which should all be selected. offset = range.startOffset; start = range.startContainer.childNodes[offset]; if (!nodeIsBreak(editor, start)) { while (!nodeIsBreak(editor, start.previousSibling)) { start = start.previousSibling; offset--; } } end = range.endContainer.childNodes[range.endOffset]; if (end && !nodeIsBreak(editor, end.previousSibling)) { while (!nodeIsBreak(editor, end)) end = end.nextSibling; } // Now insert the node editor.insertNode(element, range.commonAncestorContainer, offset, true); offset = element.childNodes.length; if (!editor.nodeIsBlock(element)) editor.setShouldTxnSetSelection(false); // Move all the old child nodes to the element var empty = true; while (start != end) { var next = start.nextSibling; editor.deleteNode(start); editor.insertNode(start, element, element.childNodes.length); empty = false; start = next; } if (!editor.nodeIsBlock(element)) editor.setShouldTxnSetSelection(true); else { // Also move a trailing
      if (start && start.localName == 'BR') { editor.deleteNode(start); editor.insertNode(start, element, element.childNodes.length); empty = false; } // Still nothing? Insert a
      so the node is not empty if (empty) editor.insertNode(editor.createElementWithDefaults("br"), element, element.childNodes.length); // Hack to set the selection just inside the element editor.insertNode(editor.document.createTextNode(""), element, offset); } } finally { } return true; }, getSerializationFlags: function(aDoc) { const nsIDE = Components.interfaces.nsIDocumentEncoder; var flags = nsIDE.OutputRaw; var autoIndentPref = Services.prefs.getBoolPref("bluegriffon.source.auto-indent"); if (autoIndentPref) { flags = nsIDE.OutputFormatted; } var forceNoWrap = false; if (Services.prefs.getBoolPref("bluegriffon.source.wrap.exclude-languages")) { var lang = ""; var root = aDoc.documentElement; // HTML 5 section 3.2.3.3 if (root.hasAttributeNS("http://www.w3.org/XML/1998/namespace", "lang")) { lang = root.getAttributeNS("http://www.w3.org/XML/1998/namespace", "lang"); } else if (root.hasAttributeNS(null, "lang")) { lang = root.getAttributeNS(null, "lang"); } // force wrapping off for the current document's language? var exclusionsPref = Services.prefs.getCharPref("bluegriffon.source.wrap.language-exclusions").trim(); if (exclusionsPref) { var langArray = lang.toLowerCase().split("-"); var exclusionsArray = exclusionsPref.split(","); for (var i = 0; i < exclusionsArray.length; i++) exclusionsArray[i] = exclusionsArray[i].toLowerCase().trim(); var l = ""; for (var i = 0; i < langArray.length && !forceNoWrap; i++) { l += langArray[i]; forceNoWrap = (exclusionsArray.indexOf(l) != -1); l += "-"; } } } var wrapPref = Services.prefs.getBoolPref("bluegriffon.source.wrap"); var maxColumnPref = 0; if (!forceNoWrap && wrapPref) { flags |= nsIDE.OutputWrap; maxColumnPref = Services.prefs.getIntPref("bluegriffon.source.wrap.maxColumn"); } var forceLF = false; try { forceLF = Services.prefs.getBoolPref("bluegriffon.defaults.forceLF"); } catch(e) {} if (forceLF) flags |= nsIDE.OutputLFLineBreak; else { var osString = Components.classes["@mozilla.org/xre/app-info;1"] .getService(Components.interfaces.nsIXULRuntime).OS; switch (osString) { case "WINNT": flags |= nsIDE.OutputLFLineBreak; flags |= nsIDE.OutputCRLineBreak; break; case "Darwin": flags |= nsIDE.OutputCRLineBreak; break; case "Linux": default: flags |= nsIDE.OutputLFLineBreak; break; } } var encodeEntity = Services.prefs.getCharPref("bluegriffon.source.entities"); switch (encodeEntity) { case "basic" : flags |= nsIDE.OutputEncodeBasicEntities; break; case "latin1" : flags |= nsIDE.OutputEncodeLatin1Entities; break; case "html" : flags |= nsIDE.OutputEncodeHTMLEntities; break; case "unicode": flags |= nsIDE.OutputEncodeCharacterEntities; break; default: break; } flags |= nsIDE.OutputDontRewriteEncodingDeclaration; return {value: flags, maxColumnPref: maxColumnPref}; }, cleanupBRs: function() { const kNF = Components.interfaces.nsIDOMNodeFilter; const kN = Components.interfaces.nsIDOMNode; function acceptNodeBR(node) { if (node.nodeType == kN.ELEMENT_NODE) { var tagName = node.nodeName.toLowerCase(); if (tagName == "br") { var parent = node.parentNode; while (parent && parent.ownerDocument.defaultView.getComputedStyle(parent, "").getPropertyValue("display") == "inline") { parent = parent.parentNode; } if (parent && parent.lastChild == node && parent.textContent) return kNF.FILTER_ACCEPT; } } return kNF.FILTER_SKIP; } var editor = this.getCurrentEditor(); editor.beginTransaction(); var theDocument = editor.document; var treeWalker = theDocument.createTreeWalker(theDocument.documentElement, kNF.SHOW_ELEMENT, acceptNodeBR, true); if (treeWalker) { var theNode = treeWalker.nextNode(), tmpNode; while (theNode) { var tagName = theNode.nodeName.toLowerCase(); if (tagName == "br") // sanity check { tmpNode = treeWalker.nextNode(); editor.deleteNode(theNode); theNode = tmpNode; } } } editor.endTransaction(); }, cleanup: function() { this.cleanupBRs(); }, get activeViewActive() { return this.mActiveViewActive; }, set activeViewActive(val) { this.mActiveViewActive = val; } }; ================================================ FILE: modules/fileChanges.jsm ================================================ Components.utils.import("resource://gre/modules/Services.jsm"); Components.utils.import("resource://gre/modules/urlHelper.jsm"); Components.utils.import("resource://gre/modules/prompterHelper.jsm"); Components.utils.import("resource://gre/modules/editorHelper.jsm"); Components.utils.import("resource://gre/modules/l10nHelper.jsm"); var EXPORTED_SYMBOLS = ["FileChangeUtils"]; var FileChangeUtils = { kCSSRule: Components.interfaces.nsIDOMCSSRule, mFileInfo: {}, mLinkedFiles: {}, lookForChanges: function() { this.mLinkedFiles = {}; var enumerator = Services.wm.getEnumerator( "bluegriffon" ); while ( enumerator.hasMoreElements() ) { var win = enumerator.getNext().QueryInterface(Components.interfaces.nsIDOMWindow); this.lookForChangesForWindow(win); } // at this point, we have all references external files inside mLinkedFiles var showAlert = true; try { showAlert = Services.prefs.getBoolPref("bluegriffon.files.alert-on-update"); } catch(e){} for (var i in this.mLinkedFiles) { if (this.mFileInfo[i]) { if (this.mLinkedFiles[i].lastMod > this.mFileInfo[i]) { //////////////////////// // this file was updated //////////////////////// var updateFiles = true; if (showAlert) { var rv = { value: false }; var titleWindow = L10NUtils.getString("AFileWasChanged"); var checkboxLabel = L10NUtils.getString("DontAskForFileChangesAgain"); var message = L10NUtils.getBundle() .formatStringFromName("ReloadFile", [i.substr(i.lastIndexOf("/") + 1)], 1); updateFiles = Services.prompt.confirmCheck(null, titleWindow, message, checkboxLabel, rv); showAlert = !rv.value; Services.prefs.setBoolPref("bluegriffon.files.alert-on-update", showAlert); } if (updateFiles) { for (var n = 0; n < this.mLinkedFiles[i].nodes.length; n++) { var node = this.mLinkedFiles[i].nodes[n]; if (node instanceof Components.interfaces.nsIDOMElement) { // it's an element node if (node.nodeName.toLowerCase() == "html") { // we need to reload the whole document! var docURI = node.ownerDocument.documentURI; var alreadyEdited = EditorUtils.isAlreadyEdited(docURI); var win = alreadyEdited.window; var editor = alreadyEdited.editor; var index = alreadyEdited.index; win.document.getElementById("tabeditor").selectedIndex = index; win.document.getElementById("tabeditor").mTabpanels.selectedPanel = editor.parentNode; // close the tab containing that document win.focus(); win.doCloseTab(EditorUtils.getCurrentTabEditor().selectedTab); // and reopen the file win.OpenFile(docURI, true); } else if (node.nodeName.toLowerCase() == "link") { var href = node.getAttribute("href"); node.setAttribute("href", ""); node.setAttribute("href", href); } else { // img, audio, video var srcAttr = node.getAttribute("src"); var src = node.src; try { // Remove the image URL from image cache so it loads fresh // (if we don't do this, loads after the first will always use image cache // and we won't see image edit changes or be able to get actual width and height) var IOService = UrlUtils.getIOService(); if (IOService) { if (UrlUtils.getScheme(src)) { var uri = IOService.newURI(src, null, null); if (uri) { var imgCache = Components.classes["@mozilla.org/image/tools;1"] .getService(Components.interfaces.imgITools) .getImgCacheForDocument(node.ownerDocument); // This returns error if image wasn't in the cache; ignore that imgCache.removeEntry(uri, node.ownerDocument); } } } } catch(e) { /* DO NOT SHOW ALERT */ } node.setAttribute("src", ""); node.setAttribute("src", srcAttr); } } else { // it's a style rule var parentStyleSheet = node.parentStyleSheet; while (!parentStyleSheet.ownerNode) { parentStyleSheet = parentStyleSheet.ownerRule.parentStyleSheet; } var node = parentStyleSheet.ownerNode; if (node.nodeName.toLowerCase() == "style") { var prose = node.textContent; node.textContent = ""; node.textContent = prose; } else { // link var href = node.getAttribute("href"); node.setAttribute("href", ""); node.setAttribute("href", href); } } } } } } } // update saved timestamps this.mFileInfo = {}; for (var i in this.mLinkedFiles) { this.mFileInfo[i] = this.mLinkedFiles[i].lastMod; } }, lookForChangesForWindow: function(aWindow) { if (!aWindow) // sanity check return; var tabeditor = aWindow.document.getElementById("tabeditor"); var decks = tabeditor.mTabpanels.childNodes; for (var i = 0; i < decks.length; i++) { this.lookForChangesForEditor(decks[i].firstChild); } }, _enumerateStyleSheet: function(aSheet, aCallback) { if (aCallback(aSheet)) return; var rules = aSheet.cssRules; for (var j = 0; j < rules.length; j++) { var rule = rules.item(j); switch (rule.type) { case FileChangeUtils.kCSSRule.IMPORT_RULE: this._enumerateStyleSheet(rule.styleSheet, aCallback); break; case FileChangeUtils.kCSSRule.MEDIA_RULE: this._enumerateStyleSheet(rule, aCallback); break; default: break; } } }, enumerateStyleSheets: function(aDocument, aCallback) { var stylesheetsList = aDocument.styleSheets; for (var i = 0; i < stylesheetsList.length; i++) { var sheet = stylesheetsList.item(i); this._enumerateStyleSheet(sheet, aCallback); } }, lookForChangesForEditor: function(aElt) { if (!aElt) // sanity check return; var innerEditor = aElt.getEditor(aElt.contentWindow); var doc = innerEditor.document; var docURI = doc.documentURI; if (docURI && docURI.substr(0, 7) == "file://") { this.addLinkedFile(docURI, doc.documentElement); } // first, find nodes with external references var nodes = doc.querySelectorAll("link[rel*='stylesheet'][href], img[src], audio[src], video[src]"); for (var i = 0; i < nodes.length; i++) { var node = nodes[i]; var src = ""; switch (node.nodeName.toLowerCase()) { case "link": src = node.href; break; case "audio": case "video": case "img": src = node.src; break; default: break; // should never happen } if (src && src.substr(0, 7) == "file://") { this.addLinkedFile(src, node); } } // now, let's deal with the complex case: imported stylesheets... var _self = this; function enumerateImportedSheets(aSheet) { var cssRules = aSheet.cssRules; for (var i = 0; i < cssRules.length; i++) { var rule = cssRules.item(i); if (rule.type == FileChangeUtils.kCSSRule.IMPORT_RULE) { var src = rule.styleSheet.href; if (src && src.substr(0, 7) == "file://") { _self.addLinkedFile(src, rule); } } } return false; } this.enumerateStyleSheets(doc, enumerateImportedSheets); }, addLinkedFile: function(aSrc, aNode) { if (aSrc in this.mLinkedFiles) { this.mLinkedFiles[aSrc].nodes.push(aNode); } else { var file = UrlUtils.newLocalFile(aSrc); var lastMod = 0; if (file && file.exists()) { lastMod = file.lastModifiedTime; } this.mLinkedFiles[aSrc] = { lastMod: lastMod, nodes: [aNode] }; } }, notifyFileModifiedByBlueGriffon: function(aSpec) { if (!aSpec) // early way out return; if (aSpec in this.mFileInfo) delete this.mFileInfo[aSpec]; } }; ================================================ FILE: modules/fileHelper.jsm ================================================ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is BlueGriffon. * * The Initial Developer of the Original Code is * Disruptive Innovations SARL. * Portions created by the Initial Developer are Copyright (C) 2008 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Daniel Glazman , Original author * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ Components.utils.import("resource://gre/modules/Services.jsm"); Components.utils.import("resource://gre/modules/urlHelper.jsm"); Components.utils.import("resource://gre/modules/prompterHelper.jsm"); Components.utils.import("resource://gre/modules/editorHelper.jsm"); Components.utils.import("resource://gre/modules/l10nHelper.jsm"); Components.utils.import("resource://gre/modules/handlersManager.jsm"); Components.utils.import("resource://gre/modules/fileChanges.jsm"); var EXPORTED_SYMBOLS = ["BGFileHelper"]; var BGFileHelper = { kLAST_FILE_LOCATION_PREFIX: "bluegriffon.lastFileLocation.", kErrorBindingAborted: 2152398850, kErrorBindingRedirected: 2152398851, kFileNotFound: 2152857618, nsIFilePicker:Components.interfaces.nsIFilePicker, nsIWebBrowserPersist: Components.interfaces.nsIWebBrowserPersist, nsIWebProgressListener: Components.interfaces.nsIWebProgressListener, mFilePickerDirectory: null, mShowDebugOutputStateChange: false, mPublishData: null, mProgressDialog: null, saveSourceDocument: function(aSource, aSaveAs, aSaveCopy, aMimeType) { var editor = EditorUtils.getCurrentEditor(); if (!aMimeType || aMimeType == "" || !editor) throw NS_ERROR_NOT_INITIALIZED; var editorDoc = editor.document; if (!editorDoc) throw NS_ERROR_NOT_INITIALIZED; // if we don't have the right editor type bail (we handle text and html) var editorType = EditorUtils.getCurrentEditorType(); if (editorType != "html") throw NS_ERROR_NOT_IMPLEMENTED; var converter = Components.classes['@mozilla.org/intl/scriptableunicodeconverter'] .getService(Components.interfaces.nsIScriptableUnicodeConverter); converter.charset = editor.documentCharacterSet; aSource = converter.ConvertFromUnicode(aSource); var urlstring = EditorUtils.getDocumentUrl(); var mustShowFileDialog = (aSaveAs || UrlUtils.isUrlOfBlankDocument(urlstring) || (urlstring == "")); // If editing a remote URL, force SaveAs dialog if (!mustShowFileDialog && UrlUtils.getScheme(urlstring) != "file") mustShowFileDialog = true; var replacing = !aSaveAs; var titleChanged = false; var doUpdateURI = false; var tempLocalFile = null; if (mustShowFileDialog) { try { var dialogResult = this.promptForSaveLocation(false, editorType, aMimeType, urlstring); if (dialogResult.filepickerClick == this.nsIFilePicker.returnCancel) return false; replacing = (dialogResult.filepickerClick == this.nsIFilePicker.returnReplace); urlstring = dialogResult.resultingURIString; tempLocalFile = dialogResult.resultingLocalFile; // update the new URL for the webshell unless we are saving a copy if (!aSaveCopy) doUpdateURI = true; } catch (e) { return false; } } // mustShowFileDialog var success = true; var ioService; try { // if somehow we didn't get a local file but we did get a uri, // attempt to create the localfile if it's a "file" url var docURI; if (!tempLocalFile) { ioService = UrlUtils.getIOService(); docURI = ioService.newURI(urlstring, editor.documentCharacterSet, null); if (docURI.schemeIs("file")) { var fileHandler = UrlUtils.getFileProtocolHandler(); tempLocalFile = fileHandler.getFileFromURLSpec(urlstring).QueryInterface(Components.interfaces.nsILocalFile); } } var destinationLocation; if (tempLocalFile) destinationLocation = tempLocalFile; else destinationLocation = docURI; this.backupFile(destinationLocation); // file is nsIFile, data is a string var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"]. createInstance(Components.interfaces.nsIFileOutputStream); // use 0x02 | 0x10 to open file for appending. foStream.init(destinationLocation, 0x02 | 0x08 | 0x20, 0x1b6, 0); // write, create, truncate // In a c file operation, we have no need to set file mode with or operation, // directly using "r" or "w" usually. foStream.write(aSource, aSource.length); foStream.close(); } catch (e) { success = false; } if (success) { FileChangeUtils.notifyFileModifiedByBlueGriffon(urlstring); try { if (doUpdateURI) { // If a local file, we must create a new uri from nsILocalFile if (tempLocalFile) docURI = UrlUtils.getFileProtocolHandler().newFileURI(tempLocalFile); // We need to set new document uri before notifying listeners EditorUtils.setDocumentURI(docURI); } // Update window title to show possibly different filename // This also covers problem that after undoing a title change, // window title loses the extra [filename] part that this adds var newTitle = EditorUtils.getCurrentEditorWindow().UpdateWindowTitle(); EditorUtils.getCurrentTabEditor().selectedTab.label = newTitle; if (!aSaveCopy) { editor.resetModificationCount(); EditorUtils.getCurrentSourceWindow().ResetModificationCount(); EditorUtils.getCurrentEditorWindow().BespinChangeCallback(); } // this should cause notification to listeners that document has changed // Set UI based on whether we're editing a remote or local url this.setSaveAndPublishUI(urlstring); } catch (e) {} } else { var saveDocStr = L10NUtils.getString("SaveDocument"); var failedStr = L10NUtils.getString("SaveFileFailed"); PromptUtils.alertWithTitle(saveDocStr, failedStr, EditorUtils.getCurrentEditorWindow()); } return success; }, // throws an error or returns true if user attempted save; false if user canceled save saveDocument: function(aSaveAs, aSaveCopy, aMimeType) { HandlersManager.hideAllHandlers(); var editor = EditorUtils.getCurrentEditor(); if (!aMimeType || aMimeType == "" || !editor) throw NS_ERROR_NOT_INITIALIZED; var editorDoc = editor.document; if (!editorDoc) throw NS_ERROR_NOT_INITIALIZED; // if we don't have the right editor type bail (we handle text and html) var editorType = EditorUtils.getCurrentEditorType(); if (editorType != "html") throw NS_ERROR_NOT_IMPLEMENTED; var urlstring = EditorUtils.getDocumentUrl(); var mustShowFileDialog = (aSaveAs || UrlUtils.isUrlOfBlankDocument(urlstring) || (urlstring == "")); // If editing a remote URL, force SaveAs dialog if (!mustShowFileDialog && UrlUtils.getScheme(urlstring) != "file") mustShowFileDialog = true; var replacing = !aSaveAs; var titleChanged = false; var doUpdateURI = false; var tempLocalFile = null; if (mustShowFileDialog) { try { // Prompt for title var userContinuing = this.promptAndSetTitleIfNone(); // not cancel if (!userContinuing) return false; var dialogResult = this.promptForSaveLocation(false, editorType, aMimeType, urlstring); if (dialogResult.filepickerClick == this.nsIFilePicker.returnCancel) return false; replacing = (dialogResult.filepickerClick == this.nsIFilePicker.returnReplace); urlstring = dialogResult.resultingURIString; tempLocalFile = dialogResult.resultingLocalFile; // update the new URL for the webshell unless we are saving a copy if (!aSaveCopy) doUpdateURI = true; } catch (e) { return false; } } // mustShowFileDialog var success = true; var ioService; try { // if somehow we didn't get a local file but we did get a uri, // attempt to create the localfile if it's a "file" url var docURI; if (!tempLocalFile) { ioService = UrlUtils.getIOService(); docURI = ioService.newURI(urlstring, editor.documentCharacterSet, null); if (docURI.schemeIs("file")) { var fileHandler = UrlUtils.getFileProtocolHandler(); tempLocalFile = fileHandler.getFileFromURLSpec(urlstring).QueryInterface(Components.interfaces.nsILocalFile); } } var destinationLocation; if (tempLocalFile) destinationLocation = tempLocalFile; else destinationLocation = docURI; this.backupFile(destinationLocation); var flags = EditorUtils.getSerializationFlags(EditorUtils.getCurrentDocument()); var doctype = editorDoc.doctype; var systemId = doctype ? doctype.systemId : null; var encoder = Components.classes["@mozilla.org/layout/documentEncoder;1?type=" + aMimeType] .createInstance(Components.interfaces.nsIDocumentEncoder); encoder.setCharset(editor.documentCharacterSet); encoder.init(editorDoc, aMimeType, flags.value); if (flags.value & Components.interfaces.nsIDocumentEncoder.OutputWrap) encoder.setWrapColumn(flags.maxColumnPref); // file is nsIFile, data is a string var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"]. createInstance(Components.interfaces.nsIFileOutputStream); // use 0x02 | 0x10 to open file for appending. foStream.init(destinationLocation, 0x02 | 0x08 | 0x20, 0x1b6, 0); encoder.encodeToStream(foStream); foStream.close(); // this closes foStream } catch (e) { success = false; } if (success) { try { FileChangeUtils.notifyFileModifiedByBlueGriffon(urlstring); if (doUpdateURI) { // If a local file, we must create a new uri from nsILocalFile if (tempLocalFile) docURI = UrlUtils.getFileProtocolHandler().newFileURI(tempLocalFile); // We need to set new document uri before notifying listeners EditorUtils.setDocumentURI(docURI); } // Update window title to show possibly different filename // This also covers problem that after undoing a title change, // window title loses the extra [filename] part that this adds var newTitle = EditorUtils.getCurrentEditorWindow().UpdateWindowTitle(); EditorUtils.getCurrentTabEditor().selectedTab.label = newTitle; if (!aSaveCopy) { editor.resetModificationCount(); EditorUtils.getCurrentSourceWindow().ResetModificationCount(); EditorUtils.getCurrentEditorWindow().BespinChangeCallback(); } // this should cause notification to listeners that document has changed // Set UI based on whether we're editing a remote or local url this.setSaveAndPublishUI(urlstring); } catch (e) {} } else { var saveDocStr = L10NUtils.getString("SaveDocument"); var failedStr = L10NUtils.getString("SaveFileFailed"); PromptUtils.alertWithTitle(saveDocStr, failedStr, EditorUtils.getCurrentEditorWindow()); } return success; }, backupFile: function(aFile) { var keepBackup = true; try { keepBackup = Services.prefs.getBoolPref("bluegriffon.defaults.backups"); } catch(e) {} try { // try to create a backup if (keepBackup && aFile && aFile.exists() && aFile.isWritable()) { var newLeafName = aFile.clone().leafName; var newLeafNameArray = newLeafName.split("."); if (newLeafNameArray[newLeafNameArray.length - 1] != "bak") newLeafNameArray.push("bak"); newLeafName = newLeafNameArray.join("."); aFile.copyTo(null, newLeafName); } } catch(e) {}; }, promptAndSetTitleIfNone: function() { if (EditorUtils.getDocumentTitle()) // we have a title; no need to prompt! return true; var result = {value:null}; var captionStr = L10NUtils.getString("DocumentTitle"); var msgStr = L10NUtils.getString("NeedDocTitle") + '\n' + L10NUtils.getString("DocTitleHelp"); var confirmed = PromptUtils.prompt(EditorUtils.getCurrentEditorWindow(), captionStr, msgStr, result, null, {value:0}); if (confirmed) EditorUtils.setDocumentTitle(result.value.trim()); return confirmed; }, promptForSaveLocation: function(aDoSaveAsText, aEditorType, aMIMEType, aDocumentURLString) { var dialogResult = {}; dialogResult.filepickerClick = this.nsIFilePicker.returnCancel; dialogResult.resultingURI = ""; dialogResult.resultingLocalFile = null; var fp = null; try { fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(this.nsIFilePicker); } catch (e) {} if (!fp) return dialogResult; // determine prompt string based on type of saving we'll do var promptString; if (aDoSaveAsText || aEditorType == "text") promptString = L10NUtils.getString("ExportToText"); else promptString = L10NUtils.getString("SaveDocumentAs"); promptString += " : " + EditorUtils.getDocumentTitle(); fp.init(EditorUtils.getCurrentEditorWindow(), promptString, this.nsIFilePicker.modeSave); // Set filters according to the type of output if (aDoSaveAsText) fp.appendFilters(this.nsIFilePicker.filterText); else if (EditorUtils.isXHTMLDocument()) { if (EditorUtils.isPolyglotHtml5()) { fp.appendFilters(this.nsIFilePicker.filterHTML); } else fp.appendFilter(L10NUtils.getString("XHTMLfiles"), "*.xhtml"); } else { aMIMEType = "text/html"; fp.appendFilters(this.nsIFilePicker.filterHTML); } fp.appendFilters(this.nsIFilePicker.filterAll); // now let's actually set the filepicker's suggested filename var suggestion = this.getSuggestedFileName(aDocumentURLString, aMIMEType); if (suggestion) { if (suggestion.filename) fp.defaultString = suggestion.filename; if (suggestion.extension) fp.defaultExtension = suggestion.extension; } // set the file picker's current directory // assuming we have information needed (like prior saved location) try { var ioService = UrlUtils.getIOService(); var fileHandler = UrlUtils.getFileProtocolHandler(); var isLocalFile = true; try { var docURI = ioService.newURI(aDocumentURLString, EditorUtils.getCurrentEditor().documentCharacterSet, null); isLocalFile = docURI.schemeIs("file"); } catch (e) {} var parentLocation = null; if (isLocalFile) { var fileLocation = fileHandler.getFileFromURLSpec(aDocumentURLString); // this asserts if url is not local parentLocation = fileLocation.parent; } if (parentLocation) { // Save current filepicker's default location this.mFilePickerDirectory = fp.displayDirectory; fp.displayDirectory = parentLocation; } else { // Initialize to the last-used directory for the particular type (saved in prefs) this.setFilePickerDirectory(fp, aEditorType); } } catch(e) {} dialogResult.filepickerClick = fp.show(); if (dialogResult.filepickerClick != this.nsIFilePicker.returnCancel) { // reset urlstring to new save location dialogResult.resultingURIString = fileHandler.getURLSpecFromFile(fp.file); dialogResult.resultingLocalFile = fp.file; this.saveFilePickerDirectory(fp, aEditorType); } else if (this.mFilePickerDirectory) fp.displayDirectory = this.mFilePickerDirectory; return dialogResult; }, getSuggestedFileName: function(aDocumentURLString, aMIMEType) { var extension = this.getExtensionBasedOnMimeType(aMIMEType); if (extension) extension = "." + extension; // check for existing file name we can use if (aDocumentURLString.length > 0 && !UrlUtils.isUrlOfBlankDocument(aDocumentURLString)) { var docURI = null; try { var ioService = UrlUtils.getIOService(); docURI = ioService.newURI(aDocumentURLString, EditorUtils.getCurrentEditor().documentCharacterSet, null); docURI = docURI.QueryInterface(Components.interfaces.nsIURL); // grab the file name if (docURI.fileExtension.toLowerCase() == "php") return { filename: decodeURI(docURI.fileName), extension: extension}; var url = docURI.fileBaseName; if (url) return { filename: decodeURI(url+extension), extension: extension}; } catch(e) {} } // check if there is a title we can use var title = EditorUtils.getDocumentTitle(); // generate a valid filename, if we can't just go with "untitled" return { filename: this.generateValidFilename(title, extension) || L10NUtils.getString("untitled") + extension, extension: extension }; }, setFilePickerDirectory: function(filePicker, fileType) { if (filePicker) { try { var prefBranch = GetPrefs(); if (prefBranch) { // Save current directory so we can reset it in SaveFilePickerDirectory this.mFilePickerDirectory = filePicker.displayDirectory; var location = prefBranch.getComplexValue(this.kLAST_FILE_LOCATION_PREFIX + fileType, Components.interfaces.nsILocalFile); if (location) filePicker.displayDirectory = location; } } catch(e) {} } }, saveFilePickerDirectory: function(filePicker, fileType) { if (filePicker && filePicker.file) { try { var prefBranch = GetPrefs(); var fileDir; if (filePicker.file.parent) fileDir = filePicker.file.parent.QueryInterface(Components.interfaces.nsILocalFile); if (prefBranch) prefBranch.setComplexValue(this.kLAST_FILE_LOCATION_PREFIX + fileType, Components.interfaces.nsILocalFile, fileDir); var prefsService = GetPrefsService(); prefsService.savePrefFile(null); } catch (e) {} } // Restore the directory used before SetFilePickerDirectory was called; // This reduces interference with Browser and other module directory defaults if (this.mFilePickerDirectory) filePicker.displayDirectory = this.mFilePickerDirectory; this.mFilePickerDirectory = null; }, getExtensionBasedOnMimeType: function(aMIMEType) { if (EditorUtils.isPolyglotHtml5()) { aMIMEType = "text/html"; } try { var preferred = Services.prefs.getCharPref( "bluegriffon.defaults.extension." + aMIMEType.replace( /\//g, "-")); if (preferred) return preferred; } catch (e) {} try { var mimeService = null; mimeService = Components.classes["@mozilla.org/mime;1"].getService(); mimeService = mimeService.QueryInterface(Components.interfaces.nsIMIMEService); var fileExtension = mimeService.getPrimaryExtension(aMIMEType, null); // the MIME service likes to give back ".htm" for text/html files, // so do a special-case fix here. if (fileExtension == "htm") fileExtension = "html"; return fileExtension; } catch (e) {} return ""; }, generateValidFilename: function(filename, extension) { if (filename) // we have a title; let's see if it's usable { // clean up the filename to make it usable and // then trim whitespace from beginning and end filename = this.validateFileName(filename).replace(/^\s+|\s+$/g, ""); if (filename.length > 0) return filename + extension; } return null; }, validateFileName: function(aFileName) { var re = /[\/]+/g; var n = EditorUtils.getCurrentEditorWindow().navigator; if (n.appVersion.indexOf("Windows") != -1) { re = /[\\\/\|]+/g; aFileName = aFileName.replace(/[\"]+/g, "'"); aFileName = aFileName.replace(/[\*\:\?]+/g, " "); aFileName = aFileName.replace(/[\<]+/g, "("); aFileName = aFileName.replace(/[\>]+/g, ")"); } else if (n.appVersion.indexOf("Macintosh") != -1) re = /[\:\/]+/g; return aFileName.replace(re, "_"); }, setSaveAndPublishUI: function(urlstring) { // Be sure enabled state of toolbar buttons are correct EditorUtils.getCurrentEditorWindow().goUpdateCommand("cmd_save"); EditorUtils.getCurrentEditorWindow().goUpdateCommand("cmd_publish"); } }; ================================================ FILE: modules/filePicker.jsm ================================================ Components.utils.import("resource://gre/modules/Services.jsm"); Components.utils.import("resource://gre/modules/editorHelper.jsm"); var EXPORTED_SYMBOLS = ["diFilePicker"]; function diFilePicker() { } diFilePicker.prototype = { kNS_FILEPICKER: Components.interfaces.nsIFilePicker, mWindow: null, mTitle: "", mMode: 0, init: function(aWindow, aTitle, aMode) { this.mWindow = aWindow; this.mTitle = aTitle; this.mMode = aMode; this.mFilters = []; this.mDefaultString = ""; }, appendFilter: function(aTitle, aFilter) { var filterArray = aFilter.split(";"); for (var i = 0; i < filterArray.length; i++) { var filter = filterArray[i].trim().replace( /\./g, "\\.").replace( /\*/g, "."); this.mFilters.push(filter); } }, appendFilters: function(aMask) { if (aMask & this.kNS_FILEPICKER.filterAll) this.appendFilter("", "*"); if (aMask & this.kNS_FILEPICKER.filterHTML) this.appendFilter("", "*.html; *.htm; *.shtml; *.xhtml"); if (aMask & this.kNS_FILEPICKER.filterText) this.appendFilter("", "*.txt; *.text"); if (aMask & this.kNS_FILEPICKER.filterImages) this.appendFilter("", "*.jpe; *.jpg; *.jpeg; *.gif; *.png; *.bmp; *.ico; *.svg; *.svgz; *.tif; *.tiff; *.ai; *.drw; *.pct; *.psp; *.xcf; *.psd; *.raw"); if (aMask & this.kNS_FILEPICKER.filterXML) this.appendFilter("", "*.xml"); if (aMask & this.kNS_FILEPICKER.filterAudio) this.appendFilter("", "*.aac; *.aif; *.flac; *.iff; *.m4a; *.m4b; *.mid; *.midi; *.mp3; *.mpa; *.mpc; *.oga; *.ogg; *.ra; *.ram; *.snd; *.wav; *.wma"); if (aMask & this.kNS_FILEPICKER.filterVideo) this.appendFilter("", "*.avi; *.divx; *.flv; *.m4v; *.mkv; *.mov; *.mp4; *.mpeg; *.mpg; *.ogm; *.ogg; *.ogv; *.ogx; *.rm; *.rmvb; *.smil; *.webm; *.wmv; *.xvid"); }, show: function() { var rv = {value: this.kNS_FILEPICKER.returnCancel }; this.mWindow.openDialog("chrome://epub/content/epub/filepicker.xul", "_blank", "chrome,all,dialog=no,modal=yes,resizable=yes", rv, this.mTitle, this.mMode, this.mFilters, this.mDefaultString); this.file = rv.file; this.fileURL = rv.fileURL; return rv.value; }, addFileToEbook: function(aFile) { var w = EditorUtils.getCurrentEditorWindow(); var epubElt = w.document.querySelector("epub2,epub3,epub31"); if (!epubElt) return; var ebook = epubElt.getUserData("ebook"); if (!ebook) return; ebook.addFileToEbook(aFile, epubElt); }, get defaultString() { return this.mDefaultString; }, set defaultString(aVal) { this.mDefaultString = aVal; } }; ================================================ FILE: modules/fireFtp.jsm ================================================ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is FireFTP. * * Contributor(s): * Mime Cuvalo * * Alternatively, the contents of this file may be used under the terms of * either of the GNU General Public License Version 2 or later (the "GPL"), * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ Components.utils.import("resource://gre/modules/urlHelper.jsm"); Components.utils.import("resource://gre/modules/Services.jsm"); var EXPORTED_SYMBOLS = ["ftpMozilla", "ftpDataSocketMozilla"]; function setTimeout(func, delay) { var timer = Components.classes["@mozilla.org/timer;1"] .createInstance(Components.interfaces.nsITimer); timer.initWithCallback(func, delay, Components.interfaces.nsITimer.TYPE_ONE_SHOT); } function ftpMozilla(observer) { this.transportService = Components.classes["@mozilla.org/network/socket-transport-service;1"].getService(Components.interfaces.nsISocketTransportService); this.proxyService = Components.classes["@mozilla.org/network/protocol-proxy-service;1"].getService (Components.interfaces.nsIProtocolProxyService); this.cacheService = Components.classes["@mozilla.org/network/cache-service;1"].getService (Components.interfaces.nsICacheService); this.toUTF8 = Components.classes["@mozilla.org/intl/utf8converterservice;1"].getService (Components.interfaces.nsIUTF8ConverterService); this.fromUTF8 = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].getService (Components.interfaces.nsIScriptableUnicodeConverter); this.observer = observer; this.eventQueue = new Array(); // commands to be sent this.trashQueue = new Array(); // once commands are read, throw them away here b/c we might have to recycle these if there is an error this.listData = new Array(); // holds data directory data from the LIST command var self = this; var func = function() { self.keepAlive(); }; setTimeout(func, 60000); } ftpMozilla.prototype = { // begin: variables you can set host : "", port : 21, security : "", login : "", password : "", passiveMode : true, initialPath : "", // path we go to first onload encoding : "UTF-8", type : '', // what type of FTP connection is this? '' = standard, 'fxp' = FXP, 'transfer' = just for transfers connNo : 1, // connection # fxpHost : null, // the host of an FXP connection timezone : 0, // timezone offset privateKey : "", // private key for sftp connections asciiFiles : new Array(), // set to the list of extensions we treat as ASCII files when transfering fileMode : 0, // 0 == auto, 1 == binary, 2 == ASCII hiddenMode : false, // show hidden files if true ipType : "IPv4", // right now, either IPv4 or IPv6 keepAliveMode : true, // keep the connection alive with NOOP's networkTimeout : 30, // how many seconds b/f we consider the connection to be stale and dead proxyHost : "", proxyPort : 0, proxyType : "", activePortMode : false, // in active mode, if you want to specify a range of ports activeLow : 1, // low port activeHigh : 65535, // high port reconnectAttempts : 40, // how many times we should try reconnecting reconnectInterval : 10, // number of seconds in b/w reconnect attempts reconnectMode : true, // true if we want to attempt reconnecting sessionsMode : true, // true if we're caching directory data timestampsMode : false, // true if we try to keep timestamps in sync useCompression : true, // true if we try to do compression integrityMode : true, // true if we try to do integrity checks errorConnectStr : "Unable to make a connection. Please try again.", // set to error msg that you'd like to show for a connection error errorXCheckFail : "The transfer of this file was unsuccessful and resulted in a corrupted file. It is recommended to restart this transfer.", // an integrity check failure passNotShown : "(password not shown)", // set to text you'd like to show in place of password l10nMonths : new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"), // used in display localized months // end: variables you can set // variables used internally isConnected : false, // are we connected? isReady : false, // are we busy writing/reading the control socket? isReconnecting : false, // are we attempting a reconnect? legitClose : true, // are we the ones initiating the close or is it a network error reconnectsLeft : 0, // how many times more to try reconnecting networkTimeoutID : 0, // a counter increasing with each read and write transferID : 0, // a counter increasing with each transfer queueID : 0, // another counter increasing with each transfer controlTransport : null, controlInstream : null, controlOutstream : null, pipeTransport : null, // SFTP stuff ipcBuffer : null, isKilling : false, readPoller : 0, doingCmdBatch : false, dataSocket : null, activeCurrentPort : -1, // if user specified a range of ports, this is the current port we're using featMLSD : false, // is the MLSD command available? featMDTM : false, // is the MDTM command available? featXMD5 : false, // is the XMD5 command available? featXSHA1 : false, // is the XSHA1 command available? featXCheck : null, // are the XMD5 or XSHA1 commands available; if so, which one to use? featModeZ : false, // is the MODE Z command available? welcomeMessage : "", // hello world fullBuffer : "", // full response of control socket connectedHost : "", // name of the host we connect to plus username localRefreshLater : '', remoteRefreshLater : '', waitToRefresh : false, transferMode : "", // either "A" or "I" securityMode : "", // either "P" or "C" or "" compressMode : "S", // either "S" or "Z" currentWorkingDir : "", // directory that we're currently, uh, working with version : "1.0.7", // version of this class - used to avoid collisions in cache remoteMonths : "Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec", // used in parsing months from list data setSecurity : function(type) { ftpMozilla.prototype.security = type; if (type == "sftp") { for (func in this.sftp) { eval("ftpMozilla.prototype." + func + " = ftpMozilla.prototype.sftp." + func); } } else { for (func in this.ftp) { eval("ftpMozilla.prototype." + func + " = ftpMozilla.prototype.ftp." + func); } } }, onDisconnect : function(sslException) { if (!this.isConnected) { // no route to host if (!sslException && this.observer) { this.observer.onAppendLog(this.errorConnectStr, 'error', "error"); } } this.isConnected = false; if (this.dataSocket) { this.dataSocket.kill(); this.dataSocket = null; } if (this.observer) { this.observer.onDisconnected(!this.legitClose && this.reconnectMode && this.reconnectsLeft > 0); this.observer.onIsReadyChange(true); } if (!this.legitClose && this.reconnectMode) { // try reconnecting this.transferMode = ""; this.securityMode = ""; this.compressMode = "S"; if (this.reconnectsLeft < 1) { this.isReconnecting = false; if (this.eventQueue.length && this.eventQueue[0].cmd == "welcome") { this.eventQueue.shift(); } } else { this.isReconnecting = true; if (this.observer) { this.observer.onReconnecting(); } var self = this; var func = function() { self.reconnect(); }; setTimeout(func, this.reconnectInterval * 1000); } } else { this.legitClose = true; this.cleanup(); } if (this.security == "sftp") { this.kill(); } }, disconnect : function() { this.legitClose = true; // this close() is ok, don't try to reconnect this.cleanup(); if (!(!this.isConnected && this.eventQueue.length && this.eventQueue[0].cmd == "welcome")) { try { this.controlOutstream.write((this.security == "sftp" ? "quit" : "QUIT") + "\r\n", 6); if (this.observer) { this.observer.onAppendLog("" + (this.security == "sftp" ? "quit" : "QUIT"), 'output', "info"); } } catch(ex) { } } if (this.dataSocket) { this.dataSocket.kill(); this.dataSocket = null; } this.kill(); if (this.security == "sftp") { this.onDisconnect(); } }, reconnect : function() { // ahhhh! our precious connection has been lost, if (!this.isReconnecting) { // must...get it...back...our...precious return; } --this.reconnectsLeft; this.connect(true); }, abort : function(forceKill) { this.isReconnecting = false; if (this.dataSocket) { this.dataSocket.progressEventSink.bytesTotal = 0; // stop uploads this.dataSocket.dataListener.bytesTotal = 0; // stop downloads } this.cleanup(true); if (!this.isConnected) { return; } if (forceKill && this.security != "sftp") { try { this.controlOutstream.write("ABOR\r\n", 6); } catch(ex) { } } //XXX this.writeControl("ABOR"); // ABOR does not seem to stop the connection in most cases if (this.dataSocket) { // so this is a more direct approach this.dataSocket.kill(); this.dataSocket = null; } else { this.isReady = true; } this.addEventQueue("aborted"); if (this.observer) { this.observer.onAbort(); } }, cancel : function(forceKill) { // cancel current transfer if (this.security == "sftp") { // can't currently do this with sftp return; } if (this.dataSocket) { this.dataSocket.progressEventSink.bytesTotal = 0; // stop uploads this.dataSocket.dataListener.bytesTotal = 0; // stop downloads } this.trashQueue = new Array(); if (forceKill && this.security != "sftp") { try { if (this.isConnected) { this.controlOutstream.write("ABOR\r\n", 6); } } catch(ex) { } } //XXX this.writeControl("ABOR"); // ABOR does not seem to stop the connection in most cases var dId; if (this.dataSocket && this.isConnected) { // so this is a more direct approach this.dataSocket.kill(); dId = this.dataSocket.id; this.dataSocket = null; } for (var x = 0; x < this.eventQueue.length; ++x) { if (this.eventQueue[x].cmd == "transferEnd" && dId == this.eventQueue[x].callback.id) { this.eventQueue.splice(0, x + 1); break; } } if (this.isConnected) { this.unshiftEventQueue("aborted"); } }, checkTimeout : function(id, cmd) { if (this.isConnected && this.networkTimeoutID == id && this.eventQueue.length && this.eventQueue[0].cmd.indexOf(cmd) != -1) { this.resetConnection(); } }, resetConnection : function() { this.legitClose = false; // still stuck on a command so, try to restart the connection the hard way try { this.controlOutstream.write((this.security == "sftp" ? "quit" : "QUIT") + "\r\n", 6); if (this.observer) { this.observer.onAppendLog("" + (this.security == "sftp" ? "quit" : "QUIT"), 'output', "info"); } } catch(ex) { } if (this.dataSocket) { this.dataSocket.kill(); this.dataSocket = null; } this.kill(); if (this.security == "sftp") { this.isConnected = false; } }, cleanup : function(isAbort) { this.eventQueue = new Array(); this.trashQueue = new Array(); this.transferMode = ""; this.securityMode = ""; this.compressMode = "S"; this.currentWorkingDir = ""; this.localRefreshLater = ""; this.remoteRefreshLater = ""; this.waitToRefresh = false; this.fxpHost = null; this.isReady = false; if (!isAbort) { this.featMLSD = false; this.featMDTM = false; this.featXMD5 = false; this.featXSHA1 = false; this.featXCheck = null; this.featModeZ = false; } ++this.networkTimeoutID; ++this.transferID; }, kill : function() { try { this.controlInstream.close(); } catch(ex) { if (this.observer && this.security != "sftp") { this.observer.onDebug(ex); } } try { this.controlOutstream.close(); } catch(ex) { if (this.observer) { this.observer.onDebug(ex); } } if (this.security == "sftp") { this.sftpKill(); } }, sftpKill : function() { this.isKilling = true; this.eventQueue = []; clearInterval(this.readPoller); try { this.pipeTransport.cancel(-1); } catch(ex) { } try { this.ipcBuffer.shutdown(); } catch(ex) { } try { this.pipeTransport.closeStdin(); } catch(ex) { } try { if (this.getPlatform() == "windows") { var killPath; var firefoxInstallPath = Components.classes["@mozilla.org/file/directory_service;1"].createInstance(Components.interfaces.nsIProperties) .get("CurProcD", Components.interfaces.nsILocalFile); killPath = firefoxInstallPath.path.substring(0, 2) + "/windows/system32/taskkill.exe /IM psftp.exe"; this.ipcService.exec(killPath); } else { var killPath = "/usr/bin/killall -9 psftp"; this.ipcService.exec(killPath); } } catch (ex) { } try { this.pipeTransport.join(); } catch(ex) { } try { this.pipeTransport.terminate(); } catch(ex) { } this.isKilling = false; }, addEventQueue : function(cmd, parameter, callback, callback2) { // this just creates a new queue item this.eventQueue.push( { cmd: cmd, parameter: parameter || '', callback: callback || '', callback2: callback2 || '' }); }, unshiftEventQueue : function(cmd, parameter, callback, callback2) { // ditto this.eventQueue.unshift({ cmd: cmd, parameter: parameter || '', callback: callback || '', callback2: callback2 || '' }); }, beginCmdBatch : function() { this.doingCmdBatch = true; }, writeControlWrapper : function() { if (!this.doingCmdBatch) { this.writeControl(); } }, endCmdBatch : function() { this.doingCmdBatch = false; this.writeControl(); }, writeControl : function(cmd) { try { if (!this.isReady || (!cmd && !this.eventQueue.length)) { return; } var parameter; var callback; var callback2; if (!cmd) { cmd = this.eventQueue[0].cmd; parameter = this.eventQueue[0].parameter; callback = this.eventQueue[0].callback; callback2 = this.eventQueue[0].callback2; } if (cmd == "sftpcache") { cmd = parameter; parameter = ""; callback = "sftpcache"; } if (cmd == "custom") { cmd = parameter; parameter = ""; } while (cmd == "aborted" || cmd == "goodbye" // these are sort of dummy values || cmd == "transferBegin" || cmd == "transferEnd" || (cmd == "TYPE" && this.transferMode == parameter) // or if we ignore TYPE if it's unnecessary || (cmd == "PROT" && this.securityMode == parameter) // or if we ignore PROT if it's unnecessary || (cmd == "MODE" && this.compressMode == parameter) // or if we ignore MODE if it's unnecessary || (cmd == "CWD" && this.currentWorkingDir == parameter // or if we ignore CWD if it's unnecessary && this.type != 'transfer') || (cmd == "cd" && this.currentWorkingDir == parameter)) { if ((cmd == "TYPE" && this.transferMode == parameter) || (cmd == "PROT" && this.securityMode == parameter) || (cmd == "MODE" && this.compressMode == parameter) || (cmd == "CWD" && this.currentWorkingDir == parameter) || (cmd == "cd" && this.currentWorkingDir == parameter)) { this.trashQueue.push(this.eventQueue[0]); } this.eventQueue.shift(); if (this.eventQueue.length) { cmd = this.eventQueue[0].cmd; parameter = this.eventQueue[0].parameter; callback = this.eventQueue[0].callback; callback2 = this.eventQueue[0].callback2; } else { return; } } this.isReady = false; if (this.observer) { this.observer.onIsReadyChange(false); } if (!this.passiveMode && cmd == "PASV") { // active mode cmd = this.ipType == "IPv4" ? "PORT" : "EPRT"; var security = this.security && this.securityMode == "P"; var proxy = { proxyType: this.proxyType, proxyHost: this.proxyHost, proxyPort: this.proxyPort }; var currentPort = this.activeCurrentPort == -1 ? this.activeLow : this.activeCurrentPort + 2; if (currentPort < this.activeLow || currentPort > this.activeHigh) { currentPort = this.activeLow; } this.activeCurrentPort = currentPort; var qId; for (var x = 0; x < this.eventQueue.length; ++x) { if (this.eventQueue[x].cmd == "transferEnd") { qId = this.eventQueue[x].callback.id; break; } } this.dataSocket = new ftpDataSocketMozilla(this.host, this.port, security, proxy, "", this.activePortMode ? currentPort : -1, this.compressMode == "Z", qId, this.observer, this.getCert(), this.fileMode == 2); var activeInfo = {}; activeInfo.cmd = this.eventQueue[1].cmd; activeInfo.ipType = this.ipType; if (this.eventQueue[1].cmd == "RETR") { activeInfo.localPath = this.eventQueue[1].callback; activeInfo.totalBytes = callback; } else if (this.eventQueue[1].cmd == "REST") { activeInfo.localPath = this.eventQueue[2].callback; activeInfo.totalBytes = callback; activeInfo.partialBytes = this.eventQueue[1].parameter; } else if (this.eventQueue[1].cmd == "STOR") { activeInfo.localPath = this.eventQueue[1].callback; } else if (this.eventQueue[1].cmd == "APPE") { activeInfo.localPath = this.eventQueue[1].callback.localPath; activeInfo.partialBytes = this.eventQueue[1].callback.remoteSize; } parameter = this.dataSocket.createServerSocket(activeInfo); } if (cmd == "PASV" && this.passiveMode && this.ipType != "IPv4") { cmd = "EPSV"; } if (cmd == "LIST") { // don't include path in list command - breaks too many things parameter = this.hiddenMode && !this.featMLSD ? "-al" : ""; if (this.featMLSD) { cmd = "MLSD"; } } if (cmd == "ls") { parameter = ""; } if (this.security == "sftp" && parameter && cmd != "chmod" && cmd != "mv" && cmd != "get" && cmd != "reget" && cmd != "put" && cmd != "reput") { parameter = '"' + this.escapeSftp(parameter) + '"'; } var outputData = cmd + (parameter ? (' ' + parameter) : '') + "\r\n"; // le original bug fix! - thanks to devin try { outputData = this.fromUTF8.ConvertFromUnicode(outputData) + this.fromUTF8.Finish(); } catch (ex) { if (this.observer) { this.observer.onDebug(ex); } } this.controlOutstream.write(outputData, outputData.length); // write! if (cmd != "get" && cmd != "reget" && cmd != "put" && cmd != "reput") { ++this.networkTimeoutID; // this checks for timeout var self = this; var currentTimeout = this.networkTimeoutID; var func = function() { self.checkTimeout(currentTimeout, cmd); }; setTimeout(func, this.networkTimeout * 1000); } if ((cmd == "RETR" || cmd == "STOR" || cmd == "APPE") && callback2 != 'fxp') { ++this.transferID; var currentId = this.transferID; var func = function() { self.checkDataTimeout(cmd == "RETR", currentId, 0); }; setTimeout(func, this.networkTimeout * 1000); } outputData = cmd + (parameter ? (' ' + parameter) : ''); // write it out to the log if (callback == "sftpcache") { callback = null; } else if (cmd != "PASS") { if (this.observer) { this.observer.onAppendLog("" + outputData, 'output', "info"); } } else { if (this.observer) { this.observer.onAppendLog("PASS " + this.passNotShown, 'output', "info"); } } } catch(ex) { if (this.observer) { this.observer.onDebug(ex); this.observer.onError(this.errorConnectStr); } } }, refresh : function() { if (this.waitToRefresh) { var self = this; var func = function() { self.refresh(); }; setTimeout(func, 1000); return; } else if (this.eventQueue.length) { return; } if (this.localRefreshLater) { var dir = new String(this.localRefreshLater); this.localRefreshLater = ""; if (this.observer) { this.observer.onShouldRefresh(true, false, dir); } } if (this.remoteRefreshLater) { var dir = new String(this.remoteRefreshLater); this.remoteRefreshLater = ""; if (this.observer) { this.observer.onShouldRefresh(false, true, dir); } } }, parseListData : function(data, path) { /* Unix style: drwxr-xr-x 1 user01 ftp 512 Jan 29 23:32 prog * Alternate Unix style: drwxr-xr-x 1 user01 ftp 512 Jan 29 1997 prog * Alternate Unix style: drwxr-xr-x 1 1 1 512 Jan 29 23:32 prog * SunOS style: drwxr-xr-x+ 1 1 1 512 Jan 29 23:32 prog * A symbolic link in Unix style: lrwxr-xr-x 1 user01 ftp 512 Jan 29 23:32 prog -> prog2000 * AIX style: drwxr-xr-x 1 user01 ftp 512 05 Nov 2003 prog * Novell style: drwxr-xr-x 1 user01 512 Jan 29 23:32 prog * Weird style: drwxr-xr-x 1 user5424867 Jan 29 23:32 prog, where 5424867 is the size * Weird style 2: drwxr-xr-x 1 user01 anon5424867 Jan 11 12:48 prog, where 5424867 is the size * MS-DOS style: 01-29-97 11:32PM prog * OS/2 style: 0 DIR 01-29-97 23:32 PROG * OS/2 style: 2243 RA 04-05-103 00:22 PJL * OS/2 style: 60 11-18-104 06:54 chkdsk.log * * MLSD style: type=file;size=6106;modify=20070223082414;UNIX.mode=0644;UNIX.uid=32257;UNIX.gid=32259;unique=808g154c727; prog * type=dir;sizd=4096;modify=20070218021044;UNIX.mode=0755;UNIX.uid=32257;UNIX.gid=32259;unique=808g1550003; prog * type=file;size=4096;modify=20070218021044;UNIX.mode=07755;UNIX.uid=32257;UNIX.gid=32259;unique=808g1550003; prog * type=OS.unix=slink:/blah;size=4096;modify=20070218021044;UNIX.mode=0755;UNIX.uid=32257;UNIX.gid=32259;unique=808g1550003; prog */ try { data = this.toUTF8.convertStringToUTF8(data, this.encoding, 1); } catch (ex) { if (this.observer) { this.observer.onDebug(ex); } } if (this.observer) { this.observer.onDebug(data.replace(//g, '>'), "DEBUG"); } var items = data.indexOf("\r\n") != -1 ? data.split("\r\n") : data.split("\n"); items = items.filter(this.removeBlanks); var curDate = new Date(); if (items.length) { // some ftp servers send 'count ' or 'total ' first if (items[0].indexOf("count") == 0 || items[0].indexOf("total") == 0 || items[0].indexOf("Listing directory") == 0 || (!this.featMLSD && items[0].split(" ").filter(this.removeBlanks).length == 2)) { items.shift(); // could be in german or croatian or what have you } } for (var x = 0; x < items.length; ++x) { if (!items[x]) { // some servers put in blank lines b/w entries, aw, for cryin' out loud items.splice(x, 1); --x; continue; } items[x] = items[x].replace(/^\s+/, ""); // @*$% - some servers put blanks in front, do trimming on front var temp = items[x]; // account for collisions: drwxr-xr-x1017 user01 if (!this.featMLSD) { if (!parseInt(items[x].charAt(0)) && items[x].charAt(0) != '0' && items[x].charAt(10) == '+') { // drwxr-xr-x+ - get rid of the plus sign items[x] = this.setCharAt(items[x], 10, ' '); } if (!parseInt(items[x].charAt(0)) && items[x].charAt(0) != '0' && items[x].charAt(10) != ' ') { // this is mimicked below if weird style items[x] = items[x].substring(0, 10) + ' ' + items[x].substring(10, items[x].length); } items[x] = items[x].split(" ").filter(this.removeBlanks); } if (this.featMLSD) { // MLSD-standard style var newItem = { permissions : "----------", hardLink : "", user : "", group : "", fileSize : "0", date : "", leafName : "", isDir : false, isDirectory : function() { return this.isDir }, isSymlink : function() { return this.symlink != "" }, symlink : "", path : "" }; var pathname = items[x].split("; "); newItem.leafName = ''; for (var y = 1; y < pathname.length; ++y) { newItem.leafName += (y == 1 ? '' : '; ') + pathname[y]; } newItem.path = this.constructPath(path, newItem.leafName); items[x] = pathname[0]; items[x] = items[x].split(";"); var skip = false; for (var y = 0; y < items[x].length; ++y) { if (!items[x][y]) { continue; } var fact = items[x][y].split('='); if (fact.length < 2 || !fact[0] || !fact[1]) { continue; } var factName = fact[0].toLowerCase(); var factVal = fact[1]; switch (factName) { case "type": if (factVal == "pdir" || factVal == "cdir") { skip = true; } else if (factVal == "dir") { newItem.isDir = true; newItem.permissions = this.setCharAt(newItem.permissions, 0, 'd'); } else if (items[x][y].substring(5).indexOf("OS.unix=slink:") == 0) { newItem.symlink = items[x][y].substring(19); newItem.permissions = this.setCharAt(newItem.permissions, 0, 'l'); } else if (factVal != "file") { skip = true; } break; case "size": case "sizd": newItem.fileSize = factVal; break; case "modify": var dateString = factVal.substr(0, 4) + " " + factVal.substr(4, 2) + " " + factVal.substr(6, 2) + " " + factVal.substr(8, 2) + ":" + factVal.substr(10, 2) + ":" + factVal.substr(12, 2) + " GMT"; var zeDate = new Date(dateString); zeDate.setMinutes(zeDate.getMinutes() + this.timezone); var timeOrYear = new Date() - zeDate > 15600000000 ? zeDate.getFullYear() // roughly 6 months : this.zeroPadTime(zeDate.getHours()) + ":" + this.zeroPadTime(zeDate.getMinutes()); newItem.date = this.l10nMonths[zeDate.getMonth()] + ' ' + zeDate.getDate() + ' ' + timeOrYear; newItem.lastModifiedTime = zeDate.getTime(); break; case "unix.mode": var offset = factVal.length == 5 ? 1 : 0; var sticky = this.zeroPad(parseInt(factVal[0 + offset]).toString(2)); var owner = this.zeroPad(parseInt(factVal[1 + offset]).toString(2)); var group = this.zeroPad(parseInt(factVal[2 + offset]).toString(2)); var pub = this.zeroPad(parseInt(factVal[3 + offset]).toString(2)); newItem.permissions = this.setCharAt(newItem.permissions, 1, owner[0] == '1' ? 'r' : '-'); newItem.permissions = this.setCharAt(newItem.permissions, 2, owner[1] == '1' ? 'w' : '-'); newItem.permissions = this.setCharAt(newItem.permissions, 3, sticky[0] == '1' ? (owner[2] == '1' ? 's' : 'S') : (owner[2] == '1' ? 'x' : '-')); newItem.permissions = this.setCharAt(newItem.permissions, 4, group[0] == '1' ? 'r' : '-'); newItem.permissions = this.setCharAt(newItem.permissions, 5, group[1] == '1' ? 'w' : '-'); newItem.permissions = this.setCharAt(newItem.permissions, 6, sticky[1] == '1' ? (group[2] == '1' ? 's' : 'S') : (group[2] == '1' ? 'x' : '-')); newItem.permissions = this.setCharAt(newItem.permissions, 7, pub[0] == '1' ? 'r' : '-'); newItem.permissions = this.setCharAt(newItem.permissions, 8, pub[1] == '1' ? 'w' : '-'); newItem.permissions = this.setCharAt(newItem.permissions, 9, sticky[2] == '1' ? (pub[2] == '1' ? 't' : 'T') : (pub[2] == '1' ? 'x' : '-')); break; case "unix.uid": newItem.user = factVal; break; case "unix.gid": newItem.group = factVal; break; default: break; } if (skip) { break; } } if (skip) { items.splice(x, 1); --x; continue; } items[x] = newItem; } else if (!parseInt(items[x][0].charAt(0)) && items[x][0].charAt(0) != '0') { // unix style - so much simpler with you guys var offset = 0; if (items[x][3].search(this.remoteMonths) != -1 && items[x][5].search(this.remoteMonths) == -1) { var weird = temp; // added to support weird servers if (weird.charAt(10) != ' ') { // same as above code weird = weird.substring(0, 10) + ' ' + weird.substring(10, weird.length); } var weirdIndex = 0; for (var y = 0; y < items[x][2].length; ++y) { if (parseInt(items[x][2].charAt(y))) { weirdIndex = weird.indexOf(items[x][2]) + y; break; } } weird = weird.substring(0, weirdIndex) + ' ' + weird.substring(weirdIndex, weird.length); items[x] = weird.split(" ").filter(this.removeBlanks); } if (items[x][4].search(this.remoteMonths) != -1 && !parseInt(items[x][3].charAt(0))) { var weird = temp; // added to support 'weird 2' servers, oy vey if (weird.charAt(10) != ' ') { // same as above code weird = weird.substring(0, 10) + ' ' + weird.substring(10, weird.length); } var weirdIndex = 0; for (var y = 0; y < items[x][3].length; ++y) { if (parseInt(items[x][3].charAt(y))) { weirdIndex = weird.indexOf(items[x][3]) + y; break; } } weird = weird.substring(0, weirdIndex) + ' ' + weird.substring(weirdIndex, weird.length); items[x] = weird.split(" ").filter(this.removeBlanks); } if (items[x][4].search(this.remoteMonths) != -1) { // added to support novell servers offset = 1; } var index = 0; for (var y = 0; y < 7 - offset; ++y) { index = temp.indexOf(items[x][y], index) + items[x][y].length + 1; } var name = temp.substring(temp.indexOf(items[x][7 - offset], index) + items[x][7 - offset].length + 1, temp.length); name = name.substring(name.search(/[^\s]/)); var symlink = ""; if (items[x][0].charAt(0) == 'l') { symlink = name; if (this.security != "sftp") { name = name.substring(0, name.indexOf("->") - 1); symlink = symlink.substring(symlink.indexOf("->") + 3); } } name = (name.lastIndexOf('/') == -1 ? name : name.substring(name.lastIndexOf('/') + 1)); var remotepath = this.constructPath(path, name); var month; var rawDate = items[x][6 - offset]; if (items[x][6].search(this.remoteMonths) != -1) { // added to support aix servers month = this.remoteMonths.search(items[x][6 - offset]) / 4; rawDate = items[x][5 - offset]; } else { month = this.remoteMonths.search(items[x][5 - offset]) / 4; } var timeOrYear; var curDate = new Date(); var currentYr = curDate.getMonth() < month ? curDate.getFullYear() - 1 : curDate.getFullYear(); var rawYear = items[x][7 - offset].indexOf(':') != -1 ? currentYr : parseInt(items[x][7 - offset]); var rawTime = items[x][7 - offset].indexOf(':') != -1 ? items[x][7 - offset] : "00:00"; rawTime = rawTime.split(":"); for (var y = 0; y < rawTime.length; ++y) { rawTime[y] = parseInt(rawTime[y], 10); } var parsedDate = new Date(rawYear, month, rawDate, rawTime[0], rawTime[1]); // month-day-year format parsedDate.setMinutes(parsedDate.getMinutes() + this.timezone); if (new Date() - parsedDate > 15600000000) { // roughly 6 months timeOrYear = parsedDate.getFullYear(); } else { timeOrYear = this.zeroPadTime(parsedDate.getHours()) + ":" + this.zeroPadTime(parsedDate.getMinutes()); } month = this.l10nMonths[parsedDate.getMonth()]; items[x] = { permissions : items[x][0], hardLink : items[x][1], user : items[x][2], group : (offset ? "" : items[x][3]), fileSize : items[x][4 - offset], date : month + ' ' + parsedDate.getDate() + ' ' + timeOrYear, leafName : name, isDir : items[x][0].charAt(0) == 'd', isDirectory : function() { return this.isDir }, isSymlink : function() { return this.symlink != "" }, symlink : symlink, path : remotepath }; } else if (items[x][0].indexOf('-') == -1) { // os/2 style var offset = 0; if (items[x][2].indexOf(':') != -1) { // if "DIR" and "A" are missing offset = 1; } var rawDate = items[x][2 - offset].split("-"); var rawTime = items[x][3 - offset]; var timeOrYear = rawTime; rawTime = rawTime.split(":"); for (var y = 0; y < rawDate.length; ++y) { rawDate[y] = parseInt(rawDate[y], 10); // leading zeros are treated as octal so pass 10 as base argument } for (var y = 0; y < rawTime.length; ++y) { rawTime[y] = parseInt(rawTime[y], 10); } rawDate[2] = rawDate[2] + 1900; // ah, that's better var parsedDate = new Date(rawDate[2], rawDate[0] - 1, rawDate[1], rawTime[0], rawTime[1]); // month-day-year format parsedDate.setMinutes(parsedDate.getMinutes() + this.timezone); if (new Date() - parsedDate > 15600000000) { // roughly 6 months timeOrYear = parsedDate.getFullYear(); } else { timeOrYear = this.zeroPadTime(parsedDate.getHours()) + ":" + this.zeroPadTime(parsedDate.getMinutes()); } var month = this.l10nMonths[parsedDate.getMonth()]; var name = temp.substring(temp.indexOf(items[x][3 - offset]) + items[x][3 - offset].length + 1, temp.length); name = name.substring(name.search(/[^\s]/)); name = (name.lastIndexOf('/') == -1 ? name : name.substring(name.lastIndexOf('/') + 1)); items[x] = { permissions : items[x][1] == "DIR" ? "d---------" : "----------", hardLink : "", user : "", group : "", fileSize : items[x][0], date : month + ' ' + parsedDate.getDate() + ' ' + timeOrYear, leafName : name, isDir : items[x][1] == "DIR", isDirectory : function() { return this.isDir }, isSymlink : function() { return false }, symlink : "", path : this.constructPath(path, name) }; } else { // ms-dos style var rawDate = items[x][0].split("-"); var amPm = items[x][1].substring(5, 7); // grab PM or AM var rawTime = items[x][1].substring(0, 5); // get rid of PM, AM var timeOrYear = rawTime; rawTime = rawTime.split(":"); for (var y = 0; y < rawDate.length; ++y) { rawDate[y] = parseInt(rawDate[y], 10); } for (var y = 0; y < rawTime.length; ++y) { rawTime[y] = parseInt(rawTime[y], 10); } rawTime[0] = rawTime[0] == 12 && amPm == "AM" ? 0 : (rawTime[0] < 12 && amPm == "PM" ? rawTime[0] + 12 : rawTime[0]); if (rawDate[2] < 70) { // assuming you didn't have some files left over from 1904 rawDate[2] = rawDate[2] + 2000; // ah, that's better } else { rawDate[2] = rawDate[2] + 1900; } var parsedDate = new Date(rawDate[2], rawDate[0] - 1, rawDate[1], rawTime[0], rawTime[1]); // month-day-year format parsedDate.setMinutes(parsedDate.getMinutes() + this.timezone); if (new Date() - parsedDate > 15600000000) { // roughly 6 months timeOrYear = parsedDate.getFullYear(); } else { timeOrYear = this.zeroPadTime(parsedDate.getHours()) + ":" + this.zeroPadTime(parsedDate.getMinutes()); } var month = this.l10nMonths[parsedDate.getMonth()]; var name = temp.substring(temp.indexOf(items[x][2], temp.indexOf(items[x][1]) + items[x][1].length + 1) + items[x][2].length + 1, temp.length); name = name.substring(name.search(/[^\s]/)); name = (name.lastIndexOf('/') == -1 ? name : name.substring(name.lastIndexOf('/') + 1)); items[x] = { permissions : items[x][2] == "" ? "d---------" : "----------", hardLink : "", user : "", group : "", fileSize : items[x][2] == "" ? '0' : items[x][2], date : month + ' ' + parsedDate.getDate() + ' ' + timeOrYear, leafName : name, isDir : items[x][2] == "", isDirectory : function() { return this.isDir }, isSymlink : function() { return false }, symlink : "", path : this.constructPath(path, name) }; } if (!items[x].lastModifiedTime) { var dateTemp = items[x].date; // this helps with sorting by date var dateMonth = dateTemp.substring(0, 3); var dateIndex = this.l10nMonths.indexOf(dateMonth); dateTemp = this.remoteMonths.substr(dateIndex * 4, 3) + dateTemp.substring(3); if (items[x].date.indexOf(':') != -1) { dateTemp = dateTemp + ' ' + (curDate.getFullYear() - (curDate.getMonth() < dateIndex ? 1 : 0)); } items[x].lastModifiedTime = Date.parse(dateTemp); } items[x].fileSize = parseInt(items[x].fileSize); items[x].parent = { path: items[x].path.substring(0, items[x].path.lastIndexOf('/') ? items[x].path.lastIndexOf('/') : 1) }; } var directories = new Array(); // sort directories to the top var files = new Array(); for (var x = 0; x < items.length; ++x) { if (!this.hiddenMode && items[x].leafName.charAt(0) == ".") { // don't show hidden files continue; } items[x].isHidden = items[x].leafName.charAt(0) == "."; items[x].leafName = items[x].leafName.replace(/[\\|\/]/g, ''); // scrub out / or \, a security vulnerability if file tries to do ..\..\blah.txt items[x].path = this.constructPath(path, items[x].leafName); // thanks to Tan Chew Keong for the heads-up if (items[x].leafName == "." || items[x].leafName == "..") { // get rid of "." or "..", this can screw up things on recursive deletions continue; } if (items[x].isDirectory()) { directories.push(items[x]); } else { files.push(items[x]); } } items = directories.concat(files); if (this.sessionsMode) { try { // put in cache var cacheSession = this.cacheService.createSession("fireftp", 1, true); var cacheDesc = cacheSession.openCacheEntry((this.security == "sftp" ? "s" : "") + "ftp://" + this.version + this.connectedHost + path, Components.interfaces.nsICache.ACCESS_WRITE, false); var cacheOut = cacheDesc.openOutputStream(0); var cacheData = items.toSource(); cacheOut.write(cacheData, cacheData.length); cacheOut.close(); cacheDesc.close(); } catch (ex) { if (this.observer) { this.observer.onDebug(ex); } } } return items; }, cacheHit : function(path, callback) { try { // check the cache first var cacheSession = this.cacheService.createSession("fireftp", 1, true); var cacheDesc = cacheSession.openCacheEntry((this.security == "sftp" ? "s" : "") + "ftp://" + this.version + this.connectedHost + path, Components.interfaces.nsICache.ACCESS_READ, false); if (cacheDesc.dataSize) { var cacheIn = cacheDesc.openInputStream(0); var cacheInstream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance(Components.interfaces.nsIBinaryInputStream); cacheInstream.setInputStream(cacheIn); this.listData = cacheInstream.readBytes(cacheInstream.available()); this.listData = eval(this.listData); cacheInstream.close(); cacheDesc.close(); if (this.observer) { this.observer.onDebug(this.listData.toSource().replace(//g, '>').replace(/, {/g, ',\n{') .replace(/isDirectory:\(function \(\) {return this.isDir;}\), isSymlink:\(function \(\) {return this.symlink != "";}\), /g, ''), "DEBUG-CACHE"); } if (typeof callback == "string") { eval(callback); // send off list data to whoever wanted it } else { callback(); } return true; } cacheDesc.close(); } catch (ex) { } return false; }, removeCacheEntry : function(path) { try { var cacheSession = this.cacheService.createSession("fireftp", 1, true); var cacheDesc = cacheSession.openCacheEntry((this.security == "sftp" ? "s" : "") + "ftp://" + this.version + this.connectedHost + path, Components.interfaces.nsICache.ACCESS_WRITE, false); cacheDesc.doom(); cacheDesc.close(); } catch (ex) { if (this.observer) { this.observer.onDebug(ex); } } }, detectAscii : function(path) { // detect an ascii file - returns "A" or "I" if (this.fileMode == 1) { // binary return "I"; } if (this.fileMode == 2) { // ASCII return "A"; } path = path.substring(path.lastIndexOf('.') + 1); // manually detect for (var x = 0; x < this.asciiFiles.length; ++x) { if (this.asciiFiles[x].toLowerCase() == path.toLowerCase()) { return "A"; } } return "I"; }, constructPath : function(parent, leafName) { return parent + (parent.charAt(parent.length - 1) != '/' ? '/' : '') + leafName; }, removeBlanks : function(element, index, array) { return element; }, zeroPad : function(str) { return str.length == 3 ? str : (str.length == 2 ? '0' + str : '00' + str); }, zeroPadTime : function(num) { num = num.toString(); return num.length == 2 ? num : '0' + num; }, setCharAt : function(str, index, ch) { // how annoying return str.substr(0, index) + ch + str.substr(index + 1); }, setEncoding : function(encoding) { try { this.fromUTF8.charset = encoding; this.encoding = encoding; } catch (ex) { this.fromUTF8.charset = "UTF-8"; this.encoding = "UTF-8"; } }, binaryToHex : function(input) { // borrowed from nsUpdateService.js var result = ""; for (var i = 0; i < input.length; ++i) { var hex = input.charCodeAt(i).toString(16); if (hex.length == 1) { hex = "0" + hex; } result += hex; } return result; }, escapeSftp : function(str) { // thanks to Tan Chew Keong for the heads-up return str.replace(/"/g, '""'); } }; ftpMozilla.prototype.ftp = { connect : function(reconnect) { if (!reconnect) { // this is not a reconnection attempt this.isReconnecting = false; this.reconnectsLeft = parseInt(this.reconnectAttempts); if (!this.reconnectsLeft || this.reconnectsLeft < 1) { this.reconnectsLeft = 1; } } if (!this.eventQueue.length || this.eventQueue[0].cmd != "welcome") { this.unshiftEventQueue("welcome", "", ""); // wait for welcome message first } ++this.networkTimeoutID; // just in case we have timeouts from previous connection ++this.transferID; try { // create a control socket var proxyInfo = null; var self = this; if (this.proxyType != "") { // use a proxy proxyInfo = this.proxyService.newProxyInfo(this.proxyType, this.proxyHost, this.proxyPort, 0, 30, null); } if (this.security == "ssl") { // thanks to Scott Bentley. he's a good man, Jeffrey. and thorough. this.controlTransport = this.transportService.createTransport(["ssl"], 1, this.host, parseInt(this.port), proxyInfo); } else if (!this.security) { this.controlTransport = this.transportService.createTransport(null, 0, this.host, parseInt(this.port), proxyInfo); } else { this.controlTransport = this.transportService.createTransport(["starttls"], 1, this.host, parseInt(this.port), proxyInfo); } if (this.observer && this.observer.securityCallbacks) { this.observer.securityCallbacks.connection = this; this.controlTransport.securityCallbacks = this.observer.securityCallbacks; } this.controlOutstream = this.controlTransport.openOutputStream(0, 0, 0); var controlStream = this.controlTransport.openInputStream(0, 0, 0); this.controlInstream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream); this.controlInstream.init(controlStream); var dataListener = { // async data listener for the control socket data : "", onStartRequest : function(request, context) { }, onStopRequest : function(request, context, status) { self.onDisconnect(); }, onDataAvailable : function(request, context, inputStream, offset, count) { this.data = self.controlInstream.read(count); // read data self.readControl(this.data); } }; var pump = Components.classes["@mozilla.org/network/input-stream-pump;1"].createInstance(Components.interfaces.nsIInputStreamPump); pump.init(controlStream, -1, -1, 0, 0, false); pump.asyncRead(dataListener, null); } catch(ex) { this.onDisconnect(); } }, getCert : function() { try { if (this.security) { return this.controlTransport.securityInfo.QueryInterface(Components.interfaces.nsISSLStatusProvider) .SSLStatus.QueryInterface(Components.interfaces.nsISSLStatus) .serverCert; } } catch(ex) { if (this.observer) { this.observer.onDebug(ex); } } return null; }, checkDataTimeout : function(download, id, bytes) { if (this.isConnected && this.transferID == id && this.dataSocket) { if ((download && bytes == this.dataSocket.dataListener.bytesDownloaded) || (!download && bytes == this.dataSocket.progressEventSink.bytesUploaded)) { this.resetConnection(); return; } var self = this; var nextBytes = download ? self.dataSocket.dataListener.bytesDownloaded : self.dataSocket.progressEventSink.bytesUploaded; var func = function() { self.checkDataTimeout(download, id, nextBytes); }; setTimeout(func, this.networkTimeout * 1000); } }, keepAlive : function() { if (this.isConnected && this.keepAliveMode && this.eventQueue.length == 0) { this.addEventQueue("NOOP"); this.writeControl(); } var self = this; var func = function() { self.keepAlive(); }; setTimeout(func, 60000); }, readControl : function(buffer) { try { buffer = this.toUTF8.convertStringToUTF8(buffer, this.encoding, 1); } catch (ex) { if (this.observer) { this.observer.onDebug(ex); } } if ((buffer == "2" && !this.isConnected) || buffer == "\r\n" || buffer == "\n") { return; } var lastLineOfBuffer = buffer.indexOf("\r\n") != -1 ? buffer.split("\r\n") : buffer.split("\n"); lastLineOfBuffer = lastLineOfBuffer.filter(this.removeBlanks); if (buffer != "2") { // "2"s are self-generated fake messages for (var x = 0; x < lastLineOfBuffer.length; ++x) { // add response to log var message = lastLineOfBuffer[x].charAt(lastLineOfBuffer[x].length - 1) == '\r' ? lastLineOfBuffer[x].substring(0, lastLineOfBuffer[x].length - 1) : lastLineOfBuffer[x]; var errorBlah = lastLineOfBuffer[x].charAt(0) == '4' || lastLineOfBuffer[x].charAt(0) == '5'; if (!errorBlah) { if (this.observer) { this.observer.onAppendLog(message, 'input', "info"); } } } ++this.networkTimeoutID; } lastLineOfBuffer = lastLineOfBuffer[lastLineOfBuffer.length - 1]; // we are only interested in what the last line says var returnCode; if ((lastLineOfBuffer.length > 3 && lastLineOfBuffer.charAt(3) == '-') || lastLineOfBuffer.charAt(0) == ' ') { if (this.eventQueue[0].cmd == "USER" || this.eventQueue[0].cmd == "PASS") { this.welcomeMessage += buffer; // see if the message is finished or not } this.fullBuffer += buffer; return; } else { buffer = this.fullBuffer + buffer; this.fullBuffer = ''; returnCode = parseInt(lastLineOfBuffer.charAt(0)); // looks at first number of number code } var cmd; var parameter; var callback; var callback2; if (this.eventQueue.length) { cmd = this.eventQueue[0].cmd; parameter = this.eventQueue[0].parameter; callback = this.eventQueue[0].callback; callback2 = this.eventQueue[0].callback2; if (cmd != "LIST" && cmd != "RETR" && cmd != "STOR" && cmd != "APPE" // used if we have a loss in connection && cmd != "LIST2" && cmd != "RETR2" && cmd != "STOR2" && cmd != "APPE2") { var throwAway = this.eventQueue.shift(); if (throwAway.cmd != "USER" && throwAway.cmd != "PASS" && throwAway.cmd != "PWD" && throwAway.cmd != "FEAT" && throwAway.cmd != "welcome" && throwAway.cmd != "goodbye" && throwAway.cmd != "aborted" && throwAway.cmd != "NOOP" && throwAway.cmd != "REST" && throwAway.cmd != "SIZE" && throwAway.cmd != "PBSZ" && throwAway.cmd != "AUTH" && throwAway.cmd != "PROT") { this.trashQueue.push(throwAway); } } } else { cmd = "default"; // an unexpected reply - perhaps a 421 timeout message } switch (cmd) { case "welcome": this.welcomeMessage = buffer; if (returnCode != 2) { if (this.observer) { this.observer.onConnectionRefused(); } if (this.type == 'transfer') { this.type = 'bad'; } this.cleanup(); break; } this.isConnected = true; // good to go if (this.observer) { this.observer.onConnected(); } this.isReconnecting = false; this.reconnectsLeft = parseInt(this.reconnectAttempts); // setup reconnection settings if (!this.reconnectsLeft || this.reconnectsLeft < 1) { this.reconnectsLeft = 1; } this.unshiftEventQueue( "USER", this.login, ""); if (this.security) { this.unshiftEventQueue("PBSZ", "0", ""); } if (this.security == "authtls") { this.unshiftEventQueue("AUTH", "TLS", ""); } else if (this.security == "authssl") { this.unshiftEventQueue("AUTH", "SSL", ""); } break; case "AUTH": if (returnCode != 2) { if (this.observer) { this.observer.onError(buffer); } this.isConnected = false; this.kill(); return; } else { var si = this.controlTransport.securityInfo; si.QueryInterface(Components.interfaces.nsISSLSocketControl); si.StartTLS(); } break; case "PBSZ": if (returnCode != 2) { if (this.observer) { this.observer.onError(buffer); } this.isConnected = false; this.kill(); return; } break; case "PROT": if (buffer.substring(0, 3) == "534" && parameter == "P") { if (this.observer) { this.observer.onAppendLog(buffer, 'error', "error"); } this.unshiftEventQueue("PROT", "C", ""); break; } if (returnCode != 2) { if (this.observer) { this.observer.onError(buffer); } } else { this.securityMode = parameter; } break; case "USER": case "PASS": if (returnCode == 2) { if (this.legitClose) { if (this.observer) { this.observer.onWelcomed(); } } var newConnectedHost = this.login + "@" + this.host; if (this.observer) { this.observer.onLoginAccepted(newConnectedHost != this.connectedHost); } if (newConnectedHost != this.connectedHost) { this.legitClose = true; } this.connectedHost = newConnectedHost; // switching to a different host or different login if (!this.legitClose) { this.recoverFromDisaster(); // recover from previous disaster break; } this.legitClose = false; this.unshiftEventQueue("PWD", "", ""); this.unshiftEventQueue("FEAT", "", ""); } else if (cmd == "USER" && returnCode == 3) { this.unshiftEventQueue("PASS", this.password, ""); } else { if (this.observer && this.type == 'transfer') { this.observer.onLoginDenied(); } this.cleanup(); // login failed, cleanup variables if (this.observer && this.type != 'transfer' && this.type != 'bad') { this.observer.onError(buffer); } this.isConnected = false; this.kill(); if (this.type == 'transfer') { this.type = 'bad'; } if (this.observer && this.type != 'transfer' && this.type != 'bad') { var self = this; var func = function() { self.observer.onLoginDenied(); }; setTimeout(func, 0); } return; } break; case "PASV": if (returnCode != 2) { if (this.observer) { this.observer.onError(buffer + ": " + this.constructPath(this.currentWorkingDir, this.eventQueue[(this.eventQueue[0].cmd == "REST" ? 1 : 0)].parameter)); } if (this.observer && this.eventQueue[0].cmd != "LIST") { for (var x = 0; x < this.eventQueue.length; ++x) { if (this.eventQueue[x].cmd == "transferEnd") { this.observer.onTransferFail(this.eventQueue[x].callback, buffer); break; } } } if (this.eventQueue[0].cmd == "LIST") { this.eventQueue.shift(); } else { while (this.eventQueue.length) { if (this.eventQueue[0].cmd == "transferEnd") { this.eventQueue.shift(); break; } this.eventQueue.shift(); } } break; } if (this.passiveMode) { var dataHost; var dataPort; if (callback2 == 'fxp') { callback(buffer.substring(buffer.indexOf("(") + 1, buffer.indexOf(")"))); return; } if (this.ipType == "IPv4") { buffer = buffer.substring(buffer.indexOf("(") + 1, buffer.indexOf(")")); var re = /,/g; buffer = buffer.replace(re, "."); // parsing the port to transfer to var lastDotIndex = buffer.lastIndexOf("."); dataPort = parseInt(buffer.substring(lastDotIndex + 1)); dataPort += 256 * parseInt(buffer.substring(buffer.lastIndexOf(".", lastDotIndex - 1) + 1, lastDotIndex)); dataHost = buffer.substring(0, buffer.lastIndexOf(".", lastDotIndex - 1)); } else { buffer = buffer.substring(buffer.indexOf("(|||") + 4, buffer.indexOf("|)")); dataPort = parseInt(buffer); dataHost = this.host; } var isSecure = this.security && this.securityMode == "P"; var proxy = { proxyType: this.proxyType, proxyHost: this.proxyHost, proxyPort: this.proxyPort }; var qId; for (var x = 0; x < this.eventQueue.length; ++x) { if (this.eventQueue[x].cmd == "transferEnd") { qId = this.eventQueue[x].callback.id; break; } } this.dataSocket = new ftpDataSocketMozilla(this.host, this.port, isSecure, proxy, dataHost, dataPort, this.compressMode == "Z", qId, this.observer, this.getCert(), this.fileMode == 2); if (this.eventQueue[0].cmd == "LIST") { // do what's appropriate this.dataSocket.connect(); } else if (this.eventQueue[0].cmd == "RETR") { this.dataSocket.connect(false, this.eventQueue[0].callback, callback); } else if (this.eventQueue[0].cmd == "REST") { this.dataSocket.connect(false, this.eventQueue[1].callback, callback, this.eventQueue[0].parameter); } else if (this.eventQueue[0].cmd == "STOR") { this.dataSocket.connect(true, this.eventQueue[0].callback, 0, 0); } else if (this.eventQueue[0].cmd == "APPE") { this.dataSocket.connect(true, this.eventQueue[0].callback.localPath, 0, this.eventQueue[0].callback.remoteSize); } } break; case "PORT": // only used with FXP if (returnCode != 2) { if (this.observer) { this.observer.onError(buffer + ": " + this.constructPath(this.currentWorkingDir, this.eventQueue[(this.eventQueue[0].cmd == "REST" ? 1 : 0)].parameter)); } break; } break; case "APPE": case "LIST": case "RETR": case "STOR": this.eventQueue[0].cmd = cmd + "2"; if (callback2 == 'fxp') { if (returnCode == 2) { ++this.transferID; this.eventQueue.shift(); if (this.eventQueue.length && this.eventQueue[0].cmd == "transferEnd") { this.eventQueue.shift(); } this.trashQueue = new Array(); // clear the trash array, completed an 'atomic' set of operations if (callback == 'dest' && (!this.fxpHost.eventQueue.length || (this.fxpHost.eventQueue[0].callback2 != 'fxp' && this.fxpHost.eventQueue[0].callback2 != 'fxpList'))) { this.disconnect(); } break; } if (this.fxpHost) { this.fxpHost.isReady = true; this.fxpHost.writeControlWrapper(); } return; } if (this.dataSocket.emptyFile) { // XXX empty files are (still) special cases this.dataSocket.kill(true); this.dataSocket = null; } if (returnCode == 2) { if (this.dataSocket.finished) { ++this.transferID; this.eventQueue.shift(); if (this.eventQueue.length && this.eventQueue[0].cmd == "transferEnd") { this.eventQueue.shift(); } this.trashQueue = new Array(); // clear the trash array, completed an 'atomic' set of operations if (cmd == "LIST") { this.listData = this.parseListData(this.dataSocket.listData, parameter); if (typeof callback == "string") { eval(callback); // send off list data to whoever wanted it } else { callback(); } } if (callback2) { // for transfers if (typeof callback2 == "string") { eval(callback2); } else { callback2(); } } this.dataSocket = null; break; } else { var self = this; var func = function() { self.readControl("2"); }; setTimeout(func, 500); // give data stream some time to finish up return; } } if (returnCode != 1) { if (this.observer) { this.observer.onError(buffer + ": " + this.constructPath(this.currentWorkingDir, parameter)); } this.eventQueue.shift(); while (this.eventQueue.length && (this.eventQueue[0].cmd == "MDTM" || this.eventQueue[0].cmd == "XMD5" || this.eventQueue[0].cmd == "XSHA1" || this.eventQueue[0].cmd == "transferEnd")) { if (this.eventQueue[0].cmd == "transferEnd" && this.observer) { this.observer.onTransferFail(this.eventQueue[0].callback, buffer); } this.eventQueue.shift(); } this.trashQueue = new Array(); if (this.dataSocket) { this.dataSocket.kill(); this.dataSocket = null; } break; } return; case "APPE2": case "RETR2": case "STOR2": case "LIST2": if (callback2 == 'fxp') { if (returnCode != 2) { if (this.observer) { this.observer.onError(buffer + ": " + this.constructPath(this.currentWorkingDir, parameter)); } } ++this.transferID; this.eventQueue.shift(); if (this.eventQueue.length && this.eventQueue[0].cmd == "transferEnd") { this.eventQueue.shift(); } this.trashQueue = new Array(); // clear the trash array, completed an 'atomic' set of operations if (callback == 'dest' && (!this.fxpHost.eventQueue.length || (this.fxpHost.eventQueue[0].callback2 != 'fxp' && this.fxpHost.eventQueue[0].callback2 != 'fxpList'))) { this.disconnect(); } break; } if (returnCode != 2) { if (this.observer) { this.observer.onError(buffer + ": " + this.constructPath(this.currentWorkingDir, parameter)); } this.eventQueue.shift(); while (this.eventQueue.length && (this.eventQueue[0].cmd == "MDTM" || this.eventQueue[0].cmd == "XMD5" || this.eventQueue[0].cmd == "XSHA1" || this.eventQueue[0].cmd == "transferEnd")) { if (this.eventQueue[0].cmd == "transferEnd" && this.observer) { this.observer.onTransferFail(this.eventQueue[0].callback, buffer); } this.eventQueue.shift(); } this.trashQueue = new Array(); if (this.dataSocket) { this.dataSocket.kill(); this.dataSocket = null; } break; } if (!this.dataSocket || this.dataSocket.finished) { ++this.transferID; this.eventQueue.shift(); if (this.eventQueue.length && this.eventQueue[0].cmd == "transferEnd") { this.eventQueue.shift(); } this.trashQueue = new Array(); // clear the trash array, completed an 'atomic' set of operations } if (cmd == "LIST2" && this.dataSocket.finished) { this.listData = this.parseListData(this.dataSocket.listData, parameter); this.dataSocket = null; if (typeof callback == "string") { eval(callback); // send off list data to whoever wanted it } else { callback(); } } else if ((!this.dataSocket || this.dataSocket.finished) && callback2) { // for transfers this.dataSocket = null; if (typeof callback2 == "string") { eval(callback2); } else { callback2(); } } else if (this.dataSocket && !this.dataSocket.finished) { var self = this; var func = function() { self.readControl("2"); }; setTimeout(func, 500); // give data stream some time to finish up return; } else if (this.dataSocket && this.dataSocket.finished) { this.dataSocket = null; } break; case "SIZE": if (returnCode == 2) { // used with APPE commands to see where to pick up from var size = buffer.split(" ").filter(this.removeBlanks); size = parseInt(size[1]); for (var x = 0; x < this.eventQueue.length; ++x) { if (callback == this.eventQueue[x].cmd) { if (callback == "STOR") { this.eventQueue[x].cmd = "APPE"; this.eventQueue[x].callback = { localPath: this.eventQueue[x].callback, remoteSize: size }; } else if (callback == "APPE") { this.eventQueue[x].callback = { localPath: this.eventQueue[x].callback.localPath, remoteSize: size }; } else if (callback == "PASV") { this.eventQueue[x].callback = size; } break; } } } else { // our size command didn't work out, make sure we're not doing an APPE if (callback != "PASV") { for (var x = 0; x < this.eventQueue.length; ++x) { if (this.eventQueue[x].cmd == "APPE") { this.eventQueue[x].cmd = "STOR"; this.eventQueue[x].callback = this.eventQueue[x].callback.localPath; break; } } } if (this.observer) { this.observer.onAppendLog(buffer, 'error', "error"); } } break; case "XMD5": case "XSHA1": if (returnCode == 2) { var zeHash = buffer.split(" ").filter(this.removeBlanks); zeHash = zeHash[1].replace(/\n|\r/g, "").toLowerCase(); if (typeof callback == "function") { callback(zeHash); break; } try { var file = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile); file.initWithPath(callback); var cryptoHash = cmd == "XMD5" ? Components.interfaces.nsICryptoHash.MD5 : Components.interfaces.nsICryptoHash.SHA1; var fstream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream); fstream.init(file, 1, 0, false); var gHashComp = Components.classes["@mozilla.org/security/hash;1"].createInstance(Components.interfaces.nsICryptoHash); gHashComp.init(cryptoHash); gHashComp.updateFromStream(fstream, -1); var ourHash = this.binaryToHex(gHashComp.finish(false)).toLowerCase(); fstream.close(); if (ourHash != zeHash) { if (this.observer) { this.observer.onError("'" + callback + "' - " + this.errorXCheckFail); for (var x = 0; x < this.eventQueue.length; ++x) { if (this.eventQueue[x].cmd == "transferEnd") { this.observer.onTransferFail(this.eventQueue[x].callback, "checksum"); break; } } } } } catch (ex) { if (this.observer) { this.observer.onDebug(ex); } } } else { // our size command didn't work out, make sure we're not doing an APPE if (this.observer) { this.observer.onAppendLog(buffer, 'error', "error"); } } break; case "MDTM": if (returnCode == 2) { var zeDate = buffer.split(" ").filter(this.removeBlanks); zeDate = zeDate[1]; try { var fileHandler = UrlUtils.getFileProtocolHandler(); var file = fileHandler.getFileFromURLSpec(callback).QueryInterface(Components.interfaces.nsILocalFile); file.lastModifiedTime = Date.parse(zeDate.substr(0, 4) + " " + zeDate.substr(4, 2) + " " + zeDate.substr(6, 2) + " " + zeDate.substr(8, 2) + ":" + zeDate.substr(10, 2) + ":" + zeDate.substr(12, 2) + " GMT"); } catch (ex) { if (this.observer) { this.observer.onDebug(ex); } } } else { // our size command didn't work out, make sure we're not doing an APPE if (this.observer) { this.observer.onAppendLog(buffer, 'error', "error"); } } break; case "RNFR": case "REST": if (returnCode != 3) { if (cmd == "RNFR") { this.eventQueue = new Array(); this.trashQueue = new Array(); } if (this.observer) { this.observer.onError(buffer); // should still be able to go on without this, just not with resuming } break; } break; case "MKD": case "SITE CHMOD": case "RNTO": case "DELE": case "RMD": if (returnCode != 2) { if (this.observer) { this.observer.onError(buffer + ": " + this.constructPath(this.currentWorkingDir, parameter)); } } else { if (cmd == "RMD") { // clear out of cache if it's a remove directory this.removeCacheEntry(this.constructPath(this.currentWorkingDir, parameter)); } if (typeof callback == "string") { eval(callback); // send off list data to whoever wanted it } else { callback(); } } this.trashQueue = new Array(); break; case "CWD": if (returnCode != 2) { // if it's not a directory if (callback && typeof callback == "function") { callback(false); } else if (this.type == 'transfer') { this.observer.onDebug(buffer); this.unshiftEventQueue(cmd, parameter, callback, callback2); var self = this; var func = function() { self.nextCommand(); }; setTimeout(func, 500); // give main connection time to create the directory return; } else if (this.observer) { this.observer.onDirNotFound(buffer); if (this.observer) { this.observer.onError(buffer); } } } else { this.currentWorkingDir = parameter; if (this.observer) { // else navigate to the directory this.observer.onChangeDir(parameter, typeof callback == "boolean" ? callback : ""); } if (callback && typeof callback == "function") { callback(true); } } break; case "PWD": // gotta check for chrooted directories if (returnCode != 2) { if (this.observer) { this.observer.onError(buffer); } } else { buffer = buffer.substring(buffer.indexOf("\"") + 1, buffer.lastIndexOf("\"")); // if buffer is not '/' we're chrooted this.currentWorkingDir = buffer; if (this.observer) { this.observer.onChangeDir(buffer != '/' && this.initialPath == '' ? buffer : '', false, buffer != '/' || this.initialPath != ''); } if (this.type == 'fxp') { this.list(this.initialPath ? this.initialPath : this.currentWorkingDir); } } this.trashQueue = new Array(); break; case "FEAT": if (returnCode != 2) { if (this.observer) { this.observer.onAppendLog(buffer, 'error', "error"); } } else { // XXX glazou: following line is wrong because some servers use both \r\n and \n //buffer = buffer.indexOf("\r\n") != -1 ? buffer.split("\r\n") : buffer.split("\n"); buffer = buffer.replace(/\\r\\n/g, "\n").split("\n"); for (var x = 0; x < buffer.length; ++x) { if (buffer[x] && buffer[x][0] == ' ') { var feat = buffer[x].trim().toUpperCase(); if (feat == "MDTM") { this.featMDTM = true; } else if (feat == "MLSD") { this.featMLSD = true; } else if (feat.indexOf("MODE Z") == 0) { this.featModeZ = true; } else if (feat.indexOf("XSHA1") == 0) { this.featXCheck = "XSHA1"; this.featXSHA1 = true; } else if (feat.indexOf("XMD5") == 0 && !this.featXCheck) { this.featXCheck = "XMD5"; } if (feat.indexOf("XMD5") == 0) { this.featXMD5 = true; } } } } break; case "aborted": break; case "TYPE": if (returnCode != 2) { if (this.observer) { this.observer.onError(buffer); } } else { this.transferMode = parameter; } break; case "MODE": if (returnCode != 2) { if (this.observer) { this.observer.onError(buffer); } } else { this.compressMode = parameter; } break; case "goodbye": // you say yes, i say no, you stay stop... case "NOOP": default: if (buffer.substring(0, 3) != "421" && returnCode != 2) { if (this.observer) { this.observer.onError(buffer); } } break; } this.nextCommand(); }, nextCommand : function() { this.isReady = true; if (this.observer) { this.observer.onIsReadyChange(true); } if (this.eventQueue.length && this.eventQueue[0].cmd != "welcome") { // start the next command this.writeControl(); } else { this.refresh(); } }, changeWorkingDirectory : function(path, callback) { this.addEventQueue("CWD", path, callback); this.writeControlWrapper(); }, makeDirectory : function(path, callback) { this.addEventQueue("CWD", path.substring(0, path.lastIndexOf('/') ? path.lastIndexOf('/') : 1), true); this.addEventQueue("MKD", path.substring(path.lastIndexOf('/') + 1), callback); this.writeControlWrapper(); }, makeBlankFile : function(path, callback) { this.addEventQueue("CWD", path.substring(0, path.lastIndexOf('/') ? path.lastIndexOf('/') : 1), true); try { var count = 0; let tmpFile = Components.classes["@mozilla.org/file/directory_service;1"].createInstance(Components.interfaces.nsIProperties).get("TmpD", Components.interfaces.nsILocalFile); tmpFile.append(count + '-blankFile'); while (tmpFile.exists()) { ++count; tmpFile.leafName = count + '-blankFile'; } var foutstream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream); foutstream.init(tmpFile, 0x04 | 0x08 | 0x20, parseInt("0644", 8), 0); foutstream.write("", 0); foutstream.close(); this.upload(tmpFile.path, path, false, 0, 0, callback, true); } catch (ex) { if (this.observer) { this.observer.onDebug(ex); } } }, remove : function(isDirectory, path, callback) { if (isDirectory) { this.unshiftEventQueue("RMD", path.substring(path.lastIndexOf('/') + 1), callback); this.unshiftEventQueue("CWD", path.substring(0, path.lastIndexOf('/') ? path.lastIndexOf('/') : 1), true); this.unshiftEventQueue("CWD", path.replace(/[^\/]+/g , ".."), true); var self = this; var listCallback = function() { self.removeRecursive(path); }; this.list(path, listCallback, true, true); } else { this.unshiftEventQueue("DELE", path.substring(path.lastIndexOf('/') + 1), callback); this.unshiftEventQueue("CWD", path.substring(0, path.lastIndexOf('/') ? path.lastIndexOf('/') : 1), true); } this.writeControlWrapper(); }, removeRecursive : function(parent) { // delete subdirectories and files var files = this.listData; for (var x = 0; x < files.length; ++x) { var remotePath = this.constructPath(parent, files[x].leafName); if (files[x].isDirectory()) { // delete a subdirectory recursively this.unshiftEventQueue("RMD", remotePath.substring(remotePath.lastIndexOf('/') + 1), ""); this.unshiftEventQueue("CWD", parent, true); this.removeRecursiveHelper(remotePath); } else { // delete a file this.unshiftEventQueue("DELE", remotePath.substring(remotePath.lastIndexOf('/') + 1), ""); this.unshiftEventQueue("CWD", parent, true); } } }, removeRecursiveHelper : function(remotePath) { var self = this; var listCallback = function() { self.removeRecursive(remotePath); }; this.list(remotePath, listCallback, true, true); }, rename : function(oldName, newName, callback, isDir) { if (isDir) { this.removeCacheEntry(oldName); } this.addEventQueue("RNFR", oldName); // rename the file this.addEventQueue("RNTO", newName, callback); this.writeControlWrapper(); }, changePermissions : function(permissions, path, callback) { this.addEventQueue("CWD", path.substring(0, path.lastIndexOf('/') ? path.lastIndexOf('/') : 1), true); this.addEventQueue("SITE CHMOD", permissions + ' ' + path.substring(path.lastIndexOf('/') + 1), callback); this.writeControlWrapper(); }, custom : function(cmd) { this.addEventQueue(cmd); this.writeControlWrapper(); }, list : function(path, callback, skipCache, recursive, fxp) { if (!skipCache && this.sessionsMode) { if (this.cacheHit(path, callback)) { return; } } var callback2 = fxp ? 'fxpList' : ''; if (recursive) { this.unshiftEventQueue( "LIST", path, callback, callback2); this.unshiftEventQueue( "PASV", "", "", callback2); this.unshiftEventQueue( "CWD", path, "", callback2); if (this.security) { this.unshiftEventQueue("PROT", "P", "", callback2); } this.unshiftEventQueue( "MODE", this.useCompression && this.featModeZ ? "Z" : "S", null, callback2); this.unshiftEventQueue( "TYPE", "A", "", callback2); } else { this.addEventQueue( "TYPE", "A", "", callback2); this.addEventQueue( "MODE", this.useCompression && this.featModeZ ? "Z" : "S", null, callback2); if (this.security) { this.addEventQueue( "PROT", "P", "", callback2); } this.addEventQueue( "CWD", path, "", callback2); this.addEventQueue( "PASV", "", "", callback2); this.addEventQueue( "LIST", path, callback, callback2); } this.writeControlWrapper(); }, download : function(remotePath, localPath, remoteSize, resume, localSize, isSymlink, callback, disableMDTM) { ++this.queueID; var id = this.connNo + "-" + this.queueID; this.addEventQueue("transferBegin", "", { id: id }); this.addEventQueue( "CWD", remotePath.substring(0, remotePath.lastIndexOf('/') ? remotePath.lastIndexOf('/') : 1), true); var leafName = remotePath.substring(remotePath.lastIndexOf('/') + 1); var ascii = this.detectAscii(remotePath); this.addEventQueue( "TYPE", ascii); this.addEventQueue( "MODE", this.useCompression && this.featModeZ ? "Z" : "S"); if (isSymlink) { this.addEventQueue("SIZE", leafName, "PASV"); // need to do a size check } if (this.security) { this.addEventQueue("PROT", "P"); } this.addEventQueue( "PASV", "", remoteSize, remoteSize); if (resume && ascii != 'A') { this.addEventQueue("REST", localSize); } this.addEventQueue( "RETR", leafName, localPath, callback); if (this.integrityMode && this.featXCheck && ascii != 'A') { this.addEventQueue(this.featXCheck, '"' + leafName + '"', localPath); } if (this.timestampsMode && this.featMDTM && !disableMDTM) { this.addEventQueue("MDTM", leafName, localPath); } this.addEventQueue("transferEnd", "", { localPath: localPath, remotePath: remotePath, size: remoteSize, transport: 'ftp', type: 'download', ascii: ascii, id: id }); this.writeControlWrapper(); }, upload : function(localPath, remotePath, resume, localSize, remoteSize, callback, disableMDTM) { ++this.queueID; var id = this.connNo + "-" + this.queueID; this.addEventQueue("transferBegin", "", { id: id }); this.addEventQueue( "CWD", remotePath.substring(0, remotePath.lastIndexOf('/') ? remotePath.lastIndexOf('/') : 1), true); var leafName = remotePath.substring(remotePath.lastIndexOf('/') + 1); var ascii = this.detectAscii(remotePath); this.addEventQueue( "TYPE", ascii); this.addEventQueue( "MODE", this.useCompression && this.featModeZ && ascii != 'A' ? "Z" : "S"); // XXX can't do compression with ascii mode in upload currently if (resume && ascii != 'A') { this.addEventQueue("SIZE", leafName, "APPE"); // need to do a size check } if (this.security) { this.addEventQueue("PROT", "P"); } this.addEventQueue( "PASV", null, null, localSize); if (resume && ascii != 'A') { this.addEventQueue("APPE", leafName, { localPath: localPath, remoteSize: remoteSize }, callback); } else { this.addEventQueue("STOR", leafName, localPath, callback); } if (this.integrityMode && this.featXCheck && ascii != 'A') { this.addEventQueue(this.featXCheck, '"' + leafName + '"', localPath); } if (this.timestampsMode && this.featMDTM && !disableMDTM) { this.addEventQueue("MDTM", leafName, localPath); } this.addEventQueue("transferEnd", "", { localPath: localPath, remotePath: remotePath, size: localSize, transport: 'ftp', type: 'upload', ascii: ascii, id: id }); this.writeControlWrapper(); return id; }, fxp : function(hostPath, destPath, resume, destSize, hostSize) { ++this.fxpHost.queueID; var id = this.fxpHost.connNo + "-" + this.fxpHost.queueID; var leafName = hostPath.substring(hostPath.lastIndexOf('/') + 1); var self = this; var func = function(hostPort) { self.fxpCallback(hostPort, destPath, resume, destSize, id); }; this.fxpHost.addEventQueue("transferBegin", "", { id: id }, 'fxp'); this.fxpHost.addEventQueue( "CWD", hostPath.substring(0, hostPath.lastIndexOf('/') ? hostPath.lastIndexOf('/') : 1), true, 'fxp'); var ascii = this.detectAscii(hostPath); this.fxpHost.addEventQueue( "TYPE", ascii, null, 'fxp'); this.fxpHost.addEventQueue( "MODE", this.useCompression && this.fxpHost.featModeZ && this.featModeZ ? "Z" : "S", null, 'fxp'); if (resume && ascii != 'A') { this.fxpHost.addEventQueue("REST", destSize, null, 'fxp'); } this.fxpHost.addEventQueue( "PASV", "", func, 'fxp'); this.fxpHost.addEventQueue( "RETR", leafName, 'host', 'fxp'); this.fxpHost.addEventQueue("transferEnd", "", { localPath: hostPath, remotePath: destPath, size: hostSize, transport: 'fxp', type: 'fxp', ascii: ascii, id: id }, 'fxp'); this.fxpHost.writeControlWrapper(); }, fxpCallback : function(hostPort, destPath, resume, destSize, id) { var leafName = destPath.substring(destPath.lastIndexOf('/') + 1); this.fxpHost.addEventQueue("transferBegin", "", { id: id }, 'fxp'); this.addEventQueue( "CWD", destPath.substring(0, destPath.lastIndexOf('/') ? destPath.lastIndexOf('/') : 1), true, 'fxp'); this.addEventQueue( "TYPE", this.detectAscii(leafName), null, 'fxp'); this.addEventQueue( "MODE", this.useCompression && this.fxpHost.featModeZ && this.featModeZ ? "Z" : "S", null, 'fxp'); if (resume) { this.addEventQueue( "REST", destSize, null, 'fxp'); } this.addEventQueue( "PORT", hostPort, null, 'fxp'); this.addEventQueue( "STOR", leafName, 'dest', 'fxp'); this.fxpHost.addEventQueue("transferEnd", "", { transport: 'fxp', type: 'fxp', id: id }, 'fxp'); this.writeControlWrapper(); }, isListing : function() { // check queue to see if we're listing for (var x = 0; x < this.eventQueue.length; ++x) { if (this.eventQueue[x].cmd.indexOf("LIST") != -1) { return true; } } return false; }, recoverFromDisaster : function() { // after connection lost, try to restart queue if (this.eventQueue.length && this.eventQueue[0].cmd == "goodbye") { this.eventQueue.shift(); } if (this.eventQueue.cmd) { this.eventQueue = new Array(this.eventQueue); } while (this.eventQueue.length && (this.eventQueue[0].callback2 == "fxp" || this.eventQueue[0].callback2 == "fxpList")) { this.eventQueue.shift(); } if (this.eventQueue.length && (this.eventQueue[0].cmd == "LIST" || this.eventQueue[0].cmd == "LIST2" || this.eventQueue[0].cmd == "RETR" || this.eventQueue[0].cmd == "RETR2" || this.eventQueue[0].cmd == "REST" || this.eventQueue[0].cmd == "APPE" || this.eventQueue[0].cmd == "STOR" || this.eventQueue[0].cmd == "STOR2" || this.eventQueue[0].cmd == "PASV" || this.eventQueue[0].cmd == "APPE2" || this.eventQueue[0].cmd == "SIZE")) { var cmd = this.eventQueue[0].cmd; var parameter = this.eventQueue[0].parameter; if (cmd == "LIST2" || cmd == "RETR2" || cmd == "STOR2" || cmd == "APPE2") { this.eventQueue[0].cmd = this.eventQueue[0].cmd.substring(0, 4); } cmd = this.eventQueue[0].cmd; if (cmd == "REST") { // set up resuming for these poor interrupted transfers try { var file = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile); file.initWithPath(this.eventQueue[1].callback); if (file.fileSize) { this.eventQueue[0].parameter = file.fileSize; } } catch (ex) { if (this.observer) { this.observer.onDebug(ex); } } } else if (cmd == "RETR") { try { var file = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile); file.initWithPath(this.eventQueue[0].callback); if (file.fileSize) { this.unshiftEventQueue("REST", file.fileSize, ""); } } catch (ex) { if (this.observer) { this.observer.onDebug(ex); } } } for (var x = this.trashQueue.length - 1; x >= 0; --x) { // take cmds out of the trash and put them back in the eventQueue if (this.trashQueue[x].cmd == "TYPE" && (cmd == "STOR" || cmd == "APPE")) { // more resuming fun - this time for the stor/appe commandds this.unshiftEventQueue("SIZE", parameter, cmd); } this.eventQueue.unshift(this.trashQueue[x]); } } else if (this.eventQueue.length && this.eventQueue[0].cmd == "RNTO" && this.trashQueue[this.trashQueue.length - 1].cmd == "RNFR") { this.unshiftEventQueue("RNFR", this.trashQueue[this.trashQueue.length - 1].parameter); } if (this.currentWorkingDir) { this.unshiftEventQueue("CWD", this.currentWorkingDir, true); this.currentWorkingDir = ""; } this.trashQueue = new Array(); } }; function ftpDataSocketMozilla(controlHost, controlPort, security, proxy, host, port, compress, id, observer, cert, asciiMode) { this.transportService = Components.classes["@mozilla.org/network/socket-transport-service;1"].getService(Components.interfaces.nsISocketTransportService); this.proxyService = Components.classes["@mozilla.org/network/protocol-proxy-service;1"].getService (Components.interfaces.nsIProtocolProxyService); this.dnsService = Components.classes["@mozilla.org/network/dns-service;1"].getService (Components.interfaces.nsIDNSService); this.eventTarget = Components.classes["@mozilla.org/thread-manager;1"].getService ().currentThread; this.security = security || false; this.host = (security ? controlHost : (host || "")); this.port = port || -1; this.proxyType = proxy ? proxy.proxyType : ""; this.proxyHost = proxy ? proxy.proxyHost : ""; this.proxyPort = proxy ? proxy.proxyPort : -1; this.useCompression = compress; this.dataListener = new dataListener(); this.progressEventSink = new progressEventSink(); this.id = id; this.observer = observer; this.asciiMode = asciiMode; if (security) { try { this.certOverride = Components.classes["@mozilla.org/security/certoverride;1"].getService(Components.interfaces.nsICertOverrideService); var hashAlg = {}; var fingerprint = {}; var overrideBits = {}; var isTemporary = {}; var ok = this.certOverride.getValidityOverride(controlHost, controlPort, hashAlg, fingerprint, overrideBits, isTemporary); this.certOverride.rememberValidityOverride(this.host, port, cert, overrideBits.value, true); } catch (ex) { if (this.observer) { this.observer.onDebug(ex); } } } } ftpDataSocketMozilla.prototype = { dataTransport : null, dataInstream : null, dataOutstream : null, fileInstream : null, serverSocket : null, listData : "", finished : true, emptyFile : false, // XXX empty files are (still) special cases connect : function(write, localPath, fileTotalBytes, filePartialBytes, activeTransport) { try { if (activeTransport) { this.dataTransport = activeTransport; } else { var proxyInfo = this.proxyType == "" ? null : this.proxyService.newProxyInfo(this.proxyType, this.proxyHost, this.proxyPort, 0, 30, null); if (this.security) { this.dataTransport = this.transportService.createTransport(["ssl"], 1, this.host, this.port, proxyInfo); } else { this.dataTransport = this.transportService.createTransport(null, 0, this.host, this.port, proxyInfo); } } this.finished = false; if (write) { // upload this.dataOutstream = this.dataTransport.openOutputStream(0, 0, -1); var file; try { file = UrlUtils.newLocalFile(localPath); this.fileInstream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(); this.fileInstream.QueryInterface(Components.interfaces.nsIFileInputStream); this.fileInstream.init(file, 0x01, parseInt("0644", 8), 0); this.fileInstream.QueryInterface(Components.interfaces.nsISeekableStream); this.fileInstream.seek(0, filePartialBytes); // append or not to append } catch (ex) { if (this.observer) { this.observer.onDebug(ex); } if (this.observer) { this.observer.onError(gStrbundle.getFormattedString("failedUpload", [localPath])); } this.kill(); return; } var binaryOutstream = Components.classes["@mozilla.org/binaryoutputstream;1"].createInstance(Components.interfaces.nsIBinaryOutputStream); binaryOutstream.setOutputStream(this.dataOutstream); this.dataInstream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance(Components.interfaces.nsIBinaryInputStream); this.dataInstream.setInputStream(this.fileInstream); this.progressEventSink.parent = this; this.progressEventSink.localPath = localPath; this.progressEventSink.sendPrevSent = 0; this.progressEventSink.timeStart = new Date(); this.progressEventSink.bytesTotal = file.fileSize; this.progressEventSink.bytesUploaded = this.useCompression ? 0 : filePartialBytes; this.progressEventSink.bytesPartial = filePartialBytes; this.progressEventSink.dataInstream = this.dataInstream; this.progressEventSink.dataOutstream = binaryOutstream; this.progressEventSink.fileInstream = this.fileInstream; this.progressEventSink.asciiMode = this.asciiMode; this.emptyFile = !file.fileSize; this.dataTransport.setEventSink(this.progressEventSink, this.eventTarget); if (this.useCompression && file.fileSize) { // never as elegant as downloading :( this.progressEventSink.compressStream = true; var streamConverter = Components.classes["@mozilla.org/streamconv;1?from=uncompressed&to=deflate"].createInstance(Components.interfaces.nsIStreamConverter); streamConverter.asyncConvertData("uncompressed", "deflate", this.progressEventSink, null); var pump = Components.classes["@mozilla.org/network/input-stream-pump;1"].createInstance(Components.interfaces.nsIInputStreamPump); pump.init(this.dataInstream, -1, -1, 0, 0, false); pump.asyncRead(streamConverter, null); } else { var dataBuffer = this.dataInstream.readBytes(this.dataInstream.available() < 4096 ? this.dataInstream.available() : 4096); var diff = dataBuffer.length; if (this.asciiMode) { dataBuffer = dataBuffer.replace(/(^|[^\r])\n/g, "$1\r\n"); } this.progressEventSink.bytesTotal += dataBuffer.length - diff; this.progressEventSink.dataOutstream.writeBytes(dataBuffer, dataBuffer.length); } } else { // download this.listData = ""; var dataStream = this.dataTransport.openInputStream(0, 0, 0); var streamConverter; this.dataInstream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance(Components.interfaces.nsIBinaryInputStream); if (this.useCompression) { streamConverter = Components.classes["@mozilla.org/streamconv;1?from=deflate&to=uncompressed"].createInstance(Components.interfaces.nsIStreamConverter); streamConverter.asyncConvertData("deflate", "uncompressed", this.dataListener, null); } else { this.dataInstream.setInputStream(dataStream); } this.dataListener.parent = this; this.dataListener.localPath = localPath; this.dataListener.dataInstream = this.dataInstream; this.dataListener.data = ""; this.dataListener.file = ""; this.dataListener.fileOutstream = ""; this.dataListener.binaryOutstream = ""; this.dataListener.bytesTotal = fileTotalBytes || 0; this.dataListener.bytesDownloaded = filePartialBytes || 0; this.dataListener.bytesPartial = filePartialBytes || 0; this.dataListener.timeStart = new Date(); this.dataListener.dataBuffer = ""; this.dataListener.isNotList = localPath != null; this.dataListener.useCompression = this.useCompression; this.dataListener.asciiMode = this.asciiMode; var pump = Components.classes["@mozilla.org/network/input-stream-pump;1"].createInstance(Components.interfaces.nsIInputStreamPump); pump.init(dataStream, -1, -1, 0, 0, false); pump.asyncRead(this.useCompression ? streamConverter : this.dataListener, null); } } catch(ex) { if (this.observer) { this.observer.onDebug(ex); } if (this.observer) { this.observer.onError(gStrbundle.getString("errorDataConn")); } return; } }, createServerSocket : function(activeInfo) { try { var ipAddress = this.dnsService.resolve(this.dnsService.myHostName, false).getNextAddrAsString(); var re = /\x2e/g; this.serverSocket = Components.classes["@mozilla.org/network/server-socket;1"].createInstance(Components.interfaces.nsIServerSocket); var self = this; var serverListener = { onSocketAccepted : function(serv, transport) { if (activeInfo.cmd == "LIST") { self.connect(false, null, 0, 0, transport); } else if (activeInfo.cmd == "RETR") { self.connect(false, activeInfo.localPath, activeInfo.totalBytes, 0, transport); } else if (activeInfo.cmd == "REST") { self.connect(false, activeInfo.localPath, activeInfo.totalBytes, activeInfo.partialBytes, transport); } else if (activeInfo.cmd == "STOR") { self.connect(true, activeInfo.localPath, 0, 0, transport); } else if (activeInfo.cmd == "APPE") { self.connect(true, activeInfo.localPath, 0, activeInfo.partialBytes, transport); } }, onStopListening : function(serv, status) { } }; this.serverSocket.init(this.port, false, -1); this.serverSocket.asyncListen(serverListener); if (activeInfo.ipType == "IPv4" && ipAddress.indexOf(':') == -1) { return ipAddress.replace(re, ",") + "," + parseInt(this.serverSocket.port / 256) + "," + this.serverSocket.port % 256; } else { return (ipAddress.indexOf(':') != -1 ? "|2|" : "|1|") + ipAddress + "|" + this.serverSocket.port + "|"; } } catch (ex) { if (this.observer) { this.observer.onDebug(ex); } if (this.observer) { this.observer.onError(gStrbundle.getString("errorDataConn")); } return null; } }, kill : function(override) { this.progressEventSink.bytesTotal = 0; // stop uploads this.dataListener.bytesTotal = 0; // stop downloads try { if (this.dataInstream && this.dataInstream.close) { this.dataInstream.close(); } } catch(ex) { } try { if ((!this.emptyFile || override) && this.dataOutstream && this.dataOutstream.flush) { this.dataOutstream.flush(); } if ((!this.emptyFile || override) && this.dataOutstream && this.dataOutstream.close) { this.dataOutstream.close(); } } catch(ex) { } try { if ((!this.emptyFile || override) && this.fileInstream && this.fileInstream.close) { this.fileInstream.close(); } } catch(ex) { } try { if ((!this.emptyFile || override)) { // XXX empty files are (still) special cases if (this.dataTransport && this.dataTransport.close) { this.dataTransport.close("Finished"); } } } catch(ex) { } try { if (this.dataListener.binaryOutstream && this.dataListener.binaryOutstream.close) { this.dataListener.binaryOutstream.close(); } } catch(ex) { } try { if (this.dataListener.fileOutstream && this.dataListener.fileOutstream.close) { this.dataListener.fileOutstream.close(); } } catch(ex) { } try { if (this.serverSocket && this.serverSocket.close) { this.serverSocket.close(); } } catch(ex) { } this.progressEventSink.parent = null; // stop memory leakage! this.dataListener.parent = null; // stop memory leakage! this.finished = true; if (this.security) { try { this.certOverride.clearValidityOverride(this.host, this.port); } catch (ex) { if (this.observer) { this.observer.onDebug(ex); } } } } }; function dataListener() { } dataListener.prototype = { parent : null, localPath : "", dataInstream : "", data : "", file : "", fileOutstream : "", binaryOutstream : "", bytesTotal : 0, bytesDownloaded : 0, bytesPartial : 0, timeStart : new Date(), dataBuffer : "", isNotList : false, useCompression : false, asciiMode : false, onStartRequest : function(request, context) { if (this.isNotList) { this.timeStart = new Date(); try { this.file = UrlUtils.newLocalFile(this.localPath); this.fileOutstream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream); if (this.bytesPartial) { this.fileOutstream.init(this.file, 0x04 | 0x10, parseInt("0644", 8), 0); } else { this.fileOutstream.init(this.file, 0x04 | 0x08 | 0x20, parseInt("0644", 8), 0); } this.binaryOutstream = Components.classes["@mozilla.org/binaryoutputstream;1"].createInstance(Components.interfaces.nsIBinaryOutputStream); this.binaryOutstream.setOutputStream(this.fileOutstream); } catch (ex) { this.failure(ex); } } }, onStopRequest : function(request, context, status) { if (!this.isNotList && this.parent) { this.parent.listData = this.data; } if (this.parent) { this.parent.kill(); } }, onDataAvailable : function(request, context, inputStream, offset, count) { if (this.useCompression) { this.dataInstream.setInputStream(inputStream); } if (this.isNotList) { try { this.dataBuffer = this.dataInstream.readBytes(count); var length = this.dataBuffer.length; if (this.asciiMode && this.getPlatform() != "windows") { this.dataBuffer = this.dataBuffer.replace(/\r\n/g, '\n'); } this.binaryOutstream.writeBytes(this.dataBuffer, this.dataBuffer.length) this.bytesDownloaded += length; } catch (ex) { this.failure(ex); } } else { this.data += this.dataInstream.readBytes(count); } }, failure : function(ex) { if (this.parent.observer) { this.parent.observer.onDebug(ex); } if (this.parent.observer) { this.parent.observer.onError(gStrbundle.getFormattedString("failedSave", [this.localPath])); } this.parent.kill(); }, getPlatform : function() { var platform = navigator.platform.toLowerCase(); if (platform.indexOf('linux') != -1) { return 'linux'; } if (platform.indexOf('mac') != -1) { return 'mac'; } return 'windows'; } }; function progressEventSink() { } progressEventSink.prototype = { parent : null, localPath : "", bytesTotal : 0, sendPrevSent : 0, bytesUploaded : 0, timeStart : new Date(), bytesPartial : 0, dataOutstream : null, fileInstream : null, compressFirst : true, compressStream : false, compressTotal : 0, compressDone : false, compressBuffer : "", asciiMode : false, onStartRequest : function(request, context) { }, onStopRequest : function(request, context, status) { this.compressDone = true; }, onDataAvailable : function(request, context, inputStream, offset, count) { try { var dataInstream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance(Components.interfaces.nsIBinaryInputStream); dataInstream.setInputStream(inputStream); this.compressTotal += count; this.compressBuffer += dataInstream.readBytes(count); if (this.compressFirst) { this.compressFirst = false; this.dataOutstream.writeBytes(this.compressBuffer, this.compressBuffer.length); this.compressBuffer = ""; } } catch (ex) { this.failure(ex); } }, onTransportStatus : function (transport, status, progress, progressMax) { this.bytesUploaded += progress - this.sendPrevSent; this.sendPrevSent = progress; if ((!this.compressStream && this.bytesUploaded == this.bytesTotal) || (this.compressStream && this.compressDone && this.bytesUploaded == this.compressTotal)) { // finished writing this.parent.kill(); // can't rely on this.fileInstream.available() - corrupts uploads return; } if (this.compressStream) { this.dataOutstream.writeBytes(this.compressBuffer, this.compressBuffer.length); this.compressBuffer = ""; } else { var dataBuffer = this.dataInstream.readBytes(this.dataInstream.available() < 4096 ? this.dataInstream.available() : 4096); var diff = dataBuffer.length; if (this.asciiMode) { dataBuffer = dataBuffer.replace(/(^|[^\r])\n/g, "$1\r\n"); } this.bytesTotal += dataBuffer.length - diff; this.dataOutstream.writeBytes(dataBuffer, dataBuffer.length); } }, failure : function(ex) { if (this.parent.observer) { this.parent.observer.onDebug(ex); } if (this.parent.observer) { this.parent.observer.onError(gStrbundle.getFormattedString("failedUpload", [this.localPath])); } this.parent.kill(); } }; ftpMozilla.prototype.sftp = { connect : function(reconnect) { if (!reconnect) { // this is not a reconnection attempt this.isReconnecting = false; this.reconnectsLeft = parseInt(this.reconnectAttempts); if (!this.reconnectsLeft || this.reconnectsLeft < 1) { this.reconnectsLeft = 1; } } if (!this.eventQueue.length || this.eventQueue[0].cmd != "welcome") { this.unshiftEventQueue("welcome", "", ""); // wait for welcome message first } ++this.networkTimeoutID; // just in case we have timeouts from previous connection ++this.transferID; try { var exec = this.getExec(); if (!exec || !exec.exists()) { this.onDisconnect(); return; } this.ipcService = Components.classes["@mozilla.org/process/ipc-service;1"].getService(Components.interfaces.nsIIPCService); this.pipeTransport = Components.classes["@mozilla.org/process/pipe-transport;1"].createInstance(Components.interfaces.nsIPipeTransport); this.ipcBuffer = Components.classes["@mozilla.org/process/ipc-buffer;1"].createInstance(Components.interfaces.nsIIPCBuffer); this.ipcBuffer.open(65536, true); var command = exec.path.replace(/\x5c/g, "/"); var args = []; if (this.password) { args.push("-pw"); args.push(this.password); } args.push("-P"); args.push(this.port); if (this.useCompression) { args.push("-C"); } if (this.privatekey) { args.push("-i"); args.push(this.privatekey.replace(/\x5c/g, "/")); } args.push((this.login ? this.login + "@" : "") + this.host); this.pipeTransport.init(command, args, args.length, [], 0, 0, "", true, true, this.ipcBuffer); this.controlOutstream = this.pipeTransport.openOutputStream(0, 0, 0); var self = this; var dataListener; var func = function() { if (!self.pipeTransport.isAttached()) { self.onDisconnect(); } if (dataListener.data) { if (dataListener.data.indexOf('\npsftp>') == -1 && dataListener.data.indexOf('\nStore key in cache') == -1 && dataListener.data.indexOf('\nUpdate cached key') == -1 && dataListener.data.indexOf('\nAccess denied') == -1 && dataListener.data.indexOf('Fatal: Network error:') == -1 && dataListener.data.indexOf('ssh_init:') != 0) { return; } var buf = dataListener.data; dataListener.data = ""; self.readControl(buf); } }; this.readPoller = setInterval(func, 100); dataListener = { data : "", onStartRequest : function(request, context) { }, onStopRequest : function(request, context, status) { }, onDataAvailable : function(request, context, inputStream, offset, count) { var controlInstream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream); controlInstream.init(inputStream); this.data += controlInstream.read(count); } }; this.pipeTransport.asyncRead(dataListener, null, 0, 0, 0); } catch(ex) { this.onDisconnect(); } }, keepAlive : function() { // do nothing }, readControl : function(buffer) { if (this.isKilling) { return; } try { buffer = this.toUTF8.convertStringToUTF8(buffer, this.encoding, 1); } catch (ex) { if (this.observer) { this.observer.onDebug(ex); } } if ((buffer == "2" && !this.isConnected) || buffer == "\r\n" || buffer == "\n") { return; } buffer = buffer.replace(/\r\npsftp> /, ''); buffer = buffer.replace(/\npsftp> /, ''); var origBuffer = buffer; buffer = buffer.indexOf("\r\n") != -1 ? buffer.split("\r\n") : buffer.split("\n"); buffer = buffer.filter(this.removeBlanks); if (origBuffer != "2" && origBuffer.indexOf('Store key in cache') == -1 // "2"s are self-generated fake messages && origBuffer.indexOf('\nUpdate cached key') == -1 && origBuffer.indexOf('Fatal: Network error:') == -1 && origBuffer.indexOf('\nAccess denied') == -1 && origBuffer.indexOf('ssh_init:') != 0) { for (var x = 0; x < buffer.length; ++x) { // add response to log var message = buffer[x].charAt(buffer[x].length - 1) == '\r' ? buffer[x].substring(0, buffer[x].length - 1) : buffer[x]; if (this.observer) { this.observer.onAppendLog(message, 'input', "info"); } if (message.indexOf('Listing directory') != -1) { break; } } ++this.networkTimeoutID; } var cmd; var parameter; var callback; var callback2; if (this.eventQueue.length) { cmd = this.eventQueue[0].cmd; parameter = this.eventQueue[0].parameter; callback = this.eventQueue[0].callback; callback2 = this.eventQueue[0].callback2; if (cmd != "ls" && cmd != "get" && cmd != "reget" && cmd != "put" && cmd != "reput") { // used if we have a loss in connection var throwAway = this.eventQueue.shift(); if (throwAway.cmd != "welcome" && throwAway.cmd != "goodbye" && throwAway.cmd != "aborted" && throwAway.cmd != "sftpcache") { this.trashQueue.push(throwAway); } } } else { cmd = "default"; // an unexpected reply - perhaps a 421 timeout message } switch (cmd) { case "welcome": case "sftpcache": if (origBuffer.indexOf('Fatal: Network error:') != -1 || origBuffer.indexOf('ssh_init:') == 0) { this.legitClose = true; this.onDisconnect(); return; } if (origBuffer.indexOf('Store key in cache') != -1 || origBuffer.indexOf('\nUpdate cached key') != -1) { if (this.observer) { var answer = this.observer.onSftpCache(origBuffer); if (answer) { this.unshiftEventQueue("sftpcache", answer, ""); } else { this.legitClose = true; this.onDisconnect(); return; } break; } } this.isConnected = true; // good to go if (this.observer) { this.observer.onConnected(); } this.isReconnecting = false; this.reconnectsLeft = parseInt(this.reconnectAttempts); // setup reconnection settings if (!this.reconnectsLeft || this.reconnectsLeft < 1) { this.reconnectsLeft = 1; } var newConnectedHost = this.login + "@" + this.host; if (this.observer) { this.observer.onLoginAccepted(newConnectedHost != this.connectedHost); } if (newConnectedHost != this.connectedHost) { this.legitClose = true; } this.connectedHost = newConnectedHost; // switching to a different host or different login if (!this.legitClose) { this.recoverFromDisaster(); // recover from previous disaster break; } this.legitClose = false; origBuffer = origBuffer.substring(origBuffer.indexOf("Remote working directory is") + 28); // if buffer is not '/' we're chrooted this.currentWorkingDir = origBuffer; if (this.observer) { this.observer.onChangeDir(origBuffer != '/' && this.initialPath == '' ? origBuffer : '', false, origBuffer != '/' || this.initialPath != ''); } this.trashQueue = new Array(); break; case "ls": case "get": case "reget": case "put": case "reput": ++this.transferID; this.eventQueue.shift(); if (this.eventQueue.length && this.eventQueue[0].cmd == "transferEnd") { this.eventQueue.shift(); } this.trashQueue = new Array(); // clear the trash array, completed an 'atomic' set of operations if (cmd == "ls") { this.listData = this.parseListData(origBuffer, parameter); if (typeof callback == "string") { eval(callback); // send off list data to whoever wanted it } else { callback(); } } if (callback2) { // for transfers if (typeof callback2 == "string") { eval(callback2); } else { callback2(); } } break; case "mkdir": case "rm": case "rmdir": if (origBuffer.indexOf(': OK') != origBuffer.length - 4) { if (this.observer) { this.observer.onError(origBuffer + ": " + this.constructPath(this.currentWorkingDir, parameter)); } } else { if (cmd == "rmdir") { // clear out of cache if it's a remove directory this.removeCacheEntry(this.constructPath(this.currentWorkingDir, parameter)); } if (typeof callback == "string") { eval(callback); // send off list data to whoever wanted it } else { callback(); } } this.trashQueue = new Array(); break; case "mv": if (origBuffer.indexOf(': no such file or directory') != -1) { if (this.observer) { this.observer.onError(origBuffer + ": " + parameter); } } else { if (typeof callback == "string") { eval(callback); // send off list data to whoever wanted it } else { callback(); } } this.trashQueue = new Array(); break; case "chmod": if (typeof callback == "string") { eval(callback); // send off list data to whoever wanted it } else { callback(); } this.trashQueue = new Array(); break; case "cd": if (origBuffer.indexOf('Remote directory is now') == -1) { // if it's not a directory if (callback && typeof callback == "function") { callback(false); } else if (this.observer) { this.observer.onDirNotFound(origBuffer); if (this.observer) { this.observer.onError(origBuffer); } } } else { this.currentWorkingDir = parameter; if (this.observer) { // else navigate to the directory this.observer.onChangeDir(parameter, typeof callback == "boolean" ? callback : ""); } if (callback && typeof callback == "function") { callback(true); } } break; case "aborted": case "custom": break; case "goodbye": // you say yes, i say no, you stay stop... default: if (origBuffer.indexOf('Access denied') != -1) { if (this.observer && this.type == 'transfer') { this.observer.onLoginDenied(); } this.cleanup(); // login failed, cleanup variables if (this.observer && this.type != 'transfer' && this.type != 'bad') { this.observer.onError(origBuffer); } this.isConnected = false; this.kill(); if (this.type == 'transfer') { this.type = 'bad'; } if (this.observer && this.type != 'transfer' && this.type != 'bad') { var self = this; var func = function() { self.observer.onLoginDenied(); }; setTimeout(func, 0); } return; } else if (this.observer) { this.observer.onError(origBuffer); } break; } this.isReady = true; if (this.observer) { this.observer.onIsReadyChange(true); } if (this.eventQueue.length && this.eventQueue[0].cmd != "welcome") { // start the next command this.writeControl(); } else { this.refresh(); } }, changeWorkingDirectory : function(path, callback) { this.addEventQueue("cd", path, callback); this.writeControlWrapper(); }, makeDirectory : function(path, callback) { this.addEventQueue("cd", path.substring(0, path.lastIndexOf('/') ? path.lastIndexOf('/') : 1), true); this.addEventQueue("mkdir", path.substring(path.lastIndexOf('/') + 1), callback); this.writeControlWrapper(); }, makeBlankFile : function(path, callback) { this.addEventQueue("cd", path.substring(0, path.lastIndexOf('/') ? path.lastIndexOf('/') : 1), true); try { var count = 0; let tmpFile = Components.classes["@mozilla.org/file/directory_service;1"].createInstance(Components.interfaces.nsIProperties).get("TmpD", Components.interfaces.nsILocalFile); tmpFile.append(count + '-blankFile'); while (tmpFile.exists()) { ++count; tmpFile.leafName = count + '-blankFile'; } var foutstream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream); foutstream.init(tmpFile, 0x04 | 0x08 | 0x20, parseInt("0644", 8), 0); foutstream.write("", 0); foutstream.close(); this.upload(tmpFile.path, path, false, 0, 0, callback, true); } catch (ex) { if (this.observer) { this.observer.onDebug(ex); } } }, remove : function(isDirectory, path, callback) { if (isDirectory) { this.unshiftEventQueue("rmdir", path.substring(path.lastIndexOf('/') + 1), callback); this.unshiftEventQueue("cd", path.substring(0, path.lastIndexOf('/') ? path.lastIndexOf('/') : 1), true); var self = this; var listCallback = function() { self.removeRecursive(path); }; this.list(path, listCallback, true, true); } else { this.unshiftEventQueue("rm", path.substring(path.lastIndexOf('/') + 1), callback); this.unshiftEventQueue("cd", path.substring(0, path.lastIndexOf('/') ? path.lastIndexOf('/') : 1), true); } this.writeControlWrapper(); }, removeRecursive : function(parent) { // delete subdirectories and files var files = this.listData; for (var x = 0; x < files.length; ++x) { var remotePath = this.constructPath(parent, files[x].leafName); if (files[x].isDirectory()) { // delete a subdirectory recursively this.unshiftEventQueue("rmdir", remotePath.substring(remotePath.lastIndexOf('/') + 1), ""); this.unshiftEventQueue("cd", parent, true); this.removeRecursiveHelper(remotePath); } else { // delete a file this.unshiftEventQueue("rm", remotePath.substring(remotePath.lastIndexOf('/') + 1), ""); this.unshiftEventQueue("cd", parent, true); } } }, removeRecursiveHelper : function(remotePath) { var self = this; var listCallback = function() { self.removeRecursive(remotePath); }; this.list(remotePath, listCallback, true, true); }, rename : function(oldName, newName, callback, isDir) { if (isDir) { this.removeCacheEntry(oldName); } oldName = oldName.replace(/\[/g, "\\[").replace(/\]/g, "\\]"); this.addEventQueue("mv", '"' + this.escapeSftp(oldName) + '" "' + this.escapeSftp(newName) + '"', callback); // rename the file this.writeControlWrapper(); }, changePermissions : function(permissions, path, callback) { path = path.replace(/\[/g, "\\[").replace(/\]/g, "\\]"); this.addEventQueue("cd", path.substring(0, path.lastIndexOf('/') ? path.lastIndexOf('/') : 1), true); this.addEventQueue("chmod", permissions + ' "' + this.escapeSftp(path.substring(path.lastIndexOf('/') + 1)) + '"', callback); this.writeControlWrapper(); }, custom : function(cmd) { this.addEventQueue("custom", cmd); this.writeControlWrapper(); }, list : function(path, callback, skipCache, recursive, fxp) { if (!skipCache && this.sessionsMode) { if (this.cacheHit(path, callback)) { return; } } if (recursive) { this.unshiftEventQueue( "ls", path, callback, ''); this.unshiftEventQueue( "cd", path, "", ''); } else { this.addEventQueue( "cd", path, "", ''); this.addEventQueue( "ls", path, callback, ''); } this.writeControlWrapper(); }, download : function(remotePath, localPath, remoteSize, resume, localSize, isSymlink, callback) { ++this.queueID; var id = this.connNo + "-" + this.queueID; this.addEventQueue("transferBegin", "", { id: id }); this.addEventQueue( "cd", remotePath.substring(0, remotePath.lastIndexOf('/') ? remotePath.lastIndexOf('/') : 1), true); var leafName = remotePath.substring(remotePath.lastIndexOf('/') + 1); this.addEventQueue(resume ? "reget" : "get", '"' + this.escapeSftp(leafName) + '" "' + this.escapeSftp(localPath.replace(/\x5c/g, "/")) + '"', localPath, callback); this.addEventQueue("transferEnd", "", { localPath: localPath, remotePath: remotePath, size: remoteSize, transport: 'sftp', type: 'download', ascii: "I", id: id }); this.writeControlWrapper(); }, upload : function(localPath, remotePath, resume, localSize, remoteSize, callback, disableMDTM) { ++this.queueID; var id = this.connNo + "-" + this.queueID; this.addEventQueue("transferBegin", "", { id: id }); this.addEventQueue( "cd", remotePath.substring(0, remotePath.lastIndexOf('/') ? remotePath.lastIndexOf('/') : 1), true); var leafName = remotePath.substring(remotePath.lastIndexOf('/') + 1); this.addEventQueue(resume ? "reput" : "put", '"' + this.escapeSftp(localPath.replace(/\x5c/g, "/")) + '" "' + this.escapeSftp(leafName) + '"', localPath, callback); this.addEventQueue("transferEnd", "", { localPath: localPath, remotePath: remotePath, size: localSize, transport: 'sftp', type: 'upload', ascii: "I", id: id }); this.writeControlWrapper(); return id; }, isListing : function() { // check queue to see if we're listing for (var x = 0; x < this.eventQueue.length; ++x) { if (this.eventQueue[x].cmd.indexOf("ls") != -1) { return true; } } return false; }, recoverFromDisaster : function() { // after connection lost, try to restart queue if (this.eventQueue.length && this.eventQueue[0].cmd == "goodbye") { this.eventQueue.shift(); } if (this.eventQueue.cmd) { this.eventQueue = new Array(this.eventQueue); } if (this.eventQueue.length && (this.eventQueue[0].cmd == "ls" || this.eventQueue[0].cmd == "get" || this.eventQueue[0].cmd == "reget" || this.eventQueue[0].cmd == "put" || this.eventQueue[0].cmd == "reput")) { var cmd = this.eventQueue[0].cmd; var parameter = this.eventQueue[0].parameter; cmd = this.eventQueue[0].cmd; if (cmd == "put") { // set up resuming for these poor interrupted transfers this.eventQueue[0].cmd = "reput"; } else if (cmd == "get") { this.eventQueue[0].cmd = "reget"; } } if (this.currentWorkingDir) { this.unshiftEventQueue("cd", this.currentWorkingDir, true); this.currentWorkingDir = ""; } this.trashQueue = new Array(); }, getExec : function() { if (this.getPlatform() == "windows") { var exec = Components.classes["@mozilla.org/file/directory_service;1"].createInstance(Components.interfaces.nsIProperties) .get("ProfD", Components.interfaces.nsILocalFile); exec.append("extensions"); exec.append("{a7c6cf7f-112c-4500-a7ea-39801a327e5f}"); exec.append("platform"); exec.append("WINNT_x86-msvc"); exec.append("psftp.exe"); return exec; } else if (this.getPlatform() == "linux") { var file = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile); file.initWithPath("/usr/bin/psftp"); return file; } else if (this.getPlatform() == "mac") { var file = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile); file.initWithPath("/opt/local/var/macports/software/putty"); if (!file.exists()) { return file; } var subdirs = []; var entries = file.directoryEntries; // find highest version number while (entries.hasMoreElements()) { subdirs.push(entries.getNext().QueryInterface(Components.interfaces.nsILocalFile)); } subdirs.sort(compareName); subdirs.reverse(); if (!subdirs.length) { return file; } file.append(subdirs[0].leafName); file.append("opt"); file.append("local"); file.append("bin"); file.append("psftp"); return file; } }, getPlatform : function() { var platform = navigator.platform.toLowerCase(); if (platform.indexOf('linux') != -1) { return 'linux'; } if (platform.indexOf('mac') != -1) { return 'mac'; } return 'windows'; } }; ================================================ FILE: modules/handlersManager.jsm ================================================ var EXPORTED_SYMBOLS = ["HandlersManager"]; var HandlersManager = { mHandlers: {}, addHandler: function(aName, aHandler, aXulEltId, aDoc) { this.mHandlers[aName] = { handler: aHandler, xulElt: aDoc.getElementById(aXulEltId) }; }, hideAllHandlers: function() { for (var handler in this.mHandlers) { var handler = this.mHandlers[handler]; var elt = handler.xulElt; if (elt) { elt.checked = false; handler.handler.toggle(elt); } } } }; ================================================ FILE: modules/l10nHelper.jsm ================================================ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is BlueGriffon. * * The Initial Developer of the Original Code is * Disruptive Innovations SARL. * Portions created by the Initial Developer are Copyright (C) 2006 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Daniel Glazman , Original author * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ var EXPORTED_SYMBOLS = ["L10NUtils"]; var L10NUtils = { /********** CONSTANTS **********/ kBLUEGRIFFON_PROPERTIES: "chrome://bluegriffon/locale/bluegriffon.properties", /********** ATTRIBUTES **********/ mStringBundleService: null, mStringBundle: null, /********** PRIVATE **********/ _getStringBundleService: function _getStringBundleService() { if (!this.mStringBundleService) { try { this.mStringBundleService = Components.classes["@mozilla.org/intl/stringbundle;1"] .getService(Components.interfaces.nsIStringBundleService); } catch (e) { } } return this.mStringBundleService; }, _getBundleFromURL: function _getBundleFromURL(aProperties) { var stringBundle; if (this._getStringBundleService()) try { stringBundle = this.mStringBundleService.createBundle(aProperties); } catch (e) { } return stringBundle; }, /********** PUBLIC **********/ getStringFromBundle: function getStringFromBundle(aBundle, aName) { if (aBundle) { try { return aBundle.GetStringFromName(aName); } catch (e) { } } return null; }, getString: function getString(aName) { return this.getStringFromBundle(this.getBundle(), aName); }, getStringFromURL: function getStringFromURL(aName, aProperties) { var stringBundle; try { stringBundle = this._getBundleFromURL(aProperties); } catch (e) { } return this.getStringFromBundle(stringBundle, aName); }, getBundle: function getBundle() { if (!this.mStringBundle) try { this.mStringBundle = this._getBundleFromURL(this.kBLUEGRIFFON_PROPERTIES); } catch (e) { } return this.mStringBundle; }, convertStringToUTF8: function(aStr) { var utf8Converter = Components.classes["@mozilla.org/intl/utf8converterservice;1"]. getService(Components.interfaces.nsIUTF8ConverterService); try { return utf8Converter.convertStringToUTF8(aStr, "utf-8", false); } catch(e) { return null; } } }; ================================================ FILE: modules/moz.build ================================================ EXTRA_JS_MODULES += [ 'bgQuit.jsm', 'colourPickerHelper.jsm', 'cssHelper.jsm', 'cssInspector.jsm', 'cssProperties.jsm', 'editorHelper.jsm', 'fileChanges.jsm', 'fileHelper.jsm', 'filePicker.jsm', 'fireFtp.jsm', 'handlersManager.jsm', 'l10nHelper.jsm', 'printHelper.jsm', 'projectManager.jsm', 'prompterHelper.jsm', 'urlHelper.jsm', ] EXTRA_PP_JS_MODULES += [ 'screens.jsm', ] if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('windows', 'gtk2', 'gtk3'): EXTRA_JS_MODULES += [ 'unicodeHelper.jsm', ] ================================================ FILE: modules/printHelper.jsm ================================================ /* ***** BEGIN LICENSE BLOCK ***** * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * The Original Code is Mozilla's printUtils.js * * Contributor(s): * EVENTRIC LLC. * * ***** END LICENSE BLOCK ***** */ Components.utils.import("resource://gre/modules/Services.jsm"); var EXPORTED_SYMBOLS = ["PrintHelper"]; var gPrintSettingsAreGlobal = false; var gSavePrintSettings = false; var PrintHelper = { showPageSetup: function (aWindow) { try { var printSettings = this.getPrintSettings(); var PRINTPROMPTSVC = Components.classes["@mozilla.org/embedcomp/printingprompt-service;1"] .getService(Components.interfaces.nsIPrintingPromptService); PRINTPROMPTSVC.showPageSetup(aWindow, printSettings, null); if (gSavePrintSettings) { // Page Setup data is a "native" setting on the Mac var PSSVC = Components.classes["@mozilla.org/gfx/printsettings-service;1"] .getService(Components.interfaces.nsIPrintSettingsService); PSSVC.savePrintSettingsToPrefs(printSettings, true, printSettings.kInitSaveNativeData); } } catch (e) { // Pressing cancel is expressed as an NS_ERROR_ABORT return value, // causing an exception to be thrown which we catch here. // Unfortunately this will also consume helpful failures, so add a // dump("print: "+e+"\n"); // if you need to debug return false; } return true; }, print: function (aWindow) { var webBrowserPrint = this.getWebBrowserPrint(aWindow); var printSettings = this.getPrintSettings(); try { webBrowserPrint.print(printSettings, null); if (gPrintSettingsAreGlobal && gSavePrintSettings) { var PSSVC = Components.classes["@mozilla.org/gfx/printsettings-service;1"] .getService(Components.interfaces.nsIPrintSettingsService); PSSVC.savePrintSettingsToPrefs(printSettings, true, printSettings.kInitSaveAll); PSSVC.savePrintSettingsToPrefs(printSettings, false, printSettings.kInitSavePrinterName); } } catch (e) { // Pressing cancel is expressed as an NS_ERROR_ABORT return value, // causing an exception to be thrown which we catch here. // Unfortunately this will also consume helpful failures, so add a // dump("print: "+e+"\n"); // if you need to debug } }, getWebBrowserPrint: function (aWindow) { var contentWindow = aWindow || aWindow.content; return contentWindow.QueryInterface(Components.interfaces.nsIInterfaceRequestor) .getInterface(Components.interfaces.nsIWebBrowserPrint); }, getPrintSettings: function () { var pref = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch); if (pref) { gPrintSettingsAreGlobal = pref.getBoolPref("print.use_global_printsettings", false); gSavePrintSettings = pref.getBoolPref("print.save_print_settings", false); } var printSettings; try { var PSSVC = Components.classes["@mozilla.org/gfx/printsettings-service;1"] .getService(Components.interfaces.nsIPrintSettingsService); if (gPrintSettingsAreGlobal) { printSettings = PSSVC.globalPrintSettings; this.setPrinterDefaultsForSelectedPrinter(PSSVC, printSettings); } else { printSettings = PSSVC.newPrintSettings; } } catch (e) { dump("getPrintSettings: "+e+"\n"); } return printSettings; } }; ================================================ FILE: modules/projectManager.jsm ================================================ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is BlueGriffon. * * The Initial Developer of the Original Code is * Disruptive Innovations SARL. * Portions created by the Initial Developer are Copyright (C) 2006 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Daniel Glazman , Original author * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ Components.utils.import("resource://gre/modules/fireFtp.jsm"); var EXPORTED_SYMBOLS = ["ProjectManager"]; var ProjectManager = { projects: {}, getDBConn: function() { var file = Components.classes["@mozilla.org/file/directory_service;1"] .getService(Components.interfaces.nsIProperties) .get("ProfD", Components.interfaces.nsIFile); file.append("webprojects.sqlite"); var storageService = Components.classes["@mozilla.org/storage/service;1"] .getService(Components.interfaces.mozIStorageService); return storageService.openDatabase(file); }, init: function() { var mDBConn = this.getDBConn(); mDBConn.executeSimpleSQL("CREATE TABLE IF NOT EXISTS 'projects' ( \ 'name' VARCHAR PRIMARY KEY NOT NULL, \ 'storageChoice' VARCHAR NOT NULL, \ 'hostname' VARCHAR NOT NULL, \ 'rootpath' VARCHAR NOT NULL, \ 'user' VARCHAR NOT NULL, \ 'passiveMode' VARCHAR NOT NULL, \ 'ipv6Mode' VARCHAR NOT NULL, \ 'port' VARCHAR NOT NULL, \ 'localStoreHome' VARCHAR NOT NULL, \ 'exclusions' VARCHAR NOT NULL, \ 'timeShift' VARCHAR NOT NULL)"); mDBConn.close(); this.loadProjects(); }, loadProjects: function() { this.projects = {}; var dbConn = this.getDBConn(); var statement = dbConn.createStatement("SELECT * FROM 'projects'"); while (statement.executeStep()) { var name = statement.getString(0); var storageChoice = statement.getString(1); var hostname = statement.getString(2); var rootpath = statement.getString(3); var user = statement.getString(4); var passiveMode = statement.getString(5); var ipv6Mode = statement.getString(6); var port = statement.getString(7); var localStoreHome = statement.getString(8) var exclusions = statement.getString(9); var timeShift = statement.getString(10); this.projects[name] = { storageChoice: storageChoice, hostname: hostname, rootpath: rootpath, user: user, passiveMode: passiveMode, ipv6Mode: ipv6Mode, port: port, localStoreHome: localStoreHome, exclusions: exclusions, timeShift: timeShift }; } statement.finalize(); dbConn.close(); }, deleteProject: function(aName) { if (aName in this.projects) { // sanity check var dbConn = this.getDBConn(); var statement = dbConn.createStatement("DELETE FROM 'projects' WHERE name=?1"); statement.bindUTF8StringParameter(0, aName); statement.execute(); statement.finalize(); dbConn.close(); delete this.projects[aName]; } }, addProject: function(name, storageChoice, hostname, rootpath, user, passiveMode, ipv6Mode, port, localStoreHome, exclusions, timeShift) { if (!(name in this.projects)) { // sanity check var dbConn = this.getDBConn(); var statement = dbConn.createStatement("INSERT INTO 'projects' ('name', 'storageChoice', 'hostname', 'rootpath', 'user', 'passiveMode', 'ipv6Mode', 'port', 'localStoreHome', 'exclusions', 'timeShift') VALUES(?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11)"); statement.bindUTF8StringParameter(0, name); statement.bindUTF8StringParameter(1, storageChoice); statement.bindUTF8StringParameter(2, hostname); statement.bindUTF8StringParameter(3, rootpath); statement.bindUTF8StringParameter(4, user); statement.bindUTF8StringParameter(5, passiveMode); statement.bindUTF8StringParameter(6, ipv6Mode); statement.bindUTF8StringParameter(7, port); statement.bindUTF8StringParameter(8, localStoreHome); statement.bindUTF8StringParameter(9, exclusions); statement.bindUTF8StringParameter(10, timeShift); statement.execute(); statement.finalize(); dbConn.close(); this.projects[name] = { storageChoice: storageChoice, hostname: hostname, rootpath: rootpath, user: user, passiveMode: passiveMode, ipv6Mode: ipv6Mode, port: port, localStoreHome: localStoreHome, exclusions: exclusions, timeShift: timeShift }; } }, modifyProject: function(name, storageChoice, hostname, rootpath, user, passiveMode, ipv6Mode, port, localStoreHome, exclusions, timeShift) { if ((name in this.projects)) { // sanity check var dbConn = this.getDBConn(); var statement = dbConn.createStatement("UPDATE 'projects' SET \ storageChoice=?2,\ hostname=?3,\ rootpath=?4,\ user=?5,\ passiveMode=?6,\ ipv6Mode=?7,\ port=?8,\ localStoreHome=?9,\ exclusions=?10,\ timeShift=?11 WHERE name=?1"); statement.bindUTF8StringParameter(0, name); statement.bindUTF8StringParameter(1, storageChoice); statement.bindUTF8StringParameter(2, hostname); statement.bindUTF8StringParameter(3, rootpath); statement.bindUTF8StringParameter(4, user); statement.bindUTF8StringParameter(5, passiveMode); statement.bindUTF8StringParameter(6, ipv6Mode); statement.bindUTF8StringParameter(7, port); statement.bindUTF8StringParameter(8, localStoreHome); statement.bindUTF8StringParameter(9, exclusions); statement.bindUTF8StringParameter(10, timeShift); statement.execute(); statement.finalize(); dbConn.close(); this.projects[name] = { storageChoice: storageChoice, hostname: hostname, rootpath: rootpath, user: user, passiveMode: passiveMode, ipv6Mode: ipv6Mode, port: port, localStoreHome: localStoreHome, exclusions: exclusions, timeShift: timeShift }; } }, isExistingProject: function(aName) { return (aName in this.projects); } }; ================================================ FILE: modules/prompterHelper.jsm ================================================ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is BlueGriffon. * * The Initial Developer of the Original Code is * Disruptive Innovations SARL. * Portions created by the Initial Developer are Copyright (C) 2006 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Daniel Glazman , Original author * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ Components.utils.import("resource://gre/modules/editorHelper.jsm"); var EXPORTED_SYMBOLS = ["PromptUtils"]; var PromptUtils = { /********** ATTRIBUTES **********/ mPromptService: null, /********** PRIVATE **********/ _getPromptService: function() { if (!this.mPromptService) { try { this.mPromptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"] .getService(Components.interfaces.nsIPromptService); } catch(e) { } } return this.mPromptService; }, /********** PUBLIC **********/ alertWithTitle: function (aTitle, aMsg, aParentWindow) { var parentWindow = aParentWindow ? aParentWindow : EditorUtils.getCurrentEditorWindow(); if (this._getPromptService()) { if (!aTitle) aTitle = L10NUtils.getString("Alert"); this.mPromptService.alert(parentWindow, aTitle, aMsg); } }, confirmWithTitle: function (aTitle, aMsg, aOkBtnText, aCancelBtnText, aExtraButtonText) { const nsIPromptService = Components.interfaces.nsIPromptService; var promptService = this._getPromptService(); if (promptService) { var okFlag = aOkBtnText ? nsIPromptService.BUTTON_TITLE_IS_STRING : nsIPromptService.BUTTON_TITLE_OK; var cancelFlag = aCancelBtnText ? nsIPromptService.BUTTON_TITLE_IS_STRING : nsIPromptService.BUTTON_TITLE_CANCEL; var extraFlag = aExtraButtonText ? nsIPromptService.BUTTON_TITLE_IS_STRING : 0; return promptService.confirmEx(EditorUtils.getCurrentEditorWindow(), aTitle, aMsg, (okFlag * nsIPromptService.BUTTON_POS_0) + (cancelFlag * nsIPromptService.BUTTON_POS_1) + (extraFlag * nsIPromptService.BUTTON_POS_2) + nsIPromptService.BUTTON_POS_0_DEFAULT, aOkBtnText, aCancelBtnText, aExtraButtonText, null, {value:0}); } return false; }, confirm: function(aTitle, aMsg, aWindow) { var promptService = this._getPromptService(); if (promptService) { return promptService.confirm(aWindow ? aWindow : EditorUtils.getCurrentEditorWindow(), aTitle, aMsg) } return false; }, alertCheck: function(aParent, aDialogTitle, aText, aCheckMsg, aCheckState) { var promptService = this._getPromptService(); if (promptService) { try { var rv = promptService.alertCheck(aParent ? aParent : EditorUtils.getCurrentEditorWindow(), aDialogTitle, aText, aCheckMsg, aCheckState); return rv; } catch(e) { promptService.alert(aParent, "", e); } } return false; }, prompt: function(window, captionStr, msgStr, result) { return this._getPromptService().prompt(window, captionStr, msgStr, result, null, {value:0}); } }; ================================================ FILE: modules/screens.jsm ================================================ Components.utils.import("resource://gre/modules/Services.jsm"); var EXPORTED_SYMBOLS = ["ScreenUtils"]; var ScreenUtils = { mScreenManager: null, alignPanelsForWindow: function(aWindow) { var doc = aWindow.document; var x = aWindow.screenX; var y = aWindow.screenY; var w = aWindow.outerWidth; var h = aWindow.outerHeight; var panels = doc.querySelectorAll('panel[floating="true"][open="true"]'); // edge case, we have only one monitor and the window uses // the whole screen width ; move panels to the right if (this.screenManager.numberOfScreens == 1 && w == aWindow.screen.availWidth) { for (var i = 0; i < panels.length; i++) { var p = panels[i]; p.sizeTo(panels[0].boxObject.width, h / panels.length - 5); p.moveTo(w - p.boxObject.width, y + (h * i / panels.length)); } return; } // first order the panels var leftPanels = []; var rightPanels = []; for (var i = 0; i < panels.length; i++) { var p = panels[i]; if (p.boxObject.screenX < x && p.boxObject.width <= x) leftPanels.push({ panel: p, x: p.boxObject.screenX, w: p.boxObject.width }); else rightPanels.push({ panel: p, x: p.boxObject.screenX, w: p.boxObject.width }); } // ********* RIGHT PANELS ********* // sort the right panels by x order function compareRightPanels(a, b) { if (a.x < b.x) return -1; if (a.x > b.x) return +1; return 0; } rightPanels.sort(compareRightPanels); // aggregate the right panels var originX = x + w + 5; for (var i = 0; i < rightPanels.length; i++) { if (0 < i && rightPanels[i].x >= rightPanels[i-1].x && rightPanels[i].x <= rightPanels[i-1].x + rightPanels[i-1].w) { rightPanels[i].newx = rightPanels[i-1].newx; rightPanels[i].source = rightPanels[i-1].source; rightPanels[i].weight = rightPanels[i-1].weight + 1; rightPanels[rightPanels[i-1].source].flex++; rightPanels[rightPanels[i].source].maxWidth = Math.max(rightPanels[i].w, rightPanels[rightPanels[i].source].maxWidth); } else { if (0 < i) originX += rightPanels[rightPanels[i-1].source].maxWidth + 5; rightPanels[i].source = i; rightPanels[i].weight = 1; rightPanels[i].flex = 1; rightPanels[i].maxWidth = rightPanels[i].w; rightPanels[i].newx = originX; } } for (var i = 0; i < rightPanels.length; i++) { rightPanels[i].h = h / rightPanels[rightPanels[i].source].flex; rightPanels[i].y = y + rightPanels[i].h * (rightPanels[i].weight - 1); rightPanels[i].panel.sizeTo(rightPanels[rightPanels[i].source].maxWidth, rightPanels[i].h - 5); } // we need to reposition using a timeout because the sizeTo are still flushing function postRightAlignment() { var delta = 0; for (var i = 0; i < rightPanels.length; i++) { delta += ScreenUtils.CheckAvailableSpace(rightPanels[rightPanels[i].source].newx, rightPanels[rightPanels[i].source].maxWidth); rightPanels[i].panel.moveTo(rightPanels[rightPanels[i].source].newx + delta, rightPanels[i].y); } } var timer = Components.classes["@mozilla.org/timer;1"] .createInstance(Components.interfaces.nsITimer); timer.initWithCallback(postRightAlignment, 100, Components.interfaces.nsITimer.TYPE_ONE_SHOT); // ********* LEFT PANELS ********* // sort the left panels by decreasing x order function compareLeftPanels(a, b) { if (a.x < b.x) return +1; if (a.x > b.x) return -1; return 0; } leftPanels.sort(compareLeftPanels); // aggregate the left panels var originX = x - 5; for (var i = 0; i < leftPanels.length; i++) { if (0 < i && leftPanels[i-1].x >= leftPanels[i].x && leftPanels[i-1].x <= leftPanels[i].x + leftPanels[i].w) { leftPanels[i].newx = leftPanels[i-1].newx; leftPanels[i].source = leftPanels[i-1].source; leftPanels[i].weight = leftPanels[i-1].weight + 1; leftPanels[leftPanels[i-1].source].flex++; leftPanels[leftPanels[i].source].maxWidth = Math.max(leftPanels[i].w, leftPanels[leftPanels[i].source].maxWidth); } else { if (0 < i) originX -= leftPanels[leftPanels[i-1].source].maxWidth + 5; leftPanels[i].source = i; leftPanels[i].weight = 1; leftPanels[i].flex = 1; leftPanels[i].maxWidth = leftPanels[i].w; leftPanels[i].newx = originX; } } for (var i = 0; i < leftPanels.length; i++) { leftPanels[i].h = h / leftPanels[leftPanels[i].source].flex; leftPanels[i].y = y + leftPanels[i].h * (leftPanels[i].weight - 1); leftPanels[i].panel.sizeTo(leftPanels[leftPanels[i].source].maxWidth, leftPanels[i].h - 5); } // we need to reposition using a timeout because the sizeTo are still flushing function postLeftAlignment() { var delta = 0; for (var i = 0; i < leftPanels.length; i++) { delta += ScreenUtils.CheckAvailableSpace(leftPanels[leftPanels[i].source].newx, leftPanels[leftPanels[i].source].maxWidth, true); leftPanels[i].panel.moveTo(leftPanels[leftPanels[i].source].newx - delta - leftPanels[leftPanels[i].source].maxWidth, leftPanels[i].y); } } var timer = Components.classes["@mozilla.org/timer;1"] .createInstance(Components.interfaces.nsITimer); timer.initWithCallback(postLeftAlignment, 100, Components.interfaces.nsITimer.TYPE_ONE_SHOT); }, CheckAvailableSpace: function(x, w, aAtBeginningOfScreen) { var screens = this.screens; for (var i = 0 ; i < screens.length; i++) { var s = screens[i]; if (x >= s.min && x < s.max) { if (!aAtBeginningOfScreen && s.max - x < w) return s.max - x; if (aAtBeginningOfScreen && w > x - s.min) return x - s.min; } } return 0; }, get screenManager() { if (this.mScreenManager) return this.mScreenManager; this.mScreenManager = Components.classes["@mozilla.org/gfx/screenmanager;1"] .getService(Components.interfaces.nsIScreenManager); return this.mScreenManager; }, get numberOfScreens() { #ifdef XP_MACOSX return this.mScreenManager.numberOfScreens; #else return 1; #endif }, get screens() { var screens = []; var min = 0; var screenManager = this.screenManager; var numberOfScreens = screenManager.numberOfScreens; for (var i = 0; i < numberOfScreens; i++) { var screen = screenManager.screenForIndex(i); var left = {}, top = {}, width = {}, height = {}; screen.GetRectDisplayPix(left, top, width, height); screens.push( { width: width.value, height: height.value, min: left.value, max: (left.value + width.value), factor: screen.contentsScaleFactor, id: screen.id} ); } screens.sort(function(a,b) { if (a.min < b.min) return -1; if (a.min > b.min) return 1; return 0; }); var realMin = 0; for (var i = 0; i < screens.length; i++) { var s = screens[i]; s.realMin = realMin; realMin += s.width; s.realMax = realMin; } screens.sort(function(a,b) { if (a.id < b.id) return -1; if (a.id > b.id) return 1; return 0; }); return screens; }, get availableWidth() { var screens = this.screens; var w = 0; for (var i = 0; i < screens.length; i++) s += screens[i].width; return s; } }; ================================================ FILE: modules/unicodeHelper.jsm ================================================ var EXPORTED_SYMBOLS = ["UnicodeUtils"]; var UnicodeUtils = { mNamesList: { 0x0000: "", 0x0001: "", 0x0002: "", 0x0003: "", 0x0004: "", 0x0005: "", 0x0006: "", 0x0007: "", 0x0008: "", 0x0009: "", 0x000A: "", 0x000B: "", 0x000C: "", 0x000D: "", 0x000E: "", 0x000F: "", 0x0010: "", 0x0011: "", 0x0012: "", 0x0013: "", 0x0014: "", 0x0015: "", 0x0016: "", 0x0017: "", 0x0018: "", 0x0019: "", 0x001A: "", 0x001B: "", 0x001C: "", 0x001D: "", 0x001E: "", 0x001F: "", 0x0020: "SPACE", 0x0021: "EXCLAMATION MARK", 0x0022: "QUOTATION MARK", 0x0023: "NUMBER SIGN", 0x0024: "DOLLAR SIGN", 0x0025: "PERCENT SIGN", 0x0026: "AMPERSAND", 0x0027: "APOSTROPHE", 0x0028: "LEFT PARENTHESIS", 0x0029: "RIGHT PARENTHESIS", 0x002A: "ASTERISK", 0x002B: "PLUS SIGN", 0x002C: "COMMA", 0x002D: "HYPHEN-MINUS", 0x002E: "FULL STOP", 0x002F: "SOLIDUS", 0x0030: "DIGIT ZERO", 0x0031: "DIGIT ONE", 0x0032: "DIGIT TWO", 0x0033: "DIGIT THREE", 0x0034: "DIGIT FOUR", 0x0035: "DIGIT FIVE", 0x0036: "DIGIT SIX", 0x0037: "DIGIT SEVEN", 0x0038: "DIGIT EIGHT", 0x0039: "DIGIT NINE", 0x003A: "COLON", 0x003B: "SEMICOLON", 0x003C: "LESS-THAN SIGN", 0x003D: "EQUALS SIGN", 0x003E: "GREATER-THAN SIGN", 0x003F: "QUESTION MARK", 0x0040: "COMMERCIAL AT", 0x0041: "LATIN CAPITAL LETTER A", 0x0042: "LATIN CAPITAL LETTER B", 0x0043: "LATIN CAPITAL LETTER C", 0x0044: "LATIN CAPITAL LETTER D", 0x0045: "LATIN CAPITAL LETTER E", 0x0046: "LATIN CAPITAL LETTER F", 0x0047: "LATIN CAPITAL LETTER G", 0x0048: "LATIN CAPITAL LETTER H", 0x0049: "LATIN CAPITAL LETTER I", 0x004A: "LATIN CAPITAL LETTER J", 0x004B: "LATIN CAPITAL LETTER K", 0x004C: "LATIN CAPITAL LETTER L", 0x004D: "LATIN CAPITAL LETTER M", 0x004E: "LATIN CAPITAL LETTER N", 0x004F: "LATIN CAPITAL LETTER O", 0x0050: "LATIN CAPITAL LETTER P", 0x0051: "LATIN CAPITAL LETTER Q", 0x0052: "LATIN CAPITAL LETTER R", 0x0053: "LATIN CAPITAL LETTER S", 0x0054: "LATIN CAPITAL LETTER T", 0x0055: "LATIN CAPITAL LETTER U", 0x0056: "LATIN CAPITAL LETTER V", 0x0057: "LATIN CAPITAL LETTER W", 0x0058: "LATIN CAPITAL LETTER X", 0x0059: "LATIN CAPITAL LETTER Y", 0x005A: "LATIN CAPITAL LETTER Z", 0x005B: "LEFT SQUARE BRACKET", 0x005C: "REVERSE SOLIDUS", 0x005D: "RIGHT SQUARE BRACKET", 0x005E: "CIRCUMFLEX ACCENT", 0x005F: "LOW LINE", 0x0060: "GRAVE ACCENT", 0x0061: "LATIN SMALL LETTER A", 0x0062: "LATIN SMALL LETTER B", 0x0063: "LATIN SMALL LETTER C", 0x0064: "LATIN SMALL LETTER D", 0x0065: "LATIN SMALL LETTER E", 0x0066: "LATIN SMALL LETTER F", 0x0067: "LATIN SMALL LETTER G", 0x0068: "LATIN SMALL LETTER H", 0x0069: "LATIN SMALL LETTER I", 0x006A: "LATIN SMALL LETTER J", 0x006B: "LATIN SMALL LETTER K", 0x006C: "LATIN SMALL LETTER L", 0x006D: "LATIN SMALL LETTER M", 0x006E: "LATIN SMALL LETTER N", 0x006F: "LATIN SMALL LETTER O", 0x0070: "LATIN SMALL LETTER P", 0x0071: "LATIN SMALL LETTER Q", 0x0072: "LATIN SMALL LETTER R", 0x0073: "LATIN SMALL LETTER S", 0x0074: "LATIN SMALL LETTER T", 0x0075: "LATIN SMALL LETTER U", 0x0076: "LATIN SMALL LETTER V", 0x0077: "LATIN SMALL LETTER W", 0x0078: "LATIN SMALL LETTER X", 0x0079: "LATIN SMALL LETTER Y", 0x007A: "LATIN SMALL LETTER Z", 0x007B: "LEFT CURLY BRACKET", 0x007C: "VERTICAL LINE", 0x007D: "RIGHT CURLY BRACKET", 0x007E: "TILDE", 0x007F: "", 0x0080: "", 0x0081: "", 0x0082: "", 0x0083: "", 0x0084: "", 0x0085: "", 0x0086: "", 0x0087: "", 0x0088: "", 0x0089: "", 0x008A: "", 0x008B: "", 0x008C: "", 0x008D: "", 0x008E: "", 0x008F: "", 0x0090: "", 0x0091: "", 0x0092: "", 0x0093: "", 0x0094: "", 0x0095: "", 0x0096: "", 0x0097: "", 0x0098: "", 0x0099: "", 0x009A: "", 0x009B: "", 0x009C: "", 0x009D: "", 0x009E: "", 0x009F: "", 0x00A0: "NO-BREAK SPACE", 0x00A1: "INVERTED EXCLAMATION MARK", 0x00A2: "CENT SIGN", 0x00A3: "POUND SIGN", 0x00A4: "CURRENCY SIGN", 0x00A5: "YEN SIGN", 0x00A6: "BROKEN BAR", 0x00A7: "SECTION SIGN", 0x00A8: "DIAERESIS", 0x00A9: "COPYRIGHT SIGN", 0x00AA: "FEMININE ORDINAL INDICATOR", 0x00AB: "LEFT-POINTING DOUBLE ANGLE QUOTATION MARK *", 0x00AC: "NOT SIGN", 0x00AD: "SOFT HYPHEN", 0x00AE: "REGISTERED SIGN", 0x00AF: "MACRON", 0x00B0: "DEGREE SIGN", 0x00B1: "PLUS-MINUS SIGN", 0x00B2: "SUPERSCRIPT TWO", 0x00B3: "SUPERSCRIPT THREE", 0x00B4: "ACUTE ACCENT", 0x00B5: "MICRO SIGN", 0x00B6: "PILCROW SIGN", 0x00B7: "MIDDLE DOT", 0x00B8: "CEDILLA", 0x00B9: "SUPERSCRIPT ONE", 0x00BA: "MASCULINE ORDINAL INDICATOR", 0x00BB: "RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK *", 0x00BC: "VULGAR FRACTION ONE QUARTER", 0x00BD: "VULGAR FRACTION ONE HALF", 0x00BE: "VULGAR FRACTION THREE QUARTERS", 0x00BF: "INVERTED QUESTION MARK", 0x00C0: "LATIN CAPITAL LETTER A WITH GRAVE", 0x00C1: "LATIN CAPITAL LETTER A WITH ACUTE", 0x00C2: "LATIN CAPITAL LETTER A WITH CIRCUMFLEX", 0x00C3: "LATIN CAPITAL LETTER A WITH TILDE", 0x00C4: "LATIN CAPITAL LETTER A WITH DIAERESIS", 0x00C5: "LATIN CAPITAL LETTER A WITH RING ABOVE", 0x00C6: "LATIN CAPITAL LETTER AE (ash) *", 0x00C7: "LATIN CAPITAL LETTER C WITH CEDILLA", 0x00C8: "LATIN CAPITAL LETTER E WITH GRAVE", 0x00C9: "LATIN CAPITAL LETTER E WITH ACUTE", 0x00CA: "LATIN CAPITAL LETTER E WITH CIRCUMFLEX", 0x00CB: "LATIN CAPITAL LETTER E WITH DIAERESIS", 0x00CC: "LATIN CAPITAL LETTER I WITH GRAVE", 0x00CD: "LATIN CAPITAL LETTER I WITH ACUTE", 0x00CE: "LATIN CAPITAL LETTER I WITH CIRCUMFLEX", 0x00CF: "LATIN CAPITAL LETTER I WITH DIAERESIS", 0x00D0: "LATIN CAPITAL LETTER ETH (Icelandic)", 0x00D1: "LATIN CAPITAL LETTER N WITH TILDE", 0x00D2: "LATIN CAPITAL LETTER O WITH GRAVE", 0x00D3: "LATIN CAPITAL LETTER O WITH ACUTE", 0x00D4: "LATIN CAPITAL LETTER O WITH CIRCUMFLEX", 0x00D5: "LATIN CAPITAL LETTER O WITH TILDE", 0x00D6: "LATIN CAPITAL LETTER O WITH DIAERESIS", 0x00D7: "MULTIPLICATION SIGN", 0x00D8: "LATIN CAPITAL LETTER O WITH STROKE", 0x00D9: "LATIN CAPITAL LETTER U WITH GRAVE", 0x00DA: "LATIN CAPITAL LETTER U WITH ACUTE", 0x00DB: "LATIN CAPITAL LETTER U WITH CIRCUMFLEX", 0x00DC: "LATIN CAPITAL LETTER U WITH DIAERESIS", 0x00DD: "LATIN CAPITAL LETTER Y WITH ACUTE", 0x00DE: "LATIN CAPITAL LETTER THORN (Icelandic)", 0x00DF: "LATIN SMALL LETTER SHARP S (German)", 0x00E0: "LATIN SMALL LETTER A WITH GRAVE", 0x00E1: "LATIN SMALL LETTER A WITH ACUTE", 0x00E2: "LATIN SMALL LETTER A WITH CIRCUMFLEX", 0x00E3: "LATIN SMALL LETTER A WITH TILDE", 0x00E4: "LATIN SMALL LETTER A WITH DIAERESIS", 0x00E5: "LATIN SMALL LETTER A WITH RING ABOVE", 0x00E6: "LATIN SMALL LETTER AE (ash) *", 0x00E7: "LATIN SMALL LETTER C WITH CEDILLA", 0x00E8: "LATIN SMALL LETTER E WITH GRAVE", 0x00E9: "LATIN SMALL LETTER E WITH ACUTE", 0x00EA: "LATIN SMALL LETTER E WITH CIRCUMFLEX", 0x00EB: "LATIN SMALL LETTER E WITH DIAERESIS", 0x00EC: "LATIN SMALL LETTER I WITH GRAVE", 0x00ED: "LATIN SMALL LETTER I WITH ACUTE", 0x00EE: "LATIN SMALL LETTER I WITH CIRCUMFLEX", 0x00EF: "LATIN SMALL LETTER I WITH DIAERESIS", 0x00F0: "LATIN SMALL LETTER ETH (Icelandic)", 0x00F1: "LATIN SMALL LETTER N WITH TILDE", 0x00F2: "LATIN SMALL LETTER O WITH GRAVE", 0x00F3: "LATIN SMALL LETTER O WITH ACUTE", 0x00F4: "LATIN SMALL LETTER O WITH CIRCUMFLEX", 0x00F5: "LATIN SMALL LETTER O WITH TILDE", 0x00F6: "LATIN SMALL LETTER O WITH DIAERESIS", 0x00F7: "DIVISION SIGN", 0x00F8: "LATIN SMALL LETTER O WITH STROKE", 0x00F9: "LATIN SMALL LETTER U WITH GRAVE", 0x00FA: "LATIN SMALL LETTER U WITH ACUTE", 0x00FB: "LATIN SMALL LETTER U WITH CIRCUMFLEX", 0x00FC: "LATIN SMALL LETTER U WITH DIAERESIS", 0x00FD: "LATIN SMALL LETTER Y WITH ACUTE", 0x00FE: "LATIN SMALL LETTER THORN (Icelandic)", 0x00FF: "LATIN SMALL LETTER Y WITH DIAERESIS", 0x0100: "LATIN CAPITAL LETTER A WITH MACRON", 0x0101: "LATIN SMALL LETTER A WITH MACRON", 0x0102: "LATIN CAPITAL LETTER A WITH BREVE", 0x0103: "LATIN SMALL LETTER A WITH BREVE", 0x0104: "LATIN CAPITAL LETTER A WITH OGONEK", 0x0105: "LATIN SMALL LETTER A WITH OGONEK", 0x0106: "LATIN CAPITAL LETTER C WITH ACUTE", 0x0107: "LATIN SMALL LETTER C WITH ACUTE", 0x0108: "LATIN CAPITAL LETTER C WITH CIRCUMFLEX", 0x0109: "LATIN SMALL LETTER C WITH CIRCUMFLEX", 0x010A: "LATIN CAPITAL LETTER C WITH DOT ABOVE", 0x010B: "LATIN SMALL LETTER C WITH DOT ABOVE", 0x010C: "LATIN CAPITAL LETTER C WITH CARON", 0x010D: "LATIN SMALL LETTER C WITH CARON", 0x010E: "LATIN CAPITAL LETTER D WITH CARON", 0x010F: "LATIN SMALL LETTER D WITH CARON", 0x0110: "LATIN CAPITAL LETTER D WITH STROKE", 0x0111: "LATIN SMALL LETTER D WITH STROKE", 0x0112: "LATIN CAPITAL LETTER E WITH MACRON", 0x0113: "LATIN SMALL LETTER E WITH MACRON", 0x0114: "LATIN CAPITAL LETTER E WITH BREVE", 0x0115: "LATIN SMALL LETTER E WITH BREVE", 0x0116: "LATIN CAPITAL LETTER E WITH DOT ABOVE", 0x0117: "LATIN SMALL LETTER E WITH DOT ABOVE", 0x0118: "LATIN CAPITAL LETTER E WITH OGONEK", 0x0119: "LATIN SMALL LETTER E WITH OGONEK", 0x011A: "LATIN CAPITAL LETTER E WITH CARON", 0x011B: "LATIN SMALL LETTER E WITH CARON", 0x011C: "LATIN CAPITAL LETTER G WITH CIRCUMFLEX", 0x011D: "LATIN SMALL LETTER G WITH CIRCUMFLEX", 0x011E: "LATIN CAPITAL LETTER G WITH BREVE", 0x011F: "LATIN SMALL LETTER G WITH BREVE", 0x0120: "LATIN CAPITAL LETTER G WITH DOT ABOVE", 0x0121: "LATIN SMALL LETTER G WITH DOT ABOVE", 0x0122: "LATIN CAPITAL LETTER G WITH CEDILLA", 0x0123: "LATIN SMALL LETTER G WITH CEDILLA", 0x0124: "LATIN CAPITAL LETTER H WITH CIRCUMFLEX", 0x0125: "LATIN SMALL LETTER H WITH CIRCUMFLEX", 0x0126: "LATIN CAPITAL LETTER H WITH STROKE", 0x0127: "LATIN SMALL LETTER H WITH STROKE", 0x0128: "LATIN CAPITAL LETTER I WITH TILDE", 0x0129: "LATIN SMALL LETTER I WITH TILDE", 0x012A: "LATIN CAPITAL LETTER I WITH MACRON", 0x012B: "LATIN SMALL LETTER I WITH MACRON", 0x012C: "LATIN CAPITAL LETTER I WITH BREVE", 0x012D: "LATIN SMALL LETTER I WITH BREVE", 0x012E: "LATIN CAPITAL LETTER I WITH OGONEK", 0x012F: "LATIN SMALL LETTER I WITH OGONEK", 0x0130: "LATIN CAPITAL LETTER I WITH DOT ABOVE", 0x0131: "LATIN SMALL LETTER DOTLESS I", 0x0132: "LATIN CAPITAL LIGATURE IJ", 0x0133: "LATIN SMALL LIGATURE IJ", 0x0134: "LATIN CAPITAL LETTER J WITH CIRCUMFLEX", 0x0135: "LATIN SMALL LETTER J WITH CIRCUMFLEX", 0x0136: "LATIN CAPITAL LETTER K WITH CEDILLA", 0x0137: "LATIN SMALL LETTER K WITH CEDILLA", 0x0138: "LATIN SMALL LETTER KRA (Greenlandic)", 0x0139: "LATIN CAPITAL LETTER L WITH ACUTE", 0x013A: "LATIN SMALL LETTER L WITH ACUTE", 0x013B: "LATIN CAPITAL LETTER L WITH CEDILLA", 0x013C: "LATIN SMALL LETTER L WITH CEDILLA", 0x013D: "LATIN CAPITAL LETTER L WITH CARON", 0x013E: "LATIN SMALL LETTER L WITH CARON", 0x013F: "LATIN CAPITAL LETTER L WITH MIDDLE DOT", 0x0140: "LATIN SMALL LETTER L WITH MIDDLE DOT", 0x0141: "LATIN CAPITAL LETTER L WITH STROKE", 0x0142: "LATIN SMALL LETTER L WITH STROKE", 0x0143: "LATIN CAPITAL LETTER N WITH ACUTE", 0x0144: "LATIN SMALL LETTER N WITH ACUTE", 0x0145: "LATIN CAPITAL LETTER N WITH CEDILLA", 0x0146: "LATIN SMALL LETTER N WITH CEDILLA", 0x0147: "LATIN CAPITAL LETTER N WITH CARON", 0x0148: "LATIN SMALL LETTER N WITH CARON", 0x0149: "LATIN SMALL LETTER N PRECEDED BY APOSTROPHE", 0x014A: "LATIN CAPITAL LETTER ENG (Sami)", 0x014B: "LATIN SMALL LETTER ENG (Sami)", 0x014C: "LATIN CAPITAL LETTER O WITH MACRON", 0x014D: "LATIN SMALL LETTER O WITH MACRON", 0x014E: "LATIN CAPITAL LETTER O WITH BREVE", 0x014F: "LATIN SMALL LETTER O WITH BREVE", 0x0150: "LATIN CAPITAL LETTER O WITH DOUBLE ACUTE", 0x0151: "LATIN SMALL LETTER O WITH DOUBLE ACUTE", 0x0152: "LATIN CAPITAL LIGATURE OE", 0x0153: "LATIN SMALL LIGATURE OE", 0x0154: "LATIN CAPITAL LETTER R WITH ACUTE", 0x0155: "LATIN SMALL LETTER R WITH ACUTE", 0x0156: "LATIN CAPITAL LETTER R WITH CEDILLA", 0x0157: "LATIN SMALL LETTER R WITH CEDILLA", 0x0158: "LATIN CAPITAL LETTER R WITH CARON", 0x0159: "LATIN SMALL LETTER R WITH CARON", 0x015A: "LATIN CAPITAL LETTER S WITH ACUTE", 0x015B: "LATIN SMALL LETTER S WITH ACUTE", 0x015C: "LATIN CAPITAL LETTER S WITH CIRCUMFLEX", 0x015D: "LATIN SMALL LETTER S WITH CIRCUMFLEX", 0x015E: "LATIN CAPITAL LETTER S WITH CEDILLA *", 0x015F: "LATIN SMALL LETTER S WITH CEDILLA *", 0x0160: "LATIN CAPITAL LETTER S WITH CARON", 0x0161: "LATIN SMALL LETTER S WITH CARON", 0x0162: "LATIN CAPITAL LETTER T WITH CEDILLA *", 0x0163: "LATIN SMALL LETTER T WITH CEDILLA *", 0x0164: "LATIN CAPITAL LETTER T WITH CARON", 0x0165: "LATIN SMALL LETTER T WITH CARON", 0x0166: "LATIN CAPITAL LETTER T WITH STROKE", 0x0167: "LATIN SMALL LETTER T WITH STROKE", 0x0168: "LATIN CAPITAL LETTER U WITH TILDE", 0x0169: "LATIN SMALL LETTER U WITH TILDE", 0x016A: "LATIN CAPITAL LETTER U WITH MACRON", 0x016B: "LATIN SMALL LETTER U WITH MACRON", 0x016C: "LATIN CAPITAL LETTER U WITH BREVE", 0x016D: "LATIN SMALL LETTER U WITH BREVE", 0x016E: "LATIN CAPITAL LETTER U WITH RING ABOVE", 0x016F: "LATIN SMALL LETTER U WITH RING ABOVE", 0x0170: "LATIN CAPITAL LETTER U WITH DOUBLE ACUTE", 0x0171: "LATIN SMALL LETTER U WITH DOUBLE ACUTE", 0x0172: "LATIN CAPITAL LETTER U WITH OGONEK", 0x0173: "LATIN SMALL LETTER U WITH OGONEK", 0x0174: "LATIN CAPITAL LETTER W WITH CIRCUMFLEX", 0x0175: "LATIN SMALL LETTER W WITH CIRCUMFLEX", 0x0176: "LATIN CAPITAL LETTER Y WITH CIRCUMFLEX", 0x0177: "LATIN SMALL LETTER Y WITH CIRCUMFLEX", 0x0178: "LATIN CAPITAL LETTER Y WITH DIAERESIS", 0x0179: "LATIN CAPITAL LETTER Z WITH ACUTE", 0x017A: "LATIN SMALL LETTER Z WITH ACUTE", 0x017B: "LATIN CAPITAL LETTER Z WITH DOT ABOVE", 0x017C: "LATIN SMALL LETTER Z WITH DOT ABOVE", 0x017D: "LATIN CAPITAL LETTER Z WITH CARON", 0x017E: "LATIN SMALL LETTER Z WITH CARON", 0x017F: "LATIN SMALL LETTER LONG S", 0x0180: "LATIN SMALL LETTER B WITH STROKE", 0x0181: "LATIN CAPITAL LETTER B WITH HOOK", 0x0182: "LATIN CAPITAL LETTER B WITH TOPBAR", 0x0183: "LATIN SMALL LETTER B WITH TOPBAR", 0x0184: "LATIN CAPITAL LETTER TONE SIX", 0x0185: "LATIN SMALL LETTER TONE SIX", 0x0186: "LATIN CAPITAL LETTER OPEN O", 0x0187: "LATIN CAPITAL LETTER C WITH HOOK", 0x0188: "LATIN SMALL LETTER C WITH HOOK", 0x0189: "LATIN CAPITAL LETTER AFRICAN D *", 0x018A: "LATIN CAPITAL LETTER D WITH HOOK", 0x018B: "LATIN CAPITAL LETTER D WITH TOPBAR", 0x018C: "LATIN SMALL LETTER D WITH TOPBAR", 0x018D: "LATIN SMALL LETTER TURNED DELTA", 0x018E: "LATIN CAPITAL LETTER REVERSED E", 0x018F: "LATIN CAPITAL LETTER SCHWA", 0x0190: "LATIN CAPITAL LETTER OPEN E", 0x0191: "LATIN CAPITAL LETTER F WITH HOOK", 0x0192: "LATIN SMALL LETTER F WITH HOOK", 0x0193: "LATIN CAPITAL LETTER G WITH HOOK", 0x0194: "LATIN CAPITAL LETTER GAMMA", 0x0195: "LATIN SMALL LETTER HV (hwair)", 0x0196: "LATIN CAPITAL LETTER IOTA", 0x0197: "LATIN CAPITAL LETTER I WITH STROKE", 0x0198: "LATIN CAPITAL LETTER K WITH HOOK", 0x0199: "LATIN SMALL LETTER K WITH HOOK", 0x019A: "LATIN SMALL LETTER L WITH BAR", 0x019B: "LATIN SMALL LETTER LAMBDA WITH STROKE", 0x019C: "LATIN CAPITAL LETTER TURNED M", 0x019D: "LATIN CAPITAL LETTER N WITH LEFT HOOK", 0x019E: "LATIN SMALL LETTER N WITH LONG RIGHT LEG", 0x019F: "LATIN CAPITAL LETTER O WITH MIDDLE TILDE *", 0x01A0: "LATIN CAPITAL LETTER O WITH HORN", 0x01A1: "LATIN SMALL LETTER O WITH HORN", 0x01A2: "LATIN CAPITAL LETTER OI (gha)", 0x01A3: "LATIN SMALL LETTER OI (gha)", 0x01A4: "LATIN CAPITAL LETTER P WITH HOOK", 0x01A5: "LATIN SMALL LETTER P WITH HOOK", 0x01A6: "LATIN LETTER YR *", 0x01A7: "LATIN CAPITAL LETTER TONE TWO", 0x01A8: "LATIN SMALL LETTER TONE TWO", 0x01A9: "LATIN CAPITAL LETTER ESH", 0x01AA: "LATIN LETTER REVERSED ESH LOOP", 0x01AB: "LATIN SMALL LETTER T WITH PALATAL HOOK", 0x01AC: "LATIN CAPITAL LETTER T WITH HOOK", 0x01AD: "LATIN SMALL LETTER T WITH HOOK", 0x01AE: "LATIN CAPITAL LETTER T WITH RETROFLEX HOOK", 0x01AF: "LATIN CAPITAL LETTER U WITH HORN", 0x01B0: "LATIN SMALL LETTER U WITH HORN", 0x01B1: "LATIN CAPITAL LETTER UPSILON", 0x01B2: "LATIN CAPITAL LETTER V WITH HOOK", 0x01B3: "LATIN CAPITAL LETTER Y WITH HOOK", 0x01B4: "LATIN SMALL LETTER Y WITH HOOK", 0x01B5: "LATIN CAPITAL LETTER Z WITH STROKE", 0x01B6: "LATIN SMALL LETTER Z WITH STROKE", 0x01B7: "LATIN CAPITAL LETTER EZH", 0x01B8: "LATIN CAPITAL LETTER EZH REVERSED", 0x01B9: "LATIN SMALL LETTER EZH REVERSED", 0x01BA: "LATIN SMALL LETTER EZH WITH TAIL", 0x01BB: "LATIN LETTER TWO WITH STROKE", 0x01BC: "LATIN CAPITAL LETTER TONE FIVE", 0x01BD: "LATIN SMALL LETTER TONE FIVE", 0x01BE: "LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE", 0x01BF: "LATIN LETTER WYNN", 0x01C0: "LATIN LETTER DENTAL CLICK", 0x01C1: "LATIN LETTER LATERAL CLICK", 0x01C2: "LATIN LETTER ALVEOLAR CLICK", 0x01C3: "LATIN LETTER RETROFLEX CLICK", 0x01C4: "LATIN CAPITAL LETTER DZ WITH CARON", 0x01C5: "LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON", 0x01C6: "LATIN SMALL LETTER DZ WITH CARON", 0x01C7: "LATIN CAPITAL LETTER LJ", 0x01C8: "LATIN CAPITAL LETTER L WITH SMALL LETTER J", 0x01C9: "LATIN SMALL LETTER LJ", 0x01CA: "LATIN CAPITAL LETTER NJ", 0x01CB: "LATIN CAPITAL LETTER N WITH SMALL LETTER J", 0x01CC: "LATIN SMALL LETTER NJ", 0x01CD: "LATIN CAPITAL LETTER A WITH CARON", 0x01CE: "LATIN SMALL LETTER A WITH CARON", 0x01CF: "LATIN CAPITAL LETTER I WITH CARON", 0x01D0: "LATIN SMALL LETTER I WITH CARON", 0x01D1: "LATIN CAPITAL LETTER O WITH CARON", 0x01D2: "LATIN SMALL LETTER O WITH CARON", 0x01D3: "LATIN CAPITAL LETTER U WITH CARON", 0x01D4: "LATIN SMALL LETTER U WITH CARON", 0x01D5: "LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON", 0x01D6: "LATIN SMALL LETTER U WITH DIAERESIS AND MACRON", 0x01D7: "LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE", 0x01D8: "LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE", 0x01D9: "LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON", 0x01DA: "LATIN SMALL LETTER U WITH DIAERESIS AND CARON", 0x01DB: "LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE", 0x01DC: "LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE", 0x01DD: "LATIN SMALL LETTER TURNED E", 0x01DE: "LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON", 0x01DF: "LATIN SMALL LETTER A WITH DIAERESIS AND MACRON", 0x01E0: "LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON", 0x01E1: "LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON", 0x01E2: "LATIN CAPITAL LETTER AE WITH MACRON (ash) *", 0x01E3: "LATIN SMALL LETTER AE WITH MACRON (ash) *", 0x01E4: "LATIN CAPITAL LETTER G WITH STROKE", 0x01E5: "LATIN SMALL LETTER G WITH STROKE", 0x01E6: "LATIN CAPITAL LETTER G WITH CARON", 0x01E7: "LATIN SMALL LETTER G WITH CARON", 0x01E8: "LATIN CAPITAL LETTER K WITH CARON", 0x01E9: "LATIN SMALL LETTER K WITH CARON", 0x01EA: "LATIN CAPITAL LETTER O WITH OGONEK", 0x01EB: "LATIN SMALL LETTER O WITH OGONEK", 0x01EC: "LATIN CAPITAL LETTER O WITH OGONEK AND MACRON", 0x01ED: "LATIN SMALL LETTER O WITH OGONEK AND MACRON", 0x01EE: "LATIN CAPITAL LETTER EZH WITH CARON", 0x01EF: "LATIN SMALL LETTER EZH WITH CARON", 0x01F0: "LATIN SMALL LETTER J WITH CARON", 0x01F1: "LATIN CAPITAL LETTER DZ", 0x01F2: "LATIN CAPITAL LETTER D WITH SMALL LETTER Z", 0x01F3: "LATIN SMALL LETTER DZ", 0x01F4: "LATIN CAPITAL LETTER G WITH ACUTE", 0x01F5: "LATIN SMALL LETTER G WITH ACUTE", 0x01F6: "LATIN CAPITAL LETTER HWAIR", 0x01F7: "LATIN CAPITAL LETTER WYNN", 0x01F8: "LATIN CAPITAL LETTER N WITH GRAVE", 0x01F9: "LATIN SMALL LETTER N WITH GRAVE", 0x01FA: "LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE", 0x01FB: "LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE", 0x01FC: "LATIN CAPITAL LETTER AE WITH ACUTE (ash) *", 0x01FD: "LATIN SMALL LETTER AE WITH ACUTE (ash) *", 0x01FE: "LATIN CAPITAL LETTER O WITH STROKE AND ACUTE", 0x01FF: "LATIN SMALL LETTER O WITH STROKE AND ACUTE", 0x0200: "LATIN CAPITAL LETTER A WITH DOUBLE GRAVE", 0x0201: "LATIN SMALL LETTER A WITH DOUBLE GRAVE", 0x0202: "LATIN CAPITAL LETTER A WITH INVERTED BREVE", 0x0203: "LATIN SMALL LETTER A WITH INVERTED BREVE", 0x0204: "LATIN CAPITAL LETTER E WITH DOUBLE GRAVE", 0x0205: "LATIN SMALL LETTER E WITH DOUBLE GRAVE", 0x0206: "LATIN CAPITAL LETTER E WITH INVERTED BREVE", 0x0207: "LATIN SMALL LETTER E WITH INVERTED BREVE", 0x0208: "LATIN CAPITAL LETTER I WITH DOUBLE GRAVE", 0x0209: "LATIN SMALL LETTER I WITH DOUBLE GRAVE", 0x020A: "LATIN CAPITAL LETTER I WITH INVERTED BREVE", 0x020B: "LATIN SMALL LETTER I WITH INVERTED BREVE", 0x020C: "LATIN CAPITAL LETTER O WITH DOUBLE GRAVE", 0x020D: "LATIN SMALL LETTER O WITH DOUBLE GRAVE", 0x020E: "LATIN CAPITAL LETTER O WITH INVERTED BREVE", 0x020F: "LATIN SMALL LETTER O WITH INVERTED BREVE", 0x0210: "LATIN CAPITAL LETTER R WITH DOUBLE GRAVE", 0x0211: "LATIN SMALL LETTER R WITH DOUBLE GRAVE", 0x0212: "LATIN CAPITAL LETTER R WITH INVERTED BREVE", 0x0213: "LATIN SMALL LETTER R WITH INVERTED BREVE", 0x0214: "LATIN CAPITAL LETTER U WITH DOUBLE GRAVE", 0x0215: "LATIN SMALL LETTER U WITH DOUBLE GRAVE", 0x0216: "LATIN CAPITAL LETTER U WITH INVERTED BREVE", 0x0217: "LATIN SMALL LETTER U WITH INVERTED BREVE", 0x0218: "LATIN CAPITAL LETTER S WITH COMMA BELOW *", 0x0219: "LATIN SMALL LETTER S WITH COMMA BELOW *", 0x021A: "LATIN CAPITAL LETTER T WITH COMMA BELOW *", 0x021B: "LATIN SMALL LETTER T WITH COMMA BELOW *", 0x021C: "LATIN CAPITAL LETTER YOGH", 0x021D: "LATIN SMALL LETTER YOGH", 0x021E: "LATIN CAPITAL LETTER H WITH CARON", 0x021F: "LATIN SMALL LETTER H WITH CARON", 0x0220: "LATIN CAPITAL LETTER N WITH LONG RIGHT LEG", 0x0221: "LATIN SMALL LETTER D WITH CURL", 0x0222: "LATIN CAPITAL LETTER OU", 0x0223: "LATIN SMALL LETTER OU", 0x0224: "LATIN CAPITAL LETTER Z WITH HOOK", 0x0225: "LATIN SMALL LETTER Z WITH HOOK", 0x0226: "LATIN CAPITAL LETTER A WITH DOT ABOVE", 0x0227: "LATIN SMALL LETTER A WITH DOT ABOVE", 0x0228: "LATIN CAPITAL LETTER E WITH CEDILLA", 0x0229: "LATIN SMALL LETTER E WITH CEDILLA", 0x022A: "LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON", 0x022B: "LATIN SMALL LETTER O WITH DIAERESIS AND MACRON", 0x022C: "LATIN CAPITAL LETTER O WITH TILDE AND MACRON", 0x022D: "LATIN SMALL LETTER O WITH TILDE AND MACRON", 0x022E: "LATIN CAPITAL LETTER O WITH DOT ABOVE", 0x022F: "LATIN SMALL LETTER O WITH DOT ABOVE", 0x0230: "LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON", 0x0231: "LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON", 0x0232: "LATIN CAPITAL LETTER Y WITH MACRON", 0x0233: "LATIN SMALL LETTER Y WITH MACRON", 0x0234: "LATIN SMALL LETTER L WITH CURL", 0x0235: "LATIN SMALL LETTER N WITH CURL", 0x0236: "LATIN SMALL LETTER T WITH CURL", 0x0237: "LATIN SMALL LETTER DOTLESS J", 0x0238: "LATIN SMALL LETTER DB DIGRAPH", 0x0239: "LATIN SMALL LETTER QP DIGRAPH", 0x023A: "LATIN CAPITAL LETTER A WITH STROKE", 0x023B: "LATIN CAPITAL LETTER C WITH STROKE", 0x023C: "LATIN SMALL LETTER C WITH STROKE", 0x023D: "LATIN CAPITAL LETTER L WITH BAR", 0x023E: "LATIN CAPITAL LETTER T WITH DIAGONAL STROKE", 0x023F: "LATIN SMALL LETTER S WITH SWASH TAIL", 0x0240: "LATIN SMALL LETTER Z WITH SWASH TAIL", 0x0241: "LATIN CAPITAL LETTER GLOTTAL STOP", 0x0242: "LATIN SMALL LETTER GLOTTAL STOP", 0x0243: "LATIN CAPITAL LETTER B WITH STROKE", 0x0244: "LATIN CAPITAL LETTER U BAR", 0x0245: "LATIN CAPITAL LETTER TURNED V", 0x0246: "LATIN CAPITAL LETTER E WITH STROKE", 0x0247: "LATIN SMALL LETTER E WITH STROKE", 0x0248: "LATIN CAPITAL LETTER J WITH STROKE", 0x0249: "LATIN SMALL LETTER J WITH STROKE", 0x024A: "LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL", 0x024B: "LATIN SMALL LETTER Q WITH HOOK TAIL", 0x024C: "LATIN CAPITAL LETTER R WITH STROKE", 0x024D: "LATIN SMALL LETTER R WITH STROKE", 0x024E: "LATIN CAPITAL LETTER Y WITH STROKE", 0x024F: "LATIN SMALL LETTER Y WITH STROKE", 0x0250: "LATIN SMALL LETTER TURNED A", 0x0251: "LATIN SMALL LETTER ALPHA", 0x0252: "LATIN SMALL LETTER TURNED ALPHA", 0x0253: "LATIN SMALL LETTER B WITH HOOK", 0x0254: "LATIN SMALL LETTER OPEN O", 0x0255: "LATIN SMALL LETTER C WITH CURL", 0x0256: "LATIN SMALL LETTER D WITH TAIL", 0x0257: "LATIN SMALL LETTER D WITH HOOK", 0x0258: "LATIN SMALL LETTER REVERSED E", 0x0259: "LATIN SMALL LETTER SCHWA", 0x025A: "LATIN SMALL LETTER SCHWA WITH HOOK", 0x025B: "LATIN SMALL LETTER OPEN E", 0x025C: "LATIN SMALL LETTER REVERSED OPEN E", 0x025D: "LATIN SMALL LETTER REVERSED OPEN E WITH HOOK", 0x025E: "LATIN SMALL LETTER CLOSED REVERSED OPEN E", 0x025F: "LATIN SMALL LETTER DOTLESS J WITH STROKE", 0x0260: "LATIN SMALL LETTER G WITH HOOK", 0x0261: "LATIN SMALL LETTER SCRIPT G", 0x0262: "LATIN LETTER SMALL CAPITAL G", 0x0263: "LATIN SMALL LETTER GAMMA", 0x0264: "LATIN SMALL LETTER RAMS HORN", 0x0265: "LATIN SMALL LETTER TURNED H", 0x0266: "LATIN SMALL LETTER H WITH HOOK", 0x0267: "LATIN SMALL LETTER HENG WITH HOOK", 0x0268: "LATIN SMALL LETTER I WITH STROKE", 0x0269: "LATIN SMALL LETTER IOTA", 0x026A: "LATIN LETTER SMALL CAPITAL I", 0x026B: "LATIN SMALL LETTER L WITH MIDDLE TILDE", 0x026C: "LATIN SMALL LETTER L WITH BELT", 0x026D: "LATIN SMALL LETTER L WITH RETROFLEX HOOK", 0x026E: "LATIN SMALL LETTER LEZH", 0x026F: "LATIN SMALL LETTER TURNED M", 0x0270: "LATIN SMALL LETTER TURNED M WITH LONG LEG", 0x0271: "LATIN SMALL LETTER M WITH HOOK", 0x0272: "LATIN SMALL LETTER N WITH LEFT HOOK", 0x0273: "LATIN SMALL LETTER N WITH RETROFLEX HOOK", 0x0274: "LATIN LETTER SMALL CAPITAL N", 0x0275: "LATIN SMALL LETTER BARRED O", 0x0276: "LATIN LETTER SMALL CAPITAL OE", 0x0277: "LATIN SMALL LETTER CLOSED OMEGA", 0x0278: "LATIN SMALL LETTER PHI", 0x0279: "LATIN SMALL LETTER TURNED R", 0x027A: "LATIN SMALL LETTER TURNED R WITH LONG LEG", 0x027B: "LATIN SMALL LETTER TURNED R WITH HOOK", 0x027C: "LATIN SMALL LETTER R WITH LONG LEG", 0x027D: "LATIN SMALL LETTER R WITH TAIL", 0x027E: "LATIN SMALL LETTER R WITH FISHHOOK", 0x027F: "LATIN SMALL LETTER REVERSED R WITH FISHHOOK", 0x0280: "LATIN LETTER SMALL CAPITAL R *", 0x0281: "LATIN LETTER SMALL CAPITAL INVERTED R", 0x0282: "LATIN SMALL LETTER S WITH HOOK", 0x0283: "LATIN SMALL LETTER ESH", 0x0284: "LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK", 0x0285: "LATIN SMALL LETTER SQUAT REVERSED ESH", 0x0286: "LATIN SMALL LETTER ESH WITH CURL", 0x0287: "LATIN SMALL LETTER TURNED T", 0x0288: "LATIN SMALL LETTER T WITH RETROFLEX HOOK", 0x0289: "LATIN SMALL LETTER U BAR", 0x028A: "LATIN SMALL LETTER UPSILON", 0x028B: "LATIN SMALL LETTER V WITH HOOK", 0x028C: "LATIN SMALL LETTER TURNED V", 0x028D: "LATIN SMALL LETTER TURNED W", 0x028E: "LATIN SMALL LETTER TURNED Y", 0x028F: "LATIN LETTER SMALL CAPITAL Y", 0x0290: "LATIN SMALL LETTER Z WITH RETROFLEX HOOK", 0x0291: "LATIN SMALL LETTER Z WITH CURL", 0x0292: "LATIN SMALL LETTER EZH", 0x0293: "LATIN SMALL LETTER EZH WITH CURL", 0x0294: "LATIN LETTER GLOTTAL STOP", 0x0295: "LATIN LETTER PHARYNGEAL VOICED FRICATIVE", 0x0296: "LATIN LETTER INVERTED GLOTTAL STOP", 0x0297: "LATIN LETTER STRETCHED C", 0x0298: "LATIN LETTER BILABIAL CLICK", 0x0299: "LATIN LETTER SMALL CAPITAL B", 0x029A: "LATIN SMALL LETTER CLOSED OPEN E", 0x029B: "LATIN LETTER SMALL CAPITAL G WITH HOOK", 0x029C: "LATIN LETTER SMALL CAPITAL H", 0x029D: "LATIN SMALL LETTER J WITH CROSSED-TAIL", 0x029E: "LATIN SMALL LETTER TURNED K", 0x029F: "LATIN LETTER SMALL CAPITAL L", 0x02A0: "LATIN SMALL LETTER Q WITH HOOK", 0x02A1: "LATIN LETTER GLOTTAL STOP WITH STROKE", 0x02A2: "LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE", 0x02A3: "LATIN SMALL LETTER DZ DIGRAPH", 0x02A4: "LATIN SMALL LETTER DEZH DIGRAPH", 0x02A5: "LATIN SMALL LETTER DZ DIGRAPH WITH CURL", 0x02A6: "LATIN SMALL LETTER TS DIGRAPH", 0x02A7: "LATIN SMALL LETTER TESH DIGRAPH", 0x02A8: "LATIN SMALL LETTER TC DIGRAPH WITH CURL", 0x02A9: "LATIN SMALL LETTER FENG DIGRAPH", 0x02AA: "LATIN SMALL LETTER LS DIGRAPH", 0x02AB: "LATIN SMALL LETTER LZ DIGRAPH", 0x02AC: "LATIN LETTER BILABIAL PERCUSSIVE", 0x02AD: "LATIN LETTER BIDENTAL PERCUSSIVE", 0x02AE: "LATIN SMALL LETTER TURNED H WITH FISHHOOK", 0x02AF: "LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL", 0x02B0: "MODIFIER LETTER SMALL H", 0x02B1: "MODIFIER LETTER SMALL H WITH HOOK", 0x02B2: "MODIFIER LETTER SMALL J", 0x02B3: "MODIFIER LETTER SMALL R", 0x02B4: "MODIFIER LETTER SMALL TURNED R", 0x02B5: "MODIFIER LETTER SMALL TURNED R WITH HOOK", 0x02B6: "MODIFIER LETTER SMALL CAPITAL INVERTED R", 0x02B7: "MODIFIER LETTER SMALL W", 0x02B8: "MODIFIER LETTER SMALL Y", 0x02B9: "MODIFIER LETTER PRIME", 0x02BA: "MODIFIER LETTER DOUBLE PRIME", 0x02BB: "MODIFIER LETTER TURNED COMMA", 0x02BC: "MODIFIER LETTER APOSTROPHE", 0x02BD: "MODIFIER LETTER REVERSED COMMA", 0x02BE: "MODIFIER LETTER RIGHT HALF RING", 0x02BF: "MODIFIER LETTER LEFT HALF RING", 0x02C0: "MODIFIER LETTER GLOTTAL STOP", 0x02C1: "MODIFIER LETTER REVERSED GLOTTAL STOP", 0x02C2: "MODIFIER LETTER LEFT ARROWHEAD", 0x02C3: "MODIFIER LETTER RIGHT ARROWHEAD", 0x02C4: "MODIFIER LETTER UP ARROWHEAD", 0x02C5: "MODIFIER LETTER DOWN ARROWHEAD", 0x02C6: "MODIFIER LETTER CIRCUMFLEX ACCENT", 0x02C7: "CARON (Mandarin Chinese third tone)", 0x02C8: "MODIFIER LETTER VERTICAL LINE", 0x02C9: "MODIFIER LETTER MACRON (Mandarin Chinese first tone)", 0x02CA: "MODIFIER LETTER ACUTE ACCENT (Mandarin Chinese second tone)", 0x02CB: "MODIFIER LETTER GRAVE ACCENT (Mandarin Chinese fourth tone)", 0x02CC: "MODIFIER LETTER LOW VERTICAL LINE", 0x02CD: "MODIFIER LETTER LOW MACRON", 0x02CE: "MODIFIER LETTER LOW GRAVE ACCENT", 0x02CF: "MODIFIER LETTER LOW ACUTE ACCENT", 0x02D0: "MODIFIER LETTER TRIANGULAR COLON", 0x02D1: "MODIFIER LETTER HALF TRIANGULAR COLON", 0x02D2: "MODIFIER LETTER CENTRED RIGHT HALF RING", 0x02D3: "MODIFIER LETTER CENTRED LEFT HALF RING", 0x02D4: "MODIFIER LETTER UP TACK", 0x02D5: "MODIFIER LETTER DOWN TACK", 0x02D6: "MODIFIER LETTER PLUS SIGN", 0x02D7: "MODIFIER LETTER MINUS SIGN", 0x02D8: "BREVE", 0x02D9: "DOT ABOVE (Mandarin Chinese light tone)", 0x02DA: "RING ABOVE", 0x02DB: "OGONEK", 0x02DC: "SMALL TILDE", 0x02DD: "DOUBLE ACUTE ACCENT", 0x02DE: "MODIFIER LETTER RHOTIC HOOK", 0x02DF: "MODIFIER LETTER CROSS ACCENT", 0x02E0: "MODIFIER LETTER SMALL GAMMA", 0x02E1: "MODIFIER LETTER SMALL L", 0x02E2: "MODIFIER LETTER SMALL S", 0x02E3: "MODIFIER LETTER SMALL X", 0x02E4: "MODIFIER LETTER SMALL REVERSED GLOTTAL STOP", 0x02E5: "MODIFIER LETTER EXTRA-HIGH TONE BAR", 0x02E6: "MODIFIER LETTER HIGH TONE BAR", 0x02E7: "MODIFIER LETTER MID TONE BAR", 0x02E8: "MODIFIER LETTER LOW TONE BAR", 0x02E9: "MODIFIER LETTER EXTRA-LOW TONE BAR", 0x02EA: "MODIFIER LETTER YIN DEPARTING TONE MARK", 0x02EB: "MODIFIER LETTER YANG DEPARTING TONE MARK", 0x02EC: "MODIFIER LETTER VOICING", 0x02ED: "MODIFIER LETTER UNASPIRATED", 0x02EE: "MODIFIER LETTER DOUBLE APOSTROPHE", 0x02EF: "MODIFIER LETTER LOW DOWN ARROWHEAD", 0x02F0: "MODIFIER LETTER LOW UP ARROWHEAD", 0x02F1: "MODIFIER LETTER LOW LEFT ARROWHEAD", 0x02F2: "MODIFIER LETTER LOW RIGHT ARROWHEAD", 0x02F3: "MODIFIER LETTER LOW RING", 0x02F4: "MODIFIER LETTER MIDDLE GRAVE ACCENT", 0x02F5: "MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT", 0x02F6: "MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT", 0x02F7: "MODIFIER LETTER LOW TILDE", 0x02F8: "MODIFIER LETTER RAISED COLON", 0x02F9: "MODIFIER LETTER BEGIN HIGH TONE", 0x02FA: "MODIFIER LETTER END HIGH TONE", 0x02FB: "MODIFIER LETTER BEGIN LOW TONE", 0x02FC: "MODIFIER LETTER END LOW TONE", 0x02FD: "MODIFIER LETTER SHELF", 0x02FE: "MODIFIER LETTER OPEN SHELF", 0x02FF: "MODIFIER LETTER LOW LEFT ARROW", 0x0300: "COMBINING GRAVE ACCENT (Varia)", 0x0301: "COMBINING ACUTE ACCENT (Oxia, Tonos)", 0x0302: "COMBINING CIRCUMFLEX ACCENT", 0x0303: "COMBINING TILDE", 0x0304: "COMBINING MACRON", 0x0305: "COMBINING OVERLINE", 0x0306: "COMBINING BREVE (Vrachy)", 0x0307: "COMBINING DOT ABOVE", 0x0308: "COMBINING DIAERESIS (Dialytika)", 0x0309: "COMBINING HOOK ABOVE", 0x030A: "COMBINING RING ABOVE", 0x030B: "COMBINING DOUBLE ACUTE ACCENT", 0x030C: "COMBINING CARON", 0x030D: "COMBINING VERTICAL LINE ABOVE", 0x030E: "COMBINING DOUBLE VERTICAL LINE ABOVE", 0x030F: "COMBINING DOUBLE GRAVE ACCENT", 0x0310: "COMBINING CANDRABINDU", 0x0311: "COMBINING INVERTED BREVE", 0x0312: "COMBINING TURNED COMMA ABOVE", 0x0313: "COMBINING COMMA ABOVE (Psili)", 0x0314: "COMBINING REVERSED COMMA ABOVE (Dasia)", 0x0315: "COMBINING COMMA ABOVE RIGHT", 0x0316: "COMBINING GRAVE ACCENT BELOW", 0x0317: "COMBINING ACUTE ACCENT BELOW", 0x0318: "COMBINING LEFT TACK BELOW", 0x0319: "COMBINING RIGHT TACK BELOW", 0x031A: "COMBINING LEFT ANGLE ABOVE", 0x031B: "COMBINING HORN", 0x031C: "COMBINING LEFT HALF RING BELOW", 0x031D: "COMBINING UP TACK BELOW", 0x031E: "COMBINING DOWN TACK BELOW", 0x031F: "COMBINING PLUS SIGN BELOW", 0x0320: "COMBINING MINUS SIGN BELOW", 0x0321: "COMBINING PALATALIZED HOOK BELOW", 0x0322: "COMBINING RETROFLEX HOOK BELOW", 0x0323: "COMBINING DOT BELOW", 0x0324: "COMBINING DIAERESIS BELOW", 0x0325: "COMBINING RING BELOW", 0x0326: "COMBINING COMMA BELOW", 0x0327: "COMBINING CEDILLA", 0x0328: "COMBINING OGONEK", 0x0329: "COMBINING VERTICAL LINE BELOW", 0x032A: "COMBINING BRIDGE BELOW", 0x032B: "COMBINING INVERTED DOUBLE ARCH BELOW", 0x032C: "COMBINING CARON BELOW", 0x032D: "COMBINING CIRCUMFLEX ACCENT BELOW", 0x032E: "COMBINING BREVE BELOW", 0x032F: "COMBINING INVERTED BREVE BELOW", 0x0330: "COMBINING TILDE BELOW", 0x0331: "COMBINING MACRON BELOW", 0x0332: "COMBINING LOW LINE", 0x0333: "COMBINING DOUBLE LOW LINE", 0x0334: "COMBINING TILDE OVERLAY", 0x0335: "COMBINING SHORT STROKE OVERLAY", 0x0336: "COMBINING LONG STROKE OVERLAY", 0x0337: "COMBINING SHORT SOLIDUS OVERLAY", 0x0338: "COMBINING LONG SOLIDUS OVERLAY", 0x0339: "COMBINING RIGHT HALF RING BELOW", 0x033A: "COMBINING INVERTED BRIDGE BELOW", 0x033B: "COMBINING SQUARE BELOW", 0x033C: "COMBINING SEAGULL BELOW", 0x033D: "COMBINING X ABOVE", 0x033E: "COMBINING VERTICAL TILDE", 0x033F: "COMBINING DOUBLE OVERLINE", 0x0340: "COMBINING GRAVE TONE MARK (Vietnamese)", 0x0341: "COMBINING ACUTE TONE MARK (Vietnamese)", 0x0342: "COMBINING GREEK PERISPOMENI", 0x0343: "COMBINING GREEK KORONIS", 0x0344: "COMBINING GREEK DIALYTIKA TONOS", 0x0345: "COMBINING GREEK YPOGEGRAMMENI", 0x0346: "COMBINING BRIDGE ABOVE", 0x0347: "COMBINING EQUALS SIGN BELOW", 0x0348: "COMBINING DOUBLE VERTICAL LINE BELOW", 0x0349: "COMBINING LEFT ANGLE BELOW", 0x034A: "COMBINING NOT TILDE ABOVE", 0x034B: "COMBINING HOMOTHETIC ABOVE", 0x034C: "COMBINING ALMOST EQUAL TO ABOVE", 0x034D: "COMBINING LEFT RIGHT ARROW BELOW", 0x034E: "COMBINING UPWARDS ARROW BELOW", 0x034F: "COMBINING GRAPHEME JOINER", 0x0350: "COMBINING RIGHT ARROWHEAD ABOVE", 0x0351: "COMBINING LEFT HALF RING ABOVE", 0x0352: "COMBINING FERMATA", 0x0353: "COMBINING X BELOW", 0x0354: "COMBINING LEFT ARROWHEAD BELOW", 0x0355: "COMBINING RIGHT ARROWHEAD BELOW", 0x0356: "COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW", 0x0357: "COMBINING RIGHT HALF RING ABOVE", 0x0358: "COMBINING DOT ABOVE RIGHT", 0x0359: "COMBINING ASTERISK BELOW", 0x035A: "COMBINING DOUBLE RING BELOW", 0x035B: "COMBINING ZIGZAG ABOVE", 0x035C: "COMBINING DOUBLE BREVE BELOW", 0x035D: "COMBINING DOUBLE BREVE", 0x035E: "COMBINING DOUBLE MACRON", 0x035F: "COMBINING DOUBLE MACRON BELOW", 0x0360: "COMBINING DOUBLE TILDE", 0x0361: "COMBINING DOUBLE INVERTED BREVE", 0x0362: "COMBINING DOUBLE RIGHTWARDS ARROW BELOW", 0x0363: "COMBINING LATIN SMALL LETTER A", 0x0364: "COMBINING LATIN SMALL LETTER E", 0x0365: "COMBINING LATIN SMALL LETTER I", 0x0366: "COMBINING LATIN SMALL LETTER O", 0x0367: "COMBINING LATIN SMALL LETTER U", 0x0368: "COMBINING LATIN SMALL LETTER C", 0x0369: "COMBINING LATIN SMALL LETTER D", 0x036A: "COMBINING LATIN SMALL LETTER H", 0x036B: "COMBINING LATIN SMALL LETTER M", 0x036C: "COMBINING LATIN SMALL LETTER R", 0x036D: "COMBINING LATIN SMALL LETTER T", 0x036E: "COMBINING LATIN SMALL LETTER V", 0x036F: "COMBINING LATIN SMALL LETTER X", 0x0370: "GREEK CAPITAL LETTER HETA", 0x0371: "GREEK SMALL LETTER HETA", 0x0372: "GREEK CAPITAL LETTER ARCHAIC SAMPI", 0x0373: "GREEK SMALL LETTER ARCHAIC SAMPI", 0x0374: "GREEK NUMERAL SIGN (Dexia keraia)", 0x0375: "GREEK LOWER NUMERAL SIGN (Aristeri keraia)", 0x0376: "GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA", 0x0377: "GREEK SMALL LETTER PAMPHYLIAN DIGAMMA", 0x037A: "GREEK YPOGEGRAMMENI", 0x037B: "GREEK SMALL REVERSED LUNATE SIGMA SYMBOL", 0x037C: "GREEK SMALL DOTTED LUNATE SIGMA SYMBOL", 0x037D: "GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL", 0x037E: "GREEK QUESTION MARK (Erotimatiko)", 0x0384: "GREEK TONOS", 0x0385: "GREEK DIALYTIKA TONOS", 0x0386: "GREEK CAPITAL LETTER ALPHA WITH TONOS", 0x0387: "GREEK ANO TELEIA", 0x0388: "GREEK CAPITAL LETTER EPSILON WITH TONOS", 0x0389: "GREEK CAPITAL LETTER ETA WITH TONOS", 0x038A: "GREEK CAPITAL LETTER IOTA WITH TONOS", 0x038C: "GREEK CAPITAL LETTER OMICRON WITH TONOS", 0x038E: "GREEK CAPITAL LETTER UPSILON WITH TONOS", 0x038F: "GREEK CAPITAL LETTER OMEGA WITH TONOS", 0x0390: "GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS", 0x0391: "GREEK CAPITAL LETTER ALPHA", 0x0392: "GREEK CAPITAL LETTER BETA", 0x0393: "GREEK CAPITAL LETTER GAMMA", 0x0394: "GREEK CAPITAL LETTER DELTA", 0x0395: "GREEK CAPITAL LETTER EPSILON", 0x0396: "GREEK CAPITAL LETTER ZETA", 0x0397: "GREEK CAPITAL LETTER ETA", 0x0398: "GREEK CAPITAL LETTER THETA", 0x0399: "GREEK CAPITAL LETTER IOTA", 0x039A: "GREEK CAPITAL LETTER KAPPA", 0x039B: "GREEK CAPITAL LETTER LAMDA", 0x039C: "GREEK CAPITAL LETTER MU", 0x039D: "GREEK CAPITAL LETTER NU", 0x039E: "GREEK CAPITAL LETTER XI", 0x039F: "GREEK CAPITAL LETTER OMICRON", 0x03A0: "GREEK CAPITAL LETTER PI", 0x03A1: "GREEK CAPITAL LETTER RHO", 0x03A3: "GREEK CAPITAL LETTER SIGMA", 0x03A4: "GREEK CAPITAL LETTER TAU", 0x03A5: "GREEK CAPITAL LETTER UPSILON", 0x03A6: "GREEK CAPITAL LETTER PHI", 0x03A7: "GREEK CAPITAL LETTER CHI", 0x03A8: "GREEK CAPITAL LETTER PSI", 0x03A9: "GREEK CAPITAL LETTER OMEGA", 0x03AA: "GREEK CAPITAL LETTER IOTA WITH DIALYTIKA", 0x03AB: "GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA", 0x03AC: "GREEK SMALL LETTER ALPHA WITH TONOS", 0x03AD: "GREEK SMALL LETTER EPSILON WITH TONOS", 0x03AE: "GREEK SMALL LETTER ETA WITH TONOS", 0x03AF: "GREEK SMALL LETTER IOTA WITH TONOS", 0x03B0: "GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS", 0x03B1: "GREEK SMALL LETTER ALPHA", 0x03B2: "GREEK SMALL LETTER BETA", 0x03B3: "GREEK SMALL LETTER GAMMA", 0x03B4: "GREEK SMALL LETTER DELTA", 0x03B5: "GREEK SMALL LETTER EPSILON", 0x03B6: "GREEK SMALL LETTER ZETA", 0x03B7: "GREEK SMALL LETTER ETA", 0x03B8: "GREEK SMALL LETTER THETA", 0x03B9: "GREEK SMALL LETTER IOTA", 0x03BA: "GREEK SMALL LETTER KAPPA", 0x03BB: "GREEK SMALL LETTER LAMDA", 0x03BC: "GREEK SMALL LETTER MU", 0x03BD: "GREEK SMALL LETTER NU", 0x03BE: "GREEK SMALL LETTER XI", 0x03BF: "GREEK SMALL LETTER OMICRON", 0x03C0: "GREEK SMALL LETTER PI", 0x03C1: "GREEK SMALL LETTER RHO", 0x03C2: "GREEK SMALL LETTER FINAL SIGMA", 0x03C3: "GREEK SMALL LETTER SIGMA", 0x03C4: "GREEK SMALL LETTER TAU", 0x03C5: "GREEK SMALL LETTER UPSILON", 0x03C6: "GREEK SMALL LETTER PHI", 0x03C7: "GREEK SMALL LETTER CHI", 0x03C8: "GREEK SMALL LETTER PSI", 0x03C9: "GREEK SMALL LETTER OMEGA", 0x03CA: "GREEK SMALL LETTER IOTA WITH DIALYTIKA", 0x03CB: "GREEK SMALL LETTER UPSILON WITH DIALYTIKA", 0x03CC: "GREEK SMALL LETTER OMICRON WITH TONOS", 0x03CD: "GREEK SMALL LETTER UPSILON WITH TONOS", 0x03CE: "GREEK SMALL LETTER OMEGA WITH TONOS", 0x03CF: "GREEK CAPITAL KAI SYMBOL", 0x03D0: "GREEK BETA SYMBOL", 0x03D1: "GREEK THETA SYMBOL", 0x03D2: "GREEK UPSILON WITH HOOK SYMBOL", 0x03D3: "GREEK UPSILON WITH ACUTE AND HOOK SYMBOL", 0x03D4: "GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL", 0x03D5: "GREEK PHI SYMBOL", 0x03D6: "GREEK PI SYMBOL", 0x03D7: "GREEK KAI SYMBOL", 0x03D8: "GREEK LETTER ARCHAIC KOPPA *", 0x03D9: "GREEK SMALL LETTER ARCHAIC KOPPA *", 0x03DA: "GREEK LETTER STIGMA", 0x03DB: "GREEK SMALL LETTER STIGMA", 0x03DC: "GREEK LETTER DIGAMMA", 0x03DD: "GREEK SMALL LETTER DIGAMMA", 0x03DE: "GREEK LETTER KOPPA", 0x03DF: "GREEK SMALL LETTER KOPPA", 0x03E0: "GREEK LETTER SAMPI", 0x03E1: "GREEK SMALL LETTER SAMPI", 0x03E2: "COPTIC CAPITAL LETTER SHEI", 0x03E3: "COPTIC SMALL LETTER SHEI", 0x03E4: "COPTIC CAPITAL LETTER FEI", 0x03E5: "COPTIC SMALL LETTER FEI", 0x03E6: "COPTIC CAPITAL LETTER KHEI", 0x03E7: "COPTIC SMALL LETTER KHEI", 0x03E8: "COPTIC CAPITAL LETTER HORI", 0x03E9: "COPTIC SMALL LETTER HORI", 0x03EA: "COPTIC CAPITAL LETTER GANGIA", 0x03EB: "COPTIC SMALL LETTER GANGIA", 0x03EC: "COPTIC CAPITAL LETTER SHIMA", 0x03ED: "COPTIC SMALL LETTER SHIMA", 0x03EE: "COPTIC CAPITAL LETTER DEI", 0x03EF: "COPTIC SMALL LETTER DEI", 0x03F0: "GREEK KAPPA SYMBOL", 0x03F1: "GREEK RHO SYMBOL", 0x03F2: "GREEK LUNATE SIGMA SYMBOL", 0x03F3: "GREEK LETTER YOT", 0x03F4: "GREEK CAPITAL THETA SYMBOL", 0x03F5: "GREEK LUNATE EPSILON SYMBOL", 0x03F6: "GREEK REVERSED LUNATE EPSILON SYMBOL", 0x03F7: "GREEK CAPITAL LETTER SHO", 0x03F8: "GREEK SMALL LETTER SHO", 0x03F9: "GREEK CAPITAL LUNATE SIGMA SYMBOL", 0x03FA: "GREEK CAPITAL LETTER SAN", 0x03FB: "GREEK SMALL LETTER SAN", 0x03FC: "GREEK RHO WITH STROKE SYMBOL", 0x03FD: "GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL", 0x03FE: "GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL", 0x03FF: "GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL", 0x0400: "CYRILLIC CAPITAL LETTER IE WITH GRAVE", 0x0401: "CYRILLIC CAPITAL LETTER IO", 0x0402: "CYRILLIC CAPITAL LETTER DJE (Serbocroatian)", 0x0403: "CYRILLIC CAPITAL LETTER GJE", 0x0404: "CYRILLIC CAPITAL LETTER UKRAINIAN IE", 0x0405: "CYRILLIC CAPITAL LETTER DZE", 0x0406: "CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I", 0x0407: "CYRILLIC CAPITAL LETTER YI (Ukrainian)", 0x0408: "CYRILLIC CAPITAL LETTER JE", 0x0409: "CYRILLIC CAPITAL LETTER LJE", 0x040A: "CYRILLIC CAPITAL LETTER NJE", 0x040B: "CYRILLIC CAPITAL LETTER TSHE (Serbocroatian)", 0x040C: "CYRILLIC CAPITAL LETTER KJE", 0x040D: "CYRILLIC CAPITAL LETTER I WITH GRAVE", 0x040E: "CYRILLIC CAPITAL LETTER SHORT U (Byelorussian)", 0x040F: "CYRILLIC CAPITAL LETTER DZHE", 0x0410: "CYRILLIC CAPITAL LETTER A", 0x0411: "CYRILLIC CAPITAL LETTER BE", 0x0412: "CYRILLIC CAPITAL LETTER VE", 0x0413: "CYRILLIC CAPITAL LETTER GHE", 0x0414: "CYRILLIC CAPITAL LETTER DE", 0x0415: "CYRILLIC CAPITAL LETTER IE", 0x0416: "CYRILLIC CAPITAL LETTER ZHE", 0x0417: "CYRILLIC CAPITAL LETTER ZE", 0x0418: "CYRILLIC CAPITAL LETTER I", 0x0419: "CYRILLIC CAPITAL LETTER SHORT I", 0x041A: "CYRILLIC CAPITAL LETTER KA", 0x041B: "CYRILLIC CAPITAL LETTER EL", 0x041C: "CYRILLIC CAPITAL LETTER EM", 0x041D: "CYRILLIC CAPITAL LETTER EN", 0x041E: "CYRILLIC CAPITAL LETTER O", 0x041F: "CYRILLIC CAPITAL LETTER PE", 0x0420: "CYRILLIC CAPITAL LETTER ER", 0x0421: "CYRILLIC CAPITAL LETTER ES", 0x0422: "CYRILLIC CAPITAL LETTER TE", 0x0423: "CYRILLIC CAPITAL LETTER U", 0x0424: "CYRILLIC CAPITAL LETTER EF", 0x0425: "CYRILLIC CAPITAL LETTER HA", 0x0426: "CYRILLIC CAPITAL LETTER TSE", 0x0427: "CYRILLIC CAPITAL LETTER CHE", 0x0428: "CYRILLIC CAPITAL LETTER SHA", 0x0429: "CYRILLIC CAPITAL LETTER SHCHA", 0x042A: "CYRILLIC CAPITAL LETTER HARD SIGN", 0x042B: "CYRILLIC CAPITAL LETTER YERU", 0x042C: "CYRILLIC CAPITAL LETTER SOFT SIGN", 0x042D: "CYRILLIC CAPITAL LETTER E", 0x042E: "CYRILLIC CAPITAL LETTER YU", 0x042F: "CYRILLIC CAPITAL LETTER YA", 0x0430: "CYRILLIC SMALL LETTER A", 0x0431: "CYRILLIC SMALL LETTER BE", 0x0432: "CYRILLIC SMALL LETTER VE", 0x0433: "CYRILLIC SMALL LETTER GHE", 0x0434: "CYRILLIC SMALL LETTER DE", 0x0435: "CYRILLIC SMALL LETTER IE", 0x0436: "CYRILLIC SMALL LETTER ZHE", 0x0437: "CYRILLIC SMALL LETTER ZE", 0x0438: "CYRILLIC SMALL LETTER I", 0x0439: "CYRILLIC SMALL LETTER SHORT I", 0x043A: "CYRILLIC SMALL LETTER KA", 0x043B: "CYRILLIC SMALL LETTER EL", 0x043C: "CYRILLIC SMALL LETTER EM", 0x043D: "CYRILLIC SMALL LETTER EN", 0x043E: "CYRILLIC SMALL LETTER O", 0x043F: "CYRILLIC SMALL LETTER PE", 0x0440: "CYRILLIC SMALL LETTER ER", 0x0441: "CYRILLIC SMALL LETTER ES", 0x0442: "CYRILLIC SMALL LETTER TE", 0x0443: "CYRILLIC SMALL LETTER U", 0x0444: "CYRILLIC SMALL LETTER EF", 0x0445: "CYRILLIC SMALL LETTER HA", 0x0446: "CYRILLIC SMALL LETTER TSE", 0x0447: "CYRILLIC SMALL LETTER CHE", 0x0448: "CYRILLIC SMALL LETTER SHA", 0x0449: "CYRILLIC SMALL LETTER SHCHA", 0x044A: "CYRILLIC SMALL LETTER HARD SIGN", 0x044B: "CYRILLIC SMALL LETTER YERU", 0x044C: "CYRILLIC SMALL LETTER SOFT SIGN", 0x044D: "CYRILLIC SMALL LETTER E", 0x044E: "CYRILLIC SMALL LETTER YU", 0x044F: "CYRILLIC SMALL LETTER YA", 0x0450: "CYRILLIC SMALL LETTER IE WITH GRAVE", 0x0451: "CYRILLIC SMALL LETTER IO", 0x0452: "CYRILLIC SMALL LETTER DJE (Serbocroatian)", 0x0453: "CYRILLIC SMALL LETTER GJE", 0x0454: "CYRILLIC SMALL LETTER UKRAINIAN IE", 0x0455: "CYRILLIC SMALL LETTER DZE", 0x0456: "CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I", 0x0457: "CYRILLIC SMALL LETTER YI (Ukrainian)", 0x0458: "CYRILLIC SMALL LETTER JE", 0x0459: "CYRILLIC SMALL LETTER LJE", 0x045A: "CYRILLIC SMALL LETTER NJE", 0x045B: "CYRILLIC SMALL LETTER TSHE (Serbocroatian)", 0x045C: "CYRILLIC SMALL LETTER KJE", 0x045D: "CYRILLIC SMALL LETTER I WITH GRAVE", 0x045E: "CYRILLIC SMALL LETTER SHORT U (Byelorussian)", 0x045F: "CYRILLIC SMALL LETTER DZHE", 0x0460: "CYRILLIC CAPITAL LETTER OMEGA", 0x0461: "CYRILLIC SMALL LETTER OMEGA", 0x0462: "CYRILLIC CAPITAL LETTER YAT", 0x0463: "CYRILLIC SMALL LETTER YAT", 0x0464: "CYRILLIC CAPITAL LETTER IOTIFIED E", 0x0465: "CYRILLIC SMALL LETTER IOTIFIED E", 0x0466: "CYRILLIC CAPITAL LETTER LITTLE YUS", 0x0467: "CYRILLIC SMALL LETTER LITTLE YUS", 0x0468: "CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS", 0x0469: "CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS", 0x046A: "CYRILLIC CAPITAL LETTER BIG YUS", 0x046B: "CYRILLIC SMALL LETTER BIG YUS", 0x046C: "CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS", 0x046D: "CYRILLIC SMALL LETTER IOTIFIED BIG YUS", 0x046E: "CYRILLIC CAPITAL LETTER KSI", 0x046F: "CYRILLIC SMALL LETTER KSI", 0x0470: "CYRILLIC CAPITAL LETTER PSI", 0x0471: "CYRILLIC SMALL LETTER PSI", 0x0472: "CYRILLIC CAPITAL LETTER FITA", 0x0473: "CYRILLIC SMALL LETTER FITA", 0x0474: "CYRILLIC CAPITAL LETTER IZHITSA", 0x0475: "CYRILLIC SMALL LETTER IZHITSA", 0x0476: "CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT", 0x0477: "CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT", 0x0478: "CYRILLIC CAPITAL LETTER UK", 0x0479: "CYRILLIC SMALL LETTER UK", 0x047A: "CYRILLIC CAPITAL LETTER ROUND OMEGA", 0x047B: "CYRILLIC SMALL LETTER ROUND OMEGA", 0x047C: "CYRILLIC CAPITAL LETTER OMEGA WITH TITLO", 0x047D: "CYRILLIC SMALL LETTER OMEGA WITH TITLO", 0x047E: "CYRILLIC CAPITAL LETTER OT", 0x047F: "CYRILLIC SMALL LETTER OT", 0x0480: "CYRILLIC CAPITAL LETTER KOPPA", 0x0481: "CYRILLIC SMALL LETTER KOPPA", 0x0482: "CYRILLIC THOUSANDS SIGN", 0x0483: "COMBINING CYRILLIC TITLO", 0x0484: "COMBINING CYRILLIC PALATALIZATION", 0x0485: "COMBINING CYRILLIC DASIA PNEUMATA", 0x0486: "COMBINING CYRILLIC PSILI PNEUMATA", 0x0487: "COMBINING CYRILLIC POKRYTIE", 0x0488: "COMBINING CYRILLIC HUNDRED THOUSANDS SIGN", 0x0489: "COMBINING CYRILLIC MILLIONS SIGN", 0x048A: "CYRILLIC CAPITAL LETTER SHORT I WITH TAIL", 0x048B: "CYRILLIC SMALL LETTER SHORT I WITH TAIL", 0x048C: "CYRILLIC CAPITAL LETTER SEMISOFT SIGN", 0x048D: "CYRILLIC SMALL LETTER SEMISOFT SIGN", 0x048E: "CYRILLIC CAPITAL LETTER ER WITH TICK", 0x048F: "CYRILLIC SMALL LETTER ER WITH TICK", 0x0490: "CYRILLIC CAPITAL LETTER GHE WITH UPTURN", 0x0491: "CYRILLIC SMALL LETTER GHE WITH UPTURN", 0x0492: "CYRILLIC CAPITAL LETTER GHE WITH STROKE", 0x0493: "CYRILLIC SMALL LETTER GHE WITH STROKE", 0x0494: "CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK", 0x0495: "CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK", 0x0496: "CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER", 0x0497: "CYRILLIC SMALL LETTER ZHE WITH DESCENDER", 0x0498: "CYRILLIC CAPITAL LETTER ZE WITH DESCENDER", 0x0499: "CYRILLIC SMALL LETTER ZE WITH DESCENDER", 0x049A: "CYRILLIC CAPITAL LETTER KA WITH DESCENDER", 0x049B: "CYRILLIC SMALL LETTER KA WITH DESCENDER", 0x049C: "CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE", 0x049D: "CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE", 0x049E: "CYRILLIC CAPITAL LETTER KA WITH STROKE", 0x049F: "CYRILLIC SMALL LETTER KA WITH STROKE", 0x04A0: "CYRILLIC CAPITAL LETTER BASHKIR KA", 0x04A1: "CYRILLIC SMALL LETTER BASHKIR KA", 0x04A2: "CYRILLIC CAPITAL LETTER EN WITH DESCENDER", 0x04A3: "CYRILLIC SMALL LETTER EN WITH DESCENDER", 0x04A4: "CYRILLIC CAPITAL LIGATURE EN GHE", 0x04A5: "CYRILLIC SMALL LIGATURE EN GHE", 0x04A6: "CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK (Abkhasian)", 0x04A7: "CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK (Abkhasian)", 0x04A8: "CYRILLIC CAPITAL LETTER ABKHASIAN HA", 0x04A9: "CYRILLIC SMALL LETTER ABKHASIAN HA", 0x04AA: "CYRILLIC CAPITAL LETTER ES WITH DESCENDER", 0x04AB: "CYRILLIC SMALL LETTER ES WITH DESCENDER", 0x04AC: "CYRILLIC CAPITAL LETTER TE WITH DESCENDER", 0x04AD: "CYRILLIC SMALL LETTER TE WITH DESCENDER", 0x04AE: "CYRILLIC CAPITAL LETTER STRAIGHT U", 0x04AF: "CYRILLIC SMALL LETTER STRAIGHT U", 0x04B0: "CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE", 0x04B1: "CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE", 0x04B2: "CYRILLIC CAPITAL LETTER HA WITH DESCENDER", 0x04B3: "CYRILLIC SMALL LETTER HA WITH DESCENDER", 0x04B4: "CYRILLIC CAPITAL LIGATURE TE TSE (Abkhasian)", 0x04B5: "CYRILLIC SMALL LIGATURE TE TSE (Abkhasian)", 0x04B6: "CYRILLIC CAPITAL LETTER CHE WITH DESCENDER", 0x04B7: "CYRILLIC SMALL LETTER CHE WITH DESCENDER", 0x04B8: "CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE", 0x04B9: "CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE", 0x04BA: "CYRILLIC CAPITAL LETTER SHHA", 0x04BB: "CYRILLIC SMALL LETTER SHHA", 0x04BC: "CYRILLIC CAPITAL LETTER ABKHASIAN CHE", 0x04BD: "CYRILLIC SMALL LETTER ABKHASIAN CHE", 0x04BE: "CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER", 0x04BF: "CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER", 0x04C0: "CYRILLIC LETTER PALOCHKA", 0x04C1: "CYRILLIC CAPITAL LETTER ZHE WITH BREVE", 0x04C2: "CYRILLIC SMALL LETTER ZHE WITH BREVE", 0x04C3: "CYRILLIC CAPITAL LETTER KA WITH HOOK", 0x04C4: "CYRILLIC SMALL LETTER KA WITH HOOK", 0x04C5: "CYRILLIC CAPITAL LETTER EL WITH TAIL", 0x04C6: "CYRILLIC SMALL LETTER EL WITH TAIL", 0x04C7: "CYRILLIC CAPITAL LETTER EN WITH HOOK", 0x04C8: "CYRILLIC SMALL LETTER EN WITH HOOK", 0x04C9: "CYRILLIC CAPITAL LETTER EN WITH TAIL", 0x04CA: "CYRILLIC SMALL LETTER EN WITH TAIL", 0x04CB: "CYRILLIC CAPITAL LETTER KHAKASSIAN CHE", 0x04CC: "CYRILLIC SMALL LETTER KHAKASSIAN CHE", 0x04CD: "CYRILLIC CAPITAL LETTER EM WITH TAIL", 0x04CE: "CYRILLIC SMALL LETTER EM WITH TAIL", 0x04CF: "CYRILLIC SMALL LETTER PALOCHKA", 0x04D0: "CYRILLIC CAPITAL LETTER A WITH BREVE", 0x04D1: "CYRILLIC SMALL LETTER A WITH BREVE", 0x04D2: "CYRILLIC CAPITAL LETTER A WITH DIAERESIS", 0x04D3: "CYRILLIC SMALL LETTER A WITH DIAERESIS", 0x04D4: "CYRILLIC CAPITAL LIGATURE A IE", 0x04D5: "CYRILLIC SMALL LIGATURE A IE", 0x04D6: "CYRILLIC CAPITAL LETTER IE WITH BREVE", 0x04D7: "CYRILLIC SMALL LETTER IE WITH BREVE", 0x04D8: "CYRILLIC CAPITAL LETTER SCHWA", 0x04D9: "CYRILLIC SMALL LETTER SCHWA", 0x04DA: "CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS", 0x04DB: "CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS", 0x04DC: "CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS", 0x04DD: "CYRILLIC SMALL LETTER ZHE WITH DIAERESIS", 0x04DE: "CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS", 0x04DF: "CYRILLIC SMALL LETTER ZE WITH DIAERESIS", 0x04E0: "CYRILLIC CAPITAL LETTER ABKHASIAN DZE", 0x04E1: "CYRILLIC SMALL LETTER ABKHASIAN DZE", 0x04E2: "CYRILLIC CAPITAL LETTER I WITH MACRON", 0x04E3: "CYRILLIC SMALL LETTER I WITH MACRON", 0x04E4: "CYRILLIC CAPITAL LETTER I WITH DIAERESIS", 0x04E5: "CYRILLIC SMALL LETTER I WITH DIAERESIS", 0x04E6: "CYRILLIC CAPITAL LETTER O WITH DIAERESIS", 0x04E7: "CYRILLIC SMALL LETTER O WITH DIAERESIS", 0x04E8: "CYRILLIC CAPITAL LETTER BARRED O", 0x04E9: "CYRILLIC SMALL LETTER BARRED O", 0x04EA: "CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS", 0x04EB: "CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS", 0x04EC: "CYRILLIC CAPITAL LETTER E WITH DIAERESIS", 0x04ED: "CYRILLIC SMALL LETTER E WITH DIAERESIS", 0x04EE: "CYRILLIC CAPITAL LETTER U WITH MACRON", 0x04EF: "CYRILLIC SMALL LETTER U WITH MACRON", 0x04F0: "CYRILLIC CAPITAL LETTER U WITH DIAERESIS", 0x04F1: "CYRILLIC SMALL LETTER U WITH DIAERESIS", 0x04F2: "CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE", 0x04F3: "CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE", 0x04F4: "CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS", 0x04F5: "CYRILLIC SMALL LETTER CHE WITH DIAERESIS", 0x04F6: "CYRILLIC CAPITAL LETTER GHE WITH DESCENDER", 0x04F7: "CYRILLIC SMALL LETTER GHE WITH DESCENDER", 0x04F8: "CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS", 0x04F9: "CYRILLIC SMALL LETTER YERU WITH DIAERESIS", 0x04FA: "CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK", 0x04FB: "CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK", 0x04FC: "CYRILLIC CAPITAL LETTER HA WITH HOOK", 0x04FD: "CYRILLIC SMALL LETTER HA WITH HOOK", 0x04FE: "CYRILLIC CAPITAL LETTER HA WITH STROKE", 0x04FF: "CYRILLIC SMALL LETTER HA WITH STROKE", 0x0500: "CYRILLIC CAPITAL LETTER KOMI DE", 0x0501: "CYRILLIC SMALL LETTER KOMI DE", 0x0502: "CYRILLIC CAPITAL LETTER KOMI DJE", 0x0503: "CYRILLIC SMALL LETTER KOMI DJE", 0x0504: "CYRILLIC CAPITAL LETTER KOMI ZJE", 0x0505: "CYRILLIC SMALL LETTER KOMI ZJE", 0x0506: "CYRILLIC CAPITAL LETTER KOMI DZJE", 0x0507: "CYRILLIC SMALL LETTER KOMI DZJE", 0x0508: "CYRILLIC CAPITAL LETTER KOMI LJE", 0x0509: "CYRILLIC SMALL LETTER KOMI LJE", 0x050A: "CYRILLIC CAPITAL LETTER KOMI NJE", 0x050B: "CYRILLIC SMALL LETTER KOMI NJE", 0x050C: "CYRILLIC CAPITAL LETTER KOMI SJE", 0x050D: "CYRILLIC SMALL LETTER KOMI SJE", 0x050E: "CYRILLIC CAPITAL LETTER KOMI TJE", 0x050F: "CYRILLIC SMALL LETTER KOMI TJE", 0x0510: "CYRILLIC CAPITAL LETTER REVERSED ZE", 0x0511: "CYRILLIC SMALL LETTER REVERSED ZE", 0x0512: "CYRILLIC CAPITAL LETTER EL WITH HOOK", 0x0513: "CYRILLIC SMALL LETTER EL WITH HOOK", 0x0514: "CYRILLIC CAPITAL LETTER LHA", 0x0515: "CYRILLIC SMALL LETTER LHA", 0x0516: "CYRILLIC CAPITAL LETTER RHA", 0x0517: "CYRILLIC SMALL LETTER RHA", 0x0518: "CYRILLIC CAPITAL LETTER YAE", 0x0519: "CYRILLIC SMALL LETTER YAE", 0x051A: "CYRILLIC CAPITAL LETTER QA", 0x051B: "CYRILLIC SMALL LETTER QA", 0x051C: "CYRILLIC CAPITAL LETTER WE", 0x051D: "CYRILLIC SMALL LETTER WE", 0x051E: "CYRILLIC CAPITAL LETTER ALEUT KA", 0x051F: "CYRILLIC SMALL LETTER ALEUT KA", 0x0520: "CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK", 0x0521: "CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK", 0x0522: "CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK", 0x0523: "CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK", 0x0531: "ARMENIAN CAPITAL LETTER AYB", 0x0532: "ARMENIAN CAPITAL LETTER BEN", 0x0533: "ARMENIAN CAPITAL LETTER GIM", 0x0534: "ARMENIAN CAPITAL LETTER DA", 0x0535: "ARMENIAN CAPITAL LETTER ECH", 0x0536: "ARMENIAN CAPITAL LETTER ZA", 0x0537: "ARMENIAN CAPITAL LETTER EH", 0x0538: "ARMENIAN CAPITAL LETTER ET", 0x0539: "ARMENIAN CAPITAL LETTER TO", 0x053A: "ARMENIAN CAPITAL LETTER ZHE", 0x053B: "ARMENIAN CAPITAL LETTER INI", 0x053C: "ARMENIAN CAPITAL LETTER LIWN", 0x053D: "ARMENIAN CAPITAL LETTER XEH", 0x053E: "ARMENIAN CAPITAL LETTER CA", 0x053F: "ARMENIAN CAPITAL LETTER KEN", 0x0540: "ARMENIAN CAPITAL LETTER HO", 0x0541: "ARMENIAN CAPITAL LETTER JA", 0x0542: "ARMENIAN CAPITAL LETTER GHAD", 0x0543: "ARMENIAN CAPITAL LETTER CHEH", 0x0544: "ARMENIAN CAPITAL LETTER MEN", 0x0545: "ARMENIAN CAPITAL LETTER YI", 0x0546: "ARMENIAN CAPITAL LETTER NOW", 0x0547: "ARMENIAN CAPITAL LETTER SHA", 0x0548: "ARMENIAN CAPITAL LETTER VO", 0x0549: "ARMENIAN CAPITAL LETTER CHA", 0x054A: "ARMENIAN CAPITAL LETTER PEH", 0x054B: "ARMENIAN CAPITAL LETTER JHEH", 0x054C: "ARMENIAN CAPITAL LETTER RA", 0x054D: "ARMENIAN CAPITAL LETTER SEH", 0x054E: "ARMENIAN CAPITAL LETTER VEW", 0x054F: "ARMENIAN CAPITAL LETTER TIWN", 0x0550: "ARMENIAN CAPITAL LETTER REH", 0x0551: "ARMENIAN CAPITAL LETTER CO", 0x0552: "ARMENIAN CAPITAL LETTER YIWN", 0x0553: "ARMENIAN CAPITAL LETTER PIWR", 0x0554: "ARMENIAN CAPITAL LETTER KEH", 0x0555: "ARMENIAN CAPITAL LETTER OH", 0x0556: "ARMENIAN CAPITAL LETTER FEH", 0x0559: "ARMENIAN MODIFIER LETTER LEFT HALF RING", 0x055A: "ARMENIAN APOSTROPHE", 0x055B: "ARMENIAN EMPHASIS MARK", 0x055C: "ARMENIAN EXCLAMATION MARK", 0x055D: "ARMENIAN COMMA", 0x055E: "ARMENIAN QUESTION MARK", 0x055F: "ARMENIAN ABBREVIATION MARK", 0x0561: "ARMENIAN SMALL LETTER AYB", 0x0562: "ARMENIAN SMALL LETTER BEN", 0x0563: "ARMENIAN SMALL LETTER GIM", 0x0564: "ARMENIAN SMALL LETTER DA", 0x0565: "ARMENIAN SMALL LETTER ECH", 0x0566: "ARMENIAN SMALL LETTER ZA", 0x0567: "ARMENIAN SMALL LETTER EH", 0x0568: "ARMENIAN SMALL LETTER ET", 0x0569: "ARMENIAN SMALL LETTER TO", 0x056A: "ARMENIAN SMALL LETTER ZHE", 0x056B: "ARMENIAN SMALL LETTER INI", 0x056C: "ARMENIAN SMALL LETTER LIWN", 0x056D: "ARMENIAN SMALL LETTER XEH", 0x056E: "ARMENIAN SMALL LETTER CA", 0x056F: "ARMENIAN SMALL LETTER KEN", 0x0570: "ARMENIAN SMALL LETTER HO", 0x0571: "ARMENIAN SMALL LETTER JA", 0x0572: "ARMENIAN SMALL LETTER GHAD", 0x0573: "ARMENIAN SMALL LETTER CHEH", 0x0574: "ARMENIAN SMALL LETTER MEN", 0x0575: "ARMENIAN SMALL LETTER YI", 0x0576: "ARMENIAN SMALL LETTER NOW", 0x0577: "ARMENIAN SMALL LETTER SHA", 0x0578: "ARMENIAN SMALL LETTER VO", 0x0579: "ARMENIAN SMALL LETTER CHA", 0x057A: "ARMENIAN SMALL LETTER PEH", 0x057B: "ARMENIAN SMALL LETTER JHEH", 0x057C: "ARMENIAN SMALL LETTER RA", 0x057D: "ARMENIAN SMALL LETTER SEH", 0x057E: "ARMENIAN SMALL LETTER VEW", 0x057F: "ARMENIAN SMALL LETTER TIWN", 0x0580: "ARMENIAN SMALL LETTER REH", 0x0581: "ARMENIAN SMALL LETTER CO", 0x0582: "ARMENIAN SMALL LETTER YIWN", 0x0583: "ARMENIAN SMALL LETTER PIWR", 0x0584: "ARMENIAN SMALL LETTER KEH", 0x0585: "ARMENIAN SMALL LETTER OH", 0x0586: "ARMENIAN SMALL LETTER FEH", 0x0587: "ARMENIAN SMALL LIGATURE ECH YIWN", 0x0589: "ARMENIAN FULL STOP", 0x058A: "ARMENIAN HYPHEN", 0x0591: "HEBREW ACCENT ETNAHTA", 0x0592: "HEBREW ACCENT SEGOL", 0x0593: "HEBREW ACCENT SHALSHELET", 0x0594: "HEBREW ACCENT ZAQEF QATAN", 0x0595: "HEBREW ACCENT ZAQEF GADOL", 0x0596: "HEBREW ACCENT TIPEHA *", 0x0597: "HEBREW ACCENT REVIA", 0x0598: "HEBREW ACCENT ZARQA *", 0x0599: "HEBREW ACCENT PASHTA", 0x059A: "HEBREW ACCENT YETIV", 0x059B: "HEBREW ACCENT TEVIR", 0x059C: "HEBREW ACCENT GERESH", 0x059D: "HEBREW ACCENT GERESH MUQDAM", 0x059E: "HEBREW ACCENT GERSHAYIM", 0x059F: "HEBREW ACCENT QARNEY PARA", 0x05A0: "HEBREW ACCENT TELISHA GEDOLA", 0x05A1: "HEBREW ACCENT PAZER", 0x05A2: "HEBREW ACCENT ATNAH HAFUKH", 0x05A3: "HEBREW ACCENT MUNAH", 0x05A4: "HEBREW ACCENT MAHAPAKH", 0x05A5: "HEBREW ACCENT MERKHA *", 0x05A6: "HEBREW ACCENT MERKHA KEFULA", 0x05A7: "HEBREW ACCENT DARGA", 0x05A8: "HEBREW ACCENT QADMA *", 0x05A9: "HEBREW ACCENT TELISHA QETANA", 0x05AA: "HEBREW ACCENT YERAH BEN YOMO *", 0x05AB: "HEBREW ACCENT OLE", 0x05AC: "HEBREW ACCENT ILUY", 0x05AD: "HEBREW ACCENT DEHI", 0x05AE: "HEBREW ACCENT ZINOR", 0x05AF: "HEBREW MARK MASORA CIRCLE", 0x05B0: "HEBREW POINT SHEVA", 0x05B1: "HEBREW POINT HATAF SEGOL", 0x05B2: "HEBREW POINT HATAF PATAH", 0x05B3: "HEBREW POINT HATAF QAMATS", 0x05B4: "HEBREW POINT HIRIQ", 0x05B5: "HEBREW POINT TSERE", 0x05B6: "HEBREW POINT SEGOL", 0x05B7: "HEBREW POINT PATAH", 0x05B8: "HEBREW POINT QAMATS", 0x05B9: "HEBREW POINT HOLAM", 0x05BA: "HEBREW POINT HOLAM HASER FOR VAV", 0x05BB: "HEBREW POINT QUBUTS", 0x05BC: "HEBREW POINT DAGESH OR MAPIQ (or shuruq)", 0x05BD: "HEBREW POINT METEG *", 0x05BE: "HEBREW PUNCTUATION MAQAF", 0x05BF: "HEBREW POINT RAFE", 0x05C0: "HEBREW PUNCTUATION PASEQ *", 0x05C1: "HEBREW POINT SHIN DOT", 0x05C2: "HEBREW POINT SIN DOT", 0x05C3: "HEBREW PUNCTUATION SOF PASUQ *", 0x05C4: "HEBREW MARK UPPER DOT", 0x05C5: "HEBREW MARK LOWER DOT", 0x05C6: "HEBREW PUNCTUATION NUN HAFUKHA", 0x05C7: "HEBREW POINT QAMATS QATAN", 0x05D0: "HEBREW LETTER ALEF", 0x05D1: "HEBREW LETTER BET", 0x05D2: "HEBREW LETTER GIMEL", 0x05D3: "HEBREW LETTER DALET", 0x05D4: "HEBREW LETTER HE", 0x05D5: "HEBREW LETTER VAV", 0x05D6: "HEBREW LETTER ZAYIN", 0x05D7: "HEBREW LETTER HET", 0x05D8: "HEBREW LETTER TET", 0x05D9: "HEBREW LETTER YOD", 0x05DA: "HEBREW LETTER FINAL KAF", 0x05DB: "HEBREW LETTER KAF", 0x05DC: "HEBREW LETTER LAMED", 0x05DD: "HEBREW LETTER FINAL MEM", 0x05DE: "HEBREW LETTER MEM", 0x05DF: "HEBREW LETTER FINAL NUN", 0x05E0: "HEBREW LETTER NUN", 0x05E1: "HEBREW LETTER SAMEKH", 0x05E2: "HEBREW LETTER AYIN", 0x05E3: "HEBREW LETTER FINAL PE", 0x05E4: "HEBREW LETTER PE", 0x05E5: "HEBREW LETTER FINAL TSADI", 0x05E6: "HEBREW LETTER TSADI", 0x05E7: "HEBREW LETTER QOF", 0x05E8: "HEBREW LETTER RESH", 0x05E9: "HEBREW LETTER SHIN", 0x05EA: "HEBREW LETTER TAV", 0x05F0: "HEBREW LIGATURE YIDDISH DOUBLE VAV", 0x05F1: "HEBREW LIGATURE YIDDISH VAV YOD", 0x05F2: "HEBREW LIGATURE YIDDISH DOUBLE YOD", 0x05F3: "HEBREW PUNCTUATION GERESH", 0x05F4: "HEBREW PUNCTUATION GERSHAYIM", 0x0600: "ARABIC NUMBER SIGN", 0x0601: "ARABIC SIGN SANAH", 0x0602: "ARABIC FOOTNOTE MARKER", 0x0603: "ARABIC SIGN SAFHA", 0x0606: "ARABIC-INDIC CUBE ROOT", 0x0607: "ARABIC-INDIC FOURTH ROOT", 0x0608: "ARABIC RAY", 0x0609: "ARABIC-INDIC PER MILLE SIGN", 0x060A: "ARABIC-INDIC PER TEN THOUSAND SIGN", 0x060B: "AFGHANI SIGN", 0x060C: "ARABIC COMMA", 0x060D: "ARABIC DATE SEPARATOR", 0x060E: "ARABIC POETIC VERSE SIGN", 0x060F: "ARABIC SIGN MISRA", 0x0610: "ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM", 0x0611: "ARABIC SIGN ALAYHE ASSALLAM", 0x0612: "ARABIC SIGN RAHMATULLAH ALAYHE", 0x0613: "ARABIC SIGN RADI ALLAHOU ANHU", 0x0614: "ARABIC SIGN TAKHALLUS", 0x0615: "ARABIC SMALL HIGH TAH", 0x0616: "ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH", 0x0617: "ARABIC SMALL HIGH ZAIN", 0x0618: "ARABIC SMALL FATHA", 0x0619: "ARABIC SMALL DAMMA", 0x061A: "ARABIC SMALL KASRA", 0x061B: "ARABIC SEMICOLON", 0x061E: "ARABIC TRIPLE DOT PUNCTUATION MARK", 0x061F: "ARABIC QUESTION MARK", 0x0621: "ARABIC LETTER HAMZA", 0x0622: "ARABIC LETTER ALEF WITH MADDA ABOVE", 0x0623: "ARABIC LETTER ALEF WITH HAMZA ABOVE", 0x0624: "ARABIC LETTER WAW WITH HAMZA ABOVE", 0x0625: "ARABIC LETTER ALEF WITH HAMZA BELOW", 0x0626: "ARABIC LETTER YEH WITH HAMZA ABOVE", 0x0627: "ARABIC LETTER ALEF", 0x0628: "ARABIC LETTER BEH", 0x0629: "ARABIC LETTER TEH MARBUTA", 0x062A: "ARABIC LETTER TEH", 0x062B: "ARABIC LETTER THEH", 0x062C: "ARABIC LETTER JEEM", 0x062D: "ARABIC LETTER HAH", 0x062E: "ARABIC LETTER KHAH", 0x062F: "ARABIC LETTER DAL", 0x0630: "ARABIC LETTER THAL", 0x0631: "ARABIC LETTER REH", 0x0632: "ARABIC LETTER ZAIN", 0x0633: "ARABIC LETTER SEEN", 0x0634: "ARABIC LETTER SHEEN", 0x0635: "ARABIC LETTER SAD", 0x0636: "ARABIC LETTER DAD", 0x0637: "ARABIC LETTER TAH", 0x0638: "ARABIC LETTER ZAH", 0x0639: "ARABIC LETTER AIN", 0x063A: "ARABIC LETTER GHAIN", 0x063B: "ARABIC LETTER KEHEH WITH TWO DOTS ABOVE", 0x063C: "ARABIC LETTER KEHEH WITH THREE DOTS BELOW", 0x063D: "ARABIC LETTER FARSI YEH WITH INVERTED V", 0x063E: "ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE", 0x063F: "ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE", 0x0640: "ARABIC TATWEEL", 0x0641: "ARABIC LETTER FEH", 0x0642: "ARABIC LETTER QAF", 0x0643: "ARABIC LETTER KAF", 0x0644: "ARABIC LETTER LAM", 0x0645: "ARABIC LETTER MEEM", 0x0646: "ARABIC LETTER NOON", 0x0647: "ARABIC LETTER HEH", 0x0648: "ARABIC LETTER WAW", 0x0649: "ARABIC LETTER ALEF MAKSURA", 0x064A: "ARABIC LETTER YEH", 0x064B: "ARABIC FATHATAN", 0x064C: "ARABIC DAMMATAN", 0x064D: "ARABIC KASRATAN", 0x064E: "ARABIC FATHA", 0x064F: "ARABIC DAMMA", 0x0650: "ARABIC KASRA", 0x0651: "ARABIC SHADDA", 0x0652: "ARABIC SUKUN", 0x0653: "ARABIC MADDAH ABOVE", 0x0654: "ARABIC HAMZA ABOVE", 0x0655: "ARABIC HAMZA BELOW", 0x0656: "ARABIC SUBSCRIPT ALEF", 0x0657: "ARABIC INVERTED DAMMA", 0x0658: "ARABIC MARK NOON GHUNNA", 0x0659: "ARABIC ZWARAKAY", 0x065A: "ARABIC VOWEL SIGN SMALL V ABOVE", 0x065B: "ARABIC VOWEL SIGN INVERTED SMALL V ABOVE", 0x065C: "ARABIC VOWEL SIGN DOT BELOW", 0x065D: "ARABIC REVERSED DAMMA", 0x065E: "ARABIC FATHA WITH TWO DOTS", 0x0660: "ARABIC-INDIC DIGIT ZERO", 0x0661: "ARABIC-INDIC DIGIT ONE", 0x0662: "ARABIC-INDIC DIGIT TWO", 0x0663: "ARABIC-INDIC DIGIT THREE", 0x0664: "ARABIC-INDIC DIGIT FOUR", 0x0665: "ARABIC-INDIC DIGIT FIVE", 0x0666: "ARABIC-INDIC DIGIT SIX", 0x0667: "ARABIC-INDIC DIGIT SEVEN", 0x0668: "ARABIC-INDIC DIGIT EIGHT", 0x0669: "ARABIC-INDIC DIGIT NINE", 0x066A: "ARABIC PERCENT SIGN", 0x066B: "ARABIC DECIMAL SEPARATOR", 0x066C: "ARABIC THOUSANDS SEPARATOR", 0x066D: "ARABIC FIVE POINTED STAR", 0x066E: "ARABIC LETTER DOTLESS BEH", 0x066F: "ARABIC LETTER DOTLESS QAF", 0x0670: "ARABIC LETTER SUPERSCRIPT ALEF", 0x0671: "ARABIC LETTER ALEF WASLA", 0x0672: "ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE", 0x0673: "ARABIC LETTER ALEF WITH WAVY HAMZA BELOW", 0x0674: "ARABIC LETTER HIGH HAMZA", 0x0675: "ARABIC LETTER HIGH HAMZA ALEF", 0x0676: "ARABIC LETTER HIGH HAMZA WAW", 0x0677: "ARABIC LETTER U WITH HAMZA ABOVE", 0x0678: "ARABIC LETTER HIGH HAMZA YEH", 0x0679: "ARABIC LETTER TTEH", 0x067A: "ARABIC LETTER TTEHEH", 0x067B: "ARABIC LETTER BEEH", 0x067C: "ARABIC LETTER TEH WITH RING", 0x067D: "ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS", 0x067E: "ARABIC LETTER PEH", 0x067F: "ARABIC LETTER TEHEH", 0x0680: "ARABIC LETTER BEHEH", 0x0681: "ARABIC LETTER HAH WITH HAMZA ABOVE", 0x0682: "ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE", 0x0683: "ARABIC LETTER NYEH", 0x0684: "ARABIC LETTER DYEH", 0x0685: "ARABIC LETTER HAH WITH THREE DOTS ABOVE", 0x0686: "ARABIC LETTER TCHEH", 0x0687: "ARABIC LETTER TCHEHEH", 0x0688: "ARABIC LETTER DDAL", 0x0689: "ARABIC LETTER DAL WITH RING", 0x068A: "ARABIC LETTER DAL WITH DOT BELOW", 0x068B: "ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH", 0x068C: "ARABIC LETTER DAHAL", 0x068D: "ARABIC LETTER DDAHAL", 0x068E: "ARABIC LETTER DUL", 0x068F: "ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS", 0x0690: "ARABIC LETTER DAL WITH FOUR DOTS ABOVE", 0x0691: "ARABIC LETTER RREH", 0x0692: "ARABIC LETTER REH WITH SMALL V", 0x0693: "ARABIC LETTER REH WITH RING", 0x0694: "ARABIC LETTER REH WITH DOT BELOW", 0x0695: "ARABIC LETTER REH WITH SMALL V BELOW", 0x0696: "ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE", 0x0697: "ARABIC LETTER REH WITH TWO DOTS ABOVE", 0x0698: "ARABIC LETTER JEH", 0x0699: "ARABIC LETTER REH WITH FOUR DOTS ABOVE", 0x069A: "ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE", 0x069B: "ARABIC LETTER SEEN WITH THREE DOTS BELOW", 0x069C: "ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE", 0x069D: "ARABIC LETTER SAD WITH TWO DOTS BELOW", 0x069E: "ARABIC LETTER SAD WITH THREE DOTS ABOVE", 0x069F: "ARABIC LETTER TAH WITH THREE DOTS ABOVE", 0x06A0: "ARABIC LETTER AIN WITH THREE DOTS ABOVE", 0x06A1: "ARABIC LETTER DOTLESS FEH", 0x06A2: "ARABIC LETTER FEH WITH DOT MOVED BELOW", 0x06A3: "ARABIC LETTER FEH WITH DOT BELOW", 0x06A4: "ARABIC LETTER VEH", 0x06A5: "ARABIC LETTER FEH WITH THREE DOTS BELOW", 0x06A6: "ARABIC LETTER PEHEH", 0x06A7: "ARABIC LETTER QAF WITH DOT ABOVE", 0x06A8: "ARABIC LETTER QAF WITH THREE DOTS ABOVE", 0x06A9: "ARABIC LETTER KEHEH", 0x06AA: "ARABIC LETTER SWASH KAF", 0x06AB: "ARABIC LETTER KAF WITH RING", 0x06AC: "ARABIC LETTER KAF WITH DOT ABOVE", 0x06AD: "ARABIC LETTER NG", 0x06AE: "ARABIC LETTER KAF WITH THREE DOTS BELOW", 0x06AF: "ARABIC LETTER GAF *", 0x06B0: "ARABIC LETTER GAF WITH RING", 0x06B1: "ARABIC LETTER NGOEH", 0x06B2: "ARABIC LETTER GAF WITH TWO DOTS BELOW", 0x06B3: "ARABIC LETTER GUEH", 0x06B4: "ARABIC LETTER GAF WITH THREE DOTS ABOVE", 0x06B5: "ARABIC LETTER LAM WITH SMALL V", 0x06B6: "ARABIC LETTER LAM WITH DOT ABOVE", 0x06B7: "ARABIC LETTER LAM WITH THREE DOTS ABOVE", 0x06B8: "ARABIC LETTER LAM WITH THREE DOTS BELOW", 0x06B9: "ARABIC LETTER NOON WITH DOT BELOW", 0x06BA: "ARABIC LETTER NOON GHUNNA", 0x06BB: "ARABIC LETTER RNOON", 0x06BC: "ARABIC LETTER NOON WITH RING", 0x06BD: "ARABIC LETTER NOON WITH THREE DOTS ABOVE", 0x06BE: "ARABIC LETTER HEH DOACHASHMEE", 0x06BF: "ARABIC LETTER TCHEH WITH DOT ABOVE", 0x06C0: "ARABIC LETTER HEH WITH YEH ABOVE", 0x06C1: "ARABIC LETTER HEH GOAL", 0x06C2: "ARABIC LETTER HEH GOAL WITH HAMZA ABOVE", 0x06C3: "ARABIC LETTER TEH MARBUTA GOAL", 0x06C4: "ARABIC LETTER WAW WITH RING", 0x06C5: "ARABIC LETTER KIRGHIZ OE", 0x06C6: "ARABIC LETTER OE", 0x06C7: "ARABIC LETTER U", 0x06C8: "ARABIC LETTER YU", 0x06C9: "ARABIC LETTER KIRGHIZ YU", 0x06CA: "ARABIC LETTER WAW WITH TWO DOTS ABOVE", 0x06CB: "ARABIC LETTER VE", 0x06CC: "ARABIC LETTER FARSI YEH", 0x06CD: "ARABIC LETTER YEH WITH TAIL", 0x06CE: "ARABIC LETTER YEH WITH SMALL V", 0x06CF: "ARABIC LETTER WAW WITH DOT ABOVE", 0x06D0: "ARABIC LETTER E *", 0x06D1: "ARABIC LETTER YEH WITH THREE DOTS BELOW", 0x06D2: "ARABIC LETTER YEH BARREE", 0x06D3: "ARABIC LETTER YEH BARREE WITH HAMZA ABOVE", 0x06D4: "ARABIC FULL STOP", 0x06D5: "ARABIC LETTER AE", 0x06D6: "ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA", 0x06D7: "ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA", 0x06D8: "ARABIC SMALL HIGH MEEM INITIAL FORM", 0x06D9: "ARABIC SMALL HIGH LAM ALEF", 0x06DA: "ARABIC SMALL HIGH JEEM", 0x06DB: "ARABIC SMALL HIGH THREE DOTS", 0x06DC: "ARABIC SMALL HIGH SEEN", 0x06DD: "ARABIC END OF AYAH", 0x06DE: "ARABIC START OF RUB EL HIZB", 0x06DF: "ARABIC SMALL HIGH ROUNDED ZERO", 0x06E0: "ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO", 0x06E1: "ARABIC SMALL HIGH DOTLESS HEAD OF KHAH", 0x06E2: "ARABIC SMALL HIGH MEEM ISOLATED FORM", 0x06E3: "ARABIC SMALL LOW SEEN", 0x06E4: "ARABIC SMALL HIGH MADDA", 0x06E5: "ARABIC SMALL WAW", 0x06E6: "ARABIC SMALL YEH", 0x06E7: "ARABIC SMALL HIGH YEH", 0x06E8: "ARABIC SMALL HIGH NOON", 0x06E9: "ARABIC PLACE OF SAJDAH", 0x06EA: "ARABIC EMPTY CENTRE LOW STOP", 0x06EB: "ARABIC EMPTY CENTRE HIGH STOP", 0x06EC: "ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE", 0x06ED: "ARABIC SMALL LOW MEEM", 0x06EE: "ARABIC LETTER DAL WITH INVERTED V", 0x06EF: "ARABIC LETTER REH WITH INVERTED V", 0x06F0: "EXTENDED ARABIC-INDIC DIGIT ZERO", 0x06F1: "EXTENDED ARABIC-INDIC DIGIT ONE", 0x06F2: "EXTENDED ARABIC-INDIC DIGIT TWO", 0x06F3: "EXTENDED ARABIC-INDIC DIGIT THREE", 0x06F4: "EXTENDED ARABIC-INDIC DIGIT FOUR", 0x06F5: "EXTENDED ARABIC-INDIC DIGIT FIVE", 0x06F6: "EXTENDED ARABIC-INDIC DIGIT SIX", 0x06F7: "EXTENDED ARABIC-INDIC DIGIT SEVEN", 0x06F8: "EXTENDED ARABIC-INDIC DIGIT EIGHT", 0x06F9: "EXTENDED ARABIC-INDIC DIGIT NINE", 0x06FA: "ARABIC LETTER SHEEN WITH DOT BELOW", 0x06FB: "ARABIC LETTER DAD WITH DOT BELOW", 0x06FC: "ARABIC LETTER GHAIN WITH DOT BELOW", 0x06FD: "ARABIC SIGN SINDHI AMPERSAND", 0x06FE: "ARABIC SIGN SINDHI POSTPOSITION MEN", 0x06FF: "ARABIC LETTER HEH WITH INVERTED V", 0x0700: "SYRIAC END OF PARAGRAPH", 0x0701: "SYRIAC SUPRALINEAR FULL STOP", 0x0702: "SYRIAC SUBLINEAR FULL STOP", 0x0703: "SYRIAC SUPRALINEAR COLON", 0x0704: "SYRIAC SUBLINEAR COLON", 0x0705: "SYRIAC HORIZONTAL COLON", 0x0706: "SYRIAC COLON SKEWED LEFT", 0x0707: "SYRIAC COLON SKEWED RIGHT", 0x0708: "SYRIAC SUPRALINEAR COLON SKEWED LEFT", 0x0709: "SYRIAC SUBLINEAR COLON SKEWED RIGHT", 0x070A: "SYRIAC CONTRACTION", 0x070B: "SYRIAC HARKLEAN OBELUS", 0x070C: "SYRIAC HARKLEAN METOBELUS", 0x070D: "SYRIAC HARKLEAN ASTERISCUS", 0x070F: "SYRIAC ABBREVIATION MARK", 0x0710: "SYRIAC LETTER ALAPH", 0x0711: "SYRIAC LETTER SUPERSCRIPT ALAPH", 0x0712: "SYRIAC LETTER BETH", 0x0713: "SYRIAC LETTER GAMAL", 0x0714: "SYRIAC LETTER GAMAL GARSHUNI", 0x0715: "SYRIAC LETTER DALATH", 0x0716: "SYRIAC LETTER DOTLESS DALATH RISH", 0x0717: "SYRIAC LETTER HE", 0x0718: "SYRIAC LETTER WAW", 0x0719: "SYRIAC LETTER ZAIN", 0x071A: "SYRIAC LETTER HETH", 0x071B: "SYRIAC LETTER TETH", 0x071C: "SYRIAC LETTER TETH GARSHUNI", 0x071D: "SYRIAC LETTER YUDH", 0x071E: "SYRIAC LETTER YUDH HE", 0x071F: "SYRIAC LETTER KAPH", 0x0720: "SYRIAC LETTER LAMADH", 0x0721: "SYRIAC LETTER MIM", 0x0722: "SYRIAC LETTER NUN", 0x0723: "SYRIAC LETTER SEMKATH", 0x0724: "SYRIAC LETTER FINAL SEMKATH", 0x0725: "SYRIAC LETTER E", 0x0726: "SYRIAC LETTER PE", 0x0727: "SYRIAC LETTER REVERSED PE", 0x0728: "SYRIAC LETTER SADHE", 0x0729: "SYRIAC LETTER QAPH", 0x072A: "SYRIAC LETTER RISH", 0x072B: "SYRIAC LETTER SHIN", 0x072C: "SYRIAC LETTER TAW", 0x072D: "SYRIAC LETTER PERSIAN BHETH", 0x072E: "SYRIAC LETTER PERSIAN GHAMAL", 0x072F: "SYRIAC LETTER PERSIAN DHALATH", 0x0730: "SYRIAC PTHAHA ABOVE", 0x0731: "SYRIAC PTHAHA BELOW", 0x0732: "SYRIAC PTHAHA DOTTED", 0x0733: "SYRIAC ZQAPHA ABOVE", 0x0734: "SYRIAC ZQAPHA BELOW", 0x0735: "SYRIAC ZQAPHA DOTTED", 0x0736: "SYRIAC RBASA ABOVE", 0x0737: "SYRIAC RBASA BELOW", 0x0738: "SYRIAC DOTTED ZLAMA HORIZONTAL", 0x0739: "SYRIAC DOTTED ZLAMA ANGULAR", 0x073A: "SYRIAC HBASA ABOVE", 0x073B: "SYRIAC HBASA BELOW", 0x073C: "SYRIAC HBASA-ESASA DOTTED", 0x073D: "SYRIAC ESASA ABOVE", 0x073E: "SYRIAC ESASA BELOW", 0x073F: "SYRIAC RWAHA", 0x0740: "SYRIAC FEMININE DOT", 0x0741: "SYRIAC QUSHSHAYA", 0x0742: "SYRIAC RUKKAKHA", 0x0743: "SYRIAC TWO VERTICAL DOTS ABOVE", 0x0744: "SYRIAC TWO VERTICAL DOTS BELOW", 0x0745: "SYRIAC THREE DOTS ABOVE", 0x0746: "SYRIAC THREE DOTS BELOW", 0x0747: "SYRIAC OBLIQUE LINE ABOVE", 0x0748: "SYRIAC OBLIQUE LINE BELOW", 0x0749: "SYRIAC MUSIC", 0x074A: "SYRIAC BARREKH", 0x074D: "SYRIAC LETTER SOGDIAN ZHAIN", 0x074E: "SYRIAC LETTER SOGDIAN KHAPH", 0x074F: "SYRIAC LETTER SOGDIAN FE", 0x0750: "ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW", 0x0751: "ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE", 0x0752: "ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW", 0x0753: "ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE", 0x0754: "ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE", 0x0755: "ARABIC LETTER BEH WITH INVERTED SMALL V BELOW", 0x0756: "ARABIC LETTER BEH WITH SMALL V", 0x0757: "ARABIC LETTER HAH WITH TWO DOTS ABOVE", 0x0758: "ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW", 0x0759: "ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH", 0x075A: "ARABIC LETTER DAL WITH INVERTED SMALL V BELOW", 0x075B: "ARABIC LETTER REH WITH STROKE", 0x075C: "ARABIC LETTER SEEN WITH FOUR DOTS ABOVE", 0x075D: "ARABIC LETTER AIN WITH TWO DOTS ABOVE", 0x075E: "ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE", 0x075F: "ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE", 0x0760: "ARABIC LETTER FEH WITH TWO DOTS BELOW", 0x0761: "ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW", 0x0762: "ARABIC LETTER KEHEH WITH DOT ABOVE", 0x0763: "ARABIC LETTER KEHEH WITH THREE DOTS ABOVE", 0x0764: "ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW", 0x0765: "ARABIC LETTER MEEM WITH DOT ABOVE", 0x0766: "ARABIC LETTER MEEM WITH DOT BELOW", 0x0767: "ARABIC LETTER NOON WITH TWO DOTS BELOW", 0x0768: "ARABIC LETTER NOON WITH SMALL TAH", 0x0769: "ARABIC LETTER NOON WITH SMALL V", 0x076A: "ARABIC LETTER LAM WITH BAR", 0x076B: "ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE", 0x076C: "ARABIC LETTER REH WITH HAMZA ABOVE", 0x076D: "ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE", 0x076E: "ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW", 0x076F: "ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS", 0x0770: "ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS", 0x0771: "ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS", 0x0772: "ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE", 0x0773: "ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE", 0x0774: "ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE", 0x0775: "ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE", 0x0776: "ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE", 0x0777: "ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW", 0x0778: "ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE", 0x0779: "ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE", 0x077A: "ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE", 0x077B: "ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE", 0x077C: "ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW", 0x077D: "ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE", 0x077E: "ARABIC LETTER SEEN WITH INVERTED V", 0x077F: "ARABIC LETTER KAF WITH TWO DOTS ABOVE", 0x0780: "THAANA LETTER HAA", 0x0781: "THAANA LETTER SHAVIYANI", 0x0782: "THAANA LETTER NOONU", 0x0783: "THAANA LETTER RAA", 0x0784: "THAANA LETTER BAA", 0x0785: "THAANA LETTER LHAVIYANI", 0x0786: "THAANA LETTER KAAFU", 0x0787: "THAANA LETTER ALIFU", 0x0788: "THAANA LETTER VAAVU", 0x0789: "THAANA LETTER MEEMU", 0x078A: "THAANA LETTER FAAFU", 0x078B: "THAANA LETTER DHAALU", 0x078C: "THAANA LETTER THAA", 0x078D: "THAANA LETTER LAAMU", 0x078E: "THAANA LETTER GAAFU", 0x078F: "THAANA LETTER GNAVIYANI", 0x0790: "THAANA LETTER SEENU", 0x0791: "THAANA LETTER DAVIYANI", 0x0792: "THAANA LETTER ZAVIYANI", 0x0793: "THAANA LETTER TAVIYANI", 0x0794: "THAANA LETTER YAA", 0x0795: "THAANA LETTER PAVIYANI", 0x0796: "THAANA LETTER JAVIYANI", 0x0797: "THAANA LETTER CHAVIYANI", 0x0798: "THAANA LETTER TTAA", 0x0799: "THAANA LETTER HHAA", 0x079A: "THAANA LETTER KHAA", 0x079B: "THAANA LETTER THAALU", 0x079C: "THAANA LETTER ZAA", 0x079D: "THAANA LETTER SHEENU", 0x079E: "THAANA LETTER SAADHU", 0x079F: "THAANA LETTER DAADHU", 0x07A0: "THAANA LETTER TO", 0x07A1: "THAANA LETTER ZO", 0x07A2: "THAANA LETTER AINU", 0x07A3: "THAANA LETTER GHAINU", 0x07A4: "THAANA LETTER QAAFU", 0x07A5: "THAANA LETTER WAAVU", 0x07A6: "THAANA ABAFILI", 0x07A7: "THAANA AABAAFILI", 0x07A8: "THAANA IBIFILI", 0x07A9: "THAANA EEBEEFILI", 0x07AA: "THAANA UBUFILI", 0x07AB: "THAANA OOBOOFILI", 0x07AC: "THAANA EBEFILI", 0x07AD: "THAANA EYBEYFILI", 0x07AE: "THAANA OBOFILI", 0x07AF: "THAANA OABOAFILI", 0x07B0: "THAANA SUKUN", 0x07B1: "THAANA LETTER NAA", 0x07C0: "NKO DIGIT ZERO", 0x07C1: "NKO DIGIT ONE", 0x07C2: "NKO DIGIT TWO", 0x07C3: "NKO DIGIT THREE", 0x07C4: "NKO DIGIT FOUR", 0x07C5: "NKO DIGIT FIVE", 0x07C6: "NKO DIGIT SIX", 0x07C7: "NKO DIGIT SEVEN", 0x07C8: "NKO DIGIT EIGHT", 0x07C9: "NKO DIGIT NINE", 0x07CA: "NKO LETTER A", 0x07CB: "NKO LETTER EE", 0x07CC: "NKO LETTER I", 0x07CD: "NKO LETTER E", 0x07CE: "NKO LETTER U", 0x07CF: "NKO LETTER OO", 0x07D0: "NKO LETTER O", 0x07D1: "NKO LETTER DAGBASINNA", 0x07D2: "NKO LETTER N", 0x07D3: "NKO LETTER BA", 0x07D4: "NKO LETTER PA", 0x07D5: "NKO LETTER TA", 0x07D6: "NKO LETTER JA", 0x07D7: "NKO LETTER CHA", 0x07D8: "NKO LETTER DA", 0x07D9: "NKO LETTER RA", 0x07DA: "NKO LETTER RRA", 0x07DB: "NKO LETTER SA", 0x07DC: "NKO LETTER GBA", 0x07DD: "NKO LETTER FA", 0x07DE: "NKO LETTER KA", 0x07DF: "NKO LETTER LA", 0x07E0: "NKO LETTER NA WOLOSO", 0x07E1: "NKO LETTER MA", 0x07E2: "NKO LETTER NYA", 0x07E3: "NKO LETTER NA", 0x07E4: "NKO LETTER HA", 0x07E5: "NKO LETTER WA", 0x07E6: "NKO LETTER YA", 0x07E7: "NKO LETTER NYA WOLOSO", 0x07E8: "NKO LETTER JONA JA", 0x07E9: "NKO LETTER JONA CHA", 0x07EA: "NKO LETTER JONA RA", 0x07EB: "NKO COMBINING SHORT HIGH TONE", 0x07EC: "NKO COMBINING SHORT LOW TONE", 0x07ED: "NKO COMBINING SHORT RISING TONE", 0x07EE: "NKO COMBINING LONG DESCENDING TONE", 0x07EF: "NKO COMBINING LONG HIGH TONE", 0x07F0: "NKO COMBINING LONG LOW TONE", 0x07F1: "NKO COMBINING LONG RISING TONE", 0x07F2: "NKO COMBINING NASALIZATION MARK", 0x07F3: "NKO COMBINING DOUBLE DOT ABOVE", 0x07F4: "NKO HIGH TONE APOSTROPHE", 0x07F5: "NKO LOW TONE APOSTROPHE", 0x07F6: "NKO SYMBOL OO DENNEN", 0x07F7: "NKO SYMBOL GBAKURUNEN", 0x07F8: "NKO COMMA", 0x07F9: "NKO EXCLAMATION MARK", 0x07FA: "NKO LAJANYALAN", 0x0901: "DEVANAGARI SIGN CANDRABINDU", 0x0902: "DEVANAGARI SIGN ANUSVARA", 0x0903: "DEVANAGARI SIGN VISARGA", 0x0904: "DEVANAGARI LETTER SHORT A", 0x0905: "DEVANAGARI LETTER A", 0x0906: "DEVANAGARI LETTER AA", 0x0907: "DEVANAGARI LETTER I", 0x0908: "DEVANAGARI LETTER II", 0x0909: "DEVANAGARI LETTER U", 0x090A: "DEVANAGARI LETTER UU", 0x090B: "DEVANAGARI LETTER VOCALIC R", 0x090C: "DEVANAGARI LETTER VOCALIC L", 0x090D: "DEVANAGARI LETTER CANDRA E", 0x090E: "DEVANAGARI LETTER SHORT E", 0x090F: "DEVANAGARI LETTER E", 0x0910: "DEVANAGARI LETTER AI", 0x0911: "DEVANAGARI LETTER CANDRA O", 0x0912: "DEVANAGARI LETTER SHORT O", 0x0913: "DEVANAGARI LETTER O", 0x0914: "DEVANAGARI LETTER AU", 0x0915: "DEVANAGARI LETTER KA", 0x0916: "DEVANAGARI LETTER KHA", 0x0917: "DEVANAGARI LETTER GA", 0x0918: "DEVANAGARI LETTER GHA", 0x0919: "DEVANAGARI LETTER NGA", 0x091A: "DEVANAGARI LETTER CA", 0x091B: "DEVANAGARI LETTER CHA", 0x091C: "DEVANAGARI LETTER JA", 0x091D: "DEVANAGARI LETTER JHA", 0x091E: "DEVANAGARI LETTER NYA", 0x091F: "DEVANAGARI LETTER TTA", 0x0920: "DEVANAGARI LETTER TTHA", 0x0921: "DEVANAGARI LETTER DDA", 0x0922: "DEVANAGARI LETTER DDHA", 0x0923: "DEVANAGARI LETTER NNA", 0x0924: "DEVANAGARI LETTER TA", 0x0925: "DEVANAGARI LETTER THA", 0x0926: "DEVANAGARI LETTER DA", 0x0927: "DEVANAGARI LETTER DHA", 0x0928: "DEVANAGARI LETTER NA", 0x0929: "DEVANAGARI LETTER NNNA", 0x092A: "DEVANAGARI LETTER PA", 0x092B: "DEVANAGARI LETTER PHA", 0x092C: "DEVANAGARI LETTER BA", 0x092D: "DEVANAGARI LETTER BHA", 0x092E: "DEVANAGARI LETTER MA", 0x092F: "DEVANAGARI LETTER YA", 0x0930: "DEVANAGARI LETTER RA", 0x0931: "DEVANAGARI LETTER RRA", 0x0932: "DEVANAGARI LETTER LA", 0x0933: "DEVANAGARI LETTER LLA", 0x0934: "DEVANAGARI LETTER LLLA", 0x0935: "DEVANAGARI LETTER VA", 0x0936: "DEVANAGARI LETTER SHA", 0x0937: "DEVANAGARI LETTER SSA", 0x0938: "DEVANAGARI LETTER SA", 0x0939: "DEVANAGARI LETTER HA", 0x093C: "DEVANAGARI SIGN NUKTA", 0x093D: "DEVANAGARI SIGN AVAGRAHA", 0x093E: "DEVANAGARI VOWEL SIGN AA", 0x093F: "DEVANAGARI VOWEL SIGN I", 0x0940: "DEVANAGARI VOWEL SIGN II", 0x0941: "DEVANAGARI VOWEL SIGN U", 0x0942: "DEVANAGARI VOWEL SIGN UU", 0x0943: "DEVANAGARI VOWEL SIGN VOCALIC R", 0x0944: "DEVANAGARI VOWEL SIGN VOCALIC RR", 0x0945: "DEVANAGARI VOWEL SIGN CANDRA E", 0x0946: "DEVANAGARI VOWEL SIGN SHORT E", 0x0947: "DEVANAGARI VOWEL SIGN E", 0x0948: "DEVANAGARI VOWEL SIGN AI", 0x0949: "DEVANAGARI VOWEL SIGN CANDRA O", 0x094A: "DEVANAGARI VOWEL SIGN SHORT O", 0x094B: "DEVANAGARI VOWEL SIGN O", 0x094C: "DEVANAGARI VOWEL SIGN AU", 0x094D: "DEVANAGARI SIGN VIRAMA", 0x0950: "DEVANAGARI OM", 0x0951: "DEVANAGARI STRESS SIGN UDATTA", 0x0952: "DEVANAGARI STRESS SIGN ANUDATTA", 0x0953: "DEVANAGARI GRAVE ACCENT", 0x0954: "DEVANAGARI ACUTE ACCENT", 0x0958: "DEVANAGARI LETTER QA", 0x0959: "DEVANAGARI LETTER KHHA", 0x095A: "DEVANAGARI LETTER GHHA", 0x095B: "DEVANAGARI LETTER ZA", 0x095C: "DEVANAGARI LETTER DDDHA", 0x095D: "DEVANAGARI LETTER RHA", 0x095E: "DEVANAGARI LETTER FA", 0x095F: "DEVANAGARI LETTER YYA", 0x0960: "DEVANAGARI LETTER VOCALIC RR", 0x0961: "DEVANAGARI LETTER VOCALIC LL", 0x0962: "DEVANAGARI VOWEL SIGN VOCALIC L", 0x0963: "DEVANAGARI VOWEL SIGN VOCALIC LL", 0x0964: "DEVANAGARI DANDA", 0x0965: "DEVANAGARI DOUBLE DANDA", 0x0966: "DEVANAGARI DIGIT ZERO", 0x0967: "DEVANAGARI DIGIT ONE", 0x0968: "DEVANAGARI DIGIT TWO", 0x0969: "DEVANAGARI DIGIT THREE", 0x096A: "DEVANAGARI DIGIT FOUR", 0x096B: "DEVANAGARI DIGIT FIVE", 0x096C: "DEVANAGARI DIGIT SIX", 0x096D: "DEVANAGARI DIGIT SEVEN", 0x096E: "DEVANAGARI DIGIT EIGHT", 0x096F: "DEVANAGARI DIGIT NINE", 0x0970: "DEVANAGARI ABBREVIATION SIGN", 0x0971: "DEVANAGARI SIGN HIGH SPACING DOT", 0x0972: "DEVANAGARI LETTER CANDRA A", 0x097B: "DEVANAGARI LETTER GGA", 0x097C: "DEVANAGARI LETTER JJA", 0x097D: "DEVANAGARI LETTER GLOTTAL STOP", 0x097E: "DEVANAGARI LETTER DDDA", 0x097F: "DEVANAGARI LETTER BBA", 0x0981: "BENGALI SIGN CANDRABINDU", 0x0982: "BENGALI SIGN ANUSVARA", 0x0983: "BENGALI SIGN VISARGA", 0x0985: "BENGALI LETTER A", 0x0986: "BENGALI LETTER AA", 0x0987: "BENGALI LETTER I", 0x0988: "BENGALI LETTER II", 0x0989: "BENGALI LETTER U", 0x098A: "BENGALI LETTER UU", 0x098B: "BENGALI LETTER VOCALIC R", 0x098C: "BENGALI LETTER VOCALIC L", 0x098F: "BENGALI LETTER E", 0x0990: "BENGALI LETTER AI", 0x0993: "BENGALI LETTER O", 0x0994: "BENGALI LETTER AU", 0x0995: "BENGALI LETTER KA", 0x0996: "BENGALI LETTER KHA", 0x0997: "BENGALI LETTER GA", 0x0998: "BENGALI LETTER GHA", 0x0999: "BENGALI LETTER NGA", 0x099A: "BENGALI LETTER CA", 0x099B: "BENGALI LETTER CHA", 0x099C: "BENGALI LETTER JA", 0x099D: "BENGALI LETTER JHA", 0x099E: "BENGALI LETTER NYA", 0x099F: "BENGALI LETTER TTA", 0x09A0: "BENGALI LETTER TTHA", 0x09A1: "BENGALI LETTER DDA", 0x09A2: "BENGALI LETTER DDHA", 0x09A3: "BENGALI LETTER NNA", 0x09A4: "BENGALI LETTER TA", 0x09A5: "BENGALI LETTER THA", 0x09A6: "BENGALI LETTER DA", 0x09A7: "BENGALI LETTER DHA", 0x09A8: "BENGALI LETTER NA", 0x09AA: "BENGALI LETTER PA", 0x09AB: "BENGALI LETTER PHA", 0x09AC: "BENGALI LETTER BA", 0x09AD: "BENGALI LETTER BHA", 0x09AE: "BENGALI LETTER MA", 0x09AF: "BENGALI LETTER YA", 0x09B0: "BENGALI LETTER RA", 0x09B2: "BENGALI LETTER LA", 0x09B6: "BENGALI LETTER SHA", 0x09B7: "BENGALI LETTER SSA", 0x09B8: "BENGALI LETTER SA", 0x09B9: "BENGALI LETTER HA", 0x09BC: "BENGALI SIGN NUKTA", 0x09BD: "BENGALI SIGN AVAGRAHA", 0x09BE: "BENGALI VOWEL SIGN AA", 0x09BF: "BENGALI VOWEL SIGN I", 0x09C0: "BENGALI VOWEL SIGN II", 0x09C1: "BENGALI VOWEL SIGN U", 0x09C2: "BENGALI VOWEL SIGN UU", 0x09C3: "BENGALI VOWEL SIGN VOCALIC R", 0x09C4: "BENGALI VOWEL SIGN VOCALIC RR", 0x09C7: "BENGALI VOWEL SIGN E", 0x09C8: "BENGALI VOWEL SIGN AI", 0x09CB: "BENGALI VOWEL SIGN O", 0x09CC: "BENGALI VOWEL SIGN AU", 0x09CD: "BENGALI SIGN VIRAMA", 0x09CE: "BENGALI LETTER KHANDA TA", 0x09D7: "BENGALI AU LENGTH MARK", 0x09DC: "BENGALI LETTER RRA", 0x09DD: "BENGALI LETTER RHA", 0x09DF: "BENGALI LETTER YYA", 0x09E0: "BENGALI LETTER VOCALIC RR", 0x09E1: "BENGALI LETTER VOCALIC LL", 0x09E2: "BENGALI VOWEL SIGN VOCALIC L", 0x09E3: "BENGALI VOWEL SIGN VOCALIC LL", 0x09E4: "", 0x09E5: "", 0x09E6: "BENGALI DIGIT ZERO", 0x09E7: "BENGALI DIGIT ONE", 0x09E8: "BENGALI DIGIT TWO", 0x09E9: "BENGALI DIGIT THREE", 0x09EA: "BENGALI DIGIT FOUR", 0x09EB: "BENGALI DIGIT FIVE", 0x09EC: "BENGALI DIGIT SIX", 0x09ED: "BENGALI DIGIT SEVEN", 0x09EE: "BENGALI DIGIT EIGHT", 0x09EF: "BENGALI DIGIT NINE", 0x09F0: "BENGALI LETTER RA WITH MIDDLE DIAGONAL (Assamese)", 0x09F1: "BENGALI LETTER RA WITH LOWER DIAGONAL (Assamese)", 0x09F2: "BENGALI RUPEE MARK", 0x09F3: "BENGALI RUPEE SIGN", 0x09F4: "BENGALI CURRENCY NUMERATOR ONE", 0x09F5: "BENGALI CURRENCY NUMERATOR TWO", 0x09F6: "BENGALI CURRENCY NUMERATOR THREE", 0x09F7: "BENGALI CURRENCY NUMERATOR FOUR", 0x09F8: "BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR", 0x09F9: "BENGALI CURRENCY DENOMINATOR SIXTEEN", 0x09FA: "BENGALI ISSHAR", 0x0A01: "GURMUKHI SIGN ADAK BINDI", 0x0A02: "GURMUKHI SIGN BINDI", 0x0A03: "GURMUKHI SIGN VISARGA", 0x0A05: "GURMUKHI LETTER A", 0x0A06: "GURMUKHI LETTER AA", 0x0A07: "GURMUKHI LETTER I", 0x0A08: "GURMUKHI LETTER II", 0x0A09: "GURMUKHI LETTER U", 0x0A0A: "GURMUKHI LETTER UU", 0x0A0F: "GURMUKHI LETTER EE", 0x0A10: "GURMUKHI LETTER AI", 0x0A13: "GURMUKHI LETTER OO", 0x0A14: "GURMUKHI LETTER AU", 0x0A15: "GURMUKHI LETTER KA", 0x0A16: "GURMUKHI LETTER KHA", 0x0A17: "GURMUKHI LETTER GA", 0x0A18: "GURMUKHI LETTER GHA", 0x0A19: "GURMUKHI LETTER NGA", 0x0A1A: "GURMUKHI LETTER CA", 0x0A1B: "GURMUKHI LETTER CHA", 0x0A1C: "GURMUKHI LETTER JA", 0x0A1D: "GURMUKHI LETTER JHA", 0x0A1E: "GURMUKHI LETTER NYA", 0x0A1F: "GURMUKHI LETTER TTA", 0x0A20: "GURMUKHI LETTER TTHA", 0x0A21: "GURMUKHI LETTER DDA", 0x0A22: "GURMUKHI LETTER DDHA", 0x0A23: "GURMUKHI LETTER NNA", 0x0A24: "GURMUKHI LETTER TA", 0x0A25: "GURMUKHI LETTER THA", 0x0A26: "GURMUKHI LETTER DA", 0x0A27: "GURMUKHI LETTER DHA", 0x0A28: "GURMUKHI LETTER NA", 0x0A2A: "GURMUKHI LETTER PA", 0x0A2B: "GURMUKHI LETTER PHA", 0x0A2C: "GURMUKHI LETTER BA", 0x0A2D: "GURMUKHI LETTER BHA", 0x0A2E: "GURMUKHI LETTER MA", 0x0A2F: "GURMUKHI LETTER YA", 0x0A30: "GURMUKHI LETTER RA", 0x0A32: "GURMUKHI LETTER LA", 0x0A33: "GURMUKHI LETTER LLA", 0x0A35: "GURMUKHI LETTER VA", 0x0A36: "GURMUKHI LETTER SHA", 0x0A38: "GURMUKHI LETTER SA", 0x0A39: "GURMUKHI LETTER HA", 0x0A3C: "GURMUKHI SIGN NUKTA", 0x0A3E: "GURMUKHI VOWEL SIGN AA", 0x0A3F: "GURMUKHI VOWEL SIGN I", 0x0A40: "GURMUKHI VOWEL SIGN II", 0x0A41: "GURMUKHI VOWEL SIGN U", 0x0A42: "GURMUKHI VOWEL SIGN UU", 0x0A47: "GURMUKHI VOWEL SIGN EE", 0x0A48: "GURMUKHI VOWEL SIGN AI", 0x0A4B: "GURMUKHI VOWEL SIGN OO", 0x0A4C: "GURMUKHI VOWEL SIGN AU", 0x0A4D: "GURMUKHI SIGN VIRAMA", 0x0A51: "GURMUKHI SIGN UDAAT", 0x0A59: "GURMUKHI LETTER KHHA", 0x0A5A: "GURMUKHI LETTER GHHA", 0x0A5B: "GURMUKHI LETTER ZA", 0x0A5C: "GURMUKHI LETTER RRA", 0x0A5E: "GURMUKHI LETTER FA", 0x0A64: "", 0x0A65: "", 0x0A66: "GURMUKHI DIGIT ZERO", 0x0A67: "GURMUKHI DIGIT ONE", 0x0A68: "GURMUKHI DIGIT TWO", 0x0A69: "GURMUKHI DIGIT THREE", 0x0A6A: "GURMUKHI DIGIT FOUR", 0x0A6B: "GURMUKHI DIGIT FIVE", 0x0A6C: "GURMUKHI DIGIT SIX", 0x0A6D: "GURMUKHI DIGIT SEVEN", 0x0A6E: "GURMUKHI DIGIT EIGHT", 0x0A6F: "GURMUKHI DIGIT NINE", 0x0A70: "GURMUKHI TIPPI", 0x0A71: "GURMUKHI ADDAK", 0x0A72: "GURMUKHI IRI", 0x0A73: "GURMUKHI URA", 0x0A74: "GURMUKHI EK ONKAR", 0x0A75: "GURMUKHI SIGN YAKASH", 0x0A81: "GUJARATI SIGN CANDRABINDU", 0x0A82: "GUJARATI SIGN ANUSVARA", 0x0A83: "GUJARATI SIGN VISARGA", 0x0A85: "GUJARATI LETTER A", 0x0A86: "GUJARATI LETTER AA", 0x0A87: "GUJARATI LETTER I", 0x0A88: "GUJARATI LETTER II", 0x0A89: "GUJARATI LETTER U", 0x0A8A: "GUJARATI LETTER UU", 0x0A8B: "GUJARATI LETTER VOCALIC R", 0x0A8C: "GUJARATI LETTER VOCALIC L", 0x0A8D: "GUJARATI VOWEL CANDRA E", 0x0A8F: "GUJARATI LETTER E", 0x0A90: "GUJARATI LETTER AI", 0x0A91: "GUJARATI VOWEL CANDRA O", 0x0A93: "GUJARATI LETTER O", 0x0A94: "GUJARATI LETTER AU", 0x0A95: "GUJARATI LETTER KA", 0x0A96: "GUJARATI LETTER KHA", 0x0A97: "GUJARATI LETTER GA", 0x0A98: "GUJARATI LETTER GHA", 0x0A99: "GUJARATI LETTER NGA", 0x0A9A: "GUJARATI LETTER CA", 0x0A9B: "GUJARATI LETTER CHA", 0x0A9C: "GUJARATI LETTER JA", 0x0A9D: "GUJARATI LETTER JHA", 0x0A9E: "GUJARATI LETTER NYA", 0x0A9F: "GUJARATI LETTER TTA", 0x0AA0: "GUJARATI LETTER TTHA", 0x0AA1: "GUJARATI LETTER DDA", 0x0AA2: "GUJARATI LETTER DDHA", 0x0AA3: "GUJARATI LETTER NNA", 0x0AA4: "GUJARATI LETTER TA", 0x0AA5: "GUJARATI LETTER THA", 0x0AA6: "GUJARATI LETTER DA", 0x0AA7: "GUJARATI LETTER DHA", 0x0AA8: "GUJARATI LETTER NA", 0x0AAA: "GUJARATI LETTER PA", 0x0AAB: "GUJARATI LETTER PHA", 0x0AAC: "GUJARATI LETTER BA", 0x0AAD: "GUJARATI LETTER BHA", 0x0AAE: "GUJARATI LETTER MA", 0x0AAF: "GUJARATI LETTER YA", 0x0AB0: "GUJARATI LETTER RA", 0x0AB2: "GUJARATI LETTER LA", 0x0AB3: "GUJARATI LETTER LLA", 0x0AB5: "GUJARATI LETTER VA", 0x0AB6: "GUJARATI LETTER SHA", 0x0AB7: "GUJARATI LETTER SSA", 0x0AB8: "GUJARATI LETTER SA", 0x0AB9: "GUJARATI LETTER HA", 0x0ABC: "GUJARATI SIGN NUKTA", 0x0ABD: "GUJARATI SIGN AVAGRAHA", 0x0ABE: "GUJARATI VOWEL SIGN AA", 0x0ABF: "GUJARATI VOWEL SIGN I", 0x0AC0: "GUJARATI VOWEL SIGN II", 0x0AC1: "GUJARATI VOWEL SIGN U", 0x0AC2: "GUJARATI VOWEL SIGN UU", 0x0AC3: "GUJARATI VOWEL SIGN VOCALIC R", 0x0AC4: "GUJARATI VOWEL SIGN VOCALIC RR", 0x0AC5: "GUJARATI VOWEL SIGN CANDRA E", 0x0AC7: "GUJARATI VOWEL SIGN E", 0x0AC8: "GUJARATI VOWEL SIGN AI", 0x0AC9: "GUJARATI VOWEL SIGN CANDRA O", 0x0ACB: "GUJARATI VOWEL SIGN O", 0x0ACC: "GUJARATI VOWEL SIGN AU", 0x0ACD: "GUJARATI SIGN VIRAMA", 0x0AD0: "GUJARATI OM", 0x0AE0: "GUJARATI LETTER VOCALIC RR", 0x0AE1: "GUJARATI LETTER VOCALIC LL", 0x0AE2: "GUJARATI VOWEL SIGN VOCALIC L", 0x0AE3: "GUJARATI VOWEL SIGN VOCALIC LL", 0x0AE4: "", 0x0AE5: "", 0x0AE6: "GUJARATI DIGIT ZERO", 0x0AE7: "GUJARATI DIGIT ONE", 0x0AE8: "GUJARATI DIGIT TWO", 0x0AE9: "GUJARATI DIGIT THREE", 0x0AEA: "GUJARATI DIGIT FOUR", 0x0AEB: "GUJARATI DIGIT FIVE", 0x0AEC: "GUJARATI DIGIT SIX", 0x0AED: "GUJARATI DIGIT SEVEN", 0x0AEE: "GUJARATI DIGIT EIGHT", 0x0AEF: "GUJARATI DIGIT NINE", 0x0AF1: "GUJARATI RUPEE SIGN", 0x0B01: "ORIYA SIGN CANDRABINDU", 0x0B02: "ORIYA SIGN ANUSVARA", 0x0B03: "ORIYA SIGN VISARGA", 0x0B05: "ORIYA LETTER A", 0x0B06: "ORIYA LETTER AA", 0x0B07: "ORIYA LETTER I", 0x0B08: "ORIYA LETTER II", 0x0B09: "ORIYA LETTER U", 0x0B0A: "ORIYA LETTER UU", 0x0B0B: "ORIYA LETTER VOCALIC R", 0x0B0C: "ORIYA LETTER VOCALIC L", 0x0B0F: "ORIYA LETTER E", 0x0B10: "ORIYA LETTER AI", 0x0B13: "ORIYA LETTER O", 0x0B14: "ORIYA LETTER AU", 0x0B15: "ORIYA LETTER KA", 0x0B16: "ORIYA LETTER KHA", 0x0B17: "ORIYA LETTER GA", 0x0B18: "ORIYA LETTER GHA", 0x0B19: "ORIYA LETTER NGA", 0x0B1A: "ORIYA LETTER CA", 0x0B1B: "ORIYA LETTER CHA", 0x0B1C: "ORIYA LETTER JA", 0x0B1D: "ORIYA LETTER JHA", 0x0B1E: "ORIYA LETTER NYA", 0x0B1F: "ORIYA LETTER TTA", 0x0B20: "ORIYA LETTER TTHA", 0x0B21: "ORIYA LETTER DDA", 0x0B22: "ORIYA LETTER DDHA", 0x0B23: "ORIYA LETTER NNA", 0x0B24: "ORIYA LETTER TA", 0x0B25: "ORIYA LETTER THA", 0x0B26: "ORIYA LETTER DA", 0x0B27: "ORIYA LETTER DHA", 0x0B28: "ORIYA LETTER NA", 0x0B2A: "ORIYA LETTER PA", 0x0B2B: "ORIYA LETTER PHA", 0x0B2C: "ORIYA LETTER BA", 0x0B2D: "ORIYA LETTER BHA", 0x0B2E: "ORIYA LETTER MA", 0x0B2F: "ORIYA LETTER YA", 0x0B30: "ORIYA LETTER RA", 0x0B32: "ORIYA LETTER LA", 0x0B33: "ORIYA LETTER LLA", 0x0B35: "ORIYA LETTER VA", 0x0B36: "ORIYA LETTER SHA", 0x0B37: "ORIYA LETTER SSA", 0x0B38: "ORIYA LETTER SA", 0x0B39: "ORIYA LETTER HA", 0x0B3C: "ORIYA SIGN NUKTA", 0x0B3D: "ORIYA SIGN AVAGRAHA", 0x0B3E: "ORIYA VOWEL SIGN AA", 0x0B3F: "ORIYA VOWEL SIGN I", 0x0B40: "ORIYA VOWEL SIGN II", 0x0B41: "ORIYA VOWEL SIGN U", 0x0B42: "ORIYA VOWEL SIGN UU", 0x0B43: "ORIYA VOWEL SIGN VOCALIC R", 0x0B44: "ORIYA VOWEL SIGN VOCALIC RR", 0x0B47: "ORIYA VOWEL SIGN E", 0x0B48: "ORIYA VOWEL SIGN AI", 0x0B4B: "ORIYA VOWEL SIGN O", 0x0B4C: "ORIYA VOWEL SIGN AU", 0x0B4D: "ORIYA SIGN VIRAMA", 0x0B56: "ORIYA AI LENGTH MARK", 0x0B57: "ORIYA AU LENGTH MARK", 0x0B5C: "ORIYA LETTER RRA", 0x0B5D: "ORIYA LETTER RHA", 0x0B5F: "ORIYA LETTER YYA", 0x0B60: "ORIYA LETTER VOCALIC RR", 0x0B61: "ORIYA LETTER VOCALIC LL", 0x0B62: "ORIYA VOWEL SIGN VOCALIC L", 0x0B63: "ORIYA VOWEL SIGN VOCALIC LL", 0x0B64: "", 0x0B65: "", 0x0B66: "ORIYA DIGIT ZERO", 0x0B67: "ORIYA DIGIT ONE", 0x0B68: "ORIYA DIGIT TWO", 0x0B69: "ORIYA DIGIT THREE", 0x0B6A: "ORIYA DIGIT FOUR", 0x0B6B: "ORIYA DIGIT FIVE", 0x0B6C: "ORIYA DIGIT SIX", 0x0B6D: "ORIYA DIGIT SEVEN", 0x0B6E: "ORIYA DIGIT EIGHT", 0x0B6F: "ORIYA DIGIT NINE", 0x0B70: "ORIYA ISSHAR", 0x0B71: "ORIYA LETTER WA", 0x0B82: "TAMIL SIGN ANUSVARA", 0x0B83: "TAMIL SIGN VISARGA", 0x0B85: "TAMIL LETTER A", 0x0B86: "TAMIL LETTER AA", 0x0B87: "TAMIL LETTER I", 0x0B88: "TAMIL LETTER II", 0x0B89: "TAMIL LETTER U", 0x0B8A: "TAMIL LETTER UU", 0x0B8E: "TAMIL LETTER E", 0x0B8F: "TAMIL LETTER EE", 0x0B90: "TAMIL LETTER AI", 0x0B92: "TAMIL LETTER O", 0x0B93: "TAMIL LETTER OO", 0x0B94: "TAMIL LETTER AU", 0x0B95: "TAMIL LETTER KA", 0x0B99: "TAMIL LETTER NGA", 0x0B9A: "TAMIL LETTER CA", 0x0B9C: "TAMIL LETTER JA", 0x0B9E: "TAMIL LETTER NYA", 0x0B9F: "TAMIL LETTER TTA", 0x0BA3: "TAMIL LETTER NNA", 0x0BA4: "TAMIL LETTER TA", 0x0BA8: "TAMIL LETTER NA", 0x0BA9: "TAMIL LETTER NNNA", 0x0BAA: "TAMIL LETTER PA", 0x0BAE: "TAMIL LETTER MA", 0x0BAF: "TAMIL LETTER YA", 0x0BB0: "TAMIL LETTER RA", 0x0BB1: "TAMIL LETTER RRA", 0x0BB2: "TAMIL LETTER LA", 0x0BB3: "TAMIL LETTER LLA", 0x0BB4: "TAMIL LETTER LLLA", 0x0BB5: "TAMIL LETTER VA", 0x0BB6: "TAMIL LETTER SHA", 0x0BB7: "TAMIL LETTER SSA", 0x0BB8: "TAMIL LETTER SA", 0x0BB9: "TAMIL LETTER HA", 0x0BBE: "TAMIL VOWEL SIGN AA", 0x0BBF: "TAMIL VOWEL SIGN I", 0x0BC0: "TAMIL VOWEL SIGN II", 0x0BC1: "TAMIL VOWEL SIGN U", 0x0BC2: "TAMIL VOWEL SIGN UU", 0x0BC6: "TAMIL VOWEL SIGN E", 0x0BC7: "TAMIL VOWEL SIGN EE", 0x0BC8: "TAMIL VOWEL SIGN AI", 0x0BCA: "TAMIL VOWEL SIGN O", 0x0BCB: "TAMIL VOWEL SIGN OO", 0x0BCC: "TAMIL VOWEL SIGN AU", 0x0BCD: "TAMIL SIGN VIRAMA", 0x0BD0: "TAMIL OM", 0x0BD7: "TAMIL AU LENGTH MARK", 0x0BE4: "", 0x0BE5: "", 0x0BE6: "TAMIL DIGIT ZERO", 0x0BE7: "TAMIL DIGIT ONE", 0x0BE8: "TAMIL DIGIT TWO", 0x0BE9: "TAMIL DIGIT THREE", 0x0BEA: "TAMIL DIGIT FOUR", 0x0BEB: "TAMIL DIGIT FIVE", 0x0BEC: "TAMIL DIGIT SIX", 0x0BED: "TAMIL DIGIT SEVEN", 0x0BEE: "TAMIL DIGIT EIGHT", 0x0BEF: "TAMIL DIGIT NINE", 0x0BF0: "TAMIL NUMBER TEN", 0x0BF1: "TAMIL NUMBER ONE HUNDRED", 0x0BF2: "TAMIL NUMBER ONE THOUSAND", 0x0BF3: "TAMIL DAY SIGN (Naal)", 0x0BF4: "TAMIL MONTH SIGN (Maatham)", 0x0BF5: "TAMIL YEAR SIGN (Varudam)", 0x0BF6: "TAMIL DEBIT SIGN (Patru)", 0x0BF7: "TAMIL CREDIT SIGN (Varavu)", 0x0BF8: "TAMIL AS ABOVE SIGN (Merpadi)", 0x0BF9: "TAMIL RUPEE SIGN (Rupai)", 0x0BFA: "TAMIL NUMBER SIGN (Enn)", 0x0C01: "TELUGU SIGN CANDRABINDU", 0x0C02: "TELUGU SIGN ANUSVARA", 0x0C03: "TELUGU SIGN VISARGA", 0x0C05: "TELUGU LETTER A", 0x0C06: "TELUGU LETTER AA", 0x0C07: "TELUGU LETTER I", 0x0C08: "TELUGU LETTER II", 0x0C09: "TELUGU LETTER U", 0x0C0A: "TELUGU LETTER UU", 0x0C0B: "TELUGU LETTER VOCALIC R", 0x0C0C: "TELUGU LETTER VOCALIC L", 0x0C0E: "TELUGU LETTER E", 0x0C0F: "TELUGU LETTER EE", 0x0C10: "TELUGU LETTER AI", 0x0C12: "TELUGU LETTER O", 0x0C13: "TELUGU LETTER OO", 0x0C14: "TELUGU LETTER AU", 0x0C15: "TELUGU LETTER KA", 0x0C16: "TELUGU LETTER KHA", 0x0C17: "TELUGU LETTER GA", 0x0C18: "TELUGU LETTER GHA", 0x0C19: "TELUGU LETTER NGA", 0x0C1A: "TELUGU LETTER CA", 0x0C1B: "TELUGU LETTER CHA", 0x0C1C: "TELUGU LETTER JA", 0x0C1D: "TELUGU LETTER JHA", 0x0C1E: "TELUGU LETTER NYA", 0x0C1F: "TELUGU LETTER TTA", 0x0C20: "TELUGU LETTER TTHA", 0x0C21: "TELUGU LETTER DDA", 0x0C22: "TELUGU LETTER DDHA", 0x0C23: "TELUGU LETTER NNA", 0x0C24: "TELUGU LETTER TA", 0x0C25: "TELUGU LETTER THA", 0x0C26: "TELUGU LETTER DA", 0x0C27: "TELUGU LETTER DHA", 0x0C28: "TELUGU LETTER NA", 0x0C2A: "TELUGU LETTER PA", 0x0C2B: "TELUGU LETTER PHA", 0x0C2C: "TELUGU LETTER BA", 0x0C2D: "TELUGU LETTER BHA", 0x0C2E: "TELUGU LETTER MA", 0x0C2F: "TELUGU LETTER YA", 0x0C30: "TELUGU LETTER RA", 0x0C31: "TELUGU LETTER RRA", 0x0C32: "TELUGU LETTER LA", 0x0C33: "TELUGU LETTER LLA", 0x0C35: "TELUGU LETTER VA", 0x0C36: "TELUGU LETTER SHA", 0x0C37: "TELUGU LETTER SSA", 0x0C38: "TELUGU LETTER SA", 0x0C39: "TELUGU LETTER HA", 0x0C3D: "TELUGU SIGN AVAGRAHA", 0x0C3E: "TELUGU VOWEL SIGN AA", 0x0C3F: "TELUGU VOWEL SIGN I", 0x0C40: "TELUGU VOWEL SIGN II", 0x0C41: "TELUGU VOWEL SIGN U", 0x0C42: "TELUGU VOWEL SIGN UU", 0x0C43: "TELUGU VOWEL SIGN VOCALIC R", 0x0C44: "TELUGU VOWEL SIGN VOCALIC RR", 0x0C46: "TELUGU VOWEL SIGN E", 0x0C47: "TELUGU VOWEL SIGN EE", 0x0C48: "TELUGU VOWEL SIGN AI", 0x0C4A: "TELUGU VOWEL SIGN O", 0x0C4B: "TELUGU VOWEL SIGN OO", 0x0C4C: "TELUGU VOWEL SIGN AU", 0x0C4D: "TELUGU SIGN VIRAMA", 0x0C55: "TELUGU LENGTH MARK", 0x0C56: "TELUGU AI LENGTH MARK", 0x0C58: "TELUGU LETTER TSA", 0x0C59: "TELUGU LETTER DZA", 0x0C60: "TELUGU LETTER VOCALIC RR", 0x0C61: "TELUGU LETTER VOCALIC LL", 0x0C62: "TELUGU VOWEL SIGN VOCALIC L", 0x0C63: "TELUGU VOWEL SIGN VOCALIC LL", 0x0C64: "", 0x0C65: "", 0x0C66: "TELUGU DIGIT ZERO", 0x0C67: "TELUGU DIGIT ONE", 0x0C68: "TELUGU DIGIT TWO", 0x0C69: "TELUGU DIGIT THREE", 0x0C6A: "TELUGU DIGIT FOUR", 0x0C6B: "TELUGU DIGIT FIVE", 0x0C6C: "TELUGU DIGIT SIX", 0x0C6D: "TELUGU DIGIT SEVEN", 0x0C6E: "TELUGU DIGIT EIGHT", 0x0C6F: "TELUGU DIGIT NINE", 0x0C78: "TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR", 0x0C79: "TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR", 0x0C7A: "TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR", 0x0C7B: "TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR", 0x0C7C: "TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR", 0x0C7D: "TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR", 0x0C7E: "TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR", 0x0C7F: "TELUGU SIGN TUUMU", 0x0C82: "KANNADA SIGN ANUSVARA", 0x0C83: "KANNADA SIGN VISARGA", 0x0C85: "KANNADA LETTER A", 0x0C86: "KANNADA LETTER AA", 0x0C87: "KANNADA LETTER I", 0x0C88: "KANNADA LETTER II", 0x0C89: "KANNADA LETTER U", 0x0C8A: "KANNADA LETTER UU", 0x0C8B: "KANNADA LETTER VOCALIC R", 0x0C8C: "KANNADA LETTER VOCALIC L", 0x0C8E: "KANNADA LETTER E", 0x0C8F: "KANNADA LETTER EE", 0x0C90: "KANNADA LETTER AI", 0x0C92: "KANNADA LETTER O", 0x0C93: "KANNADA LETTER OO", 0x0C94: "KANNADA LETTER AU", 0x0C95: "KANNADA LETTER KA", 0x0C96: "KANNADA LETTER KHA", 0x0C97: "KANNADA LETTER GA", 0x0C98: "KANNADA LETTER GHA", 0x0C99: "KANNADA LETTER NGA", 0x0C9A: "KANNADA LETTER CA", 0x0C9B: "KANNADA LETTER CHA", 0x0C9C: "KANNADA LETTER JA", 0x0C9D: "KANNADA LETTER JHA", 0x0C9E: "KANNADA LETTER NYA", 0x0C9F: "KANNADA LETTER TTA", 0x0CA0: "KANNADA LETTER TTHA", 0x0CA1: "KANNADA LETTER DDA", 0x0CA2: "KANNADA LETTER DDHA", 0x0CA3: "KANNADA LETTER NNA", 0x0CA4: "KANNADA LETTER TA", 0x0CA5: "KANNADA LETTER THA", 0x0CA6: "KANNADA LETTER DA", 0x0CA7: "KANNADA LETTER DHA", 0x0CA8: "KANNADA LETTER NA", 0x0CAA: "KANNADA LETTER PA", 0x0CAB: "KANNADA LETTER PHA", 0x0CAC: "KANNADA LETTER BA", 0x0CAD: "KANNADA LETTER BHA", 0x0CAE: "KANNADA LETTER MA", 0x0CAF: "KANNADA LETTER YA", 0x0CB0: "KANNADA LETTER RA", 0x0CB1: "KANNADA LETTER RRA", 0x0CB2: "KANNADA LETTER LA", 0x0CB3: "KANNADA LETTER LLA", 0x0CB5: "KANNADA LETTER VA", 0x0CB6: "KANNADA LETTER SHA", 0x0CB7: "KANNADA LETTER SSA", 0x0CB8: "KANNADA LETTER SA", 0x0CB9: "KANNADA LETTER HA", 0x0CBC: "KANNADA SIGN NUKTA", 0x0CBD: "KANNADA SIGN AVAGRAHA", 0x0CBE: "KANNADA VOWEL SIGN AA", 0x0CBF: "KANNADA VOWEL SIGN I", 0x0CC0: "KANNADA VOWEL SIGN II", 0x0CC1: "KANNADA VOWEL SIGN U", 0x0CC2: "KANNADA VOWEL SIGN UU", 0x0CC3: "KANNADA VOWEL SIGN VOCALIC R", 0x0CC4: "KANNADA VOWEL SIGN VOCALIC RR", 0x0CC6: "KANNADA VOWEL SIGN E", 0x0CC7: "KANNADA VOWEL SIGN EE", 0x0CC8: "KANNADA VOWEL SIGN AI", 0x0CCA: "KANNADA VOWEL SIGN O", 0x0CCB: "KANNADA VOWEL SIGN OO", 0x0CCC: "KANNADA VOWEL SIGN AU", 0x0CCD: "KANNADA SIGN VIRAMA", 0x0CD5: "KANNADA LENGTH MARK", 0x0CD6: "KANNADA AI LENGTH MARK", 0x0CDE: "KANNADA LETTER FA", 0x0CE0: "KANNADA LETTER VOCALIC RR", 0x0CE1: "KANNADA LETTER VOCALIC LL", 0x0CE2: "KANNADA VOWEL SIGN VOCALIC L", 0x0CE3: "KANNADA VOWEL SIGN VOCALIC LL", 0x0CE4: "", 0x0CE5: "", 0x0CE6: "KANNADA DIGIT ZERO", 0x0CE7: "KANNADA DIGIT ONE", 0x0CE8: "KANNADA DIGIT TWO", 0x0CE9: "KANNADA DIGIT THREE", 0x0CEA: "KANNADA DIGIT FOUR", 0x0CEB: "KANNADA DIGIT FIVE", 0x0CEC: "KANNADA DIGIT SIX", 0x0CED: "KANNADA DIGIT SEVEN", 0x0CEE: "KANNADA DIGIT EIGHT", 0x0CEF: "KANNADA DIGIT NINE", 0x0CF1: "KANNADA SIGN JIHVAMULIYA", 0x0CF2: "KANNADA SIGN UPADHMANIYA", 0x0D02: "MALAYALAM SIGN ANUSVARA", 0x0D03: "MALAYALAM SIGN VISARGA", 0x0D05: "MALAYALAM LETTER A", 0x0D06: "MALAYALAM LETTER AA", 0x0D07: "MALAYALAM LETTER I", 0x0D08: "MALAYALAM LETTER II", 0x0D09: "MALAYALAM LETTER U", 0x0D0A: "MALAYALAM LETTER UU", 0x0D0B: "MALAYALAM LETTER VOCALIC R", 0x0D0C: "MALAYALAM LETTER VOCALIC L", 0x0D0E: "MALAYALAM LETTER E", 0x0D0F: "MALAYALAM LETTER EE", 0x0D10: "MALAYALAM LETTER AI", 0x0D12: "MALAYALAM LETTER O", 0x0D13: "MALAYALAM LETTER OO", 0x0D14: "MALAYALAM LETTER AU", 0x0D15: "MALAYALAM LETTER KA", 0x0D16: "MALAYALAM LETTER KHA", 0x0D17: "MALAYALAM LETTER GA", 0x0D18: "MALAYALAM LETTER GHA", 0x0D19: "MALAYALAM LETTER NGA", 0x0D1A: "MALAYALAM LETTER CA", 0x0D1B: "MALAYALAM LETTER CHA", 0x0D1C: "MALAYALAM LETTER JA", 0x0D1D: "MALAYALAM LETTER JHA", 0x0D1E: "MALAYALAM LETTER NYA", 0x0D1F: "MALAYALAM LETTER TTA", 0x0D20: "MALAYALAM LETTER TTHA", 0x0D21: "MALAYALAM LETTER DDA", 0x0D22: "MALAYALAM LETTER DDHA", 0x0D23: "MALAYALAM LETTER NNA", 0x0D24: "MALAYALAM LETTER TA", 0x0D25: "MALAYALAM LETTER THA", 0x0D26: "MALAYALAM LETTER DA", 0x0D27: "MALAYALAM LETTER DHA", 0x0D28: "MALAYALAM LETTER NA", 0x0D2A: "MALAYALAM LETTER PA", 0x0D2B: "MALAYALAM LETTER PHA", 0x0D2C: "MALAYALAM LETTER BA", 0x0D2D: "MALAYALAM LETTER BHA", 0x0D2E: "MALAYALAM LETTER MA", 0x0D2F: "MALAYALAM LETTER YA", 0x0D30: "MALAYALAM LETTER RA", 0x0D31: "MALAYALAM LETTER RRA", 0x0D32: "MALAYALAM LETTER LA", 0x0D33: "MALAYALAM LETTER LLA", 0x0D34: "MALAYALAM LETTER LLLA", 0x0D35: "MALAYALAM LETTER VA", 0x0D36: "MALAYALAM LETTER SHA", 0x0D37: "MALAYALAM LETTER SSA", 0x0D38: "MALAYALAM LETTER SA", 0x0D39: "MALAYALAM LETTER HA", 0x0D3D: "MALAYALAM SIGN AVAGRAHA", 0x0D3E: "MALAYALAM VOWEL SIGN AA", 0x0D3F: "MALAYALAM VOWEL SIGN I", 0x0D40: "MALAYALAM VOWEL SIGN II", 0x0D41: "MALAYALAM VOWEL SIGN U", 0x0D42: "MALAYALAM VOWEL SIGN UU", 0x0D43: "MALAYALAM VOWEL SIGN VOCALIC R", 0x0D44: "MALAYALAM VOWEL SIGN VOCALIC RR", 0x0D46: "MALAYALAM VOWEL SIGN E", 0x0D47: "MALAYALAM VOWEL SIGN EE", 0x0D48: "MALAYALAM VOWEL SIGN AI", 0x0D4A: "MALAYALAM VOWEL SIGN O", 0x0D4B: "MALAYALAM VOWEL SIGN OO", 0x0D4C: "MALAYALAM VOWEL SIGN AU", 0x0D4D: "MALAYALAM SIGN VIRAMA", 0x0D57: "MALAYALAM AU LENGTH MARK", 0x0D60: "MALAYALAM LETTER VOCALIC RR", 0x0D61: "MALAYALAM LETTER VOCALIC LL", 0x0D62: "MALAYALAM VOWEL SIGN VOCALIC L", 0x0D63: "MALAYALAM VOWEL SIGN VOCALIC LL", 0x0D64: "", 0x0D65: "", 0x0D66: "MALAYALAM DIGIT ZERO", 0x0D67: "MALAYALAM DIGIT ONE", 0x0D68: "MALAYALAM DIGIT TWO", 0x0D69: "MALAYALAM DIGIT THREE", 0x0D6A: "MALAYALAM DIGIT FOUR", 0x0D6B: "MALAYALAM DIGIT FIVE", 0x0D6C: "MALAYALAM DIGIT SIX", 0x0D6D: "MALAYALAM DIGIT SEVEN", 0x0D6E: "MALAYALAM DIGIT EIGHT", 0x0D6F: "MALAYALAM DIGIT NINE", 0x0D70: "MALAYALAM NUMBER TEN", 0x0D71: "MALAYALAM NUMBER ONE HUNDRED", 0x0D72: "MALAYALAM NUMBER ONE THOUSAND", 0x0D73: "MALAYALAM FRACTION ONE QUARTER", 0x0D74: "MALAYALAM FRACTION ONE HALF", 0x0D75: "MALAYALAM FRACTION THREE QUARTERS", 0x0D79: "MALAYALAM DATE MARK", 0x0D7A: "MALAYALAM LETTER CHILLU NN", 0x0D7B: "MALAYALAM LETTER CHILLU N", 0x0D7C: "MALAYALAM LETTER CHILLU RR", 0x0D7D: "MALAYALAM LETTER CHILLU L", 0x0D7E: "MALAYALAM LETTER CHILLU LL", 0x0D7F: "MALAYALAM LETTER CHILLU K", 0x0D82: "SINHALA SIGN ANUSVARAYA", 0x0D83: "SINHALA SIGN VISARGAYA", 0x0D85: "SINHALA LETTER AYANNA", 0x0D86: "SINHALA LETTER AAYANNA", 0x0D87: "SINHALA LETTER AEYANNA", 0x0D88: "SINHALA LETTER AEEYANNA", 0x0D89: "SINHALA LETTER IYANNA", 0x0D8A: "SINHALA LETTER IIYANNA", 0x0D8B: "SINHALA LETTER UYANNA", 0x0D8C: "SINHALA LETTER UUYANNA", 0x0D8D: "SINHALA LETTER IRUYANNA", 0x0D8E: "SINHALA LETTER IRUUYANNA", 0x0D8F: "SINHALA LETTER ILUYANNA", 0x0D90: "SINHALA LETTER ILUUYANNA", 0x0D91: "SINHALA LETTER EYANNA", 0x0D92: "SINHALA LETTER EEYANNA", 0x0D93: "SINHALA LETTER AIYANNA", 0x0D94: "SINHALA LETTER OYANNA", 0x0D95: "SINHALA LETTER OOYANNA", 0x0D96: "SINHALA LETTER AUYANNA", 0x0D9A: "SINHALA LETTER ALPAPRAANA KAYANNA", 0x0D9B: "SINHALA LETTER MAHAAPRAANA KAYANNA", 0x0D9C: "SINHALA LETTER ALPAPRAANA GAYANNA", 0x0D9D: "SINHALA LETTER MAHAAPRAANA GAYANNA", 0x0D9E: "SINHALA LETTER KANTAJA NAASIKYAYA", 0x0D9F: "SINHALA LETTER SANYAKA GAYANNA", 0x0DA0: "SINHALA LETTER ALPAPRAANA CAYANNA", 0x0DA1: "SINHALA LETTER MAHAAPRAANA CAYANNA", 0x0DA2: "SINHALA LETTER ALPAPRAANA JAYANNA", 0x0DA3: "SINHALA LETTER MAHAAPRAANA JAYANNA", 0x0DA4: "SINHALA LETTER TAALUJA NAASIKYAYA", 0x0DA5: "SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA", 0x0DA6: "SINHALA LETTER SANYAKA JAYANNA", 0x0DA7: "SINHALA LETTER ALPAPRAANA TTAYANNA", 0x0DA8: "SINHALA LETTER MAHAAPRAANA TTAYANNA", 0x0DA9: "SINHALA LETTER ALPAPRAANA DDAYANNA", 0x0DAA: "SINHALA LETTER MAHAAPRAANA DDAYANNA", 0x0DAB: "SINHALA LETTER MUURDHAJA NAYANNA", 0x0DAC: "SINHALA LETTER SANYAKA DDAYANNA", 0x0DAD: "SINHALA LETTER ALPAPRAANA TAYANNA", 0x0DAE: "SINHALA LETTER MAHAAPRAANA TAYANNA", 0x0DAF: "SINHALA LETTER ALPAPRAANA DAYANNA", 0x0DB0: "SINHALA LETTER MAHAAPRAANA DAYANNA", 0x0DB1: "SINHALA LETTER DANTAJA NAYANNA", 0x0DB3: "SINHALA LETTER SANYAKA DAYANNA", 0x0DB4: "SINHALA LETTER ALPAPRAANA PAYANNA", 0x0DB5: "SINHALA LETTER MAHAAPRAANA PAYANNA", 0x0DB6: "SINHALA LETTER ALPAPRAANA BAYANNA", 0x0DB7: "SINHALA LETTER MAHAAPRAANA BAYANNA", 0x0DB8: "SINHALA LETTER MAYANNA", 0x0DB9: "SINHALA LETTER AMBA BAYANNA", 0x0DBA: "SINHALA LETTER YAYANNA", 0x0DBB: "SINHALA LETTER RAYANNA", 0x0DBD: "SINHALA LETTER DANTAJA LAYANNA", 0x0DC0: "SINHALA LETTER VAYANNA", 0x0DC1: "SINHALA LETTER TAALUJA SAYANNA", 0x0DC2: "SINHALA LETTER MUURDHAJA SAYANNA", 0x0DC3: "SINHALA LETTER DANTAJA SAYANNA", 0x0DC4: "SINHALA LETTER HAYANNA", 0x0DC5: "SINHALA LETTER MUURDHAJA LAYANNA", 0x0DC6: "SINHALA LETTER FAYANNA", 0x0DCA: "SINHALA SIGN AL-LAKUNA", 0x0DCF: "SINHALA VOWEL SIGN AELA-PILLA", 0x0DD0: "SINHALA VOWEL SIGN KETTI AEDA-PILLA", 0x0DD1: "SINHALA VOWEL SIGN DIGA AEDA-PILLA", 0x0DD2: "SINHALA VOWEL SIGN KETTI IS-PILLA", 0x0DD3: "SINHALA VOWEL SIGN DIGA IS-PILLA", 0x0DD4: "SINHALA VOWEL SIGN KETTI PAA-PILLA", 0x0DD6: "SINHALA VOWEL SIGN DIGA PAA-PILLA", 0x0DD8: "SINHALA VOWEL SIGN GAETTA-PILLA", 0x0DD9: "SINHALA VOWEL SIGN KOMBUVA", 0x0DDA: "SINHALA VOWEL SIGN DIGA KOMBUVA", 0x0DDB: "SINHALA VOWEL SIGN KOMBU DEKA", 0x0DDC: "SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA", 0x0DDD: "SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA", 0x0DDE: "SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA", 0x0DDF: "SINHALA VOWEL SIGN GAYANUKITTA", 0x0DF2: "SINHALA VOWEL SIGN DIGA GAETTA-PILLA", 0x0DF3: "SINHALA VOWEL SIGN DIGA GAYANUKITTA", 0x0DF4: "SINHALA PUNCTUATION KUNDDALIYA", 0x0E01: "THAI CHARACTER KO KAI", 0x0E02: "THAI CHARACTER KHO KHAI", 0x0E03: "THAI CHARACTER KHO KHUAT", 0x0E04: "THAI CHARACTER KHO KHWAI", 0x0E05: "THAI CHARACTER KHO KHON", 0x0E06: "THAI CHARACTER KHO RAKHANG", 0x0E07: "THAI CHARACTER NGO NGU", 0x0E08: "THAI CHARACTER CHO CHAN", 0x0E09: "THAI CHARACTER CHO CHING", 0x0E0A: "THAI CHARACTER CHO CHANG", 0x0E0B: "THAI CHARACTER SO SO", 0x0E0C: "THAI CHARACTER CHO CHOE", 0x0E0D: "THAI CHARACTER YO YING", 0x0E0E: "THAI CHARACTER DO CHADA", 0x0E0F: "THAI CHARACTER TO PATAK", 0x0E10: "THAI CHARACTER THO THAN", 0x0E11: "THAI CHARACTER THO NANGMONTHO", 0x0E12: "THAI CHARACTER THO PHUTHAO", 0x0E13: "THAI CHARACTER NO NEN", 0x0E14: "THAI CHARACTER DO DEK", 0x0E15: "THAI CHARACTER TO TAO", 0x0E16: "THAI CHARACTER THO THUNG", 0x0E17: "THAI CHARACTER THO THAHAN", 0x0E18: "THAI CHARACTER THO THONG", 0x0E19: "THAI CHARACTER NO NU", 0x0E1A: "THAI CHARACTER BO BAIMAI", 0x0E1B: "THAI CHARACTER PO PLA", 0x0E1C: "THAI CHARACTER PHO PHUNG", 0x0E1D: "THAI CHARACTER FO FA", 0x0E1E: "THAI CHARACTER PHO PHAN", 0x0E1F: "THAI CHARACTER FO FAN", 0x0E20: "THAI CHARACTER PHO SAMPHAO", 0x0E21: "THAI CHARACTER MO MA", 0x0E22: "THAI CHARACTER YO YAK", 0x0E23: "THAI CHARACTER RO RUA", 0x0E24: "THAI CHARACTER RU", 0x0E25: "THAI CHARACTER LO LING", 0x0E26: "THAI CHARACTER LU", 0x0E27: "THAI CHARACTER WO WAEN", 0x0E28: "THAI CHARACTER SO SALA", 0x0E29: "THAI CHARACTER SO RUSI", 0x0E2A: "THAI CHARACTER SO SUA", 0x0E2B: "THAI CHARACTER HO HIP", 0x0E2C: "THAI CHARACTER LO CHULA", 0x0E2D: "THAI CHARACTER O ANG", 0x0E2E: "THAI CHARACTER HO NOKHUK", 0x0E2F: "THAI CHARACTER PAIYANNOI (paiyan noi)", 0x0E30: "THAI CHARACTER SARA A", 0x0E31: "THAI CHARACTER MAI HAN-AKAT", 0x0E32: "THAI CHARACTER SARA AA", 0x0E33: "THAI CHARACTER SARA AM", 0x0E34: "THAI CHARACTER SARA I", 0x0E35: "THAI CHARACTER SARA II", 0x0E36: "THAI CHARACTER SARA UE", 0x0E37: "THAI CHARACTER SARA UEE (sara uue)", 0x0E38: "THAI CHARACTER SARA U", 0x0E39: "THAI CHARACTER SARA UU", 0x0E3A: "THAI CHARACTER PHINTHU", 0x0E3F: "THAI CURRENCY SYMBOL BAHT", 0x0E40: "THAI CHARACTER SARA E", 0x0E41: "THAI CHARACTER SARA AE", 0x0E42: "THAI CHARACTER SARA O", 0x0E43: "THAI CHARACTER SARA AI MAIMUAN (sara ai mai muan)", 0x0E44: "THAI CHARACTER SARA AI MAIMALAI (sara ai mai malai)", 0x0E45: "THAI CHARACTER LAKKHANGYAO (lakkhang yao)", 0x0E46: "THAI CHARACTER MAIYAMOK (mai yamok)", 0x0E47: "THAI CHARACTER MAITAIKHU (mai taikhu)", 0x0E48: "THAI CHARACTER MAI EK", 0x0E49: "THAI CHARACTER MAI THO", 0x0E4A: "THAI CHARACTER MAI TRI", 0x0E4B: "THAI CHARACTER MAI CHATTAWA", 0x0E4C: "THAI CHARACTER THANTHAKHAT", 0x0E4D: "THAI CHARACTER NIKHAHIT (nikkhahit)", 0x0E4E: "THAI CHARACTER YAMAKKAN", 0x0E4F: "THAI CHARACTER FONGMAN", 0x0E50: "THAI DIGIT ZERO", 0x0E51: "THAI DIGIT ONE", 0x0E52: "THAI DIGIT TWO", 0x0E53: "THAI DIGIT THREE", 0x0E54: "THAI DIGIT FOUR", 0x0E55: "THAI DIGIT FIVE", 0x0E56: "THAI DIGIT SIX", 0x0E57: "THAI DIGIT SEVEN", 0x0E58: "THAI DIGIT EIGHT", 0x0E59: "THAI DIGIT NINE", 0x0E5A: "THAI CHARACTER ANGKHANKHU", 0x0E5B: "THAI CHARACTER KHOMUT", 0x0E81: "LAO LETTER KO", 0x0E82: "LAO LETTER KHO SUNG", 0x0E84: "LAO LETTER KHO TAM", 0x0E87: "LAO LETTER NGO", 0x0E88: "LAO LETTER CO", 0x0E8A: "LAO LETTER SO TAM", 0x0E8D: "LAO LETTER NYO", 0x0E94: "LAO LETTER DO", 0x0E95: "LAO LETTER TO", 0x0E96: "LAO LETTER THO SUNG", 0x0E97: "LAO LETTER THO TAM", 0x0E99: "LAO LETTER NO", 0x0E9A: "LAO LETTER BO", 0x0E9B: "LAO LETTER PO", 0x0E9C: "LAO LETTER PHO SUNG", 0x0E9D: "LAO LETTER FO TAM", 0x0E9E: "LAO LETTER PHO TAM", 0x0E9F: "LAO LETTER FO SUNG", 0x0EA1: "LAO LETTER MO", 0x0EA2: "LAO LETTER YO", 0x0EA3: "LAO LETTER LO LING", 0x0EA5: "LAO LETTER LO LOOT", 0x0EA7: "LAO LETTER WO", 0x0EAA: "LAO LETTER SO SUNG", 0x0EAB: "LAO LETTER HO SUNG", 0x0EAD: "LAO LETTER O", 0x0EAE: "LAO LETTER HO TAM", 0x0EAF: "LAO ELLIPSIS", 0x0EB0: "LAO VOWEL SIGN A", 0x0EB1: "LAO VOWEL SIGN MAI KAN", 0x0EB2: "LAO VOWEL SIGN AA", 0x0EB3: "LAO VOWEL SIGN AM", 0x0EB4: "LAO VOWEL SIGN I", 0x0EB5: "LAO VOWEL SIGN II", 0x0EB6: "LAO VOWEL SIGN Y", 0x0EB7: "LAO VOWEL SIGN YY", 0x0EB8: "LAO VOWEL SIGN U", 0x0EB9: "LAO VOWEL SIGN UU", 0x0EBB: "LAO VOWEL SIGN MAI KON", 0x0EBC: "LAO SEMIVOWEL SIGN LO", 0x0EBD: "LAO SEMIVOWEL SIGN NYO", 0x0EC0: "LAO VOWEL SIGN E", 0x0EC1: "LAO VOWEL SIGN EI", 0x0EC2: "LAO VOWEL SIGN O", 0x0EC3: "LAO VOWEL SIGN AY", 0x0EC4: "LAO VOWEL SIGN AI", 0x0EC6: "LAO KO LA", 0x0EC8: "LAO TONE MAI EK", 0x0EC9: "LAO TONE MAI THO", 0x0ECA: "LAO TONE MAI TI", 0x0ECB: "LAO TONE MAI CATAWA", 0x0ECC: "LAO CANCELLATION MARK", 0x0ECD: "LAO NIGGAHITA", 0x0ED0: "LAO DIGIT ZERO", 0x0ED1: "LAO DIGIT ONE", 0x0ED2: "LAO DIGIT TWO", 0x0ED3: "LAO DIGIT THREE", 0x0ED4: "LAO DIGIT FOUR", 0x0ED5: "LAO DIGIT FIVE", 0x0ED6: "LAO DIGIT SIX", 0x0ED7: "LAO DIGIT SEVEN", 0x0ED8: "LAO DIGIT EIGHT", 0x0ED9: "LAO DIGIT NINE", 0x0EDC: "LAO HO NO", 0x0EDD: "LAO HO MO", 0x0F00: "TIBETAN SYLLABLE OM", 0x0F01: "TIBETAN MARK GTER YIG MGO TRUNCATED A (ter yik go a thung)", 0x0F02: "TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA (ter yik go wum nam chey ma)", 0x0F03: "TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA (ter yik go wum ter tsek ma)", 0x0F04: "TIBETAN MARK INITIAL YIG MGO MDUN MA (yik go dun ma)", 0x0F05: "TIBETAN MARK CLOSING YIG MGO SGAB MA (yik go kab ma)", 0x0F06: "TIBETAN MARK CARET YIG MGO PHUR SHAD MA (yik go pur shey ma)", 0x0F07: "TIBETAN MARK YIG MGO TSHEG SHAD MA (yik go tsek shey ma)", 0x0F08: "TIBETAN MARK SBRUL SHAD (drul shey)", 0x0F09: "TIBETAN MARK BSKUR YIG MGO (kur yik go)", 0x0F0A: "TIBETAN MARK BKA- SHOG YIG MGO (ka sho yik go)", 0x0F0B: "TIBETAN MARK INTERSYLLABIC TSHEG (tsek)", 0x0F0C: "TIBETAN MARK DELIMITER TSHEG BSTAR (tsek tar)", 0x0F0D: "TIBETAN MARK SHAD (shey)", 0x0F0E: "TIBETAN MARK NYIS SHAD (nyi shey)", 0x0F0F: "TIBETAN MARK TSHEG SHAD (tsek shey)", 0x0F10: "TIBETAN MARK NYIS TSHEG SHAD (nyi tsek shey)", 0x0F11: "TIBETAN MARK RIN CHEN SPUNGS SHAD (rinchen pung shey)", 0x0F12: "TIBETAN MARK RGYA GRAM SHAD (gya tram shey)", 0x0F13: "TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN (dzu ta me long chen)", 0x0F14: "TIBETAN MARK GTER TSHEG (ter tsek)", 0x0F15: "TIBETAN LOGOTYPE SIGN CHAD RTAGS (che ta)", 0x0F16: "TIBETAN LOGOTYPE SIGN LHAG RTAGS (hlak ta)", 0x0F17: "TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS (trachen char ta)", 0x0F18: "TIBETAN ASTROLOGICAL SIGN -KHYUD PA (kyu pa)", 0x0F19: "TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS (dong tsu)", 0x0F1A: "TIBETAN SIGN RDEL DKAR GCIG (deka chig)", 0x0F1B: "TIBETAN SIGN RDEL DKAR GNYIS (deka nyi)", 0x0F1C: "TIBETAN SIGN RDEL DKAR GSUM (deka sum)", 0x0F1D: "TIBETAN SIGN RDEL NAG GCIG (dena chig)", 0x0F1E: "TIBETAN SIGN RDEL NAG GNYIS (dena nyi)", 0x0F1F: "TIBETAN SIGN RDEL DKAR RDEL NAG (deka dena)", 0x0F20: "TIBETAN DIGIT ZERO", 0x0F21: "TIBETAN DIGIT ONE", 0x0F22: "TIBETAN DIGIT TWO", 0x0F23: "TIBETAN DIGIT THREE", 0x0F24: "TIBETAN DIGIT FOUR", 0x0F25: "TIBETAN DIGIT FIVE", 0x0F26: "TIBETAN DIGIT SIX", 0x0F27: "TIBETAN DIGIT SEVEN", 0x0F28: "TIBETAN DIGIT EIGHT", 0x0F29: "TIBETAN DIGIT NINE", 0x0F2A: "TIBETAN DIGIT HALF ONE", 0x0F2B: "TIBETAN DIGIT HALF TWO", 0x0F2C: "TIBETAN DIGIT HALF THREE", 0x0F2D: "TIBETAN DIGIT HALF FOUR", 0x0F2E: "TIBETAN DIGIT HALF FIVE", 0x0F2F: "TIBETAN DIGIT HALF SIX", 0x0F30: "TIBETAN DIGIT HALF SEVEN", 0x0F31: "TIBETAN DIGIT HALF EIGHT", 0x0F32: "TIBETAN DIGIT HALF NINE", 0x0F33: "TIBETAN DIGIT HALF ZERO", 0x0F34: "TIBETAN MARK BSDUS RTAGS (du ta)", 0x0F35: "TIBETAN MARK NGAS BZUNG NYI ZLA (nge zung nyi da)", 0x0F36: "TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN (dzu ta shi mig chen)", 0x0F37: "TIBETAN MARK NGAS BZUNG SGOR RTAGS (nge zung gor ta)", 0x0F38: "TIBETAN MARK CHE MGO (che go)", 0x0F39: "TIBETAN MARK TSA -PHRU (tsa tru)", 0x0F3A: "TIBETAN MARK GUG RTAGS GYON (gug ta yun)", 0x0F3B: "TIBETAN MARK GUG RTAGS GYAS (gug ta ye)", 0x0F3C: "TIBETAN MARK ANG KHANG GYON (ang kang yun)", 0x0F3D: "TIBETAN MARK ANG KHANG GYAS (ang kang ye)", 0x0F3E: "TIBETAN SIGN YAR TSHES (yar tse)", 0x0F3F: "TIBETAN SIGN MAR TSHES (mar tse)", 0x0F40: "TIBETAN LETTER KA", 0x0F41: "TIBETAN LETTER KHA", 0x0F42: "TIBETAN LETTER GA", 0x0F43: "TIBETAN LETTER GHA", 0x0F44: "TIBETAN LETTER NGA", 0x0F45: "TIBETAN LETTER CA", 0x0F46: "TIBETAN LETTER CHA", 0x0F47: "TIBETAN LETTER JA", 0x0F49: "TIBETAN LETTER NYA", 0x0F4A: "TIBETAN LETTER TTA", 0x0F4B: "TIBETAN LETTER TTHA", 0x0F4C: "TIBETAN LETTER DDA", 0x0F4D: "TIBETAN LETTER DDHA", 0x0F4E: "TIBETAN LETTER NNA", 0x0F4F: "TIBETAN LETTER TA", 0x0F50: "TIBETAN LETTER THA", 0x0F51: "TIBETAN LETTER DA", 0x0F52: "TIBETAN LETTER DHA", 0x0F53: "TIBETAN LETTER NA", 0x0F54: "TIBETAN LETTER PA", 0x0F55: "TIBETAN LETTER PHA", 0x0F56: "TIBETAN LETTER BA", 0x0F57: "TIBETAN LETTER BHA", 0x0F58: "TIBETAN LETTER MA", 0x0F59: "TIBETAN LETTER TSA", 0x0F5A: "TIBETAN LETTER TSHA", 0x0F5B: "TIBETAN LETTER DZA", 0x0F5C: "TIBETAN LETTER DZHA", 0x0F5D: "TIBETAN LETTER WA", 0x0F5E: "TIBETAN LETTER ZHA", 0x0F5F: "TIBETAN LETTER ZA", 0x0F60: "TIBETAN LETTER -A", 0x0F61: "TIBETAN LETTER YA", 0x0F62: "TIBETAN LETTER RA *", 0x0F63: "TIBETAN LETTER LA", 0x0F64: "TIBETAN LETTER SHA", 0x0F65: "TIBETAN LETTER SSA", 0x0F66: "TIBETAN LETTER SA", 0x0F67: "TIBETAN LETTER HA", 0x0F68: "TIBETAN LETTER A", 0x0F69: "TIBETAN LETTER KSSA", 0x0F6A: "TIBETAN LETTER FIXED-FORM RA *", 0x0F6B: "TIBETAN LETTER KKA", 0x0F6C: "TIBETAN LETTER RRA", 0x0F71: "TIBETAN VOWEL SIGN AA", 0x0F72: "TIBETAN VOWEL SIGN I", 0x0F73: "TIBETAN VOWEL SIGN II", 0x0F74: "TIBETAN VOWEL SIGN U", 0x0F75: "TIBETAN VOWEL SIGN UU", 0x0F76: "TIBETAN VOWEL SIGN VOCALIC R", 0x0F77: "TIBETAN VOWEL SIGN VOCALIC RR", 0x0F78: "TIBETAN VOWEL SIGN VOCALIC L", 0x0F79: "TIBETAN VOWEL SIGN VOCALIC LL", 0x0F7A: "TIBETAN VOWEL SIGN E", 0x0F7B: "TIBETAN VOWEL SIGN EE", 0x0F7C: "TIBETAN VOWEL SIGN O", 0x0F7D: "TIBETAN VOWEL SIGN OO", 0x0F7E: "TIBETAN SIGN RJES SU NGA RO (je su nga ro)", 0x0F7F: "TIBETAN SIGN RNAM BCAD (nam chey)", 0x0F80: "TIBETAN VOWEL SIGN REVERSED I", 0x0F81: "TIBETAN VOWEL SIGN REVERSED II", 0x0F82: "TIBETAN SIGN NYI ZLA NAA DA (nyi da na da)", 0x0F83: "TIBETAN SIGN SNA LDAN (nan de)", 0x0F84: "TIBETAN MARK HALANTA", 0x0F85: "TIBETAN MARK PALUTA", 0x0F86: "TIBETAN SIGN LCI RTAGS (ji ta)", 0x0F87: "TIBETAN SIGN YANG RTAGS (yang ta)", 0x0F88: "TIBETAN SIGN LCE TSA CAN (che tsa chen)", 0x0F89: "TIBETAN SIGN MCHU CAN (chu chen)", 0x0F8A: "TIBETAN SIGN GRU CAN RGYINGS (tru chen ging)", 0x0F8B: "TIBETAN SIGN GRU MED RGYINGS (tru me ging)", 0x0F90: "TIBETAN SUBJOINED LETTER KA", 0x0F91: "TIBETAN SUBJOINED LETTER KHA", 0x0F92: "TIBETAN SUBJOINED LETTER GA", 0x0F93: "TIBETAN SUBJOINED LETTER GHA", 0x0F94: "TIBETAN SUBJOINED LETTER NGA", 0x0F95: "TIBETAN SUBJOINED LETTER CA", 0x0F96: "TIBETAN SUBJOINED LETTER CHA", 0x0F97: "TIBETAN SUBJOINED LETTER JA", 0x0F99: "TIBETAN SUBJOINED LETTER NYA", 0x0F9A: "TIBETAN SUBJOINED LETTER TTA", 0x0F9B: "TIBETAN SUBJOINED LETTER TTHA", 0x0F9C: "TIBETAN SUBJOINED LETTER DDA", 0x0F9D: "TIBETAN SUBJOINED LETTER DDHA", 0x0F9E: "TIBETAN SUBJOINED LETTER NNA", 0x0F9F: "TIBETAN SUBJOINED LETTER TA", 0x0FA0: "TIBETAN SUBJOINED LETTER THA", 0x0FA1: "TIBETAN SUBJOINED LETTER DA", 0x0FA2: "TIBETAN SUBJOINED LETTER DHA", 0x0FA3: "TIBETAN SUBJOINED LETTER NA", 0x0FA4: "TIBETAN SUBJOINED LETTER PA", 0x0FA5: "TIBETAN SUBJOINED LETTER PHA", 0x0FA6: "TIBETAN SUBJOINED LETTER BA", 0x0FA7: "TIBETAN SUBJOINED LETTER BHA", 0x0FA8: "TIBETAN SUBJOINED LETTER MA", 0x0FA9: "TIBETAN SUBJOINED LETTER TSA", 0x0FAA: "TIBETAN SUBJOINED LETTER TSHA", 0x0FAB: "TIBETAN SUBJOINED LETTER DZA", 0x0FAC: "TIBETAN SUBJOINED LETTER DZHA", 0x0FAD: "TIBETAN SUBJOINED LETTER WA *", 0x0FAE: "TIBETAN SUBJOINED LETTER ZHA", 0x0FAF: "TIBETAN SUBJOINED LETTER ZA", 0x0FB0: "TIBETAN SUBJOINED LETTER -A", 0x0FB1: "TIBETAN SUBJOINED LETTER YA *", 0x0FB2: "TIBETAN SUBJOINED LETTER RA *", 0x0FB3: "TIBETAN SUBJOINED LETTER LA", 0x0FB4: "TIBETAN SUBJOINED LETTER SHA", 0x0FB5: "TIBETAN SUBJOINED LETTER SSA", 0x0FB6: "TIBETAN SUBJOINED LETTER SA", 0x0FB7: "TIBETAN SUBJOINED LETTER HA", 0x0FB8: "TIBETAN SUBJOINED LETTER A", 0x0FB9: "TIBETAN SUBJOINED LETTER KSSA", 0x0FBA: "TIBETAN SUBJOINED LETTER FIXED-FORM WA *", 0x0FBB: "TIBETAN SUBJOINED LETTER FIXED-FORM YA *", 0x0FBC: "TIBETAN SUBJOINED LETTER FIXED-FORM RA *", 0x0FBE: "TIBETAN KU RU KHA (kuruka)", 0x0FBF: "TIBETAN KU RU KHA BZHI MIG CAN (kuruka shi mik chen)", 0x0FC0: "TIBETAN CANTILLATION SIGN HEAVY BEAT", 0x0FC1: "TIBETAN CANTILLATION SIGN LIGHT BEAT", 0x0FC2: "TIBETAN CANTILLATION SIGN CANG TE-U (chang tyu)", 0x0FC3: "TIBETAN CANTILLATION SIGN SBUB -CHAL (bub chey)", 0x0FC4: "TIBETAN SYMBOL DRIL BU (drilbu)", 0x0FC5: "TIBETAN SYMBOL RDO RJE (dorje)", 0x0FC6: "TIBETAN SYMBOL PADMA GDAN (pema den)", 0x0FC7: "TIBETAN SYMBOL RDO RJE RGYA GRAM (dorje gya dram)", 0x0FC8: "TIBETAN SYMBOL PHUR PA (phurba)", 0x0FC9: "TIBETAN SYMBOL NOR BU (norbu)", 0x0FCA: "TIBETAN SYMBOL NOR BU NYIS -KHYIL (norbu nyi khyi)", 0x0FCB: "TIBETAN SYMBOL NOR BU GSUM -KHYIL (norbu sum khyi)", 0x0FCC: "TIBETAN SYMBOL NOR BU BZHI -KHYIL (norbu shi khyi)", 0x0FCE: "TIBETAN SIGN RDEL NAG RDEL DKAR (dena deka)", 0x0FCF: "TIBETAN SIGN RDEL NAG GSUM (dena sum)", 0x0FD0: "TIBETAN MARK BSKA- SHOG GI MGO RGYAN (ka shog gi go gyen)", 0x0FD1: "TIBETAN MARK MNYAM YIG GI MGO RGYAN (nyam yig gi go gyen)", 0x0FD2: "TIBETAN MARK NYIS TSHEG (nyi tsek)", 0x0FD3: "TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA (da nying yik go dun ma)", 0x0FD4: "TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA (da nying yik go kab ma)", 0x1000: "MYANMAR LETTER KA", 0x1001: "MYANMAR LETTER KHA", 0x1002: "MYANMAR LETTER GA", 0x1003: "MYANMAR LETTER GHA", 0x1004: "MYANMAR LETTER NGA", 0x1005: "MYANMAR LETTER CA", 0x1006: "MYANMAR LETTER CHA", 0x1007: "MYANMAR LETTER JA", 0x1008: "MYANMAR LETTER JHA", 0x1009: "MYANMAR LETTER NYA", 0x100A: "MYANMAR LETTER NNYA", 0x100B: "MYANMAR LETTER TTA", 0x100C: "MYANMAR LETTER TTHA", 0x100D: "MYANMAR LETTER DDA", 0x100E: "MYANMAR LETTER DDHA", 0x100F: "MYANMAR LETTER NNA", 0x1010: "MYANMAR LETTER TA", 0x1011: "MYANMAR LETTER THA", 0x1012: "MYANMAR LETTER DA", 0x1013: "MYANMAR LETTER DHA", 0x1014: "MYANMAR LETTER NA", 0x1015: "MYANMAR LETTER PA", 0x1016: "MYANMAR LETTER PHA", 0x1017: "MYANMAR LETTER BA", 0x1018: "MYANMAR LETTER BHA", 0x1019: "MYANMAR LETTER MA", 0x101A: "MYANMAR LETTER YA", 0x101B: "MYANMAR LETTER RA", 0x101C: "MYANMAR LETTER LA", 0x101D: "MYANMAR LETTER WA", 0x101E: "MYANMAR LETTER SA", 0x101F: "MYANMAR LETTER HA", 0x1020: "MYANMAR LETTER LLA", 0x1021: "MYANMAR LETTER A", 0x1022: "MYANMAR LETTER SHAN A", 0x1023: "MYANMAR LETTER I", 0x1024: "MYANMAR LETTER II", 0x1025: "MYANMAR LETTER U", 0x1026: "MYANMAR LETTER UU", 0x1027: "MYANMAR LETTER E", 0x1028: "MYANMAR LETTER MON E", 0x1029: "MYANMAR LETTER O", 0x102A: "MYANMAR LETTER AU", 0x102B: "MYANMAR VOWEL SIGN TALL AA", 0x102C: "MYANMAR VOWEL SIGN AA", 0x102D: "MYANMAR VOWEL SIGN I", 0x102E: "MYANMAR VOWEL SIGN II", 0x102F: "MYANMAR VOWEL SIGN U", 0x1030: "MYANMAR VOWEL SIGN UU", 0x1031: "MYANMAR VOWEL SIGN E", 0x1032: "MYANMAR VOWEL SIGN AI", 0x1033: "MYANMAR VOWEL SIGN MON II", 0x1034: "MYANMAR VOWEL SIGN MON O", 0x1035: "MYANMAR VOWEL SIGN E ABOVE", 0x1036: "MYANMAR SIGN ANUSVARA", 0x1037: "MYANMAR SIGN DOT BELOW", 0x1038: "MYANMAR SIGN VISARGA", 0x1039: "MYANMAR SIGN VIRAMA", 0x103A: "MYANMAR SIGN ASAT", 0x103B: "MYANMAR CONSONANT SIGN MEDIAL YA", 0x103C: "MYANMAR CONSONANT SIGN MEDIAL RA", 0x103D: "MYANMAR CONSONANT SIGN MEDIAL WA", 0x103E: "MYANMAR CONSONANT SIGN MEDIAL HA", 0x103F: "MYANMAR LETTER GREAT SA", 0x1040: "MYANMAR DIGIT ZERO", 0x1041: "MYANMAR DIGIT ONE", 0x1042: "MYANMAR DIGIT TWO", 0x1043: "MYANMAR DIGIT THREE", 0x1044: "MYANMAR DIGIT FOUR", 0x1045: "MYANMAR DIGIT FIVE", 0x1046: "MYANMAR DIGIT SIX", 0x1047: "MYANMAR DIGIT SEVEN", 0x1048: "MYANMAR DIGIT EIGHT", 0x1049: "MYANMAR DIGIT NINE", 0x104A: "MYANMAR SIGN LITTLE SECTION", 0x104B: "MYANMAR SIGN SECTION", 0x104C: "MYANMAR SYMBOL LOCATIVE", 0x104D: "MYANMAR SYMBOL COMPLETED", 0x104E: "MYANMAR SYMBOL AFOREMENTIONED", 0x104F: "MYANMAR SYMBOL GENITIVE", 0x1050: "MYANMAR LETTER SHA", 0x1051: "MYANMAR LETTER SSA", 0x1052: "MYANMAR LETTER VOCALIC R", 0x1053: "MYANMAR LETTER VOCALIC RR", 0x1054: "MYANMAR LETTER VOCALIC L", 0x1055: "MYANMAR LETTER VOCALIC LL", 0x1056: "MYANMAR VOWEL SIGN VOCALIC R", 0x1057: "MYANMAR VOWEL SIGN VOCALIC RR", 0x1058: "MYANMAR VOWEL SIGN VOCALIC L", 0x1059: "MYANMAR VOWEL SIGN VOCALIC LL", 0x105A: "MYANMAR LETTER MON NGA", 0x105B: "MYANMAR LETTER MON JHA", 0x105C: "MYANMAR LETTER MON BBA", 0x105D: "MYANMAR LETTER MON BBE", 0x105E: "MYANMAR CONSONANT SIGN MON MEDIAL NA", 0x105F: "MYANMAR CONSONANT SIGN MON MEDIAL MA", 0x1060: "MYANMAR CONSONANT SIGN MON MEDIAL LA", 0x1061: "MYANMAR LETTER SGAW KAREN SHA", 0x1062: "MYANMAR VOWEL SIGN SGAW KAREN EU", 0x1063: "MYANMAR TONE MARK SGAW KAREN HATHI", 0x1064: "MYANMAR TONE MARK SGAW KAREN KE PHO", 0x1065: "MYANMAR LETTER WESTERN PWO KAREN THA", 0x1066: "MYANMAR LETTER WESTERN PWO KAREN PWA", 0x1067: "MYANMAR VOWEL SIGN WESTERN PWO KAREN EU", 0x1068: "MYANMAR VOWEL SIGN WESTERN PWO KAREN UE", 0x1069: "MYANMAR SIGN WESTERN PWO KAREN TONE-1", 0x106A: "MYANMAR SIGN WESTERN PWO KAREN TONE-2", 0x106B: "MYANMAR SIGN WESTERN PWO KAREN TONE-3", 0x106C: "MYANMAR SIGN WESTERN PWO KAREN TONE-4", 0x106D: "MYANMAR SIGN WESTERN PWO KAREN TONE-5", 0x106E: "MYANMAR LETTER EASTERN PWO KAREN NNA", 0x106F: "MYANMAR LETTER EASTERN PWO KAREN YWA", 0x1070: "MYANMAR LETTER EASTERN PWO KAREN GHWA", 0x1071: "MYANMAR VOWEL SIGN GEBA KAREN I", 0x1072: "MYANMAR VOWEL SIGN KAYAH OE", 0x1073: "MYANMAR VOWEL SIGN KAYAH U", 0x1074: "MYANMAR VOWEL SIGN KAYAH EE", 0x1075: "MYANMAR LETTER SHAN KA", 0x1076: "MYANMAR LETTER SHAN KHA", 0x1077: "MYANMAR LETTER SHAN GA", 0x1078: "MYANMAR LETTER SHAN CA", 0x1079: "MYANMAR LETTER SHAN ZA", 0x107A: "MYANMAR LETTER SHAN NYA", 0x107B: "MYANMAR LETTER SHAN DA", 0x107C: "MYANMAR LETTER SHAN NA", 0x107D: "MYANMAR LETTER SHAN PHA", 0x107E: "MYANMAR LETTER SHAN FA", 0x107F: "MYANMAR LETTER SHAN BA", 0x1080: "MYANMAR LETTER SHAN THA", 0x1081: "MYANMAR LETTER SHAN HA", 0x1082: "MYANMAR CONSONANT SIGN SHAN MEDIAL WA", 0x1083: "MYANMAR VOWEL SIGN SHAN AA", 0x1084: "MYANMAR VOWEL SIGN SHAN E", 0x1085: "MYANMAR VOWEL SIGN SHAN E ABOVE", 0x1086: "MYANMAR VOWEL SIGN SHAN FINAL Y", 0x1087: "MYANMAR SIGN SHAN TONE-2", 0x1088: "MYANMAR SIGN SHAN TONE-3", 0x1089: "MYANMAR SIGN SHAN TONE-5", 0x108A: "MYANMAR SIGN SHAN TONE-6", 0x108B: "MYANMAR SIGN SHAN COUNCIL TONE-2", 0x108C: "MYANMAR SIGN SHAN COUNCIL TONE-3", 0x108D: "MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE", 0x108E: "MYANMAR LETTER RUMAI PALAUNG FA", 0x108F: "MYANMAR SIGN RUMAI PALAUNG TONE-5", 0x1090: "MYANMAR SHAN DIGIT ZERO", 0x1091: "MYANMAR SHAN DIGIT ONE", 0x1092: "MYANMAR SHAN DIGIT TWO", 0x1093: "MYANMAR SHAN DIGIT THREE", 0x1094: "MYANMAR SHAN DIGIT FOUR", 0x1095: "MYANMAR SHAN DIGIT FIVE", 0x1096: "MYANMAR SHAN DIGIT SIX", 0x1097: "MYANMAR SHAN DIGIT SEVEN", 0x1098: "MYANMAR SHAN DIGIT EIGHT", 0x1099: "MYANMAR SHAN DIGIT NINE", 0x109E: "MYANMAR SYMBOL SHAN ONE", 0x109F: "MYANMAR SYMBOL SHAN EXCLAMATION", 0x10A0: "GEORGIAN CAPITAL LETTER AN (Khutsuri)", 0x10A1: "GEORGIAN CAPITAL LETTER BAN (Khutsuri)", 0x10A2: "GEORGIAN CAPITAL LETTER GAN (Khutsuri)", 0x10A3: "GEORGIAN CAPITAL LETTER DON (Khutsuri)", 0x10A4: "GEORGIAN CAPITAL LETTER EN (Khutsuri)", 0x10A5: "GEORGIAN CAPITAL LETTER VIN (Khutsuri)", 0x10A6: "GEORGIAN CAPITAL LETTER ZEN (Khutsuri)", 0x10A7: "GEORGIAN CAPITAL LETTER TAN (Khutsuri)", 0x10A8: "GEORGIAN CAPITAL LETTER IN (Khutsuri)", 0x10A9: "GEORGIAN CAPITAL LETTER KAN (Khutsuri)", 0x10AA: "GEORGIAN CAPITAL LETTER LAS (Khutsuri)", 0x10AB: "GEORGIAN CAPITAL LETTER MAN (Khutsuri)", 0x10AC: "GEORGIAN CAPITAL LETTER NAR (Khutsuri)", 0x10AD: "GEORGIAN CAPITAL LETTER ON (Khutsuri)", 0x10AE: "GEORGIAN CAPITAL LETTER PAR (Khutsuri)", 0x10AF: "GEORGIAN CAPITAL LETTER ZHAR (Khutsuri)", 0x10B0: "GEORGIAN CAPITAL LETTER RAE (Khutsuri)", 0x10B1: "GEORGIAN CAPITAL LETTER SAN (Khutsuri)", 0x10B2: "GEORGIAN CAPITAL LETTER TAR (Khutsuri)", 0x10B3: "GEORGIAN CAPITAL LETTER UN (Khutsuri)", 0x10B4: "GEORGIAN CAPITAL LETTER PHAR (Khutsuri)", 0x10B5: "GEORGIAN CAPITAL LETTER KHAR (Khutsuri)", 0x10B6: "GEORGIAN CAPITAL LETTER GHAN (Khutsuri)", 0x10B7: "GEORGIAN CAPITAL LETTER QAR (Khutsuri)", 0x10B8: "GEORGIAN CAPITAL LETTER SHIN (Khutsuri)", 0x10B9: "GEORGIAN CAPITAL LETTER CHIN (Khutsuri)", 0x10BA: "GEORGIAN CAPITAL LETTER CAN (Khutsuri)", 0x10BB: "GEORGIAN CAPITAL LETTER JIL (Khutsuri)", 0x10BC: "GEORGIAN CAPITAL LETTER CIL (Khutsuri)", 0x10BD: "GEORGIAN CAPITAL LETTER CHAR (Khutsuri)", 0x10BE: "GEORGIAN CAPITAL LETTER XAN (Khutsuri)", 0x10BF: "GEORGIAN CAPITAL LETTER JHAN (Khutsuri)", 0x10C0: "GEORGIAN CAPITAL LETTER HAE (Khutsuri)", 0x10C1: "GEORGIAN CAPITAL LETTER HE (Khutsuri)", 0x10C2: "GEORGIAN CAPITAL LETTER HIE (Khutsuri)", 0x10C3: "GEORGIAN CAPITAL LETTER WE (Khutsuri)", 0x10C4: "GEORGIAN CAPITAL LETTER HAR (Khutsuri)", 0x10C5: "GEORGIAN CAPITAL LETTER HOE (Khutsuri)", 0x10D0: "GEORGIAN LETTER AN", 0x10D1: "GEORGIAN LETTER BAN", 0x10D2: "GEORGIAN LETTER GAN", 0x10D3: "GEORGIAN LETTER DON", 0x10D4: "GEORGIAN LETTER EN", 0x10D5: "GEORGIAN LETTER VIN", 0x10D6: "GEORGIAN LETTER ZEN", 0x10D7: "GEORGIAN LETTER TAN", 0x10D8: "GEORGIAN LETTER IN", 0x10D9: "GEORGIAN LETTER KAN", 0x10DA: "GEORGIAN LETTER LAS", 0x10DB: "GEORGIAN LETTER MAN", 0x10DC: "GEORGIAN LETTER NAR", 0x10DD: "GEORGIAN LETTER ON", 0x10DE: "GEORGIAN LETTER PAR", 0x10DF: "GEORGIAN LETTER ZHAR", 0x10E0: "GEORGIAN LETTER RAE", 0x10E1: "GEORGIAN LETTER SAN", 0x10E2: "GEORGIAN LETTER TAR", 0x10E3: "GEORGIAN LETTER UN", 0x10E4: "GEORGIAN LETTER PHAR", 0x10E5: "GEORGIAN LETTER KHAR", 0x10E6: "GEORGIAN LETTER GHAN", 0x10E7: "GEORGIAN LETTER QAR", 0x10E8: "GEORGIAN LETTER SHIN", 0x10E9: "GEORGIAN LETTER CHIN", 0x10EA: "GEORGIAN LETTER CAN", 0x10EB: "GEORGIAN LETTER JIL", 0x10EC: "GEORGIAN LETTER CIL", 0x10ED: "GEORGIAN LETTER CHAR", 0x10EE: "GEORGIAN LETTER XAN", 0x10EF: "GEORGIAN LETTER JHAN", 0x10F0: "GEORGIAN LETTER HAE", 0x10F1: "GEORGIAN LETTER HE", 0x10F2: "GEORGIAN LETTER HIE", 0x10F3: "GEORGIAN LETTER WE", 0x10F4: "GEORGIAN LETTER HAR", 0x10F5: "GEORGIAN LETTER HOE", 0x10F6: "GEORGIAN LETTER FI", 0x10F7: "GEORGIAN LETTER YN", 0x10F8: "GEORGIAN LETTER ELIFI", 0x10F9: "GEORGIAN LETTER TURNED GAN", 0x10FA: "GEORGIAN LETTER AIN", 0x10FB: "GEORGIAN PARAGRAPH SEPARATOR", 0x10FC: "MODIFIER LETTER GEORGIAN NAR", 0x1100: "HANGUL CHOSEONG KIYEOK (g) *", 0x1101: "HANGUL CHOSEONG SSANGKIYEOK (gg) *", 0x1102: "HANGUL CHOSEONG NIEUN (n) *", 0x1103: "HANGUL CHOSEONG TIKEUT (d) *", 0x1104: "HANGUL CHOSEONG SSANGTIKEUT (dd) *", 0x1105: "HANGUL CHOSEONG RIEUL (r) *", 0x1106: "HANGUL CHOSEONG MIEUM (m) *", 0x1107: "HANGUL CHOSEONG PIEUP (b) *", 0x1108: "HANGUL CHOSEONG SSANGPIEUP (bb) *", 0x1109: "HANGUL CHOSEONG SIOS (s) *", 0x110A: "HANGUL CHOSEONG SSANGSIOS (ss) *", 0x110B: "HANGUL CHOSEONG IEUNG", 0x110C: "HANGUL CHOSEONG CIEUC (j) *", 0x110D: "HANGUL CHOSEONG SSANGCIEUC (jj) *", 0x110E: "HANGUL CHOSEONG CHIEUCH (c) *", 0x110F: "HANGUL CHOSEONG KHIEUKH (k) *", 0x1110: "HANGUL CHOSEONG THIEUTH (t) *", 0x1111: "HANGUL CHOSEONG PHIEUPH (p) *", 0x1112: "HANGUL CHOSEONG HIEUH (h) *", 0x1113: "HANGUL CHOSEONG NIEUN-KIYEOK", 0x1114: "HANGUL CHOSEONG SSANGNIEUN", 0x1115: "HANGUL CHOSEONG NIEUN-TIKEUT", 0x1116: "HANGUL CHOSEONG NIEUN-PIEUP", 0x1117: "HANGUL CHOSEONG TIKEUT-KIYEOK", 0x1118: "HANGUL CHOSEONG RIEUL-NIEUN", 0x1119: "HANGUL CHOSEONG SSANGRIEUL", 0x111A: "HANGUL CHOSEONG RIEUL-HIEUH", 0x111B: "HANGUL CHOSEONG KAPYEOUNRIEUL", 0x111C: "HANGUL CHOSEONG MIEUM-PIEUP", 0x111D: "HANGUL CHOSEONG KAPYEOUNMIEUM", 0x111E: "HANGUL CHOSEONG PIEUP-KIYEOK", 0x111F: "HANGUL CHOSEONG PIEUP-NIEUN", 0x1120: "HANGUL CHOSEONG PIEUP-TIKEUT", 0x1121: "HANGUL CHOSEONG PIEUP-SIOS", 0x1122: "HANGUL CHOSEONG PIEUP-SIOS-KIYEOK", 0x1123: "HANGUL CHOSEONG PIEUP-SIOS-TIKEUT", 0x1124: "HANGUL CHOSEONG PIEUP-SIOS-PIEUP", 0x1125: "HANGUL CHOSEONG PIEUP-SSANGSIOS", 0x1126: "HANGUL CHOSEONG PIEUP-SIOS-CIEUC", 0x1127: "HANGUL CHOSEONG PIEUP-CIEUC", 0x1128: "HANGUL CHOSEONG PIEUP-CHIEUCH", 0x1129: "HANGUL CHOSEONG PIEUP-THIEUTH", 0x112A: "HANGUL CHOSEONG PIEUP-PHIEUPH", 0x112B: "HANGUL CHOSEONG KAPYEOUNPIEUP", 0x112C: "HANGUL CHOSEONG KAPYEOUNSSANGPIEUP", 0x112D: "HANGUL CHOSEONG SIOS-KIYEOK", 0x112E: "HANGUL CHOSEONG SIOS-NIEUN", 0x112F: "HANGUL CHOSEONG SIOS-TIKEUT", 0x1130: "HANGUL CHOSEONG SIOS-RIEUL", 0x1131: "HANGUL CHOSEONG SIOS-MIEUM", 0x1132: "HANGUL CHOSEONG SIOS-PIEUP", 0x1133: "HANGUL CHOSEONG SIOS-PIEUP-KIYEOK", 0x1134: "HANGUL CHOSEONG SIOS-SSANGSIOS", 0x1135: "HANGUL CHOSEONG SIOS-IEUNG", 0x1136: "HANGUL CHOSEONG SIOS-CIEUC", 0x1137: "HANGUL CHOSEONG SIOS-CHIEUCH", 0x1138: "HANGUL CHOSEONG SIOS-KHIEUKH", 0x1139: "HANGUL CHOSEONG SIOS-THIEUTH", 0x113A: "HANGUL CHOSEONG SIOS-PHIEUPH", 0x113B: "HANGUL CHOSEONG SIOS-HIEUH", 0x113C: "HANGUL CHOSEONG CHITUEUMSIOS", 0x113D: "HANGUL CHOSEONG CHITUEUMSSANGSIOS", 0x113E: "HANGUL CHOSEONG CEONGCHIEUMSIOS", 0x113F: "HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS", 0x1140: "HANGUL CHOSEONG PANSIOS", 0x1141: "HANGUL CHOSEONG IEUNG-KIYEOK", 0x1142: "HANGUL CHOSEONG IEUNG-TIKEUT", 0x1143: "HANGUL CHOSEONG IEUNG-MIEUM", 0x1144: "HANGUL CHOSEONG IEUNG-PIEUP", 0x1145: "HANGUL CHOSEONG IEUNG-SIOS", 0x1146: "HANGUL CHOSEONG IEUNG-PANSIOS", 0x1147: "HANGUL CHOSEONG SSANGIEUNG", 0x1148: "HANGUL CHOSEONG IEUNG-CIEUC", 0x1149: "HANGUL CHOSEONG IEUNG-CHIEUCH", 0x114A: "HANGUL CHOSEONG IEUNG-THIEUTH", 0x114B: "HANGUL CHOSEONG IEUNG-PHIEUPH", 0x114C: "HANGUL CHOSEONG YESIEUNG", 0x114D: "HANGUL CHOSEONG CIEUC-IEUNG", 0x114E: "HANGUL CHOSEONG CHITUEUMCIEUC", 0x114F: "HANGUL CHOSEONG CHITUEUMSSANGCIEUC", 0x1150: "HANGUL CHOSEONG CEONGCHIEUMCIEUC", 0x1151: "HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC", 0x1152: "HANGUL CHOSEONG CHIEUCH-KHIEUKH", 0x1153: "HANGUL CHOSEONG CHIEUCH-HIEUH", 0x1154: "HANGUL CHOSEONG CHITUEUMCHIEUCH", 0x1155: "HANGUL CHOSEONG CEONGCHIEUMCHIEUCH", 0x1156: "HANGUL CHOSEONG PHIEUPH-PIEUP", 0x1157: "HANGUL CHOSEONG KAPYEOUNPHIEUPH", 0x1158: "HANGUL CHOSEONG SSANGHIEUH", 0x1159: "HANGUL CHOSEONG YEORINHIEUH", 0x115F: "HANGUL CHOSEONG FILLER", 0x1160: "HANGUL JUNGSEONG FILLER", 0x1161: "HANGUL JUNGSEONG A", 0x1162: "HANGUL JUNGSEONG AE", 0x1163: "HANGUL JUNGSEONG YA", 0x1164: "HANGUL JUNGSEONG YAE", 0x1165: "HANGUL JUNGSEONG EO", 0x1166: "HANGUL JUNGSEONG E", 0x1167: "HANGUL JUNGSEONG YEO", 0x1168: "HANGUL JUNGSEONG YE", 0x1169: "HANGUL JUNGSEONG O", 0x116A: "HANGUL JUNGSEONG WA", 0x116B: "HANGUL JUNGSEONG WAE", 0x116C: "HANGUL JUNGSEONG OE", 0x116D: "HANGUL JUNGSEONG YO", 0x116E: "HANGUL JUNGSEONG U", 0x116F: "HANGUL JUNGSEONG WEO", 0x1170: "HANGUL JUNGSEONG WE", 0x1171: "HANGUL JUNGSEONG WI", 0x1172: "HANGUL JUNGSEONG YU", 0x1173: "HANGUL JUNGSEONG EU", 0x1174: "HANGUL JUNGSEONG YI", 0x1175: "HANGUL JUNGSEONG I", 0x1176: "HANGUL JUNGSEONG A-O", 0x1177: "HANGUL JUNGSEONG A-U", 0x1178: "HANGUL JUNGSEONG YA-O", 0x1179: "HANGUL JUNGSEONG YA-YO", 0x117A: "HANGUL JUNGSEONG EO-O", 0x117B: "HANGUL JUNGSEONG EO-U", 0x117C: "HANGUL JUNGSEONG EO-EU", 0x117D: "HANGUL JUNGSEONG YEO-O", 0x117E: "HANGUL JUNGSEONG YEO-U", 0x117F: "HANGUL JUNGSEONG O-EO", 0x1180: "HANGUL JUNGSEONG O-E", 0x1181: "HANGUL JUNGSEONG O-YE", 0x1182: "HANGUL JUNGSEONG O-O", 0x1183: "HANGUL JUNGSEONG O-U", 0x1184: "HANGUL JUNGSEONG YO-YA", 0x1185: "HANGUL JUNGSEONG YO-YAE", 0x1186: "HANGUL JUNGSEONG YO-YEO", 0x1187: "HANGUL JUNGSEONG YO-O", 0x1188: "HANGUL JUNGSEONG YO-I", 0x1189: "HANGUL JUNGSEONG U-A", 0x118A: "HANGUL JUNGSEONG U-AE", 0x118B: "HANGUL JUNGSEONG U-EO-EU", 0x118C: "HANGUL JUNGSEONG U-YE", 0x118D: "HANGUL JUNGSEONG U-U", 0x118E: "HANGUL JUNGSEONG YU-A", 0x118F: "HANGUL JUNGSEONG YU-EO", 0x1190: "HANGUL JUNGSEONG YU-E", 0x1191: "HANGUL JUNGSEONG YU-YEO", 0x1192: "HANGUL JUNGSEONG YU-YE", 0x1193: "HANGUL JUNGSEONG YU-U", 0x1194: "HANGUL JUNGSEONG YU-I", 0x1195: "HANGUL JUNGSEONG EU-U", 0x1196: "HANGUL JUNGSEONG EU-EU", 0x1197: "HANGUL JUNGSEONG YI-U", 0x1198: "HANGUL JUNGSEONG I-A", 0x1199: "HANGUL JUNGSEONG I-YA", 0x119A: "HANGUL JUNGSEONG I-O", 0x119B: "HANGUL JUNGSEONG I-U", 0x119C: "HANGUL JUNGSEONG I-EU", 0x119D: "HANGUL JUNGSEONG I-ARAEA", 0x119E: "HANGUL JUNGSEONG ARAEA", 0x119F: "HANGUL JUNGSEONG ARAEA-EO", 0x11A0: "HANGUL JUNGSEONG ARAEA-U", 0x11A1: "HANGUL JUNGSEONG ARAEA-I", 0x11A2: "HANGUL JUNGSEONG SSANGARAEA", 0x11A8: "HANGUL JONGSEONG KIYEOK (g) *", 0x11A9: "HANGUL JONGSEONG SSANGKIYEOK (gg) *", 0x11AA: "HANGUL JONGSEONG KIYEOK-SIOS (gs) *", 0x11AB: "HANGUL JONGSEONG NIEUN (n) *", 0x11AC: "HANGUL JONGSEONG NIEUN-CIEUC (nj) *", 0x11AD: "HANGUL JONGSEONG NIEUN-HIEUH (nh) *", 0x11AE: "HANGUL JONGSEONG TIKEUT (d) *", 0x11AF: "HANGUL JONGSEONG RIEUL (l) *", 0x11B0: "HANGUL JONGSEONG RIEUL-KIYEOK (lg) *", 0x11B1: "HANGUL JONGSEONG RIEUL-MIEUM (lm) *", 0x11B2: "HANGUL JONGSEONG RIEUL-PIEUP (lb) *", 0x11B3: "HANGUL JONGSEONG RIEUL-SIOS (ls) *", 0x11B4: "HANGUL JONGSEONG RIEUL-THIEUTH (lt) *", 0x11B5: "HANGUL JONGSEONG RIEUL-PHIEUPH (lp) *", 0x11B6: "HANGUL JONGSEONG RIEUL-HIEUH (lh) *", 0x11B7: "HANGUL JONGSEONG MIEUM (m) *", 0x11B8: "HANGUL JONGSEONG PIEUP (b) *", 0x11B9: "HANGUL JONGSEONG PIEUP-SIOS (bs) *", 0x11BA: "HANGUL JONGSEONG SIOS (s) *", 0x11BB: "HANGUL JONGSEONG SSANGSIOS (ss) *", 0x11BC: "HANGUL JONGSEONG IEUNG (ng) *", 0x11BD: "HANGUL JONGSEONG CIEUC (j) *", 0x11BE: "HANGUL JONGSEONG CHIEUCH (c) *", 0x11BF: "HANGUL JONGSEONG KHIEUKH (k) *", 0x11C0: "HANGUL JONGSEONG THIEUTH (t) *", 0x11C1: "HANGUL JONGSEONG PHIEUPH (p) *", 0x11C2: "HANGUL JONGSEONG HIEUH (h) *", 0x11C3: "HANGUL JONGSEONG KIYEOK-RIEUL", 0x11C4: "HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK", 0x11C5: "HANGUL JONGSEONG NIEUN-KIYEOK", 0x11C6: "HANGUL JONGSEONG NIEUN-TIKEUT", 0x11C7: "HANGUL JONGSEONG NIEUN-SIOS", 0x11C8: "HANGUL JONGSEONG NIEUN-PANSIOS", 0x11C9: "HANGUL JONGSEONG NIEUN-THIEUTH", 0x11CA: "HANGUL JONGSEONG TIKEUT-KIYEOK", 0x11CB: "HANGUL JONGSEONG TIKEUT-RIEUL", 0x11CC: "HANGUL JONGSEONG RIEUL-KIYEOK-SIOS", 0x11CD: "HANGUL JONGSEONG RIEUL-NIEUN", 0x11CE: "HANGUL JONGSEONG RIEUL-TIKEUT", 0x11CF: "HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH", 0x11D0: "HANGUL JONGSEONG SSANGRIEUL", 0x11D1: "HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK", 0x11D2: "HANGUL JONGSEONG RIEUL-MIEUM-SIOS", 0x11D3: "HANGUL JONGSEONG RIEUL-PIEUP-SIOS", 0x11D4: "HANGUL JONGSEONG RIEUL-PIEUP-HIEUH", 0x11D5: "HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP", 0x11D6: "HANGUL JONGSEONG RIEUL-SSANGSIOS", 0x11D7: "HANGUL JONGSEONG RIEUL-PANSIOS", 0x11D8: "HANGUL JONGSEONG RIEUL-KHIEUKH", 0x11D9: "HANGUL JONGSEONG RIEUL-YEORINHIEUH", 0x11DA: "HANGUL JONGSEONG MIEUM-KIYEOK", 0x11DB: "HANGUL JONGSEONG MIEUM-RIEUL", 0x11DC: "HANGUL JONGSEONG MIEUM-PIEUP", 0x11DD: "HANGUL JONGSEONG MIEUM-SIOS", 0x11DE: "HANGUL JONGSEONG MIEUM-SSANGSIOS", 0x11DF: "HANGUL JONGSEONG MIEUM-PANSIOS", 0x11E0: "HANGUL JONGSEONG MIEUM-CHIEUCH", 0x11E1: "HANGUL JONGSEONG MIEUM-HIEUH", 0x11E2: "HANGUL JONGSEONG KAPYEOUNMIEUM", 0x11E3: "HANGUL JONGSEONG PIEUP-RIEUL", 0x11E4: "HANGUL JONGSEONG PIEUP-PHIEUPH", 0x11E5: "HANGUL JONGSEONG PIEUP-HIEUH", 0x11E6: "HANGUL JONGSEONG KAPYEOUNPIEUP", 0x11E7: "HANGUL JONGSEONG SIOS-KIYEOK", 0x11E8: "HANGUL JONGSEONG SIOS-TIKEUT", 0x11E9: "HANGUL JONGSEONG SIOS-RIEUL", 0x11EA: "HANGUL JONGSEONG SIOS-PIEUP", 0x11EB: "HANGUL JONGSEONG PANSIOS", 0x11EC: "HANGUL JONGSEONG IEUNG-KIYEOK", 0x11ED: "HANGUL JONGSEONG IEUNG-SSANGKIYEOK", 0x11EE: "HANGUL JONGSEONG SSANGIEUNG", 0x11EF: "HANGUL JONGSEONG IEUNG-KHIEUKH", 0x11F0: "HANGUL JONGSEONG YESIEUNG", 0x11F1: "HANGUL JONGSEONG YESIEUNG-SIOS", 0x11F2: "HANGUL JONGSEONG YESIEUNG-PANSIOS", 0x11F3: "HANGUL JONGSEONG PHIEUPH-PIEUP", 0x11F4: "HANGUL JONGSEONG KAPYEOUNPHIEUPH", 0x11F5: "HANGUL JONGSEONG HIEUH-NIEUN", 0x11F6: "HANGUL JONGSEONG HIEUH-RIEUL", 0x11F7: "HANGUL JONGSEONG HIEUH-MIEUM", 0x11F8: "HANGUL JONGSEONG HIEUH-PIEUP", 0x11F9: "HANGUL JONGSEONG YEORINHIEUH", 0x1200: "ETHIOPIC SYLLABLE HA", 0x1201: "ETHIOPIC SYLLABLE HU", 0x1202: "ETHIOPIC SYLLABLE HI", 0x1203: "ETHIOPIC SYLLABLE HAA", 0x1204: "ETHIOPIC SYLLABLE HEE", 0x1205: "ETHIOPIC SYLLABLE HE", 0x1206: "ETHIOPIC SYLLABLE HO", 0x1207: "ETHIOPIC SYLLABLE HOA", 0x1208: "ETHIOPIC SYLLABLE LA", 0x1209: "ETHIOPIC SYLLABLE LU", 0x120A: "ETHIOPIC SYLLABLE LI", 0x120B: "ETHIOPIC SYLLABLE LAA", 0x120C: "ETHIOPIC SYLLABLE LEE", 0x120D: "ETHIOPIC SYLLABLE LE", 0x120E: "ETHIOPIC SYLLABLE LO", 0x120F: "ETHIOPIC SYLLABLE LWA", 0x1210: "ETHIOPIC SYLLABLE HHA", 0x1211: "ETHIOPIC SYLLABLE HHU", 0x1212: "ETHIOPIC SYLLABLE HHI", 0x1213: "ETHIOPIC SYLLABLE HHAA", 0x1214: "ETHIOPIC SYLLABLE HHEE", 0x1215: "ETHIOPIC SYLLABLE HHE", 0x1216: "ETHIOPIC SYLLABLE HHO", 0x1217: "ETHIOPIC SYLLABLE HHWA", 0x1218: "ETHIOPIC SYLLABLE MA", 0x1219: "ETHIOPIC SYLLABLE MU", 0x121A: "ETHIOPIC SYLLABLE MI", 0x121B: "ETHIOPIC SYLLABLE MAA", 0x121C: "ETHIOPIC SYLLABLE MEE", 0x121D: "ETHIOPIC SYLLABLE ME", 0x121E: "ETHIOPIC SYLLABLE MO", 0x121F: "ETHIOPIC SYLLABLE MWA", 0x1220: "ETHIOPIC SYLLABLE SZA", 0x1221: "ETHIOPIC SYLLABLE SZU", 0x1222: "ETHIOPIC SYLLABLE SZI", 0x1223: "ETHIOPIC SYLLABLE SZAA", 0x1224: "ETHIOPIC SYLLABLE SZEE", 0x1225: "ETHIOPIC SYLLABLE SZE", 0x1226: "ETHIOPIC SYLLABLE SZO", 0x1227: "ETHIOPIC SYLLABLE SZWA", 0x1228: "ETHIOPIC SYLLABLE RA", 0x1229: "ETHIOPIC SYLLABLE RU", 0x122A: "ETHIOPIC SYLLABLE RI", 0x122B: "ETHIOPIC SYLLABLE RAA", 0x122C: "ETHIOPIC SYLLABLE REE", 0x122D: "ETHIOPIC SYLLABLE RE", 0x122E: "ETHIOPIC SYLLABLE RO", 0x122F: "ETHIOPIC SYLLABLE RWA", 0x1230: "ETHIOPIC SYLLABLE SA", 0x1231: "ETHIOPIC SYLLABLE SU", 0x1232: "ETHIOPIC SYLLABLE SI", 0x1233: "ETHIOPIC SYLLABLE SAA", 0x1234: "ETHIOPIC SYLLABLE SEE", 0x1235: "ETHIOPIC SYLLABLE SE", 0x1236: "ETHIOPIC SYLLABLE SO", 0x1237: "ETHIOPIC SYLLABLE SWA", 0x1238: "ETHIOPIC SYLLABLE SHA", 0x1239: "ETHIOPIC SYLLABLE SHU", 0x123A: "ETHIOPIC SYLLABLE SHI", 0x123B: "ETHIOPIC SYLLABLE SHAA", 0x123C: "ETHIOPIC SYLLABLE SHEE", 0x123D: "ETHIOPIC SYLLABLE SHE", 0x123E: "ETHIOPIC SYLLABLE SHO", 0x123F: "ETHIOPIC SYLLABLE SHWA", 0x1240: "ETHIOPIC SYLLABLE QA", 0x1241: "ETHIOPIC SYLLABLE QU", 0x1242: "ETHIOPIC SYLLABLE QI", 0x1243: "ETHIOPIC SYLLABLE QAA", 0x1244: "ETHIOPIC SYLLABLE QEE", 0x1245: "ETHIOPIC SYLLABLE QE", 0x1246: "ETHIOPIC SYLLABLE QO", 0x1247: "ETHIOPIC SYLLABLE QOA", 0x1248: "ETHIOPIC SYLLABLE QWA", 0x124A: "ETHIOPIC SYLLABLE QWI", 0x124B: "ETHIOPIC SYLLABLE QWAA", 0x124C: "ETHIOPIC SYLLABLE QWEE", 0x124D: "ETHIOPIC SYLLABLE QWE", 0x1250: "ETHIOPIC SYLLABLE QHA", 0x1251: "ETHIOPIC SYLLABLE QHU", 0x1252: "ETHIOPIC SYLLABLE QHI", 0x1253: "ETHIOPIC SYLLABLE QHAA", 0x1254: "ETHIOPIC SYLLABLE QHEE", 0x1255: "ETHIOPIC SYLLABLE QHE", 0x1256: "ETHIOPIC SYLLABLE QHO", 0x1258: "ETHIOPIC SYLLABLE QHWA", 0x125A: "ETHIOPIC SYLLABLE QHWI", 0x125B: "ETHIOPIC SYLLABLE QHWAA", 0x125C: "ETHIOPIC SYLLABLE QHWEE", 0x125D: "ETHIOPIC SYLLABLE QHWE", 0x1260: "ETHIOPIC SYLLABLE BA", 0x1261: "ETHIOPIC SYLLABLE BU", 0x1262: "ETHIOPIC SYLLABLE BI", 0x1263: "ETHIOPIC SYLLABLE BAA", 0x1264: "ETHIOPIC SYLLABLE BEE", 0x1265: "ETHIOPIC SYLLABLE BE", 0x1266: "ETHIOPIC SYLLABLE BO", 0x1267: "ETHIOPIC SYLLABLE BWA", 0x1268: "ETHIOPIC SYLLABLE VA", 0x1269: "ETHIOPIC SYLLABLE VU", 0x126A: "ETHIOPIC SYLLABLE VI", 0x126B: "ETHIOPIC SYLLABLE VAA", 0x126C: "ETHIOPIC SYLLABLE VEE", 0x126D: "ETHIOPIC SYLLABLE VE", 0x126E: "ETHIOPIC SYLLABLE VO", 0x126F: "ETHIOPIC SYLLABLE VWA", 0x1270: "ETHIOPIC SYLLABLE TA", 0x1271: "ETHIOPIC SYLLABLE TU", 0x1272: "ETHIOPIC SYLLABLE TI", 0x1273: "ETHIOPIC SYLLABLE TAA", 0x1274: "ETHIOPIC SYLLABLE TEE", 0x1275: "ETHIOPIC SYLLABLE TE", 0x1276: "ETHIOPIC SYLLABLE TO", 0x1277: "ETHIOPIC SYLLABLE TWA", 0x1278: "ETHIOPIC SYLLABLE CA", 0x1279: "ETHIOPIC SYLLABLE CU", 0x127A: "ETHIOPIC SYLLABLE CI", 0x127B: "ETHIOPIC SYLLABLE CAA", 0x127C: "ETHIOPIC SYLLABLE CEE", 0x127D: "ETHIOPIC SYLLABLE CE", 0x127E: "ETHIOPIC SYLLABLE CO", 0x127F: "ETHIOPIC SYLLABLE CWA", 0x1280: "ETHIOPIC SYLLABLE XA", 0x1281: "ETHIOPIC SYLLABLE XU", 0x1282: "ETHIOPIC SYLLABLE XI", 0x1283: "ETHIOPIC SYLLABLE XAA", 0x1284: "ETHIOPIC SYLLABLE XEE", 0x1285: "ETHIOPIC SYLLABLE XE", 0x1286: "ETHIOPIC SYLLABLE XO", 0x1287: "ETHIOPIC SYLLABLE XOA", 0x1288: "ETHIOPIC SYLLABLE XWA", 0x128A: "ETHIOPIC SYLLABLE XWI", 0x128B: "ETHIOPIC SYLLABLE XWAA", 0x128C: "ETHIOPIC SYLLABLE XWEE", 0x128D: "ETHIOPIC SYLLABLE XWE", 0x1290: "ETHIOPIC SYLLABLE NA", 0x1291: "ETHIOPIC SYLLABLE NU", 0x1292: "ETHIOPIC SYLLABLE NI", 0x1293: "ETHIOPIC SYLLABLE NAA", 0x1294: "ETHIOPIC SYLLABLE NEE", 0x1295: "ETHIOPIC SYLLABLE NE", 0x1296: "ETHIOPIC SYLLABLE NO", 0x1297: "ETHIOPIC SYLLABLE NWA", 0x1298: "ETHIOPIC SYLLABLE NYA", 0x1299: "ETHIOPIC SYLLABLE NYU", 0x129A: "ETHIOPIC SYLLABLE NYI", 0x129B: "ETHIOPIC SYLLABLE NYAA", 0x129C: "ETHIOPIC SYLLABLE NYEE", 0x129D: "ETHIOPIC SYLLABLE NYE", 0x129E: "ETHIOPIC SYLLABLE NYO", 0x129F: "ETHIOPIC SYLLABLE NYWA", 0x12A0: "ETHIOPIC SYLLABLE GLOTTAL A", 0x12A1: "ETHIOPIC SYLLABLE GLOTTAL U", 0x12A2: "ETHIOPIC SYLLABLE GLOTTAL I", 0x12A3: "ETHIOPIC SYLLABLE GLOTTAL AA", 0x12A4: "ETHIOPIC SYLLABLE GLOTTAL EE", 0x12A5: "ETHIOPIC SYLLABLE GLOTTAL E", 0x12A6: "ETHIOPIC SYLLABLE GLOTTAL O", 0x12A7: "ETHIOPIC SYLLABLE GLOTTAL WA", 0x12A8: "ETHIOPIC SYLLABLE KA", 0x12A9: "ETHIOPIC SYLLABLE KU", 0x12AA: "ETHIOPIC SYLLABLE KI", 0x12AB: "ETHIOPIC SYLLABLE KAA", 0x12AC: "ETHIOPIC SYLLABLE KEE", 0x12AD: "ETHIOPIC SYLLABLE KE", 0x12AE: "ETHIOPIC SYLLABLE KO", 0x12AF: "ETHIOPIC SYLLABLE KOA", 0x12B0: "ETHIOPIC SYLLABLE KWA", 0x12B2: "ETHIOPIC SYLLABLE KWI", 0x12B3: "ETHIOPIC SYLLABLE KWAA", 0x12B4: "ETHIOPIC SYLLABLE KWEE", 0x12B5: "ETHIOPIC SYLLABLE KWE", 0x12B8: "ETHIOPIC SYLLABLE KXA", 0x12B9: "ETHIOPIC SYLLABLE KXU", 0x12BA: "ETHIOPIC SYLLABLE KXI", 0x12BB: "ETHIOPIC SYLLABLE KXAA", 0x12BC: "ETHIOPIC SYLLABLE KXEE", 0x12BD: "ETHIOPIC SYLLABLE KXE", 0x12BE: "ETHIOPIC SYLLABLE KXO", 0x12C0: "ETHIOPIC SYLLABLE KXWA", 0x12C2: "ETHIOPIC SYLLABLE KXWI", 0x12C3: "ETHIOPIC SYLLABLE KXWAA", 0x12C4: "ETHIOPIC SYLLABLE KXWEE", 0x12C5: "ETHIOPIC SYLLABLE KXWE", 0x12C8: "ETHIOPIC SYLLABLE WA", 0x12C9: "ETHIOPIC SYLLABLE WU", 0x12CA: "ETHIOPIC SYLLABLE WI", 0x12CB: "ETHIOPIC SYLLABLE WAA", 0x12CC: "ETHIOPIC SYLLABLE WEE", 0x12CD: "ETHIOPIC SYLLABLE WE", 0x12CE: "ETHIOPIC SYLLABLE WO", 0x12CF: "ETHIOPIC SYLLABLE WOA", 0x12D0: "ETHIOPIC SYLLABLE PHARYNGEAL A", 0x12D1: "ETHIOPIC SYLLABLE PHARYNGEAL U", 0x12D2: "ETHIOPIC SYLLABLE PHARYNGEAL I", 0x12D3: "ETHIOPIC SYLLABLE PHARYNGEAL AA", 0x12D4: "ETHIOPIC SYLLABLE PHARYNGEAL EE", 0x12D5: "ETHIOPIC SYLLABLE PHARYNGEAL E", 0x12D6: "ETHIOPIC SYLLABLE PHARYNGEAL O", 0x12D8: "ETHIOPIC SYLLABLE ZA", 0x12D9: "ETHIOPIC SYLLABLE ZU", 0x12DA: "ETHIOPIC SYLLABLE ZI", 0x12DB: "ETHIOPIC SYLLABLE ZAA", 0x12DC: "ETHIOPIC SYLLABLE ZEE", 0x12DD: "ETHIOPIC SYLLABLE ZE", 0x12DE: "ETHIOPIC SYLLABLE ZO", 0x12DF: "ETHIOPIC SYLLABLE ZWA", 0x12E0: "ETHIOPIC SYLLABLE ZHA", 0x12E1: "ETHIOPIC SYLLABLE ZHU", 0x12E2: "ETHIOPIC SYLLABLE ZHI", 0x12E3: "ETHIOPIC SYLLABLE ZHAA", 0x12E4: "ETHIOPIC SYLLABLE ZHEE", 0x12E5: "ETHIOPIC SYLLABLE ZHE", 0x12E6: "ETHIOPIC SYLLABLE ZHO", 0x12E7: "ETHIOPIC SYLLABLE ZHWA", 0x12E8: "ETHIOPIC SYLLABLE YA", 0x12E9: "ETHIOPIC SYLLABLE YU", 0x12EA: "ETHIOPIC SYLLABLE YI", 0x12EB: "ETHIOPIC SYLLABLE YAA", 0x12EC: "ETHIOPIC SYLLABLE YEE", 0x12ED: "ETHIOPIC SYLLABLE YE", 0x12EE: "ETHIOPIC SYLLABLE YO", 0x12EF: "ETHIOPIC SYLLABLE YOA", 0x12F0: "ETHIOPIC SYLLABLE DA", 0x12F1: "ETHIOPIC SYLLABLE DU", 0x12F2: "ETHIOPIC SYLLABLE DI", 0x12F3: "ETHIOPIC SYLLABLE DAA", 0x12F4: "ETHIOPIC SYLLABLE DEE", 0x12F5: "ETHIOPIC SYLLABLE DE", 0x12F6: "ETHIOPIC SYLLABLE DO", 0x12F7: "ETHIOPIC SYLLABLE DWA", 0x12F8: "ETHIOPIC SYLLABLE DDA", 0x12F9: "ETHIOPIC SYLLABLE DDU", 0x12FA: "ETHIOPIC SYLLABLE DDI", 0x12FB: "ETHIOPIC SYLLABLE DDAA", 0x12FC: "ETHIOPIC SYLLABLE DDEE", 0x12FD: "ETHIOPIC SYLLABLE DDE", 0x12FE: "ETHIOPIC SYLLABLE DDO", 0x12FF: "ETHIOPIC SYLLABLE DDWA", 0x1300: "ETHIOPIC SYLLABLE JA", 0x1301: "ETHIOPIC SYLLABLE JU", 0x1302: "ETHIOPIC SYLLABLE JI", 0x1303: "ETHIOPIC SYLLABLE JAA", 0x1304: "ETHIOPIC SYLLABLE JEE", 0x1305: "ETHIOPIC SYLLABLE JE", 0x1306: "ETHIOPIC SYLLABLE JO", 0x1307: "ETHIOPIC SYLLABLE JWA", 0x1308: "ETHIOPIC SYLLABLE GA", 0x1309: "ETHIOPIC SYLLABLE GU", 0x130A: "ETHIOPIC SYLLABLE GI", 0x130B: "ETHIOPIC SYLLABLE GAA", 0x130C: "ETHIOPIC SYLLABLE GEE", 0x130D: "ETHIOPIC SYLLABLE GE", 0x130E: "ETHIOPIC SYLLABLE GO", 0x130F: "ETHIOPIC SYLLABLE GOA", 0x1310: "ETHIOPIC SYLLABLE GWA", 0x1312: "ETHIOPIC SYLLABLE GWI", 0x1313: "ETHIOPIC SYLLABLE GWAA", 0x1314: "ETHIOPIC SYLLABLE GWEE", 0x1315: "ETHIOPIC SYLLABLE GWE", 0x1318: "ETHIOPIC SYLLABLE GGA", 0x1319: "ETHIOPIC SYLLABLE GGU", 0x131A: "ETHIOPIC SYLLABLE GGI", 0x131B: "ETHIOPIC SYLLABLE GGAA", 0x131C: "ETHIOPIC SYLLABLE GGEE", 0x131D: "ETHIOPIC SYLLABLE GGE", 0x131E: "ETHIOPIC SYLLABLE GGO", 0x131F: "ETHIOPIC SYLLABLE GGWAA", 0x1320: "ETHIOPIC SYLLABLE THA", 0x1321: "ETHIOPIC SYLLABLE THU", 0x1322: "ETHIOPIC SYLLABLE THI", 0x1323: "ETHIOPIC SYLLABLE THAA", 0x1324: "ETHIOPIC SYLLABLE THEE", 0x1325: "ETHIOPIC SYLLABLE THE", 0x1326: "ETHIOPIC SYLLABLE THO", 0x1327: "ETHIOPIC SYLLABLE THWA", 0x1328: "ETHIOPIC SYLLABLE CHA", 0x1329: "ETHIOPIC SYLLABLE CHU", 0x132A: "ETHIOPIC SYLLABLE CHI", 0x132B: "ETHIOPIC SYLLABLE CHAA", 0x132C: "ETHIOPIC SYLLABLE CHEE", 0x132D: "ETHIOPIC SYLLABLE CHE", 0x132E: "ETHIOPIC SYLLABLE CHO", 0x132F: "ETHIOPIC SYLLABLE CHWA", 0x1330: "ETHIOPIC SYLLABLE PHA", 0x1331: "ETHIOPIC SYLLABLE PHU", 0x1332: "ETHIOPIC SYLLABLE PHI", 0x1333: "ETHIOPIC SYLLABLE PHAA", 0x1334: "ETHIOPIC SYLLABLE PHEE", 0x1335: "ETHIOPIC SYLLABLE PHE", 0x1336: "ETHIOPIC SYLLABLE PHO", 0x1337: "ETHIOPIC SYLLABLE PHWA", 0x1338: "ETHIOPIC SYLLABLE TSA", 0x1339: "ETHIOPIC SYLLABLE TSU", 0x133A: "ETHIOPIC SYLLABLE TSI", 0x133B: "ETHIOPIC SYLLABLE TSAA", 0x133C: "ETHIOPIC SYLLABLE TSEE", 0x133D: "ETHIOPIC SYLLABLE TSE", 0x133E: "ETHIOPIC SYLLABLE TSO", 0x133F: "ETHIOPIC SYLLABLE TSWA", 0x1340: "ETHIOPIC SYLLABLE TZA", 0x1341: "ETHIOPIC SYLLABLE TZU", 0x1342: "ETHIOPIC SYLLABLE TZI", 0x1343: "ETHIOPIC SYLLABLE TZAA", 0x1344: "ETHIOPIC SYLLABLE TZEE", 0x1345: "ETHIOPIC SYLLABLE TZE", 0x1346: "ETHIOPIC SYLLABLE TZO", 0x1347: "ETHIOPIC SYLLABLE TZOA", 0x1348: "ETHIOPIC SYLLABLE FA", 0x1349: "ETHIOPIC SYLLABLE FU", 0x134A: "ETHIOPIC SYLLABLE FI", 0x134B: "ETHIOPIC SYLLABLE FAA", 0x134C: "ETHIOPIC SYLLABLE FEE", 0x134D: "ETHIOPIC SYLLABLE FE", 0x134E: "ETHIOPIC SYLLABLE FO", 0x134F: "ETHIOPIC SYLLABLE FWA", 0x1350: "ETHIOPIC SYLLABLE PA", 0x1351: "ETHIOPIC SYLLABLE PU", 0x1352: "ETHIOPIC SYLLABLE PI", 0x1353: "ETHIOPIC SYLLABLE PAA", 0x1354: "ETHIOPIC SYLLABLE PEE", 0x1355: "ETHIOPIC SYLLABLE PE", 0x1356: "ETHIOPIC SYLLABLE PO", 0x1357: "ETHIOPIC SYLLABLE PWA", 0x1358: "ETHIOPIC SYLLABLE RYA", 0x1359: "ETHIOPIC SYLLABLE MYA", 0x135A: "ETHIOPIC SYLLABLE FYA", 0x135F: "ETHIOPIC COMBINING GEMINATION MARK", 0x1360: "ETHIOPIC SECTION MARK", 0x1361: "ETHIOPIC WORDSPACE", 0x1362: "ETHIOPIC FULL STOP", 0x1363: "ETHIOPIC COMMA", 0x1364: "ETHIOPIC SEMICOLON", 0x1365: "ETHIOPIC COLON", 0x1366: "ETHIOPIC PREFACE COLON", 0x1367: "ETHIOPIC QUESTION MARK", 0x1368: "ETHIOPIC PARAGRAPH SEPARATOR", 0x1369: "ETHIOPIC DIGIT ONE", 0x136A: "ETHIOPIC DIGIT TWO", 0x136B: "ETHIOPIC DIGIT THREE", 0x136C: "ETHIOPIC DIGIT FOUR", 0x136D: "ETHIOPIC DIGIT FIVE", 0x136E: "ETHIOPIC DIGIT SIX", 0x136F: "ETHIOPIC DIGIT SEVEN", 0x1370: "ETHIOPIC DIGIT EIGHT", 0x1371: "ETHIOPIC DIGIT NINE", 0x1372: "ETHIOPIC NUMBER TEN", 0x1373: "ETHIOPIC NUMBER TWENTY", 0x1374: "ETHIOPIC NUMBER THIRTY", 0x1375: "ETHIOPIC NUMBER FORTY", 0x1376: "ETHIOPIC NUMBER FIFTY", 0x1377: "ETHIOPIC NUMBER SIXTY", 0x1378: "ETHIOPIC NUMBER SEVENTY", 0x1379: "ETHIOPIC NUMBER EIGHTY", 0x137A: "ETHIOPIC NUMBER NINETY", 0x137B: "ETHIOPIC NUMBER HUNDRED", 0x137C: "ETHIOPIC NUMBER TEN THOUSAND", 0x1380: "ETHIOPIC SYLLABLE SEBATBEIT MWA", 0x1381: "ETHIOPIC SYLLABLE MWI", 0x1382: "ETHIOPIC SYLLABLE MWEE", 0x1383: "ETHIOPIC SYLLABLE MWE", 0x1384: "ETHIOPIC SYLLABLE SEBATBEIT BWA", 0x1385: "ETHIOPIC SYLLABLE BWI", 0x1386: "ETHIOPIC SYLLABLE BWEE", 0x1387: "ETHIOPIC SYLLABLE BWE", 0x1388: "ETHIOPIC SYLLABLE SEBATBEIT FWA", 0x1389: "ETHIOPIC SYLLABLE FWI", 0x138A: "ETHIOPIC SYLLABLE FWEE", 0x138B: "ETHIOPIC SYLLABLE FWE", 0x138C: "ETHIOPIC SYLLABLE SEBATBEIT PWA", 0x138D: "ETHIOPIC SYLLABLE PWI", 0x138E: "ETHIOPIC SYLLABLE PWEE", 0x138F: "ETHIOPIC SYLLABLE PWE", 0x1390: "ETHIOPIC TONAL MARK YIZET", 0x1391: "ETHIOPIC TONAL MARK DERET", 0x1392: "ETHIOPIC TONAL MARK RIKRIK", 0x1393: "ETHIOPIC TONAL MARK SHORT RIKRIK", 0x1394: "ETHIOPIC TONAL MARK DIFAT", 0x1395: "ETHIOPIC TONAL MARK KENAT", 0x1396: "ETHIOPIC TONAL MARK CHIRET", 0x1397: "ETHIOPIC TONAL MARK HIDET", 0x1398: "ETHIOPIC TONAL MARK DERET-HIDET", 0x1399: "ETHIOPIC TONAL MARK KURT", 0x13A0: "CHEROKEE LETTER A", 0x13A1: "CHEROKEE LETTER E", 0x13A2: "CHEROKEE LETTER I", 0x13A3: "CHEROKEE LETTER O", 0x13A4: "CHEROKEE LETTER U", 0x13A5: "CHEROKEE LETTER V", 0x13A6: "CHEROKEE LETTER GA", 0x13A7: "CHEROKEE LETTER KA", 0x13A8: "CHEROKEE LETTER GE", 0x13A9: "CHEROKEE LETTER GI", 0x13AA: "CHEROKEE LETTER GO", 0x13AB: "CHEROKEE LETTER GU", 0x13AC: "CHEROKEE LETTER GV", 0x13AD: "CHEROKEE LETTER HA", 0x13AE: "CHEROKEE LETTER HE", 0x13AF: "CHEROKEE LETTER HI", 0x13B0: "CHEROKEE LETTER HO", 0x13B1: "CHEROKEE LETTER HU", 0x13B2: "CHEROKEE LETTER HV", 0x13B3: "CHEROKEE LETTER LA", 0x13B4: "CHEROKEE LETTER LE", 0x13B5: "CHEROKEE LETTER LI", 0x13B6: "CHEROKEE LETTER LO", 0x13B7: "CHEROKEE LETTER LU", 0x13B8: "CHEROKEE LETTER LV", 0x13B9: "CHEROKEE LETTER MA", 0x13BA: "CHEROKEE LETTER ME", 0x13BB: "CHEROKEE LETTER MI", 0x13BC: "CHEROKEE LETTER MO", 0x13BD: "CHEROKEE LETTER MU", 0x13BE: "CHEROKEE LETTER NA", 0x13BF: "CHEROKEE LETTER HNA", 0x13C0: "CHEROKEE LETTER NAH", 0x13C1: "CHEROKEE LETTER NE", 0x13C2: "CHEROKEE LETTER NI", 0x13C3: "CHEROKEE LETTER NO", 0x13C4: "CHEROKEE LETTER NU", 0x13C5: "CHEROKEE LETTER NV", 0x13C6: "CHEROKEE LETTER QUA", 0x13C7: "CHEROKEE LETTER QUE", 0x13C8: "CHEROKEE LETTER QUI", 0x13C9: "CHEROKEE LETTER QUO", 0x13CA: "CHEROKEE LETTER QUU", 0x13CB: "CHEROKEE LETTER QUV", 0x13CC: "CHEROKEE LETTER SA", 0x13CD: "CHEROKEE LETTER S", 0x13CE: "CHEROKEE LETTER SE", 0x13CF: "CHEROKEE LETTER SI", 0x13D0: "CHEROKEE LETTER SO", 0x13D1: "CHEROKEE LETTER SU", 0x13D2: "CHEROKEE LETTER SV", 0x13D3: "CHEROKEE LETTER DA", 0x13D4: "CHEROKEE LETTER TA", 0x13D5: "CHEROKEE LETTER DE", 0x13D6: "CHEROKEE LETTER TE", 0x13D7: "CHEROKEE LETTER DI", 0x13D8: "CHEROKEE LETTER TI", 0x13D9: "CHEROKEE LETTER DO", 0x13DA: "CHEROKEE LETTER DU", 0x13DB: "CHEROKEE LETTER DV", 0x13DC: "CHEROKEE LETTER DLA", 0x13DD: "CHEROKEE LETTER TLA", 0x13DE: "CHEROKEE LETTER TLE", 0x13DF: "CHEROKEE LETTER TLI", 0x13E0: "CHEROKEE LETTER TLO", 0x13E1: "CHEROKEE LETTER TLU", 0x13E2: "CHEROKEE LETTER TLV", 0x13E3: "CHEROKEE LETTER TSA", 0x13E4: "CHEROKEE LETTER TSE", 0x13E5: "CHEROKEE LETTER TSI", 0x13E6: "CHEROKEE LETTER TSO", 0x13E7: "CHEROKEE LETTER TSU", 0x13E8: "CHEROKEE LETTER TSV", 0x13E9: "CHEROKEE LETTER WA", 0x13EA: "CHEROKEE LETTER WE", 0x13EB: "CHEROKEE LETTER WI", 0x13EC: "CHEROKEE LETTER WO", 0x13ED: "CHEROKEE LETTER WU", 0x13EE: "CHEROKEE LETTER WV", 0x13EF: "CHEROKEE LETTER YA", 0x13F0: "CHEROKEE LETTER YE", 0x13F1: "CHEROKEE LETTER YI", 0x13F2: "CHEROKEE LETTER YO", 0x13F3: "CHEROKEE LETTER YU", 0x13F4: "CHEROKEE LETTER YV", 0x1401: "CANADIAN SYLLABICS E", 0x1402: "CANADIAN SYLLABICS AAI", 0x1403: "CANADIAN SYLLABICS I", 0x1404: "CANADIAN SYLLABICS II", 0x1405: "CANADIAN SYLLABICS O", 0x1406: "CANADIAN SYLLABICS OO", 0x1407: "CANADIAN SYLLABICS Y-CREE OO", 0x1408: "CANADIAN SYLLABICS CARRIER EE", 0x1409: "CANADIAN SYLLABICS CARRIER I", 0x140A: "CANADIAN SYLLABICS A", 0x140B: "CANADIAN SYLLABICS AA", 0x140C: "CANADIAN SYLLABICS WE", 0x140D: "CANADIAN SYLLABICS WEST-CREE WE", 0x140E: "CANADIAN SYLLABICS WI", 0x140F: "CANADIAN SYLLABICS WEST-CREE WI", 0x1410: "CANADIAN SYLLABICS WII", 0x1411: "CANADIAN SYLLABICS WEST-CREE WII", 0x1412: "CANADIAN SYLLABICS WO", 0x1413: "CANADIAN SYLLABICS WEST-CREE WO", 0x1414: "CANADIAN SYLLABICS WOO", 0x1415: "CANADIAN SYLLABICS WEST-CREE WOO", 0x1416: "CANADIAN SYLLABICS NASKAPI WOO", 0x1417: "CANADIAN SYLLABICS WA", 0x1418: "CANADIAN SYLLABICS WEST-CREE WA", 0x1419: "CANADIAN SYLLABICS WAA", 0x141A: "CANADIAN SYLLABICS WEST-CREE WAA", 0x141B: "CANADIAN SYLLABICS NASKAPI WAA", 0x141C: "CANADIAN SYLLABICS AI", 0x141D: "CANADIAN SYLLABICS Y-CREE W", 0x141E: "CANADIAN SYLLABICS GLOTTAL STOP", 0x141F: "CANADIAN SYLLABICS FINAL ACUTE", 0x1420: "CANADIAN SYLLABICS FINAL GRAVE", 0x1421: "CANADIAN SYLLABICS FINAL BOTTOM HALF RING", 0x1422: "CANADIAN SYLLABICS FINAL TOP HALF RING", 0x1423: "CANADIAN SYLLABICS FINAL RIGHT HALF RING", 0x1424: "CANADIAN SYLLABICS FINAL RING", 0x1425: "CANADIAN SYLLABICS FINAL DOUBLE ACUTE", 0x1426: "CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES", 0x1427: "CANADIAN SYLLABICS FINAL MIDDLE DOT", 0x1428: "CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE", 0x1429: "CANADIAN SYLLABICS FINAL PLUS", 0x142A: "CANADIAN SYLLABICS FINAL DOWN TACK", 0x142B: "CANADIAN SYLLABICS EN", 0x142C: "CANADIAN SYLLABICS IN", 0x142D: "CANADIAN SYLLABICS ON", 0x142E: "CANADIAN SYLLABICS AN", 0x142F: "CANADIAN SYLLABICS PE", 0x1430: "CANADIAN SYLLABICS PAAI", 0x1431: "CANADIAN SYLLABICS PI", 0x1432: "CANADIAN SYLLABICS PII", 0x1433: "CANADIAN SYLLABICS PO", 0x1434: "CANADIAN SYLLABICS POO", 0x1435: "CANADIAN SYLLABICS Y-CREE POO", 0x1436: "CANADIAN SYLLABICS CARRIER HEE", 0x1437: "CANADIAN SYLLABICS CARRIER HI", 0x1438: "CANADIAN SYLLABICS PA", 0x1439: "CANADIAN SYLLABICS PAA", 0x143A: "CANADIAN SYLLABICS PWE", 0x143B: "CANADIAN SYLLABICS WEST-CREE PWE", 0x143C: "CANADIAN SYLLABICS PWI", 0x143D: "CANADIAN SYLLABICS WEST-CREE PWI", 0x143E: "CANADIAN SYLLABICS PWII", 0x143F: "CANADIAN SYLLABICS WEST-CREE PWII", 0x1440: "CANADIAN SYLLABICS PWO", 0x1441: "CANADIAN SYLLABICS WEST-CREE PWO", 0x1442: "CANADIAN SYLLABICS PWOO", 0x1443: "CANADIAN SYLLABICS WEST-CREE PWOO", 0x1444: "CANADIAN SYLLABICS PWA", 0x1445: "CANADIAN SYLLABICS WEST-CREE PWA", 0x1446: "CANADIAN SYLLABICS PWAA", 0x1447: "CANADIAN SYLLABICS WEST-CREE PWAA", 0x1448: "CANADIAN SYLLABICS Y-CREE PWAA", 0x1449: "CANADIAN SYLLABICS P", 0x144A: "CANADIAN SYLLABICS WEST-CREE P", 0x144B: "CANADIAN SYLLABICS CARRIER H", 0x144C: "CANADIAN SYLLABICS TE", 0x144D: "CANADIAN SYLLABICS TAAI", 0x144E: "CANADIAN SYLLABICS TI", 0x144F: "CANADIAN SYLLABICS TII", 0x1450: "CANADIAN SYLLABICS TO", 0x1451: "CANADIAN SYLLABICS TOO", 0x1452: "CANADIAN SYLLABICS Y-CREE TOO", 0x1453: "CANADIAN SYLLABICS CARRIER DEE", 0x1454: "CANADIAN SYLLABICS CARRIER DI", 0x1455: "CANADIAN SYLLABICS TA", 0x1456: "CANADIAN SYLLABICS TAA", 0x1457: "CANADIAN SYLLABICS TWE", 0x1458: "CANADIAN SYLLABICS WEST-CREE TWE", 0x1459: "CANADIAN SYLLABICS TWI", 0x145A: "CANADIAN SYLLABICS WEST-CREE TWI", 0x145B: "CANADIAN SYLLABICS TWII", 0x145C: "CANADIAN SYLLABICS WEST-CREE TWII", 0x145D: "CANADIAN SYLLABICS TWO", 0x145E: "CANADIAN SYLLABICS WEST-CREE TWO", 0x145F: "CANADIAN SYLLABICS TWOO", 0x1460: "CANADIAN SYLLABICS WEST-CREE TWOO", 0x1461: "CANADIAN SYLLABICS TWA", 0x1462: "CANADIAN SYLLABICS WEST-CREE TWA", 0x1463: "CANADIAN SYLLABICS TWAA", 0x1464: "CANADIAN SYLLABICS WEST-CREE TWAA", 0x1465: "CANADIAN SYLLABICS NASKAPI TWAA", 0x1466: "CANADIAN SYLLABICS T", 0x1467: "CANADIAN SYLLABICS TTE", 0x1468: "CANADIAN SYLLABICS TTI", 0x1469: "CANADIAN SYLLABICS TTO", 0x146A: "CANADIAN SYLLABICS TTA", 0x146B: "CANADIAN SYLLABICS KE", 0x146C: "CANADIAN SYLLABICS KAAI", 0x146D: "CANADIAN SYLLABICS KI", 0x146E: "CANADIAN SYLLABICS KII", 0x146F: "CANADIAN SYLLABICS KO", 0x1470: "CANADIAN SYLLABICS KOO", 0x1471: "CANADIAN SYLLABICS Y-CREE KOO", 0x1472: "CANADIAN SYLLABICS KA", 0x1473: "CANADIAN SYLLABICS KAA", 0x1474: "CANADIAN SYLLABICS KWE", 0x1475: "CANADIAN SYLLABICS WEST-CREE KWE", 0x1476: "CANADIAN SYLLABICS KWI", 0x1477: "CANADIAN SYLLABICS WEST-CREE KWI", 0x1478: "CANADIAN SYLLABICS KWII", 0x1479: "CANADIAN SYLLABICS WEST-CREE KWII", 0x147A: "CANADIAN SYLLABICS KWO", 0x147B: "CANADIAN SYLLABICS WEST-CREE KWO", 0x147C: "CANADIAN SYLLABICS KWOO", 0x147D: "CANADIAN SYLLABICS WEST-CREE KWOO", 0x147E: "CANADIAN SYLLABICS KWA", 0x147F: "CANADIAN SYLLABICS WEST-CREE KWA", 0x1480: "CANADIAN SYLLABICS KWAA", 0x1481: "CANADIAN SYLLABICS WEST-CREE KWAA", 0x1482: "CANADIAN SYLLABICS NASKAPI KWAA", 0x1483: "CANADIAN SYLLABICS K", 0x1484: "CANADIAN SYLLABICS KW", 0x1485: "CANADIAN SYLLABICS SOUTH-SLAVEY KEH", 0x1486: "CANADIAN SYLLABICS SOUTH-SLAVEY KIH", 0x1487: "CANADIAN SYLLABICS SOUTH-SLAVEY KOH", 0x1488: "CANADIAN SYLLABICS SOUTH-SLAVEY KAH", 0x1489: "CANADIAN SYLLABICS CE", 0x148A: "CANADIAN SYLLABICS CAAI", 0x148B: "CANADIAN SYLLABICS CI", 0x148C: "CANADIAN SYLLABICS CII", 0x148D: "CANADIAN SYLLABICS CO", 0x148E: "CANADIAN SYLLABICS COO", 0x148F: "CANADIAN SYLLABICS Y-CREE COO", 0x1490: "CANADIAN SYLLABICS CA", 0x1491: "CANADIAN SYLLABICS CAA", 0x1492: "CANADIAN SYLLABICS CWE", 0x1493: "CANADIAN SYLLABICS WEST-CREE CWE", 0x1494: "CANADIAN SYLLABICS CWI", 0x1495: "CANADIAN SYLLABICS WEST-CREE CWI", 0x1496: "CANADIAN SYLLABICS CWII", 0x1497: "CANADIAN SYLLABICS WEST-CREE CWII", 0x1498: "CANADIAN SYLLABICS CWO", 0x1499: "CANADIAN SYLLABICS WEST-CREE CWO", 0x149A: "CANADIAN SYLLABICS CWOO", 0x149B: "CANADIAN SYLLABICS WEST-CREE CWOO", 0x149C: "CANADIAN SYLLABICS CWA", 0x149D: "CANADIAN SYLLABICS WEST-CREE CWA", 0x149E: "CANADIAN SYLLABICS CWAA", 0x149F: "CANADIAN SYLLABICS WEST-CREE CWAA", 0x14A0: "CANADIAN SYLLABICS NASKAPI CWAA", 0x14A1: "CANADIAN SYLLABICS C", 0x14A2: "CANADIAN SYLLABICS SAYISI TH", 0x14A3: "CANADIAN SYLLABICS ME", 0x14A4: "CANADIAN SYLLABICS MAAI", 0x14A5: "CANADIAN SYLLABICS MI", 0x14A6: "CANADIAN SYLLABICS MII", 0x14A7: "CANADIAN SYLLABICS MO", 0x14A8: "CANADIAN SYLLABICS MOO", 0x14A9: "CANADIAN SYLLABICS Y-CREE MOO", 0x14AA: "CANADIAN SYLLABICS MA", 0x14AB: "CANADIAN SYLLABICS MAA", 0x14AC: "CANADIAN SYLLABICS MWE", 0x14AD: "CANADIAN SYLLABICS WEST-CREE MWE", 0x14AE: "CANADIAN SYLLABICS MWI", 0x14AF: "CANADIAN SYLLABICS WEST-CREE MWI", 0x14B0: "CANADIAN SYLLABICS MWII", 0x14B1: "CANADIAN SYLLABICS WEST-CREE MWII", 0x14B2: "CANADIAN SYLLABICS MWO", 0x14B3: "CANADIAN SYLLABICS WEST-CREE MWO", 0x14B4: "CANADIAN SYLLABICS MWOO", 0x14B5: "CANADIAN SYLLABICS WEST-CREE MWOO", 0x14B6: "CANADIAN SYLLABICS MWA", 0x14B7: "CANADIAN SYLLABICS WEST-CREE MWA", 0x14B8: "CANADIAN SYLLABICS MWAA", 0x14B9: "CANADIAN SYLLABICS WEST-CREE MWAA", 0x14BA: "CANADIAN SYLLABICS NASKAPI MWAA", 0x14BB: "CANADIAN SYLLABICS M", 0x14BC: "CANADIAN SYLLABICS WEST-CREE M", 0x14BD: "CANADIAN SYLLABICS MH", 0x14BE: "CANADIAN SYLLABICS ATHAPASCAN M", 0x14BF: "CANADIAN SYLLABICS SAYISI M", 0x14C0: "CANADIAN SYLLABICS NE", 0x14C1: "CANADIAN SYLLABICS NAAI", 0x14C2: "CANADIAN SYLLABICS NI", 0x14C3: "CANADIAN SYLLABICS NII", 0x14C4: "CANADIAN SYLLABICS NO", 0x14C5: "CANADIAN SYLLABICS NOO", 0x14C6: "CANADIAN SYLLABICS Y-CREE NOO", 0x14C7: "CANADIAN SYLLABICS NA", 0x14C8: "CANADIAN SYLLABICS NAA", 0x14C9: "CANADIAN SYLLABICS NWE", 0x14CA: "CANADIAN SYLLABICS WEST-CREE NWE", 0x14CB: "CANADIAN SYLLABICS NWA", 0x14CC: "CANADIAN SYLLABICS WEST-CREE NWA", 0x14CD: "CANADIAN SYLLABICS NWAA", 0x14CE: "CANADIAN SYLLABICS WEST-CREE NWAA", 0x14CF: "CANADIAN SYLLABICS NASKAPI NWAA", 0x14D0: "CANADIAN SYLLABICS N", 0x14D1: "CANADIAN SYLLABICS CARRIER NG", 0x14D2: "CANADIAN SYLLABICS NH", 0x14D3: "CANADIAN SYLLABICS LE", 0x14D4: "CANADIAN SYLLABICS LAAI", 0x14D5: "CANADIAN SYLLABICS LI", 0x14D6: "CANADIAN SYLLABICS LII", 0x14D7: "CANADIAN SYLLABICS LO", 0x14D8: "CANADIAN SYLLABICS LOO", 0x14D9: "CANADIAN SYLLABICS Y-CREE LOO", 0x14DA: "CANADIAN SYLLABICS LA", 0x14DB: "CANADIAN SYLLABICS LAA", 0x14DC: "CANADIAN SYLLABICS LWE", 0x14DD: "CANADIAN SYLLABICS WEST-CREE LWE", 0x14DE: "CANADIAN SYLLABICS LWI", 0x14DF: "CANADIAN SYLLABICS WEST-CREE LWI", 0x14E0: "CANADIAN SYLLABICS LWII", 0x14E1: "CANADIAN SYLLABICS WEST-CREE LWII", 0x14E2: "CANADIAN SYLLABICS LWO", 0x14E3: "CANADIAN SYLLABICS WEST-CREE LWO", 0x14E4: "CANADIAN SYLLABICS LWOO", 0x14E5: "CANADIAN SYLLABICS WEST-CREE LWOO", 0x14E6: "CANADIAN SYLLABICS LWA", 0x14E7: "CANADIAN SYLLABICS WEST-CREE LWA", 0x14E8: "CANADIAN SYLLABICS LWAA", 0x14E9: "CANADIAN SYLLABICS WEST-CREE LWAA", 0x14EA: "CANADIAN SYLLABICS L", 0x14EB: "CANADIAN SYLLABICS WEST-CREE L", 0x14EC: "CANADIAN SYLLABICS MEDIAL L", 0x14ED: "CANADIAN SYLLABICS SE", 0x14EE: "CANADIAN SYLLABICS SAAI", 0x14EF: "CANADIAN SYLLABICS SI", 0x14F0: "CANADIAN SYLLABICS SII", 0x14F1: "CANADIAN SYLLABICS SO", 0x14F2: "CANADIAN SYLLABICS SOO", 0x14F3: "CANADIAN SYLLABICS Y-CREE SOO", 0x14F4: "CANADIAN SYLLABICS SA", 0x14F5: "CANADIAN SYLLABICS SAA", 0x14F6: "CANADIAN SYLLABICS SWE", 0x14F7: "CANADIAN SYLLABICS WEST-CREE SWE", 0x14F8: "CANADIAN SYLLABICS SWI", 0x14F9: "CANADIAN SYLLABICS WEST-CREE SWI", 0x14FA: "CANADIAN SYLLABICS SWII", 0x14FB: "CANADIAN SYLLABICS WEST-CREE SWII", 0x14FC: "CANADIAN SYLLABICS SWO", 0x14FD: "CANADIAN SYLLABICS WEST-CREE SWO", 0x14FE: "CANADIAN SYLLABICS SWOO", 0x14FF: "CANADIAN SYLLABICS WEST-CREE SWOO", 0x1500: "CANADIAN SYLLABICS SWA", 0x1501: "CANADIAN SYLLABICS WEST-CREE SWA", 0x1502: "CANADIAN SYLLABICS SWAA", 0x1503: "CANADIAN SYLLABICS WEST-CREE SWAA", 0x1504: "CANADIAN SYLLABICS NASKAPI SWAA", 0x1505: "CANADIAN SYLLABICS S", 0x1506: "CANADIAN SYLLABICS ATHAPASCAN S", 0x1507: "CANADIAN SYLLABICS SW", 0x1508: "CANADIAN SYLLABICS BLACKFOOT S", 0x1509: "CANADIAN SYLLABICS MOOSE-CREE SK", 0x150A: "CANADIAN SYLLABICS NASKAPI SKW", 0x150B: "CANADIAN SYLLABICS NASKAPI S-W", 0x150C: "CANADIAN SYLLABICS NASKAPI SPWA", 0x150D: "CANADIAN SYLLABICS NASKAPI STWA", 0x150E: "CANADIAN SYLLABICS NASKAPI SKWA", 0x150F: "CANADIAN SYLLABICS NASKAPI SCWA", 0x1510: "CANADIAN SYLLABICS SHE", 0x1511: "CANADIAN SYLLABICS SHI", 0x1512: "CANADIAN SYLLABICS SHII", 0x1513: "CANADIAN SYLLABICS SHO", 0x1514: "CANADIAN SYLLABICS SHOO", 0x1515: "CANADIAN SYLLABICS SHA", 0x1516: "CANADIAN SYLLABICS SHAA", 0x1517: "CANADIAN SYLLABICS SHWE", 0x1518: "CANADIAN SYLLABICS WEST-CREE SHWE", 0x1519: "CANADIAN SYLLABICS SHWI", 0x151A: "CANADIAN SYLLABICS WEST-CREE SHWI", 0x151B: "CANADIAN SYLLABICS SHWII", 0x151C: "CANADIAN SYLLABICS WEST-CREE SHWII", 0x151D: "CANADIAN SYLLABICS SHWO", 0x151E: "CANADIAN SYLLABICS WEST-CREE SHWO", 0x151F: "CANADIAN SYLLABICS SHWOO", 0x1520: "CANADIAN SYLLABICS WEST-CREE SHWOO", 0x1521: "CANADIAN SYLLABICS SHWA", 0x1522: "CANADIAN SYLLABICS WEST-CREE SHWA", 0x1523: "CANADIAN SYLLABICS SHWAA", 0x1524: "CANADIAN SYLLABICS WEST-CREE SHWAA", 0x1525: "CANADIAN SYLLABICS SH", 0x1526: "CANADIAN SYLLABICS YE", 0x1527: "CANADIAN SYLLABICS YAAI", 0x1528: "CANADIAN SYLLABICS YI", 0x1529: "CANADIAN SYLLABICS YII", 0x152A: "CANADIAN SYLLABICS YO", 0x152B: "CANADIAN SYLLABICS YOO", 0x152C: "CANADIAN SYLLABICS Y-CREE YOO", 0x152D: "CANADIAN SYLLABICS YA", 0x152E: "CANADIAN SYLLABICS YAA", 0x152F: "CANADIAN SYLLABICS YWE", 0x1530: "CANADIAN SYLLABICS WEST-CREE YWE", 0x1531: "CANADIAN SYLLABICS YWI", 0x1532: "CANADIAN SYLLABICS WEST-CREE YWI", 0x1533: "CANADIAN SYLLABICS YWII", 0x1534: "CANADIAN SYLLABICS WEST-CREE YWII", 0x1535: "CANADIAN SYLLABICS YWO", 0x1536: "CANADIAN SYLLABICS WEST-CREE YWO", 0x1537: "CANADIAN SYLLABICS YWOO", 0x1538: "CANADIAN SYLLABICS WEST-CREE YWOO", 0x1539: "CANADIAN SYLLABICS YWA", 0x153A: "CANADIAN SYLLABICS WEST-CREE YWA", 0x153B: "CANADIAN SYLLABICS YWAA", 0x153C: "CANADIAN SYLLABICS WEST-CREE YWAA", 0x153D: "CANADIAN SYLLABICS NASKAPI YWAA", 0x153E: "CANADIAN SYLLABICS Y", 0x153F: "CANADIAN SYLLABICS BIBLE-CREE Y", 0x1540: "CANADIAN SYLLABICS WEST-CREE Y", 0x1541: "CANADIAN SYLLABICS SAYISI YI", 0x1542: "CANADIAN SYLLABICS RE", 0x1543: "CANADIAN SYLLABICS R-CREE RE", 0x1544: "CANADIAN SYLLABICS WEST-CREE LE", 0x1545: "CANADIAN SYLLABICS RAAI", 0x1546: "CANADIAN SYLLABICS RI", 0x1547: "CANADIAN SYLLABICS RII", 0x1548: "CANADIAN SYLLABICS RO", 0x1549: "CANADIAN SYLLABICS ROO", 0x154A: "CANADIAN SYLLABICS WEST-CREE LO", 0x154B: "CANADIAN SYLLABICS RA", 0x154C: "CANADIAN SYLLABICS RAA", 0x154D: "CANADIAN SYLLABICS WEST-CREE LA", 0x154E: "CANADIAN SYLLABICS RWAA", 0x154F: "CANADIAN SYLLABICS WEST-CREE RWAA", 0x1550: "CANADIAN SYLLABICS R", 0x1551: "CANADIAN SYLLABICS WEST-CREE R", 0x1552: "CANADIAN SYLLABICS MEDIAL R", 0x1553: "CANADIAN SYLLABICS FE", 0x1554: "CANADIAN SYLLABICS FAAI", 0x1555: "CANADIAN SYLLABICS FI", 0x1556: "CANADIAN SYLLABICS FII", 0x1557: "CANADIAN SYLLABICS FO", 0x1558: "CANADIAN SYLLABICS FOO", 0x1559: "CANADIAN SYLLABICS FA", 0x155A: "CANADIAN SYLLABICS FAA", 0x155B: "CANADIAN SYLLABICS FWAA", 0x155C: "CANADIAN SYLLABICS WEST-CREE FWAA", 0x155D: "CANADIAN SYLLABICS F", 0x155E: "CANADIAN SYLLABICS THE", 0x155F: "CANADIAN SYLLABICS N-CREE THE", 0x1560: "CANADIAN SYLLABICS THI", 0x1561: "CANADIAN SYLLABICS N-CREE THI", 0x1562: "CANADIAN SYLLABICS THII", 0x1563: "CANADIAN SYLLABICS N-CREE THII", 0x1564: "CANADIAN SYLLABICS THO", 0x1565: "CANADIAN SYLLABICS THOO", 0x1566: "CANADIAN SYLLABICS THA", 0x1567: "CANADIAN SYLLABICS THAA", 0x1568: "CANADIAN SYLLABICS THWAA", 0x1569: "CANADIAN SYLLABICS WEST-CREE THWAA", 0x156A: "CANADIAN SYLLABICS TH", 0x156B: "CANADIAN SYLLABICS TTHE", 0x156C: "CANADIAN SYLLABICS TTHI", 0x156D: "CANADIAN SYLLABICS TTHO", 0x156E: "CANADIAN SYLLABICS TTHA", 0x156F: "CANADIAN SYLLABICS TTH", 0x1570: "CANADIAN SYLLABICS TYE", 0x1571: "CANADIAN SYLLABICS TYI", 0x1572: "CANADIAN SYLLABICS TYO", 0x1573: "CANADIAN SYLLABICS TYA", 0x1574: "CANADIAN SYLLABICS NUNAVIK HE", 0x1575: "CANADIAN SYLLABICS NUNAVIK HI", 0x1576: "CANADIAN SYLLABICS NUNAVIK HII", 0x1577: "CANADIAN SYLLABICS NUNAVIK HO", 0x1578: "CANADIAN SYLLABICS NUNAVIK HOO", 0x1579: "CANADIAN SYLLABICS NUNAVIK HA", 0x157A: "CANADIAN SYLLABICS NUNAVIK HAA", 0x157B: "CANADIAN SYLLABICS NUNAVIK H", 0x157C: "CANADIAN SYLLABICS NUNAVUT H", 0x157D: "CANADIAN SYLLABICS HK", 0x157E: "CANADIAN SYLLABICS QAAI", 0x157F: "CANADIAN SYLLABICS QI", 0x1580: "CANADIAN SYLLABICS QII", 0x1581: "CANADIAN SYLLABICS QO", 0x1582: "CANADIAN SYLLABICS QOO", 0x1583: "CANADIAN SYLLABICS QA", 0x1584: "CANADIAN SYLLABICS QAA", 0x1585: "CANADIAN SYLLABICS Q", 0x1586: "CANADIAN SYLLABICS TLHE", 0x1587: "CANADIAN SYLLABICS TLHI", 0x1588: "CANADIAN SYLLABICS TLHO", 0x1589: "CANADIAN SYLLABICS TLHA", 0x158A: "CANADIAN SYLLABICS WEST-CREE RE", 0x158B: "CANADIAN SYLLABICS WEST-CREE RI", 0x158C: "CANADIAN SYLLABICS WEST-CREE RO", 0x158D: "CANADIAN SYLLABICS WEST-CREE RA", 0x158E: "CANADIAN SYLLABICS NGAAI", 0x158F: "CANADIAN SYLLABICS NGI", 0x1590: "CANADIAN SYLLABICS NGII", 0x1591: "CANADIAN SYLLABICS NGO", 0x1592: "CANADIAN SYLLABICS NGOO", 0x1593: "CANADIAN SYLLABICS NGA", 0x1594: "CANADIAN SYLLABICS NGAA", 0x1595: "CANADIAN SYLLABICS NG", 0x1596: "CANADIAN SYLLABICS NNG", 0x1597: "CANADIAN SYLLABICS SAYISI SHE", 0x1598: "CANADIAN SYLLABICS SAYISI SHI", 0x1599: "CANADIAN SYLLABICS SAYISI SHO", 0x159A: "CANADIAN SYLLABICS SAYISI SHA", 0x159B: "CANADIAN SYLLABICS WOODS-CREE THE", 0x159C: "CANADIAN SYLLABICS WOODS-CREE THI", 0x159D: "CANADIAN SYLLABICS WOODS-CREE THO", 0x159E: "CANADIAN SYLLABICS WOODS-CREE THA", 0x159F: "CANADIAN SYLLABICS WOODS-CREE TH", 0x15A0: "CANADIAN SYLLABICS LHI", 0x15A1: "CANADIAN SYLLABICS LHII", 0x15A2: "CANADIAN SYLLABICS LHO", 0x15A3: "CANADIAN SYLLABICS LHOO", 0x15A4: "CANADIAN SYLLABICS LHA", 0x15A5: "CANADIAN SYLLABICS LHAA", 0x15A6: "CANADIAN SYLLABICS LH", 0x15A7: "CANADIAN SYLLABICS TH-CREE THE", 0x15A8: "CANADIAN SYLLABICS TH-CREE THI", 0x15A9: "CANADIAN SYLLABICS TH-CREE THII", 0x15AA: "CANADIAN SYLLABICS TH-CREE THO", 0x15AB: "CANADIAN SYLLABICS TH-CREE THOO", 0x15AC: "CANADIAN SYLLABICS TH-CREE THA", 0x15AD: "CANADIAN SYLLABICS TH-CREE THAA", 0x15AE: "CANADIAN SYLLABICS TH-CREE TH", 0x15AF: "CANADIAN SYLLABICS AIVILIK B", 0x15B0: "CANADIAN SYLLABICS BLACKFOOT E", 0x15B1: "CANADIAN SYLLABICS BLACKFOOT I", 0x15B2: "CANADIAN SYLLABICS BLACKFOOT O", 0x15B3: "CANADIAN SYLLABICS BLACKFOOT A", 0x15B4: "CANADIAN SYLLABICS BLACKFOOT WE", 0x15B5: "CANADIAN SYLLABICS BLACKFOOT WI", 0x15B6: "CANADIAN SYLLABICS BLACKFOOT WO", 0x15B7: "CANADIAN SYLLABICS BLACKFOOT WA", 0x15B8: "CANADIAN SYLLABICS BLACKFOOT NE", 0x15B9: "CANADIAN SYLLABICS BLACKFOOT NI", 0x15BA: "CANADIAN SYLLABICS BLACKFOOT NO", 0x15BB: "CANADIAN SYLLABICS BLACKFOOT NA", 0x15BC: "CANADIAN SYLLABICS BLACKFOOT KE", 0x15BD: "CANADIAN SYLLABICS BLACKFOOT KI", 0x15BE: "CANADIAN SYLLABICS BLACKFOOT KO", 0x15BF: "CANADIAN SYLLABICS BLACKFOOT KA", 0x15C0: "CANADIAN SYLLABICS SAYISI HE", 0x15C1: "CANADIAN SYLLABICS SAYISI HI", 0x15C2: "CANADIAN SYLLABICS SAYISI HO", 0x15C3: "CANADIAN SYLLABICS SAYISI HA", 0x15C4: "CANADIAN SYLLABICS CARRIER GHU", 0x15C5: "CANADIAN SYLLABICS CARRIER GHO", 0x15C6: "CANADIAN SYLLABICS CARRIER GHE", 0x15C7: "CANADIAN SYLLABICS CARRIER GHEE", 0x15C8: "CANADIAN SYLLABICS CARRIER GHI", 0x15C9: "CANADIAN SYLLABICS CARRIER GHA", 0x15CA: "CANADIAN SYLLABICS CARRIER RU", 0x15CB: "CANADIAN SYLLABICS CARRIER RO", 0x15CC: "CANADIAN SYLLABICS CARRIER RE", 0x15CD: "CANADIAN SYLLABICS CARRIER REE", 0x15CE: "CANADIAN SYLLABICS CARRIER RI", 0x15CF: "CANADIAN SYLLABICS CARRIER RA", 0x15D0: "CANADIAN SYLLABICS CARRIER WU", 0x15D1: "CANADIAN SYLLABICS CARRIER WO", 0x15D2: "CANADIAN SYLLABICS CARRIER WE", 0x15D3: "CANADIAN SYLLABICS CARRIER WEE", 0x15D4: "CANADIAN SYLLABICS CARRIER WI", 0x15D5: "CANADIAN SYLLABICS CARRIER WA", 0x15D6: "CANADIAN SYLLABICS CARRIER HWU", 0x15D7: "CANADIAN SYLLABICS CARRIER HWO", 0x15D8: "CANADIAN SYLLABICS CARRIER HWE", 0x15D9: "CANADIAN SYLLABICS CARRIER HWEE", 0x15DA: "CANADIAN SYLLABICS CARRIER HWI", 0x15DB: "CANADIAN SYLLABICS CARRIER HWA", 0x15DC: "CANADIAN SYLLABICS CARRIER THU", 0x15DD: "CANADIAN SYLLABICS CARRIER THO", 0x15DE: "CANADIAN SYLLABICS CARRIER THE", 0x15DF: "CANADIAN SYLLABICS CARRIER THEE", 0x15E0: "CANADIAN SYLLABICS CARRIER THI", 0x15E1: "CANADIAN SYLLABICS CARRIER THA", 0x15E2: "CANADIAN SYLLABICS CARRIER TTU", 0x15E3: "CANADIAN SYLLABICS CARRIER TTO", 0x15E4: "CANADIAN SYLLABICS CARRIER TTE", 0x15E5: "CANADIAN SYLLABICS CARRIER TTEE", 0x15E6: "CANADIAN SYLLABICS CARRIER TTI", 0x15E7: "CANADIAN SYLLABICS CARRIER TTA", 0x15E8: "CANADIAN SYLLABICS CARRIER PU", 0x15E9: "CANADIAN SYLLABICS CARRIER PO", 0x15EA: "CANADIAN SYLLABICS CARRIER PE", 0x15EB: "CANADIAN SYLLABICS CARRIER PEE", 0x15EC: "CANADIAN SYLLABICS CARRIER PI", 0x15ED: "CANADIAN SYLLABICS CARRIER PA", 0x15EE: "CANADIAN SYLLABICS CARRIER P", 0x15EF: "CANADIAN SYLLABICS CARRIER GU", 0x15F0: "CANADIAN SYLLABICS CARRIER GO", 0x15F1: "CANADIAN SYLLABICS CARRIER GE", 0x15F2: "CANADIAN SYLLABICS CARRIER GEE", 0x15F3: "CANADIAN SYLLABICS CARRIER GI", 0x15F4: "CANADIAN SYLLABICS CARRIER GA", 0x15F5: "CANADIAN SYLLABICS CARRIER KHU", 0x15F6: "CANADIAN SYLLABICS CARRIER KHO", 0x15F7: "CANADIAN SYLLABICS CARRIER KHE", 0x15F8: "CANADIAN SYLLABICS CARRIER KHEE", 0x15F9: "CANADIAN SYLLABICS CARRIER KHI", 0x15FA: "CANADIAN SYLLABICS CARRIER KHA", 0x15FB: "CANADIAN SYLLABICS CARRIER KKU", 0x15FC: "CANADIAN SYLLABICS CARRIER KKO", 0x15FD: "CANADIAN SYLLABICS CARRIER KKE", 0x15FE: "CANADIAN SYLLABICS CARRIER KKEE", 0x15FF: "CANADIAN SYLLABICS CARRIER KKI", 0x1600: "CANADIAN SYLLABICS CARRIER KKA", 0x1601: "CANADIAN SYLLABICS CARRIER KK", 0x1602: "CANADIAN SYLLABICS CARRIER NU", 0x1603: "CANADIAN SYLLABICS CARRIER NO", 0x1604: "CANADIAN SYLLABICS CARRIER NE", 0x1605: "CANADIAN SYLLABICS CARRIER NEE", 0x1606: "CANADIAN SYLLABICS CARRIER NI", 0x1607: "CANADIAN SYLLABICS CARRIER NA", 0x1608: "CANADIAN SYLLABICS CARRIER MU", 0x1609: "CANADIAN SYLLABICS CARRIER MO", 0x160A: "CANADIAN SYLLABICS CARRIER ME", 0x160B: "CANADIAN SYLLABICS CARRIER MEE", 0x160C: "CANADIAN SYLLABICS CARRIER MI", 0x160D: "CANADIAN SYLLABICS CARRIER MA", 0x160E: "CANADIAN SYLLABICS CARRIER YU", 0x160F: "CANADIAN SYLLABICS CARRIER YO", 0x1610: "CANADIAN SYLLABICS CARRIER YE", 0x1611: "CANADIAN SYLLABICS CARRIER YEE", 0x1612: "CANADIAN SYLLABICS CARRIER YI", 0x1613: "CANADIAN SYLLABICS CARRIER YA", 0x1614: "CANADIAN SYLLABICS CARRIER JU", 0x1615: "CANADIAN SYLLABICS SAYISI JU", 0x1616: "CANADIAN SYLLABICS CARRIER JO", 0x1617: "CANADIAN SYLLABICS CARRIER JE", 0x1618: "CANADIAN SYLLABICS CARRIER JEE", 0x1619: "CANADIAN SYLLABICS CARRIER JI", 0x161A: "CANADIAN SYLLABICS SAYISI JI", 0x161B: "CANADIAN SYLLABICS CARRIER JA", 0x161C: "CANADIAN SYLLABICS CARRIER JJU", 0x161D: "CANADIAN SYLLABICS CARRIER JJO", 0x161E: "CANADIAN SYLLABICS CARRIER JJE", 0x161F: "CANADIAN SYLLABICS CARRIER JJEE", 0x1620: "CANADIAN SYLLABICS CARRIER JJI", 0x1621: "CANADIAN SYLLABICS CARRIER JJA", 0x1622: "CANADIAN SYLLABICS CARRIER LU", 0x1623: "CANADIAN SYLLABICS CARRIER LO", 0x1624: "CANADIAN SYLLABICS CARRIER LE", 0x1625: "CANADIAN SYLLABICS CARRIER LEE", 0x1626: "CANADIAN SYLLABICS CARRIER LI", 0x1627: "CANADIAN SYLLABICS CARRIER LA", 0x1628: "CANADIAN SYLLABICS CARRIER DLU", 0x1629: "CANADIAN SYLLABICS CARRIER DLO", 0x162A: "CANADIAN SYLLABICS CARRIER DLE", 0x162B: "CANADIAN SYLLABICS CARRIER DLEE", 0x162C: "CANADIAN SYLLABICS CARRIER DLI", 0x162D: "CANADIAN SYLLABICS CARRIER DLA", 0x162E: "CANADIAN SYLLABICS CARRIER LHU", 0x162F: "CANADIAN SYLLABICS CARRIER LHO", 0x1630: "CANADIAN SYLLABICS CARRIER LHE", 0x1631: "CANADIAN SYLLABICS CARRIER LHEE", 0x1632: "CANADIAN SYLLABICS CARRIER LHI", 0x1633: "CANADIAN SYLLABICS CARRIER LHA", 0x1634: "CANADIAN SYLLABICS CARRIER TLHU", 0x1635: "CANADIAN SYLLABICS CARRIER TLHO", 0x1636: "CANADIAN SYLLABICS CARRIER TLHE", 0x1637: "CANADIAN SYLLABICS CARRIER TLHEE", 0x1638: "CANADIAN SYLLABICS CARRIER TLHI", 0x1639: "CANADIAN SYLLABICS CARRIER TLHA", 0x163A: "CANADIAN SYLLABICS CARRIER TLU", 0x163B: "CANADIAN SYLLABICS CARRIER TLO", 0x163C: "CANADIAN SYLLABICS CARRIER TLE", 0x163D: "CANADIAN SYLLABICS CARRIER TLEE", 0x163E: "CANADIAN SYLLABICS CARRIER TLI", 0x163F: "CANADIAN SYLLABICS CARRIER TLA", 0x1640: "CANADIAN SYLLABICS CARRIER ZU", 0x1641: "CANADIAN SYLLABICS CARRIER ZO", 0x1642: "CANADIAN SYLLABICS CARRIER ZE", 0x1643: "CANADIAN SYLLABICS CARRIER ZEE", 0x1644: "CANADIAN SYLLABICS CARRIER ZI", 0x1645: "CANADIAN SYLLABICS CARRIER ZA", 0x1646: "CANADIAN SYLLABICS CARRIER Z", 0x1647: "CANADIAN SYLLABICS CARRIER INITIAL Z", 0x1648: "CANADIAN SYLLABICS CARRIER DZU", 0x1649: "CANADIAN SYLLABICS CARRIER DZO", 0x164A: "CANADIAN SYLLABICS CARRIER DZE", 0x164B: "CANADIAN SYLLABICS CARRIER DZEE", 0x164C: "CANADIAN SYLLABICS CARRIER DZI", 0x164D: "CANADIAN SYLLABICS CARRIER DZA", 0x164E: "CANADIAN SYLLABICS CARRIER SU", 0x164F: "CANADIAN SYLLABICS CARRIER SO", 0x1650: "CANADIAN SYLLABICS CARRIER SE", 0x1651: "CANADIAN SYLLABICS CARRIER SEE", 0x1652: "CANADIAN SYLLABICS CARRIER SI", 0x1653: "CANADIAN SYLLABICS CARRIER SA", 0x1654: "CANADIAN SYLLABICS CARRIER SHU", 0x1655: "CANADIAN SYLLABICS CARRIER SHO", 0x1656: "CANADIAN SYLLABICS CARRIER SHE", 0x1657: "CANADIAN SYLLABICS CARRIER SHEE", 0x1658: "CANADIAN SYLLABICS CARRIER SHI", 0x1659: "CANADIAN SYLLABICS CARRIER SHA", 0x165A: "CANADIAN SYLLABICS CARRIER SH", 0x165B: "CANADIAN SYLLABICS CARRIER TSU", 0x165C: "CANADIAN SYLLABICS CARRIER TSO", 0x165D: "CANADIAN SYLLABICS CARRIER TSE", 0x165E: "CANADIAN SYLLABICS CARRIER TSEE", 0x165F: "CANADIAN SYLLABICS CARRIER TSI", 0x1660: "CANADIAN SYLLABICS CARRIER TSA", 0x1661: "CANADIAN SYLLABICS CARRIER CHU", 0x1662: "CANADIAN SYLLABICS CARRIER CHO", 0x1663: "CANADIAN SYLLABICS CARRIER CHE", 0x1664: "CANADIAN SYLLABICS CARRIER CHEE", 0x1665: "CANADIAN SYLLABICS CARRIER CHI", 0x1666: "CANADIAN SYLLABICS CARRIER CHA", 0x1667: "CANADIAN SYLLABICS CARRIER TTSU", 0x1668: "CANADIAN SYLLABICS CARRIER TTSO", 0x1669: "CANADIAN SYLLABICS CARRIER TTSE", 0x166A: "CANADIAN SYLLABICS CARRIER TTSEE", 0x166B: "CANADIAN SYLLABICS CARRIER TTSI", 0x166C: "CANADIAN SYLLABICS CARRIER TTSA", 0x166D: "CANADIAN SYLLABICS CHI SIGN", 0x166E: "CANADIAN SYLLABICS FULL STOP", 0x166F: "CANADIAN SYLLABICS QAI", 0x1670: "CANADIAN SYLLABICS NGAI", 0x1671: "CANADIAN SYLLABICS NNGI", 0x1672: "CANADIAN SYLLABICS NNGII", 0x1673: "CANADIAN SYLLABICS NNGO", 0x1674: "CANADIAN SYLLABICS NNGOO", 0x1675: "CANADIAN SYLLABICS NNGA", 0x1676: "CANADIAN SYLLABICS NNGAA", 0x1680: "OGHAM SPACE MARK", 0x1681: "OGHAM LETTER BEITH", 0x1682: "OGHAM LETTER LUIS", 0x1683: "OGHAM LETTER FEARN", 0x1684: "OGHAM LETTER SAIL", 0x1685: "OGHAM LETTER NION", 0x1686: "OGHAM LETTER UATH", 0x1687: "OGHAM LETTER DAIR", 0x1688: "OGHAM LETTER TINNE", 0x1689: "OGHAM LETTER COLL", 0x168A: "OGHAM LETTER CEIRT", 0x168B: "OGHAM LETTER MUIN", 0x168C: "OGHAM LETTER GORT", 0x168D: "OGHAM LETTER NGEADAL", 0x168E: "OGHAM LETTER STRAIF", 0x168F: "OGHAM LETTER RUIS", 0x1690: "OGHAM LETTER AILM", 0x1691: "OGHAM LETTER ONN", 0x1692: "OGHAM LETTER UR", 0x1693: "OGHAM LETTER EADHADH", 0x1694: "OGHAM LETTER IODHADH", 0x1695: "OGHAM LETTER EABHADH", 0x1696: "OGHAM LETTER OR", 0x1697: "OGHAM LETTER UILLEANN", 0x1698: "OGHAM LETTER IFIN", 0x1699: "OGHAM LETTER EAMHANCHOLL", 0x169A: "OGHAM LETTER PEITH", 0x169B: "OGHAM FEATHER MARK", 0x169C: "OGHAM REVERSED FEATHER MARK", 0x16A0: "RUNIC LETTER FEHU FEOH FE F", 0x16A1: "RUNIC LETTER V", 0x16A2: "RUNIC LETTER URUZ UR U", 0x16A3: "RUNIC LETTER YR", 0x16A4: "RUNIC LETTER Y", 0x16A5: "RUNIC LETTER W", 0x16A6: "RUNIC LETTER THURISAZ THURS THORN", 0x16A7: "RUNIC LETTER ETH", 0x16A8: "RUNIC LETTER ANSUZ A", 0x16A9: "RUNIC LETTER OS O", 0x16AA: "RUNIC LETTER AC A", 0x16AB: "RUNIC LETTER AESC", 0x16AC: "RUNIC LETTER LONG-BRANCH-OSS O", 0x16AD: "RUNIC LETTER SHORT-TWIG-OSS O", 0x16AE: "RUNIC LETTER O", 0x16AF: "RUNIC LETTER OE", 0x16B0: "RUNIC LETTER ON", 0x16B1: "RUNIC LETTER RAIDO RAD REID R", 0x16B2: "RUNIC LETTER KAUNA", 0x16B3: "RUNIC LETTER CEN", 0x16B4: "RUNIC LETTER KAUN K", 0x16B5: "RUNIC LETTER G", 0x16B6: "RUNIC LETTER ENG", 0x16B7: "RUNIC LETTER GEBO GYFU G", 0x16B8: "RUNIC LETTER GAR", 0x16B9: "RUNIC LETTER WUNJO WYNN W", 0x16BA: "RUNIC LETTER HAGLAZ H", 0x16BB: "RUNIC LETTER HAEGL H", 0x16BC: "RUNIC LETTER LONG-BRANCH-HAGALL H", 0x16BD: "RUNIC LETTER SHORT-TWIG-HAGALL H", 0x16BE: "RUNIC LETTER NAUDIZ NYD NAUD N", 0x16BF: "RUNIC LETTER SHORT-TWIG-NAUD N", 0x16C0: "RUNIC LETTER DOTTED-N", 0x16C1: "RUNIC LETTER ISAZ IS ISS I", 0x16C2: "RUNIC LETTER E", 0x16C3: "RUNIC LETTER JERAN J", 0x16C4: "RUNIC LETTER GER", 0x16C5: "RUNIC LETTER LONG-BRANCH-AR AE", 0x16C6: "RUNIC LETTER SHORT-TWIG-AR A", 0x16C7: "RUNIC LETTER IWAZ EOH", 0x16C8: "RUNIC LETTER PERTHO PEORTH P", 0x16C9: "RUNIC LETTER ALGIZ EOLHX", 0x16CA: "RUNIC LETTER SOWILO S", 0x16CB: "RUNIC LETTER SIGEL LONG-BRANCH-SOL S", 0x16CC: "RUNIC LETTER SHORT-TWIG-SOL S", 0x16CD: "RUNIC LETTER C", 0x16CE: "RUNIC LETTER Z", 0x16CF: "RUNIC LETTER TIWAZ TIR TYR T", 0x16D0: "RUNIC LETTER SHORT-TWIG-TYR T", 0x16D1: "RUNIC LETTER D", 0x16D2: "RUNIC LETTER BERKANAN BEORC BJARKAN B", 0x16D3: "RUNIC LETTER SHORT-TWIG-BJARKAN B", 0x16D4: "RUNIC LETTER DOTTED-P", 0x16D5: "RUNIC LETTER OPEN-P", 0x16D6: "RUNIC LETTER EHWAZ EH E", 0x16D7: "RUNIC LETTER MANNAZ MAN M", 0x16D8: "RUNIC LETTER LONG-BRANCH-MADR M", 0x16D9: "RUNIC LETTER SHORT-TWIG-MADR M", 0x16DA: "RUNIC LETTER LAUKAZ LAGU LOGR L", 0x16DB: "RUNIC LETTER DOTTED-L", 0x16DC: "RUNIC LETTER INGWAZ", 0x16DD: "RUNIC LETTER ING", 0x16DE: "RUNIC LETTER DAGAZ DAEG D", 0x16DF: "RUNIC LETTER OTHALAN ETHEL O", 0x16E0: "RUNIC LETTER EAR", 0x16E1: "RUNIC LETTER IOR", 0x16E2: "RUNIC LETTER CWEORTH", 0x16E3: "RUNIC LETTER CALC", 0x16E4: "RUNIC LETTER CEALC", 0x16E5: "RUNIC LETTER STAN", 0x16E6: "RUNIC LETTER LONG-BRANCH-YR", 0x16E7: "RUNIC LETTER SHORT-TWIG-YR", 0x16E8: "RUNIC LETTER ICELANDIC-YR", 0x16E9: "RUNIC LETTER Q", 0x16EA: "RUNIC LETTER X", 0x16EB: "RUNIC SINGLE PUNCTUATION", 0x16EC: "RUNIC MULTIPLE PUNCTUATION", 0x16ED: "RUNIC CROSS PUNCTUATION", 0x16EE: "RUNIC ARLAUG SYMBOL (golden number 17)", 0x16EF: "RUNIC TVIMADUR SYMBOL (golden number 18)", 0x16F0: "RUNIC BELGTHOR SYMBOL (golden number 19)", 0x1700: "TAGALOG LETTER A", 0x1701: "TAGALOG LETTER I", 0x1702: "TAGALOG LETTER U", 0x1703: "TAGALOG LETTER KA", 0x1704: "TAGALOG LETTER GA", 0x1705: "TAGALOG LETTER NGA", 0x1706: "TAGALOG LETTER TA", 0x1707: "TAGALOG LETTER DA", 0x1708: "TAGALOG LETTER NA", 0x1709: "TAGALOG LETTER PA", 0x170A: "TAGALOG LETTER BA", 0x170B: "TAGALOG LETTER MA", 0x170C: "TAGALOG LETTER YA", 0x170E: "TAGALOG LETTER LA", 0x170F: "TAGALOG LETTER WA", 0x1710: "TAGALOG LETTER SA", 0x1711: "TAGALOG LETTER HA", 0x1712: "TAGALOG VOWEL SIGN I", 0x1713: "TAGALOG VOWEL SIGN U", 0x1714: "TAGALOG SIGN VIRAMA", 0x1720: "HANUNOO LETTER A", 0x1721: "HANUNOO LETTER I", 0x1722: "HANUNOO LETTER U", 0x1723: "HANUNOO LETTER KA", 0x1724: "HANUNOO LETTER GA", 0x1725: "HANUNOO LETTER NGA", 0x1726: "HANUNOO LETTER TA", 0x1727: "HANUNOO LETTER DA", 0x1728: "HANUNOO LETTER NA", 0x1729: "HANUNOO LETTER PA", 0x172A: "HANUNOO LETTER BA", 0x172B: "HANUNOO LETTER MA", 0x172C: "HANUNOO LETTER YA", 0x172D: "HANUNOO LETTER RA", 0x172E: "HANUNOO LETTER LA", 0x172F: "HANUNOO LETTER WA", 0x1730: "HANUNOO LETTER SA", 0x1731: "HANUNOO LETTER HA", 0x1732: "HANUNOO VOWEL SIGN I", 0x1733: "HANUNOO VOWEL SIGN U", 0x1734: "HANUNOO SIGN PAMUDPOD", 0x1735: "PHILIPPINE SINGLE PUNCTUATION", 0x1736: "PHILIPPINE DOUBLE PUNCTUATION", 0x1740: "BUHID LETTER A", 0x1741: "BUHID LETTER I", 0x1742: "BUHID LETTER U", 0x1743: "BUHID LETTER KA", 0x1744: "BUHID LETTER GA", 0x1745: "BUHID LETTER NGA", 0x1746: "BUHID LETTER TA", 0x1747: "BUHID LETTER DA", 0x1748: "BUHID LETTER NA", 0x1749: "BUHID LETTER PA", 0x174A: "BUHID LETTER BA", 0x174B: "BUHID LETTER MA", 0x174C: "BUHID LETTER YA", 0x174D: "BUHID LETTER RA", 0x174E: "BUHID LETTER LA", 0x174F: "BUHID LETTER WA", 0x1750: "BUHID LETTER SA", 0x1751: "BUHID LETTER HA", 0x1752: "BUHID VOWEL SIGN I", 0x1753: "BUHID VOWEL SIGN U", 0x1760: "TAGBANWA LETTER A", 0x1761: "TAGBANWA LETTER I", 0x1762: "TAGBANWA LETTER U", 0x1763: "TAGBANWA LETTER KA", 0x1764: "TAGBANWA LETTER GA", 0x1765: "TAGBANWA LETTER NGA", 0x1766: "TAGBANWA LETTER TA", 0x1767: "TAGBANWA LETTER DA", 0x1768: "TAGBANWA LETTER NA", 0x1769: "TAGBANWA LETTER PA", 0x176A: "TAGBANWA LETTER BA", 0x176B: "TAGBANWA LETTER MA", 0x176C: "TAGBANWA LETTER YA", 0x176E: "TAGBANWA LETTER LA", 0x176F: "TAGBANWA LETTER WA", 0x1770: "TAGBANWA LETTER SA", 0x1772: "TAGBANWA VOWEL SIGN I", 0x1773: "TAGBANWA VOWEL SIGN U", 0x1780: "KHMER LETTER KA", 0x1781: "KHMER LETTER KHA", 0x1782: "KHMER LETTER KO", 0x1783: "KHMER LETTER KHO", 0x1784: "KHMER LETTER NGO", 0x1785: "KHMER LETTER CA", 0x1786: "KHMER LETTER CHA", 0x1787: "KHMER LETTER CO", 0x1788: "KHMER LETTER CHO", 0x1789: "KHMER LETTER NYO", 0x178A: "KHMER LETTER DA", 0x178B: "KHMER LETTER TTHA", 0x178C: "KHMER LETTER DO", 0x178D: "KHMER LETTER TTHO", 0x178E: "KHMER LETTER NNO", 0x178F: "KHMER LETTER TA", 0x1790: "KHMER LETTER THA", 0x1791: "KHMER LETTER TO", 0x1792: "KHMER LETTER THO", 0x1793: "KHMER LETTER NO", 0x1794: "KHMER LETTER BA", 0x1795: "KHMER LETTER PHA", 0x1796: "KHMER LETTER PO", 0x1797: "KHMER LETTER PHO", 0x1798: "KHMER LETTER MO", 0x1799: "KHMER LETTER YO", 0x179A: "KHMER LETTER RO", 0x179B: "KHMER LETTER LO", 0x179C: "KHMER LETTER VO", 0x179D: "KHMER LETTER SHA", 0x179E: "KHMER LETTER SSO", 0x179F: "KHMER LETTER SA", 0x17A0: "KHMER LETTER HA", 0x17A1: "KHMER LETTER LA", 0x17A2: "KHMER LETTER QA", 0x17A3: "KHMER INDEPENDENT VOWEL QAQ *", 0x17A4: "KHMER INDEPENDENT VOWEL QAA *", 0x17A5: "KHMER INDEPENDENT VOWEL QI", 0x17A6: "KHMER INDEPENDENT VOWEL QII", 0x17A7: "KHMER INDEPENDENT VOWEL QU", 0x17A8: "KHMER INDEPENDENT VOWEL QUK", 0x17A9: "KHMER INDEPENDENT VOWEL QUU", 0x17AA: "KHMER INDEPENDENT VOWEL QUUV", 0x17AB: "KHMER INDEPENDENT VOWEL RY", 0x17AC: "KHMER INDEPENDENT VOWEL RYY", 0x17AD: "KHMER INDEPENDENT VOWEL LY", 0x17AE: "KHMER INDEPENDENT VOWEL LYY", 0x17AF: "KHMER INDEPENDENT VOWEL QE", 0x17B0: "KHMER INDEPENDENT VOWEL QAI", 0x17B1: "KHMER INDEPENDENT VOWEL QOO TYPE ONE", 0x17B2: "KHMER INDEPENDENT VOWEL QOO TYPE TWO", 0x17B3: "KHMER INDEPENDENT VOWEL QAU", 0x17B4: "KHMER VOWEL INHERENT AQ *", 0x17B5: "KHMER VOWEL INHERENT AA *", 0x17B6: "KHMER VOWEL SIGN AA", 0x17B7: "KHMER VOWEL SIGN I", 0x17B8: "KHMER VOWEL SIGN II", 0x17B9: "KHMER VOWEL SIGN Y", 0x17BA: "KHMER VOWEL SIGN YY", 0x17BB: "KHMER VOWEL SIGN U", 0x17BC: "KHMER VOWEL SIGN UU", 0x17BD: "KHMER VOWEL SIGN UA", 0x17BE: "KHMER VOWEL SIGN OE", 0x17BF: "KHMER VOWEL SIGN YA", 0x17C0: "KHMER VOWEL SIGN IE", 0x17C1: "KHMER VOWEL SIGN E", 0x17C2: "KHMER VOWEL SIGN AE", 0x17C3: "KHMER VOWEL SIGN AI", 0x17C4: "KHMER VOWEL SIGN OO", 0x17C5: "KHMER VOWEL SIGN AU", 0x17C6: "KHMER SIGN NIKAHIT", 0x17C7: "KHMER SIGN REAHMUK", 0x17C8: "KHMER SIGN YUUKALEAPINTU", 0x17C9: "KHMER SIGN MUUSIKATOAN", 0x17CA: "KHMER SIGN TRIISAP", 0x17CB: "KHMER SIGN BANTOC", 0x17CC: "KHMER SIGN ROBAT", 0x17CD: "KHMER SIGN TOANDAKHIAT", 0x17CE: "KHMER SIGN KAKABAT", 0x17CF: "KHMER SIGN AHSDA", 0x17D0: "KHMER SIGN SAMYOK SANNYA", 0x17D1: "KHMER SIGN VIRIAM", 0x17D2: "KHMER SIGN COENG", 0x17D3: "KHMER SIGN BATHAMASAT *", 0x17D4: "KHMER SIGN KHAN", 0x17D5: "KHMER SIGN BARIYOOSAN", 0x17D6: "KHMER SIGN CAMNUC PII KUUH", 0x17D7: "KHMER SIGN LEK TOO", 0x17D8: "KHMER SIGN BEYYAL *", 0x17D9: "KHMER SIGN PHNAEK MUAN", 0x17DA: "KHMER SIGN KOOMUUT", 0x17DB: "KHMER CURRENCY SYMBOL RIEL", 0x17DC: "KHMER SIGN AVAKRAHASANYA", 0x17DD: "KHMER SIGN ATTHACAN", 0x17E0: "KHMER DIGIT ZERO", 0x17E1: "KHMER DIGIT ONE", 0x17E2: "KHMER DIGIT TWO", 0x17E3: "KHMER DIGIT THREE", 0x17E4: "KHMER DIGIT FOUR", 0x17E5: "KHMER DIGIT FIVE", 0x17E6: "KHMER DIGIT SIX", 0x17E7: "KHMER DIGIT SEVEN", 0x17E8: "KHMER DIGIT EIGHT", 0x17E9: "KHMER DIGIT NINE", 0x17F0: "KHMER SYMBOL LEK ATTAK SON", 0x17F1: "KHMER SYMBOL LEK ATTAK MUOY", 0x17F2: "KHMER SYMBOL LEK ATTAK PII", 0x17F3: "KHMER SYMBOL LEK ATTAK BEI", 0x17F4: "KHMER SYMBOL LEK ATTAK BUON", 0x17F5: "KHMER SYMBOL LEK ATTAK PRAM", 0x17F6: "KHMER SYMBOL LEK ATTAK PRAM-MUOY", 0x17F7: "KHMER SYMBOL LEK ATTAK PRAM-PII", 0x17F8: "KHMER SYMBOL LEK ATTAK PRAM-BEI", 0x17F9: "KHMER SYMBOL LEK ATTAK PRAM-BUON", 0x1800: "MONGOLIAN BIRGA", 0x1801: "MONGOLIAN ELLIPSIS", 0x1802: "MONGOLIAN COMMA", 0x1803: "MONGOLIAN FULL STOP", 0x1804: "MONGOLIAN COLON", 0x1805: "MONGOLIAN FOUR DOTS", 0x1806: "MONGOLIAN TODO SOFT HYPHEN", 0x1807: "MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER", 0x1808: "MONGOLIAN MANCHU COMMA", 0x1809: "MONGOLIAN MANCHU FULL STOP", 0x180A: "MONGOLIAN NIRUGU", 0x180B: "MONGOLIAN FREE VARIATION SELECTOR ONE", 0x180C: "MONGOLIAN FREE VARIATION SELECTOR TWO", 0x180D: "MONGOLIAN FREE VARIATION SELECTOR THREE", 0x180E: "MONGOLIAN VOWEL SEPARATOR", 0x1810: "MONGOLIAN DIGIT ZERO", 0x1811: "MONGOLIAN DIGIT ONE", 0x1812: "MONGOLIAN DIGIT TWO", 0x1813: "MONGOLIAN DIGIT THREE", 0x1814: "MONGOLIAN DIGIT FOUR", 0x1815: "MONGOLIAN DIGIT FIVE", 0x1816: "MONGOLIAN DIGIT SIX", 0x1817: "MONGOLIAN DIGIT SEVEN", 0x1818: "MONGOLIAN DIGIT EIGHT", 0x1819: "MONGOLIAN DIGIT NINE", 0x1820: "MONGOLIAN LETTER A", 0x1821: "MONGOLIAN LETTER E", 0x1822: "MONGOLIAN LETTER I", 0x1823: "MONGOLIAN LETTER O", 0x1824: "MONGOLIAN LETTER U", 0x1825: "MONGOLIAN LETTER OE", 0x1826: "MONGOLIAN LETTER UE", 0x1827: "MONGOLIAN LETTER EE", 0x1828: "MONGOLIAN LETTER NA", 0x1829: "MONGOLIAN LETTER ANG", 0x182A: "MONGOLIAN LETTER BA", 0x182B: "MONGOLIAN LETTER PA", 0x182C: "MONGOLIAN LETTER QA", 0x182D: "MONGOLIAN LETTER GA", 0x182E: "MONGOLIAN LETTER MA", 0x182F: "MONGOLIAN LETTER LA", 0x1830: "MONGOLIAN LETTER SA", 0x1831: "MONGOLIAN LETTER SHA", 0x1832: "MONGOLIAN LETTER TA", 0x1833: "MONGOLIAN LETTER DA", 0x1834: "MONGOLIAN LETTER CHA", 0x1835: "MONGOLIAN LETTER JA", 0x1836: "MONGOLIAN LETTER YA", 0x1837: "MONGOLIAN LETTER RA", 0x1838: "MONGOLIAN LETTER WA", 0x1839: "MONGOLIAN LETTER FA", 0x183A: "MONGOLIAN LETTER KA", 0x183B: "MONGOLIAN LETTER KHA", 0x183C: "MONGOLIAN LETTER TSA", 0x183D: "MONGOLIAN LETTER ZA", 0x183E: "MONGOLIAN LETTER HAA", 0x183F: "MONGOLIAN LETTER ZRA", 0x1840: "MONGOLIAN LETTER LHA", 0x1841: "MONGOLIAN LETTER ZHI", 0x1842: "MONGOLIAN LETTER CHI", 0x1843: "MONGOLIAN LETTER TODO LONG VOWEL SIGN", 0x1844: "MONGOLIAN LETTER TODO E", 0x1845: "MONGOLIAN LETTER TODO I", 0x1846: "MONGOLIAN LETTER TODO O", 0x1847: "MONGOLIAN LETTER TODO U", 0x1848: "MONGOLIAN LETTER TODO OE", 0x1849: "MONGOLIAN LETTER TODO UE", 0x184A: "MONGOLIAN LETTER TODO ANG", 0x184B: "MONGOLIAN LETTER TODO BA", 0x184C: "MONGOLIAN LETTER TODO PA", 0x184D: "MONGOLIAN LETTER TODO QA", 0x184E: "MONGOLIAN LETTER TODO GA", 0x184F: "MONGOLIAN LETTER TODO MA", 0x1850: "MONGOLIAN LETTER TODO TA", 0x1851: "MONGOLIAN LETTER TODO DA", 0x1852: "MONGOLIAN LETTER TODO CHA", 0x1853: "MONGOLIAN LETTER TODO JA", 0x1854: "MONGOLIAN LETTER TODO TSA", 0x1855: "MONGOLIAN LETTER TODO YA", 0x1856: "MONGOLIAN LETTER TODO WA", 0x1857: "MONGOLIAN LETTER TODO KA", 0x1858: "MONGOLIAN LETTER TODO GAA", 0x1859: "MONGOLIAN LETTER TODO HAA", 0x185A: "MONGOLIAN LETTER TODO JIA", 0x185B: "MONGOLIAN LETTER TODO NIA", 0x185C: "MONGOLIAN LETTER TODO DZA", 0x185D: "MONGOLIAN LETTER SIBE E", 0x185E: "MONGOLIAN LETTER SIBE I", 0x185F: "MONGOLIAN LETTER SIBE IY", 0x1860: "MONGOLIAN LETTER SIBE UE", 0x1861: "MONGOLIAN LETTER SIBE U", 0x1862: "MONGOLIAN LETTER SIBE ANG", 0x1863: "MONGOLIAN LETTER SIBE KA", 0x1864: "MONGOLIAN LETTER SIBE GA", 0x1865: "MONGOLIAN LETTER SIBE HA", 0x1866: "MONGOLIAN LETTER SIBE PA", 0x1867: "MONGOLIAN LETTER SIBE SHA", 0x1868: "MONGOLIAN LETTER SIBE TA", 0x1869: "MONGOLIAN LETTER SIBE DA", 0x186A: "MONGOLIAN LETTER SIBE JA", 0x186B: "MONGOLIAN LETTER SIBE FA", 0x186C: "MONGOLIAN LETTER SIBE GAA", 0x186D: "MONGOLIAN LETTER SIBE HAA", 0x186E: "MONGOLIAN LETTER SIBE TSA", 0x186F: "MONGOLIAN LETTER SIBE ZA", 0x1870: "MONGOLIAN LETTER SIBE RAA", 0x1871: "MONGOLIAN LETTER SIBE CHA", 0x1872: "MONGOLIAN LETTER SIBE ZHA", 0x1873: "MONGOLIAN LETTER MANCHU I", 0x1874: "MONGOLIAN LETTER MANCHU KA", 0x1875: "MONGOLIAN LETTER MANCHU RA", 0x1876: "MONGOLIAN LETTER MANCHU FA", 0x1877: "MONGOLIAN LETTER MANCHU ZHA", 0x1880: "MONGOLIAN LETTER ALI GALI ANUSVARA ONE", 0x1881: "MONGOLIAN LETTER ALI GALI VISARGA ONE", 0x1882: "MONGOLIAN LETTER ALI GALI DAMARU", 0x1883: "MONGOLIAN LETTER ALI GALI UBADAMA", 0x1884: "MONGOLIAN LETTER ALI GALI INVERTED UBADAMA", 0x1885: "MONGOLIAN LETTER ALI GALI BALUDA", 0x1886: "MONGOLIAN LETTER ALI GALI THREE BALUDA", 0x1887: "MONGOLIAN LETTER ALI GALI A", 0x1888: "MONGOLIAN LETTER ALI GALI I", 0x1889: "MONGOLIAN LETTER ALI GALI KA", 0x188A: "MONGOLIAN LETTER ALI GALI NGA", 0x188B: "MONGOLIAN LETTER ALI GALI CA", 0x188C: "MONGOLIAN LETTER ALI GALI TTA", 0x188D: "MONGOLIAN LETTER ALI GALI TTHA", 0x188E: "MONGOLIAN LETTER ALI GALI DDA", 0x188F: "MONGOLIAN LETTER ALI GALI NNA", 0x1890: "MONGOLIAN LETTER ALI GALI TA", 0x1891: "MONGOLIAN LETTER ALI GALI DA", 0x1892: "MONGOLIAN LETTER ALI GALI PA", 0x1893: "MONGOLIAN LETTER ALI GALI PHA", 0x1894: "MONGOLIAN LETTER ALI GALI SSA", 0x1895: "MONGOLIAN LETTER ALI GALI ZHA", 0x1896: "MONGOLIAN LETTER ALI GALI ZA", 0x1897: "MONGOLIAN LETTER ALI GALI AH", 0x1898: "MONGOLIAN LETTER TODO ALI GALI TA", 0x1899: "MONGOLIAN LETTER TODO ALI GALI ZHA", 0x189A: "MONGOLIAN LETTER MANCHU ALI GALI GHA", 0x189B: "MONGOLIAN LETTER MANCHU ALI GALI NGA", 0x189C: "MONGOLIAN LETTER MANCHU ALI GALI CA", 0x189D: "MONGOLIAN LETTER MANCHU ALI GALI JHA", 0x189E: "MONGOLIAN LETTER MANCHU ALI GALI TTA", 0x189F: "MONGOLIAN LETTER MANCHU ALI GALI DDHA", 0x18A0: "MONGOLIAN LETTER MANCHU ALI GALI TA", 0x18A1: "MONGOLIAN LETTER MANCHU ALI GALI DHA", 0x18A2: "MONGOLIAN LETTER MANCHU ALI GALI SSA", 0x18A3: "MONGOLIAN LETTER MANCHU ALI GALI CYA", 0x18A4: "MONGOLIAN LETTER MANCHU ALI GALI ZHA", 0x18A5: "MONGOLIAN LETTER MANCHU ALI GALI ZA", 0x18A6: "MONGOLIAN LETTER ALI GALI HALF U", 0x18A7: "MONGOLIAN LETTER ALI GALI HALF YA", 0x18A8: "MONGOLIAN LETTER MANCHU ALI GALI BHA", 0x18A9: "MONGOLIAN LETTER ALI GALI DAGALGA", 0x18AA: "MONGOLIAN LETTER MANCHU ALI GALI LHA", 0x1900: "LIMBU VOWEL-CARRIER LETTER", 0x1901: "LIMBU LETTER KA", 0x1902: "LIMBU LETTER KHA", 0x1903: "LIMBU LETTER GA", 0x1904: "LIMBU LETTER GHA", 0x1905: "LIMBU LETTER NGA", 0x1906: "LIMBU LETTER CA", 0x1907: "LIMBU LETTER CHA", 0x1908: "LIMBU LETTER JA", 0x1909: "LIMBU LETTER JHA", 0x190A: "LIMBU LETTER YAN", 0x190B: "LIMBU LETTER TA", 0x190C: "LIMBU LETTER THA", 0x190D: "LIMBU LETTER DA", 0x190E: "LIMBU LETTER DHA", 0x190F: "LIMBU LETTER NA", 0x1910: "LIMBU LETTER PA", 0x1911: "LIMBU LETTER PHA", 0x1912: "LIMBU LETTER BA", 0x1913: "LIMBU LETTER BHA", 0x1914: "LIMBU LETTER MA", 0x1915: "LIMBU LETTER YA", 0x1916: "LIMBU LETTER RA", 0x1917: "LIMBU LETTER LA", 0x1918: "LIMBU LETTER WA", 0x1919: "LIMBU LETTER SHA", 0x191A: "LIMBU LETTER SSA", 0x191B: "LIMBU LETTER SA", 0x191C: "LIMBU LETTER HA", 0x1920: "LIMBU VOWEL SIGN A", 0x1921: "LIMBU VOWEL SIGN I", 0x1922: "LIMBU VOWEL SIGN U", 0x1923: "LIMBU VOWEL SIGN EE", 0x1924: "LIMBU VOWEL SIGN AI", 0x1925: "LIMBU VOWEL SIGN OO", 0x1926: "LIMBU VOWEL SIGN AU", 0x1927: "LIMBU VOWEL SIGN E", 0x1928: "LIMBU VOWEL SIGN O", 0x1929: "LIMBU SUBJOINED LETTER YA", 0x192A: "LIMBU SUBJOINED LETTER RA", 0x192B: "LIMBU SUBJOINED LETTER WA", 0x1930: "LIMBU SMALL LETTER KA", 0x1931: "LIMBU SMALL LETTER NGA", 0x1932: "LIMBU SMALL LETTER ANUSVARA", 0x1933: "LIMBU SMALL LETTER TA", 0x1934: "LIMBU SMALL LETTER NA", 0x1935: "LIMBU SMALL LETTER PA", 0x1936: "LIMBU SMALL LETTER MA", 0x1937: "LIMBU SMALL LETTER RA", 0x1938: "LIMBU SMALL LETTER LA", 0x1939: "LIMBU SIGN MUKPHRENG", 0x193A: "LIMBU SIGN KEMPHRENG", 0x193B: "LIMBU SIGN SA-I", 0x1940: "LIMBU SIGN LOO", 0x1944: "LIMBU EXCLAMATION MARK", 0x1945: "LIMBU QUESTION MARK", 0x1946: "LIMBU DIGIT ZERO", 0x1947: "LIMBU DIGIT ONE", 0x1948: "LIMBU DIGIT TWO", 0x1949: "LIMBU DIGIT THREE", 0x194A: "LIMBU DIGIT FOUR", 0x194B: "LIMBU DIGIT FIVE", 0x194C: "LIMBU DIGIT SIX", 0x194D: "LIMBU DIGIT SEVEN", 0x194E: "LIMBU DIGIT EIGHT", 0x194F: "LIMBU DIGIT NINE", 0x1950: "TAI LE LETTER KA", 0x1951: "TAI LE LETTER XA", 0x1952: "TAI LE LETTER NGA", 0x1953: "TAI LE LETTER TSA", 0x1954: "TAI LE LETTER SA", 0x1955: "TAI LE LETTER YA", 0x1956: "TAI LE LETTER TA", 0x1957: "TAI LE LETTER THA", 0x1958: "TAI LE LETTER LA", 0x1959: "TAI LE LETTER PA", 0x195A: "TAI LE LETTER PHA", 0x195B: "TAI LE LETTER MA", 0x195C: "TAI LE LETTER FA", 0x195D: "TAI LE LETTER VA", 0x195E: "TAI LE LETTER HA", 0x195F: "TAI LE LETTER QA", 0x1960: "TAI LE LETTER KHA", 0x1961: "TAI LE LETTER TSHA", 0x1962: "TAI LE LETTER NA", 0x1963: "TAI LE LETTER A", 0x1964: "TAI LE LETTER I", 0x1965: "TAI LE LETTER EE", 0x1966: "TAI LE LETTER EH", 0x1967: "TAI LE LETTER U", 0x1968: "TAI LE LETTER OO", 0x1969: "TAI LE LETTER O", 0x196A: "TAI LE LETTER UE", 0x196B: "TAI LE LETTER E", 0x196C: "TAI LE LETTER AUE", 0x196D: "TAI LE LETTER AI", 0x1970: "TAI LE LETTER TONE-2", 0x1971: "TAI LE LETTER TONE-3", 0x1972: "TAI LE LETTER TONE-4", 0x1973: "TAI LE LETTER TONE-5", 0x1974: "TAI LE LETTER TONE-6", 0x1980: "NEW TAI LUE LETTER HIGH QA", 0x1981: "NEW TAI LUE LETTER LOW QA", 0x1982: "NEW TAI LUE LETTER HIGH KA", 0x1983: "NEW TAI LUE LETTER HIGH XA", 0x1984: "NEW TAI LUE LETTER HIGH NGA", 0x1985: "NEW TAI LUE LETTER LOW KA", 0x1986: "NEW TAI LUE LETTER LOW XA", 0x1987: "NEW TAI LUE LETTER LOW NGA", 0x1988: "NEW TAI LUE LETTER HIGH TSA", 0x1989: "NEW TAI LUE LETTER HIGH SA", 0x198A: "NEW TAI LUE LETTER HIGH YA", 0x198B: "NEW TAI LUE LETTER LOW TSA", 0x198C: "NEW TAI LUE LETTER LOW SA", 0x198D: "NEW TAI LUE LETTER LOW YA", 0x198E: "NEW TAI LUE LETTER HIGH TA", 0x198F: "NEW TAI LUE LETTER HIGH THA", 0x1990: "NEW TAI LUE LETTER HIGH NA", 0x1991: "NEW TAI LUE LETTER LOW TA", 0x1992: "NEW TAI LUE LETTER LOW THA", 0x1993: "NEW TAI LUE LETTER LOW NA", 0x1994: "NEW TAI LUE LETTER HIGH PA", 0x1995: "NEW TAI LUE LETTER HIGH PHA", 0x1996: "NEW TAI LUE LETTER HIGH MA", 0x1997: "NEW TAI LUE LETTER LOW PA", 0x1998: "NEW TAI LUE LETTER LOW PHA", 0x1999: "NEW TAI LUE LETTER LOW MA", 0x199A: "NEW TAI LUE LETTER HIGH FA", 0x199B: "NEW TAI LUE LETTER HIGH VA", 0x199C: "NEW TAI LUE LETTER HIGH LA", 0x199D: "NEW TAI LUE LETTER LOW FA", 0x199E: "NEW TAI LUE LETTER LOW VA", 0x199F: "NEW TAI LUE LETTER LOW LA", 0x19A0: "NEW TAI LUE LETTER HIGH HA", 0x19A1: "NEW TAI LUE LETTER HIGH DA", 0x19A2: "NEW TAI LUE LETTER HIGH BA", 0x19A3: "NEW TAI LUE LETTER LOW HA", 0x19A4: "NEW TAI LUE LETTER LOW DA", 0x19A5: "NEW TAI LUE LETTER LOW BA", 0x19A6: "NEW TAI LUE LETTER HIGH KVA", 0x19A7: "NEW TAI LUE LETTER HIGH XVA", 0x19A8: "NEW TAI LUE LETTER LOW KVA", 0x19A9: "NEW TAI LUE LETTER LOW XVA", 0x19B0: "NEW TAI LUE VOWEL SIGN VOWEL SHORTENER", 0x19B1: "NEW TAI LUE VOWEL SIGN AA", 0x19B2: "NEW TAI LUE VOWEL SIGN II", 0x19B3: "NEW TAI LUE VOWEL SIGN U", 0x19B4: "NEW TAI LUE VOWEL SIGN UU", 0x19B5: "NEW TAI LUE VOWEL SIGN E", 0x19B6: "NEW TAI LUE VOWEL SIGN AE", 0x19B7: "NEW TAI LUE VOWEL SIGN O", 0x19B8: "NEW TAI LUE VOWEL SIGN OA", 0x19B9: "NEW TAI LUE VOWEL SIGN UE", 0x19BA: "NEW TAI LUE VOWEL SIGN AY", 0x19BB: "NEW TAI LUE VOWEL SIGN AAY", 0x19BC: "NEW TAI LUE VOWEL SIGN UY", 0x19BD: "NEW TAI LUE VOWEL SIGN OY", 0x19BE: "NEW TAI LUE VOWEL SIGN OAY", 0x19BF: "NEW TAI LUE VOWEL SIGN UEY", 0x19C0: "NEW TAI LUE VOWEL SIGN IY", 0x19C1: "NEW TAI LUE LETTER FINAL V", 0x19C2: "NEW TAI LUE LETTER FINAL NG", 0x19C3: "NEW TAI LUE LETTER FINAL N", 0x19C4: "NEW TAI LUE LETTER FINAL M", 0x19C5: "NEW TAI LUE LETTER FINAL K", 0x19C6: "NEW TAI LUE LETTER FINAL D", 0x19C7: "NEW TAI LUE LETTER FINAL B", 0x19C8: "NEW TAI LUE TONE MARK-1", 0x19C9: "NEW TAI LUE TONE MARK-2", 0x19D0: "NEW TAI LUE DIGIT ZERO", 0x19D1: "NEW TAI LUE DIGIT ONE", 0x19D2: "NEW TAI LUE DIGIT TWO", 0x19D3: "NEW TAI LUE DIGIT THREE", 0x19D4: "NEW TAI LUE DIGIT FOUR", 0x19D5: "NEW TAI LUE DIGIT FIVE", 0x19D6: "NEW TAI LUE DIGIT SIX", 0x19D7: "NEW TAI LUE DIGIT SEVEN", 0x19D8: "NEW TAI LUE DIGIT EIGHT", 0x19D9: "NEW TAI LUE DIGIT NINE", 0x19DE: "NEW TAI LUE SIGN LAE", 0x19DF: "NEW TAI LUE SIGN LAEV", 0x19E0: "KHMER SYMBOL PATHAMASAT", 0x19E1: "KHMER SYMBOL MUOY KOET", 0x19E2: "KHMER SYMBOL PII KOET", 0x19E3: "KHMER SYMBOL BEI KOET", 0x19E4: "KHMER SYMBOL BUON KOET", 0x19E5: "KHMER SYMBOL PRAM KOET", 0x19E6: "KHMER SYMBOL PRAM-MUOY KOET", 0x19E7: "KHMER SYMBOL PRAM-PII KOET", 0x19E8: "KHMER SYMBOL PRAM-BEI KOET", 0x19E9: "KHMER SYMBOL PRAM-BUON KOET", 0x19EA: "KHMER SYMBOL DAP KOET", 0x19EB: "KHMER SYMBOL DAP-MUOY KOET", 0x19EC: "KHMER SYMBOL DAP-PII KOET", 0x19ED: "KHMER SYMBOL DAP-BEI KOET", 0x19EE: "KHMER SYMBOL DAP-BUON KOET", 0x19EF: "KHMER SYMBOL DAP-PRAM KOET", 0x19F0: "KHMER SYMBOL TUTEYASAT", 0x19F1: "KHMER SYMBOL MUOY ROC", 0x19F2: "KHMER SYMBOL PII ROC", 0x19F3: "KHMER SYMBOL BEI ROC", 0x19F4: "KHMER SYMBOL BUON ROC", 0x19F5: "KHMER SYMBOL PRAM ROC", 0x19F6: "KHMER SYMBOL PRAM-MUOY ROC", 0x19F7: "KHMER SYMBOL PRAM-PII ROC", 0x19F8: "KHMER SYMBOL PRAM-BEI ROC", 0x19F9: "KHMER SYMBOL PRAM-BUON ROC", 0x19FA: "KHMER SYMBOL DAP ROC", 0x19FB: "KHMER SYMBOL DAP-MUOY ROC", 0x19FC: "KHMER SYMBOL DAP-PII ROC", 0x19FD: "KHMER SYMBOL DAP-BEI ROC", 0x19FE: "KHMER SYMBOL DAP-BUON ROC", 0x19FF: "KHMER SYMBOL DAP-PRAM ROC", 0x1A00: "BUGINESE LETTER KA", 0x1A01: "BUGINESE LETTER GA", 0x1A02: "BUGINESE LETTER NGA", 0x1A03: "BUGINESE LETTER NGKA", 0x1A04: "BUGINESE LETTER PA", 0x1A05: "BUGINESE LETTER BA", 0x1A06: "BUGINESE LETTER MA", 0x1A07: "BUGINESE LETTER MPA", 0x1A08: "BUGINESE LETTER TA", 0x1A09: "BUGINESE LETTER DA", 0x1A0A: "BUGINESE LETTER NA", 0x1A0B: "BUGINESE LETTER NRA", 0x1A0C: "BUGINESE LETTER CA", 0x1A0D: "BUGINESE LETTER JA", 0x1A0E: "BUGINESE LETTER NYA", 0x1A0F: "BUGINESE LETTER NYCA", 0x1A10: "BUGINESE LETTER YA", 0x1A11: "BUGINESE LETTER RA", 0x1A12: "BUGINESE LETTER LA", 0x1A13: "BUGINESE LETTER VA", 0x1A14: "BUGINESE LETTER SA", 0x1A15: "BUGINESE LETTER A", 0x1A16: "BUGINESE LETTER HA", 0x1A17: "BUGINESE VOWEL SIGN I", 0x1A18: "BUGINESE VOWEL SIGN U", 0x1A19: "BUGINESE VOWEL SIGN E", 0x1A1A: "BUGINESE VOWEL SIGN O", 0x1A1B: "BUGINESE VOWEL SIGN AE", 0x1A1E: "BUGINESE PALLAWA", 0x1A1F: "BUGINESE END OF SECTION", 0x1B00: "BALINESE SIGN ULU RICEM (ardhacandra)", 0x1B01: "BALINESE SIGN ULU CANDRA (candrabindu)", 0x1B02: "BALINESE SIGN CECEK (anusvara)", 0x1B03: "BALINESE SIGN SURANG (repha)", 0x1B04: "BALINESE SIGN BISAH (visarga)", 0x1B05: "BALINESE LETTER AKARA (a)", 0x1B06: "BALINESE LETTER AKARA TEDUNG (aa)", 0x1B07: "BALINESE LETTER IKARA (i)", 0x1B08: "BALINESE LETTER IKARA TEDUNG (ii)", 0x1B09: "BALINESE LETTER UKARA (u)", 0x1B0A: "BALINESE LETTER UKARA TEDUNG (uu)", 0x1B0B: "BALINESE LETTER RA REPA (vocalic r)", 0x1B0C: "BALINESE LETTER RA REPA TEDUNG (vocalic rr)", 0x1B0D: "BALINESE LETTER LA LENGA (vocalic l)", 0x1B0E: "BALINESE LETTER LA LENGA TEDUNG (vocalic ll)", 0x1B0F: "BALINESE LETTER EKARA (e)", 0x1B10: "BALINESE LETTER AIKARA (ai)", 0x1B11: "BALINESE LETTER OKARA (o)", 0x1B12: "BALINESE LETTER OKARA TEDUNG (au)", 0x1B13: "BALINESE LETTER KA", 0x1B14: "BALINESE LETTER KA MAHAPRANA (kha)", 0x1B15: "BALINESE LETTER GA", 0x1B16: "BALINESE LETTER GA GORA (gha)", 0x1B17: "BALINESE LETTER NGA", 0x1B18: "BALINESE LETTER CA", 0x1B19: "BALINESE LETTER CA LACA (cha)", 0x1B1A: "BALINESE LETTER JA", 0x1B1B: "BALINESE LETTER JA JERA (jha)", 0x1B1C: "BALINESE LETTER NYA", 0x1B1D: "BALINESE LETTER TA LATIK (tta)", 0x1B1E: "BALINESE LETTER TA MURDA MAHAPRANA (ttha)", 0x1B1F: "BALINESE LETTER DA MURDA ALPAPRANA (dda)", 0x1B20: "BALINESE LETTER DA MURDA MAHAPRANA (ddha)", 0x1B21: "BALINESE LETTER NA RAMBAT (nna)", 0x1B22: "BALINESE LETTER TA", 0x1B23: "BALINESE LETTER TA TAWA (tha)", 0x1B24: "BALINESE LETTER DA", 0x1B25: "BALINESE LETTER DA MADU (dha)", 0x1B26: "BALINESE LETTER NA", 0x1B27: "BALINESE LETTER PA", 0x1B28: "BALINESE LETTER PA KAPAL (pha)", 0x1B29: "BALINESE LETTER BA", 0x1B2A: "BALINESE LETTER BA KEMBANG (bha)", 0x1B2B: "BALINESE LETTER MA", 0x1B2C: "BALINESE LETTER YA", 0x1B2D: "BALINESE LETTER RA", 0x1B2E: "BALINESE LETTER LA", 0x1B2F: "BALINESE LETTER WA", 0x1B30: "BALINESE LETTER SA SAGA (sha)", 0x1B31: "BALINESE LETTER SA SAPA (ssa)", 0x1B32: "BALINESE LETTER SA", 0x1B33: "BALINESE LETTER HA", 0x1B34: "BALINESE SIGN REREKAN (nukta)", 0x1B35: "BALINESE VOWEL SIGN TEDUNG (aa)", 0x1B36: "BALINESE VOWEL SIGN ULU (i)", 0x1B37: "BALINESE VOWEL SIGN ULU SARI (ii)", 0x1B38: "BALINESE VOWEL SIGN SUKU (u)", 0x1B39: "BALINESE VOWEL SIGN SUKU ILUT (uu)", 0x1B3A: "BALINESE VOWEL SIGN RA REPA (vocalic r)", 0x1B3B: "BALINESE VOWEL SIGN RA REPA TEDUNG (vocalic rr)", 0x1B3C: "BALINESE VOWEL SIGN LA LENGA (vocalic l)", 0x1B3D: "BALINESE VOWEL SIGN LA LENGA TEDUNG (vocalic ll)", 0x1B3E: "BALINESE VOWEL SIGN TALING (e)", 0x1B3F: "BALINESE VOWEL SIGN TALING REPA (ai)", 0x1B40: "BALINESE VOWEL SIGN TALING TEDUNG (o)", 0x1B41: "BALINESE VOWEL SIGN TALING REPA TEDUNG (au)", 0x1B42: "BALINESE VOWEL SIGN PEPET (ae)", 0x1B43: "BALINESE VOWEL SIGN PEPET TEDUNG (oe)", 0x1B44: "BALINESE ADEG ADEG (virama)", 0x1B45: "BALINESE LETTER KAF SASAK", 0x1B46: "BALINESE LETTER KHOT SASAK", 0x1B47: "BALINESE LETTER TZIR SASAK", 0x1B48: "BALINESE LETTER EF SASAK", 0x1B49: "BALINESE LETTER VE SASAK", 0x1B4A: "BALINESE LETTER ZAL SASAK", 0x1B4B: "BALINESE LETTER ASYURA SASAK", 0x1B50: "BALINESE DIGIT ZERO", 0x1B51: "BALINESE DIGIT ONE", 0x1B52: "BALINESE DIGIT TWO", 0x1B53: "BALINESE DIGIT THREE", 0x1B54: "BALINESE DIGIT FOUR", 0x1B55: "BALINESE DIGIT FIVE", 0x1B56: "BALINESE DIGIT SIX", 0x1B57: "BALINESE DIGIT SEVEN", 0x1B58: "BALINESE DIGIT EIGHT", 0x1B59: "BALINESE DIGIT NINE", 0x1B5A: "BALINESE PANTI (section)", 0x1B5B: "BALINESE PAMADA (honorific section)", 0x1B5C: "BALINESE WINDU (punctuation ring)", 0x1B5D: "BALINESE CARIK PAMUNGKAH (colon)", 0x1B5E: "BALINESE CARIK SIKI (danda)", 0x1B5F: "BALINESE CARIK PAREREN (double danda)", 0x1B60: "BALINESE PAMENENG (line-breaking hyphen)", 0x1B61: "BALINESE MUSICAL SYMBOL DONG", 0x1B62: "BALINESE MUSICAL SYMBOL DENG", 0x1B63: "BALINESE MUSICAL SYMBOL DUNG", 0x1B64: "BALINESE MUSICAL SYMBOL DANG", 0x1B65: "BALINESE MUSICAL SYMBOL DANG SURANG", 0x1B66: "BALINESE MUSICAL SYMBOL DING", 0x1B67: "BALINESE MUSICAL SYMBOL DAENG", 0x1B68: "BALINESE MUSICAL SYMBOL DEUNG", 0x1B69: "BALINESE MUSICAL SYMBOL DAING", 0x1B6A: "BALINESE MUSICAL SYMBOL DANG GEDE", 0x1B6B: "BALINESE MUSICAL SYMBOL COMBINING TEGEH", 0x1B6C: "BALINESE MUSICAL SYMBOL COMBINING ENDEP", 0x1B6D: "BALINESE MUSICAL SYMBOL COMBINING KEMPUL", 0x1B6E: "BALINESE MUSICAL SYMBOL COMBINING KEMPLI", 0x1B6F: "BALINESE MUSICAL SYMBOL COMBINING JEGOGAN", 0x1B70: "BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN", 0x1B71: "BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN", 0x1B72: "BALINESE MUSICAL SYMBOL COMBINING BENDE", 0x1B73: "BALINESE MUSICAL SYMBOL COMBINING GONG", 0x1B74: "BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG", 0x1B75: "BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG", 0x1B76: "BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK", 0x1B77: "BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK", 0x1B78: "BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG", 0x1B79: "BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG", 0x1B7A: "BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK", 0x1B7B: "BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK", 0x1B7C: "BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING", 0x1B80: "SUNDANESE SIGN PANYECEK", 0x1B81: "SUNDANESE SIGN PANGLAYAR", 0x1B82: "SUNDANESE SIGN PANGWISAD", 0x1B83: "SUNDANESE LETTER A", 0x1B84: "SUNDANESE LETTER I", 0x1B85: "SUNDANESE LETTER U", 0x1B86: "SUNDANESE LETTER AE", 0x1B87: "SUNDANESE LETTER O", 0x1B88: "SUNDANESE LETTER E", 0x1B89: "SUNDANESE LETTER EU", 0x1B8A: "SUNDANESE LETTER KA", 0x1B8B: "SUNDANESE LETTER QA", 0x1B8C: "SUNDANESE LETTER GA", 0x1B8D: "SUNDANESE LETTER NGA", 0x1B8E: "SUNDANESE LETTER CA", 0x1B8F: "SUNDANESE LETTER JA", 0x1B90: "SUNDANESE LETTER ZA", 0x1B91: "SUNDANESE LETTER NYA", 0x1B92: "SUNDANESE LETTER TA", 0x1B93: "SUNDANESE LETTER DA", 0x1B94: "SUNDANESE LETTER NA", 0x1B95: "SUNDANESE LETTER PA", 0x1B96: "SUNDANESE LETTER FA", 0x1B97: "SUNDANESE LETTER VA", 0x1B98: "SUNDANESE LETTER BA", 0x1B99: "SUNDANESE LETTER MA", 0x1B9A: "SUNDANESE LETTER YA", 0x1B9B: "SUNDANESE LETTER RA", 0x1B9C: "SUNDANESE LETTER LA", 0x1B9D: "SUNDANESE LETTER WA", 0x1B9E: "SUNDANESE LETTER SA", 0x1B9F: "SUNDANESE LETTER XA", 0x1BA0: "SUNDANESE LETTER HA", 0x1BA1: "SUNDANESE CONSONANT SIGN PAMINGKAL", 0x1BA2: "SUNDANESE CONSONANT SIGN PANYAKRA", 0x1BA3: "SUNDANESE CONSONANT SIGN PANYIKU", 0x1BA4: "SUNDANESE VOWEL SIGN PANGHULU", 0x1BA5: "SUNDANESE VOWEL SIGN PANYUKU", 0x1BA6: "SUNDANESE VOWEL SIGN PANAELAENG", 0x1BA7: "SUNDANESE VOWEL SIGN PANOLONG", 0x1BA8: "SUNDANESE VOWEL SIGN PAMEPET", 0x1BA9: "SUNDANESE VOWEL SIGN PANEULEUNG", 0x1BAA: "SUNDANESE SIGN PAMAAEH", 0x1BAE: "SUNDANESE LETTER KHA", 0x1BAF: "SUNDANESE LETTER SYA", 0x1BB0: "SUNDANESE DIGIT ZERO", 0x1BB1: "SUNDANESE DIGIT ONE", 0x1BB2: "SUNDANESE DIGIT TWO", 0x1BB3: "SUNDANESE DIGIT THREE", 0x1BB4: "SUNDANESE DIGIT FOUR", 0x1BB5: "SUNDANESE DIGIT FIVE", 0x1BB6: "SUNDANESE DIGIT SIX", 0x1BB7: "SUNDANESE DIGIT SEVEN", 0x1BB8: "SUNDANESE DIGIT EIGHT", 0x1BB9: "SUNDANESE DIGIT NINE", 0x1C00: "LEPCHA LETTER KA", 0x1C01: "LEPCHA LETTER KLA", 0x1C02: "LEPCHA LETTER KHA", 0x1C03: "LEPCHA LETTER GA", 0x1C04: "LEPCHA LETTER GLA", 0x1C05: "LEPCHA LETTER NGA", 0x1C06: "LEPCHA LETTER CA", 0x1C07: "LEPCHA LETTER CHA", 0x1C08: "LEPCHA LETTER JA", 0x1C09: "LEPCHA LETTER NYA", 0x1C0A: "LEPCHA LETTER TA", 0x1C0B: "LEPCHA LETTER THA", 0x1C0C: "LEPCHA LETTER DA", 0x1C0D: "LEPCHA LETTER NA", 0x1C0E: "LEPCHA LETTER PA", 0x1C0F: "LEPCHA LETTER PLA", 0x1C10: "LEPCHA LETTER PHA", 0x1C11: "LEPCHA LETTER FA", 0x1C12: "LEPCHA LETTER FLA", 0x1C13: "LEPCHA LETTER BA", 0x1C14: "LEPCHA LETTER BLA", 0x1C15: "LEPCHA LETTER MA", 0x1C16: "LEPCHA LETTER MLA", 0x1C17: "LEPCHA LETTER TSA", 0x1C18: "LEPCHA LETTER TSHA", 0x1C19: "LEPCHA LETTER DZA", 0x1C1A: "LEPCHA LETTER YA", 0x1C1B: "LEPCHA LETTER RA", 0x1C1C: "LEPCHA LETTER LA", 0x1C1D: "LEPCHA LETTER HA", 0x1C1E: "LEPCHA LETTER HLA", 0x1C1F: "LEPCHA LETTER VA", 0x1C20: "LEPCHA LETTER SA", 0x1C21: "LEPCHA LETTER SHA", 0x1C22: "LEPCHA LETTER WA", 0x1C23: "LEPCHA LETTER A", 0x1C24: "LEPCHA SUBJOINED LETTER YA", 0x1C25: "LEPCHA SUBJOINED LETTER RA", 0x1C26: "LEPCHA VOWEL SIGN AA", 0x1C27: "LEPCHA VOWEL SIGN I", 0x1C28: "LEPCHA VOWEL SIGN O", 0x1C29: "LEPCHA VOWEL SIGN OO", 0x1C2A: "LEPCHA VOWEL SIGN U", 0x1C2B: "LEPCHA VOWEL SIGN UU", 0x1C2C: "LEPCHA VOWEL SIGN E", 0x1C2D: "LEPCHA CONSONANT SIGN K", 0x1C2E: "LEPCHA CONSONANT SIGN M", 0x1C2F: "LEPCHA CONSONANT SIGN L", 0x1C30: "LEPCHA CONSONANT SIGN N", 0x1C31: "LEPCHA CONSONANT SIGN P", 0x1C32: "LEPCHA CONSONANT SIGN R", 0x1C33: "LEPCHA CONSONANT SIGN T", 0x1C34: "LEPCHA CONSONANT SIGN NYIN-DO", 0x1C35: "LEPCHA CONSONANT SIGN KANG", 0x1C36: "LEPCHA SIGN RAN", 0x1C37: "LEPCHA SIGN NUKTA", 0x1C3B: "LEPCHA PUNCTUATION TA-ROL", 0x1C3C: "LEPCHA PUNCTUATION NYET THYOOM TA-ROL", 0x1C3D: "LEPCHA PUNCTUATION CER-WA", 0x1C3E: "LEPCHA PUNCTUATION TSHOOK CER-WA", 0x1C3F: "LEPCHA PUNCTUATION TSHOOK", 0x1C40: "LEPCHA DIGIT ZERO", 0x1C41: "LEPCHA DIGIT ONE", 0x1C42: "LEPCHA DIGIT TWO", 0x1C43: "LEPCHA DIGIT THREE", 0x1C44: "LEPCHA DIGIT FOUR", 0x1C45: "LEPCHA DIGIT FIVE", 0x1C46: "LEPCHA DIGIT SIX", 0x1C47: "LEPCHA DIGIT SEVEN", 0x1C48: "LEPCHA DIGIT EIGHT", 0x1C49: "LEPCHA DIGIT NINE", 0x1C4D: "LEPCHA LETTER TTA", 0x1C4E: "LEPCHA LETTER TTHA", 0x1C4F: "LEPCHA LETTER DDA", 0x1C50: "OL CHIKI DIGIT ZERO", 0x1C51: "OL CHIKI DIGIT ONE", 0x1C52: "OL CHIKI DIGIT TWO", 0x1C53: "OL CHIKI DIGIT THREE", 0x1C54: "OL CHIKI DIGIT FOUR", 0x1C55: "OL CHIKI DIGIT FIVE", 0x1C56: "OL CHIKI DIGIT SIX", 0x1C57: "OL CHIKI DIGIT SEVEN", 0x1C58: "OL CHIKI DIGIT EIGHT", 0x1C59: "OL CHIKI DIGIT NINE", 0x1C5A: "OL CHIKI LETTER LA", 0x1C5B: "OL CHIKI LETTER AT", 0x1C5C: "OL CHIKI LETTER AG", 0x1C5D: "OL CHIKI LETTER ANG", 0x1C5E: "OL CHIKI LETTER AL", 0x1C5F: "OL CHIKI LETTER LAA", 0x1C60: "OL CHIKI LETTER AAK", 0x1C61: "OL CHIKI LETTER AAJ", 0x1C62: "OL CHIKI LETTER AAM", 0x1C63: "OL CHIKI LETTER AAW", 0x1C64: "OL CHIKI LETTER LI", 0x1C65: "OL CHIKI LETTER IS", 0x1C66: "OL CHIKI LETTER IH", 0x1C67: "OL CHIKI LETTER INY", 0x1C68: "OL CHIKI LETTER IR", 0x1C69: "OL CHIKI LETTER LU", 0x1C6A: "OL CHIKI LETTER UC", 0x1C6B: "OL CHIKI LETTER UD", 0x1C6C: "OL CHIKI LETTER UNN", 0x1C6D: "OL CHIKI LETTER UY", 0x1C6E: "OL CHIKI LETTER LE", 0x1C6F: "OL CHIKI LETTER EP", 0x1C70: "OL CHIKI LETTER EDD", 0x1C71: "OL CHIKI LETTER EN", 0x1C72: "OL CHIKI LETTER ERR", 0x1C73: "OL CHIKI LETTER LO", 0x1C74: "OL CHIKI LETTER OTT", 0x1C75: "OL CHIKI LETTER OB", 0x1C76: "OL CHIKI LETTER OV", 0x1C77: "OL CHIKI LETTER OH", 0x1C78: "OL CHIKI MU TTUDDAG", 0x1C79: "OL CHIKI GAAHLAA TTUDDAAG", 0x1C7A: "OL CHIKI MU-GAAHLAA TTUDDAAG", 0x1C7B: "OL CHIKI RELAA", 0x1C7C: "OL CHIKI PHAARKAA", 0x1C7D: "OL CHIKI AHAD", 0x1C7E: "OL CHIKI PUNCTUATION MUCAAD", 0x1C7F: "OL CHIKI PUNCTUATION DOUBLE MUCAAD", 0x1D00: "LATIN LETTER SMALL CAPITAL A", 0x1D01: "LATIN LETTER SMALL CAPITAL AE", 0x1D02: "LATIN SMALL LETTER TURNED AE", 0x1D03: "LATIN LETTER SMALL CAPITAL BARRED B", 0x1D04: "LATIN LETTER SMALL CAPITAL C", 0x1D05: "LATIN LETTER SMALL CAPITAL D", 0x1D06: "LATIN LETTER SMALL CAPITAL ETH", 0x1D07: "LATIN LETTER SMALL CAPITAL E", 0x1D08: "LATIN SMALL LETTER TURNED OPEN E", 0x1D09: "LATIN SMALL LETTER TURNED I", 0x1D0A: "LATIN LETTER SMALL CAPITAL J", 0x1D0B: "LATIN LETTER SMALL CAPITAL K", 0x1D0C: "LATIN LETTER SMALL CAPITAL L WITH STROKE", 0x1D0D: "LATIN LETTER SMALL CAPITAL M", 0x1D0E: "LATIN LETTER SMALL CAPITAL REVERSED N", 0x1D0F: "LATIN LETTER SMALL CAPITAL O", 0x1D10: "LATIN LETTER SMALL CAPITAL OPEN O", 0x1D11: "LATIN SMALL LETTER SIDEWAYS O", 0x1D12: "LATIN SMALL LETTER SIDEWAYS OPEN O", 0x1D13: "LATIN SMALL LETTER SIDEWAYS O WITH STROKE", 0x1D14: "LATIN SMALL LETTER TURNED OE", 0x1D15: "LATIN LETTER SMALL CAPITAL OU", 0x1D16: "LATIN SMALL LETTER TOP HALF O", 0x1D17: "LATIN SMALL LETTER BOTTOM HALF O", 0x1D18: "LATIN LETTER SMALL CAPITAL P", 0x1D19: "LATIN LETTER SMALL CAPITAL REVERSED R", 0x1D1A: "LATIN LETTER SMALL CAPITAL TURNED R", 0x1D1B: "LATIN LETTER SMALL CAPITAL T", 0x1D1C: "LATIN LETTER SMALL CAPITAL U", 0x1D1D: "LATIN SMALL LETTER SIDEWAYS U", 0x1D1E: "LATIN SMALL LETTER SIDEWAYS DIAERESIZED U", 0x1D1F: "LATIN SMALL LETTER SIDEWAYS TURNED M", 0x1D20: "LATIN LETTER SMALL CAPITAL V", 0x1D21: "LATIN LETTER SMALL CAPITAL W", 0x1D22: "LATIN LETTER SMALL CAPITAL Z", 0x1D23: "LATIN LETTER SMALL CAPITAL EZH", 0x1D24: "LATIN LETTER VOICED LARYNGEAL SPIRANT", 0x1D25: "LATIN LETTER AIN", 0x1D26: "GREEK LETTER SMALL CAPITAL GAMMA", 0x1D27: "GREEK LETTER SMALL CAPITAL LAMDA", 0x1D28: "GREEK LETTER SMALL CAPITAL PI", 0x1D29: "GREEK LETTER SMALL CAPITAL RHO", 0x1D2A: "GREEK LETTER SMALL CAPITAL PSI", 0x1D2B: "CYRILLIC LETTER SMALL CAPITAL EL", 0x1D2C: "MODIFIER LETTER CAPITAL A", 0x1D2D: "MODIFIER LETTER CAPITAL AE", 0x1D2E: "MODIFIER LETTER CAPITAL B", 0x1D2F: "MODIFIER LETTER CAPITAL BARRED B", 0x1D30: "MODIFIER LETTER CAPITAL D", 0x1D31: "MODIFIER LETTER CAPITAL E", 0x1D32: "MODIFIER LETTER CAPITAL REVERSED E", 0x1D33: "MODIFIER LETTER CAPITAL G", 0x1D34: "MODIFIER LETTER CAPITAL H", 0x1D35: "MODIFIER LETTER CAPITAL I", 0x1D36: "MODIFIER LETTER CAPITAL J", 0x1D37: "MODIFIER LETTER CAPITAL K", 0x1D38: "MODIFIER LETTER CAPITAL L", 0x1D39: "MODIFIER LETTER CAPITAL M", 0x1D3A: "MODIFIER LETTER CAPITAL N", 0x1D3B: "MODIFIER LETTER CAPITAL REVERSED N", 0x1D3C: "MODIFIER LETTER CAPITAL O", 0x1D3D: "MODIFIER LETTER CAPITAL OU", 0x1D3E: "MODIFIER LETTER CAPITAL P", 0x1D3F: "MODIFIER LETTER CAPITAL R", 0x1D40: "MODIFIER LETTER CAPITAL T", 0x1D41: "MODIFIER LETTER CAPITAL U", 0x1D42: "MODIFIER LETTER CAPITAL W", 0x1D43: "MODIFIER LETTER SMALL A", 0x1D44: "MODIFIER LETTER SMALL TURNED A", 0x1D45: "MODIFIER LETTER SMALL ALPHA", 0x1D46: "MODIFIER LETTER SMALL TURNED AE", 0x1D47: "MODIFIER LETTER SMALL B", 0x1D48: "MODIFIER LETTER SMALL D", 0x1D49: "MODIFIER LETTER SMALL E", 0x1D4A: "MODIFIER LETTER SMALL SCHWA", 0x1D4B: "MODIFIER LETTER SMALL OPEN E", 0x1D4C: "MODIFIER LETTER SMALL TURNED OPEN E", 0x1D4D: "MODIFIER LETTER SMALL G", 0x1D4E: "MODIFIER LETTER SMALL TURNED I", 0x1D4F: "MODIFIER LETTER SMALL K", 0x1D50: "MODIFIER LETTER SMALL M", 0x1D51: "MODIFIER LETTER SMALL ENG", 0x1D52: "MODIFIER LETTER SMALL O", 0x1D53: "MODIFIER LETTER SMALL OPEN O", 0x1D54: "MODIFIER LETTER SMALL TOP HALF O", 0x1D55: "MODIFIER LETTER SMALL BOTTOM HALF O", 0x1D56: "MODIFIER LETTER SMALL P", 0x1D57: "MODIFIER LETTER SMALL T", 0x1D58: "MODIFIER LETTER SMALL U", 0x1D59: "MODIFIER LETTER SMALL SIDEWAYS U", 0x1D5A: "MODIFIER LETTER SMALL TURNED M", 0x1D5B: "MODIFIER LETTER SMALL V", 0x1D5C: "MODIFIER LETTER SMALL AIN", 0x1D5D: "MODIFIER LETTER SMALL BETA", 0x1D5E: "MODIFIER LETTER SMALL GREEK GAMMA", 0x1D5F: "MODIFIER LETTER SMALL DELTA", 0x1D60: "MODIFIER LETTER SMALL GREEK PHI", 0x1D61: "MODIFIER LETTER SMALL CHI", 0x1D62: "LATIN SUBSCRIPT SMALL LETTER I", 0x1D63: "LATIN SUBSCRIPT SMALL LETTER R", 0x1D64: "LATIN SUBSCRIPT SMALL LETTER U", 0x1D65: "LATIN SUBSCRIPT SMALL LETTER V", 0x1D66: "GREEK SUBSCRIPT SMALL LETTER BETA", 0x1D67: "GREEK SUBSCRIPT SMALL LETTER GAMMA", 0x1D68: "GREEK SUBSCRIPT SMALL LETTER RHO", 0x1D69: "GREEK SUBSCRIPT SMALL LETTER PHI", 0x1D6A: "GREEK SUBSCRIPT SMALL LETTER CHI", 0x1D6B: "LATIN SMALL LETTER UE", 0x1D6C: "LATIN SMALL LETTER B WITH MIDDLE TILDE", 0x1D6D: "LATIN SMALL LETTER D WITH MIDDLE TILDE", 0x1D6E: "LATIN SMALL LETTER F WITH MIDDLE TILDE", 0x1D6F: "LATIN SMALL LETTER M WITH MIDDLE TILDE", 0x1D70: "LATIN SMALL LETTER N WITH MIDDLE TILDE", 0x1D71: "LATIN SMALL LETTER P WITH MIDDLE TILDE", 0x1D72: "LATIN SMALL LETTER R WITH MIDDLE TILDE", 0x1D73: "LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE", 0x1D74: "LATIN SMALL LETTER S WITH MIDDLE TILDE", 0x1D75: "LATIN SMALL LETTER T WITH MIDDLE TILDE", 0x1D76: "LATIN SMALL LETTER Z WITH MIDDLE TILDE", 0x1D77: "LATIN SMALL LETTER TURNED G", 0x1D78: "MODIFIER LETTER CYRILLIC EN", 0x1D79: "LATIN SMALL LETTER INSULAR G", 0x1D7A: "LATIN SMALL LETTER TH WITH STRIKETHROUGH", 0x1D7B: "LATIN SMALL CAPITAL LETTER I WITH STROKE", 0x1D7C: "LATIN SMALL LETTER IOTA WITH STROKE", 0x1D7D: "LATIN SMALL LETTER P WITH STROKE", 0x1D7E: "LATIN SMALL CAPITAL LETTER U WITH STROKE", 0x1D7F: "LATIN SMALL LETTER UPSILON WITH STROKE", 0x1D80: "LATIN SMALL LETTER B WITH PALATAL HOOK", 0x1D81: "LATIN SMALL LETTER D WITH PALATAL HOOK", 0x1D82: "LATIN SMALL LETTER F WITH PALATAL HOOK", 0x1D83: "LATIN SMALL LETTER G WITH PALATAL HOOK", 0x1D84: "LATIN SMALL LETTER K WITH PALATAL HOOK", 0x1D85: "LATIN SMALL LETTER L WITH PALATAL HOOK", 0x1D86: "LATIN SMALL LETTER M WITH PALATAL HOOK", 0x1D87: "LATIN SMALL LETTER N WITH PALATAL HOOK", 0x1D88: "LATIN SMALL LETTER P WITH PALATAL HOOK", 0x1D89: "LATIN SMALL LETTER R WITH PALATAL HOOK", 0x1D8A: "LATIN SMALL LETTER S WITH PALATAL HOOK", 0x1D8B: "LATIN SMALL LETTER ESH WITH PALATAL HOOK", 0x1D8C: "LATIN SMALL LETTER V WITH PALATAL HOOK", 0x1D8D: "LATIN SMALL LETTER X WITH PALATAL HOOK", 0x1D8E: "LATIN SMALL LETTER Z WITH PALATAL HOOK", 0x1D8F: "LATIN SMALL LETTER A WITH RETROFLEX HOOK", 0x1D90: "LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK", 0x1D91: "LATIN SMALL LETTER D WITH HOOK AND TAIL", 0x1D92: "LATIN SMALL LETTER E WITH RETROFLEX HOOK", 0x1D93: "LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK", 0x1D94: "LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK", 0x1D95: "LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK", 0x1D96: "LATIN SMALL LETTER I WITH RETROFLEX HOOK", 0x1D97: "LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK", 0x1D98: "LATIN SMALL LETTER ESH WITH RETROFLEX HOOK", 0x1D99: "LATIN SMALL LETTER U WITH RETROFLEX HOOK", 0x1D9A: "LATIN SMALL LETTER EZH WITH RETROFLEX HOOK", 0x1D9B: "MODIFIER LETTER SMALL TURNED ALPHA", 0x1D9C: "MODIFIER LETTER SMALL C", 0x1D9D: "MODIFIER LETTER SMALL C WITH CURL", 0x1D9E: "MODIFIER LETTER SMALL ETH", 0x1D9F: "MODIFIER LETTER SMALL REVERSED OPEN E", 0x1DA0: "MODIFIER LETTER SMALL F", 0x1DA1: "MODIFIER LETTER SMALL DOTLESS J WITH STROKE", 0x1DA2: "MODIFIER LETTER SMALL SCRIPT G", 0x1DA3: "MODIFIER LETTER SMALL TURNED H", 0x1DA4: "MODIFIER LETTER SMALL I WITH STROKE", 0x1DA5: "MODIFIER LETTER SMALL IOTA", 0x1DA6: "MODIFIER LETTER SMALL CAPITAL I", 0x1DA7: "MODIFIER LETTER SMALL CAPITAL I WITH STROKE", 0x1DA8: "MODIFIER LETTER SMALL J WITH CROSSED-TAIL", 0x1DA9: "MODIFIER LETTER SMALL L WITH RETROFLEX HOOK", 0x1DAA: "MODIFIER LETTER SMALL L WITH PALATAL HOOK", 0x1DAB: "MODIFIER LETTER SMALL CAPITAL L", 0x1DAC: "MODIFIER LETTER SMALL M WITH HOOK", 0x1DAD: "MODIFIER LETTER SMALL TURNED M WITH LONG LEG", 0x1DAE: "MODIFIER LETTER SMALL N WITH LEFT HOOK", 0x1DAF: "MODIFIER LETTER SMALL N WITH RETROFLEX HOOK", 0x1DB0: "MODIFIER LETTER SMALL CAPITAL N", 0x1DB1: "MODIFIER LETTER SMALL BARRED O", 0x1DB2: "MODIFIER LETTER SMALL PHI", 0x1DB3: "MODIFIER LETTER SMALL S WITH HOOK", 0x1DB4: "MODIFIER LETTER SMALL ESH", 0x1DB5: "MODIFIER LETTER SMALL T WITH PALATAL HOOK", 0x1DB6: "MODIFIER LETTER SMALL U BAR", 0x1DB7: "MODIFIER LETTER SMALL UPSILON", 0x1DB8: "MODIFIER LETTER SMALL CAPITAL U", 0x1DB9: "MODIFIER LETTER SMALL V WITH HOOK", 0x1DBA: "MODIFIER LETTER SMALL TURNED V", 0x1DBB: "MODIFIER LETTER SMALL Z", 0x1DBC: "MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK", 0x1DBD: "MODIFIER LETTER SMALL Z WITH CURL", 0x1DBE: "MODIFIER LETTER SMALL EZH", 0x1DBF: "MODIFIER LETTER SMALL THETA", 0x1DC0: "COMBINING DOTTED GRAVE ACCENT", 0x1DC1: "COMBINING DOTTED ACUTE ACCENT", 0x1DC2: "COMBINING SNAKE BELOW", 0x1DC3: "COMBINING SUSPENSION MARK", 0x1DC4: "COMBINING MACRON-ACUTE", 0x1DC5: "COMBINING GRAVE-MACRON", 0x1DC6: "COMBINING MACRON-GRAVE", 0x1DC7: "COMBINING ACUTE-MACRON", 0x1DC8: "COMBINING GRAVE-ACUTE-GRAVE", 0x1DC9: "COMBINING ACUTE-GRAVE-ACUTE", 0x1DCA: "COMBINING LATIN SMALL LETTER R BELOW", 0x1DCB: "COMBINING BREVE-MACRON", 0x1DCC: "COMBINING MACRON-BREVE", 0x1DCD: "COMBINING DOUBLE CIRCUMFLEX ABOVE", 0x1DCE: "COMBINING OGONEK ABOVE", 0x1DCF: "COMBINING ZIGZAG BELOW", 0x1DD0: "COMBINING IS BELOW", 0x1DD1: "COMBINING UR ABOVE", 0x1DD2: "COMBINING US ABOVE", 0x1DD3: "COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE", 0x1DD4: "COMBINING LATIN SMALL LETTER AE", 0x1DD5: "COMBINING LATIN SMALL LETTER AO", 0x1DD6: "COMBINING LATIN SMALL LETTER AV", 0x1DD7: "COMBINING LATIN SMALL LETTER C CEDILLA", 0x1DD8: "COMBINING LATIN SMALL LETTER INSULAR D", 0x1DD9: "COMBINING LATIN SMALL LETTER ETH", 0x1DDA: "COMBINING LATIN SMALL LETTER G", 0x1DDB: "COMBINING LATIN LETTER SMALL CAPITAL G", 0x1DDC: "COMBINING LATIN SMALL LETTER K", 0x1DDD: "COMBINING LATIN SMALL LETTER L", 0x1DDE: "COMBINING LATIN LETTER SMALL CAPITAL L", 0x1DDF: "COMBINING LATIN LETTER SMALL CAPITAL M", 0x1DE0: "COMBINING LATIN SMALL LETTER N", 0x1DE1: "COMBINING LATIN LETTER SMALL CAPITAL N", 0x1DE2: "COMBINING LATIN LETTER SMALL CAPITAL R", 0x1DE3: "COMBINING LATIN SMALL LETTER R ROTUNDA", 0x1DE4: "COMBINING LATIN SMALL LETTER S", 0x1DE5: "COMBINING LATIN SMALL LETTER LONG S", 0x1DE6: "COMBINING LATIN SMALL LETTER Z", 0x1DFE: "COMBINING LEFT ARROWHEAD ABOVE", 0x1DFF: "COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW", 0x1E00: "LATIN CAPITAL LETTER A WITH RING BELOW", 0x1E01: "LATIN SMALL LETTER A WITH RING BELOW", 0x1E02: "LATIN CAPITAL LETTER B WITH DOT ABOVE", 0x1E03: "LATIN SMALL LETTER B WITH DOT ABOVE", 0x1E04: "LATIN CAPITAL LETTER B WITH DOT BELOW", 0x1E05: "LATIN SMALL LETTER B WITH DOT BELOW", 0x1E06: "LATIN CAPITAL LETTER B WITH LINE BELOW", 0x1E07: "LATIN SMALL LETTER B WITH LINE BELOW", 0x1E08: "LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE", 0x1E09: "LATIN SMALL LETTER C WITH CEDILLA AND ACUTE", 0x1E0A: "LATIN CAPITAL LETTER D WITH DOT ABOVE", 0x1E0B: "LATIN SMALL LETTER D WITH DOT ABOVE", 0x1E0C: "LATIN CAPITAL LETTER D WITH DOT BELOW", 0x1E0D: "LATIN SMALL LETTER D WITH DOT BELOW", 0x1E0E: "LATIN CAPITAL LETTER D WITH LINE BELOW", 0x1E0F: "LATIN SMALL LETTER D WITH LINE BELOW", 0x1E10: "LATIN CAPITAL LETTER D WITH CEDILLA", 0x1E11: "LATIN SMALL LETTER D WITH CEDILLA", 0x1E12: "LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW", 0x1E13: "LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW", 0x1E14: "LATIN CAPITAL LETTER E WITH MACRON AND GRAVE", 0x1E15: "LATIN SMALL LETTER E WITH MACRON AND GRAVE", 0x1E16: "LATIN CAPITAL LETTER E WITH MACRON AND ACUTE", 0x1E17: "LATIN SMALL LETTER E WITH MACRON AND ACUTE", 0x1E18: "LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW", 0x1E19: "LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW", 0x1E1A: "LATIN CAPITAL LETTER E WITH TILDE BELOW", 0x1E1B: "LATIN SMALL LETTER E WITH TILDE BELOW", 0x1E1C: "LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE", 0x1E1D: "LATIN SMALL LETTER E WITH CEDILLA AND BREVE", 0x1E1E: "LATIN CAPITAL LETTER F WITH DOT ABOVE", 0x1E1F: "LATIN SMALL LETTER F WITH DOT ABOVE", 0x1E20: "LATIN CAPITAL LETTER G WITH MACRON", 0x1E21: "LATIN SMALL LETTER G WITH MACRON", 0x1E22: "LATIN CAPITAL LETTER H WITH DOT ABOVE", 0x1E23: "LATIN SMALL LETTER H WITH DOT ABOVE", 0x1E24: "LATIN CAPITAL LETTER H WITH DOT BELOW", 0x1E25: "LATIN SMALL LETTER H WITH DOT BELOW", 0x1E26: "LATIN CAPITAL LETTER H WITH DIAERESIS", 0x1E27: "LATIN SMALL LETTER H WITH DIAERESIS", 0x1E28: "LATIN CAPITAL LETTER H WITH CEDILLA", 0x1E29: "LATIN SMALL LETTER H WITH CEDILLA", 0x1E2A: "LATIN CAPITAL LETTER H WITH BREVE BELOW", 0x1E2B: "LATIN SMALL LETTER H WITH BREVE BELOW", 0x1E2C: "LATIN CAPITAL LETTER I WITH TILDE BELOW", 0x1E2D: "LATIN SMALL LETTER I WITH TILDE BELOW", 0x1E2E: "LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE", 0x1E2F: "LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE", 0x1E30: "LATIN CAPITAL LETTER K WITH ACUTE", 0x1E31: "LATIN SMALL LETTER K WITH ACUTE", 0x1E32: "LATIN CAPITAL LETTER K WITH DOT BELOW", 0x1E33: "LATIN SMALL LETTER K WITH DOT BELOW", 0x1E34: "LATIN CAPITAL LETTER K WITH LINE BELOW", 0x1E35: "LATIN SMALL LETTER K WITH LINE BELOW", 0x1E36: "LATIN CAPITAL LETTER L WITH DOT BELOW", 0x1E37: "LATIN SMALL LETTER L WITH DOT BELOW", 0x1E38: "LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON", 0x1E39: "LATIN SMALL LETTER L WITH DOT BELOW AND MACRON", 0x1E3A: "LATIN CAPITAL LETTER L WITH LINE BELOW", 0x1E3B: "LATIN SMALL LETTER L WITH LINE BELOW", 0x1E3C: "LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW", 0x1E3D: "LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW", 0x1E3E: "LATIN CAPITAL LETTER M WITH ACUTE", 0x1E3F: "LATIN SMALL LETTER M WITH ACUTE", 0x1E40: "LATIN CAPITAL LETTER M WITH DOT ABOVE", 0x1E41: "LATIN SMALL LETTER M WITH DOT ABOVE", 0x1E42: "LATIN CAPITAL LETTER M WITH DOT BELOW", 0x1E43: "LATIN SMALL LETTER M WITH DOT BELOW", 0x1E44: "LATIN CAPITAL LETTER N WITH DOT ABOVE", 0x1E45: "LATIN SMALL LETTER N WITH DOT ABOVE", 0x1E46: "LATIN CAPITAL LETTER N WITH DOT BELOW", 0x1E47: "LATIN SMALL LETTER N WITH DOT BELOW", 0x1E48: "LATIN CAPITAL LETTER N WITH LINE BELOW", 0x1E49: "LATIN SMALL LETTER N WITH LINE BELOW", 0x1E4A: "LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW", 0x1E4B: "LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW", 0x1E4C: "LATIN CAPITAL LETTER O WITH TILDE AND ACUTE", 0x1E4D: "LATIN SMALL LETTER O WITH TILDE AND ACUTE", 0x1E4E: "LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS", 0x1E4F: "LATIN SMALL LETTER O WITH TILDE AND DIAERESIS", 0x1E50: "LATIN CAPITAL LETTER O WITH MACRON AND GRAVE", 0x1E51: "LATIN SMALL LETTER O WITH MACRON AND GRAVE", 0x1E52: "LATIN CAPITAL LETTER O WITH MACRON AND ACUTE", 0x1E53: "LATIN SMALL LETTER O WITH MACRON AND ACUTE", 0x1E54: "LATIN CAPITAL LETTER P WITH ACUTE", 0x1E55: "LATIN SMALL LETTER P WITH ACUTE", 0x1E56: "LATIN CAPITAL LETTER P WITH DOT ABOVE", 0x1E57: "LATIN SMALL LETTER P WITH DOT ABOVE", 0x1E58: "LATIN CAPITAL LETTER R WITH DOT ABOVE", 0x1E59: "LATIN SMALL LETTER R WITH DOT ABOVE", 0x1E5A: "LATIN CAPITAL LETTER R WITH DOT BELOW", 0x1E5B: "LATIN SMALL LETTER R WITH DOT BELOW", 0x1E5C: "LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON", 0x1E5D: "LATIN SMALL LETTER R WITH DOT BELOW AND MACRON", 0x1E5E: "LATIN CAPITAL LETTER R WITH LINE BELOW", 0x1E5F: "LATIN SMALL LETTER R WITH LINE BELOW", 0x1E60: "LATIN CAPITAL LETTER S WITH DOT ABOVE", 0x1E61: "LATIN SMALL LETTER S WITH DOT ABOVE", 0x1E62: "LATIN CAPITAL LETTER S WITH DOT BELOW", 0x1E63: "LATIN SMALL LETTER S WITH DOT BELOW", 0x1E64: "LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE", 0x1E65: "LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE", 0x1E66: "LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE", 0x1E67: "LATIN SMALL LETTER S WITH CARON AND DOT ABOVE", 0x1E68: "LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE", 0x1E69: "LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE", 0x1E6A: "LATIN CAPITAL LETTER T WITH DOT ABOVE", 0x1E6B: "LATIN SMALL LETTER T WITH DOT ABOVE", 0x1E6C: "LATIN CAPITAL LETTER T WITH DOT BELOW", 0x1E6D: "LATIN SMALL LETTER T WITH DOT BELOW", 0x1E6E: "LATIN CAPITAL LETTER T WITH LINE BELOW", 0x1E6F: "LATIN SMALL LETTER T WITH LINE BELOW", 0x1E70: "LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW", 0x1E71: "LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW", 0x1E72: "LATIN CAPITAL LETTER U WITH DIAERESIS BELOW", 0x1E73: "LATIN SMALL LETTER U WITH DIAERESIS BELOW", 0x1E74: "LATIN CAPITAL LETTER U WITH TILDE BELOW", 0x1E75: "LATIN SMALL LETTER U WITH TILDE BELOW", 0x1E76: "LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW", 0x1E77: "LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW", 0x1E78: "LATIN CAPITAL LETTER U WITH TILDE AND ACUTE", 0x1E79: "LATIN SMALL LETTER U WITH TILDE AND ACUTE", 0x1E7A: "LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS", 0x1E7B: "LATIN SMALL LETTER U WITH MACRON AND DIAERESIS", 0x1E7C: "LATIN CAPITAL LETTER V WITH TILDE", 0x1E7D: "LATIN SMALL LETTER V WITH TILDE", 0x1E7E: "LATIN CAPITAL LETTER V WITH DOT BELOW", 0x1E7F: "LATIN SMALL LETTER V WITH DOT BELOW", 0x1E80: "LATIN CAPITAL LETTER W WITH GRAVE", 0x1E81: "LATIN SMALL LETTER W WITH GRAVE", 0x1E82: "LATIN CAPITAL LETTER W WITH ACUTE", 0x1E83: "LATIN SMALL LETTER W WITH ACUTE", 0x1E84: "LATIN CAPITAL LETTER W WITH DIAERESIS", 0x1E85: "LATIN SMALL LETTER W WITH DIAERESIS", 0x1E86: "LATIN CAPITAL LETTER W WITH DOT ABOVE", 0x1E87: "LATIN SMALL LETTER W WITH DOT ABOVE", 0x1E88: "LATIN CAPITAL LETTER W WITH DOT BELOW", 0x1E89: "LATIN SMALL LETTER W WITH DOT BELOW", 0x1E8A: "LATIN CAPITAL LETTER X WITH DOT ABOVE", 0x1E8B: "LATIN SMALL LETTER X WITH DOT ABOVE", 0x1E8C: "LATIN CAPITAL LETTER X WITH DIAERESIS", 0x1E8D: "LATIN SMALL LETTER X WITH DIAERESIS", 0x1E8E: "LATIN CAPITAL LETTER Y WITH DOT ABOVE", 0x1E8F: "LATIN SMALL LETTER Y WITH DOT ABOVE", 0x1E90: "LATIN CAPITAL LETTER Z WITH CIRCUMFLEX", 0x1E91: "LATIN SMALL LETTER Z WITH CIRCUMFLEX", 0x1E92: "LATIN CAPITAL LETTER Z WITH DOT BELOW", 0x1E93: "LATIN SMALL LETTER Z WITH DOT BELOW", 0x1E94: "LATIN CAPITAL LETTER Z WITH LINE BELOW", 0x1E95: "LATIN SMALL LETTER Z WITH LINE BELOW", 0x1E96: "LATIN SMALL LETTER H WITH LINE BELOW", 0x1E97: "LATIN SMALL LETTER T WITH DIAERESIS", 0x1E98: "LATIN SMALL LETTER W WITH RING ABOVE", 0x1E99: "LATIN SMALL LETTER Y WITH RING ABOVE", 0x1E9A: "LATIN SMALL LETTER A WITH RIGHT HALF RING", 0x1E9B: "LATIN SMALL LETTER LONG S WITH DOT ABOVE", 0x1E9C: "LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE", 0x1E9D: "LATIN SMALL LETTER LONG S WITH HIGH STROKE", 0x1E9E: "LATIN CAPITAL LETTER SHARP S", 0x1E9F: "LATIN SMALL LETTER DELTA", 0x1EA0: "LATIN CAPITAL LETTER A WITH DOT BELOW", 0x1EA1: "LATIN SMALL LETTER A WITH DOT BELOW", 0x1EA2: "LATIN CAPITAL LETTER A WITH HOOK ABOVE", 0x1EA3: "LATIN SMALL LETTER A WITH HOOK ABOVE", 0x1EA4: "LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE", 0x1EA5: "LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE", 0x1EA6: "LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE", 0x1EA7: "LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE", 0x1EA8: "LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE", 0x1EA9: "LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE", 0x1EAA: "LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE", 0x1EAB: "LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE", 0x1EAC: "LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW", 0x1EAD: "LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW", 0x1EAE: "LATIN CAPITAL LETTER A WITH BREVE AND ACUTE", 0x1EAF: "LATIN SMALL LETTER A WITH BREVE AND ACUTE", 0x1EB0: "LATIN CAPITAL LETTER A WITH BREVE AND GRAVE", 0x1EB1: "LATIN SMALL LETTER A WITH BREVE AND GRAVE", 0x1EB2: "LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE", 0x1EB3: "LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE", 0x1EB4: "LATIN CAPITAL LETTER A WITH BREVE AND TILDE", 0x1EB5: "LATIN SMALL LETTER A WITH BREVE AND TILDE", 0x1EB6: "LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW", 0x1EB7: "LATIN SMALL LETTER A WITH BREVE AND DOT BELOW", 0x1EB8: "LATIN CAPITAL LETTER E WITH DOT BELOW", 0x1EB9: "LATIN SMALL LETTER E WITH DOT BELOW", 0x1EBA: "LATIN CAPITAL LETTER E WITH HOOK ABOVE", 0x1EBB: "LATIN SMALL LETTER E WITH HOOK ABOVE", 0x1EBC: "LATIN CAPITAL LETTER E WITH TILDE", 0x1EBD: "LATIN SMALL LETTER E WITH TILDE", 0x1EBE: "LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE", 0x1EBF: "LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE", 0x1EC0: "LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE", 0x1EC1: "LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE", 0x1EC2: "LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE", 0x1EC3: "LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE", 0x1EC4: "LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE", 0x1EC5: "LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE", 0x1EC6: "LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW", 0x1EC7: "LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW", 0x1EC8: "LATIN CAPITAL LETTER I WITH HOOK ABOVE", 0x1EC9: "LATIN SMALL LETTER I WITH HOOK ABOVE", 0x1ECA: "LATIN CAPITAL LETTER I WITH DOT BELOW", 0x1ECB: "LATIN SMALL LETTER I WITH DOT BELOW", 0x1ECC: "LATIN CAPITAL LETTER O WITH DOT BELOW", 0x1ECD: "LATIN SMALL LETTER O WITH DOT BELOW", 0x1ECE: "LATIN CAPITAL LETTER O WITH HOOK ABOVE", 0x1ECF: "LATIN SMALL LETTER O WITH HOOK ABOVE", 0x1ED0: "LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE", 0x1ED1: "LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE", 0x1ED2: "LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE", 0x1ED3: "LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE", 0x1ED4: "LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE", 0x1ED5: "LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE", 0x1ED6: "LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE", 0x1ED7: "LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE", 0x1ED8: "LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW", 0x1ED9: "LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW", 0x1EDA: "LATIN CAPITAL LETTER O WITH HORN AND ACUTE", 0x1EDB: "LATIN SMALL LETTER O WITH HORN AND ACUTE", 0x1EDC: "LATIN CAPITAL LETTER O WITH HORN AND GRAVE", 0x1EDD: "LATIN SMALL LETTER O WITH HORN AND GRAVE", 0x1EDE: "LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE", 0x1EDF: "LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE", 0x1EE0: "LATIN CAPITAL LETTER O WITH HORN AND TILDE", 0x1EE1: "LATIN SMALL LETTER O WITH HORN AND TILDE", 0x1EE2: "LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW", 0x1EE3: "LATIN SMALL LETTER O WITH HORN AND DOT BELOW", 0x1EE4: "LATIN CAPITAL LETTER U WITH DOT BELOW", 0x1EE5: "LATIN SMALL LETTER U WITH DOT BELOW", 0x1EE6: "LATIN CAPITAL LETTER U WITH HOOK ABOVE", 0x1EE7: "LATIN SMALL LETTER U WITH HOOK ABOVE", 0x1EE8: "LATIN CAPITAL LETTER U WITH HORN AND ACUTE", 0x1EE9: "LATIN SMALL LETTER U WITH HORN AND ACUTE", 0x1EEA: "LATIN CAPITAL LETTER U WITH HORN AND GRAVE", 0x1EEB: "LATIN SMALL LETTER U WITH HORN AND GRAVE", 0x1EEC: "LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE", 0x1EED: "LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE", 0x1EEE: "LATIN CAPITAL LETTER U WITH HORN AND TILDE", 0x1EEF: "LATIN SMALL LETTER U WITH HORN AND TILDE", 0x1EF0: "LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW", 0x1EF1: "LATIN SMALL LETTER U WITH HORN AND DOT BELOW", 0x1EF2: "LATIN CAPITAL LETTER Y WITH GRAVE", 0x1EF3: "LATIN SMALL LETTER Y WITH GRAVE", 0x1EF4: "LATIN CAPITAL LETTER Y WITH DOT BELOW", 0x1EF5: "LATIN SMALL LETTER Y WITH DOT BELOW", 0x1EF6: "LATIN CAPITAL LETTER Y WITH HOOK ABOVE", 0x1EF7: "LATIN SMALL LETTER Y WITH HOOK ABOVE", 0x1EF8: "LATIN CAPITAL LETTER Y WITH TILDE", 0x1EF9: "LATIN SMALL LETTER Y WITH TILDE", 0x1EFA: "LATIN CAPITAL LETTER MIDDLE-WELSH LL", 0x1EFB: "LATIN SMALL LETTER MIDDLE-WELSH LL", 0x1EFC: "LATIN CAPITAL LETTER MIDDLE-WELSH V", 0x1EFD: "LATIN SMALL LETTER MIDDLE-WELSH V", 0x1EFE: "LATIN CAPITAL LETTER Y WITH LOOP", 0x1EFF: "LATIN SMALL LETTER Y WITH LOOP", 0x1F00: "GREEK SMALL LETTER ALPHA WITH PSILI", 0x1F01: "GREEK SMALL LETTER ALPHA WITH DASIA", 0x1F02: "GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA", 0x1F03: "GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA", 0x1F04: "GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA", 0x1F05: "GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA", 0x1F06: "GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI", 0x1F07: "GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI", 0x1F08: "GREEK CAPITAL LETTER ALPHA WITH PSILI", 0x1F09: "GREEK CAPITAL LETTER ALPHA WITH DASIA", 0x1F0A: "GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA", 0x1F0B: "GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA", 0x1F0C: "GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA", 0x1F0D: "GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA", 0x1F0E: "GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI", 0x1F0F: "GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI", 0x1F10: "GREEK SMALL LETTER EPSILON WITH PSILI", 0x1F11: "GREEK SMALL LETTER EPSILON WITH DASIA", 0x1F12: "GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA", 0x1F13: "GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA", 0x1F14: "GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA", 0x1F15: "GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA", 0x1F18: "GREEK CAPITAL LETTER EPSILON WITH PSILI", 0x1F19: "GREEK CAPITAL LETTER EPSILON WITH DASIA", 0x1F1A: "GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA", 0x1F1B: "GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA", 0x1F1C: "GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA", 0x1F1D: "GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA", 0x1F20: "GREEK SMALL LETTER ETA WITH PSILI", 0x1F21: "GREEK SMALL LETTER ETA WITH DASIA", 0x1F22: "GREEK SMALL LETTER ETA WITH PSILI AND VARIA", 0x1F23: "GREEK SMALL LETTER ETA WITH DASIA AND VARIA", 0x1F24: "GREEK SMALL LETTER ETA WITH PSILI AND OXIA", 0x1F25: "GREEK SMALL LETTER ETA WITH DASIA AND OXIA", 0x1F26: "GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI", 0x1F27: "GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI", 0x1F28: "GREEK CAPITAL LETTER ETA WITH PSILI", 0x1F29: "GREEK CAPITAL LETTER ETA WITH DASIA", 0x1F2A: "GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA", 0x1F2B: "GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA", 0x1F2C: "GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA", 0x1F2D: "GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA", 0x1F2E: "GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI", 0x1F2F: "GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI", 0x1F30: "GREEK SMALL LETTER IOTA WITH PSILI", 0x1F31: "GREEK SMALL LETTER IOTA WITH DASIA", 0x1F32: "GREEK SMALL LETTER IOTA WITH PSILI AND VARIA", 0x1F33: "GREEK SMALL LETTER IOTA WITH DASIA AND VARIA", 0x1F34: "GREEK SMALL LETTER IOTA WITH PSILI AND OXIA", 0x1F35: "GREEK SMALL LETTER IOTA WITH DASIA AND OXIA", 0x1F36: "GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI", 0x1F37: "GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI", 0x1F38: "GREEK CAPITAL LETTER IOTA WITH PSILI", 0x1F39: "GREEK CAPITAL LETTER IOTA WITH DASIA", 0x1F3A: "GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA", 0x1F3B: "GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA", 0x1F3C: "GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA", 0x1F3D: "GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA", 0x1F3E: "GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI", 0x1F3F: "GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI", 0x1F40: "GREEK SMALL LETTER OMICRON WITH PSILI", 0x1F41: "GREEK SMALL LETTER OMICRON WITH DASIA", 0x1F42: "GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA", 0x1F43: "GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA", 0x1F44: "GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA", 0x1F45: "GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA", 0x1F48: "GREEK CAPITAL LETTER OMICRON WITH PSILI", 0x1F49: "GREEK CAPITAL LETTER OMICRON WITH DASIA", 0x1F4A: "GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA", 0x1F4B: "GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA", 0x1F4C: "GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA", 0x1F4D: "GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA", 0x1F50: "GREEK SMALL LETTER UPSILON WITH PSILI", 0x1F51: "GREEK SMALL LETTER UPSILON WITH DASIA", 0x1F52: "GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA", 0x1F53: "GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA", 0x1F54: "GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA", 0x1F55: "GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA", 0x1F56: "GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI", 0x1F57: "GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI", 0x1F59: "GREEK CAPITAL LETTER UPSILON WITH DASIA", 0x1F5B: "GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA", 0x1F5D: "GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA", 0x1F5F: "GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI", 0x1F60: "GREEK SMALL LETTER OMEGA WITH PSILI", 0x1F61: "GREEK SMALL LETTER OMEGA WITH DASIA", 0x1F62: "GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA", 0x1F63: "GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA", 0x1F64: "GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA", 0x1F65: "GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA", 0x1F66: "GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI", 0x1F67: "GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI", 0x1F68: "GREEK CAPITAL LETTER OMEGA WITH PSILI", 0x1F69: "GREEK CAPITAL LETTER OMEGA WITH DASIA", 0x1F6A: "GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA", 0x1F6B: "GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA", 0x1F6C: "GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA", 0x1F6D: "GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA", 0x1F6E: "GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI", 0x1F6F: "GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI", 0x1F70: "GREEK SMALL LETTER ALPHA WITH VARIA", 0x1F71: "GREEK SMALL LETTER ALPHA WITH OXIA", 0x1F72: "GREEK SMALL LETTER EPSILON WITH VARIA", 0x1F73: "GREEK SMALL LETTER EPSILON WITH OXIA", 0x1F74: "GREEK SMALL LETTER ETA WITH VARIA", 0x1F75: "GREEK SMALL LETTER ETA WITH OXIA", 0x1F76: "GREEK SMALL LETTER IOTA WITH VARIA", 0x1F77: "GREEK SMALL LETTER IOTA WITH OXIA", 0x1F78: "GREEK SMALL LETTER OMICRON WITH VARIA", 0x1F79: "GREEK SMALL LETTER OMICRON WITH OXIA", 0x1F7A: "GREEK SMALL LETTER UPSILON WITH VARIA", 0x1F7B: "GREEK SMALL LETTER UPSILON WITH OXIA", 0x1F7C: "GREEK SMALL LETTER OMEGA WITH VARIA", 0x1F7D: "GREEK SMALL LETTER OMEGA WITH OXIA", 0x1F80: "GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI", 0x1F81: "GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI", 0x1F82: "GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI", 0x1F83: "GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI", 0x1F84: "GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI", 0x1F85: "GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI", 0x1F86: "GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI", 0x1F87: "GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI", 0x1F88: "GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI", 0x1F89: "GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI", 0x1F8A: "GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI", 0x1F8B: "GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI", 0x1F8C: "GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI", 0x1F8D: "GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI", 0x1F8E: "GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI", 0x1F8F: "GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI", 0x1F90: "GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI", 0x1F91: "GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI", 0x1F92: "GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI", 0x1F93: "GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI", 0x1F94: "GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI", 0x1F95: "GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI", 0x1F96: "GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI", 0x1F97: "GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI", 0x1F98: "GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI", 0x1F99: "GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI", 0x1F9A: "GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI", 0x1F9B: "GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI", 0x1F9C: "GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI", 0x1F9D: "GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI", 0x1F9E: "GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI", 0x1F9F: "GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI", 0x1FA0: "GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI", 0x1FA1: "GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI", 0x1FA2: "GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI", 0x1FA3: "GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI", 0x1FA4: "GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI", 0x1FA5: "GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI", 0x1FA6: "GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI", 0x1FA7: "GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI", 0x1FA8: "GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI", 0x1FA9: "GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI", 0x1FAA: "GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI", 0x1FAB: "GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI", 0x1FAC: "GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI", 0x1FAD: "GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI", 0x1FAE: "GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI", 0x1FAF: "GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI", 0x1FB0: "GREEK SMALL LETTER ALPHA WITH VRACHY", 0x1FB1: "GREEK SMALL LETTER ALPHA WITH MACRON", 0x1FB2: "GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI", 0x1FB3: "GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI", 0x1FB4: "GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI", 0x1FB6: "GREEK SMALL LETTER ALPHA WITH PERISPOMENI", 0x1FB7: "GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI", 0x1FB8: "GREEK CAPITAL LETTER ALPHA WITH VRACHY", 0x1FB9: "GREEK CAPITAL LETTER ALPHA WITH MACRON", 0x1FBA: "GREEK CAPITAL LETTER ALPHA WITH VARIA", 0x1FBB: "GREEK CAPITAL LETTER ALPHA WITH OXIA", 0x1FBC: "GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI", 0x1FBD: "GREEK KORONIS", 0x1FBE: "GREEK PROSGEGRAMMENI", 0x1FBF: "GREEK PSILI", 0x1FC0: "GREEK PERISPOMENI", 0x1FC1: "GREEK DIALYTIKA AND PERISPOMENI", 0x1FC2: "GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI", 0x1FC3: "GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI", 0x1FC4: "GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI", 0x1FC6: "GREEK SMALL LETTER ETA WITH PERISPOMENI", 0x1FC7: "GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI", 0x1FC8: "GREEK CAPITAL LETTER EPSILON WITH VARIA", 0x1FC9: "GREEK CAPITAL LETTER EPSILON WITH OXIA", 0x1FCA: "GREEK CAPITAL LETTER ETA WITH VARIA", 0x1FCB: "GREEK CAPITAL LETTER ETA WITH OXIA", 0x1FCC: "GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI", 0x1FCD: "GREEK PSILI AND VARIA", 0x1FCE: "GREEK PSILI AND OXIA", 0x1FCF: "GREEK PSILI AND PERISPOMENI", 0x1FD0: "GREEK SMALL LETTER IOTA WITH VRACHY", 0x1FD1: "GREEK SMALL LETTER IOTA WITH MACRON", 0x1FD2: "GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA", 0x1FD3: "GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA", 0x1FD6: "GREEK SMALL LETTER IOTA WITH PERISPOMENI", 0x1FD7: "GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI", 0x1FD8: "GREEK CAPITAL LETTER IOTA WITH VRACHY", 0x1FD9: "GREEK CAPITAL LETTER IOTA WITH MACRON", 0x1FDA: "GREEK CAPITAL LETTER IOTA WITH VARIA", 0x1FDB: "GREEK CAPITAL LETTER IOTA WITH OXIA", 0x1FDD: "GREEK DASIA AND VARIA", 0x1FDE: "GREEK DASIA AND OXIA", 0x1FDF: "GREEK DASIA AND PERISPOMENI", 0x1FE0: "GREEK SMALL LETTER UPSILON WITH VRACHY", 0x1FE1: "GREEK SMALL LETTER UPSILON WITH MACRON", 0x1FE2: "GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA", 0x1FE3: "GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA", 0x1FE4: "GREEK SMALL LETTER RHO WITH PSILI", 0x1FE5: "GREEK SMALL LETTER RHO WITH DASIA", 0x1FE6: "GREEK SMALL LETTER UPSILON WITH PERISPOMENI", 0x1FE7: "GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI", 0x1FE8: "GREEK CAPITAL LETTER UPSILON WITH VRACHY", 0x1FE9: "GREEK CAPITAL LETTER UPSILON WITH MACRON", 0x1FEA: "GREEK CAPITAL LETTER UPSILON WITH VARIA", 0x1FEB: "GREEK CAPITAL LETTER UPSILON WITH OXIA", 0x1FEC: "GREEK CAPITAL LETTER RHO WITH DASIA", 0x1FED: "GREEK DIALYTIKA AND VARIA", 0x1FEE: "GREEK DIALYTIKA AND OXIA", 0x1FEF: "GREEK VARIA", 0x1FF2: "GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI", 0x1FF3: "GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI", 0x1FF4: "GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI", 0x1FF6: "GREEK SMALL LETTER OMEGA WITH PERISPOMENI", 0x1FF7: "GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI", 0x1FF8: "GREEK CAPITAL LETTER OMICRON WITH VARIA", 0x1FF9: "GREEK CAPITAL LETTER OMICRON WITH OXIA", 0x1FFA: "GREEK CAPITAL LETTER OMEGA WITH VARIA", 0x1FFB: "GREEK CAPITAL LETTER OMEGA WITH OXIA", 0x1FFC: "GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI", 0x1FFD: "GREEK OXIA", 0x1FFE: "GREEK DASIA", 0x2000: "EN QUAD", 0x2001: "EM QUAD", 0x2002: "EN SPACE", 0x2003: "EM SPACE", 0x2004: "THREE-PER-EM SPACE", 0x2005: "FOUR-PER-EM SPACE", 0x2006: "SIX-PER-EM SPACE", 0x2007: "FIGURE SPACE", 0x2008: "PUNCTUATION SPACE", 0x2009: "THIN SPACE", 0x200A: "HAIR SPACE", 0x200B: "ZERO WIDTH SPACE", 0x200C: "ZERO WIDTH NON-JOINER", 0x200D: "ZERO WIDTH JOINER", 0x200E: "LEFT-TO-RIGHT MARK", 0x200F: "RIGHT-TO-LEFT MARK", 0x2010: "HYPHEN", 0x2011: "NON-BREAKING HYPHEN", 0x2012: "FIGURE DASH", 0x2013: "EN DASH", 0x2014: "EM DASH", 0x2015: "HORIZONTAL BAR", 0x2016: "DOUBLE VERTICAL LINE", 0x2017: "DOUBLE LOW LINE", 0x2018: "LEFT SINGLE QUOTATION MARK", 0x2019: "RIGHT SINGLE QUOTATION MARK", 0x201A: "SINGLE LOW-9 QUOTATION MARK", 0x201B: "SINGLE HIGH-REVERSED-9 QUOTATION MARK", 0x201C: "LEFT DOUBLE QUOTATION MARK", 0x201D: "RIGHT DOUBLE QUOTATION MARK", 0x201E: "DOUBLE LOW-9 QUOTATION MARK", 0x201F: "DOUBLE HIGH-REVERSED-9 QUOTATION MARK", 0x2020: "DAGGER", 0x2021: "DOUBLE DAGGER", 0x2022: "BULLET", 0x2023: "TRIANGULAR BULLET", 0x2024: "ONE DOT LEADER", 0x2025: "TWO DOT LEADER", 0x2026: "HORIZONTAL ELLIPSIS", 0x2027: "HYPHENATION POINT", 0x2028: "LINE SEPARATOR", 0x2029: "PARAGRAPH SEPARATOR", 0x202A: "LEFT-TO-RIGHT EMBEDDING", 0x202B: "RIGHT-TO-LEFT EMBEDDING", 0x202C: "POP DIRECTIONAL FORMATTING", 0x202D: "LEFT-TO-RIGHT OVERRIDE", 0x202E: "RIGHT-TO-LEFT OVERRIDE", 0x202F: "NARROW NO-BREAK SPACE", 0x2030: "PER MILLE SIGN", 0x2031: "PER TEN THOUSAND SIGN", 0x2032: "PRIME", 0x2033: "DOUBLE PRIME", 0x2034: "TRIPLE PRIME", 0x2035: "REVERSED PRIME", 0x2036: "REVERSED DOUBLE PRIME", 0x2037: "REVERSED TRIPLE PRIME", 0x2038: "CARET", 0x2039: "SINGLE LEFT-POINTING ANGLE QUOTATION MARK", 0x203A: "SINGLE RIGHT-POINTING ANGLE QUOTATION MARK", 0x203B: "REFERENCE MARK", 0x203C: "DOUBLE EXCLAMATION MARK", 0x203D: "INTERROBANG", 0x203E: "OVERLINE", 0x203F: "UNDERTIE (Enotikon)", 0x2040: "CHARACTER TIE", 0x2041: "CARET INSERTION POINT", 0x2042: "ASTERISM", 0x2043: "HYPHEN BULLET", 0x2044: "FRACTION SLASH", 0x2045: "LEFT SQUARE BRACKET WITH QUILL", 0x2046: "RIGHT SQUARE BRACKET WITH QUILL", 0x2047: "DOUBLE QUESTION MARK", 0x2048: "QUESTION EXCLAMATION MARK", 0x2049: "EXCLAMATION QUESTION MARK", 0x204A: "TIRONIAN SIGN ET", 0x204B: "REVERSED PILCROW SIGN", 0x204C: "BLACK LEFTWARDS BULLET", 0x204D: "BLACK RIGHTWARDS BULLET", 0x204E: "LOW ASTERISK", 0x204F: "REVERSED SEMICOLON", 0x2050: "CLOSE UP", 0x2051: "TWO ASTERISKS ALIGNED VERTICALLY", 0x2052: "COMMERCIAL MINUS SIGN", 0x2053: "SWUNG DASH", 0x2054: "INVERTED UNDERTIE", 0x2055: "FLOWER PUNCTUATION MARK", 0x2056: "THREE DOT PUNCTUATION", 0x2057: "QUADRUPLE PRIME", 0x2058: "FOUR DOT PUNCTUATION", 0x2059: "FIVE DOT PUNCTUATION", 0x205A: "TWO DOT PUNCTUATION", 0x205B: "FOUR DOT MARK", 0x205C: "DOTTED CROSS", 0x205D: "TRICOLON", 0x205E: "VERTICAL FOUR DOTS", 0x205F: "MEDIUM MATHEMATICAL SPACE", 0x2060: "WORD JOINER", 0x2061: "FUNCTION APPLICATION", 0x2062: "INVISIBLE TIMES", 0x2063: "INVISIBLE SEPARATOR", 0x2064: "INVISIBLE PLUS", 0x206A: "INHIBIT SYMMETRIC SWAPPING", 0x206B: "ACTIVATE SYMMETRIC SWAPPING", 0x206C: "INHIBIT ARABIC FORM SHAPING", 0x206D: "ACTIVATE ARABIC FORM SHAPING", 0x206E: "NATIONAL DIGIT SHAPES", 0x206F: "NOMINAL DIGIT SHAPES", 0x2070: "SUPERSCRIPT ZERO", 0x2071: "SUPERSCRIPT LATIN SMALL LETTER I", 0x2072: "", 0x2073: "", 0x2074: "SUPERSCRIPT FOUR", 0x2075: "SUPERSCRIPT FIVE", 0x2076: "SUPERSCRIPT SIX", 0x2077: "SUPERSCRIPT SEVEN", 0x2078: "SUPERSCRIPT EIGHT", 0x2079: "SUPERSCRIPT NINE", 0x207A: "SUPERSCRIPT PLUS SIGN", 0x207B: "SUPERSCRIPT MINUS", 0x207C: "SUPERSCRIPT EQUALS SIGN", 0x207D: "SUPERSCRIPT LEFT PARENTHESIS", 0x207E: "SUPERSCRIPT RIGHT PARENTHESIS", 0x207F: "SUPERSCRIPT LATIN SMALL LETTER N", 0x2080: "SUBSCRIPT ZERO", 0x2081: "SUBSCRIPT ONE", 0x2082: "SUBSCRIPT TWO", 0x2083: "SUBSCRIPT THREE", 0x2084: "SUBSCRIPT FOUR", 0x2085: "SUBSCRIPT FIVE", 0x2086: "SUBSCRIPT SIX", 0x2087: "SUBSCRIPT SEVEN", 0x2088: "SUBSCRIPT EIGHT", 0x2089: "SUBSCRIPT NINE", 0x208A: "SUBSCRIPT PLUS SIGN", 0x208B: "SUBSCRIPT MINUS", 0x208C: "SUBSCRIPT EQUALS SIGN", 0x208D: "SUBSCRIPT LEFT PARENTHESIS", 0x208E: "SUBSCRIPT RIGHT PARENTHESIS", 0x2090: "LATIN SUBSCRIPT SMALL LETTER A", 0x2091: "LATIN SUBSCRIPT SMALL LETTER E", 0x2092: "LATIN SUBSCRIPT SMALL LETTER O", 0x2093: "LATIN SUBSCRIPT SMALL LETTER X", 0x2094: "LATIN SUBSCRIPT SMALL LETTER SCHWA", 0x20A0: "EURO-CURRENCY SIGN", 0x20A1: "COLON SIGN", 0x20A2: "CRUZEIRO SIGN", 0x20A3: "FRENCH FRANC SIGN", 0x20A4: "LIRA SIGN", 0x20A5: "MILL SIGN", 0x20A6: "NAIRA SIGN", 0x20A7: "PESETA SIGN", 0x20A8: "RUPEE SIGN", 0x20A9: "WON SIGN", 0x20AA: "NEW SHEQEL SIGN", 0x20AB: "DONG SIGN", 0x20AC: "EURO SIGN", 0x20AD: "KIP SIGN", 0x20AE: "TUGRIK SIGN", 0x20AF: "DRACHMA SIGN", 0x20B0: "GERMAN PENNY SIGN", 0x20B1: "PESO SIGN", 0x20B2: "GUARANI SIGN", 0x20B3: "AUSTRAL SIGN", 0x20B4: "HRYVNIA SIGN", 0x20B5: "CEDI SIGN", 0x20D0: "COMBINING LEFT HARPOON ABOVE", 0x20D1: "COMBINING RIGHT HARPOON ABOVE", 0x20D2: "COMBINING LONG VERTICAL LINE OVERLAY", 0x20D3: "COMBINING SHORT VERTICAL LINE OVERLAY", 0x20D4: "COMBINING ANTICLOCKWISE ARROW ABOVE", 0x20D5: "COMBINING CLOCKWISE ARROW ABOVE", 0x20D6: "COMBINING LEFT ARROW ABOVE", 0x20D7: "COMBINING RIGHT ARROW ABOVE", 0x20D8: "COMBINING RING OVERLAY", 0x20D9: "COMBINING CLOCKWISE RING OVERLAY", 0x20DA: "COMBINING ANTICLOCKWISE RING OVERLAY", 0x20DB: "COMBINING THREE DOTS ABOVE", 0x20DC: "COMBINING FOUR DOTS ABOVE", 0x20DD: "COMBINING ENCLOSING CIRCLE", 0x20DE: "COMBINING ENCLOSING SQUARE", 0x20DF: "COMBINING ENCLOSING DIAMOND", 0x20E0: "COMBINING ENCLOSING CIRCLE BACKSLASH", 0x20E1: "COMBINING LEFT RIGHT ARROW ABOVE", 0x20E2: "COMBINING ENCLOSING SCREEN", 0x20E3: "COMBINING ENCLOSING KEYCAP", 0x20E4: "COMBINING ENCLOSING UPWARD POINTING TRIANGLE", 0x20E5: "COMBINING REVERSE SOLIDUS OVERLAY", 0x20E6: "COMBINING DOUBLE VERTICAL STROKE OVERLAY", 0x20E7: "COMBINING ANNUITY SYMBOL", 0x20E8: "COMBINING TRIPLE UNDERDOT", 0x20E9: "COMBINING WIDE BRIDGE ABOVE", 0x20EA: "COMBINING LEFTWARDS ARROW OVERLAY", 0x20EB: "COMBINING LONG DOUBLE SOLIDUS OVERLAY", 0x20EC: "COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS", 0x20ED: "COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS", 0x20EE: "COMBINING LEFT ARROW BELOW", 0x20EF: "COMBINING RIGHT ARROW BELOW", 0x20F0: "COMBINING ASTERISK ABOVE", 0x2100: "ACCOUNT OF", 0x2101: "ADDRESSED TO THE SUBJECT", 0x2102: "DOUBLE-STRUCK CAPITAL C", 0x2103: "DEGREE CELSIUS", 0x2104: "CENTRE LINE SYMBOL", 0x2105: "CARE OF", 0x2106: "CADA UNA", 0x2107: "EULER CONSTANT", 0x2108: "SCRUPLE", 0x2109: "DEGREE FAHRENHEIT", 0x210A: "SCRIPT SMALL G", 0x210B: "SCRIPT CAPITAL H", 0x210C: "BLACK-LETTER CAPITAL H", 0x210D: "DOUBLE-STRUCK CAPITAL H", 0x210E: "PLANCK CONSTANT", 0x210F: "PLANCK CONSTANT OVER TWO PI", 0x2110: "SCRIPT CAPITAL I", 0x2111: "BLACK-LETTER CAPITAL I", 0x2112: "SCRIPT CAPITAL L", 0x2113: "SCRIPT SMALL L", 0x2114: "L B BAR SYMBOL", 0x2115: "DOUBLE-STRUCK CAPITAL N", 0x2116: "NUMERO SIGN", 0x2117: "SOUND RECORDING COPYRIGHT", 0x2118: "SCRIPT CAPITAL P", 0x2119: "DOUBLE-STRUCK CAPITAL P", 0x211A: "DOUBLE-STRUCK CAPITAL Q", 0x211B: "SCRIPT CAPITAL R", 0x211C: "BLACK-LETTER CAPITAL R", 0x211D: "DOUBLE-STRUCK CAPITAL R", 0x211E: "PRESCRIPTION TAKE", 0x211F: "RESPONSE", 0x2120: "SERVICE MARK", 0x2121: "TELEPHONE SIGN", 0x2122: "TRADE MARK SIGN", 0x2123: "VERSICLE", 0x2124: "DOUBLE-STRUCK CAPITAL Z", 0x2125: "OUNCE SIGN", 0x2126: "OHM SIGN", 0x2127: "INVERTED OHM SIGN", 0x2128: "BLACK-LETTER CAPITAL Z", 0x2129: "TURNED GREEK SMALL LETTER IOTA", 0x212A: "KELVIN SIGN", 0x212B: "ANGSTROM SIGN", 0x212C: "SCRIPT CAPITAL B", 0x212D: "BLACK-LETTER CAPITAL C", 0x212E: "ESTIMATED SYMBOL", 0x212F: "SCRIPT SMALL E", 0x2130: "SCRIPT CAPITAL E", 0x2131: "SCRIPT CAPITAL F", 0x2132: "TURNED CAPITAL F", 0x2133: "SCRIPT CAPITAL M", 0x2134: "SCRIPT SMALL O", 0x2135: "ALEF SYMBOL", 0x2136: "BET SYMBOL", 0x2137: "GIMEL SYMBOL", 0x2138: "DALET SYMBOL", 0x2139: "INFORMATION SOURCE", 0x213A: "ROTATED CAPITAL Q", 0x213B: "FACSIMILE SIGN", 0x213C: "DOUBLE-STRUCK SMALL PI", 0x213D: "DOUBLE-STRUCK SMALL GAMMA", 0x213E: "DOUBLE-STRUCK CAPITAL GAMMA", 0x213F: "DOUBLE-STRUCK CAPITAL PI", 0x2140: "DOUBLE-STRUCK N-ARY SUMMATION", 0x2141: "TURNED SANS-SERIF CAPITAL G", 0x2142: "TURNED SANS-SERIF CAPITAL L", 0x2143: "REVERSED SANS-SERIF CAPITAL L", 0x2144: "TURNED SANS-SERIF CAPITAL Y", 0x2145: "DOUBLE-STRUCK ITALIC CAPITAL D", 0x2146: "DOUBLE-STRUCK ITALIC SMALL D", 0x2147: "DOUBLE-STRUCK ITALIC SMALL E", 0x2148: "DOUBLE-STRUCK ITALIC SMALL I", 0x2149: "DOUBLE-STRUCK ITALIC SMALL J", 0x214A: "PROPERTY LINE", 0x214B: "TURNED AMPERSAND", 0x214C: "PER SIGN", 0x214D: "AKTIESELSKAB", 0x214E: "TURNED SMALL F", 0x214F: "SYMBOL FOR SAMARITAN SOURCE", 0x2153: "VULGAR FRACTION ONE THIRD", 0x2154: "VULGAR FRACTION TWO THIRDS", 0x2155: "VULGAR FRACTION ONE FIFTH", 0x2156: "VULGAR FRACTION TWO FIFTHS", 0x2157: "VULGAR FRACTION THREE FIFTHS", 0x2158: "VULGAR FRACTION FOUR FIFTHS", 0x2159: "VULGAR FRACTION ONE SIXTH", 0x215A: "VULGAR FRACTION FIVE SIXTHS", 0x215B: "VULGAR FRACTION ONE EIGHTH", 0x215C: "VULGAR FRACTION THREE EIGHTHS", 0x215D: "VULGAR FRACTION FIVE EIGHTHS", 0x215E: "VULGAR FRACTION SEVEN EIGHTHS", 0x215F: "FRACTION NUMERATOR ONE", 0x2160: "ROMAN NUMERAL ONE", 0x2161: "ROMAN NUMERAL TWO", 0x2162: "ROMAN NUMERAL THREE", 0x2163: "ROMAN NUMERAL FOUR", 0x2164: "ROMAN NUMERAL FIVE", 0x2165: "ROMAN NUMERAL SIX", 0x2166: "ROMAN NUMERAL SEVEN", 0x2167: "ROMAN NUMERAL EIGHT", 0x2168: "ROMAN NUMERAL NINE", 0x2169: "ROMAN NUMERAL TEN", 0x216A: "ROMAN NUMERAL ELEVEN", 0x216B: "ROMAN NUMERAL TWELVE", 0x216C: "ROMAN NUMERAL FIFTY", 0x216D: "ROMAN NUMERAL ONE HUNDRED", 0x216E: "ROMAN NUMERAL FIVE HUNDRED", 0x216F: "ROMAN NUMERAL ONE THOUSAND", 0x2170: "SMALL ROMAN NUMERAL ONE", 0x2171: "SMALL ROMAN NUMERAL TWO", 0x2172: "SMALL ROMAN NUMERAL THREE", 0x2173: "SMALL ROMAN NUMERAL FOUR", 0x2174: "SMALL ROMAN NUMERAL FIVE", 0x2175: "SMALL ROMAN NUMERAL SIX", 0x2176: "SMALL ROMAN NUMERAL SEVEN", 0x2177: "SMALL ROMAN NUMERAL EIGHT", 0x2178: "SMALL ROMAN NUMERAL NINE", 0x2179: "SMALL ROMAN NUMERAL TEN", 0x217A: "SMALL ROMAN NUMERAL ELEVEN", 0x217B: "SMALL ROMAN NUMERAL TWELVE", 0x217C: "SMALL ROMAN NUMERAL FIFTY", 0x217D: "SMALL ROMAN NUMERAL ONE HUNDRED", 0x217E: "SMALL ROMAN NUMERAL FIVE HUNDRED", 0x217F: "SMALL ROMAN NUMERAL ONE THOUSAND", 0x2180: "ROMAN NUMERAL ONE THOUSAND C D", 0x2181: "ROMAN NUMERAL FIVE THOUSAND", 0x2182: "ROMAN NUMERAL TEN THOUSAND", 0x2183: "ROMAN NUMERAL REVERSED ONE HUNDRED", 0x2184: "LATIN SMALL LETTER REVERSED C", 0x2185: "ROMAN NUMERAL SIX LATE FORM", 0x2186: "ROMAN NUMERAL FIFTY EARLY FORM", 0x2187: "ROMAN NUMERAL FIFTY THOUSAND", 0x2188: "ROMAN NUMERAL ONE HUNDRED THOUSAND", 0x2190: "LEFTWARDS ARROW", 0x2191: "UPWARDS ARROW", 0x2192: "RIGHTWARDS ARROW", 0x2193: "DOWNWARDS ARROW", 0x2194: "LEFT RIGHT ARROW", 0x2195: "UP DOWN ARROW", 0x2196: "NORTH WEST ARROW", 0x2197: "NORTH EAST ARROW", 0x2198: "SOUTH EAST ARROW", 0x2199: "SOUTH WEST ARROW", 0x219A: "LEFTWARDS ARROW WITH STROKE", 0x219B: "RIGHTWARDS ARROW WITH STROKE", 0x219C: "LEFTWARDS WAVE ARROW", 0x219D: "RIGHTWARDS WAVE ARROW", 0x219E: "LEFTWARDS TWO HEADED ARROW", 0x219F: "UPWARDS TWO HEADED ARROW", 0x21A0: "RIGHTWARDS TWO HEADED ARROW", 0x21A1: "DOWNWARDS TWO HEADED ARROW", 0x21A2: "LEFTWARDS ARROW WITH TAIL", 0x21A3: "RIGHTWARDS ARROW WITH TAIL", 0x21A4: "LEFTWARDS ARROW FROM BAR", 0x21A5: "UPWARDS ARROW FROM BAR", 0x21A6: "RIGHTWARDS ARROW FROM BAR", 0x21A7: "DOWNWARDS ARROW FROM BAR", 0x21A8: "UP DOWN ARROW WITH BASE", 0x21A9: "LEFTWARDS ARROW WITH HOOK", 0x21AA: "RIGHTWARDS ARROW WITH HOOK", 0x21AB: "LEFTWARDS ARROW WITH LOOP", 0x21AC: "RIGHTWARDS ARROW WITH LOOP", 0x21AD: "LEFT RIGHT WAVE ARROW", 0x21AE: "LEFT RIGHT ARROW WITH STROKE", 0x21AF: "DOWNWARDS ZIGZAG ARROW", 0x21B0: "UPWARDS ARROW WITH TIP LEFTWARDS", 0x21B1: "UPWARDS ARROW WITH TIP RIGHTWARDS", 0x21B2: "DOWNWARDS ARROW WITH TIP LEFTWARDS", 0x21B3: "DOWNWARDS ARROW WITH TIP RIGHTWARDS", 0x21B4: "RIGHTWARDS ARROW WITH CORNER DOWNWARDS", 0x21B5: "DOWNWARDS ARROW WITH CORNER LEFTWARDS", 0x21B6: "ANTICLOCKWISE TOP SEMICIRCLE ARROW", 0x21B7: "CLOCKWISE TOP SEMICIRCLE ARROW", 0x21B8: "NORTH WEST ARROW TO LONG BAR", 0x21B9: "LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR", 0x21BA: "ANTICLOCKWISE OPEN CIRCLE ARROW", 0x21BB: "CLOCKWISE OPEN CIRCLE ARROW", 0x21BC: "LEFTWARDS HARPOON WITH BARB UPWARDS", 0x21BD: "LEFTWARDS HARPOON WITH BARB DOWNWARDS", 0x21BE: "UPWARDS HARPOON WITH BARB RIGHTWARDS", 0x21BF: "UPWARDS HARPOON WITH BARB LEFTWARDS", 0x21C0: "RIGHTWARDS HARPOON WITH BARB UPWARDS", 0x21C1: "RIGHTWARDS HARPOON WITH BARB DOWNWARDS", 0x21C2: "DOWNWARDS HARPOON WITH BARB RIGHTWARDS", 0x21C3: "DOWNWARDS HARPOON WITH BARB LEFTWARDS", 0x21C4: "RIGHTWARDS ARROW OVER LEFTWARDS ARROW", 0x21C5: "UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW", 0x21C6: "LEFTWARDS ARROW OVER RIGHTWARDS ARROW", 0x21C7: "LEFTWARDS PAIRED ARROWS", 0x21C8: "UPWARDS PAIRED ARROWS", 0x21C9: "RIGHTWARDS PAIRED ARROWS", 0x21CA: "DOWNWARDS PAIRED ARROWS", 0x21CB: "LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON", 0x21CC: "RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON", 0x21CD: "LEFTWARDS DOUBLE ARROW WITH STROKE", 0x21CE: "LEFT RIGHT DOUBLE ARROW WITH STROKE", 0x21CF: "RIGHTWARDS DOUBLE ARROW WITH STROKE", 0x21D0: "LEFTWARDS DOUBLE ARROW", 0x21D1: "UPWARDS DOUBLE ARROW", 0x21D2: "RIGHTWARDS DOUBLE ARROW", 0x21D3: "DOWNWARDS DOUBLE ARROW", 0x21D4: "LEFT RIGHT DOUBLE ARROW", 0x21D5: "UP DOWN DOUBLE ARROW", 0x21D6: "NORTH WEST DOUBLE ARROW", 0x21D7: "NORTH EAST DOUBLE ARROW", 0x21D8: "SOUTH EAST DOUBLE ARROW", 0x21D9: "SOUTH WEST DOUBLE ARROW", 0x21DA: "LEFTWARDS TRIPLE ARROW", 0x21DB: "RIGHTWARDS TRIPLE ARROW", 0x21DC: "LEFTWARDS SQUIGGLE ARROW", 0x21DD: "RIGHTWARDS SQUIGGLE ARROW", 0x21DE: "UPWARDS ARROW WITH DOUBLE STROKE", 0x21DF: "DOWNWARDS ARROW WITH DOUBLE STROKE", 0x21E0: "LEFTWARDS DASHED ARROW", 0x21E1: "UPWARDS DASHED ARROW", 0x21E2: "RIGHTWARDS DASHED ARROW", 0x21E3: "DOWNWARDS DASHED ARROW", 0x21E4: "LEFTWARDS ARROW TO BAR", 0x21E5: "RIGHTWARDS ARROW TO BAR", 0x21E6: "LEFTWARDS WHITE ARROW", 0x21E7: "UPWARDS WHITE ARROW", 0x21E8: "RIGHTWARDS WHITE ARROW", 0x21E9: "DOWNWARDS WHITE ARROW", 0x21EA: "UPWARDS WHITE ARROW FROM BAR", 0x21EB: "UPWARDS WHITE ARROW ON PEDESTAL", 0x21EC: "UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR", 0x21ED: "UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR", 0x21EE: "UPWARDS WHITE DOUBLE ARROW", 0x21EF: "UPWARDS WHITE DOUBLE ARROW ON PEDESTAL", 0x21F0: "RIGHTWARDS WHITE ARROW FROM WALL", 0x21F1: "NORTH WEST ARROW TO CORNER", 0x21F2: "SOUTH EAST ARROW TO CORNER", 0x21F3: "UP DOWN WHITE ARROW", 0x21F4: "RIGHT ARROW WITH SMALL CIRCLE", 0x21F5: "DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW", 0x21F6: "THREE RIGHTWARDS ARROWS", 0x21F7: "LEFTWARDS ARROW WITH VERTICAL STROKE", 0x21F8: "RIGHTWARDS ARROW WITH VERTICAL STROKE", 0x21F9: "LEFT RIGHT ARROW WITH VERTICAL STROKE", 0x21FA: "LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE", 0x21FB: "RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE", 0x21FC: "LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE", 0x21FD: "LEFTWARDS OPEN-HEADED ARROW", 0x21FE: "RIGHTWARDS OPEN-HEADED ARROW", 0x21FF: "LEFT RIGHT OPEN-HEADED ARROW", 0x2200: "FOR ALL", 0x2201: "COMPLEMENT", 0x2202: "PARTIAL DIFFERENTIAL", 0x2203: "THERE EXISTS", 0x2204: "THERE DOES NOT EXIST", 0x2205: "EMPTY SET", 0x2206: "INCREMENT", 0x2207: "NABLA", 0x2208: "ELEMENT OF", 0x2209: "NOT AN ELEMENT OF", 0x220A: "SMALL ELEMENT OF", 0x220B: "CONTAINS AS MEMBER", 0x220C: "DOES NOT CONTAIN AS MEMBER", 0x220D: "SMALL CONTAINS AS MEMBER", 0x220E: "END OF PROOF", 0x220F: "N-ARY PRODUCT", 0x2210: "N-ARY COPRODUCT", 0x2211: "N-ARY SUMMATION", 0x2212: "MINUS SIGN", 0x2213: "MINUS-OR-PLUS SIGN", 0x2214: "DOT PLUS", 0x2215: "DIVISION SLASH", 0x2216: "SET MINUS", 0x2217: "ASTERISK OPERATOR", 0x2218: "RING OPERATOR", 0x2219: "BULLET OPERATOR", 0x221A: "SQUARE ROOT", 0x221B: "CUBE ROOT", 0x221C: "FOURTH ROOT", 0x221D: "PROPORTIONAL TO", 0x221E: "INFINITY", 0x221F: "RIGHT ANGLE", 0x2220: "ANGLE", 0x2221: "MEASURED ANGLE", 0x2222: "SPHERICAL ANGLE", 0x2223: "DIVIDES", 0x2224: "DOES NOT DIVIDE", 0x2225: "PARALLEL TO", 0x2226: "NOT PARALLEL TO", 0x2227: "LOGICAL AND", 0x2228: "LOGICAL OR", 0x2229: "INTERSECTION", 0x222A: "UNION", 0x222B: "INTEGRAL", 0x222C: "DOUBLE INTEGRAL", 0x222D: "TRIPLE INTEGRAL", 0x222E: "CONTOUR INTEGRAL", 0x222F: "SURFACE INTEGRAL", 0x2230: "VOLUME INTEGRAL", 0x2231: "CLOCKWISE INTEGRAL", 0x2232: "CLOCKWISE CONTOUR INTEGRAL", 0x2233: "ANTICLOCKWISE CONTOUR INTEGRAL", 0x2234: "THEREFORE", 0x2235: "BECAUSE", 0x2236: "RATIO", 0x2237: "PROPORTION", 0x2238: "DOT MINUS", 0x2239: "EXCESS", 0x223A: "GEOMETRIC PROPORTION", 0x223B: "HOMOTHETIC", 0x223C: "TILDE OPERATOR", 0x223D: "REVERSED TILDE (lazy S)", 0x223E: "INVERTED LAZY S", 0x223F: "SINE WAVE", 0x2240: "WREATH PRODUCT", 0x2241: "NOT TILDE", 0x2242: "MINUS TILDE", 0x2243: "ASYMPTOTICALLY EQUAL TO", 0x2244: "NOT ASYMPTOTICALLY EQUAL TO", 0x2245: "APPROXIMATELY EQUAL TO", 0x2246: "APPROXIMATELY BUT NOT ACTUALLY EQUAL TO", 0x2247: "NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO", 0x2248: "ALMOST EQUAL TO", 0x2249: "NOT ALMOST EQUAL TO", 0x224A: "ALMOST EQUAL OR EQUAL TO", 0x224B: "TRIPLE TILDE", 0x224C: "ALL EQUAL TO", 0x224D: "EQUIVALENT TO", 0x224E: "GEOMETRICALLY EQUIVALENT TO", 0x224F: "DIFFERENCE BETWEEN", 0x2250: "APPROACHES THE LIMIT", 0x2251: "GEOMETRICALLY EQUAL TO", 0x2252: "APPROXIMATELY EQUAL TO OR THE IMAGE OF", 0x2253: "IMAGE OF OR APPROXIMATELY EQUAL TO", 0x2254: "COLON EQUALS", 0x2255: "EQUALS COLON", 0x2256: "RING IN EQUAL TO", 0x2257: "RING EQUAL TO", 0x2258: "CORRESPONDS TO", 0x2259: "ESTIMATES", 0x225A: "EQUIANGULAR TO", 0x225B: "STAR EQUALS", 0x225C: "DELTA EQUAL TO", 0x225D: "EQUAL TO BY DEFINITION", 0x225E: "MEASURED BY", 0x225F: "QUESTIONED EQUAL TO", 0x2260: "NOT EQUAL TO", 0x2261: "IDENTICAL TO", 0x2262: "NOT IDENTICAL TO", 0x2263: "STRICTLY EQUIVALENT TO", 0x2264: "LESS-THAN OR EQUAL TO", 0x2265: "GREATER-THAN OR EQUAL TO", 0x2266: "LESS-THAN OVER EQUAL TO", 0x2267: "GREATER-THAN OVER EQUAL TO", 0x2268: "LESS-THAN BUT NOT EQUAL TO", 0x2269: "GREATER-THAN BUT NOT EQUAL TO", 0x226A: "MUCH LESS-THAN", 0x226B: "MUCH GREATER-THAN", 0x226C: "BETWEEN", 0x226D: "NOT EQUIVALENT TO", 0x226E: "NOT LESS-THAN", 0x226F: "NOT GREATER-THAN", 0x2270: "NEITHER LESS-THAN NOR EQUAL TO", 0x2271: "NEITHER GREATER-THAN NOR EQUAL TO", 0x2272: "LESS-THAN OR EQUIVALENT TO", 0x2273: "GREATER-THAN OR EQUIVALENT TO", 0x2274: "NEITHER LESS-THAN NOR EQUIVALENT TO", 0x2275: "NEITHER GREATER-THAN NOR EQUIVALENT TO", 0x2276: "LESS-THAN OR GREATER-THAN", 0x2277: "GREATER-THAN OR LESS-THAN", 0x2278: "NEITHER LESS-THAN NOR GREATER-THAN", 0x2279: "NEITHER GREATER-THAN NOR LESS-THAN", 0x227A: "PRECEDES", 0x227B: "SUCCEEDS", 0x227C: "PRECEDES OR EQUAL TO", 0x227D: "SUCCEEDS OR EQUAL TO", 0x227E: "PRECEDES OR EQUIVALENT TO", 0x227F: "SUCCEEDS OR EQUIVALENT TO", 0x2280: "DOES NOT PRECEDE", 0x2281: "DOES NOT SUCCEED", 0x2282: "SUBSET OF", 0x2283: "SUPERSET OF", 0x2284: "NOT A SUBSET OF", 0x2285: "NOT A SUPERSET OF", 0x2286: "SUBSET OF OR EQUAL TO", 0x2287: "SUPERSET OF OR EQUAL TO", 0x2288: "NEITHER A SUBSET OF NOR EQUAL TO", 0x2289: "NEITHER A SUPERSET OF NOR EQUAL TO", 0x228A: "SUBSET OF WITH NOT EQUAL TO", 0x228B: "SUPERSET OF WITH NOT EQUAL TO", 0x228C: "MULTISET", 0x228D: "MULTISET MULTIPLICATION", 0x228E: "MULTISET UNION", 0x228F: "SQUARE IMAGE OF", 0x2290: "SQUARE ORIGINAL OF", 0x2291: "SQUARE IMAGE OF OR EQUAL TO", 0x2292: "SQUARE ORIGINAL OF OR EQUAL TO", 0x2293: "SQUARE CAP", 0x2294: "SQUARE CUP", 0x2295: "CIRCLED PLUS", 0x2296: "CIRCLED MINUS", 0x2297: "CIRCLED TIMES", 0x2298: "CIRCLED DIVISION SLASH", 0x2299: "CIRCLED DOT OPERATOR", 0x229A: "CIRCLED RING OPERATOR", 0x229B: "CIRCLED ASTERISK OPERATOR", 0x229C: "CIRCLED EQUALS", 0x229D: "CIRCLED DASH", 0x229E: "SQUARED PLUS", 0x229F: "SQUARED MINUS", 0x22A0: "SQUARED TIMES", 0x22A1: "SQUARED DOT OPERATOR", 0x22A2: "RIGHT TACK", 0x22A3: "LEFT TACK", 0x22A4: "DOWN TACK", 0x22A5: "UP TACK", 0x22A6: "ASSERTION", 0x22A7: "MODELS", 0x22A8: "TRUE", 0x22A9: "FORCES", 0x22AA: "TRIPLE VERTICAL BAR RIGHT TURNSTILE", 0x22AB: "DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE", 0x22AC: "DOES NOT PROVE", 0x22AD: "NOT TRUE", 0x22AE: "DOES NOT FORCE", 0x22AF: "NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE", 0x22B0: "PRECEDES UNDER RELATION", 0x22B1: "SUCCEEDS UNDER RELATION", 0x22B2: "NORMAL SUBGROUP OF", 0x22B3: "CONTAINS AS NORMAL SUBGROUP", 0x22B4: "NORMAL SUBGROUP OF OR EQUAL TO", 0x22B5: "CONTAINS AS NORMAL SUBGROUP OR EQUAL TO", 0x22B6: "ORIGINAL OF", 0x22B7: "IMAGE OF", 0x22B8: "MULTIMAP", 0x22B9: "HERMITIAN CONJUGATE MATRIX", 0x22BA: "INTERCALATE", 0x22BB: "XOR", 0x22BC: "NAND", 0x22BD: "NOR", 0x22BE: "RIGHT ANGLE WITH ARC", 0x22BF: "RIGHT TRIANGLE", 0x22C0: "N-ARY LOGICAL AND", 0x22C1: "N-ARY LOGICAL OR", 0x22C2: "N-ARY INTERSECTION", 0x22C3: "N-ARY UNION", 0x22C4: "DIAMOND OPERATOR", 0x22C5: "DOT OPERATOR", 0x22C6: "STAR OPERATOR", 0x22C7: "DIVISION TIMES", 0x22C8: "BOWTIE", 0x22C9: "LEFT NORMAL FACTOR SEMIDIRECT PRODUCT", 0x22CA: "RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT", 0x22CB: "LEFT SEMIDIRECT PRODUCT", 0x22CC: "RIGHT SEMIDIRECT PRODUCT", 0x22CD: "REVERSED TILDE EQUALS", 0x22CE: "CURLY LOGICAL OR", 0x22CF: "CURLY LOGICAL AND", 0x22D0: "DOUBLE SUBSET", 0x22D1: "DOUBLE SUPERSET", 0x22D2: "DOUBLE INTERSECTION", 0x22D3: "DOUBLE UNION", 0x22D4: "PITCHFORK", 0x22D5: "EQUAL AND PARALLEL TO", 0x22D6: "LESS-THAN WITH DOT", 0x22D7: "GREATER-THAN WITH DOT", 0x22D8: "VERY MUCH LESS-THAN", 0x22D9: "VERY MUCH GREATER-THAN", 0x22DA: "LESS-THAN EQUAL TO OR GREATER-THAN", 0x22DB: "GREATER-THAN EQUAL TO OR LESS-THAN", 0x22DC: "EQUAL TO OR LESS-THAN", 0x22DD: "EQUAL TO OR GREATER-THAN", 0x22DE: "EQUAL TO OR PRECEDES", 0x22DF: "EQUAL TO OR SUCCEEDS", 0x22E0: "DOES NOT PRECEDE OR EQUAL", 0x22E1: "DOES NOT SUCCEED OR EQUAL", 0x22E2: "NOT SQUARE IMAGE OF OR EQUAL TO", 0x22E3: "NOT SQUARE ORIGINAL OF OR EQUAL TO", 0x22E4: "SQUARE IMAGE OF OR NOT EQUAL TO", 0x22E5: "SQUARE ORIGINAL OF OR NOT EQUAL TO", 0x22E6: "LESS-THAN BUT NOT EQUIVALENT TO", 0x22E7: "GREATER-THAN BUT NOT EQUIVALENT TO", 0x22E8: "PRECEDES BUT NOT EQUIVALENT TO", 0x22E9: "SUCCEEDS BUT NOT EQUIVALENT TO", 0x22EA: "NOT NORMAL SUBGROUP OF", 0x22EB: "DOES NOT CONTAIN AS NORMAL SUBGROUP", 0x22EC: "NOT NORMAL SUBGROUP OF OR EQUAL TO", 0x22ED: "DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL", 0x22EE: "VERTICAL ELLIPSIS", 0x22EF: "MIDLINE HORIZONTAL ELLIPSIS", 0x22F0: "UP RIGHT DIAGONAL ELLIPSIS", 0x22F1: "DOWN RIGHT DIAGONAL ELLIPSIS", 0x22F2: "ELEMENT OF WITH LONG HORIZONTAL STROKE", 0x22F3: "ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE", 0x22F4: "SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE", 0x22F5: "ELEMENT OF WITH DOT ABOVE", 0x22F6: "ELEMENT OF WITH OVERBAR", 0x22F7: "SMALL ELEMENT OF WITH OVERBAR", 0x22F8: "ELEMENT OF WITH UNDERBAR", 0x22F9: "ELEMENT OF WITH TWO HORIZONTAL STROKES", 0x22FA: "CONTAINS WITH LONG HORIZONTAL STROKE", 0x22FB: "CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE", 0x22FC: "SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE", 0x22FD: "CONTAINS WITH OVERBAR", 0x22FE: "SMALL CONTAINS WITH OVERBAR", 0x22FF: "Z NOTATION BAG MEMBERSHIP", 0x2300: "DIAMETER SIGN", 0x2301: "ELECTRIC ARROW", 0x2302: "HOUSE", 0x2303: "UP ARROWHEAD", 0x2304: "DOWN ARROWHEAD", 0x2305: "PROJECTIVE", 0x2306: "PERSPECTIVE", 0x2307: "WAVY LINE", 0x2308: "LEFT CEILING", 0x2309: "RIGHT CEILING", 0x230A: "LEFT FLOOR", 0x230B: "RIGHT FLOOR", 0x230C: "BOTTOM RIGHT CROP", 0x230D: "BOTTOM LEFT CROP", 0x230E: "TOP RIGHT CROP", 0x230F: "TOP LEFT CROP", 0x2310: "REVERSED NOT SIGN", 0x2311: "SQUARE LOZENGE", 0x2312: "ARC", 0x2313: "SEGMENT", 0x2314: "SECTOR", 0x2315: "TELEPHONE RECORDER", 0x2316: "POSITION INDICATOR", 0x2317: "VIEWDATA SQUARE", 0x2318: "PLACE OF INTEREST SIGN", 0x2319: "TURNED NOT SIGN", 0x231A: "WATCH", 0x231B: "HOURGLASS", 0x231C: "TOP LEFT CORNER", 0x231D: "TOP RIGHT CORNER", 0x231E: "BOTTOM LEFT CORNER", 0x231F: "BOTTOM RIGHT CORNER", 0x2320: "TOP HALF INTEGRAL", 0x2321: "BOTTOM HALF INTEGRAL", 0x2322: "FROWN", 0x2323: "SMILE", 0x2324: "UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS", 0x2325: "OPTION KEY", 0x2326: "ERASE TO THE RIGHT", 0x2327: "X IN A RECTANGLE BOX", 0x2328: "KEYBOARD", 0x2329: "LEFT-POINTING ANGLE BRACKET", 0x232A: "RIGHT-POINTING ANGLE BRACKET", 0x232B: "ERASE TO THE LEFT", 0x232C: "BENZENE RING", 0x232D: "CYLINDRICITY", 0x232E: "ALL AROUND-PROFILE", 0x232F: "SYMMETRY", 0x2330: "TOTAL RUNOUT", 0x2331: "DIMENSION ORIGIN", 0x2332: "CONICAL TAPER", 0x2333: "SLOPE", 0x2334: "COUNTERBORE", 0x2335: "COUNTERSINK", 0x2336: "APL FUNCTIONAL SYMBOL I-BEAM", 0x2337: "APL FUNCTIONAL SYMBOL SQUISH QUAD", 0x2338: "APL FUNCTIONAL SYMBOL QUAD EQUAL", 0x2339: "APL FUNCTIONAL SYMBOL QUAD DIVIDE", 0x233A: "APL FUNCTIONAL SYMBOL QUAD DIAMOND", 0x233B: "APL FUNCTIONAL SYMBOL QUAD JOT", 0x233C: "APL FUNCTIONAL SYMBOL QUAD CIRCLE", 0x233D: "APL FUNCTIONAL SYMBOL CIRCLE STILE", 0x233E: "APL FUNCTIONAL SYMBOL CIRCLE JOT", 0x233F: "APL FUNCTIONAL SYMBOL SLASH BAR", 0x2340: "APL FUNCTIONAL SYMBOL BACKSLASH BAR", 0x2341: "APL FUNCTIONAL SYMBOL QUAD SLASH", 0x2342: "APL FUNCTIONAL SYMBOL QUAD BACKSLASH", 0x2343: "APL FUNCTIONAL SYMBOL QUAD LESS-THAN", 0x2344: "APL FUNCTIONAL SYMBOL QUAD GREATER-THAN", 0x2345: "APL FUNCTIONAL SYMBOL LEFTWARDS VANE", 0x2346: "APL FUNCTIONAL SYMBOL RIGHTWARDS VANE", 0x2347: "APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW", 0x2348: "APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW", 0x2349: "APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH", 0x234A: "APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR *", 0x234B: "APL FUNCTIONAL SYMBOL DELTA STILE", 0x234C: "APL FUNCTIONAL SYMBOL QUAD DOWN CARET", 0x234D: "APL FUNCTIONAL SYMBOL QUAD DELTA", 0x234E: "APL FUNCTIONAL SYMBOL DOWN TACK JOT *", 0x234F: "APL FUNCTIONAL SYMBOL UPWARDS VANE", 0x2350: "APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW", 0x2351: "APL FUNCTIONAL SYMBOL UP TACK OVERBAR *", 0x2352: "APL FUNCTIONAL SYMBOL DEL STILE", 0x2353: "APL FUNCTIONAL SYMBOL QUAD UP CARET", 0x2354: "APL FUNCTIONAL SYMBOL QUAD DEL", 0x2355: "APL FUNCTIONAL SYMBOL UP TACK JOT *", 0x2356: "APL FUNCTIONAL SYMBOL DOWNWARDS VANE", 0x2357: "APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW", 0x2358: "APL FUNCTIONAL SYMBOL QUOTE UNDERBAR", 0x2359: "APL FUNCTIONAL SYMBOL DELTA UNDERBAR", 0x235A: "APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR", 0x235B: "APL FUNCTIONAL SYMBOL JOT UNDERBAR", 0x235C: "APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR", 0x235D: "APL FUNCTIONAL SYMBOL UP SHOE JOT", 0x235E: "APL FUNCTIONAL SYMBOL QUOTE QUAD", 0x235F: "APL FUNCTIONAL SYMBOL CIRCLE STAR", 0x2360: "APL FUNCTIONAL SYMBOL QUAD COLON", 0x2361: "APL FUNCTIONAL SYMBOL UP TACK DIAERESIS *", 0x2362: "APL FUNCTIONAL SYMBOL DEL DIAERESIS", 0x2363: "APL FUNCTIONAL SYMBOL STAR DIAERESIS", 0x2364: "APL FUNCTIONAL SYMBOL JOT DIAERESIS", 0x2365: "APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS", 0x2366: "APL FUNCTIONAL SYMBOL DOWN SHOE STILE", 0x2367: "APL FUNCTIONAL SYMBOL LEFT SHOE STILE", 0x2368: "APL FUNCTIONAL SYMBOL TILDE DIAERESIS", 0x2369: "APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS", 0x236A: "APL FUNCTIONAL SYMBOL COMMA BAR", 0x236B: "APL FUNCTIONAL SYMBOL DEL TILDE", 0x236C: "APL FUNCTIONAL SYMBOL ZILDE", 0x236D: "APL FUNCTIONAL SYMBOL STILE TILDE", 0x236E: "APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR", 0x236F: "APL FUNCTIONAL SYMBOL QUAD NOT EQUAL", 0x2370: "APL FUNCTIONAL SYMBOL QUAD QUESTION", 0x2371: "APL FUNCTIONAL SYMBOL DOWN CARET TILDE", 0x2372: "APL FUNCTIONAL SYMBOL UP CARET TILDE", 0x2373: "APL FUNCTIONAL SYMBOL IOTA", 0x2374: "APL FUNCTIONAL SYMBOL RHO", 0x2375: "APL FUNCTIONAL SYMBOL OMEGA", 0x2376: "APL FUNCTIONAL SYMBOL ALPHA UNDERBAR", 0x2377: "APL FUNCTIONAL SYMBOL EPSILON UNDERBAR", 0x2378: "APL FUNCTIONAL SYMBOL IOTA UNDERBAR", 0x2379: "APL FUNCTIONAL SYMBOL OMEGA UNDERBAR", 0x237A: "APL FUNCTIONAL SYMBOL ALPHA", 0x237B: "NOT CHECK MARK", 0x237C: "RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW", 0x237D: "SHOULDERED OPEN BOX", 0x237E: "BELL SYMBOL", 0x237F: "VERTICAL LINE WITH MIDDLE DOT", 0x2380: "INSERTION SYMBOL", 0x2381: "CONTINUOUS UNDERLINE SYMBOL", 0x2382: "DISCONTINUOUS UNDERLINE SYMBOL", 0x2383: "EMPHASIS SYMBOL", 0x2384: "COMPOSITION SYMBOL", 0x2385: "WHITE SQUARE WITH CENTRE VERTICAL LINE", 0x2386: "ENTER SYMBOL", 0x2387: "ALTERNATIVE KEY SYMBOL", 0x2388: "HELM SYMBOL", 0x2389: "CIRCLED HORIZONTAL BAR WITH NOTCH (pause)", 0x238A: "CIRCLED TRIANGLE DOWN (break)", 0x238B: "BROKEN CIRCLE WITH NORTHWEST ARROW (escape)", 0x238C: "UNDO SYMBOL", 0x238D: "MONOSTABLE SYMBOL", 0x238E: "HYSTERESIS SYMBOL", 0x238F: "OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL", 0x2390: "OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL", 0x2391: "PASSIVE-PULL-DOWN-OUTPUT SYMBOL", 0x2392: "PASSIVE-PULL-UP-OUTPUT SYMBOL", 0x2393: "DIRECT CURRENT SYMBOL FORM TWO", 0x2394: "SOFTWARE-FUNCTION SYMBOL", 0x2395: "APL FUNCTIONAL SYMBOL QUAD", 0x2396: "DECIMAL SEPARATOR KEY SYMBOL", 0x2397: "PREVIOUS PAGE", 0x2398: "NEXT PAGE", 0x2399: "PRINT SCREEN SYMBOL", 0x239A: "CLEAR SCREEN SYMBOL", 0x239B: "LEFT PARENTHESIS UPPER HOOK", 0x239C: "LEFT PARENTHESIS EXTENSION", 0x239D: "LEFT PARENTHESIS LOWER HOOK", 0x239E: "RIGHT PARENTHESIS UPPER HOOK", 0x239F: "RIGHT PARENTHESIS EXTENSION", 0x23A0: "RIGHT PARENTHESIS LOWER HOOK", 0x23A1: "LEFT SQUARE BRACKET UPPER CORNER", 0x23A2: "LEFT SQUARE BRACKET EXTENSION", 0x23A3: "LEFT SQUARE BRACKET LOWER CORNER", 0x23A4: "RIGHT SQUARE BRACKET UPPER CORNER", 0x23A5: "RIGHT SQUARE BRACKET EXTENSION", 0x23A6: "RIGHT SQUARE BRACKET LOWER CORNER", 0x23A7: "LEFT CURLY BRACKET UPPER HOOK", 0x23A8: "LEFT CURLY BRACKET MIDDLE PIECE", 0x23A9: "LEFT CURLY BRACKET LOWER HOOK", 0x23AA: "CURLY BRACKET EXTENSION", 0x23AB: "RIGHT CURLY BRACKET UPPER HOOK", 0x23AC: "RIGHT CURLY BRACKET MIDDLE PIECE", 0x23AD: "RIGHT CURLY BRACKET LOWER HOOK", 0x23AE: "INTEGRAL EXTENSION", 0x23AF: "HORIZONTAL LINE EXTENSION", 0x23B0: "UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION", 0x23B1: "UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION", 0x23B2: "SUMMATION TOP", 0x23B3: "SUMMATION BOTTOM", 0x23B4: "TOP SQUARE BRACKET", 0x23B5: "BOTTOM SQUARE BRACKET", 0x23B6: "BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET", 0x23B7: "RADICAL SYMBOL BOTTOM", 0x23B8: "LEFT VERTICAL BOX LINE", 0x23B9: "RIGHT VERTICAL BOX LINE", 0x23BA: "HORIZONTAL SCAN LINE-1", 0x23BB: "HORIZONTAL SCAN LINE-3", 0x23BC: "HORIZONTAL SCAN LINE-7", 0x23BD: "HORIZONTAL SCAN LINE-9", 0x23BE: "DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT", 0x23BF: "DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT", 0x23C0: "DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE", 0x23C1: "DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE", 0x23C2: "DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE", 0x23C3: "DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE", 0x23C4: "DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE", 0x23C5: "DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE", 0x23C6: "DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE", 0x23C7: "DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE", 0x23C8: "DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE", 0x23C9: "DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL", 0x23CA: "DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL", 0x23CB: "DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT", 0x23CC: "DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT", 0x23CD: "SQUARE FOOT", 0x23CE: "RETURN SYMBOL", 0x23CF: "EJECT SYMBOL", 0x23D0: "VERTICAL LINE EXTENSION", 0x23D1: "METRICAL BREVE", 0x23D2: "METRICAL LONG OVER SHORT", 0x23D3: "METRICAL SHORT OVER LONG", 0x23D4: "METRICAL LONG OVER TWO SHORTS", 0x23D5: "METRICAL TWO SHORTS OVER LONG", 0x23D6: "METRICAL TWO SHORTS JOINED", 0x23D7: "METRICAL TRISEME", 0x23D8: "METRICAL TETRASEME", 0x23D9: "METRICAL PENTASEME", 0x23DA: "EARTH GROUND", 0x23DB: "FUSE", 0x23DC: "TOP PARENTHESIS (mathematical use)", 0x23DD: "BOTTOM PARENTHESIS (mathematical use)", 0x23DE: "TOP CURLY BRACKET (mathematical use)", 0x23DF: "BOTTOM CURLY BRACKET (mathematical use)", 0x23E0: "TOP TORTOISE SHELL BRACKET (mathematical use)", 0x23E1: "BOTTOM TORTOISE SHELL BRACKET (mathematical use)", 0x23E2: "WHITE TRAPEZIUM", 0x23E3: "BENZENE RING WITH CIRCLE", 0x23E4: "STRAIGHTNESS", 0x23E5: "FLATNESS", 0x23E6: "AC CURRENT", 0x23E7: "ELECTRICAL INTERSECTION", 0x2400: "SYMBOL FOR NULL", 0x2401: "SYMBOL FOR START OF HEADING", 0x2402: "SYMBOL FOR START OF TEXT", 0x2403: "SYMBOL FOR END OF TEXT", 0x2404: "SYMBOL FOR END OF TRANSMISSION", 0x2405: "SYMBOL FOR ENQUIRY", 0x2406: "SYMBOL FOR ACKNOWLEDGE", 0x2407: "SYMBOL FOR BELL", 0x2408: "SYMBOL FOR BACKSPACE", 0x2409: "SYMBOL FOR HORIZONTAL TABULATION", 0x240A: "SYMBOL FOR LINE FEED", 0x240B: "SYMBOL FOR VERTICAL TABULATION", 0x240C: "SYMBOL FOR FORM FEED", 0x240D: "SYMBOL FOR CARRIAGE RETURN", 0x240E: "SYMBOL FOR SHIFT OUT", 0x240F: "SYMBOL FOR SHIFT IN", 0x2410: "SYMBOL FOR DATA LINK ESCAPE", 0x2411: "SYMBOL FOR DEVICE CONTROL ONE", 0x2412: "SYMBOL FOR DEVICE CONTROL TWO", 0x2413: "SYMBOL FOR DEVICE CONTROL THREE", 0x2414: "SYMBOL FOR DEVICE CONTROL FOUR", 0x2415: "SYMBOL FOR NEGATIVE ACKNOWLEDGE", 0x2416: "SYMBOL FOR SYNCHRONOUS IDLE", 0x2417: "SYMBOL FOR END OF TRANSMISSION BLOCK", 0x2418: "SYMBOL FOR CANCEL", 0x2419: "SYMBOL FOR END OF MEDIUM", 0x241A: "SYMBOL FOR SUBSTITUTE", 0x241B: "SYMBOL FOR ESCAPE", 0x241C: "SYMBOL FOR FILE SEPARATOR", 0x241D: "SYMBOL FOR GROUP SEPARATOR", 0x241E: "SYMBOL FOR RECORD SEPARATOR", 0x241F: "SYMBOL FOR UNIT SEPARATOR", 0x2420: "SYMBOL FOR SPACE", 0x2421: "SYMBOL FOR DELETE", 0x2422: "BLANK SYMBOL", 0x2423: "OPEN BOX", 0x2424: "SYMBOL FOR NEWLINE", 0x2425: "SYMBOL FOR DELETE FORM TWO", 0x2426: "SYMBOL FOR SUBSTITUTE FORM TWO", 0x2440: "OCR HOOK", 0x2441: "OCR CHAIR", 0x2442: "OCR FORK", 0x2443: "OCR INVERTED FORK", 0x2444: "OCR BELT BUCKLE", 0x2445: "OCR BOW TIE", 0x2446: "OCR BRANCH BANK IDENTIFICATION", 0x2447: "OCR AMOUNT OF CHECK", 0x2448: "OCR DASH", 0x2449: "OCR CUSTOMER ACCOUNT NUMBER", 0x244A: "OCR DOUBLE BACKSLASH", 0x2460: "CIRCLED DIGIT ONE", 0x2461: "CIRCLED DIGIT TWO", 0x2462: "CIRCLED DIGIT THREE", 0x2463: "CIRCLED DIGIT FOUR", 0x2464: "CIRCLED DIGIT FIVE", 0x2465: "CIRCLED DIGIT SIX", 0x2466: "CIRCLED DIGIT SEVEN", 0x2467: "CIRCLED DIGIT EIGHT", 0x2468: "CIRCLED DIGIT NINE", 0x2469: "CIRCLED NUMBER TEN", 0x246A: "CIRCLED NUMBER ELEVEN", 0x246B: "CIRCLED NUMBER TWELVE", 0x246C: "CIRCLED NUMBER THIRTEEN", 0x246D: "CIRCLED NUMBER FOURTEEN", 0x246E: "CIRCLED NUMBER FIFTEEN", 0x246F: "CIRCLED NUMBER SIXTEEN", 0x2470: "CIRCLED NUMBER SEVENTEEN", 0x2471: "CIRCLED NUMBER EIGHTEEN", 0x2472: "CIRCLED NUMBER NINETEEN", 0x2473: "CIRCLED NUMBER TWENTY", 0x2474: "PARENTHESIZED DIGIT ONE", 0x2475: "PARENTHESIZED DIGIT TWO", 0x2476: "PARENTHESIZED DIGIT THREE", 0x2477: "PARENTHESIZED DIGIT FOUR", 0x2478: "PARENTHESIZED DIGIT FIVE", 0x2479: "PARENTHESIZED DIGIT SIX", 0x247A: "PARENTHESIZED DIGIT SEVEN", 0x247B: "PARENTHESIZED DIGIT EIGHT", 0x247C: "PARENTHESIZED DIGIT NINE", 0x247D: "PARENTHESIZED NUMBER TEN", 0x247E: "PARENTHESIZED NUMBER ELEVEN", 0x247F: "PARENTHESIZED NUMBER TWELVE", 0x2480: "PARENTHESIZED NUMBER THIRTEEN", 0x2481: "PARENTHESIZED NUMBER FOURTEEN", 0x2482: "PARENTHESIZED NUMBER FIFTEEN", 0x2483: "PARENTHESIZED NUMBER SIXTEEN", 0x2484: "PARENTHESIZED NUMBER SEVENTEEN", 0x2485: "PARENTHESIZED NUMBER EIGHTEEN", 0x2486: "PARENTHESIZED NUMBER NINETEEN", 0x2487: "PARENTHESIZED NUMBER TWENTY", 0x2488: "DIGIT ONE FULL STOP", 0x2489: "DIGIT TWO FULL STOP", 0x248A: "DIGIT THREE FULL STOP", 0x248B: "DIGIT FOUR FULL STOP", 0x248C: "DIGIT FIVE FULL STOP", 0x248D: "DIGIT SIX FULL STOP", 0x248E: "DIGIT SEVEN FULL STOP", 0x248F: "DIGIT EIGHT FULL STOP", 0x2490: "DIGIT NINE FULL STOP", 0x2491: "NUMBER TEN FULL STOP", 0x2492: "NUMBER ELEVEN FULL STOP", 0x2493: "NUMBER TWELVE FULL STOP", 0x2494: "NUMBER THIRTEEN FULL STOP", 0x2495: "NUMBER FOURTEEN FULL STOP", 0x2496: "NUMBER FIFTEEN FULL STOP", 0x2497: "NUMBER SIXTEEN FULL STOP", 0x2498: "NUMBER SEVENTEEN FULL STOP", 0x2499: "NUMBER EIGHTEEN FULL STOP", 0x249A: "NUMBER NINETEEN FULL STOP", 0x249B: "NUMBER TWENTY FULL STOP", 0x249C: "PARENTHESIZED LATIN SMALL LETTER A", 0x249D: "PARENTHESIZED LATIN SMALL LETTER B", 0x249E: "PARENTHESIZED LATIN SMALL LETTER C", 0x249F: "PARENTHESIZED LATIN SMALL LETTER D", 0x24A0: "PARENTHESIZED LATIN SMALL LETTER E", 0x24A1: "PARENTHESIZED LATIN SMALL LETTER F", 0x24A2: "PARENTHESIZED LATIN SMALL LETTER G", 0x24A3: "PARENTHESIZED LATIN SMALL LETTER H", 0x24A4: "PARENTHESIZED LATIN SMALL LETTER I", 0x24A5: "PARENTHESIZED LATIN SMALL LETTER J", 0x24A6: "PARENTHESIZED LATIN SMALL LETTER K", 0x24A7: "PARENTHESIZED LATIN SMALL LETTER L", 0x24A8: "PARENTHESIZED LATIN SMALL LETTER M", 0x24A9: "PARENTHESIZED LATIN SMALL LETTER N", 0x24AA: "PARENTHESIZED LATIN SMALL LETTER O", 0x24AB: "PARENTHESIZED LATIN SMALL LETTER P", 0x24AC: "PARENTHESIZED LATIN SMALL LETTER Q", 0x24AD: "PARENTHESIZED LATIN SMALL LETTER R", 0x24AE: "PARENTHESIZED LATIN SMALL LETTER S", 0x24AF: "PARENTHESIZED LATIN SMALL LETTER T", 0x24B0: "PARENTHESIZED LATIN SMALL LETTER U", 0x24B1: "PARENTHESIZED LATIN SMALL LETTER V", 0x24B2: "PARENTHESIZED LATIN SMALL LETTER W", 0x24B3: "PARENTHESIZED LATIN SMALL LETTER X", 0x24B4: "PARENTHESIZED LATIN SMALL LETTER Y", 0x24B5: "PARENTHESIZED LATIN SMALL LETTER Z", 0x24B6: "CIRCLED LATIN CAPITAL LETTER A", 0x24B7: "CIRCLED LATIN CAPITAL LETTER B", 0x24B8: "CIRCLED LATIN CAPITAL LETTER C", 0x24B9: "CIRCLED LATIN CAPITAL LETTER D", 0x24BA: "CIRCLED LATIN CAPITAL LETTER E", 0x24BB: "CIRCLED LATIN CAPITAL LETTER F", 0x24BC: "CIRCLED LATIN CAPITAL LETTER G", 0x24BD: "CIRCLED LATIN CAPITAL LETTER H", 0x24BE: "CIRCLED LATIN CAPITAL LETTER I", 0x24BF: "CIRCLED LATIN CAPITAL LETTER J", 0x24C0: "CIRCLED LATIN CAPITAL LETTER K", 0x24C1: "CIRCLED LATIN CAPITAL LETTER L", 0x24C2: "CIRCLED LATIN CAPITAL LETTER M", 0x24C3: "CIRCLED LATIN CAPITAL LETTER N", 0x24C4: "CIRCLED LATIN CAPITAL LETTER O", 0x24C5: "CIRCLED LATIN CAPITAL LETTER P", 0x24C6: "CIRCLED LATIN CAPITAL LETTER Q", 0x24C7: "CIRCLED LATIN CAPITAL LETTER R", 0x24C8: "CIRCLED LATIN CAPITAL LETTER S", 0x24C9: "CIRCLED LATIN CAPITAL LETTER T", 0x24CA: "CIRCLED LATIN CAPITAL LETTER U", 0x24CB: "CIRCLED LATIN CAPITAL LETTER V", 0x24CC: "CIRCLED LATIN CAPITAL LETTER W", 0x24CD: "CIRCLED LATIN CAPITAL LETTER X", 0x24CE: "CIRCLED LATIN CAPITAL LETTER Y", 0x24CF: "CIRCLED LATIN CAPITAL LETTER Z", 0x24D0: "CIRCLED LATIN SMALL LETTER A", 0x24D1: "CIRCLED LATIN SMALL LETTER B", 0x24D2: "CIRCLED LATIN SMALL LETTER C", 0x24D3: "CIRCLED LATIN SMALL LETTER D", 0x24D4: "CIRCLED LATIN SMALL LETTER E", 0x24D5: "CIRCLED LATIN SMALL LETTER F", 0x24D6: "CIRCLED LATIN SMALL LETTER G", 0x24D7: "CIRCLED LATIN SMALL LETTER H", 0x24D8: "CIRCLED LATIN SMALL LETTER I", 0x24D9: "CIRCLED LATIN SMALL LETTER J", 0x24DA: "CIRCLED LATIN SMALL LETTER K", 0x24DB: "CIRCLED LATIN SMALL LETTER L", 0x24DC: "CIRCLED LATIN SMALL LETTER M", 0x24DD: "CIRCLED LATIN SMALL LETTER N", 0x24DE: "CIRCLED LATIN SMALL LETTER O", 0x24DF: "CIRCLED LATIN SMALL LETTER P", 0x24E0: "CIRCLED LATIN SMALL LETTER Q", 0x24E1: "CIRCLED LATIN SMALL LETTER R", 0x24E2: "CIRCLED LATIN SMALL LETTER S", 0x24E3: "CIRCLED LATIN SMALL LETTER T", 0x24E4: "CIRCLED LATIN SMALL LETTER U", 0x24E5: "CIRCLED LATIN SMALL LETTER V", 0x24E6: "CIRCLED LATIN SMALL LETTER W", 0x24E7: "CIRCLED LATIN SMALL LETTER X", 0x24E8: "CIRCLED LATIN SMALL LETTER Y", 0x24E9: "CIRCLED LATIN SMALL LETTER Z", 0x24EA: "CIRCLED DIGIT ZERO", 0x24EB: "NEGATIVE CIRCLED NUMBER ELEVEN", 0x24EC: "NEGATIVE CIRCLED NUMBER TWELVE", 0x24ED: "NEGATIVE CIRCLED NUMBER THIRTEEN", 0x24EE: "NEGATIVE CIRCLED NUMBER FOURTEEN", 0x24EF: "NEGATIVE CIRCLED NUMBER FIFTEEN", 0x24F0: "NEGATIVE CIRCLED NUMBER SIXTEEN", 0x24F1: "NEGATIVE CIRCLED NUMBER SEVENTEEN", 0x24F2: "NEGATIVE CIRCLED NUMBER EIGHTEEN", 0x24F3: "NEGATIVE CIRCLED NUMBER NINETEEN", 0x24F4: "NEGATIVE CIRCLED NUMBER TWENTY", 0x24F5: "DOUBLE CIRCLED DIGIT ONE", 0x24F6: "DOUBLE CIRCLED DIGIT TWO", 0x24F7: "DOUBLE CIRCLED DIGIT THREE", 0x24F8: "DOUBLE CIRCLED DIGIT FOUR", 0x24F9: "DOUBLE CIRCLED DIGIT FIVE", 0x24FA: "DOUBLE CIRCLED DIGIT SIX", 0x24FB: "DOUBLE CIRCLED DIGIT SEVEN", 0x24FC: "DOUBLE CIRCLED DIGIT EIGHT", 0x24FD: "DOUBLE CIRCLED DIGIT NINE", 0x24FE: "DOUBLE CIRCLED NUMBER TEN", 0x24FF: "NEGATIVE CIRCLED DIGIT ZERO", 0x2500: "BOX DRAWINGS LIGHT HORIZONTAL", 0x2501: "BOX DRAWINGS HEAVY HORIZONTAL", 0x2502: "BOX DRAWINGS LIGHT VERTICAL", 0x2503: "BOX DRAWINGS HEAVY VERTICAL", 0x2504: "BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL", 0x2505: "BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL", 0x2506: "BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL", 0x2507: "BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL", 0x2508: "BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL", 0x2509: "BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL", 0x250A: "BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL", 0x250B: "BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL", 0x250C: "BOX DRAWINGS LIGHT DOWN AND RIGHT", 0x250D: "BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY", 0x250E: "BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT", 0x250F: "BOX DRAWINGS HEAVY DOWN AND RIGHT", 0x2510: "BOX DRAWINGS LIGHT DOWN AND LEFT", 0x2511: "BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY", 0x2512: "BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT", 0x2513: "BOX DRAWINGS HEAVY DOWN AND LEFT", 0x2514: "BOX DRAWINGS LIGHT UP AND RIGHT", 0x2515: "BOX DRAWINGS UP LIGHT AND RIGHT HEAVY", 0x2516: "BOX DRAWINGS UP HEAVY AND RIGHT LIGHT", 0x2517: "BOX DRAWINGS HEAVY UP AND RIGHT", 0x2518: "BOX DRAWINGS LIGHT UP AND LEFT", 0x2519: "BOX DRAWINGS UP LIGHT AND LEFT HEAVY", 0x251A: "BOX DRAWINGS UP HEAVY AND LEFT LIGHT", 0x251B: "BOX DRAWINGS HEAVY UP AND LEFT", 0x251C: "BOX DRAWINGS LIGHT VERTICAL AND RIGHT", 0x251D: "BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY", 0x251E: "BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT", 0x251F: "BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT", 0x2520: "BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT", 0x2521: "BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY", 0x2522: "BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY", 0x2523: "BOX DRAWINGS HEAVY VERTICAL AND RIGHT", 0x2524: "BOX DRAWINGS LIGHT VERTICAL AND LEFT", 0x2525: "BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY", 0x2526: "BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT", 0x2527: "BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT", 0x2528: "BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT", 0x2529: "BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY", 0x252A: "BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY", 0x252B: "BOX DRAWINGS HEAVY VERTICAL AND LEFT", 0x252C: "BOX DRAWINGS LIGHT DOWN AND HORIZONTAL", 0x252D: "BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT", 0x252E: "BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT", 0x252F: "BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY", 0x2530: "BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT", 0x2531: "BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY", 0x2532: "BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY", 0x2533: "BOX DRAWINGS HEAVY DOWN AND HORIZONTAL", 0x2534: "BOX DRAWINGS LIGHT UP AND HORIZONTAL", 0x2535: "BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT", 0x2536: "BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT", 0x2537: "BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY", 0x2538: "BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT", 0x2539: "BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY", 0x253A: "BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY", 0x253B: "BOX DRAWINGS HEAVY UP AND HORIZONTAL", 0x253C: "BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL", 0x253D: "BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT", 0x253E: "BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT", 0x253F: "BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY", 0x2540: "BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT", 0x2541: "BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT", 0x2542: "BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT", 0x2543: "BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT", 0x2544: "BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT", 0x2545: "BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT", 0x2546: "BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT", 0x2547: "BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY", 0x2548: "BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY", 0x2549: "BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY", 0x254A: "BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY", 0x254B: "BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL", 0x254C: "BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL", 0x254D: "BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL", 0x254E: "BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL", 0x254F: "BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL", 0x2550: "BOX DRAWINGS DOUBLE HORIZONTAL", 0x2551: "BOX DRAWINGS DOUBLE VERTICAL", 0x2552: "BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE", 0x2553: "BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE", 0x2554: "BOX DRAWINGS DOUBLE DOWN AND RIGHT", 0x2555: "BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE", 0x2556: "BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE", 0x2557: "BOX DRAWINGS DOUBLE DOWN AND LEFT", 0x2558: "BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE", 0x2559: "BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE", 0x255A: "BOX DRAWINGS DOUBLE UP AND RIGHT", 0x255B: "BOX DRAWINGS UP SINGLE AND LEFT DOUBLE", 0x255C: "BOX DRAWINGS UP DOUBLE AND LEFT SINGLE", 0x255D: "BOX DRAWINGS DOUBLE UP AND LEFT", 0x255E: "BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE", 0x255F: "BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE", 0x2560: "BOX DRAWINGS DOUBLE VERTICAL AND RIGHT", 0x2561: "BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE", 0x2562: "BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE", 0x2563: "BOX DRAWINGS DOUBLE VERTICAL AND LEFT", 0x2564: "BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE", 0x2565: "BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE", 0x2566: "BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL", 0x2567: "BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE", 0x2568: "BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE", 0x2569: "BOX DRAWINGS DOUBLE UP AND HORIZONTAL", 0x256A: "BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE", 0x256B: "BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE", 0x256C: "BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL", 0x256D: "BOX DRAWINGS LIGHT ARC DOWN AND RIGHT", 0x256E: "BOX DRAWINGS LIGHT ARC DOWN AND LEFT", 0x256F: "BOX DRAWINGS LIGHT ARC UP AND LEFT", 0x2570: "BOX DRAWINGS LIGHT ARC UP AND RIGHT", 0x2571: "BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT", 0x2572: "BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT", 0x2573: "BOX DRAWINGS LIGHT DIAGONAL CROSS", 0x2574: "BOX DRAWINGS LIGHT LEFT", 0x2575: "BOX DRAWINGS LIGHT UP", 0x2576: "BOX DRAWINGS LIGHT RIGHT", 0x2577: "BOX DRAWINGS LIGHT DOWN", 0x2578: "BOX DRAWINGS HEAVY LEFT", 0x2579: "BOX DRAWINGS HEAVY UP", 0x257A: "BOX DRAWINGS HEAVY RIGHT", 0x257B: "BOX DRAWINGS HEAVY DOWN", 0x257C: "BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT", 0x257D: "BOX DRAWINGS LIGHT UP AND HEAVY DOWN", 0x257E: "BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT", 0x257F: "BOX DRAWINGS HEAVY UP AND LIGHT DOWN", 0x2580: "UPPER HALF BLOCK", 0x2581: "LOWER ONE EIGHTH BLOCK", 0x2582: "LOWER ONE QUARTER BLOCK", 0x2583: "LOWER THREE EIGHTHS BLOCK", 0x2584: "LOWER HALF BLOCK", 0x2585: "LOWER FIVE EIGHTHS BLOCK", 0x2586: "LOWER THREE QUARTERS BLOCK", 0x2587: "LOWER SEVEN EIGHTHS BLOCK", 0x2588: "FULL BLOCK", 0x2589: "LEFT SEVEN EIGHTHS BLOCK", 0x258A: "LEFT THREE QUARTERS BLOCK", 0x258B: "LEFT FIVE EIGHTHS BLOCK", 0x258C: "LEFT HALF BLOCK", 0x258D: "LEFT THREE EIGHTHS BLOCK", 0x258E: "LEFT ONE QUARTER BLOCK", 0x258F: "LEFT ONE EIGHTH BLOCK", 0x2590: "RIGHT HALF BLOCK", 0x2591: "LIGHT SHADE", 0x2592: "MEDIUM SHADE", 0x2593: "DARK SHADE", 0x2594: "UPPER ONE EIGHTH BLOCK", 0x2595: "RIGHT ONE EIGHTH BLOCK", 0x2596: "QUADRANT LOWER LEFT", 0x2597: "QUADRANT LOWER RIGHT", 0x2598: "QUADRANT UPPER LEFT", 0x2599: "QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT", 0x259A: "QUADRANT UPPER LEFT AND LOWER RIGHT", 0x259B: "QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT", 0x259C: "QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT", 0x259D: "QUADRANT UPPER RIGHT", 0x259E: "QUADRANT UPPER RIGHT AND LOWER LEFT", 0x259F: "QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT", 0x25A0: "BLACK SQUARE", 0x25A1: "WHITE SQUARE", 0x25A2: "WHITE SQUARE WITH ROUNDED CORNERS", 0x25A3: "WHITE SQUARE CONTAINING BLACK SMALL SQUARE", 0x25A4: "SQUARE WITH HORIZONTAL FILL", 0x25A5: "SQUARE WITH VERTICAL FILL", 0x25A6: "SQUARE WITH ORTHOGONAL CROSSHATCH FILL", 0x25A7: "SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL", 0x25A8: "SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL", 0x25A9: "SQUARE WITH DIAGONAL CROSSHATCH FILL", 0x25AA: "BLACK SMALL SQUARE", 0x25AB: "WHITE SMALL SQUARE", 0x25AC: "BLACK RECTANGLE", 0x25AD: "WHITE RECTANGLE", 0x25AE: "BLACK VERTICAL RECTANGLE", 0x25AF: "WHITE VERTICAL RECTANGLE", 0x25B0: "BLACK PARALLELOGRAM", 0x25B1: "WHITE PARALLELOGRAM", 0x25B2: "BLACK UP-POINTING TRIANGLE", 0x25B3: "WHITE UP-POINTING TRIANGLE", 0x25B4: "BLACK UP-POINTING SMALL TRIANGLE", 0x25B5: "WHITE UP-POINTING SMALL TRIANGLE", 0x25B6: "BLACK RIGHT-POINTING TRIANGLE", 0x25B7: "WHITE RIGHT-POINTING TRIANGLE", 0x25B8: "BLACK RIGHT-POINTING SMALL TRIANGLE", 0x25B9: "WHITE RIGHT-POINTING SMALL TRIANGLE", 0x25BA: "BLACK RIGHT-POINTING POINTER", 0x25BB: "WHITE RIGHT-POINTING POINTER", 0x25BC: "BLACK DOWN-POINTING TRIANGLE", 0x25BD: "WHITE DOWN-POINTING TRIANGLE", 0x25BE: "BLACK DOWN-POINTING SMALL TRIANGLE", 0x25BF: "WHITE DOWN-POINTING SMALL TRIANGLE", 0x25C0: "BLACK LEFT-POINTING TRIANGLE", 0x25C1: "WHITE LEFT-POINTING TRIANGLE", 0x25C2: "BLACK LEFT-POINTING SMALL TRIANGLE", 0x25C3: "WHITE LEFT-POINTING SMALL TRIANGLE", 0x25C4: "BLACK LEFT-POINTING POINTER", 0x25C5: "WHITE LEFT-POINTING POINTER", 0x25C6: "BLACK DIAMOND", 0x25C7: "WHITE DIAMOND", 0x25C8: "WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND", 0x25C9: "FISHEYE", 0x25CA: "LOZENGE", 0x25CB: "WHITE CIRCLE", 0x25CC: "DOTTED CIRCLE", 0x25CD: "CIRCLE WITH VERTICAL FILL", 0x25CE: "BULLSEYE", 0x25CF: "BLACK CIRCLE", 0x25D0: "CIRCLE WITH LEFT HALF BLACK", 0x25D1: "CIRCLE WITH RIGHT HALF BLACK", 0x25D2: "CIRCLE WITH LOWER HALF BLACK", 0x25D3: "CIRCLE WITH UPPER HALF BLACK", 0x25D4: "CIRCLE WITH UPPER RIGHT QUADRANT BLACK", 0x25D5: "CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK", 0x25D6: "LEFT HALF BLACK CIRCLE", 0x25D7: "RIGHT HALF BLACK CIRCLE", 0x25D8: "INVERSE BULLET", 0x25D9: "INVERSE WHITE CIRCLE", 0x25DA: "UPPER HALF INVERSE WHITE CIRCLE", 0x25DB: "LOWER HALF INVERSE WHITE CIRCLE", 0x25DC: "UPPER LEFT QUADRANT CIRCULAR ARC", 0x25DD: "UPPER RIGHT QUADRANT CIRCULAR ARC", 0x25DE: "LOWER RIGHT QUADRANT CIRCULAR ARC", 0x25DF: "LOWER LEFT QUADRANT CIRCULAR ARC", 0x25E0: "UPPER HALF CIRCLE", 0x25E1: "LOWER HALF CIRCLE", 0x25E2: "BLACK LOWER RIGHT TRIANGLE", 0x25E3: "BLACK LOWER LEFT TRIANGLE", 0x25E4: "BLACK UPPER LEFT TRIANGLE", 0x25E5: "BLACK UPPER RIGHT TRIANGLE", 0x25E6: "WHITE BULLET", 0x25E7: "SQUARE WITH LEFT HALF BLACK", 0x25E8: "SQUARE WITH RIGHT HALF BLACK", 0x25E9: "SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK", 0x25EA: "SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK", 0x25EB: "WHITE SQUARE WITH VERTICAL BISECTING LINE", 0x25EC: "WHITE UP-POINTING TRIANGLE WITH DOT", 0x25ED: "UP-POINTING TRIANGLE WITH LEFT HALF BLACK", 0x25EE: "UP-POINTING TRIANGLE WITH RIGHT HALF BLACK", 0x25EF: "LARGE CIRCLE", 0x25F0: "WHITE SQUARE WITH UPPER LEFT QUADRANT", 0x25F1: "WHITE SQUARE WITH LOWER LEFT QUADRANT", 0x25F2: "WHITE SQUARE WITH LOWER RIGHT QUADRANT", 0x25F3: "WHITE SQUARE WITH UPPER RIGHT QUADRANT", 0x25F4: "WHITE CIRCLE WITH UPPER LEFT QUADRANT", 0x25F5: "WHITE CIRCLE WITH LOWER LEFT QUADRANT", 0x25F6: "WHITE CIRCLE WITH LOWER RIGHT QUADRANT", 0x25F7: "WHITE CIRCLE WITH UPPER RIGHT QUADRANT", 0x25F8: "UPPER LEFT TRIANGLE", 0x25F9: "UPPER RIGHT TRIANGLE", 0x25FA: "LOWER LEFT TRIANGLE", 0x25FB: "WHITE MEDIUM SQUARE", 0x25FC: "BLACK MEDIUM SQUARE", 0x25FD: "WHITE MEDIUM SMALL SQUARE", 0x25FE: "BLACK MEDIUM SMALL SQUARE", 0x25FF: "LOWER RIGHT TRIANGLE", 0x2600: "BLACK SUN WITH RAYS", 0x2601: "CLOUD", 0x2602: "UMBRELLA", 0x2603: "SNOWMAN", 0x2604: "COMET", 0x2605: "BLACK STAR", 0x2606: "WHITE STAR", 0x2607: "LIGHTNING", 0x2608: "THUNDERSTORM", 0x2609: "SUN", 0x260A: "ASCENDING NODE", 0x260B: "DESCENDING NODE", 0x260C: "CONJUNCTION", 0x260D: "OPPOSITION", 0x260E: "BLACK TELEPHONE", 0x260F: "WHITE TELEPHONE", 0x2610: "BALLOT BOX", 0x2611: "BALLOT BOX WITH CHECK", 0x2612: "BALLOT BOX WITH X", 0x2613: "SALTIRE", 0x2614: "UMBRELLA WITH RAIN DROPS", 0x2615: "HOT BEVERAGE", 0x2616: "WHITE SHOGI PIECE", 0x2617: "BLACK SHOGI PIECE", 0x2618: "SHAMROCK", 0x2619: "REVERSED ROTATED FLORAL HEART BULLET", 0x261A: "BLACK LEFT POINTING INDEX", 0x261B: "BLACK RIGHT POINTING INDEX", 0x261C: "WHITE LEFT POINTING INDEX", 0x261D: "WHITE UP POINTING INDEX", 0x261E: "WHITE RIGHT POINTING INDEX", 0x261F: "WHITE DOWN POINTING INDEX", 0x2620: "SKULL AND CROSSBONES", 0x2621: "CAUTION SIGN", 0x2622: "RADIOACTIVE SIGN", 0x2623: "BIOHAZARD SIGN", 0x2624: "CADUCEUS", 0x2625: "ANKH", 0x2626: "ORTHODOX CROSS", 0x2627: "CHI RHO", 0x2628: "CROSS OF LORRAINE", 0x2629: "CROSS OF JERUSALEM", 0x262A: "STAR AND CRESCENT", 0x262B: "FARSI SYMBOL", 0x262C: "ADI SHAKTI", 0x262D: "HAMMER AND SICKLE", 0x262E: "PEACE SYMBOL", 0x262F: "YIN YANG", 0x2630: "TRIGRAM FOR HEAVEN", 0x2631: "TRIGRAM FOR LAKE", 0x2632: "TRIGRAM FOR FIRE", 0x2633: "TRIGRAM FOR THUNDER", 0x2634: "TRIGRAM FOR WIND", 0x2635: "TRIGRAM FOR WATER", 0x2636: "TRIGRAM FOR MOUNTAIN", 0x2637: "TRIGRAM FOR EARTH", 0x2638: "WHEEL OF DHARMA", 0x2639: "WHITE FROWNING FACE", 0x263A: "WHITE SMILING FACE", 0x263B: "BLACK SMILING FACE", 0x263C: "WHITE SUN WITH RAYS", 0x263D: "FIRST QUARTER MOON", 0x263E: "LAST QUARTER MOON", 0x263F: "MERCURY", 0x2640: "FEMALE SIGN", 0x2641: "EARTH", 0x2642: "MALE SIGN", 0x2643: "JUPITER", 0x2644: "SATURN", 0x2645: "URANUS", 0x2646: "NEPTUNE", 0x2647: "PLUTO", 0x2648: "ARIES", 0x2649: "TAURUS", 0x264A: "GEMINI", 0x264B: "CANCER", 0x264C: "LEO", 0x264D: "VIRGO", 0x264E: "LIBRA", 0x264F: "SCORPIUS", 0x2650: "SAGITTARIUS", 0x2651: "CAPRICORN", 0x2652: "AQUARIUS", 0x2653: "PISCES", 0x2654: "WHITE CHESS KING", 0x2655: "WHITE CHESS QUEEN", 0x2656: "WHITE CHESS ROOK", 0x2657: "WHITE CHESS BISHOP", 0x2658: "WHITE CHESS KNIGHT", 0x2659: "WHITE CHESS PAWN", 0x265A: "BLACK CHESS KING", 0x265B: "BLACK CHESS QUEEN", 0x265C: "BLACK CHESS ROOK", 0x265D: "BLACK CHESS BISHOP", 0x265E: "BLACK CHESS KNIGHT", 0x265F: "BLACK CHESS PAWN", 0x2660: "BLACK SPADE SUIT", 0x2661: "WHITE HEART SUIT", 0x2662: "WHITE DIAMOND SUIT", 0x2663: "BLACK CLUB SUIT", 0x2664: "WHITE SPADE SUIT", 0x2665: "BLACK HEART SUIT", 0x2666: "BLACK DIAMOND SUIT", 0x2667: "WHITE CLUB SUIT", 0x2668: "HOT SPRINGS", 0x2669: "QUARTER NOTE", 0x266A: "EIGHTH NOTE", 0x266B: "BEAMED EIGHTH NOTES", 0x266C: "BEAMED SIXTEENTH NOTES", 0x266D: "MUSIC FLAT SIGN", 0x266E: "MUSIC NATURAL SIGN", 0x266F: "MUSIC SHARP SIGN", 0x2670: "WEST SYRIAC CROSS", 0x2671: "EAST SYRIAC CROSS", 0x2672: "UNIVERSAL RECYCLING SYMBOL", 0x2673: "RECYCLING SYMBOL FOR TYPE-1 PLASTICS (pete)", 0x2674: "RECYCLING SYMBOL FOR TYPE-2 PLASTICS (hdpe)", 0x2675: "RECYCLING SYMBOL FOR TYPE-3 PLASTICS (pvc)", 0x2676: "RECYCLING SYMBOL FOR TYPE-4 PLASTICS (ldpe)", 0x2677: "RECYCLING SYMBOL FOR TYPE-5 PLASTICS (pp)", 0x2678: "RECYCLING SYMBOL FOR TYPE-6 PLASTICS (ps)", 0x2679: "RECYCLING SYMBOL FOR TYPE-7 PLASTICS (other)", 0x267A: "RECYCLING SYMBOL FOR GENERIC MATERIALS", 0x267B: "BLACK UNIVERSAL RECYCLING SYMBOL", 0x267C: "RECYCLED PAPER SYMBOL", 0x267D: "PARTIALLY-RECYCLED PAPER SYMBOL", 0x267E: "PERMANENT PAPER SIGN", 0x267F: "WHEELCHAIR SYMBOL", 0x2680: "DIE FACE-1", 0x2681: "DIE FACE-2", 0x2682: "DIE FACE-3", 0x2683: "DIE FACE-4", 0x2684: "DIE FACE-5", 0x2685: "DIE FACE-6", 0x2686: "WHITE CIRCLE WITH DOT RIGHT", 0x2687: "WHITE CIRCLE WITH TWO DOTS", 0x2688: "BLACK CIRCLE WITH WHITE DOT RIGHT", 0x2689: "BLACK CIRCLE WITH TWO WHITE DOTS", 0x268A: "MONOGRAM FOR YANG", 0x268B: "MONOGRAM FOR YIN", 0x268C: "DIGRAM FOR GREATER YANG", 0x268D: "DIGRAM FOR LESSER YIN", 0x268E: "DIGRAM FOR LESSER YANG", 0x268F: "DIGRAM FOR GREATER YIN", 0x2690: "WHITE FLAG", 0x2691: "BLACK FLAG", 0x2692: "HAMMER AND PICK", 0x2693: "ANCHOR", 0x2694: "CROSSED SWORDS", 0x2695: "STAFF OF AESCULAPIUS", 0x2696: "SCALES", 0x2697: "ALEMBIC", 0x2698: "FLOWER", 0x2699: "GEAR", 0x269A: "STAFF OF HERMES", 0x269B: "ATOM SYMBOL", 0x269C: "FLEUR-DE-LIS", 0x269D: "OUTLINED WHITE STAR", 0x26A0: "WARNING SIGN", 0x26A1: "HIGH VOLTAGE SIGN", 0x26A2: "DOUBLED FEMALE SIGN", 0x26A3: "DOUBLED MALE SIGN", 0x26A4: "INTERLOCKED FEMALE AND MALE SIGN", 0x26A5: "MALE AND FEMALE SIGN", 0x26A6: "MALE WITH STROKE SIGN", 0x26A7: "MALE WITH STROKE AND MALE AND FEMALE SIGN", 0x26A8: "VERTICAL MALE WITH STROKE SIGN", 0x26A9: "HORIZONTAL MALE WITH STROKE SIGN", 0x26AA: "MEDIUM WHITE CIRCLE", 0x26AB: "MEDIUM BLACK CIRCLE", 0x26AC: "MEDIUM SMALL WHITE CIRCLE", 0x26AD: "MARRIAGE SYMBOL", 0x26AE: "DIVORCE SYMBOL", 0x26AF: "UNMARRIED PARTNERSHIP SYMBOL", 0x26B0: "COFFIN", 0x26B1: "FUNERAL URN", 0x26B2: "NEUTER", 0x26B3: "CERES", 0x26B4: "PALLAS", 0x26B5: "JUNO", 0x26B6: "VESTA", 0x26B7: "CHIRON", 0x26B8: "BLACK MOON LILITH", 0x26B9: "SEXTILE", 0x26BA: "SEMISEXTILE", 0x26BB: "QUINCUNX", 0x26BC: "SESQUIQUADRATE", 0x26C0: "WHITE DRAUGHTS MAN", 0x26C1: "WHITE DRAUGHTS KING", 0x26C2: "BLACK DRAUGHTS MAN", 0x26C3: "BLACK DRAUGHTS KING", 0x2701: "UPPER BLADE SCISSORS", 0x2702: "BLACK SCISSORS", 0x2703: "LOWER BLADE SCISSORS", 0x2704: "WHITE SCISSORS", 0x2705: "", 0x2706: "TELEPHONE LOCATION SIGN", 0x2707: "TAPE DRIVE", 0x2708: "AIRPLANE", 0x2709: "ENVELOPE", 0x270A: "", 0x270B: "", 0x270C: "VICTORY HAND", 0x270D: "WRITING HAND", 0x270E: "LOWER RIGHT PENCIL", 0x270F: "PENCIL", 0x2710: "UPPER RIGHT PENCIL", 0x2711: "WHITE NIB", 0x2712: "BLACK NIB", 0x2713: "CHECK MARK", 0x2714: "HEAVY CHECK MARK", 0x2715: "MULTIPLICATION X", 0x2716: "HEAVY MULTIPLICATION X", 0x2717: "BALLOT X", 0x2718: "HEAVY BALLOT X", 0x2719: "OUTLINED GREEK CROSS", 0x271A: "HEAVY GREEK CROSS", 0x271B: "OPEN CENTRE CROSS", 0x271C: "HEAVY OPEN CENTRE CROSS", 0x271D: "LATIN CROSS", 0x271E: "SHADOWED WHITE LATIN CROSS", 0x271F: "OUTLINED LATIN CROSS", 0x2720: "MALTESE CROSS", 0x2721: "STAR OF DAVID", 0x2722: "FOUR TEARDROP-SPOKED ASTERISK", 0x2723: "FOUR BALLOON-SPOKED ASTERISK", 0x2724: "HEAVY FOUR BALLOON-SPOKED ASTERISK", 0x2725: "FOUR CLUB-SPOKED ASTERISK", 0x2726: "BLACK FOUR POINTED STAR", 0x2727: "WHITE FOUR POINTED STAR", 0x2728: "", 0x2729: "STRESS OUTLINED WHITE STAR", 0x272A: "CIRCLED WHITE STAR", 0x272B: "OPEN CENTRE BLACK STAR", 0x272C: "BLACK CENTRE WHITE STAR", 0x272D: "OUTLINED BLACK STAR", 0x272E: "HEAVY OUTLINED BLACK STAR", 0x272F: "PINWHEEL STAR", 0x2730: "SHADOWED WHITE STAR", 0x2731: "HEAVY ASTERISK", 0x2732: "OPEN CENTRE ASTERISK", 0x2733: "EIGHT SPOKED ASTERISK", 0x2734: "EIGHT POINTED BLACK STAR", 0x2735: "EIGHT POINTED PINWHEEL STAR", 0x2736: "SIX POINTED BLACK STAR", 0x2737: "EIGHT POINTED RECTILINEAR BLACK STAR", 0x2738: "HEAVY EIGHT POINTED RECTILINEAR BLACK STAR", 0x2739: "TWELVE POINTED BLACK STAR", 0x273A: "SIXTEEN POINTED ASTERISK", 0x273B: "TEARDROP-SPOKED ASTERISK", 0x273C: "OPEN CENTRE TEARDROP-SPOKED ASTERISK", 0x273D: "HEAVY TEARDROP-SPOKED ASTERISK", 0x273E: "SIX PETALLED BLACK AND WHITE FLORETTE", 0x273F: "BLACK FLORETTE", 0x2740: "WHITE FLORETTE", 0x2741: "EIGHT PETALLED OUTLINED BLACK FLORETTE", 0x2742: "CIRCLED OPEN CENTRE EIGHT POINTED STAR", 0x2743: "HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK", 0x2744: "SNOWFLAKE", 0x2745: "TIGHT TRIFOLIATE SNOWFLAKE", 0x2746: "HEAVY CHEVRON SNOWFLAKE", 0x2747: "SPARKLE", 0x2748: "HEAVY SPARKLE", 0x2749: "BALLOON-SPOKED ASTERISK", 0x274A: "EIGHT TEARDROP-SPOKED PROPELLER ASTERISK", 0x274B: "HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK", 0x274C: "", 0x274D: "SHADOWED WHITE CIRCLE", 0x274E: "", 0x274F: "LOWER RIGHT DROP-SHADOWED WHITE SQUARE", 0x2750: "UPPER RIGHT DROP-SHADOWED WHITE SQUARE", 0x2751: "LOWER RIGHT SHADOWED WHITE SQUARE", 0x2752: "UPPER RIGHT SHADOWED WHITE SQUARE", 0x2753: "", 0x2754: "", 0x2755: "", 0x2756: "BLACK DIAMOND MINUS WHITE X", 0x2757: "", 0x2758: "LIGHT VERTICAL BAR", 0x2759: "MEDIUM VERTICAL BAR", 0x275A: "HEAVY VERTICAL BAR", 0x275B: "HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT", 0x275C: "HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT", 0x275D: "HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT", 0x275E: "HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT", 0x2761: "CURVED STEM PARAGRAPH SIGN ORNAMENT", 0x2762: "HEAVY EXCLAMATION MARK ORNAMENT", 0x2763: "HEAVY HEART EXCLAMATION MARK ORNAMENT", 0x2764: "HEAVY BLACK HEART", 0x2765: "ROTATED HEAVY BLACK HEART BULLET", 0x2766: "FLORAL HEART", 0x2767: "ROTATED FLORAL HEART BULLET", 0x2768: "MEDIUM LEFT PARENTHESIS ORNAMENT", 0x2769: "MEDIUM RIGHT PARENTHESIS ORNAMENT", 0x276A: "MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT", 0x276B: "MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT", 0x276C: "MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT", 0x276D: "MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT", 0x276E: "HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT", 0x276F: "HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT", 0x2770: "HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT", 0x2771: "HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT", 0x2772: "LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT", 0x2773: "LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT", 0x2774: "MEDIUM LEFT CURLY BRACKET ORNAMENT", 0x2775: "MEDIUM RIGHT CURLY BRACKET ORNAMENT", 0x2776: "DINGBAT NEGATIVE CIRCLED DIGIT ONE", 0x2777: "DINGBAT NEGATIVE CIRCLED DIGIT TWO", 0x2778: "DINGBAT NEGATIVE CIRCLED DIGIT THREE", 0x2779: "DINGBAT NEGATIVE CIRCLED DIGIT FOUR", 0x277A: "DINGBAT NEGATIVE CIRCLED DIGIT FIVE", 0x277B: "DINGBAT NEGATIVE CIRCLED DIGIT SIX", 0x277C: "DINGBAT NEGATIVE CIRCLED DIGIT SEVEN", 0x277D: "DINGBAT NEGATIVE CIRCLED DIGIT EIGHT", 0x277E: "DINGBAT NEGATIVE CIRCLED DIGIT NINE", 0x277F: "DINGBAT NEGATIVE CIRCLED NUMBER TEN", 0x2780: "DINGBAT CIRCLED SANS-SERIF DIGIT ONE", 0x2781: "DINGBAT CIRCLED SANS-SERIF DIGIT TWO", 0x2782: "DINGBAT CIRCLED SANS-SERIF DIGIT THREE", 0x2783: "DINGBAT CIRCLED SANS-SERIF DIGIT FOUR", 0x2784: "DINGBAT CIRCLED SANS-SERIF DIGIT FIVE", 0x2785: "DINGBAT CIRCLED SANS-SERIF DIGIT SIX", 0x2786: "DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN", 0x2787: "DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT", 0x2788: "DINGBAT CIRCLED SANS-SERIF DIGIT NINE", 0x2789: "DINGBAT CIRCLED SANS-SERIF NUMBER TEN", 0x278A: "DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE", 0x278B: "DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO", 0x278C: "DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE", 0x278D: "DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR", 0x278E: "DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE", 0x278F: "DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX", 0x2790: "DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN", 0x2791: "DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT", 0x2792: "DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE", 0x2793: "DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN", 0x2794: "HEAVY WIDE-HEADED RIGHTWARDS ARROW", 0x2795: "", 0x2796: "", 0x2797: "", 0x2798: "HEAVY SOUTH EAST ARROW", 0x2799: "HEAVY RIGHTWARDS ARROW", 0x279A: "HEAVY NORTH EAST ARROW", 0x279B: "DRAFTING POINT RIGHTWARDS ARROW", 0x279C: "HEAVY ROUND-TIPPED RIGHTWARDS ARROW", 0x279D: "TRIANGLE-HEADED RIGHTWARDS ARROW", 0x279E: "HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW", 0x279F: "DASHED TRIANGLE-HEADED RIGHTWARDS ARROW", 0x27A0: "HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW", 0x27A1: "BLACK RIGHTWARDS ARROW", 0x27A2: "THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD", 0x27A3: "THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD", 0x27A4: "BLACK RIGHTWARDS ARROWHEAD", 0x27A5: "HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW", 0x27A6: "HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW", 0x27A7: "SQUAT BLACK RIGHTWARDS ARROW", 0x27A8: "HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW", 0x27A9: "RIGHT-SHADED WHITE RIGHTWARDS ARROW", 0x27AA: "LEFT-SHADED WHITE RIGHTWARDS ARROW", 0x27AB: "BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW", 0x27AC: "FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW", 0x27AD: "HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW", 0x27AE: "HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW", 0x27AF: "NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW", 0x27B1: "NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW", 0x27B2: "CIRCLED HEAVY WHITE RIGHTWARDS ARROW", 0x27B3: "WHITE-FEATHERED RIGHTWARDS ARROW", 0x27B4: "BLACK-FEATHERED SOUTH EAST ARROW", 0x27B5: "BLACK-FEATHERED RIGHTWARDS ARROW", 0x27B6: "BLACK-FEATHERED NORTH EAST ARROW", 0x27B7: "HEAVY BLACK-FEATHERED SOUTH EAST ARROW", 0x27B8: "HEAVY BLACK-FEATHERED RIGHTWARDS ARROW", 0x27B9: "HEAVY BLACK-FEATHERED NORTH EAST ARROW", 0x27BA: "TEARDROP-BARBED RIGHTWARDS ARROW", 0x27BB: "HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW", 0x27BC: "WEDGE-TAILED RIGHTWARDS ARROW", 0x27BD: "HEAVY WEDGE-TAILED RIGHTWARDS ARROW", 0x27BE: "OPEN-OUTLINED RIGHTWARDS ARROW", 0x27C0: "THREE DIMENSIONAL ANGLE", 0x27C1: "WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE", 0x27C2: "PERPENDICULAR", 0x27C3: "OPEN SUBSET", 0x27C4: "OPEN SUPERSET", 0x27C5: "LEFT S-SHAPED BAG DELIMITER", 0x27C6: "RIGHT S-SHAPED BAG DELIMITER", 0x27C7: "OR WITH DOT INSIDE", 0x27C8: "REVERSE SOLIDUS PRECEDING SUBSET", 0x27C9: "SUPERSET PRECEDING SOLIDUS", 0x27CA: "VERTICAL BAR WITH HORIZONTAL STROKE", 0x27CC: "LONG DIVISION", 0x27D0: "WHITE DIAMOND WITH CENTRED DOT", 0x27D1: "AND WITH DOT", 0x27D2: "ELEMENT OF OPENING UPWARDS", 0x27D3: "LOWER RIGHT CORNER WITH DOT", 0x27D4: "UPPER LEFT CORNER WITH DOT", 0x27D5: "LEFT OUTER JOIN", 0x27D6: "RIGHT OUTER JOIN", 0x27D7: "FULL OUTER JOIN", 0x27D8: "LARGE UP TACK", 0x27D9: "LARGE DOWN TACK", 0x27DA: "LEFT AND RIGHT DOUBLE TURNSTILE", 0x27DB: "LEFT AND RIGHT TACK", 0x27DC: "LEFT MULTIMAP", 0x27DD: "LONG RIGHT TACK", 0x27DE: "LONG LEFT TACK", 0x27DF: "UP TACK WITH CIRCLE ABOVE", 0x27E0: "LOZENGE DIVIDED BY HORIZONTAL RULE", 0x27E1: "WHITE CONCAVE-SIDED DIAMOND", 0x27E2: "WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK", 0x27E3: "WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK", 0x27E4: "WHITE SQUARE WITH LEFTWARDS TICK", 0x27E5: "WHITE SQUARE WITH RIGHTWARDS TICK", 0x27E6: "MATHEMATICAL LEFT WHITE SQUARE BRACKET", 0x27E7: "MATHEMATICAL RIGHT WHITE SQUARE BRACKET", 0x27E8: "MATHEMATICAL LEFT ANGLE BRACKET", 0x27E9: "MATHEMATICAL RIGHT ANGLE BRACKET", 0x27EA: "MATHEMATICAL LEFT DOUBLE ANGLE BRACKET", 0x27EB: "MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET", 0x27EC: "MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET", 0x27ED: "MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET", 0x27EE: "MATHEMATICAL LEFT FLATTENED PARENTHESIS", 0x27EF: "MATHEMATICAL RIGHT FLATTENED PARENTHESIS", 0x27F0: "UPWARDS QUADRUPLE ARROW", 0x27F1: "DOWNWARDS QUADRUPLE ARROW", 0x27F2: "ANTICLOCKWISE GAPPED CIRCLE ARROW", 0x27F3: "CLOCKWISE GAPPED CIRCLE ARROW", 0x27F4: "RIGHT ARROW WITH CIRCLED PLUS", 0x27F5: "LONG LEFTWARDS ARROW", 0x27F6: "LONG RIGHTWARDS ARROW", 0x27F7: "LONG LEFT RIGHT ARROW", 0x27F8: "LONG LEFTWARDS DOUBLE ARROW", 0x27F9: "LONG RIGHTWARDS DOUBLE ARROW", 0x27FA: "LONG LEFT RIGHT DOUBLE ARROW", 0x27FB: "LONG LEFTWARDS ARROW FROM BAR", 0x27FC: "LONG RIGHTWARDS ARROW FROM BAR", 0x27FD: "LONG LEFTWARDS DOUBLE ARROW FROM BAR", 0x27FE: "LONG RIGHTWARDS DOUBLE ARROW FROM BAR", 0x27FF: "LONG RIGHTWARDS SQUIGGLE ARROW", 0x2800: "BRAILLE PATTERN BLANK", 0x2801: "BRAILLE PATTERN DOTS-1", 0x2802: "BRAILLE PATTERN DOTS-2", 0x2803: "BRAILLE PATTERN DOTS-12", 0x2804: "BRAILLE PATTERN DOTS-3", 0x2805: "BRAILLE PATTERN DOTS-13", 0x2806: "BRAILLE PATTERN DOTS-23", 0x2807: "BRAILLE PATTERN DOTS-123", 0x2808: "BRAILLE PATTERN DOTS-4", 0x2809: "BRAILLE PATTERN DOTS-14", 0x280A: "BRAILLE PATTERN DOTS-24", 0x280B: "BRAILLE PATTERN DOTS-124", 0x280C: "BRAILLE PATTERN DOTS-34", 0x280D: "BRAILLE PATTERN DOTS-134", 0x280E: "BRAILLE PATTERN DOTS-234", 0x280F: "BRAILLE PATTERN DOTS-1234", 0x2810: "BRAILLE PATTERN DOTS-5", 0x2811: "BRAILLE PATTERN DOTS-15", 0x2812: "BRAILLE PATTERN DOTS-25", 0x2813: "BRAILLE PATTERN DOTS-125", 0x2814: "BRAILLE PATTERN DOTS-35", 0x2815: "BRAILLE PATTERN DOTS-135", 0x2816: "BRAILLE PATTERN DOTS-235", 0x2817: "BRAILLE PATTERN DOTS-1235", 0x2818: "BRAILLE PATTERN DOTS-45", 0x2819: "BRAILLE PATTERN DOTS-145", 0x281A: "BRAILLE PATTERN DOTS-245", 0x281B: "BRAILLE PATTERN DOTS-1245", 0x281C: "BRAILLE PATTERN DOTS-345", 0x281D: "BRAILLE PATTERN DOTS-1345", 0x281E: "BRAILLE PATTERN DOTS-2345", 0x281F: "BRAILLE PATTERN DOTS-12345", 0x2820: "BRAILLE PATTERN DOTS-6", 0x2821: "BRAILLE PATTERN DOTS-16", 0x2822: "BRAILLE PATTERN DOTS-26", 0x2823: "BRAILLE PATTERN DOTS-126", 0x2824: "BRAILLE PATTERN DOTS-36", 0x2825: "BRAILLE PATTERN DOTS-136", 0x2826: "BRAILLE PATTERN DOTS-236", 0x2827: "BRAILLE PATTERN DOTS-1236", 0x2828: "BRAILLE PATTERN DOTS-46", 0x2829: "BRAILLE PATTERN DOTS-146", 0x282A: "BRAILLE PATTERN DOTS-246", 0x282B: "BRAILLE PATTERN DOTS-1246", 0x282C: "BRAILLE PATTERN DOTS-346", 0x282D: "BRAILLE PATTERN DOTS-1346", 0x282E: "BRAILLE PATTERN DOTS-2346", 0x282F: "BRAILLE PATTERN DOTS-12346", 0x2830: "BRAILLE PATTERN DOTS-56", 0x2831: "BRAILLE PATTERN DOTS-156", 0x2832: "BRAILLE PATTERN DOTS-256", 0x2833: "BRAILLE PATTERN DOTS-1256", 0x2834: "BRAILLE PATTERN DOTS-356", 0x2835: "BRAILLE PATTERN DOTS-1356", 0x2836: "BRAILLE PATTERN DOTS-2356", 0x2837: "BRAILLE PATTERN DOTS-12356", 0x2838: "BRAILLE PATTERN DOTS-456", 0x2839: "BRAILLE PATTERN DOTS-1456", 0x283A: "BRAILLE PATTERN DOTS-2456", 0x283B: "BRAILLE PATTERN DOTS-12456", 0x283C: "BRAILLE PATTERN DOTS-3456", 0x283D: "BRAILLE PATTERN DOTS-13456", 0x283E: "BRAILLE PATTERN DOTS-23456", 0x283F: "BRAILLE PATTERN DOTS-123456", 0x2840: "BRAILLE PATTERN DOTS-7", 0x2841: "BRAILLE PATTERN DOTS-17", 0x2842: "BRAILLE PATTERN DOTS-27", 0x2843: "BRAILLE PATTERN DOTS-127", 0x2844: "BRAILLE PATTERN DOTS-37", 0x2845: "BRAILLE PATTERN DOTS-137", 0x2846: "BRAILLE PATTERN DOTS-237", 0x2847: "BRAILLE PATTERN DOTS-1237", 0x2848: "BRAILLE PATTERN DOTS-47", 0x2849: "BRAILLE PATTERN DOTS-147", 0x284A: "BRAILLE PATTERN DOTS-247", 0x284B: "BRAILLE PATTERN DOTS-1247", 0x284C: "BRAILLE PATTERN DOTS-347", 0x284D: "BRAILLE PATTERN DOTS-1347", 0x284E: "BRAILLE PATTERN DOTS-2347", 0x284F: "BRAILLE PATTERN DOTS-12347", 0x2850: "BRAILLE PATTERN DOTS-57", 0x2851: "BRAILLE PATTERN DOTS-157", 0x2852: "BRAILLE PATTERN DOTS-257", 0x2853: "BRAILLE PATTERN DOTS-1257", 0x2854: "BRAILLE PATTERN DOTS-357", 0x2855: "BRAILLE PATTERN DOTS-1357", 0x2856: "BRAILLE PATTERN DOTS-2357", 0x2857: "BRAILLE PATTERN DOTS-12357", 0x2858: "BRAILLE PATTERN DOTS-457", 0x2859: "BRAILLE PATTERN DOTS-1457", 0x285A: "BRAILLE PATTERN DOTS-2457", 0x285B: "BRAILLE PATTERN DOTS-12457", 0x285C: "BRAILLE PATTERN DOTS-3457", 0x285D: "BRAILLE PATTERN DOTS-13457", 0x285E: "BRAILLE PATTERN DOTS-23457", 0x285F: "BRAILLE PATTERN DOTS-123457", 0x2860: "BRAILLE PATTERN DOTS-67", 0x2861: "BRAILLE PATTERN DOTS-167", 0x2862: "BRAILLE PATTERN DOTS-267", 0x2863: "BRAILLE PATTERN DOTS-1267", 0x2864: "BRAILLE PATTERN DOTS-367", 0x2865: "BRAILLE PATTERN DOTS-1367", 0x2866: "BRAILLE PATTERN DOTS-2367", 0x2867: "BRAILLE PATTERN DOTS-12367", 0x2868: "BRAILLE PATTERN DOTS-467", 0x2869: "BRAILLE PATTERN DOTS-1467", 0x286A: "BRAILLE PATTERN DOTS-2467", 0x286B: "BRAILLE PATTERN DOTS-12467", 0x286C: "BRAILLE PATTERN DOTS-3467", 0x286D: "BRAILLE PATTERN DOTS-13467", 0x286E: "BRAILLE PATTERN DOTS-23467", 0x286F: "BRAILLE PATTERN DOTS-123467", 0x2870: "BRAILLE PATTERN DOTS-567", 0x2871: "BRAILLE PATTERN DOTS-1567", 0x2872: "BRAILLE PATTERN DOTS-2567", 0x2873: "BRAILLE PATTERN DOTS-12567", 0x2874: "BRAILLE PATTERN DOTS-3567", 0x2875: "BRAILLE PATTERN DOTS-13567", 0x2876: "BRAILLE PATTERN DOTS-23567", 0x2877: "BRAILLE PATTERN DOTS-123567", 0x2878: "BRAILLE PATTERN DOTS-4567", 0x2879: "BRAILLE PATTERN DOTS-14567", 0x287A: "BRAILLE PATTERN DOTS-24567", 0x287B: "BRAILLE PATTERN DOTS-124567", 0x287C: "BRAILLE PATTERN DOTS-34567", 0x287D: "BRAILLE PATTERN DOTS-134567", 0x287E: "BRAILLE PATTERN DOTS-234567", 0x287F: "BRAILLE PATTERN DOTS-1234567", 0x2880: "BRAILLE PATTERN DOTS-8", 0x2881: "BRAILLE PATTERN DOTS-18", 0x2882: "BRAILLE PATTERN DOTS-28", 0x2883: "BRAILLE PATTERN DOTS-128", 0x2884: "BRAILLE PATTERN DOTS-38", 0x2885: "BRAILLE PATTERN DOTS-138", 0x2886: "BRAILLE PATTERN DOTS-238", 0x2887: "BRAILLE PATTERN DOTS-1238", 0x2888: "BRAILLE PATTERN DOTS-48", 0x2889: "BRAILLE PATTERN DOTS-148", 0x288A: "BRAILLE PATTERN DOTS-248", 0x288B: "BRAILLE PATTERN DOTS-1248", 0x288C: "BRAILLE PATTERN DOTS-348", 0x288D: "BRAILLE PATTERN DOTS-1348", 0x288E: "BRAILLE PATTERN DOTS-2348", 0x288F: "BRAILLE PATTERN DOTS-12348", 0x2890: "BRAILLE PATTERN DOTS-58", 0x2891: "BRAILLE PATTERN DOTS-158", 0x2892: "BRAILLE PATTERN DOTS-258", 0x2893: "BRAILLE PATTERN DOTS-1258", 0x2894: "BRAILLE PATTERN DOTS-358", 0x2895: "BRAILLE PATTERN DOTS-1358", 0x2896: "BRAILLE PATTERN DOTS-2358", 0x2897: "BRAILLE PATTERN DOTS-12358", 0x2898: "BRAILLE PATTERN DOTS-458", 0x2899: "BRAILLE PATTERN DOTS-1458", 0x289A: "BRAILLE PATTERN DOTS-2458", 0x289B: "BRAILLE PATTERN DOTS-12458", 0x289C: "BRAILLE PATTERN DOTS-3458", 0x289D: "BRAILLE PATTERN DOTS-13458", 0x289E: "BRAILLE PATTERN DOTS-23458", 0x289F: "BRAILLE PATTERN DOTS-123458", 0x28A0: "BRAILLE PATTERN DOTS-68", 0x28A1: "BRAILLE PATTERN DOTS-168", 0x28A2: "BRAILLE PATTERN DOTS-268", 0x28A3: "BRAILLE PATTERN DOTS-1268", 0x28A4: "BRAILLE PATTERN DOTS-368", 0x28A5: "BRAILLE PATTERN DOTS-1368", 0x28A6: "BRAILLE PATTERN DOTS-2368", 0x28A7: "BRAILLE PATTERN DOTS-12368", 0x28A8: "BRAILLE PATTERN DOTS-468", 0x28A9: "BRAILLE PATTERN DOTS-1468", 0x28AA: "BRAILLE PATTERN DOTS-2468", 0x28AB: "BRAILLE PATTERN DOTS-12468", 0x28AC: "BRAILLE PATTERN DOTS-3468", 0x28AD: "BRAILLE PATTERN DOTS-13468", 0x28AE: "BRAILLE PATTERN DOTS-23468", 0x28AF: "BRAILLE PATTERN DOTS-123468", 0x28B0: "BRAILLE PATTERN DOTS-568", 0x28B1: "BRAILLE PATTERN DOTS-1568", 0x28B2: "BRAILLE PATTERN DOTS-2568", 0x28B3: "BRAILLE PATTERN DOTS-12568", 0x28B4: "BRAILLE PATTERN DOTS-3568", 0x28B5: "BRAILLE PATTERN DOTS-13568", 0x28B6: "BRAILLE PATTERN DOTS-23568", 0x28B7: "BRAILLE PATTERN DOTS-123568", 0x28B8: "BRAILLE PATTERN DOTS-4568", 0x28B9: "BRAILLE PATTERN DOTS-14568", 0x28BA: "BRAILLE PATTERN DOTS-24568", 0x28BB: "BRAILLE PATTERN DOTS-124568", 0x28BC: "BRAILLE PATTERN DOTS-34568", 0x28BD: "BRAILLE PATTERN DOTS-134568", 0x28BE: "BRAILLE PATTERN DOTS-234568", 0x28BF: "BRAILLE PATTERN DOTS-1234568", 0x28C0: "BRAILLE PATTERN DOTS-78", 0x28C1: "BRAILLE PATTERN DOTS-178", 0x28C2: "BRAILLE PATTERN DOTS-278", 0x28C3: "BRAILLE PATTERN DOTS-1278", 0x28C4: "BRAILLE PATTERN DOTS-378", 0x28C5: "BRAILLE PATTERN DOTS-1378", 0x28C6: "BRAILLE PATTERN DOTS-2378", 0x28C7: "BRAILLE PATTERN DOTS-12378", 0x28C8: "BRAILLE PATTERN DOTS-478", 0x28C9: "BRAILLE PATTERN DOTS-1478", 0x28CA: "BRAILLE PATTERN DOTS-2478", 0x28CB: "BRAILLE PATTERN DOTS-12478", 0x28CC: "BRAILLE PATTERN DOTS-3478", 0x28CD: "BRAILLE PATTERN DOTS-13478", 0x28CE: "BRAILLE PATTERN DOTS-23478", 0x28CF: "BRAILLE PATTERN DOTS-123478", 0x28D0: "BRAILLE PATTERN DOTS-578", 0x28D1: "BRAILLE PATTERN DOTS-1578", 0x28D2: "BRAILLE PATTERN DOTS-2578", 0x28D3: "BRAILLE PATTERN DOTS-12578", 0x28D4: "BRAILLE PATTERN DOTS-3578", 0x28D5: "BRAILLE PATTERN DOTS-13578", 0x28D6: "BRAILLE PATTERN DOTS-23578", 0x28D7: "BRAILLE PATTERN DOTS-123578", 0x28D8: "BRAILLE PATTERN DOTS-4578", 0x28D9: "BRAILLE PATTERN DOTS-14578", 0x28DA: "BRAILLE PATTERN DOTS-24578", 0x28DB: "BRAILLE PATTERN DOTS-124578", 0x28DC: "BRAILLE PATTERN DOTS-34578", 0x28DD: "BRAILLE PATTERN DOTS-134578", 0x28DE: "BRAILLE PATTERN DOTS-234578", 0x28DF: "BRAILLE PATTERN DOTS-1234578", 0x28E0: "BRAILLE PATTERN DOTS-678", 0x28E1: "BRAILLE PATTERN DOTS-1678", 0x28E2: "BRAILLE PATTERN DOTS-2678", 0x28E3: "BRAILLE PATTERN DOTS-12678", 0x28E4: "BRAILLE PATTERN DOTS-3678", 0x28E5: "BRAILLE PATTERN DOTS-13678", 0x28E6: "BRAILLE PATTERN DOTS-23678", 0x28E7: "BRAILLE PATTERN DOTS-123678", 0x28E8: "BRAILLE PATTERN DOTS-4678", 0x28E9: "BRAILLE PATTERN DOTS-14678", 0x28EA: "BRAILLE PATTERN DOTS-24678", 0x28EB: "BRAILLE PATTERN DOTS-124678", 0x28EC: "BRAILLE PATTERN DOTS-34678", 0x28ED: "BRAILLE PATTERN DOTS-134678", 0x28EE: "BRAILLE PATTERN DOTS-234678", 0x28EF: "BRAILLE PATTERN DOTS-1234678", 0x28F0: "BRAILLE PATTERN DOTS-5678", 0x28F1: "BRAILLE PATTERN DOTS-15678", 0x28F2: "BRAILLE PATTERN DOTS-25678", 0x28F3: "BRAILLE PATTERN DOTS-125678", 0x28F4: "BRAILLE PATTERN DOTS-35678", 0x28F5: "BRAILLE PATTERN DOTS-135678", 0x28F6: "BRAILLE PATTERN DOTS-235678", 0x28F7: "BRAILLE PATTERN DOTS-1235678", 0x28F8: "BRAILLE PATTERN DOTS-45678", 0x28F9: "BRAILLE PATTERN DOTS-145678", 0x28FA: "BRAILLE PATTERN DOTS-245678", 0x28FB: "BRAILLE PATTERN DOTS-1245678", 0x28FC: "BRAILLE PATTERN DOTS-345678", 0x28FD: "BRAILLE PATTERN DOTS-1345678", 0x28FE: "BRAILLE PATTERN DOTS-2345678", 0x28FF: "BRAILLE PATTERN DOTS-12345678", 0x2900: "RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE", 0x2901: "RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE", 0x2902: "LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE", 0x2903: "RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE", 0x2904: "LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE", 0x2905: "RIGHTWARDS TWO-HEADED ARROW FROM BAR", 0x2906: "LEFTWARDS DOUBLE ARROW FROM BAR", 0x2907: "RIGHTWARDS DOUBLE ARROW FROM BAR", 0x2908: "DOWNWARDS ARROW WITH HORIZONTAL STROKE", 0x2909: "UPWARDS ARROW WITH HORIZONTAL STROKE", 0x290A: "UPWARDS TRIPLE ARROW", 0x290B: "DOWNWARDS TRIPLE ARROW", 0x290C: "LEFTWARDS DOUBLE DASH ARROW", 0x290D: "RIGHTWARDS DOUBLE DASH ARROW", 0x290E: "LEFTWARDS TRIPLE DASH ARROW", 0x290F: "RIGHTWARDS TRIPLE DASH ARROW", 0x2910: "RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW", 0x2911: "RIGHTWARDS ARROW WITH DOTTED STEM", 0x2912: "UPWARDS ARROW TO BAR", 0x2913: "DOWNWARDS ARROW TO BAR", 0x2914: "RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE", 0x2915: "RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE", 0x2916: "RIGHTWARDS TWO-HEADED ARROW WITH TAIL", 0x2917: "RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE", 0x2918: "RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE", 0x2919: "LEFTWARDS ARROW-TAIL", 0x291A: "RIGHTWARDS ARROW-TAIL", 0x291B: "LEFTWARDS DOUBLE ARROW-TAIL", 0x291C: "RIGHTWARDS DOUBLE ARROW-TAIL", 0x291D: "LEFTWARDS ARROW TO BLACK DIAMOND", 0x291E: "RIGHTWARDS ARROW TO BLACK DIAMOND", 0x291F: "LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND", 0x2920: "RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND", 0x2921: "NORTH WEST AND SOUTH EAST ARROW", 0x2922: "NORTH EAST AND SOUTH WEST ARROW", 0x2923: "NORTH WEST ARROW WITH HOOK", 0x2924: "NORTH EAST ARROW WITH HOOK", 0x2925: "SOUTH EAST ARROW WITH HOOK", 0x2926: "SOUTH WEST ARROW WITH HOOK", 0x2927: "NORTH WEST ARROW AND NORTH EAST ARROW", 0x2928: "NORTH EAST ARROW AND SOUTH EAST ARROW", 0x2929: "SOUTH EAST ARROW AND SOUTH WEST ARROW", 0x292A: "SOUTH WEST ARROW AND NORTH WEST ARROW", 0x292B: "RISING DIAGONAL CROSSING FALLING DIAGONAL", 0x292C: "FALLING DIAGONAL CROSSING RISING DIAGONAL", 0x292D: "SOUTH EAST ARROW CROSSING NORTH EAST ARROW", 0x292E: "NORTH EAST ARROW CROSSING SOUTH EAST ARROW", 0x292F: "FALLING DIAGONAL CROSSING NORTH EAST ARROW", 0x2930: "RISING DIAGONAL CROSSING SOUTH EAST ARROW", 0x2931: "NORTH EAST ARROW CROSSING NORTH WEST ARROW", 0x2932: "NORTH WEST ARROW CROSSING NORTH EAST ARROW", 0x2933: "WAVE ARROW POINTING DIRECTLY RIGHT", 0x2934: "ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS", 0x2935: "ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS", 0x2936: "ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS", 0x2937: "ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS", 0x2938: "RIGHT-SIDE ARC CLOCKWISE ARROW", 0x2939: "LEFT-SIDE ARC ANTICLOCKWISE ARROW", 0x293A: "TOP ARC ANTICLOCKWISE ARROW", 0x293B: "BOTTOM ARC ANTICLOCKWISE ARROW", 0x293C: "TOP ARC CLOCKWISE ARROW WITH MINUS", 0x293D: "TOP ARC ANTICLOCKWISE ARROW WITH PLUS", 0x293E: "LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW", 0x293F: "LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW", 0x2940: "ANTICLOCKWISE CLOSED CIRCLE ARROW", 0x2941: "CLOCKWISE CLOSED CIRCLE ARROW", 0x2942: "RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW", 0x2943: "LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW", 0x2944: "SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW", 0x2945: "RIGHTWARDS ARROW WITH PLUS BELOW", 0x2946: "LEFTWARDS ARROW WITH PLUS BELOW", 0x2947: "RIGHTWARDS ARROW THROUGH X", 0x2948: "LEFT RIGHT ARROW THROUGH SMALL CIRCLE", 0x2949: "UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE", 0x294A: "LEFT BARB UP RIGHT BARB DOWN HARPOON", 0x294B: "LEFT BARB DOWN RIGHT BARB UP HARPOON", 0x294C: "UP BARB RIGHT DOWN BARB LEFT HARPOON", 0x294D: "UP BARB LEFT DOWN BARB RIGHT HARPOON", 0x294E: "LEFT BARB UP RIGHT BARB UP HARPOON", 0x294F: "UP BARB RIGHT DOWN BARB RIGHT HARPOON", 0x2950: "LEFT BARB DOWN RIGHT BARB DOWN HARPOON", 0x2951: "UP BARB LEFT DOWN BARB LEFT HARPOON", 0x2952: "LEFTWARDS HARPOON WITH BARB UP TO BAR", 0x2953: "RIGHTWARDS HARPOON WITH BARB UP TO BAR", 0x2954: "UPWARDS HARPOON WITH BARB RIGHT TO BAR", 0x2955: "DOWNWARDS HARPOON WITH BARB RIGHT TO BAR", 0x2956: "LEFTWARDS HARPOON WITH BARB DOWN TO BAR", 0x2957: "RIGHTWARDS HARPOON WITH BARB DOWN TO BAR", 0x2958: "UPWARDS HARPOON WITH BARB LEFT TO BAR", 0x2959: "DOWNWARDS HARPOON WITH BARB LEFT TO BAR", 0x295A: "LEFTWARDS HARPOON WITH BARB UP FROM BAR", 0x295B: "RIGHTWARDS HARPOON WITH BARB UP FROM BAR", 0x295C: "UPWARDS HARPOON WITH BARB RIGHT FROM BAR", 0x295D: "DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR", 0x295E: "LEFTWARDS HARPOON WITH BARB DOWN FROM BAR", 0x295F: "RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR", 0x2960: "UPWARDS HARPOON WITH BARB LEFT FROM BAR", 0x2961: "DOWNWARDS HARPOON WITH BARB LEFT FROM BAR", 0x2962: "LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN", 0x2963: "UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT", 0x2964: "RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN", 0x2965: "DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT", 0x2966: "LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP", 0x2967: "LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN", 0x2968: "RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP", 0x2969: "RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN", 0x296A: "LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH", 0x296B: "LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH", 0x296C: "RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH", 0x296D: "RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH", 0x296E: "UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT", 0x296F: "DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT", 0x2970: "RIGHT DOUBLE ARROW WITH ROUNDED HEAD", 0x2971: "EQUALS SIGN ABOVE RIGHTWARDS ARROW", 0x2972: "TILDE OPERATOR ABOVE RIGHTWARDS ARROW", 0x2973: "LEFTWARDS ARROW ABOVE TILDE OPERATOR", 0x2974: "RIGHTWARDS ARROW ABOVE TILDE OPERATOR", 0x2975: "RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO", 0x2976: "LESS-THAN ABOVE LEFTWARDS ARROW", 0x2977: "LEFTWARDS ARROW THROUGH LESS-THAN", 0x2978: "GREATER-THAN ABOVE RIGHTWARDS ARROW", 0x2979: "SUBSET ABOVE RIGHTWARDS ARROW", 0x297A: "LEFTWARDS ARROW THROUGH SUBSET", 0x297B: "SUPERSET ABOVE LEFTWARDS ARROW", 0x297C: "LEFT FISH TAIL", 0x297D: "RIGHT FISH TAIL", 0x297E: "UP FISH TAIL", 0x297F: "DOWN FISH TAIL", 0x2980: "TRIPLE VERTICAL BAR DELIMITER", 0x2981: "Z NOTATION SPOT", 0x2982: "Z NOTATION TYPE COLON", 0x2983: "LEFT WHITE CURLY BRACKET", 0x2984: "RIGHT WHITE CURLY BRACKET", 0x2985: "LEFT WHITE PARENTHESIS", 0x2986: "RIGHT WHITE PARENTHESIS", 0x2987: "Z NOTATION LEFT IMAGE BRACKET", 0x2988: "Z NOTATION RIGHT IMAGE BRACKET", 0x2989: "Z NOTATION LEFT BINDING BRACKET", 0x298A: "Z NOTATION RIGHT BINDING BRACKET", 0x298B: "LEFT SQUARE BRACKET WITH UNDERBAR", 0x298C: "RIGHT SQUARE BRACKET WITH UNDERBAR", 0x298D: "LEFT SQUARE BRACKET WITH TICK IN TOP CORNER", 0x298E: "RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER", 0x298F: "LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER", 0x2990: "RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER", 0x2991: "LEFT ANGLE BRACKET WITH DOT", 0x2992: "RIGHT ANGLE BRACKET WITH DOT", 0x2993: "LEFT ARC LESS-THAN BRACKET", 0x2994: "RIGHT ARC GREATER-THAN BRACKET", 0x2995: "DOUBLE LEFT ARC GREATER-THAN BRACKET", 0x2996: "DOUBLE RIGHT ARC LESS-THAN BRACKET", 0x2997: "LEFT BLACK TORTOISE SHELL BRACKET", 0x2998: "RIGHT BLACK TORTOISE SHELL BRACKET", 0x2999: "DOTTED FENCE", 0x299A: "VERTICAL ZIGZAG LINE", 0x299B: "MEASURED ANGLE OPENING LEFT", 0x299C: "RIGHT ANGLE VARIANT WITH SQUARE", 0x299D: "MEASURED RIGHT ANGLE WITH DOT", 0x299E: "ANGLE WITH S INSIDE", 0x299F: "ACUTE ANGLE", 0x29A0: "SPHERICAL ANGLE OPENING LEFT", 0x29A1: "SPHERICAL ANGLE OPENING UP", 0x29A2: "TURNED ANGLE", 0x29A3: "REVERSED ANGLE", 0x29A4: "ANGLE WITH UNDERBAR", 0x29A5: "REVERSED ANGLE WITH UNDERBAR", 0x29A6: "OBLIQUE ANGLE OPENING UP", 0x29A7: "OBLIQUE ANGLE OPENING DOWN", 0x29A8: "MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT", 0x29A9: "MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT", 0x29AA: "MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT", 0x29AB: "MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT", 0x29AC: "MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP", 0x29AD: "MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP", 0x29AE: "MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN", 0x29AF: "MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN", 0x29B0: "REVERSED EMPTY SET", 0x29B1: "EMPTY SET WITH OVERBAR", 0x29B2: "EMPTY SET WITH SMALL CIRCLE ABOVE", 0x29B3: "EMPTY SET WITH RIGHT ARROW ABOVE", 0x29B4: "EMPTY SET WITH LEFT ARROW ABOVE", 0x29B5: "CIRCLE WITH HORIZONTAL BAR", 0x29B6: "CIRCLED VERTICAL BAR", 0x29B7: "CIRCLED PARALLEL", 0x29B8: "CIRCLED REVERSE SOLIDUS", 0x29B9: "CIRCLED PERPENDICULAR", 0x29BA: "CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR", 0x29BB: "CIRCLE WITH SUPERIMPOSED X", 0x29BC: "CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN", 0x29BD: "UP ARROW THROUGH CIRCLE", 0x29BE: "CIRCLED WHITE BULLET", 0x29BF: "CIRCLED BULLET", 0x29C0: "CIRCLED LESS-THAN", 0x29C1: "CIRCLED GREATER-THAN", 0x29C2: "CIRCLE WITH SMALL CIRCLE TO THE RIGHT", 0x29C3: "CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT", 0x29C4: "SQUARED RISING DIAGONAL SLASH", 0x29C5: "SQUARED FALLING DIAGONAL SLASH", 0x29C6: "SQUARED ASTERISK", 0x29C7: "SQUARED SMALL CIRCLE", 0x29C8: "SQUARED SQUARE", 0x29C9: "TWO JOINED SQUARES", 0x29CA: "TRIANGLE WITH DOT ABOVE", 0x29CB: "TRIANGLE WITH UNDERBAR", 0x29CC: "S IN TRIANGLE", 0x29CD: "TRIANGLE WITH SERIFS AT BOTTOM", 0x29CE: "RIGHT TRIANGLE ABOVE LEFT TRIANGLE", 0x29CF: "LEFT TRIANGLE BESIDE VERTICAL BAR", 0x29D0: "VERTICAL BAR BESIDE RIGHT TRIANGLE", 0x29D1: "BOWTIE WITH LEFT HALF BLACK", 0x29D2: "BOWTIE WITH RIGHT HALF BLACK", 0x29D3: "BLACK BOWTIE", 0x29D4: "TIMES WITH LEFT HALF BLACK", 0x29D5: "TIMES WITH RIGHT HALF BLACK", 0x29D6: "WHITE HOURGLASS", 0x29D7: "BLACK HOURGLASS", 0x29D8: "LEFT WIGGLY FENCE", 0x29D9: "RIGHT WIGGLY FENCE", 0x29DA: "LEFT DOUBLE WIGGLY FENCE", 0x29DB: "RIGHT DOUBLE WIGGLY FENCE", 0x29DC: "INCOMPLETE INFINITY", 0x29DD: "TIE OVER INFINITY", 0x29DE: "INFINITY NEGATED WITH VERTICAL BAR", 0x29DF: "DOUBLE-ENDED MULTIMAP", 0x29E0: "SQUARE WITH CONTOURED OUTLINE", 0x29E1: "INCREASES AS", 0x29E2: "SHUFFLE PRODUCT", 0x29E3: "EQUALS SIGN AND SLANTED PARALLEL", 0x29E4: "EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE", 0x29E5: "IDENTICAL TO AND SLANTED PARALLEL", 0x29E6: "GLEICH STARK", 0x29E7: "THERMODYNAMIC", 0x29E8: "DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK", 0x29E9: "DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK", 0x29EA: "BLACK DIAMOND WITH DOWN ARROW", 0x29EB: "BLACK LOZENGE", 0x29EC: "WHITE CIRCLE WITH DOWN ARROW", 0x29ED: "BLACK CIRCLE WITH DOWN ARROW", 0x29EE: "ERROR-BARRED WHITE SQUARE", 0x29EF: "ERROR-BARRED BLACK SQUARE", 0x29F0: "ERROR-BARRED WHITE DIAMOND", 0x29F1: "ERROR-BARRED BLACK DIAMOND", 0x29F2: "ERROR-BARRED WHITE CIRCLE", 0x29F3: "ERROR-BARRED BLACK CIRCLE", 0x29F4: "RULE-DELAYED", 0x29F5: "REVERSE SOLIDUS OPERATOR", 0x29F6: "SOLIDUS WITH OVERBAR", 0x29F7: "REVERSE SOLIDUS WITH HORIZONTAL STROKE", 0x29F8: "BIG SOLIDUS", 0x29F9: "BIG REVERSE SOLIDUS", 0x29FA: "DOUBLE PLUS", 0x29FB: "TRIPLE PLUS", 0x29FC: "LEFT-POINTING CURVED ANGLE BRACKET", 0x29FD: "RIGHT-POINTING CURVED ANGLE BRACKET", 0x29FE: "TINY", 0x29FF: "MINY", 0x2A00: "N-ARY CIRCLED DOT OPERATOR", 0x2A01: "N-ARY CIRCLED PLUS OPERATOR", 0x2A02: "N-ARY CIRCLED TIMES OPERATOR", 0x2A03: "N-ARY UNION OPERATOR WITH DOT", 0x2A04: "N-ARY UNION OPERATOR WITH PLUS", 0x2A05: "N-ARY SQUARE INTERSECTION OPERATOR", 0x2A06: "N-ARY SQUARE UNION OPERATOR", 0x2A07: "TWO LOGICAL AND OPERATOR", 0x2A08: "TWO LOGICAL OR OPERATOR", 0x2A09: "N-ARY TIMES OPERATOR", 0x2A0A: "MODULO TWO SUM", 0x2A0B: "SUMMATION WITH INTEGRAL", 0x2A0C: "QUADRUPLE INTEGRAL OPERATOR", 0x2A0D: "FINITE PART INTEGRAL", 0x2A0E: "INTEGRAL WITH DOUBLE STROKE", 0x2A0F: "INTEGRAL AVERAGE WITH SLASH", 0x2A10: "CIRCULATION FUNCTION", 0x2A11: "ANTICLOCKWISE INTEGRATION", 0x2A12: "LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE", 0x2A13: "LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE", 0x2A14: "LINE INTEGRATION NOT INCLUDING THE POLE", 0x2A15: "INTEGRAL AROUND A POINT OPERATOR", 0x2A16: "QUATERNION INTEGRAL OPERATOR", 0x2A17: "INTEGRAL WITH LEFTWARDS ARROW WITH HOOK", 0x2A18: "INTEGRAL WITH TIMES SIGN", 0x2A19: "INTEGRAL WITH INTERSECTION", 0x2A1A: "INTEGRAL WITH UNION", 0x2A1B: "INTEGRAL WITH OVERBAR", 0x2A1C: "INTEGRAL WITH UNDERBAR", 0x2A1D: "JOIN", 0x2A1E: "LARGE LEFT TRIANGLE OPERATOR", 0x2A1F: "Z NOTATION SCHEMA COMPOSITION", 0x2A20: "Z NOTATION SCHEMA PIPING", 0x2A21: "Z NOTATION SCHEMA PROJECTION", 0x2A22: "PLUS SIGN WITH SMALL CIRCLE ABOVE", 0x2A23: "PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE", 0x2A24: "PLUS SIGN WITH TILDE ABOVE", 0x2A25: "PLUS SIGN WITH DOT BELOW", 0x2A26: "PLUS SIGN WITH TILDE BELOW", 0x2A27: "PLUS SIGN WITH SUBSCRIPT TWO", 0x2A28: "PLUS SIGN WITH BLACK TRIANGLE", 0x2A29: "MINUS SIGN WITH COMMA ABOVE", 0x2A2A: "MINUS SIGN WITH DOT BELOW", 0x2A2B: "MINUS SIGN WITH FALLING DOTS", 0x2A2C: "MINUS SIGN WITH RISING DOTS", 0x2A2D: "PLUS SIGN IN LEFT HALF CIRCLE", 0x2A2E: "PLUS SIGN IN RIGHT HALF CIRCLE", 0x2A2F: "VECTOR OR CROSS PRODUCT", 0x2A30: "MULTIPLICATION SIGN WITH DOT ABOVE", 0x2A31: "MULTIPLICATION SIGN WITH UNDERBAR", 0x2A32: "SEMIDIRECT PRODUCT WITH BOTTOM CLOSED", 0x2A33: "SMASH PRODUCT", 0x2A34: "MULTIPLICATION SIGN IN LEFT HALF CIRCLE", 0x2A35: "MULTIPLICATION SIGN IN RIGHT HALF CIRCLE", 0x2A36: "CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT", 0x2A37: "MULTIPLICATION SIGN IN DOUBLE CIRCLE", 0x2A38: "CIRCLED DIVISION SIGN", 0x2A39: "PLUS SIGN IN TRIANGLE", 0x2A3A: "MINUS SIGN IN TRIANGLE", 0x2A3B: "MULTIPLICATION SIGN IN TRIANGLE", 0x2A3C: "INTERIOR PRODUCT", 0x2A3D: "RIGHTHAND INTERIOR PRODUCT", 0x2A3E: "Z NOTATION RELATIONAL COMPOSITION", 0x2A3F: "AMALGAMATION OR COPRODUCT", 0x2A40: "INTERSECTION WITH DOT", 0x2A41: "UNION WITH MINUS SIGN", 0x2A42: "UNION WITH OVERBAR", 0x2A43: "INTERSECTION WITH OVERBAR", 0x2A44: "INTERSECTION WITH LOGICAL AND", 0x2A45: "UNION WITH LOGICAL OR", 0x2A46: "UNION ABOVE INTERSECTION", 0x2A47: "INTERSECTION ABOVE UNION", 0x2A48: "UNION ABOVE BAR ABOVE INTERSECTION", 0x2A49: "INTERSECTION ABOVE BAR ABOVE UNION", 0x2A4A: "UNION BESIDE AND JOINED WITH UNION", 0x2A4B: "INTERSECTION BESIDE AND JOINED WITH INTERSECTION", 0x2A4C: "CLOSED UNION WITH SERIFS", 0x2A4D: "CLOSED INTERSECTION WITH SERIFS", 0x2A4E: "DOUBLE SQUARE INTERSECTION", 0x2A4F: "DOUBLE SQUARE UNION", 0x2A50: "CLOSED UNION WITH SERIFS AND SMASH PRODUCT", 0x2A51: "LOGICAL AND WITH DOT ABOVE", 0x2A52: "LOGICAL OR WITH DOT ABOVE", 0x2A53: "DOUBLE LOGICAL AND", 0x2A54: "DOUBLE LOGICAL OR", 0x2A55: "TWO INTERSECTING LOGICAL AND", 0x2A56: "TWO INTERSECTING LOGICAL OR", 0x2A57: "SLOPING LARGE OR", 0x2A58: "SLOPING LARGE AND", 0x2A59: "LOGICAL OR OVERLAPPING LOGICAL AND", 0x2A5A: "LOGICAL AND WITH MIDDLE STEM", 0x2A5B: "LOGICAL OR WITH MIDDLE STEM", 0x2A5C: "LOGICAL AND WITH HORIZONTAL DASH", 0x2A5D: "LOGICAL OR WITH HORIZONTAL DASH", 0x2A5E: "LOGICAL AND WITH DOUBLE OVERBAR", 0x2A5F: "LOGICAL AND WITH UNDERBAR", 0x2A60: "LOGICAL AND WITH DOUBLE UNDERBAR", 0x2A61: "SMALL VEE WITH UNDERBAR", 0x2A62: "LOGICAL OR WITH DOUBLE OVERBAR", 0x2A63: "LOGICAL OR WITH DOUBLE UNDERBAR", 0x2A64: "Z NOTATION DOMAIN ANTIRESTRICTION", 0x2A65: "Z NOTATION RANGE ANTIRESTRICTION", 0x2A66: "EQUALS SIGN WITH DOT BELOW", 0x2A67: "IDENTICAL WITH DOT ABOVE", 0x2A68: "TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE", 0x2A69: "TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE", 0x2A6A: "TILDE OPERATOR WITH DOT ABOVE", 0x2A6B: "TILDE OPERATOR WITH RISING DOTS", 0x2A6C: "SIMILAR MINUS SIMILAR", 0x2A6D: "CONGRUENT WITH DOT ABOVE", 0x2A6E: "EQUALS WITH ASTERISK", 0x2A6F: "ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT", 0x2A70: "APPROXIMATELY EQUAL OR EQUAL TO", 0x2A71: "EQUALS SIGN ABOVE PLUS SIGN", 0x2A72: "PLUS SIGN ABOVE EQUALS SIGN", 0x2A73: "EQUALS SIGN ABOVE TILDE OPERATOR", 0x2A74: "DOUBLE COLON EQUAL", 0x2A75: "TWO CONSECUTIVE EQUALS SIGNS", 0x2A76: "THREE CONSECUTIVE EQUALS SIGNS", 0x2A77: "EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW", 0x2A78: "EQUIVALENT WITH FOUR DOTS ABOVE", 0x2A79: "LESS-THAN WITH CIRCLE INSIDE", 0x2A7A: "GREATER-THAN WITH CIRCLE INSIDE", 0x2A7B: "LESS-THAN WITH QUESTION MARK ABOVE", 0x2A7C: "GREATER-THAN WITH QUESTION MARK ABOVE", 0x2A7D: "LESS-THAN OR SLANTED EQUAL TO", 0x2A7E: "GREATER-THAN OR SLANTED EQUAL TO", 0x2A7F: "LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE", 0x2A80: "GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE", 0x2A81: "LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE", 0x2A82: "GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE", 0x2A83: "LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT", 0x2A84: "GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT", 0x2A85: "LESS-THAN OR APPROXIMATE", 0x2A86: "GREATER-THAN OR APPROXIMATE", 0x2A87: "LESS-THAN AND SINGLE-LINE NOT EQUAL TO", 0x2A88: "GREATER-THAN AND SINGLE-LINE NOT EQUAL TO", 0x2A89: "LESS-THAN AND NOT APPROXIMATE", 0x2A8A: "GREATER-THAN AND NOT APPROXIMATE", 0x2A8B: "LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN", 0x2A8C: "GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN", 0x2A8D: "LESS-THAN ABOVE SIMILAR OR EQUAL", 0x2A8E: "GREATER-THAN ABOVE SIMILAR OR EQUAL", 0x2A8F: "LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN", 0x2A90: "GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN", 0x2A91: "LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL", 0x2A92: "GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL", 0x2A93: "LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL", 0x2A94: "GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL", 0x2A95: "SLANTED EQUAL TO OR LESS-THAN", 0x2A96: "SLANTED EQUAL TO OR GREATER-THAN", 0x2A97: "SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE", 0x2A98: "SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE", 0x2A99: "DOUBLE-LINE EQUAL TO OR LESS-THAN", 0x2A9A: "DOUBLE-LINE EQUAL TO OR GREATER-THAN", 0x2A9B: "DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN", 0x2A9C: "DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN", 0x2A9D: "SIMILAR OR LESS-THAN", 0x2A9E: "SIMILAR OR GREATER-THAN", 0x2A9F: "SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN", 0x2AA0: "SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN", 0x2AA1: "DOUBLE NESTED LESS-THAN", 0x2AA2: "DOUBLE NESTED GREATER-THAN", 0x2AA3: "DOUBLE NESTED LESS-THAN WITH UNDERBAR", 0x2AA4: "GREATER-THAN OVERLAPPING LESS-THAN", 0x2AA5: "GREATER-THAN BESIDE LESS-THAN", 0x2AA6: "LESS-THAN CLOSED BY CURVE", 0x2AA7: "GREATER-THAN CLOSED BY CURVE", 0x2AA8: "LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL", 0x2AA9: "GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL", 0x2AAA: "SMALLER THAN", 0x2AAB: "LARGER THAN", 0x2AAC: "SMALLER THAN OR EQUAL TO", 0x2AAD: "LARGER THAN OR EQUAL TO", 0x2AAE: "EQUALS SIGN WITH BUMPY ABOVE", 0x2AAF: "PRECEDES ABOVE SINGLE-LINE EQUALS SIGN", 0x2AB0: "SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN", 0x2AB1: "PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO", 0x2AB2: "SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO", 0x2AB3: "PRECEDES ABOVE EQUALS SIGN", 0x2AB4: "SUCCEEDS ABOVE EQUALS SIGN", 0x2AB5: "PRECEDES ABOVE NOT EQUAL TO", 0x2AB6: "SUCCEEDS ABOVE NOT EQUAL TO", 0x2AB7: "PRECEDES ABOVE ALMOST EQUAL TO", 0x2AB8: "SUCCEEDS ABOVE ALMOST EQUAL TO", 0x2AB9: "PRECEDES ABOVE NOT ALMOST EQUAL TO", 0x2ABA: "SUCCEEDS ABOVE NOT ALMOST EQUAL TO", 0x2ABB: "DOUBLE PRECEDES", 0x2ABC: "DOUBLE SUCCEEDS", 0x2ABD: "SUBSET WITH DOT", 0x2ABE: "SUPERSET WITH DOT", 0x2ABF: "SUBSET WITH PLUS SIGN BELOW", 0x2AC0: "SUPERSET WITH PLUS SIGN BELOW", 0x2AC1: "SUBSET WITH MULTIPLICATION SIGN BELOW", 0x2AC2: "SUPERSET WITH MULTIPLICATION SIGN BELOW", 0x2AC3: "SUBSET OF OR EQUAL TO WITH DOT ABOVE", 0x2AC4: "SUPERSET OF OR EQUAL TO WITH DOT ABOVE", 0x2AC5: "SUBSET OF ABOVE EQUALS SIGN", 0x2AC6: "SUPERSET OF ABOVE EQUALS SIGN", 0x2AC7: "SUBSET OF ABOVE TILDE OPERATOR", 0x2AC8: "SUPERSET OF ABOVE TILDE OPERATOR", 0x2AC9: "SUBSET OF ABOVE ALMOST EQUAL TO", 0x2ACA: "SUPERSET OF ABOVE ALMOST EQUAL TO", 0x2ACB: "SUBSET OF ABOVE NOT EQUAL TO", 0x2ACC: "SUPERSET OF ABOVE NOT EQUAL TO", 0x2ACD: "SQUARE LEFT OPEN BOX OPERATOR", 0x2ACE: "SQUARE RIGHT OPEN BOX OPERATOR", 0x2ACF: "CLOSED SUBSET", 0x2AD0: "CLOSED SUPERSET", 0x2AD1: "CLOSED SUBSET OR EQUAL TO", 0x2AD2: "CLOSED SUPERSET OR EQUAL TO", 0x2AD3: "SUBSET ABOVE SUPERSET", 0x2AD4: "SUPERSET ABOVE SUBSET", 0x2AD5: "SUBSET ABOVE SUBSET", 0x2AD6: "SUPERSET ABOVE SUPERSET", 0x2AD7: "SUPERSET BESIDE SUBSET", 0x2AD8: "SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET", 0x2AD9: "ELEMENT OF OPENING DOWNWARDS", 0x2ADA: "PITCHFORK WITH TEE TOP", 0x2ADB: "TRANSVERSAL INTERSECTION", 0x2ADC: "FORKING (not independent)", 0x2ADD: "NONFORKING (independent)", 0x2ADE: "SHORT LEFT TACK", 0x2ADF: "SHORT DOWN TACK", 0x2AE0: "SHORT UP TACK", 0x2AE1: "PERPENDICULAR WITH S", 0x2AE2: "VERTICAL BAR TRIPLE RIGHT TURNSTILE", 0x2AE3: "DOUBLE VERTICAL BAR LEFT TURNSTILE", 0x2AE4: "VERTICAL BAR DOUBLE LEFT TURNSTILE", 0x2AE5: "DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE", 0x2AE6: "LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL", 0x2AE7: "SHORT DOWN TACK WITH OVERBAR", 0x2AE8: "SHORT UP TACK WITH UNDERBAR", 0x2AE9: "SHORT UP TACK ABOVE SHORT DOWN TACK", 0x2AEA: "DOUBLE DOWN TACK", 0x2AEB: "DOUBLE UP TACK", 0x2AEC: "DOUBLE STROKE NOT SIGN", 0x2AED: "REVERSED DOUBLE STROKE NOT SIGN", 0x2AEE: "DOES NOT DIVIDE WITH REVERSED NEGATION SLASH", 0x2AEF: "VERTICAL LINE WITH CIRCLE ABOVE", 0x2AF0: "VERTICAL LINE WITH CIRCLE BELOW", 0x2AF1: "DOWN TACK WITH CIRCLE BELOW", 0x2AF2: "PARALLEL WITH HORIZONTAL STROKE", 0x2AF3: "PARALLEL WITH TILDE OPERATOR", 0x2AF4: "TRIPLE VERTICAL BAR BINARY RELATION", 0x2AF5: "TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE", 0x2AF6: "TRIPLE COLON OPERATOR", 0x2AF7: "TRIPLE NESTED LESS-THAN", 0x2AF8: "TRIPLE NESTED GREATER-THAN", 0x2AF9: "DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO", 0x2AFA: "DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO", 0x2AFB: "TRIPLE SOLIDUS BINARY RELATION", 0x2AFC: "LARGE TRIPLE VERTICAL BAR OPERATOR", 0x2AFD: "DOUBLE SOLIDUS OPERATOR", 0x2AFE: "WHITE VERTICAL BAR", 0x2AFF: "N-ARY WHITE VERTICAL BAR", 0x2B00: "NORTH EAST WHITE ARROW", 0x2B01: "NORTH WEST WHITE ARROW", 0x2B02: "SOUTH EAST WHITE ARROW", 0x2B03: "SOUTH WEST WHITE ARROW", 0x2B04: "LEFT RIGHT WHITE ARROW", 0x2B05: "LEFTWARDS BLACK ARROW", 0x2B06: "UPWARDS BLACK ARROW", 0x2B07: "DOWNWARDS BLACK ARROW", 0x2B08: "NORTH EAST BLACK ARROW", 0x2B09: "NORTH WEST BLACK ARROW", 0x2B0A: "SOUTH EAST BLACK ARROW", 0x2B0B: "SOUTH WEST BLACK ARROW", 0x2B0C: "LEFT RIGHT BLACK ARROW", 0x2B0D: "UP DOWN BLACK ARROW", 0x2B0E: "RIGHTWARDS ARROW WITH TIP DOWNWARDS", 0x2B0F: "RIGHTWARDS ARROW WITH TIP UPWARDS", 0x2B10: "LEFTWARDS ARROW WITH TIP DOWNWARDS", 0x2B11: "LEFTWARDS ARROW WITH TIP UPWARDS", 0x2B12: "SQUARE WITH TOP HALF BLACK", 0x2B13: "SQUARE WITH BOTTOM HALF BLACK", 0x2B14: "SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK", 0x2B15: "SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK", 0x2B16: "DIAMOND WITH LEFT HALF BLACK", 0x2B17: "DIAMOND WITH RIGHT HALF BLACK", 0x2B18: "DIAMOND WITH TOP HALF BLACK", 0x2B19: "DIAMOND WITH BOTTOM HALF BLACK", 0x2B1A: "DOTTED SQUARE", 0x2B1B: "BLACK LARGE SQUARE", 0x2B1C: "WHITE LARGE SQUARE", 0x2B1D: "BLACK VERY SMALL SQUARE", 0x2B1E: "WHITE VERY SMALL SQUARE", 0x2B1F: "BLACK PENTAGON", 0x2B20: "WHITE PENTAGON", 0x2B21: "WHITE HEXAGON", 0x2B22: "BLACK HEXAGON", 0x2B23: "HORIZONTAL BLACK HEXAGON", 0x2B24: "BLACK LARGE CIRCLE", 0x2B25: "BLACK MEDIUM DIAMOND", 0x2B26: "WHITE MEDIUM DIAMOND", 0x2B27: "BLACK MEDIUM LOZENGE", 0x2B28: "WHITE MEDIUM LOZENGE", 0x2B29: "BLACK SMALL DIAMOND", 0x2B2A: "BLACK SMALL LOZENGE", 0x2B2B: "WHITE SMALL LOZENGE", 0x2B2C: "BLACK HORIZONTAL ELLIPSE", 0x2B2D: "WHITE HORIZONTAL ELLIPSE", 0x2B2E: "BLACK VERTICAL ELLIPSE", 0x2B2F: "WHITE VERTICAL ELLIPSE", 0x2B30: "LEFT ARROW WITH SMALL CIRCLE", 0x2B31: "THREE LEFTWARDS ARROWS", 0x2B32: "LEFT ARROW WITH CIRCLED PLUS", 0x2B33: "LONG LEFTWARDS SQUIGGLE ARROW", 0x2B34: "LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE", 0x2B35: "LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE", 0x2B36: "LEFTWARDS TWO-HEADED ARROW FROM BAR", 0x2B37: "LEFTWARDS TWO-HEADED TRIPLE DASH ARROW", 0x2B38: "LEFTWARDS ARROW WITH DOTTED STEM", 0x2B39: "LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE", 0x2B3A: "LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE", 0x2B3B: "LEFTWARDS TWO-HEADED ARROW WITH TAIL", 0x2B3C: "LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE", 0x2B3D: "LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE", 0x2B3E: "LEFTWARDS ARROW THROUGH X", 0x2B3F: "WAVE ARROW POINTING DIRECTLY LEFT", 0x2B40: "EQUALS SIGN ABOVE LEFTWARDS ARROW", 0x2B41: "REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW", 0x2B42: "LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO", 0x2B43: "RIGHTWARDS ARROW THROUGH GREATER-THAN", 0x2B44: "RIGHTWARDS ARROW THROUGH SUPERSET", 0x2B45: "LEFTWARDS QUADRUPLE ARROW", 0x2B46: "RIGHTWARDS QUADRUPLE ARROW", 0x2B47: "REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW", 0x2B48: "RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO", 0x2B49: "TILDE OPERATOR ABOVE LEFTWARDS ARROW", 0x2B4A: "LEFTWARDS ARROW ABOVE ALMOST EQUAL TO", 0x2B4B: "LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR", 0x2B4C: "RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR", 0x2B50: "WHITE MEDIUM STAR", 0x2B51: "BLACK SMALL STAR", 0x2B52: "WHITE SMALL STAR", 0x2B53: "BLACK RIGHT-POINTING PENTAGON", 0x2B54: "WHITE RIGHT-POINTING PENTAGON", 0x2C00: "GLAGOLITIC CAPITAL LETTER AZU", 0x2C01: "GLAGOLITIC CAPITAL LETTER BUKY", 0x2C02: "GLAGOLITIC CAPITAL LETTER VEDE", 0x2C03: "GLAGOLITIC CAPITAL LETTER GLAGOLI", 0x2C04: "GLAGOLITIC CAPITAL LETTER DOBRO", 0x2C05: "GLAGOLITIC CAPITAL LETTER YESTU", 0x2C06: "GLAGOLITIC CAPITAL LETTER ZHIVETE", 0x2C07: "GLAGOLITIC CAPITAL LETTER DZELO", 0x2C08: "GLAGOLITIC CAPITAL LETTER ZEMLJA", 0x2C09: "GLAGOLITIC CAPITAL LETTER IZHE", 0x2C0A: "GLAGOLITIC CAPITAL LETTER INITIAL IZHE", 0x2C0B: "GLAGOLITIC CAPITAL LETTER I", 0x2C0C: "GLAGOLITIC CAPITAL LETTER DJERVI", 0x2C0D: "GLAGOLITIC CAPITAL LETTER KAKO", 0x2C0E: "GLAGOLITIC CAPITAL LETTER LJUDIJE", 0x2C0F: "GLAGOLITIC CAPITAL LETTER MYSLITE", 0x2C10: "GLAGOLITIC CAPITAL LETTER NASHI", 0x2C11: "GLAGOLITIC CAPITAL LETTER ONU", 0x2C12: "GLAGOLITIC CAPITAL LETTER POKOJI", 0x2C13: "GLAGOLITIC CAPITAL LETTER RITSI", 0x2C14: "GLAGOLITIC CAPITAL LETTER SLOVO", 0x2C15: "GLAGOLITIC CAPITAL LETTER TVRIDO", 0x2C16: "GLAGOLITIC CAPITAL LETTER UKU", 0x2C17: "GLAGOLITIC CAPITAL LETTER FRITU", 0x2C18: "GLAGOLITIC CAPITAL LETTER HERU", 0x2C19: "GLAGOLITIC CAPITAL LETTER OTU", 0x2C1A: "GLAGOLITIC CAPITAL LETTER PE", 0x2C1B: "GLAGOLITIC CAPITAL LETTER SHTA", 0x2C1C: "GLAGOLITIC CAPITAL LETTER TSI", 0x2C1D: "GLAGOLITIC CAPITAL LETTER CHRIVI", 0x2C1E: "GLAGOLITIC CAPITAL LETTER SHA", 0x2C1F: "GLAGOLITIC CAPITAL LETTER YERU", 0x2C20: "GLAGOLITIC CAPITAL LETTER YERI", 0x2C21: "GLAGOLITIC CAPITAL LETTER YATI", 0x2C22: "GLAGOLITIC CAPITAL LETTER SPIDERY HA", 0x2C23: "GLAGOLITIC CAPITAL LETTER YU", 0x2C24: "GLAGOLITIC CAPITAL LETTER SMALL YUS", 0x2C25: "GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL", 0x2C26: "GLAGOLITIC CAPITAL LETTER YO", 0x2C27: "GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS", 0x2C28: "GLAGOLITIC CAPITAL LETTER BIG YUS", 0x2C29: "GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS", 0x2C2A: "GLAGOLITIC CAPITAL LETTER FITA", 0x2C2B: "GLAGOLITIC CAPITAL LETTER IZHITSA", 0x2C2C: "GLAGOLITIC CAPITAL LETTER SHTAPIC", 0x2C2D: "GLAGOLITIC CAPITAL LETTER TROKUTASTI A", 0x2C2E: "GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE", 0x2C30: "GLAGOLITIC SMALL LETTER AZU", 0x2C31: "GLAGOLITIC SMALL LETTER BUKY", 0x2C32: "GLAGOLITIC SMALL LETTER VEDE", 0x2C33: "GLAGOLITIC SMALL LETTER GLAGOLI", 0x2C34: "GLAGOLITIC SMALL LETTER DOBRO", 0x2C35: "GLAGOLITIC SMALL LETTER YESTU", 0x2C36: "GLAGOLITIC SMALL LETTER ZHIVETE", 0x2C37: "GLAGOLITIC SMALL LETTER DZELO", 0x2C38: "GLAGOLITIC SMALL LETTER ZEMLJA", 0x2C39: "GLAGOLITIC SMALL LETTER IZHE", 0x2C3A: "GLAGOLITIC SMALL LETTER INITIAL IZHE", 0x2C3B: "GLAGOLITIC SMALL LETTER I", 0x2C3C: "GLAGOLITIC SMALL LETTER DJERVI", 0x2C3D: "GLAGOLITIC SMALL LETTER KAKO", 0x2C3E: "GLAGOLITIC SMALL LETTER LJUDIJE", 0x2C3F: "GLAGOLITIC SMALL LETTER MYSLITE", 0x2C40: "GLAGOLITIC SMALL LETTER NASHI", 0x2C41: "GLAGOLITIC SMALL LETTER ONU", 0x2C42: "GLAGOLITIC SMALL LETTER POKOJI", 0x2C43: "GLAGOLITIC SMALL LETTER RITSI", 0x2C44: "GLAGOLITIC SMALL LETTER SLOVO", 0x2C45: "GLAGOLITIC SMALL LETTER TVRIDO", 0x2C46: "GLAGOLITIC SMALL LETTER UKU", 0x2C47: "GLAGOLITIC SMALL LETTER FRITU", 0x2C48: "GLAGOLITIC SMALL LETTER HERU", 0x2C49: "GLAGOLITIC SMALL LETTER OTU", 0x2C4A: "GLAGOLITIC SMALL LETTER PE", 0x2C4B: "GLAGOLITIC SMALL LETTER SHTA", 0x2C4C: "GLAGOLITIC SMALL LETTER TSI", 0x2C4D: "GLAGOLITIC SMALL LETTER CHRIVI", 0x2C4E: "GLAGOLITIC SMALL LETTER SHA", 0x2C4F: "GLAGOLITIC SMALL LETTER YERU", 0x2C50: "GLAGOLITIC SMALL LETTER YERI", 0x2C51: "GLAGOLITIC SMALL LETTER YATI", 0x2C52: "GLAGOLITIC SMALL LETTER SPIDERY HA", 0x2C53: "GLAGOLITIC SMALL LETTER YU", 0x2C54: "GLAGOLITIC SMALL LETTER SMALL YUS", 0x2C55: "GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL", 0x2C56: "GLAGOLITIC SMALL LETTER YO", 0x2C57: "GLAGOLITIC SMALL LETTER IOTATED SMALL YUS", 0x2C58: "GLAGOLITIC SMALL LETTER BIG YUS", 0x2C59: "GLAGOLITIC SMALL LETTER IOTATED BIG YUS", 0x2C5A: "GLAGOLITIC SMALL LETTER FITA", 0x2C5B: "GLAGOLITIC SMALL LETTER IZHITSA", 0x2C5C: "GLAGOLITIC SMALL LETTER SHTAPIC", 0x2C5D: "GLAGOLITIC SMALL LETTER TROKUTASTI A", 0x2C5E: "GLAGOLITIC SMALL LETTER LATINATE MYSLITE", 0x2C60: "LATIN CAPITAL LETTER L WITH DOUBLE BAR", 0x2C61: "LATIN SMALL LETTER L WITH DOUBLE BAR", 0x2C62: "LATIN CAPITAL LETTER L WITH MIDDLE TILDE", 0x2C63: "LATIN CAPITAL LETTER P WITH STROKE", 0x2C64: "LATIN CAPITAL LETTER R WITH TAIL", 0x2C65: "LATIN SMALL LETTER A WITH STROKE", 0x2C66: "LATIN SMALL LETTER T WITH DIAGONAL STROKE", 0x2C67: "LATIN CAPITAL LETTER H WITH DESCENDER", 0x2C68: "LATIN SMALL LETTER H WITH DESCENDER", 0x2C69: "LATIN CAPITAL LETTER K WITH DESCENDER", 0x2C6A: "LATIN SMALL LETTER K WITH DESCENDER", 0x2C6B: "LATIN CAPITAL LETTER Z WITH DESCENDER", 0x2C6C: "LATIN SMALL LETTER Z WITH DESCENDER", 0x2C6D: "LATIN CAPITAL LETTER ALPHA", 0x2C6E: "LATIN CAPITAL LETTER M WITH HOOK", 0x2C6F: "LATIN CAPITAL LETTER TURNED A", 0x2C71: "LATIN SMALL LETTER V WITH RIGHT HOOK", 0x2C72: "LATIN CAPITAL LETTER W WITH HOOK", 0x2C73: "LATIN SMALL LETTER W WITH HOOK", 0x2C74: "LATIN SMALL LETTER V WITH CURL", 0x2C75: "LATIN CAPITAL LETTER HALF H", 0x2C76: "LATIN SMALL LETTER HALF H", 0x2C77: "LATIN SMALL LETTER TAILLESS PHI", 0x2C78: "LATIN SMALL LETTER E WITH NOTCH", 0x2C79: "LATIN SMALL LETTER TURNED R WITH TAIL", 0x2C7A: "LATIN SMALL LETTER O WITH LOW RING INSIDE", 0x2C7B: "LATIN LETTER SMALL CAPITAL TURNED E", 0x2C7C: "LATIN SUBSCRIPT SMALL LETTER J", 0x2C7D: "MODIFIER LETTER CAPITAL V", 0x2C80: "COPTIC CAPITAL LETTER ALFA", 0x2C81: "COPTIC SMALL LETTER ALFA", 0x2C82: "COPTIC CAPITAL LETTER VIDA", 0x2C83: "COPTIC SMALL LETTER VIDA", 0x2C84: "COPTIC CAPITAL LETTER GAMMA", 0x2C85: "COPTIC SMALL LETTER GAMMA", 0x2C86: "COPTIC CAPITAL LETTER DALDA", 0x2C87: "COPTIC SMALL LETTER DALDA", 0x2C88: "COPTIC CAPITAL LETTER EIE", 0x2C89: "COPTIC SMALL LETTER EIE", 0x2C8A: "COPTIC CAPITAL LETTER SOU", 0x2C8B: "COPTIC SMALL LETTER SOU", 0x2C8C: "COPTIC CAPITAL LETTER ZATA", 0x2C8D: "COPTIC SMALL LETTER ZATA", 0x2C8E: "COPTIC CAPITAL LETTER HATE", 0x2C8F: "COPTIC SMALL LETTER HATE", 0x2C90: "COPTIC CAPITAL LETTER THETHE", 0x2C91: "COPTIC SMALL LETTER THETHE", 0x2C92: "COPTIC CAPITAL LETTER IAUDA", 0x2C93: "COPTIC SMALL LETTER IAUDA", 0x2C94: "COPTIC CAPITAL LETTER KAPA", 0x2C95: "COPTIC SMALL LETTER KAPA", 0x2C96: "COPTIC CAPITAL LETTER LAULA", 0x2C97: "COPTIC SMALL LETTER LAULA", 0x2C98: "COPTIC CAPITAL LETTER MI", 0x2C99: "COPTIC SMALL LETTER MI", 0x2C9A: "COPTIC CAPITAL LETTER NI", 0x2C9B: "COPTIC SMALL LETTER NI", 0x2C9C: "COPTIC CAPITAL LETTER KSI", 0x2C9D: "COPTIC SMALL LETTER KSI", 0x2C9E: "COPTIC CAPITAL LETTER O", 0x2C9F: "COPTIC SMALL LETTER O", 0x2CA0: "COPTIC CAPITAL LETTER PI", 0x2CA1: "COPTIC SMALL LETTER PI", 0x2CA2: "COPTIC CAPITAL LETTER RO", 0x2CA3: "COPTIC SMALL LETTER RO", 0x2CA4: "COPTIC CAPITAL LETTER SIMA", 0x2CA5: "COPTIC SMALL LETTER SIMA", 0x2CA6: "COPTIC CAPITAL LETTER TAU", 0x2CA7: "COPTIC SMALL LETTER TAU", 0x2CA8: "COPTIC CAPITAL LETTER UA", 0x2CA9: "COPTIC SMALL LETTER UA", 0x2CAA: "COPTIC CAPITAL LETTER FI", 0x2CAB: "COPTIC SMALL LETTER FI", 0x2CAC: "COPTIC CAPITAL LETTER KHI", 0x2CAD: "COPTIC SMALL LETTER KHI", 0x2CAE: "COPTIC CAPITAL LETTER PSI", 0x2CAF: "COPTIC SMALL LETTER PSI", 0x2CB0: "COPTIC CAPITAL LETTER OOU", 0x2CB1: "COPTIC SMALL LETTER OOU", 0x2CB2: "COPTIC CAPITAL LETTER DIALECT-P ALEF", 0x2CB3: "COPTIC SMALL LETTER DIALECT-P ALEF", 0x2CB4: "COPTIC CAPITAL LETTER OLD COPTIC AIN", 0x2CB5: "COPTIC SMALL LETTER OLD COPTIC AIN", 0x2CB6: "COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE", 0x2CB7: "COPTIC SMALL LETTER CRYPTOGRAMMIC EIE", 0x2CB8: "COPTIC CAPITAL LETTER DIALECT-P KAPA", 0x2CB9: "COPTIC SMALL LETTER DIALECT-P KAPA", 0x2CBA: "COPTIC CAPITAL LETTER DIALECT-P NI", 0x2CBB: "COPTIC SMALL LETTER DIALECT-P NI", 0x2CBC: "COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI", 0x2CBD: "COPTIC SMALL LETTER CRYPTOGRAMMIC NI", 0x2CBE: "COPTIC CAPITAL LETTER OLD COPTIC OOU", 0x2CBF: "COPTIC SMALL LETTER OLD COPTIC OOU", 0x2CC0: "COPTIC CAPITAL LETTER SAMPI", 0x2CC1: "COPTIC SMALL LETTER SAMPI", 0x2CC2: "COPTIC CAPITAL LETTER CROSSED SHEI", 0x2CC3: "COPTIC SMALL LETTER CROSSED SHEI", 0x2CC4: "COPTIC CAPITAL LETTER OLD COPTIC SHEI", 0x2CC5: "COPTIC SMALL LETTER OLD COPTIC SHEI", 0x2CC6: "COPTIC CAPITAL LETTER OLD COPTIC ESH", 0x2CC7: "COPTIC SMALL LETTER OLD COPTIC ESH", 0x2CC8: "COPTIC CAPITAL LETTER AKHMIMIC KHEI", 0x2CC9: "COPTIC SMALL LETTER AKHMIMIC KHEI", 0x2CCA: "COPTIC CAPITAL LETTER DIALECT-P HORI", 0x2CCB: "COPTIC SMALL LETTER DIALECT-P HORI", 0x2CCC: "COPTIC CAPITAL LETTER OLD COPTIC HORI", 0x2CCD: "COPTIC SMALL LETTER OLD COPTIC HORI", 0x2CCE: "COPTIC CAPITAL LETTER OLD COPTIC HA", 0x2CCF: "COPTIC SMALL LETTER OLD COPTIC HA", 0x2CD0: "COPTIC CAPITAL LETTER L-SHAPED HA", 0x2CD1: "COPTIC SMALL LETTER L-SHAPED HA", 0x2CD2: "COPTIC CAPITAL LETTER OLD COPTIC HEI", 0x2CD3: "COPTIC SMALL LETTER OLD COPTIC HEI", 0x2CD4: "COPTIC CAPITAL LETTER OLD COPTIC HAT", 0x2CD5: "COPTIC SMALL LETTER OLD COPTIC HAT", 0x2CD6: "COPTIC CAPITAL LETTER OLD COPTIC GANGIA", 0x2CD7: "COPTIC SMALL LETTER OLD COPTIC GANGIA", 0x2CD8: "COPTIC CAPITAL LETTER OLD COPTIC DJA", 0x2CD9: "COPTIC SMALL LETTER OLD COPTIC DJA", 0x2CDA: "COPTIC CAPITAL LETTER OLD COPTIC SHIMA", 0x2CDB: "COPTIC SMALL LETTER OLD COPTIC SHIMA", 0x2CDC: "COPTIC CAPITAL LETTER OLD NUBIAN SHIMA", 0x2CDD: "COPTIC SMALL LETTER OLD NUBIAN SHIMA", 0x2CDE: "COPTIC CAPITAL LETTER OLD NUBIAN NGI", 0x2CDF: "COPTIC SMALL LETTER OLD NUBIAN NGI", 0x2CE0: "COPTIC CAPITAL LETTER OLD NUBIAN NYI", 0x2CE1: "COPTIC SMALL LETTER OLD NUBIAN NYI", 0x2CE2: "COPTIC CAPITAL LETTER OLD NUBIAN WAU", 0x2CE3: "COPTIC SMALL LETTER OLD NUBIAN WAU", 0x2CE4: "COPTIC SYMBOL KAI", 0x2CE5: "COPTIC SYMBOL MI RO", 0x2CE6: "COPTIC SYMBOL PI RO", 0x2CE7: "COPTIC SYMBOL STAUROS", 0x2CE8: "COPTIC SYMBOL TAU RO", 0x2CE9: "COPTIC SYMBOL KHI RO", 0x2CEA: "COPTIC SYMBOL SHIMA SIMA", 0x2CF9: "COPTIC OLD NUBIAN FULL STOP", 0x2CFA: "COPTIC OLD NUBIAN DIRECT QUESTION MARK", 0x2CFB: "COPTIC OLD NUBIAN INDIRECT QUESTION MARK", 0x2CFC: "COPTIC OLD NUBIAN VERSE DIVIDER", 0x2CFD: "COPTIC FRACTION ONE HALF", 0x2CFE: "COPTIC FULL STOP", 0x2CFF: "COPTIC MORPHOLOGICAL DIVIDER", 0x2D00: "GEORGIAN SMALL LETTER AN (Khutsuri)", 0x2D01: "GEORGIAN SMALL LETTER BAN (Khutsuri)", 0x2D02: "GEORGIAN SMALL LETTER GAN (Khutsuri)", 0x2D03: "GEORGIAN SMALL LETTER DON (Khutsuri)", 0x2D04: "GEORGIAN SMALL LETTER EN (Khutsuri)", 0x2D05: "GEORGIAN SMALL LETTER VIN (Khutsuri)", 0x2D06: "GEORGIAN SMALL LETTER ZEN (Khutsuri)", 0x2D07: "GEORGIAN SMALL LETTER TAN (Khutsuri)", 0x2D08: "GEORGIAN SMALL LETTER IN (Khutsuri)", 0x2D09: "GEORGIAN SMALL LETTER KAN (Khutsuri)", 0x2D0A: "GEORGIAN SMALL LETTER LAS (Khutsuri)", 0x2D0B: "GEORGIAN SMALL LETTER MAN (Khutsuri)", 0x2D0C: "GEORGIAN SMALL LETTER NAR (Khutsuri)", 0x2D0D: "GEORGIAN SMALL LETTER ON (Khutsuri)", 0x2D0E: "GEORGIAN SMALL LETTER PAR (Khutsuri)", 0x2D0F: "GEORGIAN SMALL LETTER ZHAR (Khutsuri)", 0x2D10: "GEORGIAN SMALL LETTER RAE (Khutsuri)", 0x2D11: "GEORGIAN SMALL LETTER SAN (Khutsuri)", 0x2D12: "GEORGIAN SMALL LETTER TAR (Khutsuri)", 0x2D13: "GEORGIAN SMALL LETTER UN (Khutsuri)", 0x2D14: "GEORGIAN SMALL LETTER PHAR (Khutsuri)", 0x2D15: "GEORGIAN SMALL LETTER KHAR (Khutsuri)", 0x2D16: "GEORGIAN SMALL LETTER GHAN (Khutsuri)", 0x2D17: "GEORGIAN SMALL LETTER QAR (Khutsuri)", 0x2D18: "GEORGIAN SMALL LETTER SHIN (Khutsuri)", 0x2D19: "GEORGIAN SMALL LETTER CHIN (Khutsuri)", 0x2D1A: "GEORGIAN SMALL LETTER CAN (Khutsuri)", 0x2D1B: "GEORGIAN SMALL LETTER JIL (Khutsuri)", 0x2D1C: "GEORGIAN SMALL LETTER CIL (Khutsuri)", 0x2D1D: "GEORGIAN SMALL LETTER CHAR (Khutsuri)", 0x2D1E: "GEORGIAN SMALL LETTER XAN (Khutsuri)", 0x2D1F: "GEORGIAN SMALL LETTER JHAN (Khutsuri)", 0x2D20: "GEORGIAN SMALL LETTER HAE (Khutsuri)", 0x2D21: "GEORGIAN SMALL LETTER HE (Khutsuri)", 0x2D22: "GEORGIAN SMALL LETTER HIE (Khutsuri)", 0x2D23: "GEORGIAN SMALL LETTER WE (Khutsuri)", 0x2D24: "GEORGIAN SMALL LETTER HAR (Khutsuri)", 0x2D25: "GEORGIAN SMALL LETTER HOE (Khutsuri)", 0x2D30: "TIFINAGH LETTER YA", 0x2D31: "TIFINAGH LETTER YAB", 0x2D32: "TIFINAGH LETTER YABH", 0x2D33: "TIFINAGH LETTER YAG", 0x2D34: "TIFINAGH LETTER YAGHH", 0x2D35: "TIFINAGH LETTER BERBER ACADEMY YAJ", 0x2D36: "TIFINAGH LETTER YAJ", 0x2D37: "TIFINAGH LETTER YAD", 0x2D38: "TIFINAGH LETTER YADH", 0x2D39: "TIFINAGH LETTER YADD", 0x2D3A: "TIFINAGH LETTER YADDH", 0x2D3B: "TIFINAGH LETTER YEY", 0x2D3C: "TIFINAGH LETTER YAF", 0x2D3D: "TIFINAGH LETTER YAK", 0x2D3E: "TIFINAGH LETTER TUAREG YAK", 0x2D3F: "TIFINAGH LETTER YAKHH", 0x2D40: "TIFINAGH LETTER YAH (Tuareg yab)", 0x2D41: "TIFINAGH LETTER BERBER ACADEMY YAH", 0x2D42: "TIFINAGH LETTER TUAREG YAH", 0x2D43: "TIFINAGH LETTER YAHH", 0x2D44: "TIFINAGH LETTER YAA", 0x2D45: "TIFINAGH LETTER YAKH", 0x2D46: "TIFINAGH LETTER TUAREG YAKH", 0x2D47: "TIFINAGH LETTER YAQ", 0x2D48: "TIFINAGH LETTER TUAREG YAQ", 0x2D49: "TIFINAGH LETTER YI", 0x2D4A: "TIFINAGH LETTER YAZH", 0x2D4B: "TIFINAGH LETTER AHAGGAR YAZH", 0x2D4C: "TIFINAGH LETTER TUAREG YAZH", 0x2D4D: "TIFINAGH LETTER YAL", 0x2D4E: "TIFINAGH LETTER YAM", 0x2D4F: "TIFINAGH LETTER YAN", 0x2D50: "TIFINAGH LETTER TUAREG YAGN", 0x2D51: "TIFINAGH LETTER TUAREG YANG", 0x2D52: "TIFINAGH LETTER YAP", 0x2D53: "TIFINAGH LETTER YU (Tuareg yaw)", 0x2D54: "TIFINAGH LETTER YAR", 0x2D55: "TIFINAGH LETTER YARR", 0x2D56: "TIFINAGH LETTER YAGH", 0x2D57: "TIFINAGH LETTER TUAREG YAGH", 0x2D58: "TIFINAGH LETTER AYER YAGH (Adrar yaj)", 0x2D59: "TIFINAGH LETTER YAS", 0x2D5A: "TIFINAGH LETTER YASS", 0x2D5B: "TIFINAGH LETTER YASH", 0x2D5C: "TIFINAGH LETTER YAT", 0x2D5D: "TIFINAGH LETTER YATH", 0x2D5E: "TIFINAGH LETTER YACH", 0x2D5F: "TIFINAGH LETTER YATT", 0x2D60: "TIFINAGH LETTER YAV", 0x2D61: "TIFINAGH LETTER YAW", 0x2D62: "TIFINAGH LETTER YAY", 0x2D63: "TIFINAGH LETTER YAZ", 0x2D64: "TIFINAGH LETTER TAWELLEMET YAZ (harpoon yaz)", 0x2D65: "TIFINAGH LETTER YAZZ", 0x2D6F: "TIFINAGH MODIFIER LETTER LABIALIZATION MARK (tamatart)", 0x2D80: "ETHIOPIC SYLLABLE LOA", 0x2D81: "ETHIOPIC SYLLABLE MOA", 0x2D82: "ETHIOPIC SYLLABLE ROA", 0x2D83: "ETHIOPIC SYLLABLE SOA", 0x2D84: "ETHIOPIC SYLLABLE SHOA", 0x2D85: "ETHIOPIC SYLLABLE BOA", 0x2D86: "ETHIOPIC SYLLABLE TOA", 0x2D87: "ETHIOPIC SYLLABLE COA", 0x2D88: "ETHIOPIC SYLLABLE NOA", 0x2D89: "ETHIOPIC SYLLABLE NYOA", 0x2D8A: "ETHIOPIC SYLLABLE GLOTTAL OA", 0x2D8B: "ETHIOPIC SYLLABLE ZOA", 0x2D8C: "ETHIOPIC SYLLABLE DOA", 0x2D8D: "ETHIOPIC SYLLABLE DDOA", 0x2D8E: "ETHIOPIC SYLLABLE JOA", 0x2D8F: "ETHIOPIC SYLLABLE THOA", 0x2D90: "ETHIOPIC SYLLABLE CHOA", 0x2D91: "ETHIOPIC SYLLABLE PHOA", 0x2D92: "ETHIOPIC SYLLABLE POA", 0x2D93: "ETHIOPIC SYLLABLE GGWA", 0x2D94: "ETHIOPIC SYLLABLE GGWI", 0x2D95: "ETHIOPIC SYLLABLE GGWEE", 0x2D96: "ETHIOPIC SYLLABLE GGWE", 0x2DA0: "ETHIOPIC SYLLABLE SSA", 0x2DA1: "ETHIOPIC SYLLABLE SSU", 0x2DA2: "ETHIOPIC SYLLABLE SSI", 0x2DA3: "ETHIOPIC SYLLABLE SSAA", 0x2DA4: "ETHIOPIC SYLLABLE SSEE", 0x2DA5: "ETHIOPIC SYLLABLE SSE", 0x2DA6: "ETHIOPIC SYLLABLE SSO", 0x2DA8: "ETHIOPIC SYLLABLE CCA", 0x2DA9: "ETHIOPIC SYLLABLE CCU", 0x2DAA: "ETHIOPIC SYLLABLE CCI", 0x2DAB: "ETHIOPIC SYLLABLE CCAA", 0x2DAC: "ETHIOPIC SYLLABLE CCEE", 0x2DAD: "ETHIOPIC SYLLABLE CCE", 0x2DAE: "ETHIOPIC SYLLABLE CCO", 0x2DB0: "ETHIOPIC SYLLABLE ZZA", 0x2DB1: "ETHIOPIC SYLLABLE ZZU", 0x2DB2: "ETHIOPIC SYLLABLE ZZI", 0x2DB3: "ETHIOPIC SYLLABLE ZZAA", 0x2DB4: "ETHIOPIC SYLLABLE ZZEE", 0x2DB5: "ETHIOPIC SYLLABLE ZZE", 0x2DB6: "ETHIOPIC SYLLABLE ZZO", 0x2DB8: "ETHIOPIC SYLLABLE CCHA", 0x2DB9: "ETHIOPIC SYLLABLE CCHU", 0x2DBA: "ETHIOPIC SYLLABLE CCHI", 0x2DBB: "ETHIOPIC SYLLABLE CCHAA", 0x2DBC: "ETHIOPIC SYLLABLE CCHEE", 0x2DBD: "ETHIOPIC SYLLABLE CCHE", 0x2DBE: "ETHIOPIC SYLLABLE CCHO", 0x2DC0: "ETHIOPIC SYLLABLE QYA", 0x2DC1: "ETHIOPIC SYLLABLE QYU", 0x2DC2: "ETHIOPIC SYLLABLE QYI", 0x2DC3: "ETHIOPIC SYLLABLE QYAA", 0x2DC4: "ETHIOPIC SYLLABLE QYEE", 0x2DC5: "ETHIOPIC SYLLABLE QYE", 0x2DC6: "ETHIOPIC SYLLABLE QYO", 0x2DC8: "ETHIOPIC SYLLABLE KYA", 0x2DC9: "ETHIOPIC SYLLABLE KYU", 0x2DCA: "ETHIOPIC SYLLABLE KYI", 0x2DCB: "ETHIOPIC SYLLABLE KYAA", 0x2DCC: "ETHIOPIC SYLLABLE KYEE", 0x2DCD: "ETHIOPIC SYLLABLE KYE", 0x2DCE: "ETHIOPIC SYLLABLE KYO", 0x2DD0: "ETHIOPIC SYLLABLE XYA", 0x2DD1: "ETHIOPIC SYLLABLE XYU", 0x2DD2: "ETHIOPIC SYLLABLE XYI", 0x2DD3: "ETHIOPIC SYLLABLE XYAA", 0x2DD4: "ETHIOPIC SYLLABLE XYEE", 0x2DD5: "ETHIOPIC SYLLABLE XYE", 0x2DD6: "ETHIOPIC SYLLABLE XYO", 0x2DD8: "ETHIOPIC SYLLABLE GYA", 0x2DD9: "ETHIOPIC SYLLABLE GYU", 0x2DDA: "ETHIOPIC SYLLABLE GYI", 0x2DDB: "ETHIOPIC SYLLABLE GYAA", 0x2DDC: "ETHIOPIC SYLLABLE GYEE", 0x2DDD: "ETHIOPIC SYLLABLE GYE", 0x2DDE: "ETHIOPIC SYLLABLE GYO", 0x2DE0: "COMBINING CYRILLIC LETTER BE", 0x2DE1: "COMBINING CYRILLIC LETTER VE", 0x2DE2: "COMBINING CYRILLIC LETTER GHE", 0x2DE3: "COMBINING CYRILLIC LETTER DE", 0x2DE4: "COMBINING CYRILLIC LETTER ZHE", 0x2DE5: "COMBINING CYRILLIC LETTER ZE", 0x2DE6: "COMBINING CYRILLIC LETTER KA", 0x2DE7: "COMBINING CYRILLIC LETTER EL", 0x2DE8: "COMBINING CYRILLIC LETTER EM", 0x2DE9: "COMBINING CYRILLIC LETTER EN", 0x2DEA: "COMBINING CYRILLIC LETTER O", 0x2DEB: "COMBINING CYRILLIC LETTER PE", 0x2DEC: "COMBINING CYRILLIC LETTER ER", 0x2DED: "COMBINING CYRILLIC LETTER ES", 0x2DEE: "COMBINING CYRILLIC LETTER TE", 0x2DEF: "COMBINING CYRILLIC LETTER HA", 0x2DF0: "COMBINING CYRILLIC LETTER TSE", 0x2DF1: "COMBINING CYRILLIC LETTER CHE", 0x2DF2: "COMBINING CYRILLIC LETTER SHA", 0x2DF3: "COMBINING CYRILLIC LETTER SHCHA", 0x2DF4: "COMBINING CYRILLIC LETTER FITA", 0x2DF5: "COMBINING CYRILLIC LETTER ES-TE", 0x2DF6: "COMBINING CYRILLIC LETTER A", 0x2DF7: "COMBINING CYRILLIC LETTER IE", 0x2DF8: "COMBINING CYRILLIC LETTER DJERV", 0x2DF9: "COMBINING CYRILLIC LETTER MONOGRAPH UK", 0x2DFA: "COMBINING CYRILLIC LETTER YAT", 0x2DFB: "COMBINING CYRILLIC LETTER YU", 0x2DFC: "COMBINING CYRILLIC LETTER IOTIFIED A", 0x2DFD: "COMBINING CYRILLIC LETTER LITTLE YUS", 0x2DFE: "COMBINING CYRILLIC LETTER BIG YUS", 0x2DFF: "COMBINING CYRILLIC LETTER IOTIFIED BIG YUS", 0x2E00: "RIGHT ANGLE SUBSTITUTION MARKER", 0x2E01: "RIGHT ANGLE DOTTED SUBSTITUTION MARKER", 0x2E02: "LEFT SUBSTITUTION BRACKET", 0x2E03: "RIGHT SUBSTITUTION BRACKET", 0x2E04: "LEFT DOTTED SUBSTITUTION BRACKET", 0x2E05: "RIGHT DOTTED SUBSTITUTION BRACKET", 0x2E06: "RAISED INTERPOLATION MARKER", 0x2E07: "RAISED DOTTED INTERPOLATION MARKER", 0x2E08: "DOTTED TRANSPOSITION MARKER", 0x2E09: "LEFT TRANSPOSITION BRACKET", 0x2E0A: "RIGHT TRANSPOSITION BRACKET", 0x2E0B: "RAISED SQUARE", 0x2E0C: "LEFT RAISED OMISSION BRACKET", 0x2E0D: "RIGHT RAISED OMISSION BRACKET", 0x2E0E: "EDITORIAL CORONIS", 0x2E0F: "PARAGRAPHOS", 0x2E10: "FORKED PARAGRAPHOS", 0x2E11: "REVERSED FORKED PARAGRAPHOS", 0x2E12: "HYPODIASTOLE", 0x2E13: "DOTTED OBELOS", 0x2E14: "DOWNWARDS ANCORA", 0x2E15: "UPWARDS ANCORA", 0x2E16: "DOTTED RIGHT-POINTING ANGLE", 0x2E17: "DOUBLE OBLIQUE HYPHEN", 0x2E18: "INVERTED INTERROBANG", 0x2E19: "PALM BRANCH", 0x2E1A: "HYPHEN WITH DIAERESIS", 0x2E1B: "TILDE WITH RING ABOVE", 0x2E1C: "LEFT LOW PARAPHRASE BRACKET", 0x2E1D: "RIGHT LOW PARAPHRASE BRACKET", 0x2E1E: "TILDE WITH DOT ABOVE", 0x2E1F: "TILDE WITH DOT BELOW", 0x2E20: "LEFT VERTICAL BAR WITH QUILL", 0x2E21: "RIGHT VERTICAL BAR WITH QUILL", 0x2E22: "TOP LEFT HALF BRACKET", 0x2E23: "TOP RIGHT HALF BRACKET", 0x2E24: "BOTTOM LEFT HALF BRACKET", 0x2E25: "BOTTOM RIGHT HALF BRACKET", 0x2E26: "LEFT SIDEWAYS U BRACKET", 0x2E27: "RIGHT SIDEWAYS U BRACKET", 0x2E28: "LEFT DOUBLE PARENTHESIS", 0x2E29: "RIGHT DOUBLE PARENTHESIS", 0x2E2A: "TWO DOTS OVER ONE DOT PUNCTUATION", 0x2E2B: "ONE DOT OVER TWO DOTS PUNCTUATION", 0x2E2C: "SQUARED FOUR DOT PUNCTUATION", 0x2E2D: "FIVE DOT MARK", 0x2E2E: "REVERSED QUESTION MARK", 0x2E2F: "VERTICAL TILDE", 0x2E30: "RING POINT", 0x2E80: "CJK RADICAL REPEAT", 0x2E81: "CJK RADICAL CLIFF", 0x2E82: "CJK RADICAL SECOND ONE", 0x2E83: "CJK RADICAL SECOND TWO", 0x2E84: "CJK RADICAL SECOND THREE", 0x2E85: "CJK RADICAL PERSON", 0x2E86: "CJK RADICAL BOX", 0x2E87: "CJK RADICAL TABLE", 0x2E88: "CJK RADICAL KNIFE ONE", 0x2E89: "CJK RADICAL KNIFE TWO", 0x2E8A: "CJK RADICAL DIVINATION", 0x2E8B: "CJK RADICAL SEAL", 0x2E8C: "CJK RADICAL SMALL ONE", 0x2E8D: "CJK RADICAL SMALL TWO", 0x2E8E: "CJK RADICAL LAME ONE", 0x2E8F: "CJK RADICAL LAME TWO", 0x2E90: "CJK RADICAL LAME THREE", 0x2E91: "CJK RADICAL LAME FOUR", 0x2E92: "CJK RADICAL SNAKE", 0x2E93: "CJK RADICAL THREAD", 0x2E94: "CJK RADICAL SNOUT ONE", 0x2E95: "CJK RADICAL SNOUT TWO", 0x2E96: "CJK RADICAL HEART ONE", 0x2E97: "CJK RADICAL HEART TWO", 0x2E98: "CJK RADICAL HAND", 0x2E99: "CJK RADICAL RAP", 0x2E9B: "CJK RADICAL CHOKE", 0x2E9C: "CJK RADICAL SUN", 0x2E9D: "CJK RADICAL MOON", 0x2E9E: "CJK RADICAL DEATH", 0x2E9F: "CJK RADICAL MOTHER", 0x2EA0: "CJK RADICAL CIVILIAN", 0x2EA1: "CJK RADICAL WATER ONE", 0x2EA2: "CJK RADICAL WATER TWO", 0x2EA3: "CJK RADICAL FIRE", 0x2EA4: "CJK RADICAL PAW ONE", 0x2EA5: "CJK RADICAL PAW TWO", 0x2EA6: "CJK RADICAL SIMPLIFIED HALF TREE TRUNK", 0x2EA7: "CJK RADICAL COW", 0x2EA8: "CJK RADICAL DOG", 0x2EA9: "CJK RADICAL JADE", 0x2EAA: "CJK RADICAL BOLT OF CLOTH", 0x2EAB: "CJK RADICAL EYE", 0x2EAC: "CJK RADICAL SPIRIT ONE", 0x2EAD: "CJK RADICAL SPIRIT TWO", 0x2EAE: "CJK RADICAL BAMBOO", 0x2EAF: "CJK RADICAL SILK", 0x2EB0: "CJK RADICAL C-SIMPLIFIED SILK", 0x2EB1: "CJK RADICAL NET ONE", 0x2EB2: "CJK RADICAL NET TWO", 0x2EB3: "CJK RADICAL NET THREE", 0x2EB4: "CJK RADICAL NET FOUR", 0x2EB5: "CJK RADICAL MESH", 0x2EB6: "CJK RADICAL SHEEP", 0x2EB7: "CJK RADICAL RAM", 0x2EB8: "CJK RADICAL EWE", 0x2EB9: "CJK RADICAL OLD", 0x2EBA: "CJK RADICAL BRUSH ONE", 0x2EBB: "CJK RADICAL BRUSH TWO", 0x2EBC: "CJK RADICAL MEAT", 0x2EBD: "CJK RADICAL MORTAR", 0x2EBE: "CJK RADICAL GRASS ONE", 0x2EBF: "CJK RADICAL GRASS TWO", 0x2EC0: "CJK RADICAL GRASS THREE", 0x2EC1: "CJK RADICAL TIGER", 0x2EC2: "CJK RADICAL CLOTHES", 0x2EC3: "CJK RADICAL WEST ONE", 0x2EC4: "CJK RADICAL WEST TWO", 0x2EC5: "CJK RADICAL C-SIMPLIFIED SEE", 0x2EC6: "CJK RADICAL SIMPLIFIED HORN", 0x2EC7: "CJK RADICAL HORN", 0x2EC8: "CJK RADICAL C-SIMPLIFIED SPEECH", 0x2EC9: "CJK RADICAL C-SIMPLIFIED SHELL", 0x2ECA: "CJK RADICAL FOOT", 0x2ECB: "CJK RADICAL C-SIMPLIFIED CART", 0x2ECC: "CJK RADICAL SIMPLIFIED WALK", 0x2ECD: "CJK RADICAL WALK ONE", 0x2ECE: "CJK RADICAL WALK TWO", 0x2ECF: "CJK RADICAL CITY", 0x2ED0: "CJK RADICAL C-SIMPLIFIED GOLD", 0x2ED1: "CJK RADICAL LONG ONE", 0x2ED2: "CJK RADICAL LONG TWO", 0x2ED3: "CJK RADICAL C-SIMPLIFIED LONG", 0x2ED4: "CJK RADICAL C-SIMPLIFIED GATE", 0x2ED5: "CJK RADICAL MOUND ONE", 0x2ED6: "CJK RADICAL MOUND TWO", 0x2ED7: "CJK RADICAL RAIN", 0x2ED8: "CJK RADICAL BLUE", 0x2ED9: "CJK RADICAL C-SIMPLIFIED TANNED LEATHER", 0x2EDA: "CJK RADICAL C-SIMPLIFIED LEAF", 0x2EDB: "CJK RADICAL C-SIMPLIFIED WIND", 0x2EDC: "CJK RADICAL C-SIMPLIFIED FLY", 0x2EDD: "CJK RADICAL EAT ONE", 0x2EDE: "CJK RADICAL EAT TWO", 0x2EDF: "CJK RADICAL EAT THREE", 0x2EE0: "CJK RADICAL C-SIMPLIFIED EAT", 0x2EE1: "CJK RADICAL HEAD", 0x2EE2: "CJK RADICAL C-SIMPLIFIED HORSE", 0x2EE3: "CJK RADICAL BONE", 0x2EE4: "CJK RADICAL GHOST", 0x2EE5: "CJK RADICAL C-SIMPLIFIED FISH", 0x2EE6: "CJK RADICAL C-SIMPLIFIED BIRD", 0x2EE7: "CJK RADICAL C-SIMPLIFIED SALT", 0x2EE8: "CJK RADICAL SIMPLIFIED WHEAT", 0x2EE9: "CJK RADICAL SIMPLIFIED YELLOW", 0x2EEA: "CJK RADICAL C-SIMPLIFIED FROG", 0x2EEB: "CJK RADICAL J-SIMPLIFIED EVEN", 0x2EEC: "CJK RADICAL C-SIMPLIFIED EVEN", 0x2EED: "CJK RADICAL J-SIMPLIFIED TOOTH", 0x2EEE: "CJK RADICAL C-SIMPLIFIED TOOTH", 0x2EEF: "CJK RADICAL J-SIMPLIFIED DRAGON", 0x2EF0: "CJK RADICAL C-SIMPLIFIED DRAGON", 0x2EF1: "CJK RADICAL TURTLE", 0x2EF2: "CJK RADICAL J-SIMPLIFIED TURTLE", 0x2EF3: "CJK RADICAL C-SIMPLIFIED TURTLE", 0x2F00: "KANGXI RADICAL ONE", 0x2F01: "KANGXI RADICAL LINE", 0x2F02: "KANGXI RADICAL DOT", 0x2F03: "KANGXI RADICAL SLASH", 0x2F04: "KANGXI RADICAL SECOND", 0x2F05: "KANGXI RADICAL HOOK", 0x2F06: "KANGXI RADICAL TWO", 0x2F07: "KANGXI RADICAL LID", 0x2F08: "KANGXI RADICAL MAN", 0x2F09: "KANGXI RADICAL LEGS", 0x2F0A: "KANGXI RADICAL ENTER", 0x2F0B: "KANGXI RADICAL EIGHT", 0x2F0C: "KANGXI RADICAL DOWN BOX", 0x2F0D: "KANGXI RADICAL COVER", 0x2F0E: "KANGXI RADICAL ICE", 0x2F0F: "KANGXI RADICAL TABLE", 0x2F10: "KANGXI RADICAL OPEN BOX", 0x2F11: "KANGXI RADICAL KNIFE", 0x2F12: "KANGXI RADICAL POWER", 0x2F13: "KANGXI RADICAL WRAP", 0x2F14: "KANGXI RADICAL SPOON", 0x2F15: "KANGXI RADICAL RIGHT OPEN BOX", 0x2F16: "KANGXI RADICAL HIDING ENCLOSURE", 0x2F17: "KANGXI RADICAL TEN", 0x2F18: "KANGXI RADICAL DIVINATION", 0x2F19: "KANGXI RADICAL SEAL", 0x2F1A: "KANGXI RADICAL CLIFF", 0x2F1B: "KANGXI RADICAL PRIVATE", 0x2F1C: "KANGXI RADICAL AGAIN", 0x2F1D: "KANGXI RADICAL MOUTH", 0x2F1E: "KANGXI RADICAL ENCLOSURE", 0x2F1F: "KANGXI RADICAL EARTH", 0x2F20: "KANGXI RADICAL SCHOLAR", 0x2F21: "KANGXI RADICAL GO", 0x2F22: "KANGXI RADICAL GO SLOWLY", 0x2F23: "KANGXI RADICAL EVENING", 0x2F24: "KANGXI RADICAL BIG", 0x2F25: "KANGXI RADICAL WOMAN", 0x2F26: "KANGXI RADICAL CHILD", 0x2F27: "KANGXI RADICAL ROOF", 0x2F28: "KANGXI RADICAL INCH", 0x2F29: "KANGXI RADICAL SMALL", 0x2F2A: "KANGXI RADICAL LAME", 0x2F2B: "KANGXI RADICAL CORPSE", 0x2F2C: "KANGXI RADICAL SPROUT", 0x2F2D: "KANGXI RADICAL MOUNTAIN", 0x2F2E: "KANGXI RADICAL RIVER", 0x2F2F: "KANGXI RADICAL WORK", 0x2F30: "KANGXI RADICAL ONESELF", 0x2F31: "KANGXI RADICAL TURBAN", 0x2F32: "KANGXI RADICAL DRY", 0x2F33: "KANGXI RADICAL SHORT THREAD", 0x2F34: "KANGXI RADICAL DOTTED CLIFF", 0x2F35: "KANGXI RADICAL LONG STRIDE", 0x2F36: "KANGXI RADICAL TWO HANDS", 0x2F37: "KANGXI RADICAL SHOOT", 0x2F38: "KANGXI RADICAL BOW", 0x2F39: "KANGXI RADICAL SNOUT", 0x2F3A: "KANGXI RADICAL BRISTLE", 0x2F3B: "KANGXI RADICAL STEP", 0x2F3C: "KANGXI RADICAL HEART", 0x2F3D: "KANGXI RADICAL HALBERD", 0x2F3E: "KANGXI RADICAL DOOR", 0x2F3F: "KANGXI RADICAL HAND", 0x2F40: "KANGXI RADICAL BRANCH", 0x2F41: "KANGXI RADICAL RAP", 0x2F42: "KANGXI RADICAL SCRIPT", 0x2F43: "KANGXI RADICAL DIPPER", 0x2F44: "KANGXI RADICAL AXE", 0x2F45: "KANGXI RADICAL SQUARE", 0x2F46: "KANGXI RADICAL NOT", 0x2F47: "KANGXI RADICAL SUN", 0x2F48: "KANGXI RADICAL SAY", 0x2F49: "KANGXI RADICAL MOON", 0x2F4A: "KANGXI RADICAL TREE", 0x2F4B: "KANGXI RADICAL LACK", 0x2F4C: "KANGXI RADICAL STOP", 0x2F4D: "KANGXI RADICAL DEATH", 0x2F4E: "KANGXI RADICAL WEAPON", 0x2F4F: "KANGXI RADICAL DO NOT", 0x2F50: "KANGXI RADICAL COMPARE", 0x2F51: "KANGXI RADICAL FUR", 0x2F52: "KANGXI RADICAL CLAN", 0x2F53: "KANGXI RADICAL STEAM", 0x2F54: "KANGXI RADICAL WATER", 0x2F55: "KANGXI RADICAL FIRE", 0x2F56: "KANGXI RADICAL CLAW", 0x2F57: "KANGXI RADICAL FATHER", 0x2F58: "KANGXI RADICAL DOUBLE X", 0x2F59: "KANGXI RADICAL HALF TREE TRUNK", 0x2F5A: "KANGXI RADICAL SLICE", 0x2F5B: "KANGXI RADICAL FANG", 0x2F5C: "KANGXI RADICAL COW", 0x2F5D: "KANGXI RADICAL DOG", 0x2F5E: "KANGXI RADICAL PROFOUND", 0x2F5F: "KANGXI RADICAL JADE", 0x2F60: "KANGXI RADICAL MELON", 0x2F61: "KANGXI RADICAL TILE", 0x2F62: "KANGXI RADICAL SWEET", 0x2F63: "KANGXI RADICAL LIFE", 0x2F64: "KANGXI RADICAL USE", 0x2F65: "KANGXI RADICAL FIELD", 0x2F66: "KANGXI RADICAL BOLT OF CLOTH", 0x2F67: "KANGXI RADICAL SICKNESS", 0x2F68: "KANGXI RADICAL DOTTED TENT", 0x2F69: "KANGXI RADICAL WHITE", 0x2F6A: "KANGXI RADICAL SKIN", 0x2F6B: "KANGXI RADICAL DISH", 0x2F6C: "KANGXI RADICAL EYE", 0x2F6D: "KANGXI RADICAL SPEAR", 0x2F6E: "KANGXI RADICAL ARROW", 0x2F6F: "KANGXI RADICAL STONE", 0x2F70: "KANGXI RADICAL SPIRIT", 0x2F71: "KANGXI RADICAL TRACK", 0x2F72: "KANGXI RADICAL GRAIN", 0x2F73: "KANGXI RADICAL CAVE", 0x2F74: "KANGXI RADICAL STAND", 0x2F75: "KANGXI RADICAL BAMBOO", 0x2F76: "KANGXI RADICAL RICE", 0x2F77: "KANGXI RADICAL SILK", 0x2F78: "KANGXI RADICAL JAR", 0x2F79: "KANGXI RADICAL NET", 0x2F7A: "KANGXI RADICAL SHEEP", 0x2F7B: "KANGXI RADICAL FEATHER", 0x2F7C: "KANGXI RADICAL OLD", 0x2F7D: "KANGXI RADICAL AND", 0x2F7E: "KANGXI RADICAL PLOW", 0x2F7F: "KANGXI RADICAL EAR", 0x2F80: "KANGXI RADICAL BRUSH", 0x2F81: "KANGXI RADICAL MEAT", 0x2F82: "KANGXI RADICAL MINISTER", 0x2F83: "KANGXI RADICAL SELF", 0x2F84: "KANGXI RADICAL ARRIVE", 0x2F85: "KANGXI RADICAL MORTAR", 0x2F86: "KANGXI RADICAL TONGUE", 0x2F87: "KANGXI RADICAL OPPOSE", 0x2F88: "KANGXI RADICAL BOAT", 0x2F89: "KANGXI RADICAL STOPPING", 0x2F8A: "KANGXI RADICAL COLOR", 0x2F8B: "KANGXI RADICAL GRASS", 0x2F8C: "KANGXI RADICAL TIGER", 0x2F8D: "KANGXI RADICAL INSECT", 0x2F8E: "KANGXI RADICAL BLOOD", 0x2F8F: "KANGXI RADICAL WALK ENCLOSURE", 0x2F90: "KANGXI RADICAL CLOTHES", 0x2F91: "KANGXI RADICAL WEST", 0x2F92: "KANGXI RADICAL SEE", 0x2F93: "KANGXI RADICAL HORN", 0x2F94: "KANGXI RADICAL SPEECH", 0x2F95: "KANGXI RADICAL VALLEY", 0x2F96: "KANGXI RADICAL BEAN", 0x2F97: "KANGXI RADICAL PIG", 0x2F98: "KANGXI RADICAL BADGER", 0x2F99: "KANGXI RADICAL SHELL", 0x2F9A: "KANGXI RADICAL RED", 0x2F9B: "KANGXI RADICAL RUN", 0x2F9C: "KANGXI RADICAL FOOT", 0x2F9D: "KANGXI RADICAL BODY", 0x2F9E: "KANGXI RADICAL CART", 0x2F9F: "KANGXI RADICAL BITTER", 0x2FA0: "KANGXI RADICAL MORNING", 0x2FA1: "KANGXI RADICAL WALK", 0x2FA2: "KANGXI RADICAL CITY", 0x2FA3: "KANGXI RADICAL WINE", 0x2FA4: "KANGXI RADICAL DISTINGUISH", 0x2FA5: "KANGXI RADICAL VILLAGE", 0x2FA6: "KANGXI RADICAL GOLD", 0x2FA7: "KANGXI RADICAL LONG", 0x2FA8: "KANGXI RADICAL GATE", 0x2FA9: "KANGXI RADICAL MOUND", 0x2FAA: "KANGXI RADICAL SLAVE", 0x2FAB: "KANGXI RADICAL SHORT TAILED BIRD", 0x2FAC: "KANGXI RADICAL RAIN", 0x2FAD: "KANGXI RADICAL BLUE", 0x2FAE: "KANGXI RADICAL WRONG", 0x2FAF: "KANGXI RADICAL FACE", 0x2FB0: "KANGXI RADICAL LEATHER", 0x2FB1: "KANGXI RADICAL TANNED LEATHER", 0x2FB2: "KANGXI RADICAL LEEK", 0x2FB3: "KANGXI RADICAL SOUND", 0x2FB4: "KANGXI RADICAL LEAF", 0x2FB5: "KANGXI RADICAL WIND", 0x2FB6: "KANGXI RADICAL FLY", 0x2FB7: "KANGXI RADICAL EAT", 0x2FB8: "KANGXI RADICAL HEAD", 0x2FB9: "KANGXI RADICAL FRAGRANT", 0x2FBA: "KANGXI RADICAL HORSE", 0x2FBB: "KANGXI RADICAL BONE", 0x2FBC: "KANGXI RADICAL TALL", 0x2FBD: "KANGXI RADICAL HAIR", 0x2FBE: "KANGXI RADICAL FIGHT", 0x2FBF: "KANGXI RADICAL SACRIFICIAL WINE", 0x2FC0: "KANGXI RADICAL CAULDRON", 0x2FC1: "KANGXI RADICAL GHOST", 0x2FC2: "KANGXI RADICAL FISH", 0x2FC3: "KANGXI RADICAL BIRD", 0x2FC4: "KANGXI RADICAL SALT", 0x2FC5: "KANGXI RADICAL DEER", 0x2FC6: "KANGXI RADICAL WHEAT", 0x2FC7: "KANGXI RADICAL HEMP", 0x2FC8: "KANGXI RADICAL YELLOW", 0x2FC9: "KANGXI RADICAL MILLET", 0x2FCA: "KANGXI RADICAL BLACK", 0x2FCB: "KANGXI RADICAL EMBROIDERY", 0x2FCC: "KANGXI RADICAL FROG", 0x2FCD: "KANGXI RADICAL TRIPOD", 0x2FCE: "KANGXI RADICAL DRUM", 0x2FCF: "KANGXI RADICAL RAT", 0x2FD0: "KANGXI RADICAL NOSE", 0x2FD1: "KANGXI RADICAL EVEN", 0x2FD2: "KANGXI RADICAL TOOTH", 0x2FD3: "KANGXI RADICAL DRAGON", 0x2FD4: "KANGXI RADICAL TURTLE", 0x2FD5: "KANGXI RADICAL FLUTE", 0x2FF0: "IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT", 0x2FF1: "IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW", 0x2FF2: "IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT", 0x2FF3: "IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW", 0x2FF4: "IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND", 0x2FF5: "IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE", 0x2FF6: "IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW", 0x2FF7: "IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT", 0x2FF8: "IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT", 0x2FF9: "IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT", 0x2FFA: "IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT", 0x2FFB: "IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID", 0x3000: "IDEOGRAPHIC SPACE", 0x3001: "IDEOGRAPHIC COMMA", 0x3002: "IDEOGRAPHIC FULL STOP", 0x3003: "DITTO MARK", 0x3004: "JAPANESE INDUSTRIAL STANDARD SYMBOL", 0x3005: "IDEOGRAPHIC ITERATION MARK", 0x3006: "IDEOGRAPHIC CLOSING MARK", 0x3007: "IDEOGRAPHIC NUMBER ZERO", 0x3008: "LEFT ANGLE BRACKET", 0x3009: "RIGHT ANGLE BRACKET", 0x300A: "LEFT DOUBLE ANGLE BRACKET", 0x300B: "RIGHT DOUBLE ANGLE BRACKET", 0x300C: "LEFT CORNER BRACKET", 0x300D: "RIGHT CORNER BRACKET", 0x300E: "LEFT WHITE CORNER BRACKET", 0x300F: "RIGHT WHITE CORNER BRACKET", 0x3010: "LEFT BLACK LENTICULAR BRACKET", 0x3011: "RIGHT BLACK LENTICULAR BRACKET", 0x3012: "POSTAL MARK", 0x3013: "GETA MARK", 0x3014: "LEFT TORTOISE SHELL BRACKET", 0x3015: "RIGHT TORTOISE SHELL BRACKET", 0x3016: "LEFT WHITE LENTICULAR BRACKET", 0x3017: "RIGHT WHITE LENTICULAR BRACKET", 0x3018: "LEFT WHITE TORTOISE SHELL BRACKET", 0x3019: "RIGHT WHITE TORTOISE SHELL BRACKET", 0x301A: "LEFT WHITE SQUARE BRACKET", 0x301B: "RIGHT WHITE SQUARE BRACKET", 0x301C: "WAVE DASH", 0x301D: "REVERSED DOUBLE PRIME QUOTATION MARK", 0x301E: "DOUBLE PRIME QUOTATION MARK", 0x301F: "LOW DOUBLE PRIME QUOTATION MARK", 0x3020: "POSTAL MARK FACE", 0x3021: "HANGZHOU NUMERAL ONE", 0x3022: "HANGZHOU NUMERAL TWO", 0x3023: "HANGZHOU NUMERAL THREE", 0x3024: "HANGZHOU NUMERAL FOUR", 0x3025: "HANGZHOU NUMERAL FIVE", 0x3026: "HANGZHOU NUMERAL SIX", 0x3027: "HANGZHOU NUMERAL SEVEN", 0x3028: "HANGZHOU NUMERAL EIGHT", 0x3029: "HANGZHOU NUMERAL NINE", 0x302A: "IDEOGRAPHIC LEVEL TONE MARK", 0x302B: "IDEOGRAPHIC RISING TONE MARK", 0x302C: "IDEOGRAPHIC DEPARTING TONE MARK", 0x302D: "IDEOGRAPHIC ENTERING TONE MARK", 0x302E: "HANGUL SINGLE DOT TONE MARK", 0x302F: "HANGUL DOUBLE DOT TONE MARK", 0x3030: "WAVY DASH", 0x3031: "VERTICAL KANA REPEAT MARK", 0x3032: "VERTICAL KANA REPEAT WITH VOICED SOUND MARK", 0x3033: "VERTICAL KANA REPEAT MARK UPPER HALF", 0x3034: "VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF", 0x3035: "VERTICAL KANA REPEAT MARK LOWER HALF", 0x3036: "CIRCLED POSTAL MARK", 0x3037: "IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL", 0x3038: "HANGZHOU NUMERAL TEN", 0x3039: "HANGZHOU NUMERAL TWENTY", 0x303A: "HANGZHOU NUMERAL THIRTY", 0x303B: "VERTICAL IDEOGRAPHIC ITERATION MARK", 0x303C: "MASU MARK", 0x303D: "PART ALTERNATION MARK", 0x303E: "IDEOGRAPHIC VARIATION INDICATOR", 0x303F: "IDEOGRAPHIC HALF FILL SPACE", 0x3041: "HIRAGANA LETTER SMALL A", 0x3042: "HIRAGANA LETTER A", 0x3043: "HIRAGANA LETTER SMALL I", 0x3044: "HIRAGANA LETTER I", 0x3045: "HIRAGANA LETTER SMALL U", 0x3046: "HIRAGANA LETTER U", 0x3047: "HIRAGANA LETTER SMALL E", 0x3048: "HIRAGANA LETTER E", 0x3049: "HIRAGANA LETTER SMALL O", 0x304A: "HIRAGANA LETTER O", 0x304B: "HIRAGANA LETTER KA", 0x304C: "HIRAGANA LETTER GA", 0x304D: "HIRAGANA LETTER KI", 0x304E: "HIRAGANA LETTER GI", 0x304F: "HIRAGANA LETTER KU", 0x3050: "HIRAGANA LETTER GU", 0x3051: "HIRAGANA LETTER KE", 0x3052: "HIRAGANA LETTER GE", 0x3053: "HIRAGANA LETTER KO", 0x3054: "HIRAGANA LETTER GO", 0x3055: "HIRAGANA LETTER SA", 0x3056: "HIRAGANA LETTER ZA", 0x3057: "HIRAGANA LETTER SI", 0x3058: "HIRAGANA LETTER ZI", 0x3059: "HIRAGANA LETTER SU", 0x305A: "HIRAGANA LETTER ZU", 0x305B: "HIRAGANA LETTER SE", 0x305C: "HIRAGANA LETTER ZE", 0x305D: "HIRAGANA LETTER SO", 0x305E: "HIRAGANA LETTER ZO", 0x305F: "HIRAGANA LETTER TA", 0x3060: "HIRAGANA LETTER DA", 0x3061: "HIRAGANA LETTER TI", 0x3062: "HIRAGANA LETTER DI", 0x3063: "HIRAGANA LETTER SMALL TU", 0x3064: "HIRAGANA LETTER TU", 0x3065: "HIRAGANA LETTER DU", 0x3066: "HIRAGANA LETTER TE", 0x3067: "HIRAGANA LETTER DE", 0x3068: "HIRAGANA LETTER TO", 0x3069: "HIRAGANA LETTER DO", 0x306A: "HIRAGANA LETTER NA", 0x306B: "HIRAGANA LETTER NI", 0x306C: "HIRAGANA LETTER NU", 0x306D: "HIRAGANA LETTER NE", 0x306E: "HIRAGANA LETTER NO", 0x306F: "HIRAGANA LETTER HA", 0x3070: "HIRAGANA LETTER BA", 0x3071: "HIRAGANA LETTER PA", 0x3072: "HIRAGANA LETTER HI", 0x3073: "HIRAGANA LETTER BI", 0x3074: "HIRAGANA LETTER PI", 0x3075: "HIRAGANA LETTER HU", 0x3076: "HIRAGANA LETTER BU", 0x3077: "HIRAGANA LETTER PU", 0x3078: "HIRAGANA LETTER HE", 0x3079: "HIRAGANA LETTER BE", 0x307A: "HIRAGANA LETTER PE", 0x307B: "HIRAGANA LETTER HO", 0x307C: "HIRAGANA LETTER BO", 0x307D: "HIRAGANA LETTER PO", 0x307E: "HIRAGANA LETTER MA", 0x307F: "HIRAGANA LETTER MI", 0x3080: "HIRAGANA LETTER MU", 0x3081: "HIRAGANA LETTER ME", 0x3082: "HIRAGANA LETTER MO", 0x3083: "HIRAGANA LETTER SMALL YA", 0x3084: "HIRAGANA LETTER YA", 0x3085: "HIRAGANA LETTER SMALL YU", 0x3086: "HIRAGANA LETTER YU", 0x3087: "HIRAGANA LETTER SMALL YO", 0x3088: "HIRAGANA LETTER YO", 0x3089: "HIRAGANA LETTER RA", 0x308A: "HIRAGANA LETTER RI", 0x308B: "HIRAGANA LETTER RU", 0x308C: "HIRAGANA LETTER RE", 0x308D: "HIRAGANA LETTER RO", 0x308E: "HIRAGANA LETTER SMALL WA", 0x308F: "HIRAGANA LETTER WA", 0x3090: "HIRAGANA LETTER WI", 0x3091: "HIRAGANA LETTER WE", 0x3092: "HIRAGANA LETTER WO", 0x3093: "HIRAGANA LETTER N", 0x3094: "HIRAGANA LETTER VU", 0x3095: "HIRAGANA LETTER SMALL KA", 0x3096: "HIRAGANA LETTER SMALL KE", 0x3099: "COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK", 0x309A: "COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK", 0x309B: "KATAKANA-HIRAGANA VOICED SOUND MARK", 0x309C: "KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK", 0x309D: "HIRAGANA ITERATION MARK", 0x309E: "HIRAGANA VOICED ITERATION MARK", 0x309F: "HIRAGANA DIGRAPH YORI", 0x30A0: "KATAKANA-HIRAGANA DOUBLE HYPHEN", 0x30A1: "KATAKANA LETTER SMALL A", 0x30A2: "KATAKANA LETTER A", 0x30A3: "KATAKANA LETTER SMALL I", 0x30A4: "KATAKANA LETTER I", 0x30A5: "KATAKANA LETTER SMALL U", 0x30A6: "KATAKANA LETTER U", 0x30A7: "KATAKANA LETTER SMALL E", 0x30A8: "KATAKANA LETTER E", 0x30A9: "KATAKANA LETTER SMALL O", 0x30AA: "KATAKANA LETTER O", 0x30AB: "KATAKANA LETTER KA", 0x30AC: "KATAKANA LETTER GA", 0x30AD: "KATAKANA LETTER KI", 0x30AE: "KATAKANA LETTER GI", 0x30AF: "KATAKANA LETTER KU", 0x30B0: "KATAKANA LETTER GU", 0x30B1: "KATAKANA LETTER KE", 0x30B2: "KATAKANA LETTER GE", 0x30B3: "KATAKANA LETTER KO", 0x30B4: "KATAKANA LETTER GO", 0x30B5: "KATAKANA LETTER SA", 0x30B6: "KATAKANA LETTER ZA", 0x30B7: "KATAKANA LETTER SI", 0x30B8: "KATAKANA LETTER ZI", 0x30B9: "KATAKANA LETTER SU", 0x30BA: "KATAKANA LETTER ZU", 0x30BB: "KATAKANA LETTER SE", 0x30BC: "KATAKANA LETTER ZE", 0x30BD: "KATAKANA LETTER SO", 0x30BE: "KATAKANA LETTER ZO", 0x30BF: "KATAKANA LETTER TA", 0x30C0: "KATAKANA LETTER DA", 0x30C1: "KATAKANA LETTER TI", 0x30C2: "KATAKANA LETTER DI", 0x30C3: "KATAKANA LETTER SMALL TU", 0x30C4: "KATAKANA LETTER TU", 0x30C5: "KATAKANA LETTER DU", 0x30C6: "KATAKANA LETTER TE", 0x30C7: "KATAKANA LETTER DE", 0x30C8: "KATAKANA LETTER TO", 0x30C9: "KATAKANA LETTER DO", 0x30CA: "KATAKANA LETTER NA", 0x30CB: "KATAKANA LETTER NI", 0x30CC: "KATAKANA LETTER NU", 0x30CD: "KATAKANA LETTER NE", 0x30CE: "KATAKANA LETTER NO", 0x30CF: "KATAKANA LETTER HA", 0x30D0: "KATAKANA LETTER BA", 0x30D1: "KATAKANA LETTER PA", 0x30D2: "KATAKANA LETTER HI", 0x30D3: "KATAKANA LETTER BI", 0x30D4: "KATAKANA LETTER PI", 0x30D5: "KATAKANA LETTER HU", 0x30D6: "KATAKANA LETTER BU", 0x30D7: "KATAKANA LETTER PU", 0x30D8: "KATAKANA LETTER HE", 0x30D9: "KATAKANA LETTER BE", 0x30DA: "KATAKANA LETTER PE", 0x30DB: "KATAKANA LETTER HO", 0x30DC: "KATAKANA LETTER BO", 0x30DD: "KATAKANA LETTER PO", 0x30DE: "KATAKANA LETTER MA", 0x30DF: "KATAKANA LETTER MI", 0x30E0: "KATAKANA LETTER MU", 0x30E1: "KATAKANA LETTER ME", 0x30E2: "KATAKANA LETTER MO", 0x30E3: "KATAKANA LETTER SMALL YA", 0x30E4: "KATAKANA LETTER YA", 0x30E5: "KATAKANA LETTER SMALL YU", 0x30E6: "KATAKANA LETTER YU", 0x30E7: "KATAKANA LETTER SMALL YO", 0x30E8: "KATAKANA LETTER YO", 0x30E9: "KATAKANA LETTER RA", 0x30EA: "KATAKANA LETTER RI", 0x30EB: "KATAKANA LETTER RU", 0x30EC: "KATAKANA LETTER RE", 0x30ED: "KATAKANA LETTER RO", 0x30EE: "KATAKANA LETTER SMALL WA", 0x30EF: "KATAKANA LETTER WA", 0x30F0: "KATAKANA LETTER WI", 0x30F1: "KATAKANA LETTER WE", 0x30F2: "KATAKANA LETTER WO", 0x30F3: "KATAKANA LETTER N", 0x30F4: "KATAKANA LETTER VU", 0x30F5: "KATAKANA LETTER SMALL KA", 0x30F6: "KATAKANA LETTER SMALL KE", 0x30F7: "KATAKANA LETTER VA", 0x30F8: "KATAKANA LETTER VI", 0x30F9: "KATAKANA LETTER VE", 0x30FA: "KATAKANA LETTER VO", 0x30FB: "KATAKANA MIDDLE DOT", 0x30FC: "KATAKANA-HIRAGANA PROLONGED SOUND MARK", 0x30FD: "KATAKANA ITERATION MARK", 0x30FE: "KATAKANA VOICED ITERATION MARK", 0x30FF: "KATAKANA DIGRAPH KOTO", 0x3105: "BOPOMOFO LETTER B", 0x3106: "BOPOMOFO LETTER P", 0x3107: "BOPOMOFO LETTER M", 0x3108: "BOPOMOFO LETTER F", 0x3109: "BOPOMOFO LETTER D", 0x310A: "BOPOMOFO LETTER T", 0x310B: "BOPOMOFO LETTER N", 0x310C: "BOPOMOFO LETTER L", 0x310D: "BOPOMOFO LETTER G", 0x310E: "BOPOMOFO LETTER K", 0x310F: "BOPOMOFO LETTER H", 0x3110: "BOPOMOFO LETTER J", 0x3111: "BOPOMOFO LETTER Q", 0x3112: "BOPOMOFO LETTER X", 0x3113: "BOPOMOFO LETTER ZH", 0x3114: "BOPOMOFO LETTER CH", 0x3115: "BOPOMOFO LETTER SH", 0x3116: "BOPOMOFO LETTER R", 0x3117: "BOPOMOFO LETTER Z", 0x3118: "BOPOMOFO LETTER C", 0x3119: "BOPOMOFO LETTER S", 0x311A: "BOPOMOFO LETTER A", 0x311B: "BOPOMOFO LETTER O", 0x311C: "BOPOMOFO LETTER E", 0x311D: "BOPOMOFO LETTER EH", 0x311E: "BOPOMOFO LETTER AI", 0x311F: "BOPOMOFO LETTER EI", 0x3120: "BOPOMOFO LETTER AU", 0x3121: "BOPOMOFO LETTER OU", 0x3122: "BOPOMOFO LETTER AN", 0x3123: "BOPOMOFO LETTER EN", 0x3124: "BOPOMOFO LETTER ANG", 0x3125: "BOPOMOFO LETTER ENG", 0x3126: "BOPOMOFO LETTER ER", 0x3127: "BOPOMOFO LETTER I", 0x3128: "BOPOMOFO LETTER U", 0x3129: "BOPOMOFO LETTER IU", 0x312A: "BOPOMOFO LETTER V", 0x312B: "BOPOMOFO LETTER NG", 0x312C: "BOPOMOFO LETTER GN", 0x312D: "BOPOMOFO LETTER IH", 0x3131: "HANGUL LETTER KIYEOK", 0x3132: "HANGUL LETTER SSANGKIYEOK", 0x3133: "HANGUL LETTER KIYEOK-SIOS", 0x3134: "HANGUL LETTER NIEUN", 0x3135: "HANGUL LETTER NIEUN-CIEUC", 0x3136: "HANGUL LETTER NIEUN-HIEUH", 0x3137: "HANGUL LETTER TIKEUT", 0x3138: "HANGUL LETTER SSANGTIKEUT", 0x3139: "HANGUL LETTER RIEUL", 0x313A: "HANGUL LETTER RIEUL-KIYEOK", 0x313B: "HANGUL LETTER RIEUL-MIEUM", 0x313C: "HANGUL LETTER RIEUL-PIEUP", 0x313D: "HANGUL LETTER RIEUL-SIOS", 0x313E: "HANGUL LETTER RIEUL-THIEUTH", 0x313F: "HANGUL LETTER RIEUL-PHIEUPH", 0x3140: "HANGUL LETTER RIEUL-HIEUH", 0x3141: "HANGUL LETTER MIEUM", 0x3142: "HANGUL LETTER PIEUP", 0x3143: "HANGUL LETTER SSANGPIEUP", 0x3144: "HANGUL LETTER PIEUP-SIOS", 0x3145: "HANGUL LETTER SIOS", 0x3146: "HANGUL LETTER SSANGSIOS", 0x3147: "HANGUL LETTER IEUNG", 0x3148: "HANGUL LETTER CIEUC", 0x3149: "HANGUL LETTER SSANGCIEUC", 0x314A: "HANGUL LETTER CHIEUCH", 0x314B: "HANGUL LETTER KHIEUKH", 0x314C: "HANGUL LETTER THIEUTH", 0x314D: "HANGUL LETTER PHIEUPH", 0x314E: "HANGUL LETTER HIEUH", 0x314F: "HANGUL LETTER A", 0x3150: "HANGUL LETTER AE", 0x3151: "HANGUL LETTER YA", 0x3152: "HANGUL LETTER YAE", 0x3153: "HANGUL LETTER EO", 0x3154: "HANGUL LETTER E", 0x3155: "HANGUL LETTER YEO", 0x3156: "HANGUL LETTER YE", 0x3157: "HANGUL LETTER O", 0x3158: "HANGUL LETTER WA", 0x3159: "HANGUL LETTER WAE", 0x315A: "HANGUL LETTER OE", 0x315B: "HANGUL LETTER YO", 0x315C: "HANGUL LETTER U", 0x315D: "HANGUL LETTER WEO", 0x315E: "HANGUL LETTER WE", 0x315F: "HANGUL LETTER WI", 0x3160: "HANGUL LETTER YU", 0x3161: "HANGUL LETTER EU", 0x3162: "HANGUL LETTER YI", 0x3163: "HANGUL LETTER I", 0x3164: "HANGUL FILLER", 0x3165: "HANGUL LETTER SSANGNIEUN", 0x3166: "HANGUL LETTER NIEUN-TIKEUT", 0x3167: "HANGUL LETTER NIEUN-SIOS", 0x3168: "HANGUL LETTER NIEUN-PANSIOS", 0x3169: "HANGUL LETTER RIEUL-KIYEOK-SIOS", 0x316A: "HANGUL LETTER RIEUL-TIKEUT", 0x316B: "HANGUL LETTER RIEUL-PIEUP-SIOS", 0x316C: "HANGUL LETTER RIEUL-PANSIOS", 0x316D: "HANGUL LETTER RIEUL-YEORINHIEUH", 0x316E: "HANGUL LETTER MIEUM-PIEUP", 0x316F: "HANGUL LETTER MIEUM-SIOS", 0x3170: "HANGUL LETTER MIEUM-PANSIOS", 0x3171: "HANGUL LETTER KAPYEOUNMIEUM", 0x3172: "HANGUL LETTER PIEUP-KIYEOK", 0x3173: "HANGUL LETTER PIEUP-TIKEUT", 0x3174: "HANGUL LETTER PIEUP-SIOS-KIYEOK", 0x3175: "HANGUL LETTER PIEUP-SIOS-TIKEUT", 0x3176: "HANGUL LETTER PIEUP-CIEUC", 0x3177: "HANGUL LETTER PIEUP-THIEUTH", 0x3178: "HANGUL LETTER KAPYEOUNPIEUP", 0x3179: "HANGUL LETTER KAPYEOUNSSANGPIEUP", 0x317A: "HANGUL LETTER SIOS-KIYEOK", 0x317B: "HANGUL LETTER SIOS-NIEUN", 0x317C: "HANGUL LETTER SIOS-TIKEUT", 0x317D: "HANGUL LETTER SIOS-PIEUP", 0x317E: "HANGUL LETTER SIOS-CIEUC", 0x317F: "HANGUL LETTER PANSIOS", 0x3180: "HANGUL LETTER SSANGIEUNG", 0x3181: "HANGUL LETTER YESIEUNG", 0x3182: "HANGUL LETTER YESIEUNG-SIOS", 0x3183: "HANGUL LETTER YESIEUNG-PANSIOS", 0x3184: "HANGUL LETTER KAPYEOUNPHIEUPH", 0x3185: "HANGUL LETTER SSANGHIEUH", 0x3186: "HANGUL LETTER YEORINHIEUH", 0x3187: "HANGUL LETTER YO-YA", 0x3188: "HANGUL LETTER YO-YAE", 0x3189: "HANGUL LETTER YO-I", 0x318A: "HANGUL LETTER YU-YEO", 0x318B: "HANGUL LETTER YU-YE", 0x318C: "HANGUL LETTER YU-I", 0x318D: "HANGUL LETTER ARAEA", 0x318E: "HANGUL LETTER ARAEAE", 0x3190: "IDEOGRAPHIC ANNOTATION LINKING MARK (Kanbun Tateten)", 0x3191: "IDEOGRAPHIC ANNOTATION REVERSE MARK (Kaeriten)", 0x3192: "IDEOGRAPHIC ANNOTATION ONE MARK (Kaeriten)", 0x3193: "IDEOGRAPHIC ANNOTATION TWO MARK (Kaeriten)", 0x3194: "IDEOGRAPHIC ANNOTATION THREE MARK (Kaeriten)", 0x3195: "IDEOGRAPHIC ANNOTATION FOUR MARK (Kaeriten)", 0x3196: "IDEOGRAPHIC ANNOTATION TOP MARK (Kaeriten)", 0x3197: "IDEOGRAPHIC ANNOTATION MIDDLE MARK (Kaeriten)", 0x3198: "IDEOGRAPHIC ANNOTATION BOTTOM MARK (Kaeriten)", 0x3199: "IDEOGRAPHIC ANNOTATION FIRST MARK (Kaeriten)", 0x319A: "IDEOGRAPHIC ANNOTATION SECOND MARK (Kaeriten)", 0x319B: "IDEOGRAPHIC ANNOTATION THIRD MARK (Kaeriten)", 0x319C: "IDEOGRAPHIC ANNOTATION FOURTH MARK (Kaeriten)", 0x319D: "IDEOGRAPHIC ANNOTATION HEAVEN MARK (Kaeriten)", 0x319E: "IDEOGRAPHIC ANNOTATION EARTH MARK (Kaeriten)", 0x319F: "IDEOGRAPHIC ANNOTATION MAN MARK (Kaeriten)", 0x31A0: "BOPOMOFO LETTER BU", 0x31A1: "BOPOMOFO LETTER ZI", 0x31A2: "BOPOMOFO LETTER JI", 0x31A3: "BOPOMOFO LETTER GU", 0x31A4: "BOPOMOFO LETTER EE", 0x31A5: "BOPOMOFO LETTER ENN", 0x31A6: "BOPOMOFO LETTER OO", 0x31A7: "BOPOMOFO LETTER ONN", 0x31A8: "BOPOMOFO LETTER IR", 0x31A9: "BOPOMOFO LETTER ANN", 0x31AA: "BOPOMOFO LETTER INN", 0x31AB: "BOPOMOFO LETTER UNN", 0x31AC: "BOPOMOFO LETTER IM", 0x31AD: "BOPOMOFO LETTER NGG", 0x31AE: "BOPOMOFO LETTER AINN", 0x31AF: "BOPOMOFO LETTER AUNN", 0x31B0: "BOPOMOFO LETTER AM", 0x31B1: "BOPOMOFO LETTER OM", 0x31B2: "BOPOMOFO LETTER ONG", 0x31B3: "BOPOMOFO LETTER INNN", 0x31B4: "BOPOMOFO FINAL LETTER P", 0x31B5: "BOPOMOFO FINAL LETTER T", 0x31B6: "BOPOMOFO FINAL LETTER K", 0x31B7: "BOPOMOFO FINAL LETTER H", 0x31C0: "CJK STROKE T", 0x31C1: "CJK STROKE WG", 0x31C2: "CJK STROKE XG", 0x31C3: "CJK STROKE BXG", 0x31C4: "CJK STROKE SW", 0x31C5: "CJK STROKE HZZ", 0x31C6: "CJK STROKE HZG", 0x31C7: "CJK STROKE HP", 0x31C8: "CJK STROKE HZWG", 0x31C9: "CJK STROKE SZWG", 0x31CA: "CJK STROKE HZT", 0x31CB: "CJK STROKE HZZP", 0x31CC: "CJK STROKE HPWG", 0x31CD: "CJK STROKE HZW", 0x31CE: "CJK STROKE HZZZ", 0x31CF: "CJK STROKE N", 0x31D0: "CJK STROKE H", 0x31D1: "CJK STROKE S", 0x31D2: "CJK STROKE P", 0x31D3: "CJK STROKE SP", 0x31D4: "CJK STROKE D", 0x31D5: "CJK STROKE HZ", 0x31D6: "CJK STROKE HG", 0x31D7: "CJK STROKE SZ", 0x31D8: "CJK STROKE SWZ", 0x31D9: "CJK STROKE ST", 0x31DA: "CJK STROKE SG", 0x31DB: "CJK STROKE PD", 0x31DC: "CJK STROKE PZ", 0x31DD: "CJK STROKE TN", 0x31DE: "CJK STROKE SZZ", 0x31DF: "CJK STROKE SWG", 0x31E0: "CJK STROKE HXWG", 0x31E1: "CJK STROKE HZZZG", 0x31E2: "CJK STROKE PG", 0x31E3: "CJK STROKE Q", 0x31F0: "KATAKANA LETTER SMALL KU", 0x31F1: "KATAKANA LETTER SMALL SI", 0x31F2: "KATAKANA LETTER SMALL SU", 0x31F3: "KATAKANA LETTER SMALL TO", 0x31F4: "KATAKANA LETTER SMALL NU", 0x31F5: "KATAKANA LETTER SMALL HA", 0x31F6: "KATAKANA LETTER SMALL HI", 0x31F7: "KATAKANA LETTER SMALL HU", 0x31F8: "KATAKANA LETTER SMALL HE", 0x31F9: "KATAKANA LETTER SMALL HO", 0x31FA: "KATAKANA LETTER SMALL MU", 0x31FB: "KATAKANA LETTER SMALL RA", 0x31FC: "KATAKANA LETTER SMALL RI", 0x31FD: "KATAKANA LETTER SMALL RU", 0x31FE: "KATAKANA LETTER SMALL RE", 0x31FF: "KATAKANA LETTER SMALL RO", 0x3200: "PARENTHESIZED HANGUL KIYEOK", 0x3201: "PARENTHESIZED HANGUL NIEUN", 0x3202: "PARENTHESIZED HANGUL TIKEUT", 0x3203: "PARENTHESIZED HANGUL RIEUL", 0x3204: "PARENTHESIZED HANGUL MIEUM", 0x3205: "PARENTHESIZED HANGUL PIEUP", 0x3206: "PARENTHESIZED HANGUL SIOS", 0x3207: "PARENTHESIZED HANGUL IEUNG", 0x3208: "PARENTHESIZED HANGUL CIEUC", 0x3209: "PARENTHESIZED HANGUL CHIEUCH", 0x320A: "PARENTHESIZED HANGUL KHIEUKH", 0x320B: "PARENTHESIZED HANGUL THIEUTH", 0x320C: "PARENTHESIZED HANGUL PHIEUPH", 0x320D: "PARENTHESIZED HANGUL HIEUH", 0x320E: "PARENTHESIZED HANGUL KIYEOK A", 0x320F: "PARENTHESIZED HANGUL NIEUN A", 0x3210: "PARENTHESIZED HANGUL TIKEUT A", 0x3211: "PARENTHESIZED HANGUL RIEUL A", 0x3212: "PARENTHESIZED HANGUL MIEUM A", 0x3213: "PARENTHESIZED HANGUL PIEUP A", 0x3214: "PARENTHESIZED HANGUL SIOS A", 0x3215: "PARENTHESIZED HANGUL IEUNG A", 0x3216: "PARENTHESIZED HANGUL CIEUC A", 0x3217: "PARENTHESIZED HANGUL CHIEUCH A", 0x3218: "PARENTHESIZED HANGUL KHIEUKH A", 0x3219: "PARENTHESIZED HANGUL THIEUTH A", 0x321A: "PARENTHESIZED HANGUL PHIEUPH A", 0x321B: "PARENTHESIZED HANGUL HIEUH A", 0x321C: "PARENTHESIZED HANGUL CIEUC U", 0x321D: "PARENTHESIZED KOREAN CHARACTER OJEON", 0x321E: "PARENTHESIZED KOREAN CHARACTER O HU", 0x3220: "PARENTHESIZED IDEOGRAPH ONE", 0x3221: "PARENTHESIZED IDEOGRAPH TWO", 0x3222: "PARENTHESIZED IDEOGRAPH THREE", 0x3223: "PARENTHESIZED IDEOGRAPH FOUR", 0x3224: "PARENTHESIZED IDEOGRAPH FIVE", 0x3225: "PARENTHESIZED IDEOGRAPH SIX", 0x3226: "PARENTHESIZED IDEOGRAPH SEVEN", 0x3227: "PARENTHESIZED IDEOGRAPH EIGHT", 0x3228: "PARENTHESIZED IDEOGRAPH NINE", 0x3229: "PARENTHESIZED IDEOGRAPH TEN", 0x322A: "PARENTHESIZED IDEOGRAPH MOON", 0x322B: "PARENTHESIZED IDEOGRAPH FIRE", 0x322C: "PARENTHESIZED IDEOGRAPH WATER", 0x322D: "PARENTHESIZED IDEOGRAPH WOOD", 0x322E: "PARENTHESIZED IDEOGRAPH METAL", 0x322F: "PARENTHESIZED IDEOGRAPH EARTH", 0x3230: "PARENTHESIZED IDEOGRAPH SUN", 0x3231: "PARENTHESIZED IDEOGRAPH STOCK", 0x3232: "PARENTHESIZED IDEOGRAPH HAVE", 0x3233: "PARENTHESIZED IDEOGRAPH SOCIETY", 0x3234: "PARENTHESIZED IDEOGRAPH NAME", 0x3235: "PARENTHESIZED IDEOGRAPH SPECIAL", 0x3236: "PARENTHESIZED IDEOGRAPH FINANCIAL", 0x3237: "PARENTHESIZED IDEOGRAPH CONGRATULATION", 0x3238: "PARENTHESIZED IDEOGRAPH LABOR", 0x3239: "PARENTHESIZED IDEOGRAPH REPRESENT", 0x323A: "PARENTHESIZED IDEOGRAPH CALL", 0x323B: "PARENTHESIZED IDEOGRAPH STUDY", 0x323C: "PARENTHESIZED IDEOGRAPH SUPERVISE", 0x323D: "PARENTHESIZED IDEOGRAPH ENTERPRISE", 0x323E: "PARENTHESIZED IDEOGRAPH RESOURCE", 0x323F: "PARENTHESIZED IDEOGRAPH ALLIANCE", 0x3240: "PARENTHESIZED IDEOGRAPH FESTIVAL", 0x3241: "PARENTHESIZED IDEOGRAPH REST", 0x3242: "PARENTHESIZED IDEOGRAPH SELF", 0x3243: "PARENTHESIZED IDEOGRAPH REACH", 0x3250: "PARTNERSHIP SIGN", 0x3251: "CIRCLED NUMBER TWENTY ONE", 0x3252: "CIRCLED NUMBER TWENTY TWO", 0x3253: "CIRCLED NUMBER TWENTY THREE", 0x3254: "CIRCLED NUMBER TWENTY FOUR", 0x3255: "CIRCLED NUMBER TWENTY FIVE", 0x3256: "CIRCLED NUMBER TWENTY SIX", 0x3257: "CIRCLED NUMBER TWENTY SEVEN", 0x3258: "CIRCLED NUMBER TWENTY EIGHT", 0x3259: "CIRCLED NUMBER TWENTY NINE", 0x325A: "CIRCLED NUMBER THIRTY", 0x325B: "CIRCLED NUMBER THIRTY ONE", 0x325C: "CIRCLED NUMBER THIRTY TWO", 0x325D: "CIRCLED NUMBER THIRTY THREE", 0x325E: "CIRCLED NUMBER THIRTY FOUR", 0x325F: "CIRCLED NUMBER THIRTY FIVE", 0x3260: "CIRCLED HANGUL KIYEOK", 0x3261: "CIRCLED HANGUL NIEUN", 0x3262: "CIRCLED HANGUL TIKEUT", 0x3263: "CIRCLED HANGUL RIEUL", 0x3264: "CIRCLED HANGUL MIEUM", 0x3265: "CIRCLED HANGUL PIEUP", 0x3266: "CIRCLED HANGUL SIOS", 0x3267: "CIRCLED HANGUL IEUNG", 0x3268: "CIRCLED HANGUL CIEUC", 0x3269: "CIRCLED HANGUL CHIEUCH", 0x326A: "CIRCLED HANGUL KHIEUKH", 0x326B: "CIRCLED HANGUL THIEUTH", 0x326C: "CIRCLED HANGUL PHIEUPH", 0x326D: "CIRCLED HANGUL HIEUH", 0x326E: "CIRCLED HANGUL KIYEOK A", 0x326F: "CIRCLED HANGUL NIEUN A", 0x3270: "CIRCLED HANGUL TIKEUT A", 0x3271: "CIRCLED HANGUL RIEUL A", 0x3272: "CIRCLED HANGUL MIEUM A", 0x3273: "CIRCLED HANGUL PIEUP A", 0x3274: "CIRCLED HANGUL SIOS A", 0x3275: "CIRCLED HANGUL IEUNG A", 0x3276: "CIRCLED HANGUL CIEUC A", 0x3277: "CIRCLED HANGUL CHIEUCH A", 0x3278: "CIRCLED HANGUL KHIEUKH A", 0x3279: "CIRCLED HANGUL THIEUTH A", 0x327A: "CIRCLED HANGUL PHIEUPH A", 0x327B: "CIRCLED HANGUL HIEUH A", 0x327C: "CIRCLED KOREAN CHARACTER CHAMKO", 0x327D: "CIRCLED KOREAN CHARACTER JUEUI", 0x327E: "CIRCLED HANGUL IEUNG U", 0x327F: "KOREAN STANDARD SYMBOL", 0x3280: "CIRCLED IDEOGRAPH ONE", 0x3281: "CIRCLED IDEOGRAPH TWO", 0x3282: "CIRCLED IDEOGRAPH THREE", 0x3283: "CIRCLED IDEOGRAPH FOUR", 0x3284: "CIRCLED IDEOGRAPH FIVE", 0x3285: "CIRCLED IDEOGRAPH SIX", 0x3286: "CIRCLED IDEOGRAPH SEVEN", 0x3287: "CIRCLED IDEOGRAPH EIGHT", 0x3288: "CIRCLED IDEOGRAPH NINE", 0x3289: "CIRCLED IDEOGRAPH TEN", 0x328A: "CIRCLED IDEOGRAPH MOON", 0x328B: "CIRCLED IDEOGRAPH FIRE", 0x328C: "CIRCLED IDEOGRAPH WATER", 0x328D: "CIRCLED IDEOGRAPH WOOD", 0x328E: "CIRCLED IDEOGRAPH METAL", 0x328F: "CIRCLED IDEOGRAPH EARTH", 0x3290: "CIRCLED IDEOGRAPH SUN", 0x3291: "CIRCLED IDEOGRAPH STOCK", 0x3292: "CIRCLED IDEOGRAPH HAVE", 0x3293: "CIRCLED IDEOGRAPH SOCIETY", 0x3294: "CIRCLED IDEOGRAPH NAME", 0x3295: "CIRCLED IDEOGRAPH SPECIAL", 0x3296: "CIRCLED IDEOGRAPH FINANCIAL", 0x3297: "CIRCLED IDEOGRAPH CONGRATULATION", 0x3298: "CIRCLED IDEOGRAPH LABOR", 0x3299: "CIRCLED IDEOGRAPH SECRET", 0x329A: "CIRCLED IDEOGRAPH MALE", 0x329B: "CIRCLED IDEOGRAPH FEMALE", 0x329C: "CIRCLED IDEOGRAPH SUITABLE", 0x329D: "CIRCLED IDEOGRAPH EXCELLENT", 0x329E: "CIRCLED IDEOGRAPH PRINT", 0x329F: "CIRCLED IDEOGRAPH ATTENTION", 0x32A0: "CIRCLED IDEOGRAPH ITEM", 0x32A1: "CIRCLED IDEOGRAPH REST", 0x32A2: "CIRCLED IDEOGRAPH COPY", 0x32A3: "CIRCLED IDEOGRAPH CORRECT", 0x32A4: "CIRCLED IDEOGRAPH HIGH", 0x32A5: "CIRCLED IDEOGRAPH CENTRE", 0x32A6: "CIRCLED IDEOGRAPH LOW", 0x32A7: "CIRCLED IDEOGRAPH LEFT", 0x32A8: "CIRCLED IDEOGRAPH RIGHT", 0x32A9: "CIRCLED IDEOGRAPH MEDICINE", 0x32AA: "CIRCLED IDEOGRAPH RELIGION", 0x32AB: "CIRCLED IDEOGRAPH STUDY", 0x32AC: "CIRCLED IDEOGRAPH SUPERVISE", 0x32AD: "CIRCLED IDEOGRAPH ENTERPRISE", 0x32AE: "CIRCLED IDEOGRAPH RESOURCE", 0x32AF: "CIRCLED IDEOGRAPH ALLIANCE", 0x32B0: "CIRCLED IDEOGRAPH NIGHT", 0x32B1: "CIRCLED NUMBER THIRTY SIX", 0x32B2: "CIRCLED NUMBER THIRTY SEVEN", 0x32B3: "CIRCLED NUMBER THIRTY EIGHT", 0x32B4: "CIRCLED NUMBER THIRTY NINE", 0x32B5: "CIRCLED NUMBER FORTY", 0x32B6: "CIRCLED NUMBER FORTY ONE", 0x32B7: "CIRCLED NUMBER FORTY TWO", 0x32B8: "CIRCLED NUMBER FORTY THREE", 0x32B9: "CIRCLED NUMBER FORTY FOUR", 0x32BA: "CIRCLED NUMBER FORTY FIVE", 0x32BB: "CIRCLED NUMBER FORTY SIX", 0x32BC: "CIRCLED NUMBER FORTY SEVEN", 0x32BD: "CIRCLED NUMBER FORTY EIGHT", 0x32BE: "CIRCLED NUMBER FORTY NINE", 0x32BF: "CIRCLED NUMBER FIFTY", 0x32C0: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY", 0x32C1: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY", 0x32C2: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH", 0x32C3: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL", 0x32C4: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY", 0x32C5: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE", 0x32C6: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY", 0x32C7: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST", 0x32C8: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER", 0x32C9: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER", 0x32CA: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER", 0x32CB: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER", 0x32CC: "SQUARE HG", 0x32CD: "SQUARE ERG", 0x32CE: "SQUARE EV", 0x32CF: "LIMITED LIABILITY SIGN", 0x32D0: "CIRCLED KATAKANA A", 0x32D1: "CIRCLED KATAKANA I", 0x32D2: "CIRCLED KATAKANA U", 0x32D3: "CIRCLED KATAKANA E", 0x32D4: "CIRCLED KATAKANA O", 0x32D5: "CIRCLED KATAKANA KA", 0x32D6: "CIRCLED KATAKANA KI", 0x32D7: "CIRCLED KATAKANA KU", 0x32D8: "CIRCLED KATAKANA KE", 0x32D9: "CIRCLED KATAKANA KO", 0x32DA: "CIRCLED KATAKANA SA", 0x32DB: "CIRCLED KATAKANA SI", 0x32DC: "CIRCLED KATAKANA SU", 0x32DD: "CIRCLED KATAKANA SE", 0x32DE: "CIRCLED KATAKANA SO", 0x32DF: "CIRCLED KATAKANA TA", 0x32E0: "CIRCLED KATAKANA TI", 0x32E1: "CIRCLED KATAKANA TU", 0x32E2: "CIRCLED KATAKANA TE", 0x32E3: "CIRCLED KATAKANA TO", 0x32E4: "CIRCLED KATAKANA NA", 0x32E5: "CIRCLED KATAKANA NI", 0x32E6: "CIRCLED KATAKANA NU", 0x32E7: "CIRCLED KATAKANA NE", 0x32E8: "CIRCLED KATAKANA NO", 0x32E9: "CIRCLED KATAKANA HA", 0x32EA: "CIRCLED KATAKANA HI", 0x32EB: "CIRCLED KATAKANA HU", 0x32EC: "CIRCLED KATAKANA HE", 0x32ED: "CIRCLED KATAKANA HO", 0x32EE: "CIRCLED KATAKANA MA", 0x32EF: "CIRCLED KATAKANA MI", 0x32F0: "CIRCLED KATAKANA MU", 0x32F1: "CIRCLED KATAKANA ME", 0x32F2: "CIRCLED KATAKANA MO", 0x32F3: "CIRCLED KATAKANA YA", 0x32F4: "CIRCLED KATAKANA YU", 0x32F5: "CIRCLED KATAKANA YO", 0x32F6: "CIRCLED KATAKANA RA", 0x32F7: "CIRCLED KATAKANA RI", 0x32F8: "CIRCLED KATAKANA RU", 0x32F9: "CIRCLED KATAKANA RE", 0x32FA: "CIRCLED KATAKANA RO", 0x32FB: "CIRCLED KATAKANA WA", 0x32FC: "CIRCLED KATAKANA WI", 0x32FD: "CIRCLED KATAKANA WE", 0x32FE: "CIRCLED KATAKANA WO", 0x3300: "SQUARE APAATO", 0x3301: "SQUARE ARUHUA", 0x3302: "SQUARE ANPEA", 0x3303: "SQUARE AARU", 0x3304: "SQUARE ININGU", 0x3305: "SQUARE INTI", 0x3306: "SQUARE UON", 0x3307: "SQUARE ESUKUUDO", 0x3308: "SQUARE EEKAA", 0x3309: "SQUARE ONSU", 0x330A: "SQUARE OOMU", 0x330B: "SQUARE KAIRI", 0x330C: "SQUARE KARATTO", 0x330D: "SQUARE KARORII", 0x330E: "SQUARE GARON", 0x330F: "SQUARE GANMA", 0x3310: "SQUARE GIGA", 0x3311: "SQUARE GINII", 0x3312: "SQUARE KYURII", 0x3313: "SQUARE GIRUDAA", 0x3314: "SQUARE KIRO", 0x3315: "SQUARE KIROGURAMU", 0x3316: "SQUARE KIROMEETORU", 0x3317: "SQUARE KIROWATTO", 0x3318: "SQUARE GURAMU", 0x3319: "SQUARE GURAMUTON", 0x331A: "SQUARE KURUZEIRO", 0x331B: "SQUARE KUROONE", 0x331C: "SQUARE KEESU", 0x331D: "SQUARE KORUNA", 0x331E: "SQUARE KOOPO", 0x331F: "SQUARE SAIKURU", 0x3320: "SQUARE SANTIIMU", 0x3321: "SQUARE SIRINGU", 0x3322: "SQUARE SENTI", 0x3323: "SQUARE SENTO", 0x3324: "SQUARE DAASU", 0x3325: "SQUARE DESI", 0x3326: "SQUARE DORU", 0x3327: "SQUARE TON", 0x3328: "SQUARE NANO", 0x3329: "SQUARE NOTTO", 0x332A: "SQUARE HAITU", 0x332B: "SQUARE PAASENTO", 0x332C: "SQUARE PAATU", 0x332D: "SQUARE BAARERU", 0x332E: "SQUARE PIASUTORU", 0x332F: "SQUARE PIKURU", 0x3330: "SQUARE PIKO", 0x3331: "SQUARE BIRU", 0x3332: "SQUARE HUARADDO", 0x3333: "SQUARE HUIITO", 0x3334: "SQUARE BUSSYERU", 0x3335: "SQUARE HURAN", 0x3336: "SQUARE HEKUTAARU", 0x3337: "SQUARE PESO", 0x3338: "SQUARE PENIHI", 0x3339: "SQUARE HERUTU", 0x333A: "SQUARE PENSU", 0x333B: "SQUARE PEEZI", 0x333C: "SQUARE BEETA", 0x333D: "SQUARE POINTO", 0x333E: "SQUARE BORUTO", 0x333F: "SQUARE HON", 0x3340: "SQUARE PONDO", 0x3341: "SQUARE HOORU", 0x3342: "SQUARE HOON", 0x3343: "SQUARE MAIKURO", 0x3344: "SQUARE MAIRU", 0x3345: "SQUARE MAHHA", 0x3346: "SQUARE MARUKU", 0x3347: "SQUARE MANSYON", 0x3348: "SQUARE MIKURON", 0x3349: "SQUARE MIRI", 0x334A: "SQUARE MIRIBAARU", 0x334B: "SQUARE MEGA", 0x334C: "SQUARE MEGATON", 0x334D: "SQUARE MEETORU", 0x334E: "SQUARE YAADO", 0x334F: "SQUARE YAARU", 0x3350: "SQUARE YUAN", 0x3351: "SQUARE RITTORU", 0x3352: "SQUARE RIRA", 0x3353: "SQUARE RUPII", 0x3354: "SQUARE RUUBURU", 0x3355: "SQUARE REMU", 0x3356: "SQUARE RENTOGEN", 0x3357: "SQUARE WATTO", 0x3358: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO", 0x3359: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE", 0x335A: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO", 0x335B: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE", 0x335C: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR", 0x335D: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE", 0x335E: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX", 0x335F: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN", 0x3360: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT", 0x3361: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE", 0x3362: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN", 0x3363: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN", 0x3364: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE", 0x3365: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN", 0x3366: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN", 0x3367: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN", 0x3368: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN", 0x3369: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN", 0x336A: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN", 0x336B: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN", 0x336C: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY", 0x336D: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE", 0x336E: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO", 0x336F: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE", 0x3370: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR", 0x3371: "SQUARE HPA", 0x3372: "SQUARE DA", 0x3373: "SQUARE AU", 0x3374: "SQUARE BAR", 0x3375: "SQUARE OV", 0x3376: "SQUARE PC", 0x3377: "SQUARE DM", 0x3378: "SQUARE DM SQUARED", 0x3379: "SQUARE DM CUBED", 0x337A: "SQUARE IU", 0x337B: "SQUARE ERA NAME HEISEI", 0x337C: "SQUARE ERA NAME SYOUWA", 0x337D: "SQUARE ERA NAME TAISYOU", 0x337E: "SQUARE ERA NAME MEIZI", 0x337F: "SQUARE CORPORATION", 0x3380: "SQUARE PA AMPS", 0x3381: "SQUARE NA", 0x3382: "SQUARE MU A", 0x3383: "SQUARE MA", 0x3384: "SQUARE KA", 0x3385: "SQUARE KB", 0x3386: "SQUARE MB", 0x3387: "SQUARE GB", 0x3388: "SQUARE CAL", 0x3389: "SQUARE KCAL", 0x338A: "SQUARE PF", 0x338B: "SQUARE NF", 0x338C: "SQUARE MU F", 0x338D: "SQUARE MU G", 0x338E: "SQUARE MG", 0x338F: "SQUARE KG", 0x3390: "SQUARE HZ", 0x3391: "SQUARE KHZ", 0x3392: "SQUARE MHZ", 0x3393: "SQUARE GHZ", 0x3394: "SQUARE THZ", 0x3395: "SQUARE MU L", 0x3396: "SQUARE ML", 0x3397: "SQUARE DL", 0x3398: "SQUARE KL", 0x3399: "SQUARE FM", 0x339A: "SQUARE NM", 0x339B: "SQUARE MU M", 0x339C: "SQUARE MM", 0x339D: "SQUARE CM", 0x339E: "SQUARE KM", 0x339F: "SQUARE MM SQUARED", 0x33A0: "SQUARE CM SQUARED", 0x33A1: "SQUARE M SQUARED", 0x33A2: "SQUARE KM SQUARED", 0x33A3: "SQUARE MM CUBED", 0x33A4: "SQUARE CM CUBED", 0x33A5: "SQUARE M CUBED", 0x33A6: "SQUARE KM CUBED", 0x33A7: "SQUARE M OVER S", 0x33A8: "SQUARE M OVER S SQUARED", 0x33A9: "SQUARE PA", 0x33AA: "SQUARE KPA", 0x33AB: "SQUARE MPA", 0x33AC: "SQUARE GPA", 0x33AD: "SQUARE RAD", 0x33AE: "SQUARE RAD OVER S", 0x33AF: "SQUARE RAD OVER S SQUARED", 0x33B0: "SQUARE PS", 0x33B1: "SQUARE NS", 0x33B2: "SQUARE MU S", 0x33B3: "SQUARE MS", 0x33B4: "SQUARE PV", 0x33B5: "SQUARE NV", 0x33B6: "SQUARE MU V", 0x33B7: "SQUARE MV", 0x33B8: "SQUARE KV", 0x33B9: "SQUARE MV MEGA", 0x33BA: "SQUARE PW", 0x33BB: "SQUARE NW", 0x33BC: "SQUARE MU W", 0x33BD: "SQUARE MW", 0x33BE: "SQUARE KW", 0x33BF: "SQUARE MW MEGA", 0x33C0: "SQUARE K OHM", 0x33C1: "SQUARE M OHM", 0x33C2: "SQUARE AM", 0x33C3: "SQUARE BQ", 0x33C4: "SQUARE CC", 0x33C5: "SQUARE CD", 0x33C6: "SQUARE C OVER KG", 0x33C7: "SQUARE CO", 0x33C8: "SQUARE DB", 0x33C9: "SQUARE GY", 0x33CA: "SQUARE HA", 0x33CB: "SQUARE HP", 0x33CC: "SQUARE IN", 0x33CD: "SQUARE KK", 0x33CE: "SQUARE KM CAPITAL", 0x33CF: "SQUARE KT", 0x33D0: "SQUARE LM", 0x33D1: "SQUARE LN", 0x33D2: "SQUARE LOG", 0x33D3: "SQUARE LX", 0x33D4: "SQUARE MB SMALL", 0x33D5: "SQUARE MIL", 0x33D6: "SQUARE MOL", 0x33D7: "SQUARE PH", 0x33D8: "SQUARE PM", 0x33D9: "SQUARE PPM", 0x33DA: "SQUARE PR", 0x33DB: "SQUARE SR", 0x33DC: "SQUARE SV", 0x33DD: "SQUARE WB", 0x33DE: "SQUARE V OVER M", 0x33DF: "SQUARE A OVER M", 0x33E0: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE", 0x33E1: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO", 0x33E2: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE", 0x33E3: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR", 0x33E4: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE", 0x33E5: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX", 0x33E6: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN", 0x33E7: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT", 0x33E8: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE", 0x33E9: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN", 0x33EA: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN", 0x33EB: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE", 0x33EC: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN", 0x33ED: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN", 0x33EE: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN", 0x33EF: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN", 0x33F0: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN", 0x33F1: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN", 0x33F2: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN", 0x33F3: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY", 0x33F4: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE", 0x33F5: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO", 0x33F6: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE", 0x33F7: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR", 0x33F8: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE", 0x33F9: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX", 0x33FA: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN", 0x33FB: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT", 0x33FC: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE", 0x33FD: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY", 0x33FE: "IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE", 0x33FF: "SQUARE GAL", 0x4DC0: "HEXAGRAM FOR THE CREATIVE HEAVEN", 0x4DC1: "HEXAGRAM FOR THE RECEPTIVE EARTH", 0x4DC2: "HEXAGRAM FOR DIFFICULTY AT THE BEGINNING", 0x4DC3: "HEXAGRAM FOR YOUTHFUL FOLLY", 0x4DC4: "HEXAGRAM FOR WAITING", 0x4DC5: "HEXAGRAM FOR CONFLICT", 0x4DC6: "HEXAGRAM FOR THE ARMY", 0x4DC7: "HEXAGRAM FOR HOLDING TOGETHER", 0x4DC8: "HEXAGRAM FOR SMALL TAMING", 0x4DC9: "HEXAGRAM FOR TREADING", 0x4DCA: "HEXAGRAM FOR PEACE", 0x4DCB: "HEXAGRAM FOR STANDSTILL", 0x4DCC: "HEXAGRAM FOR FELLOWSHIP", 0x4DCD: "HEXAGRAM FOR GREAT POSSESSION", 0x4DCE: "HEXAGRAM FOR MODESTY", 0x4DCF: "HEXAGRAM FOR ENTHUSIASM", 0x4DD0: "HEXAGRAM FOR FOLLOWING", 0x4DD1: "HEXAGRAM FOR WORK ON THE DECAYED", 0x4DD2: "HEXAGRAM FOR APPROACH", 0x4DD3: "HEXAGRAM FOR CONTEMPLATION", 0x4DD4: "HEXAGRAM FOR BITING THROUGH", 0x4DD5: "HEXAGRAM FOR GRACE", 0x4DD6: "HEXAGRAM FOR SPLITTING APART", 0x4DD7: "HEXAGRAM FOR RETURN", 0x4DD8: "HEXAGRAM FOR INNOCENCE", 0x4DD9: "HEXAGRAM FOR GREAT TAMING", 0x4DDA: "HEXAGRAM FOR MOUTH CORNERS", 0x4DDB: "HEXAGRAM FOR GREAT PREPONDERANCE", 0x4DDC: "HEXAGRAM FOR THE ABYSMAL WATER", 0x4DDD: "HEXAGRAM FOR THE CLINGING FIRE", 0x4DDE: "HEXAGRAM FOR INFLUENCE", 0x4DDF: "HEXAGRAM FOR DURATION", 0x4DE0: "HEXAGRAM FOR RETREAT", 0x4DE1: "HEXAGRAM FOR GREAT POWER", 0x4DE2: "HEXAGRAM FOR PROGRESS", 0x4DE3: "HEXAGRAM FOR DARKENING OF THE LIGHT", 0x4DE4: "HEXAGRAM FOR THE FAMILY", 0x4DE5: "HEXAGRAM FOR OPPOSITION", 0x4DE6: "HEXAGRAM FOR OBSTRUCTION", 0x4DE7: "HEXAGRAM FOR DELIVERANCE", 0x4DE8: "HEXAGRAM FOR DECREASE", 0x4DE9: "HEXAGRAM FOR INCREASE", 0x4DEA: "HEXAGRAM FOR BREAKTHROUGH", 0x4DEB: "HEXAGRAM FOR COMING TO MEET", 0x4DEC: "HEXAGRAM FOR GATHERING TOGETHER", 0x4DED: "HEXAGRAM FOR PUSHING UPWARD", 0x4DEE: "HEXAGRAM FOR OPPRESSION", 0x4DEF: "HEXAGRAM FOR THE WELL", 0x4DF0: "HEXAGRAM FOR REVOLUTION", 0x4DF1: "HEXAGRAM FOR THE CAULDRON", 0x4DF2: "HEXAGRAM FOR THE AROUSING THUNDER", 0x4DF3: "HEXAGRAM FOR THE KEEPING STILL MOUNTAIN", 0x4DF4: "HEXAGRAM FOR DEVELOPMENT", 0x4DF5: "HEXAGRAM FOR THE MARRYING MAIDEN", 0x4DF6: "HEXAGRAM FOR ABUNDANCE", 0x4DF7: "HEXAGRAM FOR THE WANDERER", 0x4DF8: "HEXAGRAM FOR THE GENTLE WIND", 0x4DF9: "HEXAGRAM FOR THE JOYOUS LAKE", 0x4DFA: "HEXAGRAM FOR DISPERSION", 0x4DFB: "HEXAGRAM FOR LIMITATION", 0x4DFC: "HEXAGRAM FOR INNER TRUTH", 0x4DFD: "HEXAGRAM FOR SMALL PREPONDERANCE", 0x4DFE: "HEXAGRAM FOR AFTER COMPLETION", 0x4DFF: "HEXAGRAM FOR BEFORE COMPLETION", 0xA000: "YI SYLLABLE IT", 0xA001: "YI SYLLABLE IX", 0xA002: "YI SYLLABLE I", 0xA003: "YI SYLLABLE IP", 0xA004: "YI SYLLABLE IET", 0xA005: "YI SYLLABLE IEX", 0xA006: "YI SYLLABLE IE", 0xA007: "YI SYLLABLE IEP", 0xA008: "YI SYLLABLE AT", 0xA009: "YI SYLLABLE AX", 0xA00A: "YI SYLLABLE A", 0xA00B: "YI SYLLABLE AP", 0xA00C: "YI SYLLABLE UOX", 0xA00D: "YI SYLLABLE UO", 0xA00E: "YI SYLLABLE UOP", 0xA00F: "YI SYLLABLE OT", 0xA010: "YI SYLLABLE OX", 0xA011: "YI SYLLABLE O", 0xA012: "YI SYLLABLE OP", 0xA013: "YI SYLLABLE EX", 0xA014: "YI SYLLABLE E", 0xA015: "YI SYLLABLE WU", 0xA016: "YI SYLLABLE BIT", 0xA017: "YI SYLLABLE BIX", 0xA018: "YI SYLLABLE BI", 0xA019: "YI SYLLABLE BIP", 0xA01A: "YI SYLLABLE BIET", 0xA01B: "YI SYLLABLE BIEX", 0xA01C: "YI SYLLABLE BIE", 0xA01D: "YI SYLLABLE BIEP", 0xA01E: "YI SYLLABLE BAT", 0xA01F: "YI SYLLABLE BAX", 0xA020: "YI SYLLABLE BA", 0xA021: "YI SYLLABLE BAP", 0xA022: "YI SYLLABLE BUOX", 0xA023: "YI SYLLABLE BUO", 0xA024: "YI SYLLABLE BUOP", 0xA025: "YI SYLLABLE BOT", 0xA026: "YI SYLLABLE BOX", 0xA027: "YI SYLLABLE BO", 0xA028: "YI SYLLABLE BOP", 0xA029: "YI SYLLABLE BEX", 0xA02A: "YI SYLLABLE BE", 0xA02B: "YI SYLLABLE BEP", 0xA02C: "YI SYLLABLE BUT", 0xA02D: "YI SYLLABLE BUX", 0xA02E: "YI SYLLABLE BU", 0xA02F: "YI SYLLABLE BUP", 0xA030: "YI SYLLABLE BURX", 0xA031: "YI SYLLABLE BUR", 0xA032: "YI SYLLABLE BYT", 0xA033: "YI SYLLABLE BYX", 0xA034: "YI SYLLABLE BY", 0xA035: "YI SYLLABLE BYP", 0xA036: "YI SYLLABLE BYRX", 0xA037: "YI SYLLABLE BYR", 0xA038: "YI SYLLABLE PIT", 0xA039: "YI SYLLABLE PIX", 0xA03A: "YI SYLLABLE PI", 0xA03B: "YI SYLLABLE PIP", 0xA03C: "YI SYLLABLE PIEX", 0xA03D: "YI SYLLABLE PIE", 0xA03E: "YI SYLLABLE PIEP", 0xA03F: "YI SYLLABLE PAT", 0xA040: "YI SYLLABLE PAX", 0xA041: "YI SYLLABLE PA", 0xA042: "YI SYLLABLE PAP", 0xA043: "YI SYLLABLE PUOX", 0xA044: "YI SYLLABLE PUO", 0xA045: "YI SYLLABLE PUOP", 0xA046: "YI SYLLABLE POT", 0xA047: "YI SYLLABLE POX", 0xA048: "YI SYLLABLE PO", 0xA049: "YI SYLLABLE POP", 0xA04A: "YI SYLLABLE PUT", 0xA04B: "YI SYLLABLE PUX", 0xA04C: "YI SYLLABLE PU", 0xA04D: "YI SYLLABLE PUP", 0xA04E: "YI SYLLABLE PURX", 0xA04F: "YI SYLLABLE PUR", 0xA050: "YI SYLLABLE PYT", 0xA051: "YI SYLLABLE PYX", 0xA052: "YI SYLLABLE PY", 0xA053: "YI SYLLABLE PYP", 0xA054: "YI SYLLABLE PYRX", 0xA055: "YI SYLLABLE PYR", 0xA056: "YI SYLLABLE BBIT", 0xA057: "YI SYLLABLE BBIX", 0xA058: "YI SYLLABLE BBI", 0xA059: "YI SYLLABLE BBIP", 0xA05A: "YI SYLLABLE BBIET", 0xA05B: "YI SYLLABLE BBIEX", 0xA05C: "YI SYLLABLE BBIE", 0xA05D: "YI SYLLABLE BBIEP", 0xA05E: "YI SYLLABLE BBAT", 0xA05F: "YI SYLLABLE BBAX", 0xA060: "YI SYLLABLE BBA", 0xA061: "YI SYLLABLE BBAP", 0xA062: "YI SYLLABLE BBUOX", 0xA063: "YI SYLLABLE BBUO", 0xA064: "YI SYLLABLE BBUOP", 0xA065: "YI SYLLABLE BBOT", 0xA066: "YI SYLLABLE BBOX", 0xA067: "YI SYLLABLE BBO", 0xA068: "YI SYLLABLE BBOP", 0xA069: "YI SYLLABLE BBEX", 0xA06A: "YI SYLLABLE BBE", 0xA06B: "YI SYLLABLE BBEP", 0xA06C: "YI SYLLABLE BBUT", 0xA06D: "YI SYLLABLE BBUX", 0xA06E: "YI SYLLABLE BBU", 0xA06F: "YI SYLLABLE BBUP", 0xA070: "YI SYLLABLE BBURX", 0xA071: "YI SYLLABLE BBUR", 0xA072: "YI SYLLABLE BBYT", 0xA073: "YI SYLLABLE BBYX", 0xA074: "YI SYLLABLE BBY", 0xA075: "YI SYLLABLE BBYP", 0xA076: "YI SYLLABLE NBIT", 0xA077: "YI SYLLABLE NBIX", 0xA078: "YI SYLLABLE NBI", 0xA079: "YI SYLLABLE NBIP", 0xA07A: "YI SYLLABLE NBIEX", 0xA07B: "YI SYLLABLE NBIE", 0xA07C: "YI SYLLABLE NBIEP", 0xA07D: "YI SYLLABLE NBAT", 0xA07E: "YI SYLLABLE NBAX", 0xA07F: "YI SYLLABLE NBA", 0xA080: "YI SYLLABLE NBAP", 0xA081: "YI SYLLABLE NBOT", 0xA082: "YI SYLLABLE NBOX", 0xA083: "YI SYLLABLE NBO", 0xA084: "YI SYLLABLE NBOP", 0xA085: "YI SYLLABLE NBUT", 0xA086: "YI SYLLABLE NBUX", 0xA087: "YI SYLLABLE NBU", 0xA088: "YI SYLLABLE NBUP", 0xA089: "YI SYLLABLE NBURX", 0xA08A: "YI SYLLABLE NBUR", 0xA08B: "YI SYLLABLE NBYT", 0xA08C: "YI SYLLABLE NBYX", 0xA08D: "YI SYLLABLE NBY", 0xA08E: "YI SYLLABLE NBYP", 0xA08F: "YI SYLLABLE NBYRX", 0xA090: "YI SYLLABLE NBYR", 0xA091: "YI SYLLABLE HMIT", 0xA092: "YI SYLLABLE HMIX", 0xA093: "YI SYLLABLE HMI", 0xA094: "YI SYLLABLE HMIP", 0xA095: "YI SYLLABLE HMIEX", 0xA096: "YI SYLLABLE HMIE", 0xA097: "YI SYLLABLE HMIEP", 0xA098: "YI SYLLABLE HMAT", 0xA099: "YI SYLLABLE HMAX", 0xA09A: "YI SYLLABLE HMA", 0xA09B: "YI SYLLABLE HMAP", 0xA09C: "YI SYLLABLE HMUOX", 0xA09D: "YI SYLLABLE HMUO", 0xA09E: "YI SYLLABLE HMUOP", 0xA09F: "YI SYLLABLE HMOT", 0xA0A0: "YI SYLLABLE HMOX", 0xA0A1: "YI SYLLABLE HMO", 0xA0A2: "YI SYLLABLE HMOP", 0xA0A3: "YI SYLLABLE HMUT", 0xA0A4: "YI SYLLABLE HMUX", 0xA0A5: "YI SYLLABLE HMU", 0xA0A6: "YI SYLLABLE HMUP", 0xA0A7: "YI SYLLABLE HMURX", 0xA0A8: "YI SYLLABLE HMUR", 0xA0A9: "YI SYLLABLE HMYX", 0xA0AA: "YI SYLLABLE HMY", 0xA0AB: "YI SYLLABLE HMYP", 0xA0AC: "YI SYLLABLE HMYRX", 0xA0AD: "YI SYLLABLE HMYR", 0xA0AE: "YI SYLLABLE MIT", 0xA0AF: "YI SYLLABLE MIX", 0xA0B0: "YI SYLLABLE MI", 0xA0B1: "YI SYLLABLE MIP", 0xA0B2: "YI SYLLABLE MIEX", 0xA0B3: "YI SYLLABLE MIE", 0xA0B4: "YI SYLLABLE MIEP", 0xA0B5: "YI SYLLABLE MAT", 0xA0B6: "YI SYLLABLE MAX", 0xA0B7: "YI SYLLABLE MA", 0xA0B8: "YI SYLLABLE MAP", 0xA0B9: "YI SYLLABLE MUOT", 0xA0BA: "YI SYLLABLE MUOX", 0xA0BB: "YI SYLLABLE MUO", 0xA0BC: "YI SYLLABLE MUOP", 0xA0BD: "YI SYLLABLE MOT", 0xA0BE: "YI SYLLABLE MOX", 0xA0BF: "YI SYLLABLE MO", 0xA0C0: "YI SYLLABLE MOP", 0xA0C1: "YI SYLLABLE MEX", 0xA0C2: "YI SYLLABLE ME", 0xA0C3: "YI SYLLABLE MUT", 0xA0C4: "YI SYLLABLE MUX", 0xA0C5: "YI SYLLABLE MU", 0xA0C6: "YI SYLLABLE MUP", 0xA0C7: "YI SYLLABLE MURX", 0xA0C8: "YI SYLLABLE MUR", 0xA0C9: "YI SYLLABLE MYT", 0xA0CA: "YI SYLLABLE MYX", 0xA0CB: "YI SYLLABLE MY", 0xA0CC: "YI SYLLABLE MYP", 0xA0CD: "YI SYLLABLE FIT", 0xA0CE: "YI SYLLABLE FIX", 0xA0CF: "YI SYLLABLE FI", 0xA0D0: "YI SYLLABLE FIP", 0xA0D1: "YI SYLLABLE FAT", 0xA0D2: "YI SYLLABLE FAX", 0xA0D3: "YI SYLLABLE FA", 0xA0D4: "YI SYLLABLE FAP", 0xA0D5: "YI SYLLABLE FOX", 0xA0D6: "YI SYLLABLE FO", 0xA0D7: "YI SYLLABLE FOP", 0xA0D8: "YI SYLLABLE FUT", 0xA0D9: "YI SYLLABLE FUX", 0xA0DA: "YI SYLLABLE FU", 0xA0DB: "YI SYLLABLE FUP", 0xA0DC: "YI SYLLABLE FURX", 0xA0DD: "YI SYLLABLE FUR", 0xA0DE: "YI SYLLABLE FYT", 0xA0DF: "YI SYLLABLE FYX", 0xA0E0: "YI SYLLABLE FY", 0xA0E1: "YI SYLLABLE FYP", 0xA0E2: "YI SYLLABLE VIT", 0xA0E3: "YI SYLLABLE VIX", 0xA0E4: "YI SYLLABLE VI", 0xA0E5: "YI SYLLABLE VIP", 0xA0E6: "YI SYLLABLE VIET", 0xA0E7: "YI SYLLABLE VIEX", 0xA0E8: "YI SYLLABLE VIE", 0xA0E9: "YI SYLLABLE VIEP", 0xA0EA: "YI SYLLABLE VAT", 0xA0EB: "YI SYLLABLE VAX", 0xA0EC: "YI SYLLABLE VA", 0xA0ED: "YI SYLLABLE VAP", 0xA0EE: "YI SYLLABLE VOT", 0xA0EF: "YI SYLLABLE VOX", 0xA0F0: "YI SYLLABLE VO", 0xA0F1: "YI SYLLABLE VOP", 0xA0F2: "YI SYLLABLE VEX", 0xA0F3: "YI SYLLABLE VEP", 0xA0F4: "YI SYLLABLE VUT", 0xA0F5: "YI SYLLABLE VUX", 0xA0F6: "YI SYLLABLE VU", 0xA0F7: "YI SYLLABLE VUP", 0xA0F8: "YI SYLLABLE VURX", 0xA0F9: "YI SYLLABLE VUR", 0xA0FA: "YI SYLLABLE VYT", 0xA0FB: "YI SYLLABLE VYX", 0xA0FC: "YI SYLLABLE VY", 0xA0FD: "YI SYLLABLE VYP", 0xA0FE: "YI SYLLABLE VYRX", 0xA0FF: "YI SYLLABLE VYR", 0xA100: "YI SYLLABLE DIT", 0xA101: "YI SYLLABLE DIX", 0xA102: "YI SYLLABLE DI", 0xA103: "YI SYLLABLE DIP", 0xA104: "YI SYLLABLE DIEX", 0xA105: "YI SYLLABLE DIE", 0xA106: "YI SYLLABLE DIEP", 0xA107: "YI SYLLABLE DAT", 0xA108: "YI SYLLABLE DAX", 0xA109: "YI SYLLABLE DA", 0xA10A: "YI SYLLABLE DAP", 0xA10B: "YI SYLLABLE DUOX", 0xA10C: "YI SYLLABLE DUO", 0xA10D: "YI SYLLABLE DOT", 0xA10E: "YI SYLLABLE DOX", 0xA10F: "YI SYLLABLE DO", 0xA110: "YI SYLLABLE DOP", 0xA111: "YI SYLLABLE DEX", 0xA112: "YI SYLLABLE DE", 0xA113: "YI SYLLABLE DEP", 0xA114: "YI SYLLABLE DUT", 0xA115: "YI SYLLABLE DUX", 0xA116: "YI SYLLABLE DU", 0xA117: "YI SYLLABLE DUP", 0xA118: "YI SYLLABLE DURX", 0xA119: "YI SYLLABLE DUR", 0xA11A: "YI SYLLABLE TIT", 0xA11B: "YI SYLLABLE TIX", 0xA11C: "YI SYLLABLE TI", 0xA11D: "YI SYLLABLE TIP", 0xA11E: "YI SYLLABLE TIEX", 0xA11F: "YI SYLLABLE TIE", 0xA120: "YI SYLLABLE TIEP", 0xA121: "YI SYLLABLE TAT", 0xA122: "YI SYLLABLE TAX", 0xA123: "YI SYLLABLE TA", 0xA124: "YI SYLLABLE TAP", 0xA125: "YI SYLLABLE TUOT", 0xA126: "YI SYLLABLE TUOX", 0xA127: "YI SYLLABLE TUO", 0xA128: "YI SYLLABLE TUOP", 0xA129: "YI SYLLABLE TOT", 0xA12A: "YI SYLLABLE TOX", 0xA12B: "YI SYLLABLE TO", 0xA12C: "YI SYLLABLE TOP", 0xA12D: "YI SYLLABLE TEX", 0xA12E: "YI SYLLABLE TE", 0xA12F: "YI SYLLABLE TEP", 0xA130: "YI SYLLABLE TUT", 0xA131: "YI SYLLABLE TUX", 0xA132: "YI SYLLABLE TU", 0xA133: "YI SYLLABLE TUP", 0xA134: "YI SYLLABLE TURX", 0xA135: "YI SYLLABLE TUR", 0xA136: "YI SYLLABLE DDIT", 0xA137: "YI SYLLABLE DDIX", 0xA138: "YI SYLLABLE DDI", 0xA139: "YI SYLLABLE DDIP", 0xA13A: "YI SYLLABLE DDIEX", 0xA13B: "YI SYLLABLE DDIE", 0xA13C: "YI SYLLABLE DDIEP", 0xA13D: "YI SYLLABLE DDAT", 0xA13E: "YI SYLLABLE DDAX", 0xA13F: "YI SYLLABLE DDA", 0xA140: "YI SYLLABLE DDAP", 0xA141: "YI SYLLABLE DDUOX", 0xA142: "YI SYLLABLE DDUO", 0xA143: "YI SYLLABLE DDUOP", 0xA144: "YI SYLLABLE DDOT", 0xA145: "YI SYLLABLE DDOX", 0xA146: "YI SYLLABLE DDO", 0xA147: "YI SYLLABLE DDOP", 0xA148: "YI SYLLABLE DDEX", 0xA149: "YI SYLLABLE DDE", 0xA14A: "YI SYLLABLE DDEP", 0xA14B: "YI SYLLABLE DDUT", 0xA14C: "YI SYLLABLE DDUX", 0xA14D: "YI SYLLABLE DDU", 0xA14E: "YI SYLLABLE DDUP", 0xA14F: "YI SYLLABLE DDURX", 0xA150: "YI SYLLABLE DDUR", 0xA151: "YI SYLLABLE NDIT", 0xA152: "YI SYLLABLE NDIX", 0xA153: "YI SYLLABLE NDI", 0xA154: "YI SYLLABLE NDIP", 0xA155: "YI SYLLABLE NDIEX", 0xA156: "YI SYLLABLE NDIE", 0xA157: "YI SYLLABLE NDAT", 0xA158: "YI SYLLABLE NDAX", 0xA159: "YI SYLLABLE NDA", 0xA15A: "YI SYLLABLE NDAP", 0xA15B: "YI SYLLABLE NDOT", 0xA15C: "YI SYLLABLE NDOX", 0xA15D: "YI SYLLABLE NDO", 0xA15E: "YI SYLLABLE NDOP", 0xA15F: "YI SYLLABLE NDEX", 0xA160: "YI SYLLABLE NDE", 0xA161: "YI SYLLABLE NDEP", 0xA162: "YI SYLLABLE NDUT", 0xA163: "YI SYLLABLE NDUX", 0xA164: "YI SYLLABLE NDU", 0xA165: "YI SYLLABLE NDUP", 0xA166: "YI SYLLABLE NDURX", 0xA167: "YI SYLLABLE NDUR", 0xA168: "YI SYLLABLE HNIT", 0xA169: "YI SYLLABLE HNIX", 0xA16A: "YI SYLLABLE HNI", 0xA16B: "YI SYLLABLE HNIP", 0xA16C: "YI SYLLABLE HNIET", 0xA16D: "YI SYLLABLE HNIEX", 0xA16E: "YI SYLLABLE HNIE", 0xA16F: "YI SYLLABLE HNIEP", 0xA170: "YI SYLLABLE HNAT", 0xA171: "YI SYLLABLE HNAX", 0xA172: "YI SYLLABLE HNA", 0xA173: "YI SYLLABLE HNAP", 0xA174: "YI SYLLABLE HNUOX", 0xA175: "YI SYLLABLE HNUO", 0xA176: "YI SYLLABLE HNOT", 0xA177: "YI SYLLABLE HNOX", 0xA178: "YI SYLLABLE HNOP", 0xA179: "YI SYLLABLE HNEX", 0xA17A: "YI SYLLABLE HNE", 0xA17B: "YI SYLLABLE HNEP", 0xA17C: "YI SYLLABLE HNUT", 0xA17D: "YI SYLLABLE NIT", 0xA17E: "YI SYLLABLE NIX", 0xA17F: "YI SYLLABLE NI", 0xA180: "YI SYLLABLE NIP", 0xA181: "YI SYLLABLE NIEX", 0xA182: "YI SYLLABLE NIE", 0xA183: "YI SYLLABLE NIEP", 0xA184: "YI SYLLABLE NAX", 0xA185: "YI SYLLABLE NA", 0xA186: "YI SYLLABLE NAP", 0xA187: "YI SYLLABLE NUOX", 0xA188: "YI SYLLABLE NUO", 0xA189: "YI SYLLABLE NUOP", 0xA18A: "YI SYLLABLE NOT", 0xA18B: "YI SYLLABLE NOX", 0xA18C: "YI SYLLABLE NO", 0xA18D: "YI SYLLABLE NOP", 0xA18E: "YI SYLLABLE NEX", 0xA18F: "YI SYLLABLE NE", 0xA190: "YI SYLLABLE NEP", 0xA191: "YI SYLLABLE NUT", 0xA192: "YI SYLLABLE NUX", 0xA193: "YI SYLLABLE NU", 0xA194: "YI SYLLABLE NUP", 0xA195: "YI SYLLABLE NURX", 0xA196: "YI SYLLABLE NUR", 0xA197: "YI SYLLABLE HLIT", 0xA198: "YI SYLLABLE HLIX", 0xA199: "YI SYLLABLE HLI", 0xA19A: "YI SYLLABLE HLIP", 0xA19B: "YI SYLLABLE HLIEX", 0xA19C: "YI SYLLABLE HLIE", 0xA19D: "YI SYLLABLE HLIEP", 0xA19E: "YI SYLLABLE HLAT", 0xA19F: "YI SYLLABLE HLAX", 0xA1A0: "YI SYLLABLE HLA", 0xA1A1: "YI SYLLABLE HLAP", 0xA1A2: "YI SYLLABLE HLUOX", 0xA1A3: "YI SYLLABLE HLUO", 0xA1A4: "YI SYLLABLE HLUOP", 0xA1A5: "YI SYLLABLE HLOX", 0xA1A6: "YI SYLLABLE HLO", 0xA1A7: "YI SYLLABLE HLOP", 0xA1A8: "YI SYLLABLE HLEX", 0xA1A9: "YI SYLLABLE HLE", 0xA1AA: "YI SYLLABLE HLEP", 0xA1AB: "YI SYLLABLE HLUT", 0xA1AC: "YI SYLLABLE HLUX", 0xA1AD: "YI SYLLABLE HLU", 0xA1AE: "YI SYLLABLE HLUP", 0xA1AF: "YI SYLLABLE HLURX", 0xA1B0: "YI SYLLABLE HLUR", 0xA1B1: "YI SYLLABLE HLYT", 0xA1B2: "YI SYLLABLE HLYX", 0xA1B3: "YI SYLLABLE HLY", 0xA1B4: "YI SYLLABLE HLYP", 0xA1B5: "YI SYLLABLE HLYRX", 0xA1B6: "YI SYLLABLE HLYR", 0xA1B7: "YI SYLLABLE LIT", 0xA1B8: "YI SYLLABLE LIX", 0xA1B9: "YI SYLLABLE LI", 0xA1BA: "YI SYLLABLE LIP", 0xA1BB: "YI SYLLABLE LIET", 0xA1BC: "YI SYLLABLE LIEX", 0xA1BD: "YI SYLLABLE LIE", 0xA1BE: "YI SYLLABLE LIEP", 0xA1BF: "YI SYLLABLE LAT", 0xA1C0: "YI SYLLABLE LAX", 0xA1C1: "YI SYLLABLE LA", 0xA1C2: "YI SYLLABLE LAP", 0xA1C3: "YI SYLLABLE LUOT", 0xA1C4: "YI SYLLABLE LUOX", 0xA1C5: "YI SYLLABLE LUO", 0xA1C6: "YI SYLLABLE LUOP", 0xA1C7: "YI SYLLABLE LOT", 0xA1C8: "YI SYLLABLE LOX", 0xA1C9: "YI SYLLABLE LO", 0xA1CA: "YI SYLLABLE LOP", 0xA1CB: "YI SYLLABLE LEX", 0xA1CC: "YI SYLLABLE LE", 0xA1CD: "YI SYLLABLE LEP", 0xA1CE: "YI SYLLABLE LUT", 0xA1CF: "YI SYLLABLE LUX", 0xA1D0: "YI SYLLABLE LU", 0xA1D1: "YI SYLLABLE LUP", 0xA1D2: "YI SYLLABLE LURX", 0xA1D3: "YI SYLLABLE LUR", 0xA1D4: "YI SYLLABLE LYT", 0xA1D5: "YI SYLLABLE LYX", 0xA1D6: "YI SYLLABLE LY", 0xA1D7: "YI SYLLABLE LYP", 0xA1D8: "YI SYLLABLE LYRX", 0xA1D9: "YI SYLLABLE LYR", 0xA1DA: "YI SYLLABLE GIT", 0xA1DB: "YI SYLLABLE GIX", 0xA1DC: "YI SYLLABLE GI", 0xA1DD: "YI SYLLABLE GIP", 0xA1DE: "YI SYLLABLE GIET", 0xA1DF: "YI SYLLABLE GIEX", 0xA1E0: "YI SYLLABLE GIE", 0xA1E1: "YI SYLLABLE GIEP", 0xA1E2: "YI SYLLABLE GAT", 0xA1E3: "YI SYLLABLE GAX", 0xA1E4: "YI SYLLABLE GA", 0xA1E5: "YI SYLLABLE GAP", 0xA1E6: "YI SYLLABLE GUOT", 0xA1E7: "YI SYLLABLE GUOX", 0xA1E8: "YI SYLLABLE GUO", 0xA1E9: "YI SYLLABLE GUOP", 0xA1EA: "YI SYLLABLE GOT", 0xA1EB: "YI SYLLABLE GOX", 0xA1EC: "YI SYLLABLE GO", 0xA1ED: "YI SYLLABLE GOP", 0xA1EE: "YI SYLLABLE GET", 0xA1EF: "YI SYLLABLE GEX", 0xA1F0: "YI SYLLABLE GE", 0xA1F1: "YI SYLLABLE GEP", 0xA1F2: "YI SYLLABLE GUT", 0xA1F3: "YI SYLLABLE GUX", 0xA1F4: "YI SYLLABLE GU", 0xA1F5: "YI SYLLABLE GUP", 0xA1F6: "YI SYLLABLE GURX", 0xA1F7: "YI SYLLABLE GUR", 0xA1F8: "YI SYLLABLE KIT", 0xA1F9: "YI SYLLABLE KIX", 0xA1FA: "YI SYLLABLE KI", 0xA1FB: "YI SYLLABLE KIP", 0xA1FC: "YI SYLLABLE KIEX", 0xA1FD: "YI SYLLABLE KIE", 0xA1FE: "YI SYLLABLE KIEP", 0xA1FF: "YI SYLLABLE KAT", 0xA200: "YI SYLLABLE KAX", 0xA201: "YI SYLLABLE KA", 0xA202: "YI SYLLABLE KAP", 0xA203: "YI SYLLABLE KUOX", 0xA204: "YI SYLLABLE KUO", 0xA205: "YI SYLLABLE KUOP", 0xA206: "YI SYLLABLE KOT", 0xA207: "YI SYLLABLE KOX", 0xA208: "YI SYLLABLE KO", 0xA209: "YI SYLLABLE KOP", 0xA20A: "YI SYLLABLE KET", 0xA20B: "YI SYLLABLE KEX", 0xA20C: "YI SYLLABLE KE", 0xA20D: "YI SYLLABLE KEP", 0xA20E: "YI SYLLABLE KUT", 0xA20F: "YI SYLLABLE KUX", 0xA210: "YI SYLLABLE KU", 0xA211: "YI SYLLABLE KUP", 0xA212: "YI SYLLABLE KURX", 0xA213: "YI SYLLABLE KUR", 0xA214: "YI SYLLABLE GGIT", 0xA215: "YI SYLLABLE GGIX", 0xA216: "YI SYLLABLE GGI", 0xA217: "YI SYLLABLE GGIEX", 0xA218: "YI SYLLABLE GGIE", 0xA219: "YI SYLLABLE GGIEP", 0xA21A: "YI SYLLABLE GGAT", 0xA21B: "YI SYLLABLE GGAX", 0xA21C: "YI SYLLABLE GGA", 0xA21D: "YI SYLLABLE GGAP", 0xA21E: "YI SYLLABLE GGUOT", 0xA21F: "YI SYLLABLE GGUOX", 0xA220: "YI SYLLABLE GGUO", 0xA221: "YI SYLLABLE GGUOP", 0xA222: "YI SYLLABLE GGOT", 0xA223: "YI SYLLABLE GGOX", 0xA224: "YI SYLLABLE GGO", 0xA225: "YI SYLLABLE GGOP", 0xA226: "YI SYLLABLE GGET", 0xA227: "YI SYLLABLE GGEX", 0xA228: "YI SYLLABLE GGE", 0xA229: "YI SYLLABLE GGEP", 0xA22A: "YI SYLLABLE GGUT", 0xA22B: "YI SYLLABLE GGUX", 0xA22C: "YI SYLLABLE GGU", 0xA22D: "YI SYLLABLE GGUP", 0xA22E: "YI SYLLABLE GGURX", 0xA22F: "YI SYLLABLE GGUR", 0xA230: "YI SYLLABLE MGIEX", 0xA231: "YI SYLLABLE MGIE", 0xA232: "YI SYLLABLE MGAT", 0xA233: "YI SYLLABLE MGAX", 0xA234: "YI SYLLABLE MGA", 0xA235: "YI SYLLABLE MGAP", 0xA236: "YI SYLLABLE MGUOX", 0xA237: "YI SYLLABLE MGUO", 0xA238: "YI SYLLABLE MGUOP", 0xA239: "YI SYLLABLE MGOT", 0xA23A: "YI SYLLABLE MGOX", 0xA23B: "YI SYLLABLE MGO", 0xA23C: "YI SYLLABLE MGOP", 0xA23D: "YI SYLLABLE MGEX", 0xA23E: "YI SYLLABLE MGE", 0xA23F: "YI SYLLABLE MGEP", 0xA240: "YI SYLLABLE MGUT", 0xA241: "YI SYLLABLE MGUX", 0xA242: "YI SYLLABLE MGU", 0xA243: "YI SYLLABLE MGUP", 0xA244: "YI SYLLABLE MGURX", 0xA245: "YI SYLLABLE MGUR", 0xA246: "YI SYLLABLE HXIT", 0xA247: "YI SYLLABLE HXIX", 0xA248: "YI SYLLABLE HXI", 0xA249: "YI SYLLABLE HXIP", 0xA24A: "YI SYLLABLE HXIET", 0xA24B: "YI SYLLABLE HXIEX", 0xA24C: "YI SYLLABLE HXIE", 0xA24D: "YI SYLLABLE HXIEP", 0xA24E: "YI SYLLABLE HXAT", 0xA24F: "YI SYLLABLE HXAX", 0xA250: "YI SYLLABLE HXA", 0xA251: "YI SYLLABLE HXAP", 0xA252: "YI SYLLABLE HXUOT", 0xA253: "YI SYLLABLE HXUOX", 0xA254: "YI SYLLABLE HXUO", 0xA255: "YI SYLLABLE HXUOP", 0xA256: "YI SYLLABLE HXOT", 0xA257: "YI SYLLABLE HXOX", 0xA258: "YI SYLLABLE HXO", 0xA259: "YI SYLLABLE HXOP", 0xA25A: "YI SYLLABLE HXEX", 0xA25B: "YI SYLLABLE HXE", 0xA25C: "YI SYLLABLE HXEP", 0xA25D: "YI SYLLABLE NGIEX", 0xA25E: "YI SYLLABLE NGIE", 0xA25F: "YI SYLLABLE NGIEP", 0xA260: "YI SYLLABLE NGAT", 0xA261: "YI SYLLABLE NGAX", 0xA262: "YI SYLLABLE NGA", 0xA263: "YI SYLLABLE NGAP", 0xA264: "YI SYLLABLE NGUOT", 0xA265: "YI SYLLABLE NGUOX", 0xA266: "YI SYLLABLE NGUO", 0xA267: "YI SYLLABLE NGOT", 0xA268: "YI SYLLABLE NGOX", 0xA269: "YI SYLLABLE NGO", 0xA26A: "YI SYLLABLE NGOP", 0xA26B: "YI SYLLABLE NGEX", 0xA26C: "YI SYLLABLE NGE", 0xA26D: "YI SYLLABLE NGEP", 0xA26E: "YI SYLLABLE HIT", 0xA26F: "YI SYLLABLE HIEX", 0xA270: "YI SYLLABLE HIE", 0xA271: "YI SYLLABLE HAT", 0xA272: "YI SYLLABLE HAX", 0xA273: "YI SYLLABLE HA", 0xA274: "YI SYLLABLE HAP", 0xA275: "YI SYLLABLE HUOT", 0xA276: "YI SYLLABLE HUOX", 0xA277: "YI SYLLABLE HUO", 0xA278: "YI SYLLABLE HUOP", 0xA279: "YI SYLLABLE HOT", 0xA27A: "YI SYLLABLE HOX", 0xA27B: "YI SYLLABLE HO", 0xA27C: "YI SYLLABLE HOP", 0xA27D: "YI SYLLABLE HEX", 0xA27E: "YI SYLLABLE HE", 0xA27F: "YI SYLLABLE HEP", 0xA280: "YI SYLLABLE WAT", 0xA281: "YI SYLLABLE WAX", 0xA282: "YI SYLLABLE WA", 0xA283: "YI SYLLABLE WAP", 0xA284: "YI SYLLABLE WUOX", 0xA285: "YI SYLLABLE WUO", 0xA286: "YI SYLLABLE WUOP", 0xA287: "YI SYLLABLE WOX", 0xA288: "YI SYLLABLE WO", 0xA289: "YI SYLLABLE WOP", 0xA28A: "YI SYLLABLE WEX", 0xA28B: "YI SYLLABLE WE", 0xA28C: "YI SYLLABLE WEP", 0xA28D: "YI SYLLABLE ZIT", 0xA28E: "YI SYLLABLE ZIX", 0xA28F: "YI SYLLABLE ZI", 0xA290: "YI SYLLABLE ZIP", 0xA291: "YI SYLLABLE ZIEX", 0xA292: "YI SYLLABLE ZIE", 0xA293: "YI SYLLABLE ZIEP", 0xA294: "YI SYLLABLE ZAT", 0xA295: "YI SYLLABLE ZAX", 0xA296: "YI SYLLABLE ZA", 0xA297: "YI SYLLABLE ZAP", 0xA298: "YI SYLLABLE ZUOX", 0xA299: "YI SYLLABLE ZUO", 0xA29A: "YI SYLLABLE ZUOP", 0xA29B: "YI SYLLABLE ZOT", 0xA29C: "YI SYLLABLE ZOX", 0xA29D: "YI SYLLABLE ZO", 0xA29E: "YI SYLLABLE ZOP", 0xA29F: "YI SYLLABLE ZEX", 0xA2A0: "YI SYLLABLE ZE", 0xA2A1: "YI SYLLABLE ZEP", 0xA2A2: "YI SYLLABLE ZUT", 0xA2A3: "YI SYLLABLE ZUX", 0xA2A4: "YI SYLLABLE ZU", 0xA2A5: "YI SYLLABLE ZUP", 0xA2A6: "YI SYLLABLE ZURX", 0xA2A7: "YI SYLLABLE ZUR", 0xA2A8: "YI SYLLABLE ZYT", 0xA2A9: "YI SYLLABLE ZYX", 0xA2AA: "YI SYLLABLE ZY", 0xA2AB: "YI SYLLABLE ZYP", 0xA2AC: "YI SYLLABLE ZYRX", 0xA2AD: "YI SYLLABLE ZYR", 0xA2AE: "YI SYLLABLE CIT", 0xA2AF: "YI SYLLABLE CIX", 0xA2B0: "YI SYLLABLE CI", 0xA2B1: "YI SYLLABLE CIP", 0xA2B2: "YI SYLLABLE CIET", 0xA2B3: "YI SYLLABLE CIEX", 0xA2B4: "YI SYLLABLE CIE", 0xA2B5: "YI SYLLABLE CIEP", 0xA2B6: "YI SYLLABLE CAT", 0xA2B7: "YI SYLLABLE CAX", 0xA2B8: "YI SYLLABLE CA", 0xA2B9: "YI SYLLABLE CAP", 0xA2BA: "YI SYLLABLE CUOX", 0xA2BB: "YI SYLLABLE CUO", 0xA2BC: "YI SYLLABLE CUOP", 0xA2BD: "YI SYLLABLE COT", 0xA2BE: "YI SYLLABLE COX", 0xA2BF: "YI SYLLABLE CO", 0xA2C0: "YI SYLLABLE COP", 0xA2C1: "YI SYLLABLE CEX", 0xA2C2: "YI SYLLABLE CE", 0xA2C3: "YI SYLLABLE CEP", 0xA2C4: "YI SYLLABLE CUT", 0xA2C5: "YI SYLLABLE CUX", 0xA2C6: "YI SYLLABLE CU", 0xA2C7: "YI SYLLABLE CUP", 0xA2C8: "YI SYLLABLE CURX", 0xA2C9: "YI SYLLABLE CUR", 0xA2CA: "YI SYLLABLE CYT", 0xA2CB: "YI SYLLABLE CYX", 0xA2CC: "YI SYLLABLE CY", 0xA2CD: "YI SYLLABLE CYP", 0xA2CE: "YI SYLLABLE CYRX", 0xA2CF: "YI SYLLABLE CYR", 0xA2D0: "YI SYLLABLE ZZIT", 0xA2D1: "YI SYLLABLE ZZIX", 0xA2D2: "YI SYLLABLE ZZI", 0xA2D3: "YI SYLLABLE ZZIP", 0xA2D4: "YI SYLLABLE ZZIET", 0xA2D5: "YI SYLLABLE ZZIEX", 0xA2D6: "YI SYLLABLE ZZIE", 0xA2D7: "YI SYLLABLE ZZIEP", 0xA2D8: "YI SYLLABLE ZZAT", 0xA2D9: "YI SYLLABLE ZZAX", 0xA2DA: "YI SYLLABLE ZZA", 0xA2DB: "YI SYLLABLE ZZAP", 0xA2DC: "YI SYLLABLE ZZOX", 0xA2DD: "YI SYLLABLE ZZO", 0xA2DE: "YI SYLLABLE ZZOP", 0xA2DF: "YI SYLLABLE ZZEX", 0xA2E0: "YI SYLLABLE ZZE", 0xA2E1: "YI SYLLABLE ZZEP", 0xA2E2: "YI SYLLABLE ZZUX", 0xA2E3: "YI SYLLABLE ZZU", 0xA2E4: "YI SYLLABLE ZZUP", 0xA2E5: "YI SYLLABLE ZZURX", 0xA2E6: "YI SYLLABLE ZZUR", 0xA2E7: "YI SYLLABLE ZZYT", 0xA2E8: "YI SYLLABLE ZZYX", 0xA2E9: "YI SYLLABLE ZZY", 0xA2EA: "YI SYLLABLE ZZYP", 0xA2EB: "YI SYLLABLE ZZYRX", 0xA2EC: "YI SYLLABLE ZZYR", 0xA2ED: "YI SYLLABLE NZIT", 0xA2EE: "YI SYLLABLE NZIX", 0xA2EF: "YI SYLLABLE NZI", 0xA2F0: "YI SYLLABLE NZIP", 0xA2F1: "YI SYLLABLE NZIEX", 0xA2F2: "YI SYLLABLE NZIE", 0xA2F3: "YI SYLLABLE NZIEP", 0xA2F4: "YI SYLLABLE NZAT", 0xA2F5: "YI SYLLABLE NZAX", 0xA2F6: "YI SYLLABLE NZA", 0xA2F7: "YI SYLLABLE NZAP", 0xA2F8: "YI SYLLABLE NZUOX", 0xA2F9: "YI SYLLABLE NZUO", 0xA2FA: "YI SYLLABLE NZOX", 0xA2FB: "YI SYLLABLE NZOP", 0xA2FC: "YI SYLLABLE NZEX", 0xA2FD: "YI SYLLABLE NZE", 0xA2FE: "YI SYLLABLE NZUX", 0xA2FF: "YI SYLLABLE NZU", 0xA300: "YI SYLLABLE NZUP", 0xA301: "YI SYLLABLE NZURX", 0xA302: "YI SYLLABLE NZUR", 0xA303: "YI SYLLABLE NZYT", 0xA304: "YI SYLLABLE NZYX", 0xA305: "YI SYLLABLE NZY", 0xA306: "YI SYLLABLE NZYP", 0xA307: "YI SYLLABLE NZYRX", 0xA308: "YI SYLLABLE NZYR", 0xA309: "YI SYLLABLE SIT", 0xA30A: "YI SYLLABLE SIX", 0xA30B: "YI SYLLABLE SI", 0xA30C: "YI SYLLABLE SIP", 0xA30D: "YI SYLLABLE SIEX", 0xA30E: "YI SYLLABLE SIE", 0xA30F: "YI SYLLABLE SIEP", 0xA310: "YI SYLLABLE SAT", 0xA311: "YI SYLLABLE SAX", 0xA312: "YI SYLLABLE SA", 0xA313: "YI SYLLABLE SAP", 0xA314: "YI SYLLABLE SUOX", 0xA315: "YI SYLLABLE SUO", 0xA316: "YI SYLLABLE SUOP", 0xA317: "YI SYLLABLE SOT", 0xA318: "YI SYLLABLE SOX", 0xA319: "YI SYLLABLE SO", 0xA31A: "YI SYLLABLE SOP", 0xA31B: "YI SYLLABLE SEX", 0xA31C: "YI SYLLABLE SE", 0xA31D: "YI SYLLABLE SEP", 0xA31E: "YI SYLLABLE SUT", 0xA31F: "YI SYLLABLE SUX", 0xA320: "YI SYLLABLE SU", 0xA321: "YI SYLLABLE SUP", 0xA322: "YI SYLLABLE SURX", 0xA323: "YI SYLLABLE SUR", 0xA324: "YI SYLLABLE SYT", 0xA325: "YI SYLLABLE SYX", 0xA326: "YI SYLLABLE SY", 0xA327: "YI SYLLABLE SYP", 0xA328: "YI SYLLABLE SYRX", 0xA329: "YI SYLLABLE SYR", 0xA32A: "YI SYLLABLE SSIT", 0xA32B: "YI SYLLABLE SSIX", 0xA32C: "YI SYLLABLE SSI", 0xA32D: "YI SYLLABLE SSIP", 0xA32E: "YI SYLLABLE SSIEX", 0xA32F: "YI SYLLABLE SSIE", 0xA330: "YI SYLLABLE SSIEP", 0xA331: "YI SYLLABLE SSAT", 0xA332: "YI SYLLABLE SSAX", 0xA333: "YI SYLLABLE SSA", 0xA334: "YI SYLLABLE SSAP", 0xA335: "YI SYLLABLE SSOT", 0xA336: "YI SYLLABLE SSOX", 0xA337: "YI SYLLABLE SSO", 0xA338: "YI SYLLABLE SSOP", 0xA339: "YI SYLLABLE SSEX", 0xA33A: "YI SYLLABLE SSE", 0xA33B: "YI SYLLABLE SSEP", 0xA33C: "YI SYLLABLE SSUT", 0xA33D: "YI SYLLABLE SSUX", 0xA33E: "YI SYLLABLE SSU", 0xA33F: "YI SYLLABLE SSUP", 0xA340: "YI SYLLABLE SSYT", 0xA341: "YI SYLLABLE SSYX", 0xA342: "YI SYLLABLE SSY", 0xA343: "YI SYLLABLE SSYP", 0xA344: "YI SYLLABLE SSYRX", 0xA345: "YI SYLLABLE SSYR", 0xA346: "YI SYLLABLE ZHAT", 0xA347: "YI SYLLABLE ZHAX", 0xA348: "YI SYLLABLE ZHA", 0xA349: "YI SYLLABLE ZHAP", 0xA34A: "YI SYLLABLE ZHUOX", 0xA34B: "YI SYLLABLE ZHUO", 0xA34C: "YI SYLLABLE ZHUOP", 0xA34D: "YI SYLLABLE ZHOT", 0xA34E: "YI SYLLABLE ZHOX", 0xA34F: "YI SYLLABLE ZHO", 0xA350: "YI SYLLABLE ZHOP", 0xA351: "YI SYLLABLE ZHET", 0xA352: "YI SYLLABLE ZHEX", 0xA353: "YI SYLLABLE ZHE", 0xA354: "YI SYLLABLE ZHEP", 0xA355: "YI SYLLABLE ZHUT", 0xA356: "YI SYLLABLE ZHUX", 0xA357: "YI SYLLABLE ZHU", 0xA358: "YI SYLLABLE ZHUP", 0xA359: "YI SYLLABLE ZHURX", 0xA35A: "YI SYLLABLE ZHUR", 0xA35B: "YI SYLLABLE ZHYT", 0xA35C: "YI SYLLABLE ZHYX", 0xA35D: "YI SYLLABLE ZHY", 0xA35E: "YI SYLLABLE ZHYP", 0xA35F: "YI SYLLABLE ZHYRX", 0xA360: "YI SYLLABLE ZHYR", 0xA361: "YI SYLLABLE CHAT", 0xA362: "YI SYLLABLE CHAX", 0xA363: "YI SYLLABLE CHA", 0xA364: "YI SYLLABLE CHAP", 0xA365: "YI SYLLABLE CHUOT", 0xA366: "YI SYLLABLE CHUOX", 0xA367: "YI SYLLABLE CHUO", 0xA368: "YI SYLLABLE CHUOP", 0xA369: "YI SYLLABLE CHOT", 0xA36A: "YI SYLLABLE CHOX", 0xA36B: "YI SYLLABLE CHO", 0xA36C: "YI SYLLABLE CHOP", 0xA36D: "YI SYLLABLE CHET", 0xA36E: "YI SYLLABLE CHEX", 0xA36F: "YI SYLLABLE CHE", 0xA370: "YI SYLLABLE CHEP", 0xA371: "YI SYLLABLE CHUX", 0xA372: "YI SYLLABLE CHU", 0xA373: "YI SYLLABLE CHUP", 0xA374: "YI SYLLABLE CHURX", 0xA375: "YI SYLLABLE CHUR", 0xA376: "YI SYLLABLE CHYT", 0xA377: "YI SYLLABLE CHYX", 0xA378: "YI SYLLABLE CHY", 0xA379: "YI SYLLABLE CHYP", 0xA37A: "YI SYLLABLE CHYRX", 0xA37B: "YI SYLLABLE CHYR", 0xA37C: "YI SYLLABLE RRAX", 0xA37D: "YI SYLLABLE RRA", 0xA37E: "YI SYLLABLE RRUOX", 0xA37F: "YI SYLLABLE RRUO", 0xA380: "YI SYLLABLE RROT", 0xA381: "YI SYLLABLE RROX", 0xA382: "YI SYLLABLE RRO", 0xA383: "YI SYLLABLE RROP", 0xA384: "YI SYLLABLE RRET", 0xA385: "YI SYLLABLE RREX", 0xA386: "YI SYLLABLE RRE", 0xA387: "YI SYLLABLE RREP", 0xA388: "YI SYLLABLE RRUT", 0xA389: "YI SYLLABLE RRUX", 0xA38A: "YI SYLLABLE RRU", 0xA38B: "YI SYLLABLE RRUP", 0xA38C: "YI SYLLABLE RRURX", 0xA38D: "YI SYLLABLE RRUR", 0xA38E: "YI SYLLABLE RRYT", 0xA38F: "YI SYLLABLE RRYX", 0xA390: "YI SYLLABLE RRY", 0xA391: "YI SYLLABLE RRYP", 0xA392: "YI SYLLABLE RRYRX", 0xA393: "YI SYLLABLE RRYR", 0xA394: "YI SYLLABLE NRAT", 0xA395: "YI SYLLABLE NRAX", 0xA396: "YI SYLLABLE NRA", 0xA397: "YI SYLLABLE NRAP", 0xA398: "YI SYLLABLE NROX", 0xA399: "YI SYLLABLE NRO", 0xA39A: "YI SYLLABLE NROP", 0xA39B: "YI SYLLABLE NRET", 0xA39C: "YI SYLLABLE NREX", 0xA39D: "YI SYLLABLE NRE", 0xA39E: "YI SYLLABLE NREP", 0xA39F: "YI SYLLABLE NRUT", 0xA3A0: "YI SYLLABLE NRUX", 0xA3A1: "YI SYLLABLE NRU", 0xA3A2: "YI SYLLABLE NRUP", 0xA3A3: "YI SYLLABLE NRURX", 0xA3A4: "YI SYLLABLE NRUR", 0xA3A5: "YI SYLLABLE NRYT", 0xA3A6: "YI SYLLABLE NRYX", 0xA3A7: "YI SYLLABLE NRY", 0xA3A8: "YI SYLLABLE NRYP", 0xA3A9: "YI SYLLABLE NRYRX", 0xA3AA: "YI SYLLABLE NRYR", 0xA3AB: "YI SYLLABLE SHAT", 0xA3AC: "YI SYLLABLE SHAX", 0xA3AD: "YI SYLLABLE SHA", 0xA3AE: "YI SYLLABLE SHAP", 0xA3AF: "YI SYLLABLE SHUOX", 0xA3B0: "YI SYLLABLE SHUO", 0xA3B1: "YI SYLLABLE SHUOP", 0xA3B2: "YI SYLLABLE SHOT", 0xA3B3: "YI SYLLABLE SHOX", 0xA3B4: "YI SYLLABLE SHO", 0xA3B5: "YI SYLLABLE SHOP", 0xA3B6: "YI SYLLABLE SHET", 0xA3B7: "YI SYLLABLE SHEX", 0xA3B8: "YI SYLLABLE SHE", 0xA3B9: "YI SYLLABLE SHEP", 0xA3BA: "YI SYLLABLE SHUT", 0xA3BB: "YI SYLLABLE SHUX", 0xA3BC: "YI SYLLABLE SHU", 0xA3BD: "YI SYLLABLE SHUP", 0xA3BE: "YI SYLLABLE SHURX", 0xA3BF: "YI SYLLABLE SHUR", 0xA3C0: "YI SYLLABLE SHYT", 0xA3C1: "YI SYLLABLE SHYX", 0xA3C2: "YI SYLLABLE SHY", 0xA3C3: "YI SYLLABLE SHYP", 0xA3C4: "YI SYLLABLE SHYRX", 0xA3C5: "YI SYLLABLE SHYR", 0xA3C6: "YI SYLLABLE RAT", 0xA3C7: "YI SYLLABLE RAX", 0xA3C8: "YI SYLLABLE RA", 0xA3C9: "YI SYLLABLE RAP", 0xA3CA: "YI SYLLABLE RUOX", 0xA3CB: "YI SYLLABLE RUO", 0xA3CC: "YI SYLLABLE RUOP", 0xA3CD: "YI SYLLABLE ROT", 0xA3CE: "YI SYLLABLE ROX", 0xA3CF: "YI SYLLABLE RO", 0xA3D0: "YI SYLLABLE ROP", 0xA3D1: "YI SYLLABLE REX", 0xA3D2: "YI SYLLABLE RE", 0xA3D3: "YI SYLLABLE REP", 0xA3D4: "YI SYLLABLE RUT", 0xA3D5: "YI SYLLABLE RUX", 0xA3D6: "YI SYLLABLE RU", 0xA3D7: "YI SYLLABLE RUP", 0xA3D8: "YI SYLLABLE RURX", 0xA3D9: "YI SYLLABLE RUR", 0xA3DA: "YI SYLLABLE RYT", 0xA3DB: "YI SYLLABLE RYX", 0xA3DC: "YI SYLLABLE RY", 0xA3DD: "YI SYLLABLE RYP", 0xA3DE: "YI SYLLABLE RYRX", 0xA3DF: "YI SYLLABLE RYR", 0xA3E0: "YI SYLLABLE JIT", 0xA3E1: "YI SYLLABLE JIX", 0xA3E2: "YI SYLLABLE JI", 0xA3E3: "YI SYLLABLE JIP", 0xA3E4: "YI SYLLABLE JIET", 0xA3E5: "YI SYLLABLE JIEX", 0xA3E6: "YI SYLLABLE JIE", 0xA3E7: "YI SYLLABLE JIEP", 0xA3E8: "YI SYLLABLE JUOT", 0xA3E9: "YI SYLLABLE JUOX", 0xA3EA: "YI SYLLABLE JUO", 0xA3EB: "YI SYLLABLE JUOP", 0xA3EC: "YI SYLLABLE JOT", 0xA3ED: "YI SYLLABLE JOX", 0xA3EE: "YI SYLLABLE JO", 0xA3EF: "YI SYLLABLE JOP", 0xA3F0: "YI SYLLABLE JUT", 0xA3F1: "YI SYLLABLE JUX", 0xA3F2: "YI SYLLABLE JU", 0xA3F3: "YI SYLLABLE JUP", 0xA3F4: "YI SYLLABLE JURX", 0xA3F5: "YI SYLLABLE JUR", 0xA3F6: "YI SYLLABLE JYT", 0xA3F7: "YI SYLLABLE JYX", 0xA3F8: "YI SYLLABLE JY", 0xA3F9: "YI SYLLABLE JYP", 0xA3FA: "YI SYLLABLE JYRX", 0xA3FB: "YI SYLLABLE JYR", 0xA3FC: "YI SYLLABLE QIT", 0xA3FD: "YI SYLLABLE QIX", 0xA3FE: "YI SYLLABLE QI", 0xA3FF: "YI SYLLABLE QIP", 0xA400: "YI SYLLABLE QIET", 0xA401: "YI SYLLABLE QIEX", 0xA402: "YI SYLLABLE QIE", 0xA403: "YI SYLLABLE QIEP", 0xA404: "YI SYLLABLE QUOT", 0xA405: "YI SYLLABLE QUOX", 0xA406: "YI SYLLABLE QUO", 0xA407: "YI SYLLABLE QUOP", 0xA408: "YI SYLLABLE QOT", 0xA409: "YI SYLLABLE QOX", 0xA40A: "YI SYLLABLE QO", 0xA40B: "YI SYLLABLE QOP", 0xA40C: "YI SYLLABLE QUT", 0xA40D: "YI SYLLABLE QUX", 0xA40E: "YI SYLLABLE QU", 0xA40F: "YI SYLLABLE QUP", 0xA410: "YI SYLLABLE QURX", 0xA411: "YI SYLLABLE QUR", 0xA412: "YI SYLLABLE QYT", 0xA413: "YI SYLLABLE QYX", 0xA414: "YI SYLLABLE QY", 0xA415: "YI SYLLABLE QYP", 0xA416: "YI SYLLABLE QYRX", 0xA417: "YI SYLLABLE QYR", 0xA418: "YI SYLLABLE JJIT", 0xA419: "YI SYLLABLE JJIX", 0xA41A: "YI SYLLABLE JJI", 0xA41B: "YI SYLLABLE JJIP", 0xA41C: "YI SYLLABLE JJIET", 0xA41D: "YI SYLLABLE JJIEX", 0xA41E: "YI SYLLABLE JJIE", 0xA41F: "YI SYLLABLE JJIEP", 0xA420: "YI SYLLABLE JJUOX", 0xA421: "YI SYLLABLE JJUO", 0xA422: "YI SYLLABLE JJUOP", 0xA423: "YI SYLLABLE JJOT", 0xA424: "YI SYLLABLE JJOX", 0xA425: "YI SYLLABLE JJO", 0xA426: "YI SYLLABLE JJOP", 0xA427: "YI SYLLABLE JJUT", 0xA428: "YI SYLLABLE JJUX", 0xA429: "YI SYLLABLE JJU", 0xA42A: "YI SYLLABLE JJUP", 0xA42B: "YI SYLLABLE JJURX", 0xA42C: "YI SYLLABLE JJUR", 0xA42D: "YI SYLLABLE JJYT", 0xA42E: "YI SYLLABLE JJYX", 0xA42F: "YI SYLLABLE JJY", 0xA430: "YI SYLLABLE JJYP", 0xA431: "YI SYLLABLE NJIT", 0xA432: "YI SYLLABLE NJIX", 0xA433: "YI SYLLABLE NJI", 0xA434: "YI SYLLABLE NJIP", 0xA435: "YI SYLLABLE NJIET", 0xA436: "YI SYLLABLE NJIEX", 0xA437: "YI SYLLABLE NJIE", 0xA438: "YI SYLLABLE NJIEP", 0xA439: "YI SYLLABLE NJUOX", 0xA43A: "YI SYLLABLE NJUO", 0xA43B: "YI SYLLABLE NJOT", 0xA43C: "YI SYLLABLE NJOX", 0xA43D: "YI SYLLABLE NJO", 0xA43E: "YI SYLLABLE NJOP", 0xA43F: "YI SYLLABLE NJUX", 0xA440: "YI SYLLABLE NJU", 0xA441: "YI SYLLABLE NJUP", 0xA442: "YI SYLLABLE NJURX", 0xA443: "YI SYLLABLE NJUR", 0xA444: "YI SYLLABLE NJYT", 0xA445: "YI SYLLABLE NJYX", 0xA446: "YI SYLLABLE NJY", 0xA447: "YI SYLLABLE NJYP", 0xA448: "YI SYLLABLE NJYRX", 0xA449: "YI SYLLABLE NJYR", 0xA44A: "YI SYLLABLE NYIT", 0xA44B: "YI SYLLABLE NYIX", 0xA44C: "YI SYLLABLE NYI", 0xA44D: "YI SYLLABLE NYIP", 0xA44E: "YI SYLLABLE NYIET", 0xA44F: "YI SYLLABLE NYIEX", 0xA450: "YI SYLLABLE NYIE", 0xA451: "YI SYLLABLE NYIEP", 0xA452: "YI SYLLABLE NYUOX", 0xA453: "YI SYLLABLE NYUO", 0xA454: "YI SYLLABLE NYUOP", 0xA455: "YI SYLLABLE NYOT", 0xA456: "YI SYLLABLE NYOX", 0xA457: "YI SYLLABLE NYO", 0xA458: "YI SYLLABLE NYOP", 0xA459: "YI SYLLABLE NYUT", 0xA45A: "YI SYLLABLE NYUX", 0xA45B: "YI SYLLABLE NYU", 0xA45C: "YI SYLLABLE NYUP", 0xA45D: "YI SYLLABLE XIT", 0xA45E: "YI SYLLABLE XIX", 0xA45F: "YI SYLLABLE XI", 0xA460: "YI SYLLABLE XIP", 0xA461: "YI SYLLABLE XIET", 0xA462: "YI SYLLABLE XIEX", 0xA463: "YI SYLLABLE XIE", 0xA464: "YI SYLLABLE XIEP", 0xA465: "YI SYLLABLE XUOX", 0xA466: "YI SYLLABLE XUO", 0xA467: "YI SYLLABLE XOT", 0xA468: "YI SYLLABLE XOX", 0xA469: "YI SYLLABLE XO", 0xA46A: "YI SYLLABLE XOP", 0xA46B: "YI SYLLABLE XYT", 0xA46C: "YI SYLLABLE XYX", 0xA46D: "YI SYLLABLE XY", 0xA46E: "YI SYLLABLE XYP", 0xA46F: "YI SYLLABLE XYRX", 0xA470: "YI SYLLABLE XYR", 0xA471: "YI SYLLABLE YIT", 0xA472: "YI SYLLABLE YIX", 0xA473: "YI SYLLABLE YI", 0xA474: "YI SYLLABLE YIP", 0xA475: "YI SYLLABLE YIET", 0xA476: "YI SYLLABLE YIEX", 0xA477: "YI SYLLABLE YIE", 0xA478: "YI SYLLABLE YIEP", 0xA479: "YI SYLLABLE YUOT", 0xA47A: "YI SYLLABLE YUOX", 0xA47B: "YI SYLLABLE YUO", 0xA47C: "YI SYLLABLE YUOP", 0xA47D: "YI SYLLABLE YOT", 0xA47E: "YI SYLLABLE YOX", 0xA47F: "YI SYLLABLE YO", 0xA480: "YI SYLLABLE YOP", 0xA481: "YI SYLLABLE YUT", 0xA482: "YI SYLLABLE YUX", 0xA483: "YI SYLLABLE YU", 0xA484: "YI SYLLABLE YUP", 0xA485: "YI SYLLABLE YURX", 0xA486: "YI SYLLABLE YUR", 0xA487: "YI SYLLABLE YYT", 0xA488: "YI SYLLABLE YYX", 0xA489: "YI SYLLABLE YY", 0xA48A: "YI SYLLABLE YYP", 0xA48B: "YI SYLLABLE YYRX", 0xA48C: "YI SYLLABLE YYR", 0xA490: "YI RADICAL QOT", 0xA491: "YI RADICAL LI", 0xA492: "YI RADICAL KIT", 0xA493: "YI RADICAL NYIP", 0xA494: "YI RADICAL CYP", 0xA495: "YI RADICAL SSI", 0xA496: "YI RADICAL GGOP", 0xA497: "YI RADICAL GEP", 0xA498: "YI RADICAL MI", 0xA499: "YI RADICAL HXIT", 0xA49A: "YI RADICAL LYR", 0xA49B: "YI RADICAL BBUT", 0xA49C: "YI RADICAL MOP", 0xA49D: "YI RADICAL YO", 0xA49E: "YI RADICAL PUT", 0xA49F: "YI RADICAL HXUO", 0xA4A0: "YI RADICAL TAT", 0xA4A1: "YI RADICAL GA", 0xA4A2: "YI RADICAL ZUP", 0xA4A3: "YI RADICAL CYT", 0xA4A4: "YI RADICAL DDUR", 0xA4A5: "YI RADICAL BUR", 0xA4A6: "YI RADICAL GGUO", 0xA4A7: "YI RADICAL NYOP", 0xA4A8: "YI RADICAL TU", 0xA4A9: "YI RADICAL OP", 0xA4AA: "YI RADICAL JJUT", 0xA4AB: "YI RADICAL ZOT", 0xA4AC: "YI RADICAL PYT", 0xA4AD: "YI RADICAL HMO", 0xA4AE: "YI RADICAL YIT", 0xA4AF: "YI RADICAL VUR", 0xA4B0: "YI RADICAL SHY", 0xA4B1: "YI RADICAL VEP", 0xA4B2: "YI RADICAL ZA", 0xA4B3: "YI RADICAL JO", 0xA4B4: "YI RADICAL NZUP", 0xA4B5: "YI RADICAL JJY", 0xA4B6: "YI RADICAL GOT", 0xA4B7: "YI RADICAL JJIE", 0xA4B8: "YI RADICAL WO", 0xA4B9: "YI RADICAL DU", 0xA4BA: "YI RADICAL SHUR", 0xA4BB: "YI RADICAL LIE", 0xA4BC: "YI RADICAL CY", 0xA4BD: "YI RADICAL CUOP", 0xA4BE: "YI RADICAL CIP", 0xA4BF: "YI RADICAL HXOP", 0xA4C0: "YI RADICAL SHAT", 0xA4C1: "YI RADICAL ZUR", 0xA4C2: "YI RADICAL SHOP", 0xA4C3: "YI RADICAL CHE", 0xA4C4: "YI RADICAL ZZIET", 0xA4C5: "YI RADICAL NBIE", 0xA4C6: "YI RADICAL KE", 0xA500: "VAI SYLLABLE EE", 0xA501: "VAI SYLLABLE EEN", 0xA502: "VAI SYLLABLE HEE", 0xA503: "VAI SYLLABLE WEE", 0xA504: "VAI SYLLABLE WEEN", 0xA505: "VAI SYLLABLE PEE", 0xA506: "VAI SYLLABLE BHEE", 0xA507: "VAI SYLLABLE BEE", 0xA508: "VAI SYLLABLE MBEE", 0xA509: "VAI SYLLABLE KPEE", 0xA50A: "VAI SYLLABLE MGBEE", 0xA50B: "VAI SYLLABLE GBEE", 0xA50C: "VAI SYLLABLE FEE", 0xA50D: "VAI SYLLABLE VEE", 0xA50E: "VAI SYLLABLE TEE", 0xA50F: "VAI SYLLABLE THEE", 0xA510: "VAI SYLLABLE DHEE", 0xA511: "VAI SYLLABLE DHHEE", 0xA512: "VAI SYLLABLE LEE", 0xA513: "VAI SYLLABLE REE", 0xA514: "VAI SYLLABLE DEE", 0xA515: "VAI SYLLABLE NDEE", 0xA516: "VAI SYLLABLE SEE", 0xA517: "VAI SYLLABLE SHEE", 0xA518: "VAI SYLLABLE ZEE", 0xA519: "VAI SYLLABLE ZHEE", 0xA51A: "VAI SYLLABLE CEE", 0xA51B: "VAI SYLLABLE JEE", 0xA51C: "VAI SYLLABLE NJEE", 0xA51D: "VAI SYLLABLE YEE", 0xA51E: "VAI SYLLABLE KEE", 0xA51F: "VAI SYLLABLE NGGEE", 0xA520: "VAI SYLLABLE GEE", 0xA521: "VAI SYLLABLE MEE", 0xA522: "VAI SYLLABLE NEE", 0xA523: "VAI SYLLABLE NYEE", 0xA524: "VAI SYLLABLE I", 0xA525: "VAI SYLLABLE IN", 0xA526: "VAI SYLLABLE HI", 0xA527: "VAI SYLLABLE HIN", 0xA528: "VAI SYLLABLE WI", 0xA529: "VAI SYLLABLE WIN", 0xA52A: "VAI SYLLABLE PI", 0xA52B: "VAI SYLLABLE BHI", 0xA52C: "VAI SYLLABLE BI", 0xA52D: "VAI SYLLABLE MBI", 0xA52E: "VAI SYLLABLE KPI", 0xA52F: "VAI SYLLABLE MGBI", 0xA530: "VAI SYLLABLE GBI", 0xA531: "VAI SYLLABLE FI", 0xA532: "VAI SYLLABLE VI", 0xA533: "VAI SYLLABLE TI", 0xA534: "VAI SYLLABLE THI", 0xA535: "VAI SYLLABLE DHI", 0xA536: "VAI SYLLABLE DHHI", 0xA537: "VAI SYLLABLE LI", 0xA538: "VAI SYLLABLE RI", 0xA539: "VAI SYLLABLE DI", 0xA53A: "VAI SYLLABLE NDI", 0xA53B: "VAI SYLLABLE SI", 0xA53C: "VAI SYLLABLE SHI", 0xA53D: "VAI SYLLABLE ZI", 0xA53E: "VAI SYLLABLE ZHI", 0xA53F: "VAI SYLLABLE CI", 0xA540: "VAI SYLLABLE JI", 0xA541: "VAI SYLLABLE NJI", 0xA542: "VAI SYLLABLE YI", 0xA543: "VAI SYLLABLE KI", 0xA544: "VAI SYLLABLE NGGI", 0xA545: "VAI SYLLABLE GI", 0xA546: "VAI SYLLABLE MI", 0xA547: "VAI SYLLABLE NI", 0xA548: "VAI SYLLABLE NYI", 0xA549: "VAI SYLLABLE A", 0xA54A: "VAI SYLLABLE AN", 0xA54B: "VAI SYLLABLE NGAN", 0xA54C: "VAI SYLLABLE HA", 0xA54D: "VAI SYLLABLE HAN", 0xA54E: "VAI SYLLABLE WA", 0xA54F: "VAI SYLLABLE WAN", 0xA550: "VAI SYLLABLE PA", 0xA551: "VAI SYLLABLE BHA", 0xA552: "VAI SYLLABLE BA", 0xA553: "VAI SYLLABLE MBA", 0xA554: "VAI SYLLABLE KPA", 0xA555: "VAI SYLLABLE KPAN", 0xA556: "VAI SYLLABLE MGBA", 0xA557: "VAI SYLLABLE GBA", 0xA558: "VAI SYLLABLE FA", 0xA559: "VAI SYLLABLE VA", 0xA55A: "VAI SYLLABLE TA", 0xA55B: "VAI SYLLABLE THA", 0xA55C: "VAI SYLLABLE DHA", 0xA55D: "VAI SYLLABLE DHHA", 0xA55E: "VAI SYLLABLE LA", 0xA55F: "VAI SYLLABLE RA", 0xA560: "VAI SYLLABLE DA", 0xA561: "VAI SYLLABLE NDA", 0xA562: "VAI SYLLABLE SA", 0xA563: "VAI SYLLABLE SHA", 0xA564: "VAI SYLLABLE ZA", 0xA565: "VAI SYLLABLE ZHA", 0xA566: "VAI SYLLABLE CA", 0xA567: "VAI SYLLABLE JA", 0xA568: "VAI SYLLABLE NJA", 0xA569: "VAI SYLLABLE YA", 0xA56A: "VAI SYLLABLE KA", 0xA56B: "VAI SYLLABLE KAN", 0xA56C: "VAI SYLLABLE NGGA", 0xA56D: "VAI SYLLABLE GA", 0xA56E: "VAI SYLLABLE MA", 0xA56F: "VAI SYLLABLE NA", 0xA570: "VAI SYLLABLE NYA", 0xA571: "VAI SYLLABLE OO", 0xA572: "VAI SYLLABLE OON", 0xA573: "VAI SYLLABLE HOO", 0xA574: "VAI SYLLABLE WOO", 0xA575: "VAI SYLLABLE WOON", 0xA576: "VAI SYLLABLE POO", 0xA577: "VAI SYLLABLE BHOO", 0xA578: "VAI SYLLABLE BOO", 0xA579: "VAI SYLLABLE MBOO", 0xA57A: "VAI SYLLABLE KPOO", 0xA57B: "VAI SYLLABLE MGBOO", 0xA57C: "VAI SYLLABLE GBOO", 0xA57D: "VAI SYLLABLE FOO", 0xA57E: "VAI SYLLABLE VOO", 0xA57F: "VAI SYLLABLE TOO", 0xA580: "VAI SYLLABLE THOO", 0xA581: "VAI SYLLABLE DHOO", 0xA582: "VAI SYLLABLE DHHOO", 0xA583: "VAI SYLLABLE LOO", 0xA584: "VAI SYLLABLE ROO", 0xA585: "VAI SYLLABLE DOO", 0xA586: "VAI SYLLABLE NDOO", 0xA587: "VAI SYLLABLE SOO", 0xA588: "VAI SYLLABLE SHOO", 0xA589: "VAI SYLLABLE ZOO", 0xA58A: "VAI SYLLABLE ZHOO", 0xA58B: "VAI SYLLABLE COO", 0xA58C: "VAI SYLLABLE JOO", 0xA58D: "VAI SYLLABLE NJOO", 0xA58E: "VAI SYLLABLE YOO", 0xA58F: "VAI SYLLABLE KOO", 0xA590: "VAI SYLLABLE NGGOO", 0xA591: "VAI SYLLABLE GOO", 0xA592: "VAI SYLLABLE MOO", 0xA593: "VAI SYLLABLE NOO", 0xA594: "VAI SYLLABLE NYOO", 0xA595: "VAI SYLLABLE U", 0xA596: "VAI SYLLABLE UN", 0xA597: "VAI SYLLABLE HU", 0xA598: "VAI SYLLABLE HUN", 0xA599: "VAI SYLLABLE WU", 0xA59A: "VAI SYLLABLE WUN", 0xA59B: "VAI SYLLABLE PU", 0xA59C: "VAI SYLLABLE BHU", 0xA59D: "VAI SYLLABLE BU", 0xA59E: "VAI SYLLABLE MBU", 0xA59F: "VAI SYLLABLE KPU", 0xA5A0: "VAI SYLLABLE MGBU", 0xA5A1: "VAI SYLLABLE GBU", 0xA5A2: "VAI SYLLABLE FU", 0xA5A3: "VAI SYLLABLE VU", 0xA5A4: "VAI SYLLABLE TU", 0xA5A5: "VAI SYLLABLE THU", 0xA5A6: "VAI SYLLABLE DHU", 0xA5A7: "VAI SYLLABLE DHHU", 0xA5A8: "VAI SYLLABLE LU", 0xA5A9: "VAI SYLLABLE RU", 0xA5AA: "VAI SYLLABLE DU", 0xA5AB: "VAI SYLLABLE NDU", 0xA5AC: "VAI SYLLABLE SU", 0xA5AD: "VAI SYLLABLE SHU", 0xA5AE: "VAI SYLLABLE ZU", 0xA5AF: "VAI SYLLABLE ZHU", 0xA5B0: "VAI SYLLABLE CU", 0xA5B1: "VAI SYLLABLE JU", 0xA5B2: "VAI SYLLABLE NJU", 0xA5B3: "VAI SYLLABLE YU", 0xA5B4: "VAI SYLLABLE KU", 0xA5B5: "VAI SYLLABLE NGGU", 0xA5B6: "VAI SYLLABLE GU", 0xA5B7: "VAI SYLLABLE MU", 0xA5B8: "VAI SYLLABLE NU", 0xA5B9: "VAI SYLLABLE NYU", 0xA5BA: "VAI SYLLABLE O", 0xA5BB: "VAI SYLLABLE ON", 0xA5BC: "VAI SYLLABLE NGON", 0xA5BD: "VAI SYLLABLE HO", 0xA5BE: "VAI SYLLABLE HON", 0xA5BF: "VAI SYLLABLE WO", 0xA5C0: "VAI SYLLABLE WON", 0xA5C1: "VAI SYLLABLE PO", 0xA5C2: "VAI SYLLABLE BHO", 0xA5C3: "VAI SYLLABLE BO", 0xA5C4: "VAI SYLLABLE MBO", 0xA5C5: "VAI SYLLABLE KPO", 0xA5C6: "VAI SYLLABLE MGBO", 0xA5C7: "VAI SYLLABLE GBO", 0xA5C8: "VAI SYLLABLE GBON", 0xA5C9: "VAI SYLLABLE FO", 0xA5CA: "VAI SYLLABLE VO", 0xA5CB: "VAI SYLLABLE TO", 0xA5CC: "VAI SYLLABLE THO", 0xA5CD: "VAI SYLLABLE DHO", 0xA5CE: "VAI SYLLABLE DHHO", 0xA5CF: "VAI SYLLABLE LO", 0xA5D0: "VAI SYLLABLE RO", 0xA5D1: "VAI SYLLABLE DO", 0xA5D2: "VAI SYLLABLE NDO", 0xA5D3: "VAI SYLLABLE SO", 0xA5D4: "VAI SYLLABLE SHO", 0xA5D5: "VAI SYLLABLE ZO", 0xA5D6: "VAI SYLLABLE ZHO", 0xA5D7: "VAI SYLLABLE CO", 0xA5D8: "VAI SYLLABLE JO", 0xA5D9: "VAI SYLLABLE NJO", 0xA5DA: "VAI SYLLABLE YO", 0xA5DB: "VAI SYLLABLE KO", 0xA5DC: "VAI SYLLABLE NGGO", 0xA5DD: "VAI SYLLABLE GO", 0xA5DE: "VAI SYLLABLE MO", 0xA5DF: "VAI SYLLABLE NO", 0xA5E0: "VAI SYLLABLE NYO", 0xA5E1: "VAI SYLLABLE E", 0xA5E2: "VAI SYLLABLE EN", 0xA5E3: "VAI SYLLABLE NGEN", 0xA5E4: "VAI SYLLABLE HE", 0xA5E5: "VAI SYLLABLE HEN", 0xA5E6: "VAI SYLLABLE WE", 0xA5E7: "VAI SYLLABLE WEN", 0xA5E8: "VAI SYLLABLE PE", 0xA5E9: "VAI SYLLABLE BHE", 0xA5EA: "VAI SYLLABLE BE", 0xA5EB: "VAI SYLLABLE MBE", 0xA5EC: "VAI SYLLABLE KPE", 0xA5ED: "VAI SYLLABLE KPEN", 0xA5EE: "VAI SYLLABLE MGBE", 0xA5EF: "VAI SYLLABLE GBE", 0xA5F0: "VAI SYLLABLE GBEN", 0xA5F1: "VAI SYLLABLE FE", 0xA5F2: "VAI SYLLABLE VE", 0xA5F3: "VAI SYLLABLE TE", 0xA5F4: "VAI SYLLABLE THE", 0xA5F5: "VAI SYLLABLE DHE", 0xA5F6: "VAI SYLLABLE DHHE", 0xA5F7: "VAI SYLLABLE LE", 0xA5F8: "VAI SYLLABLE RE", 0xA5F9: "VAI SYLLABLE DE", 0xA5FA: "VAI SYLLABLE NDE", 0xA5FB: "VAI SYLLABLE SE", 0xA5FC: "VAI SYLLABLE SHE", 0xA5FD: "VAI SYLLABLE ZE", 0xA5FE: "VAI SYLLABLE ZHE", 0xA5FF: "VAI SYLLABLE CE", 0xA600: "VAI SYLLABLE JE", 0xA601: "VAI SYLLABLE NJE", 0xA602: "VAI SYLLABLE YE", 0xA603: "VAI SYLLABLE KE", 0xA604: "VAI SYLLABLE NGGE", 0xA605: "VAI SYLLABLE NGGEN", 0xA606: "VAI SYLLABLE GE", 0xA607: "VAI SYLLABLE GEN", 0xA608: "VAI SYLLABLE ME", 0xA609: "VAI SYLLABLE NE", 0xA60A: "VAI SYLLABLE NYE", 0xA60B: "VAI SYLLABLE NG", 0xA60C: "VAI SYLLABLE LENGTHENER", 0xA60D: "VAI COMMA", 0xA60E: "VAI FULL STOP", 0xA60F: "VAI QUESTION MARK", 0xA610: "VAI SYLLABLE NDOLE FA", 0xA611: "VAI SYLLABLE NDOLE KA", 0xA612: "VAI SYLLABLE NDOLE SOO", 0xA613: "VAI SYMBOL FEENG", 0xA614: "VAI SYMBOL KEENG", 0xA615: "VAI SYMBOL TING", 0xA616: "VAI SYMBOL NII", 0xA617: "VAI SYMBOL BANG", 0xA618: "VAI SYMBOL FAA", 0xA619: "VAI SYMBOL TAA", 0xA61A: "VAI SYMBOL DANG", 0xA61B: "VAI SYMBOL DOONG", 0xA61C: "VAI SYMBOL KUNG", 0xA61D: "VAI SYMBOL TONG", 0xA61E: "VAI SYMBOL DO-O", 0xA61F: "VAI SYMBOL JONG", 0xA620: "VAI DIGIT ZERO", 0xA621: "VAI DIGIT ONE", 0xA622: "VAI DIGIT TWO", 0xA623: "VAI DIGIT THREE", 0xA624: "VAI DIGIT FOUR", 0xA625: "VAI DIGIT FIVE", 0xA626: "VAI DIGIT SIX", 0xA627: "VAI DIGIT SEVEN", 0xA628: "VAI DIGIT EIGHT", 0xA629: "VAI DIGIT NINE", 0xA62A: "VAI SYLLABLE NDOLE MA", 0xA62B: "VAI SYLLABLE NDOLE DO", 0xA640: "CYRILLIC CAPITAL LETTER ZEMLYA", 0xA641: "CYRILLIC SMALL LETTER ZEMLYA", 0xA642: "CYRILLIC CAPITAL LETTER DZELO", 0xA643: "CYRILLIC SMALL LETTER DZELO", 0xA644: "CYRILLIC CAPITAL LETTER REVERSED DZE", 0xA645: "CYRILLIC SMALL LETTER REVERSED DZE", 0xA646: "CYRILLIC CAPITAL LETTER IOTA", 0xA647: "CYRILLIC SMALL LETTER IOTA", 0xA648: "CYRILLIC CAPITAL LETTER DJERV", 0xA649: "CYRILLIC SMALL LETTER DJERV", 0xA64A: "CYRILLIC CAPITAL LETTER MONOGRAPH UK", 0xA64B: "CYRILLIC SMALL LETTER MONOGRAPH UK", 0xA64C: "CYRILLIC CAPITAL LETTER BROAD OMEGA", 0xA64D: "CYRILLIC SMALL LETTER BROAD OMEGA", 0xA64E: "CYRILLIC CAPITAL LETTER NEUTRAL YER", 0xA64F: "CYRILLIC SMALL LETTER NEUTRAL YER", 0xA650: "CYRILLIC CAPITAL LETTER YERU WITH BACK YER", 0xA651: "CYRILLIC SMALL LETTER YERU WITH BACK YER", 0xA652: "CYRILLIC CAPITAL LETTER IOTIFIED YAT", 0xA653: "CYRILLIC SMALL LETTER IOTIFIED YAT", 0xA654: "CYRILLIC CAPITAL LETTER REVERSED YU", 0xA655: "CYRILLIC SMALL LETTER REVERSED YU", 0xA656: "CYRILLIC CAPITAL LETTER IOTIFIED A", 0xA657: "CYRILLIC SMALL LETTER IOTIFIED A", 0xA658: "CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS", 0xA659: "CYRILLIC SMALL LETTER CLOSED LITTLE YUS", 0xA65A: "CYRILLIC CAPITAL LETTER BLENDED YUS", 0xA65B: "CYRILLIC SMALL LETTER BLENDED YUS", 0xA65C: "CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS", 0xA65D: "CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS", 0xA65E: "CYRILLIC CAPITAL LETTER YN", 0xA65F: "CYRILLIC SMALL LETTER YN", 0xA662: "CYRILLIC CAPITAL LETTER SOFT DE", 0xA663: "CYRILLIC SMALL LETTER SOFT DE", 0xA664: "CYRILLIC CAPITAL LETTER SOFT EL", 0xA665: "CYRILLIC SMALL LETTER SOFT EL", 0xA666: "CYRILLIC CAPITAL LETTER SOFT EM", 0xA667: "CYRILLIC SMALL LETTER SOFT EM", 0xA668: "CYRILLIC CAPITAL LETTER MONOCULAR O", 0xA669: "CYRILLIC SMALL LETTER MONOCULAR O", 0xA66A: "CYRILLIC CAPITAL LETTER BINOCULAR O", 0xA66B: "CYRILLIC SMALL LETTER BINOCULAR O", 0xA66C: "CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O", 0xA66D: "CYRILLIC SMALL LETTER DOUBLE MONOCULAR O", 0xA66E: "CYRILLIC LETTER MULTIOCULAR O", 0xA66F: "COMBINING CYRILLIC VZMET", 0xA670: "COMBINING CYRILLIC TEN MILLIONS SIGN", 0xA671: "COMBINING CYRILLIC HUNDRED MILLIONS SIGN", 0xA672: "COMBINING CYRILLIC THOUSAND MILLIONS SIGN", 0xA673: "SLAVONIC ASTERISK", 0xA67C: "COMBINING CYRILLIC KAVYKA", 0xA67D: "COMBINING CYRILLIC PAYEROK", 0xA67E: "CYRILLIC KAVYKA", 0xA67F: "CYRILLIC PAYEROK", 0xA680: "CYRILLIC CAPITAL LETTER DWE", 0xA681: "CYRILLIC SMALL LETTER DWE", 0xA682: "CYRILLIC CAPITAL LETTER DZWE", 0xA683: "CYRILLIC SMALL LETTER DZWE", 0xA684: "CYRILLIC CAPITAL LETTER ZHWE", 0xA685: "CYRILLIC SMALL LETTER ZHWE", 0xA686: "CYRILLIC CAPITAL LETTER CCHE", 0xA687: "CYRILLIC SMALL LETTER CCHE", 0xA688: "CYRILLIC CAPITAL LETTER DZZE", 0xA689: "CYRILLIC SMALL LETTER DZZE", 0xA68A: "CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK", 0xA68B: "CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK", 0xA68C: "CYRILLIC CAPITAL LETTER TWE", 0xA68D: "CYRILLIC SMALL LETTER TWE", 0xA68E: "CYRILLIC CAPITAL LETTER TSWE", 0xA68F: "CYRILLIC SMALL LETTER TSWE", 0xA690: "CYRILLIC CAPITAL LETTER TSSE", 0xA691: "CYRILLIC SMALL LETTER TSSE", 0xA692: "CYRILLIC CAPITAL LETTER TCHE", 0xA693: "CYRILLIC SMALL LETTER TCHE", 0xA694: "CYRILLIC CAPITAL LETTER HWE", 0xA695: "CYRILLIC SMALL LETTER HWE", 0xA696: "CYRILLIC CAPITAL LETTER SHWE", 0xA697: "CYRILLIC SMALL LETTER SHWE", 0xA700: "MODIFIER LETTER CHINESE TONE YIN PING", 0xA701: "MODIFIER LETTER CHINESE TONE YANG PING", 0xA702: "MODIFIER LETTER CHINESE TONE YIN SHANG", 0xA703: "MODIFIER LETTER CHINESE TONE YANG SHANG", 0xA704: "MODIFIER LETTER CHINESE TONE YIN QU", 0xA705: "MODIFIER LETTER CHINESE TONE YANG QU", 0xA706: "MODIFIER LETTER CHINESE TONE YIN RU", 0xA707: "MODIFIER LETTER CHINESE TONE YANG RU", 0xA708: "MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR", 0xA709: "MODIFIER LETTER HIGH DOTTED TONE BAR", 0xA70A: "MODIFIER LETTER MID DOTTED TONE BAR", 0xA70B: "MODIFIER LETTER LOW DOTTED TONE BAR", 0xA70C: "MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR", 0xA70D: "MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR", 0xA70E: "MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR", 0xA70F: "MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR", 0xA710: "MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR", 0xA711: "MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR", 0xA712: "MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR", 0xA713: "MODIFIER LETTER HIGH LEFT-STEM TONE BAR", 0xA714: "MODIFIER LETTER MID LEFT-STEM TONE BAR", 0xA715: "MODIFIER LETTER LOW LEFT-STEM TONE BAR", 0xA716: "MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR", 0xA717: "MODIFIER LETTER DOT VERTICAL BAR", 0xA718: "MODIFIER LETTER DOT SLASH", 0xA719: "MODIFIER LETTER DOT HORIZONTAL BAR", 0xA71A: "MODIFIER LETTER LOWER RIGHT CORNER ANGLE", 0xA71B: "MODIFIER LETTER RAISED UP ARROW", 0xA71C: "MODIFIER LETTER RAISED DOWN ARROW", 0xA71D: "MODIFIER LETTER RAISED EXCLAMATION MARK", 0xA71E: "MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK", 0xA71F: "MODIFIER LETTER LOW INVERTED EXCLAMATION MARK", 0xA720: "MODIFIER LETTER STRESS AND HIGH TONE", 0xA721: "MODIFIER LETTER STRESS AND LOW TONE", 0xA722: "LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF", 0xA723: "LATIN SMALL LETTER EGYPTOLOGICAL ALEF", 0xA724: "LATIN CAPITAL LETTER EGYPTOLOGICAL AIN", 0xA725: "LATIN SMALL LETTER EGYPTOLOGICAL AIN", 0xA726: "LATIN CAPITAL LETTER HENG", 0xA727: "LATIN SMALL LETTER HENG", 0xA728: "LATIN CAPITAL LETTER TZ", 0xA729: "LATIN SMALL LETTER TZ", 0xA72A: "LATIN CAPITAL LETTER TRESILLO", 0xA72B: "LATIN SMALL LETTER TRESILLO", 0xA72C: "LATIN CAPITAL LETTER CUATRILLO", 0xA72D: "LATIN SMALL LETTER CUATRILLO", 0xA72E: "LATIN CAPITAL LETTER CUATRILLO WITH COMMA", 0xA72F: "LATIN SMALL LETTER CUATRILLO WITH COMMA", 0xA730: "LATIN LETTER SMALL CAPITAL F", 0xA731: "LATIN LETTER SMALL CAPITAL S", 0xA732: "LATIN CAPITAL LETTER AA", 0xA733: "LATIN SMALL LETTER AA", 0xA734: "LATIN CAPITAL LETTER AO", 0xA735: "LATIN SMALL LETTER AO", 0xA736: "LATIN CAPITAL LETTER AU", 0xA737: "LATIN SMALL LETTER AU", 0xA738: "LATIN CAPITAL LETTER AV", 0xA739: "LATIN SMALL LETTER AV", 0xA73A: "LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR", 0xA73B: "LATIN SMALL LETTER AV WITH HORIZONTAL BAR", 0xA73C: "LATIN CAPITAL LETTER AY", 0xA73D: "LATIN SMALL LETTER AY", 0xA73E: "LATIN CAPITAL LETTER REVERSED C WITH DOT", 0xA73F: "LATIN SMALL LETTER REVERSED C WITH DOT", 0xA740: "LATIN CAPITAL LETTER K WITH STROKE", 0xA741: "LATIN SMALL LETTER K WITH STROKE", 0xA742: "LATIN CAPITAL LETTER K WITH DIAGONAL STROKE", 0xA743: "LATIN SMALL LETTER K WITH DIAGONAL STROKE", 0xA744: "LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE", 0xA745: "LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE", 0xA746: "LATIN CAPITAL LETTER BROKEN L", 0xA747: "LATIN SMALL LETTER BROKEN L", 0xA748: "LATIN CAPITAL LETTER L WITH HIGH STROKE", 0xA749: "LATIN SMALL LETTER L WITH HIGH STROKE", 0xA74A: "LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY", 0xA74B: "LATIN SMALL LETTER O WITH LONG STROKE OVERLAY", 0xA74C: "LATIN CAPITAL LETTER O WITH LOOP", 0xA74D: "LATIN SMALL LETTER O WITH LOOP", 0xA74E: "LATIN CAPITAL LETTER OO", 0xA74F: "LATIN SMALL LETTER OO", 0xA750: "LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER", 0xA751: "LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER", 0xA752: "LATIN CAPITAL LETTER P WITH FLOURISH", 0xA753: "LATIN SMALL LETTER P WITH FLOURISH", 0xA754: "LATIN CAPITAL LETTER P WITH SQUIRREL TAIL", 0xA755: "LATIN SMALL LETTER P WITH SQUIRREL TAIL", 0xA756: "LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER", 0xA757: "LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER", 0xA758: "LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE", 0xA759: "LATIN SMALL LETTER Q WITH DIAGONAL STROKE", 0xA75A: "LATIN CAPITAL LETTER R ROTUNDA", 0xA75B: "LATIN SMALL LETTER R ROTUNDA", 0xA75C: "LATIN CAPITAL LETTER RUM ROTUNDA", 0xA75D: "LATIN SMALL LETTER RUM ROTUNDA", 0xA75E: "LATIN CAPITAL LETTER V WITH DIAGONAL STROKE", 0xA75F: "LATIN SMALL LETTER V WITH DIAGONAL STROKE", 0xA760: "LATIN CAPITAL LETTER VY", 0xA761: "LATIN SMALL LETTER VY", 0xA762: "LATIN CAPITAL LETTER VISIGOTHIC Z", 0xA763: "LATIN SMALL LETTER VISIGOTHIC Z", 0xA764: "LATIN CAPITAL LETTER THORN WITH STROKE", 0xA765: "LATIN SMALL LETTER THORN WITH STROKE", 0xA766: "LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER", 0xA767: "LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER", 0xA768: "LATIN CAPITAL LETTER VEND", 0xA769: "LATIN SMALL LETTER VEND", 0xA76A: "LATIN CAPITAL LETTER ET", 0xA76B: "LATIN SMALL LETTER ET", 0xA76C: "LATIN CAPITAL LETTER IS", 0xA76D: "LATIN SMALL LETTER IS", 0xA76E: "LATIN CAPITAL LETTER CON", 0xA76F: "LATIN SMALL LETTER CON", 0xA770: "MODIFIER LETTER US", 0xA771: "LATIN SMALL LETTER DUM", 0xA772: "LATIN SMALL LETTER LUM", 0xA773: "LATIN SMALL LETTER MUM", 0xA774: "LATIN SMALL LETTER NUM", 0xA775: "LATIN SMALL LETTER RUM", 0xA776: "LATIN LETTER SMALL CAPITAL RUM", 0xA777: "LATIN SMALL LETTER TUM", 0xA778: "LATIN SMALL LETTER UM", 0xA779: "LATIN CAPITAL LETTER INSULAR D", 0xA77A: "LATIN SMALL LETTER INSULAR D", 0xA77B: "LATIN CAPITAL LETTER INSULAR F", 0xA77C: "LATIN SMALL LETTER INSULAR F", 0xA77D: "LATIN CAPITAL LETTER INSULAR G", 0xA77E: "LATIN CAPITAL LETTER TURNED INSULAR G", 0xA77F: "LATIN SMALL LETTER TURNED INSULAR G", 0xA780: "LATIN CAPITAL LETTER TURNED L", 0xA781: "LATIN SMALL LETTER TURNED L", 0xA782: "LATIN CAPITAL LETTER INSULAR R", 0xA783: "LATIN SMALL LETTER INSULAR R", 0xA784: "LATIN CAPITAL LETTER INSULAR S", 0xA785: "LATIN SMALL LETTER INSULAR S", 0xA786: "LATIN CAPITAL LETTER INSULAR T", 0xA787: "LATIN SMALL LETTER INSULAR T", 0xA788: "MODIFIER LETTER LOW CIRCUMFLEX ACCENT", 0xA789: "MODIFIER LETTER COLON", 0xA78A: "MODIFIER LETTER SHORT EQUALS SIGN", 0xA78B: "LATIN CAPITAL LETTER SALTILLO", 0xA78C: "LATIN SMALL LETTER SALTILLO", 0xA7FB: "LATIN EPIGRAPHIC LETTER REVERSED F", 0xA7FC: "LATIN EPIGRAPHIC LETTER REVERSED P", 0xA7FD: "LATIN EPIGRAPHIC LETTER INVERTED M", 0xA7FE: "LATIN EPIGRAPHIC LETTER I LONGA", 0xA7FF: "LATIN EPIGRAPHIC LETTER ARCHAIC M", 0xA800: "SYLOTI NAGRI LETTER A", 0xA801: "SYLOTI NAGRI LETTER I", 0xA802: "SYLOTI NAGRI SIGN DVISVARA", 0xA803: "SYLOTI NAGRI LETTER U", 0xA804: "SYLOTI NAGRI LETTER E", 0xA805: "SYLOTI NAGRI LETTER O", 0xA806: "SYLOTI NAGRI SIGN HASANTA", 0xA807: "SYLOTI NAGRI LETTER KO", 0xA808: "SYLOTI NAGRI LETTER KHO", 0xA809: "SYLOTI NAGRI LETTER GO", 0xA80A: "SYLOTI NAGRI LETTER GHO", 0xA80B: "SYLOTI NAGRI SIGN ANUSVARA", 0xA80C: "SYLOTI NAGRI LETTER CO", 0xA80D: "SYLOTI NAGRI LETTER CHO", 0xA80E: "SYLOTI NAGRI LETTER JO", 0xA80F: "SYLOTI NAGRI LETTER JHO", 0xA810: "SYLOTI NAGRI LETTER TTO", 0xA811: "SYLOTI NAGRI LETTER TTHO", 0xA812: "SYLOTI NAGRI LETTER DDO", 0xA813: "SYLOTI NAGRI LETTER DDHO", 0xA814: "SYLOTI NAGRI LETTER TO", 0xA815: "SYLOTI NAGRI LETTER THO", 0xA816: "SYLOTI NAGRI LETTER DO", 0xA817: "SYLOTI NAGRI LETTER DHO", 0xA818: "SYLOTI NAGRI LETTER NO", 0xA819: "SYLOTI NAGRI LETTER PO", 0xA81A: "SYLOTI NAGRI LETTER PHO", 0xA81B: "SYLOTI NAGRI LETTER BO", 0xA81C: "SYLOTI NAGRI LETTER BHO", 0xA81D: "SYLOTI NAGRI LETTER MO", 0xA81E: "SYLOTI NAGRI LETTER RO", 0xA81F: "SYLOTI NAGRI LETTER LO", 0xA820: "SYLOTI NAGRI LETTER RRO", 0xA821: "SYLOTI NAGRI LETTER SO", 0xA822: "SYLOTI NAGRI LETTER HO", 0xA823: "SYLOTI NAGRI VOWEL SIGN A", 0xA824: "SYLOTI NAGRI VOWEL SIGN I", 0xA825: "SYLOTI NAGRI VOWEL SIGN U", 0xA826: "SYLOTI NAGRI VOWEL SIGN E", 0xA827: "SYLOTI NAGRI VOWEL SIGN OO", 0xA828: "SYLOTI NAGRI POETRY MARK-1", 0xA829: "SYLOTI NAGRI POETRY MARK-2", 0xA82A: "SYLOTI NAGRI POETRY MARK-3", 0xA82B: "SYLOTI NAGRI POETRY MARK-4", 0xA840: "PHAGS-PA LETTER KA", 0xA841: "PHAGS-PA LETTER KHA", 0xA842: "PHAGS-PA LETTER GA", 0xA843: "PHAGS-PA LETTER NGA", 0xA844: "PHAGS-PA LETTER CA", 0xA845: "PHAGS-PA LETTER CHA", 0xA846: "PHAGS-PA LETTER JA", 0xA847: "PHAGS-PA LETTER NYA", 0xA848: "PHAGS-PA LETTER TA", 0xA849: "PHAGS-PA LETTER THA", 0xA84A: "PHAGS-PA LETTER DA", 0xA84B: "PHAGS-PA LETTER NA", 0xA84C: "PHAGS-PA LETTER PA", 0xA84D: "PHAGS-PA LETTER PHA", 0xA84E: "PHAGS-PA LETTER BA", 0xA84F: "PHAGS-PA LETTER MA", 0xA850: "PHAGS-PA LETTER TSA", 0xA851: "PHAGS-PA LETTER TSHA", 0xA852: "PHAGS-PA LETTER DZA", 0xA853: "PHAGS-PA LETTER WA", 0xA854: "PHAGS-PA LETTER ZHA", 0xA855: "PHAGS-PA LETTER ZA", 0xA856: "PHAGS-PA LETTER SMALL A", 0xA857: "PHAGS-PA LETTER YA", 0xA858: "PHAGS-PA LETTER RA", 0xA859: "PHAGS-PA LETTER LA", 0xA85A: "PHAGS-PA LETTER SHA", 0xA85B: "PHAGS-PA LETTER SA", 0xA85C: "PHAGS-PA LETTER HA", 0xA85D: "PHAGS-PA LETTER A", 0xA85E: "PHAGS-PA LETTER I", 0xA85F: "PHAGS-PA LETTER U", 0xA860: "PHAGS-PA LETTER E", 0xA861: "PHAGS-PA LETTER O", 0xA862: "PHAGS-PA LETTER QA", 0xA863: "PHAGS-PA LETTER XA", 0xA864: "PHAGS-PA LETTER FA", 0xA865: "PHAGS-PA LETTER GGA", 0xA866: "PHAGS-PA LETTER EE", 0xA867: "PHAGS-PA SUBJOINED LETTER WA", 0xA868: "PHAGS-PA SUBJOINED LETTER YA", 0xA869: "PHAGS-PA LETTER TTA", 0xA86A: "PHAGS-PA LETTER TTHA", 0xA86B: "PHAGS-PA LETTER DDA", 0xA86C: "PHAGS-PA LETTER NNA", 0xA86D: "PHAGS-PA LETTER ALTERNATE YA", 0xA86E: "PHAGS-PA LETTER VOICELESS SHA", 0xA86F: "PHAGS-PA LETTER VOICED HA", 0xA870: "PHAGS-PA LETTER ASPIRATED FA", 0xA871: "PHAGS-PA SUBJOINED LETTER RA", 0xA872: "PHAGS-PA SUPERFIXED LETTER RA", 0xA873: "PHAGS-PA LETTER CANDRABINDU", 0xA874: "PHAGS-PA SINGLE HEAD MARK", 0xA875: "PHAGS-PA DOUBLE HEAD MARK", 0xA876: "PHAGS-PA MARK SHAD", 0xA877: "PHAGS-PA MARK DOUBLE SHAD", 0xA880: "SAURASHTRA SIGN ANUSVARA", 0xA881: "SAURASHTRA SIGN VISARGA", 0xA882: "SAURASHTRA LETTER A", 0xA883: "SAURASHTRA LETTER AA", 0xA884: "SAURASHTRA LETTER I", 0xA885: "SAURASHTRA LETTER II", 0xA886: "SAURASHTRA LETTER U", 0xA887: "SAURASHTRA LETTER UU", 0xA888: "SAURASHTRA LETTER VOCALIC R", 0xA889: "SAURASHTRA LETTER VOCALIC RR", 0xA88A: "SAURASHTRA LETTER VOCALIC L", 0xA88B: "SAURASHTRA LETTER VOCALIC LL", 0xA88C: "SAURASHTRA LETTER E", 0xA88D: "SAURASHTRA LETTER EE", 0xA88E: "SAURASHTRA LETTER AI", 0xA88F: "SAURASHTRA LETTER O", 0xA890: "SAURASHTRA LETTER OO", 0xA891: "SAURASHTRA LETTER AU", 0xA892: "SAURASHTRA LETTER KA", 0xA893: "SAURASHTRA LETTER KHA", 0xA894: "SAURASHTRA LETTER GA", 0xA895: "SAURASHTRA LETTER GHA", 0xA896: "SAURASHTRA LETTER NGA", 0xA897: "SAURASHTRA LETTER CA", 0xA898: "SAURASHTRA LETTER CHA", 0xA899: "SAURASHTRA LETTER JA", 0xA89A: "SAURASHTRA LETTER JHA", 0xA89B: "SAURASHTRA LETTER NYA", 0xA89C: "SAURASHTRA LETTER TTA", 0xA89D: "SAURASHTRA LETTER TTHA", 0xA89E: "SAURASHTRA LETTER DDA", 0xA89F: "SAURASHTRA LETTER DDHA", 0xA8A0: "SAURASHTRA LETTER NNA", 0xA8A1: "SAURASHTRA LETTER TA", 0xA8A2: "SAURASHTRA LETTER THA", 0xA8A3: "SAURASHTRA LETTER DA", 0xA8A4: "SAURASHTRA LETTER DHA", 0xA8A5: "SAURASHTRA LETTER NA", 0xA8A6: "SAURASHTRA LETTER PA", 0xA8A7: "SAURASHTRA LETTER PHA", 0xA8A8: "SAURASHTRA LETTER BA", 0xA8A9: "SAURASHTRA LETTER BHA", 0xA8AA: "SAURASHTRA LETTER MA", 0xA8AB: "SAURASHTRA LETTER YA", 0xA8AC: "SAURASHTRA LETTER RA", 0xA8AD: "SAURASHTRA LETTER LA", 0xA8AE: "SAURASHTRA LETTER VA", 0xA8AF: "SAURASHTRA LETTER SHA", 0xA8B0: "SAURASHTRA LETTER SSA", 0xA8B1: "SAURASHTRA LETTER SA", 0xA8B2: "SAURASHTRA LETTER HA", 0xA8B3: "SAURASHTRA LETTER LLA", 0xA8B4: "SAURASHTRA CONSONANT SIGN HAARU", 0xA8B5: "SAURASHTRA VOWEL SIGN AA", 0xA8B6: "SAURASHTRA VOWEL SIGN I", 0xA8B7: "SAURASHTRA VOWEL SIGN II", 0xA8B8: "SAURASHTRA VOWEL SIGN U", 0xA8B9: "SAURASHTRA VOWEL SIGN UU", 0xA8BA: "SAURASHTRA VOWEL SIGN VOCALIC R", 0xA8BB: "SAURASHTRA VOWEL SIGN VOCALIC RR", 0xA8BC: "SAURASHTRA VOWEL SIGN VOCALIC L", 0xA8BD: "SAURASHTRA VOWEL SIGN VOCALIC LL", 0xA8BE: "SAURASHTRA VOWEL SIGN E", 0xA8BF: "SAURASHTRA VOWEL SIGN EE", 0xA8C0: "SAURASHTRA VOWEL SIGN AI", 0xA8C1: "SAURASHTRA VOWEL SIGN O", 0xA8C2: "SAURASHTRA VOWEL SIGN OO", 0xA8C3: "SAURASHTRA VOWEL SIGN AU", 0xA8C4: "SAURASHTRA SIGN VIRAMA", 0xA8CE: "SAURASHTRA DANDA", 0xA8CF: "SAURASHTRA DOUBLE DANDA", 0xA8D0: "SAURASHTRA DIGIT ZERO", 0xA8D1: "SAURASHTRA DIGIT ONE", 0xA8D2: "SAURASHTRA DIGIT TWO", 0xA8D3: "SAURASHTRA DIGIT THREE", 0xA8D4: "SAURASHTRA DIGIT FOUR", 0xA8D5: "SAURASHTRA DIGIT FIVE", 0xA8D6: "SAURASHTRA DIGIT SIX", 0xA8D7: "SAURASHTRA DIGIT SEVEN", 0xA8D8: "SAURASHTRA DIGIT EIGHT", 0xA8D9: "SAURASHTRA DIGIT NINE", 0xA900: "KAYAH LI DIGIT ZERO", 0xA901: "KAYAH LI DIGIT ONE", 0xA902: "KAYAH LI DIGIT TWO", 0xA903: "KAYAH LI DIGIT THREE", 0xA904: "KAYAH LI DIGIT FOUR", 0xA905: "KAYAH LI DIGIT FIVE", 0xA906: "KAYAH LI DIGIT SIX", 0xA907: "KAYAH LI DIGIT SEVEN", 0xA908: "KAYAH LI DIGIT EIGHT", 0xA909: "KAYAH LI DIGIT NINE", 0xA90A: "KAYAH LI LETTER KA", 0xA90B: "KAYAH LI LETTER KHA", 0xA90C: "KAYAH LI LETTER GA", 0xA90D: "KAYAH LI LETTER NGA", 0xA90E: "KAYAH LI LETTER SA", 0xA90F: "KAYAH LI LETTER SHA", 0xA910: "KAYAH LI LETTER ZA", 0xA911: "KAYAH LI LETTER NYA", 0xA912: "KAYAH LI LETTER TA", 0xA913: "KAYAH LI LETTER HTA", 0xA914: "KAYAH LI LETTER NA", 0xA915: "KAYAH LI LETTER PA", 0xA916: "KAYAH LI LETTER PHA", 0xA917: "KAYAH LI LETTER MA", 0xA918: "KAYAH LI LETTER DA", 0xA919: "KAYAH LI LETTER BA", 0xA91A: "KAYAH LI LETTER RA", 0xA91B: "KAYAH LI LETTER YA", 0xA91C: "KAYAH LI LETTER LA", 0xA91D: "KAYAH LI LETTER WA", 0xA91E: "KAYAH LI LETTER THA", 0xA91F: "KAYAH LI LETTER HA", 0xA920: "KAYAH LI LETTER VA", 0xA921: "KAYAH LI LETTER CA", 0xA922: "KAYAH LI LETTER A", 0xA923: "KAYAH LI LETTER OE", 0xA924: "KAYAH LI LETTER I", 0xA925: "KAYAH LI LETTER OO", 0xA926: "KAYAH LI VOWEL UE", 0xA927: "KAYAH LI VOWEL E", 0xA928: "KAYAH LI VOWEL U", 0xA929: "KAYAH LI VOWEL EE", 0xA92A: "KAYAH LI VOWEL O", 0xA92B: "KAYAH LI TONE PLOPHU", 0xA92C: "KAYAH LI TONE CALYA", 0xA92D: "KAYAH LI TONE CALYA PLOPHU", 0xA92E: "KAYAH LI SIGN CWI", 0xA92F: "KAYAH LI SIGN SHYA", 0xA930: "REJANG LETTER KA", 0xA931: "REJANG LETTER GA", 0xA932: "REJANG LETTER NGA", 0xA933: "REJANG LETTER TA", 0xA934: "REJANG LETTER DA", 0xA935: "REJANG LETTER NA", 0xA936: "REJANG LETTER PA", 0xA937: "REJANG LETTER BA", 0xA938: "REJANG LETTER MA", 0xA939: "REJANG LETTER CA", 0xA93A: "REJANG LETTER JA", 0xA93B: "REJANG LETTER NYA", 0xA93C: "REJANG LETTER SA", 0xA93D: "REJANG LETTER RA", 0xA93E: "REJANG LETTER LA", 0xA93F: "REJANG LETTER YA", 0xA940: "REJANG LETTER WA", 0xA941: "REJANG LETTER HA", 0xA942: "REJANG LETTER MBA", 0xA943: "REJANG LETTER NGGA", 0xA944: "REJANG LETTER NDA", 0xA945: "REJANG LETTER NYJA", 0xA946: "REJANG LETTER A", 0xA947: "REJANG VOWEL SIGN I", 0xA948: "REJANG VOWEL SIGN U", 0xA949: "REJANG VOWEL SIGN E", 0xA94A: "REJANG VOWEL SIGN AI", 0xA94B: "REJANG VOWEL SIGN O", 0xA94C: "REJANG VOWEL SIGN AU", 0xA94D: "REJANG VOWEL SIGN EU", 0xA94E: "REJANG VOWEL SIGN EA", 0xA94F: "REJANG CONSONANT SIGN NG", 0xA950: "REJANG CONSONANT SIGN N", 0xA951: "REJANG CONSONANT SIGN R", 0xA952: "REJANG CONSONANT SIGN H", 0xA953: "REJANG VIRAMA", 0xA95F: "REJANG SECTION MARK", 0xAA00: "CHAM LETTER A", 0xAA01: "CHAM LETTER I", 0xAA02: "CHAM LETTER U", 0xAA03: "CHAM LETTER E", 0xAA04: "CHAM LETTER AI", 0xAA05: "CHAM LETTER O", 0xAA06: "CHAM LETTER KA", 0xAA07: "CHAM LETTER KHA", 0xAA08: "CHAM LETTER GA", 0xAA09: "CHAM LETTER GHA", 0xAA0A: "CHAM LETTER NGUE", 0xAA0B: "CHAM LETTER NGA", 0xAA0C: "CHAM LETTER CHA", 0xAA0D: "CHAM LETTER CHHA", 0xAA0E: "CHAM LETTER JA", 0xAA0F: "CHAM LETTER JHA", 0xAA10: "CHAM LETTER NHUE", 0xAA11: "CHAM LETTER NHA", 0xAA12: "CHAM LETTER NHJA", 0xAA13: "CHAM LETTER TA", 0xAA14: "CHAM LETTER THA", 0xAA15: "CHAM LETTER DA", 0xAA16: "CHAM LETTER DHA", 0xAA17: "CHAM LETTER NUE", 0xAA18: "CHAM LETTER NA", 0xAA19: "CHAM LETTER DDA", 0xAA1A: "CHAM LETTER PA", 0xAA1B: "CHAM LETTER PPA", 0xAA1C: "CHAM LETTER PHA", 0xAA1D: "CHAM LETTER BA", 0xAA1E: "CHAM LETTER BHA", 0xAA1F: "CHAM LETTER MUE", 0xAA20: "CHAM LETTER MA", 0xAA21: "CHAM LETTER BBA", 0xAA22: "CHAM LETTER YA", 0xAA23: "CHAM LETTER RA", 0xAA24: "CHAM LETTER LA", 0xAA25: "CHAM LETTER VA", 0xAA26: "CHAM LETTER SSA", 0xAA27: "CHAM LETTER SA", 0xAA28: "CHAM LETTER HA", 0xAA29: "CHAM VOWEL SIGN AA", 0xAA2A: "CHAM VOWEL SIGN I", 0xAA2B: "CHAM VOWEL SIGN II", 0xAA2C: "CHAM VOWEL SIGN EI", 0xAA2D: "CHAM VOWEL SIGN U", 0xAA2E: "CHAM VOWEL SIGN OE", 0xAA2F: "CHAM VOWEL SIGN O", 0xAA30: "CHAM VOWEL SIGN AI", 0xAA31: "CHAM VOWEL SIGN AU", 0xAA32: "CHAM VOWEL SIGN UE", 0xAA33: "CHAM CONSONANT SIGN YA", 0xAA34: "CHAM CONSONANT SIGN RA", 0xAA35: "CHAM CONSONANT SIGN LA", 0xAA36: "CHAM CONSONANT SIGN WA", 0xAA40: "CHAM LETTER FINAL K", 0xAA41: "CHAM LETTER FINAL G", 0xAA42: "CHAM LETTER FINAL NG", 0xAA43: "CHAM CONSONANT SIGN FINAL NG", 0xAA44: "CHAM LETTER FINAL CH", 0xAA45: "CHAM LETTER FINAL T", 0xAA46: "CHAM LETTER FINAL N", 0xAA47: "CHAM LETTER FINAL P", 0xAA48: "CHAM LETTER FINAL Y", 0xAA49: "CHAM LETTER FINAL R", 0xAA4A: "CHAM LETTER FINAL L", 0xAA4B: "CHAM LETTER FINAL SS", 0xAA4C: "CHAM CONSONANT SIGN FINAL M", 0xAA4D: "CHAM CONSONANT SIGN FINAL H", 0xAA50: "CHAM DIGIT ZERO", 0xAA51: "CHAM DIGIT ONE", 0xAA52: "CHAM DIGIT TWO", 0xAA53: "CHAM DIGIT THREE", 0xAA54: "CHAM DIGIT FOUR", 0xAA55: "CHAM DIGIT FIVE", 0xAA56: "CHAM DIGIT SIX", 0xAA57: "CHAM DIGIT SEVEN", 0xAA58: "CHAM DIGIT EIGHT", 0xAA59: "CHAM DIGIT NINE", 0xAA5C: "CHAM PUNCTUATION SPIRAL", 0xAA5D: "CHAM PUNCTUATION DANDA", 0xAA5E: "CHAM PUNCTUATION DOUBLE DANDA", 0xAA5F: "CHAM PUNCTUATION TRIPLE DANDA", 0xAC00: "HANGUL SYLLABLE GA", 0xAC1C: "HANGUL SYLLABLE GAE", 0xAC38: "HANGUL SYLLABLE GYA", 0xAC54: "HANGUL SYLLABLE GYAE", 0xAC70: "HANGUL SYLLABLE GEO", 0xAC8C: "HANGUL SYLLABLE GE", 0xACA8: "HANGUL SYLLABLE GYEO", 0xACC4: "HANGUL SYLLABLE GYE", 0xACE0: "HANGUL SYLLABLE GO", 0xACFC: "HANGUL SYLLABLE GWA", 0xAD18: "HANGUL SYLLABLE GWAE", 0xAD34: "HANGUL SYLLABLE GOE", 0xAD50: "HANGUL SYLLABLE GYO", 0xAD6C: "HANGUL SYLLABLE GU", 0xAD88: "HANGUL SYLLABLE GWEO", 0xADA4: "HANGUL SYLLABLE GWE", 0xADC0: "HANGUL SYLLABLE GWI", 0xADDC: "HANGUL SYLLABLE GYU", 0xADF8: "HANGUL SYLLABLE GEU", 0xAE14: "HANGUL SYLLABLE GYI", 0xAE30: "HANGUL SYLLABLE GI", 0xAE4C: "HANGUL SYLLABLE GGA", 0xAE68: "HANGUL SYLLABLE GGAE", 0xAE84: "HANGUL SYLLABLE GGYA", 0xAEA0: "HANGUL SYLLABLE GGYAE", 0xAEBC: "HANGUL SYLLABLE GGEO", 0xAED8: "HANGUL SYLLABLE GGE", 0xAEF4: "HANGUL SYLLABLE GGYEO", 0xAF10: "HANGUL SYLLABLE GGYE", 0xAF2C: "HANGUL SYLLABLE GGO", 0xAF48: "HANGUL SYLLABLE GGWA", 0xAF64: "HANGUL SYLLABLE GGWAE", 0xAF80: "HANGUL SYLLABLE GGOE", 0xAF9C: "HANGUL SYLLABLE GGYO", 0xAFB8: "HANGUL SYLLABLE GGU", 0xAFD4: "HANGUL SYLLABLE GGWEO", 0xAFF0: "HANGUL SYLLABLE GGWE", 0xB00C: "HANGUL SYLLABLE GGWI", 0xB028: "HANGUL SYLLABLE GGYU", 0xB044: "HANGUL SYLLABLE GGEU", 0xB060: "HANGUL SYLLABLE GGYI", 0xB07C: "HANGUL SYLLABLE GGI", 0xB098: "HANGUL SYLLABLE NA", 0xB0B4: "HANGUL SYLLABLE NAE", 0xB0D0: "HANGUL SYLLABLE NYA", 0xB0EC: "HANGUL SYLLABLE NYAE", 0xB108: "HANGUL SYLLABLE NEO", 0xB124: "HANGUL SYLLABLE NE", 0xB140: "HANGUL SYLLABLE NYEO", 0xB15C: "HANGUL SYLLABLE NYE", 0xB178: "HANGUL SYLLABLE NO", 0xB194: "HANGUL SYLLABLE NWA", 0xB1B0: "HANGUL SYLLABLE NWAE", 0xB1CC: "HANGUL SYLLABLE NOE", 0xB1E8: "HANGUL SYLLABLE NYO", 0xB204: "HANGUL SYLLABLE NU", 0xB220: "HANGUL SYLLABLE NWEO", 0xB23C: "HANGUL SYLLABLE NWE", 0xB258: "HANGUL SYLLABLE NWI", 0xB274: "HANGUL SYLLABLE NYU", 0xB290: "HANGUL SYLLABLE NEU", 0xB2AC: "HANGUL SYLLABLE NYI", 0xB2C8: "HANGUL SYLLABLE NI", 0xB2E4: "HANGUL SYLLABLE DA", 0xB300: "HANGUL SYLLABLE DAE", 0xB31C: "HANGUL SYLLABLE DYA", 0xB338: "HANGUL SYLLABLE DYAE", 0xB354: "HANGUL SYLLABLE DEO", 0xB370: "HANGUL SYLLABLE DE", 0xB38C: "HANGUL SYLLABLE DYEO", 0xB3A8: "HANGUL SYLLABLE DYE", 0xB3C4: "HANGUL SYLLABLE DO", 0xB3E0: "HANGUL SYLLABLE DWA", 0xB3FC: "HANGUL SYLLABLE DWAE", 0xB418: "HANGUL SYLLABLE DOE", 0xB434: "HANGUL SYLLABLE DYO", 0xB450: "HANGUL SYLLABLE DU", 0xB46C: "HANGUL SYLLABLE DWEO", 0xB488: "HANGUL SYLLABLE DWE", 0xB4A4: "HANGUL SYLLABLE DWI", 0xB4C0: "HANGUL SYLLABLE DYU", 0xB4DC: "HANGUL SYLLABLE DEU", 0xB4F8: "HANGUL SYLLABLE DYI", 0xB514: "HANGUL SYLLABLE DI", 0xB530: "HANGUL SYLLABLE DDA", 0xB54C: "HANGUL SYLLABLE DDAE", 0xB568: "HANGUL SYLLABLE DDYA", 0xB584: "HANGUL SYLLABLE DDYAE", 0xB5A0: "HANGUL SYLLABLE DDEO", 0xB5BC: "HANGUL SYLLABLE DDE", 0xB5D8: "HANGUL SYLLABLE DDYEO", 0xB5F4: "HANGUL SYLLABLE DDYE", 0xB610: "HANGUL SYLLABLE DDO", 0xB62C: "HANGUL SYLLABLE DDWA", 0xB648: "HANGUL SYLLABLE DDWAE", 0xB664: "HANGUL SYLLABLE DDOE", 0xB680: "HANGUL SYLLABLE DDYO", 0xB69C: "HANGUL SYLLABLE DDU", 0xB6B8: "HANGUL SYLLABLE DDWEO", 0xB6D4: "HANGUL SYLLABLE DDWE", 0xB6F0: "HANGUL SYLLABLE DDWI", 0xB70C: "HANGUL SYLLABLE DDYU", 0xB728: "HANGUL SYLLABLE DDEU", 0xB744: "HANGUL SYLLABLE DDYI", 0xB760: "HANGUL SYLLABLE DDI", 0xB77C: "HANGUL SYLLABLE RA", 0xB798: "HANGUL SYLLABLE RAE", 0xB7B4: "HANGUL SYLLABLE RYA", 0xB7D0: "HANGUL SYLLABLE RYAE", 0xB7EC: "HANGUL SYLLABLE REO", 0xB808: "HANGUL SYLLABLE RE", 0xB824: "HANGUL SYLLABLE RYEO", 0xB840: "HANGUL SYLLABLE RYE", 0xB85C: "HANGUL SYLLABLE RO", 0xB878: "HANGUL SYLLABLE RWA", 0xB894: "HANGUL SYLLABLE RWAE", 0xB8B0: "HANGUL SYLLABLE ROE", 0xB8CC: "HANGUL SYLLABLE RYO", 0xB8E8: "HANGUL SYLLABLE RU", 0xB904: "HANGUL SYLLABLE RWEO", 0xB920: "HANGUL SYLLABLE RWE", 0xB93C: "HANGUL SYLLABLE RWI", 0xB958: "HANGUL SYLLABLE RYU", 0xB974: "HANGUL SYLLABLE REU", 0xB990: "HANGUL SYLLABLE RYI", 0xB9AC: "HANGUL SYLLABLE RI", 0xB9C8: "HANGUL SYLLABLE MA", 0xB9E4: "HANGUL SYLLABLE MAE", 0xBA00: "HANGUL SYLLABLE MYA", 0xBA1C: "HANGUL SYLLABLE MYAE", 0xBA38: "HANGUL SYLLABLE MEO", 0xBA54: "HANGUL SYLLABLE ME", 0xBA70: "HANGUL SYLLABLE MYEO", 0xBA8C: "HANGUL SYLLABLE MYE", 0xBAA8: "HANGUL SYLLABLE MO", 0xBAC4: "HANGUL SYLLABLE MWA", 0xBAE0: "HANGUL SYLLABLE MWAE", 0xBAFC: "HANGUL SYLLABLE MOE", 0xBB18: "HANGUL SYLLABLE MYO", 0xBB34: "HANGUL SYLLABLE MU", 0xBB50: "HANGUL SYLLABLE MWEO", 0xBB6C: "HANGUL SYLLABLE MWE", 0xBB88: "HANGUL SYLLABLE MWI", 0xBBA4: "HANGUL SYLLABLE MYU", 0xBBC0: "HANGUL SYLLABLE MEU", 0xBBDC: "HANGUL SYLLABLE MYI", 0xBBF8: "HANGUL SYLLABLE MI", 0xBC14: "HANGUL SYLLABLE BA", 0xBC30: "HANGUL SYLLABLE BAE", 0xBC4C: "HANGUL SYLLABLE BYA", 0xBC68: "HANGUL SYLLABLE BYAE", 0xBC84: "HANGUL SYLLABLE BEO", 0xBCA0: "HANGUL SYLLABLE BE", 0xBCBC: "HANGUL SYLLABLE BYEO", 0xBCD8: "HANGUL SYLLABLE BYE", 0xBCF4: "HANGUL SYLLABLE BO", 0xBD10: "HANGUL SYLLABLE BWA", 0xBD2C: "HANGUL SYLLABLE BWAE", 0xBD48: "HANGUL SYLLABLE BOE", 0xBD64: "HANGUL SYLLABLE BYO", 0xBD80: "HANGUL SYLLABLE BU", 0xBD9C: "HANGUL SYLLABLE BWEO", 0xBDB8: "HANGUL SYLLABLE BWE", 0xBDD4: "HANGUL SYLLABLE BWI", 0xBDF0: "HANGUL SYLLABLE BYU", 0xBE0C: "HANGUL SYLLABLE BEU", 0xBE28: "HANGUL SYLLABLE BYI", 0xBE44: "HANGUL SYLLABLE BI", 0xBE60: "HANGUL SYLLABLE BBA", 0xBE7C: "HANGUL SYLLABLE BBAE", 0xBE98: "HANGUL SYLLABLE BBYA", 0xBEB4: "HANGUL SYLLABLE BBYAE", 0xBED0: "HANGUL SYLLABLE BBEO", 0xBEEC: "HANGUL SYLLABLE BBE", 0xBF08: "HANGUL SYLLABLE BBYEO", 0xBF24: "HANGUL SYLLABLE BBYE", 0xBF40: "HANGUL SYLLABLE BBO", 0xBF5C: "HANGUL SYLLABLE BBWA", 0xBF78: "HANGUL SYLLABLE BBWAE", 0xBF94: "HANGUL SYLLABLE BBOE", 0xBFB0: "HANGUL SYLLABLE BBYO", 0xBFCC: "HANGUL SYLLABLE BBU", 0xBFE8: "HANGUL SYLLABLE BBWEO", 0xC004: "HANGUL SYLLABLE BBWE", 0xC020: "HANGUL SYLLABLE BBWI", 0xC03C: "HANGUL SYLLABLE BBYU", 0xC058: "HANGUL SYLLABLE BBEU", 0xC074: "HANGUL SYLLABLE BBYI", 0xC090: "HANGUL SYLLABLE BBI", 0xC0AC: "HANGUL SYLLABLE SA", 0xC0C8: "HANGUL SYLLABLE SAE", 0xC0E4: "HANGUL SYLLABLE SYA", 0xC100: "HANGUL SYLLABLE SYAE", 0xC11C: "HANGUL SYLLABLE SEO", 0xC138: "HANGUL SYLLABLE SE", 0xC154: "HANGUL SYLLABLE SYEO", 0xC170: "HANGUL SYLLABLE SYE", 0xC18C: "HANGUL SYLLABLE SO", 0xC1A8: "HANGUL SYLLABLE SWA", 0xC1C4: "HANGUL SYLLABLE SWAE", 0xC1E0: "HANGUL SYLLABLE SOE", 0xC1FC: "HANGUL SYLLABLE SYO", 0xC218: "HANGUL SYLLABLE SU", 0xC234: "HANGUL SYLLABLE SWEO", 0xC250: "HANGUL SYLLABLE SWE", 0xC26C: "HANGUL SYLLABLE SWI", 0xC288: "HANGUL SYLLABLE SYU", 0xC2A4: "HANGUL SYLLABLE SEU", 0xC2C0: "HANGUL SYLLABLE SYI", 0xC2DC: "HANGUL SYLLABLE SI", 0xC2F8: "HANGUL SYLLABLE SSA", 0xC314: "HANGUL SYLLABLE SSAE", 0xC330: "HANGUL SYLLABLE SSYA", 0xC34C: "HANGUL SYLLABLE SSYAE", 0xC368: "HANGUL SYLLABLE SSEO", 0xC384: "HANGUL SYLLABLE SSE", 0xC3A0: "HANGUL SYLLABLE SSYEO", 0xC3BC: "HANGUL SYLLABLE SSYE", 0xC3D8: "HANGUL SYLLABLE SSO", 0xC3F4: "HANGUL SYLLABLE SSWA", 0xC410: "HANGUL SYLLABLE SSWAE", 0xC42C: "HANGUL SYLLABLE SSOE", 0xC448: "HANGUL SYLLABLE SSYO", 0xC464: "HANGUL SYLLABLE SSU", 0xC480: "HANGUL SYLLABLE SSWEO", 0xC49C: "HANGUL SYLLABLE SSWE", 0xC4B8: "HANGUL SYLLABLE SSWI", 0xC4D4: "HANGUL SYLLABLE SSYU", 0xC4F0: "HANGUL SYLLABLE SSEU", 0xC50C: "HANGUL SYLLABLE SSYI", 0xC528: "HANGUL SYLLABLE SSI", 0xC544: "HANGUL SYLLABLE A", 0xC560: "HANGUL SYLLABLE AE", 0xC57C: "HANGUL SYLLABLE YA", 0xC598: "HANGUL SYLLABLE YAE", 0xC5B4: "HANGUL SYLLABLE EO", 0xC5D0: "HANGUL SYLLABLE E", 0xC5EC: "HANGUL SYLLABLE YEO", 0xC608: "HANGUL SYLLABLE YE", 0xC624: "HANGUL SYLLABLE O", 0xC640: "HANGUL SYLLABLE WA", 0xC65C: "HANGUL SYLLABLE WAE", 0xC678: "HANGUL SYLLABLE OE", 0xC694: "HANGUL SYLLABLE YO", 0xC6B0: "HANGUL SYLLABLE U", 0xC6CC: "HANGUL SYLLABLE WEO", 0xC6E8: "HANGUL SYLLABLE WE", 0xC704: "HANGUL SYLLABLE WI", 0xC720: "HANGUL SYLLABLE YU", 0xC73C: "HANGUL SYLLABLE EU", 0xC758: "HANGUL SYLLABLE YI", 0xC774: "HANGUL SYLLABLE I", 0xC790: "HANGUL SYLLABLE JA", 0xC7AC: "HANGUL SYLLABLE JAE", 0xC7C8: "HANGUL SYLLABLE JYA", 0xC7E4: "HANGUL SYLLABLE JYAE", 0xC800: "HANGUL SYLLABLE JEO", 0xC81C: "HANGUL SYLLABLE JE", 0xC838: "HANGUL SYLLABLE JYEO", 0xC854: "HANGUL SYLLABLE JYE", 0xC870: "HANGUL SYLLABLE JO", 0xC88C: "HANGUL SYLLABLE JWA", 0xC8A8: "HANGUL SYLLABLE JWAE", 0xC8C4: "HANGUL SYLLABLE JOE", 0xC8E0: "HANGUL SYLLABLE JYO", 0xC8FC: "HANGUL SYLLABLE JU", 0xC918: "HANGUL SYLLABLE JWEO", 0xC934: "HANGUL SYLLABLE JWE", 0xC950: "HANGUL SYLLABLE JWI", 0xC96C: "HANGUL SYLLABLE JYU", 0xC988: "HANGUL SYLLABLE JEU", 0xC9A4: "HANGUL SYLLABLE JYI", 0xC9C0: "HANGUL SYLLABLE JI", 0xC9DC: "HANGUL SYLLABLE JJA", 0xC9F8: "HANGUL SYLLABLE JJAE", 0xCA14: "HANGUL SYLLABLE JJYA", 0xCA30: "HANGUL SYLLABLE JJYAE", 0xCA4C: "HANGUL SYLLABLE JJEO", 0xCA68: "HANGUL SYLLABLE JJE", 0xCA84: "HANGUL SYLLABLE JJYEO", 0xCAA0: "HANGUL SYLLABLE JJYE", 0xCABC: "HANGUL SYLLABLE JJO", 0xCAD8: "HANGUL SYLLABLE JJWA", 0xCAF4: "HANGUL SYLLABLE JJWAE", 0xCB10: "HANGUL SYLLABLE JJOE", 0xCB2C: "HANGUL SYLLABLE JJYO", 0xCB48: "HANGUL SYLLABLE JJU", 0xCB64: "HANGUL SYLLABLE JJWEO", 0xCB80: "HANGUL SYLLABLE JJWE", 0xCB9C: "HANGUL SYLLABLE JJWI", 0xCBB8: "HANGUL SYLLABLE JJYU", 0xCBD4: "HANGUL SYLLABLE JJEU", 0xCBF0: "HANGUL SYLLABLE JJYI", 0xCC0C: "HANGUL SYLLABLE JJI", 0xCC28: "HANGUL SYLLABLE CA", 0xCC44: "HANGUL SYLLABLE CAE", 0xCC60: "HANGUL SYLLABLE CYA", 0xCC7C: "HANGUL SYLLABLE CYAE", 0xCC98: "HANGUL SYLLABLE CEO", 0xCCB4: "HANGUL SYLLABLE CE", 0xCCD0: "HANGUL SYLLABLE CYEO", 0xCCEC: "HANGUL SYLLABLE CYE", 0xCD08: "HANGUL SYLLABLE CO", 0xCD24: "HANGUL SYLLABLE CWA", 0xCD40: "HANGUL SYLLABLE CWAE", 0xCD5C: "HANGUL SYLLABLE COE", 0xCD78: "HANGUL SYLLABLE CYO", 0xCD94: "HANGUL SYLLABLE CU", 0xCDB0: "HANGUL SYLLABLE CWEO", 0xCDCC: "HANGUL SYLLABLE CWE", 0xCDE8: "HANGUL SYLLABLE CWI", 0xCE04: "HANGUL SYLLABLE CYU", 0xCE20: "HANGUL SYLLABLE CEU", 0xCE3C: "HANGUL SYLLABLE CYI", 0xCE58: "HANGUL SYLLABLE CI", 0xCE74: "HANGUL SYLLABLE KA", 0xCE90: "HANGUL SYLLABLE KAE", 0xCEAC: "HANGUL SYLLABLE KYA", 0xCEC8: "HANGUL SYLLABLE KYAE", 0xCEE4: "HANGUL SYLLABLE KEO", 0xCF00: "HANGUL SYLLABLE KE", 0xCF1C: "HANGUL SYLLABLE KYEO", 0xCF38: "HANGUL SYLLABLE KYE", 0xCF54: "HANGUL SYLLABLE KO", 0xCF70: "HANGUL SYLLABLE KWA", 0xCF8C: "HANGUL SYLLABLE KWAE", 0xCFA8: "HANGUL SYLLABLE KOE", 0xCFC4: "HANGUL SYLLABLE KYO", 0xCFE0: "HANGUL SYLLABLE KU", 0xCFFC: "HANGUL SYLLABLE KWEO", 0xD018: "HANGUL SYLLABLE KWE", 0xD034: "HANGUL SYLLABLE KWI", 0xD050: "HANGUL SYLLABLE KYU", 0xD06C: "HANGUL SYLLABLE KEU", 0xD088: "HANGUL SYLLABLE KYI", 0xD0A4: "HANGUL SYLLABLE KI", 0xD0C0: "HANGUL SYLLABLE TA", 0xD0DC: "HANGUL SYLLABLE TAE", 0xD0F8: "HANGUL SYLLABLE TYA", 0xD114: "HANGUL SYLLABLE TYAE", 0xD130: "HANGUL SYLLABLE TEO", 0xD14C: "HANGUL SYLLABLE TE", 0xD168: "HANGUL SYLLABLE TYEO", 0xD184: "HANGUL SYLLABLE TYE", 0xD1A0: "HANGUL SYLLABLE TO", 0xD1BC: "HANGUL SYLLABLE TWA", 0xD1D8: "HANGUL SYLLABLE TWAE", 0xD1F4: "HANGUL SYLLABLE TOE", 0xD210: "HANGUL SYLLABLE TYO", 0xD22C: "HANGUL SYLLABLE TU", 0xD248: "HANGUL SYLLABLE TWEO", 0xD264: "HANGUL SYLLABLE TWE", 0xD280: "HANGUL SYLLABLE TWI", 0xD29C: "HANGUL SYLLABLE TYU", 0xD2B8: "HANGUL SYLLABLE TEU", 0xD2D4: "HANGUL SYLLABLE TYI", 0xD2F0: "HANGUL SYLLABLE TI", 0xD30C: "HANGUL SYLLABLE PA", 0xD328: "HANGUL SYLLABLE PAE", 0xD344: "HANGUL SYLLABLE PYA", 0xD360: "HANGUL SYLLABLE PYAE", 0xD37C: "HANGUL SYLLABLE PEO", 0xD398: "HANGUL SYLLABLE PE", 0xD3B4: "HANGUL SYLLABLE PYEO", 0xD3D0: "HANGUL SYLLABLE PYE", 0xD3EC: "HANGUL SYLLABLE PO", 0xD408: "HANGUL SYLLABLE PWA", 0xD424: "HANGUL SYLLABLE PWAE", 0xD440: "HANGUL SYLLABLE POE", 0xD45C: "HANGUL SYLLABLE PYO", 0xD478: "HANGUL SYLLABLE PU", 0xD494: "HANGUL SYLLABLE PWEO", 0xD4B0: "HANGUL SYLLABLE PWE", 0xD4CC: "HANGUL SYLLABLE PWI", 0xD4E8: "HANGUL SYLLABLE PYU", 0xD504: "HANGUL SYLLABLE PEU", 0xD520: "HANGUL SYLLABLE PYI", 0xD53C: "HANGUL SYLLABLE PI", 0xD558: "HANGUL SYLLABLE HA", 0xD574: "HANGUL SYLLABLE HAE", 0xD590: "HANGUL SYLLABLE HYA", 0xD5AC: "HANGUL SYLLABLE HYAE", 0xD5C8: "HANGUL SYLLABLE HEO", 0xD5E4: "HANGUL SYLLABLE HE", 0xD600: "HANGUL SYLLABLE HYEO", 0xD61C: "HANGUL SYLLABLE HYE", 0xD638: "HANGUL SYLLABLE HO", 0xD654: "HANGUL SYLLABLE HWA", 0xD670: "HANGUL SYLLABLE HWAE", 0xD68C: "HANGUL SYLLABLE HOE", 0xD6A8: "HANGUL SYLLABLE HYO", 0xD6C4: "HANGUL SYLLABLE HU", 0xD6E0: "HANGUL SYLLABLE HWEO", 0xD6FC: "HANGUL SYLLABLE HWE", 0xD718: "HANGUL SYLLABLE HWI", 0xD734: "HANGUL SYLLABLE HYU", 0xD750: "HANGUL SYLLABLE HEU", 0xD76C: "HANGUL SYLLABLE HYI", 0xD788: "HANGUL SYLLABLE HI", 0xF900: "CJK COMPATIBILITY IDEOGRAPH-F900", 0xF901: "CJK COMPATIBILITY IDEOGRAPH-F901", 0xF902: "CJK COMPATIBILITY IDEOGRAPH-F902", 0xF903: "CJK COMPATIBILITY IDEOGRAPH-F903", 0xF904: "CJK COMPATIBILITY IDEOGRAPH-F904", 0xF905: "CJK COMPATIBILITY IDEOGRAPH-F905", 0xF906: "CJK COMPATIBILITY IDEOGRAPH-F906", 0xF907: "CJK COMPATIBILITY IDEOGRAPH-F907", 0xF908: "CJK COMPATIBILITY IDEOGRAPH-F908", 0xF909: "CJK COMPATIBILITY IDEOGRAPH-F909", 0xF90A: "CJK COMPATIBILITY IDEOGRAPH-F90A", 0xF90B: "CJK COMPATIBILITY IDEOGRAPH-F90B", 0xF90C: "CJK COMPATIBILITY IDEOGRAPH-F90C", 0xF90D: "CJK COMPATIBILITY IDEOGRAPH-F90D", 0xF90E: "CJK COMPATIBILITY IDEOGRAPH-F90E", 0xF90F: "CJK COMPATIBILITY IDEOGRAPH-F90F", 0xF910: "CJK COMPATIBILITY IDEOGRAPH-F910", 0xF911: "CJK COMPATIBILITY IDEOGRAPH-F911", 0xF912: "CJK COMPATIBILITY IDEOGRAPH-F912", 0xF913: "CJK COMPATIBILITY IDEOGRAPH-F913", 0xF914: "CJK COMPATIBILITY IDEOGRAPH-F914", 0xF915: "CJK COMPATIBILITY IDEOGRAPH-F915", 0xF916: "CJK COMPATIBILITY IDEOGRAPH-F916", 0xF917: "CJK COMPATIBILITY IDEOGRAPH-F917", 0xF918: "CJK COMPATIBILITY IDEOGRAPH-F918", 0xF919: "CJK COMPATIBILITY IDEOGRAPH-F919", 0xF91A: "CJK COMPATIBILITY IDEOGRAPH-F91A", 0xF91B: "CJK COMPATIBILITY IDEOGRAPH-F91B", 0xF91C: "CJK COMPATIBILITY IDEOGRAPH-F91C", 0xF91D: "CJK COMPATIBILITY IDEOGRAPH-F91D", 0xF91E: "CJK COMPATIBILITY IDEOGRAPH-F91E", 0xF91F: "CJK COMPATIBILITY IDEOGRAPH-F91F", 0xF920: "CJK COMPATIBILITY IDEOGRAPH-F920", 0xF921: "CJK COMPATIBILITY IDEOGRAPH-F921", 0xF922: "CJK COMPATIBILITY IDEOGRAPH-F922", 0xF923: "CJK COMPATIBILITY IDEOGRAPH-F923", 0xF924: "CJK COMPATIBILITY IDEOGRAPH-F924", 0xF925: "CJK COMPATIBILITY IDEOGRAPH-F925", 0xF926: "CJK COMPATIBILITY IDEOGRAPH-F926", 0xF927: "CJK COMPATIBILITY IDEOGRAPH-F927", 0xF928: "CJK COMPATIBILITY IDEOGRAPH-F928", 0xF929: "CJK COMPATIBILITY IDEOGRAPH-F929", 0xF92A: "CJK COMPATIBILITY IDEOGRAPH-F92A", 0xF92B: "CJK COMPATIBILITY IDEOGRAPH-F92B", 0xF92C: "CJK COMPATIBILITY IDEOGRAPH-F92C", 0xF92D: "CJK COMPATIBILITY IDEOGRAPH-F92D", 0xF92E: "CJK COMPATIBILITY IDEOGRAPH-F92E", 0xF92F: "CJK COMPATIBILITY IDEOGRAPH-F92F", 0xF930: "CJK COMPATIBILITY IDEOGRAPH-F930", 0xF931: "CJK COMPATIBILITY IDEOGRAPH-F931", 0xF932: "CJK COMPATIBILITY IDEOGRAPH-F932", 0xF933: "CJK COMPATIBILITY IDEOGRAPH-F933", 0xF934: "CJK COMPATIBILITY IDEOGRAPH-F934", 0xF935: "CJK COMPATIBILITY IDEOGRAPH-F935", 0xF936: "CJK COMPATIBILITY IDEOGRAPH-F936", 0xF937: "CJK COMPATIBILITY IDEOGRAPH-F937", 0xF938: "CJK COMPATIBILITY IDEOGRAPH-F938", 0xF939: "CJK COMPATIBILITY IDEOGRAPH-F939", 0xF93A: "CJK COMPATIBILITY IDEOGRAPH-F93A", 0xF93B: "CJK COMPATIBILITY IDEOGRAPH-F93B", 0xF93C: "CJK COMPATIBILITY IDEOGRAPH-F93C", 0xF93D: "CJK COMPATIBILITY IDEOGRAPH-F93D", 0xF93E: "CJK COMPATIBILITY IDEOGRAPH-F93E", 0xF93F: "CJK COMPATIBILITY IDEOGRAPH-F93F", 0xF940: "CJK COMPATIBILITY IDEOGRAPH-F940", 0xF941: "CJK COMPATIBILITY IDEOGRAPH-F941", 0xF942: "CJK COMPATIBILITY IDEOGRAPH-F942", 0xF943: "CJK COMPATIBILITY IDEOGRAPH-F943", 0xF944: "CJK COMPATIBILITY IDEOGRAPH-F944", 0xF945: "CJK COMPATIBILITY IDEOGRAPH-F945", 0xF946: "CJK COMPATIBILITY IDEOGRAPH-F946", 0xF947: "CJK COMPATIBILITY IDEOGRAPH-F947", 0xF948: "CJK COMPATIBILITY IDEOGRAPH-F948", 0xF949: "CJK COMPATIBILITY IDEOGRAPH-F949", 0xF94A: "CJK COMPATIBILITY IDEOGRAPH-F94A", 0xF94B: "CJK COMPATIBILITY IDEOGRAPH-F94B", 0xF94C: "CJK COMPATIBILITY IDEOGRAPH-F94C", 0xF94D: "CJK COMPATIBILITY IDEOGRAPH-F94D", 0xF94E: "CJK COMPATIBILITY IDEOGRAPH-F94E", 0xF94F: "CJK COMPATIBILITY IDEOGRAPH-F94F", 0xF950: "CJK COMPATIBILITY IDEOGRAPH-F950", 0xF951: "CJK COMPATIBILITY IDEOGRAPH-F951", 0xF952: "CJK COMPATIBILITY IDEOGRAPH-F952", 0xF953: "CJK COMPATIBILITY IDEOGRAPH-F953", 0xF954: "CJK COMPATIBILITY IDEOGRAPH-F954", 0xF955: "CJK COMPATIBILITY IDEOGRAPH-F955", 0xF956: "CJK COMPATIBILITY IDEOGRAPH-F956", 0xF957: "CJK COMPATIBILITY IDEOGRAPH-F957", 0xF958: "CJK COMPATIBILITY IDEOGRAPH-F958", 0xF959: "CJK COMPATIBILITY IDEOGRAPH-F959", 0xF95A: "CJK COMPATIBILITY IDEOGRAPH-F95A", 0xF95B: "CJK COMPATIBILITY IDEOGRAPH-F95B", 0xF95C: "CJK COMPATIBILITY IDEOGRAPH-F95C", 0xF95D: "CJK COMPATIBILITY IDEOGRAPH-F95D", 0xF95E: "CJK COMPATIBILITY IDEOGRAPH-F95E", 0xF95F: "CJK COMPATIBILITY IDEOGRAPH-F95F", 0xF960: "CJK COMPATIBILITY IDEOGRAPH-F960", 0xF961: "CJK COMPATIBILITY IDEOGRAPH-F961", 0xF962: "CJK COMPATIBILITY IDEOGRAPH-F962", 0xF963: "CJK COMPATIBILITY IDEOGRAPH-F963", 0xF964: "CJK COMPATIBILITY IDEOGRAPH-F964", 0xF965: "CJK COMPATIBILITY IDEOGRAPH-F965", 0xF966: "CJK COMPATIBILITY IDEOGRAPH-F966", 0xF967: "CJK COMPATIBILITY IDEOGRAPH-F967", 0xF968: "CJK COMPATIBILITY IDEOGRAPH-F968", 0xF969: "CJK COMPATIBILITY IDEOGRAPH-F969", 0xF96A: "CJK COMPATIBILITY IDEOGRAPH-F96A", 0xF96B: "CJK COMPATIBILITY IDEOGRAPH-F96B", 0xF96C: "CJK COMPATIBILITY IDEOGRAPH-F96C", 0xF96D: "CJK COMPATIBILITY IDEOGRAPH-F96D", 0xF96E: "CJK COMPATIBILITY IDEOGRAPH-F96E", 0xF96F: "CJK COMPATIBILITY IDEOGRAPH-F96F", 0xF970: "CJK COMPATIBILITY IDEOGRAPH-F970", 0xF971: "CJK COMPATIBILITY IDEOGRAPH-F971", 0xF972: "CJK COMPATIBILITY IDEOGRAPH-F972", 0xF973: "CJK COMPATIBILITY IDEOGRAPH-F973", 0xF974: "CJK COMPATIBILITY IDEOGRAPH-F974", 0xF975: "CJK COMPATIBILITY IDEOGRAPH-F975", 0xF976: "CJK COMPATIBILITY IDEOGRAPH-F976", 0xF977: "CJK COMPATIBILITY IDEOGRAPH-F977", 0xF978: "CJK COMPATIBILITY IDEOGRAPH-F978", 0xF979: "CJK COMPATIBILITY IDEOGRAPH-F979", 0xF97A: "CJK COMPATIBILITY IDEOGRAPH-F97A", 0xF97B: "CJK COMPATIBILITY IDEOGRAPH-F97B", 0xF97C: "CJK COMPATIBILITY IDEOGRAPH-F97C", 0xF97D: "CJK COMPATIBILITY IDEOGRAPH-F97D", 0xF97E: "CJK COMPATIBILITY IDEOGRAPH-F97E", 0xF97F: "CJK COMPATIBILITY IDEOGRAPH-F97F", 0xF980: "CJK COMPATIBILITY IDEOGRAPH-F980", 0xF981: "CJK COMPATIBILITY IDEOGRAPH-F981", 0xF982: "CJK COMPATIBILITY IDEOGRAPH-F982", 0xF983: "CJK COMPATIBILITY IDEOGRAPH-F983", 0xF984: "CJK COMPATIBILITY IDEOGRAPH-F984", 0xF985: "CJK COMPATIBILITY IDEOGRAPH-F985", 0xF986: "CJK COMPATIBILITY IDEOGRAPH-F986", 0xF987: "CJK COMPATIBILITY IDEOGRAPH-F987", 0xF988: "CJK COMPATIBILITY IDEOGRAPH-F988", 0xF989: "CJK COMPATIBILITY IDEOGRAPH-F989", 0xF98A: "CJK COMPATIBILITY IDEOGRAPH-F98A", 0xF98B: "CJK COMPATIBILITY IDEOGRAPH-F98B", 0xF98C: "CJK COMPATIBILITY IDEOGRAPH-F98C", 0xF98D: "CJK COMPATIBILITY IDEOGRAPH-F98D", 0xF98E: "CJK COMPATIBILITY IDEOGRAPH-F98E", 0xF98F: "CJK COMPATIBILITY IDEOGRAPH-F98F", 0xF990: "CJK COMPATIBILITY IDEOGRAPH-F990", 0xF991: "CJK COMPATIBILITY IDEOGRAPH-F991", 0xF992: "CJK COMPATIBILITY IDEOGRAPH-F992", 0xF993: "CJK COMPATIBILITY IDEOGRAPH-F993", 0xF994: "CJK COMPATIBILITY IDEOGRAPH-F994", 0xF995: "CJK COMPATIBILITY IDEOGRAPH-F995", 0xF996: "CJK COMPATIBILITY IDEOGRAPH-F996", 0xF997: "CJK COMPATIBILITY IDEOGRAPH-F997", 0xF998: "CJK COMPATIBILITY IDEOGRAPH-F998", 0xF999: "CJK COMPATIBILITY IDEOGRAPH-F999", 0xF99A: "CJK COMPATIBILITY IDEOGRAPH-F99A", 0xF99B: "CJK COMPATIBILITY IDEOGRAPH-F99B", 0xF99C: "CJK COMPATIBILITY IDEOGRAPH-F99C", 0xF99D: "CJK COMPATIBILITY IDEOGRAPH-F99D", 0xF99E: "CJK COMPATIBILITY IDEOGRAPH-F99E", 0xF99F: "CJK COMPATIBILITY IDEOGRAPH-F99F", 0xF9A0: "CJK COMPATIBILITY IDEOGRAPH-F9A0", 0xF9A1: "CJK COMPATIBILITY IDEOGRAPH-F9A1", 0xF9A2: "CJK COMPATIBILITY IDEOGRAPH-F9A2", 0xF9A3: "CJK COMPATIBILITY IDEOGRAPH-F9A3", 0xF9A4: "CJK COMPATIBILITY IDEOGRAPH-F9A4", 0xF9A5: "CJK COMPATIBILITY IDEOGRAPH-F9A5", 0xF9A6: "CJK COMPATIBILITY IDEOGRAPH-F9A6", 0xF9A7: "CJK COMPATIBILITY IDEOGRAPH-F9A7", 0xF9A8: "CJK COMPATIBILITY IDEOGRAPH-F9A8", 0xF9A9: "CJK COMPATIBILITY IDEOGRAPH-F9A9", 0xF9AA: "CJK COMPATIBILITY IDEOGRAPH-F9AA", 0xF9AB: "CJK COMPATIBILITY IDEOGRAPH-F9AB", 0xF9AC: "CJK COMPATIBILITY IDEOGRAPH-F9AC", 0xF9AD: "CJK COMPATIBILITY IDEOGRAPH-F9AD", 0xF9AE: "CJK COMPATIBILITY IDEOGRAPH-F9AE", 0xF9AF: "CJK COMPATIBILITY IDEOGRAPH-F9AF", 0xF9B0: "CJK COMPATIBILITY IDEOGRAPH-F9B0", 0xF9B1: "CJK COMPATIBILITY IDEOGRAPH-F9B1", 0xF9B2: "CJK COMPATIBILITY IDEOGRAPH-F9B2", 0xF9B3: "CJK COMPATIBILITY IDEOGRAPH-F9B3", 0xF9B4: "CJK COMPATIBILITY IDEOGRAPH-F9B4", 0xF9B5: "CJK COMPATIBILITY IDEOGRAPH-F9B5", 0xF9B6: "CJK COMPATIBILITY IDEOGRAPH-F9B6", 0xF9B7: "CJK COMPATIBILITY IDEOGRAPH-F9B7", 0xF9B8: "CJK COMPATIBILITY IDEOGRAPH-F9B8", 0xF9B9: "CJK COMPATIBILITY IDEOGRAPH-F9B9", 0xF9BA: "CJK COMPATIBILITY IDEOGRAPH-F9BA", 0xF9BB: "CJK COMPATIBILITY IDEOGRAPH-F9BB", 0xF9BC: "CJK COMPATIBILITY IDEOGRAPH-F9BC", 0xF9BD: "CJK COMPATIBILITY IDEOGRAPH-F9BD", 0xF9BE: "CJK COMPATIBILITY IDEOGRAPH-F9BE", 0xF9BF: "CJK COMPATIBILITY IDEOGRAPH-F9BF", 0xF9C0: "CJK COMPATIBILITY IDEOGRAPH-F9C0", 0xF9C1: "CJK COMPATIBILITY IDEOGRAPH-F9C1", 0xF9C2: "CJK COMPATIBILITY IDEOGRAPH-F9C2", 0xF9C3: "CJK COMPATIBILITY IDEOGRAPH-F9C3", 0xF9C4: "CJK COMPATIBILITY IDEOGRAPH-F9C4", 0xF9C5: "CJK COMPATIBILITY IDEOGRAPH-F9C5", 0xF9C6: "CJK COMPATIBILITY IDEOGRAPH-F9C6", 0xF9C7: "CJK COMPATIBILITY IDEOGRAPH-F9C7", 0xF9C8: "CJK COMPATIBILITY IDEOGRAPH-F9C8", 0xF9C9: "CJK COMPATIBILITY IDEOGRAPH-F9C9", 0xF9CA: "CJK COMPATIBILITY IDEOGRAPH-F9CA", 0xF9CB: "CJK COMPATIBILITY IDEOGRAPH-F9CB", 0xF9CC: "CJK COMPATIBILITY IDEOGRAPH-F9CC", 0xF9CD: "CJK COMPATIBILITY IDEOGRAPH-F9CD", 0xF9CE: "CJK COMPATIBILITY IDEOGRAPH-F9CE", 0xF9CF: "CJK COMPATIBILITY IDEOGRAPH-F9CF", 0xF9D0: "CJK COMPATIBILITY IDEOGRAPH-F9D0", 0xF9D1: "CJK COMPATIBILITY IDEOGRAPH-F9D1", 0xF9D2: "CJK COMPATIBILITY IDEOGRAPH-F9D2", 0xF9D3: "CJK COMPATIBILITY IDEOGRAPH-F9D3", 0xF9D4: "CJK COMPATIBILITY IDEOGRAPH-F9D4", 0xF9D5: "CJK COMPATIBILITY IDEOGRAPH-F9D5", 0xF9D6: "CJK COMPATIBILITY IDEOGRAPH-F9D6", 0xF9D7: "CJK COMPATIBILITY IDEOGRAPH-F9D7", 0xF9D8: "CJK COMPATIBILITY IDEOGRAPH-F9D8", 0xF9D9: "CJK COMPATIBILITY IDEOGRAPH-F9D9", 0xF9DA: "CJK COMPATIBILITY IDEOGRAPH-F9DA", 0xF9DB: "CJK COMPATIBILITY IDEOGRAPH-F9DB", 0xF9DC: "CJK COMPATIBILITY IDEOGRAPH-F9DC", 0xF9DD: "CJK COMPATIBILITY IDEOGRAPH-F9DD", 0xF9DE: "CJK COMPATIBILITY IDEOGRAPH-F9DE", 0xF9DF: "CJK COMPATIBILITY IDEOGRAPH-F9DF", 0xF9E0: "CJK COMPATIBILITY IDEOGRAPH-F9E0", 0xF9E1: "CJK COMPATIBILITY IDEOGRAPH-F9E1", 0xF9E2: "CJK COMPATIBILITY IDEOGRAPH-F9E2", 0xF9E3: "CJK COMPATIBILITY IDEOGRAPH-F9E3", 0xF9E4: "CJK COMPATIBILITY IDEOGRAPH-F9E4", 0xF9E5: "CJK COMPATIBILITY IDEOGRAPH-F9E5", 0xF9E6: "CJK COMPATIBILITY IDEOGRAPH-F9E6", 0xF9E7: "CJK COMPATIBILITY IDEOGRAPH-F9E7", 0xF9E8: "CJK COMPATIBILITY IDEOGRAPH-F9E8", 0xF9E9: "CJK COMPATIBILITY IDEOGRAPH-F9E9", 0xF9EA: "CJK COMPATIBILITY IDEOGRAPH-F9EA", 0xF9EB: "CJK COMPATIBILITY IDEOGRAPH-F9EB", 0xF9EC: "CJK COMPATIBILITY IDEOGRAPH-F9EC", 0xF9ED: "CJK COMPATIBILITY IDEOGRAPH-F9ED", 0xF9EE: "CJK COMPATIBILITY IDEOGRAPH-F9EE", 0xF9EF: "CJK COMPATIBILITY IDEOGRAPH-F9EF", 0xF9F0: "CJK COMPATIBILITY IDEOGRAPH-F9F0", 0xF9F1: "CJK COMPATIBILITY IDEOGRAPH-F9F1", 0xF9F2: "CJK COMPATIBILITY IDEOGRAPH-F9F2", 0xF9F3: "CJK COMPATIBILITY IDEOGRAPH-F9F3", 0xF9F4: "CJK COMPATIBILITY IDEOGRAPH-F9F4", 0xF9F5: "CJK COMPATIBILITY IDEOGRAPH-F9F5", 0xF9F6: "CJK COMPATIBILITY IDEOGRAPH-F9F6", 0xF9F7: "CJK COMPATIBILITY IDEOGRAPH-F9F7", 0xF9F8: "CJK COMPATIBILITY IDEOGRAPH-F9F8", 0xF9F9: "CJK COMPATIBILITY IDEOGRAPH-F9F9", 0xF9FA: "CJK COMPATIBILITY IDEOGRAPH-F9FA", 0xF9FB: "CJK COMPATIBILITY IDEOGRAPH-F9FB", 0xF9FC: "CJK COMPATIBILITY IDEOGRAPH-F9FC", 0xF9FD: "CJK COMPATIBILITY IDEOGRAPH-F9FD", 0xF9FE: "CJK COMPATIBILITY IDEOGRAPH-F9FE", 0xF9FF: "CJK COMPATIBILITY IDEOGRAPH-F9FF", 0xFA00: "CJK COMPATIBILITY IDEOGRAPH-FA00", 0xFA01: "CJK COMPATIBILITY IDEOGRAPH-FA01", 0xFA02: "CJK COMPATIBILITY IDEOGRAPH-FA02", 0xFA03: "CJK COMPATIBILITY IDEOGRAPH-FA03", 0xFA04: "CJK COMPATIBILITY IDEOGRAPH-FA04", 0xFA05: "CJK COMPATIBILITY IDEOGRAPH-FA05", 0xFA06: "CJK COMPATIBILITY IDEOGRAPH-FA06", 0xFA07: "CJK COMPATIBILITY IDEOGRAPH-FA07", 0xFA08: "CJK COMPATIBILITY IDEOGRAPH-FA08", 0xFA09: "CJK COMPATIBILITY IDEOGRAPH-FA09", 0xFA0A: "CJK COMPATIBILITY IDEOGRAPH-FA0A", 0xFA0B: "CJK COMPATIBILITY IDEOGRAPH-FA0B", 0xFA0C: "CJK COMPATIBILITY IDEOGRAPH-FA0C", 0xFA0D: "CJK COMPATIBILITY IDEOGRAPH-FA0D", 0xFA0E: "CJK COMPATIBILITY IDEOGRAPH-FA0E", 0xFA0F: "CJK COMPATIBILITY IDEOGRAPH-FA0F", 0xFA10: "CJK COMPATIBILITY IDEOGRAPH-FA10", 0xFA11: "CJK COMPATIBILITY IDEOGRAPH-FA11", 0xFA12: "CJK COMPATIBILITY IDEOGRAPH-FA12", 0xFA13: "CJK COMPATIBILITY IDEOGRAPH-FA13", 0xFA14: "CJK COMPATIBILITY IDEOGRAPH-FA14", 0xFA15: "CJK COMPATIBILITY IDEOGRAPH-FA15", 0xFA16: "CJK COMPATIBILITY IDEOGRAPH-FA16", 0xFA17: "CJK COMPATIBILITY IDEOGRAPH-FA17", 0xFA18: "CJK COMPATIBILITY IDEOGRAPH-FA18", 0xFA19: "CJK COMPATIBILITY IDEOGRAPH-FA19", 0xFA1A: "CJK COMPATIBILITY IDEOGRAPH-FA1A", 0xFA1B: "CJK COMPATIBILITY IDEOGRAPH-FA1B", 0xFA1C: "CJK COMPATIBILITY IDEOGRAPH-FA1C", 0xFA1D: "CJK COMPATIBILITY IDEOGRAPH-FA1D", 0xFA1E: "CJK COMPATIBILITY IDEOGRAPH-FA1E", 0xFA1F: "CJK COMPATIBILITY IDEOGRAPH-FA1F *", 0xFA20: "CJK COMPATIBILITY IDEOGRAPH-FA20", 0xFA21: "CJK COMPATIBILITY IDEOGRAPH-FA21", 0xFA22: "CJK COMPATIBILITY IDEOGRAPH-FA22", 0xFA23: "CJK COMPATIBILITY IDEOGRAPH-FA23 *", 0xFA24: "CJK COMPATIBILITY IDEOGRAPH-FA24", 0xFA25: "CJK COMPATIBILITY IDEOGRAPH-FA25", 0xFA26: "CJK COMPATIBILITY IDEOGRAPH-FA26", 0xFA27: "CJK COMPATIBILITY IDEOGRAPH-FA27", 0xFA28: "CJK COMPATIBILITY IDEOGRAPH-FA28", 0xFA29: "CJK COMPATIBILITY IDEOGRAPH-FA29", 0xFA2A: "CJK COMPATIBILITY IDEOGRAPH-FA2A", 0xFA2B: "CJK COMPATIBILITY IDEOGRAPH-FA2B", 0xFA2C: "CJK COMPATIBILITY IDEOGRAPH-FA2C", 0xFA2D: "CJK COMPATIBILITY IDEOGRAPH-FA2D", 0xFA30: "CJK COMPATIBILITY IDEOGRAPH-FA30", 0xFA31: "CJK COMPATIBILITY IDEOGRAPH-FA31", 0xFA32: "CJK COMPATIBILITY IDEOGRAPH-FA32", 0xFA33: "CJK COMPATIBILITY IDEOGRAPH-FA33", 0xFA34: "CJK COMPATIBILITY IDEOGRAPH-FA34", 0xFA35: "CJK COMPATIBILITY IDEOGRAPH-FA35", 0xFA36: "CJK COMPATIBILITY IDEOGRAPH-FA36", 0xFA37: "CJK COMPATIBILITY IDEOGRAPH-FA37", 0xFA38: "CJK COMPATIBILITY IDEOGRAPH-FA38", 0xFA39: "CJK COMPATIBILITY IDEOGRAPH-FA39", 0xFA3A: "CJK COMPATIBILITY IDEOGRAPH-FA3A", 0xFA3B: "CJK COMPATIBILITY IDEOGRAPH-FA3B", 0xFA3C: "CJK COMPATIBILITY IDEOGRAPH-FA3C", 0xFA3D: "CJK COMPATIBILITY IDEOGRAPH-FA3D", 0xFA3E: "CJK COMPATIBILITY IDEOGRAPH-FA3E", 0xFA3F: "CJK COMPATIBILITY IDEOGRAPH-FA3F", 0xFA40: "CJK COMPATIBILITY IDEOGRAPH-FA40", 0xFA41: "CJK COMPATIBILITY IDEOGRAPH-FA41", 0xFA42: "CJK COMPATIBILITY IDEOGRAPH-FA42", 0xFA43: "CJK COMPATIBILITY IDEOGRAPH-FA43", 0xFA44: "CJK COMPATIBILITY IDEOGRAPH-FA44", 0xFA45: "CJK COMPATIBILITY IDEOGRAPH-FA45", 0xFA46: "CJK COMPATIBILITY IDEOGRAPH-FA46", 0xFA47: "CJK COMPATIBILITY IDEOGRAPH-FA47", 0xFA48: "CJK COMPATIBILITY IDEOGRAPH-FA48", 0xFA49: "CJK COMPATIBILITY IDEOGRAPH-FA49", 0xFA4A: "CJK COMPATIBILITY IDEOGRAPH-FA4A", 0xFA4B: "CJK COMPATIBILITY IDEOGRAPH-FA4B", 0xFA4C: "CJK COMPATIBILITY IDEOGRAPH-FA4C", 0xFA4D: "CJK COMPATIBILITY IDEOGRAPH-FA4D", 0xFA4E: "CJK COMPATIBILITY IDEOGRAPH-FA4E", 0xFA4F: "CJK COMPATIBILITY IDEOGRAPH-FA4F", 0xFA50: "CJK COMPATIBILITY IDEOGRAPH-FA50", 0xFA51: "CJK COMPATIBILITY IDEOGRAPH-FA51", 0xFA52: "CJK COMPATIBILITY IDEOGRAPH-FA52", 0xFA53: "CJK COMPATIBILITY IDEOGRAPH-FA53", 0xFA54: "CJK COMPATIBILITY IDEOGRAPH-FA54", 0xFA55: "CJK COMPATIBILITY IDEOGRAPH-FA55", 0xFA56: "CJK COMPATIBILITY IDEOGRAPH-FA56", 0xFA57: "CJK COMPATIBILITY IDEOGRAPH-FA57", 0xFA58: "CJK COMPATIBILITY IDEOGRAPH-FA58", 0xFA59: "CJK COMPATIBILITY IDEOGRAPH-FA59", 0xFA5A: "CJK COMPATIBILITY IDEOGRAPH-FA5A", 0xFA5B: "CJK COMPATIBILITY IDEOGRAPH-FA5B", 0xFA5C: "CJK COMPATIBILITY IDEOGRAPH-FA5C", 0xFA5D: "CJK COMPATIBILITY IDEOGRAPH-FA5D", 0xFA5E: "CJK COMPATIBILITY IDEOGRAPH-FA5E", 0xFA5F: "CJK COMPATIBILITY IDEOGRAPH-FA5F", 0xFA60: "CJK COMPATIBILITY IDEOGRAPH-FA60", 0xFA61: "CJK COMPATIBILITY IDEOGRAPH-FA61", 0xFA62: "CJK COMPATIBILITY IDEOGRAPH-FA62", 0xFA63: "CJK COMPATIBILITY IDEOGRAPH-FA63", 0xFA64: "CJK COMPATIBILITY IDEOGRAPH-FA64", 0xFA65: "CJK COMPATIBILITY IDEOGRAPH-FA65", 0xFA66: "CJK COMPATIBILITY IDEOGRAPH-FA66", 0xFA67: "CJK COMPATIBILITY IDEOGRAPH-FA67", 0xFA68: "CJK COMPATIBILITY IDEOGRAPH-FA68", 0xFA69: "CJK COMPATIBILITY IDEOGRAPH-FA69", 0xFA6A: "CJK COMPATIBILITY IDEOGRAPH-FA6A", 0xFA70: "CJK COMPATIBILITY IDEOGRAPH-FA70", 0xFA71: "CJK COMPATIBILITY IDEOGRAPH-FA71", 0xFA72: "CJK COMPATIBILITY IDEOGRAPH-FA72", 0xFA73: "CJK COMPATIBILITY IDEOGRAPH-FA73", 0xFA74: "CJK COMPATIBILITY IDEOGRAPH-FA74", 0xFA75: "CJK COMPATIBILITY IDEOGRAPH-FA75", 0xFA76: "CJK COMPATIBILITY IDEOGRAPH-FA76", 0xFA77: "CJK COMPATIBILITY IDEOGRAPH-FA77", 0xFA78: "CJK COMPATIBILITY IDEOGRAPH-FA78", 0xFA79: "CJK COMPATIBILITY IDEOGRAPH-FA79", 0xFA7A: "CJK COMPATIBILITY IDEOGRAPH-FA7A", 0xFA7B: "CJK COMPATIBILITY IDEOGRAPH-FA7B", 0xFA7C: "CJK COMPATIBILITY IDEOGRAPH-FA7C", 0xFA7D: "CJK COMPATIBILITY IDEOGRAPH-FA7D", 0xFA7E: "CJK COMPATIBILITY IDEOGRAPH-FA7E", 0xFA7F: "CJK COMPATIBILITY IDEOGRAPH-FA7F", 0xFA80: "CJK COMPATIBILITY IDEOGRAPH-FA80", 0xFA81: "CJK COMPATIBILITY IDEOGRAPH-FA81", 0xFA82: "CJK COMPATIBILITY IDEOGRAPH-FA82", 0xFA83: "CJK COMPATIBILITY IDEOGRAPH-FA83", 0xFA84: "CJK COMPATIBILITY IDEOGRAPH-FA84", 0xFA85: "CJK COMPATIBILITY IDEOGRAPH-FA85", 0xFA86: "CJK COMPATIBILITY IDEOGRAPH-FA86", 0xFA87: "CJK COMPATIBILITY IDEOGRAPH-FA87", 0xFA88: "CJK COMPATIBILITY IDEOGRAPH-FA88", 0xFA89: "CJK COMPATIBILITY IDEOGRAPH-FA89", 0xFA8A: "CJK COMPATIBILITY IDEOGRAPH-FA8A", 0xFA8B: "CJK COMPATIBILITY IDEOGRAPH-FA8B", 0xFA8C: "CJK COMPATIBILITY IDEOGRAPH-FA8C", 0xFA8D: "CJK COMPATIBILITY IDEOGRAPH-FA8D", 0xFA8E: "CJK COMPATIBILITY IDEOGRAPH-FA8E", 0xFA8F: "CJK COMPATIBILITY IDEOGRAPH-FA8F", 0xFA90: "CJK COMPATIBILITY IDEOGRAPH-FA90", 0xFA91: "CJK COMPATIBILITY IDEOGRAPH-FA91", 0xFA92: "CJK COMPATIBILITY IDEOGRAPH-FA92", 0xFA93: "CJK COMPATIBILITY IDEOGRAPH-FA93", 0xFA94: "CJK COMPATIBILITY IDEOGRAPH-FA94", 0xFA95: "CJK COMPATIBILITY IDEOGRAPH-FA95", 0xFA96: "CJK COMPATIBILITY IDEOGRAPH-FA96", 0xFA97: "CJK COMPATIBILITY IDEOGRAPH-FA97", 0xFA98: "CJK COMPATIBILITY IDEOGRAPH-FA98", 0xFA99: "CJK COMPATIBILITY IDEOGRAPH-FA99", 0xFA9A: "CJK COMPATIBILITY IDEOGRAPH-FA9A", 0xFA9B: "CJK COMPATIBILITY IDEOGRAPH-FA9B", 0xFA9C: "CJK COMPATIBILITY IDEOGRAPH-FA9C", 0xFA9D: "CJK COMPATIBILITY IDEOGRAPH-FA9D", 0xFA9E: "CJK COMPATIBILITY IDEOGRAPH-FA9E", 0xFA9F: "CJK COMPATIBILITY IDEOGRAPH-FA9F", 0xFAA0: "CJK COMPATIBILITY IDEOGRAPH-FAA0", 0xFAA1: "CJK COMPATIBILITY IDEOGRAPH-FAA1", 0xFAA2: "CJK COMPATIBILITY IDEOGRAPH-FAA2", 0xFAA3: "CJK COMPATIBILITY IDEOGRAPH-FAA3", 0xFAA4: "CJK COMPATIBILITY IDEOGRAPH-FAA4", 0xFAA5: "CJK COMPATIBILITY IDEOGRAPH-FAA5", 0xFAA6: "CJK COMPATIBILITY IDEOGRAPH-FAA6", 0xFAA7: "CJK COMPATIBILITY IDEOGRAPH-FAA7", 0xFAA8: "CJK COMPATIBILITY IDEOGRAPH-FAA8", 0xFAA9: "CJK COMPATIBILITY IDEOGRAPH-FAA9", 0xFAAA: "CJK COMPATIBILITY IDEOGRAPH-FAAA", 0xFAAB: "CJK COMPATIBILITY IDEOGRAPH-FAAB", 0xFAAC: "CJK COMPATIBILITY IDEOGRAPH-FAAC", 0xFAAD: "CJK COMPATIBILITY IDEOGRAPH-FAAD", 0xFAAE: "CJK COMPATIBILITY IDEOGRAPH-FAAE", 0xFAAF: "CJK COMPATIBILITY IDEOGRAPH-FAAF", 0xFAB0: "CJK COMPATIBILITY IDEOGRAPH-FAB0", 0xFAB1: "CJK COMPATIBILITY IDEOGRAPH-FAB1", 0xFAB2: "CJK COMPATIBILITY IDEOGRAPH-FAB2", 0xFAB3: "CJK COMPATIBILITY IDEOGRAPH-FAB3", 0xFAB4: "CJK COMPATIBILITY IDEOGRAPH-FAB4", 0xFAB5: "CJK COMPATIBILITY IDEOGRAPH-FAB5", 0xFAB6: "CJK COMPATIBILITY IDEOGRAPH-FAB6", 0xFAB7: "CJK COMPATIBILITY IDEOGRAPH-FAB7", 0xFAB8: "CJK COMPATIBILITY IDEOGRAPH-FAB8", 0xFAB9: "CJK COMPATIBILITY IDEOGRAPH-FAB9", 0xFABA: "CJK COMPATIBILITY IDEOGRAPH-FABA", 0xFABB: "CJK COMPATIBILITY IDEOGRAPH-FABB", 0xFABC: "CJK COMPATIBILITY IDEOGRAPH-FABC", 0xFABD: "CJK COMPATIBILITY IDEOGRAPH-FABD", 0xFABE: "CJK COMPATIBILITY IDEOGRAPH-FABE", 0xFABF: "CJK COMPATIBILITY IDEOGRAPH-FABF", 0xFAC0: "CJK COMPATIBILITY IDEOGRAPH-FAC0", 0xFAC1: "CJK COMPATIBILITY IDEOGRAPH-FAC1", 0xFAC2: "CJK COMPATIBILITY IDEOGRAPH-FAC2", 0xFAC3: "CJK COMPATIBILITY IDEOGRAPH-FAC3", 0xFAC4: "CJK COMPATIBILITY IDEOGRAPH-FAC4", 0xFAC5: "CJK COMPATIBILITY IDEOGRAPH-FAC5", 0xFAC6: "CJK COMPATIBILITY IDEOGRAPH-FAC6", 0xFAC7: "CJK COMPATIBILITY IDEOGRAPH-FAC7", 0xFAC8: "CJK COMPATIBILITY IDEOGRAPH-FAC8", 0xFAC9: "CJK COMPATIBILITY IDEOGRAPH-FAC9", 0xFACA: "CJK COMPATIBILITY IDEOGRAPH-FACA", 0xFACB: "CJK COMPATIBILITY IDEOGRAPH-FACB", 0xFACC: "CJK COMPATIBILITY IDEOGRAPH-FACC", 0xFACD: "CJK COMPATIBILITY IDEOGRAPH-FACD", 0xFACE: "CJK COMPATIBILITY IDEOGRAPH-FACE", 0xFACF: "CJK COMPATIBILITY IDEOGRAPH-FACF", 0xFAD0: "CJK COMPATIBILITY IDEOGRAPH-FAD0", 0xFAD1: "CJK COMPATIBILITY IDEOGRAPH-FAD1", 0xFAD2: "CJK COMPATIBILITY IDEOGRAPH-FAD2", 0xFAD3: "CJK COMPATIBILITY IDEOGRAPH-FAD3", 0xFAD4: "CJK COMPATIBILITY IDEOGRAPH-FAD4", 0xFAD5: "CJK COMPATIBILITY IDEOGRAPH-FAD5", 0xFAD6: "CJK COMPATIBILITY IDEOGRAPH-FAD6", 0xFAD7: "CJK COMPATIBILITY IDEOGRAPH-FAD7", 0xFAD8: "CJK COMPATIBILITY IDEOGRAPH-FAD8", 0xFAD9: "CJK COMPATIBILITY IDEOGRAPH-FAD9", 0xFB00: "LATIN SMALL LIGATURE FF", 0xFB01: "LATIN SMALL LIGATURE FI", 0xFB02: "LATIN SMALL LIGATURE FL", 0xFB03: "LATIN SMALL LIGATURE FFI", 0xFB04: "LATIN SMALL LIGATURE FFL", 0xFB05: "LATIN SMALL LIGATURE LONG S T", 0xFB06: "LATIN SMALL LIGATURE ST", 0xFB13: "ARMENIAN SMALL LIGATURE MEN NOW", 0xFB14: "ARMENIAN SMALL LIGATURE MEN ECH", 0xFB15: "ARMENIAN SMALL LIGATURE MEN INI", 0xFB16: "ARMENIAN SMALL LIGATURE VEW NOW", 0xFB17: "ARMENIAN SMALL LIGATURE MEN XEH", 0xFB1D: "HEBREW LETTER YOD WITH HIRIQ", 0xFB1E: "HEBREW POINT JUDEO-SPANISH VARIKA", 0xFB1F: "HEBREW LIGATURE YIDDISH YOD YOD PATAH", 0xFB20: "HEBREW LETTER ALTERNATIVE AYIN", 0xFB21: "HEBREW LETTER WIDE ALEF", 0xFB22: "HEBREW LETTER WIDE DALET", 0xFB23: "HEBREW LETTER WIDE HE", 0xFB24: "HEBREW LETTER WIDE KAF", 0xFB25: "HEBREW LETTER WIDE LAMED", 0xFB26: "HEBREW LETTER WIDE FINAL MEM", 0xFB27: "HEBREW LETTER WIDE RESH", 0xFB28: "HEBREW LETTER WIDE TAV", 0xFB29: "HEBREW LETTER ALTERNATIVE PLUS SIGN", 0xFB2A: "HEBREW LETTER SHIN WITH SHIN DOT", 0xFB2B: "HEBREW LETTER SHIN WITH SIN DOT", 0xFB2C: "HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT", 0xFB2D: "HEBREW LETTER SHIN WITH DAGESH AND SIN DOT", 0xFB2E: "HEBREW LETTER ALEF WITH PATAH", 0xFB2F: "HEBREW LETTER ALEF WITH QAMATS", 0xFB30: "HEBREW LETTER ALEF WITH MAPIQ", 0xFB31: "HEBREW LETTER BET WITH DAGESH", 0xFB32: "HEBREW LETTER GIMEL WITH DAGESH", 0xFB33: "HEBREW LETTER DALET WITH DAGESH", 0xFB34: "HEBREW LETTER HE WITH MAPIQ", 0xFB35: "HEBREW LETTER VAV WITH DAGESH", 0xFB36: "HEBREW LETTER ZAYIN WITH DAGESH", 0xFB38: "HEBREW LETTER TET WITH DAGESH", 0xFB39: "HEBREW LETTER YOD WITH DAGESH", 0xFB3A: "HEBREW LETTER FINAL KAF WITH DAGESH", 0xFB3B: "HEBREW LETTER KAF WITH DAGESH", 0xFB3C: "HEBREW LETTER LAMED WITH DAGESH", 0xFB3E: "HEBREW LETTER MEM WITH DAGESH", 0xFB40: "HEBREW LETTER NUN WITH DAGESH", 0xFB41: "HEBREW LETTER SAMEKH WITH DAGESH", 0xFB43: "HEBREW LETTER FINAL PE WITH DAGESH", 0xFB44: "HEBREW LETTER PE WITH DAGESH", 0xFB46: "HEBREW LETTER TSADI WITH DAGESH", 0xFB47: "HEBREW LETTER QOF WITH DAGESH", 0xFB48: "HEBREW LETTER RESH WITH DAGESH", 0xFB49: "HEBREW LETTER SHIN WITH DAGESH", 0xFB4A: "HEBREW LETTER TAV WITH DAGESH", 0xFB4B: "HEBREW LETTER VAV WITH HOLAM", 0xFB4C: "HEBREW LETTER BET WITH RAFE", 0xFB4D: "HEBREW LETTER KAF WITH RAFE", 0xFB4E: "HEBREW LETTER PE WITH RAFE", 0xFB4F: "HEBREW LIGATURE ALEF LAMED", 0xFB50: "ARABIC LETTER ALEF WASLA ISOLATED FORM", 0xFB51: "ARABIC LETTER ALEF WASLA FINAL FORM", 0xFB52: "ARABIC LETTER BEEH ISOLATED FORM", 0xFB53: "ARABIC LETTER BEEH FINAL FORM", 0xFB54: "ARABIC LETTER BEEH INITIAL FORM", 0xFB55: "ARABIC LETTER BEEH MEDIAL FORM", 0xFB56: "ARABIC LETTER PEH ISOLATED FORM", 0xFB57: "ARABIC LETTER PEH FINAL FORM", 0xFB58: "ARABIC LETTER PEH INITIAL FORM", 0xFB59: "ARABIC LETTER PEH MEDIAL FORM", 0xFB5A: "ARABIC LETTER BEHEH ISOLATED FORM", 0xFB5B: "ARABIC LETTER BEHEH FINAL FORM", 0xFB5C: "ARABIC LETTER BEHEH INITIAL FORM", 0xFB5D: "ARABIC LETTER BEHEH MEDIAL FORM", 0xFB5E: "ARABIC LETTER TTEHEH ISOLATED FORM", 0xFB5F: "ARABIC LETTER TTEHEH FINAL FORM", 0xFB60: "ARABIC LETTER TTEHEH INITIAL FORM", 0xFB61: "ARABIC LETTER TTEHEH MEDIAL FORM", 0xFB62: "ARABIC LETTER TEHEH ISOLATED FORM", 0xFB63: "ARABIC LETTER TEHEH FINAL FORM", 0xFB64: "ARABIC LETTER TEHEH INITIAL FORM", 0xFB65: "ARABIC LETTER TEHEH MEDIAL FORM", 0xFB66: "ARABIC LETTER TTEH ISOLATED FORM", 0xFB67: "ARABIC LETTER TTEH FINAL FORM", 0xFB68: "ARABIC LETTER TTEH INITIAL FORM", 0xFB69: "ARABIC LETTER TTEH MEDIAL FORM", 0xFB6A: "ARABIC LETTER VEH ISOLATED FORM", 0xFB6B: "ARABIC LETTER VEH FINAL FORM", 0xFB6C: "ARABIC LETTER VEH INITIAL FORM", 0xFB6D: "ARABIC LETTER VEH MEDIAL FORM", 0xFB6E: "ARABIC LETTER PEHEH ISOLATED FORM", 0xFB6F: "ARABIC LETTER PEHEH FINAL FORM", 0xFB70: "ARABIC LETTER PEHEH INITIAL FORM", 0xFB71: "ARABIC LETTER PEHEH MEDIAL FORM", 0xFB72: "ARABIC LETTER DYEH ISOLATED FORM", 0xFB73: "ARABIC LETTER DYEH FINAL FORM", 0xFB74: "ARABIC LETTER DYEH INITIAL FORM", 0xFB75: "ARABIC LETTER DYEH MEDIAL FORM", 0xFB76: "ARABIC LETTER NYEH ISOLATED FORM", 0xFB77: "ARABIC LETTER NYEH FINAL FORM", 0xFB78: "ARABIC LETTER NYEH INITIAL FORM", 0xFB79: "ARABIC LETTER NYEH MEDIAL FORM", 0xFB7A: "ARABIC LETTER TCHEH ISOLATED FORM", 0xFB7B: "ARABIC LETTER TCHEH FINAL FORM", 0xFB7C: "ARABIC LETTER TCHEH INITIAL FORM", 0xFB7D: "ARABIC LETTER TCHEH MEDIAL FORM", 0xFB7E: "ARABIC LETTER TCHEHEH ISOLATED FORM", 0xFB7F: "ARABIC LETTER TCHEHEH FINAL FORM", 0xFB80: "ARABIC LETTER TCHEHEH INITIAL FORM", 0xFB81: "ARABIC LETTER TCHEHEH MEDIAL FORM", 0xFB82: "ARABIC LETTER DDAHAL ISOLATED FORM", 0xFB83: "ARABIC LETTER DDAHAL FINAL FORM", 0xFB84: "ARABIC LETTER DAHAL ISOLATED FORM", 0xFB85: "ARABIC LETTER DAHAL FINAL FORM", 0xFB86: "ARABIC LETTER DUL ISOLATED FORM", 0xFB87: "ARABIC LETTER DUL FINAL FORM", 0xFB88: "ARABIC LETTER DDAL ISOLATED FORM", 0xFB89: "ARABIC LETTER DDAL FINAL FORM", 0xFB8A: "ARABIC LETTER JEH ISOLATED FORM", 0xFB8B: "ARABIC LETTER JEH FINAL FORM", 0xFB8C: "ARABIC LETTER RREH ISOLATED FORM", 0xFB8D: "ARABIC LETTER RREH FINAL FORM", 0xFB8E: "ARABIC LETTER KEHEH ISOLATED FORM", 0xFB8F: "ARABIC LETTER KEHEH FINAL FORM", 0xFB90: "ARABIC LETTER KEHEH INITIAL FORM", 0xFB91: "ARABIC LETTER KEHEH MEDIAL FORM", 0xFB92: "ARABIC LETTER GAF ISOLATED FORM", 0xFB93: "ARABIC LETTER GAF FINAL FORM", 0xFB94: "ARABIC LETTER GAF INITIAL FORM", 0xFB95: "ARABIC LETTER GAF MEDIAL FORM", 0xFB96: "ARABIC LETTER GUEH ISOLATED FORM", 0xFB97: "ARABIC LETTER GUEH FINAL FORM", 0xFB98: "ARABIC LETTER GUEH INITIAL FORM", 0xFB99: "ARABIC LETTER GUEH MEDIAL FORM", 0xFB9A: "ARABIC LETTER NGOEH ISOLATED FORM", 0xFB9B: "ARABIC LETTER NGOEH FINAL FORM", 0xFB9C: "ARABIC LETTER NGOEH INITIAL FORM", 0xFB9D: "ARABIC LETTER NGOEH MEDIAL FORM", 0xFB9E: "ARABIC LETTER NOON GHUNNA ISOLATED FORM", 0xFB9F: "ARABIC LETTER NOON GHUNNA FINAL FORM", 0xFBA0: "ARABIC LETTER RNOON ISOLATED FORM", 0xFBA1: "ARABIC LETTER RNOON FINAL FORM", 0xFBA2: "ARABIC LETTER RNOON INITIAL FORM", 0xFBA3: "ARABIC LETTER RNOON MEDIAL FORM", 0xFBA4: "ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM", 0xFBA5: "ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM", 0xFBA6: "ARABIC LETTER HEH GOAL ISOLATED FORM", 0xFBA7: "ARABIC LETTER HEH GOAL FINAL FORM", 0xFBA8: "ARABIC LETTER HEH GOAL INITIAL FORM", 0xFBA9: "ARABIC LETTER HEH GOAL MEDIAL FORM", 0xFBAA: "ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM", 0xFBAB: "ARABIC LETTER HEH DOACHASHMEE FINAL FORM", 0xFBAC: "ARABIC LETTER HEH DOACHASHMEE INITIAL FORM", 0xFBAD: "ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM", 0xFBAE: "ARABIC LETTER YEH BARREE ISOLATED FORM", 0xFBAF: "ARABIC LETTER YEH BARREE FINAL FORM", 0xFBB0: "ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM", 0xFBB1: "ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM", 0xFBD3: "ARABIC LETTER NG ISOLATED FORM", 0xFBD4: "ARABIC LETTER NG FINAL FORM", 0xFBD5: "ARABIC LETTER NG INITIAL FORM", 0xFBD6: "ARABIC LETTER NG MEDIAL FORM", 0xFBD7: "ARABIC LETTER U ISOLATED FORM", 0xFBD8: "ARABIC LETTER U FINAL FORM", 0xFBD9: "ARABIC LETTER OE ISOLATED FORM", 0xFBDA: "ARABIC LETTER OE FINAL FORM", 0xFBDB: "ARABIC LETTER YU ISOLATED FORM", 0xFBDC: "ARABIC LETTER YU FINAL FORM", 0xFBDD: "ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM", 0xFBDE: "ARABIC LETTER VE ISOLATED FORM", 0xFBDF: "ARABIC LETTER VE FINAL FORM", 0xFBE0: "ARABIC LETTER KIRGHIZ OE ISOLATED FORM", 0xFBE1: "ARABIC LETTER KIRGHIZ OE FINAL FORM", 0xFBE2: "ARABIC LETTER KIRGHIZ YU ISOLATED FORM", 0xFBE3: "ARABIC LETTER KIRGHIZ YU FINAL FORM", 0xFBE4: "ARABIC LETTER E ISOLATED FORM", 0xFBE5: "ARABIC LETTER E FINAL FORM", 0xFBE6: "ARABIC LETTER E INITIAL FORM", 0xFBE7: "ARABIC LETTER E MEDIAL FORM", 0xFBE8: "ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM", 0xFBE9: "ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM", 0xFBEA: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM", 0xFBEB: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM", 0xFBEC: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM", 0xFBED: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM", 0xFBEE: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM", 0xFBEF: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM", 0xFBF0: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM", 0xFBF1: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM", 0xFBF2: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM", 0xFBF3: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM", 0xFBF4: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM", 0xFBF5: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM", 0xFBF6: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM", 0xFBF7: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM", 0xFBF8: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM", 0xFBF9: "ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM", 0xFBFA: "ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM", 0xFBFB: "ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM", 0xFBFC: "ARABIC LETTER FARSI YEH ISOLATED FORM", 0xFBFD: "ARABIC LETTER FARSI YEH FINAL FORM", 0xFBFE: "ARABIC LETTER FARSI YEH INITIAL FORM", 0xFBFF: "ARABIC LETTER FARSI YEH MEDIAL FORM", 0xFC00: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM", 0xFC01: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM", 0xFC02: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM", 0xFC03: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM", 0xFC04: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM", 0xFC05: "ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM", 0xFC06: "ARABIC LIGATURE BEH WITH HAH ISOLATED FORM", 0xFC07: "ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM", 0xFC08: "ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM", 0xFC09: "ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM", 0xFC0A: "ARABIC LIGATURE BEH WITH YEH ISOLATED FORM", 0xFC0B: "ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM", 0xFC0C: "ARABIC LIGATURE TEH WITH HAH ISOLATED FORM", 0xFC0D: "ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM", 0xFC0E: "ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM", 0xFC0F: "ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM", 0xFC10: "ARABIC LIGATURE TEH WITH YEH ISOLATED FORM", 0xFC11: "ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM", 0xFC12: "ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM", 0xFC13: "ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM", 0xFC14: "ARABIC LIGATURE THEH WITH YEH ISOLATED FORM", 0xFC15: "ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM", 0xFC16: "ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM", 0xFC17: "ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM", 0xFC18: "ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM", 0xFC19: "ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM", 0xFC1A: "ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM", 0xFC1B: "ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM", 0xFC1C: "ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM", 0xFC1D: "ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM", 0xFC1E: "ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM", 0xFC1F: "ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM", 0xFC20: "ARABIC LIGATURE SAD WITH HAH ISOLATED FORM", 0xFC21: "ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM", 0xFC22: "ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM", 0xFC23: "ARABIC LIGATURE DAD WITH HAH ISOLATED FORM", 0xFC24: "ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM", 0xFC25: "ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM", 0xFC26: "ARABIC LIGATURE TAH WITH HAH ISOLATED FORM", 0xFC27: "ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM", 0xFC28: "ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM", 0xFC29: "ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM", 0xFC2A: "ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM", 0xFC2B: "ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM", 0xFC2C: "ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM", 0xFC2D: "ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM", 0xFC2E: "ARABIC LIGATURE FEH WITH HAH ISOLATED FORM", 0xFC2F: "ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM", 0xFC30: "ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM", 0xFC31: "ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM", 0xFC32: "ARABIC LIGATURE FEH WITH YEH ISOLATED FORM", 0xFC33: "ARABIC LIGATURE QAF WITH HAH ISOLATED FORM", 0xFC34: "ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM", 0xFC35: "ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM", 0xFC36: "ARABIC LIGATURE QAF WITH YEH ISOLATED FORM", 0xFC37: "ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM", 0xFC38: "ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM", 0xFC39: "ARABIC LIGATURE KAF WITH HAH ISOLATED FORM", 0xFC3A: "ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM", 0xFC3B: "ARABIC LIGATURE KAF WITH LAM ISOLATED FORM", 0xFC3C: "ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM", 0xFC3D: "ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM", 0xFC3E: "ARABIC LIGATURE KAF WITH YEH ISOLATED FORM", 0xFC3F: "ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM", 0xFC40: "ARABIC LIGATURE LAM WITH HAH ISOLATED FORM", 0xFC41: "ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM", 0xFC42: "ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM", 0xFC43: "ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM", 0xFC44: "ARABIC LIGATURE LAM WITH YEH ISOLATED FORM", 0xFC45: "ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM", 0xFC46: "ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM", 0xFC47: "ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM", 0xFC48: "ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM", 0xFC49: "ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM", 0xFC4A: "ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM", 0xFC4B: "ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM", 0xFC4C: "ARABIC LIGATURE NOON WITH HAH ISOLATED FORM", 0xFC4D: "ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM", 0xFC4E: "ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM", 0xFC4F: "ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM", 0xFC50: "ARABIC LIGATURE NOON WITH YEH ISOLATED FORM", 0xFC51: "ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM", 0xFC52: "ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM", 0xFC53: "ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM", 0xFC54: "ARABIC LIGATURE HEH WITH YEH ISOLATED FORM", 0xFC55: "ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM", 0xFC56: "ARABIC LIGATURE YEH WITH HAH ISOLATED FORM", 0xFC57: "ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM", 0xFC58: "ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM", 0xFC59: "ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM", 0xFC5A: "ARABIC LIGATURE YEH WITH YEH ISOLATED FORM", 0xFC5B: "ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM", 0xFC5C: "ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM", 0xFC5D: "ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM", 0xFC5E: "ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM", 0xFC5F: "ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM", 0xFC60: "ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM", 0xFC61: "ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM", 0xFC62: "ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM", 0xFC63: "ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM", 0xFC64: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM", 0xFC65: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM", 0xFC66: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM", 0xFC67: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM", 0xFC68: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM", 0xFC69: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM", 0xFC6A: "ARABIC LIGATURE BEH WITH REH FINAL FORM", 0xFC6B: "ARABIC LIGATURE BEH WITH ZAIN FINAL FORM", 0xFC6C: "ARABIC LIGATURE BEH WITH MEEM FINAL FORM", 0xFC6D: "ARABIC LIGATURE BEH WITH NOON FINAL FORM", 0xFC6E: "ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM", 0xFC6F: "ARABIC LIGATURE BEH WITH YEH FINAL FORM", 0xFC70: "ARABIC LIGATURE TEH WITH REH FINAL FORM", 0xFC71: "ARABIC LIGATURE TEH WITH ZAIN FINAL FORM", 0xFC72: "ARABIC LIGATURE TEH WITH MEEM FINAL FORM", 0xFC73: "ARABIC LIGATURE TEH WITH NOON FINAL FORM", 0xFC74: "ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM", 0xFC75: "ARABIC LIGATURE TEH WITH YEH FINAL FORM", 0xFC76: "ARABIC LIGATURE THEH WITH REH FINAL FORM", 0xFC77: "ARABIC LIGATURE THEH WITH ZAIN FINAL FORM", 0xFC78: "ARABIC LIGATURE THEH WITH MEEM FINAL FORM", 0xFC79: "ARABIC LIGATURE THEH WITH NOON FINAL FORM", 0xFC7A: "ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM", 0xFC7B: "ARABIC LIGATURE THEH WITH YEH FINAL FORM", 0xFC7C: "ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM", 0xFC7D: "ARABIC LIGATURE FEH WITH YEH FINAL FORM", 0xFC7E: "ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM", 0xFC7F: "ARABIC LIGATURE QAF WITH YEH FINAL FORM", 0xFC80: "ARABIC LIGATURE KAF WITH ALEF FINAL FORM", 0xFC81: "ARABIC LIGATURE KAF WITH LAM FINAL FORM", 0xFC82: "ARABIC LIGATURE KAF WITH MEEM FINAL FORM", 0xFC83: "ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM", 0xFC84: "ARABIC LIGATURE KAF WITH YEH FINAL FORM", 0xFC85: "ARABIC LIGATURE LAM WITH MEEM FINAL FORM", 0xFC86: "ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM", 0xFC87: "ARABIC LIGATURE LAM WITH YEH FINAL FORM", 0xFC88: "ARABIC LIGATURE MEEM WITH ALEF FINAL FORM", 0xFC89: "ARABIC LIGATURE MEEM WITH MEEM FINAL FORM", 0xFC8A: "ARABIC LIGATURE NOON WITH REH FINAL FORM", 0xFC8B: "ARABIC LIGATURE NOON WITH ZAIN FINAL FORM", 0xFC8C: "ARABIC LIGATURE NOON WITH MEEM FINAL FORM", 0xFC8D: "ARABIC LIGATURE NOON WITH NOON FINAL FORM", 0xFC8E: "ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM", 0xFC8F: "ARABIC LIGATURE NOON WITH YEH FINAL FORM", 0xFC90: "ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM", 0xFC91: "ARABIC LIGATURE YEH WITH REH FINAL FORM", 0xFC92: "ARABIC LIGATURE YEH WITH ZAIN FINAL FORM", 0xFC93: "ARABIC LIGATURE YEH WITH MEEM FINAL FORM", 0xFC94: "ARABIC LIGATURE YEH WITH NOON FINAL FORM", 0xFC95: "ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM", 0xFC96: "ARABIC LIGATURE YEH WITH YEH FINAL FORM", 0xFC97: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM", 0xFC98: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM", 0xFC99: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM", 0xFC9A: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM", 0xFC9B: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM", 0xFC9C: "ARABIC LIGATURE BEH WITH JEEM INITIAL FORM", 0xFC9D: "ARABIC LIGATURE BEH WITH HAH INITIAL FORM", 0xFC9E: "ARABIC LIGATURE BEH WITH KHAH INITIAL FORM", 0xFC9F: "ARABIC LIGATURE BEH WITH MEEM INITIAL FORM", 0xFCA0: "ARABIC LIGATURE BEH WITH HEH INITIAL FORM", 0xFCA1: "ARABIC LIGATURE TEH WITH JEEM INITIAL FORM", 0xFCA2: "ARABIC LIGATURE TEH WITH HAH INITIAL FORM", 0xFCA3: "ARABIC LIGATURE TEH WITH KHAH INITIAL FORM", 0xFCA4: "ARABIC LIGATURE TEH WITH MEEM INITIAL FORM", 0xFCA5: "ARABIC LIGATURE TEH WITH HEH INITIAL FORM", 0xFCA6: "ARABIC LIGATURE THEH WITH MEEM INITIAL FORM", 0xFCA7: "ARABIC LIGATURE JEEM WITH HAH INITIAL FORM", 0xFCA8: "ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM", 0xFCA9: "ARABIC LIGATURE HAH WITH JEEM INITIAL FORM", 0xFCAA: "ARABIC LIGATURE HAH WITH MEEM INITIAL FORM", 0xFCAB: "ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM", 0xFCAC: "ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM", 0xFCAD: "ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM", 0xFCAE: "ARABIC LIGATURE SEEN WITH HAH INITIAL FORM", 0xFCAF: "ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM", 0xFCB0: "ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM", 0xFCB1: "ARABIC LIGATURE SAD WITH HAH INITIAL FORM", 0xFCB2: "ARABIC LIGATURE SAD WITH KHAH INITIAL FORM", 0xFCB3: "ARABIC LIGATURE SAD WITH MEEM INITIAL FORM", 0xFCB4: "ARABIC LIGATURE DAD WITH JEEM INITIAL FORM", 0xFCB5: "ARABIC LIGATURE DAD WITH HAH INITIAL FORM", 0xFCB6: "ARABIC LIGATURE DAD WITH KHAH INITIAL FORM", 0xFCB7: "ARABIC LIGATURE DAD WITH MEEM INITIAL FORM", 0xFCB8: "ARABIC LIGATURE TAH WITH HAH INITIAL FORM", 0xFCB9: "ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM", 0xFCBA: "ARABIC LIGATURE AIN WITH JEEM INITIAL FORM", 0xFCBB: "ARABIC LIGATURE AIN WITH MEEM INITIAL FORM", 0xFCBC: "ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM", 0xFCBD: "ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM", 0xFCBE: "ARABIC LIGATURE FEH WITH JEEM INITIAL FORM", 0xFCBF: "ARABIC LIGATURE FEH WITH HAH INITIAL FORM", 0xFCC0: "ARABIC LIGATURE FEH WITH KHAH INITIAL FORM", 0xFCC1: "ARABIC LIGATURE FEH WITH MEEM INITIAL FORM", 0xFCC2: "ARABIC LIGATURE QAF WITH HAH INITIAL FORM", 0xFCC3: "ARABIC LIGATURE QAF WITH MEEM INITIAL FORM", 0xFCC4: "ARABIC LIGATURE KAF WITH JEEM INITIAL FORM", 0xFCC5: "ARABIC LIGATURE KAF WITH HAH INITIAL FORM", 0xFCC6: "ARABIC LIGATURE KAF WITH KHAH INITIAL FORM", 0xFCC7: "ARABIC LIGATURE KAF WITH LAM INITIAL FORM", 0xFCC8: "ARABIC LIGATURE KAF WITH MEEM INITIAL FORM", 0xFCC9: "ARABIC LIGATURE LAM WITH JEEM INITIAL FORM", 0xFCCA: "ARABIC LIGATURE LAM WITH HAH INITIAL FORM", 0xFCCB: "ARABIC LIGATURE LAM WITH KHAH INITIAL FORM", 0xFCCC: "ARABIC LIGATURE LAM WITH MEEM INITIAL FORM", 0xFCCD: "ARABIC LIGATURE LAM WITH HEH INITIAL FORM", 0xFCCE: "ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM", 0xFCCF: "ARABIC LIGATURE MEEM WITH HAH INITIAL FORM", 0xFCD0: "ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM", 0xFCD1: "ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM", 0xFCD2: "ARABIC LIGATURE NOON WITH JEEM INITIAL FORM", 0xFCD3: "ARABIC LIGATURE NOON WITH HAH INITIAL FORM", 0xFCD4: "ARABIC LIGATURE NOON WITH KHAH INITIAL FORM", 0xFCD5: "ARABIC LIGATURE NOON WITH MEEM INITIAL FORM", 0xFCD6: "ARABIC LIGATURE NOON WITH HEH INITIAL FORM", 0xFCD7: "ARABIC LIGATURE HEH WITH JEEM INITIAL FORM", 0xFCD8: "ARABIC LIGATURE HEH WITH MEEM INITIAL FORM", 0xFCD9: "ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM", 0xFCDA: "ARABIC LIGATURE YEH WITH JEEM INITIAL FORM", 0xFCDB: "ARABIC LIGATURE YEH WITH HAH INITIAL FORM", 0xFCDC: "ARABIC LIGATURE YEH WITH KHAH INITIAL FORM", 0xFCDD: "ARABIC LIGATURE YEH WITH MEEM INITIAL FORM", 0xFCDE: "ARABIC LIGATURE YEH WITH HEH INITIAL FORM", 0xFCDF: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM", 0xFCE0: "ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM", 0xFCE1: "ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM", 0xFCE2: "ARABIC LIGATURE BEH WITH HEH MEDIAL FORM", 0xFCE3: "ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM", 0xFCE4: "ARABIC LIGATURE TEH WITH HEH MEDIAL FORM", 0xFCE5: "ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM", 0xFCE6: "ARABIC LIGATURE THEH WITH HEH MEDIAL FORM", 0xFCE7: "ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM", 0xFCE8: "ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM", 0xFCE9: "ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM", 0xFCEA: "ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM", 0xFCEB: "ARABIC LIGATURE KAF WITH LAM MEDIAL FORM", 0xFCEC: "ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM", 0xFCED: "ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM", 0xFCEE: "ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM", 0xFCEF: "ARABIC LIGATURE NOON WITH HEH MEDIAL FORM", 0xFCF0: "ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM", 0xFCF1: "ARABIC LIGATURE YEH WITH HEH MEDIAL FORM", 0xFCF2: "ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM", 0xFCF3: "ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM", 0xFCF4: "ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM", 0xFCF5: "ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM", 0xFCF6: "ARABIC LIGATURE TAH WITH YEH ISOLATED FORM", 0xFCF7: "ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM", 0xFCF8: "ARABIC LIGATURE AIN WITH YEH ISOLATED FORM", 0xFCF9: "ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM", 0xFCFA: "ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM", 0xFCFB: "ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM", 0xFCFC: "ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM", 0xFCFD: "ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM", 0xFCFE: "ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM", 0xFCFF: "ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM", 0xFD00: "ARABIC LIGATURE HAH WITH YEH ISOLATED FORM", 0xFD01: "ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM", 0xFD02: "ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM", 0xFD03: "ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM", 0xFD04: "ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM", 0xFD05: "ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM", 0xFD06: "ARABIC LIGATURE SAD WITH YEH ISOLATED FORM", 0xFD07: "ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM", 0xFD08: "ARABIC LIGATURE DAD WITH YEH ISOLATED FORM", 0xFD09: "ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM", 0xFD0A: "ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM", 0xFD0B: "ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM", 0xFD0C: "ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM", 0xFD0D: "ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM", 0xFD0E: "ARABIC LIGATURE SEEN WITH REH ISOLATED FORM", 0xFD0F: "ARABIC LIGATURE SAD WITH REH ISOLATED FORM", 0xFD10: "ARABIC LIGATURE DAD WITH REH ISOLATED FORM", 0xFD11: "ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM", 0xFD12: "ARABIC LIGATURE TAH WITH YEH FINAL FORM", 0xFD13: "ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM", 0xFD14: "ARABIC LIGATURE AIN WITH YEH FINAL FORM", 0xFD15: "ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM", 0xFD16: "ARABIC LIGATURE GHAIN WITH YEH FINAL FORM", 0xFD17: "ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM", 0xFD18: "ARABIC LIGATURE SEEN WITH YEH FINAL FORM", 0xFD19: "ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM", 0xFD1A: "ARABIC LIGATURE SHEEN WITH YEH FINAL FORM", 0xFD1B: "ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM", 0xFD1C: "ARABIC LIGATURE HAH WITH YEH FINAL FORM", 0xFD1D: "ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM", 0xFD1E: "ARABIC LIGATURE JEEM WITH YEH FINAL FORM", 0xFD1F: "ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM", 0xFD20: "ARABIC LIGATURE KHAH WITH YEH FINAL FORM", 0xFD21: "ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM", 0xFD22: "ARABIC LIGATURE SAD WITH YEH FINAL FORM", 0xFD23: "ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM", 0xFD24: "ARABIC LIGATURE DAD WITH YEH FINAL FORM", 0xFD25: "ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM", 0xFD26: "ARABIC LIGATURE SHEEN WITH HAH FINAL FORM", 0xFD27: "ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM", 0xFD28: "ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM", 0xFD29: "ARABIC LIGATURE SHEEN WITH REH FINAL FORM", 0xFD2A: "ARABIC LIGATURE SEEN WITH REH FINAL FORM", 0xFD2B: "ARABIC LIGATURE SAD WITH REH FINAL FORM", 0xFD2C: "ARABIC LIGATURE DAD WITH REH FINAL FORM", 0xFD2D: "ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM", 0xFD2E: "ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM", 0xFD2F: "ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM", 0xFD30: "ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM", 0xFD31: "ARABIC LIGATURE SEEN WITH HEH INITIAL FORM", 0xFD32: "ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM", 0xFD33: "ARABIC LIGATURE TAH WITH MEEM INITIAL FORM", 0xFD34: "ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM", 0xFD35: "ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM", 0xFD36: "ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM", 0xFD37: "ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM", 0xFD38: "ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM", 0xFD39: "ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM", 0xFD3A: "ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM", 0xFD3B: "ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM", 0xFD3C: "ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM", 0xFD3D: "ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM", 0xFD3E: "ORNATE LEFT PARENTHESIS", 0xFD3F: "ORNATE RIGHT PARENTHESIS", 0xFD50: "ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM", 0xFD51: "ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM", 0xFD52: "ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM", 0xFD53: "ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM", 0xFD54: "ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM", 0xFD55: "ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM", 0xFD56: "ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM", 0xFD57: "ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM", 0xFD58: "ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM", 0xFD59: "ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM", 0xFD5A: "ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM", 0xFD5B: "ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM", 0xFD5C: "ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM", 0xFD5D: "ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM", 0xFD5E: "ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM", 0xFD5F: "ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM", 0xFD60: "ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM", 0xFD61: "ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM", 0xFD62: "ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM", 0xFD63: "ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM", 0xFD64: "ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM", 0xFD65: "ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM", 0xFD66: "ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM", 0xFD67: "ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM", 0xFD68: "ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM", 0xFD69: "ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM", 0xFD6A: "ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM", 0xFD6B: "ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM", 0xFD6C: "ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM", 0xFD6D: "ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM", 0xFD6E: "ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM", 0xFD6F: "ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM", 0xFD70: "ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM", 0xFD71: "ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM", 0xFD72: "ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM", 0xFD73: "ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM", 0xFD74: "ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM", 0xFD75: "ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM", 0xFD76: "ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM", 0xFD77: "ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM", 0xFD78: "ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM", 0xFD79: "ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM", 0xFD7A: "ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM", 0xFD7B: "ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM", 0xFD7C: "ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM", 0xFD7D: "ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM", 0xFD7E: "ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM", 0xFD7F: "ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM", 0xFD80: "ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM", 0xFD81: "ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM", 0xFD82: "ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM", 0xFD83: "ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM", 0xFD84: "ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM", 0xFD85: "ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM", 0xFD86: "ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM", 0xFD87: "ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM", 0xFD88: "ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM", 0xFD89: "ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM", 0xFD8A: "ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM", 0xFD8B: "ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM", 0xFD8C: "ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM", 0xFD8D: "ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM", 0xFD8E: "ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM", 0xFD8F: "ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM", 0xFD92: "ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM", 0xFD93: "ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM", 0xFD94: "ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM", 0xFD95: "ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM", 0xFD96: "ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM", 0xFD97: "ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM", 0xFD98: "ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM", 0xFD99: "ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM", 0xFD9A: "ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM", 0xFD9B: "ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM", 0xFD9C: "ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM", 0xFD9D: "ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM", 0xFD9E: "ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM", 0xFD9F: "ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM", 0xFDA0: "ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM", 0xFDA1: "ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM", 0xFDA2: "ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM", 0xFDA3: "ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM", 0xFDA4: "ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM", 0xFDA5: "ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM", 0xFDA6: "ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM", 0xFDA7: "ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM", 0xFDA8: "ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM", 0xFDA9: "ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM", 0xFDAA: "ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM", 0xFDAB: "ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM", 0xFDAC: "ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM", 0xFDAD: "ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM", 0xFDAE: "ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM", 0xFDAF: "ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM", 0xFDB0: "ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM", 0xFDB1: "ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM", 0xFDB2: "ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM", 0xFDB3: "ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM", 0xFDB4: "ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM", 0xFDB5: "ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM", 0xFDB6: "ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM", 0xFDB7: "ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM", 0xFDB8: "ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM", 0xFDB9: "ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM", 0xFDBA: "ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM", 0xFDBB: "ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM", 0xFDBC: "ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM", 0xFDBD: "ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM", 0xFDBE: "ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM", 0xFDBF: "ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM", 0xFDC0: "ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM", 0xFDC1: "ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM", 0xFDC2: "ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM", 0xFDC3: "ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM", 0xFDC4: "ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM", 0xFDC5: "ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM", 0xFDC6: "ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM", 0xFDC7: "ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM", 0xFDD0: "", 0xFDD1: "", 0xFDD2: "", 0xFDD3: "", 0xFDD4: "", 0xFDD5: "", 0xFDD6: "", 0xFDD7: "", 0xFDD8: "", 0xFDD9: "", 0xFDDA: "", 0xFDDB: "", 0xFDDC: "", 0xFDDD: "", 0xFDDE: "", 0xFDDF: "", 0xFDE0: "", 0xFDE1: "", 0xFDE2: "", 0xFDE3: "", 0xFDE4: "", 0xFDE5: "", 0xFDE6: "", 0xFDE7: "", 0xFDE8: "", 0xFDE9: "", 0xFDEA: "", 0xFDEB: "", 0xFDEC: "", 0xFDED: "", 0xFDEE: "", 0xFDEF: "", 0xFDF0: "ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM", 0xFDF1: "ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM", 0xFDF2: "ARABIC LIGATURE ALLAH ISOLATED FORM", 0xFDF3: "ARABIC LIGATURE AKBAR ISOLATED FORM", 0xFDF4: "ARABIC LIGATURE MOHAMMAD ISOLATED FORM", 0xFDF5: "ARABIC LIGATURE SALAM ISOLATED FORM", 0xFDF6: "ARABIC LIGATURE RASOUL ISOLATED FORM", 0xFDF7: "ARABIC LIGATURE ALAYHE ISOLATED FORM", 0xFDF8: "ARABIC LIGATURE WASALLAM ISOLATED FORM", 0xFDF9: "ARABIC LIGATURE SALLA ISOLATED FORM", 0xFDFA: "ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM", 0xFDFB: "ARABIC LIGATURE JALLAJALALOUHOU", 0xFDFC: "RIAL SIGN", 0xFDFD: "ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM", 0xFE00: "VARIATION SELECTOR-1", 0xFE01: "VARIATION SELECTOR-2", 0xFE02: "VARIATION SELECTOR-3", 0xFE03: "VARIATION SELECTOR-4", 0xFE04: "VARIATION SELECTOR-5", 0xFE05: "VARIATION SELECTOR-6", 0xFE06: "VARIATION SELECTOR-7", 0xFE07: "VARIATION SELECTOR-8", 0xFE08: "VARIATION SELECTOR-9", 0xFE09: "VARIATION SELECTOR-10", 0xFE0A: "VARIATION SELECTOR-11", 0xFE0B: "VARIATION SELECTOR-12", 0xFE0C: "VARIATION SELECTOR-13", 0xFE0D: "VARIATION SELECTOR-14", 0xFE0E: "VARIATION SELECTOR-15", 0xFE0F: "VARIATION SELECTOR-16", 0xFE10: "PRESENTATION FORM FOR VERTICAL COMMA", 0xFE11: "PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA", 0xFE12: "PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP", 0xFE13: "PRESENTATION FORM FOR VERTICAL COLON", 0xFE14: "PRESENTATION FORM FOR VERTICAL SEMICOLON", 0xFE15: "PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK", 0xFE16: "PRESENTATION FORM FOR VERTICAL QUESTION MARK", 0xFE17: "PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET", 0xFE18: "PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET", 0xFE19: "PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS", 0xFE20: "COMBINING LIGATURE LEFT HALF", 0xFE21: "COMBINING LIGATURE RIGHT HALF", 0xFE22: "COMBINING DOUBLE TILDE LEFT HALF", 0xFE23: "COMBINING DOUBLE TILDE RIGHT HALF", 0xFE24: "COMBINING MACRON LEFT HALF", 0xFE25: "COMBINING MACRON RIGHT HALF", 0xFE26: "COMBINING CONJOINING MACRON", 0xFE30: "PRESENTATION FORM FOR VERTICAL TWO DOT LEADER", 0xFE31: "PRESENTATION FORM FOR VERTICAL EM DASH", 0xFE32: "PRESENTATION FORM FOR VERTICAL EN DASH", 0xFE33: "PRESENTATION FORM FOR VERTICAL LOW LINE", 0xFE34: "PRESENTATION FORM FOR VERTICAL WAVY LOW LINE", 0xFE35: "PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS", 0xFE36: "PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS", 0xFE37: "PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET", 0xFE38: "PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET", 0xFE39: "PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET", 0xFE3A: "PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET", 0xFE3B: "PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET", 0xFE3C: "PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET", 0xFE3D: "PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET", 0xFE3E: "PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET", 0xFE3F: "PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET", 0xFE40: "PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET", 0xFE41: "PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET", 0xFE42: "PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET", 0xFE43: "PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET", 0xFE44: "PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET", 0xFE45: "SESAME DOT", 0xFE46: "WHITE SESAME DOT", 0xFE47: "PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET", 0xFE48: "PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET", 0xFE49: "DASHED OVERLINE", 0xFE4A: "CENTRELINE OVERLINE", 0xFE4B: "WAVY OVERLINE", 0xFE4C: "DOUBLE WAVY OVERLINE", 0xFE4D: "DASHED LOW LINE", 0xFE4E: "CENTRELINE LOW LINE", 0xFE4F: "WAVY LOW LINE", 0xFE50: "SMALL COMMA", 0xFE51: "SMALL IDEOGRAPHIC COMMA", 0xFE52: "SMALL FULL STOP", 0xFE54: "SMALL SEMICOLON", 0xFE55: "SMALL COLON", 0xFE56: "SMALL QUESTION MARK", 0xFE57: "SMALL EXCLAMATION MARK", 0xFE58: "SMALL EM DASH", 0xFE59: "SMALL LEFT PARENTHESIS", 0xFE5A: "SMALL RIGHT PARENTHESIS", 0xFE5B: "SMALL LEFT CURLY BRACKET", 0xFE5C: "SMALL RIGHT CURLY BRACKET", 0xFE5D: "SMALL LEFT TORTOISE SHELL BRACKET", 0xFE5E: "SMALL RIGHT TORTOISE SHELL BRACKET", 0xFE5F: "SMALL NUMBER SIGN", 0xFE60: "SMALL AMPERSAND", 0xFE61: "SMALL ASTERISK", 0xFE62: "SMALL PLUS SIGN", 0xFE63: "SMALL HYPHEN-MINUS", 0xFE64: "SMALL LESS-THAN SIGN", 0xFE65: "SMALL GREATER-THAN SIGN", 0xFE66: "SMALL EQUALS SIGN", 0xFE68: "SMALL REVERSE SOLIDUS", 0xFE69: "SMALL DOLLAR SIGN", 0xFE6A: "SMALL PERCENT SIGN", 0xFE6B: "SMALL COMMERCIAL AT", 0xFE70: "ARABIC FATHATAN ISOLATED FORM", 0xFE71: "ARABIC TATWEEL WITH FATHATAN ABOVE", 0xFE72: "ARABIC DAMMATAN ISOLATED FORM", 0xFE73: "ARABIC TAIL FRAGMENT", 0xFE74: "ARABIC KASRATAN ISOLATED FORM", 0xFE76: "ARABIC FATHA ISOLATED FORM", 0xFE77: "ARABIC FATHA MEDIAL FORM", 0xFE78: "ARABIC DAMMA ISOLATED FORM", 0xFE79: "ARABIC DAMMA MEDIAL FORM", 0xFE7A: "ARABIC KASRA ISOLATED FORM", 0xFE7B: "ARABIC KASRA MEDIAL FORM", 0xFE7C: "ARABIC SHADDA ISOLATED FORM", 0xFE7D: "ARABIC SHADDA MEDIAL FORM", 0xFE7E: "ARABIC SUKUN ISOLATED FORM", 0xFE7F: "ARABIC SUKUN MEDIAL FORM", 0xFE80: "ARABIC LETTER HAMZA ISOLATED FORM", 0xFE81: "ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM", 0xFE82: "ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM", 0xFE83: "ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM", 0xFE84: "ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM", 0xFE85: "ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM", 0xFE86: "ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM", 0xFE87: "ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM", 0xFE88: "ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM", 0xFE89: "ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM", 0xFE8A: "ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM", 0xFE8B: "ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM", 0xFE8C: "ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM", 0xFE8D: "ARABIC LETTER ALEF ISOLATED FORM", 0xFE8E: "ARABIC LETTER ALEF FINAL FORM", 0xFE8F: "ARABIC LETTER BEH ISOLATED FORM", 0xFE90: "ARABIC LETTER BEH FINAL FORM", 0xFE91: "ARABIC LETTER BEH INITIAL FORM", 0xFE92: "ARABIC LETTER BEH MEDIAL FORM", 0xFE93: "ARABIC LETTER TEH MARBUTA ISOLATED FORM", 0xFE94: "ARABIC LETTER TEH MARBUTA FINAL FORM", 0xFE95: "ARABIC LETTER TEH ISOLATED FORM", 0xFE96: "ARABIC LETTER TEH FINAL FORM", 0xFE97: "ARABIC LETTER TEH INITIAL FORM", 0xFE98: "ARABIC LETTER TEH MEDIAL FORM", 0xFE99: "ARABIC LETTER THEH ISOLATED FORM", 0xFE9A: "ARABIC LETTER THEH FINAL FORM", 0xFE9B: "ARABIC LETTER THEH INITIAL FORM", 0xFE9C: "ARABIC LETTER THEH MEDIAL FORM", 0xFE9D: "ARABIC LETTER JEEM ISOLATED FORM", 0xFE9E: "ARABIC LETTER JEEM FINAL FORM", 0xFE9F: "ARABIC LETTER JEEM INITIAL FORM", 0xFEA0: "ARABIC LETTER JEEM MEDIAL FORM", 0xFEA1: "ARABIC LETTER HAH ISOLATED FORM", 0xFEA2: "ARABIC LETTER HAH FINAL FORM", 0xFEA3: "ARABIC LETTER HAH INITIAL FORM", 0xFEA4: "ARABIC LETTER HAH MEDIAL FORM", 0xFEA5: "ARABIC LETTER KHAH ISOLATED FORM", 0xFEA6: "ARABIC LETTER KHAH FINAL FORM", 0xFEA7: "ARABIC LETTER KHAH INITIAL FORM", 0xFEA8: "ARABIC LETTER KHAH MEDIAL FORM", 0xFEA9: "ARABIC LETTER DAL ISOLATED FORM", 0xFEAA: "ARABIC LETTER DAL FINAL FORM", 0xFEAB: "ARABIC LETTER THAL ISOLATED FORM", 0xFEAC: "ARABIC LETTER THAL FINAL FORM", 0xFEAD: "ARABIC LETTER REH ISOLATED FORM", 0xFEAE: "ARABIC LETTER REH FINAL FORM", 0xFEAF: "ARABIC LETTER ZAIN ISOLATED FORM", 0xFEB0: "ARABIC LETTER ZAIN FINAL FORM", 0xFEB1: "ARABIC LETTER SEEN ISOLATED FORM", 0xFEB2: "ARABIC LETTER SEEN FINAL FORM", 0xFEB3: "ARABIC LETTER SEEN INITIAL FORM", 0xFEB4: "ARABIC LETTER SEEN MEDIAL FORM", 0xFEB5: "ARABIC LETTER SHEEN ISOLATED FORM", 0xFEB6: "ARABIC LETTER SHEEN FINAL FORM", 0xFEB7: "ARABIC LETTER SHEEN INITIAL FORM", 0xFEB8: "ARABIC LETTER SHEEN MEDIAL FORM", 0xFEB9: "ARABIC LETTER SAD ISOLATED FORM", 0xFEBA: "ARABIC LETTER SAD FINAL FORM", 0xFEBB: "ARABIC LETTER SAD INITIAL FORM", 0xFEBC: "ARABIC LETTER SAD MEDIAL FORM", 0xFEBD: "ARABIC LETTER DAD ISOLATED FORM", 0xFEBE: "ARABIC LETTER DAD FINAL FORM", 0xFEBF: "ARABIC LETTER DAD INITIAL FORM", 0xFEC0: "ARABIC LETTER DAD MEDIAL FORM", 0xFEC1: "ARABIC LETTER TAH ISOLATED FORM", 0xFEC2: "ARABIC LETTER TAH FINAL FORM", 0xFEC3: "ARABIC LETTER TAH INITIAL FORM", 0xFEC4: "ARABIC LETTER TAH MEDIAL FORM", 0xFEC5: "ARABIC LETTER ZAH ISOLATED FORM", 0xFEC6: "ARABIC LETTER ZAH FINAL FORM", 0xFEC7: "ARABIC LETTER ZAH INITIAL FORM", 0xFEC8: "ARABIC LETTER ZAH MEDIAL FORM", 0xFEC9: "ARABIC LETTER AIN ISOLATED FORM", 0xFECA: "ARABIC LETTER AIN FINAL FORM", 0xFECB: "ARABIC LETTER AIN INITIAL FORM", 0xFECC: "ARABIC LETTER AIN MEDIAL FORM", 0xFECD: "ARABIC LETTER GHAIN ISOLATED FORM", 0xFECE: "ARABIC LETTER GHAIN FINAL FORM", 0xFECF: "ARABIC LETTER GHAIN INITIAL FORM", 0xFED0: "ARABIC LETTER GHAIN MEDIAL FORM", 0xFED1: "ARABIC LETTER FEH ISOLATED FORM", 0xFED2: "ARABIC LETTER FEH FINAL FORM", 0xFED3: "ARABIC LETTER FEH INITIAL FORM", 0xFED4: "ARABIC LETTER FEH MEDIAL FORM", 0xFED5: "ARABIC LETTER QAF ISOLATED FORM", 0xFED6: "ARABIC LETTER QAF FINAL FORM", 0xFED7: "ARABIC LETTER QAF INITIAL FORM", 0xFED8: "ARABIC LETTER QAF MEDIAL FORM", 0xFED9: "ARABIC LETTER KAF ISOLATED FORM", 0xFEDA: "ARABIC LETTER KAF FINAL FORM", 0xFEDB: "ARABIC LETTER KAF INITIAL FORM", 0xFEDC: "ARABIC LETTER KAF MEDIAL FORM", 0xFEDD: "ARABIC LETTER LAM ISOLATED FORM", 0xFEDE: "ARABIC LETTER LAM FINAL FORM", 0xFEDF: "ARABIC LETTER LAM INITIAL FORM", 0xFEE0: "ARABIC LETTER LAM MEDIAL FORM", 0xFEE1: "ARABIC LETTER MEEM ISOLATED FORM", 0xFEE2: "ARABIC LETTER MEEM FINAL FORM", 0xFEE3: "ARABIC LETTER MEEM INITIAL FORM", 0xFEE4: "ARABIC LETTER MEEM MEDIAL FORM", 0xFEE5: "ARABIC LETTER NOON ISOLATED FORM", 0xFEE6: "ARABIC LETTER NOON FINAL FORM", 0xFEE7: "ARABIC LETTER NOON INITIAL FORM", 0xFEE8: "ARABIC LETTER NOON MEDIAL FORM", 0xFEE9: "ARABIC LETTER HEH ISOLATED FORM", 0xFEEA: "ARABIC LETTER HEH FINAL FORM", 0xFEEB: "ARABIC LETTER HEH INITIAL FORM", 0xFEEC: "ARABIC LETTER HEH MEDIAL FORM", 0xFEED: "ARABIC LETTER WAW ISOLATED FORM", 0xFEEE: "ARABIC LETTER WAW FINAL FORM", 0xFEEF: "ARABIC LETTER ALEF MAKSURA ISOLATED FORM", 0xFEF0: "ARABIC LETTER ALEF MAKSURA FINAL FORM", 0xFEF1: "ARABIC LETTER YEH ISOLATED FORM", 0xFEF2: "ARABIC LETTER YEH FINAL FORM", 0xFEF3: "ARABIC LETTER YEH INITIAL FORM", 0xFEF4: "ARABIC LETTER YEH MEDIAL FORM", 0xFEF5: "ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM", 0xFEF6: "ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM", 0xFEF7: "ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM", 0xFEF8: "ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM", 0xFEF9: "ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM", 0xFEFA: "ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM", 0xFEFB: "ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM", 0xFEFC: "ARABIC LIGATURE LAM WITH ALEF FINAL FORM", 0xFEFF: "ZERO WIDTH NO-BREAK SPACE", 0xFF01: "FULLWIDTH EXCLAMATION MARK", 0xFF02: "FULLWIDTH QUOTATION MARK", 0xFF03: "FULLWIDTH NUMBER SIGN", 0xFF04: "FULLWIDTH DOLLAR SIGN", 0xFF05: "FULLWIDTH PERCENT SIGN", 0xFF06: "FULLWIDTH AMPERSAND", 0xFF07: "FULLWIDTH APOSTROPHE", 0xFF08: "FULLWIDTH LEFT PARENTHESIS", 0xFF09: "FULLWIDTH RIGHT PARENTHESIS", 0xFF0A: "FULLWIDTH ASTERISK", 0xFF0B: "FULLWIDTH PLUS SIGN", 0xFF0C: "FULLWIDTH COMMA", 0xFF0D: "FULLWIDTH HYPHEN-MINUS", 0xFF0E: "FULLWIDTH FULL STOP", 0xFF0F: "FULLWIDTH SOLIDUS", 0xFF10: "FULLWIDTH DIGIT ZERO", 0xFF11: "FULLWIDTH DIGIT ONE", 0xFF12: "FULLWIDTH DIGIT TWO", 0xFF13: "FULLWIDTH DIGIT THREE", 0xFF14: "FULLWIDTH DIGIT FOUR", 0xFF15: "FULLWIDTH DIGIT FIVE", 0xFF16: "FULLWIDTH DIGIT SIX", 0xFF17: "FULLWIDTH DIGIT SEVEN", 0xFF18: "FULLWIDTH DIGIT EIGHT", 0xFF19: "FULLWIDTH DIGIT NINE", 0xFF1A: "FULLWIDTH COLON", 0xFF1B: "FULLWIDTH SEMICOLON", 0xFF1C: "FULLWIDTH LESS-THAN SIGN", 0xFF1D: "FULLWIDTH EQUALS SIGN", 0xFF1E: "FULLWIDTH GREATER-THAN SIGN", 0xFF1F: "FULLWIDTH QUESTION MARK", 0xFF20: "FULLWIDTH COMMERCIAL AT", 0xFF21: "FULLWIDTH LATIN CAPITAL LETTER A", 0xFF22: "FULLWIDTH LATIN CAPITAL LETTER B", 0xFF23: "FULLWIDTH LATIN CAPITAL LETTER C", 0xFF24: "FULLWIDTH LATIN CAPITAL LETTER D", 0xFF25: "FULLWIDTH LATIN CAPITAL LETTER E", 0xFF26: "FULLWIDTH LATIN CAPITAL LETTER F", 0xFF27: "FULLWIDTH LATIN CAPITAL LETTER G", 0xFF28: "FULLWIDTH LATIN CAPITAL LETTER H", 0xFF29: "FULLWIDTH LATIN CAPITAL LETTER I", 0xFF2A: "FULLWIDTH LATIN CAPITAL LETTER J", 0xFF2B: "FULLWIDTH LATIN CAPITAL LETTER K", 0xFF2C: "FULLWIDTH LATIN CAPITAL LETTER L", 0xFF2D: "FULLWIDTH LATIN CAPITAL LETTER M", 0xFF2E: "FULLWIDTH LATIN CAPITAL LETTER N", 0xFF2F: "FULLWIDTH LATIN CAPITAL LETTER O", 0xFF30: "FULLWIDTH LATIN CAPITAL LETTER P", 0xFF31: "FULLWIDTH LATIN CAPITAL LETTER Q", 0xFF32: "FULLWIDTH LATIN CAPITAL LETTER R", 0xFF33: "FULLWIDTH LATIN CAPITAL LETTER S", 0xFF34: "FULLWIDTH LATIN CAPITAL LETTER T", 0xFF35: "FULLWIDTH LATIN CAPITAL LETTER U", 0xFF36: "FULLWIDTH LATIN CAPITAL LETTER V", 0xFF37: "FULLWIDTH LATIN CAPITAL LETTER W", 0xFF38: "FULLWIDTH LATIN CAPITAL LETTER X", 0xFF39: "FULLWIDTH LATIN CAPITAL LETTER Y", 0xFF3A: "FULLWIDTH LATIN CAPITAL LETTER Z", 0xFF3B: "FULLWIDTH LEFT SQUARE BRACKET", 0xFF3C: "FULLWIDTH REVERSE SOLIDUS", 0xFF3D: "FULLWIDTH RIGHT SQUARE BRACKET", 0xFF3E: "FULLWIDTH CIRCUMFLEX ACCENT", 0xFF3F: "FULLWIDTH LOW LINE", 0xFF40: "FULLWIDTH GRAVE ACCENT", 0xFF41: "FULLWIDTH LATIN SMALL LETTER A", 0xFF42: "FULLWIDTH LATIN SMALL LETTER B", 0xFF43: "FULLWIDTH LATIN SMALL LETTER C", 0xFF44: "FULLWIDTH LATIN SMALL LETTER D", 0xFF45: "FULLWIDTH LATIN SMALL LETTER E", 0xFF46: "FULLWIDTH LATIN SMALL LETTER F", 0xFF47: "FULLWIDTH LATIN SMALL LETTER G", 0xFF48: "FULLWIDTH LATIN SMALL LETTER H", 0xFF49: "FULLWIDTH LATIN SMALL LETTER I", 0xFF4A: "FULLWIDTH LATIN SMALL LETTER J", 0xFF4B: "FULLWIDTH LATIN SMALL LETTER K", 0xFF4C: "FULLWIDTH LATIN SMALL LETTER L", 0xFF4D: "FULLWIDTH LATIN SMALL LETTER M", 0xFF4E: "FULLWIDTH LATIN SMALL LETTER N", 0xFF4F: "FULLWIDTH LATIN SMALL LETTER O", 0xFF50: "FULLWIDTH LATIN SMALL LETTER P", 0xFF51: "FULLWIDTH LATIN SMALL LETTER Q", 0xFF52: "FULLWIDTH LATIN SMALL LETTER R", 0xFF53: "FULLWIDTH LATIN SMALL LETTER S", 0xFF54: "FULLWIDTH LATIN SMALL LETTER T", 0xFF55: "FULLWIDTH LATIN SMALL LETTER U", 0xFF56: "FULLWIDTH LATIN SMALL LETTER V", 0xFF57: "FULLWIDTH LATIN SMALL LETTER W", 0xFF58: "FULLWIDTH LATIN SMALL LETTER X", 0xFF59: "FULLWIDTH LATIN SMALL LETTER Y", 0xFF5A: "FULLWIDTH LATIN SMALL LETTER Z", 0xFF5B: "FULLWIDTH LEFT CURLY BRACKET", 0xFF5C: "FULLWIDTH VERTICAL LINE", 0xFF5D: "FULLWIDTH RIGHT CURLY BRACKET", 0xFF5E: "FULLWIDTH TILDE", 0xFF5F: "FULLWIDTH LEFT WHITE PARENTHESIS *", 0xFF60: "FULLWIDTH RIGHT WHITE PARENTHESIS *", 0xFF61: "HALFWIDTH IDEOGRAPHIC FULL STOP", 0xFF62: "HALFWIDTH LEFT CORNER BRACKET", 0xFF63: "HALFWIDTH RIGHT CORNER BRACKET", 0xFF64: "HALFWIDTH IDEOGRAPHIC COMMA", 0xFF65: "HALFWIDTH KATAKANA MIDDLE DOT", 0xFF66: "HALFWIDTH KATAKANA LETTER WO", 0xFF67: "HALFWIDTH KATAKANA LETTER SMALL A", 0xFF68: "HALFWIDTH KATAKANA LETTER SMALL I", 0xFF69: "HALFWIDTH KATAKANA LETTER SMALL U", 0xFF6A: "HALFWIDTH KATAKANA LETTER SMALL E", 0xFF6B: "HALFWIDTH KATAKANA LETTER SMALL O", 0xFF6C: "HALFWIDTH KATAKANA LETTER SMALL YA", 0xFF6D: "HALFWIDTH KATAKANA LETTER SMALL YU", 0xFF6E: "HALFWIDTH KATAKANA LETTER SMALL YO", 0xFF6F: "HALFWIDTH KATAKANA LETTER SMALL TU", 0xFF70: "HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK", 0xFF71: "HALFWIDTH KATAKANA LETTER A", 0xFF72: "HALFWIDTH KATAKANA LETTER I", 0xFF73: "HALFWIDTH KATAKANA LETTER U", 0xFF74: "HALFWIDTH KATAKANA LETTER E", 0xFF75: "HALFWIDTH KATAKANA LETTER O", 0xFF76: "HALFWIDTH KATAKANA LETTER KA", 0xFF77: "HALFWIDTH KATAKANA LETTER KI", 0xFF78: "HALFWIDTH KATAKANA LETTER KU", 0xFF79: "HALFWIDTH KATAKANA LETTER KE", 0xFF7A: "HALFWIDTH KATAKANA LETTER KO", 0xFF7B: "HALFWIDTH KATAKANA LETTER SA", 0xFF7C: "HALFWIDTH KATAKANA LETTER SI", 0xFF7D: "HALFWIDTH KATAKANA LETTER SU", 0xFF7E: "HALFWIDTH KATAKANA LETTER SE", 0xFF7F: "HALFWIDTH KATAKANA LETTER SO", 0xFF80: "HALFWIDTH KATAKANA LETTER TA", 0xFF81: "HALFWIDTH KATAKANA LETTER TI", 0xFF82: "HALFWIDTH KATAKANA LETTER TU", 0xFF83: "HALFWIDTH KATAKANA LETTER TE", 0xFF84: "HALFWIDTH KATAKANA LETTER TO", 0xFF85: "HALFWIDTH KATAKANA LETTER NA", 0xFF86: "HALFWIDTH KATAKANA LETTER NI", 0xFF87: "HALFWIDTH KATAKANA LETTER NU", 0xFF88: "HALFWIDTH KATAKANA LETTER NE", 0xFF89: "HALFWIDTH KATAKANA LETTER NO", 0xFF8A: "HALFWIDTH KATAKANA LETTER HA", 0xFF8B: "HALFWIDTH KATAKANA LETTER HI", 0xFF8C: "HALFWIDTH KATAKANA LETTER HU", 0xFF8D: "HALFWIDTH KATAKANA LETTER HE", 0xFF8E: "HALFWIDTH KATAKANA LETTER HO", 0xFF8F: "HALFWIDTH KATAKANA LETTER MA", 0xFF90: "HALFWIDTH KATAKANA LETTER MI", 0xFF91: "HALFWIDTH KATAKANA LETTER MU", 0xFF92: "HALFWIDTH KATAKANA LETTER ME", 0xFF93: "HALFWIDTH KATAKANA LETTER MO", 0xFF94: "HALFWIDTH KATAKANA LETTER YA", 0xFF95: "HALFWIDTH KATAKANA LETTER YU", 0xFF96: "HALFWIDTH KATAKANA LETTER YO", 0xFF97: "HALFWIDTH KATAKANA LETTER RA", 0xFF98: "HALFWIDTH KATAKANA LETTER RI", 0xFF99: "HALFWIDTH KATAKANA LETTER RU", 0xFF9A: "HALFWIDTH KATAKANA LETTER RE", 0xFF9B: "HALFWIDTH KATAKANA LETTER RO", 0xFF9C: "HALFWIDTH KATAKANA LETTER WA", 0xFF9D: "HALFWIDTH KATAKANA LETTER N", 0xFF9E: "HALFWIDTH KATAKANA VOICED SOUND MARK (halfwidth katakana-hiragana voiced sound mark)", 0xFF9F: "HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK (halfwidth katakana-hiragana semi-voiced sound mark)", 0xFFA0: "HALFWIDTH HANGUL FILLER", 0xFFA1: "HALFWIDTH HANGUL LETTER KIYEOK", 0xFFA2: "HALFWIDTH HANGUL LETTER SSANGKIYEOK", 0xFFA3: "HALFWIDTH HANGUL LETTER KIYEOK-SIOS", 0xFFA4: "HALFWIDTH HANGUL LETTER NIEUN", 0xFFA5: "HALFWIDTH HANGUL LETTER NIEUN-CIEUC", 0xFFA6: "HALFWIDTH HANGUL LETTER NIEUN-HIEUH", 0xFFA7: "HALFWIDTH HANGUL LETTER TIKEUT", 0xFFA8: "HALFWIDTH HANGUL LETTER SSANGTIKEUT", 0xFFA9: "HALFWIDTH HANGUL LETTER RIEUL", 0xFFAA: "HALFWIDTH HANGUL LETTER RIEUL-KIYEOK", 0xFFAB: "HALFWIDTH HANGUL LETTER RIEUL-MIEUM", 0xFFAC: "HALFWIDTH HANGUL LETTER RIEUL-PIEUP", 0xFFAD: "HALFWIDTH HANGUL LETTER RIEUL-SIOS", 0xFFAE: "HALFWIDTH HANGUL LETTER RIEUL-THIEUTH", 0xFFAF: "HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH", 0xFFB0: "HALFWIDTH HANGUL LETTER RIEUL-HIEUH", 0xFFB1: "HALFWIDTH HANGUL LETTER MIEUM", 0xFFB2: "HALFWIDTH HANGUL LETTER PIEUP", 0xFFB3: "HALFWIDTH HANGUL LETTER SSANGPIEUP", 0xFFB4: "HALFWIDTH HANGUL LETTER PIEUP-SIOS", 0xFFB5: "HALFWIDTH HANGUL LETTER SIOS", 0xFFB6: "HALFWIDTH HANGUL LETTER SSANGSIOS", 0xFFB7: "HALFWIDTH HANGUL LETTER IEUNG", 0xFFB8: "HALFWIDTH HANGUL LETTER CIEUC", 0xFFB9: "HALFWIDTH HANGUL LETTER SSANGCIEUC", 0xFFBA: "HALFWIDTH HANGUL LETTER CHIEUCH", 0xFFBB: "HALFWIDTH HANGUL LETTER KHIEUKH", 0xFFBC: "HALFWIDTH HANGUL LETTER THIEUTH", 0xFFBD: "HALFWIDTH HANGUL LETTER PHIEUPH", 0xFFBE: "HALFWIDTH HANGUL LETTER HIEUH", 0xFFC2: "HALFWIDTH HANGUL LETTER A", 0xFFC3: "HALFWIDTH HANGUL LETTER AE", 0xFFC4: "HALFWIDTH HANGUL LETTER YA", 0xFFC5: "HALFWIDTH HANGUL LETTER YAE", 0xFFC6: "HALFWIDTH HANGUL LETTER EO", 0xFFC7: "HALFWIDTH HANGUL LETTER E", 0xFFCA: "HALFWIDTH HANGUL LETTER YEO", 0xFFCB: "HALFWIDTH HANGUL LETTER YE", 0xFFCC: "HALFWIDTH HANGUL LETTER O", 0xFFCD: "HALFWIDTH HANGUL LETTER WA", 0xFFCE: "HALFWIDTH HANGUL LETTER WAE", 0xFFCF: "HALFWIDTH HANGUL LETTER OE", 0xFFD2: "HALFWIDTH HANGUL LETTER YO", 0xFFD3: "HALFWIDTH HANGUL LETTER U", 0xFFD4: "HALFWIDTH HANGUL LETTER WEO", 0xFFD5: "HALFWIDTH HANGUL LETTER WE", 0xFFD6: "HALFWIDTH HANGUL LETTER WI", 0xFFD7: "HALFWIDTH HANGUL LETTER YU", 0xFFDA: "HALFWIDTH HANGUL LETTER EU", 0xFFDB: "HALFWIDTH HANGUL LETTER YI", 0xFFDC: "HALFWIDTH HANGUL LETTER I", 0xFFE0: "FULLWIDTH CENT SIGN", 0xFFE1: "FULLWIDTH POUND SIGN", 0xFFE2: "FULLWIDTH NOT SIGN", 0xFFE3: "FULLWIDTH MACRON *", 0xFFE4: "FULLWIDTH BROKEN BAR", 0xFFE5: "FULLWIDTH YEN SIGN", 0xFFE6: "FULLWIDTH WON SIGN", 0xFFE8: "HALFWIDTH FORMS LIGHT VERTICAL", 0xFFE9: "HALFWIDTH LEFTWARDS ARROW", 0xFFEA: "HALFWIDTH UPWARDS ARROW", 0xFFEB: "HALFWIDTH RIGHTWARDS ARROW", 0xFFEC: "HALFWIDTH DOWNWARDS ARROW", 0xFFED: "HALFWIDTH BLACK SQUARE", 0xFFEE: "HALFWIDTH WHITE CIRCLE", 0xFFF9: "INTERLINEAR ANNOTATION ANCHOR", 0xFFFA: "INTERLINEAR ANNOTATION SEPARATOR", 0xFFFB: "INTERLINEAR ANNOTATION TERMINATOR", 0xFFFC: "OBJECT REPLACEMENT CHARACTER", 0xFFFD: "REPLACEMENT CHARACTER", 0xFFFE: "", 0xFFFF: "", 0x10000: "LINEAR B SYLLABLE B008 A", 0x10001: "LINEAR B SYLLABLE B038 E", 0x10002: "LINEAR B SYLLABLE B028 I", 0x10003: "LINEAR B SYLLABLE B061 O", 0x10004: "LINEAR B SYLLABLE B010 U", 0x10005: "LINEAR B SYLLABLE B001 DA", 0x10006: "LINEAR B SYLLABLE B045 DE", 0x10007: "LINEAR B SYLLABLE B007 DI", 0x10008: "LINEAR B SYLLABLE B014 DO", 0x10009: "LINEAR B SYLLABLE B051 DU", 0x1000A: "LINEAR B SYLLABLE B057 JA", 0x1000B: "LINEAR B SYLLABLE B046 JE", 0x1000D: "LINEAR B SYLLABLE B036 JO", 0x1000E: "LINEAR B SYLLABLE B065 JU", 0x1000F: "LINEAR B SYLLABLE B077 KA", 0x10010: "LINEAR B SYLLABLE B044 KE", 0x10011: "LINEAR B SYLLABLE B067 KI", 0x10012: "LINEAR B SYLLABLE B070 KO", 0x10013: "LINEAR B SYLLABLE B081 KU", 0x10014: "LINEAR B SYLLABLE B080 MA", 0x10015: "LINEAR B SYLLABLE B013 ME", 0x10016: "LINEAR B SYLLABLE B073 MI", 0x10017: "LINEAR B SYLLABLE B015 MO", 0x10018: "LINEAR B SYLLABLE B023 MU", 0x10019: "LINEAR B SYLLABLE B006 NA", 0x1001A: "LINEAR B SYLLABLE B024 NE", 0x1001B: "LINEAR B SYLLABLE B030 NI", 0x1001C: "LINEAR B SYLLABLE B052 NO", 0x1001D: "LINEAR B SYLLABLE B055 NU", 0x1001E: "LINEAR B SYLLABLE B003 PA", 0x1001F: "LINEAR B SYLLABLE B072 PE", 0x10020: "LINEAR B SYLLABLE B039 PI", 0x10021: "LINEAR B SYLLABLE B011 PO", 0x10022: "LINEAR B SYLLABLE B050 PU", 0x10023: "LINEAR B SYLLABLE B016 QA", 0x10024: "LINEAR B SYLLABLE B078 QE", 0x10025: "LINEAR B SYLLABLE B021 QI", 0x10026: "LINEAR B SYLLABLE B032 QO", 0x10028: "LINEAR B SYLLABLE B060 RA", 0x10029: "LINEAR B SYLLABLE B027 RE", 0x1002A: "LINEAR B SYLLABLE B053 RI", 0x1002B: "LINEAR B SYLLABLE B002 RO", 0x1002C: "LINEAR B SYLLABLE B026 RU", 0x1002D: "LINEAR B SYLLABLE B031 SA", 0x1002E: "LINEAR B SYLLABLE B009 SE", 0x1002F: "LINEAR B SYLLABLE B041 SI", 0x10030: "LINEAR B SYLLABLE B012 SO", 0x10031: "LINEAR B SYLLABLE B058 SU", 0x10032: "LINEAR B SYLLABLE B059 TA", 0x10033: "LINEAR B SYLLABLE B004 TE", 0x10034: "LINEAR B SYLLABLE B037 TI", 0x10035: "LINEAR B SYLLABLE B005 TO", 0x10036: "LINEAR B SYLLABLE B069 TU", 0x10037: "LINEAR B SYLLABLE B054 WA", 0x10038: "LINEAR B SYLLABLE B075 WE", 0x10039: "LINEAR B SYLLABLE B040 WI", 0x1003A: "LINEAR B SYLLABLE B042 WO", 0x1003C: "LINEAR B SYLLABLE B017 ZA", 0x1003D: "LINEAR B SYLLABLE B074 ZE", 0x1003F: "LINEAR B SYLLABLE B020 ZO", 0x10040: "LINEAR B SYLLABLE B025 A2", 0x10041: "LINEAR B SYLLABLE B043 A3", 0x10042: "LINEAR B SYLLABLE B085 AU", 0x10043: "LINEAR B SYLLABLE B071 DWE", 0x10044: "LINEAR B SYLLABLE B090 DWO", 0x10045: "LINEAR B SYLLABLE B048 NWA", 0x10046: "LINEAR B SYLLABLE B029 PU2", 0x10047: "LINEAR B SYLLABLE B062 PTE", 0x10048: "LINEAR B SYLLABLE B076 RA2", 0x10049: "LINEAR B SYLLABLE B033 RA3", 0x1004A: "LINEAR B SYLLABLE B068 RO2", 0x1004B: "LINEAR B SYLLABLE B066 TA2", 0x1004C: "LINEAR B SYLLABLE B087 TWE", 0x1004D: "LINEAR B SYLLABLE B091 TWO", 0x10050: "LINEAR B SYMBOL B018", 0x10051: "LINEAR B SYMBOL B019", 0x10052: "LINEAR B SYMBOL B022", 0x10053: "LINEAR B SYMBOL B034", 0x10054: "LINEAR B SYMBOL B047", 0x10055: "LINEAR B SYMBOL B049", 0x10056: "LINEAR B SYMBOL B056", 0x10057: "LINEAR B SYMBOL B063", 0x10058: "LINEAR B SYMBOL B064", 0x10059: "LINEAR B SYMBOL B079", 0x1005A: "LINEAR B SYMBOL B082", 0x1005B: "LINEAR B SYMBOL B083", 0x1005C: "LINEAR B SYMBOL B086", 0x1005D: "LINEAR B SYMBOL B089", 0x10080: "LINEAR B IDEOGRAM B100 MAN", 0x10081: "LINEAR B IDEOGRAM B102 WOMAN", 0x10082: "LINEAR B IDEOGRAM B104 DEER", 0x10083: "LINEAR B IDEOGRAM B105 EQUID", 0x10084: "LINEAR B IDEOGRAM B105F MARE", 0x10085: "LINEAR B IDEOGRAM B105M STALLION", 0x10086: "LINEAR B IDEOGRAM B106F EWE", 0x10087: "LINEAR B IDEOGRAM B106M RAM", 0x10088: "LINEAR B IDEOGRAM B107F SHE-GOAT", 0x10089: "LINEAR B IDEOGRAM B107M HE-GOAT", 0x1008A: "LINEAR B IDEOGRAM B108F SOW", 0x1008B: "LINEAR B IDEOGRAM B108M BOAR", 0x1008C: "LINEAR B IDEOGRAM B109F COW", 0x1008D: "LINEAR B IDEOGRAM B109M BULL", 0x1008E: "LINEAR B IDEOGRAM B120 WHEAT", 0x1008F: "LINEAR B IDEOGRAM B121 BARLEY", 0x10090: "LINEAR B IDEOGRAM B122 OLIVE", 0x10091: "LINEAR B IDEOGRAM B123 SPICE", 0x10092: "LINEAR B IDEOGRAM B125 CYPERUS", 0x10093: "LINEAR B MONOGRAM B127 KAPO", 0x10094: "LINEAR B MONOGRAM B128 KANAKO", 0x10095: "LINEAR B IDEOGRAM B130 OIL", 0x10096: "LINEAR B IDEOGRAM B131 WINE", 0x10097: "LINEAR B IDEOGRAM B132", 0x10098: "LINEAR B MONOGRAM B133 AREPA", 0x10099: "LINEAR B MONOGRAM B135 MERI", 0x1009A: "LINEAR B IDEOGRAM B140 BRONZE", 0x1009B: "LINEAR B IDEOGRAM B141 GOLD", 0x1009C: "LINEAR B IDEOGRAM B142", 0x1009D: "LINEAR B IDEOGRAM B145 WOOL", 0x1009E: "LINEAR B IDEOGRAM B146", 0x1009F: "LINEAR B IDEOGRAM B150", 0x100A0: "LINEAR B IDEOGRAM B151 HORN", 0x100A1: "LINEAR B IDEOGRAM B152", 0x100A2: "LINEAR B IDEOGRAM B153", 0x100A3: "LINEAR B IDEOGRAM B154", 0x100A4: "LINEAR B MONOGRAM B156 TURO2", 0x100A5: "LINEAR B IDEOGRAM B157", 0x100A6: "LINEAR B IDEOGRAM B158", 0x100A7: "LINEAR B IDEOGRAM B159 CLOTH", 0x100A8: "LINEAR B IDEOGRAM B160", 0x100A9: "LINEAR B IDEOGRAM B161", 0x100AA: "LINEAR B IDEOGRAM B162 GARMENT", 0x100AB: "LINEAR B IDEOGRAM B163 ARMOUR", 0x100AC: "LINEAR B IDEOGRAM B164", 0x100AD: "LINEAR B IDEOGRAM B165", 0x100AE: "LINEAR B IDEOGRAM B166", 0x100AF: "LINEAR B IDEOGRAM B167", 0x100B0: "LINEAR B IDEOGRAM B168", 0x100B1: "LINEAR B IDEOGRAM B169", 0x100B2: "LINEAR B IDEOGRAM B170", 0x100B3: "LINEAR B IDEOGRAM B171", 0x100B4: "LINEAR B IDEOGRAM B172", 0x100B5: "LINEAR B IDEOGRAM B173 MONTH", 0x100B6: "LINEAR B IDEOGRAM B174", 0x100B7: "LINEAR B IDEOGRAM B176 TREE", 0x100B8: "LINEAR B IDEOGRAM B177", 0x100B9: "LINEAR B IDEOGRAM B178", 0x100BA: "LINEAR B IDEOGRAM B179", 0x100BB: "LINEAR B IDEOGRAM B180", 0x100BC: "LINEAR B IDEOGRAM B181", 0x100BD: "LINEAR B IDEOGRAM B182", 0x100BE: "LINEAR B IDEOGRAM B183", 0x100BF: "LINEAR B IDEOGRAM B184", 0x100C0: "LINEAR B IDEOGRAM B185", 0x100C1: "LINEAR B IDEOGRAM B189", 0x100C2: "LINEAR B IDEOGRAM B190", 0x100C3: "LINEAR B IDEOGRAM B191 HELMET", 0x100C4: "LINEAR B IDEOGRAM B220 FOOTSTOOL", 0x100C5: "LINEAR B IDEOGRAM B225 BATHTUB", 0x100C6: "LINEAR B IDEOGRAM B230 SPEAR", 0x100C7: "LINEAR B IDEOGRAM B231 ARROW", 0x100C8: "LINEAR B IDEOGRAM B232", 0x100C9: "LINEAR B IDEOGRAM B233 SWORD (pug)", 0x100CA: "LINEAR B IDEOGRAM B234", 0x100CB: "LINEAR B IDEOGRAM B236 (gup)", 0x100CC: "LINEAR B IDEOGRAM B240 WHEELED CHARIOT", 0x100CD: "LINEAR B IDEOGRAM B241 CHARIOT", 0x100CE: "LINEAR B IDEOGRAM B242 CHARIOT FRAME", 0x100CF: "LINEAR B IDEOGRAM B243 WHEEL", 0x100D0: "LINEAR B IDEOGRAM B245", 0x100D1: "LINEAR B IDEOGRAM B246", 0x100D2: "LINEAR B MONOGRAM B247 DIPTE", 0x100D3: "LINEAR B IDEOGRAM B248", 0x100D4: "LINEAR B IDEOGRAM B249", 0x100D5: "LINEAR B IDEOGRAM B251", 0x100D6: "LINEAR B IDEOGRAM B252", 0x100D7: "LINEAR B IDEOGRAM B253", 0x100D8: "LINEAR B IDEOGRAM B254 DART", 0x100D9: "LINEAR B IDEOGRAM B255", 0x100DA: "LINEAR B IDEOGRAM B256", 0x100DB: "LINEAR B IDEOGRAM B257", 0x100DC: "LINEAR B IDEOGRAM B258", 0x100DD: "LINEAR B IDEOGRAM B259", 0x100DE: "LINEAR B IDEOGRAM VESSEL B155", 0x100DF: "LINEAR B IDEOGRAM VESSEL B200", 0x100E0: "LINEAR B IDEOGRAM VESSEL B201", 0x100E1: "LINEAR B IDEOGRAM VESSEL B202", 0x100E2: "LINEAR B IDEOGRAM VESSEL B203", 0x100E3: "LINEAR B IDEOGRAM VESSEL B204", 0x100E4: "LINEAR B IDEOGRAM VESSEL B205", 0x100E5: "LINEAR B IDEOGRAM VESSEL B206", 0x100E6: "LINEAR B IDEOGRAM VESSEL B207", 0x100E7: "LINEAR B IDEOGRAM VESSEL B208", 0x100E8: "LINEAR B IDEOGRAM VESSEL B209", 0x100E9: "LINEAR B IDEOGRAM VESSEL B210", 0x100EA: "LINEAR B IDEOGRAM VESSEL B211", 0x100EB: "LINEAR B IDEOGRAM VESSEL B212", 0x100EC: "LINEAR B IDEOGRAM VESSEL B213", 0x100ED: "LINEAR B IDEOGRAM VESSEL B214", 0x100EE: "LINEAR B IDEOGRAM VESSEL B215", 0x100EF: "LINEAR B IDEOGRAM VESSEL B216", 0x100F0: "LINEAR B IDEOGRAM VESSEL B217", 0x100F1: "LINEAR B IDEOGRAM VESSEL B218", 0x100F2: "LINEAR B IDEOGRAM VESSEL B219", 0x100F3: "LINEAR B IDEOGRAM VESSEL B221", 0x100F4: "LINEAR B IDEOGRAM VESSEL B222", 0x100F5: "LINEAR B IDEOGRAM VESSEL B226", 0x100F6: "LINEAR B IDEOGRAM VESSEL B227", 0x100F7: "LINEAR B IDEOGRAM VESSEL B228", 0x100F8: "LINEAR B IDEOGRAM VESSEL B229", 0x100F9: "LINEAR B IDEOGRAM VESSEL B250", 0x100FA: "LINEAR B IDEOGRAM VESSEL B305", 0x10100: "AEGEAN WORD SEPARATOR LINE", 0x10101: "AEGEAN WORD SEPARATOR DOT", 0x10102: "AEGEAN CHECK MARK", 0x10107: "AEGEAN NUMBER ONE", 0x10108: "AEGEAN NUMBER TWO", 0x10109: "AEGEAN NUMBER THREE", 0x1010A: "AEGEAN NUMBER FOUR", 0x1010B: "AEGEAN NUMBER FIVE", 0x1010C: "AEGEAN NUMBER SIX", 0x1010D: "AEGEAN NUMBER SEVEN", 0x1010E: "AEGEAN NUMBER EIGHT", 0x1010F: "AEGEAN NUMBER NINE", 0x10110: "AEGEAN NUMBER TEN", 0x10111: "AEGEAN NUMBER TWENTY", 0x10112: "AEGEAN NUMBER THIRTY", 0x10113: "AEGEAN NUMBER FORTY", 0x10114: "AEGEAN NUMBER FIFTY", 0x10115: "AEGEAN NUMBER SIXTY", 0x10116: "AEGEAN NUMBER SEVENTY", 0x10117: "AEGEAN NUMBER EIGHTY", 0x10118: "AEGEAN NUMBER NINETY", 0x10119: "AEGEAN NUMBER ONE HUNDRED", 0x1011A: "AEGEAN NUMBER TWO HUNDRED", 0x1011B: "AEGEAN NUMBER THREE HUNDRED", 0x1011C: "AEGEAN NUMBER FOUR HUNDRED", 0x1011D: "AEGEAN NUMBER FIVE HUNDRED", 0x1011E: "AEGEAN NUMBER SIX HUNDRED", 0x1011F: "AEGEAN NUMBER SEVEN HUNDRED", 0x10120: "AEGEAN NUMBER EIGHT HUNDRED", 0x10121: "AEGEAN NUMBER NINE HUNDRED", 0x10122: "AEGEAN NUMBER ONE THOUSAND", 0x10123: "AEGEAN NUMBER TWO THOUSAND", 0x10124: "AEGEAN NUMBER THREE THOUSAND", 0x10125: "AEGEAN NUMBER FOUR THOUSAND", 0x10126: "AEGEAN NUMBER FIVE THOUSAND", 0x10127: "AEGEAN NUMBER SIX THOUSAND", 0x10128: "AEGEAN NUMBER SEVEN THOUSAND", 0x10129: "AEGEAN NUMBER EIGHT THOUSAND", 0x1012A: "AEGEAN NUMBER NINE THOUSAND", 0x1012B: "AEGEAN NUMBER TEN THOUSAND", 0x1012C: "AEGEAN NUMBER TWENTY THOUSAND", 0x1012D: "AEGEAN NUMBER THIRTY THOUSAND", 0x1012E: "AEGEAN NUMBER FORTY THOUSAND", 0x1012F: "AEGEAN NUMBER FIFTY THOUSAND", 0x10130: "AEGEAN NUMBER SIXTY THOUSAND", 0x10131: "AEGEAN NUMBER SEVENTY THOUSAND", 0x10132: "AEGEAN NUMBER EIGHTY THOUSAND", 0x10133: "AEGEAN NUMBER NINETY THOUSAND", 0x10137: "AEGEAN WEIGHT BASE UNIT", 0x10138: "AEGEAN WEIGHT FIRST SUBUNIT", 0x10139: "AEGEAN WEIGHT SECOND SUBUNIT", 0x1013A: "AEGEAN WEIGHT THIRD SUBUNIT", 0x1013B: "AEGEAN WEIGHT FOURTH SUBUNIT", 0x1013C: "AEGEAN DRY MEASURE FIRST SUBUNIT", 0x1013D: "AEGEAN LIQUID MEASURE FIRST SUBUNIT", 0x1013E: "AEGEAN MEASURE SECOND SUBUNIT", 0x1013F: "AEGEAN MEASURE THIRD SUBUNIT", 0x10140: "GREEK ACROPHONIC ATTIC ONE QUARTER", 0x10141: "GREEK ACROPHONIC ATTIC ONE HALF", 0x10142: "GREEK ACROPHONIC ATTIC ONE DRACHMA", 0x10143: "GREEK ACROPHONIC ATTIC FIVE", 0x10144: "GREEK ACROPHONIC ATTIC FIFTY", 0x10145: "GREEK ACROPHONIC ATTIC FIVE HUNDRED", 0x10146: "GREEK ACROPHONIC ATTIC FIVE THOUSAND", 0x10147: "GREEK ACROPHONIC ATTIC FIFTY THOUSAND", 0x10148: "GREEK ACROPHONIC ATTIC FIVE TALENTS", 0x10149: "GREEK ACROPHONIC ATTIC TEN TALENTS", 0x1014A: "GREEK ACROPHONIC ATTIC FIFTY TALENTS", 0x1014B: "GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS", 0x1014C: "GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS", 0x1014D: "GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS", 0x1014E: "GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS", 0x1014F: "GREEK ACROPHONIC ATTIC FIVE STATERS", 0x10150: "GREEK ACROPHONIC ATTIC TEN STATERS", 0x10151: "GREEK ACROPHONIC ATTIC FIFTY STATERS", 0x10152: "GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS", 0x10153: "GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS", 0x10154: "GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS", 0x10155: "GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS", 0x10156: "GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS", 0x10157: "GREEK ACROPHONIC ATTIC TEN MNAS", 0x10158: "GREEK ACROPHONIC HERAEUM ONE PLETHRON", 0x10159: "GREEK ACROPHONIC THESPIAN ONE", 0x1015A: "GREEK ACROPHONIC HERMIONIAN ONE", 0x1015B: "GREEK ACROPHONIC EPIDAUREAN TWO", 0x1015C: "GREEK ACROPHONIC THESPIAN TWO", 0x1015D: "GREEK ACROPHONIC CYRENAIC TWO DRACHMAS", 0x1015E: "GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS", 0x1015F: "GREEK ACROPHONIC TROEZENIAN FIVE", 0x10160: "GREEK ACROPHONIC TROEZENIAN TEN", 0x10161: "GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM", 0x10162: "GREEK ACROPHONIC HERMIONIAN TEN", 0x10163: "GREEK ACROPHONIC MESSENIAN TEN", 0x10164: "GREEK ACROPHONIC THESPIAN TEN", 0x10165: "GREEK ACROPHONIC THESPIAN THIRTY", 0x10166: "GREEK ACROPHONIC TROEZENIAN FIFTY", 0x10167: "GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM", 0x10168: "GREEK ACROPHONIC HERMIONIAN FIFTY", 0x10169: "GREEK ACROPHONIC THESPIAN FIFTY", 0x1016A: "GREEK ACROPHONIC THESPIAN ONE HUNDRED", 0x1016B: "GREEK ACROPHONIC THESPIAN THREE HUNDRED", 0x1016C: "GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED", 0x1016D: "GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED", 0x1016E: "GREEK ACROPHONIC THESPIAN FIVE HUNDRED", 0x1016F: "GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED", 0x10170: "GREEK ACROPHONIC NAXIAN FIVE HUNDRED", 0x10171: "GREEK ACROPHONIC THESPIAN ONE THOUSAND", 0x10172: "GREEK ACROPHONIC THESPIAN FIVE THOUSAND", 0x10173: "GREEK ACROPHONIC DELPHIC FIVE MNAS", 0x10174: "GREEK ACROPHONIC STRATIAN FIFTY MNAS", 0x10175: "GREEK ONE HALF SIGN", 0x10176: "GREEK ONE HALF SIGN ALTERNATE FORM", 0x10177: "GREEK TWO THIRDS SIGN", 0x10178: "GREEK THREE QUARTERS SIGN", 0x10179: "GREEK YEAR SIGN", 0x1017A: "GREEK TALENT SIGN", 0x1017B: "GREEK DRACHMA SIGN", 0x1017C: "GREEK OBOL SIGN", 0x1017D: "GREEK TWO OBOLS SIGN", 0x1017E: "GREEK THREE OBOLS SIGN", 0x1017F: "GREEK FOUR OBOLS SIGN", 0x10180: "GREEK FIVE OBOLS SIGN", 0x10181: "GREEK METRETES SIGN", 0x10182: "GREEK KYATHOS BASE SIGN", 0x10183: "GREEK LITRA SIGN", 0x10184: "GREEK OUNKIA SIGN", 0x10185: "GREEK XESTES SIGN", 0x10186: "GREEK ARTABE SIGN", 0x10187: "GREEK AROURA SIGN", 0x10188: "GREEK GRAMMA SIGN", 0x10189: "GREEK TRYBLION BASE SIGN", 0x1018A: "GREEK ZERO SIGN", 0x10190: "ROMAN SEXTANS SIGN", 0x10191: "ROMAN UNCIA SIGN", 0x10192: "ROMAN SEMUNCIA SIGN", 0x10193: "ROMAN SEXTULA SIGN", 0x10194: "ROMAN DIMIDIA SEXTULA SIGN", 0x10195: "ROMAN SILIQUA SIGN", 0x10196: "ROMAN DENARIUS SIGN", 0x10197: "ROMAN QUINARIUS SIGN", 0x10198: "ROMAN SESTERTIUS SIGN", 0x10199: "ROMAN DUPONDIUS SIGN", 0x1019A: "ROMAN AS SIGN", 0x1019B: "ROMAN CENTURIAL SIGN", 0x101D0: "PHAISTOS DISC SIGN PEDESTRIAN", 0x101D1: "PHAISTOS DISC SIGN PLUMED HEAD", 0x101D2: "PHAISTOS DISC SIGN TATTOOED HEAD", 0x101D3: "PHAISTOS DISC SIGN CAPTIVE", 0x101D4: "PHAISTOS DISC SIGN CHILD", 0x101D5: "PHAISTOS DISC SIGN WOMAN", 0x101D6: "PHAISTOS DISC SIGN HELMET", 0x101D7: "PHAISTOS DISC SIGN GAUNTLET", 0x101D8: "PHAISTOS DISC SIGN TIARA", 0x101D9: "PHAISTOS DISC SIGN ARROW", 0x101DA: "PHAISTOS DISC SIGN BOW", 0x101DB: "PHAISTOS DISC SIGN SHIELD", 0x101DC: "PHAISTOS DISC SIGN CLUB", 0x101DD: "PHAISTOS DISC SIGN MANACLES", 0x101DE: "PHAISTOS DISC SIGN MATTOCK", 0x101DF: "PHAISTOS DISC SIGN SAW", 0x101E0: "PHAISTOS DISC SIGN LID", 0x101E1: "PHAISTOS DISC SIGN BOOMERANG", 0x101E2: "PHAISTOS DISC SIGN CARPENTRY PLANE", 0x101E3: "PHAISTOS DISC SIGN DOLIUM", 0x101E4: "PHAISTOS DISC SIGN COMB", 0x101E5: "PHAISTOS DISC SIGN SLING", 0x101E6: "PHAISTOS DISC SIGN COLUMN", 0x101E7: "PHAISTOS DISC SIGN BEEHIVE", 0x101E8: "PHAISTOS DISC SIGN SHIP", 0x101E9: "PHAISTOS DISC SIGN HORN", 0x101EA: "PHAISTOS DISC SIGN HIDE", 0x101EB: "PHAISTOS DISC SIGN BULLS LEG", 0x101EC: "PHAISTOS DISC SIGN CAT", 0x101ED: "PHAISTOS DISC SIGN RAM", 0x101EE: "PHAISTOS DISC SIGN EAGLE", 0x101EF: "PHAISTOS DISC SIGN DOVE", 0x101F0: "PHAISTOS DISC SIGN TUNNY", 0x101F1: "PHAISTOS DISC SIGN BEE", 0x101F2: "PHAISTOS DISC SIGN PLANE TREE", 0x101F3: "PHAISTOS DISC SIGN VINE", 0x101F4: "PHAISTOS DISC SIGN PAPYRUS", 0x101F5: "PHAISTOS DISC SIGN ROSETTE", 0x101F6: "PHAISTOS DISC SIGN LILY", 0x101F7: "PHAISTOS DISC SIGN OX BACK", 0x101F8: "PHAISTOS DISC SIGN FLUTE", 0x101F9: "PHAISTOS DISC SIGN GRATER", 0x101FA: "PHAISTOS DISC SIGN STRAINER", 0x101FB: "PHAISTOS DISC SIGN SMALL AXE", 0x101FC: "PHAISTOS DISC SIGN WAVY BAND", 0x101FD: "PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE", 0x10280: "LYCIAN LETTER A", 0x10281: "LYCIAN LETTER E", 0x10282: "LYCIAN LETTER B", 0x10283: "LYCIAN LETTER BH", 0x10284: "LYCIAN LETTER G", 0x10285: "LYCIAN LETTER D", 0x10286: "LYCIAN LETTER I", 0x10287: "LYCIAN LETTER W", 0x10288: "LYCIAN LETTER Z", 0x10289: "LYCIAN LETTER TH", 0x1028A: "LYCIAN LETTER J", 0x1028B: "LYCIAN LETTER K", 0x1028C: "LYCIAN LETTER Q", 0x1028D: "LYCIAN LETTER L", 0x1028E: "LYCIAN LETTER M", 0x1028F: "LYCIAN LETTER N", 0x10290: "LYCIAN LETTER MM", 0x10291: "LYCIAN LETTER NN", 0x10292: "LYCIAN LETTER U", 0x10293: "LYCIAN LETTER P", 0x10294: "LYCIAN LETTER KK", 0x10295: "LYCIAN LETTER R", 0x10296: "LYCIAN LETTER S", 0x10297: "LYCIAN LETTER T", 0x10298: "LYCIAN LETTER TT", 0x10299: "LYCIAN LETTER AN", 0x1029A: "LYCIAN LETTER EN", 0x1029B: "LYCIAN LETTER H", 0x1029C: "LYCIAN LETTER X", 0x102A0: "CARIAN LETTER A", 0x102A1: "CARIAN LETTER P2", 0x102A2: "CARIAN LETTER D", 0x102A3: "CARIAN LETTER L", 0x102A4: "CARIAN LETTER UUU", 0x102A5: "CARIAN LETTER R", 0x102A6: "CARIAN LETTER LD", 0x102A7: "CARIAN LETTER A2", 0x102A8: "CARIAN LETTER Q", 0x102A9: "CARIAN LETTER B", 0x102AA: "CARIAN LETTER M", 0x102AB: "CARIAN LETTER O", 0x102AC: "CARIAN LETTER D2", 0x102AD: "CARIAN LETTER T", 0x102AE: "CARIAN LETTER SH", 0x102AF: "CARIAN LETTER SH2", 0x102B0: "CARIAN LETTER S", 0x102B1: "CARIAN LETTER C-18", 0x102B2: "CARIAN LETTER U", 0x102B3: "CARIAN LETTER NN", 0x102B4: "CARIAN LETTER X", 0x102B5: "CARIAN LETTER N", 0x102B6: "CARIAN LETTER TT2", 0x102B7: "CARIAN LETTER P", 0x102B8: "CARIAN LETTER SS", 0x102B9: "CARIAN LETTER I", 0x102BA: "CARIAN LETTER E", 0x102BB: "CARIAN LETTER UUUU", 0x102BC: "CARIAN LETTER K", 0x102BD: "CARIAN LETTER K2", 0x102BE: "CARIAN LETTER ND", 0x102BF: "CARIAN LETTER UU", 0x102C0: "CARIAN LETTER G", 0x102C1: "CARIAN LETTER G2", 0x102C2: "CARIAN LETTER ST", 0x102C3: "CARIAN LETTER ST2", 0x102C4: "CARIAN LETTER NG", 0x102C5: "CARIAN LETTER II", 0x102C6: "CARIAN LETTER C-39", 0x102C7: "CARIAN LETTER TT", 0x102C8: "CARIAN LETTER UUU2", 0x102C9: "CARIAN LETTER RR", 0x102CA: "CARIAN LETTER MB", 0x102CB: "CARIAN LETTER MB2", 0x102CC: "CARIAN LETTER MB3", 0x102CD: "CARIAN LETTER MB4", 0x102CE: "CARIAN LETTER LD2", 0x102CF: "CARIAN LETTER E2", 0x102D0: "CARIAN LETTER UUU3", 0x10300: "OLD ITALIC LETTER A", 0x10301: "OLD ITALIC LETTER BE", 0x10302: "OLD ITALIC LETTER KE", 0x10303: "OLD ITALIC LETTER DE", 0x10304: "OLD ITALIC LETTER E", 0x10305: "OLD ITALIC LETTER VE", 0x10306: "OLD ITALIC LETTER ZE", 0x10307: "OLD ITALIC LETTER HE", 0x10308: "OLD ITALIC LETTER THE", 0x10309: "OLD ITALIC LETTER I", 0x1030A: "OLD ITALIC LETTER KA", 0x1030B: "OLD ITALIC LETTER EL", 0x1030C: "OLD ITALIC LETTER EM", 0x1030D: "OLD ITALIC LETTER EN", 0x1030E: "OLD ITALIC LETTER ESH", 0x1030F: "OLD ITALIC LETTER O (Faliscan)", 0x10310: "OLD ITALIC LETTER PE", 0x10311: "OLD ITALIC LETTER SHE", 0x10312: "OLD ITALIC LETTER KU", 0x10313: "OLD ITALIC LETTER ER", 0x10314: "OLD ITALIC LETTER ES", 0x10315: "OLD ITALIC LETTER TE", 0x10316: "OLD ITALIC LETTER U", 0x10317: "OLD ITALIC LETTER EKS (Faliscan)", 0x10318: "OLD ITALIC LETTER PHE", 0x10319: "OLD ITALIC LETTER KHE", 0x1031A: "OLD ITALIC LETTER EF", 0x1031B: "OLD ITALIC LETTER ERS (Umbrian)", 0x1031C: "OLD ITALIC LETTER CHE (Umbrian)", 0x1031D: "OLD ITALIC LETTER II (Oscan)", 0x1031E: "OLD ITALIC LETTER UU (Oscan)", 0x10320: "OLD ITALIC NUMERAL ONE", 0x10321: "OLD ITALIC NUMERAL FIVE", 0x10322: "OLD ITALIC NUMERAL TEN", 0x10323: "OLD ITALIC NUMERAL FIFTY", 0x10330: "GOTHIC LETTER AHSA", 0x10331: "GOTHIC LETTER BAIRKAN", 0x10332: "GOTHIC LETTER GIBA", 0x10333: "GOTHIC LETTER DAGS", 0x10334: "GOTHIC LETTER AIHVUS", 0x10335: "GOTHIC LETTER QAIRTHRA", 0x10336: "GOTHIC LETTER IUJA", 0x10337: "GOTHIC LETTER HAGL", 0x10338: "GOTHIC LETTER THIUTH", 0x10339: "GOTHIC LETTER EIS", 0x1033A: "GOTHIC LETTER KUSMA", 0x1033B: "GOTHIC LETTER LAGUS", 0x1033C: "GOTHIC LETTER MANNA", 0x1033D: "GOTHIC LETTER NAUTHS", 0x1033E: "GOTHIC LETTER JER", 0x1033F: "GOTHIC LETTER URUS", 0x10340: "GOTHIC LETTER PAIRTHRA", 0x10341: "GOTHIC LETTER NINETY", 0x10342: "GOTHIC LETTER RAIDA", 0x10343: "GOTHIC LETTER SAUIL", 0x10344: "GOTHIC LETTER TEIWS", 0x10345: "GOTHIC LETTER WINJA", 0x10346: "GOTHIC LETTER FAIHU", 0x10347: "GOTHIC LETTER IGGWS", 0x10348: "GOTHIC LETTER HWAIR", 0x10349: "GOTHIC LETTER OTHAL", 0x1034A: "GOTHIC LETTER NINE HUNDRED", 0x10380: "UGARITIC LETTER ALPA", 0x10381: "UGARITIC LETTER BETA", 0x10382: "UGARITIC LETTER GAMLA", 0x10383: "UGARITIC LETTER KHA", 0x10384: "UGARITIC LETTER DELTA", 0x10385: "UGARITIC LETTER HO", 0x10386: "UGARITIC LETTER WO", 0x10387: "UGARITIC LETTER ZETA", 0x10388: "UGARITIC LETTER HOTA", 0x10389: "UGARITIC LETTER TET", 0x1038A: "UGARITIC LETTER YOD", 0x1038B: "UGARITIC LETTER KAF", 0x1038C: "UGARITIC LETTER SHIN", 0x1038D: "UGARITIC LETTER LAMDA", 0x1038E: "UGARITIC LETTER MEM", 0x1038F: "UGARITIC LETTER DHAL", 0x10390: "UGARITIC LETTER NUN", 0x10391: "UGARITIC LETTER ZU", 0x10392: "UGARITIC LETTER SAMKA", 0x10393: "UGARITIC LETTER AIN", 0x10394: "UGARITIC LETTER PU", 0x10395: "UGARITIC LETTER SADE", 0x10396: "UGARITIC LETTER QOPA", 0x10397: "UGARITIC LETTER RASHA", 0x10398: "UGARITIC LETTER THANNA", 0x10399: "UGARITIC LETTER GHAIN", 0x1039A: "UGARITIC LETTER TO", 0x1039B: "UGARITIC LETTER I", 0x1039C: "UGARITIC LETTER U", 0x1039D: "UGARITIC LETTER SSU", 0x1039F: "UGARITIC WORD DIVIDER", 0x103A0: "OLD PERSIAN SIGN A", 0x103A1: "OLD PERSIAN SIGN I", 0x103A2: "OLD PERSIAN SIGN U", 0x103A3: "OLD PERSIAN SIGN KA", 0x103A4: "OLD PERSIAN SIGN KU", 0x103A5: "OLD PERSIAN SIGN GA", 0x103A6: "OLD PERSIAN SIGN GU", 0x103A7: "OLD PERSIAN SIGN XA", 0x103A8: "OLD PERSIAN SIGN CA", 0x103A9: "OLD PERSIAN SIGN JA", 0x103AA: "OLD PERSIAN SIGN JI", 0x103AB: "OLD PERSIAN SIGN TA", 0x103AC: "OLD PERSIAN SIGN TU", 0x103AD: "OLD PERSIAN SIGN DA", 0x103AE: "OLD PERSIAN SIGN DI", 0x103AF: "OLD PERSIAN SIGN DU", 0x103B0: "OLD PERSIAN SIGN THA", 0x103B1: "OLD PERSIAN SIGN PA", 0x103B2: "OLD PERSIAN SIGN BA", 0x103B3: "OLD PERSIAN SIGN FA", 0x103B4: "OLD PERSIAN SIGN NA", 0x103B5: "OLD PERSIAN SIGN NU", 0x103B6: "OLD PERSIAN SIGN MA", 0x103B7: "OLD PERSIAN SIGN MI", 0x103B8: "OLD PERSIAN SIGN MU", 0x103B9: "OLD PERSIAN SIGN YA", 0x103BA: "OLD PERSIAN SIGN VA", 0x103BB: "OLD PERSIAN SIGN VI", 0x103BC: "OLD PERSIAN SIGN RA", 0x103BD: "OLD PERSIAN SIGN RU", 0x103BE: "OLD PERSIAN SIGN LA", 0x103BF: "OLD PERSIAN SIGN SA", 0x103C0: "OLD PERSIAN SIGN ZA", 0x103C1: "OLD PERSIAN SIGN SHA", 0x103C2: "OLD PERSIAN SIGN SSA", 0x103C3: "OLD PERSIAN SIGN HA", 0x103C8: "OLD PERSIAN SIGN AURAMAZDAA", 0x103C9: "OLD PERSIAN SIGN AURAMAZDAA-2", 0x103CA: "OLD PERSIAN SIGN AURAMAZDAAHA", 0x103CB: "OLD PERSIAN SIGN XSHAAYATHIYA", 0x103CC: "OLD PERSIAN SIGN DAHYAAUSH", 0x103CD: "OLD PERSIAN SIGN DAHYAAUSH-2", 0x103CE: "OLD PERSIAN SIGN BAGA", 0x103CF: "OLD PERSIAN SIGN BUUMISH", 0x103D0: "OLD PERSIAN WORD DIVIDER", 0x103D1: "OLD PERSIAN NUMBER ONE", 0x103D2: "OLD PERSIAN NUMBER TWO", 0x103D3: "OLD PERSIAN NUMBER TEN", 0x103D4: "OLD PERSIAN NUMBER TWENTY", 0x103D5: "OLD PERSIAN NUMBER HUNDRED", 0x10400: "DESERET CAPITAL LETTER LONG I", 0x10401: "DESERET CAPITAL LETTER LONG E", 0x10402: "DESERET CAPITAL LETTER LONG A", 0x10403: "DESERET CAPITAL LETTER LONG AH", 0x10404: "DESERET CAPITAL LETTER LONG O", 0x10405: "DESERET CAPITAL LETTER LONG OO", 0x10406: "DESERET CAPITAL LETTER SHORT I", 0x10407: "DESERET CAPITAL LETTER SHORT E", 0x10408: "DESERET CAPITAL LETTER SHORT A", 0x10409: "DESERET CAPITAL LETTER SHORT AH", 0x1040A: "DESERET CAPITAL LETTER SHORT O", 0x1040B: "DESERET CAPITAL LETTER SHORT OO", 0x1040C: "DESERET CAPITAL LETTER AY", 0x1040D: "DESERET CAPITAL LETTER OW", 0x1040E: "DESERET CAPITAL LETTER WU", 0x1040F: "DESERET CAPITAL LETTER YEE", 0x10410: "DESERET CAPITAL LETTER H", 0x10411: "DESERET CAPITAL LETTER PEE", 0x10412: "DESERET CAPITAL LETTER BEE", 0x10413: "DESERET CAPITAL LETTER TEE", 0x10414: "DESERET CAPITAL LETTER DEE", 0x10415: "DESERET CAPITAL LETTER CHEE", 0x10416: "DESERET CAPITAL LETTER JEE", 0x10417: "DESERET CAPITAL LETTER KAY", 0x10418: "DESERET CAPITAL LETTER GAY", 0x10419: "DESERET CAPITAL LETTER EF", 0x1041A: "DESERET CAPITAL LETTER VEE", 0x1041B: "DESERET CAPITAL LETTER ETH", 0x1041C: "DESERET CAPITAL LETTER THEE", 0x1041D: "DESERET CAPITAL LETTER ES", 0x1041E: "DESERET CAPITAL LETTER ZEE", 0x1041F: "DESERET CAPITAL LETTER ESH", 0x10420: "DESERET CAPITAL LETTER ZHEE", 0x10421: "DESERET CAPITAL LETTER ER", 0x10422: "DESERET CAPITAL LETTER EL", 0x10423: "DESERET CAPITAL LETTER EM", 0x10424: "DESERET CAPITAL LETTER EN", 0x10425: "DESERET CAPITAL LETTER ENG", 0x10426: "DESERET CAPITAL LETTER OI", 0x10427: "DESERET CAPITAL LETTER EW", 0x10428: "DESERET SMALL LETTER LONG I", 0x10429: "DESERET SMALL LETTER LONG E", 0x1042A: "DESERET SMALL LETTER LONG A", 0x1042B: "DESERET SMALL LETTER LONG AH", 0x1042C: "DESERET SMALL LETTER LONG O", 0x1042D: "DESERET SMALL LETTER LONG OO", 0x1042E: "DESERET SMALL LETTER SHORT I", 0x1042F: "DESERET SMALL LETTER SHORT E", 0x10430: "DESERET SMALL LETTER SHORT A", 0x10431: "DESERET SMALL LETTER SHORT AH", 0x10432: "DESERET SMALL LETTER SHORT O", 0x10433: "DESERET SMALL LETTER SHORT OO", 0x10434: "DESERET SMALL LETTER AY", 0x10435: "DESERET SMALL LETTER OW", 0x10436: "DESERET SMALL LETTER WU", 0x10437: "DESERET SMALL LETTER YEE", 0x10438: "DESERET SMALL LETTER H", 0x10439: "DESERET SMALL LETTER PEE", 0x1043A: "DESERET SMALL LETTER BEE", 0x1043B: "DESERET SMALL LETTER TEE", 0x1043C: "DESERET SMALL LETTER DEE", 0x1043D: "DESERET SMALL LETTER CHEE", 0x1043E: "DESERET SMALL LETTER JEE", 0x1043F: "DESERET SMALL LETTER KAY", 0x10440: "DESERET SMALL LETTER GAY", 0x10441: "DESERET SMALL LETTER EF", 0x10442: "DESERET SMALL LETTER VEE", 0x10443: "DESERET SMALL LETTER ETH", 0x10444: "DESERET SMALL LETTER THEE", 0x10445: "DESERET SMALL LETTER ES", 0x10446: "DESERET SMALL LETTER ZEE", 0x10447: "DESERET SMALL LETTER ESH", 0x10448: "DESERET SMALL LETTER ZHEE", 0x10449: "DESERET SMALL LETTER ER", 0x1044A: "DESERET SMALL LETTER EL", 0x1044B: "DESERET SMALL LETTER EM", 0x1044C: "DESERET SMALL LETTER EN", 0x1044D: "DESERET SMALL LETTER ENG", 0x1044E: "DESERET SMALL LETTER OI", 0x1044F: "DESERET SMALL LETTER EW", 0x10450: "SHAVIAN LETTER PEEP", 0x10451: "SHAVIAN LETTER TOT", 0x10452: "SHAVIAN LETTER KICK", 0x10453: "SHAVIAN LETTER FEE", 0x10454: "SHAVIAN LETTER THIGH", 0x10455: "SHAVIAN LETTER SO", 0x10456: "SHAVIAN LETTER SURE", 0x10457: "SHAVIAN LETTER CHURCH", 0x10458: "SHAVIAN LETTER YEA", 0x10459: "SHAVIAN LETTER HUNG", 0x1045A: "SHAVIAN LETTER BIB", 0x1045B: "SHAVIAN LETTER DEAD", 0x1045C: "SHAVIAN LETTER GAG", 0x1045D: "SHAVIAN LETTER VOW", 0x1045E: "SHAVIAN LETTER THEY", 0x1045F: "SHAVIAN LETTER ZOO", 0x10460: "SHAVIAN LETTER MEASURE", 0x10461: "SHAVIAN LETTER JUDGE", 0x10462: "SHAVIAN LETTER WOE", 0x10463: "SHAVIAN LETTER HA-HA", 0x10464: "SHAVIAN LETTER LOLL", 0x10465: "SHAVIAN LETTER MIME", 0x10466: "SHAVIAN LETTER IF", 0x10467: "SHAVIAN LETTER EGG", 0x10468: "SHAVIAN LETTER ASH", 0x10469: "SHAVIAN LETTER ADO", 0x1046A: "SHAVIAN LETTER ON", 0x1046B: "SHAVIAN LETTER WOOL", 0x1046C: "SHAVIAN LETTER OUT", 0x1046D: "SHAVIAN LETTER AH", 0x1046E: "SHAVIAN LETTER ROAR", 0x1046F: "SHAVIAN LETTER NUN", 0x10470: "SHAVIAN LETTER EAT", 0x10471: "SHAVIAN LETTER AGE", 0x10472: "SHAVIAN LETTER ICE", 0x10473: "SHAVIAN LETTER UP", 0x10474: "SHAVIAN LETTER OAK", 0x10475: "SHAVIAN LETTER OOZE", 0x10476: "SHAVIAN LETTER OIL", 0x10477: "SHAVIAN LETTER AWE", 0x10478: "SHAVIAN LETTER ARE", 0x10479: "SHAVIAN LETTER OR", 0x1047A: "SHAVIAN LETTER AIR", 0x1047B: "SHAVIAN LETTER ERR", 0x1047C: "SHAVIAN LETTER ARRAY", 0x1047D: "SHAVIAN LETTER EAR", 0x1047E: "SHAVIAN LETTER IAN", 0x1047F: "SHAVIAN LETTER YEW", 0x10480: "OSMANYA LETTER ALEF", 0x10481: "OSMANYA LETTER BA", 0x10482: "OSMANYA LETTER TA", 0x10483: "OSMANYA LETTER JA", 0x10484: "OSMANYA LETTER XA", 0x10485: "OSMANYA LETTER KHA", 0x10486: "OSMANYA LETTER DEEL", 0x10487: "OSMANYA LETTER RA", 0x10488: "OSMANYA LETTER SA", 0x10489: "OSMANYA LETTER SHIIN", 0x1048A: "OSMANYA LETTER DHA", 0x1048B: "OSMANYA LETTER CAYN", 0x1048C: "OSMANYA LETTER GA", 0x1048D: "OSMANYA LETTER FA", 0x1048E: "OSMANYA LETTER QAAF", 0x1048F: "OSMANYA LETTER KAAF", 0x10490: "OSMANYA LETTER LAAN", 0x10491: "OSMANYA LETTER MIIN", 0x10492: "OSMANYA LETTER NUUN", 0x10493: "OSMANYA LETTER WAW", 0x10494: "OSMANYA LETTER HA", 0x10495: "OSMANYA LETTER YA", 0x10496: "OSMANYA LETTER A", 0x10497: "OSMANYA LETTER E", 0x10498: "OSMANYA LETTER I", 0x10499: "OSMANYA LETTER O", 0x1049A: "OSMANYA LETTER U", 0x1049B: "OSMANYA LETTER AA", 0x1049C: "OSMANYA LETTER EE", 0x1049D: "OSMANYA LETTER OO", 0x104A0: "OSMANYA DIGIT ZERO", 0x104A1: "OSMANYA DIGIT ONE", 0x104A2: "OSMANYA DIGIT TWO", 0x104A3: "OSMANYA DIGIT THREE", 0x104A4: "OSMANYA DIGIT FOUR", 0x104A5: "OSMANYA DIGIT FIVE", 0x104A6: "OSMANYA DIGIT SIX", 0x104A7: "OSMANYA DIGIT SEVEN", 0x104A8: "OSMANYA DIGIT EIGHT", 0x104A9: "OSMANYA DIGIT NINE", 0x10800: "CYPRIOT SYLLABLE A", 0x10801: "CYPRIOT SYLLABLE E", 0x10802: "CYPRIOT SYLLABLE I", 0x10803: "CYPRIOT SYLLABLE O", 0x10804: "CYPRIOT SYLLABLE U", 0x10805: "CYPRIOT SYLLABLE JA", 0x10808: "CYPRIOT SYLLABLE JO", 0x1080A: "CYPRIOT SYLLABLE KA", 0x1080B: "CYPRIOT SYLLABLE KE", 0x1080C: "CYPRIOT SYLLABLE KI", 0x1080D: "CYPRIOT SYLLABLE KO", 0x1080E: "CYPRIOT SYLLABLE KU", 0x1080F: "CYPRIOT SYLLABLE LA", 0x10810: "CYPRIOT SYLLABLE LE", 0x10811: "CYPRIOT SYLLABLE LI", 0x10812: "CYPRIOT SYLLABLE LO", 0x10813: "CYPRIOT SYLLABLE LU", 0x10814: "CYPRIOT SYLLABLE MA", 0x10815: "CYPRIOT SYLLABLE ME", 0x10816: "CYPRIOT SYLLABLE MI", 0x10817: "CYPRIOT SYLLABLE MO", 0x10818: "CYPRIOT SYLLABLE MU", 0x10819: "CYPRIOT SYLLABLE NA", 0x1081A: "CYPRIOT SYLLABLE NE", 0x1081B: "CYPRIOT SYLLABLE NI", 0x1081C: "CYPRIOT SYLLABLE NO", 0x1081D: "CYPRIOT SYLLABLE NU", 0x1081E: "CYPRIOT SYLLABLE PA", 0x1081F: "CYPRIOT SYLLABLE PE", 0x10820: "CYPRIOT SYLLABLE PI", 0x10821: "CYPRIOT SYLLABLE PO", 0x10822: "CYPRIOT SYLLABLE PU", 0x10823: "CYPRIOT SYLLABLE RA", 0x10824: "CYPRIOT SYLLABLE RE", 0x10825: "CYPRIOT SYLLABLE RI", 0x10826: "CYPRIOT SYLLABLE RO", 0x10827: "CYPRIOT SYLLABLE RU", 0x10828: "CYPRIOT SYLLABLE SA", 0x10829: "CYPRIOT SYLLABLE SE", 0x1082A: "CYPRIOT SYLLABLE SI", 0x1082B: "CYPRIOT SYLLABLE SO", 0x1082C: "CYPRIOT SYLLABLE SU", 0x1082D: "CYPRIOT SYLLABLE TA", 0x1082E: "CYPRIOT SYLLABLE TE", 0x1082F: "CYPRIOT SYLLABLE TI", 0x10830: "CYPRIOT SYLLABLE TO", 0x10831: "CYPRIOT SYLLABLE TU", 0x10832: "CYPRIOT SYLLABLE WA", 0x10833: "CYPRIOT SYLLABLE WE", 0x10834: "CYPRIOT SYLLABLE WI", 0x10835: "CYPRIOT SYLLABLE WO", 0x10837: "CYPRIOT SYLLABLE XA", 0x10838: "CYPRIOT SYLLABLE XE", 0x1083C: "CYPRIOT SYLLABLE ZA", 0x1083F: "CYPRIOT SYLLABLE ZO", 0x10900: "PHOENICIAN LETTER ALF", 0x10901: "PHOENICIAN LETTER BET", 0x10902: "PHOENICIAN LETTER GAML", 0x10903: "PHOENICIAN LETTER DELT", 0x10904: "PHOENICIAN LETTER HE", 0x10905: "PHOENICIAN LETTER WAU", 0x10906: "PHOENICIAN LETTER ZAI", 0x10907: "PHOENICIAN LETTER HET", 0x10908: "PHOENICIAN LETTER TET", 0x10909: "PHOENICIAN LETTER YOD", 0x1090A: "PHOENICIAN LETTER KAF", 0x1090B: "PHOENICIAN LETTER LAMD", 0x1090C: "PHOENICIAN LETTER MEM", 0x1090D: "PHOENICIAN LETTER NUN", 0x1090E: "PHOENICIAN LETTER SEMK", 0x1090F: "PHOENICIAN LETTER AIN", 0x10910: "PHOENICIAN LETTER PE", 0x10911: "PHOENICIAN LETTER SADE", 0x10912: "PHOENICIAN LETTER QOF", 0x10913: "PHOENICIAN LETTER ROSH", 0x10914: "PHOENICIAN LETTER SHIN", 0x10915: "PHOENICIAN LETTER TAU", 0x10916: "PHOENICIAN NUMBER ONE", 0x10917: "PHOENICIAN NUMBER TEN", 0x10918: "PHOENICIAN NUMBER TWENTY", 0x10919: "PHOENICIAN NUMBER ONE HUNDRED", 0x1091F: "PHOENICIAN WORD SEPARATOR", 0x10920: "LYDIAN LETTER A", 0x10921: "LYDIAN LETTER B", 0x10922: "LYDIAN LETTER G", 0x10923: "LYDIAN LETTER D", 0x10924: "LYDIAN LETTER E", 0x10925: "LYDIAN LETTER V", 0x10926: "LYDIAN LETTER I", 0x10927: "LYDIAN LETTER Y", 0x10928: "LYDIAN LETTER K", 0x10929: "LYDIAN LETTER L", 0x1092A: "LYDIAN LETTER M", 0x1092B: "LYDIAN LETTER N", 0x1092C: "LYDIAN LETTER O", 0x1092D: "LYDIAN LETTER R", 0x1092E: "LYDIAN LETTER SS", 0x1092F: "LYDIAN LETTER T", 0x10930: "LYDIAN LETTER U", 0x10931: "LYDIAN LETTER F", 0x10932: "LYDIAN LETTER Q", 0x10933: "LYDIAN LETTER S", 0x10934: "LYDIAN LETTER TT", 0x10935: "LYDIAN LETTER AN", 0x10936: "LYDIAN LETTER EN", 0x10937: "LYDIAN LETTER LY", 0x10938: "LYDIAN LETTER NN", 0x10939: "LYDIAN LETTER C", 0x1093F: "LYDIAN TRIANGULAR MARK", 0x10A00: "KHAROSHTHI LETTER A", 0x10A01: "KHAROSHTHI VOWEL SIGN I", 0x10A02: "KHAROSHTHI VOWEL SIGN U", 0x10A03: "KHAROSHTHI VOWEL SIGN VOCALIC R", 0x10A05: "KHAROSHTHI VOWEL SIGN E", 0x10A06: "KHAROSHTHI VOWEL SIGN O", 0x10A0C: "KHAROSHTHI VOWEL LENGTH MARK", 0x10A0D: "KHAROSHTHI SIGN DOUBLE RING BELOW", 0x10A0E: "KHAROSHTHI SIGN ANUSVARA", 0x10A0F: "KHAROSHTHI SIGN VISARGA", 0x10A10: "KHAROSHTHI LETTER KA", 0x10A11: "KHAROSHTHI LETTER KHA", 0x10A12: "KHAROSHTHI LETTER GA", 0x10A13: "KHAROSHTHI LETTER GHA", 0x10A15: "KHAROSHTHI LETTER CA", 0x10A16: "KHAROSHTHI LETTER CHA", 0x10A17: "KHAROSHTHI LETTER JA", 0x10A19: "KHAROSHTHI LETTER NYA", 0x10A1A: "KHAROSHTHI LETTER TTA", 0x10A1B: "KHAROSHTHI LETTER TTHA", 0x10A1C: "KHAROSHTHI LETTER DDA", 0x10A1D: "KHAROSHTHI LETTER DDHA", 0x10A1E: "KHAROSHTHI LETTER NNA", 0x10A1F: "KHAROSHTHI LETTER TA", 0x10A20: "KHAROSHTHI LETTER THA", 0x10A21: "KHAROSHTHI LETTER DA", 0x10A22: "KHAROSHTHI LETTER DHA", 0x10A23: "KHAROSHTHI LETTER NA", 0x10A24: "KHAROSHTHI LETTER PA", 0x10A25: "KHAROSHTHI LETTER PHA", 0x10A26: "KHAROSHTHI LETTER BA", 0x10A27: "KHAROSHTHI LETTER BHA", 0x10A28: "KHAROSHTHI LETTER MA", 0x10A29: "KHAROSHTHI LETTER YA", 0x10A2A: "KHAROSHTHI LETTER RA", 0x10A2B: "KHAROSHTHI LETTER LA", 0x10A2C: "KHAROSHTHI LETTER VA", 0x10A2D: "KHAROSHTHI LETTER SHA", 0x10A2E: "KHAROSHTHI LETTER SSA", 0x10A2F: "KHAROSHTHI LETTER SA", 0x10A30: "KHAROSHTHI LETTER ZA", 0x10A31: "KHAROSHTHI LETTER HA", 0x10A32: "KHAROSHTHI LETTER KKA", 0x10A33: "KHAROSHTHI LETTER TTTHA", 0x10A38: "KHAROSHTHI SIGN BAR ABOVE", 0x10A39: "KHAROSHTHI SIGN CAUDA", 0x10A3A: "KHAROSHTHI SIGN DOT BELOW", 0x10A3F: "KHAROSHTHI VIRAMA", 0x10A40: "KHAROSHTHI DIGIT ONE", 0x10A41: "KHAROSHTHI DIGIT TWO", 0x10A42: "KHAROSHTHI DIGIT THREE", 0x10A43: "KHAROSHTHI DIGIT FOUR", 0x10A44: "KHAROSHTHI NUMBER TEN", 0x10A45: "KHAROSHTHI NUMBER TWENTY", 0x10A46: "KHAROSHTHI NUMBER ONE HUNDRED", 0x10A47: "KHAROSHTHI NUMBER ONE THOUSAND", 0x10A50: "KHAROSHTHI PUNCTUATION DOT", 0x10A51: "KHAROSHTHI PUNCTUATION SMALL CIRCLE", 0x10A52: "KHAROSHTHI PUNCTUATION CIRCLE", 0x10A53: "KHAROSHTHI PUNCTUATION CRESCENT BAR", 0x10A54: "KHAROSHTHI PUNCTUATION MANGALAM", 0x10A55: "KHAROSHTHI PUNCTUATION LOTUS", 0x10A56: "KHAROSHTHI PUNCTUATION DANDA", 0x10A57: "KHAROSHTHI PUNCTUATION DOUBLE DANDA", 0x10A58: "KHAROSHTHI PUNCTUATION LINES", 0x12000: "CUNEIFORM SIGN A", 0x12001: "CUNEIFORM SIGN A TIMES A", 0x12002: "CUNEIFORM SIGN A TIMES BAD", 0x12003: "CUNEIFORM SIGN A TIMES GAN2 TENU", 0x12004: "CUNEIFORM SIGN A TIMES HA", 0x12005: "CUNEIFORM SIGN A TIMES IGI", 0x12006: "CUNEIFORM SIGN A TIMES LAGAR GUNU", 0x12007: "CUNEIFORM SIGN A TIMES MUSH", 0x12008: "CUNEIFORM SIGN A TIMES SAG", 0x12009: "CUNEIFORM SIGN A2", 0x1200A: "CUNEIFORM SIGN AB", 0x1200B: "CUNEIFORM SIGN AB TIMES ASH2", 0x1200C: "CUNEIFORM SIGN AB TIMES DUN3 GUNU", 0x1200D: "CUNEIFORM SIGN AB TIMES GAL", 0x1200E: "CUNEIFORM SIGN AB TIMES GAN2 TENU", 0x1200F: "CUNEIFORM SIGN AB TIMES HA", 0x12010: "CUNEIFORM SIGN AB TIMES IGI GUNU", 0x12011: "CUNEIFORM SIGN AB TIMES IMIN", 0x12012: "CUNEIFORM SIGN AB TIMES LAGAB", 0x12013: "CUNEIFORM SIGN AB TIMES SHESH", 0x12014: "CUNEIFORM SIGN AB TIMES U PLUS U PLUS U", 0x12015: "CUNEIFORM SIGN AB GUNU", 0x12016: "CUNEIFORM SIGN AB2", 0x12017: "CUNEIFORM SIGN AB2 TIMES BALAG", 0x12018: "CUNEIFORM SIGN AB2 TIMES GAN2 TENU", 0x12019: "CUNEIFORM SIGN AB2 TIMES ME PLUS EN", 0x1201A: "CUNEIFORM SIGN AB2 TIMES SHA3", 0x1201B: "CUNEIFORM SIGN AB2 TIMES TAK4", 0x1201C: "CUNEIFORM SIGN AD", 0x1201D: "CUNEIFORM SIGN AK", 0x1201E: "CUNEIFORM SIGN AK TIMES ERIN2", 0x1201F: "CUNEIFORM SIGN AK TIMES SHITA PLUS GISH", 0x12020: "CUNEIFORM SIGN AL", 0x12021: "CUNEIFORM SIGN AL TIMES AL", 0x12022: "CUNEIFORM SIGN AL TIMES DIM2", 0x12023: "CUNEIFORM SIGN AL TIMES GISH", 0x12024: "CUNEIFORM SIGN AL TIMES HA", 0x12025: "CUNEIFORM SIGN AL TIMES KAD3", 0x12026: "CUNEIFORM SIGN AL TIMES KI", 0x12027: "CUNEIFORM SIGN AL TIMES SHE", 0x12028: "CUNEIFORM SIGN AL TIMES USH", 0x12029: "CUNEIFORM SIGN ALAN", 0x1202A: "CUNEIFORM SIGN ALEPH", 0x1202B: "CUNEIFORM SIGN AMAR", 0x1202C: "CUNEIFORM SIGN AMAR TIMES SHE", 0x1202D: "CUNEIFORM SIGN AN", 0x1202E: "CUNEIFORM SIGN AN OVER AN", 0x1202F: "CUNEIFORM SIGN AN THREE TIMES", 0x12030: "CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA", 0x12031: "CUNEIFORM SIGN AN PLUS NAGA SQUARED", 0x12032: "CUNEIFORM SIGN ANSHE", 0x12033: "CUNEIFORM SIGN APIN", 0x12034: "CUNEIFORM SIGN ARAD", 0x12035: "CUNEIFORM SIGN ARAD TIMES KUR", 0x12036: "CUNEIFORM SIGN ARKAB", 0x12037: "CUNEIFORM SIGN ASAL2", 0x12038: "CUNEIFORM SIGN ASH", 0x12039: "CUNEIFORM SIGN ASH ZIDA TENU", 0x1203A: "CUNEIFORM SIGN ASH KABA TENU", 0x1203B: "CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP", 0x1203C: "CUNEIFORM SIGN ASH OVER ASH OVER ASH", 0x1203D: "CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH", 0x1203E: "CUNEIFORM SIGN ASH2", 0x1203F: "CUNEIFORM SIGN ASHGAB", 0x12040: "CUNEIFORM SIGN BA", 0x12041: "CUNEIFORM SIGN BAD", 0x12042: "CUNEIFORM SIGN BAG3", 0x12043: "CUNEIFORM SIGN BAHAR2", 0x12044: "CUNEIFORM SIGN BAL", 0x12045: "CUNEIFORM SIGN BAL OVER BAL", 0x12046: "CUNEIFORM SIGN BALAG", 0x12047: "CUNEIFORM SIGN BAR", 0x12048: "CUNEIFORM SIGN BARA2", 0x12049: "CUNEIFORM SIGN BI", 0x1204A: "CUNEIFORM SIGN BI TIMES A", 0x1204B: "CUNEIFORM SIGN BI TIMES GAR", 0x1204C: "CUNEIFORM SIGN BI TIMES IGI GUNU", 0x1204D: "CUNEIFORM SIGN BU", 0x1204E: "CUNEIFORM SIGN BU OVER BU AB", 0x1204F: "CUNEIFORM SIGN BU OVER BU UN", 0x12050: "CUNEIFORM SIGN BU CROSSING BU", 0x12051: "CUNEIFORM SIGN BULUG", 0x12052: "CUNEIFORM SIGN BULUG OVER BULUG", 0x12053: "CUNEIFORM SIGN BUR", 0x12054: "CUNEIFORM SIGN BUR2", 0x12055: "CUNEIFORM SIGN DA", 0x12056: "CUNEIFORM SIGN DAG", 0x12057: "CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH", 0x12058: "CUNEIFORM SIGN DAG KISIM5 TIMES AMAR", 0x12059: "CUNEIFORM SIGN DAG KISIM5 TIMES BALAG", 0x1205A: "CUNEIFORM SIGN DAG KISIM5 TIMES BI", 0x1205B: "CUNEIFORM SIGN DAG KISIM5 TIMES GA", 0x1205C: "CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH", 0x1205D: "CUNEIFORM SIGN DAG KISIM5 TIMES GI", 0x1205E: "CUNEIFORM SIGN DAG KISIM5 TIMES GIR2", 0x1205F: "CUNEIFORM SIGN DAG KISIM5 TIMES GUD", 0x12060: "CUNEIFORM SIGN DAG KISIM5 TIMES HA", 0x12061: "CUNEIFORM SIGN DAG KISIM5 TIMES IR", 0x12062: "CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU", 0x12063: "CUNEIFORM SIGN DAG KISIM5 TIMES KAK", 0x12064: "CUNEIFORM SIGN DAG KISIM5 TIMES LA", 0x12065: "CUNEIFORM SIGN DAG KISIM5 TIMES LU", 0x12066: "CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2", 0x12067: "CUNEIFORM SIGN DAG KISIM5 TIMES LUM", 0x12068: "CUNEIFORM SIGN DAG KISIM5 TIMES NE", 0x12069: "CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP", 0x1206A: "CUNEIFORM SIGN DAG KISIM5 TIMES SI", 0x1206B: "CUNEIFORM SIGN DAG KISIM5 TIMES TAK4", 0x1206C: "CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2", 0x1206D: "CUNEIFORM SIGN DAG KISIM5 TIMES USH", 0x1206E: "CUNEIFORM SIGN DAM", 0x1206F: "CUNEIFORM SIGN DAR", 0x12070: "CUNEIFORM SIGN DARA3", 0x12071: "CUNEIFORM SIGN DARA4", 0x12072: "CUNEIFORM SIGN DI", 0x12073: "CUNEIFORM SIGN DIB", 0x12074: "CUNEIFORM SIGN DIM", 0x12075: "CUNEIFORM SIGN DIM TIMES SHE", 0x12076: "CUNEIFORM SIGN DIM2", 0x12077: "CUNEIFORM SIGN DIN", 0x12078: "CUNEIFORM SIGN DIN KASKAL U GUNU DISH", 0x12079: "CUNEIFORM SIGN DISH", 0x1207A: "CUNEIFORM SIGN DU", 0x1207B: "CUNEIFORM SIGN DU OVER DU", 0x1207C: "CUNEIFORM SIGN DU GUNU", 0x1207D: "CUNEIFORM SIGN DU SHESHIG", 0x1207E: "CUNEIFORM SIGN DUB", 0x1207F: "CUNEIFORM SIGN DUB TIMES ESH2", 0x12080: "CUNEIFORM SIGN DUB2", 0x12081: "CUNEIFORM SIGN DUG", 0x12082: "CUNEIFORM SIGN DUGUD", 0x12083: "CUNEIFORM SIGN DUH", 0x12084: "CUNEIFORM SIGN DUN", 0x12085: "CUNEIFORM SIGN DUN3", 0x12086: "CUNEIFORM SIGN DUN3 GUNU", 0x12087: "CUNEIFORM SIGN DUN3 GUNU GUNU", 0x12088: "CUNEIFORM SIGN DUN4", 0x12089: "CUNEIFORM SIGN DUR2", 0x1208A: "CUNEIFORM SIGN E", 0x1208B: "CUNEIFORM SIGN E TIMES PAP", 0x1208C: "CUNEIFORM SIGN E OVER E NUN OVER NUN", 0x1208D: "CUNEIFORM SIGN E2", 0x1208E: "CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA", 0x1208F: "CUNEIFORM SIGN E2 TIMES GAR", 0x12090: "CUNEIFORM SIGN E2 TIMES MI", 0x12091: "CUNEIFORM SIGN E2 TIMES SAL", 0x12092: "CUNEIFORM SIGN E2 TIMES SHE", 0x12093: "CUNEIFORM SIGN E2 TIMES U", 0x12094: "CUNEIFORM SIGN EDIN", 0x12095: "CUNEIFORM SIGN EGIR", 0x12096: "CUNEIFORM SIGN EL", 0x12097: "CUNEIFORM SIGN EN", 0x12098: "CUNEIFORM SIGN EN TIMES GAN2", 0x12099: "CUNEIFORM SIGN EN TIMES GAN2 TENU", 0x1209A: "CUNEIFORM SIGN EN TIMES ME", 0x1209B: "CUNEIFORM SIGN EN CROSSING EN", 0x1209C: "CUNEIFORM SIGN EN OPPOSING EN", 0x1209D: "CUNEIFORM SIGN EN SQUARED", 0x1209E: "CUNEIFORM SIGN EREN", 0x1209F: "CUNEIFORM SIGN ERIN2", 0x120A0: "CUNEIFORM SIGN ESH2", 0x120A1: "CUNEIFORM SIGN EZEN", 0x120A2: "CUNEIFORM SIGN EZEN TIMES A", 0x120A3: "CUNEIFORM SIGN EZEN TIMES A PLUS LAL", 0x120A4: "CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL", 0x120A5: "CUNEIFORM SIGN EZEN TIMES AN", 0x120A6: "CUNEIFORM SIGN EZEN TIMES BAD", 0x120A7: "CUNEIFORM SIGN EZEN TIMES DUN3 GUNU", 0x120A8: "CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU", 0x120A9: "CUNEIFORM SIGN EZEN TIMES HA", 0x120AA: "CUNEIFORM SIGN EZEN TIMES HA GUNU", 0x120AB: "CUNEIFORM SIGN EZEN TIMES IGI GUNU", 0x120AC: "CUNEIFORM SIGN EZEN TIMES KASKAL", 0x120AD: "CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED", 0x120AE: "CUNEIFORM SIGN EZEN TIMES KU3", 0x120AF: "CUNEIFORM SIGN EZEN TIMES LA", 0x120B0: "CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL", 0x120B1: "CUNEIFORM SIGN EZEN TIMES LI", 0x120B2: "CUNEIFORM SIGN EZEN TIMES LU", 0x120B3: "CUNEIFORM SIGN EZEN TIMES U2", 0x120B4: "CUNEIFORM SIGN EZEN TIMES UD", 0x120B5: "CUNEIFORM SIGN GA", 0x120B6: "CUNEIFORM SIGN GA GUNU", 0x120B7: "CUNEIFORM SIGN GA2", 0x120B8: "CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA", 0x120B9: "CUNEIFORM SIGN GA2 TIMES A PLUS HA", 0x120BA: "CUNEIFORM SIGN GA2 TIMES A PLUS IGI", 0x120BB: "CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB", 0x120BC: "CUNEIFORM SIGN GA2 TIMES AN", 0x120BD: "CUNEIFORM SIGN GA2 TIMES ASH", 0x120BE: "CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL", 0x120BF: "CUNEIFORM SIGN GA2 TIMES BAD", 0x120C0: "CUNEIFORM SIGN GA2 TIMES BAR PLUS RA", 0x120C1: "CUNEIFORM SIGN GA2 TIMES BUR", 0x120C2: "CUNEIFORM SIGN GA2 TIMES BUR PLUS RA", 0x120C3: "CUNEIFORM SIGN GA2 TIMES DA", 0x120C4: "CUNEIFORM SIGN GA2 TIMES DI", 0x120C5: "CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE", 0x120C6: "CUNEIFORM SIGN GA2 TIMES DUB", 0x120C7: "CUNEIFORM SIGN GA2 TIMES EL", 0x120C8: "CUNEIFORM SIGN GA2 TIMES EL PLUS LA", 0x120C9: "CUNEIFORM SIGN GA2 TIMES EN", 0x120CA: "CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU", 0x120CB: "CUNEIFORM SIGN GA2 TIMES GAN2 TENU", 0x120CC: "CUNEIFORM SIGN GA2 TIMES GAR", 0x120CD: "CUNEIFORM SIGN GA2 TIMES GI", 0x120CE: "CUNEIFORM SIGN GA2 TIMES GI4", 0x120CF: "CUNEIFORM SIGN GA2 TIMES GI4 PLUS A", 0x120D0: "CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU", 0x120D1: "CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2", 0x120D2: "CUNEIFORM SIGN GA2 TIMES HAL", 0x120D3: "CUNEIFORM SIGN GA2 TIMES HAL PLUS LA", 0x120D4: "CUNEIFORM SIGN GA2 TIMES HI PLUS LI", 0x120D5: "CUNEIFORM SIGN GA2 TIMES HUB2", 0x120D6: "CUNEIFORM SIGN GA2 TIMES IGI GUNU", 0x120D7: "CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH", 0x120D8: "CUNEIFORM SIGN GA2 TIMES KAK", 0x120D9: "CUNEIFORM SIGN GA2 TIMES KASKAL", 0x120DA: "CUNEIFORM SIGN GA2 TIMES KID", 0x120DB: "CUNEIFORM SIGN GA2 TIMES KID PLUS LAL", 0x120DC: "CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN", 0x120DD: "CUNEIFORM SIGN GA2 TIMES LA", 0x120DE: "CUNEIFORM SIGN GA2 TIMES ME PLUS EN", 0x120DF: "CUNEIFORM SIGN GA2 TIMES MI", 0x120E0: "CUNEIFORM SIGN GA2 TIMES NUN", 0x120E1: "CUNEIFORM SIGN GA2 TIMES NUN OVER NUN", 0x120E2: "CUNEIFORM SIGN GA2 TIMES PA", 0x120E3: "CUNEIFORM SIGN GA2 TIMES SAL", 0x120E4: "CUNEIFORM SIGN GA2 TIMES SAR", 0x120E5: "CUNEIFORM SIGN GA2 TIMES SHE", 0x120E6: "CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR", 0x120E7: "CUNEIFORM SIGN GA2 TIMES SHID", 0x120E8: "CUNEIFORM SIGN GA2 TIMES SUM", 0x120E9: "CUNEIFORM SIGN GA2 TIMES TAK4", 0x120EA: "CUNEIFORM SIGN GA2 TIMES U", 0x120EB: "CUNEIFORM SIGN GA2 TIMES UD", 0x120EC: "CUNEIFORM SIGN GA2 TIMES UD PLUS DU", 0x120ED: "CUNEIFORM SIGN GA2 OVER GA2", 0x120EE: "CUNEIFORM SIGN GABA", 0x120EF: "CUNEIFORM SIGN GABA CROSSING GABA", 0x120F0: "CUNEIFORM SIGN GAD", 0x120F1: "CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR", 0x120F2: "CUNEIFORM SIGN GAL", 0x120F3: "CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR", 0x120F4: "CUNEIFORM SIGN GALAM", 0x120F5: "CUNEIFORM SIGN GAM", 0x120F6: "CUNEIFORM SIGN GAN", 0x120F7: "CUNEIFORM SIGN GAN2", 0x120F8: "CUNEIFORM SIGN GAN2 TENU", 0x120F9: "CUNEIFORM SIGN GAN2 OVER GAN2", 0x120FA: "CUNEIFORM SIGN GAN2 CROSSING GAN2", 0x120FB: "CUNEIFORM SIGN GAR", 0x120FC: "CUNEIFORM SIGN GAR3", 0x120FD: "CUNEIFORM SIGN GASHAN", 0x120FE: "CUNEIFORM SIGN GESHTIN", 0x120FF: "CUNEIFORM SIGN GESHTIN TIMES KUR", 0x12100: "CUNEIFORM SIGN GI", 0x12101: "CUNEIFORM SIGN GI TIMES E", 0x12102: "CUNEIFORM SIGN GI TIMES U", 0x12103: "CUNEIFORM SIGN GI CROSSING GI", 0x12104: "CUNEIFORM SIGN GI4", 0x12105: "CUNEIFORM SIGN GI4 OVER GI4", 0x12106: "CUNEIFORM SIGN GI4 CROSSING GI4", 0x12107: "CUNEIFORM SIGN GIDIM", 0x12108: "CUNEIFORM SIGN GIR2", 0x12109: "CUNEIFORM SIGN GIR2 GUNU", 0x1210A: "CUNEIFORM SIGN GIR3", 0x1210B: "CUNEIFORM SIGN GIR3 TIMES A PLUS IGI", 0x1210C: "CUNEIFORM SIGN GIR3 TIMES GAN2 TENU", 0x1210D: "CUNEIFORM SIGN GIR3 TIMES IGI", 0x1210E: "CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI", 0x1210F: "CUNEIFORM SIGN GIR3 TIMES PA", 0x12110: "CUNEIFORM SIGN GISAL", 0x12111: "CUNEIFORM SIGN GISH", 0x12112: "CUNEIFORM SIGN GISH CROSSING GISH", 0x12113: "CUNEIFORM SIGN GISH TIMES BAD", 0x12114: "CUNEIFORM SIGN GISH TIMES TAK4", 0x12115: "CUNEIFORM SIGN GISH TENU", 0x12116: "CUNEIFORM SIGN GU", 0x12117: "CUNEIFORM SIGN GU CROSSING GU", 0x12118: "CUNEIFORM SIGN GU2", 0x12119: "CUNEIFORM SIGN GU2 TIMES KAK", 0x1211A: "CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU", 0x1211B: "CUNEIFORM SIGN GU2 TIMES NUN", 0x1211C: "CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2", 0x1211D: "CUNEIFORM SIGN GU2 GUNU", 0x1211E: "CUNEIFORM SIGN GUD", 0x1211F: "CUNEIFORM SIGN GUD TIMES A PLUS KUR", 0x12120: "CUNEIFORM SIGN GUD TIMES KUR", 0x12121: "CUNEIFORM SIGN GUD OVER GUD LUGAL", 0x12122: "CUNEIFORM SIGN GUL", 0x12123: "CUNEIFORM SIGN GUM", 0x12124: "CUNEIFORM SIGN GUM TIMES SHE", 0x12125: "CUNEIFORM SIGN GUR", 0x12126: "CUNEIFORM SIGN GUR7", 0x12127: "CUNEIFORM SIGN GURUN", 0x12128: "CUNEIFORM SIGN GURUSH", 0x12129: "CUNEIFORM SIGN HA", 0x1212A: "CUNEIFORM SIGN HA TENU", 0x1212B: "CUNEIFORM SIGN HA GUNU", 0x1212C: "CUNEIFORM SIGN HAL", 0x1212D: "CUNEIFORM SIGN HI", 0x1212E: "CUNEIFORM SIGN HI TIMES ASH", 0x1212F: "CUNEIFORM SIGN HI TIMES ASH2", 0x12130: "CUNEIFORM SIGN HI TIMES BAD", 0x12131: "CUNEIFORM SIGN HI TIMES DISH", 0x12132: "CUNEIFORM SIGN HI TIMES GAD", 0x12133: "CUNEIFORM SIGN HI TIMES KIN", 0x12134: "CUNEIFORM SIGN HI TIMES NUN", 0x12135: "CUNEIFORM SIGN HI TIMES SHE", 0x12136: "CUNEIFORM SIGN HI TIMES U", 0x12137: "CUNEIFORM SIGN HU", 0x12138: "CUNEIFORM SIGN HUB2", 0x12139: "CUNEIFORM SIGN HUB2 TIMES AN", 0x1213A: "CUNEIFORM SIGN HUB2 TIMES HAL", 0x1213B: "CUNEIFORM SIGN HUB2 TIMES KASKAL", 0x1213C: "CUNEIFORM SIGN HUB2 TIMES LISH", 0x1213D: "CUNEIFORM SIGN HUB2 TIMES UD", 0x1213E: "CUNEIFORM SIGN HUL2", 0x1213F: "CUNEIFORM SIGN I", 0x12140: "CUNEIFORM SIGN I A", 0x12141: "CUNEIFORM SIGN IB", 0x12142: "CUNEIFORM SIGN IDIM", 0x12143: "CUNEIFORM SIGN IDIM OVER IDIM BUR", 0x12144: "CUNEIFORM SIGN IDIM OVER IDIM SQUARED", 0x12145: "CUNEIFORM SIGN IG", 0x12146: "CUNEIFORM SIGN IGI", 0x12147: "CUNEIFORM SIGN IGI DIB", 0x12148: "CUNEIFORM SIGN IGI RI", 0x12149: "CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD", 0x1214A: "CUNEIFORM SIGN IGI GUNU", 0x1214B: "CUNEIFORM SIGN IL", 0x1214C: "CUNEIFORM SIGN IL TIMES GAN2 TENU", 0x1214D: "CUNEIFORM SIGN IL2", 0x1214E: "CUNEIFORM SIGN IM", 0x1214F: "CUNEIFORM SIGN IM TIMES TAK4", 0x12150: "CUNEIFORM SIGN IM CROSSING IM", 0x12151: "CUNEIFORM SIGN IM OPPOSING IM", 0x12152: "CUNEIFORM SIGN IM SQUARED", 0x12153: "CUNEIFORM SIGN IMIN", 0x12154: "CUNEIFORM SIGN IN", 0x12155: "CUNEIFORM SIGN IR", 0x12156: "CUNEIFORM SIGN ISH", 0x12157: "CUNEIFORM SIGN KA", 0x12158: "CUNEIFORM SIGN KA TIMES A", 0x12159: "CUNEIFORM SIGN KA TIMES AD", 0x1215A: "CUNEIFORM SIGN KA TIMES AD PLUS KU3", 0x1215B: "CUNEIFORM SIGN KA TIMES ASH2", 0x1215C: "CUNEIFORM SIGN KA TIMES BAD", 0x1215D: "CUNEIFORM SIGN KA TIMES BALAG", 0x1215E: "CUNEIFORM SIGN KA TIMES BAR", 0x1215F: "CUNEIFORM SIGN KA TIMES BI", 0x12160: "CUNEIFORM SIGN KA TIMES ERIN2", 0x12161: "CUNEIFORM SIGN KA TIMES ESH2", 0x12162: "CUNEIFORM SIGN KA TIMES GA", 0x12163: "CUNEIFORM SIGN KA TIMES GAL", 0x12164: "CUNEIFORM SIGN KA TIMES GAN2 TENU", 0x12165: "CUNEIFORM SIGN KA TIMES GAR", 0x12166: "CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A", 0x12167: "CUNEIFORM SIGN KA TIMES GI", 0x12168: "CUNEIFORM SIGN KA TIMES GIR2", 0x12169: "CUNEIFORM SIGN KA TIMES GISH PLUS SAR", 0x1216A: "CUNEIFORM SIGN KA TIMES GISH CROSSING GISH", 0x1216B: "CUNEIFORM SIGN KA TIMES GU", 0x1216C: "CUNEIFORM SIGN KA TIMES GUR7", 0x1216D: "CUNEIFORM SIGN KA TIMES IGI", 0x1216E: "CUNEIFORM SIGN KA TIMES IM", 0x1216F: "CUNEIFORM SIGN KA TIMES KAK", 0x12170: "CUNEIFORM SIGN KA TIMES KI", 0x12171: "CUNEIFORM SIGN KA TIMES KID", 0x12172: "CUNEIFORM SIGN KA TIMES LI", 0x12173: "CUNEIFORM SIGN KA TIMES LU", 0x12174: "CUNEIFORM SIGN KA TIMES ME", 0x12175: "CUNEIFORM SIGN KA TIMES ME PLUS DU", 0x12176: "CUNEIFORM SIGN KA TIMES ME PLUS GI", 0x12177: "CUNEIFORM SIGN KA TIMES ME PLUS TE", 0x12178: "CUNEIFORM SIGN KA TIMES MI", 0x12179: "CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ", 0x1217A: "CUNEIFORM SIGN KA TIMES NE", 0x1217B: "CUNEIFORM SIGN KA TIMES NUN", 0x1217C: "CUNEIFORM SIGN KA TIMES PI", 0x1217D: "CUNEIFORM SIGN KA TIMES RU", 0x1217E: "CUNEIFORM SIGN KA TIMES SA", 0x1217F: "CUNEIFORM SIGN KA TIMES SAR", 0x12180: "CUNEIFORM SIGN KA TIMES SHA", 0x12181: "CUNEIFORM SIGN KA TIMES SHE", 0x12182: "CUNEIFORM SIGN KA TIMES SHID", 0x12183: "CUNEIFORM SIGN KA TIMES SHU", 0x12184: "CUNEIFORM SIGN KA TIMES SIG", 0x12185: "CUNEIFORM SIGN KA TIMES SUHUR", 0x12186: "CUNEIFORM SIGN KA TIMES TAR", 0x12187: "CUNEIFORM SIGN KA TIMES U", 0x12188: "CUNEIFORM SIGN KA TIMES U2", 0x12189: "CUNEIFORM SIGN KA TIMES UD", 0x1218A: "CUNEIFORM SIGN KA TIMES UMUM TIMES PA", 0x1218B: "CUNEIFORM SIGN KA TIMES USH", 0x1218C: "CUNEIFORM SIGN KA TIMES ZI", 0x1218D: "CUNEIFORM SIGN KA2", 0x1218E: "CUNEIFORM SIGN KA2 CROSSING KA2", 0x1218F: "CUNEIFORM SIGN KAB", 0x12190: "CUNEIFORM SIGN KAD2", 0x12191: "CUNEIFORM SIGN KAD3", 0x12192: "CUNEIFORM SIGN KAD4", 0x12193: "CUNEIFORM SIGN KAD5", 0x12194: "CUNEIFORM SIGN KAD5 OVER KAD5", 0x12195: "CUNEIFORM SIGN KAK", 0x12196: "CUNEIFORM SIGN KAK TIMES IGI GUNU", 0x12197: "CUNEIFORM SIGN KAL", 0x12198: "CUNEIFORM SIGN KAL TIMES BAD", 0x12199: "CUNEIFORM SIGN KAL CROSSING KAL", 0x1219A: "CUNEIFORM SIGN KAM2", 0x1219B: "CUNEIFORM SIGN KAM4", 0x1219C: "CUNEIFORM SIGN KASKAL", 0x1219D: "CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U", 0x1219E: "CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U", 0x1219F: "CUNEIFORM SIGN KESH2", 0x121A0: "CUNEIFORM SIGN KI", 0x121A1: "CUNEIFORM SIGN KI TIMES BAD", 0x121A2: "CUNEIFORM SIGN KI TIMES U", 0x121A3: "CUNEIFORM SIGN KI TIMES UD", 0x121A4: "CUNEIFORM SIGN KID", 0x121A5: "CUNEIFORM SIGN KIN", 0x121A6: "CUNEIFORM SIGN KISAL", 0x121A7: "CUNEIFORM SIGN KISH", 0x121A8: "CUNEIFORM SIGN KISIM5", 0x121A9: "CUNEIFORM SIGN KISIM5 OVER KISIM5", 0x121AA: "CUNEIFORM SIGN KU", 0x121AB: "CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2", 0x121AC: "CUNEIFORM SIGN KU3", 0x121AD: "CUNEIFORM SIGN KU4", 0x121AE: "CUNEIFORM SIGN KU4 VARIANT FORM", 0x121AF: "CUNEIFORM SIGN KU7", 0x121B0: "CUNEIFORM SIGN KUL", 0x121B1: "CUNEIFORM SIGN KUL GUNU", 0x121B2: "CUNEIFORM SIGN KUN", 0x121B3: "CUNEIFORM SIGN KUR", 0x121B4: "CUNEIFORM SIGN KUR OPPOSING KUR", 0x121B5: "CUNEIFORM SIGN KUSHU2", 0x121B6: "CUNEIFORM SIGN KWU318", 0x121B7: "CUNEIFORM SIGN LA", 0x121B8: "CUNEIFORM SIGN LAGAB", 0x121B9: "CUNEIFORM SIGN LAGAB TIMES A", 0x121BA: "CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA", 0x121BB: "CUNEIFORM SIGN LAGAB TIMES A PLUS GAR", 0x121BC: "CUNEIFORM SIGN LAGAB TIMES A PLUS LAL", 0x121BD: "CUNEIFORM SIGN LAGAB TIMES AL", 0x121BE: "CUNEIFORM SIGN LAGAB TIMES AN", 0x121BF: "CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU", 0x121C0: "CUNEIFORM SIGN LAGAB TIMES BAD", 0x121C1: "CUNEIFORM SIGN LAGAB TIMES BI", 0x121C2: "CUNEIFORM SIGN LAGAB TIMES DAR", 0x121C3: "CUNEIFORM SIGN LAGAB TIMES EN", 0x121C4: "CUNEIFORM SIGN LAGAB TIMES GA", 0x121C5: "CUNEIFORM SIGN LAGAB TIMES GAR", 0x121C6: "CUNEIFORM SIGN LAGAB TIMES GUD", 0x121C7: "CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD", 0x121C8: "CUNEIFORM SIGN LAGAB TIMES HA", 0x121C9: "CUNEIFORM SIGN LAGAB TIMES HAL", 0x121CA: "CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN", 0x121CB: "CUNEIFORM SIGN LAGAB TIMES IGI GUNU", 0x121CC: "CUNEIFORM SIGN LAGAB TIMES IM", 0x121CD: "CUNEIFORM SIGN LAGAB TIMES IM PLUS HA", 0x121CE: "CUNEIFORM SIGN LAGAB TIMES IM PLUS LU", 0x121CF: "CUNEIFORM SIGN LAGAB TIMES KI", 0x121D0: "CUNEIFORM SIGN LAGAB TIMES KIN", 0x121D1: "CUNEIFORM SIGN LAGAB TIMES KU3", 0x121D2: "CUNEIFORM SIGN LAGAB TIMES KUL", 0x121D3: "CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A", 0x121D4: "CUNEIFORM SIGN LAGAB TIMES LAGAB", 0x121D5: "CUNEIFORM SIGN LAGAB TIMES LISH", 0x121D6: "CUNEIFORM SIGN LAGAB TIMES LU", 0x121D7: "CUNEIFORM SIGN LAGAB TIMES LUL", 0x121D8: "CUNEIFORM SIGN LAGAB TIMES ME", 0x121D9: "CUNEIFORM SIGN LAGAB TIMES ME PLUS EN", 0x121DA: "CUNEIFORM SIGN LAGAB TIMES MUSH", 0x121DB: "CUNEIFORM SIGN LAGAB TIMES NE", 0x121DC: "CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM", 0x121DD: "CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2", 0x121DE: "CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU", 0x121DF: "CUNEIFORM SIGN LAGAB TIMES SHU2", 0x121E0: "CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2", 0x121E1: "CUNEIFORM SIGN LAGAB TIMES SUM", 0x121E2: "CUNEIFORM SIGN LAGAB TIMES TAG", 0x121E3: "CUNEIFORM SIGN LAGAB TIMES TAK4", 0x121E4: "CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA", 0x121E5: "CUNEIFORM SIGN LAGAB TIMES U", 0x121E6: "CUNEIFORM SIGN LAGAB TIMES U PLUS A", 0x121E7: "CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U", 0x121E8: "CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH", 0x121E9: "CUNEIFORM SIGN LAGAB TIMES UD", 0x121EA: "CUNEIFORM SIGN LAGAB TIMES USH", 0x121EB: "CUNEIFORM SIGN LAGAB SQUARED", 0x121EC: "CUNEIFORM SIGN LAGAR", 0x121ED: "CUNEIFORM SIGN LAGAR TIMES SHE", 0x121EE: "CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM", 0x121EF: "CUNEIFORM SIGN LAGAR GUNU", 0x121F0: "CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE", 0x121F1: "CUNEIFORM SIGN LAHSHU", 0x121F2: "CUNEIFORM SIGN LAL", 0x121F3: "CUNEIFORM SIGN LAL TIMES LAL", 0x121F4: "CUNEIFORM SIGN LAM", 0x121F5: "CUNEIFORM SIGN LAM TIMES KUR", 0x121F6: "CUNEIFORM SIGN LAM TIMES KUR PLUS RU", 0x121F7: "CUNEIFORM SIGN LI", 0x121F8: "CUNEIFORM SIGN LIL", 0x121F9: "CUNEIFORM SIGN LIMMU2", 0x121FA: "CUNEIFORM SIGN LISH", 0x121FB: "CUNEIFORM SIGN LU", 0x121FC: "CUNEIFORM SIGN LU TIMES BAD", 0x121FD: "CUNEIFORM SIGN LU2", 0x121FE: "CUNEIFORM SIGN LU2 TIMES AL", 0x121FF: "CUNEIFORM SIGN LU2 TIMES BAD", 0x12200: "CUNEIFORM SIGN LU2 TIMES ESH2", 0x12201: "CUNEIFORM SIGN LU2 TIMES ESH2 TENU", 0x12202: "CUNEIFORM SIGN LU2 TIMES GAN2 TENU", 0x12203: "CUNEIFORM SIGN LU2 TIMES HI TIMES BAD", 0x12204: "CUNEIFORM SIGN LU2 TIMES IM", 0x12205: "CUNEIFORM SIGN LU2 TIMES KAD2", 0x12206: "CUNEIFORM SIGN LU2 TIMES KAD3", 0x12207: "CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH", 0x12208: "CUNEIFORM SIGN LU2 TIMES KI", 0x12209: "CUNEIFORM SIGN LU2 TIMES LA PLUS ASH", 0x1220A: "CUNEIFORM SIGN LU2 TIMES LAGAB", 0x1220B: "CUNEIFORM SIGN LU2 TIMES ME PLUS EN", 0x1220C: "CUNEIFORM SIGN LU2 TIMES NE", 0x1220D: "CUNEIFORM SIGN LU2 TIMES NU", 0x1220E: "CUNEIFORM SIGN LU2 TIMES SI PLUS ASH", 0x1220F: "CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU", 0x12210: "CUNEIFORM SIGN LU2 TIMES TUG2", 0x12211: "CUNEIFORM SIGN LU2 TENU", 0x12212: "CUNEIFORM SIGN LU2 CROSSING LU2", 0x12213: "CUNEIFORM SIGN LU2 OPPOSING LU2", 0x12214: "CUNEIFORM SIGN LU2 SQUARED", 0x12215: "CUNEIFORM SIGN LU2 SHESHIG", 0x12216: "CUNEIFORM SIGN LU3", 0x12217: "CUNEIFORM SIGN LUGAL", 0x12218: "CUNEIFORM SIGN LUGAL OVER LUGAL", 0x12219: "CUNEIFORM SIGN LUGAL OPPOSING LUGAL", 0x1221A: "CUNEIFORM SIGN LUGAL SHESHIG", 0x1221B: "CUNEIFORM SIGN LUH", 0x1221C: "CUNEIFORM SIGN LUL", 0x1221D: "CUNEIFORM SIGN LUM", 0x1221E: "CUNEIFORM SIGN LUM OVER LUM", 0x1221F: "CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR", 0x12220: "CUNEIFORM SIGN MA", 0x12221: "CUNEIFORM SIGN MA TIMES TAK4", 0x12222: "CUNEIFORM SIGN MA GUNU", 0x12223: "CUNEIFORM SIGN MA2", 0x12224: "CUNEIFORM SIGN MAH", 0x12225: "CUNEIFORM SIGN MAR", 0x12226: "CUNEIFORM SIGN MASH", 0x12227: "CUNEIFORM SIGN MASH2", 0x12228: "CUNEIFORM SIGN ME", 0x12229: "CUNEIFORM SIGN MES", 0x1222A: "CUNEIFORM SIGN MI", 0x1222B: "CUNEIFORM SIGN MIN", 0x1222C: "CUNEIFORM SIGN MU", 0x1222D: "CUNEIFORM SIGN MU OVER MU", 0x1222E: "CUNEIFORM SIGN MUG", 0x1222F: "CUNEIFORM SIGN MUG GUNU", 0x12230: "CUNEIFORM SIGN MUNSUB", 0x12231: "CUNEIFORM SIGN MURGU2", 0x12232: "CUNEIFORM SIGN MUSH", 0x12233: "CUNEIFORM SIGN MUSH TIMES A", 0x12234: "CUNEIFORM SIGN MUSH TIMES KUR", 0x12235: "CUNEIFORM SIGN MUSH TIMES ZA", 0x12236: "CUNEIFORM SIGN MUSH OVER MUSH", 0x12237: "CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA", 0x12238: "CUNEIFORM SIGN MUSH CROSSING MUSH", 0x12239: "CUNEIFORM SIGN MUSH3", 0x1223A: "CUNEIFORM SIGN MUSH3 TIMES A", 0x1223B: "CUNEIFORM SIGN MUSH3 TIMES A PLUS DI", 0x1223C: "CUNEIFORM SIGN MUSH3 TIMES DI", 0x1223D: "CUNEIFORM SIGN MUSH3 GUNU", 0x1223E: "CUNEIFORM SIGN NA", 0x1223F: "CUNEIFORM SIGN NA2", 0x12240: "CUNEIFORM SIGN NAGA", 0x12241: "CUNEIFORM SIGN NAGA INVERTED", 0x12242: "CUNEIFORM SIGN NAGA TIMES SHU TENU", 0x12243: "CUNEIFORM SIGN NAGA OPPOSING NAGA", 0x12244: "CUNEIFORM SIGN NAGAR", 0x12245: "CUNEIFORM SIGN NAM NUTILLU", 0x12246: "CUNEIFORM SIGN NAM", 0x12247: "CUNEIFORM SIGN NAM2", 0x12248: "CUNEIFORM SIGN NE", 0x12249: "CUNEIFORM SIGN NE TIMES A", 0x1224A: "CUNEIFORM SIGN NE TIMES UD", 0x1224B: "CUNEIFORM SIGN NE SHESHIG", 0x1224C: "CUNEIFORM SIGN NI", 0x1224D: "CUNEIFORM SIGN NI TIMES E", 0x1224E: "CUNEIFORM SIGN NI2", 0x1224F: "CUNEIFORM SIGN NIM", 0x12250: "CUNEIFORM SIGN NIM TIMES GAN2 TENU", 0x12251: "CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU", 0x12252: "CUNEIFORM SIGN NINDA2", 0x12253: "CUNEIFORM SIGN NINDA2 TIMES AN", 0x12254: "CUNEIFORM SIGN NINDA2 TIMES ASH", 0x12255: "CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH", 0x12256: "CUNEIFORM SIGN NINDA2 TIMES GUD", 0x12257: "CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU", 0x12258: "CUNEIFORM SIGN NINDA2 TIMES NE", 0x12259: "CUNEIFORM SIGN NINDA2 TIMES NUN", 0x1225A: "CUNEIFORM SIGN NINDA2 TIMES SHE", 0x1225B: "CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN", 0x1225C: "CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH", 0x1225D: "CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH", 0x1225E: "CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH", 0x1225F: "CUNEIFORM SIGN NINDA2 TIMES USH", 0x12260: "CUNEIFORM SIGN NISAG", 0x12261: "CUNEIFORM SIGN NU", 0x12262: "CUNEIFORM SIGN NU11", 0x12263: "CUNEIFORM SIGN NUN", 0x12264: "CUNEIFORM SIGN NUN LAGAR TIMES GAR", 0x12265: "CUNEIFORM SIGN NUN LAGAR TIMES MASH", 0x12266: "CUNEIFORM SIGN NUN LAGAR TIMES SAL", 0x12267: "CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL", 0x12268: "CUNEIFORM SIGN NUN LAGAR TIMES USH", 0x12269: "CUNEIFORM SIGN NUN TENU", 0x1226A: "CUNEIFORM SIGN NUN OVER NUN", 0x1226B: "CUNEIFORM SIGN NUN CROSSING NUN", 0x1226C: "CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR", 0x1226D: "CUNEIFORM SIGN NUNUZ", 0x1226E: "CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB", 0x1226F: "CUNEIFORM SIGN NUNUZ AB2 TIMES BI", 0x12270: "CUNEIFORM SIGN NUNUZ AB2 TIMES DUG", 0x12271: "CUNEIFORM SIGN NUNUZ AB2 TIMES GUD", 0x12272: "CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU", 0x12273: "CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3", 0x12274: "CUNEIFORM SIGN NUNUZ AB2 TIMES LA", 0x12275: "CUNEIFORM SIGN NUNUZ AB2 TIMES NE", 0x12276: "CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3", 0x12277: "CUNEIFORM SIGN NUNUZ AB2 TIMES U2", 0x12278: "CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI", 0x12279: "CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U", 0x1227A: "CUNEIFORM SIGN PA", 0x1227B: "CUNEIFORM SIGN PAD", 0x1227C: "CUNEIFORM SIGN PAN", 0x1227D: "CUNEIFORM SIGN PAP", 0x1227E: "CUNEIFORM SIGN PESH2", 0x1227F: "CUNEIFORM SIGN PI", 0x12280: "CUNEIFORM SIGN PI TIMES A", 0x12281: "CUNEIFORM SIGN PI TIMES AB", 0x12282: "CUNEIFORM SIGN PI TIMES BI", 0x12283: "CUNEIFORM SIGN PI TIMES BU", 0x12284: "CUNEIFORM SIGN PI TIMES E", 0x12285: "CUNEIFORM SIGN PI TIMES I", 0x12286: "CUNEIFORM SIGN PI TIMES IB", 0x12287: "CUNEIFORM SIGN PI TIMES U", 0x12288: "CUNEIFORM SIGN PI TIMES U2", 0x12289: "CUNEIFORM SIGN PI CROSSING PI", 0x1228A: "CUNEIFORM SIGN PIRIG", 0x1228B: "CUNEIFORM SIGN PIRIG TIMES KAL", 0x1228C: "CUNEIFORM SIGN PIRIG TIMES UD", 0x1228D: "CUNEIFORM SIGN PIRIG TIMES ZA", 0x1228E: "CUNEIFORM SIGN PIRIG OPPOSING PIRIG", 0x1228F: "CUNEIFORM SIGN RA", 0x12290: "CUNEIFORM SIGN RAB", 0x12291: "CUNEIFORM SIGN RI", 0x12292: "CUNEIFORM SIGN RU", 0x12293: "CUNEIFORM SIGN SA", 0x12294: "CUNEIFORM SIGN SAG NUTILLU", 0x12295: "CUNEIFORM SIGN SAG", 0x12296: "CUNEIFORM SIGN SAG TIMES A", 0x12297: "CUNEIFORM SIGN SAG TIMES DU", 0x12298: "CUNEIFORM SIGN SAG TIMES DUB", 0x12299: "CUNEIFORM SIGN SAG TIMES HA", 0x1229A: "CUNEIFORM SIGN SAG TIMES KAK", 0x1229B: "CUNEIFORM SIGN SAG TIMES KUR", 0x1229C: "CUNEIFORM SIGN SAG TIMES LUM", 0x1229D: "CUNEIFORM SIGN SAG TIMES MI", 0x1229E: "CUNEIFORM SIGN SAG TIMES NUN", 0x1229F: "CUNEIFORM SIGN SAG TIMES SAL", 0x122A0: "CUNEIFORM SIGN SAG TIMES SHID", 0x122A1: "CUNEIFORM SIGN SAG TIMES TAB", 0x122A2: "CUNEIFORM SIGN SAG TIMES U2", 0x122A3: "CUNEIFORM SIGN SAG TIMES UB", 0x122A4: "CUNEIFORM SIGN SAG TIMES UM", 0x122A5: "CUNEIFORM SIGN SAG TIMES UR", 0x122A6: "CUNEIFORM SIGN SAG TIMES USH", 0x122A7: "CUNEIFORM SIGN SAG OVER SAG", 0x122A8: "CUNEIFORM SIGN SAG GUNU", 0x122A9: "CUNEIFORM SIGN SAL", 0x122AA: "CUNEIFORM SIGN SAL LAGAB TIMES ASH2", 0x122AB: "CUNEIFORM SIGN SANGA2", 0x122AC: "CUNEIFORM SIGN SAR", 0x122AD: "CUNEIFORM SIGN SHA", 0x122AE: "CUNEIFORM SIGN SHA3", 0x122AF: "CUNEIFORM SIGN SHA3 TIMES A", 0x122B0: "CUNEIFORM SIGN SHA3 TIMES BAD", 0x122B1: "CUNEIFORM SIGN SHA3 TIMES GISH", 0x122B2: "CUNEIFORM SIGN SHA3 TIMES NE", 0x122B3: "CUNEIFORM SIGN SHA3 TIMES SHU2", 0x122B4: "CUNEIFORM SIGN SHA3 TIMES TUR", 0x122B5: "CUNEIFORM SIGN SHA3 TIMES U", 0x122B6: "CUNEIFORM SIGN SHA3 TIMES U PLUS A", 0x122B7: "CUNEIFORM SIGN SHA6", 0x122B8: "CUNEIFORM SIGN SHAB6", 0x122B9: "CUNEIFORM SIGN SHAR2", 0x122BA: "CUNEIFORM SIGN SHE", 0x122BB: "CUNEIFORM SIGN SHE HU", 0x122BC: "CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR", 0x122BD: "CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR", 0x122BE: "CUNEIFORM SIGN SHEG9", 0x122BF: "CUNEIFORM SIGN SHEN", 0x122C0: "CUNEIFORM SIGN SHESH", 0x122C1: "CUNEIFORM SIGN SHESH2", 0x122C2: "CUNEIFORM SIGN SHESHLAM", 0x122C3: "CUNEIFORM SIGN SHID", 0x122C4: "CUNEIFORM SIGN SHID TIMES A", 0x122C5: "CUNEIFORM SIGN SHID TIMES IM", 0x122C6: "CUNEIFORM SIGN SHIM", 0x122C7: "CUNEIFORM SIGN SHIM TIMES A", 0x122C8: "CUNEIFORM SIGN SHIM TIMES BAL", 0x122C9: "CUNEIFORM SIGN SHIM TIMES BULUG", 0x122CA: "CUNEIFORM SIGN SHIM TIMES DIN", 0x122CB: "CUNEIFORM SIGN SHIM TIMES GAR", 0x122CC: "CUNEIFORM SIGN SHIM TIMES IGI", 0x122CD: "CUNEIFORM SIGN SHIM TIMES IGI GUNU", 0x122CE: "CUNEIFORM SIGN SHIM TIMES KUSHU2", 0x122CF: "CUNEIFORM SIGN SHIM TIMES LUL", 0x122D0: "CUNEIFORM SIGN SHIM TIMES MUG", 0x122D1: "CUNEIFORM SIGN SHIM TIMES SAL", 0x122D2: "CUNEIFORM SIGN SHINIG", 0x122D3: "CUNEIFORM SIGN SHIR", 0x122D4: "CUNEIFORM SIGN SHIR TENU", 0x122D5: "CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR", 0x122D6: "CUNEIFORM SIGN SHITA", 0x122D7: "CUNEIFORM SIGN SHU", 0x122D8: "CUNEIFORM SIGN SHU OVER INVERTED SHU", 0x122D9: "CUNEIFORM SIGN SHU2", 0x122DA: "CUNEIFORM SIGN SHUBUR", 0x122DB: "CUNEIFORM SIGN SI", 0x122DC: "CUNEIFORM SIGN SI GUNU", 0x122DD: "CUNEIFORM SIGN SIG", 0x122DE: "CUNEIFORM SIGN SIG4", 0x122DF: "CUNEIFORM SIGN SIG4 OVER SIG4 SHU2", 0x122E0: "CUNEIFORM SIGN SIK2", 0x122E1: "CUNEIFORM SIGN SILA3", 0x122E2: "CUNEIFORM SIGN SU", 0x122E3: "CUNEIFORM SIGN SU OVER SU", 0x122E4: "CUNEIFORM SIGN SUD", 0x122E5: "CUNEIFORM SIGN SUD2", 0x122E6: "CUNEIFORM SIGN SUHUR", 0x122E7: "CUNEIFORM SIGN SUM", 0x122E8: "CUNEIFORM SIGN SUMASH", 0x122E9: "CUNEIFORM SIGN SUR", 0x122EA: "CUNEIFORM SIGN SUR9", 0x122EB: "CUNEIFORM SIGN TA", 0x122EC: "CUNEIFORM SIGN TA ASTERISK", 0x122ED: "CUNEIFORM SIGN TA TIMES HI", 0x122EE: "CUNEIFORM SIGN TA TIMES MI", 0x122EF: "CUNEIFORM SIGN TA GUNU", 0x122F0: "CUNEIFORM SIGN TAB", 0x122F1: "CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH", 0x122F2: "CUNEIFORM SIGN TAB SQUARED", 0x122F3: "CUNEIFORM SIGN TAG", 0x122F4: "CUNEIFORM SIGN TAG TIMES BI", 0x122F5: "CUNEIFORM SIGN TAG TIMES GUD", 0x122F6: "CUNEIFORM SIGN TAG TIMES SHE", 0x122F7: "CUNEIFORM SIGN TAG TIMES SHU", 0x122F8: "CUNEIFORM SIGN TAG TIMES TUG2", 0x122F9: "CUNEIFORM SIGN TAG TIMES UD", 0x122FA: "CUNEIFORM SIGN TAK4", 0x122FB: "CUNEIFORM SIGN TAR", 0x122FC: "CUNEIFORM SIGN TE", 0x122FD: "CUNEIFORM SIGN TE GUNU", 0x122FE: "CUNEIFORM SIGN TI", 0x122FF: "CUNEIFORM SIGN TI TENU", 0x12300: "CUNEIFORM SIGN TIL", 0x12301: "CUNEIFORM SIGN TIR", 0x12302: "CUNEIFORM SIGN TIR TIMES TAK4", 0x12303: "CUNEIFORM SIGN TIR OVER TIR", 0x12304: "CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR", 0x12305: "CUNEIFORM SIGN TU", 0x12306: "CUNEIFORM SIGN TUG2", 0x12307: "CUNEIFORM SIGN TUK", 0x12308: "CUNEIFORM SIGN TUM", 0x12309: "CUNEIFORM SIGN TUR", 0x1230A: "CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA", 0x1230B: "CUNEIFORM SIGN U", 0x1230C: "CUNEIFORM SIGN U GUD", 0x1230D: "CUNEIFORM SIGN U U U", 0x1230E: "CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR", 0x1230F: "CUNEIFORM SIGN U OVER U SUR OVER SUR", 0x12310: "CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED", 0x12311: "CUNEIFORM SIGN U2", 0x12312: "CUNEIFORM SIGN UB", 0x12313: "CUNEIFORM SIGN UD", 0x12314: "CUNEIFORM SIGN UD KUSHU2", 0x12315: "CUNEIFORM SIGN UD TIMES BAD", 0x12316: "CUNEIFORM SIGN UD TIMES MI", 0x12317: "CUNEIFORM SIGN UD TIMES U PLUS U PLUS U", 0x12318: "CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU", 0x12319: "CUNEIFORM SIGN UD GUNU", 0x1231A: "CUNEIFORM SIGN UD SHESHIG", 0x1231B: "CUNEIFORM SIGN UD SHESHIG TIMES BAD", 0x1231C: "CUNEIFORM SIGN UDUG", 0x1231D: "CUNEIFORM SIGN UM", 0x1231E: "CUNEIFORM SIGN UM TIMES LAGAB", 0x1231F: "CUNEIFORM SIGN UM TIMES ME PLUS DA", 0x12320: "CUNEIFORM SIGN UM TIMES SHA3", 0x12321: "CUNEIFORM SIGN UM TIMES U", 0x12322: "CUNEIFORM SIGN UMBIN", 0x12323: "CUNEIFORM SIGN UMUM", 0x12324: "CUNEIFORM SIGN UMUM TIMES KASKAL", 0x12325: "CUNEIFORM SIGN UMUM TIMES PA", 0x12326: "CUNEIFORM SIGN UN", 0x12327: "CUNEIFORM SIGN UN GUNU", 0x12328: "CUNEIFORM SIGN UR", 0x12329: "CUNEIFORM SIGN UR CROSSING UR", 0x1232A: "CUNEIFORM SIGN UR SHESHIG", 0x1232B: "CUNEIFORM SIGN UR2", 0x1232C: "CUNEIFORM SIGN UR2 TIMES A PLUS HA", 0x1232D: "CUNEIFORM SIGN UR2 TIMES A PLUS NA", 0x1232E: "CUNEIFORM SIGN UR2 TIMES AL", 0x1232F: "CUNEIFORM SIGN UR2 TIMES HA", 0x12330: "CUNEIFORM SIGN UR2 TIMES NUN", 0x12331: "CUNEIFORM SIGN UR2 TIMES U2", 0x12332: "CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH", 0x12333: "CUNEIFORM SIGN UR2 TIMES U2 PLUS BI", 0x12334: "CUNEIFORM SIGN UR4", 0x12335: "CUNEIFORM SIGN URI", 0x12336: "CUNEIFORM SIGN URI3", 0x12337: "CUNEIFORM SIGN URU", 0x12338: "CUNEIFORM SIGN URU TIMES A", 0x12339: "CUNEIFORM SIGN URU TIMES ASHGAB", 0x1233A: "CUNEIFORM SIGN URU TIMES BAR", 0x1233B: "CUNEIFORM SIGN URU TIMES DUN", 0x1233C: "CUNEIFORM SIGN URU TIMES GA", 0x1233D: "CUNEIFORM SIGN URU TIMES GAL", 0x1233E: "CUNEIFORM SIGN URU TIMES GAN2 TENU", 0x1233F: "CUNEIFORM SIGN URU TIMES GAR", 0x12340: "CUNEIFORM SIGN URU TIMES GU", 0x12341: "CUNEIFORM SIGN URU TIMES HA", 0x12342: "CUNEIFORM SIGN URU TIMES IGI", 0x12343: "CUNEIFORM SIGN URU TIMES IM", 0x12344: "CUNEIFORM SIGN URU TIMES ISH", 0x12345: "CUNEIFORM SIGN URU TIMES KI", 0x12346: "CUNEIFORM SIGN URU TIMES LUM", 0x12347: "CUNEIFORM SIGN URU TIMES MIN", 0x12348: "CUNEIFORM SIGN URU TIMES PA", 0x12349: "CUNEIFORM SIGN URU TIMES SHE", 0x1234A: "CUNEIFORM SIGN URU TIMES SIG4", 0x1234B: "CUNEIFORM SIGN URU TIMES TU", 0x1234C: "CUNEIFORM SIGN URU TIMES U PLUS GUD", 0x1234D: "CUNEIFORM SIGN URU TIMES UD", 0x1234E: "CUNEIFORM SIGN URU TIMES URUDA", 0x1234F: "CUNEIFORM SIGN URUDA", 0x12350: "CUNEIFORM SIGN URUDA TIMES U", 0x12351: "CUNEIFORM SIGN USH", 0x12352: "CUNEIFORM SIGN USH TIMES A", 0x12353: "CUNEIFORM SIGN USH TIMES KU", 0x12354: "CUNEIFORM SIGN USH TIMES KUR", 0x12355: "CUNEIFORM SIGN USH TIMES TAK4", 0x12356: "CUNEIFORM SIGN USHX", 0x12357: "CUNEIFORM SIGN USH2", 0x12358: "CUNEIFORM SIGN USHUMX", 0x12359: "CUNEIFORM SIGN UTUKI", 0x1235A: "CUNEIFORM SIGN UZ3", 0x1235B: "CUNEIFORM SIGN UZ3 TIMES KASKAL", 0x1235C: "CUNEIFORM SIGN UZU", 0x1235D: "CUNEIFORM SIGN ZA", 0x1235E: "CUNEIFORM SIGN ZA TENU", 0x1235F: "CUNEIFORM SIGN ZA SQUARED TIMES KUR", 0x12360: "CUNEIFORM SIGN ZAG", 0x12361: "CUNEIFORM SIGN ZAMX", 0x12362: "CUNEIFORM SIGN ZE2", 0x12363: "CUNEIFORM SIGN ZI", 0x12364: "CUNEIFORM SIGN ZI OVER ZI", 0x12365: "CUNEIFORM SIGN ZI3", 0x12366: "CUNEIFORM SIGN ZIB", 0x12367: "CUNEIFORM SIGN ZIB KABA TENU", 0x12368: "CUNEIFORM SIGN ZIG", 0x12369: "CUNEIFORM SIGN ZIZ2", 0x1236A: "CUNEIFORM SIGN ZU", 0x1236B: "CUNEIFORM SIGN ZU5", 0x1236C: "CUNEIFORM SIGN ZU5 TIMES A", 0x1236D: "CUNEIFORM SIGN ZUBUR", 0x1236E: "CUNEIFORM SIGN ZUM", 0x12400: "CUNEIFORM NUMERIC SIGN TWO ASH", 0x12401: "CUNEIFORM NUMERIC SIGN THREE ASH", 0x12402: "CUNEIFORM NUMERIC SIGN FOUR ASH", 0x12403: "CUNEIFORM NUMERIC SIGN FIVE ASH", 0x12404: "CUNEIFORM NUMERIC SIGN SIX ASH", 0x12405: "CUNEIFORM NUMERIC SIGN SEVEN ASH", 0x12406: "CUNEIFORM NUMERIC SIGN EIGHT ASH", 0x12407: "CUNEIFORM NUMERIC SIGN NINE ASH", 0x12408: "CUNEIFORM NUMERIC SIGN THREE DISH", 0x12409: "CUNEIFORM NUMERIC SIGN FOUR DISH", 0x1240A: "CUNEIFORM NUMERIC SIGN FIVE DISH", 0x1240B: "CUNEIFORM NUMERIC SIGN SIX DISH", 0x1240C: "CUNEIFORM NUMERIC SIGN SEVEN DISH", 0x1240D: "CUNEIFORM NUMERIC SIGN EIGHT DISH", 0x1240E: "CUNEIFORM NUMERIC SIGN NINE DISH", 0x1240F: "CUNEIFORM NUMERIC SIGN FOUR U", 0x12410: "CUNEIFORM NUMERIC SIGN FIVE U", 0x12411: "CUNEIFORM NUMERIC SIGN SIX U", 0x12412: "CUNEIFORM NUMERIC SIGN SEVEN U", 0x12413: "CUNEIFORM NUMERIC SIGN EIGHT U", 0x12414: "CUNEIFORM NUMERIC SIGN NINE U", 0x12415: "CUNEIFORM NUMERIC SIGN ONE GESH2", 0x12416: "CUNEIFORM NUMERIC SIGN TWO GESH2", 0x12417: "CUNEIFORM NUMERIC SIGN THREE GESH2", 0x12418: "CUNEIFORM NUMERIC SIGN FOUR GESH2", 0x12419: "CUNEIFORM NUMERIC SIGN FIVE GESH2", 0x1241A: "CUNEIFORM NUMERIC SIGN SIX GESH2", 0x1241B: "CUNEIFORM NUMERIC SIGN SEVEN GESH2", 0x1241C: "CUNEIFORM NUMERIC SIGN EIGHT GESH2", 0x1241D: "CUNEIFORM NUMERIC SIGN NINE GESH2", 0x1241E: "CUNEIFORM NUMERIC SIGN ONE GESHU", 0x1241F: "CUNEIFORM NUMERIC SIGN TWO GESHU", 0x12420: "CUNEIFORM NUMERIC SIGN THREE GESHU", 0x12421: "CUNEIFORM NUMERIC SIGN FOUR GESHU", 0x12422: "CUNEIFORM NUMERIC SIGN FIVE GESHU", 0x12423: "CUNEIFORM NUMERIC SIGN TWO SHAR2", 0x12424: "CUNEIFORM NUMERIC SIGN THREE SHAR2", 0x12425: "CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM", 0x12426: "CUNEIFORM NUMERIC SIGN FOUR SHAR2", 0x12427: "CUNEIFORM NUMERIC SIGN FIVE SHAR2", 0x12428: "CUNEIFORM NUMERIC SIGN SIX SHAR2", 0x12429: "CUNEIFORM NUMERIC SIGN SEVEN SHAR2", 0x1242A: "CUNEIFORM NUMERIC SIGN EIGHT SHAR2", 0x1242B: "CUNEIFORM NUMERIC SIGN NINE SHAR2", 0x1242C: "CUNEIFORM NUMERIC SIGN ONE SHARU", 0x1242D: "CUNEIFORM NUMERIC SIGN TWO SHARU", 0x1242E: "CUNEIFORM NUMERIC SIGN THREE SHARU", 0x1242F: "CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM", 0x12430: "CUNEIFORM NUMERIC SIGN FOUR SHARU", 0x12431: "CUNEIFORM NUMERIC SIGN FIVE SHARU", 0x12432: "CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH", 0x12433: "CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN", 0x12434: "CUNEIFORM NUMERIC SIGN ONE BURU", 0x12435: "CUNEIFORM NUMERIC SIGN TWO BURU", 0x12436: "CUNEIFORM NUMERIC SIGN THREE BURU", 0x12437: "CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM", 0x12438: "CUNEIFORM NUMERIC SIGN FOUR BURU", 0x12439: "CUNEIFORM NUMERIC SIGN FIVE BURU", 0x1243A: "CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16", 0x1243B: "CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21", 0x1243C: "CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU", 0x1243D: "CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4", 0x1243E: "CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A", 0x1243F: "CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B", 0x12440: "CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9", 0x12441: "CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3", 0x12442: "CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A", 0x12443: "CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B", 0x12444: "CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU", 0x12445: "CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3", 0x12446: "CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU", 0x12447: "CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3", 0x12448: "CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4", 0x12449: "CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A", 0x1244A: "CUNEIFORM NUMERIC SIGN TWO ASH TENU", 0x1244B: "CUNEIFORM NUMERIC SIGN THREE ASH TENU", 0x1244C: "CUNEIFORM NUMERIC SIGN FOUR ASH TENU", 0x1244D: "CUNEIFORM NUMERIC SIGN FIVE ASH TENU", 0x1244E: "CUNEIFORM NUMERIC SIGN SIX ASH TENU", 0x1244F: "CUNEIFORM NUMERIC SIGN ONE BAN2", 0x12450: "CUNEIFORM NUMERIC SIGN TWO BAN2", 0x12451: "CUNEIFORM NUMERIC SIGN THREE BAN2", 0x12452: "CUNEIFORM NUMERIC SIGN FOUR BAN2", 0x12453: "CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM", 0x12454: "CUNEIFORM NUMERIC SIGN FIVE BAN2", 0x12455: "CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM", 0x12456: "CUNEIFORM NUMERIC SIGN NIGIDAMIN", 0x12457: "CUNEIFORM NUMERIC SIGN NIGIDAESH", 0x12458: "CUNEIFORM NUMERIC SIGN ONE ESHE3", 0x12459: "CUNEIFORM NUMERIC SIGN TWO ESHE3", 0x1245A: "CUNEIFORM NUMERIC SIGN ONE THIRD DISH", 0x1245B: "CUNEIFORM NUMERIC SIGN TWO THIRDS DISH", 0x1245C: "CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH", 0x1245D: "CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A", 0x1245E: "CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A", 0x1245F: "CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH", 0x12460: "CUNEIFORM NUMERIC SIGN ONE QUARTER ASH", 0x12461: "CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH", 0x12462: "CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER", 0x12470: "CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER", 0x12471: "CUNEIFORM PUNCTUATION SIGN VERTICAL COLON", 0x12472: "CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON", 0x12473: "CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON", 0x1D000: "BYZANTINE MUSICAL SYMBOL PSILI", 0x1D001: "BYZANTINE MUSICAL SYMBOL DASEIA", 0x1D002: "BYZANTINE MUSICAL SYMBOL PERISPOMENI", 0x1D003: "BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON", 0x1D004: "BYZANTINE MUSICAL SYMBOL OXEIA DIPLI", 0x1D005: "BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON", 0x1D006: "BYZANTINE MUSICAL SYMBOL VAREIA DIPLI", 0x1D007: "BYZANTINE MUSICAL SYMBOL KATHISTI", 0x1D008: "BYZANTINE MUSICAL SYMBOL SYRMATIKI", 0x1D009: "BYZANTINE MUSICAL SYMBOL PARAKLITIKI", 0x1D00A: "BYZANTINE MUSICAL SYMBOL YPOKRISIS", 0x1D00B: "BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI", 0x1D00C: "BYZANTINE MUSICAL SYMBOL KREMASTI", 0x1D00D: "BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON", 0x1D00E: "BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON", 0x1D00F: "BYZANTINE MUSICAL SYMBOL TELEIA", 0x1D010: "BYZANTINE MUSICAL SYMBOL KENTIMATA", 0x1D011: "BYZANTINE MUSICAL SYMBOL APOSTROFOS", 0x1D012: "BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI", 0x1D013: "BYZANTINE MUSICAL SYMBOL SYNEVMA", 0x1D014: "BYZANTINE MUSICAL SYMBOL THITA", 0x1D015: "BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION", 0x1D016: "BYZANTINE MUSICAL SYMBOL GORGON ARCHAION", 0x1D017: "BYZANTINE MUSICAL SYMBOL PSILON", 0x1D018: "BYZANTINE MUSICAL SYMBOL CHAMILON", 0x1D019: "BYZANTINE MUSICAL SYMBOL VATHY", 0x1D01A: "BYZANTINE MUSICAL SYMBOL ISON ARCHAION", 0x1D01B: "BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION", 0x1D01C: "BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION", 0x1D01D: "BYZANTINE MUSICAL SYMBOL SAXIMATA", 0x1D01E: "BYZANTINE MUSICAL SYMBOL PARICHON", 0x1D01F: "BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA", 0x1D020: "BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION", 0x1D021: "BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION", 0x1D022: "BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION", 0x1D023: "BYZANTINE MUSICAL SYMBOL APOTHEMA", 0x1D024: "BYZANTINE MUSICAL SYMBOL KLASMA", 0x1D025: "BYZANTINE MUSICAL SYMBOL REVMA", 0x1D026: "BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION", 0x1D027: "BYZANTINE MUSICAL SYMBOL TINAGMA", 0x1D028: "BYZANTINE MUSICAL SYMBOL ANATRICHISMA", 0x1D029: "BYZANTINE MUSICAL SYMBOL SEISMA", 0x1D02A: "BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION", 0x1D02B: "BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU", 0x1D02C: "BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION", 0x1D02D: "BYZANTINE MUSICAL SYMBOL THEMA", 0x1D02E: "BYZANTINE MUSICAL SYMBOL LEMOI", 0x1D02F: "BYZANTINE MUSICAL SYMBOL DYO", 0x1D030: "BYZANTINE MUSICAL SYMBOL TRIA", 0x1D031: "BYZANTINE MUSICAL SYMBOL TESSERA", 0x1D032: "BYZANTINE MUSICAL SYMBOL KRATIMATA", 0x1D033: "BYZANTINE MUSICAL SYMBOL APESO EXO NEO", 0x1D034: "BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION", 0x1D035: "BYZANTINE MUSICAL SYMBOL IMIFTHORA", 0x1D036: "BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION", 0x1D037: "BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON", 0x1D038: "BYZANTINE MUSICAL SYMBOL PELASTON", 0x1D039: "BYZANTINE MUSICAL SYMBOL PSIFISTON", 0x1D03A: "BYZANTINE MUSICAL SYMBOL KONTEVMA", 0x1D03B: "BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION", 0x1D03C: "BYZANTINE MUSICAL SYMBOL RAPISMA", 0x1D03D: "BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION", 0x1D03E: "BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION", 0x1D03F: "BYZANTINE MUSICAL SYMBOL ICHADIN", 0x1D040: "BYZANTINE MUSICAL SYMBOL NANA", 0x1D041: "BYZANTINE MUSICAL SYMBOL PETASMA", 0x1D042: "BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO", 0x1D043: "BYZANTINE MUSICAL SYMBOL TROMIKON ALLO", 0x1D044: "BYZANTINE MUSICAL SYMBOL STRAGGISMATA", 0x1D045: "BYZANTINE MUSICAL SYMBOL GRONTHISMATA", 0x1D046: "BYZANTINE MUSICAL SYMBOL ISON NEO", 0x1D047: "BYZANTINE MUSICAL SYMBOL OLIGON NEO", 0x1D048: "BYZANTINE MUSICAL SYMBOL OXEIA NEO", 0x1D049: "BYZANTINE MUSICAL SYMBOL PETASTI", 0x1D04A: "BYZANTINE MUSICAL SYMBOL KOUFISMA", 0x1D04B: "BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA", 0x1D04C: "BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA", 0x1D04D: "BYZANTINE MUSICAL SYMBOL PELASTON NEO", 0x1D04E: "BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO", 0x1D04F: "BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO", 0x1D050: "BYZANTINE MUSICAL SYMBOL YPSILI", 0x1D051: "BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO", 0x1D052: "BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO", 0x1D053: "BYZANTINE MUSICAL SYMBOL YPORROI", 0x1D054: "BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON", 0x1D055: "BYZANTINE MUSICAL SYMBOL ELAFRON", 0x1D056: "BYZANTINE MUSICAL SYMBOL CHAMILI", 0x1D057: "BYZANTINE MUSICAL SYMBOL MIKRON ISON", 0x1D058: "BYZANTINE MUSICAL SYMBOL VAREIA NEO", 0x1D059: "BYZANTINE MUSICAL SYMBOL PIASMA NEO", 0x1D05A: "BYZANTINE MUSICAL SYMBOL PSIFISTON NEO", 0x1D05B: "BYZANTINE MUSICAL SYMBOL OMALON", 0x1D05C: "BYZANTINE MUSICAL SYMBOL ANTIKENOMA", 0x1D05D: "BYZANTINE MUSICAL SYMBOL LYGISMA", 0x1D05E: "BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO", 0x1D05F: "BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO", 0x1D060: "BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA", 0x1D061: "BYZANTINE MUSICAL SYMBOL KYLISMA", 0x1D062: "BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA", 0x1D063: "BYZANTINE MUSICAL SYMBOL TROMIKON NEO", 0x1D064: "BYZANTINE MUSICAL SYMBOL EKSTREPTON", 0x1D065: "BYZANTINE MUSICAL SYMBOL SYNAGMA NEO", 0x1D066: "BYZANTINE MUSICAL SYMBOL SYRMA", 0x1D067: "BYZANTINE MUSICAL SYMBOL CHOREVMA NEO", 0x1D068: "BYZANTINE MUSICAL SYMBOL EPEGERMA", 0x1D069: "BYZANTINE MUSICAL SYMBOL SEISMA NEO", 0x1D06A: "BYZANTINE MUSICAL SYMBOL XIRON KLASMA", 0x1D06B: "BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON", 0x1D06C: "BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA", 0x1D06D: "BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA", 0x1D06E: "BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA", 0x1D06F: "BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA", 0x1D070: "BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA", 0x1D071: "BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA", 0x1D072: "BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON", 0x1D073: "BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON", 0x1D074: "BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON", 0x1D075: "BYZANTINE MUSICAL SYMBOL OYRANISMA NEO", 0x1D076: "BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO", 0x1D077: "BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO", 0x1D078: "BYZANTINE MUSICAL SYMBOL THEMA APLOUN", 0x1D079: "BYZANTINE MUSICAL SYMBOL THES KAI APOTHES", 0x1D07A: "BYZANTINE MUSICAL SYMBOL KATAVASMA", 0x1D07B: "BYZANTINE MUSICAL SYMBOL ENDOFONON", 0x1D07C: "BYZANTINE MUSICAL SYMBOL YFEN KATO", 0x1D07D: "BYZANTINE MUSICAL SYMBOL YFEN ANO", 0x1D07E: "BYZANTINE MUSICAL SYMBOL STAVROS", 0x1D07F: "BYZANTINE MUSICAL SYMBOL KLASMA ANO", 0x1D080: "BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION", 0x1D081: "BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION", 0x1D082: "BYZANTINE MUSICAL SYMBOL KRATIMA ALLO", 0x1D083: "BYZANTINE MUSICAL SYMBOL KRATIMA NEO", 0x1D084: "BYZANTINE MUSICAL SYMBOL APODERMA NEO", 0x1D085: "BYZANTINE MUSICAL SYMBOL APLI", 0x1D086: "BYZANTINE MUSICAL SYMBOL DIPLI", 0x1D087: "BYZANTINE MUSICAL SYMBOL TRIPLI", 0x1D088: "BYZANTINE MUSICAL SYMBOL TETRAPLI", 0x1D089: "BYZANTINE MUSICAL SYMBOL KORONIS", 0x1D08A: "BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU", 0x1D08B: "BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON", 0x1D08C: "BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON", 0x1D08D: "BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON", 0x1D08E: "BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU", 0x1D08F: "BYZANTINE MUSICAL SYMBOL GORGON NEO ANO", 0x1D090: "BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA", 0x1D091: "BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA", 0x1D092: "BYZANTINE MUSICAL SYMBOL DIGORGON", 0x1D093: "BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO", 0x1D094: "BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO", 0x1D095: "BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA", 0x1D096: "BYZANTINE MUSICAL SYMBOL TRIGORGON", 0x1D097: "BYZANTINE MUSICAL SYMBOL ARGON", 0x1D098: "BYZANTINE MUSICAL SYMBOL IMIDIARGON", 0x1D099: "BYZANTINE MUSICAL SYMBOL DIARGON", 0x1D09A: "BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI", 0x1D09B: "BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI", 0x1D09C: "BYZANTINE MUSICAL SYMBOL AGOGI ARGI", 0x1D09D: "BYZANTINE MUSICAL SYMBOL AGOGI METRIA", 0x1D09E: "BYZANTINE MUSICAL SYMBOL AGOGI MESI", 0x1D09F: "BYZANTINE MUSICAL SYMBOL AGOGI GORGI", 0x1D0A0: "BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI", 0x1D0A1: "BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI", 0x1D0A2: "BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS", 0x1D0A3: "BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS", 0x1D0A4: "BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS", 0x1D0A5: "BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS", 0x1D0A6: "BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS", 0x1D0A7: "BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS", 0x1D0A8: "BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS", 0x1D0A9: "BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS", 0x1D0AA: "BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS", 0x1D0AB: "BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS", 0x1D0AC: "BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS", 0x1D0AD: "BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS", 0x1D0AE: "BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS", 0x1D0AF: "BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS", 0x1D0B0: "BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS", 0x1D0B1: "BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS", 0x1D0B2: "BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS", 0x1D0B3: "BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS", 0x1D0B4: "BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN", 0x1D0B5: "BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN", 0x1D0B6: "BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU", 0x1D0B7: "BYZANTINE MUSICAL SYMBOL IMIFONON", 0x1D0B8: "BYZANTINE MUSICAL SYMBOL IMIFTHORON", 0x1D0B9: "BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU", 0x1D0BA: "BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA", 0x1D0BB: "BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA", 0x1D0BC: "BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS", 0x1D0BD: "BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI", 0x1D0BE: "BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI", 0x1D0BF: "BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE", 0x1D0C0: "BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO", 0x1D0C1: "BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO", 0x1D0C2: "BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO", 0x1D0C3: "BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS", 0x1D0C4: "BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS", 0x1D0C5: "BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS", 0x1D0C6: "BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI", 0x1D0C7: "BYZANTINE MUSICAL SYMBOL FTHORA NENANO", 0x1D0C8: "BYZANTINE MUSICAL SYMBOL CHROA ZYGOS", 0x1D0C9: "BYZANTINE MUSICAL SYMBOL CHROA KLITON", 0x1D0CA: "BYZANTINE MUSICAL SYMBOL CHROA SPATHI", 0x1D0CB: "BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION", 0x1D0CC: "BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA", 0x1D0CD: "BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION", 0x1D0CE: "BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION", 0x1D0CF: "BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION", 0x1D0D0: "BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA", 0x1D0D1: "BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA", 0x1D0D2: "BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA", 0x1D0D3: "BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA", 0x1D0D4: "BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA", 0x1D0D5: "BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA", 0x1D0D6: "BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA", 0x1D0D7: "BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA", 0x1D0D8: "BYZANTINE MUSICAL SYMBOL GENIKI DIESIS", 0x1D0D9: "BYZANTINE MUSICAL SYMBOL GENIKI YFESIS", 0x1D0DA: "BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI", 0x1D0DB: "BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI", 0x1D0DC: "BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI", 0x1D0DD: "BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS", 0x1D0DE: "BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS", 0x1D0DF: "BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU", 0x1D0E0: "BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU", 0x1D0E1: "BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU", 0x1D0E2: "BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS", 0x1D0E3: "BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU", 0x1D0E4: "BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU", 0x1D0E5: "BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU", 0x1D0E6: "BYZANTINE MUSICAL SYMBOL DIGRAMMA GG", 0x1D0E7: "BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU", 0x1D0E8: "BYZANTINE MUSICAL SYMBOL STIGMA", 0x1D0E9: "BYZANTINE MUSICAL SYMBOL ARKTIKO PA", 0x1D0EA: "BYZANTINE MUSICAL SYMBOL ARKTIKO VOU", 0x1D0EB: "BYZANTINE MUSICAL SYMBOL ARKTIKO GA", 0x1D0EC: "BYZANTINE MUSICAL SYMBOL ARKTIKO DI", 0x1D0ED: "BYZANTINE MUSICAL SYMBOL ARKTIKO KE", 0x1D0EE: "BYZANTINE MUSICAL SYMBOL ARKTIKO ZO", 0x1D0EF: "BYZANTINE MUSICAL SYMBOL ARKTIKO NI", 0x1D0F0: "BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO", 0x1D0F1: "BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO", 0x1D0F2: "BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO", 0x1D0F3: "BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO", 0x1D0F4: "BYZANTINE MUSICAL SYMBOL KLASMA KATO", 0x1D0F5: "BYZANTINE MUSICAL SYMBOL GORGON NEO KATO", 0x1D100: "MUSICAL SYMBOL SINGLE BARLINE", 0x1D101: "MUSICAL SYMBOL DOUBLE BARLINE", 0x1D102: "MUSICAL SYMBOL FINAL BARLINE", 0x1D103: "MUSICAL SYMBOL REVERSE FINAL BARLINE", 0x1D104: "MUSICAL SYMBOL DASHED BARLINE", 0x1D105: "MUSICAL SYMBOL SHORT BARLINE", 0x1D106: "MUSICAL SYMBOL LEFT REPEAT SIGN", 0x1D107: "MUSICAL SYMBOL RIGHT REPEAT SIGN", 0x1D108: "MUSICAL SYMBOL REPEAT DOTS", 0x1D109: "MUSICAL SYMBOL DAL SEGNO", 0x1D10A: "MUSICAL SYMBOL DA CAPO", 0x1D10B: "MUSICAL SYMBOL SEGNO", 0x1D10C: "MUSICAL SYMBOL CODA", 0x1D10D: "MUSICAL SYMBOL REPEATED FIGURE-1", 0x1D10E: "MUSICAL SYMBOL REPEATED FIGURE-2", 0x1D10F: "MUSICAL SYMBOL REPEATED FIGURE-3", 0x1D110: "MUSICAL SYMBOL FERMATA", 0x1D111: "MUSICAL SYMBOL FERMATA BELOW", 0x1D112: "MUSICAL SYMBOL BREATH MARK", 0x1D113: "MUSICAL SYMBOL CAESURA", 0x1D114: "MUSICAL SYMBOL BRACE", 0x1D115: "MUSICAL SYMBOL BRACKET", 0x1D116: "MUSICAL SYMBOL ONE-LINE STAFF", 0x1D117: "MUSICAL SYMBOL TWO-LINE STAFF", 0x1D118: "MUSICAL SYMBOL THREE-LINE STAFF", 0x1D119: "MUSICAL SYMBOL FOUR-LINE STAFF", 0x1D11A: "MUSICAL SYMBOL FIVE-LINE STAFF", 0x1D11B: "MUSICAL SYMBOL SIX-LINE STAFF", 0x1D11C: "MUSICAL SYMBOL SIX-STRING FRETBOARD", 0x1D11D: "MUSICAL SYMBOL FOUR-STRING FRETBOARD", 0x1D11E: "MUSICAL SYMBOL G CLEF", 0x1D11F: "MUSICAL SYMBOL G CLEF OTTAVA ALTA", 0x1D120: "MUSICAL SYMBOL G CLEF OTTAVA BASSA", 0x1D121: "MUSICAL SYMBOL C CLEF", 0x1D122: "MUSICAL SYMBOL F CLEF", 0x1D123: "MUSICAL SYMBOL F CLEF OTTAVA ALTA", 0x1D124: "MUSICAL SYMBOL F CLEF OTTAVA BASSA", 0x1D125: "MUSICAL SYMBOL DRUM CLEF-1", 0x1D126: "MUSICAL SYMBOL DRUM CLEF-2", 0x1D129: "MUSICAL SYMBOL MULTIPLE MEASURE REST", 0x1D12A: "MUSICAL SYMBOL DOUBLE SHARP", 0x1D12B: "MUSICAL SYMBOL DOUBLE FLAT", 0x1D12C: "MUSICAL SYMBOL FLAT UP", 0x1D12D: "MUSICAL SYMBOL FLAT DOWN", 0x1D12E: "MUSICAL SYMBOL NATURAL UP", 0x1D12F: "MUSICAL SYMBOL NATURAL DOWN", 0x1D130: "MUSICAL SYMBOL SHARP UP", 0x1D131: "MUSICAL SYMBOL SHARP DOWN", 0x1D132: "MUSICAL SYMBOL QUARTER TONE SHARP", 0x1D133: "MUSICAL SYMBOL QUARTER TONE FLAT", 0x1D134: "MUSICAL SYMBOL COMMON TIME", 0x1D135: "MUSICAL SYMBOL CUT TIME", 0x1D136: "MUSICAL SYMBOL OTTAVA ALTA", 0x1D137: "MUSICAL SYMBOL OTTAVA BASSA", 0x1D138: "MUSICAL SYMBOL QUINDICESIMA ALTA", 0x1D139: "MUSICAL SYMBOL QUINDICESIMA BASSA", 0x1D13A: "MUSICAL SYMBOL MULTI REST", 0x1D13B: "MUSICAL SYMBOL WHOLE REST", 0x1D13C: "MUSICAL SYMBOL HALF REST", 0x1D13D: "MUSICAL SYMBOL QUARTER REST", 0x1D13E: "MUSICAL SYMBOL EIGHTH REST", 0x1D13F: "MUSICAL SYMBOL SIXTEENTH REST", 0x1D140: "MUSICAL SYMBOL THIRTY-SECOND REST", 0x1D141: "MUSICAL SYMBOL SIXTY-FOURTH REST", 0x1D142: "MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST", 0x1D143: "MUSICAL SYMBOL X NOTEHEAD", 0x1D144: "MUSICAL SYMBOL PLUS NOTEHEAD", 0x1D145: "MUSICAL SYMBOL CIRCLE X NOTEHEAD", 0x1D146: "MUSICAL SYMBOL SQUARE NOTEHEAD WHITE", 0x1D147: "MUSICAL SYMBOL SQUARE NOTEHEAD BLACK", 0x1D148: "MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE", 0x1D149: "MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK", 0x1D14A: "MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE", 0x1D14B: "MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK", 0x1D14C: "MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE", 0x1D14D: "MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK", 0x1D14E: "MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE", 0x1D14F: "MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK", 0x1D150: "MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE", 0x1D151: "MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK", 0x1D152: "MUSICAL SYMBOL MOON NOTEHEAD WHITE", 0x1D153: "MUSICAL SYMBOL MOON NOTEHEAD BLACK", 0x1D154: "MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE", 0x1D155: "MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK", 0x1D156: "MUSICAL SYMBOL PARENTHESIS NOTEHEAD", 0x1D157: "MUSICAL SYMBOL VOID NOTEHEAD", 0x1D158: "MUSICAL SYMBOL NOTEHEAD BLACK", 0x1D159: "MUSICAL SYMBOL NULL NOTEHEAD", 0x1D15A: "MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE", 0x1D15B: "MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK", 0x1D15C: "MUSICAL SYMBOL BREVE", 0x1D15D: "MUSICAL SYMBOL WHOLE NOTE", 0x1D15E: "MUSICAL SYMBOL HALF NOTE", 0x1D15F: "MUSICAL SYMBOL QUARTER NOTE", 0x1D160: "MUSICAL SYMBOL EIGHTH NOTE", 0x1D161: "MUSICAL SYMBOL SIXTEENTH NOTE", 0x1D162: "MUSICAL SYMBOL THIRTY-SECOND NOTE", 0x1D163: "MUSICAL SYMBOL SIXTY-FOURTH NOTE", 0x1D164: "MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE", 0x1D165: "MUSICAL SYMBOL COMBINING STEM", 0x1D166: "MUSICAL SYMBOL COMBINING SPRECHGESANG STEM", 0x1D167: "MUSICAL SYMBOL COMBINING TREMOLO-1", 0x1D168: "MUSICAL SYMBOL COMBINING TREMOLO-2", 0x1D169: "MUSICAL SYMBOL COMBINING TREMOLO-3", 0x1D16A: "MUSICAL SYMBOL FINGERED TREMOLO-1", 0x1D16B: "MUSICAL SYMBOL FINGERED TREMOLO-2", 0x1D16C: "MUSICAL SYMBOL FINGERED TREMOLO-3", 0x1D16D: "MUSICAL SYMBOL COMBINING AUGMENTATION DOT", 0x1D16E: "MUSICAL SYMBOL COMBINING FLAG-1", 0x1D16F: "MUSICAL SYMBOL COMBINING FLAG-2", 0x1D170: "MUSICAL SYMBOL COMBINING FLAG-3", 0x1D171: "MUSICAL SYMBOL COMBINING FLAG-4", 0x1D172: "MUSICAL SYMBOL COMBINING FLAG-5", 0x1D173: "MUSICAL SYMBOL BEGIN BEAM", 0x1D174: "MUSICAL SYMBOL END BEAM", 0x1D175: "MUSICAL SYMBOL BEGIN TIE", 0x1D176: "MUSICAL SYMBOL END TIE", 0x1D177: "MUSICAL SYMBOL BEGIN SLUR", 0x1D178: "MUSICAL SYMBOL END SLUR", 0x1D179: "MUSICAL SYMBOL BEGIN PHRASE", 0x1D17A: "MUSICAL SYMBOL END PHRASE", 0x1D17B: "MUSICAL SYMBOL COMBINING ACCENT", 0x1D17C: "MUSICAL SYMBOL COMBINING STACCATO", 0x1D17D: "MUSICAL SYMBOL COMBINING TENUTO", 0x1D17E: "MUSICAL SYMBOL COMBINING STACCATISSIMO", 0x1D17F: "MUSICAL SYMBOL COMBINING MARCATO", 0x1D180: "MUSICAL SYMBOL COMBINING MARCATO-STACCATO", 0x1D181: "MUSICAL SYMBOL COMBINING ACCENT-STACCATO", 0x1D182: "MUSICAL SYMBOL COMBINING LOURE", 0x1D183: "MUSICAL SYMBOL ARPEGGIATO UP", 0x1D184: "MUSICAL SYMBOL ARPEGGIATO DOWN", 0x1D185: "MUSICAL SYMBOL COMBINING DOIT", 0x1D186: "MUSICAL SYMBOL COMBINING RIP", 0x1D187: "MUSICAL SYMBOL COMBINING FLIP", 0x1D188: "MUSICAL SYMBOL COMBINING SMEAR", 0x1D189: "MUSICAL SYMBOL COMBINING BEND", 0x1D18A: "MUSICAL SYMBOL COMBINING DOUBLE TONGUE", 0x1D18B: "MUSICAL SYMBOL COMBINING TRIPLE TONGUE", 0x1D18C: "MUSICAL SYMBOL RINFORZANDO", 0x1D18D: "MUSICAL SYMBOL SUBITO", 0x1D18E: "MUSICAL SYMBOL Z", 0x1D18F: "MUSICAL SYMBOL PIANO", 0x1D190: "MUSICAL SYMBOL MEZZO", 0x1D191: "MUSICAL SYMBOL FORTE", 0x1D192: "MUSICAL SYMBOL CRESCENDO", 0x1D193: "MUSICAL SYMBOL DECRESCENDO", 0x1D194: "MUSICAL SYMBOL GRACE NOTE SLASH", 0x1D195: "MUSICAL SYMBOL GRACE NOTE NO SLASH", 0x1D196: "MUSICAL SYMBOL TR", 0x1D197: "MUSICAL SYMBOL TURN", 0x1D198: "MUSICAL SYMBOL INVERTED TURN", 0x1D199: "MUSICAL SYMBOL TURN SLASH", 0x1D19A: "MUSICAL SYMBOL TURN UP", 0x1D19B: "MUSICAL SYMBOL ORNAMENT STROKE-1", 0x1D19C: "MUSICAL SYMBOL ORNAMENT STROKE-2", 0x1D19D: "MUSICAL SYMBOL ORNAMENT STROKE-3", 0x1D19E: "MUSICAL SYMBOL ORNAMENT STROKE-4", 0x1D19F: "MUSICAL SYMBOL ORNAMENT STROKE-5", 0x1D1A0: "MUSICAL SYMBOL ORNAMENT STROKE-6", 0x1D1A1: "MUSICAL SYMBOL ORNAMENT STROKE-7", 0x1D1A2: "MUSICAL SYMBOL ORNAMENT STROKE-8", 0x1D1A3: "MUSICAL SYMBOL ORNAMENT STROKE-9", 0x1D1A4: "MUSICAL SYMBOL ORNAMENT STROKE-10", 0x1D1A5: "MUSICAL SYMBOL ORNAMENT STROKE-11", 0x1D1A6: "MUSICAL SYMBOL HAUPTSTIMME", 0x1D1A7: "MUSICAL SYMBOL NEBENSTIMME", 0x1D1A8: "MUSICAL SYMBOL END OF STIMME", 0x1D1A9: "MUSICAL SYMBOL DEGREE SLASH", 0x1D1AA: "MUSICAL SYMBOL COMBINING DOWN BOW", 0x1D1AB: "MUSICAL SYMBOL COMBINING UP BOW", 0x1D1AC: "MUSICAL SYMBOL COMBINING HARMONIC", 0x1D1AD: "MUSICAL SYMBOL COMBINING SNAP PIZZICATO", 0x1D1AE: "MUSICAL SYMBOL PEDAL MARK", 0x1D1AF: "MUSICAL SYMBOL PEDAL UP MARK", 0x1D1B0: "MUSICAL SYMBOL HALF PEDAL MARK", 0x1D1B1: "MUSICAL SYMBOL GLISSANDO UP", 0x1D1B2: "MUSICAL SYMBOL GLISSANDO DOWN", 0x1D1B3: "MUSICAL SYMBOL WITH FINGERNAILS", 0x1D1B4: "MUSICAL SYMBOL DAMP", 0x1D1B5: "MUSICAL SYMBOL DAMP ALL", 0x1D1B6: "MUSICAL SYMBOL MAXIMA", 0x1D1B7: "MUSICAL SYMBOL LONGA", 0x1D1B8: "MUSICAL SYMBOL BREVIS", 0x1D1B9: "MUSICAL SYMBOL SEMIBREVIS WHITE", 0x1D1BA: "MUSICAL SYMBOL SEMIBREVIS BLACK", 0x1D1BB: "MUSICAL SYMBOL MINIMA", 0x1D1BC: "MUSICAL SYMBOL MINIMA BLACK", 0x1D1BD: "MUSICAL SYMBOL SEMIMINIMA WHITE", 0x1D1BE: "MUSICAL SYMBOL SEMIMINIMA BLACK", 0x1D1BF: "MUSICAL SYMBOL FUSA WHITE", 0x1D1C0: "MUSICAL SYMBOL FUSA BLACK", 0x1D1C1: "MUSICAL SYMBOL LONGA PERFECTA REST", 0x1D1C2: "MUSICAL SYMBOL LONGA IMPERFECTA REST", 0x1D1C3: "MUSICAL SYMBOL BREVIS REST", 0x1D1C4: "MUSICAL SYMBOL SEMIBREVIS REST", 0x1D1C5: "MUSICAL SYMBOL MINIMA REST", 0x1D1C6: "MUSICAL SYMBOL SEMIMINIMA REST", 0x1D1C7: "MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA", 0x1D1C8: "MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA", 0x1D1C9: "MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1", 0x1D1CA: "MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA", 0x1D1CB: "MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA", 0x1D1CC: "MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1", 0x1D1CD: "MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2", 0x1D1CE: "MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3", 0x1D1CF: "MUSICAL SYMBOL CROIX", 0x1D1D0: "MUSICAL SYMBOL GREGORIAN C CLEF", 0x1D1D1: "MUSICAL SYMBOL GREGORIAN F CLEF", 0x1D1D2: "MUSICAL SYMBOL SQUARE B", 0x1D1D3: "MUSICAL SYMBOL VIRGA", 0x1D1D4: "MUSICAL SYMBOL PODATUS", 0x1D1D5: "MUSICAL SYMBOL CLIVIS", 0x1D1D6: "MUSICAL SYMBOL SCANDICUS", 0x1D1D7: "MUSICAL SYMBOL CLIMACUS", 0x1D1D8: "MUSICAL SYMBOL TORCULUS", 0x1D1D9: "MUSICAL SYMBOL PORRECTUS", 0x1D1DA: "MUSICAL SYMBOL PORRECTUS FLEXUS", 0x1D1DB: "MUSICAL SYMBOL SCANDICUS FLEXUS", 0x1D1DC: "MUSICAL SYMBOL TORCULUS RESUPINUS", 0x1D1DD: "MUSICAL SYMBOL PES SUBPUNCTIS", 0x1D200: "GREEK VOCAL NOTATION SYMBOL-1", 0x1D201: "GREEK VOCAL NOTATION SYMBOL-2", 0x1D202: "GREEK VOCAL NOTATION SYMBOL-3", 0x1D203: "GREEK VOCAL NOTATION SYMBOL-4", 0x1D204: "GREEK VOCAL NOTATION SYMBOL-5", 0x1D205: "GREEK VOCAL NOTATION SYMBOL-6", 0x1D206: "GREEK VOCAL NOTATION SYMBOL-7", 0x1D207: "GREEK VOCAL NOTATION SYMBOL-8", 0x1D208: "GREEK VOCAL NOTATION SYMBOL-9", 0x1D209: "GREEK VOCAL NOTATION SYMBOL-10", 0x1D20A: "GREEK VOCAL NOTATION SYMBOL-11", 0x1D20B: "GREEK VOCAL NOTATION SYMBOL-12", 0x1D20C: "GREEK VOCAL NOTATION SYMBOL-13", 0x1D20D: "GREEK VOCAL NOTATION SYMBOL-14", 0x1D20E: "GREEK VOCAL NOTATION SYMBOL-15", 0x1D20F: "GREEK VOCAL NOTATION SYMBOL-16", 0x1D210: "GREEK VOCAL NOTATION SYMBOL-17", 0x1D211: "GREEK VOCAL NOTATION SYMBOL-18", 0x1D212: "GREEK VOCAL NOTATION SYMBOL-19", 0x1D213: "GREEK VOCAL NOTATION SYMBOL-20", 0x1D214: "GREEK VOCAL NOTATION SYMBOL-21", 0x1D215: "GREEK VOCAL NOTATION SYMBOL-22", 0x1D216: "GREEK VOCAL NOTATION SYMBOL-23", 0x1D217: "GREEK VOCAL NOTATION SYMBOL-24", 0x1D218: "GREEK VOCAL NOTATION SYMBOL-50", 0x1D219: "GREEK VOCAL NOTATION SYMBOL-51", 0x1D21A: "GREEK VOCAL NOTATION SYMBOL-52", 0x1D21B: "GREEK VOCAL NOTATION SYMBOL-53", 0x1D21C: "GREEK VOCAL NOTATION SYMBOL-54", 0x1D21D: "GREEK INSTRUMENTAL NOTATION SYMBOL-1", 0x1D21E: "GREEK INSTRUMENTAL NOTATION SYMBOL-2", 0x1D21F: "GREEK INSTRUMENTAL NOTATION SYMBOL-4", 0x1D220: "GREEK INSTRUMENTAL NOTATION SYMBOL-5", 0x1D221: "GREEK INSTRUMENTAL NOTATION SYMBOL-7", 0x1D222: "GREEK INSTRUMENTAL NOTATION SYMBOL-8", 0x1D223: "GREEK INSTRUMENTAL NOTATION SYMBOL-11", 0x1D224: "GREEK INSTRUMENTAL NOTATION SYMBOL-12", 0x1D225: "GREEK INSTRUMENTAL NOTATION SYMBOL-13", 0x1D226: "GREEK INSTRUMENTAL NOTATION SYMBOL-14", 0x1D227: "GREEK INSTRUMENTAL NOTATION SYMBOL-17", 0x1D228: "GREEK INSTRUMENTAL NOTATION SYMBOL-18", 0x1D229: "GREEK INSTRUMENTAL NOTATION SYMBOL-19", 0x1D22A: "GREEK INSTRUMENTAL NOTATION SYMBOL-23", 0x1D22B: "GREEK INSTRUMENTAL NOTATION SYMBOL-24", 0x1D22C: "GREEK INSTRUMENTAL NOTATION SYMBOL-25", 0x1D22D: "GREEK INSTRUMENTAL NOTATION SYMBOL-26", 0x1D22E: "GREEK INSTRUMENTAL NOTATION SYMBOL-27", 0x1D22F: "GREEK INSTRUMENTAL NOTATION SYMBOL-29", 0x1D230: "GREEK INSTRUMENTAL NOTATION SYMBOL-30", 0x1D231: "GREEK INSTRUMENTAL NOTATION SYMBOL-32", 0x1D232: "GREEK INSTRUMENTAL NOTATION SYMBOL-36", 0x1D233: "GREEK INSTRUMENTAL NOTATION SYMBOL-37", 0x1D234: "GREEK INSTRUMENTAL NOTATION SYMBOL-38", 0x1D235: "GREEK INSTRUMENTAL NOTATION SYMBOL-39", 0x1D236: "GREEK INSTRUMENTAL NOTATION SYMBOL-40", 0x1D237: "GREEK INSTRUMENTAL NOTATION SYMBOL-42", 0x1D238: "GREEK INSTRUMENTAL NOTATION SYMBOL-43", 0x1D239: "GREEK INSTRUMENTAL NOTATION SYMBOL-45", 0x1D23A: "GREEK INSTRUMENTAL NOTATION SYMBOL-47", 0x1D23B: "GREEK INSTRUMENTAL NOTATION SYMBOL-48", 0x1D23C: "GREEK INSTRUMENTAL NOTATION SYMBOL-49", 0x1D23D: "GREEK INSTRUMENTAL NOTATION SYMBOL-50", 0x1D23E: "GREEK INSTRUMENTAL NOTATION SYMBOL-51", 0x1D23F: "GREEK INSTRUMENTAL NOTATION SYMBOL-52", 0x1D240: "GREEK INSTRUMENTAL NOTATION SYMBOL-53", 0x1D241: "GREEK INSTRUMENTAL NOTATION SYMBOL-54", 0x1D242: "COMBINING GREEK MUSICAL TRISEME", 0x1D243: "COMBINING GREEK MUSICAL TETRASEME", 0x1D244: "COMBINING GREEK MUSICAL PENTASEME", 0x1D245: "GREEK MUSICAL LEIMMA", 0x1D300: "MONOGRAM FOR EARTH (ren) *", 0x1D301: "DIGRAM FOR HEAVENLY EARTH (tian ren) *", 0x1D302: "DIGRAM FOR HUMAN EARTH (di ren) *", 0x1D303: "DIGRAM FOR EARTHLY HEAVEN (ren tian) *", 0x1D304: "DIGRAM FOR EARTHLY HUMAN (ren di) *", 0x1D305: "DIGRAM FOR EARTH (ren ren) *", 0x1D306: "TETRAGRAM FOR CENTRE", 0x1D307: "TETRAGRAM FOR FULL CIRCLE", 0x1D308: "TETRAGRAM FOR MIRED", 0x1D309: "TETRAGRAM FOR BARRIER", 0x1D30A: "TETRAGRAM FOR KEEPING SMALL", 0x1D30B: "TETRAGRAM FOR CONTRARIETY", 0x1D30C: "TETRAGRAM FOR ASCENT", 0x1D30D: "TETRAGRAM FOR OPPOSITION", 0x1D30E: "TETRAGRAM FOR BRANCHING OUT", 0x1D30F: "TETRAGRAM FOR DEFECTIVENESS OR DISTORTION", 0x1D310: "TETRAGRAM FOR DIVERGENCE", 0x1D311: "TETRAGRAM FOR YOUTHFULNESS", 0x1D312: "TETRAGRAM FOR INCREASE", 0x1D313: "TETRAGRAM FOR PENETRATION", 0x1D314: "TETRAGRAM FOR REACH", 0x1D315: "TETRAGRAM FOR CONTACT", 0x1D316: "TETRAGRAM FOR HOLDING BACK", 0x1D317: "TETRAGRAM FOR WAITING", 0x1D318: "TETRAGRAM FOR FOLLOWING", 0x1D319: "TETRAGRAM FOR ADVANCE", 0x1D31A: "TETRAGRAM FOR RELEASE", 0x1D31B: "TETRAGRAM FOR RESISTANCE", 0x1D31C: "TETRAGRAM FOR EASE", 0x1D31D: "TETRAGRAM FOR JOY", 0x1D31E: "TETRAGRAM FOR CONTENTION", 0x1D31F: "TETRAGRAM FOR ENDEAVOUR", 0x1D320: "TETRAGRAM FOR DUTIES", 0x1D321: "TETRAGRAM FOR CHANGE", 0x1D322: "TETRAGRAM FOR DECISIVENESS", 0x1D323: "TETRAGRAM FOR BOLD RESOLUTION", 0x1D324: "TETRAGRAM FOR PACKING", 0x1D325: "TETRAGRAM FOR LEGION", 0x1D326: "TETRAGRAM FOR CLOSENESS", 0x1D327: "TETRAGRAM FOR KINSHIP", 0x1D328: "TETRAGRAM FOR GATHERING", 0x1D329: "TETRAGRAM FOR STRENGTH", 0x1D32A: "TETRAGRAM FOR PURITY", 0x1D32B: "TETRAGRAM FOR FULLNESS", 0x1D32C: "TETRAGRAM FOR RESIDENCE", 0x1D32D: "TETRAGRAM FOR LAW OR MODEL", 0x1D32E: "TETRAGRAM FOR RESPONSE", 0x1D32F: "TETRAGRAM FOR GOING TO MEET", 0x1D330: "TETRAGRAM FOR ENCOUNTERS", 0x1D331: "TETRAGRAM FOR STOVE", 0x1D332: "TETRAGRAM FOR GREATNESS", 0x1D333: "TETRAGRAM FOR ENLARGEMENT", 0x1D334: "TETRAGRAM FOR PATTERN", 0x1D335: "TETRAGRAM FOR RITUAL", 0x1D336: "TETRAGRAM FOR FLIGHT", 0x1D337: "TETRAGRAM FOR VASTNESS OR WASTING", 0x1D338: "TETRAGRAM FOR CONSTANCY", 0x1D339: "TETRAGRAM FOR MEASURE", 0x1D33A: "TETRAGRAM FOR ETERNITY", 0x1D33B: "TETRAGRAM FOR UNITY", 0x1D33C: "TETRAGRAM FOR DIMINISHMENT", 0x1D33D: "TETRAGRAM FOR CLOSED MOUTH", 0x1D33E: "TETRAGRAM FOR GUARDEDNESS", 0x1D33F: "TETRAGRAM FOR GATHERING IN", 0x1D340: "TETRAGRAM FOR MASSING", 0x1D341: "TETRAGRAM FOR ACCUMULATION", 0x1D342: "TETRAGRAM FOR EMBELLISHMENT", 0x1D343: "TETRAGRAM FOR DOUBT", 0x1D344: "TETRAGRAM FOR WATCH", 0x1D345: "TETRAGRAM FOR SINKING", 0x1D346: "TETRAGRAM FOR INNER", 0x1D347: "TETRAGRAM FOR DEPARTURE", 0x1D348: "TETRAGRAM FOR DARKENING", 0x1D349: "TETRAGRAM FOR DIMMING", 0x1D34A: "TETRAGRAM FOR EXHAUSTION", 0x1D34B: "TETRAGRAM FOR SEVERANCE", 0x1D34C: "TETRAGRAM FOR STOPPAGE", 0x1D34D: "TETRAGRAM FOR HARDNESS", 0x1D34E: "TETRAGRAM FOR COMPLETION", 0x1D34F: "TETRAGRAM FOR CLOSURE", 0x1D350: "TETRAGRAM FOR FAILURE", 0x1D351: "TETRAGRAM FOR AGGRAVATION", 0x1D352: "TETRAGRAM FOR COMPLIANCE", 0x1D353: "TETRAGRAM FOR ON THE VERGE", 0x1D354: "TETRAGRAM FOR DIFFICULTIES", 0x1D355: "TETRAGRAM FOR LABOURING", 0x1D356: "TETRAGRAM FOR FOSTERING", 0x1D360: "COUNTING ROD UNIT DIGIT ONE", 0x1D361: "COUNTING ROD UNIT DIGIT TWO", 0x1D362: "COUNTING ROD UNIT DIGIT THREE", 0x1D363: "COUNTING ROD UNIT DIGIT FOUR", 0x1D364: "COUNTING ROD UNIT DIGIT FIVE", 0x1D365: "COUNTING ROD UNIT DIGIT SIX", 0x1D366: "COUNTING ROD UNIT DIGIT SEVEN", 0x1D367: "COUNTING ROD UNIT DIGIT EIGHT", 0x1D368: "COUNTING ROD UNIT DIGIT NINE", 0x1D369: "COUNTING ROD TENS DIGIT ONE", 0x1D36A: "COUNTING ROD TENS DIGIT TWO", 0x1D36B: "COUNTING ROD TENS DIGIT THREE", 0x1D36C: "COUNTING ROD TENS DIGIT FOUR", 0x1D36D: "COUNTING ROD TENS DIGIT FIVE", 0x1D36E: "COUNTING ROD TENS DIGIT SIX", 0x1D36F: "COUNTING ROD TENS DIGIT SEVEN", 0x1D370: "COUNTING ROD TENS DIGIT EIGHT", 0x1D371: "COUNTING ROD TENS DIGIT NINE", 0x1D400: "MATHEMATICAL BOLD CAPITAL A", 0x1D401: "MATHEMATICAL BOLD CAPITAL B", 0x1D402: "MATHEMATICAL BOLD CAPITAL C", 0x1D403: "MATHEMATICAL BOLD CAPITAL D", 0x1D404: "MATHEMATICAL BOLD CAPITAL E", 0x1D405: "MATHEMATICAL BOLD CAPITAL F", 0x1D406: "MATHEMATICAL BOLD CAPITAL G", 0x1D407: "MATHEMATICAL BOLD CAPITAL H", 0x1D408: "MATHEMATICAL BOLD CAPITAL I", 0x1D409: "MATHEMATICAL BOLD CAPITAL J", 0x1D40A: "MATHEMATICAL BOLD CAPITAL K", 0x1D40B: "MATHEMATICAL BOLD CAPITAL L", 0x1D40C: "MATHEMATICAL BOLD CAPITAL M", 0x1D40D: "MATHEMATICAL BOLD CAPITAL N", 0x1D40E: "MATHEMATICAL BOLD CAPITAL O", 0x1D40F: "MATHEMATICAL BOLD CAPITAL P", 0x1D410: "MATHEMATICAL BOLD CAPITAL Q", 0x1D411: "MATHEMATICAL BOLD CAPITAL R", 0x1D412: "MATHEMATICAL BOLD CAPITAL S", 0x1D413: "MATHEMATICAL BOLD CAPITAL T", 0x1D414: "MATHEMATICAL BOLD CAPITAL U", 0x1D415: "MATHEMATICAL BOLD CAPITAL V", 0x1D416: "MATHEMATICAL BOLD CAPITAL W", 0x1D417: "MATHEMATICAL BOLD CAPITAL X", 0x1D418: "MATHEMATICAL BOLD CAPITAL Y", 0x1D419: "MATHEMATICAL BOLD CAPITAL Z", 0x1D41A: "MATHEMATICAL BOLD SMALL A", 0x1D41B: "MATHEMATICAL BOLD SMALL B", 0x1D41C: "MATHEMATICAL BOLD SMALL C", 0x1D41D: "MATHEMATICAL BOLD SMALL D", 0x1D41E: "MATHEMATICAL BOLD SMALL E", 0x1D41F: "MATHEMATICAL BOLD SMALL F", 0x1D420: "MATHEMATICAL BOLD SMALL G", 0x1D421: "MATHEMATICAL BOLD SMALL H", 0x1D422: "MATHEMATICAL BOLD SMALL I", 0x1D423: "MATHEMATICAL BOLD SMALL J", 0x1D424: "MATHEMATICAL BOLD SMALL K", 0x1D425: "MATHEMATICAL BOLD SMALL L", 0x1D426: "MATHEMATICAL BOLD SMALL M", 0x1D427: "MATHEMATICAL BOLD SMALL N", 0x1D428: "MATHEMATICAL BOLD SMALL O", 0x1D429: "MATHEMATICAL BOLD SMALL P", 0x1D42A: "MATHEMATICAL BOLD SMALL Q", 0x1D42B: "MATHEMATICAL BOLD SMALL R", 0x1D42C: "MATHEMATICAL BOLD SMALL S", 0x1D42D: "MATHEMATICAL BOLD SMALL T", 0x1D42E: "MATHEMATICAL BOLD SMALL U", 0x1D42F: "MATHEMATICAL BOLD SMALL V", 0x1D430: "MATHEMATICAL BOLD SMALL W", 0x1D431: "MATHEMATICAL BOLD SMALL X", 0x1D432: "MATHEMATICAL BOLD SMALL Y", 0x1D433: "MATHEMATICAL BOLD SMALL Z", 0x1D434: "MATHEMATICAL ITALIC CAPITAL A", 0x1D435: "MATHEMATICAL ITALIC CAPITAL B", 0x1D436: "MATHEMATICAL ITALIC CAPITAL C", 0x1D437: "MATHEMATICAL ITALIC CAPITAL D", 0x1D438: "MATHEMATICAL ITALIC CAPITAL E", 0x1D439: "MATHEMATICAL ITALIC CAPITAL F", 0x1D43A: "MATHEMATICAL ITALIC CAPITAL G", 0x1D43B: "MATHEMATICAL ITALIC CAPITAL H", 0x1D43C: "MATHEMATICAL ITALIC CAPITAL I", 0x1D43D: "MATHEMATICAL ITALIC CAPITAL J", 0x1D43E: "MATHEMATICAL ITALIC CAPITAL K", 0x1D43F: "MATHEMATICAL ITALIC CAPITAL L", 0x1D440: "MATHEMATICAL ITALIC CAPITAL M", 0x1D441: "MATHEMATICAL ITALIC CAPITAL N", 0x1D442: "MATHEMATICAL ITALIC CAPITAL O", 0x1D443: "MATHEMATICAL ITALIC CAPITAL P", 0x1D444: "MATHEMATICAL ITALIC CAPITAL Q", 0x1D445: "MATHEMATICAL ITALIC CAPITAL R", 0x1D446: "MATHEMATICAL ITALIC CAPITAL S", 0x1D447: "MATHEMATICAL ITALIC CAPITAL T", 0x1D448: "MATHEMATICAL ITALIC CAPITAL U", 0x1D449: "MATHEMATICAL ITALIC CAPITAL V", 0x1D44A: "MATHEMATICAL ITALIC CAPITAL W", 0x1D44B: "MATHEMATICAL ITALIC CAPITAL X", 0x1D44C: "MATHEMATICAL ITALIC CAPITAL Y", 0x1D44D: "MATHEMATICAL ITALIC CAPITAL Z", 0x1D44E: "MATHEMATICAL ITALIC SMALL A", 0x1D44F: "MATHEMATICAL ITALIC SMALL B", 0x1D450: "MATHEMATICAL ITALIC SMALL C", 0x1D451: "MATHEMATICAL ITALIC SMALL D", 0x1D452: "MATHEMATICAL ITALIC SMALL E", 0x1D453: "MATHEMATICAL ITALIC SMALL F", 0x1D454: "MATHEMATICAL ITALIC SMALL G", 0x1D455: "", 0x1D456: "MATHEMATICAL ITALIC SMALL I", 0x1D457: "MATHEMATICAL ITALIC SMALL J", 0x1D458: "MATHEMATICAL ITALIC SMALL K", 0x1D459: "MATHEMATICAL ITALIC SMALL L", 0x1D45A: "MATHEMATICAL ITALIC SMALL M", 0x1D45B: "MATHEMATICAL ITALIC SMALL N", 0x1D45C: "MATHEMATICAL ITALIC SMALL O", 0x1D45D: "MATHEMATICAL ITALIC SMALL P", 0x1D45E: "MATHEMATICAL ITALIC SMALL Q", 0x1D45F: "MATHEMATICAL ITALIC SMALL R", 0x1D460: "MATHEMATICAL ITALIC SMALL S", 0x1D461: "MATHEMATICAL ITALIC SMALL T", 0x1D462: "MATHEMATICAL ITALIC SMALL U", 0x1D463: "MATHEMATICAL ITALIC SMALL V", 0x1D464: "MATHEMATICAL ITALIC SMALL W", 0x1D465: "MATHEMATICAL ITALIC SMALL X", 0x1D466: "MATHEMATICAL ITALIC SMALL Y", 0x1D467: "MATHEMATICAL ITALIC SMALL Z", 0x1D468: "MATHEMATICAL BOLD ITALIC CAPITAL A", 0x1D469: "MATHEMATICAL BOLD ITALIC CAPITAL B", 0x1D46A: "MATHEMATICAL BOLD ITALIC CAPITAL C", 0x1D46B: "MATHEMATICAL BOLD ITALIC CAPITAL D", 0x1D46C: "MATHEMATICAL BOLD ITALIC CAPITAL E", 0x1D46D: "MATHEMATICAL BOLD ITALIC CAPITAL F", 0x1D46E: "MATHEMATICAL BOLD ITALIC CAPITAL G", 0x1D46F: "MATHEMATICAL BOLD ITALIC CAPITAL H", 0x1D470: "MATHEMATICAL BOLD ITALIC CAPITAL I", 0x1D471: "MATHEMATICAL BOLD ITALIC CAPITAL J", 0x1D472: "MATHEMATICAL BOLD ITALIC CAPITAL K", 0x1D473: "MATHEMATICAL BOLD ITALIC CAPITAL L", 0x1D474: "MATHEMATICAL BOLD ITALIC CAPITAL M", 0x1D475: "MATHEMATICAL BOLD ITALIC CAPITAL N", 0x1D476: "MATHEMATICAL BOLD ITALIC CAPITAL O", 0x1D477: "MATHEMATICAL BOLD ITALIC CAPITAL P", 0x1D478: "MATHEMATICAL BOLD ITALIC CAPITAL Q", 0x1D479: "MATHEMATICAL BOLD ITALIC CAPITAL R", 0x1D47A: "MATHEMATICAL BOLD ITALIC CAPITAL S", 0x1D47B: "MATHEMATICAL BOLD ITALIC CAPITAL T", 0x1D47C: "MATHEMATICAL BOLD ITALIC CAPITAL U", 0x1D47D: "MATHEMATICAL BOLD ITALIC CAPITAL V", 0x1D47E: "MATHEMATICAL BOLD ITALIC CAPITAL W", 0x1D47F: "MATHEMATICAL BOLD ITALIC CAPITAL X", 0x1D480: "MATHEMATICAL BOLD ITALIC CAPITAL Y", 0x1D481: "MATHEMATICAL BOLD ITALIC CAPITAL Z", 0x1D482: "MATHEMATICAL BOLD ITALIC SMALL A", 0x1D483: "MATHEMATICAL BOLD ITALIC SMALL B", 0x1D484: "MATHEMATICAL BOLD ITALIC SMALL C", 0x1D485: "MATHEMATICAL BOLD ITALIC SMALL D", 0x1D486: "MATHEMATICAL BOLD ITALIC SMALL E", 0x1D487: "MATHEMATICAL BOLD ITALIC SMALL F", 0x1D488: "MATHEMATICAL BOLD ITALIC SMALL G", 0x1D489: "MATHEMATICAL BOLD ITALIC SMALL H", 0x1D48A: "MATHEMATICAL BOLD ITALIC SMALL I", 0x1D48B: "MATHEMATICAL BOLD ITALIC SMALL J", 0x1D48C: "MATHEMATICAL BOLD ITALIC SMALL K", 0x1D48D: "MATHEMATICAL BOLD ITALIC SMALL L", 0x1D48E: "MATHEMATICAL BOLD ITALIC SMALL M", 0x1D48F: "MATHEMATICAL BOLD ITALIC SMALL N", 0x1D490: "MATHEMATICAL BOLD ITALIC SMALL O", 0x1D491: "MATHEMATICAL BOLD ITALIC SMALL P", 0x1D492: "MATHEMATICAL BOLD ITALIC SMALL Q", 0x1D493: "MATHEMATICAL BOLD ITALIC SMALL R", 0x1D494: "MATHEMATICAL BOLD ITALIC SMALL S", 0x1D495: "MATHEMATICAL BOLD ITALIC SMALL T", 0x1D496: "MATHEMATICAL BOLD ITALIC SMALL U", 0x1D497: "MATHEMATICAL BOLD ITALIC SMALL V", 0x1D498: "MATHEMATICAL BOLD ITALIC SMALL W", 0x1D499: "MATHEMATICAL BOLD ITALIC SMALL X", 0x1D49A: "MATHEMATICAL BOLD ITALIC SMALL Y", 0x1D49B: "MATHEMATICAL BOLD ITALIC SMALL Z", 0x1D49C: "MATHEMATICAL SCRIPT CAPITAL A", 0x1D49D: "", 0x1D49E: "MATHEMATICAL SCRIPT CAPITAL C", 0x1D49F: "MATHEMATICAL SCRIPT CAPITAL D", 0x1D4A0: "", 0x1D4A1: "", 0x1D4A2: "MATHEMATICAL SCRIPT CAPITAL G", 0x1D4A3: "", 0x1D4A4: "", 0x1D4A5: "MATHEMATICAL SCRIPT CAPITAL J", 0x1D4A6: "MATHEMATICAL SCRIPT CAPITAL K", 0x1D4A7: "", 0x1D4A8: "", 0x1D4A9: "MATHEMATICAL SCRIPT CAPITAL N", 0x1D4AA: "MATHEMATICAL SCRIPT CAPITAL O", 0x1D4AB: "MATHEMATICAL SCRIPT CAPITAL P", 0x1D4AC: "MATHEMATICAL SCRIPT CAPITAL Q", 0x1D4AD: "", 0x1D4AE: "MATHEMATICAL SCRIPT CAPITAL S", 0x1D4AF: "MATHEMATICAL SCRIPT CAPITAL T", 0x1D4B0: "MATHEMATICAL SCRIPT CAPITAL U", 0x1D4B1: "MATHEMATICAL SCRIPT CAPITAL V", 0x1D4B2: "MATHEMATICAL SCRIPT CAPITAL W", 0x1D4B3: "MATHEMATICAL SCRIPT CAPITAL X", 0x1D4B4: "MATHEMATICAL SCRIPT CAPITAL Y", 0x1D4B5: "MATHEMATICAL SCRIPT CAPITAL Z", 0x1D4B6: "MATHEMATICAL SCRIPT SMALL A", 0x1D4B7: "MATHEMATICAL SCRIPT SMALL B", 0x1D4B8: "MATHEMATICAL SCRIPT SMALL C", 0x1D4B9: "MATHEMATICAL SCRIPT SMALL D", 0x1D4BA: "", 0x1D4BB: "MATHEMATICAL SCRIPT SMALL F", 0x1D4BC: "", 0x1D4BD: "MATHEMATICAL SCRIPT SMALL H", 0x1D4BE: "MATHEMATICAL SCRIPT SMALL I", 0x1D4BF: "MATHEMATICAL SCRIPT SMALL J", 0x1D4C0: "MATHEMATICAL SCRIPT SMALL K", 0x1D4C1: "MATHEMATICAL SCRIPT SMALL L", 0x1D4C2: "MATHEMATICAL SCRIPT SMALL M", 0x1D4C3: "MATHEMATICAL SCRIPT SMALL N", 0x1D4C4: "", 0x1D4C5: "MATHEMATICAL SCRIPT SMALL P", 0x1D4C6: "MATHEMATICAL SCRIPT SMALL Q", 0x1D4C7: "MATHEMATICAL SCRIPT SMALL R", 0x1D4C8: "MATHEMATICAL SCRIPT SMALL S", 0x1D4C9: "MATHEMATICAL SCRIPT SMALL T", 0x1D4CA: "MATHEMATICAL SCRIPT SMALL U", 0x1D4CB: "MATHEMATICAL SCRIPT SMALL V", 0x1D4CC: "MATHEMATICAL SCRIPT SMALL W", 0x1D4CD: "MATHEMATICAL SCRIPT SMALL X", 0x1D4CE: "MATHEMATICAL SCRIPT SMALL Y", 0x1D4CF: "MATHEMATICAL SCRIPT SMALL Z", 0x1D4D0: "MATHEMATICAL BOLD SCRIPT CAPITAL A", 0x1D4D1: "MATHEMATICAL BOLD SCRIPT CAPITAL B", 0x1D4D2: "MATHEMATICAL BOLD SCRIPT CAPITAL C", 0x1D4D3: "MATHEMATICAL BOLD SCRIPT CAPITAL D", 0x1D4D4: "MATHEMATICAL BOLD SCRIPT CAPITAL E", 0x1D4D5: "MATHEMATICAL BOLD SCRIPT CAPITAL F", 0x1D4D6: "MATHEMATICAL BOLD SCRIPT CAPITAL G", 0x1D4D7: "MATHEMATICAL BOLD SCRIPT CAPITAL H", 0x1D4D8: "MATHEMATICAL BOLD SCRIPT CAPITAL I", 0x1D4D9: "MATHEMATICAL BOLD SCRIPT CAPITAL J", 0x1D4DA: "MATHEMATICAL BOLD SCRIPT CAPITAL K", 0x1D4DB: "MATHEMATICAL BOLD SCRIPT CAPITAL L", 0x1D4DC: "MATHEMATICAL BOLD SCRIPT CAPITAL M", 0x1D4DD: "MATHEMATICAL BOLD SCRIPT CAPITAL N", 0x1D4DE: "MATHEMATICAL BOLD SCRIPT CAPITAL O", 0x1D4DF: "MATHEMATICAL BOLD SCRIPT CAPITAL P", 0x1D4E0: "MATHEMATICAL BOLD SCRIPT CAPITAL Q", 0x1D4E1: "MATHEMATICAL BOLD SCRIPT CAPITAL R", 0x1D4E2: "MATHEMATICAL BOLD SCRIPT CAPITAL S", 0x1D4E3: "MATHEMATICAL BOLD SCRIPT CAPITAL T", 0x1D4E4: "MATHEMATICAL BOLD SCRIPT CAPITAL U", 0x1D4E5: "MATHEMATICAL BOLD SCRIPT CAPITAL V", 0x1D4E6: "MATHEMATICAL BOLD SCRIPT CAPITAL W", 0x1D4E7: "MATHEMATICAL BOLD SCRIPT CAPITAL X", 0x1D4E8: "MATHEMATICAL BOLD SCRIPT CAPITAL Y", 0x1D4E9: "MATHEMATICAL BOLD SCRIPT CAPITAL Z", 0x1D4EA: "MATHEMATICAL BOLD SCRIPT SMALL A", 0x1D4EB: "MATHEMATICAL BOLD SCRIPT SMALL B", 0x1D4EC: "MATHEMATICAL BOLD SCRIPT SMALL C", 0x1D4ED: "MATHEMATICAL BOLD SCRIPT SMALL D", 0x1D4EE: "MATHEMATICAL BOLD SCRIPT SMALL E", 0x1D4EF: "MATHEMATICAL BOLD SCRIPT SMALL F", 0x1D4F0: "MATHEMATICAL BOLD SCRIPT SMALL G", 0x1D4F1: "MATHEMATICAL BOLD SCRIPT SMALL H", 0x1D4F2: "MATHEMATICAL BOLD SCRIPT SMALL I", 0x1D4F3: "MATHEMATICAL BOLD SCRIPT SMALL J", 0x1D4F4: "MATHEMATICAL BOLD SCRIPT SMALL K", 0x1D4F5: "MATHEMATICAL BOLD SCRIPT SMALL L", 0x1D4F6: "MATHEMATICAL BOLD SCRIPT SMALL M", 0x1D4F7: "MATHEMATICAL BOLD SCRIPT SMALL N", 0x1D4F8: "MATHEMATICAL BOLD SCRIPT SMALL O", 0x1D4F9: "MATHEMATICAL BOLD SCRIPT SMALL P", 0x1D4FA: "MATHEMATICAL BOLD SCRIPT SMALL Q", 0x1D4FB: "MATHEMATICAL BOLD SCRIPT SMALL R", 0x1D4FC: "MATHEMATICAL BOLD SCRIPT SMALL S", 0x1D4FD: "MATHEMATICAL BOLD SCRIPT SMALL T", 0x1D4FE: "MATHEMATICAL BOLD SCRIPT SMALL U", 0x1D4FF: "MATHEMATICAL BOLD SCRIPT SMALL V", 0x1D500: "MATHEMATICAL BOLD SCRIPT SMALL W", 0x1D501: "MATHEMATICAL BOLD SCRIPT SMALL X", 0x1D502: "MATHEMATICAL BOLD SCRIPT SMALL Y", 0x1D503: "MATHEMATICAL BOLD SCRIPT SMALL Z", 0x1D504: "MATHEMATICAL FRAKTUR CAPITAL A", 0x1D505: "MATHEMATICAL FRAKTUR CAPITAL B", 0x1D506: "", 0x1D507: "MATHEMATICAL FRAKTUR CAPITAL D", 0x1D508: "MATHEMATICAL FRAKTUR CAPITAL E", 0x1D509: "MATHEMATICAL FRAKTUR CAPITAL F", 0x1D50A: "MATHEMATICAL FRAKTUR CAPITAL G", 0x1D50B: "", 0x1D50C: "", 0x1D50D: "MATHEMATICAL FRAKTUR CAPITAL J", 0x1D50E: "MATHEMATICAL FRAKTUR CAPITAL K", 0x1D50F: "MATHEMATICAL FRAKTUR CAPITAL L", 0x1D510: "MATHEMATICAL FRAKTUR CAPITAL M", 0x1D511: "MATHEMATICAL FRAKTUR CAPITAL N", 0x1D512: "MATHEMATICAL FRAKTUR CAPITAL O", 0x1D513: "MATHEMATICAL FRAKTUR CAPITAL P", 0x1D514: "MATHEMATICAL FRAKTUR CAPITAL Q", 0x1D515: "", 0x1D516: "MATHEMATICAL FRAKTUR CAPITAL S", 0x1D517: "MATHEMATICAL FRAKTUR CAPITAL T", 0x1D518: "MATHEMATICAL FRAKTUR CAPITAL U", 0x1D519: "MATHEMATICAL FRAKTUR CAPITAL V", 0x1D51A: "MATHEMATICAL FRAKTUR CAPITAL W", 0x1D51B: "MATHEMATICAL FRAKTUR CAPITAL X", 0x1D51C: "MATHEMATICAL FRAKTUR CAPITAL Y", 0x1D51D: "", 0x1D51E: "MATHEMATICAL FRAKTUR SMALL A", 0x1D51F: "MATHEMATICAL FRAKTUR SMALL B", 0x1D520: "MATHEMATICAL FRAKTUR SMALL C", 0x1D521: "MATHEMATICAL FRAKTUR SMALL D", 0x1D522: "MATHEMATICAL FRAKTUR SMALL E", 0x1D523: "MATHEMATICAL FRAKTUR SMALL F", 0x1D524: "MATHEMATICAL FRAKTUR SMALL G", 0x1D525: "MATHEMATICAL FRAKTUR SMALL H", 0x1D526: "MATHEMATICAL FRAKTUR SMALL I", 0x1D527: "MATHEMATICAL FRAKTUR SMALL J", 0x1D528: "MATHEMATICAL FRAKTUR SMALL K", 0x1D529: "MATHEMATICAL FRAKTUR SMALL L", 0x1D52A: "MATHEMATICAL FRAKTUR SMALL M", 0x1D52B: "MATHEMATICAL FRAKTUR SMALL N", 0x1D52C: "MATHEMATICAL FRAKTUR SMALL O", 0x1D52D: "MATHEMATICAL FRAKTUR SMALL P", 0x1D52E: "MATHEMATICAL FRAKTUR SMALL Q", 0x1D52F: "MATHEMATICAL FRAKTUR SMALL R", 0x1D530: "MATHEMATICAL FRAKTUR SMALL S", 0x1D531: "MATHEMATICAL FRAKTUR SMALL T", 0x1D532: "MATHEMATICAL FRAKTUR SMALL U", 0x1D533: "MATHEMATICAL FRAKTUR SMALL V", 0x1D534: "MATHEMATICAL FRAKTUR SMALL W", 0x1D535: "MATHEMATICAL FRAKTUR SMALL X", 0x1D536: "MATHEMATICAL FRAKTUR SMALL Y", 0x1D537: "MATHEMATICAL FRAKTUR SMALL Z", 0x1D538: "MATHEMATICAL DOUBLE-STRUCK CAPITAL A", 0x1D539: "MATHEMATICAL DOUBLE-STRUCK CAPITAL B", 0x1D53A: "", 0x1D53B: "MATHEMATICAL DOUBLE-STRUCK CAPITAL D", 0x1D53C: "MATHEMATICAL DOUBLE-STRUCK CAPITAL E", 0x1D53D: "MATHEMATICAL DOUBLE-STRUCK CAPITAL F", 0x1D53E: "MATHEMATICAL DOUBLE-STRUCK CAPITAL G", 0x1D53F: "", 0x1D540: "MATHEMATICAL DOUBLE-STRUCK CAPITAL I", 0x1D541: "MATHEMATICAL DOUBLE-STRUCK CAPITAL J", 0x1D542: "MATHEMATICAL DOUBLE-STRUCK CAPITAL K", 0x1D543: "MATHEMATICAL DOUBLE-STRUCK CAPITAL L", 0x1D544: "MATHEMATICAL DOUBLE-STRUCK CAPITAL M", 0x1D545: "", 0x1D546: "MATHEMATICAL DOUBLE-STRUCK CAPITAL O", 0x1D547: "", 0x1D548: "", 0x1D549: "", 0x1D54A: "MATHEMATICAL DOUBLE-STRUCK CAPITAL S", 0x1D54B: "MATHEMATICAL DOUBLE-STRUCK CAPITAL T", 0x1D54C: "MATHEMATICAL DOUBLE-STRUCK CAPITAL U", 0x1D54D: "MATHEMATICAL DOUBLE-STRUCK CAPITAL V", 0x1D54E: "MATHEMATICAL DOUBLE-STRUCK CAPITAL W", 0x1D54F: "MATHEMATICAL DOUBLE-STRUCK CAPITAL X", 0x1D550: "MATHEMATICAL DOUBLE-STRUCK CAPITAL Y", 0x1D551: "", 0x1D552: "MATHEMATICAL DOUBLE-STRUCK SMALL A", 0x1D553: "MATHEMATICAL DOUBLE-STRUCK SMALL B", 0x1D554: "MATHEMATICAL DOUBLE-STRUCK SMALL C", 0x1D555: "MATHEMATICAL DOUBLE-STRUCK SMALL D", 0x1D556: "MATHEMATICAL DOUBLE-STRUCK SMALL E", 0x1D557: "MATHEMATICAL DOUBLE-STRUCK SMALL F", 0x1D558: "MATHEMATICAL DOUBLE-STRUCK SMALL G", 0x1D559: "MATHEMATICAL DOUBLE-STRUCK SMALL H", 0x1D55A: "MATHEMATICAL DOUBLE-STRUCK SMALL I", 0x1D55B: "MATHEMATICAL DOUBLE-STRUCK SMALL J", 0x1D55C: "MATHEMATICAL DOUBLE-STRUCK SMALL K", 0x1D55D: "MATHEMATICAL DOUBLE-STRUCK SMALL L", 0x1D55E: "MATHEMATICAL DOUBLE-STRUCK SMALL M", 0x1D55F: "MATHEMATICAL DOUBLE-STRUCK SMALL N", 0x1D560: "MATHEMATICAL DOUBLE-STRUCK SMALL O", 0x1D561: "MATHEMATICAL DOUBLE-STRUCK SMALL P", 0x1D562: "MATHEMATICAL DOUBLE-STRUCK SMALL Q", 0x1D563: "MATHEMATICAL DOUBLE-STRUCK SMALL R", 0x1D564: "MATHEMATICAL DOUBLE-STRUCK SMALL S", 0x1D565: "MATHEMATICAL DOUBLE-STRUCK SMALL T", 0x1D566: "MATHEMATICAL DOUBLE-STRUCK SMALL U", 0x1D567: "MATHEMATICAL DOUBLE-STRUCK SMALL V", 0x1D568: "MATHEMATICAL DOUBLE-STRUCK SMALL W", 0x1D569: "MATHEMATICAL DOUBLE-STRUCK SMALL X", 0x1D56A: "MATHEMATICAL DOUBLE-STRUCK SMALL Y", 0x1D56B: "MATHEMATICAL DOUBLE-STRUCK SMALL Z", 0x1D56C: "MATHEMATICAL BOLD FRAKTUR CAPITAL A", 0x1D56D: "MATHEMATICAL BOLD FRAKTUR CAPITAL B", 0x1D56E: "MATHEMATICAL BOLD FRAKTUR CAPITAL C", 0x1D56F: "MATHEMATICAL BOLD FRAKTUR CAPITAL D", 0x1D570: "MATHEMATICAL BOLD FRAKTUR CAPITAL E", 0x1D571: "MATHEMATICAL BOLD FRAKTUR CAPITAL F", 0x1D572: "MATHEMATICAL BOLD FRAKTUR CAPITAL G", 0x1D573: "MATHEMATICAL BOLD FRAKTUR CAPITAL H", 0x1D574: "MATHEMATICAL BOLD FRAKTUR CAPITAL I", 0x1D575: "MATHEMATICAL BOLD FRAKTUR CAPITAL J", 0x1D576: "MATHEMATICAL BOLD FRAKTUR CAPITAL K", 0x1D577: "MATHEMATICAL BOLD FRAKTUR CAPITAL L", 0x1D578: "MATHEMATICAL BOLD FRAKTUR CAPITAL M", 0x1D579: "MATHEMATICAL BOLD FRAKTUR CAPITAL N", 0x1D57A: "MATHEMATICAL BOLD FRAKTUR CAPITAL O", 0x1D57B: "MATHEMATICAL BOLD FRAKTUR CAPITAL P", 0x1D57C: "MATHEMATICAL BOLD FRAKTUR CAPITAL Q", 0x1D57D: "MATHEMATICAL BOLD FRAKTUR CAPITAL R", 0x1D57E: "MATHEMATICAL BOLD FRAKTUR CAPITAL S", 0x1D57F: "MATHEMATICAL BOLD FRAKTUR CAPITAL T", 0x1D580: "MATHEMATICAL BOLD FRAKTUR CAPITAL U", 0x1D581: "MATHEMATICAL BOLD FRAKTUR CAPITAL V", 0x1D582: "MATHEMATICAL BOLD FRAKTUR CAPITAL W", 0x1D583: "MATHEMATICAL BOLD FRAKTUR CAPITAL X", 0x1D584: "MATHEMATICAL BOLD FRAKTUR CAPITAL Y", 0x1D585: "MATHEMATICAL BOLD FRAKTUR CAPITAL Z", 0x1D586: "MATHEMATICAL BOLD FRAKTUR SMALL A", 0x1D587: "MATHEMATICAL BOLD FRAKTUR SMALL B", 0x1D588: "MATHEMATICAL BOLD FRAKTUR SMALL C", 0x1D589: "MATHEMATICAL BOLD FRAKTUR SMALL D", 0x1D58A: "MATHEMATICAL BOLD FRAKTUR SMALL E", 0x1D58B: "MATHEMATICAL BOLD FRAKTUR SMALL F", 0x1D58C: "MATHEMATICAL BOLD FRAKTUR SMALL G", 0x1D58D: "MATHEMATICAL BOLD FRAKTUR SMALL H", 0x1D58E: "MATHEMATICAL BOLD FRAKTUR SMALL I", 0x1D58F: "MATHEMATICAL BOLD FRAKTUR SMALL J", 0x1D590: "MATHEMATICAL BOLD FRAKTUR SMALL K", 0x1D591: "MATHEMATICAL BOLD FRAKTUR SMALL L", 0x1D592: "MATHEMATICAL BOLD FRAKTUR SMALL M", 0x1D593: "MATHEMATICAL BOLD FRAKTUR SMALL N", 0x1D594: "MATHEMATICAL BOLD FRAKTUR SMALL O", 0x1D595: "MATHEMATICAL BOLD FRAKTUR SMALL P", 0x1D596: "MATHEMATICAL BOLD FRAKTUR SMALL Q", 0x1D597: "MATHEMATICAL BOLD FRAKTUR SMALL R", 0x1D598: "MATHEMATICAL BOLD FRAKTUR SMALL S", 0x1D599: "MATHEMATICAL BOLD FRAKTUR SMALL T", 0x1D59A: "MATHEMATICAL BOLD FRAKTUR SMALL U", 0x1D59B: "MATHEMATICAL BOLD FRAKTUR SMALL V", 0x1D59C: "MATHEMATICAL BOLD FRAKTUR SMALL W", 0x1D59D: "MATHEMATICAL BOLD FRAKTUR SMALL X", 0x1D59E: "MATHEMATICAL BOLD FRAKTUR SMALL Y", 0x1D59F: "MATHEMATICAL BOLD FRAKTUR SMALL Z", 0x1D5A0: "MATHEMATICAL SANS-SERIF CAPITAL A", 0x1D5A1: "MATHEMATICAL SANS-SERIF CAPITAL B", 0x1D5A2: "MATHEMATICAL SANS-SERIF CAPITAL C", 0x1D5A3: "MATHEMATICAL SANS-SERIF CAPITAL D", 0x1D5A4: "MATHEMATICAL SANS-SERIF CAPITAL E", 0x1D5A5: "MATHEMATICAL SANS-SERIF CAPITAL F", 0x1D5A6: "MATHEMATICAL SANS-SERIF CAPITAL G", 0x1D5A7: "MATHEMATICAL SANS-SERIF CAPITAL H", 0x1D5A8: "MATHEMATICAL SANS-SERIF CAPITAL I", 0x1D5A9: "MATHEMATICAL SANS-SERIF CAPITAL J", 0x1D5AA: "MATHEMATICAL SANS-SERIF CAPITAL K", 0x1D5AB: "MATHEMATICAL SANS-SERIF CAPITAL L", 0x1D5AC: "MATHEMATICAL SANS-SERIF CAPITAL M", 0x1D5AD: "MATHEMATICAL SANS-SERIF CAPITAL N", 0x1D5AE: "MATHEMATICAL SANS-SERIF CAPITAL O", 0x1D5AF: "MATHEMATICAL SANS-SERIF CAPITAL P", 0x1D5B0: "MATHEMATICAL SANS-SERIF CAPITAL Q", 0x1D5B1: "MATHEMATICAL SANS-SERIF CAPITAL R", 0x1D5B2: "MATHEMATICAL SANS-SERIF CAPITAL S", 0x1D5B3: "MATHEMATICAL SANS-SERIF CAPITAL T", 0x1D5B4: "MATHEMATICAL SANS-SERIF CAPITAL U", 0x1D5B5: "MATHEMATICAL SANS-SERIF CAPITAL V", 0x1D5B6: "MATHEMATICAL SANS-SERIF CAPITAL W", 0x1D5B7: "MATHEMATICAL SANS-SERIF CAPITAL X", 0x1D5B8: "MATHEMATICAL SANS-SERIF CAPITAL Y", 0x1D5B9: "MATHEMATICAL SANS-SERIF CAPITAL Z", 0x1D5BA: "MATHEMATICAL SANS-SERIF SMALL A", 0x1D5BB: "MATHEMATICAL SANS-SERIF SMALL B", 0x1D5BC: "MATHEMATICAL SANS-SERIF SMALL C", 0x1D5BD: "MATHEMATICAL SANS-SERIF SMALL D", 0x1D5BE: "MATHEMATICAL SANS-SERIF SMALL E", 0x1D5BF: "MATHEMATICAL SANS-SERIF SMALL F", 0x1D5C0: "MATHEMATICAL SANS-SERIF SMALL G", 0x1D5C1: "MATHEMATICAL SANS-SERIF SMALL H", 0x1D5C2: "MATHEMATICAL SANS-SERIF SMALL I", 0x1D5C3: "MATHEMATICAL SANS-SERIF SMALL J", 0x1D5C4: "MATHEMATICAL SANS-SERIF SMALL K", 0x1D5C5: "MATHEMATICAL SANS-SERIF SMALL L", 0x1D5C6: "MATHEMATICAL SANS-SERIF SMALL M", 0x1D5C7: "MATHEMATICAL SANS-SERIF SMALL N", 0x1D5C8: "MATHEMATICAL SANS-SERIF SMALL O", 0x1D5C9: "MATHEMATICAL SANS-SERIF SMALL P", 0x1D5CA: "MATHEMATICAL SANS-SERIF SMALL Q", 0x1D5CB: "MATHEMATICAL SANS-SERIF SMALL R", 0x1D5CC: "MATHEMATICAL SANS-SERIF SMALL S", 0x1D5CD: "MATHEMATICAL SANS-SERIF SMALL T", 0x1D5CE: "MATHEMATICAL SANS-SERIF SMALL U", 0x1D5CF: "MATHEMATICAL SANS-SERIF SMALL V", 0x1D5D0: "MATHEMATICAL SANS-SERIF SMALL W", 0x1D5D1: "MATHEMATICAL SANS-SERIF SMALL X", 0x1D5D2: "MATHEMATICAL SANS-SERIF SMALL Y", 0x1D5D3: "MATHEMATICAL SANS-SERIF SMALL Z", 0x1D5D4: "MATHEMATICAL SANS-SERIF BOLD CAPITAL A", 0x1D5D5: "MATHEMATICAL SANS-SERIF BOLD CAPITAL B", 0x1D5D6: "MATHEMATICAL SANS-SERIF BOLD CAPITAL C", 0x1D5D7: "MATHEMATICAL SANS-SERIF BOLD CAPITAL D", 0x1D5D8: "MATHEMATICAL SANS-SERIF BOLD CAPITAL E", 0x1D5D9: "MATHEMATICAL SANS-SERIF BOLD CAPITAL F", 0x1D5DA: "MATHEMATICAL SANS-SERIF BOLD CAPITAL G", 0x1D5DB: "MATHEMATICAL SANS-SERIF BOLD CAPITAL H", 0x1D5DC: "MATHEMATICAL SANS-SERIF BOLD CAPITAL I", 0x1D5DD: "MATHEMATICAL SANS-SERIF BOLD CAPITAL J", 0x1D5DE: "MATHEMATICAL SANS-SERIF BOLD CAPITAL K", 0x1D5DF: "MATHEMATICAL SANS-SERIF BOLD CAPITAL L", 0x1D5E0: "MATHEMATICAL SANS-SERIF BOLD CAPITAL M", 0x1D5E1: "MATHEMATICAL SANS-SERIF BOLD CAPITAL N", 0x1D5E2: "MATHEMATICAL SANS-SERIF BOLD CAPITAL O", 0x1D5E3: "MATHEMATICAL SANS-SERIF BOLD CAPITAL P", 0x1D5E4: "MATHEMATICAL SANS-SERIF BOLD CAPITAL Q", 0x1D5E5: "MATHEMATICAL SANS-SERIF BOLD CAPITAL R", 0x1D5E6: "MATHEMATICAL SANS-SERIF BOLD CAPITAL S", 0x1D5E7: "MATHEMATICAL SANS-SERIF BOLD CAPITAL T", 0x1D5E8: "MATHEMATICAL SANS-SERIF BOLD CAPITAL U", 0x1D5E9: "MATHEMATICAL SANS-SERIF BOLD CAPITAL V", 0x1D5EA: "MATHEMATICAL SANS-SERIF BOLD CAPITAL W", 0x1D5EB: "MATHEMATICAL SANS-SERIF BOLD CAPITAL X", 0x1D5EC: "MATHEMATICAL SANS-SERIF BOLD CAPITAL Y", 0x1D5ED: "MATHEMATICAL SANS-SERIF BOLD CAPITAL Z", 0x1D5EE: "MATHEMATICAL SANS-SERIF BOLD SMALL A", 0x1D5EF: "MATHEMATICAL SANS-SERIF BOLD SMALL B", 0x1D5F0: "MATHEMATICAL SANS-SERIF BOLD SMALL C", 0x1D5F1: "MATHEMATICAL SANS-SERIF BOLD SMALL D", 0x1D5F2: "MATHEMATICAL SANS-SERIF BOLD SMALL E", 0x1D5F3: "MATHEMATICAL SANS-SERIF BOLD SMALL F", 0x1D5F4: "MATHEMATICAL SANS-SERIF BOLD SMALL G", 0x1D5F5: "MATHEMATICAL SANS-SERIF BOLD SMALL H", 0x1D5F6: "MATHEMATICAL SANS-SERIF BOLD SMALL I", 0x1D5F7: "MATHEMATICAL SANS-SERIF BOLD SMALL J", 0x1D5F8: "MATHEMATICAL SANS-SERIF BOLD SMALL K", 0x1D5F9: "MATHEMATICAL SANS-SERIF BOLD SMALL L", 0x1D5FA: "MATHEMATICAL SANS-SERIF BOLD SMALL M", 0x1D5FB: "MATHEMATICAL SANS-SERIF BOLD SMALL N", 0x1D5FC: "MATHEMATICAL SANS-SERIF BOLD SMALL O", 0x1D5FD: "MATHEMATICAL SANS-SERIF BOLD SMALL P", 0x1D5FE: "MATHEMATICAL SANS-SERIF BOLD SMALL Q", 0x1D5FF: "MATHEMATICAL SANS-SERIF BOLD SMALL R", 0x1D600: "MATHEMATICAL SANS-SERIF BOLD SMALL S", 0x1D601: "MATHEMATICAL SANS-SERIF BOLD SMALL T", 0x1D602: "MATHEMATICAL SANS-SERIF BOLD SMALL U", 0x1D603: "MATHEMATICAL SANS-SERIF BOLD SMALL V", 0x1D604: "MATHEMATICAL SANS-SERIF BOLD SMALL W", 0x1D605: "MATHEMATICAL SANS-SERIF BOLD SMALL X", 0x1D606: "MATHEMATICAL SANS-SERIF BOLD SMALL Y", 0x1D607: "MATHEMATICAL SANS-SERIF BOLD SMALL Z", 0x1D608: "MATHEMATICAL SANS-SERIF ITALIC CAPITAL A", 0x1D609: "MATHEMATICAL SANS-SERIF ITALIC CAPITAL B", 0x1D60A: "MATHEMATICAL SANS-SERIF ITALIC CAPITAL C", 0x1D60B: "MATHEMATICAL SANS-SERIF ITALIC CAPITAL D", 0x1D60C: "MATHEMATICAL SANS-SERIF ITALIC CAPITAL E", 0x1D60D: "MATHEMATICAL SANS-SERIF ITALIC CAPITAL F", 0x1D60E: "MATHEMATICAL SANS-SERIF ITALIC CAPITAL G", 0x1D60F: "MATHEMATICAL SANS-SERIF ITALIC CAPITAL H", 0x1D610: "MATHEMATICAL SANS-SERIF ITALIC CAPITAL I", 0x1D611: "MATHEMATICAL SANS-SERIF ITALIC CAPITAL J", 0x1D612: "MATHEMATICAL SANS-SERIF ITALIC CAPITAL K", 0x1D613: "MATHEMATICAL SANS-SERIF ITALIC CAPITAL L", 0x1D614: "MATHEMATICAL SANS-SERIF ITALIC CAPITAL M", 0x1D615: "MATHEMATICAL SANS-SERIF ITALIC CAPITAL N", 0x1D616: "MATHEMATICAL SANS-SERIF ITALIC CAPITAL O", 0x1D617: "MATHEMATICAL SANS-SERIF ITALIC CAPITAL P", 0x1D618: "MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q", 0x1D619: "MATHEMATICAL SANS-SERIF ITALIC CAPITAL R", 0x1D61A: "MATHEMATICAL SANS-SERIF ITALIC CAPITAL S", 0x1D61B: "MATHEMATICAL SANS-SERIF ITALIC CAPITAL T", 0x1D61C: "MATHEMATICAL SANS-SERIF ITALIC CAPITAL U", 0x1D61D: "MATHEMATICAL SANS-SERIF ITALIC CAPITAL V", 0x1D61E: "MATHEMATICAL SANS-SERIF ITALIC CAPITAL W", 0x1D61F: "MATHEMATICAL SANS-SERIF ITALIC CAPITAL X", 0x1D620: "MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y", 0x1D621: "MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z", 0x1D622: "MATHEMATICAL SANS-SERIF ITALIC SMALL A", 0x1D623: "MATHEMATICAL SANS-SERIF ITALIC SMALL B", 0x1D624: "MATHEMATICAL SANS-SERIF ITALIC SMALL C", 0x1D625: "MATHEMATICAL SANS-SERIF ITALIC SMALL D", 0x1D626: "MATHEMATICAL SANS-SERIF ITALIC SMALL E", 0x1D627: "MATHEMATICAL SANS-SERIF ITALIC SMALL F", 0x1D628: "MATHEMATICAL SANS-SERIF ITALIC SMALL G", 0x1D629: "MATHEMATICAL SANS-SERIF ITALIC SMALL H", 0x1D62A: "MATHEMATICAL SANS-SERIF ITALIC SMALL I", 0x1D62B: "MATHEMATICAL SANS-SERIF ITALIC SMALL J", 0x1D62C: "MATHEMATICAL SANS-SERIF ITALIC SMALL K", 0x1D62D: "MATHEMATICAL SANS-SERIF ITALIC SMALL L", 0x1D62E: "MATHEMATICAL SANS-SERIF ITALIC SMALL M", 0x1D62F: "MATHEMATICAL SANS-SERIF ITALIC SMALL N", 0x1D630: "MATHEMATICAL SANS-SERIF ITALIC SMALL O", 0x1D631: "MATHEMATICAL SANS-SERIF ITALIC SMALL P", 0x1D632: "MATHEMATICAL SANS-SERIF ITALIC SMALL Q", 0x1D633: "MATHEMATICAL SANS-SERIF ITALIC SMALL R", 0x1D634: "MATHEMATICAL SANS-SERIF ITALIC SMALL S", 0x1D635: "MATHEMATICAL SANS-SERIF ITALIC SMALL T", 0x1D636: "MATHEMATICAL SANS-SERIF ITALIC SMALL U", 0x1D637: "MATHEMATICAL SANS-SERIF ITALIC SMALL V", 0x1D638: "MATHEMATICAL SANS-SERIF ITALIC SMALL W", 0x1D639: "MATHEMATICAL SANS-SERIF ITALIC SMALL X", 0x1D63A: "MATHEMATICAL SANS-SERIF ITALIC SMALL Y", 0x1D63B: "MATHEMATICAL SANS-SERIF ITALIC SMALL Z", 0x1D63C: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A", 0x1D63D: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B", 0x1D63E: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C", 0x1D63F: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D", 0x1D640: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E", 0x1D641: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F", 0x1D642: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G", 0x1D643: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H", 0x1D644: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I", 0x1D645: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J", 0x1D646: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K", 0x1D647: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L", 0x1D648: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M", 0x1D649: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N", 0x1D64A: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O", 0x1D64B: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P", 0x1D64C: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q", 0x1D64D: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R", 0x1D64E: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S", 0x1D64F: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T", 0x1D650: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U", 0x1D651: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V", 0x1D652: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W", 0x1D653: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X", 0x1D654: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y", 0x1D655: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z", 0x1D656: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A", 0x1D657: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B", 0x1D658: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C", 0x1D659: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D", 0x1D65A: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E", 0x1D65B: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F", 0x1D65C: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G", 0x1D65D: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H", 0x1D65E: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I", 0x1D65F: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J", 0x1D660: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K", 0x1D661: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L", 0x1D662: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M", 0x1D663: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N", 0x1D664: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O", 0x1D665: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P", 0x1D666: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q", 0x1D667: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R", 0x1D668: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S", 0x1D669: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T", 0x1D66A: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U", 0x1D66B: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V", 0x1D66C: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W", 0x1D66D: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X", 0x1D66E: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y", 0x1D66F: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z", 0x1D670: "MATHEMATICAL MONOSPACE CAPITAL A", 0x1D671: "MATHEMATICAL MONOSPACE CAPITAL B", 0x1D672: "MATHEMATICAL MONOSPACE CAPITAL C", 0x1D673: "MATHEMATICAL MONOSPACE CAPITAL D", 0x1D674: "MATHEMATICAL MONOSPACE CAPITAL E", 0x1D675: "MATHEMATICAL MONOSPACE CAPITAL F", 0x1D676: "MATHEMATICAL MONOSPACE CAPITAL G", 0x1D677: "MATHEMATICAL MONOSPACE CAPITAL H", 0x1D678: "MATHEMATICAL MONOSPACE CAPITAL I", 0x1D679: "MATHEMATICAL MONOSPACE CAPITAL J", 0x1D67A: "MATHEMATICAL MONOSPACE CAPITAL K", 0x1D67B: "MATHEMATICAL MONOSPACE CAPITAL L", 0x1D67C: "MATHEMATICAL MONOSPACE CAPITAL M", 0x1D67D: "MATHEMATICAL MONOSPACE CAPITAL N", 0x1D67E: "MATHEMATICAL MONOSPACE CAPITAL O", 0x1D67F: "MATHEMATICAL MONOSPACE CAPITAL P", 0x1D680: "MATHEMATICAL MONOSPACE CAPITAL Q", 0x1D681: "MATHEMATICAL MONOSPACE CAPITAL R", 0x1D682: "MATHEMATICAL MONOSPACE CAPITAL S", 0x1D683: "MATHEMATICAL MONOSPACE CAPITAL T", 0x1D684: "MATHEMATICAL MONOSPACE CAPITAL U", 0x1D685: "MATHEMATICAL MONOSPACE CAPITAL V", 0x1D686: "MATHEMATICAL MONOSPACE CAPITAL W", 0x1D687: "MATHEMATICAL MONOSPACE CAPITAL X", 0x1D688: "MATHEMATICAL MONOSPACE CAPITAL Y", 0x1D689: "MATHEMATICAL MONOSPACE CAPITAL Z", 0x1D68A: "MATHEMATICAL MONOSPACE SMALL A", 0x1D68B: "MATHEMATICAL MONOSPACE SMALL B", 0x1D68C: "MATHEMATICAL MONOSPACE SMALL C", 0x1D68D: "MATHEMATICAL MONOSPACE SMALL D", 0x1D68E: "MATHEMATICAL MONOSPACE SMALL E", 0x1D68F: "MATHEMATICAL MONOSPACE SMALL F", 0x1D690: "MATHEMATICAL MONOSPACE SMALL G", 0x1D691: "MATHEMATICAL MONOSPACE SMALL H", 0x1D692: "MATHEMATICAL MONOSPACE SMALL I", 0x1D693: "MATHEMATICAL MONOSPACE SMALL J", 0x1D694: "MATHEMATICAL MONOSPACE SMALL K", 0x1D695: "MATHEMATICAL MONOSPACE SMALL L", 0x1D696: "MATHEMATICAL MONOSPACE SMALL M", 0x1D697: "MATHEMATICAL MONOSPACE SMALL N", 0x1D698: "MATHEMATICAL MONOSPACE SMALL O", 0x1D699: "MATHEMATICAL MONOSPACE SMALL P", 0x1D69A: "MATHEMATICAL MONOSPACE SMALL Q", 0x1D69B: "MATHEMATICAL MONOSPACE SMALL R", 0x1D69C: "MATHEMATICAL MONOSPACE SMALL S", 0x1D69D: "MATHEMATICAL MONOSPACE SMALL T", 0x1D69E: "MATHEMATICAL MONOSPACE SMALL U", 0x1D69F: "MATHEMATICAL MONOSPACE SMALL V", 0x1D6A0: "MATHEMATICAL MONOSPACE SMALL W", 0x1D6A1: "MATHEMATICAL MONOSPACE SMALL X", 0x1D6A2: "MATHEMATICAL MONOSPACE SMALL Y", 0x1D6A3: "MATHEMATICAL MONOSPACE SMALL Z", 0x1D6A4: "MATHEMATICAL ITALIC SMALL DOTLESS I", 0x1D6A5: "MATHEMATICAL ITALIC SMALL DOTLESS J", 0x1D6A8: "MATHEMATICAL BOLD CAPITAL ALPHA", 0x1D6A9: "MATHEMATICAL BOLD CAPITAL BETA", 0x1D6AA: "MATHEMATICAL BOLD CAPITAL GAMMA", 0x1D6AB: "MATHEMATICAL BOLD CAPITAL DELTA", 0x1D6AC: "MATHEMATICAL BOLD CAPITAL EPSILON", 0x1D6AD: "MATHEMATICAL BOLD CAPITAL ZETA", 0x1D6AE: "MATHEMATICAL BOLD CAPITAL ETA", 0x1D6AF: "MATHEMATICAL BOLD CAPITAL THETA", 0x1D6B0: "MATHEMATICAL BOLD CAPITAL IOTA", 0x1D6B1: "MATHEMATICAL BOLD CAPITAL KAPPA", 0x1D6B2: "MATHEMATICAL BOLD CAPITAL LAMDA", 0x1D6B3: "MATHEMATICAL BOLD CAPITAL MU", 0x1D6B4: "MATHEMATICAL BOLD CAPITAL NU", 0x1D6B5: "MATHEMATICAL BOLD CAPITAL XI", 0x1D6B6: "MATHEMATICAL BOLD CAPITAL OMICRON", 0x1D6B7: "MATHEMATICAL BOLD CAPITAL PI", 0x1D6B8: "MATHEMATICAL BOLD CAPITAL RHO", 0x1D6B9: "MATHEMATICAL BOLD CAPITAL THETA SYMBOL", 0x1D6BA: "MATHEMATICAL BOLD CAPITAL SIGMA", 0x1D6BB: "MATHEMATICAL BOLD CAPITAL TAU", 0x1D6BC: "MATHEMATICAL BOLD CAPITAL UPSILON", 0x1D6BD: "MATHEMATICAL BOLD CAPITAL PHI", 0x1D6BE: "MATHEMATICAL BOLD CAPITAL CHI", 0x1D6BF: "MATHEMATICAL BOLD CAPITAL PSI", 0x1D6C0: "MATHEMATICAL BOLD CAPITAL OMEGA", 0x1D6C1: "MATHEMATICAL BOLD NABLA", 0x1D6C2: "MATHEMATICAL BOLD SMALL ALPHA", 0x1D6C3: "MATHEMATICAL BOLD SMALL BETA", 0x1D6C4: "MATHEMATICAL BOLD SMALL GAMMA", 0x1D6C5: "MATHEMATICAL BOLD SMALL DELTA", 0x1D6C6: "MATHEMATICAL BOLD SMALL EPSILON", 0x1D6C7: "MATHEMATICAL BOLD SMALL ZETA", 0x1D6C8: "MATHEMATICAL BOLD SMALL ETA", 0x1D6C9: "MATHEMATICAL BOLD SMALL THETA", 0x1D6CA: "MATHEMATICAL BOLD SMALL IOTA", 0x1D6CB: "MATHEMATICAL BOLD SMALL KAPPA", 0x1D6CC: "MATHEMATICAL BOLD SMALL LAMDA", 0x1D6CD: "MATHEMATICAL BOLD SMALL MU", 0x1D6CE: "MATHEMATICAL BOLD SMALL NU", 0x1D6CF: "MATHEMATICAL BOLD SMALL XI", 0x1D6D0: "MATHEMATICAL BOLD SMALL OMICRON", 0x1D6D1: "MATHEMATICAL BOLD SMALL PI", 0x1D6D2: "MATHEMATICAL BOLD SMALL RHO", 0x1D6D3: "MATHEMATICAL BOLD SMALL FINAL SIGMA", 0x1D6D4: "MATHEMATICAL BOLD SMALL SIGMA", 0x1D6D5: "MATHEMATICAL BOLD SMALL TAU", 0x1D6D6: "MATHEMATICAL BOLD SMALL UPSILON", 0x1D6D7: "MATHEMATICAL BOLD SMALL PHI", 0x1D6D8: "MATHEMATICAL BOLD SMALL CHI", 0x1D6D9: "MATHEMATICAL BOLD SMALL PSI", 0x1D6DA: "MATHEMATICAL BOLD SMALL OMEGA", 0x1D6DB: "MATHEMATICAL BOLD PARTIAL DIFFERENTIAL", 0x1D6DC: "MATHEMATICAL BOLD EPSILON SYMBOL", 0x1D6DD: "MATHEMATICAL BOLD THETA SYMBOL", 0x1D6DE: "MATHEMATICAL BOLD KAPPA SYMBOL", 0x1D6DF: "MATHEMATICAL BOLD PHI SYMBOL", 0x1D6E0: "MATHEMATICAL BOLD RHO SYMBOL", 0x1D6E1: "MATHEMATICAL BOLD PI SYMBOL", 0x1D6E2: "MATHEMATICAL ITALIC CAPITAL ALPHA", 0x1D6E3: "MATHEMATICAL ITALIC CAPITAL BETA", 0x1D6E4: "MATHEMATICAL ITALIC CAPITAL GAMMA", 0x1D6E5: "MATHEMATICAL ITALIC CAPITAL DELTA", 0x1D6E6: "MATHEMATICAL ITALIC CAPITAL EPSILON", 0x1D6E7: "MATHEMATICAL ITALIC CAPITAL ZETA", 0x1D6E8: "MATHEMATICAL ITALIC CAPITAL ETA", 0x1D6E9: "MATHEMATICAL ITALIC CAPITAL THETA", 0x1D6EA: "MATHEMATICAL ITALIC CAPITAL IOTA", 0x1D6EB: "MATHEMATICAL ITALIC CAPITAL KAPPA", 0x1D6EC: "MATHEMATICAL ITALIC CAPITAL LAMDA", 0x1D6ED: "MATHEMATICAL ITALIC CAPITAL MU", 0x1D6EE: "MATHEMATICAL ITALIC CAPITAL NU", 0x1D6EF: "MATHEMATICAL ITALIC CAPITAL XI", 0x1D6F0: "MATHEMATICAL ITALIC CAPITAL OMICRON", 0x1D6F1: "MATHEMATICAL ITALIC CAPITAL PI", 0x1D6F2: "MATHEMATICAL ITALIC CAPITAL RHO", 0x1D6F3: "MATHEMATICAL ITALIC CAPITAL THETA SYMBOL", 0x1D6F4: "MATHEMATICAL ITALIC CAPITAL SIGMA", 0x1D6F5: "MATHEMATICAL ITALIC CAPITAL TAU", 0x1D6F6: "MATHEMATICAL ITALIC CAPITAL UPSILON", 0x1D6F7: "MATHEMATICAL ITALIC CAPITAL PHI", 0x1D6F8: "MATHEMATICAL ITALIC CAPITAL CHI", 0x1D6F9: "MATHEMATICAL ITALIC CAPITAL PSI", 0x1D6FA: "MATHEMATICAL ITALIC CAPITAL OMEGA", 0x1D6FB: "MATHEMATICAL ITALIC NABLA", 0x1D6FC: "MATHEMATICAL ITALIC SMALL ALPHA", 0x1D6FD: "MATHEMATICAL ITALIC SMALL BETA", 0x1D6FE: "MATHEMATICAL ITALIC SMALL GAMMA", 0x1D6FF: "MATHEMATICAL ITALIC SMALL DELTA", 0x1D700: "MATHEMATICAL ITALIC SMALL EPSILON", 0x1D701: "MATHEMATICAL ITALIC SMALL ZETA", 0x1D702: "MATHEMATICAL ITALIC SMALL ETA", 0x1D703: "MATHEMATICAL ITALIC SMALL THETA", 0x1D704: "MATHEMATICAL ITALIC SMALL IOTA", 0x1D705: "MATHEMATICAL ITALIC SMALL KAPPA", 0x1D706: "MATHEMATICAL ITALIC SMALL LAMDA", 0x1D707: "MATHEMATICAL ITALIC SMALL MU", 0x1D708: "MATHEMATICAL ITALIC SMALL NU", 0x1D709: "MATHEMATICAL ITALIC SMALL XI", 0x1D70A: "MATHEMATICAL ITALIC SMALL OMICRON", 0x1D70B: "MATHEMATICAL ITALIC SMALL PI", 0x1D70C: "MATHEMATICAL ITALIC SMALL RHO", 0x1D70D: "MATHEMATICAL ITALIC SMALL FINAL SIGMA", 0x1D70E: "MATHEMATICAL ITALIC SMALL SIGMA", 0x1D70F: "MATHEMATICAL ITALIC SMALL TAU", 0x1D710: "MATHEMATICAL ITALIC SMALL UPSILON", 0x1D711: "MATHEMATICAL ITALIC SMALL PHI", 0x1D712: "MATHEMATICAL ITALIC SMALL CHI", 0x1D713: "MATHEMATICAL ITALIC SMALL PSI", 0x1D714: "MATHEMATICAL ITALIC SMALL OMEGA", 0x1D715: "MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL", 0x1D716: "MATHEMATICAL ITALIC EPSILON SYMBOL", 0x1D717: "MATHEMATICAL ITALIC THETA SYMBOL", 0x1D718: "MATHEMATICAL ITALIC KAPPA SYMBOL", 0x1D719: "MATHEMATICAL ITALIC PHI SYMBOL", 0x1D71A: "MATHEMATICAL ITALIC RHO SYMBOL", 0x1D71B: "MATHEMATICAL ITALIC PI SYMBOL", 0x1D71C: "MATHEMATICAL BOLD ITALIC CAPITAL ALPHA", 0x1D71D: "MATHEMATICAL BOLD ITALIC CAPITAL BETA", 0x1D71E: "MATHEMATICAL BOLD ITALIC CAPITAL GAMMA", 0x1D71F: "MATHEMATICAL BOLD ITALIC CAPITAL DELTA", 0x1D720: "MATHEMATICAL BOLD ITALIC CAPITAL EPSILON", 0x1D721: "MATHEMATICAL BOLD ITALIC CAPITAL ZETA", 0x1D722: "MATHEMATICAL BOLD ITALIC CAPITAL ETA", 0x1D723: "MATHEMATICAL BOLD ITALIC CAPITAL THETA", 0x1D724: "MATHEMATICAL BOLD ITALIC CAPITAL IOTA", 0x1D725: "MATHEMATICAL BOLD ITALIC CAPITAL KAPPA", 0x1D726: "MATHEMATICAL BOLD ITALIC CAPITAL LAMDA", 0x1D727: "MATHEMATICAL BOLD ITALIC CAPITAL MU", 0x1D728: "MATHEMATICAL BOLD ITALIC CAPITAL NU", 0x1D729: "MATHEMATICAL BOLD ITALIC CAPITAL XI", 0x1D72A: "MATHEMATICAL BOLD ITALIC CAPITAL OMICRON", 0x1D72B: "MATHEMATICAL BOLD ITALIC CAPITAL PI", 0x1D72C: "MATHEMATICAL BOLD ITALIC CAPITAL RHO", 0x1D72D: "MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL", 0x1D72E: "MATHEMATICAL BOLD ITALIC CAPITAL SIGMA", 0x1D72F: "MATHEMATICAL BOLD ITALIC CAPITAL TAU", 0x1D730: "MATHEMATICAL BOLD ITALIC CAPITAL UPSILON", 0x1D731: "MATHEMATICAL BOLD ITALIC CAPITAL PHI", 0x1D732: "MATHEMATICAL BOLD ITALIC CAPITAL CHI", 0x1D733: "MATHEMATICAL BOLD ITALIC CAPITAL PSI", 0x1D734: "MATHEMATICAL BOLD ITALIC CAPITAL OMEGA", 0x1D735: "MATHEMATICAL BOLD ITALIC NABLA", 0x1D736: "MATHEMATICAL BOLD ITALIC SMALL ALPHA", 0x1D737: "MATHEMATICAL BOLD ITALIC SMALL BETA", 0x1D738: "MATHEMATICAL BOLD ITALIC SMALL GAMMA", 0x1D739: "MATHEMATICAL BOLD ITALIC SMALL DELTA", 0x1D73A: "MATHEMATICAL BOLD ITALIC SMALL EPSILON", 0x1D73B: "MATHEMATICAL BOLD ITALIC SMALL ZETA", 0x1D73C: "MATHEMATICAL BOLD ITALIC SMALL ETA", 0x1D73D: "MATHEMATICAL BOLD ITALIC SMALL THETA", 0x1D73E: "MATHEMATICAL BOLD ITALIC SMALL IOTA", 0x1D73F: "MATHEMATICAL BOLD ITALIC SMALL KAPPA", 0x1D740: "MATHEMATICAL BOLD ITALIC SMALL LAMDA", 0x1D741: "MATHEMATICAL BOLD ITALIC SMALL MU", 0x1D742: "MATHEMATICAL BOLD ITALIC SMALL NU", 0x1D743: "MATHEMATICAL BOLD ITALIC SMALL XI", 0x1D744: "MATHEMATICAL BOLD ITALIC SMALL OMICRON", 0x1D745: "MATHEMATICAL BOLD ITALIC SMALL PI", 0x1D746: "MATHEMATICAL BOLD ITALIC SMALL RHO", 0x1D747: "MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA", 0x1D748: "MATHEMATICAL BOLD ITALIC SMALL SIGMA", 0x1D749: "MATHEMATICAL BOLD ITALIC SMALL TAU", 0x1D74A: "MATHEMATICAL BOLD ITALIC SMALL UPSILON", 0x1D74B: "MATHEMATICAL BOLD ITALIC SMALL PHI", 0x1D74C: "MATHEMATICAL BOLD ITALIC SMALL CHI", 0x1D74D: "MATHEMATICAL BOLD ITALIC SMALL PSI", 0x1D74E: "MATHEMATICAL BOLD ITALIC SMALL OMEGA", 0x1D74F: "MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL", 0x1D750: "MATHEMATICAL BOLD ITALIC EPSILON SYMBOL", 0x1D751: "MATHEMATICAL BOLD ITALIC THETA SYMBOL", 0x1D752: "MATHEMATICAL BOLD ITALIC KAPPA SYMBOL", 0x1D753: "MATHEMATICAL BOLD ITALIC PHI SYMBOL", 0x1D754: "MATHEMATICAL BOLD ITALIC RHO SYMBOL", 0x1D755: "MATHEMATICAL BOLD ITALIC PI SYMBOL", 0x1D756: "MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA", 0x1D757: "MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA", 0x1D758: "MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA", 0x1D759: "MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA", 0x1D75A: "MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON", 0x1D75B: "MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA", 0x1D75C: "MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA", 0x1D75D: "MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA", 0x1D75E: "MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA", 0x1D75F: "MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA", 0x1D760: "MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA", 0x1D761: "MATHEMATICAL SANS-SERIF BOLD CAPITAL MU", 0x1D762: "MATHEMATICAL SANS-SERIF BOLD CAPITAL NU", 0x1D763: "MATHEMATICAL SANS-SERIF BOLD CAPITAL XI", 0x1D764: "MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON", 0x1D765: "MATHEMATICAL SANS-SERIF BOLD CAPITAL PI", 0x1D766: "MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO", 0x1D767: "MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL", 0x1D768: "MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA", 0x1D769: "MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU", 0x1D76A: "MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON", 0x1D76B: "MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI", 0x1D76C: "MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI", 0x1D76D: "MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI", 0x1D76E: "MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA", 0x1D76F: "MATHEMATICAL SANS-SERIF BOLD NABLA", 0x1D770: "MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA", 0x1D771: "MATHEMATICAL SANS-SERIF BOLD SMALL BETA", 0x1D772: "MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA", 0x1D773: "MATHEMATICAL SANS-SERIF BOLD SMALL DELTA", 0x1D774: "MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON", 0x1D775: "MATHEMATICAL SANS-SERIF BOLD SMALL ZETA", 0x1D776: "MATHEMATICAL SANS-SERIF BOLD SMALL ETA", 0x1D777: "MATHEMATICAL SANS-SERIF BOLD SMALL THETA", 0x1D778: "MATHEMATICAL SANS-SERIF BOLD SMALL IOTA", 0x1D779: "MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA", 0x1D77A: "MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA", 0x1D77B: "MATHEMATICAL SANS-SERIF BOLD SMALL MU", 0x1D77C: "MATHEMATICAL SANS-SERIF BOLD SMALL NU", 0x1D77D: "MATHEMATICAL SANS-SERIF BOLD SMALL XI", 0x1D77E: "MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON", 0x1D77F: "MATHEMATICAL SANS-SERIF BOLD SMALL PI", 0x1D780: "MATHEMATICAL SANS-SERIF BOLD SMALL RHO", 0x1D781: "MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA", 0x1D782: "MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA", 0x1D783: "MATHEMATICAL SANS-SERIF BOLD SMALL TAU", 0x1D784: "MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON", 0x1D785: "MATHEMATICAL SANS-SERIF BOLD SMALL PHI", 0x1D786: "MATHEMATICAL SANS-SERIF BOLD SMALL CHI", 0x1D787: "MATHEMATICAL SANS-SERIF BOLD SMALL PSI", 0x1D788: "MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA", 0x1D789: "MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL", 0x1D78A: "MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL", 0x1D78B: "MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL", 0x1D78C: "MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL", 0x1D78D: "MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL", 0x1D78E: "MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL", 0x1D78F: "MATHEMATICAL SANS-SERIF BOLD PI SYMBOL", 0x1D790: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA", 0x1D791: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA", 0x1D792: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA", 0x1D793: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA", 0x1D794: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON", 0x1D795: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA", 0x1D796: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA", 0x1D797: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA", 0x1D798: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA", 0x1D799: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA", 0x1D79A: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA", 0x1D79B: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU", 0x1D79C: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU", 0x1D79D: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI", 0x1D79E: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON", 0x1D79F: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI", 0x1D7A0: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO", 0x1D7A1: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL", 0x1D7A2: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA", 0x1D7A3: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU", 0x1D7A4: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON", 0x1D7A5: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI", 0x1D7A6: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI", 0x1D7A7: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI", 0x1D7A8: "MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA", 0x1D7A9: "MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA", 0x1D7AA: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA", 0x1D7AB: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA", 0x1D7AC: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA", 0x1D7AD: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA", 0x1D7AE: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON", 0x1D7AF: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA", 0x1D7B0: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA", 0x1D7B1: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA", 0x1D7B2: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA", 0x1D7B3: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA", 0x1D7B4: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA", 0x1D7B5: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU", 0x1D7B6: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU", 0x1D7B7: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI", 0x1D7B8: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON", 0x1D7B9: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI", 0x1D7BA: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO", 0x1D7BB: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA", 0x1D7BC: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA", 0x1D7BD: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU", 0x1D7BE: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON", 0x1D7BF: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI", 0x1D7C0: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI", 0x1D7C1: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI", 0x1D7C2: "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA", 0x1D7C3: "MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL", 0x1D7C4: "MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL", 0x1D7C5: "MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL", 0x1D7C6: "MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL", 0x1D7C7: "MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL", 0x1D7C8: "MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL", 0x1D7C9: "MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL", 0x1D7CA: "MATHEMATICAL BOLD CAPITAL DIGAMMA", 0x1D7CB: "MATHEMATICAL BOLD SMALL DIGAMMA", 0x1D7CE: "MATHEMATICAL BOLD DIGIT ZERO", 0x1D7CF: "MATHEMATICAL BOLD DIGIT ONE", 0x1D7D0: "MATHEMATICAL BOLD DIGIT TWO", 0x1D7D1: "MATHEMATICAL BOLD DIGIT THREE", 0x1D7D2: "MATHEMATICAL BOLD DIGIT FOUR", 0x1D7D3: "MATHEMATICAL BOLD DIGIT FIVE", 0x1D7D4: "MATHEMATICAL BOLD DIGIT SIX", 0x1D7D5: "MATHEMATICAL BOLD DIGIT SEVEN", 0x1D7D6: "MATHEMATICAL BOLD DIGIT EIGHT", 0x1D7D7: "MATHEMATICAL BOLD DIGIT NINE", 0x1D7D8: "MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO", 0x1D7D9: "MATHEMATICAL DOUBLE-STRUCK DIGIT ONE", 0x1D7DA: "MATHEMATICAL DOUBLE-STRUCK DIGIT TWO", 0x1D7DB: "MATHEMATICAL DOUBLE-STRUCK DIGIT THREE", 0x1D7DC: "MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR", 0x1D7DD: "MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE", 0x1D7DE: "MATHEMATICAL DOUBLE-STRUCK DIGIT SIX", 0x1D7DF: "MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN", 0x1D7E0: "MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT", 0x1D7E1: "MATHEMATICAL DOUBLE-STRUCK DIGIT NINE", 0x1D7E2: "MATHEMATICAL SANS-SERIF DIGIT ZERO", 0x1D7E3: "MATHEMATICAL SANS-SERIF DIGIT ONE", 0x1D7E4: "MATHEMATICAL SANS-SERIF DIGIT TWO", 0x1D7E5: "MATHEMATICAL SANS-SERIF DIGIT THREE", 0x1D7E6: "MATHEMATICAL SANS-SERIF DIGIT FOUR", 0x1D7E7: "MATHEMATICAL SANS-SERIF DIGIT FIVE", 0x1D7E8: "MATHEMATICAL SANS-SERIF DIGIT SIX", 0x1D7E9: "MATHEMATICAL SANS-SERIF DIGIT SEVEN", 0x1D7EA: "MATHEMATICAL SANS-SERIF DIGIT EIGHT", 0x1D7EB: "MATHEMATICAL SANS-SERIF DIGIT NINE", 0x1D7EC: "MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO", 0x1D7ED: "MATHEMATICAL SANS-SERIF BOLD DIGIT ONE", 0x1D7EE: "MATHEMATICAL SANS-SERIF BOLD DIGIT TWO", 0x1D7EF: "MATHEMATICAL SANS-SERIF BOLD DIGIT THREE", 0x1D7F0: "MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR", 0x1D7F1: "MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE", 0x1D7F2: "MATHEMATICAL SANS-SERIF BOLD DIGIT SIX", 0x1D7F3: "MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN", 0x1D7F4: "MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT", 0x1D7F5: "MATHEMATICAL SANS-SERIF BOLD DIGIT NINE", 0x1D7F6: "MATHEMATICAL MONOSPACE DIGIT ZERO", 0x1D7F7: "MATHEMATICAL MONOSPACE DIGIT ONE", 0x1D7F8: "MATHEMATICAL MONOSPACE DIGIT TWO", 0x1D7F9: "MATHEMATICAL MONOSPACE DIGIT THREE", 0x1D7FA: "MATHEMATICAL MONOSPACE DIGIT FOUR", 0x1D7FB: "MATHEMATICAL MONOSPACE DIGIT FIVE", 0x1D7FC: "MATHEMATICAL MONOSPACE DIGIT SIX", 0x1D7FD: "MATHEMATICAL MONOSPACE DIGIT SEVEN", 0x1D7FE: "MATHEMATICAL MONOSPACE DIGIT EIGHT", 0x1D7FF: "MATHEMATICAL MONOSPACE DIGIT NINE", 0x1F000: "MAHJONG TILE EAST WIND", 0x1F001: "MAHJONG TILE SOUTH WIND", 0x1F002: "MAHJONG TILE WEST WIND", 0x1F003: "MAHJONG TILE NORTH WIND", 0x1F004: "MAHJONG TILE RED DRAGON", 0x1F005: "MAHJONG TILE GREEN DRAGON", 0x1F006: "MAHJONG TILE WHITE DRAGON", 0x1F007: "MAHJONG TILE ONE OF CHARACTERS", 0x1F008: "MAHJONG TILE TWO OF CHARACTERS", 0x1F009: "MAHJONG TILE THREE OF CHARACTERS", 0x1F00A: "MAHJONG TILE FOUR OF CHARACTERS", 0x1F00B: "MAHJONG TILE FIVE OF CHARACTERS", 0x1F00C: "MAHJONG TILE SIX OF CHARACTERS", 0x1F00D: "MAHJONG TILE SEVEN OF CHARACTERS", 0x1F00E: "MAHJONG TILE EIGHT OF CHARACTERS", 0x1F00F: "MAHJONG TILE NINE OF CHARACTERS", 0x1F010: "MAHJONG TILE ONE OF BAMBOOS", 0x1F011: "MAHJONG TILE TWO OF BAMBOOS", 0x1F012: "MAHJONG TILE THREE OF BAMBOOS", 0x1F013: "MAHJONG TILE FOUR OF BAMBOOS", 0x1F014: "MAHJONG TILE FIVE OF BAMBOOS", 0x1F015: "MAHJONG TILE SIX OF BAMBOOS", 0x1F016: "MAHJONG TILE SEVEN OF BAMBOOS", 0x1F017: "MAHJONG TILE EIGHT OF BAMBOOS", 0x1F018: "MAHJONG TILE NINE OF BAMBOOS", 0x1F019: "MAHJONG TILE ONE OF CIRCLES", 0x1F01A: "MAHJONG TILE TWO OF CIRCLES", 0x1F01B: "MAHJONG TILE THREE OF CIRCLES", 0x1F01C: "MAHJONG TILE FOUR OF CIRCLES", 0x1F01D: "MAHJONG TILE FIVE OF CIRCLES", 0x1F01E: "MAHJONG TILE SIX OF CIRCLES", 0x1F01F: "MAHJONG TILE SEVEN OF CIRCLES", 0x1F020: "MAHJONG TILE EIGHT OF CIRCLES", 0x1F021: "MAHJONG TILE NINE OF CIRCLES", 0x1F022: "MAHJONG TILE PLUM", 0x1F023: "MAHJONG TILE ORCHID", 0x1F024: "MAHJONG TILE BAMBOO", 0x1F025: "MAHJONG TILE CHRYSANTHEMUM", 0x1F026: "MAHJONG TILE SPRING", 0x1F027: "MAHJONG TILE SUMMER", 0x1F028: "MAHJONG TILE AUTUMN", 0x1F029: "MAHJONG TILE WINTER", 0x1F02A: "MAHJONG TILE JOKER", 0x1F02B: "MAHJONG TILE BACK", 0x1F030: "DOMINO TILE HORIZONTAL BACK", 0x1F031: "DOMINO TILE HORIZONTAL-00-00", 0x1F032: "DOMINO TILE HORIZONTAL-00-01", 0x1F033: "DOMINO TILE HORIZONTAL-00-02", 0x1F034: "DOMINO TILE HORIZONTAL-00-03", 0x1F035: "DOMINO TILE HORIZONTAL-00-04", 0x1F036: "DOMINO TILE HORIZONTAL-00-05", 0x1F037: "DOMINO TILE HORIZONTAL-00-06", 0x1F038: "DOMINO TILE HORIZONTAL-01-00", 0x1F039: "DOMINO TILE HORIZONTAL-01-01", 0x1F03A: "DOMINO TILE HORIZONTAL-01-02", 0x1F03B: "DOMINO TILE HORIZONTAL-01-03", 0x1F03C: "DOMINO TILE HORIZONTAL-01-04", 0x1F03D: "DOMINO TILE HORIZONTAL-01-05", 0x1F03E: "DOMINO TILE HORIZONTAL-01-06", 0x1F03F: "DOMINO TILE HORIZONTAL-02-00", 0x1F040: "DOMINO TILE HORIZONTAL-02-01", 0x1F041: "DOMINO TILE HORIZONTAL-02-02", 0x1F042: "DOMINO TILE HORIZONTAL-02-03", 0x1F043: "DOMINO TILE HORIZONTAL-02-04", 0x1F044: "DOMINO TILE HORIZONTAL-02-05", 0x1F045: "DOMINO TILE HORIZONTAL-02-06", 0x1F046: "DOMINO TILE HORIZONTAL-03-00", 0x1F047: "DOMINO TILE HORIZONTAL-03-01", 0x1F048: "DOMINO TILE HORIZONTAL-03-02", 0x1F049: "DOMINO TILE HORIZONTAL-03-03", 0x1F04A: "DOMINO TILE HORIZONTAL-03-04", 0x1F04B: "DOMINO TILE HORIZONTAL-03-05", 0x1F04C: "DOMINO TILE HORIZONTAL-03-06", 0x1F04D: "DOMINO TILE HORIZONTAL-04-00", 0x1F04E: "DOMINO TILE HORIZONTAL-04-01", 0x1F04F: "DOMINO TILE HORIZONTAL-04-02", 0x1F050: "DOMINO TILE HORIZONTAL-04-03", 0x1F051: "DOMINO TILE HORIZONTAL-04-04", 0x1F052: "DOMINO TILE HORIZONTAL-04-05", 0x1F053: "DOMINO TILE HORIZONTAL-04-06", 0x1F054: "DOMINO TILE HORIZONTAL-05-00", 0x1F055: "DOMINO TILE HORIZONTAL-05-01", 0x1F056: "DOMINO TILE HORIZONTAL-05-02", 0x1F057: "DOMINO TILE HORIZONTAL-05-03", 0x1F058: "DOMINO TILE HORIZONTAL-05-04", 0x1F059: "DOMINO TILE HORIZONTAL-05-05", 0x1F05A: "DOMINO TILE HORIZONTAL-05-06", 0x1F05B: "DOMINO TILE HORIZONTAL-06-00", 0x1F05C: "DOMINO TILE HORIZONTAL-06-01", 0x1F05D: "DOMINO TILE HORIZONTAL-06-02", 0x1F05E: "DOMINO TILE HORIZONTAL-06-03", 0x1F05F: "DOMINO TILE HORIZONTAL-06-04", 0x1F060: "DOMINO TILE HORIZONTAL-06-05", 0x1F061: "DOMINO TILE HORIZONTAL-06-06", 0x1F062: "DOMINO TILE VERTICAL BACK", 0x1F063: "DOMINO TILE VERTICAL-00-00", 0x1F064: "DOMINO TILE VERTICAL-00-01", 0x1F065: "DOMINO TILE VERTICAL-00-02", 0x1F066: "DOMINO TILE VERTICAL-00-03", 0x1F067: "DOMINO TILE VERTICAL-00-04", 0x1F068: "DOMINO TILE VERTICAL-00-05", 0x1F069: "DOMINO TILE VERTICAL-00-06", 0x1F06A: "DOMINO TILE VERTICAL-01-00", 0x1F06B: "DOMINO TILE VERTICAL-01-01", 0x1F06C: "DOMINO TILE VERTICAL-01-02", 0x1F06D: "DOMINO TILE VERTICAL-01-03", 0x1F06E: "DOMINO TILE VERTICAL-01-04", 0x1F06F: "DOMINO TILE VERTICAL-01-05", 0x1F070: "DOMINO TILE VERTICAL-01-06", 0x1F071: "DOMINO TILE VERTICAL-02-00", 0x1F072: "DOMINO TILE VERTICAL-02-01", 0x1F073: "DOMINO TILE VERTICAL-02-02", 0x1F074: "DOMINO TILE VERTICAL-02-03", 0x1F075: "DOMINO TILE VERTICAL-02-04", 0x1F076: "DOMINO TILE VERTICAL-02-05", 0x1F077: "DOMINO TILE VERTICAL-02-06", 0x1F078: "DOMINO TILE VERTICAL-03-00", 0x1F079: "DOMINO TILE VERTICAL-03-01", 0x1F07A: "DOMINO TILE VERTICAL-03-02", 0x1F07B: "DOMINO TILE VERTICAL-03-03", 0x1F07C: "DOMINO TILE VERTICAL-03-04", 0x1F07D: "DOMINO TILE VERTICAL-03-05", 0x1F07E: "DOMINO TILE VERTICAL-03-06", 0x1F07F: "DOMINO TILE VERTICAL-04-00", 0x1F080: "DOMINO TILE VERTICAL-04-01", 0x1F081: "DOMINO TILE VERTICAL-04-02", 0x1F082: "DOMINO TILE VERTICAL-04-03", 0x1F083: "DOMINO TILE VERTICAL-04-04", 0x1F084: "DOMINO TILE VERTICAL-04-05", 0x1F085: "DOMINO TILE VERTICAL-04-06", 0x1F086: "DOMINO TILE VERTICAL-05-00", 0x1F087: "DOMINO TILE VERTICAL-05-01", 0x1F088: "DOMINO TILE VERTICAL-05-02", 0x1F089: "DOMINO TILE VERTICAL-05-03", 0x1F08A: "DOMINO TILE VERTICAL-05-04", 0x1F08B: "DOMINO TILE VERTICAL-05-05", 0x1F08C: "DOMINO TILE VERTICAL-05-06", 0x1F08D: "DOMINO TILE VERTICAL-06-00", 0x1F08E: "DOMINO TILE VERTICAL-06-01", 0x1F08F: "DOMINO TILE VERTICAL-06-02", 0x1F090: "DOMINO TILE VERTICAL-06-03", 0x1F091: "DOMINO TILE VERTICAL-06-04", 0x1F092: "DOMINO TILE VERTICAL-06-05", 0x1F093: "DOMINO TILE VERTICAL-06-06", 0x1FFFE: "", 0x1FFFF: "", 0x2F800: "CJK COMPATIBILITY IDEOGRAPH-2F800", 0x2F801: "CJK COMPATIBILITY IDEOGRAPH-2F801", 0x2F802: "CJK COMPATIBILITY IDEOGRAPH-2F802", 0x2F803: "CJK COMPATIBILITY IDEOGRAPH-2F803", 0x2F804: "CJK COMPATIBILITY IDEOGRAPH-2F804", 0x2F805: "CJK COMPATIBILITY IDEOGRAPH-2F805", 0x2F806: "CJK COMPATIBILITY IDEOGRAPH-2F806", 0x2F807: "CJK COMPATIBILITY IDEOGRAPH-2F807", 0x2F808: "CJK COMPATIBILITY IDEOGRAPH-2F808", 0x2F809: "CJK COMPATIBILITY IDEOGRAPH-2F809", 0x2F80A: "CJK COMPATIBILITY IDEOGRAPH-2F80A", 0x2F80B: "CJK COMPATIBILITY IDEOGRAPH-2F80B", 0x2F80C: "CJK COMPATIBILITY IDEOGRAPH-2F80C", 0x2F80D: "CJK COMPATIBILITY IDEOGRAPH-2F80D", 0x2F80E: "CJK COMPATIBILITY IDEOGRAPH-2F80E", 0x2F80F: "CJK COMPATIBILITY IDEOGRAPH-2F80F", 0x2F810: "CJK COMPATIBILITY IDEOGRAPH-2F810", 0x2F811: "CJK COMPATIBILITY IDEOGRAPH-2F811", 0x2F812: "CJK COMPATIBILITY IDEOGRAPH-2F812", 0x2F813: "CJK COMPATIBILITY IDEOGRAPH-2F813", 0x2F814: "CJK COMPATIBILITY IDEOGRAPH-2F814", 0x2F815: "CJK COMPATIBILITY IDEOGRAPH-2F815", 0x2F816: "CJK COMPATIBILITY IDEOGRAPH-2F816", 0x2F817: "CJK COMPATIBILITY IDEOGRAPH-2F817", 0x2F818: "CJK COMPATIBILITY IDEOGRAPH-2F818", 0x2F819: "CJK COMPATIBILITY IDEOGRAPH-2F819", 0x2F81A: "CJK COMPATIBILITY IDEOGRAPH-2F81A", 0x2F81B: "CJK COMPATIBILITY IDEOGRAPH-2F81B", 0x2F81C: "CJK COMPATIBILITY IDEOGRAPH-2F81C", 0x2F81D: "CJK COMPATIBILITY IDEOGRAPH-2F81D", 0x2F81E: "CJK COMPATIBILITY IDEOGRAPH-2F81E", 0x2F81F: "CJK COMPATIBILITY IDEOGRAPH-2F81F", 0x2F820: "CJK COMPATIBILITY IDEOGRAPH-2F820", 0x2F821: "CJK COMPATIBILITY IDEOGRAPH-2F821", 0x2F822: "CJK COMPATIBILITY IDEOGRAPH-2F822", 0x2F823: "CJK COMPATIBILITY IDEOGRAPH-2F823", 0x2F824: "CJK COMPATIBILITY IDEOGRAPH-2F824", 0x2F825: "CJK COMPATIBILITY IDEOGRAPH-2F825", 0x2F826: "CJK COMPATIBILITY IDEOGRAPH-2F826", 0x2F827: "CJK COMPATIBILITY IDEOGRAPH-2F827", 0x2F828: "CJK COMPATIBILITY IDEOGRAPH-2F828", 0x2F829: "CJK COMPATIBILITY IDEOGRAPH-2F829", 0x2F82A: "CJK COMPATIBILITY IDEOGRAPH-2F82A", 0x2F82B: "CJK COMPATIBILITY IDEOGRAPH-2F82B", 0x2F82C: "CJK COMPATIBILITY IDEOGRAPH-2F82C", 0x2F82D: "CJK COMPATIBILITY IDEOGRAPH-2F82D", 0x2F82E: "CJK COMPATIBILITY IDEOGRAPH-2F82E", 0x2F82F: "CJK COMPATIBILITY IDEOGRAPH-2F82F", 0x2F830: "CJK COMPATIBILITY IDEOGRAPH-2F830", 0x2F831: "CJK COMPATIBILITY IDEOGRAPH-2F831", 0x2F832: "CJK COMPATIBILITY IDEOGRAPH-2F832", 0x2F833: "CJK COMPATIBILITY IDEOGRAPH-2F833", 0x2F834: "CJK COMPATIBILITY IDEOGRAPH-2F834", 0x2F835: "CJK COMPATIBILITY IDEOGRAPH-2F835", 0x2F836: "CJK COMPATIBILITY IDEOGRAPH-2F836", 0x2F837: "CJK COMPATIBILITY IDEOGRAPH-2F837", 0x2F838: "CJK COMPATIBILITY IDEOGRAPH-2F838", 0x2F839: "CJK COMPATIBILITY IDEOGRAPH-2F839", 0x2F83A: "CJK COMPATIBILITY IDEOGRAPH-2F83A", 0x2F83B: "CJK COMPATIBILITY IDEOGRAPH-2F83B", 0x2F83C: "CJK COMPATIBILITY IDEOGRAPH-2F83C", 0x2F83D: "CJK COMPATIBILITY IDEOGRAPH-2F83D", 0x2F83E: "CJK COMPATIBILITY IDEOGRAPH-2F83E", 0x2F83F: "CJK COMPATIBILITY IDEOGRAPH-2F83F", 0x2F840: "CJK COMPATIBILITY IDEOGRAPH-2F840", 0x2F841: "CJK COMPATIBILITY IDEOGRAPH-2F841", 0x2F842: "CJK COMPATIBILITY IDEOGRAPH-2F842", 0x2F843: "CJK COMPATIBILITY IDEOGRAPH-2F843", 0x2F844: "CJK COMPATIBILITY IDEOGRAPH-2F844", 0x2F845: "CJK COMPATIBILITY IDEOGRAPH-2F845", 0x2F846: "CJK COMPATIBILITY IDEOGRAPH-2F846", 0x2F847: "CJK COMPATIBILITY IDEOGRAPH-2F847", 0x2F848: "CJK COMPATIBILITY IDEOGRAPH-2F848", 0x2F849: "CJK COMPATIBILITY IDEOGRAPH-2F849", 0x2F84A: "CJK COMPATIBILITY IDEOGRAPH-2F84A", 0x2F84B: "CJK COMPATIBILITY IDEOGRAPH-2F84B", 0x2F84C: "CJK COMPATIBILITY IDEOGRAPH-2F84C", 0x2F84D: "CJK COMPATIBILITY IDEOGRAPH-2F84D", 0x2F84E: "CJK COMPATIBILITY IDEOGRAPH-2F84E", 0x2F84F: "CJK COMPATIBILITY IDEOGRAPH-2F84F", 0x2F850: "CJK COMPATIBILITY IDEOGRAPH-2F850", 0x2F851: "CJK COMPATIBILITY IDEOGRAPH-2F851", 0x2F852: "CJK COMPATIBILITY IDEOGRAPH-2F852", 0x2F853: "CJK COMPATIBILITY IDEOGRAPH-2F853", 0x2F854: "CJK COMPATIBILITY IDEOGRAPH-2F854", 0x2F855: "CJK COMPATIBILITY IDEOGRAPH-2F855", 0x2F856: "CJK COMPATIBILITY IDEOGRAPH-2F856", 0x2F857: "CJK COMPATIBILITY IDEOGRAPH-2F857", 0x2F858: "CJK COMPATIBILITY IDEOGRAPH-2F858", 0x2F859: "CJK COMPATIBILITY IDEOGRAPH-2F859", 0x2F85A: "CJK COMPATIBILITY IDEOGRAPH-2F85A", 0x2F85B: "CJK COMPATIBILITY IDEOGRAPH-2F85B", 0x2F85C: "CJK COMPATIBILITY IDEOGRAPH-2F85C", 0x2F85D: "CJK COMPATIBILITY IDEOGRAPH-2F85D", 0x2F85E: "CJK COMPATIBILITY IDEOGRAPH-2F85E", 0x2F85F: "CJK COMPATIBILITY IDEOGRAPH-2F85F", 0x2F860: "CJK COMPATIBILITY IDEOGRAPH-2F860", 0x2F861: "CJK COMPATIBILITY IDEOGRAPH-2F861", 0x2F862: "CJK COMPATIBILITY IDEOGRAPH-2F862", 0x2F863: "CJK COMPATIBILITY IDEOGRAPH-2F863", 0x2F864: "CJK COMPATIBILITY IDEOGRAPH-2F864", 0x2F865: "CJK COMPATIBILITY IDEOGRAPH-2F865", 0x2F866: "CJK COMPATIBILITY IDEOGRAPH-2F866", 0x2F867: "CJK COMPATIBILITY IDEOGRAPH-2F867", 0x2F868: "CJK COMPATIBILITY IDEOGRAPH-2F868", 0x2F869: "CJK COMPATIBILITY IDEOGRAPH-2F869", 0x2F86A: "CJK COMPATIBILITY IDEOGRAPH-2F86A", 0x2F86B: "CJK COMPATIBILITY IDEOGRAPH-2F86B", 0x2F86C: "CJK COMPATIBILITY IDEOGRAPH-2F86C", 0x2F86D: "CJK COMPATIBILITY IDEOGRAPH-2F86D", 0x2F86E: "CJK COMPATIBILITY IDEOGRAPH-2F86E", 0x2F86F: "CJK COMPATIBILITY IDEOGRAPH-2F86F", 0x2F870: "CJK COMPATIBILITY IDEOGRAPH-2F870", 0x2F871: "CJK COMPATIBILITY IDEOGRAPH-2F871", 0x2F872: "CJK COMPATIBILITY IDEOGRAPH-2F872", 0x2F873: "CJK COMPATIBILITY IDEOGRAPH-2F873", 0x2F874: "CJK COMPATIBILITY IDEOGRAPH-2F874", 0x2F875: "CJK COMPATIBILITY IDEOGRAPH-2F875", 0x2F876: "CJK COMPATIBILITY IDEOGRAPH-2F876", 0x2F877: "CJK COMPATIBILITY IDEOGRAPH-2F877", 0x2F878: "CJK COMPATIBILITY IDEOGRAPH-2F878", 0x2F879: "CJK COMPATIBILITY IDEOGRAPH-2F879", 0x2F87A: "CJK COMPATIBILITY IDEOGRAPH-2F87A", 0x2F87B: "CJK COMPATIBILITY IDEOGRAPH-2F87B", 0x2F87C: "CJK COMPATIBILITY IDEOGRAPH-2F87C", 0x2F87D: "CJK COMPATIBILITY IDEOGRAPH-2F87D", 0x2F87E: "CJK COMPATIBILITY IDEOGRAPH-2F87E", 0x2F87F: "CJK COMPATIBILITY IDEOGRAPH-2F87F", 0x2F880: "CJK COMPATIBILITY IDEOGRAPH-2F880", 0x2F881: "CJK COMPATIBILITY IDEOGRAPH-2F881", 0x2F882: "CJK COMPATIBILITY IDEOGRAPH-2F882", 0x2F883: "CJK COMPATIBILITY IDEOGRAPH-2F883", 0x2F884: "CJK COMPATIBILITY IDEOGRAPH-2F884", 0x2F885: "CJK COMPATIBILITY IDEOGRAPH-2F885", 0x2F886: "CJK COMPATIBILITY IDEOGRAPH-2F886", 0x2F887: "CJK COMPATIBILITY IDEOGRAPH-2F887", 0x2F888: "CJK COMPATIBILITY IDEOGRAPH-2F888", 0x2F889: "CJK COMPATIBILITY IDEOGRAPH-2F889", 0x2F88A: "CJK COMPATIBILITY IDEOGRAPH-2F88A", 0x2F88B: "CJK COMPATIBILITY IDEOGRAPH-2F88B", 0x2F88C: "CJK COMPATIBILITY IDEOGRAPH-2F88C", 0x2F88D: "CJK COMPATIBILITY IDEOGRAPH-2F88D", 0x2F88E: "CJK COMPATIBILITY IDEOGRAPH-2F88E", 0x2F88F: "CJK COMPATIBILITY IDEOGRAPH-2F88F", 0x2F890: "CJK COMPATIBILITY IDEOGRAPH-2F890", 0x2F891: "CJK COMPATIBILITY IDEOGRAPH-2F891", 0x2F892: "CJK COMPATIBILITY IDEOGRAPH-2F892", 0x2F893: "CJK COMPATIBILITY IDEOGRAPH-2F893", 0x2F894: "CJK COMPATIBILITY IDEOGRAPH-2F894", 0x2F895: "CJK COMPATIBILITY IDEOGRAPH-2F895", 0x2F896: "CJK COMPATIBILITY IDEOGRAPH-2F896", 0x2F897: "CJK COMPATIBILITY IDEOGRAPH-2F897", 0x2F898: "CJK COMPATIBILITY IDEOGRAPH-2F898", 0x2F899: "CJK COMPATIBILITY IDEOGRAPH-2F899", 0x2F89A: "CJK COMPATIBILITY IDEOGRAPH-2F89A", 0x2F89B: "CJK COMPATIBILITY IDEOGRAPH-2F89B", 0x2F89C: "CJK COMPATIBILITY IDEOGRAPH-2F89C", 0x2F89D: "CJK COMPATIBILITY IDEOGRAPH-2F89D", 0x2F89E: "CJK COMPATIBILITY IDEOGRAPH-2F89E", 0x2F89F: "CJK COMPATIBILITY IDEOGRAPH-2F89F", 0x2F8A0: "CJK COMPATIBILITY IDEOGRAPH-2F8A0", 0x2F8A1: "CJK COMPATIBILITY IDEOGRAPH-2F8A1", 0x2F8A2: "CJK COMPATIBILITY IDEOGRAPH-2F8A2", 0x2F8A3: "CJK COMPATIBILITY IDEOGRAPH-2F8A3", 0x2F8A4: "CJK COMPATIBILITY IDEOGRAPH-2F8A4", 0x2F8A5: "CJK COMPATIBILITY IDEOGRAPH-2F8A5", 0x2F8A6: "CJK COMPATIBILITY IDEOGRAPH-2F8A6", 0x2F8A7: "CJK COMPATIBILITY IDEOGRAPH-2F8A7", 0x2F8A8: "CJK COMPATIBILITY IDEOGRAPH-2F8A8", 0x2F8A9: "CJK COMPATIBILITY IDEOGRAPH-2F8A9", 0x2F8AA: "CJK COMPATIBILITY IDEOGRAPH-2F8AA", 0x2F8AB: "CJK COMPATIBILITY IDEOGRAPH-2F8AB", 0x2F8AC: "CJK COMPATIBILITY IDEOGRAPH-2F8AC", 0x2F8AD: "CJK COMPATIBILITY IDEOGRAPH-2F8AD", 0x2F8AE: "CJK COMPATIBILITY IDEOGRAPH-2F8AE", 0x2F8AF: "CJK COMPATIBILITY IDEOGRAPH-2F8AF", 0x2F8B0: "CJK COMPATIBILITY IDEOGRAPH-2F8B0", 0x2F8B1: "CJK COMPATIBILITY IDEOGRAPH-2F8B1", 0x2F8B2: "CJK COMPATIBILITY IDEOGRAPH-2F8B2", 0x2F8B3: "CJK COMPATIBILITY IDEOGRAPH-2F8B3", 0x2F8B4: "CJK COMPATIBILITY IDEOGRAPH-2F8B4", 0x2F8B5: "CJK COMPATIBILITY IDEOGRAPH-2F8B5", 0x2F8B6: "CJK COMPATIBILITY IDEOGRAPH-2F8B6", 0x2F8B7: "CJK COMPATIBILITY IDEOGRAPH-2F8B7", 0x2F8B8: "CJK COMPATIBILITY IDEOGRAPH-2F8B8", 0x2F8B9: "CJK COMPATIBILITY IDEOGRAPH-2F8B9", 0x2F8BA: "CJK COMPATIBILITY IDEOGRAPH-2F8BA", 0x2F8BB: "CJK COMPATIBILITY IDEOGRAPH-2F8BB", 0x2F8BC: "CJK COMPATIBILITY IDEOGRAPH-2F8BC", 0x2F8BD: "CJK COMPATIBILITY IDEOGRAPH-2F8BD", 0x2F8BE: "CJK COMPATIBILITY IDEOGRAPH-2F8BE", 0x2F8BF: "CJK COMPATIBILITY IDEOGRAPH-2F8BF", 0x2F8C0: "CJK COMPATIBILITY IDEOGRAPH-2F8C0", 0x2F8C1: "CJK COMPATIBILITY IDEOGRAPH-2F8C1", 0x2F8C2: "CJK COMPATIBILITY IDEOGRAPH-2F8C2", 0x2F8C3: "CJK COMPATIBILITY IDEOGRAPH-2F8C3", 0x2F8C4: "CJK COMPATIBILITY IDEOGRAPH-2F8C4", 0x2F8C5: "CJK COMPATIBILITY IDEOGRAPH-2F8C5", 0x2F8C6: "CJK COMPATIBILITY IDEOGRAPH-2F8C6", 0x2F8C7: "CJK COMPATIBILITY IDEOGRAPH-2F8C7", 0x2F8C8: "CJK COMPATIBILITY IDEOGRAPH-2F8C8", 0x2F8C9: "CJK COMPATIBILITY IDEOGRAPH-2F8C9", 0x2F8CA: "CJK COMPATIBILITY IDEOGRAPH-2F8CA", 0x2F8CB: "CJK COMPATIBILITY IDEOGRAPH-2F8CB", 0x2F8CC: "CJK COMPATIBILITY IDEOGRAPH-2F8CC", 0x2F8CD: "CJK COMPATIBILITY IDEOGRAPH-2F8CD", 0x2F8CE: "CJK COMPATIBILITY IDEOGRAPH-2F8CE", 0x2F8CF: "CJK COMPATIBILITY IDEOGRAPH-2F8CF", 0x2F8D0: "CJK COMPATIBILITY IDEOGRAPH-2F8D0", 0x2F8D1: "CJK COMPATIBILITY IDEOGRAPH-2F8D1", 0x2F8D2: "CJK COMPATIBILITY IDEOGRAPH-2F8D2", 0x2F8D3: "CJK COMPATIBILITY IDEOGRAPH-2F8D3", 0x2F8D4: "CJK COMPATIBILITY IDEOGRAPH-2F8D4", 0x2F8D5: "CJK COMPATIBILITY IDEOGRAPH-2F8D5", 0x2F8D6: "CJK COMPATIBILITY IDEOGRAPH-2F8D6", 0x2F8D7: "CJK COMPATIBILITY IDEOGRAPH-2F8D7", 0x2F8D8: "CJK COMPATIBILITY IDEOGRAPH-2F8D8", 0x2F8D9: "CJK COMPATIBILITY IDEOGRAPH-2F8D9", 0x2F8DA: "CJK COMPATIBILITY IDEOGRAPH-2F8DA", 0x2F8DB: "CJK COMPATIBILITY IDEOGRAPH-2F8DB", 0x2F8DC: "CJK COMPATIBILITY IDEOGRAPH-2F8DC", 0x2F8DD: "CJK COMPATIBILITY IDEOGRAPH-2F8DD", 0x2F8DE: "CJK COMPATIBILITY IDEOGRAPH-2F8DE", 0x2F8DF: "CJK COMPATIBILITY IDEOGRAPH-2F8DF", 0x2F8E0: "CJK COMPATIBILITY IDEOGRAPH-2F8E0", 0x2F8E1: "CJK COMPATIBILITY IDEOGRAPH-2F8E1", 0x2F8E2: "CJK COMPATIBILITY IDEOGRAPH-2F8E2", 0x2F8E3: "CJK COMPATIBILITY IDEOGRAPH-2F8E3", 0x2F8E4: "CJK COMPATIBILITY IDEOGRAPH-2F8E4", 0x2F8E5: "CJK COMPATIBILITY IDEOGRAPH-2F8E5", 0x2F8E6: "CJK COMPATIBILITY IDEOGRAPH-2F8E6", 0x2F8E7: "CJK COMPATIBILITY IDEOGRAPH-2F8E7", 0x2F8E8: "CJK COMPATIBILITY IDEOGRAPH-2F8E8", 0x2F8E9: "CJK COMPATIBILITY IDEOGRAPH-2F8E9", 0x2F8EA: "CJK COMPATIBILITY IDEOGRAPH-2F8EA", 0x2F8EB: "CJK COMPATIBILITY IDEOGRAPH-2F8EB", 0x2F8EC: "CJK COMPATIBILITY IDEOGRAPH-2F8EC", 0x2F8ED: "CJK COMPATIBILITY IDEOGRAPH-2F8ED", 0x2F8EE: "CJK COMPATIBILITY IDEOGRAPH-2F8EE", 0x2F8EF: "CJK COMPATIBILITY IDEOGRAPH-2F8EF", 0x2F8F0: "CJK COMPATIBILITY IDEOGRAPH-2F8F0", 0x2F8F1: "CJK COMPATIBILITY IDEOGRAPH-2F8F1", 0x2F8F2: "CJK COMPATIBILITY IDEOGRAPH-2F8F2", 0x2F8F3: "CJK COMPATIBILITY IDEOGRAPH-2F8F3", 0x2F8F4: "CJK COMPATIBILITY IDEOGRAPH-2F8F4", 0x2F8F5: "CJK COMPATIBILITY IDEOGRAPH-2F8F5", 0x2F8F6: "CJK COMPATIBILITY IDEOGRAPH-2F8F6", 0x2F8F7: "CJK COMPATIBILITY IDEOGRAPH-2F8F7", 0x2F8F8: "CJK COMPATIBILITY IDEOGRAPH-2F8F8", 0x2F8F9: "CJK COMPATIBILITY IDEOGRAPH-2F8F9", 0x2F8FA: "CJK COMPATIBILITY IDEOGRAPH-2F8FA", 0x2F8FB: "CJK COMPATIBILITY IDEOGRAPH-2F8FB", 0x2F8FC: "CJK COMPATIBILITY IDEOGRAPH-2F8FC", 0x2F8FD: "CJK COMPATIBILITY IDEOGRAPH-2F8FD", 0x2F8FE: "CJK COMPATIBILITY IDEOGRAPH-2F8FE", 0x2F8FF: "CJK COMPATIBILITY IDEOGRAPH-2F8FF", 0x2F900: "CJK COMPATIBILITY IDEOGRAPH-2F900", 0x2F901: "CJK COMPATIBILITY IDEOGRAPH-2F901", 0x2F902: "CJK COMPATIBILITY IDEOGRAPH-2F902", 0x2F903: "CJK COMPATIBILITY IDEOGRAPH-2F903", 0x2F904: "CJK COMPATIBILITY IDEOGRAPH-2F904", 0x2F905: "CJK COMPATIBILITY IDEOGRAPH-2F905", 0x2F906: "CJK COMPATIBILITY IDEOGRAPH-2F906", 0x2F907: "CJK COMPATIBILITY IDEOGRAPH-2F907", 0x2F908: "CJK COMPATIBILITY IDEOGRAPH-2F908", 0x2F909: "CJK COMPATIBILITY IDEOGRAPH-2F909", 0x2F90A: "CJK COMPATIBILITY IDEOGRAPH-2F90A", 0x2F90B: "CJK COMPATIBILITY IDEOGRAPH-2F90B", 0x2F90C: "CJK COMPATIBILITY IDEOGRAPH-2F90C", 0x2F90D: "CJK COMPATIBILITY IDEOGRAPH-2F90D", 0x2F90E: "CJK COMPATIBILITY IDEOGRAPH-2F90E", 0x2F90F: "CJK COMPATIBILITY IDEOGRAPH-2F90F", 0x2F910: "CJK COMPATIBILITY IDEOGRAPH-2F910", 0x2F911: "CJK COMPATIBILITY IDEOGRAPH-2F911", 0x2F912: "CJK COMPATIBILITY IDEOGRAPH-2F912", 0x2F913: "CJK COMPATIBILITY IDEOGRAPH-2F913", 0x2F914: "CJK COMPATIBILITY IDEOGRAPH-2F914", 0x2F915: "CJK COMPATIBILITY IDEOGRAPH-2F915", 0x2F916: "CJK COMPATIBILITY IDEOGRAPH-2F916", 0x2F917: "CJK COMPATIBILITY IDEOGRAPH-2F917", 0x2F918: "CJK COMPATIBILITY IDEOGRAPH-2F918", 0x2F919: "CJK COMPATIBILITY IDEOGRAPH-2F919", 0x2F91A: "CJK COMPATIBILITY IDEOGRAPH-2F91A", 0x2F91B: "CJK COMPATIBILITY IDEOGRAPH-2F91B", 0x2F91C: "CJK COMPATIBILITY IDEOGRAPH-2F91C", 0x2F91D: "CJK COMPATIBILITY IDEOGRAPH-2F91D", 0x2F91E: "CJK COMPATIBILITY IDEOGRAPH-2F91E", 0x2F91F: "CJK COMPATIBILITY IDEOGRAPH-2F91F", 0x2F920: "CJK COMPATIBILITY IDEOGRAPH-2F920", 0x2F921: "CJK COMPATIBILITY IDEOGRAPH-2F921", 0x2F922: "CJK COMPATIBILITY IDEOGRAPH-2F922", 0x2F923: "CJK COMPATIBILITY IDEOGRAPH-2F923", 0x2F924: "CJK COMPATIBILITY IDEOGRAPH-2F924", 0x2F925: "CJK COMPATIBILITY IDEOGRAPH-2F925", 0x2F926: "CJK COMPATIBILITY IDEOGRAPH-2F926", 0x2F927: "CJK COMPATIBILITY IDEOGRAPH-2F927", 0x2F928: "CJK COMPATIBILITY IDEOGRAPH-2F928", 0x2F929: "CJK COMPATIBILITY IDEOGRAPH-2F929", 0x2F92A: "CJK COMPATIBILITY IDEOGRAPH-2F92A", 0x2F92B: "CJK COMPATIBILITY IDEOGRAPH-2F92B", 0x2F92C: "CJK COMPATIBILITY IDEOGRAPH-2F92C", 0x2F92D: "CJK COMPATIBILITY IDEOGRAPH-2F92D", 0x2F92E: "CJK COMPATIBILITY IDEOGRAPH-2F92E", 0x2F92F: "CJK COMPATIBILITY IDEOGRAPH-2F92F", 0x2F930: "CJK COMPATIBILITY IDEOGRAPH-2F930", 0x2F931: "CJK COMPATIBILITY IDEOGRAPH-2F931", 0x2F932: "CJK COMPATIBILITY IDEOGRAPH-2F932", 0x2F933: "CJK COMPATIBILITY IDEOGRAPH-2F933", 0x2F934: "CJK COMPATIBILITY IDEOGRAPH-2F934", 0x2F935: "CJK COMPATIBILITY IDEOGRAPH-2F935", 0x2F936: "CJK COMPATIBILITY IDEOGRAPH-2F936", 0x2F937: "CJK COMPATIBILITY IDEOGRAPH-2F937", 0x2F938: "CJK COMPATIBILITY IDEOGRAPH-2F938", 0x2F939: "CJK COMPATIBILITY IDEOGRAPH-2F939", 0x2F93A: "CJK COMPATIBILITY IDEOGRAPH-2F93A", 0x2F93B: "CJK COMPATIBILITY IDEOGRAPH-2F93B", 0x2F93C: "CJK COMPATIBILITY IDEOGRAPH-2F93C", 0x2F93D: "CJK COMPATIBILITY IDEOGRAPH-2F93D", 0x2F93E: "CJK COMPATIBILITY IDEOGRAPH-2F93E", 0x2F93F: "CJK COMPATIBILITY IDEOGRAPH-2F93F", 0x2F940: "CJK COMPATIBILITY IDEOGRAPH-2F940", 0x2F941: "CJK COMPATIBILITY IDEOGRAPH-2F941", 0x2F942: "CJK COMPATIBILITY IDEOGRAPH-2F942", 0x2F943: "CJK COMPATIBILITY IDEOGRAPH-2F943", 0x2F944: "CJK COMPATIBILITY IDEOGRAPH-2F944", 0x2F945: "CJK COMPATIBILITY IDEOGRAPH-2F945", 0x2F946: "CJK COMPATIBILITY IDEOGRAPH-2F946", 0x2F947: "CJK COMPATIBILITY IDEOGRAPH-2F947", 0x2F948: "CJK COMPATIBILITY IDEOGRAPH-2F948", 0x2F949: "CJK COMPATIBILITY IDEOGRAPH-2F949", 0x2F94A: "CJK COMPATIBILITY IDEOGRAPH-2F94A", 0x2F94B: "CJK COMPATIBILITY IDEOGRAPH-2F94B", 0x2F94C: "CJK COMPATIBILITY IDEOGRAPH-2F94C", 0x2F94D: "CJK COMPATIBILITY IDEOGRAPH-2F94D", 0x2F94E: "CJK COMPATIBILITY IDEOGRAPH-2F94E", 0x2F94F: "CJK COMPATIBILITY IDEOGRAPH-2F94F", 0x2F950: "CJK COMPATIBILITY IDEOGRAPH-2F950", 0x2F951: "CJK COMPATIBILITY IDEOGRAPH-2F951", 0x2F952: "CJK COMPATIBILITY IDEOGRAPH-2F952", 0x2F953: "CJK COMPATIBILITY IDEOGRAPH-2F953", 0x2F954: "CJK COMPATIBILITY IDEOGRAPH-2F954", 0x2F955: "CJK COMPATIBILITY IDEOGRAPH-2F955", 0x2F956: "CJK COMPATIBILITY IDEOGRAPH-2F956", 0x2F957: "CJK COMPATIBILITY IDEOGRAPH-2F957", 0x2F958: "CJK COMPATIBILITY IDEOGRAPH-2F958", 0x2F959: "CJK COMPATIBILITY IDEOGRAPH-2F959", 0x2F95A: "CJK COMPATIBILITY IDEOGRAPH-2F95A", 0x2F95B: "CJK COMPATIBILITY IDEOGRAPH-2F95B", 0x2F95C: "CJK COMPATIBILITY IDEOGRAPH-2F95C", 0x2F95D: "CJK COMPATIBILITY IDEOGRAPH-2F95D", 0x2F95E: "CJK COMPATIBILITY IDEOGRAPH-2F95E", 0x2F95F: "CJK COMPATIBILITY IDEOGRAPH-2F95F", 0x2F960: "CJK COMPATIBILITY IDEOGRAPH-2F960", 0x2F961: "CJK COMPATIBILITY IDEOGRAPH-2F961", 0x2F962: "CJK COMPATIBILITY IDEOGRAPH-2F962", 0x2F963: "CJK COMPATIBILITY IDEOGRAPH-2F963", 0x2F964: "CJK COMPATIBILITY IDEOGRAPH-2F964", 0x2F965: "CJK COMPATIBILITY IDEOGRAPH-2F965", 0x2F966: "CJK COMPATIBILITY IDEOGRAPH-2F966", 0x2F967: "CJK COMPATIBILITY IDEOGRAPH-2F967", 0x2F968: "CJK COMPATIBILITY IDEOGRAPH-2F968", 0x2F969: "CJK COMPATIBILITY IDEOGRAPH-2F969", 0x2F96A: "CJK COMPATIBILITY IDEOGRAPH-2F96A", 0x2F96B: "CJK COMPATIBILITY IDEOGRAPH-2F96B", 0x2F96C: "CJK COMPATIBILITY IDEOGRAPH-2F96C", 0x2F96D: "CJK COMPATIBILITY IDEOGRAPH-2F96D", 0x2F96E: "CJK COMPATIBILITY IDEOGRAPH-2F96E", 0x2F96F: "CJK COMPATIBILITY IDEOGRAPH-2F96F", 0x2F970: "CJK COMPATIBILITY IDEOGRAPH-2F970", 0x2F971: "CJK COMPATIBILITY IDEOGRAPH-2F971", 0x2F972: "CJK COMPATIBILITY IDEOGRAPH-2F972", 0x2F973: "CJK COMPATIBILITY IDEOGRAPH-2F973", 0x2F974: "CJK COMPATIBILITY IDEOGRAPH-2F974", 0x2F975: "CJK COMPATIBILITY IDEOGRAPH-2F975", 0x2F976: "CJK COMPATIBILITY IDEOGRAPH-2F976", 0x2F977: "CJK COMPATIBILITY IDEOGRAPH-2F977", 0x2F978: "CJK COMPATIBILITY IDEOGRAPH-2F978", 0x2F979: "CJK COMPATIBILITY IDEOGRAPH-2F979", 0x2F97A: "CJK COMPATIBILITY IDEOGRAPH-2F97A", 0x2F97B: "CJK COMPATIBILITY IDEOGRAPH-2F97B", 0x2F97C: "CJK COMPATIBILITY IDEOGRAPH-2F97C", 0x2F97D: "CJK COMPATIBILITY IDEOGRAPH-2F97D", 0x2F97E: "CJK COMPATIBILITY IDEOGRAPH-2F97E", 0x2F97F: "CJK COMPATIBILITY IDEOGRAPH-2F97F", 0x2F980: "CJK COMPATIBILITY IDEOGRAPH-2F980", 0x2F981: "CJK COMPATIBILITY IDEOGRAPH-2F981", 0x2F982: "CJK COMPATIBILITY IDEOGRAPH-2F982", 0x2F983: "CJK COMPATIBILITY IDEOGRAPH-2F983", 0x2F984: "CJK COMPATIBILITY IDEOGRAPH-2F984", 0x2F985: "CJK COMPATIBILITY IDEOGRAPH-2F985", 0x2F986: "CJK COMPATIBILITY IDEOGRAPH-2F986", 0x2F987: "CJK COMPATIBILITY IDEOGRAPH-2F987", 0x2F988: "CJK COMPATIBILITY IDEOGRAPH-2F988", 0x2F989: "CJK COMPATIBILITY IDEOGRAPH-2F989", 0x2F98A: "CJK COMPATIBILITY IDEOGRAPH-2F98A", 0x2F98B: "CJK COMPATIBILITY IDEOGRAPH-2F98B", 0x2F98C: "CJK COMPATIBILITY IDEOGRAPH-2F98C", 0x2F98D: "CJK COMPATIBILITY IDEOGRAPH-2F98D", 0x2F98E: "CJK COMPATIBILITY IDEOGRAPH-2F98E", 0x2F98F: "CJK COMPATIBILITY IDEOGRAPH-2F98F", 0x2F990: "CJK COMPATIBILITY IDEOGRAPH-2F990", 0x2F991: "CJK COMPATIBILITY IDEOGRAPH-2F991", 0x2F992: "CJK COMPATIBILITY IDEOGRAPH-2F992", 0x2F993: "CJK COMPATIBILITY IDEOGRAPH-2F993", 0x2F994: "CJK COMPATIBILITY IDEOGRAPH-2F994", 0x2F995: "CJK COMPATIBILITY IDEOGRAPH-2F995", 0x2F996: "CJK COMPATIBILITY IDEOGRAPH-2F996", 0x2F997: "CJK COMPATIBILITY IDEOGRAPH-2F997", 0x2F998: "CJK COMPATIBILITY IDEOGRAPH-2F998", 0x2F999: "CJK COMPATIBILITY IDEOGRAPH-2F999", 0x2F99A: "CJK COMPATIBILITY IDEOGRAPH-2F99A", 0x2F99B: "CJK COMPATIBILITY IDEOGRAPH-2F99B", 0x2F99C: "CJK COMPATIBILITY IDEOGRAPH-2F99C", 0x2F99D: "CJK COMPATIBILITY IDEOGRAPH-2F99D", 0x2F99E: "CJK COMPATIBILITY IDEOGRAPH-2F99E", 0x2F99F: "CJK COMPATIBILITY IDEOGRAPH-2F99F", 0x2F9A0: "CJK COMPATIBILITY IDEOGRAPH-2F9A0", 0x2F9A1: "CJK COMPATIBILITY IDEOGRAPH-2F9A1", 0x2F9A2: "CJK COMPATIBILITY IDEOGRAPH-2F9A2", 0x2F9A3: "CJK COMPATIBILITY IDEOGRAPH-2F9A3", 0x2F9A4: "CJK COMPATIBILITY IDEOGRAPH-2F9A4", 0x2F9A5: "CJK COMPATIBILITY IDEOGRAPH-2F9A5", 0x2F9A6: "CJK COMPATIBILITY IDEOGRAPH-2F9A6", 0x2F9A7: "CJK COMPATIBILITY IDEOGRAPH-2F9A7", 0x2F9A8: "CJK COMPATIBILITY IDEOGRAPH-2F9A8", 0x2F9A9: "CJK COMPATIBILITY IDEOGRAPH-2F9A9", 0x2F9AA: "CJK COMPATIBILITY IDEOGRAPH-2F9AA", 0x2F9AB: "CJK COMPATIBILITY IDEOGRAPH-2F9AB", 0x2F9AC: "CJK COMPATIBILITY IDEOGRAPH-2F9AC", 0x2F9AD: "CJK COMPATIBILITY IDEOGRAPH-2F9AD", 0x2F9AE: "CJK COMPATIBILITY IDEOGRAPH-2F9AE", 0x2F9AF: "CJK COMPATIBILITY IDEOGRAPH-2F9AF", 0x2F9B0: "CJK COMPATIBILITY IDEOGRAPH-2F9B0", 0x2F9B1: "CJK COMPATIBILITY IDEOGRAPH-2F9B1", 0x2F9B2: "CJK COMPATIBILITY IDEOGRAPH-2F9B2", 0x2F9B3: "CJK COMPATIBILITY IDEOGRAPH-2F9B3", 0x2F9B4: "CJK COMPATIBILITY IDEOGRAPH-2F9B4", 0x2F9B5: "CJK COMPATIBILITY IDEOGRAPH-2F9B5", 0x2F9B6: "CJK COMPATIBILITY IDEOGRAPH-2F9B6", 0x2F9B7: "CJK COMPATIBILITY IDEOGRAPH-2F9B7", 0x2F9B8: "CJK COMPATIBILITY IDEOGRAPH-2F9B8", 0x2F9B9: "CJK COMPATIBILITY IDEOGRAPH-2F9B9", 0x2F9BA: "CJK COMPATIBILITY IDEOGRAPH-2F9BA", 0x2F9BB: "CJK COMPATIBILITY IDEOGRAPH-2F9BB", 0x2F9BC: "CJK COMPATIBILITY IDEOGRAPH-2F9BC", 0x2F9BD: "CJK COMPATIBILITY IDEOGRAPH-2F9BD", 0x2F9BE: "CJK COMPATIBILITY IDEOGRAPH-2F9BE", 0x2F9BF: "CJK COMPATIBILITY IDEOGRAPH-2F9BF", 0x2F9C0: "CJK COMPATIBILITY IDEOGRAPH-2F9C0", 0x2F9C1: "CJK COMPATIBILITY IDEOGRAPH-2F9C1", 0x2F9C2: "CJK COMPATIBILITY IDEOGRAPH-2F9C2", 0x2F9C3: "CJK COMPATIBILITY IDEOGRAPH-2F9C3", 0x2F9C4: "CJK COMPATIBILITY IDEOGRAPH-2F9C4", 0x2F9C5: "CJK COMPATIBILITY IDEOGRAPH-2F9C5", 0x2F9C6: "CJK COMPATIBILITY IDEOGRAPH-2F9C6", 0x2F9C7: "CJK COMPATIBILITY IDEOGRAPH-2F9C7", 0x2F9C8: "CJK COMPATIBILITY IDEOGRAPH-2F9C8", 0x2F9C9: "CJK COMPATIBILITY IDEOGRAPH-2F9C9", 0x2F9CA: "CJK COMPATIBILITY IDEOGRAPH-2F9CA", 0x2F9CB: "CJK COMPATIBILITY IDEOGRAPH-2F9CB", 0x2F9CC: "CJK COMPATIBILITY IDEOGRAPH-2F9CC", 0x2F9CD: "CJK COMPATIBILITY IDEOGRAPH-2F9CD", 0x2F9CE: "CJK COMPATIBILITY IDEOGRAPH-2F9CE", 0x2F9CF: "CJK COMPATIBILITY IDEOGRAPH-2F9CF", 0x2F9D0: "CJK COMPATIBILITY IDEOGRAPH-2F9D0", 0x2F9D1: "CJK COMPATIBILITY IDEOGRAPH-2F9D1", 0x2F9D2: "CJK COMPATIBILITY IDEOGRAPH-2F9D2", 0x2F9D3: "CJK COMPATIBILITY IDEOGRAPH-2F9D3", 0x2F9D4: "CJK COMPATIBILITY IDEOGRAPH-2F9D4", 0x2F9D5: "CJK COMPATIBILITY IDEOGRAPH-2F9D5", 0x2F9D6: "CJK COMPATIBILITY IDEOGRAPH-2F9D6", 0x2F9D7: "CJK COMPATIBILITY IDEOGRAPH-2F9D7", 0x2F9D8: "CJK COMPATIBILITY IDEOGRAPH-2F9D8", 0x2F9D9: "CJK COMPATIBILITY IDEOGRAPH-2F9D9", 0x2F9DA: "CJK COMPATIBILITY IDEOGRAPH-2F9DA", 0x2F9DB: "CJK COMPATIBILITY IDEOGRAPH-2F9DB", 0x2F9DC: "CJK COMPATIBILITY IDEOGRAPH-2F9DC", 0x2F9DD: "CJK COMPATIBILITY IDEOGRAPH-2F9DD", 0x2F9DE: "CJK COMPATIBILITY IDEOGRAPH-2F9DE", 0x2F9DF: "CJK COMPATIBILITY IDEOGRAPH-2F9DF", 0x2F9E0: "CJK COMPATIBILITY IDEOGRAPH-2F9E0", 0x2F9E1: "CJK COMPATIBILITY IDEOGRAPH-2F9E1", 0x2F9E2: "CJK COMPATIBILITY IDEOGRAPH-2F9E2", 0x2F9E3: "CJK COMPATIBILITY IDEOGRAPH-2F9E3", 0x2F9E4: "CJK COMPATIBILITY IDEOGRAPH-2F9E4", 0x2F9E5: "CJK COMPATIBILITY IDEOGRAPH-2F9E5", 0x2F9E6: "CJK COMPATIBILITY IDEOGRAPH-2F9E6", 0x2F9E7: "CJK COMPATIBILITY IDEOGRAPH-2F9E7", 0x2F9E8: "CJK COMPATIBILITY IDEOGRAPH-2F9E8", 0x2F9E9: "CJK COMPATIBILITY IDEOGRAPH-2F9E9", 0x2F9EA: "CJK COMPATIBILITY IDEOGRAPH-2F9EA", 0x2F9EB: "CJK COMPATIBILITY IDEOGRAPH-2F9EB", 0x2F9EC: "CJK COMPATIBILITY IDEOGRAPH-2F9EC", 0x2F9ED: "CJK COMPATIBILITY IDEOGRAPH-2F9ED", 0x2F9EE: "CJK COMPATIBILITY IDEOGRAPH-2F9EE", 0x2F9EF: "CJK COMPATIBILITY IDEOGRAPH-2F9EF", 0x2F9F0: "CJK COMPATIBILITY IDEOGRAPH-2F9F0", 0x2F9F1: "CJK COMPATIBILITY IDEOGRAPH-2F9F1", 0x2F9F2: "CJK COMPATIBILITY IDEOGRAPH-2F9F2", 0x2F9F3: "CJK COMPATIBILITY IDEOGRAPH-2F9F3", 0x2F9F4: "CJK COMPATIBILITY IDEOGRAPH-2F9F4", 0x2F9F5: "CJK COMPATIBILITY IDEOGRAPH-2F9F5", 0x2F9F6: "CJK COMPATIBILITY IDEOGRAPH-2F9F6", 0x2F9F7: "CJK COMPATIBILITY IDEOGRAPH-2F9F7", 0x2F9F8: "CJK COMPATIBILITY IDEOGRAPH-2F9F8", 0x2F9F9: "CJK COMPATIBILITY IDEOGRAPH-2F9F9", 0x2F9FA: "CJK COMPATIBILITY IDEOGRAPH-2F9FA", 0x2F9FB: "CJK COMPATIBILITY IDEOGRAPH-2F9FB", 0x2F9FC: "CJK COMPATIBILITY IDEOGRAPH-2F9FC", 0x2F9FD: "CJK COMPATIBILITY IDEOGRAPH-2F9FD", 0x2F9FE: "CJK COMPATIBILITY IDEOGRAPH-2F9FE", 0x2F9FF: "CJK COMPATIBILITY IDEOGRAPH-2F9FF", 0x2FA00: "CJK COMPATIBILITY IDEOGRAPH-2FA00", 0x2FA01: "CJK COMPATIBILITY IDEOGRAPH-2FA01", 0x2FA02: "CJK COMPATIBILITY IDEOGRAPH-2FA02", 0x2FA03: "CJK COMPATIBILITY IDEOGRAPH-2FA03", 0x2FA04: "CJK COMPATIBILITY IDEOGRAPH-2FA04", 0x2FA05: "CJK COMPATIBILITY IDEOGRAPH-2FA05", 0x2FA06: "CJK COMPATIBILITY IDEOGRAPH-2FA06", 0x2FA07: "CJK COMPATIBILITY IDEOGRAPH-2FA07", 0x2FA08: "CJK COMPATIBILITY IDEOGRAPH-2FA08", 0x2FA09: "CJK COMPATIBILITY IDEOGRAPH-2FA09", 0x2FA0A: "CJK COMPATIBILITY IDEOGRAPH-2FA0A", 0x2FA0B: "CJK COMPATIBILITY IDEOGRAPH-2FA0B", 0x2FA0C: "CJK COMPATIBILITY IDEOGRAPH-2FA0C", 0x2FA0D: "CJK COMPATIBILITY IDEOGRAPH-2FA0D", 0x2FA0E: "CJK COMPATIBILITY IDEOGRAPH-2FA0E", 0x2FA0F: "CJK COMPATIBILITY IDEOGRAPH-2FA0F", 0x2FA10: "CJK COMPATIBILITY IDEOGRAPH-2FA10", 0x2FA11: "CJK COMPATIBILITY IDEOGRAPH-2FA11", 0x2FA12: "CJK COMPATIBILITY IDEOGRAPH-2FA12", 0x2FA13: "CJK COMPATIBILITY IDEOGRAPH-2FA13", 0x2FA14: "CJK COMPATIBILITY IDEOGRAPH-2FA14", 0x2FA15: "CJK COMPATIBILITY IDEOGRAPH-2FA15", 0x2FA16: "CJK COMPATIBILITY IDEOGRAPH-2FA16", 0x2FA17: "CJK COMPATIBILITY IDEOGRAPH-2FA17", 0x2FA18: "CJK COMPATIBILITY IDEOGRAPH-2FA18", 0x2FA19: "CJK COMPATIBILITY IDEOGRAPH-2FA19", 0x2FA1A: "CJK COMPATIBILITY IDEOGRAPH-2FA1A", 0x2FA1B: "CJK COMPATIBILITY IDEOGRAPH-2FA1B", 0x2FA1C: "CJK COMPATIBILITY IDEOGRAPH-2FA1C", 0x2FA1D: "CJK COMPATIBILITY IDEOGRAPH-2FA1D", 0x2FFFE: "", 0x2FFFF: "", 0x3FFFE: "", 0x3FFFF: "", 0x4FFFE: "", 0x4FFFF: "", 0x5FFFE: "", 0x5FFFF: "", 0x6FFFE: "", 0x6FFFF: "", 0x7FFFE: "", 0x7FFFF: "", 0x8FFFE: "", 0x8FFFF: "", 0x9FFFE: "", 0x9FFFF: "", 0xAFFFE: "", 0xAFFFF: "", 0xBFFFE: "", 0xBFFFF: "", 0xCFFFE: "", 0xCFFFF: "", 0xDFFFE: "", 0xDFFFF: "", 0xE0001: "LANGUAGE TAG", 0xE0020: "TAG SPACE", 0xE0021: "TAG EXCLAMATION MARK", 0xE0022: "TAG QUOTATION MARK", 0xE0023: "TAG NUMBER SIGN", 0xE0024: "TAG DOLLAR SIGN", 0xE0025: "TAG PERCENT SIGN", 0xE0026: "TAG AMPERSAND", 0xE0027: "TAG APOSTROPHE", 0xE0028: "TAG LEFT PARENTHESIS", 0xE0029: "TAG RIGHT PARENTHESIS", 0xE002A: "TAG ASTERISK", 0xE002B: "TAG PLUS SIGN", 0xE002C: "TAG COMMA", 0xE002D: "TAG HYPHEN-MINUS", 0xE002E: "TAG FULL STOP", 0xE002F: "TAG SOLIDUS", 0xE0030: "TAG DIGIT ZERO", 0xE0031: "TAG DIGIT ONE", 0xE0032: "TAG DIGIT TWO", 0xE0033: "TAG DIGIT THREE", 0xE0034: "TAG DIGIT FOUR", 0xE0035: "TAG DIGIT FIVE", 0xE0036: "TAG DIGIT SIX", 0xE0037: "TAG DIGIT SEVEN", 0xE0038: "TAG DIGIT EIGHT", 0xE0039: "TAG DIGIT NINE", 0xE003A: "TAG COLON", 0xE003B: "TAG SEMICOLON", 0xE003C: "TAG LESS-THAN SIGN", 0xE003D: "TAG EQUALS SIGN", 0xE003E: "TAG GREATER-THAN SIGN", 0xE003F: "TAG QUESTION MARK", 0xE0040: "TAG COMMERCIAL AT", 0xE0041: "TAG LATIN CAPITAL LETTER A", 0xE0042: "TAG LATIN CAPITAL LETTER B", 0xE0043: "TAG LATIN CAPITAL LETTER C", 0xE0044: "TAG LATIN CAPITAL LETTER D", 0xE0045: "TAG LATIN CAPITAL LETTER E", 0xE0046: "TAG LATIN CAPITAL LETTER F", 0xE0047: "TAG LATIN CAPITAL LETTER G", 0xE0048: "TAG LATIN CAPITAL LETTER H", 0xE0049: "TAG LATIN CAPITAL LETTER I", 0xE004A: "TAG LATIN CAPITAL LETTER J", 0xE004B: "TAG LATIN CAPITAL LETTER K", 0xE004C: "TAG LATIN CAPITAL LETTER L", 0xE004D: "TAG LATIN CAPITAL LETTER M", 0xE004E: "TAG LATIN CAPITAL LETTER N", 0xE004F: "TAG LATIN CAPITAL LETTER O", 0xE0050: "TAG LATIN CAPITAL LETTER P", 0xE0051: "TAG LATIN CAPITAL LETTER Q", 0xE0052: "TAG LATIN CAPITAL LETTER R", 0xE0053: "TAG LATIN CAPITAL LETTER S", 0xE0054: "TAG LATIN CAPITAL LETTER T", 0xE0055: "TAG LATIN CAPITAL LETTER U", 0xE0056: "TAG LATIN CAPITAL LETTER V", 0xE0057: "TAG LATIN CAPITAL LETTER W", 0xE0058: "TAG LATIN CAPITAL LETTER X", 0xE0059: "TAG LATIN CAPITAL LETTER Y", 0xE005A: "TAG LATIN CAPITAL LETTER Z", 0xE005B: "TAG LEFT SQUARE BRACKET", 0xE005C: "TAG REVERSE SOLIDUS", 0xE005D: "TAG RIGHT SQUARE BRACKET", 0xE005E: "TAG CIRCUMFLEX ACCENT", 0xE005F: "TAG LOW LINE", 0xE0060: "TAG GRAVE ACCENT", 0xE0061: "TAG LATIN SMALL LETTER A", 0xE0062: "TAG LATIN SMALL LETTER B", 0xE0063: "TAG LATIN SMALL LETTER C", 0xE0064: "TAG LATIN SMALL LETTER D", 0xE0065: "TAG LATIN SMALL LETTER E", 0xE0066: "TAG LATIN SMALL LETTER F", 0xE0067: "TAG LATIN SMALL LETTER G", 0xE0068: "TAG LATIN SMALL LETTER H", 0xE0069: "TAG LATIN SMALL LETTER I", 0xE006A: "TAG LATIN SMALL LETTER J", 0xE006B: "TAG LATIN SMALL LETTER K", 0xE006C: "TAG LATIN SMALL LETTER L", 0xE006D: "TAG LATIN SMALL LETTER M", 0xE006E: "TAG LATIN SMALL LETTER N", 0xE006F: "TAG LATIN SMALL LETTER O", 0xE0070: "TAG LATIN SMALL LETTER P", 0xE0071: "TAG LATIN SMALL LETTER Q", 0xE0072: "TAG LATIN SMALL LETTER R", 0xE0073: "TAG LATIN SMALL LETTER S", 0xE0074: "TAG LATIN SMALL LETTER T", 0xE0075: "TAG LATIN SMALL LETTER U", 0xE0076: "TAG LATIN SMALL LETTER V", 0xE0077: "TAG LATIN SMALL LETTER W", 0xE0078: "TAG LATIN SMALL LETTER X", 0xE0079: "TAG LATIN SMALL LETTER Y", 0xE007A: "TAG LATIN SMALL LETTER Z", 0xE007B: "TAG LEFT CURLY BRACKET", 0xE007C: "TAG VERTICAL LINE", 0xE007D: "TAG RIGHT CURLY BRACKET", 0xE007E: "TAG TILDE", 0xE007F: "CANCEL TAG", 0xE0100: "VARIATION SELECTOR-17", 0xE0101: "VARIATION SELECTOR-18", 0xE0102: "VARIATION SELECTOR-19", 0xE0103: "VARIATION SELECTOR-20", 0xE0104: "VARIATION SELECTOR-21", 0xE0105: "VARIATION SELECTOR-22", 0xE0106: "VARIATION SELECTOR-23", 0xE0107: "VARIATION SELECTOR-24", 0xE0108: "VARIATION SELECTOR-25", 0xE0109: "VARIATION SELECTOR-26", 0xE010A: "VARIATION SELECTOR-27", 0xE010B: "VARIATION SELECTOR-28", 0xE010C: "VARIATION SELECTOR-29", 0xE010D: "VARIATION SELECTOR-30", 0xE010E: "VARIATION SELECTOR-31", 0xE010F: "VARIATION SELECTOR-32", 0xE0110: "VARIATION SELECTOR-33", 0xE0111: "VARIATION SELECTOR-34", 0xE0112: "VARIATION SELECTOR-35", 0xE0113: "VARIATION SELECTOR-36", 0xE0114: "VARIATION SELECTOR-37", 0xE0115: "VARIATION SELECTOR-38", 0xE0116: "VARIATION SELECTOR-39", 0xE0117: "VARIATION SELECTOR-40", 0xE0118: "VARIATION SELECTOR-41", 0xE0119: "VARIATION SELECTOR-42", 0xE011A: "VARIATION SELECTOR-43", 0xE011B: "VARIATION SELECTOR-44", 0xE011C: "VARIATION SELECTOR-45", 0xE011D: "VARIATION SELECTOR-46", 0xE011E: "VARIATION SELECTOR-47", 0xE011F: "VARIATION SELECTOR-48", 0xE0120: "VARIATION SELECTOR-49", 0xE0121: "VARIATION SELECTOR-50", 0xE0122: "VARIATION SELECTOR-51", 0xE0123: "VARIATION SELECTOR-52", 0xE0124: "VARIATION SELECTOR-53", 0xE0125: "VARIATION SELECTOR-54", 0xE0126: "VARIATION SELECTOR-55", 0xE0127: "VARIATION SELECTOR-56", 0xE0128: "VARIATION SELECTOR-57", 0xE0129: "VARIATION SELECTOR-58", 0xE012A: "VARIATION SELECTOR-59", 0xE012B: "VARIATION SELECTOR-60", 0xE012C: "VARIATION SELECTOR-61", 0xE012D: "VARIATION SELECTOR-62", 0xE012E: "VARIATION SELECTOR-63", 0xE012F: "VARIATION SELECTOR-64", 0xE0130: "VARIATION SELECTOR-65", 0xE0131: "VARIATION SELECTOR-66", 0xE0132: "VARIATION SELECTOR-67", 0xE0133: "VARIATION SELECTOR-68", 0xE0134: "VARIATION SELECTOR-69", 0xE0135: "VARIATION SELECTOR-70", 0xE0136: "VARIATION SELECTOR-71", 0xE0137: "VARIATION SELECTOR-72", 0xE0138: "VARIATION SELECTOR-73", 0xE0139: "VARIATION SELECTOR-74", 0xE013A: "VARIATION SELECTOR-75", 0xE013B: "VARIATION SELECTOR-76", 0xE013C: "VARIATION SELECTOR-77", 0xE013D: "VARIATION SELECTOR-78", 0xE013E: "VARIATION SELECTOR-79", 0xE013F: "VARIATION SELECTOR-80", 0xE0140: "VARIATION SELECTOR-81", 0xE0141: "VARIATION SELECTOR-82", 0xE0142: "VARIATION SELECTOR-83", 0xE0143: "VARIATION SELECTOR-84", 0xE0144: "VARIATION SELECTOR-85", 0xE0145: "VARIATION SELECTOR-86", 0xE0146: "VARIATION SELECTOR-87", 0xE0147: "VARIATION SELECTOR-88", 0xE0148: "VARIATION SELECTOR-89", 0xE0149: "VARIATION SELECTOR-90", 0xE014A: "VARIATION SELECTOR-91", 0xE014B: "VARIATION SELECTOR-92", 0xE014C: "VARIATION SELECTOR-93", 0xE014D: "VARIATION SELECTOR-94", 0xE014E: "VARIATION SELECTOR-95", 0xE014F: "VARIATION SELECTOR-96", 0xE0150: "VARIATION SELECTOR-97", 0xE0151: "VARIATION SELECTOR-98", 0xE0152: "VARIATION SELECTOR-99", 0xE0153: "VARIATION SELECTOR-100", 0xE0154: "VARIATION SELECTOR-101", 0xE0155: "VARIATION SELECTOR-102", 0xE0156: "VARIATION SELECTOR-103", 0xE0157: "VARIATION SELECTOR-104", 0xE0158: "VARIATION SELECTOR-105", 0xE0159: "VARIATION SELECTOR-106", 0xE015A: "VARIATION SELECTOR-107", 0xE015B: "VARIATION SELECTOR-108", 0xE015C: "VARIATION SELECTOR-109", 0xE015D: "VARIATION SELECTOR-110", 0xE015E: "VARIATION SELECTOR-111", 0xE015F: "VARIATION SELECTOR-112", 0xE0160: "VARIATION SELECTOR-113", 0xE0161: "VARIATION SELECTOR-114", 0xE0162: "VARIATION SELECTOR-115", 0xE0163: "VARIATION SELECTOR-116", 0xE0164: "VARIATION SELECTOR-117", 0xE0165: "VARIATION SELECTOR-118", 0xE0166: "VARIATION SELECTOR-119", 0xE0167: "VARIATION SELECTOR-120", 0xE0168: "VARIATION SELECTOR-121", 0xE0169: "VARIATION SELECTOR-122", 0xE016A: "VARIATION SELECTOR-123", 0xE016B: "VARIATION SELECTOR-124", 0xE016C: "VARIATION SELECTOR-125", 0xE016D: "VARIATION SELECTOR-126", 0xE016E: "VARIATION SELECTOR-127", 0xE016F: "VARIATION SELECTOR-128", 0xE0170: "VARIATION SELECTOR-129", 0xE0171: "VARIATION SELECTOR-130", 0xE0172: "VARIATION SELECTOR-131", 0xE0173: "VARIATION SELECTOR-132", 0xE0174: "VARIATION SELECTOR-133", 0xE0175: "VARIATION SELECTOR-134", 0xE0176: "VARIATION SELECTOR-135", 0xE0177: "VARIATION SELECTOR-136", 0xE0178: "VARIATION SELECTOR-137", 0xE0179: "VARIATION SELECTOR-138", 0xE017A: "VARIATION SELECTOR-139", 0xE017B: "VARIATION SELECTOR-140", 0xE017C: "VARIATION SELECTOR-141", 0xE017D: "VARIATION SELECTOR-142", 0xE017E: "VARIATION SELECTOR-143", 0xE017F: "VARIATION SELECTOR-144", 0xE0180: "VARIATION SELECTOR-145", 0xE0181: "VARIATION SELECTOR-146", 0xE0182: "VARIATION SELECTOR-147", 0xE0183: "VARIATION SELECTOR-148", 0xE0184: "VARIATION SELECTOR-149", 0xE0185: "VARIATION SELECTOR-150", 0xE0186: "VARIATION SELECTOR-151", 0xE0187: "VARIATION SELECTOR-152", 0xE0188: "VARIATION SELECTOR-153", 0xE0189: "VARIATION SELECTOR-154", 0xE018A: "VARIATION SELECTOR-155", 0xE018B: "VARIATION SELECTOR-156", 0xE018C: "VARIATION SELECTOR-157", 0xE018D: "VARIATION SELECTOR-158", 0xE018E: "VARIATION SELECTOR-159", 0xE018F: "VARIATION SELECTOR-160", 0xE0190: "VARIATION SELECTOR-161", 0xE0191: "VARIATION SELECTOR-162", 0xE0192: "VARIATION SELECTOR-163", 0xE0193: "VARIATION SELECTOR-164", 0xE0194: "VARIATION SELECTOR-165", 0xE0195: "VARIATION SELECTOR-166", 0xE0196: "VARIATION SELECTOR-167", 0xE0197: "VARIATION SELECTOR-168", 0xE0198: "VARIATION SELECTOR-169", 0xE0199: "VARIATION SELECTOR-170", 0xE019A: "VARIATION SELECTOR-171", 0xE019B: "VARIATION SELECTOR-172", 0xE019C: "VARIATION SELECTOR-173", 0xE019D: "VARIATION SELECTOR-174", 0xE019E: "VARIATION SELECTOR-175", 0xE019F: "VARIATION SELECTOR-176", 0xE01A0: "VARIATION SELECTOR-177", 0xE01A1: "VARIATION SELECTOR-178", 0xE01A2: "VARIATION SELECTOR-179", 0xE01A3: "VARIATION SELECTOR-180", 0xE01A4: "VARIATION SELECTOR-181", 0xE01A5: "VARIATION SELECTOR-182", 0xE01A6: "VARIATION SELECTOR-183", 0xE01A7: "VARIATION SELECTOR-184", 0xE01A8: "VARIATION SELECTOR-185", 0xE01A9: "VARIATION SELECTOR-186", 0xE01AA: "VARIATION SELECTOR-187", 0xE01AB: "VARIATION SELECTOR-188", 0xE01AC: "VARIATION SELECTOR-189", 0xE01AD: "VARIATION SELECTOR-190", 0xE01AE: "VARIATION SELECTOR-191", 0xE01AF: "VARIATION SELECTOR-192", 0xE01B0: "VARIATION SELECTOR-193", 0xE01B1: "VARIATION SELECTOR-194", 0xE01B2: "VARIATION SELECTOR-195", 0xE01B3: "VARIATION SELECTOR-196", 0xE01B4: "VARIATION SELECTOR-197", 0xE01B5: "VARIATION SELECTOR-198", 0xE01B6: "VARIATION SELECTOR-199", 0xE01B7: "VARIATION SELECTOR-200", 0xE01B8: "VARIATION SELECTOR-201", 0xE01B9: "VARIATION SELECTOR-202", 0xE01BA: "VARIATION SELECTOR-203", 0xE01BB: "VARIATION SELECTOR-204", 0xE01BC: "VARIATION SELECTOR-205", 0xE01BD: "VARIATION SELECTOR-206", 0xE01BE: "VARIATION SELECTOR-207", 0xE01BF: "VARIATION SELECTOR-208", 0xE01C0: "VARIATION SELECTOR-209", 0xE01C1: "VARIATION SELECTOR-210", 0xE01C2: "VARIATION SELECTOR-211", 0xE01C3: "VARIATION SELECTOR-212", 0xE01C4: "VARIATION SELECTOR-213", 0xE01C5: "VARIATION SELECTOR-214", 0xE01C6: "VARIATION SELECTOR-215", 0xE01C7: "VARIATION SELECTOR-216", 0xE01C8: "VARIATION SELECTOR-217", 0xE01C9: "VARIATION SELECTOR-218", 0xE01CA: "VARIATION SELECTOR-219", 0xE01CB: "VARIATION SELECTOR-220", 0xE01CC: "VARIATION SELECTOR-221", 0xE01CD: "VARIATION SELECTOR-222", 0xE01CE: "VARIATION SELECTOR-223", 0xE01CF: "VARIATION SELECTOR-224", 0xE01D0: "VARIATION SELECTOR-225", 0xE01D1: "VARIATION SELECTOR-226", 0xE01D2: "VARIATION SELECTOR-227", 0xE01D3: "VARIATION SELECTOR-228", 0xE01D4: "VARIATION SELECTOR-229", 0xE01D5: "VARIATION SELECTOR-230", 0xE01D6: "VARIATION SELECTOR-231", 0xE01D7: "VARIATION SELECTOR-232", 0xE01D8: "VARIATION SELECTOR-233", 0xE01D9: "VARIATION SELECTOR-234", 0xE01DA: "VARIATION SELECTOR-235", 0xE01DB: "VARIATION SELECTOR-236", 0xE01DC: "VARIATION SELECTOR-237", 0xE01DD: "VARIATION SELECTOR-238", 0xE01DE: "VARIATION SELECTOR-239", 0xE01DF: "VARIATION SELECTOR-240", 0xE01E0: "VARIATION SELECTOR-241", 0xE01E1: "VARIATION SELECTOR-242", 0xE01E2: "VARIATION SELECTOR-243", 0xE01E3: "VARIATION SELECTOR-244", 0xE01E4: "VARIATION SELECTOR-245", 0xE01E5: "VARIATION SELECTOR-246", 0xE01E6: "VARIATION SELECTOR-247", 0xE01E7: "VARIATION SELECTOR-248", 0xE01E8: "VARIATION SELECTOR-249", 0xE01E9: "VARIATION SELECTOR-250", 0xE01EA: "VARIATION SELECTOR-251", 0xE01EB: "VARIATION SELECTOR-252", 0xE01EC: "VARIATION SELECTOR-253", 0xE01ED: "VARIATION SELECTOR-254", 0xE01EE: "VARIATION SELECTOR-255", 0xE01EF: "VARIATION SELECTOR-256", 0xEFFFE: "", 0xEFFFF: "", 0xFFFFE: "", 0xFFFFF: "", 0x10FFFE: "", 0x10FFFF: "" }, mBlocks: [ { start: "0000", name: "Basic Latin"}, { start: "0080", name: "Latin-1 Supplement"}, { start: "0100", name: "Latin Extended-A"}, { start: "0180", name: "Latin Extended-B"}, { start: "0250", name: "IPA Extensions"}, { start: "02B0", name: "Spacing Modifier Letters"}, { start: "0300", name: "Combining Diacritical Marks"}, { start: "0370", name: "Greek and Coptic"}, { start: "0400", name: "Cyrillic"}, { start: "0500", name: "Cyrillic Supplement"}, { start: "0530", name: "Armenian"}, { start: "0590", name: "Hebrew"}, { start: "0600", name: "Arabic"}, { start: "0700", name: "Syriac"}, { start: "0750", name: "Arabic Supplement"}, { start: "0780", name: "Thaana"}, { start: "07C0", name: "NKo"}, { start: "0900", name: "Devanagari"}, { start: "0980", name: "Bengali"}, { start: "0A00", name: "Gurmukhi"}, { start: "0A80", name: "Gujarati"}, { start: "0B00", name: "Oriya"}, { start: "0B80", name: "Tamil"}, { start: "0C00", name: "Telugu"}, { start: "0C80", name: "Kannada"}, { start: "0D00", name: "Malayalam"}, { start: "0D80", name: "Sinhala"}, { start: "0E00", name: "Thai"}, { start: "0E80", name: "Lao"}, { start: "0F00", name: "Tibetan"}, { start: "1000", name: "Myanmar"}, { start: "10A0", name: "Georgian"}, { start: "1100", name: "Hangul Jamo"}, { start: "1200", name: "Ethiopic"}, { start: "1380", name: "Ethiopic Supplement"}, { start: "13A0", name: "Cherokee"}, { start: "1400", name: "Unified Canadian Aboriginal Syllabics"}, { start: "1680", name: "Ogham"}, { start: "16A0", name: "Runic"}, { start: "1700", name: "Tagalog"}, { start: "1720", name: "Hanunoo"}, { start: "1740", name: "Buhid"}, { start: "1760", name: "Tagbanwa"}, { start: "1780", name: "Khmer"}, { start: "1800", name: "Mongolian"}, { start: "1900", name: "Limbu"}, { start: "1950", name: "Tai Le"}, { start: "1980", name: "New Tai Lue"}, { start: "19E0", name: "Khmer Symbols"}, { start: "1A00", name: "Buginese"}, { start: "1B00", name: "Balinese"}, { start: "1B80", name: "Sundanese"}, { start: "1C00", name: "Lepcha"}, { start: "1C50", name: "Ol Chiki"}, { start: "1D00", name: "Phonetic Extensions"}, { start: "1D80", name: "Phonetic Extensions Supplement"}, { start: "1DC0", name: "Combining Diacritical Marks Supplement"}, { start: "1E00", name: "Latin Extended Additional"}, { start: "1F00", name: "Greek Extended"}, { start: "2000", name: "General Punctuation"}, { start: "2070", name: "Superscripts and Subscripts"}, { start: "20A0", name: "Currency Symbols"}, { start: "20D0", name: "Combining Diacritical Marks for Symbols"}, { start: "2100", name: "Letterlike Symbols"}, { start: "2150", name: "Number Forms"}, { start: "2190", name: "Arrows"}, { start: "2200", name: "Mathematical Operators"}, { start: "2300", name: "Miscellaneous Technical"}, { start: "2400", name: "Control Pictures"}, { start: "2440", name: "Optical Character Recognition"}, { start: "2460", name: "Enclosed Alphanumerics"}, { start: "2500", name: "Box Drawing"}, { start: "2580", name: "Block Elements"}, { start: "25A0", name: "Geometric Shapes"}, { start: "2600", name: "Miscellaneous Symbols"}, { start: "2700", name: "Dingbats"}, { start: "27C0", name: "Miscellaneous Mathematical Symbols-A"}, { start: "27F0", name: "Supplemental Arrows-A"}, { start: "2800", name: "Braille Patterns"}, { start: "2900", name: "Supplemental Arrows-B"}, { start: "2980", name: "Miscellaneous Mathematical Symbols-B"}, { start: "2A00", name: "Supplemental Mathematical Operators"}, { start: "2B00", name: "Miscellaneous Symbols and Arrows"}, { start: "2C00", name: "Glagolitic"}, { start: "2C60", name: "Latin Extended-C"}, { start: "2C80", name: "Coptic"}, { start: "2D00", name: "Georgian Supplement"}, { start: "2D30", name: "Tifinagh"}, { start: "2D80", name: "Ethiopic Extended"}, { start: "2DE0", name: "Cyrillic Extended-A"}, { start: "2E00", name: "Supplemental Punctuation"}, { start: "2E80", name: "CJK Radicals Supplement"}, { start: "2F00", name: "Kangxi Radicals"}, { start: "2FF0", name: "Ideographic Description Characters"}, { start: "3000", name: "CJK Symbols and Punctuation"}, { start: "3040", name: "Hiragana"}, { start: "30A0", name: "Katakana"}, { start: "3100", name: "Bopomofo"}, { start: "3130", name: "Hangul Compatibility Jamo"}, { start: "3190", name: "Kanbun"}, { start: "31A0", name: "Bopomofo Extended"}, { start: "31C0", name: "CJK Strokes"}, { start: "31F0", name: "Katakana Phonetic Extensions"}, { start: "3200", name: "Enclosed CJK Letters and Months"}, { start: "3300", name: "CJK Compatibility"}, { start: "3400", name: "CJK Unified Ideographs Extension A"}, { start: "4DC0", name: "Yijing Hexagram Symbols"}, { start: "4E00", name: "CJK Unified Ideographs"}, { start: "A000", name: "Yi Syllables"}, { start: "A490", name: "Yi Radicals"}, { start: "A500", name: "Vai"}, { start: "A640", name: "Cyrillic Extended-B"}, { start: "A700", name: "Modifier Tone Letters"}, { start: "A720", name: "Latin Extended-D"}, { start: "A800", name: "Syloti Nagri"}, { start: "A840", name: "Phags-pa"}, { start: "A880", name: "Saurashtra"}, { start: "A900", name: "Kayah Li"}, { start: "A930", name: "Rejang"}, { start: "AA00", name: "Cham"}, { start: "AC00", name: "Hangul Syllables"}, { start: "D800", name: "High Surrogates"}, { start: "DB80", name: "High Private Use Surrogates"}, { start: "DC00", name: "Low Surrogates"}, { start: "E000", name: "Private Use Area"}, { start: "F900", name: "CJK Compatibility Ideographs"}, { start: "FB00", name: "Alphabetic Presentation Forms"}, { start: "FB50", name: "Arabic Presentation Forms-A"}, { start: "FE00", name: "Variation Selectors"}, { start: "FE10", name: "Vertical Forms"}, { start: "FE20", name: "Combining Half Marks"}, { start: "FE30", name: "CJK Compatibility Forms"}, { start: "FE50", name: "Small Form Variants"}, { start: "FE70", name: "Arabic Presentation Forms-B"}, { start: "FF00", name: "Halfwidth and Fullwidth Forms"}, { start: "FFF0", name: "Specials"}, { start: "10000", name: "Linear B Syllabary"}, { start: "10080", name: "Linear B Ideograms"}, { start: "10100", name: "Aegean Numbers"}, { start: "10140", name: "Ancient Greek Numbers"}, { start: "10190", name: "Ancient Symbols"}, { start: "101D0", name: "Phaistos Disc"}, { start: "10280", name: "Lycian"}, { start: "102A0", name: "Carian"}, { start: "10300", name: "Old Italic"}, { start: "10330", name: "Gothic"}, { start: "10380", name: "Ugaritic"}, { start: "103A0", name: "Old Persian"}, { start: "10400", name: "Deseret"}, { start: "10450", name: "Shavian"}, { start: "10480", name: "Osmanya"}, { start: "10800", name: "Cypriot Syllabary"}, { start: "10900", name: "Phoenician"}, { start: "10920", name: "Lydian"}, { start: "10A00", name: "Kharoshthi"}, { start: "12000", name: "Cuneiform"}, { start: "12400", name: "Cuneiform Numbers and Punctuation"}, { start: "1D000", name: "Byzantine Musical Symbols"}, { start: "1D100", name: "Musical Symbols"}, { start: "1D200", name: "Ancient Greek Musical Notation"}, { start: "1D300", name: "Tai Xuan Jing Symbols"}, { start: "1D360", name: "Counting Rod Numerals"}, { start: "1D400", name: "Mathematical Alphanumeric Symbols"}, { start: "1F000", name: "Mahjong Tiles"}, { start: "1F030", name: "Domino Tiles"}, { start: "20000", name: "CJK Unified Ideographs Extension B"}, { start: "2F800", name: "CJK Compatibility Ideographs Supplement"}, { start: "E0000", name: "Tags"}, { start: "E0100", name: "Variation Selectors Supplement"}, { start: "F0000", name: "Supplementary Private Use Area-A"}, { start: "100000", name: "Supplementary Private Use Area-B"} ], get blocks() { return this.mBlocks; }, getCharName: function(aCode) { if (aCode in this.mNamesList) return this.mNamesList[aCode]; return ""; }, findCharFromName: function(aName) { function ToHex4(n) { var str = Number(n).toString(16); while (str.length < 4) str = "0" + str; return str; } aName = aName.toLowerCase(); var res = []; var p = Components.classes["@mozilla.org/xmlextras/domparser;1"].createInstance(); for (var i in this.mNamesList) { var name = this.mNamesList[i].toLowerCase(); if (name.indexOf(aName) != -1) { var hex = ToHex4(i); var a = p.parseFromString("&#x" + hex + ";", "text/xml"); if (a.documentElement.nodeName != "parsererror") res.push(hex + " " + a.documentElement.textContent + " " + this.mNamesList[i]); else res.push(hex + " " + this.mNamesList[i]); } } return res; } }; ================================================ FILE: modules/urlHelper.jsm ================================================ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is BlueGriffon. * * The Initial Developer of the Original Code is * Disruptive Innovations SARL. * Portions created by the Initial Developer are Copyright (C) 2006 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Daniel Glazman , Original author * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ var EXPORTED_SYMBOLS = ["UrlUtils"]; Components.utils.import("resource://gre/modules/editorHelper.jsm"); var UrlUtils = { /********** CONSTANTS ***********/ gWin: "Win", gUNIX: "UNIX", gMac: "Mac", /********** ATTRIBUTES **********/ mIOService: null, mOS: null, /********** PRIVATE **********/ url2path : function(url) { var path = url; if (/^file/i.test(url)) try { var uri = Components.classes['@mozilla.org/network/standard-url;1'] .createInstance(Components.interfaces.nsIURL); var file = Components.classes['@mozilla.org/file/local;1'] .createInstance(Components.interfaces.nsILocalFile); uri.spec = url; try { // decent OS file.initWithPath(uri.path); } catch (e) {} try { // Windows sucks file.initWithPath(uri.path.replace(/^\//,"").replace(/\//g,"\\")); } catch (e) {} path = decodeURI(file.path); } catch(e) { } return path; }, /********** PUBLIC **********/ newLocalFile: function(url) { var filePath = this.url2path(url); var nsFile = null; try { nsFile = Components.classes['@mozilla.org/file/local;1'] .createInstance(Components.interfaces.nsILocalFile); nsFile.initWithPath(filePath); } catch(e) { nsFile = null; } return nsFile; }, normalizeURL: function normalizeURL(url) { if (!this.getScheme(url) && !this.isUrlOfBlankDocument(url)) { var k = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); var noBackSlashUrl = url.replace(/\\\"/g, "\""); var c0 = noBackSlashUrl[0]; var c1 = noBackSlashUrl[1]; if ((c0 == '/') || ((/^[a-zA-z]/.test(c0)) && (c1 == ":") )) { // this is an absolute path k.initWithPath(url); } else { // First, get the current dir for the process... var dirServiceProvider = Components.classes["@mozilla.org/file/directory_service;1"] .getService(Components.interfaces.nsIDirectoryServiceProvider); var p = {}; var currentProcessDir = dirServiceProvider.getFile("CurWorkD", p).path; k.initWithPath(currentProcessDir); // then try to append the relative path try { k.appendRelativePath(url); } catch (e) { return kHTML_TRANSITIONAL; } var ioService = Components.classes["@mozilla.org/network/io-service;1"] .getService(Components.interfaces.nsIIOService); var fileHandler = ioService.getProtocolHandler("file") .QueryInterface(Components.interfaces.nsIFileProtocolHandler); url = fileHandler.getURLSpecFromFile(k); } } return url; }, isUrlOfBlankDocument: function isUrlOfBlankDocument(urlString) { const kDATA_URL_PREFIX = "resource://gre/res"; return (urlString.substr(0, kDATA_URL_PREFIX.length) == kDATA_URL_PREFIX); }, getIOService: function getIOService() { if (this.mIOService) return this.mIOService; this.mIOService = Components.classes["@mozilla.org/network/io-service;1"] .getService(Components.interfaces.nsIIOService); return this.mIOService; }, newURI: function newURI(aURLString) { try { return this.getIOService().newURI(aURLString, null, null); } catch (e) { } return null; }, isTextURI: function isTextURI(aText) { return aText && /^http:\/\/|^https:\/\/|^file:\/\/|^ftp:\/\/|^about:|^mailto:|^news:|^snews:|^telnet:|^ldap:|^ldaps:|^gopher:|^finger:|^javascript:/i.test(aText); }, makeRelativeUrl: function makeRelativeUrl(aURLString, aDocURL) { var inputUrl = aURLString.trim(); if (!inputUrl) return inputUrl; // Get the filespec relative to current document's location // NOTE: Can't do this if file isn't saved yet! var docUrl = aDocURL ? aDocURL : this.getDocumentBaseUrl(); var docScheme = this.getScheme(docUrl); // Can't relativize if no doc scheme (page hasn't been saved) if (!docScheme) return inputUrl; var urlScheme = this.getScheme(inputUrl); // Do nothing if not the same scheme or url is already relativized if (docScheme != urlScheme) return inputUrl; var IOService = this.getIOService(); if (!IOService) return inputUrl; // Host must be the same var docHost = this.getHost(docUrl); var urlHost = this.getHost(inputUrl); if (docHost != urlHost) return inputUrl; // Get just the file path part of the urls var charset = EditorUtils.getCurrentEditor() ? EditorUtils.getCurrentEditor().documentCharacterSet : "utf-8"; var docPath = IOService.newURI(docUrl, charset, null).path; var urlPath = IOService.newURI(inputUrl, charset, null).path; // We only return "urlPath", so we can convert // the entire docPath for case-insensitive comparisons var os = this.getOS(); var doCaseInsensitive = (docScheme == "file" && os == this.gWin); if (doCaseInsensitive) docPath = docPath.toLowerCase(); // Get document filename before we start chopping up the docPath var docFilename = this.getFilename(docUrl); // Both url and doc paths now begin with "/" // Look for shared dirs starting after that urlPath = urlPath.slice(1); docPath = docPath.slice(1); var firstDirTest = true; var nextDocSlash = 0; var done = false; // Remove all matching subdirs common to both doc and input urls do { nextDocSlash = docPath.indexOf("\/"); var nextUrlSlash = urlPath.indexOf("\/"); if (nextUrlSlash == -1) { // We're done matching and all dirs in url // what's left is the filename done = true; // Remove filename for named anchors in the same file if (nextDocSlash == -1 && docFilename) { var anchorIndex = urlPath.indexOf("#"); if (anchorIndex > 0) { var urlFilename = doCaseInsensitive ? urlPath.toLowerCase() : urlPath; if (urlFilename.indexOf(docFilename) == 0) urlPath = urlPath.slice(anchorIndex); } } } else if (nextDocSlash >= 0) { // Test for matching subdir var docDir = docPath.slice(0, nextDocSlash); var urlDir = urlPath.slice(0, nextUrlSlash); if (doCaseInsensitive) urlDir = urlDir.toLowerCase(); if (urlDir == docDir) { // Remove matching dir+"/" from each path // and continue to next dir docPath = docPath.slice(nextDocSlash+1); urlPath = urlPath.slice(nextUrlSlash+1); } else { // No match, we're done done = true; // Be sure we are on the same local drive or volume // (the first "dir" in the path) because we can't // relativize to different drives/volumes. // UNIX doesn't have volumes, so we must not do this else // the first directory will be misinterpreted as a volume name if (firstDirTest && docScheme == "file" && os != this.gUNIX) return inputUrl; } } else // No more doc dirs left, we're done done = true; firstDirTest = false; } while (!done); // Add "../" for each dir left in docPath while (nextDocSlash > 0) { urlPath = "../" + urlPath; nextDocSlash = docPath.indexOf("\/", nextDocSlash + 1); } return urlPath; }, makeAbsoluteUrlFrom: function (url, docUrl) { var resultUrl = url.trim(); if (!resultUrl) return resultUrl; // Check if URL is already absolute, i.e., it has a scheme var urlScheme = this.getScheme(resultUrl); if (urlScheme) return resultUrl; var docScheme = this.getScheme(docUrl); // Can't relativize if no doc scheme (page hasn't been saved) if (!docScheme) return resultUrl; var IOService = this.getIOService(); if (!IOService) return resultUrl; // Make a URI object to use its "resolve" method var absoluteUrl = resultUrl; var docUri = IOService.newURI(docUrl, EditorUtils.getCurrentEditor().documentCharacterSet, null); try { absoluteUrl = docUri.resolve(resultUrl); // This is deprecated and buggy! // If used, we must make it a path for the parent directory (remove filename) //absoluteUrl = IOService.resolveRelativePath(resultUrl, docUrl); } catch (e) { } return absoluteUrl; }, makeAbsoluteUrl: function (url) { var docUrl = this.getDocumentBaseUrl(); return this.makeAbsoluteUrlFrom(url, docUrl); }, getDocumentBaseUrl: function getDocumentBaseUrl() { Components.utils.import("resource://gre/modules/editorHelper.jsm"); try { var docUrl; // if document supplies a tag, use that URL instead var baseList = EditorUtils.getCurrentDocument().getElementsByTagName("base"); if (baseList) { var base = baseList.item(0); if (base) docUrl = base.getAttribute("href"); } if (!docUrl) docUrl = this.getDocumentUrl(); if (!this.isUrlOfBlankDocument(docUrl)) return docUrl; } catch (e) { } return ""; }, getDocumentUrl: function getDocumentUrl() { try { var aDOMHTMLDoc = EditorUtils.getCurrentEditor().document.QueryInterface(Components.interfaces.nsIDOMHTMLDocument); return aDOMHTMLDoc.URL; } catch (e) { } return ""; }, getScheme: function getScheme(urlspec) { var resultUrl = urlspec.trim(); // Unsaved document URL has no acceptable scheme yet if (!resultUrl || this.isUrlOfBlankDocument(resultUrl)) return ""; var IOService = this.getIOService(); if (!IOService) return ""; var scheme = ""; try { // This fails if there's no scheme scheme = IOService.extractScheme(resultUrl); } catch (e) { } return scheme ? scheme.toLowerCase() : ""; }, _getURI: function _getURI(aURLSpec) { if (!aURLSpec) return ""; var IOService = this.getIOService(); if (!IOService) return ""; var uri = null; try { uri = IOService.newURI(aURLSpec, null, null); } catch (e) { } return uri; }, getHost: function getHost(aURLSpec) { var host = ""; var uri = this._getURI(aURLSpec); if (uri) host = uri.host; return host; }, getUsername: function getUsername(aURLSpec) { var username = ""; var uri = this._getURI(aURLSpec); if (uri) username = uri.username; return username; }, getFilename: function getFilename(aURLSpec) { var filename = ""; var uri = this._getURI(aURLSpec); if (uri) { var url = uri.QueryInterface(Components.interfaces.nsIURL); if (url) filename = url.fileName; } return filename ? filename : ""; }, getFileExtension: function getFileExtension(aURLSpec) { var filename = ""; var uri = this._getURI(aURLSpec); if (uri) { var url = uri.QueryInterface(Components.interfaces.nsIURL); if (url) filename = url.fileExtension; } return filename ? filename : ""; }, stripUsernamePassword: function stripUsernamePassword(aURLSpec, usernameObj, passwordObj) { var urlspec = aURLSpec.trim(); if (!urlspec || this.isUrlOfBlankDocument(urlspec)) return urlspec; if (usernameObj) usernameObj.value = ""; if (passwordObj) passwordObj.value = ""; // "@" must exist else we will never detect username or password var atIndex = aURLSpec.indexOf("@"); if (atIndex > 0) { try { var IOService = this.getIOService(); if (!IOService) return urlspec; var uri = IOService.newURI(urlspec, null, null); var username = uri.username; var password = uri.password; if (usernameObj && username) usernameObj.value = username; if (passwordObj && password) passwordObj.value = password; if (username) { var usernameStart = urlspec.indexOf(username); if (usernameStart != -1) return urlspec.slice(0, usernameStart) + urlspec.slice(atIndex+1); } } catch (e) { } } return urlspec; }, stripPassword: function stripPassword(aURLSpec, passwordObj) { var urlspec = aURLSpec.trim(); if (!urlspec || this.isUrlOfBlankDocument(urlspec)) return urlspec; if (passwordObj) passwordObj.value = ""; // "@" must exist else we will never detect password var atIndex = urlspec.indexOf("@"); if (atIndex > 0) { try { var IOService = this.getIOService(); if (!IOService) return urlspec; var password = IOService.newURI(urlspec, null, null).password; if (passwordObj && password) passwordObj.value = password; if (password) { // Find last ":" before "@" var colon = urlspec.lastIndexOf(":", atIndex); if (colon != -1) { // Include the "@" return urlspec.slice(0, colon) + urlspec.slice(atIndex); } } } catch (e) { } } return urlspec; }, // Version to use when you have an nsIURI object stripUsernamePasswordFromURI: function stripUsernamePasswordFromURI(aURI) { var urlspec = ""; if (aURI) { try { urlspec = aURI.spec; var userPass = aURI.userPass; if (userPass) { start = urlspec.indexOf(userPass); urlspec = urlspec.slice(0, start) + urlspec.slice(start+userPass.length+1); } } catch (e) { } } return urlspec; }, insertUsernameIntoUrl: function insertUsernameIntoUrl(aURLSpec, aUserName) { if (!aURLSpec || !aUserName) return aURLSpec; try { var ioService = this.getIOService(); var URI = ioService.newURI(aURLSpec, this.getCurrentEditor().documentCharacterSet, null); URI.username = aUserName; return URI.spec; } catch (e) { } return aURLSpec; }, getOS: function getOS() { if (this.mOS) return this.mOS; var xrt = Components.classes["@mozilla.org/xre/app-info;1"] .getService(Components.interfaces.nsIXULAppInfo) .QueryInterface(Components.interfaces.nsIXULRuntime); var platform = xrt.OS.toLowerCase(); if (platform == "windows") this.mOS = this.gWin; else if (platform == "darwin") this.mOS = this.gMac; else if (platform.indexOf("unix") != -1 || platform.indexOf("linux") != -1 || platform.indexOf("sun") != -1) this.mOS = this.gUNIX; else this.mOS = ""; // Add other tests? return this.mOS; }, getFileProtocolHandler: function getFileProtocolHandler() { try { var ios = this.getIOService(); var handler = ios.getProtocolHandler("file"); return handler.QueryInterface(Components.interfaces.nsIFileProtocolHandler); } catch (e) { } return null; }, getClipboardAsString: function() { var clip = Components.classes["@mozilla.org/widget/clipboard;1"] .getService(Components.interfaces.nsIClipboard); if (clip) { var trans = Components.classes["@mozilla.org/widget/transferable;1"] .createInstance(Components.interfaces.nsITransferable); if (trans) { trans.addDataFlavor("text/unicode"); clip.getData(trans, clip.kGlobalClipboard); var str = new Object(); var strLength = new Object(); trans.getTransferData("text/unicode", str, strLength); if (str) { str = str.value.QueryInterface(Components.interfaces.nsISupportsString); pastetext = str.data.substring(0, strLength.value / 2); if (pastetext) { return pastetext } } } } return ""; }, getURLFromClipboard: function() { var pastetext = this.getClipboardAsString(); if (pastetext) { try { var uri = Components.classes['@mozilla.org/network/standard-url;1'] .createInstance(Components.interfaces.nsIURL); uri.spec = pastetext; return decodeURI(uri.spec); } catch(e) { } } return ""; } }; ================================================ FILE: moz.build ================================================ # vim: set filetype=python: # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. CONFIGURE_SUBST_FILES += ['installer/Makefile'] DIRS += [ 'components', 'langpacks', 'locales', 'base', 'modules', 'themes', 'src', 'sidebars', 'extensions', 'branding', ] DIRS += [ 'app', ] #DIST_SUBDIR = 'editor' #export('DIST_SUBDIR') ================================================ FILE: moz.configure ================================================ # -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*- # vim: set filetype=python: # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. include('../toolkit/moz.configure') ================================================ FILE: sidebars/Makefile.in ================================================ # ***** BEGIN LICENSE BLOCK ***** # Version: MPL 1.1/GPL 2.0/LGPL 2.1 # # The contents of this file are subject to the Mozilla Public License Version # 1.1 (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. # # The Original Code is Mozilla.org # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 2003 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Daniel Glazman (daniel@glazman.org), on behalf of Lindows.com # # Alternatively, the contents of this file may be used under the terms of # either the GNU General Public License Version 2 or later (the "GPL"), or # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), # in which case the provisions of the GPL or the LGPL are applicable instead # of those above. If you wish to allow use of your version of this file only # under the terms of either the GPL or the LGPL, and not to allow others to # use your version of this file under the terms of the MPL, indicate your # decision by deleting the provisions above and replace them with the notice # and other provisions required by the GPL or the LGPL. If you do not delete # the provisions above, a recipient may use your version of this file under # the terms of any one of the MPL, the GPL or the LGPL. # # ***** END LICENSE BLOCK ***** DEPTH = ../.. topsrcdir = @top_srcdir@ srcdir = @srcdir@ VPATH = @srcdir@ include $(DEPTH)/config/autoconf.mk include $(topsrcdir)/config/rules.mk ================================================ FILE: sidebars/aria/Makefile.in ================================================ # ***** BEGIN LICENSE BLOCK ***** # Version: MPL 1.1/GPL 2.0/LGPL 2.1 # # The contents of this file are subject to the Mozilla Public License Version # 1.1 (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. # # The Original Code is Mozilla.org # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 2003 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Daniel Glazman (daniel@glazman.org), on behalf of Lindows.com # # Alternatively, the contents of this file may be used under the terms of # either the GNU General Public License Version 2 or later (the "GPL"), or # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), # in which case the provisions of the GPL or the LGPL are applicable instead # of those above. If you wish to allow use of your version of this file only # under the terms of either the GPL or the LGPL, and not to allow others to # use your version of this file under the terms of the MPL, indicate your # decision by deleting the provisions above and replace them with the notice # and other provisions required by the GPL or the LGPL. If you do not delete # the provisions above, a recipient may use your version of this file under # the terms of any one of the MPL, the GPL or the LGPL. # # ***** END LICENSE BLOCK ***** DEPTH = ../../.. topsrcdir = @top_srcdir@ srcdir = @srcdir@ VPATH = @srcdir@ include $(DEPTH)/config/autoconf.mk include $(topsrcdir)/config/rules.mk ================================================ FILE: sidebars/aria/content/aria-properties.js ================================================ const kWAI_ARIA_11_PROPERTIES = { "aria-activedescendant": { "default": "", "value": "#ID" }, "aria-atomic": { "default": "false", "value": "false|true" }, "aria-autocomplete": { "default": "none", "value": "inline|list|both|none" }, "aria-busy": { "default": "false", "value": "false|true" }, "aria-checked": { "default": "undefined", "value": "false|mixed|true|undefined" }, "aria-colcount": { "default": "", "value": "#INT(-1)" }, "aria-colindex": { "default": "", "value": "#INT(1)" }, "aria-colspan": { "default": "", "value": "#INT(1)" }, "aria-controls": { "default": "", "value": "#ID" }, "aria-current": { "default": "false", "value": "page|step|location|date|time|true|false" }, "aria-describedby": { "default": "", "value": "#IDS" }, "aria-details": { "default": "", "value": "#ID" }, "aria-disabled": { "default": "false", "value": "false|true" }, "aria-dropeffect": { "deprecated": true, "default": "none", "value": "[copy|execute|link|move|none|popup]" }, "aria-errormessage": { "default": "", "value": "#ID" }, "aria-expanded": { "default": "undefined", "value": "false|true|undefined" }, "aria-flowto": { "default": "", "value": "#ID" }, "aria-grabbed": { "deprecated": true, "default": "undefined", "value": "false|true|undefined" }, "aria-haspopup": { "default": "false", "value": "false|true|menu|listbox|tree|grid|dialog" }, "aria-hidden": { "default": "undefined", "value": "false|true|undefined" }, "aria-invalid": { "default": "false", "value": "grammar|false|spelling|true" }, "aria-keyshortcuts": { "default": "", "value": "#STRING" }, "aria-label": { "default": "", "value": "#STRING" }, "aria-labelledby": { "default": "", "value": "#IDS" }, "aria-level": { "default": "", "value": "#INT(1)" }, "aria-live": { "default": "off", "value": "assertive|off|polite" }, "aria-modal": { "default": "false", "value": "false|true" }, "aria-multiline": { "default": "false", "value": "false|true" }, "aria-multiselectable": { "default": "false", "value": "false|true" }, "aria-orientation": { "default": "undefined", "value": "horizontal|undefined|vertical" }, "aria-owns": { "value": "#IDS" }, "aria-placeholder": { "default": "", "value": "#STRING" }, "aria-posinset": { "value": "#INT(1)" }, "aria-pressed": { "default": "undefined", "value": "false|mixed|true|undefined" }, "aria-readonly": { "default": "false", "value": "false|true" }, "aria-relevant": { "default": "additions text", "value": "[additions|removals|text|all" // XXX }, "aria-required": { "default": "false", "value": "false|true" }, "aria-roledescription": { "default": "", "value": "#STRING" }, "aria-rowcount": { "default": "", "value": "#INT(-1)" }, "aria-rowindex": { "value": "#INT(1)" }, "aria-rowspan": { "value": "#INT(0)" }, "aria-selected": { "default": "undefined", "value": "false|true|undefined" }, "aria-setsize": { "value": "#INT(-1)" }, "aria-sort": { "default": "none", "value": "ascending|descending|none|other" }, "aria-valuemax": { "value": "#NUMBER" }, "aria-valuemin": { "value": "#NUMBER" }, "aria-valuenow": { "value": "#NUMBER" }, "aria-valuetext": { "value": "#STRING" } }; ================================================ FILE: sidebars/aria/content/aria-roles.js ================================================ const kWAI_ARIA_11_ROLES = { "alert": { "sup": "section", "sub": "alertdialog" }, "alertdialog": { "sup": "alert dialog" }, "application": { "sup": "structure", "properties": "aria-activedescendant" }, "article": { "sup": "document", "properties": "aria-posinset aria-setsize" }, "banner": { "sup": "landmark" }, "button": { "sup": "command", "properties": "aria-expanded aria-pressed" }, "cell": { "sup": "section", "sub": "columnheader gridcell rowheader", "context": "row", "properties": "aria-colindex aria-colspan aria-rowindex aria-rowspan" }, "checkbox": { "sup": "input", "sub": "menuitemcheckbox switch", "required": "aria-checked", "properties": "aria-readonly" }, "columnheader": { "sup": "cell gridcell sectionhead", "context": "row", "properties": "aria-sort" }, "combobox": { "sup": "select", "owns": CheckComboboxOwns, // XXX FUNCTION "required": "aria-controls aria-expanded", "properties": "aria-autocomplete aria-readonly aria-required" }, "command": { "abstract": true, "sup": "widget", "sub": "button link menuitem" }, "complementary": { "sup": "landmark" }, "composite": { "abstract": true, "sup": "widget", "sub": "grid select spinbutton tablist", "properties": "aria-activedescendant" }, "contentinfo": { "sup": "landmark" }, "definition": { "sup": "section" }, "dialog": { "sup": "window", "sub": "alertdialog" }, "directory": { "sup": "list" }, "document": { "sup": "structure", "sub": "article", "properties": "aria-expanded" }, "feed": { "sup": "list", "owns": "article" }, "figure": { "sup": "section" }, "form": { "sup": "landmark" }, "grid": { "sup": "composite table", "sub": "treegrid", "owns": "rowgroup", "properties": "aria-level aria-multiselectable aria-readonly" }, "gridcell": { "sup": "cell widget", "sub": "columnheader rowheader", "context": "row", "properties": "aria-readonly aria-required aria-selected" }, "group": { "sup": "section", "sub": "row select toolbar", "properties": "aria-activedescendant" }, "heading": { "sup": "sectionhead", "properties": "aria-level" }, "img": { "sup": "section", "sub": "doc-cover" }, "input": { "abstract": true, "sup": "widget", "sub": "checkbox option radio slider spinbutton textbox" }, "landmark": { "sup": "section", "sub": "banner complementary contentinfo doc-acknowledgements doc-afterword doc-appendix doc-bibliography doc-chapter doc-conclusion doc-credits doc-epilogue doc-errata doc-glossary doc-introduction doc-part doc-preface doc-prologue form main navigation region search" }, "link": { "sup": "command", "sub": "doc-backlink doc-biblioref doc-glossref doc-noteref", "properties": "aria-expanded" }, "list": { "sup": "section", "sub": "directory feed", "owns": "group listitem" }, "listbox": { "sup": "select", "owns": "option", "properties": "aria-multiselectable aria-readonly aria-required" }, "listitem": { "sup": "section", "sub": "doc-biblioentry doc-endnote treeitem", "context": "group list", "properties": "aria-level aria-posinset aria-setsize" }, "log": { "sup": "section" }, "main": { "sup": "landmark" }, "marquee": { "sup": "section" }, "math": { "sup": "section" }, "menu": { "sup": "select", "sub": "menubar", "owns": "group menuitem menuitemcheckbox menuitemradio" }, "menubar": { "sup": "menu", "owns": "group menuitem menuitemcheckbox menuitemradio" }, "menuitem": { "sup": "command", "sub": "menuitemcheckbox", "context": "group menu menubar", "properties": "aria-posinset aria-setsize" }, "menuitemcheckbox": { "sup": "checkbox menuitem", "sub": "menuitemradio", "context": "menu menubar" }, "menuitemradio": { "sup": "menuitemcheckbo radio", "context": "group menu menubar" }, "navigation": { "sup": "landmark", "sub": "doc-index doc-pagelist doc-toc" }, "none": { "sup": "section", "sub": "doc-pullquote" }, "note": { "sup": "section", "sub": "doc-notice doc-tip" }, "option": { "sup": "input", "sub": "treeitem", "context": "listbox", "required": "aria-selected", "properties": "aria-checked aria-posinset aria-setsize" }, "presentation": { "sup": "structure" }, "progressbar": { "sup": "range", }, "radio": { "sup": "input", "sub": "menuitemradio", "required": "aria-checked", "properties": "aria-posinset aria-setsize" }, "radiogroup": { "sup": "select", "owns": "radio", "properties": "aria-readonly aria-required" }, "range": { "abstract": true, "sup": "widget", "sub": "progressbar scrollbar slider spinbutton", "properties": "aria-valuemax aria-valuemin aria-valuenow aria-valuetext" }, "region": { "sup": "landmark" }, "roletype": { "abstract": true, "sub": "structure widget window", "properties": "aria-atomic aria-busy aria-controls aria-current aria-describedby aria-details aria-disabled aria-dropeffect aria-errormessage aria-flowto aria-grabbed aria-haspopup aria-hidden aria-invalid aria-keyshortcuts aria-label aria-labelledby aria-live aria-owns aria-relevant aria-roledescription" }, "row": { "sup": "group widget", "context": "grid rowgroup table treegrid", "owns": "cell columnheader gridcell rowheader" }, "rowgroup": { "sup": "structure", "context": "grid table treegrid", "owns": "row" }, "rowheader": { "sup": "cell gridcell sectionhead", "context": "row", "properties": "aria-sort" }, "scrollbar": { "sup": "range", "properties": "aria-controls aria-orientation aria-valuemax aria-valuemin aria-valuenow" }, "search": { "sup": "landmark" }, "searchbox": { "sup": "textbox" }, "section": { "abstract": true, "sup": "structure", "sub": "alert cell definition doc-abstract doc-colophon doc-credit doc-dedication doc-epigraph doc-example doc-footnote doc-foreword doc-qna figure group img landmark list listitem log marquee math note status table tabpanel term tooltip", "properties": "aria-expanded" }, "sectionhead": { "abstract": true, "sup": "structure", "sub": "columnheader doc-subtitle heading rowheader tab", "properties": "aria-expanded" }, "select": { "abstract": true, "sup": "composite group", "sub": "combobox listbox menu radiogroup tree", "properties": "aria-orientation" }, "separator": { "sup": "structure widget", "sub": "doc-pagebreak", "required": "aria-valuemax aria-valuemin aria-valuenow", "properties": "aria-orientation aria-valuetext" }, "slider": { "sup": "input range", "required": "aria-valuemax aria-valuemin aria-valuenow", "properties": "aria-orientation aria-readonly" }, "spinbutton": { "sup": "composite input range", "required": "aria-valuemax aria-valuemin aria-valuenow", "properties": "aria-required aria-readonly" }, "spinbutton": { "sup": "section", "sub": "progressbar timer" }, "status": { "sup": "section", "sub": "progressbar timer" }, "structure": { "abstract": true, "sup": "roletype", "sub": "application document presentation rowgroup section sectionhead separator" }, "switch": { "sup": "checkbox", "required": "aria-checked" }, "tab": { "sup": "sectionhead widget", "context": "tablist", "properties": "aria-posinset aria-selected aria-setsize" }, "table": { "sup": "section", "sub": "grid", "owns": "row rowgroup", "properties": "aria-colcount aria-rowcount" }, "tablist": { "sup": "composite", "owns": "tab", "properties": "aria-level aria-multiselectable aria-orientation" }, "tabpanel": { "sup": "section" }, "term": { "sup": "section" }, "textbox": { "sup": "input", "sub": "searchbox", "properties": "aria-activedescendant aria-autocomplete aria-multiline aria-placeholder aria-readonly aria-required" }, "timer": { "sup": "status" }, "toolbar": { "sup": "group", "properties": "aria-orientation" }, "tooltip": { "sup": "section" }, "tree": { "sup": "select", "sub": "treegrid", "owns": "group treeitem", "properties": "aria-multiselectable aria-required" }, "treegrid": { "sup": "grid tree", "owns": "row rowgroup" }, "treeitem": { "sup": "listitem", "context": "group tree" }, "widget": { "abstract": true, "sup": "roletype", "sub": "command composite gridcell input range row separator tab" }, "window": { "abstract": true, "sup": "roletype", "sub": "dialog", "properties": "aria-expanded aria-modal" }, // DPUB-ARIA-1.0 "doc-abstract": { "sup": "section" }, "doc-acknowledgements": { "sup": "landmark" }, "doc-afterword": { "sip": "landmark" }, "doc-appendix": { "sip": "landmark" }, "doc-backlink": { "sup": "link" }, "doc-biblioentry": { "sup": "listitem", "context": "doc-bibliography" }, "doc-bibliography": { "sup": "landmark", "owns": "doc-biblioentry" }, "doc-biblioref": { "sup": "link" }, "doc-chapter": { "sup": "landmark" }, "doc-colophon": { "sup": "section" }, "doc-conclusion": { "sup": "landmark" }, "doc-cover": { "sup": "img" }, "doc-credit": { "sup": "section" }, "doc-credits": { "sup": "landmark" }, "doc-dedication": { "sup": "section" }, "doc-endnote": { "sup": "listitem", "context": "doc-endnotes" }, "doc-epigraph": { "sup": "section" }, "doc-epilogue": { "sup": "landmark" }, "doc-errata": { "sup": "landmark" }, "doc-example": { "sup": "section" }, "doc-footnote": { "sup": "section" }, "doc-foreword": { "sup": "section" }, "doc-glossary": { "sup": "landmark", "owns": "term,definition" }, "doc-glossref": { "sup": "link" }, "doc-index": { "sup": "navigation" }, "doc-introduction": { "sup": "landmark" }, "doc-noteref": { "sup": "link" }, "doc-notice": { "sup": "note" }, "doc-pagebreak": { "sup": "separator" }, "doc-pagelist": { "sup": "navigation" }, "doc-part": { "sup": "landmark" }, "doc-preface": { "sup": "landmark" }, "doc-prologue": { "sup": "landmark" }, "doc-pullquote": { "sup": "none" }, "doc-qna": { "sup": "section" }, "doc-subtitle": { "sup": "sectionhead" }, "doc-tip": { "sup": "note" }, "doc-toc": { "sup": "navigation" } }; function CheckComboboxOwns(aNode) { var textbox = aNode.querySelector("[role='textbox']"); if (textbox) { if (aNode.getAttribute("aria-expanded") == "true") { var innerWidget = aNode.querySelector("[role='listbox'], [role='tree'], [role='grid'], [role='dialog']"); if (innerWidget) return ""; return gBundle.getString("missingListboxTreeGridDialog"); } return ""; } return gBundle.getString("missingTextbox"); } ================================================ FILE: sidebars/aria/content/aria.js ================================================ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is BlueGriffon. * * The Initial Developer of the Original Code is * Disruptive Innovations SARL. * Portions created by the Initial Developer are Copyright (C) 2006 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Daniel Glazman , Original author * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ Components.utils.import("resource://gre/modules/editorHelper.jsm"); Components.utils.import("resource://gre/modules/cssInspector.jsm"); Components.utils.import("resource://gre/modules/prompterHelper.jsm"); Components.utils.import("resource://gre/modules/Services.jsm"); var gMain = null; var gCurrentElement = null; var gIsPanelActive = true; var gPrefs = null; var gNestedRoleDropdown; var gBundle = null; function Startup() { GetUIElements(); gPrefs = GetPrefs(); if (window.top && "NotifierUtils" in window.top) gMain = window.top; else if (window.top && window.top.opener && "NotifierUtils" in window.top.opener) gMain = window.top.opener; if (!gMain) return; gNestedRoleDropdown = (gDialog.treeViewCheckbox.getAttribute("checked") == "true"); gBundle = gDialog.ariaBundle; ResetRoleDropdown(); gMain.NotifierUtils.addNotifierCallback("selection_strict", SelectionChanged, window); gMain.NotifierUtils.addNotifierCallback("tabClosed", Inspect, window); gMain.NotifierUtils.addNotifierCallback("tabCreated", Inspect, window); gMain.NotifierUtils.addNotifierCallback("tabSelected", Inspect, window); gMain.NotifierUtils.addNotifierCallback("redrawPanel", RedrawAll, window); gMain.NotifierUtils.addNotifierCallback("panelClosed", PanelClosed, window); gMain.NotifierUtils.addNotifierCallback("afterEnteringSourceMode", Inspect, window); gMain.NotifierUtils.addNotifierCallback("afterLeavingSourceMode", Inspect, window); Inspect(); if (gMain && gMain.EditorUtils && gIsPanelActive && gMain.EditorUtils.getCurrentEditor()) { var c = gMain.EditorUtils.getSelectionContainer(); if (c) SelectionChanged(null, c.node, c.oneElementSelected); } } function Shutdown() { if (gMain) { gMain.NotifierUtils.removeNotifierCallback("selection_strict", SelectionChanged, window); gMain.NotifierUtils.removeNotifierCallback("tabClosed", Inspect); gMain.NotifierUtils.removeNotifierCallback("tabCreated", Inspect); gMain.NotifierUtils.removeNotifierCallback("tabSelected", Inspect); gMain.NotifierUtils.removeNotifierCallback("redrawPanel", RedrawAll, window); gMain.NotifierUtils.removeNotifierCallback("panelClosed", PanelClosed, window); gMain.NotifierUtils.removeNotifierCallback("afterEnteringSourceMode", Inspect, window); gMain.NotifierUtils.removeNotifierCallback("afterLeavingSourceMode", Inspect, window); } } function Inspect() { if (gMain && gMain.EditorUtils) { var editor = gMain.EditorUtils.getCurrentEditor(); var visible = editor && (gMain.EditorUtils.isWysiwygMode()); gDialog.mainBox.style.visibility = visible ? "" : "hidden"; gMain.document.querySelector("[panelid='panel-aria']").className = visible ? "" : "inactive"; if (!visible) { return; } if (editor) { var node = gMain.EditorUtils.getSelectionContainer().node; if (node) { SelectionChanged(null, node, true); } } } } function RedrawAll(aNotification, aPanelId) { if (aPanelId == "panel-aria") { gIsPanelActive = true; if (gCurrentElement) { // force query of all properties on the current element var elt = gCurrentElement; SelectionChanged(null, elt, true); } } } function PanelClosed(aNotification, aPanelId) { if (aPanelId == "panel-aria") gIsPanelActive = false; } function SelectionChanged(aArgs, aElt, aOneElementSelected, aSelectedInDOMETree) { if (!gIsPanelActive) { gCurrentElement = aElt; return; } gCurrentElement = aElt; var node = gCurrentElement; if (node.hasAttribute("role") || node.hasAttributeNS("http://www.idpf.org/2007/ops", "type")) { var role = node.getAttribute("role") || node.getAttributeNS("http://www.idpf.org/2007/ops", "type"); gDialog.roleMenulist.value = role; CheckConstraints(node, role); PopulateProperties(role, "required", "requiredProperties"); PopulateProperties(role, "properties", "properties"); PopulateInheritedProperties(role, "inheritedProperties"); } else { gDialog.roleMenulist.value = ""; gDialog.constraintsSectionHeader.setAttribute("hidden", "true"); gDialog.contextSection.setAttribute("hidden", "true"); gDialog.ownsSection.setAttribute("hidden", "true"); gDialog.requiredPropertiesHeader.setAttribute("hidden", "true"); gDialog.propertiesHeader.setAttribute("hidden", "true"); gDialog.inheritedPropertiesHeader.setAttribute("hidden", "true"); gDialog.requiredPropertiesSection.setAttribute("hidden", "true"); gDialog.propertiesSection.setAttribute("hidden", "true"); gDialog.inheritedPropertiesSection.setAttribute("hidden", "true"); } // XXX } function PopulateNestedRoleMenupopup(aPopup, aRoles) { if (aPopup.getAttribute("id") == "roleMenupopup" && aPopup.firstElementChild) return; if (!aRoles) aRoles = kWAI_ARIA_11_ROLES["roletype"].sub; if (!aRoles) return; var roles = aRoles.split(" "); for (var i = 0; i < roles.length; i++) { var role = roles[i]; var roleObject = kWAI_ARIA_11_ROLES[role]; if (!roleObject) Services.prompt.alert(null, "Error in aria-roles.js", role + " " + roleObject); if ("sub" in roleObject) { var menu = document.createElement("menu"); menu.setAttribute("label", role + "..."); var popup = document.createElement("menupopup"); if (!("abstract" in roleObject)) { var item = document.createElement("menuitem"); item.setAttribute("label", role); item.setAttribute("value", role); var separator = document.createElement("menuseparator"); popup.appendChild(item); popup.appendChild(separator); } menu.appendChild(popup) aPopup.appendChild(menu); PopulateNestedRoleMenupopup(popup, roleObject.sub); } else { var item = document.createElement("menuitem"); item.setAttribute("label", role); item.setAttribute("value", role); aPopup.appendChild(item); } } } function CheckConstraints(aNode, aRole) { var roleObject = kWAI_ARIA_11_ROLES[aRole]; if ("context" in roleObject || "owns" in roleObject) { gDialog.constraintsSectionHeader.removeAttribute("hidden"); if ("context" in roleObject) { gDialog.contextSection.removeAttribute("hidden"); var contexts = roleObject.context.split(" "); var parent = aNode.parentNode; var ok = false; while (parent && parent.nodeType == Node.ELEMENT_NODE) { if (parent.hasAttribute("role")) { if (context.indexOf(parent.getAttribute("role")) != -1) { gDialog.contextLabel.setAttribute("value", gBundle.getString("ok")); ok = true; parent = null; } } else parent = parent.parentNode; } if (!ok) gDialog.contextLabel.setAttribute("value", gBundle.getString("mustBeContainedIn") + roleObject.context.replace(/ /, gBundle.getString("or"))); } else gDialog.contextSection.setAttribute("hidden", "true"); if ("owns" in roleObject) { gDialog.ownsSection.removeAttribute("hidden"); var owns = roleObject.owns; var query = null; if (typeof owns == "function") { var rv = owns(aNode); if (rv) gDialog.ownsLabel.setAttribute("value", rv); else gDialog.ownsLabel.setAttribute("value", gBundle.getString("ok")); } else if (owns.indexOf(",")) { var queries = owns.split(","); for (var i = 0; i < queries.length; i++) { query = aNode.querySelector("[role='" + queries[i] + "']"); if (!query) break; } if (query) gDialog.ownsLabel.setAttribute("value", gBundle.getString("ok")); else gDialog.ownsLabel.setAttribute("value", gBundle.getString("mustContain") + roleObject.owns.replace(/,/, gBundle.getString("and"))); } else { var query = aNode.querySelector(owns); if (query) gDialog.ownsLabel.setAttribute("value", gBundle.getString("ok")); else gDialog.ownsLabel.setAttribute("value", gBundle.getString("mustContain") + roleObject.context.replace(/ /, gBundle.getString("or"))); } } else gDialog.ownsSection.setAttribute("hidden", "true"); } else { gDialog.constraintsSectionHeader.setAttribute("hidden", "true"); gDialog.contextSection.setAttribute("hidden", "true"); gDialog.ownsSection.setAttribute("hidden", "true"); } } function ToggleRoleDropdown() { gNestedRoleDropdown = !gNestedRoleDropdown; ResetRoleDropdown(); } function ResetRoleDropdown() { var child = gDialog.roleMenupopup.firstChild; deleteAllChildren(gDialog.roleMenupopup); if (gNestedRoleDropdown) PopulateNestedRoleMenupopup(gDialog.roleMenupopup); else { var roles = []; for (var i in kWAI_ARIA_11_ROLES) if (!("abstract" in kWAI_ARIA_11_ROLES[i])) roles.push(i); roles.sort(); for (var i = 0; i < roles.length; i++) { var role = roles[i]; var item = document.createElement("menuitem"); item.setAttribute("label", role); item.setAttribute("value", role); gDialog.roleMenupopup.appendChild(item); } } } function SetRole(aEvent) { if (gCurrentElement) { var editor = EditorUtils.getCurrentEditor(); var role = aEvent.originalTarget.value; var dealWithEpubType = Services.prefs.getBoolPref("bluegriffon.aria.epub-type") && EditorUtils.isXHTMLDocument(); if (dealWithEpubType) { editor.beginTransaction(); editor.setAttribute(gCurrentElement, "role", role); var docElt = EditorUtils.getCurrentDocument().documentElement; if (!docElt.hasAttributeNS("http://www.w3.org/2000/xmlns/", "epub")) { var txn = new diSetAttributeNSTxn(docElt, "xmlns:epub", "http://www.w3.org/2000/xmlns/", "http://www.idpf.org/2007/ops"); editor.transactionManager.doTransaction(txn); } var txn = new diSetAttributeNSTxn(gCurrentElement, "type", "http://www.idpf.org/2007/ops", role); editor.transactionManager.doTransaction(txn); editor.endTransaction(); } else { if (gCurrentElement.hasAttributeNS("http://www.idpf.org/2007/ops", "type")) { editor.beginTransaction(); editor.setAttribute(gCurrentElement, "role", role); var txn = new diRemoveAttributeNSTxn(gCurrentElement, "type", "http://www.idpf.org/2007/ops"); editor.transactionManager.doTransaction(txn); editor.endTransaction(); } else editor.setAttribute(gCurrentElement, "role", role); } gDialog.roleMenulist.setAttribute("label", role); gDialog.roleMenulist.setAttribute("value", role); SelectionChanged(null, gCurrentElement, true); gMain.NotifierUtils.notify("selection_strict", gCurrentElement, true); gMain.gDialog.ARIARoleSelect.value = role; EditorUtils.getCurrentEditorWindow().content.focus(); } } function PopulateProperties(aRole, aAttribute, aIdPrefix) { if (!aRole) // sanity check return; var roleObject = kWAI_ARIA_11_ROLES[aRole]; if (aAttribute in roleObject) { gDialog[aIdPrefix + "Header"].removeAttribute("hidden"); gDialog[aIdPrefix + "Section"].removeAttribute("hidden"); deleteAllChildren(gDialog[aIdPrefix + "Rows"]); var properties = roleObject[aAttribute].split(" "); for (var i = 0; i < properties.length; i++) AddPropertyWidget(properties[i], gDialog[aIdPrefix + "Rows"]); } else { gDialog[aIdPrefix + "Header"].setAttribute("hidden", "true"); gDialog[aIdPrefix + "Section"].setAttribute("hidden", "true"); } } var inheritedAll = null; function PopulateInheritedProperties(aRole, aIdPrefix) { deleteAllChildren(gDialog.inheritedPropertiesRows); if (!aRole) // sanity check return; var roleObject = kWAI_ARIA_11_ROLES[aRole]; var requiredProperties = ("required" in roleObject) ? roleObject.required.split(" ") : []; var otherProperties = ("properties" in roleObject) ? roleObject.properties.split(" ") : []; var properties = requiredProperties.concat(otherProperties); inheritedAll = []; aRole = ("sup" in roleObject) ? roleObject.sup : ""; if (aRole) GetAllInheritedProperties(aRole, properties); inheritedAll = inheritedAll.sort(); if (inheritedAll.length) { gDialog.inheritedPropertiesHeader.removeAttribute("hidden"); gDialog.inheritedPropertiesSection.removeAttribute("hidden"); } else { gDialog.inheritedPropertiesHeader.setAttribute("hidden", "true"); gDialog.inheritedPropertiesSection.setAttribute("hidden", "true"); } for (var i = 0; i < inheritedAll.length; i++) AddPropertyWidget(inheritedAll[i], gDialog.inheritedPropertiesRows); } function GetAllInheritedProperties(aRole, aRoleProperties) { var roles = aRole.split(" "); for (var i = 0; i < roles.length; i++) { var role = roles[i]; var roleObject = kWAI_ARIA_11_ROLES[role]; var requiredProperties = ("required" in roleObject) ? roleObject.required.split(" ") : []; var otherProperties = ("properties" in roleObject) ? roleObject.properties.split(" ") : []; var properties = requiredProperties.concat(otherProperties); for (var j = 0; j < properties.length; j++) { var p = properties[j]; if (aRoleProperties.indexOf(p) == -1 && inheritedAll.indexOf(p) == -1) inheritedAll.push(p); } role = ("sup" in roleObject) ? roleObject.sup : ""; if (role) GetAllInheritedProperties(role, aRoleProperties); } } function AddPropertyWidget(aProperty, aXULElt) { if (!(aProperty in kWAI_ARIA_11_PROPERTIES)) { Services.prompt.alert(null, "Error in kWAI_ARIA_11_PROPERTIES", aProperty); return; } var property = kWAI_ARIA_11_PROPERTIES[aProperty]; var value = property.value; var def = property["default"] || ""; var deprecated = property["deprecated"] || ""; var row = document.createElement("row"); row.setAttribute("align", "center"); var label = document.createElement("label"); label.setAttribute("value", aProperty + ":"); row.appendChild(label); aXULElt.appendChild(row); var hbox = document.createElement("hbox"); hbox.setAttribute("align", "center"); hbox.setAttribute("default", def); hbox.setAttribute("deprecated", deprecated); if (value == "#ID") { hbox.setAttribute("class", "aria-id"); hbox.setAttribute("value", gCurrentElement.getAttribute(aProperty) || ""); hbox.setAttribute("aria-attribute", aProperty); row.appendChild(hbox); } else if (value == "#STRING" || value == "#IDS") { hbox.setAttribute("class", "aria-string"); hbox.setAttribute("value", gCurrentElement.getAttribute(aProperty) || ""); hbox.setAttribute("aria-attribute", aProperty); row.appendChild(hbox); } else if (value[0] != "#" && value[0] != "[") { hbox.setAttribute("class", "aria-tokens"); hbox.setAttribute("values", value); hbox.setAttribute("value", gCurrentElement.getAttribute(aProperty) || ""); hbox.setAttribute("aria-attribute", aProperty); row.appendChild(hbox); } else if (value[0] == "[") { row.setAttribute("align", "baseline"); hbox.setAttribute("class", "aria-token-list"); hbox.setAttribute("values", value.substr(1, value.length - 2)); hbox.setAttribute("value", gCurrentElement.getAttribute(aProperty) || ""); hbox.setAttribute("aria-attribute", aProperty); row.appendChild(hbox); } else if (value.substr(0, 5) == "#INT(") { var min = parseInt(value.substr(5)); hbox.setAttribute("class", "aria-integer"); hbox.setAttribute("min", min); hbox.setAttribute("value", gCurrentElement.getAttribute(aProperty) || ""); hbox.setAttribute("aria-attribute", aProperty); row.appendChild(hbox); } else if (value == "#NUMBER") { var min = parseInt(value.substr(5)); hbox.setAttribute("class", "aria-integer"); hbox.setAttribute("min", Number.NEGATIVE_INFINITY); hbox.setAttribute("decimalplaces", "Infinity"); hbox.setAttribute("value", gCurrentElement.getAttribute(aProperty) || ""); hbox.setAttribute("aria-attribute", aProperty); row.appendChild(hbox); } if (deprecated) { var deprecatedLabel = document.createElement("label"); deprecatedLabel.setAttribute("value", gBundle.getString("deprecated")); row.appendChild(deprecatedLabel); } } ================================================ FILE: sidebars/aria/content/aria.xml ================================================ ================================================ FILE: sidebars/aria/content/aria.xul ================================================ %ariaDTD; %structurebarDTD; %ariaDTD; ]> ================================================ FILE: sidebars/cssproperties/content/general.js ================================================ RegisterIniter(GeneralSectionIniter); function GeneralSectionIniter(aElt, aRuleset) { deleteAllChildren(gDialog.fontFamilyListbox); var fontFamily = CssInspector.getCascadedValue(aRuleset, "font-family"); if (fontFamily) { var fonts = fontFamily.split(","); fonts.forEach(function(aElt, aIndex, aArray) { if (aElt[0] == "'" || aElt[0] == '"') aElt = aElt.substr(1, aElt.length - 2); gDialog.fontFamilyListbox.appendItem(aElt, aElt); }); //SetEnabledElement(gDialog.removeFontButton, gDialog.fontFamilyListbox.itemCount); } if (gDialog.fontFamilyListbox.itemCount) gDialog.fontFamilyListbox.selectedIndex = 0; var webFonts = CssInspector.getWebFonts(EditorUtils.getCurrentDocument()); var child = gDialog.beforeWebfontsMenuseparator.nextSibling; while (child && child.id != "afterWebfontsMenuseparator") { var tmp = child.nextSibling; gDialog.addFontMenupopup.removeChild(child); child = tmp; } var found = false; for (var i in webFonts) { found = true; var item = document.createElement("menuitem"); item.setAttribute("label", i); item.setAttribute("value", i); gDialog.addFontMenupopup.insertBefore(item, gDialog.afterWebfontsMenuseparator) } gDialog.afterWebfontsMenuseparator.hidden = !found; } function AddFont(aEvent) { var elt = aEvent.originalTarget; if (elt.nodeName.toLowerCase() != "menuitem") return; var value = elt.getAttribute("label"); if (elt.hasAttribute("global")) { deleteAllChildren(gDialog.fontFamilyListbox); var fontsArray = value.split(","); for (var i = 0; i < fontsArray.length; i++) { var v = fontsArray[i].trim(); gDialog.fontFamilyListbox.appendItem(v, v); } } else { gDialog.fontFamilyListbox.appendItem(value, value); } ApplyFontFamily(); } function OnFontFamilySelect(aElt) { var item = aElt.selectedItem; SetEnabledElement(gDialog.removeFontButton, (item != null)); } function DeleteFont() { var item = gDialog.fontFamilyListbox.selectedItem; if (!item) return; // sanity check item.parentNode.removeChild(item); ApplyFontFamily(); } function ApplyFontFamily() { var child = gDialog.fontFamilyListbox.firstChild; var ff = ""; while (child) { ff += (ff ? ", " : ""); ff += '"' + child.value + '"'; child = child.nextSibling; } ApplyStyles([ { property: "font-family", value: ff } ]); } ================================================ FILE: sidebars/cssproperties/content/general.xul ================================================ %csspropertiesDTD; %backgrounditemDTD; ]>